diff --git a/.codespellrc b/.codespellrc index 61725921..d5b4435e 100644 --- a/.codespellrc +++ b/.codespellrc @@ -1,4 +1,4 @@ [codespell] -skip = .git,*.pdf,*.svg +skip = .git,*.pdf,*.svg,*.ipynb,llms-full.txt,*/data/* # -ignore-words-list = shepard,nevers,nin +ignore-words-list = shepard,nevers,nin,rever diff --git a/.github/DISCUSSION_TEMPLATE/rfc.yml b/.github/DISCUSSION_TEMPLATE/rfc.yml new file mode 100644 index 00000000..53dbecde --- /dev/null +++ b/.github/DISCUSSION_TEMPLATE/rfc.yml @@ -0,0 +1,107 @@ +title: "[RFC] " +labels: + - rfc + - "status: proposed" +body: + - type: markdown + attributes: + value: | + ## DataJoint Enhancement Proposal + + Use this template to propose changes to DataJoint specifications, APIs, or documentation structure. + + **Before submitting:** + - Search existing discussions to avoid duplicates + - Consider starting with an informal discussion in the Ideas category first + + - type: textarea + id: summary + attributes: + label: Summary + description: A brief, one-paragraph explanation of the proposal. + placeholder: This proposal adds/changes/removes... + validations: + required: true + + - type: textarea + id: motivation + attributes: + label: Motivation + description: | + Why is this change needed? What problem does it solve? + Include concrete use cases and examples where possible. + placeholder: | + Currently, users need to... + This causes problems when... + With this change, users could... + validations: + required: true + + - type: textarea + id: design + attributes: + label: Proposed Design + description: | + Detailed explanation of the proposed solution. + Include code examples, API signatures, or schema definitions as appropriate. + placeholder: | + ## API Changes + ```python + # Example usage + ``` + + ## Behavior + - When X happens, Y should occur + - Error handling: ... + validations: + required: true + + - type: textarea + id: alternatives + attributes: + label: Alternatives Considered + description: What other approaches were considered and why were they not chosen? + placeholder: | + 1. Alternative A: ... + Rejected because: ... + + 2. Alternative B: ... + Rejected because: ... + + - type: textarea + id: compatibility + attributes: + label: Backwards Compatibility + description: | + How does this affect existing users? + - Breaking changes? + - Migration path? + - Deprecation timeline? + placeholder: | + This change is/is not backwards compatible. + + Migration path: + 1. ... + + - type: textarea + id: implementation + attributes: + label: Implementation Notes + description: | + Optional: Technical details, affected files, estimated scope. + Prototyping in parallel with RFC discussion is encouraged. + placeholder: | + Affected components: + - datajoint-python/src/datajoint/... + + Estimated scope: small/medium/large + + - type: checkboxes + id: checklist + attributes: + label: Checklist + options: + - label: I have searched existing discussions and issues for duplicates + required: true + - label: I have considered backwards compatibility + required: true diff --git a/.gitignore b/.gitignore index 353bb19b..e1dff8dc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,7 @@ site .env .DS_Store -temp* \ No newline at end of file +temp* + +# DataJoint secrets (credentials) +.secrets/ \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 282bc677..ffc91445 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3-alpine +FROM python:3.12-alpine WORKDIR /main COPY mkdocs.yaml mkdocs.yaml @@ -6,5 +6,5 @@ COPY src/ src/ COPY pip_requirements.txt pip_requirements.txt RUN \ - apk add --no-cache git && \ + apk add --no-cache git gcc g++ musl-dev linux-headers freetype-dev libpng-dev graphviz && \ pip install --no-cache-dir -r /main/pip_requirements.txt \ No newline at end of file diff --git a/LICENSE b/LICENSE index 2f927894..3296b71f 100644 --- a/LICENSE +++ b/LICENSE @@ -1,21 +1,27 @@ -MIT License - -Copyright (c) 2022 DataJoint - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +Creative Commons Attribution 4.0 International License (CC BY 4.0) + +Copyright 2014-2026 DataJoint Inc. and contributors + +You are free to: + + Share β€” copy and redistribute the material in any medium or format + Adapt β€” remix, transform, and build upon the material for any purpose, + even commercially + +Under the following terms: + + Attribution β€” You must give appropriate credit, provide a link to the + license, and indicate if changes were made. You may do so + in any reasonable manner, but not in any way that suggests + the licensor endorses you or your use. + + No additional restrictions β€” You may not apply legal terms or + technological measures that legally restrict + others from doing anything the license permits. + +Full license text: https://creativecommons.org/licenses/by/4.0/legalcode + +--- + +Note: The DataJoint software library is licensed separately under the +Apache License 2.0. See https://github.com/datajoint/datajoint-python/blob/master/LICENSE diff --git a/README.md b/README.md index e82f9ea7..53630985 100644 --- a/README.md +++ b/README.md @@ -1,90 +1,305 @@ # DataJoint Documentation -This is the home for DataJoint software documentation as hosted at https://docs.datajoint.com -## VSCode Linter Extensions and Settings +Official documentation for [DataJoint](https://github.com/datajoint/datajoint-python) 2.0, +an open-source framework for building scientific data pipelines. -The following extensions were used in developing these docs, with the corresponding -settings files: +**Live site:** https://docs.datajoint.com -- Recommended extensions are already specified in `.vscode/extensions.json`, it will ask you to install them when you open the project if you haven't installed them. -- settings in `.vscode/settings.json` -- [MarkdownLinter](https://marketplace.visualstudio.com/items?itemName=DavidAnson.vscode-markdownlint): - - `.markdownlint.yaml` establishes settings for various - [linter rules](https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md) - - `.vscode/settings.json` formatting on save to fix linting +> **πŸ“˜ Upgrading from legacy DataJoint (pre-2.0)?** +> See the **[Migration Guide](https://docs.datajoint.com/how-to/migrate-from-0x/)** for a step-by-step upgrade path. -- [CSpell](https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker): `cspell.json` -has various ignored words. +## What is DataJoint? -- [ReWrap](https://marketplace.visualstudio.com/items?itemName=stkb.rewrap): `.vscode/settings.json` allows toggling -automated hard wrapping for files at 88 characters. This can also be keymapped to be -performed on individual paragraphs, see documentation. +DataJoint is a Python framework for building scientific data pipelines using relational +databases. It implements the **Relational Workflow Model**β€”a paradigm that extends +relational databases with native support for computational workflows. -## With Virtual Environment +Key features: + +- **Declarative schema design** β€” Define tables and relationships in Python +- **Automatic dependency tracking** β€” Foreign keys encode workflow dependencies +- **Built-in computation** β€” Imported and Computed tables run automatically +- **Data integrity** β€” Referential integrity and transaction support +- **Reproducibility** β€” Immutable data with full provenance + +## Quick Start + +### Installation -conda ```bash -conda create -n djdocs -y -conda activate djdocs +pip install datajoint ``` -venv + +For schema diagrams, install Graphviz (the system library, not just Python bindings): + ```bash -python -m venv .venv -source .venv/bin/activate +# macOS +brew install graphviz + +# Ubuntu/Debian +sudo apt-get install graphviz libgraphviz-dev + +# conda (any platform) +conda install -c conda-forge graphviz pygraphviz ``` -Then install the required packages: +If using pip (after installing system Graphviz): ```bash -pip install -r pip_requirements.txt +pip install pygraphviz ``` -Run mkdocs at: http://127.0.0.1:8000/ +### Configuration + +DataJoint uses configuration files to manage database credentials securely. Create these +files in your project directory: + +**datajoint.json** (non-sensitive settings, commit to version control): +```json +{ + "database": { + "host": "localhost", + "port": 3306 + } +} +``` + +**.secrets/database.user** and **.secrets/database.password** (sensitive, add to .gitignore): ```bash -# It will automatically reload the docs when changes are made -mkdocs serve --config-file ./mkdocs.yaml +mkdir -p .secrets +echo "your_username" > .secrets/database.user +echo "your_password" > .secrets/database.password +chmod 600 .secrets/* +echo ".secrets/" >> .gitignore +``` + +DataJoint automatically discovers these files by searching up from the current directory. +This keeps credentials out of your code and version control. + +### Define a Schema + +```python +import datajoint as dj + +schema = dj.Schema('my_pipeline') + +@schema +class Subject(dj.Manual): + definition = """ + subject_id : int32 + --- + name : varchar(100) + date_of_birth : date + """ + +@schema +class Session(dj.Manual): + definition = """ + -> Subject + session_idx : int32 + --- + session_date : date + duration : float32 # minutes + notes = '' : varchar(1000) + """ + +@schema +class ProcessedData(dj.Computed): + definition = """ + -> Session + --- + result : float64 + """ + + def make(self, key): + # Compute result from session data + duration = (Session & key).fetch1('duration') + self.insert1({**key, 'result': duration * 2}) +``` + +Note: Use DataJoint core types (`int32`, `float32`, `float64`, `varchar`) for portability +across database backends. + +### View Schema Diagram + +```python +dj.Diagram(schema) ``` -## With Docker +### Run Computations + +```python +ProcessedData.populate() +``` + +## Documentation Structure + +This documentation follows the [DiΓ‘taxis](https://diataxis.fr/) framework: + +| Section | Purpose | Link | +|---------|---------|------| +| **Tutorials** | Learn by building real pipelines | [src/tutorials/](src/tutorials/) | +| **How-To Guides** | Practical guides for common tasks | [src/how-to/](src/how-to/) | +| **Explanation** | Understand the principles behind DataJoint | [src/explanation/](src/explanation/) | +| **Reference** | Specifications and API documentation | [src/reference/](src/reference/) | + +Key pages: +- **[Migration Guide](src/how-to/migrate-from-0x.md)** β€” Upgrade from legacy DataJoint (pre-2.0) +- **[What's New in 2.0](src/explanation/whats-new-2.md)** β€” Major changes and improvements -> We mostly use Docker to simplify docs deployment +## Local Development with Docker (Recommended) -Ensure you have `Docker` and `Docker Compose` installed. +The Docker environment includes MySQL, MinIO (S3-compatible storage), Graphviz, and all +dependencies needed to build documentation and execute tutorial notebooks. + +### Start the Environment -Then run the following: ```bash -# It will automatically reload the docs when changes are made +# Clone the repository +git clone https://github.com/datajoint/datajoint-docs.git +cd datajoint-docs + +# Start all services (MySQL, MinIO, docs server) MODE="LIVE" docker compose up --build ``` -Navigate to http://127.0.0.1:8000/ to preview the changes. +Navigate to http://127.0.0.1:8000/ + +### Services + +| Service | Port | Description | +|---------|------|-------------| +| `docs` | 8000 | MkDocs live server | +| `mysql` | 3306 | MySQL 8.0 database | +| `minio` | 9002 | MinIO S3 API | +| `minio` | 9003 | MinIO console | + +### Execute Tutorial Notebooks + +Tutorial notebooks can be executed inside the Docker environment where the database +is available: + +```bash +# Execute a single notebook +docker compose exec docs jupyter nbconvert \ + --to notebook --execute --inplace \ + /main/src/tutorials/01-getting-started.ipynb + +# Execute all tutorials +docker compose exec docs bash -c ' + for nb in /main/src/tutorials/*.ipynb; do + jupyter nbconvert --to notebook --execute --inplace "$nb" + done +' +``` + +### Build Static Site + +```bash +# Build static HTML (output in site/) +MODE="BUILD" docker compose up --build +``` + +### Reset Database + +```bash +# Stop services and remove data volumes +docker compose down -v +``` + +## Local Development without Docker + +### Prerequisites + +- Python 3.10+ +- MySQL 8.0+ (running locally) +- Graphviz (for schema diagrams) + +### Setup + +```bash +# Clone the repository +git clone https://github.com/datajoint/datajoint-docs.git +cd datajoint-docs + +# Create virtual environment +python -m venv .venv +source .venv/bin/activate # or .venv\Scripts\activate on Windows + +# Install dependencies +pip install -r pip_requirements.txt +``` + +Note: For schema diagrams, ensure Graphviz system libraries are installed (see Quick Start). + +### Configure Database Connection -This setup supports live-reloading so all that is needed is to save the markdown files -and/or `mkdocs.yaml` file to trigger a reload. +The repository includes a `datajoint.json` with default settings. Create the secrets +directory with your credentials: -## Mkdocs Warning Explanation +```bash +mkdir -p .secrets +echo "your_username" > .secrets/database.user +echo "your_password" > .secrets/database.password +chmod 600 .secrets/* +``` -> TL;DR: We need to do it this way for hosting, please keep it as is. +### Preview Documentation -```log -WARNING - A reference to 'core/datajoint-python/' is included in the 'nav' configuration, which is not found - in the documentation files. -INFO - Doc file 'index.md' contains an unrecognized relative link './core/datajoint-python/', it was left - as is. +```bash +mkdocs serve ``` -- We use reverse proxy to proxy our docs sites, here is the proxy flow: - - You hit `datajoint.com/*` on your browser - - It'll bring you to the reverse proxy server first, that you wouldn't notice - - when your URL ends with: - - `/` is the landing/navigation page hosted by datajoint/datajoint-docs's github pages - - `/core/datajoint-python/` is the actual docs site hosted by datajoint/datajoint-python's github pages - - `/elements/element-*/` is the actual docs site hosted by each element's github pages +Navigate to http://127.0.0.1:8000/ + +## Contributing + +Contributions are welcome! See our [contribution guidelines](src/about/contributing.md). + +### Quick Fixes +1. Fork the repository +2. Edit the relevant markdown file in `src/` +3. Submit a pull request -```log -WARNING - Doc file 'partnerships/openephysgui.md' contains a link - '../../images/community-partnerships-openephysgui-logo.png', but the target - '../images/community-partnerships-openephysgui-logo.png' is not found among documentation files. - Did you mean '../images/community-partnerships-openephysgui-logo.png'? +### Larger Changes + +1. Open an issue to discuss the change +2. Fork and create a feature branch +3. Make changes with `mkdocs serve` for preview +4. Submit a pull request + +### Executing Notebooks for CI + +When modifying tutorial notebooks, re-execute them to update outputs: + +```bash +docker compose exec docs jupyter nbconvert \ + --to notebook --execute --inplace \ + --ExecutePreprocessor.timeout=300 \ + /main/src/tutorials/YOUR_NOTEBOOK.ipynb ``` -- We use Github Pages to host our docs, the image references needs to follow the mkdocs's build directory structure, under `site/` directory once you run mkdocs. \ No newline at end of file + +## Related Repositories + +- **[datajoint-python](https://github.com/datajoint/datajoint-python)** β€” Core DataJoint library +- **[DataJoint Elements](https://datajoint.com/docs/elements/)** β€” Neuroscience pipeline elements +- **[DataJoint Works](https://datajoint.com)** β€” Company and commercial support + +## Citation + +If you use DataJoint in your research, please cite: + +> Yatsenko D, Walker EY, Tolias AS. DataJoint: A Simpler Relational Data Model. +> arXiv:2303.00102. 2023. doi: [10.48550/arXiv.2303.00102](https://doi.org/10.48550/arXiv.2303.00102) + +Earlier publication: + +> Yatsenko D, Reimer J, Ecker AS, Walker EY, Sinz F, Berens P, Hoenselaar A, +> Cotton RJ, Siapas AS, Tolias AS. DataJoint: managing big scientific data +> using MATLAB or Python. bioRxiv. 2015. doi: [10.1101/031658](https://doi.org/10.1101/031658) + +## License + +Documentation: [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) + +DataJoint software: [Apache 2.0](https://github.com/datajoint/datajoint-python/blob/master/LICENSE) diff --git a/datajoint.json b/datajoint.json new file mode 100644 index 00000000..ab9c339c --- /dev/null +++ b/datajoint.json @@ -0,0 +1,22 @@ +{ + "database": { + "host": "127.0.0.1", + "port": 3306 + }, + "stores": { + "default": "local", + "local": { + "protocol": "file", + "location": "/tmp/datajoint-tutorials" + }, + "s3": { + "protocol": "s3", + "endpoint": "127.0.0.1:9000", + "bucket": "datajoint-tutorials", + "location": "", + "secure": false + } + }, + "safemode": false, + "loglevel": "WARNING" +} diff --git a/docker-compose.yaml b/docker-compose.yaml index 3ffd42f3..7353fe91 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -1,23 +1,65 @@ -# MODE="LIVE|BUILD" docker compose up --build +# DataJoint Documentation Environment +# +# MODE="LIVE" docker compose up --build # Live dev server at http://localhost:8000/ +# MODE="BUILD" docker compose up --build # Build static site +# docker compose run docs jupyter nbconvert --execute ... # Execute notebooks # -# Navigate to http://localhost:8000/ services: + mysql: + image: mysql:8.0 + environment: + MYSQL_ROOT_PASSWORD: tutorial + ports: + - "3306:3306" + volumes: + - mysql_data:/var/lib/mysql + healthcheck: + test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-ptutorial"] + interval: 5s + timeout: 5s + retries: 10 + + minio: + image: minio/minio:latest + environment: + MINIO_ROOT_USER: datajoint + MINIO_ROOT_PASSWORD: datajoint + ports: + - "9002:9000" + - "9003:9001" + volumes: + - minio_data:/data + command: server /data --console-address ":9001" + healthcheck: + test: ["CMD", "mc", "ready", "local"] + interval: 5s + timeout: 5s + retries: 5 + docs: - # image: datajoint/datajoint-docs build: context: . dockerfile: Dockerfile environment: - MODE + - DJ_HOST=mysql + - DJ_USER=root + - DJ_PASS=tutorial volumes: - .:/main + - ../datajoint-python:/datajoint-python ports: - 8000:8000 + depends_on: + mysql: + condition: service_healthy command: - sh - -c - | set -e + pip install -e /datajoint-python + pip install scikit-image pooch if echo "$${MODE}" | grep -i live &>/dev/null; then mkdocs serve --config-file ./mkdocs.yaml -a 0.0.0.0:8000 elif echo "$${MODE}" | grep -i build &>/dev/null; then @@ -26,3 +68,10 @@ services: echo "Unexpected mode..." exit 1 fi + +volumes: + mysql_data: + # Persistent storage for tutorial databases + # Use `docker compose down -v` to reset + minio_data: + # Persistent storage for external objects diff --git a/examples/migrate_pipeline_v20.py b/examples/migrate_pipeline_v20.py new file mode 100644 index 00000000..5164df08 --- /dev/null +++ b/examples/migrate_pipeline_v20.py @@ -0,0 +1,304 @@ +""" +Example migration script: DataJoint 0.14.6 β†’ 2.0 using parallel schemas. + +This script demonstrates the complete migration workflow for a single pipeline. +Adapt this for your own pipelines. + +Usage: + python migrate_pipeline_v20.py --phase 1 # Setup parallel schema + python migrate_pipeline_v20.py --phase 2 # Update code (manual step) + python migrate_pipeline_v20.py --phase 3 # Migrate test data + python migrate_pipeline_v20.py --phase 4 # Validate + python migrate_pipeline_v20.py --phase 5 # Production cutover +""" + +import argparse +import logging +import sys +from pathlib import Path + +import datajoint as dj +from datajoint.migrate import ( + backup_schema, + compare_query_results, + copy_table_data, + create_parallel_schema, + restore_schema, + verify_schema_v20, +) + +# Configuration +PROD_SCHEMA = "my_pipeline" +TEST_SCHEMA = "my_pipeline_v20" +BACKUP_SCHEMA = "my_pipeline_backup" + +logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s") +logger = logging.getLogger(__name__) + + +def phase_1_setup(): + """Phase 1: Setup parallel schema.""" + logger.info("=== Phase 1: Setup Parallel Schema ===") + + # Create parallel schema (structure only, no data) + logger.info(f"Creating parallel schema: {PROD_SCHEMA} β†’ {TEST_SCHEMA}") + result = create_parallel_schema( + source=PROD_SCHEMA, + dest=TEST_SCHEMA, + copy_data=False, + ) + + logger.info(f"βœ“ Created {result['tables_created']} tables in {TEST_SCHEMA}") + + # Verify + conn = dj.conn() + prod_count = conn.query( + f"SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA='{PROD_SCHEMA}'" + ).fetchone()[0] + test_count = conn.query( + f"SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA='{TEST_SCHEMA}'" + ).fetchone()[0] + + if prod_count == test_count: + logger.info(f"βœ“ Verification passed: {prod_count} tables in both schemas") + else: + logger.error(f"βœ— Table count mismatch: prod={prod_count}, test={test_count}") + sys.exit(1) + + logger.info("\nNext step: Phase 2 - Update your Python code to use 2.0 API") + logger.info(" - Update schema connections to point to _v20") + logger.info(" - Replace fetch() with to_arrays()/to_dicts()") + logger.info(" - Update type syntax in table definitions") + + +def phase_2_code_update(): + """Phase 2: Code update instructions.""" + logger.info("=== Phase 2: Update Code ===") + logger.info("\nManual step - Update your Python code:") + logger.info("") + logger.info("1. Schema connections:") + logger.info(" OLD: schema = dj.schema('my_pipeline')") + logger.info(" NEW: schema = dj.schema('my_pipeline_v20')") + logger.info("") + logger.info("2. Fetch API:") + logger.info(" OLD: table.fetch()") + logger.info(" NEW: table.to_arrays() or table.to_dicts()") + logger.info("") + logger.info("3. Type syntax:") + logger.info(" OLD: int unsigned β†’ NEW: uint32") + logger.info(" OLD: external-store β†’ NEW: ") + logger.info("") + logger.info("See: https://docs.datajoint.com/how-to/migrate-to-v20") + logger.info("") + logger.info("After updating code, run: python migrate_pipeline_v20.py --phase 3") + + +def phase_3_migrate_data(): + """Phase 3: Migrate test data.""" + logger.info("=== Phase 3: Migrate Test Data ===") + + # Get list of manual tables (those without # in definition) + conn = dj.conn() + + # Example: Get all tables + tables_query = f""" + SELECT TABLE_NAME + FROM information_schema.TABLES + WHERE TABLE_SCHEMA = '{PROD_SCHEMA}' + AND TABLE_NAME NOT LIKE '~%' + AND TABLE_NAME NOT LIKE '#%' + ORDER BY TABLE_NAME + """ + tables = [row[0] for row in conn.query(tables_query).fetchall()] + + logger.info(f"Found {len(tables)} tables to migrate") + + # Copy data for each table + for table in tables: + logger.info(f"Copying {table}...") + + # For this example, copy all data + # In production, you might want to: + # - Use limit= for sampling + # - Use where_clause= for recent data only + result = copy_table_data( + source_schema=PROD_SCHEMA, + dest_schema=TEST_SCHEMA, + table=table, + limit=None, # Copy all (or use limit=1000 for testing) + ) + + logger.info(f" βœ“ Copied {result['rows_copied']} rows in {result['time_taken']:.2f}s") + + logger.info("\nβœ“ Data migration complete") + logger.info("\nNext step: Phase 4 - Validate the migration") + + +def phase_4_validate(): + """Phase 4: Validate side-by-side.""" + logger.info("=== Phase 4: Validation ===") + + conn = dj.conn() + + # Get list of tables + tables_query = f""" + SELECT TABLE_NAME + FROM information_schema.TABLES + WHERE TABLE_SCHEMA = '{TEST_SCHEMA}' + AND TABLE_NAME NOT LIKE '~%' + ORDER BY TABLE_NAME + """ + tables = [row[0] for row in conn.query(tables_query).fetchall()] + + all_match = True + + for table in tables: + logger.info(f"Validating {table}...") + + result = compare_query_results( + prod_schema=PROD_SCHEMA, + test_schema=TEST_SCHEMA, + table=table, + tolerance=1e-6, + ) + + if result["match"]: + logger.info(f" βœ“ {result['row_count']} rows match") + else: + logger.error(f" βœ— Validation failed:") + for disc in result["discrepancies"][:5]: # Show first 5 + logger.error(f" {disc}") + all_match = False + + # Verify 2.0 compatibility + logger.info("\nVerifying 2.0 compatibility...") + compat_result = verify_schema_v20(TEST_SCHEMA) + + if compat_result["compatible"]: + logger.info(" βœ“ Schema is 2.0 compatible") + else: + logger.warning(" ! Some 2.0 features not enabled:") + for issue in compat_result["issues"]: + logger.warning(f" {issue}") + + if all_match: + logger.info("\nβœ“ All validation checks passed!") + logger.info("\nNext step: Phase 5 - Production cutover") + logger.info(" WARNING: Phase 5 modifies production. Ensure:") + logger.info(" - Full database backup completed") + logger.info(" - All 0.14.6 clients stopped") + logger.info(" - Maintenance window scheduled") + else: + logger.error("\nβœ— Validation failed. Fix issues before proceeding.") + sys.exit(1) + + +def phase_5_cutover(): + """Phase 5: Production cutover.""" + logger.info("=== Phase 5: Production Cutover ===") + + # Pre-flight checks + logger.info("\nPre-flight checks:") + + # Check for running queries + conn = dj.conn() + active_queries = conn.query( + f""" + SELECT COUNT(*) FROM information_schema.PROCESSLIST + WHERE DB = '{PROD_SCHEMA}' AND COMMAND != 'Sleep' + """ + ).fetchone()[0] + + if active_queries > 0: + logger.error(f"βœ— Found {active_queries} active queries on {PROD_SCHEMA}") + logger.error(" Stop all 0.14.6 clients before proceeding") + sys.exit(1) + else: + logger.info(" βœ“ No active queries") + + # Confirm from user + logger.warning("\n!!! WARNING: This will modify production !!!") + logger.warning(f"This will rename {PROD_SCHEMA} β†’ {PROD_SCHEMA}_old") + logger.warning(f" and {TEST_SCHEMA} β†’ {PROD_SCHEMA}") + response = input("\nType 'MIGRATE' to proceed: ") + + if response != "MIGRATE": + logger.info("Aborted") + sys.exit(0) + + # Create backup first + logger.info("\n1. Creating backup...") + import datetime + + timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S") + backup_name = f"{PROD_SCHEMA}_backup_{timestamp}" + + backup_result = backup_schema(PROD_SCHEMA, backup_name) + logger.info(f" βœ“ Backed up {backup_result['tables_backed_up']} tables to {backup_name}") + + # Rename schemas + logger.info("\n2. Renaming schemas...") + + try: + # Rename production β†’ old + conn.query(f"RENAME DATABASE `{PROD_SCHEMA}` TO `{PROD_SCHEMA}_old`") + logger.info(f" βœ“ Renamed {PROD_SCHEMA} β†’ {PROD_SCHEMA}_old") + + # Rename test β†’ production + conn.query(f"RENAME DATABASE `{TEST_SCHEMA}` TO `{PROD_SCHEMA}`") + logger.info(f" βœ“ Renamed {TEST_SCHEMA} β†’ {PROD_SCHEMA}") + + except Exception as e: + logger.error(f"βœ— Cutover failed: {e}") + logger.error("Rolling back...") + # Note: MySQL doesn't support RENAME DATABASE, using alternative approach + logger.error("Manual rollback required. See documentation.") + sys.exit(1) + + # Verify + logger.info("\n3. Verifying cutover...") + verify_result = verify_schema_v20(PROD_SCHEMA) + + if verify_result["compatible"]: + logger.info(" βœ“ Production schema verified") + else: + logger.warning(" ! Some issues found:") + for issue in verify_result["issues"]: + logger.warning(f" {issue}") + + logger.info("\nβœ“ Cutover complete!") + logger.info(f"\nBackup location: {backup_name}") + logger.info(f"Old production: {PROD_SCHEMA}_old (can be dropped after verification)") + logger.info("\nNext steps:") + logger.info(" 1. Update production code to point to 'my_pipeline'") + logger.info(" 2. Start 2.0 clients") + logger.info(" 3. Monitor for issues") + logger.info(" 4. After 1-2 weeks, drop old schema and backups") + + +def main(): + """Main entry point.""" + parser = argparse.ArgumentParser(description="Migrate DataJoint pipeline to 2.0") + parser.add_argument( + "--phase", + type=int, + choices=[1, 2, 3, 4, 5], + required=True, + help="Migration phase to execute", + ) + + args = parser.parse_args() + + phases = { + 1: phase_1_setup, + 2: phase_2_code_update, + 3: phase_3_migrate_data, + 4: phase_4_validate, + 5: phase_5_cutover, + } + + phases[args.phase]() + + +if __name__ == "__main__": + main() diff --git a/mkdocs.yaml b/mkdocs.yaml index 48067e28..df4deac8 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -1,47 +1,120 @@ # ---------------------- PROJECT SPECIFIC --------------------------- site_name: DataJoint Documentation -site_url: https://docs.datajoint.com +site_url: https://docs.datajoint.com/ repo_name: datajoint/datajoint-docs repo_url: https://github.com/datajoint/datajoint-docs nav: - - Welcome: index.md - # relative site url, not pointing to any docs in the repo - # it's for reverse proxy to proxy datajoint-python docs - - DataJoint Python: core/datajoint-python/ - - DataJoint Elements: - - elements/index.md - - Concepts: elements/concepts.md - - User Guide: elements/user-guide.md - - Developer Guide: elements/developer-guide.md - - Management: - - Plan: elements/management/plan.md - - Governance: elements/management/governance.md - - Selection: elements/management/selection.md - - Quality Assurance: elements/management/quality-assurance.md - - Outreach: elements/management/outreach.md - - Dissemination: elements/management/dissemination.md - - Adoption: elements/management/adoption.md - - Additional Resources: additional-resources.md - - Project Showcase: - - projects/index.md - - Catalog: https://catalog.datajoint.io - - Teams: projects/teams.md - - Publications: projects/publications.md - - Support & Events: support-events.md - - Partnerships: - - DANDI: partnerships/dandi.md - - Facemap: partnerships/facemap.md - - INCF: partnerships/incf.md - - NWB: partnerships/nwb.md - - Open Ephys GUI: partnerships/openephysgui.md - - Suite2p: partnerships/suite2p.md + - Home: index.md + - Concepts: + - explanation/index.md + - Overview: + - Data Pipelines: explanation/data-pipelines.md + - What's New in 2.0: explanation/whats-new-2.md + - FAQ: explanation/faq.md + - Data Model: + - Relational Workflow Model: explanation/relational-workflow-model.md + - Entity Integrity: explanation/entity-integrity.md + - Normalization: explanation/normalization.md + - Computation Model: explanation/computation-model.md + - Queries: + - Query Algebra: explanation/query-algebra.md + - Storage: + - Type System: explanation/type-system.md + - Custom Codecs: explanation/custom-codecs.md + - Tutorials: + - tutorials/index.md + - Basics: + - First Pipeline: tutorials/basics/01-first-pipeline.ipynb + - Schema Design: tutorials/basics/02-schema-design.ipynb + - Data Entry: tutorials/basics/03-data-entry.ipynb + - Queries: tutorials/basics/04-queries.ipynb + - Computation: tutorials/basics/05-computation.ipynb + - Object Storage: tutorials/basics/06-object-storage.ipynb + - Examples: + - University Database: tutorials/examples/university.ipynb + - Hotel Reservations: tutorials/examples/hotel-reservations.ipynb + - Languages & Proficiency: tutorials/examples/languages.ipynb + - Fractal Pipeline: tutorials/examples/fractal-pipeline.ipynb + - Blob Detection: tutorials/examples/blob-detection.ipynb + - Domain: + - Calcium Imaging: tutorials/domain/calcium-imaging/calcium-imaging.ipynb + - Electrophysiology: tutorials/domain/electrophysiology/electrophysiology.ipynb + - Ephys with Object Storage: tutorials/domain/electrophysiology/ephys-with-npy.ipynb + - Allen CCF: tutorials/domain/allen-ccf/allen-ccf.ipynb + - Advanced: + - SQL Comparison: tutorials/advanced/sql-comparison.ipynb + - JSON Data Type: tutorials/advanced/json-type.ipynb + - Distributed Computing: tutorials/advanced/distributed.ipynb + - Custom Codecs: tutorials/advanced/custom-codecs.ipynb + - How-To: + - how-to/index.md + - Setup: + - Installation: how-to/installation.md + - Configure Database: how-to/configure-database.md + - Configure Object Storage: how-to/configure-storage.md + - Command-Line Interface: how-to/use-cli.md + - Schema Design: + - Define Tables: how-to/define-tables.md + - Model Relationships: how-to/model-relationships.ipynb + - Design Primary Keys: how-to/design-primary-keys.md + - Read Diagrams: how-to/read-diagrams.ipynb + - Project Management: + - Manage Pipeline Project: how-to/manage-pipeline-project.md + - Data Operations: + - Insert Data: how-to/insert-data.md + - Query Data: how-to/query-data.md + - Fetch Results: how-to/fetch-results.md + - Delete Data: how-to/delete-data.md + - Computation: + - Run Computations: how-to/run-computations.md + - Distributed Computing: how-to/distributed-computing.md + - Handle Errors: how-to/handle-errors.md + - Monitor Progress: how-to/monitor-progress.md + - Object Storage: + - Use Object Storage: how-to/use-object-storage.md + - Use NPY Codec: how-to/use-npy-codec.md + - Create Custom Codecs: how-to/create-custom-codec.md + - Manage Large Data: how-to/manage-large-data.md + - Clean Up Storage: how-to/garbage-collection.md + - Maintenance: + - Migrate to 2.0: how-to/migrate-to-v20.md + - Alter Tables: how-to/alter-tables.md + - Backup and Restore: how-to/backup-restore.md + - Reference: + - reference/index.md + - Specifications: + - reference/specs/index.md + - Schema Definition: + - Table Declaration: reference/specs/table-declaration.md + - Master-Part: reference/specs/master-part.md + - Virtual Schemas: reference/specs/virtual-schemas.md + - Query Algebra: + - Query Operators: reference/specs/query-algebra.md + - Semantic Matching: reference/specs/semantic-matching.md + - Primary Keys: reference/specs/primary-keys.md + - Fetch API: reference/specs/fetch-api.md + - Type System: + - Types: reference/specs/type-system.md + - Codec API: reference/specs/codec-api.md + - NPY Codec: reference/specs/npy-codec.md + - Data Operations: + - Data Manipulation: reference/specs/data-manipulation.md + - AutoPopulate: reference/specs/autopopulate.md + - Job Metadata: reference/specs/job-metadata.md + - Configuration: reference/configuration.md + - Definition Syntax: reference/definition-syntax.md + - Operators: reference/operators.md + - Errors: reference/errors.md + - Elements: elements/index.md + - API: api/ # Auto-generated via gen-files + literate-nav - About: - - About: about/about.md + - about/index.md - History: about/history.md - - Team: about/datajoint-team.md - - Citation Guidelines: about/citation.md - - Contribution Guidelines: about/contribute.md + - Platform: about/platform.md + - Citation: about/citation.md + - Publications: about/publications.md + - Contributing: about/contributing.md # ---------------------------- STANDARD ----------------------------- @@ -57,7 +130,10 @@ theme: logo: main/company-logo favicon: assets/images/company-logo-blue.png features: - - toc.integrate + - navigation.sections + - navigation.indexes + - toc.follow + - announce.dismiss palette: - media: "(prefers-color-scheme: light)" scheme: datajoint @@ -73,14 +149,36 @@ plugins: - search - mermaid2 - section-index - # There is no welcome.md anymore - # - redirects: - # redirect_maps: - # "index.md": "welcome.md" + - autorefs + - mkdocstrings: + default_handler: python + handlers: + python: + paths: + - /datajoint-python/src # Path to datajoint-python source (mounted in Docker) + options: + docstring_style: numpy + members_order: source + group_by_category: false + show_source: false + show_root_heading: true + show_root_full_path: false + separate_signature: true + line_length: 88 + filters: + - "!^_" # Exclude private members + - gen-files: + scripts: + - scripts/gen_api_pages.py + - literate-nav: + nav_file: SUMMARY.md + - mkdocs-jupyter: + include_source: true + execute: false # Don't execute notebooks during build - exclude: glob: - - archive/* - images/*md + - "*/SUMMARY.md" markdown_extensions: - attr_list - md_in_html @@ -106,21 +204,21 @@ markdown_extensions: - pymdownx.magiclink # Displays bare URLs as links - pymdownx.tasklist: # Renders check boxes in tasks lists custom_checkbox: true + - pymdownx.arithmatex: # LaTeX math support + generic: true extra: generator: false # Disable watermark - # There is no version for this doc - # version: - # provider: mike + datajoint_version: "2.0" # DataJoint Python version this documentation covers social: - icon: main/company-logo link: https://www.datajoint.com name: DataJoint - - icon: main/company-logo + - icon: material/book-open-variant link: https://docs.datajoint.com name: DataJoint Documentation - - icon: fontawesome/brands/slack - link: https://datajoint.slack.com - name: Slack + - icon: fontawesome/solid/comments + link: https://github.com/datajoint/datajoint-python/discussions + name: Discussions - icon: fontawesome/brands/linkedin link: https://www.linkedin.com/company/datajoint name: LinkedIn @@ -145,4 +243,6 @@ extra: extra_css: - assets/stylesheets/extra.css extra_javascript: + - javascripts/mathjax.js + - https://unpkg.com/mathjax@3/es5/tex-mml-chtml.js - https://js-na1.hs-scripts.com/23133402.js # HubSpot chatbot diff --git a/pip_requirements.txt b/pip_requirements.txt index 0f1a2e2b..b67c68d2 100644 --- a/pip_requirements.txt +++ b/pip_requirements.txt @@ -1,8 +1,11 @@ mkdocs-material -mkdocs-redirects mkdocs-exclude mdx_truly_sane_lists -mkdocs-pymdownx-material-extras pymdown-extensions mkdocs-section-index -mkdocs-mermaid2-plugin \ No newline at end of file +mkdocs-mermaid2-plugin +mkdocs-jupyter +mkdocstrings[python] +mkdocs-gen-files +mkdocs-literate-nav +mkdocs-autorefs diff --git a/scripts/gen_api_pages.py b/scripts/gen_api_pages.py new file mode 100644 index 00000000..4fe22b14 --- /dev/null +++ b/scripts/gen_api_pages.py @@ -0,0 +1,109 @@ +"""Generate API documentation pages from datajoint-python source.""" + +from pathlib import Path + +import mkdocs_gen_files + +# Path to datajoint-python source (relative to docs root or absolute) +# This assumes datajoint is installed or PYTHONPATH includes the source +PACKAGE_NAME = "datajoint" + +# Modules to document (public API) +PUBLIC_MODULES = [ + "datajoint", + "datajoint.connection", + "datajoint.schemas", + "datajoint.table", + "datajoint.user_tables", + "datajoint.expression", + "datajoint.heading", + "datajoint.diagram", + "datajoint.settings", + "datajoint.errors", + "datajoint.codecs", + "datajoint.blob", + "datajoint.hash_registry", + "datajoint.jobs", + "datajoint.admin", + "datajoint.migrate", +] + +# Module display names and descriptions +MODULE_INFO = { + "datajoint": ("Package", "Main datajoint package exports"), + "datajoint.connection": ("Connection", "Database connection management"), + "datajoint.schemas": ("Schema", "Schema and VirtualModule classes"), + "datajoint.table": ("Table", "Base Table and FreeTable classes"), + "datajoint.user_tables": ("Table Types", "Manual, Lookup, Imported, Computed, Part"), + "datajoint.expression": ("Expressions", "Query expressions and operators"), + "datajoint.heading": ("Heading", "Table heading and attributes"), + "datajoint.diagram": ("Diagram", "Schema visualization"), + "datajoint.settings": ("Settings", "Configuration management"), + "datajoint.errors": ("Errors", "Exception classes"), + "datajoint.codecs": ("Codecs", "Type codec system"), + "datajoint.blob": ("Blob", "Binary serialization"), + "datajoint.hash_registry": ("Hash Registry", "Content hashing for external storage"), + "datajoint.jobs": ("Jobs", "Job queue for AutoPopulate"), + "datajoint.admin": ("Admin", "Administrative functions"), + "datajoint.migrate": ("Migrate", "Schema migration utilities"), +} + +nav = mkdocs_gen_files.Nav() + +# Generate index page +with mkdocs_gen_files.open("api/index.md", "w") as f: + f.write("# API Reference\n\n") + f.write("Auto-generated documentation from DataJoint source code.\n\n") + f.write("## Modules\n\n") + f.write("| Module | Description |\n") + f.write("|--------|-------------|\n") + for module in PUBLIC_MODULES: + if module in MODULE_INFO: + name, desc = MODULE_INFO[module] + module_path = module.replace(".", "/") + f.write(f"| [{name}]({module_path}.md) | {desc} |\n") + +nav[("index.md",)] = "index.md" + +# Generate datajoint submodule index page +# This prevents section-index from using 'admin' as the section landing page +with mkdocs_gen_files.open("api/datajoint/index.md", "w") as f: + f.write("# datajoint\n\n") + f.write("DataJoint Python library modules.\n\n") + f.write("## Submodules\n\n") + f.write("| Module | Description |\n") + f.write("|--------|-------------|\n") + for module in PUBLIC_MODULES: + if module.startswith("datajoint.") and module in MODULE_INFO: + name, desc = MODULE_INFO[module] + submodule = module.split(".")[-1] + f.write(f"| [{name}]({submodule}.md) | {desc} |\n") + +nav[("datajoint", "index.md")] = "datajoint/index.md" + +# Generate page for each module +for module in PUBLIC_MODULES: + module_path = module.replace(".", "/") + doc_path = f"api/{module_path}.md" + + with mkdocs_gen_files.open(doc_path, "w") as f: + if module in MODULE_INFO: + name, desc = MODULE_INFO[module] + f.write(f"# {name}\n\n") + f.write(f"{desc}\n\n") + else: + f.write(f"# {module}\n\n") + + f.write(f"::: {module}\n") + f.write(" options:\n") + f.write(" show_source: false\n") + f.write(" show_root_heading: false\n") + f.write(" members_order: source\n") + + # Add to navigation + parts = tuple(module_path.split("/")) + nav[parts] = f"{module_path}.md" + +# Write navigation file +with mkdocs_gen_files.open("api/SUMMARY.md", "w") as nav_file: + nav_file.writelines(nav.build_literate_nav()) diff --git a/scripts/gen_llms_full.py b/scripts/gen_llms_full.py new file mode 100644 index 00000000..01a0c00a --- /dev/null +++ b/scripts/gen_llms_full.py @@ -0,0 +1,115 @@ +#!/usr/bin/env python3 +""" +Generate llms-full.txt from documentation sources. + +This script concatenates all markdown documentation into a single file +optimized for LLM consumption. +""" + +import json +from pathlib import Path + +# Documentation root +DOCS_DIR = Path(__file__).parent.parent / "src" +OUTPUT_FILE = DOCS_DIR / "llms-full.txt" + +# Sections in order of importance +SECTIONS = [ + ("Concepts", "explanation"), + ("Tutorials", "tutorials"), + ("How-To Guides", "how-to"), + ("Reference", "reference"), + ("About", "about"), +] + +HEADER = """# DataJoint Documentation (Full) + +> DataJoint is a Python framework for building scientific data pipelines with automated computation, integrity constraints, and seamless integration of relational databases with object storage. This documentation covers DataJoint 2.0. + +> This file contains the complete documentation for LLM consumption. For an index with links, see /llms.txt + +--- + +""" + + +def read_markdown_file(filepath: Path) -> str: + """Read a markdown file and return its content.""" + try: + with open(filepath, "r", encoding="utf-8") as f: + content = f.read() + return content + except Exception as e: + print(f"Warning: Could not read {filepath}: {e}") + return "" + + +def read_notebook_file(filepath: Path) -> str: + """Read a Jupyter notebook and extract markdown and code cells.""" + try: + with open(filepath, "r", encoding="utf-8") as f: + nb = json.load(f) + + content_parts = [] + for cell in nb.get("cells", []): + cell_type = cell.get("cell_type", "") + source = "".join(cell.get("source", [])) + + if cell_type == "markdown": + content_parts.append(source) + elif cell_type == "code": + content_parts.append(f"\n```python\n{source}\n```\n") + + return "\n\n".join(content_parts) + except Exception as e: + print(f"Warning: Could not read notebook {filepath}: {e}") + return "" + + +def get_doc_files(directory: Path) -> list[Path]: + """Get all documentation files in a directory, sorted.""" + if not directory.exists(): + return [] + md_files = list(directory.glob("**/*.md")) + nb_files = list(directory.glob("**/*.ipynb")) + files = md_files + nb_files + # Sort by path to ensure consistent ordering + return sorted(files) + + +def generate_llms_full(): + """Generate the llms-full.txt file.""" + content_parts = [HEADER] + + for section_name, section_dir in SECTIONS: + section_path = DOCS_DIR / section_dir + doc_files = get_doc_files(section_path) + + if not doc_files: + continue + + content_parts.append(f"\n{'='*60}\n") + content_parts.append(f"# {section_name}\n") + content_parts.append(f"{'='*60}\n\n") + + for doc_file in doc_files: + relative_path = doc_file.relative_to(DOCS_DIR) + content_parts.append(f"\n---\n") + content_parts.append(f"## File: {relative_path}\n\n") + + if doc_file.suffix == ".ipynb": + content_parts.append(read_notebook_file(doc_file)) + else: + content_parts.append(read_markdown_file(doc_file)) + content_parts.append("\n") + + # Write output + full_content = "".join(content_parts) + with open(OUTPUT_FILE, "w", encoding="utf-8") as f: + f.write(full_content) + + print(f"Generated {OUTPUT_FILE} ({len(full_content):,} bytes)") + + +if __name__ == "__main__": + generate_llms_full() diff --git a/src/.overrides/assets/stylesheets/extra.css b/src/.overrides/assets/stylesheets/extra.css index bf392637..8b2a1fb7 100644 --- a/src/.overrides/assets/stylesheets/extra.css +++ b/src/.overrides/assets/stylesheets/extra.css @@ -29,9 +29,6 @@ html a[title="DataJoint"].md-social__link svg { color: var(--dj-primary); } -html a[title="Slack"].md-social__link svg { - color: var(--dj-primary); -} html a[title="LinkedIn"].md-social__link svg { color: var(--dj-primary); } @@ -105,3 +102,22 @@ html a[title="YouTube"].md-social__link svg { /* previous/next text */ /* --md-footer-fg-color: var(--dj-white); */ } + +/* DataJoint query result tables - make them smaller */ +.jp-OutputArea-output table, +.jp-RenderedHTMLCommon table { + font-size: 0.75rem; +} + +.jp-OutputArea-output table td, +.jp-OutputArea-output table th, +.jp-RenderedHTMLCommon table td, +.jp-RenderedHTMLCommon table th { + padding: 0.25rem 0.5rem; +} + +/* Reduce monospace font size in notebook outputs */ +.jp-OutputArea-output pre, +.jp-OutputArea-output code { + font-size: 0.8rem; +} diff --git a/src/.overrides/partials/announce.html b/src/.overrides/partials/announce.html new file mode 100644 index 00000000..d45cdea3 --- /dev/null +++ b/src/.overrides/partials/announce.html @@ -0,0 +1,5 @@ +{% if config.extra.datajoint_version %} + + Documentation for DataJoint {{ config.extra.datajoint_version }} + +{% endif %} diff --git a/src/about/about.md b/src/about/about.md deleted file mode 100644 index 2b64ce6f..00000000 --- a/src/about/about.md +++ /dev/null @@ -1,11 +0,0 @@ -DataJoint Elements, DataJoint documentation, and DataJoint Web GUIs and APIs are supported by the NIH grant [**NIH U24 NS116470**](https://reporter.nih.gov/project-details/10891663) for disseminating open-source software for neuroscience research. - -The goal is to systematize and disseminate data pipeline designs from leading neuroscience projects using the DataJoint framework. - -### Aim 1: DataJoint Pipelines for Neurophysiology - -Extract and systematize essential design motifs from published DataJoint-based projects as a collection of simple modules. - -### Aim 2: Access and Training Resources - -Support a dedicated resource for accessing and using DataJoint Pipelines for Neurophysiology. diff --git a/src/about/contribute.md b/src/about/contribute.md deleted file mode 100644 index 892b02a3..00000000 --- a/src/about/contribute.md +++ /dev/null @@ -1,164 +0,0 @@ -# Contribution Guidelines - -Thank you for your interest in contributing to DataJoint open-source software! - -These guidelines are designed to ensure smooth collaboration, high-quality contributions, and a welcoming environment for all contributors. Please take a moment to review this document in order to make the contribution process easy and effective for everyone involved. - -The principal maintainer of DataJoint and associated tools is the DataJoint company. The pronouns β€œwe” and β€œus” in this guideline refer to the principal maintainers. We invite reviews and contributions of the open-source software. We compiled these guidelines to make this work clear and efficient. - -## Table of Contents - -- [Community Engagement](#community-engagement) -- [How to Contribute](#how-to-contribute) - - [Project Lists](#project-lists) - - [Prerequisites](#prerequisites) - - [Reporting Bugs](#reporting-bugs) - - [Proposing Features or Enhancements](#proposing-features-or-enhancements) - - [Submitting Pull Requests (PRs)](#submitting-pull-requests-prs) - - [Code Reviews](#code-reviews) -- [Releases](#releases) -- [Contribution Acknowledgment](#contribution-acknowledgment) - -## Community Engagement - -For general questions, ideas, discussions or live debugging sessions, please join [DataJoint Slack](https://join.slack.com/t/datajoint/shared_invite/enQtMjkwNjQxMjI5MDk0LTQ3ZjFiZmNmNGVkYWFkYjgwYjdhNTBlZTBmMWEyZDc2NzZlYTBjOTNmYzYwOWRmOGFmN2MyYzU0OWQ0MWZiYTE) or [Stack Overflow](https://stackoverflow.com/questions/tagged/datajoint), but for direct technical issues should stay in `Github Issue` in the respective project's repository. Response times may vary depending on maintainer availability. - -- For resolving bugs, errors, or general debugging help, please submit it through `Github Issue` in the respective repository. -- For live debugging, urgent help, or broader discussions, join the [DataJoint Slack](https://join.slack.com/t/datajoint/shared_invite/enQtMjkwNjQxMjI5MDk0LTQ3ZjFiZmNmNGVkYWFkYjgwYjdhNTBlZTBmMWEyZDc2NzZlYTBjOTNmYzYwOWRmOGFmN2MyYzU0OWQ0MWZiYTE). -- For feature requests, please open an issue directly in the `Github Issue` of the respective repository providing sufficient details to facilitate discussion and prioritization. - -[Back to Top](#table-of-contents) - -## How to Contribute - -### Project Lists - -Actively maintained projects by DataJoint: - -- DataJoint Enhancement Proposal - in progress -- [DataJoint Specs](https://github.com/datajoint/datajoint-specs) -- [DataJoint Docs](https://github.com/datajoint/datajoint-docs) - - It is the landing page of DataJoint documentation. - - Each project has its own documentation in its repository. - - Please help us to improve our documentations, it's the easiest but most impactful way to contribute! -- [DataJoint Python](https://github.com/datajoint/datajoint-python) -- [DataJoint Elements](https://github.com/orgs/datajoint/repositories?q=element) -- [datajoint/djlabhub-docker](https://github.com/datajoint/djlabhub-docker) -- [datajoint/nginx-docker](https://github.com/datajoint/nginx-docker) - -Archived projects by DataJoint, but still open for community contributions: - -- [Datajoint MATLAB](https://github.com/datajoint/datajoint-matlab) -- [DataJoint Pharus](https://github.com/datajoint/pharus) -- [DataJoint SciViz](https://github.com/datajoint/sci-viz) -- [DataJoint LabBook](https://github.com/datajoint/datajoint-labbook) -- Most of [Docker images](https://github.com/orgs/datajoint/repositories?q=docker) expect the ones listed above - -### Prerequisites - -- Familiarize yourself with the project documentation and guidelines. -- Start with reading the repository's `README.md` and `CONTRIBUTION.md`. You should expect to find the following instructions for the respective project: - - Installation instructions. - - Development environment setup. - - Testing instructions. - -> Please open an issue in the respective repository if any of those instructions in the documentations or `READMD.md` are unclear to you. Contributions to documentations are equivalently important to any code for the community, please help us to resolve any confusions in documentations. - -### Reporting Bugs - -Before you open up a new issue, please check `Github Issue` to see if there are any related open/closed issues or open/closed PRs to avoid duplicates. If not, please open a new issue with clearly description of your bug, including: - -- Steps to reproduce (if applicable). -- Expected and actual outcomes. -- Any relevant error messages, logs, or screenshots. -- Include environment details (e.g., OS, pip, conda dependencies) to speed up troubleshooting. - -### Proposing Features or Enhancements - -Before starting your significant work, open a `Github Issue` to discuss your proposal first. Please include: - -- A clear problem statement. -- Proposed solution or feature details. -- Relevant examples or use cases. - -> There will be a repository for DataJoint Enhancement Proposal to centralize all proposals, it is currently in progress. - -### Submitting Pull Requests (PRs) - -> In DataJoint, we use **[Forking Workflow](https://www.atlassian.com/git/tutorials/comparing-workflows/forking-workflow)** to manage contributions to keep the main fork's branch management clean. - -1. Fork the repository to your own Github account and clone it to your local machine. - - Please remember to always sync your fork's main branch with the DataJoint repository's main branch before starting your work. - - In your own fork, we suggest you use [Feature Branch Workflow](https://www.atlassian.com/git/tutorials/comparing-workflows/feature-branch-workflow) to manage your branches in your own fork, just in case someone will work on multiple contributions at the same time. -2. Create a descriptive feature/fix branch from your fork's main branch, e.g., `fix/typo-docs` or `feature/add-logging`. -3. Optionally, but highly recommended to follow [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) to make commit messages easier to be searched and categorized: If you use VSCode, please install [Conventional Commits](https://marketplace.visualstudio.com/items?itemName=vivaxy.vscode-conventional-commits) extension, it will help you to edit your commit messages following the commit types for versioning: - - `fix`: Bug fixes. - - `feat`: New features. - - `docs`: Documentation updates. - - `Breaking changes`: Changes would break backward compatibility, may affect the existing users when they upgrade. Use ! after the type or add BREAKING CHANGE in the commit footer. - - `chore`: Like the name, it is a chore. - - Example, if you are not using the VSCode extension: `git commit -m "fix(auth): resolve token expiration bug."` -4. Reference related issue(s) in your PR description (e.g., Closes #123). -5. Cover new functionality or bug fixes with appropriate tests. Ensure all tests pass before submission. Typically as it relates to tests, this means: - 1. No syntax errors - 2. No integration errors - 3. No style errors e.g. PEP8, etc. - 4. Similar or better code coverage -6. **Additional documentation** to reflect new feature or behavior introduced. -7. Provide a detailed PR description explaining the changes and their impact. -8. Submit the PR for review. Maintainers will also ensure that PR’s have the appropriate assignment for reviewer. - -### Code Reviews - -A contributor should not approve or merge their own PR. A maintainer will review and -approve the PR. - -Reviewer suggestions or feedback should not be directly committed to a branch on a -contributor’s fork. A less intrusive way to collaborate would be for the reviewer to PR -to the contributor’s fork/branch that is associated with the main PR currently in -review. - -Expect constructive feedback from maintainers. Maintainers will review your PR and suggest changes or improvements. Be responsive to feedback and iterate as needed. Reviews focus on code quality and adherence to standards, and documentation and test coverage. Once approved, the PR will be merged. - -[Back to Top](#table-of-contents) - -## Releases - -Releases follow the standard definition of -[semantic versioning](https://semver.org/spec/v2.0.0.html). Meaning: - -`MAJOR` . `MINOR` . `PATCH/MICRO` - -- `MAJOR` version bump when breaking changes make backward incompatible. - -- `MINOR` version bump when added functionalities is backward compatible. - -- `PATCH/MICRO` version when included bug fixes are backward compatible. - -> Backward Compatible means that the existing users can upgrade to the new version without any changes to their existing code. - -For DataJoint open-source projects, we have two ways of making a release at this moment since we are improving the release process, and we will eventually consolidate into one way: - -- Datajoint Python release, the future direction: - - We use `Github Label` and [PR Labeler action](https://github.com/actions/labeler) to categorize each PR. - - Then we use [Release Drafter](https://github.com/release-drafter/release-drafter) to manually trigger a Github Actions workflow to make a draft release. - - Changelog will be provided by [Github Compare URL](https://github.com/datajoint/datajoint-python/compare/v0.14.2...v0.14.3) at the end of the release note. - - Then we manually publish the draft release to trigger a release Github Actions workflow. -- Others: - - This process is very dependent on conventional commits and tagging. - - It will be triggered by pushing a new tag to the repository. - - It uses [python-semantic-release](https://python-semantic-release.readthedocs.io/en/latest/) to parse all the conventional commits for the release note and `CHANGELOG.md`. - -> We found the former resolver would work the best for our community since contributors are from different background, we do not want to require them to adopt conventional commits. - -[Back to Top](#table-of-contents) - -## Contribution Acknowledgment - -We deeply appreciate every contribution! By adhering to these guidelines, you help maintain the quality, usability, and success of any DataJoint open-source software. - -For any questions, feel free to reach out via `Github Issue` in the specific repository, our [Community Slack](https://join.slack.com/t/datajoint/shared_invite/enQtMjkwNjQxMjI5MDk0LTQ3ZjFiZmNmNGVkYWFkYjgwYjdhNTBlZTBmMWEyZDc2NzZlYTBjOTNmYzYwOWRmOGFmN2MyYzU0OWQ0MWZiYTE) or contact `support@datajoint.com`. - -Thank you for your contributions! - -[Back to Top](#table-of-contents) diff --git a/src/about/contributing.md b/src/about/contributing.md new file mode 100644 index 00000000..31c4ca35 --- /dev/null +++ b/src/about/contributing.md @@ -0,0 +1,110 @@ +# Contributing to DataJoint + +DataJoint is developed openly and welcomes contributions from the community. + +## Ways to Contribute + +### Report Issues + +Found a bug or have a feature request? Open an issue on GitHub: + +- [datajoint-python issues](https://github.com/datajoint/datajoint-python/issues) +- [datajoint-docs issues](https://github.com/datajoint/datajoint-docs/issues) + +### Propose Enhancements (RFC Process) + +For significant changes to DataJointβ€”new features, API changes, or specification updatesβ€”we use an RFC (Request for Comments) process via GitHub Discussions. + +**When to use an RFC:** + +- API changes or new features in datajoint-python +- Changes to the DataJoint specification +- Breaking changes or deprecations +- Major documentation restructuring + +**RFC Process:** + +1. **Propose** β€” Create a new Discussion using the RFC template in the appropriate repository: + - [datajoint-python Discussions](https://github.com/datajoint/datajoint-python/discussions/new?category=rfc) + - [datajoint-docs Discussions](https://github.com/datajoint/datajoint-docs/discussions/new?category=rfc) + +2. **Discuss** β€” Community and maintainers provide feedback (2-4 weeks). Use πŸ‘/πŸ‘Ž reactions to signal support. Prototyping in parallel is encouraged. + +3. **Final Comment Period** β€” Once consensus emerges, maintainers announce a 1-2 week final comment period. No changes during this time. + +4. **Decision** β€” RFC is accepted, rejected, or postponed. Accepted RFCs become tracking issues for implementation. + +**RFC Labels:** + +| Label | Meaning | +|-------|---------| +| `rfc` | All enhancement proposals | +| `status: proposed` | Initial submission | +| `status: under-review` | Active discussion | +| `status: final-comment` | Final comment period | +| `status: accepted` | Approved for implementation | +| `status: rejected` | Not accepted | +| `status: postponed` | Deferred to future | + +**Tips for a good RFC:** + +- Search existing discussions first +- Include concrete use cases and code examples +- Consider backwards compatibility +- Start with motivation before diving into design + +### Improve Documentation + +Documentation improvements are valuable contributions: + +1. Fork the [datajoint-docs](https://github.com/datajoint/datajoint-docs) repository +2. Make your changes +3. Submit a pull request + +### Contribute Code + +For code contributions to datajoint-python: + +1. Fork the repository +2. Create a feature branch +3. Write tests for your changes +4. Ensure all tests pass +5. Submit a pull request + +See the [Developer Guide](https://github.com/datajoint/datajoint-python/blob/main/CONTRIBUTING.md) +for detailed instructions. + +## Development Setup + +### datajoint-python + +```bash +git clone https://github.com/datajoint/datajoint-python.git +cd datajoint-python +pip install -e ".[dev]" +pre-commit install +``` + +### datajoint-docs + +```bash +git clone https://github.com/datajoint/datajoint-docs.git +cd datajoint-docs +pip install -r pip_requirements.txt +mkdocs serve +``` + +## Code Style + +- Python code follows [PEP 8](https://pep8.org/) +- Docstrings use [NumPy style](https://numpydoc.readthedocs.io/en/latest/format.html) +- Pre-commit hooks enforce formatting + +## Testing + +See the [Developer Guide](https://github.com/datajoint/datajoint-python/blob/main/CONTRIBUTING.md) +for current testing instructions using `pixi` and `testcontainers`. + +## Questions? + +- Open a [GitHub Discussion](https://github.com/datajoint/datajoint-python/discussions) diff --git a/src/about/datajoint-team.md b/src/about/datajoint-team.md deleted file mode 100644 index e7727a0f..00000000 --- a/src/about/datajoint-team.md +++ /dev/null @@ -1,51 +0,0 @@ -# Team - -The project is performed by [DataJoint](https://www.datajoint.com) with Dimitri Yatsenko -as Principal Investigator. - -## Scientists - -- Dimitri Yatsenko, PhD - PI & Chief Science and Technology Officer - -- Thinh Nguyen, PhD - SciOps Lead -- Kushal Bakshi, PhD - SciOps Engineer -- Milagros MarΓ­n, PhD - SciOps Engineer - -## Engineers - -- Drew Yang - Data Systems Engineer -- Ethan Ho - Software Engineer - -## Past contributors - -- Edgar Y. Walker - System Architect, Data Scientist, Project Manager (from project - start to Jan, 2021) -- Andreas S. Tolias - Grant proposal contributor -- Jacob Reimer - Grant proposal contributor -- Shan Shen - Data Scientist -- Joseph Burling - Data Scientist -- Chris Brozdowski - Data Scientist -- Tolga Dincer - Data Scientist -- Raphael Guzman - Software Engineer -- Maho Sasaki - Software Engineer -- Daniel Sitonic - Software Engineer -- Carlos Ortiz - Software Engineer -- Chetana Pitani - Software Engineer -- Christopher Turner - Data Systems Engineer -- Timothy Chandler - Data Systems Engineer -- David Godinez - Data Engineer -- Geetika Singh - Data Engineer -- Kabilar Gunalan - Project Manager, Data Scientist -- Jaerong Ahn - SciOps Engineer -- Jeroen Verswijver - Software Engineer -- Adib Baji - Software Engineer -- Sid Hulyalkar - SciOps Engineer - -The first-person pronouns "we" and "our" in these documents refer to those listed above. - -## External contributors - -The principal components of the Resource are developed and distributed as open-source -projects and external contributions are welcome. We have adopted a -[Contribution Guide](contribute.md) for DataJoint, DataJoint Elements, and related -open-source tools. diff --git a/src/about/history.md b/src/about/history.md index 547d8de6..76f54b4e 100644 --- a/src/about/history.md +++ b/src/about/history.md @@ -1,34 +1,31 @@ # History -Dimitri Yatsenko began development of DataJoint in Andreas S.Tolias' lab in the -Neuroscience Department at Baylor College of Medicine in the fall of 2009. Initially -implemented as a thin MySQL API in MATLAB, it defined the major principles of the -DataJoint model. +Dimitri Yatsenko began development of DataJoint in Andreas S. Tolias' lab in the Neuroscience Department at Baylor College of Medicine in the fall of 2009. Initially implemented as a thin MySQL API in MATLAB, it defined the major principles of the DataJoint model. The [original DataJoint project](https://code.google.com/archive/p/datajoint/wikis/DataJoint.wiki) is archived on Google Code. -Many students and postdocs in the lab as well as collaborators and early adopters have -contributed to the project. Jacob Reimer and Emmanouil Froudarakis became early adopters -in Andreas Tolias' Lab and propelled development. Alexander S. Ecker, Philipp Berens, -Andreas Hoenselaar, and R. James Cotton contributed to the formulation of the overall -requirements for the data model and critical reviews of DataJoint development. +In 2015, additional contributors joined to develop the Python implementation, resulting in the [foundational publication](https://doi.org/10.1101/031658) describing the DataJoint framework. -Outside the Tolias lab, the first labs to adopt DataJoint (approx. 2010) were the labs -of Athanassios G. Siapas at CalTech, Laura Busse and Steffen Katzner at the University -of TΓΌbingen. +In 2016, Vathes LLC was founded to provide support to groups using DataJoint. -In 2015, the Python implementation gained momentum with Edgar Y. Walker and Fabian Sinz -joining as principal contributors. +In 2017, DARPA awarded a Phase I SBIR grant (Contract D17PC00162, PI: Dimitri Yatsenko, $150,000, 2017–2018) titled "Tools for Sharing and Analyzing Neuroscience Data" to further develop and publicize the DataJoint framework. -In 2016, Andreas Tolias Lab joined the MICrONS project, using DataJoint to process -volumes of neurophysiology and neuroanatomical data shared across large teams. +In 2018, the key theoretical framework was formulated in ["DataJoint: A Simpler Relational Data Model"](https://doi.org/10.48550/arXiv.1807.11104), establishing the formal basis for DataJoint's approach to scientific data management. -In 2016, Vathes LLC was founded to provide support to groups using DataJoint. +In 2022, NIH awarded a Phase II SBIR grant ([R44 NS129492](https://reporter.nih.gov/project-details/10600812), PI: Dimitri Yatsenko, $2,124,457, 2022–2024) titled "DataJoint SciOps: A Managed Service for Neuroscience Data Workflows" to DataJoint (then Vathes LLC) in collaboration with the Johns Hopkins University Applied Physics Laboratory (Co-PI: Erik C. Johnson) to build a scalable cloud platform for DataJoint pipelines. + +## DataJoint Elements + +[DataJoint Elements](https://docs.datajoint.com/elements/) is an NIH-funded project ([U24 NS116470](https://reporter.nih.gov/project-details/10547509), PI: Dimitri Yatsenko, $3,780,000, 2020–2025) titled "DataJoint Pipelines for Neurophysiology." The project developed standard, open-source data pipelines for neurophysiology research ([Press Release](https://www.pr.com/press-release/873164)). + +Building on DataJoint's workflow framework, Elements provides curated, modular components for common experimental modalities including calcium imaging, electrophysiology, pose estimation, and optogenetics. The project distilled best practices from leading neuroscience labs into reusable pipeline modules that integrate with third-party analysis tools (Suite2p, DeepLabCut, Kilosort, etc.) and data standards (NWB, DANDI). + +The project is described in the position paper ["DataJoint Elements: Data Workflows for Neurophysiology"](https://www.biorxiv.org/content/10.1101/2021.03.30.437358v2). + +## Recent Developments -In 2017, DARPA awarded a small-business innovation research grant to Vathes LLC -(Contract D17PC00162) to further develop and publicize the DataJoint framework. +In January 2024, Vathes LLC was re-incorporated as DataJoint Inc. -In June 2018, the Princeton Neuroscience Institute, under the leadership of Prof. Carlos -Brody, began funding a project to generate a detailed DataJoint user manual. +In 2025, Jim Olson was appointed as CEO of DataJoint ([Press Release](https://www.prweb.com/releases/datajoint-appoints-former-flywheel-exec-jim-olson-as-new-ceo-302342644.html)). -In 2022, DataJoint was awarded NIH grant [NIH U24 NS116470](https://reporter.nih.gov/project-details/10547509) for disseminating open-source software for neuroscience research ([Press Release](https://www.pr.com/press-release/873164)). +In August 2025, DataJoint closed a $4.9M seed funding round to expand data management and AI capabilities in academic and life sciences ([Press Release](https://www.prnewswire.com/news-releases/datajoint-closes-4-9m-seed-funding-to-revolutionize-data-management-and-ai-in-academic-and-life-sciences-pharma-302568792.html)). -In 2025, Jim Olson, former executive at Flywheel, was appointed as the new CEO of DataJoint ([Press Release](https://www.prweb.com/releases/datajoint-appoints-former-flywheel-exec-jim-olson-as-new-ceo-302342644.html)). +Today, DataJoint is used in hundreds of research labs worldwide for managing scientific data pipelines. diff --git a/src/about/index.md b/src/about/index.md new file mode 100644 index 00000000..c15efd73 --- /dev/null +++ b/src/about/index.md @@ -0,0 +1,47 @@ +# About DataJoint + +DataJoint is an open-source framework for building scientific data pipelines. +It was created to address the challenges of managing complex, interconnected +data in research laboratories. + +## What is DataJoint? + +DataJoint implements the **Relational Workflow Model**β€”a paradigm that extends +relational databases with native support for computational workflows. Unlike +traditional databases that only store data, DataJoint pipelines define how data +flows through processing steps, when computations run, and how results depend +on inputs. + +Key characteristics: + +- **Declarative schema design** β€” Define tables and relationships in Python +- **Automatic dependency tracking** β€” Foreign keys encode workflow dependencies +- **Built-in computation** β€” Imported and Computed tables run automatically +- **Data integrity** β€” Referential integrity and transaction support +- **Reproducibility** β€” Immutable data with full provenance + +## History + +DataJoint was developed at Baylor College of Medicine starting in 2009 to +support neuroscience research. It has since been adopted by laboratories +worldwide for a variety of scientific applications. + +[:octicons-arrow-right-24: Read the full history](history.md) + +## Citation + +If you use DataJoint in your research, please cite it appropriately. + +[:octicons-arrow-right-24: Citation guidelines](citation.md) + +## Contributing + +DataJoint is developed openly on GitHub. Contributions are welcome. + +[:octicons-arrow-right-24: Contribution guidelines](contributing.md) + +## License + +DataJoint is released under the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). + +Copyright 2024 DataJoint Inc. and contributors. diff --git a/src/about/platform.md b/src/about/platform.md new file mode 100644 index 00000000..f2cd591a --- /dev/null +++ b/src/about/platform.md @@ -0,0 +1,60 @@ +# DataJoint Platform + +The **DataJoint Platform** extends the open-source DataJoint library with managed infrastructure and tools for team-based data operations. + +## Architecture + +The platform builds on the open-source coreβ€”relational database, code repository, and object storageβ€”with functional extensions organized into four categories: + +### Interactions + +Tools for different users and tasks: + +- **Pipeline Navigator** β€” Visual exploration of schema diagrams, table contents, and data dependencies +- **Electronic Lab Notebook** β€” Integration with laboratory documentation for manual data entry and experimental notes +- **Development Environment** β€” Support for Jupyter notebooks, VS Code, and other scientific programming tools +- **Visualization Dashboard** β€” Interactive exploration of results and pipeline status + +### Infrastructure + +Managed computing resources: + +- **Security** β€” Access control integrated with institutional identity management +- **Deployment** β€” Cloud platforms (AWS, GCP, Azure) and hybrid configurations +- **Compute Resources** β€” Integration with HPC clusters, GPU resources, and cloud compute + +### Automation + +Intelligent workflow execution: + +- **Automated Population** β€” The `populate()` mechanism identifies and executes missing computations +- **Job Orchestration** β€” Integration with workflow schedulers (Airflow, SLURM, Kubernetes) +- **AI Pipeline Agent** β€” Emerging capabilities for AI-assisted pipeline development and operation + +### Orchestration + +Coordination across the data lifecycle: + +- **Data Ingest** β€” Tools for importing data from instruments and external systems +- **Collaboration** β€” Shared database access with coordinated permissions +- **Export & Integration** β€” Capabilities for delivering results to downstream systems + +## Open-Source vs Platform + +| Capability | Open-Source | Platform | +|------------|-------------|----------| +| Core library | βœ… | βœ… | +| Schema definition | βœ… | βœ… | +| Query algebra | βœ… | βœ… | +| AutoPopulate | βœ… | βœ… | +| Object storage | βœ… | βœ… Managed | +| Database hosting | Self-managed | βœ… Managed | +| User management | Self-managed | βœ… Managed | +| Visual tools | β€” | βœ… | +| Job orchestration | Self-managed | βœ… Managed | +| Support | Community | βœ… Enterprise | + +## Learn More + +- [Request a Platform account](https://www.datajoint.com/sign-up) +- [DataJoint website](https://www.datajoint.com) diff --git a/src/about/publications.md b/src/about/publications.md new file mode 100644 index 00000000..9ca684a5 --- /dev/null +++ b/src/about/publications.md @@ -0,0 +1,113 @@ +# Publications + +The following publications relied on DataJoint open-source software for data analysis. +If your work uses DataJoint or DataJoint Elements, please cite the respective +[manuscripts and RRIDs](./citation.md). + +## 2025 + ++ Bae, J. A., Baptiste, M., Bodor, A. L., Brittain, D., Buchanan, J., Bumbarger, D. J., Castro, M. A., Celii, B., Cobos, E., Collman, F., ... (2025). [Functional connectomics spanning multiple areas of mouse visual cortex](https://doi.org/10.1038/s41586-025-08790-w). *Nature*, 640(8058), 435-447. + ++ Celii, B., Papadopoulos, S., Ding, Z., Fahey, P. G., Wang, E., Papadopoulos, C., ... & Reimer, J. (2025). [NEURD offers automated proofreading and feature extraction for connectomics](https://doi.org/10.1038/s41586-025-08660-5). *Nature*, 640(8058), 487-496. + ++ Ding, Z., Fahey, P.G., Papadopoulos, S., Wang, E.Y., Celii, B., Papadopoulos, C., Chang, A., Kunin, A.B., Tran, D., Fu, J. ... & Tolias, A. S. (2025). [Functional connectomics reveals general wiring rule in mouse visual cortex](https://doi.org/10.1038/s41586-025-08840-3). *Nature*, 640(8058), 459-469. + ++ Dyszkant, N., Oesterle, J., Qiu, Y., Harrer, M., Schubert, T., Gonschorek, D. & Euler, T. (2025). [Photoreceptor degeneration has heterogeneous effects on functional retinal ganglion cell types](https://doi.org/10.1113/JP287643). *The Journal of Physiology*, 603(21), 6599-6621. + ++ Finkelstein, A., Daie, K., RΓ³zsa, M., Darshan, R. & Svoboda, K. (2025). [Connectivity underlying motor cortex activity during goal-directed behaviour](https://doi.org/10.1038/s41586-025-09758-6). *Nature*. + ++ Gillon, C.J., Baker, C., Ly, R., Balzani, E., Brunton, B.W., Schottdorf, M., Ghosh, S. and Dehghani, N.(2025). [Open data in neurophysiology: Advancements, solutions & challenges](https://doi.org/10.1523/ENEURO.0486-24.2025). *eNeuro*, 12(11). + ++ Huang, J.Y., Hess, M., Bajpai, A., Li, X., Hobson, L.N., Xu, A.J., Barton, S.J. and Lu, H.C.(2025). [From initial formation to developmental refinement: GABAergic inputs shape neuronal subnetworks in the primary somatosensory cortex](https://doi.org/10.1016/j.isci.2025.112104). *iScience*, 28(3). + ++ Lee, K. H., Denovellis, E. L., Ly, R., Magland, J., Soules, J., Comrie, A. E., Gramling, D. P., Guidera, J. A., Nevers, R., Adenekan, P., Brozdowski, C., Bray, S. R., Monroe, E., Bak, J. H., Coulter, M. E., Sun, X., Broyles, E., Shin, D., Chiang, S., Holobetz, C., ... Frank, L. M. (2025). [Spyglass: a data analysis framework for reproducible and shareable neuroscience research](https://elifesciences.org/reviewed-preprints/108089). *eLife*. + ++ Lees, R.M., Bianco, I.H., Campbell, R.A.A., Orlova, N., Peterka, D.S., Pichler, B., Smith, S.L., Yatsenko, D., Yu, C.H. & Packer, A.M. (2025). [Standardized measurements for monitoring and comparing multiphoton microscope systems](https://doi.org/10.1038/s41596-024-01120-w). *Nature Protocols*, 20, 2171–2208. + ++ Schmors, L., Kotkat, A.H., Bauer, Y., Huang, Z., Crombie, D., Meyerolbersleben, L.S., Sokoloski, S., Berens, P. & Busse, L. (2025). [Effects of corticothalamic feedback depend on visual responsiveness and stimulus type](https://doi.org/10.1016/j.isci.2025.112481). *iScience*, 28, 112481. + ++ Sibener, L.J., Mosberger, A.C., Chen, T.X., Athalye, V.R., Murray, J.M. & Costa, R.M. (2025). [Dissociable roles of distinct thalamic circuits in learning reaches to spatial targets](https://doi.org/10.1038/s41467-025-58143-4). *Nature Communications*, 16, 2962. + +## 2024 + ++ Chen, S., Liu, Y., Wang, Z. A., Colonell, J., Liu, L. D., Hou, H., ... & Svoboda, K. (2024). [Brain-wide neural activity underlying memory-guided movement](https://www.cell.com/cell/pdf/S0092-8674(23)01445-9.pdf). *Cell*, 187(3), 676-691. + ++ Gonzalo Cogno, S., Obenhaus, H. A., Lautrup, A., Jacobsen, R. I., Clopath, C., Andersson, S. O., ... & Moser, E. I. (2024). [Minute-scale oscillatory sequences in medial entorhinal cortex](https://www.nature.com/articles/s41586-023-06864-1). *Nature*, 625(7994), 338-344. + ++ Korympidou, M.M., Strauss, S., Schubert, T., Franke, K., Berens, P., Euler, T. & Vlasits, A.L. (2024). [GABAergic amacrine cells balance biased chromatic information in the mouse retina](https://doi.org/10.1016/j.celrep.2024.114953). *Cell Reports*, 43(11), 114953. + ++ Mosberger, A.C., Sibener, L.J., Chen, T.X., Rodrigues, H.F., Hormigo, R., Ingram, J.N., Athalye, V.R., Tabachnik, T., Wolpert, D.M., Murray, J.M. and Costa, R.M. (2024). [Exploration biases forelimb reaching strategies](https://www.cell.com/cell-reports/fulltext/S2211-1247(24)00286-9). *Cell Reports*, 43(4). + ++ Reimer, M. L., Kauer, S. D., Benson, C. A., King, J. F., Patwa, S., Feng, S., Estacion, M. A., Bangalore, L., Waxman, S. G., & Tan, A. M. (2024). [A FAIR, open-source virtual reality platform for dendritic spine analysis](https://www.cell.com/patterns/pdf/S2666-3899(24)00183-1.pdf). *Patterns*, 5(9). + +## 2023 + ++ Willeke, K.F., Restivo, K., Franke, K., Nix, A.F., Cadena, S.A., Shinn, T., Nealley, C., Rodriguez, G., Patel, S., Ecker, A.S., Sinz, F.H. & Tolias, A.S. (2023). [Deep learning-driven characterization of single cell tuning in primate visual area V4 supports topological organization](https://doi.org/10.1101/2023.05.12.540591). *bioRxiv*. + ++ Laboratory, I. B., Bonacchi, N., Chapuis, G. A., Churchland, A. K., DeWitt, E. E., Faulkner, M., ... & Wells, M. J. (2023). [A modular architecture for organizing, processing and sharing neurophysiology data](https://doi.org/10.1038/s41592-022-01742-6). *Nature Methods*. 1-5. + +## 2022 + ++ Franke, K., Willeke, K. F., Ponder, K., Galdamez, M., Zhou, N., Muhammad, T., ... & Tolias, A. S. (2022). [State-dependent pupil dilation rapidly shifts visual feature selectivity](https://www.nature.com/articles/s41586-022-05270-3). *Nature*, 610(7930), 128-134. + ++ Wang, Y., Chiola, S., Yang, G., Russell, C., Armstrong, C.J., Wu, Y., ... & Shcheglovitov, A. (2022). [Modeling human telencephalic development and autism-associated SHANK3 deficiency using organoids generated from single neural rosettes](https://doi.org/10.1038/s41467-022-33364-z). *Nature Communications*, 13, 5688. + ++ Goetz, J., Jessen, Z. F., Jacobi, A., Mani, A., Cooler, S., Greer, D., ... & Schwartz, G. W. (2022). [Unified classification of mouse retinal ganglion cells using function, morphology, and gene expression](https://doi.org/10.1016/j.celrep.2022.111040). *Cell Reports*, 40(2), 111040. + ++ Obenhaus, H.A., Zong, W., Jacobsen, R.I., Rose, T., Donato, F., Chen, L., Cheng, H., Bonhoeffer, T., Moser, M.B. & Moser, E.I. (2022). [Functional network topography of the medial entorhinal cortex](https://doi.org/10.1073/pnas.2121655119). *Proceedings of the National Academy of Sciences*, 119(7). + ++ Pettit, N. H., Yap, E., Greenberg, M. E., Harvey, C. D. (2022). [Fos ensembles encode and shape stable spatial maps in the hippocampus](https://www.nature.com/articles/s41586-022-05113-1). *Nature*. + ++ Tseng, S. Y., Chettih, S. N., Arlt, C., Barroso-Luque, R., & Harvey, C. D. (2022). [Shared and specialized coding across posterior cortical areas for dynamic navigation decisions](https://doi.org/10.1016/j.neuron.2022.05.012). *Neuron*. + ++ Turner, N. L., Macrina, T., Bae, J. A., Yang, R., Wilson, A. M., Schneider-Mizell, C., ... & Seung, H. S. (2022). [Reconstruction of neocortex: Organelles, compartments, cells, circuits, and activity](https://doi.org/10.1016/j.cell.2022.01.023). *Cell*, 185(6), 1082-1100. + ++ Zong, W., Obenhaus, H.A., Skytoen, E.R., Eneqvist, H., de Jong, N.L., Vale, R., Jorge, M.R., Moser, M.B. and Moser, E.I. (2022). [Large-scale two-photon calcium imaging in freely moving mice](https://www.sciencedirect.com/science/article/pii/S0092867422001970). *Cell*, 185(7), 1240-1256. + +## 2021 + ++ Dennis, E.J., El Hady, A., Michaiel, A., Clemens, A., Tervo, D.R.G., Voigts, J. & Datta, S.R. (2021). [Systems Neuroscience of Natural Behaviors in Rodents](https://doi.org/10.1523/JNEUROSCI.1877-20.2020). *Journal of Neuroscience*, 41(5), 911-919. + ++ Born, G., Schneider-Soupiadis, F. A., Erisken, S., Vaiceliunaite, A., Lao, C. L., Mobarhan, M. H., Spacek, M. A., Einevoll, G. T., & Busse, L. (2021). [Corticothalamic feedback sculpts visual spatial integration in mouse thalamus](https://doi.org/10.1038/s41593-021-00943-0). *Nature Neuroscience*, 24(12), 1711-1720. + ++ Finkelstein, A., Fontolan, L., Economo, M. N., Li, N., Romani, S., & Svoboda, K. (2021). [Attractor dynamics gate cortical information flow during decision-making](https://doi.org/10.1038/s41593-021-00840-6). *Nature Neuroscience*, 24(6), 843-850. + ++ Laboratory, T. I. B., Aguillon-Rodriguez, V., Angelaki, D., Bayer, H., Bonacchi, N., Carandini, M., Cazettes, F., Chapuis, G., Churchland, A. K., Dan, Y., ... (2021). [Standardized and reproducible measurement of decision-making in mice](https://doi.org/10.7554/eLife.63711). *eLife*, 10. + +## 2020 + ++ Angelaki, D. E., Ng, J., Abrego, A. M., Cham, H. X., Asprodini, E. K., Dickman, J. D., & Laurens, J. (2020). [A gravity-based three-dimensional compass in the mouse brain](https://doi.org/10.1038/s41467-020-15566-5). *Nature Communications*, 11(1), 1-13. + ++ Heath, S. L., Christenson, M. P., Oriol, E., Saavedra-Weisenhaus, M., Kohn, J. R., & Behnia, R. (2020). [Circuit mechanisms underlying chromatic encoding in drosophila photoreceptors](https://doi.org/10.1016/j.cub.2019.11.075). *Current Biology*. + ++ Yatsenko, D., Moreaux, L. C., Choi, J., Tolias, A., Shepard, K. L., & Roukes, M. L. (2020). [Signal separability in integrated neurophotonics](https://doi.org/10.1101/2020.09.27.315556). *bioRxiv*. + +## 2019 + ++ Chettih, S. N., & Harvey, C. D. (2019). [Single-neuron perturbations reveal feature-specific competition in V1](https://doi.org/10.1038/s41586-019-0997-6). *Nature*, 567(7748), 334-340. + ++ Walker, E. Y., Sinz, F. H., Cobos, E., Muhammad, T., Froudarakis, E., Fahey, P. G., Ecker, A. S., Reimer, J., Pitkow, X., & Tolias, A. S. (2019). [Inception loops discover what excites neurons most using deep predictive models](https://doi.org/10.1038/s41593-019-0517-x). *Nature Neuroscience*, 22(12), 2060-2065. + +## 2018 + ++ Denfield, G. H., Ecker, A. S., Shinn, T. J., Bethge, M., & Tolias, A. S. (2018). [Attentional fluctuations induce shared variability in macaque primary visual cortex](https://doi.org/10.1038/s41467-018-05123-6). *Nature Communications*, 9(1), 2654. + +## 2017 + ++ Franke, K., Berens, P., Schubert, T., Bethge, M., Euler, T., & Baden, T. (2017). [Inhibition decorrelates visual feature representations in the inner retina](https://doi.org/10.1038/nature21394). *Nature*, 542(7642), 439. + +## 2016 + ++ Baden, T., Berens, P., Franke, K., Rosen, M. R., Bethge, M., & Euler, T. (2016). [The functional diversity of retinal ganglion cells in the mouse](https://doi.org/10.1038/nature16468). *Nature*, 529(7586), 345-350. + ++ Reimer, J., McGinley, M. J., Liu, Y., Rodenkirch, C., Wang, Q., McCormick, D. A., & Tolias, A. S. (2016). [Pupil fluctuations track rapid changes in adrenergic and cholinergic activity in cortex](https://doi.org/10.1038/ncomms13289). *Nature Communications*, 7, 13289. + +## 2015 + ++ Jiang, X., Shen, S., Cadwell, C. R., Berens, P., Sinz, F., Ecker, A. S., Patel, S., & Tolias, A. S. (2015). [Principles of connectivity among morphologically defined cell types in adult neocortex](https://doi.org/10.1126/science.aac9462). *Science*, 350(6264), aac9462. + +## 2014 + ++ Froudarakis, E., Berens, P., Ecker, A. S., Cotton, R. J., Sinz, F. H., Yatsenko, D., Saggau, P., Bethge, M., & Tolias, A. S. (2014). [Population code in mouse V1 facilitates readout of natural scenes through increased sparseness](https://doi.org/10.1038/nn.3707). *Nature Neuroscience*, 17(6), 851-857. + ++ Reimer, J., Froudarakis, E., Cadwell, C. R., Yatsenko, D., Denfield, G. H., & Tolias, A. S. (2014). [Pupil fluctuations track fast switching of cortical states during quiet wakefulness](https://doi.org/10.1016/j.neuron.2014.09.033). *Neuron*, 84(2), 355-362. diff --git a/src/additional-resources.md b/src/additional-resources.md deleted file mode 100644 index b2e92f81..00000000 --- a/src/additional-resources.md +++ /dev/null @@ -1,142 +0,0 @@ -# Additional Resources - -A collection of additional open-source tools for building and operating scientific data pipelines. - -## APIs - -
- -- :fontawesome-brands-java:{ .lg .middle } **DataJoint MATLAB** - - --- - - A MATLAB client for defining, operating, and querying data pipelines. - - :octicons-arrow-right-24: [Legacy docs](https://datajoint.github.io/datajoint-docs-original/matlab/) | - [Source code](https://github.com/datajoint/datajoint-matlab) - -- :fontawesome-solid-flask:{ .lg .middle } **DataJoint Pharus** - - --- - - A REST API server for interacting with DataJoint pipelines. - - :octicons-arrow-right-24: [Docs](https://docs.datajoint.com/core/pharus/) | - [Source code](https://github.com/datajoint/pharus/) - -
- -## Web Applications - -
- -- :fontawesome-brands-chrome:{ .lg .middle } **DataJoint LabBook** - - --- - - A browser-based graphical user interface for data entry and navigation. - - :octicons-arrow-right-24: [Legacy docs](https://datajoint.github.io/datajoint-labbook/) | - [Source code](https://github.com/datajoint/datajoint-labbook/) - -- :fontawesome-brands-chrome:{ .lg .middle } **DataJoint SciViz** - - --- - - A framework for making low-code web apps for data visualization. - - :octicons-arrow-right-24: [Docs](https://docs.datajoint.com/core/sci-viz/) | - [Source code](https://github.com/datajoint/sci-viz) - -
- -## Container Images - -``` mermaid -graph - %% Give short names - dj["datajoint/datajoint"] - base["datajoint/djbase"] - lab["datajoint/djlab"] - hub["datajoint/djlabhub"] - test["datajoint/djtest"] - conda3["datajoint/miniconda3"] - mysql["datajoint/mysql"] - %% Define connections - conda3 --> base --> test; - base --> dj; - base --> lab --> hub; - %% Add all to class - class dj,base,lab,hub,test,conda3,mysql boxes; - classDef boxes stroke:#333; - %% Grey stroke for class -``` -
- -- :fontawesome-brands-docker:{ .lg .middle } **datajoint/mysql** - - --- - MySQL server configured to work with DataJoint. - - :octicons-arrow-right-24: [Docker image](https://hub.docker.com/r/datajoint/mysql) | - [Source code](https://github.com/datajoint/mysql-docker) - -- :fontawesome-brands-docker:{ .lg .middle } **datajoint/miniconda3** - - --- - - Minimal Python Docker image with [conda](https://docs.conda.io/en/latest/). - - :octicons-arrow-right-24: [Docker image](https://hub.docker.com/r/datajoint/miniconda3) | - [Legacy docs](https://datajoint.github.io/miniconda3-docker/) | - [Source code](https://github.com/datajoint/miniconda3-docker) - -- :fontawesome-brands-docker:{ .lg .middle } **datajoint/djbase** - - --- - - Minimal base Docker image with DataJoint Python dependencies installed. - - :octicons-arrow-right-24: [Docker image](https://hub.docker.com/r/datajoint/djbase) | - [Legacy docs](https://datajoint.github.io/djbase-docker/) | - [Source code](https://github.com/datajoint/djbase-docker) - -- :fontawesome-brands-docker:{ .lg .middle } **datajoint/djtest** - - --- - - Docker image for running tests related to DataJoint Python. - - :octicons-arrow-right-24: [Docker image](https://hub.docker.com/r/datajoint/djtest) | - [Legacy docs](https://datajoint.github.io/djtest-docker/) | - [Source code](https://github.com/datajoint/djtest-docker) - -- :fontawesome-brands-docker:{ .lg .middle } **datajoint/datajoint** - - --- - - Official DataJoint Docker image. - - :octicons-arrow-right-24: [Docker image](https://hub.docker.com/r/datajoint/datajoint) | - [Source code](https://github.com/datajoint/datajoint-python) - -- :fontawesome-brands-docker:{ .lg .middle } **datajoint/djlab** - - --- - - Docker image optimized for running a JupyterLab environment with DataJoint Python. - - :octicons-arrow-right-24: [Docker image](https://hub.docker.com/r/datajoint/djlab) | - [Source code](https://github.com/datajoint/djlab-docker) - -- :fontawesome-brands-docker:{ .lg .middle } **datajoint/djlabhub** - - --- - - Docker image optimized for deploying to JupyterHub a JupyterLab environment with - DataJoint Python. - - :octicons-arrow-right-24: [Docker image](https://hub.docker.com/r/datajoint/djlabhub) | - [Source code](https://github.com/datajoint/djlabhub-docker) - -
diff --git a/src/api/index.md b/src/api/index.md new file mode 100644 index 00000000..1c9f9e67 --- /dev/null +++ b/src/api/index.md @@ -0,0 +1,27 @@ +# API Reference + +Auto-generated documentation from DataJoint source code docstrings. + +This section contains detailed API documentation for the `datajoint` Python package. +Documentation is generated automatically from NumPy-style docstrings in the source. + +## Quick Links + +| Module | Description | +|--------|-------------| +| [datajoint](datajoint.md) | Main package exports | +| [Schema](datajoint/schemas.md) | Schema and VirtualModule classes | +| [Table](datajoint/table.md) | Base Table and FreeTable classes | +| [Table Types](datajoint/user_tables.md) | Manual, Lookup, Imported, Computed, Part | +| [Expressions](datajoint/expression.md) | Query expressions and operators | +| [Fetch](datajoint/fetch.md) | Data retrieval methods | +| [Connection](datajoint/connection.md) | Database connection management | +| [Codecs](datajoint/codecs.md) | Type codec system | +| [Diagram](datajoint/diagram.md) | Schema visualization | +| [Settings](datajoint/settings.md) | Configuration management | +| [Errors](datajoint/errors.md) | Exception classes | + +--- + +*For conceptual explanations, see [Concepts](../explanation/index.md). +For practical guides, see [How-To](../how-to/index.md).* diff --git a/src/elements/concepts.md b/src/elements/concepts.md deleted file mode 100644 index 31e746b3..00000000 --- a/src/elements/concepts.md +++ /dev/null @@ -1,96 +0,0 @@ -# Concepts - -The following conventions describe the DataJoint Python API implementation. - -## DataJoint Schemas - -The DataJoint Python API allows creating _database schemas_, which are namespaces for -collections of related tables. - -The following commands declare a new schema and create the object named `schema` to -reference the database schema. - -=== "Python" - - ```python - import datajoint as dj - schema = dj.schema('') - ``` - - We follow the convention of having only one schema defined per Python module. Then - such a module becomes a _DataJoint schema_ comprising a Python module with a - corresponding _database schema_. - - The module's `schema` object is then used as the decorator for classes that define - tables in the database. - -=== "Matlab" - - ```matlab - dj.createSchema - ``` - - In Matlab, we list one table per file and place schemas in folders. - -## Elements - -An Element is a software package defining one or more DataJoint schemas serving a -particular purpose. By convention, such packages are hosted in individual GitHub -repositories. For example, Element `element_calcium_imaging` is hosted at -[this GitHub repository](https://github.com/datajoint/element-calcium-imaging) and -contains two DataJoint schemas: `scan` and `imaging`. - -### YouTube Tutorials - -The following YouTube videos provide information on basic design principles and file -organization. - -- [Why neuroscientists should use relational databases](https://www.youtube.com/watch?v=q-PMUSC5P5o) - compared to traditional file hierarchies. -- [Quickstart Guide](https://www.youtube.com/watch?v=5R-qnz37BKU) including terminology, - and how to read DataJoint Diagrams and DataJoint Python table definitions. -- [Intro to the Element and Workflow files](https://www.youtube.com/watch?v=tat9MSjkH_U) - for an overview of the respective GitHub repositories. -- [Overview of upstream Elements](https://www.youtube.com/watch?v=NRqpKNoHEY0) to ingest - and explore Lab, Animal, and Session metadata. - - Some videos feature outdated versions of the respective GitHub repositories. For the - most updated information, check the - [documentation page](../) for the corresponding Element. - -### Deferred schemas - -A _deferred schema_ is one in which the name of the database schema name is not -specified. This module does not declare schema and tables upon import. Instead, they are -declared by calling `schema.activate('')` after import. - -By convention, all modules corresponding to deferred schema must declare the function -`activate` which in turn calls `schema.activate`. - -Thus, Element modules begin with: - -```python -import datajoint as dj -schema = dj.schema() - -def activate(schema_name): -schema.activate(schema_name) -``` - -However, many activate functions perform other work associated with activating the -schema such as activating other schemas upstream. - -### Linking Module - -To make the code more modular with fewer dependencies, Element modules do not `import` -upstream schemas directly. Instead, all required classes and functions must be defined -in a `linking_module` and passed to the module's `activate` function. By keeping all -upstream requirements in the linking module, all Elements can be activated as part of -any larger pipeline. - -For instance, the -[Scan module](https://github.com/datajoint/element-calcium-imaging/blob/main/element_calcium_imaging/scan.py) -receives its required functions from the linking module passed into the module's -`activate` function. See the -[example notebooks](https://github.com/datajoint/element-calcium-imaging/) for an -example of how the linking module is passed into the Element's module. diff --git a/src/elements/developer-guide.md b/src/elements/developer-guide.md deleted file mode 100644 index 2adcf42c..00000000 --- a/src/elements/developer-guide.md +++ /dev/null @@ -1,56 +0,0 @@ -# Developer instructions - -## Development mode installation - -- We recommend doing development work in a conda environment. For information on setting - up conda for the first time, see - [this article](https://towardsdatascience.com/get-your-computer-ready-for-machine-learning-how-what-and-why-you-should-use-anaconda-miniconda-d213444f36d6). - -- This method allows you to modify the source code for example DataJoint - workflows (e.g. `workflow-array-ephys`) and their - dependencies (e.g., `element-array-ephys`). - -- Launch a new terminal and change directory to where you want to clone the - repositories (e.g., `bash cd ~/Projects`) - -- Clone the relevant workflow and refer to the `requirements.txt` in the workflow for - the list of Elements to clone and install as editable. You will also need to install - `element-interface` - - ```console - deps=("lab" "animal" "session" "interface" "") - for repo in $deps # clone each - do - git clone https://github.com/datajoint/element-$repo - done - for repo in $(ls -d ./{element,workflow}*) # editable install - do - pip install -e ./$repo - done - ``` - -## Drop schemas - -If you need to drop all schemas to start fresh, you'll need to do following the -dependency order. Refer to the workflow's notebook -(`notebooks/06-drop-optional.ipynb`) for the drop order. - -## Pytests - -- Download the test dataset to your local machine. Note the directory where the dataset - is saved (e.g. `/tmp/testset`). - -- Create an `.env` file within the `docker` directory with the following content. - Replace `/tmp/testset` with the directory where you have the test dataset downloaded. - `TEST_DATA_DIR=/tmp/testset` - -- If testing an unreleased version of the `element` or your fork of an `element` or the - `workflow`, within the `Dockerfile` uncomment the lines from the different options - presented. This will allow you to install the repositories of interest and run the - integration tests on those packages. Be sure that the `element` package version - matches the version in the `requirements.txt` of the `workflow`. - -- Run the Docker container. - ```console - docker-compose -f ./docker/docker-compose-test.yaml up --build - ``` diff --git a/src/elements/index.md b/src/elements/index.md index bba8d0ee..a09b84c0 100644 --- a/src/elements/index.md +++ b/src/elements/index.md @@ -1,160 +1,193 @@ -# DataJoint Elements for Neurophysiology +# DataJoint Elements -DataJoint Elements provides an efficient approach for neuroscience labs to create and -manage _scientific data workflows_: the complex multi-step methods for data collection, -preparation, processing, analysis, and modeling that researchers must perform in the -course of an experimental study. Elements are a collection of curated modules for -assembling workflows for several modalities of neurophysiology experiments -and are designed for ease of integration into diverse custom workflows. This work is -derived from the developments in leading neuroscience projects and uses the -[DataJoint API](../core) for defining, deploying, and sharing their data workflows. +DataJoint Elements are curated data pipeline modules for neurophysiology experiments. +Each Element implements common patterns for specific data modalities and integrates +seamlessly with other Elements and custom DataJoint pipelines. -An overview of the principles of DataJoint workflows and the goals of DataJoint -Elements are described in the position paper -["DataJoint Elements: Data Workflows for Neurophysiology"](https://www.biorxiv.org/content/10.1101/2021.03.30.437358v2). +For comprehensive documentation, tutorials, and API reference for each Element, +visit the Element's repository. -Below are the projects that make up the family of open-source DataJoint Elements: +## Background -
+DataJoint Elements was developed as part of an NIH [BRAIN Initiative](https://braininitiative.nih.gov/) +project to disseminate open-source data management tools for neuroscience research. -- :fontawesome-brands-python:{ .lg .middle } **Element Calcium Imaging** +- **Grant:** [U24 NS116470](https://reporter.nih.gov/project-details/10891663) β€” DataJoint Pipelines for Neurophysiology +- **Institute:** National Institute of Neurological Disorders and Stroke (NINDS) +- **Period:** September 2020 -- August 2025 +- **PI:** Dimitri Yatsenko, DataJoint - --- +The project compiled and systematized data pipeline designs from leading neuroscience +laboratories into a library of reusable modules. These modules automate data ingestion +and processing for common experimental modalities including extracellular electrophysiology, +calcium imaging, pose estimation, and optogenetics. - A data pipeline for calcium imaging microscopy. +DataJoint Elements is listed in the [BRAIN Initiative Alliance Resource Catalog](https://www.braininitiative.org/toolmakers/resources/datajoint-elements/) +(SciCrunch ID: [SCR_021894](https://scicrunch.org/resolver/SCR_021894)). - [:octicons-arrow-right-24: Interactive tutorial on GitHub - Codespaces](https://github.com/datajoint/element-calcium-imaging#interactive-tutorial){:target="_blank"} +## Neurophysiology - [:octicons-arrow-right-24: Docs](./element-calcium-imaging/) +
-- :fontawesome-brands-python:{ .lg .middle } **Element Array Electrophysiology** +- **Element Calcium Imaging** --- - A data pipeline for Neuropixels probes. - - [:octicons-arrow-right-24: Interactive tutorial on GitHub - Codespaces](https://github.com/datajoint/element-array-ephys#interactive-tutorial){:target="_blank"} + Two-photon and widefield calcium imaging analysis with Suite2p, CaImAn, and EXTRACT. - [:octicons-arrow-right-24: Docs](./element-array-ephys/) + [:octicons-arrow-right-24: Documentation](./element-calcium-imaging/) + [:octicons-mark-github-16: Repository](https://github.com/datajoint/element-calcium-imaging) -- :fontawesome-brands-python:{ .lg .middle } **Element Electrode Localization** +- **Element Array Electrophysiology** --- - A data pipeline for electrode localization of Neuropixels probes. + High-density probe recordings (Neuropixels) with Kilosort and spike sorting. - [:octicons-arrow-right-24: Docs](./element-electrode-localization/) + [:octicons-arrow-right-24: Documentation](./element-array-ephys/) + [:octicons-mark-github-16: Repository](https://github.com/datajoint/element-array-ephys) -- :fontawesome-brands-python:{ .lg .middle } **Element Miniscope** +- **Element Miniscope** --- - A data pipeline for miniscope calcium imaging. + Miniscope calcium imaging with UCLA Miniscope and Inscopix systems. - [:octicons-arrow-right-24: Interactive tutorial](https://github.com/datajoint/workflow-miniscope#interactive-tutorial){:target="_blank"} + [:octicons-arrow-right-24: Documentation](./element-miniscope/) + [:octicons-mark-github-16: Repository](https://github.com/datajoint/element-miniscope) - [:octicons-arrow-right-24: Docs](./element-miniscope/) - -- :fontawesome-brands-python:{ .lg .middle } **Element ZStack** +- **Element Electrode Localization** --- - A data pipeline for segmenting volumetric microscopy data with Cellpose, uploading - to BossDB, and visualizing with Neuroglancer. + Anatomical localization of Neuropixels probe electrodes. - [:octicons-arrow-right-24: Interactive tutorial](https://github.com/datajoint/workflow-zstack#interactive-tutorial){:target="_blank"} + [:octicons-arrow-right-24: Documentation](./element-electrode-localization/) + [:octicons-mark-github-16: Repository](https://github.com/datajoint/element-electrode-localization) - [:octicons-arrow-right-24: Docs](./element-zstack/) +
-- :fontawesome-brands-python:{ .lg .middle } **Element DeepLabCut** +## Behavior + +
+ +- **Element DeepLabCut** --- - A data pipeline for pose estimation with DeepLabCut. + Markerless pose estimation with DeepLabCut. + + [:octicons-arrow-right-24: Documentation](./element-deeplabcut/) + [:octicons-mark-github-16: Repository](https://github.com/datajoint/element-deeplabcut) + +- **Element Facemap** + + --- - [:octicons-arrow-right-24: Interactive tutorial on GitHub - Codespaces](https://github.com/datajoint/element-deeplabcut#interactive-tutorial){:target="_blank"} + Orofacial behavior tracking with Facemap. - [:octicons-arrow-right-24: Docs](./element-deeplabcut/) + [:octicons-arrow-right-24: Documentation](./element-facemap/) + [:octicons-mark-github-16: Repository](https://github.com/datajoint/element-facemap) -- :fontawesome-brands-python:{ .lg .middle } **Element MoSeq** +- **Element MoSeq** --- - A data pipeline for motion sequencing with Keypoint-MoSeq. + Behavioral syllable analysis with Keypoint-MoSeq. - [:octicons-arrow-right-24: Interactive tutorial on GitHub - Codespaces](https://github.com/datajoint/element-moseq#interactive-tutorial){:target="_blank"} + [:octicons-arrow-right-24: Documentation](./element-moseq/) + [:octicons-mark-github-16: Repository](https://github.com/datajoint/element-moseq) - [:octicons-arrow-right-24: Docs](./element-moseq/) +
+ +## Stimulation & Imaging + +
-- :fontawesome-brands-python:{ .lg .middle } **Element Facemap** +- **Element Optogenetics** --- - A data pipeline for pose estimation with Facemap. + Optogenetic stimulation experiments. - [:octicons-arrow-right-24: Docs](./element-facemap/) + [:octicons-arrow-right-24: Documentation](./element-optogenetics/) + [:octicons-mark-github-16: Repository](https://github.com/datajoint/element-optogenetics) -- :fontawesome-brands-python:{ .lg .middle } **Element Optogenetics** +- **Element Visual Stimulus** --- - A data pipeline for managing data from optogenetics experiments. + Visual stimulation with Psychtoolbox. - [:octicons-arrow-right-24: Interactive tutorial on GitHub - Codespaces](https://github.com/datajoint/workflow-optogenetics#interactive-tutorial){:target="_blank"} + [:octicons-arrow-right-24: Documentation](./element-visual-stimulus/) + [:octicons-mark-github-16: Repository](https://github.com/datajoint/element-visual-stimulus) - [:octicons-arrow-right-24: Docs](./element-optogenetics/) - -- :fontawesome-brands-java:{ .lg .middle } **Element Visual Stimulus** +- **Element ZStack** --- - A data pipeline for visual stimulation with Psychtoolbox. + Volumetric microscopy with Cellpose segmentation and BossDB integration. + + [:octicons-arrow-right-24: Documentation](./element-zstack/) + [:octicons-mark-github-16: Repository](https://github.com/datajoint/element-zstack) - [:octicons-arrow-right-24: Docs](./element-visual-stimulus/) +
-- :fontawesome-brands-python:{ .lg .middle } **Element Lab** +## Core Elements + +
+ +- **Element Lab** --- - A data pipeline for lab management. + Lab, project, and protocol management. - [:octicons-arrow-right-24: Docs](./element-lab/) + [:octicons-arrow-right-24: Documentation](./element-lab/) + [:octicons-mark-github-16: Repository](https://github.com/datajoint/element-lab) -- :fontawesome-brands-python:{ .lg .middle } **Element Animal** +- **Element Animal** --- - A data pipeline for subject management. + Subject and genotype management. - [:octicons-arrow-right-24: Docs](./element-animal/) + [:octicons-arrow-right-24: Documentation](./element-animal/) + [:octicons-mark-github-16: Repository](https://github.com/datajoint/element-animal) -- :fontawesome-brands-python:{ .lg .middle } **Element Session** +- **Element Session** --- - A data pipeline for session management. + Experimental session management. - [:octicons-arrow-right-24: Docs](./element-session/) + [:octicons-arrow-right-24: Documentation](./element-session/) + [:octicons-mark-github-16: Repository](https://github.com/datajoint/element-session) -- :fontawesome-brands-python:{ .lg .middle } **Element Event** +- **Element Event** --- - A data pipeline for event- and trial-based experiments. + Event- and trial-based experiment structure. - [:octicons-arrow-right-24: Docs](./element-event/) + [:octicons-arrow-right-24: Documentation](./element-event/) + [:octicons-mark-github-16: Repository](https://github.com/datajoint/element-event) -- :fontawesome-brands-python:{ .lg .middle } **Element Interface** +- **Element Interface** --- - Common functions for the DataJoint Elements. + Common utilities for DataJoint Elements. - [:octicons-arrow-right-24: Docs](./element-interface/) + [:octicons-arrow-right-24: Documentation](./element-interface/) + [:octicons-mark-github-16: Repository](https://github.com/datajoint/element-interface)
+ +## Citation + +If you use DataJoint Elements in your research, please cite: + +> Yatsenko D, Nguyen T, Shen S, Gunalan K, Turner CA, Guzman R, Sasaki M, Sitonic D, +> Reimer J, Walker EY, Tolias AS. [DataJoint Elements: Data Workflows for +> Neurophysiology](https://doi.org/10.1101/2021.03.30.437358). bioRxiv. 2021. diff --git a/src/elements/management/adoption.md b/src/elements/management/adoption.md deleted file mode 100644 index ce789ac2..00000000 --- a/src/elements/management/adoption.md +++ /dev/null @@ -1,81 +0,0 @@ -# Guidelines for Adoption - -DataJoint Elements offer flexible options for adoption, enabling researchers to -seamlessly integrate them into their workflows. Below are the available paths for -adoption based on your expertise and needs for your experiments. - -## Independent Adoption - -DataJoint Elements are designed for independent users who have: - -- Moderate software development skills. -- A solid understanding of DataJoint principles. -- Adequate IT expertise or support. - -If you are **new to DataJoint**, we recommend starting with these resources to build a -strong foundation: - -### 1. Online Training Tutorials - -Learn to set up your DataJoint pipeline with interactive tutorials hosted on GitHub -Codespaces: - -- **[DataJoint Tutorials Repository](https://github.com/datajoint/datajoint-tutorials):** - A comprehensive set of tutorials to get started with DataJoint Python, organized in - Jupyter notebooks. - -- **Element-Specific Interactive Tutorials:** Explore detailed guides for designing and - interacting with specific Element pipelines: - - [DataJoint Element Array Ephys](https://github.com/datajoint/element-array-ephys#interactive-tutorial) - - [DataJoint Element Calcium Imaging](https://github.com/datajoint/element-calcium-imaging#interactive-tutorial) - - [DataJoint Element DeepLabCut](https://github.com/datajoint/element-deeplabcut#interactive-tutorial) - - [DataJoint Element Facemap](https://github.com/datajoint/element-facemap#interactive-tutorial) - - [DataJoint Element MoSeq](https://github.com/datajoint/element-moseq#interactive-tutorial) - - [DataJoint Element Miniscope](https://github.com/datajoint/element-miniscope#interactive-tutorial) - - [DataJoint Element Optogenetics](https://github.com/datajoint/element-optogenetics#interactive-tutorial) - - [DataJoint Element Zstack](https://github.com/datajoint/element-zstack#interactive-tutorial) - - [DataJoint Element Electrode Localization](https://github.com/datajoint/element-electrode-localization#interactive-tutorial) - - [DataJoint Element Visual Stimulus](https://github.com/datajoint/element-visual-stimulus#interactive-tutorial) - -### 2. Workshops - -Participate in [workshops and events](../../support-events.md) (online or in person) to -gain hands-on experience and practical knowledge for implementing DataJoint workflows -effectively. - -## Adoption with Support from DataJoint - -For institutions and labs requiring additional assistance, the DataJoint team offers -tailored support services, including: - -### Training - -- **User Training:** Guidance for end-users to effectively utilize workflows. -- **Developer Training:** Support for developers implementing or extending workflows. - -### Hosting and Infrastructure - -- **Data and Computation Hosting:** - - On-premises setups for your institution or lab. - - Integration with your existing cloud accounts. - - Fully managed cloud hosting by DataJoint. - -### Workflow Execution - -- **Configuration and Automation:** Assistance with setting up and automating workflows. -- **Fully Managed Services:** Optional services to oversee workflow execution and - management entirely. - -### Interfaces - -- **Data Entry, Export, and Publishing:** Streamlined interfaces to efficiently manage - and share your research data. - -### Subsidized Support - -Qualified research groups may be eligible for subsidized services through grant funding. -Contact the DataJoint team to explore funding options and determine your eligibility. - -By choosing the adoption path that best suits your lab's expertise and requirements, you -can leverage DataJoint Elements to optimize your research workflows. For additional -information or assistance, please contact the DataJoint team at support@datajoint.com. diff --git a/src/elements/management/dissemination.md b/src/elements/management/dissemination.md deleted file mode 100644 index 56390481..00000000 --- a/src/elements/management/dissemination.md +++ /dev/null @@ -1,42 +0,0 @@ -# Dissemination Plan - -## 1. Dissemination - -We conduct activities to disseminate Resource components for adoption in diverse -neuroscience labs. These activities include - -- A central [website](https://docs.datajoint.com/elements/) for the Resource. -- [Conference talks, presentations, and workshops](../../support-events.md) -- Publications in peer-reviewed journals -- White papers posted on internet resources and websites -- On-site workshops by invitation -- Remote workshops and webinars -- Online interactive tutorials hosted on GitHub Codespaces - - [DataJoint Tutorials](https://github.com/datajoint/datajoint-tutorials) - - [DataJoint Element Array Ephys](https://github.com/datajoint/element-array-ephys#interactive-tutorial) - - [DataJoint Element Calcium Imaging](https://github.com/datajoint/element-calcium-imaging#interactive-tutorial) - - [DataJoint Element DeepLabCut](https://github.com/datajoint/element-deeplabcut#interactive-tutorial) - - [DataJoint Element Facemap](https://github.com/datajoint/element-facemap#interactive-tutorial) - - [DataJoint Element MoSeq](https://github.com/datajoint/element-moseq#interactive-tutorial) - - [DataJoint Element Miniscope](https://github.com/datajoint/element-miniscope#interactive-tutorial) - - [DataJoint Element Optogenetics](https://github.com/datajoint/element-optogenetics#interactive-tutorial) - - [DataJoint Element Zstack](https://github.com/datajoint/element-zstack#interactive-tutorial) - - [DataJoint Element Electrode Localization](https://github.com/datajoint/element-electrode-localization#interactive-tutorial) - - [DataJoint Element Visual Stimulus](https://github.com/datajoint/element-visual-stimulus#interactive-tutorial) - -## 2. Community Survey - -In order to measure the effectiveness of the Resource, we conduct several activities to -estimate the adoption and use of the Resource: - -- A citation mechanism for individual components of the Resource. - - | Resource | RRID | - | :----------------- | :----------------------------------------------------------- | - | DataJoint Core | [RRID:SCR_014543](https://scicrunch.org/resolver/SCR_014543) | - | DataJoint Elements | [RRID:SCR_021894](https://scicrunch.org/resolver/SCR_021894) | - -- GitHub forks and dependent repositories. - -- A register for self-reporting for component adoption and use (see -[DataJoint Community Survey](https://try.datajoint.com/communitysurvey)). diff --git a/src/elements/management/governance.md b/src/elements/management/governance.md deleted file mode 100644 index 22619cf0..00000000 --- a/src/elements/management/governance.md +++ /dev/null @@ -1,20 +0,0 @@ -# Project Governance - -## Funding - -This Resource is supported by the National Institute Of Neurological Disorders And -Stroke of the National Institutes of Health (NIH) under Award Number **U24NS116470**. -The content is solely the responsibility of the authors and does not necessarily -represent the official views of the National Institutes of Health. - -## Scientific Steering Group - -The project oversight and guidance is provided by the Scientific Steering Group -comprising - -- [Mackenzie Mathis (EPFL)](http://www.mackenziemathislab.org/team) -- [John Cunningham (Columbia U)](https://stat.columbia.edu/~cunningham/) -- [Carlos Brody (Princeton U)](https://pni.princeton.edu/faculty/carlos-brody) -- [Karel Svoboda (Allen Institute)](https://alleninstitute.org/what-we-do/brain-science/about/team/staff-profiles/karel-svoboda1/) -- [Nick Steinmetz (U of Washington)](http://www.nicksteinmetz.com/) -- [Loren Frank (UCSF)](https://franklab.ucsf.edu/) diff --git a/src/elements/management/outreach.md b/src/elements/management/outreach.md deleted file mode 100644 index 92b25daf..00000000 --- a/src/elements/management/outreach.md +++ /dev/null @@ -1,40 +0,0 @@ -# Outreach Plan - -Broad engagement with the neuroscience community is essential for the optimization, -integration, and adoption of the Resource components. To achieve this, we conduct five -types of outreach activities, each requiring a tailored approach: - -## 1. Precursor Projects - -As part of our [Selection Process](../selection), a Precursor Project is required for -any new experimental modality to be incorporated into DataJoint Elements. - -A Precursor Project involves the development of a DataJoint pipeline for specific -experiments, either independently or in collaboration with our team. Our outreach -activities for Precursor Projects include: - -- Engaging Development Teams: Reaching out to teams developing DataJoint pipelines for - new experimental paradigms or modalities. -- Identifying Key Components: Collaborating with these teams to identify essential - design motifs, analysis tools, and related interfaces. -- Team Interviews: Conducting interviews the core team to understand their collaborative - culture, practices, and procedures. -- Code and Dissemination Review: Reviewing their open-source code and dissemination - plans to assess compatibility and adaptability. -- Continuous Collaboration: Staying in contact with the team throughout the Element - development process to incorporate their contributions, gather feedback, and evaluate - design tradeoffs. - -When the new Element is released, a full attribution is given to the Precursor Project, -ensuring their contributions are recognized. - -**Rationale:** The Resource does not aim to create fundamentally new solutions for -neurophysiology data acquisition and analysis. Instead, it systematizes and disseminates -existing open-source tools already proven in leading research projects. - -## 2. Tool Developers - -DataJoint pipelines depend on a variety of analysis tools, atlases, data standards, -archives, catalogs, and other neuroinformatics resources created and maintained by the -broader scientific community. To ensure the long-term sustainability of the Resource, we -reach out to the tool developers to establish shared sustainability roadmaps. diff --git a/src/elements/management/plan.md b/src/elements/management/plan.md deleted file mode 100644 index e467a73b..00000000 --- a/src/elements/management/plan.md +++ /dev/null @@ -1,17 +0,0 @@ -# Management Plan - -DataJoint Elements has established a Resource Management Plan to select projects for -development, to assure quality, and to disseminate its output as summarized in the -figure below: - -![Resource Management Plan](../../images/elements-management-plan.png) - -The following sections provide detailed information. - -- [Team](../../about/datajoint-team.md) -- [Project Governance](./governance.md) -- [Project Selection Process](selection.md) -- [Quality Assurance](quality-assurance.md) -- [Contribution Guideline](../../about/contribute.md) -- [Outreach Plan](outreach.md) -- [Dissemination Plan](dissemination.md) diff --git a/src/elements/management/quality-assurance.md b/src/elements/management/quality-assurance.md deleted file mode 100644 index 06e60dd0..00000000 --- a/src/elements/management/quality-assurance.md +++ /dev/null @@ -1,115 +0,0 @@ -# Quality Assurance - -DataJoint and DataJoint Elements serve as frameworks and starting points for numerous -new projects, setting the standard for data architecture and software design quality. To -ensure higher quality, the following policies have been adopted into the Software -Development Life Cycle (SDLC). - -## Coding Standards - -When writing code, the following principles should be observed: - -- **Style**: Code should be written for clear readability. Uniform and consistent naming - conventions, module structures, and formatting requirements must be established across - all components of the project. - - - Python's [PEP8](https://www.python.org/dev/peps/pep-0008/#naming-conventions) - standard offers clear guidances that can be applied to all languages. - - - Python code should be formatted using the - [black code formatter](https://github.com/psf/black). - - The maximum line length should be **88 characters**. - -- **Maintenance Overhead**: The size of the codebase should be considered to prevent - unnecessarily large or complex solutions. As the codebase grows, the effort to review - and maintain it increases. Therefore, the goal is to find a balance that prevents the - codebase from becoming too large while avoiding convoluted complexity. - -- **Performance**: Performance issues should be avoided, controlled, or, properly - justified. Considerations like memory management, garbage collection, disk - reads/writes, and processing overhead must be addressed to ensure an efficient - solution. - -## Automated Testing - -All components and their revisions must include appropriate automated software testing -to be considered for release. The core framework must undergo thorough performance -evaluation and comprehensive integration testing. - -Testing generally includes: - -- **Syntax**: Verify that the code base does not contain any syntax errors and will run - or compile successfully. - -- **Unit & Integration**: Verify that low-level, method-specific tests (unit tests) and - any tests related coordinated interface between methods (integration tests) pass - successfully. Typically, when bugs are patched or features are introduced, unit and - integration tests are added to ensure that the use-case intended to be satisfied is - accounted for. This helps us prevent any regression in functionality. - -- **Style**: Verify that the code base adheres to style guides for optimal readability. - -- **Code Coverage**: Verify that the code base has similar or better code coverage than - the last run. - -## Code Reviews - -When introducing new code to the code base, the following will be required for -acceptance by DataJoint core team into the main code repository. - -- **Independence**: Proposed changes should not directly alter the code base in the - review process. New changes should be applied separately on a copy of the code base - and proposed for review by the DataJoint core team. For example, apply changes on a - GitHub fork and open a pull request targeting the `main` branch once ready for review. - -- **Etiquette**: An author who has requested for a code for review should not accept and - merge their own code to the code base. A reviewer should not commit any suggestions - directly to the authors proposed changes but rather should allow the author to review. - -- **Coding Standards**: Ensure the above coding standards are respected. - -- **Summary**: A description should be included that summarizes and highlights the - notable changes that are being proposed. - -- **Issue Reference**: Any bugs or feature requests that have been filed in the issue - tracker that would be resolved by acceptance should be properly linked and referenced. - -- **Satisfy Automated Tests**: All automated tests associated with the project will be - verified to be successful prior to acceptance. - -- **Documentation**: Documentation should be included to reflect any new feature or - behavior introduced. - -- **Release Notes**: Include necessary updates to the release notes or change log to - capture a summary of the patched bugs and new feature introduction. Proper linking - should be maintained to associated tickets in issue tracker and reviews. - -## Release Process - -Upon satisfactory adherence to the above Coding Standards, Automated Testing, and Code -Reviews: - -- The package version will be incremented following the standard definition of - [Semantic Versioning](https://semver.org/spec/v2.0.0.html) with a `Major.Minor.Patch` - number. - -- Updates will be merged into the base repository `main` branch. - -- A new release will be made on PyPI. - -For external research teams that reach out to us, we will provide engineering support to -help users adopt the updated software, collect feedback, and resolve issues following -the processes described in the section below. If the updates require changes in the -design of the database schema or formats, a process for data migration will be provided -upon request. - -## User Feedback & Issue Tracking - -All components will be organized in GitHub repositories with guidelines for -contribution, feedback, and issue submission to the issue tracker. For more information -on the general policy around issue filing, tracking, and escalation, see the -[DataJoint Open-Source Contribute](../../../community/contribute) policy. For research -groups that reach out to us, our team will work closely to collect feedback and resolve -issues. Typically issues will be prioritized based on their criticality and impact. If -new feature requirements become apparent, this may trigger the creation of a separate -workflow or a major revision of an existing workflow. diff --git a/src/elements/management/selection.md b/src/elements/management/selection.md deleted file mode 100644 index d1dfdaca..00000000 --- a/src/elements/management/selection.md +++ /dev/null @@ -1,36 +0,0 @@ -# Project Selection Process - -The project milestones are set annually by the team under the stewardship of the NIH -programmatic staff and with the guidance of the project's -[Scientific Steering Group](../governance) - -We have adopted the following general criteria for selecting and accepting new projects -to be included in the Resource. - -1. **Open Precursor Projects** - - At least one open-source DataJoint-based Precursor Project must exist for any new - experiment modality to be accepted for support as part of the Resource. The Precursor - Project team must be open to interviews to describe in detail their process for the - experiment workflow, tools, and interfaces. - - The Precursor Projects must provide sample data for testing during development and - for tutorials. The Precursor Projects will be acknowledged in the development of the - component. - - **Rationale:** This Resource does not aim to develop fundamentally new solutions for - neurophysiology data acquisition and analysis. Rather it seeks to systematize and - disseminate existing open-source tools proven in leading research projects. - -1. **Impact** - - New components proposed for support in the project must be shown to be in demand by a - substantial population or research groups, on the order of 100+ labs globally. - -1. **Sustainability** - - For all third-party tools or resources included in the proposed component, their - long-term maintenance roadmap must be established. When possible, we will contact the - developer team and work with them to establish a sustainability roadmap. If no such - roadmap can be established, alternative tools and resources must be identified as - replacement. diff --git a/src/elements/user-guide.md b/src/elements/user-guide.md deleted file mode 100644 index b76ea1d2..00000000 --- a/src/elements/user-guide.md +++ /dev/null @@ -1,740 +0,0 @@ -# User setup instructions - -The following document describes how to setup a development environment and connect to -a database so that you can use the DataJoint Elements to build and run a workflow on -your local machine. - -Any of the DataJoint Elements can be combined together to create a workflow that matches -your experimental setup. We have a number of [example workflows](#example-workflows) -to get you started. Each focuses on a specific modality, but they can be adapted for -your custom workflow. - -1. Getting up and running will require a couple items for a good [development - environment](#development-environment). If any of these items are already familiar to - you and installed on your machine, you can skip the corresponding section. - - 1. [Python](#python) - - 2. [Conda](#conda) - - 3. [Integrated Development Environment](#integrated-development-environment-ide) - - 4. [Version Control (git)](#version-control-git) - - 5. [Visualization packages](#visualization-packages-jupyter-notebooks-datajoint-diagrams) - -2. Next, you'll need to download one of the [example workflows](#example-workflows) and - corresponding [example data](#example-data). - -3. Finally, there are a couple different approaches to - [connecting to a database](#relational-databases). Here, we highlight three approaches: - - 1. [First Time](#first-time): Beginner. Temporary storage to learn the ropes. - - 2. [Local Database](#local-database): Intermediate. Deployed on local hardware, managed - by you. - - 3. [Central Database](#central-database): Advanced: Deployed on dedicated hardware. - -## Development Environment - -This diagram describes the general components for a local DataJoint environment. - -```mermaid -flowchart LR - %% Nodes - py_interp["Python Interpreter"] - db_server["Database Server
(e.g., MySQL)"] - conda_env["Conda Environment"] - terminal["Terminal or Jupyter Notebook"] - - %% Edges - py_interp -->|DataJoint| db_server - terminal --> conda_env - conda_env --> py_interp - - %% Styling - classDef boxes fill:#ddd,stroke:#333; - class py_interp,db_server,conda_env,terminal boxes; -``` - -### Python - -DataJoint Elements are written in Python. The DataJoint Python API supports Python -versions 3.7 and up. We recommend downloading the latest stable -release of 3.9 [here](https://wiki.python.org/moin/BeginnersGuide/Download), and -following the install instructions. - -### Conda - -Python projects each rely on different dependencies, which may conflict across projects. -We recommend working in a Conda environment for each project to isolate the -dependencies. For more information on why Conda, and setting up the version of Conda -that best suits your needs, see -[this article](https://towardsdatascience.com/get-your-computer-ready-for-machine-learning-how-what-and-why-you-should-use-anaconda-miniconda-d213444f36d6). - -To get going quickly, we recommend you ... - -1. [Download Miniconda](https://docs.conda.io/en/latest/miniconda.html#latest-miniconda-installer-links) -and go through the setup, including adding Miniconda to your `PATH` (full - instructions - [here](https://developers.google.com/earth-engine/guides/python_install-conda#add_miniconda_to_path_variable)). - -2. Declare and initialize a new conda environment with the following commands. Edit - `` to reflect your project. - - ``` console - conda create --name datajoint-workflow- python=3.9 - conda activate datajoint-workflow- - ``` - -??? Warning "Apple M1 users: Click to expand" - - Running analyses with Element DeepLabCut or Element Calcium imaging may require - tensorflow, which can cause issues on M1 machines. By saving the yaml - file below, this environment can be loaded with conda create -f my-file.yaml - . If you encounter errors related to clang, try launching xcode - and retrying. - - ```yaml - name: dj-workflow- - channels: - - apple - - conda-forge - - defaults - dependencies: - - tensorflow-deps - - opencv - - python=3.9 - - pip>=19.0 - - pip: - - tensorflow-macos - - tensorflow-metal - - datajoint - ``` - -### Integrated Development Environment (IDE) - -Development and use can be done with a plain text editor in the terminal. However, an -integrated development environment (IDE) can improve your experience. Several IDEs are -available. We recommend -[Microsoft's Visual Studio Code](https://code.visualstudio.com/download), also called -VS Code. To set up VS Code with Python for the first time, follow -[this tutorial](https://code.visualstudio.com/docs/python/python-tutorial). - -### Version Control (git) - -Table definitions and analysis code can change over time, especially with multiple -collaborators working on the same project. Git is an open-source, distributed version -control system that helps keep track of what changes where made when, and by whom. -GitHub is a platform that hosts projects managed with git. The example DataJoint -Workflows are hosted on GitHub, we will use git to clone (i.e., download) this -repository. - -1. Check if you already have git by typing `git --version` in a terminal window. -2. If git is not installed on your system, please -[install git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git). -3. You can read more about git basics [here](https://www.atlassian.com/git). - -### Visualization packages (Jupyter Notebooks, DataJoint Diagrams) - -To run the demo notebooks and generate visualizations associated with an example -workflow, you'll need a couple extra packages. - -**Jupyter Notebooks** help structure code (see -[here](https://code.visualstudio.com/docs/datascience/jupyter-notebooks) for full -instructions on Jupyter within VS Code). - -1. Install Jupyter packages - ```console - conda install jupyter ipykernel nb_conda_kernels - ``` - -2. Ensure your VS Code python interpreter is set to your Conda environment path. - -
- Click to expand more details. -
    -
  • View > Command Palette
  • -
  • Type "Python: Select Interpreter", hit enter.
  • -
  • If asked, select the workspace where you plan to download the workflow.
  • -
  • If present, select your Conda environment. If not present, enter in the - path.
  • -
-
- -**DataJoint Diagrams** rely on additional packages. To install these packages, -enter the following command... - ```console - conda install graphviz python-graphviz pydotplus - ``` - -## Example Config, Workflows and Data - -Of the [options below](#example-workflows), pick the workflow that best matches your -needs. - -1. Change the directory to where you want to download the workflow. - - ```console - cd ~/Projects - ``` - -2. Clone the relevant repository, and change directories to this new directory. - ```console - git clone https://github.com/datajoint/ - cd - ``` - -3. Install this directory as editable with the `-e` flag. - ```console - pip install -e . - ``` -
- Why editable? Click for details - This lets you modify the code after installation and experiment with different - designs or adding additional tables. You may wish to edit `pipeline.py` or - `paths.py` to better suit your needs. If no modification is required, - using `pip install .` is sufficient. -
- -4. Install `element-interface`, which has utilities used across different Elements and - Workflows. - - ```console - pip install "element-interface @ git+https://github.com/datajoint/element-interface" - ``` - -5. Set up a local DataJoint config file by saving the - following block as a json in your workflow directory as `dj_local_conf.json`. Not - sure what to put for the `< >` values below? We'll cover this when we - [connect to the database](#relational-databases) - - ```json - { - "database.host": "", - "database.user": "", - "database.password": "", - "loglevel": "INFO", - "safemode": true, - "display.limit": 7, - "display.width": 14, - "display.show_tuple_count": true, - "custom": { - "database.prefix": "" - } - } - ``` - -### Example Workflows - -
- -- :fontawesome-brands-python:{ .lg .middle } **Workflow Session** - - --- - - An example workflow for session management. - - [:octicons-repo-forked-24: Clone from GitHub](https://github.com/datajoint/workflow-session/) - -- :fontawesome-brands-python:{ .lg .middle } **Workflow Array Electrophysiology** - - --- - - An example workflow for Neuropixels probes. - - [:octicons-repo-forked-24: Clone from GitHub](https://github.com/datajoint/workflow-array-ephys/) - -- :fontawesome-brands-python:{ .lg .middle } **Workflow Calcium Imaging** - - --- - - An example workflow for calcium imaging microscopy. - - [:octicons-repo-forked-24: Clone from GitHub](https://github.com/datajoint/element-calcium-imaging/) - -- :fontawesome-brands-python:{ .lg .middle } **Workflow Miniscope** - - --- - - An example workflow for miniscope calcium imaging. - - [:octicons-repo-forked-24: Clone from GitHub](https://github.com/datajoint/workflow-miniscope/) - -- :fontawesome-brands-python:{ .lg .middle } **Workflow DeepLabCut** - - --- - - An example workflow for pose estimation with DeepLabCut. - - [:octicons-repo-forked-24: Clone from GitHub](https://github.com/datajoint/workflow-deeplabcut/) - -
- -### Example Data - -The first notebook in each workflow will guide you through downloading example data -from DataJoint's AWS storage archive. You can also process your own data. To use the -example data, you would ... - -1. Install `djarchive-client` - - ```console - pip install git+https://github.com/datajoint/djarchive-client.git - ``` - -2. Use a python terminal to import the `djarchive` client and view available datasets, - and revisions. - - ```python - import djarchive_client - client = djarchive_client.client() - list(client.datasets()) # List available datasets, select one - list(client.revisions()) # List available revisions, select one - ``` - -3. Prepare a directory to store the download data, for example in `/tmp`, then download - the data with the `djarchive` client. This may take some time with larger datasets. - - ```python - import os - os.makedirs('/tmp/example_data/', exist_ok=True) - client.download( - '', - target_directory='/tmp/example_data', - revision='' - ) - ``` - -#### Example Data Organization - -??? Note "Array Ephys: Click to expand details" - - - **Dataset**: workflow-array-ephys-benchmark - - **Revision**: 0.1.0a4 - - **Size**: 293 GB - - The example subject6/session1 data was recorded with SpikeGLX and - processed with Kilosort2. - ``` - /tmp/example_data/ - - subject6 - - session1 - - towersTask_g0_imec0 - - towersTask_g0_t0_nidq.meta - - towersTask_g0_t0.nidq.bin - ``` - Element and Workflow Array Ephys also support data recorded with - OpenEphys. - -??? Note "Calcium Imaging: Click to expand details" - - **Dataset**: workflow-array-calcium-imaging-test-set - - **Revision**: 0_1_0a2 - - **Size**: 142 GB - - The example `subject3` data was recorded with Scanbox. - The example `subject7` data was recorded with ScanImage. - Both datasets were processed with Suite2p. - ``` - /tmp/example_data/ - - subject3/ - - 210107_run00_orientation_8dir/ - - run00_orientation_8dir_000_000.sbx - - run00_orientation_8dir_000_000.mat - - suite2p/ - - combined - - plane0 - - plane1 - - plane2 - - plane3 - - subject7/ - - session1 - - suite2p - - plane0 - ``` - Element and Workflow Calcium Imaging also support data collected with ... - - Nikon - - Prairie View - - CaImAn - -??? Note "DeepLabCut: Click to expand details" - - **Dataset**: workflow-dlc-data - - **Revision**: v1 - - **Size**: .3 GB - - The example data includes both training data and pretrained models. - ``` - /tmp/test_data/from_top_tracking/ - - config.yml - - dlc-models/iteration-0/from_top_trackingFeb23-trainset95shuffle1/ - - test/pose_cfg.yaml - - train/ - - checkpoint - - checkpoint_orig - ─ learning_stats.csv - ─ log.txt - ─ pose_cfg.yaml - ─ snapshot-10300.data-00000-of-00001 - ─ snapshot-10300.index - ─ snapshot-10300.meta # same for 103000 - - labeled-data/ - - train1/ - - CollectedData_DJ.csv - - CollectedData_DJ.h5 - - img00674.png # and others - - train2/ # similar to above - - videos/ - - test.mp4 - - train1.mp4 - ``` - -??? Note "FaceMap: Click to expand details" - - **Associated workflow still under development** - - - **Dataset**: workflow-facemap - - **Revision**: 0.0.0 - - **Size**: .3 GB - -#### Using Your Own Data - -Some of the workflows carry some assumptions about how your file directory will be -organized, and how some files are named. - -??? Note "Array Ephys: Click to expand details" - - - In your [DataJoint config](#config), add another item under `custom`, - `ephys_root_data_dir`, for your local root data directory. This can include - multiple roots. - - ```json - "custom": { - "database.prefix": "", - "ephys_root_data_dir": ["/local/root/dir1", "/local/root/dir2"] - } - ``` - - - The `subject` directory names must match the subject IDs in your subjects table. - The `ingest.py` script ( - [demo ingestion notebook](https://github.com/datajoint/workflow-array-ephys/blob/main/notebooks/04-automate-optional.ipynb) - ) can help load these values from `./user_data/subjects.csv`. - - - The `session` directories can have any naming convention, but must be specified - in the session table (see also - [demo ingestion notebook](https://github.com/datajoint/workflow-array-ephys/blob/main/notebooks/04-automate-optional.ipynb) - ). - - - Each session can have multiple probes. - - - The `probe` directory names must end in a one-digit number corresponding to the - probe number. - - - Each `probe` directory should contain: - - One neuropixels meta file named `*[0-9].ap.meta` - - Optionally, one Kilosort output folder - - Folder structure: - ``` - / - └───/ # Subject name in `subjects.csv` - β”‚ └───/ # Session directory in `sessions.csv` - β”‚ β”‚ └───imec0/ - β”‚ β”‚ β”‚ β”‚ *imec0.ap.meta - β”‚ β”‚ β”‚ └───ksdir/ - β”‚ β”‚ β”‚ β”‚ spike_times.npy - β”‚ β”‚ β”‚ β”‚ templates.npy - β”‚ β”‚ β”‚ β”‚ ... - β”‚ β”‚ └───imec1/ - β”‚ β”‚ β”‚ *imec1.ap.meta - β”‚ β”‚ └───ksdir/ - β”‚ β”‚ β”‚ spike_times.npy - β”‚ β”‚ β”‚ templates.npy - β”‚ β”‚ β”‚ ... - β”‚ └───/ - β”‚ β”‚ β”‚ ... - └───/ - β”‚ β”‚ ... - ``` - -??? Note "Calcium Imaging: Click to expand details" - - **Note:** While Element Calcium Imaging can accommodate multiple scans per - session, Workflow Calcium Imaging assumes there is only one scan per session. - - - In your [DataJoint config](#config), add another item under `custom`, - `imaging_root_data_dir`, for your local root data directory. - - ```json - "custom": { - "database.prefix": "", - "imaging_root_data_dir": "/local/root/dir1" - } - ``` - - - The `subject` directory names must match the subject IDs in your subjects table. - The `ingest.py` script ( - [tutorial notebook](https://github.com/datajoint/element-calcium-imaging/blob/main/notebooks/tutorial.ipynb) - ) can help load these values from `./user_data/subjects.csv`. - - - The `session` directories can have any naming convention, but must be specified - in the session table (see also - [tutorial notebook])(https://github.com/datajoint/element-calcium-imaging/blob/main/notebooks/tutorial.ipynb) - . - - - Each `session` directory should contain: - - All `.tif` or `.sbx` files for the scan, with any naming convention. - - One `suite2p` subfolder, containing the analysis outputs in the default naming - convention. - - One `caiman` subfolder, containing the analysis output `.hdf5` file, with any - naming convention. - - Folder structure: - ``` - imaging_root_data_dir/ - └───/ # Subject name in `subjects.csv` - β”‚ └───/ # Session directory in `sessions.csv` - β”‚ β”‚ β”‚ scan_0001.tif - β”‚ β”‚ β”‚ scan_0002.tif - β”‚ β”‚ β”‚ scan_0003.tif - β”‚ β”‚ β”‚ ... - β”‚ β”‚ └───suite2p/ - β”‚ β”‚ β”‚ ops1.npy - β”‚ β”‚ └───plane0/ - β”‚ β”‚ β”‚ β”‚ ops.npy - β”‚ β”‚ β”‚ β”‚ spks.npy - β”‚ β”‚ β”‚ β”‚ stat.npy - β”‚ β”‚ β”‚ β”‚ ... - β”‚ β”‚ └───plane1/ - β”‚ β”‚ β”‚ ops.npy - β”‚ β”‚ β”‚ spks.npy - β”‚ β”‚ β”‚ stat.npy - β”‚ β”‚ β”‚ ... - β”‚ β”‚ └───caiman/ - β”‚ β”‚ β”‚ analysis_results.hdf5 - β”‚ └───/ # Session directory in `sessions.csv` - β”‚ β”‚ β”‚ scan_0001.tif - β”‚ β”‚ β”‚ scan_0002.tif - β”‚ β”‚ β”‚ ... - └───/ # Subject name in `subjects.csv` - β”‚ β”‚ ... - ``` - -??? Note "DeepLabCut: Click to expand details" - - **Note:** Element DeepLabCut assumes you've already used the DeepLabCut GUI to - set up your project and label your data. This can include multiple roots. - - - In your [DataJoint config](#config), add another item under - `custom`, `dlc_root_data_dir`, for your local root - data directory. - ```json - "custom": { - "database.prefix": "", - "dlc_root_data_dir": ["/local/root/dir1", "/local/root/dir2"] - } - ``` - - - You have preserved the default DeepLabCut project directory, shown below. - - - The paths in your various `yaml` files reflect the current folder structure. - - - You have generated the `pickle` and `mat` training files. If not, follow the - DeepLabCut guide to - [create a training dataset](https://github.com/DeepLabCut/DeepLabCut/blob/master/docs/standardDeepLabCut_UserGuide.md#f-create-training-datasets) - - Folder structure: - ``` - /dlc_root_data_dir/your_project/ - - config.yaml # Including correct path information - - dlc-models/iteration-*/your_project_date-trainset*shuffle*/ - - test/pose_cfg.yaml # Including correct path information - - train/pose_cfg.yaml # Including correct path information - - labeled-data/any_names/*{csv,h5,png} - - training-datasets/iteration-*/UnaugmentedDataSet_your_project_date/ - - your_project_*shuffle*.pickle - - your_project_scorer*shuffle*.mat - - videos/any_names.mp4 - ``` - -??? Note "Miniscope: Click to expand details" - - - In your [DataJoint config](#config), add another item under `custom`, - `miniscope_root_data_dir`, for your local root data directory. - - ```json - "custom": { - "database.prefix": "", - "miniscope_root_data_dir": "/local/root/dir" - } - ``` - -## Relational databases - -DataJoint helps you connect to a database server from your programming environment -(i.e., Python or MATLAB), granting a number of benefits over traditional file hierarchies -(see [YouTube Explainer](https://www.youtube.com/watch?v=q-PMUSC5P5o)). We offer two -options: - -1. The [First Time](#first-time) beginner approach loads example data to a temporary existing - database, saving you setup time. But, because this data will be purged intermittently, - it should not be used in a true experiment. -2. The [Local Database](#local-database) intermediate approach will walk you through - setting up your own database on your own hardware. While easier to manage, it may be - difficult to expose this to outside collaborators. -3. The [Central Database](#central-database) advanced approach has the benefits of running -on dedicated hardware, but may require significant IT expertise and infrastructure -depending on your needs. - -### First time - -*Temporary storage. Not for production use.* - -1. Make an account at [accounts.datajoint.io](https://accounts.datajoint.io/). -2. In a workflow directory, make a config `json` file called - `dj_local_conf.json` using your DataJoint account information and - `tutorial-db.datajoint.io` as the host. - ```json - { - "database.host": "tutorial-db.datajoint.io", - "database.user": "", - "database.password": "", - "loglevel": "INFO", - "safemode": true, - "display.limit": 7, - "display.width": 14, - "display.show_tuple_count": true, - "custom": { - "database.prefix": "" - } - } - ``` - Note: Your database prefix must begin with your username in order to have - permission to declare new tables. -3. Launch a Python terminal and start interacting with the workflow. - -### Local Database - -1. Install [Docker](https://docs.docker.com/engine/install/). -
- Why Docker? Click for details. - - Docker makes it easy to package a program, including the file system and related - code libraries, in a container. This container can be distributed to any - machine, both automating and standardizing the setup process. - -
-2. Test that docker has been installed by running the following command: - ```console - docker run --rm hello-world - ``` -3. Launch the DataJoint MySQL server with the following command: - ```console - docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=tutorial datajoint/mysql - ``` -
- What's this doing? Click for details. -
    -
  • Download a container image called datajoint/mysql, which is pre-installed and - configured MySQL database with appropriate settings for use with DataJoint -
  • -
  • Open up the port 3306 (MySQL default) on your computer so that your database - server can accept connections. -
  • -
  • Set the password for the root database user to be tutorial, which are then used - in the config file. -
  • -
-
-4. In a workflow directory, make a config `json` file called - `dj_local_conf.json` using the following details. The prefix can be set to any value. - ```json - { - "database.host": "localhost", - "database.password": "tutorial", - "database.user": "root", - "database.port": 3306, - "loglevel": "INFO", - "safemode": true, - "display.limit": 7, - "display.width": 14, - "display.show_tuple_count": true, - "custom": { - "database.prefix": "neuro_" - } - } - ``` - -??? Note "Already familiar with Docker? Click here for details." - - This document is written to apply to all example workflows. Many have a docker - folder used by developers to set up both a database and a local environment for - integration tests. Simply `docker compose up` the relevant file and - `docker exec` into the relevant container. - -### Central Database - -To set up a database on dedicated hardware may require expertise to set up and maintain. -DataJoint's [MySQL Docker image project](https://github.com/datajoint/mysql-docker) -provides all the information required to set up a dedicated database. - -## Interacting with the Workflow - -### In Python - -1. Connect to the database and import tables - - ```python - from .pipeline import * - ``` - -2. View the declared tables. For a more in depth explanation of how to run the workflow - and explore the data, refer to the - [Jupyter notebooks](#visualization-packages-jupyter-notebooks-datajoint-diagrams) - in the workflow directory. -
- Array Ephys: Click to expand details - ```python - subject.Subject() - session.Session() - ephys.ProbeInsertion() - ephys.EphysRecording() - ephys.Clustering() - ephys.Clustering.Unit() - ``` -
-
- Calcium Imaging: Click to expand details - ```python - subject.Subject() - session.Session() - scan.Scan() - scan.ScanInfo() - imaging.ProcessingParamSet() - imaging.ProcessingTask() - ``` -
-
- DeepLabCut: Click to expand details - ```python - subject.Subject() - session.Session() - train.TrainingTask() - model.VideoRecording.File() - model.Model() - model.PoseEstimation.BodyPartPosition() - ``` -
- -### DataJoint LabBook - -DataJoint LabBook is a graphical user interface to facilitate data entry for existing -DataJoint tables. - -- [Labbook Website](https://labbook.datajoint.io/) - If a database is public (e.g., - `tutorial-db`) and you have access, you can view the contents here. - -- [DataJoint LabBook Documentation](https://datajoint.github.io/datajoint-labbook/), - including prerequisites, installation, and running the application - -- [DataJoint LabBook GitHub Repository](https://github.com/datajoint/datajoint-labbook) diff --git a/src/explanation/computation-model.md b/src/explanation/computation-model.md new file mode 100644 index 00000000..da273159 --- /dev/null +++ b/src/explanation/computation-model.md @@ -0,0 +1,320 @@ +# Computation Model + +DataJoint's computation model enables automated, reproducible data processing +through the `populate()` mechanism and Jobs 2.0 system. + +## AutoPopulate: The Core Concept + +Tables that inherit from `dj.Imported` or `dj.Computed` can automatically +populate themselves based on upstream data. + +```python +@schema +class Segmentation(dj.Computed): + definition = """ + -> Scan + --- + num_cells : uint32 + cell_masks : + """ + + def make(self, key): + # key contains primary key of one Scan + scan_data = (Scan & key).fetch1('image_data') + + # Your computation + masks, num_cells = segment_cells(scan_data) + + # Insert result + self.insert1({ + **key, + 'num_cells': num_cells, + 'cell_masks': masks + }) +``` + +## The `make()` Contract + +The `make(self, key)` method: + +1. **Receives** the primary key of one upstream entity +2. **Computes** results for that entity +3. **Inserts** results into the table + +DataJoint guarantees: + +- `make()` is called once per upstream entity +- Failed computations can be retried +- Parallel execution is safe + +## Key Source + +The **key source** determines what needs to be computed: + +```python +# Default: all upstream keys not yet in this table +key_source = Scan - Segmentation + +# Custom key source +@property +def key_source(self): + return (Scan & 'quality > 0.8') - self +``` + +## Calling `populate()` + +```python +# Populate all missing entries +Segmentation.populate() + +# Populate specific subset +Segmentation.populate(restriction) + +# Limit number of jobs +Segmentation.populate(limit=100) + +# Show progress +Segmentation.populate(display_progress=True) + +# Suppress errors, continue processing +Segmentation.populate(suppress_errors=True) +``` + +## Jobs 2.0: Distributed Computing + +For parallel and distributed execution, Jobs 2.0 provides: + +### Job States + +```mermaid +stateDiagram-v2 + [*] --> pending : key_source - table + pending --> reserved : reserve() + reserved --> success : complete() + reserved --> error : error() + reserved --> pending : timeout + success --> [*] + error --> pending : ignore/clear +``` + +### Job Table + +Each auto-populated table has an associated jobs table: + +```python +# View job status +Segmentation.jobs() + +# View errors +Segmentation.jobs & 'status = "error"' + +# Clear errors to retry +(Segmentation.jobs & 'status = "error"').delete() +``` + +### Parallel Execution + +```python +# Multiple workers can run simultaneously +# Each reserves different keys + +# Worker 1 +Segmentation.populate(reserve_jobs=True) + +# Worker 2 (different process/machine) +Segmentation.populate(reserve_jobs=True) +``` + +Jobs are reserved atomicallyβ€”no two workers process the same key. + +### Error Handling + +```python +# Populate with error suppression +Segmentation.populate(suppress_errors=True) + +# Check what failed +errors = (Segmentation.jobs & 'status = "error"').to_dicts() + +# Clear specific error to retry +(Segmentation.jobs & error_key).delete() + +# Clear all errors +(Segmentation.jobs & 'status = "error"').delete() +``` + +## Imported vs. Computed + +| Aspect | `dj.Imported` | `dj.Computed` | +|--------|---------------|---------------| +| Data source | External (files, APIs) | Other tables | +| Typical use | Load raw data | Derive results | +| Diagram color | Blue | Red | + +Both use the same `make()` mechanism. + +## Workflow Integrity + +The computation model maintains **workflow integrity**: + +1. **Dependency order** β€” Upstream tables populate before downstream +2. **Cascade deletes** β€” Deleting upstream deletes downstream +3. **Recomputation** β€” Delete and re-populate to update results + +```python +# Correct an upstream error +(Scan & problem_key).delete() # Cascades to Segmentation + +# Reinsert corrected data +Scan.insert1(corrected_data) + +# Recompute +Segmentation.populate() +``` + +## Job Metadata (Optional) + +Track computation metadata with hidden columns: + +```python +dj.config['jobs.add_job_metadata'] = True +``` + +This adds to computed tables: + +- `_job_start_time` β€” When computation started +- `_job_duration` β€” How long it took +- `_job_version` β€” Code version (if configured) + +## The Three-Part Make Model + +For long-running computations (hours or days), holding a database transaction +open for the entire duration causes problems: + +- Database locks block other operations +- Transaction timeouts may occur +- Resources are held unnecessarily + +The **three-part make pattern** solves this by separating the computation from +the transaction: + +```python +@schema +class SignalAverage(dj.Computed): + definition = """ + -> RawSignal + --- + avg_signal : float64 + """ + + def make_fetch(self, key): + """Step 1: Fetch input data (outside transaction)""" + raw_signal = (RawSignal & key).fetch1("signal") + return (raw_signal,) + + def make_compute(self, key, fetched): + """Step 2: Perform computation (outside transaction)""" + (raw_signal,) = fetched + avg = raw_signal.mean() + return (avg,) + + def make_insert(self, key, fetched, computed): + """Step 3: Insert results (inside brief transaction)""" + (avg,) = computed + self.insert1({**key, "avg_signal": avg}) +``` + +### How It Works + +DataJoint executes the three parts with verification: + +``` +fetched = make_fetch(key) # Outside transaction +computed = make_compute(key, fetched) # Outside transaction + + +fetched_again = make_fetch(key) # Re-fetch to verify +if fetched != fetched_again: + # Inputs changedβ€”abort +else: + make_insert(key, fetched, computed) + +``` + +The key insight: **the computation runs outside any transaction**, but +referential integrity is preserved by re-fetching and verifying inputs before +insertion. If upstream data changed during computation, the job is cancelled +rather than inserting inconsistent results. + +### Benefits + +| Aspect | Standard `make()` | Three-Part Pattern | +|--------|-------------------|--------------------| +| Transaction duration | Entire computation | Only final insert | +| Database locks | Held throughout | Minimal | +| Suitable for | Short computations | Hours/days | +| Integrity guarantee | Transaction | Re-fetch verification | + +### When to Use Each Pattern + +| Computation Time | Pattern | Rationale | +|------------------|---------|-----------| +| Seconds to minutes | Standard `make()` | Simple, transaction overhead acceptable | +| Minutes to hours | Three-part | Avoid long transactions | +| Hours to days | Three-part | Essential for stability | + +The three-part pattern trades off fetching data twice for dramatically reduced +transaction duration. Use it when computation time significantly exceeds fetch +time. + +## Best Practices + +### 1. Keep `make()` Focused + +```python +def make(self, key): + # Good: One clear computation + data = (UpstreamTable & key).fetch1('data') + result = process(data) + self.insert1({**key, 'result': result}) +``` + +### 2. Handle Large Data Efficiently + +```python +def make(self, key): + # Stream large data instead of loading all at once + for row in (LargeTable & key): + process_chunk(row['data']) +``` + +### 3. Use Transactions for Multi-Row Inserts + +```python +def make(self, key): + results = compute_multiple_results(key) + + # All-or-nothing insertion + with dj.conn().transaction: + self.insert(results) +``` + +### 4. Test with Single Keys First + +```python +# Test make() on one key +key = (Scan - Segmentation).fetch1('KEY') +Segmentation().make(key) + +# Then populate all +Segmentation.populate() +``` + +## Summary + +1. **`make(key)`** β€” Computes one entity at a time +2. **`populate()`** β€” Executes `make()` for all missing entities +3. **Jobs 2.0** β€” Enables parallel, distributed execution +4. **Three-part make** β€” For long computations without long transactions +5. **Cascade deletes** β€” Maintain workflow integrity +6. **Error handling** β€” Robust retry mechanisms diff --git a/src/explanation/custom-codecs.md b/src/explanation/custom-codecs.md new file mode 100644 index 00000000..44acf9f8 --- /dev/null +++ b/src/explanation/custom-codecs.md @@ -0,0 +1,336 @@ +# Extending DataJoint with Custom Codecs + +DataJoint's type system is extensible through **codecs**β€”plugins that define +how domain-specific Python objects are stored and retrieved. This enables +seamless integration of specialized data types without modifying DataJoint itself. + +## Why Codecs? + +Scientific computing involves diverse data types: + +- **Neuroscience**: Spike trains, neural networks, connectivity graphs +- **Imaging**: Medical images, microscopy stacks, point clouds +- **Genomics**: Sequence alignments, phylogenetic trees, variant calls +- **Physics**: Simulation meshes, particle systems, field data + +Rather than forcing everything into NumPy arrays or JSON, codecs let you work +with native data structures while DataJoint handles storage transparently. + +## The Codec Contract + +A codec defines two operations: + +```mermaid +graph LR + A[Python Object] -->|encode| B[Storable Form] + B -->|decode| A +``` + +| Method | Input | Output | When Called | +|--------|-------|--------|-------------| +| `encode()` | Python object | bytes, dict, or another codec's input | On `insert()` | +| `decode()` | Stored data | Python object | On `fetch()` | + +## Creating a Custom Codec + +### Basic Structure + +```python +import datajoint as dj + +class MyCodec(dj.Codec): + """Store custom objects.""" + name = "mytype" # Used as in definitions + + def get_dtype(self, is_external: bool) -> str: + """Return storage type.""" + return "" # Chain to blob serialization + + def encode(self, value, *, key=None, store_name=None): + """Convert Python object to storable form.""" + return serialize(value) + + def decode(self, stored, *, key=None): + """Convert stored form back to Python object.""" + return deserialize(stored) +``` + +### Auto-Registration + +Codecs register automatically when the class is definedβ€”no decorator needed: + +```python +class GraphCodec(dj.Codec): + name = "graph" # Immediately available as + ... + +# Check registration +assert "graph" in dj.list_codecs() +``` + +## Example: NetworkX Graphs + +```python +import networkx as nx +import datajoint as dj + +class GraphCodec(dj.Codec): + """Store NetworkX graphs as adjacency data.""" + name = "graph" + + def get_dtype(self, is_external: bool) -> str: + # Store as blob (internal) or hash-addressed (external) + return "" if is_external else "" + + def encode(self, graph, *, key=None, store_name=None): + """Serialize graph to dict.""" + return { + 'directed': graph.is_directed(), + 'nodes': list(graph.nodes(data=True)), + 'edges': list(graph.edges(data=True)), + } + + def decode(self, stored, *, key=None): + """Reconstruct graph from dict.""" + cls = nx.DiGraph if stored['directed'] else nx.Graph + G = cls() + G.add_nodes_from(stored['nodes']) + G.add_edges_from(stored['edges']) + return G +``` + +Usage: + +```python +@schema +class Connectivity(dj.Computed): + definition = """ + -> Neurons + --- + network : # Small graphs in database + full_network : # Large graphs in object storage + """ + + def make(self, key): + # Build connectivity graph + G = nx.DiGraph() + G.add_edges_from(compute_connections(key)) + + self.insert1({**key, 'network': G, 'full_network': G}) + +# Fetch returns NetworkX graph directly +graph = (Connectivity & key).fetch1('network') +print(f"Nodes: {graph.number_of_nodes()}") +``` + +## Example: Domain-Specific Formats + +### Genomics: Pysam Alignments + +```python +import pysam +import tempfile +from pathlib import Path + +class BamCodec(dj.Codec): + """Store BAM alignments.""" + name = "bam" + + def get_dtype(self, is_external: bool) -> str: + if not is_external: + raise dj.DataJointError(" requires external storage: use ") + return "" # Path-addressed storage for file structure + + def encode(self, alignments, *, key=None, store_name=None): + """Write alignments to BAM format.""" + # alignments is a pysam.AlignmentFile or list of reads + # Storage handled by codec + return alignments + + def decode(self, stored, *, key=None): + """Return ObjectRef for lazy BAM access.""" + return stored # ObjectRef with .open() method +``` + +### Medical Imaging: SimpleITK + +```python +import SimpleITK as sitk +import io + +class MedicalImageCodec(dj.Codec): + """Store medical images with metadata.""" + name = "medimg" + + def get_dtype(self, is_external: bool) -> str: + return "" if is_external else "" + + def encode(self, image, *, key=None, store_name=None): + """Serialize SimpleITK image.""" + # Preserve spacing, origin, direction + buffer = io.BytesIO() + sitk.WriteImage(image, buffer, imageIO='NrrdImageIO') + return { + 'data': buffer.getvalue(), + 'spacing': image.GetSpacing(), + 'origin': image.GetOrigin(), + } + + def decode(self, stored, *, key=None): + """Reconstruct SimpleITK image.""" + buffer = io.BytesIO(stored['data']) + return sitk.ReadImage(buffer) +``` + +## Codec Chaining + +Codecs can chain to other codecs via `get_dtype()`: + +```mermaid +graph LR + A["β€Ήgraphβ€Ί"] -->|get_dtype| B["β€Ήblobβ€Ί"] + B -->|get_dtype| C["bytes"] + C -->|MySQL| D["LONGBLOB"] +``` + +```python +class CompressedGraphCodec(dj.Codec): + name = "cgraph" + + def get_dtype(self, is_external: bool) -> str: + return "" # Chain to graph codec + + def encode(self, graph, *, key=None, store_name=None): + # Simplify before passing to graph codec + return nx.to_sparse6_bytes(graph) + + def decode(self, stored, *, key=None): + return nx.from_sparse6_bytes(stored) +``` + +## Storage Mode Support + +### Internal Only + +```python +class SmallDataCodec(dj.Codec): + name = "small" + + def get_dtype(self, is_external: bool) -> str: + if is_external: + raise dj.DataJointError(" is internal-only") + return "json" +``` + +### External Only + +```python +class LargeDataCodec(dj.Codec): + name = "large" + + def get_dtype(self, is_external: bool) -> str: + if not is_external: + raise dj.DataJointError(" requires @: use ") + return "" +``` + +### Both Modes + +```python +class FlexibleCodec(dj.Codec): + name = "flex" + + def get_dtype(self, is_external: bool) -> str: + return "" if is_external else "" +``` + +## Validation + +Add validation to catch errors early: + +```python +class StrictGraphCodec(dj.Codec): + name = "strictgraph" + + def validate(self, value): + """Called before encode().""" + if not isinstance(value, nx.Graph): + raise dj.DataJointError( + f"Expected NetworkX graph, got {type(value).__name__}" + ) + if value.number_of_nodes() == 0: + raise dj.DataJointError("Graph must have at least one node") + + def encode(self, graph, *, key=None, store_name=None): + self.validate(graph) + return {...} +``` + +## Best Practices + +### 1. Choose Appropriate Storage + +| Data Size | Recommendation | +|-----------|----------------| +| < 1 KB | `json` or `` | +| 1 KB - 10 MB | `` or `` | +| > 10 MB | `` or `` | +| File structures | `` | + +### 2. Preserve Metadata + +```python +def encode(self, obj, *, key=None, store_name=None): + return { + 'data': serialize(obj), + 'version': '1.0', # For future compatibility + 'dtype': str(obj.dtype), + 'shape': obj.shape, + } +``` + +### 3. Handle Versioning + +```python +def decode(self, stored, *, key=None): + version = stored.get('version', '0.9') + if version == '1.0': + return deserialize_v1(stored) + else: + return deserialize_legacy(stored) +``` + +### 4. Document Your Codec + +```python +class WellDocumentedCodec(dj.Codec): + """ + Store XYZ data structures. + + Supports both internal () and external () storage. + + Examples + -------- + >>> @schema + ... class Results(dj.Computed): + ... definition = ''' + ... -> Experiment + ... --- + ... output : + ... ''' + """ + name = "xyz" +``` + +## Summary + +Custom codecs enable: + +1. **Domain-specific types** β€” Work with native data structures +2. **Transparent storage** β€” DataJoint handles serialization +3. **Flexible backends** β€” Internal, external, or both +4. **Composability** β€” Chain codecs for complex transformations +5. **Validation** β€” Catch errors before storage + +The codec system makes DataJoint extensible to any scientific domain without +modifying the core framework. diff --git a/src/explanation/data-pipelines.md b/src/explanation/data-pipelines.md new file mode 100644 index 00000000..d6bff259 --- /dev/null +++ b/src/explanation/data-pipelines.md @@ -0,0 +1,178 @@ +# Scientific Data Pipelines + +A **scientific data pipeline** extends beyond a database with computations. It is a comprehensive system that: + +- Manages the complete lifecycle of scientific data from acquisition to delivery +- Integrates diverse tools for data entry, visualization, and analysis +- Provides infrastructure for secure, scalable computation +- Enables collaboration across teams and institutions +- Supports reproducibility and provenance tracking throughout + +## Pipeline Architecture + +A DataJoint pipeline integrates three core components: + +![DataJoint Platform Architecture](../images/dj-platform.png) + +| Component | Purpose | +|-----------|---------| +| **Code Repository** | Version-controlled pipeline definitions, `make` methods, configuration | +| **Relational Database** | System of record for metadata, relationships, and integrity enforcement | +| **Object Store** | Scalable storage for large scientific data (images, recordings, signals) | + +These components work together: code defines the schema and computations, the database tracks all metadata and relationships, and object storage holds the large scientific data files. + +## Pipeline as a DAG + +A DataJoint pipeline forms a **Directed Acyclic Graph (DAG)** at two levels: + +![Pipeline DAG Structure](../images/pipeline-illustration.png) + +**Nodes** represent Python modules, which correspond to database schemas. + +**Edges** represent: + +- Python import dependencies between modules +- Bundles of foreign key references between schemas + +This dual structure ensures that both code dependencies and data dependencies flow in the same direction. + +### DAG Constraints + +> **All foreign key relationships within a schema MUST form a DAG.** +> +> **Dependencies between schemas (foreign keys + imports) MUST also form a DAG.** + +This constraint is fundamental to DataJoint's design. It ensures: + +- **Unidirectional data flow** β€” Data enters at the top and flows downstream +- **Clear provenance** β€” Every result traces back to its inputs +- **Safe deletion** β€” Cascading deletes follow the DAG without cycles +- **Predictable computation** β€” `populate()` can determine correct execution order + +## The Relational Workflow Model + +DataJoint pipelines are built on the [Relational Workflow Model](relational-workflow-model.md)β€”a paradigm that extends relational databases with native support for computational workflows. In this model: + +- **Tables represent workflow steps**, not just data storage +- **Foreign keys encode dependencies**, prescribing the order of operations +- **Table tiers** (Lookup, Manual, Imported, Computed) classify how data enters the pipeline +- **The schema forms a DAG** that defines valid execution sequences + +This model treats the database schema as an **executable workflow specification**β€”defining not just what data exists but when and how it comes into existence. + +## Schema Organization + +Each schema corresponds to a dedicated Python module. The module import structure mirrors the foreign key dependencies between schemas: + +![Schema Structure](../images/schema-illustration.png) + +``` +my_pipeline/ +β”œβ”€β”€ src/ +β”‚ └── my_pipeline/ +β”‚ β”œβ”€β”€ __init__.py +β”‚ β”œβ”€β”€ subject.py # subject schema (no dependencies) +β”‚ β”œβ”€β”€ session.py # session schema (depends on subject) +β”‚ β”œβ”€β”€ acquisition.py # acquisition schema (depends on session) +β”‚ └── analysis.py # analysis schema (depends on acquisition) +``` + +For practical guidance on organizing multi-schema pipelines, configuring repositories, and managing team access, see [Manage a Pipeline Project](../how-to/manage-pipeline-project.md). + +## Object-Augmented Schemas + +Scientific data often includes large objectsβ€”images, recordings, time series, instrument outputsβ€”that don't fit efficiently in relational tables. DataJoint addresses this through **Object-Augmented Schemas (OAS)**, a hybrid storage architecture that preserves relational semantics while handling arbitrarily large data. + +### The OAS Philosophy + +**1. The database remains the system of record.** + +All metadata, relationships, and query logic live in the relational database. The schema defines what data exists, how entities relate, and what computations produce them. Queries operate on the relational structure; results are consistent and reproducible. + +**2. Large objects live in external stores.** + +Object storage (filesystems, S3, GCS, Azure Blob, MinIO) holds the actual bytesβ€”arrays, images, files. The database stores only lightweight references (paths, checksums, metadata). This separation lets the database stay fast while data scales to terabytes. + +**3. Transparent access through codecs.** + +DataJoint's [type system](type-system.md) provides codec types that bridge Python objects and storage: + +| Codec | Purpose | +|-------|---------| +| `` | Serialize Python objects (NumPy arrays, dicts) | +| `` | Same, but stored externally | +| `` | Store files with preserved filenames | +| `` | Path-addressed storage for complex structures (Zarr, HDF5) | +| `` | References to externally-managed files | + +Users work with native Python objects; serialization and storage routing are invisible. + +**4. Referential integrity extends to objects.** + +When a database row is deleted, its associated external objects are garbage-collected. Foreign key cascades work correctlyβ€”delete upstream data and downstream results (including their objects) disappear. The database and object store remain synchronized without manual cleanup. + +**5. Multiple storage tiers support diverse access patterns.** + +Different attributes can route to different stores: + +```python +class Recording(dj.Imported): + definition = """ + -> Session + --- + raw_data : # Hot storage for active analysis + archive : # Cold storage for long-term retention + """ +``` + +This architecture lets teams work with terabyte-scale datasets while retaining the query power, integrity guarantees, and reproducibility of the relational model. + +## Pipeline Workflow + +A typical data pipeline workflow: + +1. **Acquisition** β€” Data is collected from instruments, experiments, or external sources. Raw files land in object storage; metadata populates Manual tables. + +2. **Import** β€” Automated processes parse raw data, extract signals, and populate Imported tables with structured results. + +3. **Computation** β€” The `populate()` mechanism identifies new data and triggers downstream processing. Compute resources execute transformations and populate Computed tables. + +4. **Query & Analysis** β€” Users query results across the pipeline, combining data from multiple stages to generate insights, reports, or visualizations. + +5. **Collaboration** β€” Team members access the same database concurrently, building on shared results. Foreign key constraints maintain consistency. + +6. **Delivery** β€” Processed results are exported, integrated into downstream systems, or archived according to project requirements. + +Throughout this process, the schema definition remains the single source of truth. + +## Comparing Approaches + +| Aspect | File-Based Approach | DataJoint Pipeline | +|--------|--------------------|--------------------| +| **Data Structure** | Implicit in filenames/folders | Explicit in schema definition | +| **Dependencies** | Encoded in scripts | Declared through foreign keys | +| **Provenance** | Manual tracking | Automatic through referential integrity | +| **Reproducibility** | Requires careful discipline | Built into the model | +| **Collaboration** | File sharing/conflicts | Concurrent database access | +| **Queries** | Custom scripts per question | Composable query algebra | +| **Scalability** | Limited by filesystem | Database + object-augmented storage | + +The pipeline approach requires upfront investment in schema design. This investment pays dividends through reduced errors, improved reproducibility, and efficient collaboration as projects scale. + +## Summary + +Scientific data pipelines extend the Relational Workflow Model into complete data operations systems: + +- **Pipeline Architecture** β€” Code repository, relational database, and object store working together +- **DAG Structure** β€” Unidirectional flow of data and dependencies +- **Object-Augmented Schemas** β€” Scalable storage with relational semantics + +The schema remains centralβ€”defining data structures, dependencies, and computational flow. This pipeline-centric approach lets teams focus on their science while the system handles data integrity, provenance, and reproducibility automatically. + +## See Also + +- [Relational Workflow Model](relational-workflow-model.md) β€” The conceptual foundation +- [Entity Integrity](entity-integrity.md) β€” Primary keys and dimensions +- [Type System](type-system.md) β€” Codec types and storage modes +- [Manage a Pipeline Project](../how-to/manage-pipeline-project.md) β€” Practical project organization diff --git a/src/explanation/entity-integrity.md b/src/explanation/entity-integrity.md new file mode 100644 index 00000000..9d21e17e --- /dev/null +++ b/src/explanation/entity-integrity.md @@ -0,0 +1,388 @@ +# Entity Integrity + +**Entity integrity** ensures a one-to-one correspondence between real-world +entities and their database records. This is the foundation of reliable data +management. + +## The Core Guarantee + +- Each real-world entity β†’ exactly one database record +- Each database record β†’ exactly one real-world entity + +Without entity integrity, databases become unreliable: + +| Integrity Failure | Consequence | +|-------------------|-------------| +| Same entity, multiple records | Fragmented data, conflicting information | +| Multiple entities, same record | Mixed data, privacy violations | +| Cannot match entity to record | Lost data, broken workflows | + +## The Three Questions + +When designing a primary key, answer these three questions: + +### 1. How do I prevent duplicate records? + +Ensure the same entity cannot appear twice in the table. + +### 2. How do I prevent record sharing? + +Ensure different entities cannot share the same record. + +### 3. How do I match entities to records? + +When an entity arrives, how do I find its corresponding record? + +## Example: Laboratory Mouse Database + +Consider a neuroscience lab tracking mice: + +| Question | Answer | +|----------|--------| +| Prevent duplicates? | Each mouse gets a unique ear tag at arrival; database rejects duplicate tags | +| Prevent sharing? | Ear tags are never reused; retired tags are archived | +| Match entities? | Read the ear tag β†’ look up record by primary key | + +```python +@schema +class Mouse(dj.Manual): + definition = """ + ear_tag : char(6) # unique ear tag (e.g., 'M00142') + --- + date_of_birth : date + sex : enum('M', 'F', 'U') + strain : varchar(50) + """ +``` + +The database enforces the first two questions through the primary key constraint. +The third question requires a **physical identification system**β€”ear tags, +barcodes, or RFID chips that link physical entities to database records. + +## Primary Key Requirements + +In DataJoint, every table must have a primary key. Primary key attributes: + +- **Cannot be NULL** β€” Every entity must be identifiable +- **Must be unique** β€” No two entities share the same key +- **Cannot be changed** β€” Keys are immutable after insertion +- **Declared above the `---` line** β€” Syntactic convention + +## Natural Keys vs. Surrogate Keys + +### Natural Keys + +Use attributes that naturally identify entities in your domain: + +```python +@schema +class Gene(dj.Lookup): + definition = """ + gene_symbol : varchar(20) # Official gene symbol (e.g., 'BRCA1') + --- + full_name : varchar(200) + chromosome : varchar(5) + """ +``` + +**Advantages:** + +- Meaningful to humans +- Self-documenting +- No additional lookup needed + +### Surrogate Keys + +A **surrogate key** is an identifier used *primarily inside* the database, with minimal or no exposure to end users. Users typically don't search for entities by surrogate keys or use them in conversation. + +```python +@schema +class InternalRecord(dj.Manual): + definition = """ + record_id : uuid # internal identifier, not exposed to users + --- + created_timestamp : datetime(3) + data : + """ +``` + +**Key distinction from natural keys:** Surrogate keys don't require external identification systems because users don't need to match physical entities to records by these keys. + +**When surrogate keys are appropriate:** + +- Entities that exist only within the system (no physical counterpart) +- Privacy-sensitive contexts where natural identifiers shouldn't be stored +- Internal system records that users never reference directly + +**Generating surrogate keys:** DataJoint requires explicit key values rather than database-generated auto-increment. This is intentional: + +- Auto-increment encourages treating keys as "row numbers" rather than entity identifiers +- It's incompatible with composite keys, which DataJoint uses extensively +- It breaks reproducibility (different IDs when rebuilding pipelines) +- It prevents the client-server handshake needed for proper entity integrity + +Use client-side generation instead: + +- **UUIDs** β€” Generate with `uuid.uuid4()` before insertion +- **ULIDs** β€” Sortable unique IDs +- **Client-side counters** β€” Query max value and increment + +**DataJoint recommendation:** Prefer natural keys when they're stable and +meaningful. Use surrogates only when no natural identifier exists or for +privacy-sensitive contexts. + +## Composite Keys + +When no single attribute uniquely identifies an entity, combine multiple +attributes: + +```python +@schema +class Recording(dj.Manual): + definition = """ + -> Session + recording_idx : uint16 # Recording number within session + --- + duration : float32 # seconds + """ +``` + +Here, `(subject_id, session_idx, recording_idx)` together form the primary key. +Neither alone would be unique. + +## Foreign Keys and Dependencies + +Foreign keys in DataJoint serve dual purposes: + +1. **Referential integrity** β€” Ensures referenced entities exist +2. **Workflow dependency** β€” Declares that this entity depends on another + +```python +@schema +class Segmentation(dj.Computed): + definition = """ + -> Scan # Depends on Scan + --- + num_cells : uint32 + """ +``` + +The arrow `->` inherits the primary key from `Scan` and establishes both +referential integrity and workflow dependency. + +## Schema Dimensions + +A **dimension** is an independent axis of variation in your data, introduced by +a table that defines new primary key attributes. Dimensions are the fundamental +building blocks of schema design. + +### Dimension-Introducing Tables + +A table **introduces a dimension** when it defines primary key attributes that +don't come from a foreign key. In schema diagrams, these tables have +**underlined names**. + +```python +@schema +class Subject(dj.Manual): + definition = """ + subject_id : varchar(16) # NEW dimension: subject_id + --- + species : varchar(50) + """ + +@schema +class Modality(dj.Lookup): + definition = """ + modality : varchar(32) # NEW dimension: modality + --- + description : varchar(255) + """ +``` + +Both `Subject` and `Modality` are dimension-introducing tablesβ€”they create new +axes along which data varies. + +### Dimension-Inheriting Tables + +A table **inherits dimensions** when its entire primary key comes from foreign +keys. In schema diagrams, these tables have **non-underlined names**. + +```python +@schema +class SubjectProfile(dj.Manual): + definition = """ + -> Subject # Inherits subject_id dimension + --- + weight : float32 + """ +``` + +`SubjectProfile` doesn't introduce a new dimensionβ€”it extends the `Subject` +dimension with additional attributes. There's exactly one profile per subject. + +### Mixed Tables + +Most tables both inherit and introduce dimensions: + +```python +@schema +class Session(dj.Manual): + definition = """ + -> Subject # Inherits subject_id dimension + session_idx : uint16 # NEW dimension within subject + --- + session_date : date + """ +``` + +`Session` inherits the subject dimension but introduces a new dimension +(`session_idx`) within each subject. This creates a hierarchical structure. + +### Computed Tables and Dimensions + +**Computed tables never introduce dimensions.** Their primary key is entirely +inherited from their dependencies: + +```python +@schema +class SessionSummary(dj.Computed): + definition = """ + -> Session # PK = (subject_id, session_idx) + --- + num_trials : uint32 + accuracy : float32 + """ +``` + +This makes senseβ€”computed tables derive data from existing entities rather +than introducing new ones. + +### Part Tables CAN Introduce Dimensions + +Unlike computed tables, **part tables can introduce new dimensions**: + +```python +@schema +class Detection(dj.Computed): + definition = """ + -> Image # Inherits image_id + -> DetectionParams # Inherits params_id + --- + num_blobs : uint32 + """ + + class Blob(dj.Part): + definition = """ + -> master # Inherits (image_id, params_id) + blob_idx : uint16 # NEW dimension within detection + --- + x : float32 + y : float32 + """ +``` + +`Detection` inherits dimensions (no underline in diagram), but `Detection.Blob` +introduces a new dimension (`blob_idx`) for individual blobs within each +detection. + +### Dimensions and Attribute Lineage + +Every primary key attribute traces back to the dimension where it was first +defined. This is called **attribute lineage**: + +``` +Subject.subject_id β†’ myschema.subject.subject_id (origin) +Session.subject_id β†’ myschema.subject.subject_id (inherited) +Session.session_idx β†’ myschema.session.session_idx (origin) +Trial.subject_id β†’ myschema.subject.subject_id (inherited) +Trial.session_idx β†’ myschema.session.session_idx (inherited) +Trial.trial_idx β†’ myschema.trial.trial_idx (origin) +``` + +Lineage enables **semantic matching**β€”DataJoint only joins attributes that +trace back to the same dimension. Two attributes named `id` from different +dimensions cannot be accidentally joined. + +See [Semantic Matching](../reference/specs/semantic-matching.md) for details. + +### Recognizing Dimensions in Diagrams + +In schema diagrams: + +| Visual | Meaning | +|--------|---------| +| **Underlined name** | Introduces at least one new dimension | +| Non-underlined name | All PK attributes inherited (no new dimensions) | +| **Thick solid line** | One-to-one extension (no new dimension) | +| **Thin solid line** | Containment (may introduce dimension) | + +Common dimensions in neuroscience: + +- **Subject** β€” Who/what is being studied +- **Session** β€” When data was collected +- **Trial** β€” Individual experimental unit +- **Modality** β€” Type of data (ephys, imaging, behavior) +- **Parameter set** β€” Configuration for analysis + +Understanding dimensions helps design schemas that naturally express your +experimental structure and ensures correct joins through semantic matching. + +## Best Practices + +1. **Answer the three questions** before designing any table +2. **Choose stable identifiers** that won't need to change +3. **Keep keys minimal** β€” Include only what's necessary for uniqueness +4. **Document key semantics** β€” Explain what the key represents +5. **Consider downstream queries** β€” Keys affect join performance + +## Common Mistakes + +### Too few key attributes + +```python +# Wrong: experiment_id alone isn't unique +class Trial(dj.Manual): + definition = """ + experiment_id : uint32 + --- + trial_number : uint16 # Should be part of key! + result : float32 + """ +``` + +### Too many key attributes + +```python +# Wrong: timestamp makes every row unique, losing entity semantics +class Measurement(dj.Manual): + definition = """ + subject_id : uint32 + timestamp : datetime(6) # Microsecond precision + --- + value : float32 + """ +``` + +### Mutable natural keys + +```python +# Risky: names can change +class Patient(dj.Manual): + definition = """ + patient_name : varchar(100) # What if they change their name? + --- + date_of_birth : date + """ +``` + +## Summary + +Entity integrity is maintained by: + +1. **Primary keys** that uniquely identify each entity +2. **Foreign keys** that establish valid references +3. **Physical systems** that link real-world entities to records + +The three questions framework ensures your primary keys provide meaningful, +stable identification for your domain entities. diff --git a/src/explanation/faq.md b/src/explanation/faq.md new file mode 100644 index 00000000..b0807454 --- /dev/null +++ b/src/explanation/faq.md @@ -0,0 +1,227 @@ +# Frequently Asked Questions + +## Why Does DataJoint Have Its Own Definition and Query Language? + +DataJoint provides a custom data definition language and [query algebra](query-algebra.md) rather than using raw SQL or Object-Relational Mapping (ORM) patterns. This design reflects DataJoint's purpose: enabling research teams to build **[relational workflows](relational-workflow-model.md) with embedded computations** with maximum clarity. These concepts were first formalized in [Yatsenko et al., 2018](https://doi.org/10.48550/arXiv.1807.11104). + +### The Definition Language + +DataJoint's [definition language](../reference/specs/table-declaration.md) is a standalone scripting language for declaring table schemas β€” not Python syntax embedded in strings. It is designed for uniform support across multiple host languages (Python, MATLAB, and potentially others). The same definition works identically regardless of which language you use. + +### Composite Primary Keys: A Clarity Comparison + +Scientific workflows frequently use composite primary keys built from foreign keys. Compare how different approaches handle this common pattern: + +```python +# DataJoint - two characters declare dependency, foreign key, and inherit primary key +class Scan(dj.Manual): + definition = """ + -> Session + scan_idx : int16 + --- + depth : float32 + """ +``` + +```python +# SQLAlchemy - verbose, scattered, error-prone +class Scan(Base): + subject_id = Column(Integer, primary_key=True) + session_date = Column(Date, primary_key=True) + scan_idx = Column(SmallInteger, primary_key=True) + depth = Column(Float) + __table_args__ = ( + ForeignKeyConstraint( + ['subject_id', 'session_date'], + ['session.subject_id', 'session.session_date'] + ), + ) +``` + +```sql +-- Raw SQL - maximum verbosity +CREATE TABLE scan ( + subject_id INT NOT NULL, + session_date DATE NOT NULL, + scan_idx SMALLINT NOT NULL, + depth FLOAT, + PRIMARY KEY (subject_id, session_date, scan_idx), + FOREIGN KEY (subject_id, session_date) + REFERENCES session(subject_id, session_date) +); +``` + +The `-> Session` syntax in DataJoint: + +- Inherits all primary key attributes from Session +- Declares the foreign key constraint +- Establishes the computational dependency (for `populate()`) +- Documents the data lineage + +All in two characters. As pipelines grow to dozens of tables with deep dependency chains, this clarity compounds. + +### Why Multiline Strings? + +| Aspect | Benefit | +|--------|---------| +| **Readable** | Looks like a specification: `---` separates primary from secondary attributes, `#` for comments | +| **Concise** | `mouse_id : int32` vs `mouse_id = Column(Integer, primary_key=True)` | +| **Database-first** | `table.describe()` shows the same format; virtual schemas reconstruct definitions from database metadata | +| **Language-agnostic** | Same syntax for Python, MATLAB, future implementations | +| **Separation of concerns** | Definition string = structure (what); class = behavior (how: `make()` methods) | + +The definition string **is** the specification β€” a declarative language that describes entities and their relationships, independent of any host language's syntax. + +### Why Custom Query Algebra? + +DataJoint's operators implement **[semantic matching](../reference/specs/semantic-matching.md)** β€” joins and restrictions match only on attributes connected through the foreign key graph, not arbitrary columns that happen to share a name. This prevents: +- Accidental Cartesian products +- Joins on unrelated columns +- Silent incorrect results + +Every query result has a defined **[entity type](entity-integrity.md)** with a specific [primary key](../reference/specs/primary-keys.md) (algebraic closure). SQL results are untyped bags of rows; DataJoint results are entity sets you can continue to query and compose. + +### Object-Augmented Schemas + +Object-Relational Mappers treat large objects as opaque binary blobs or leave file management to the application. DataJoint's object store **extends the relational schema** (see [Type System](type-system.md)): + +- Relational semantics apply: referential integrity, cascading deletes, query filtering +- Multiple access patterns: lazy `ObjectRef`, streaming via fsspec, explicit download +- Two addressing modes: path-addressed (by primary key) and hash-addressed (deduplicated) + +The object store is part of the relational model β€” queryable and integrity-protected like any other attribute. + +### Summary + +| Aspect | Raw SQL | Object-Relational Mappers | DataJoint | +|--------|---------|---------------------------|-----------| +| Schema definition | SQL Data Definition Language | Host language classes | Standalone definition language | +| Composite foreign keys | Verbose, repetitive | Verbose, scattered | `-> TableName` | +| Query model | SQL strings | Object navigation | Relational algebra operators | +| Dependencies | Implicit in application | Implicit in application | Explicit in schema | +| Large objects | Binary blobs / manual | Binary blobs / manual | Object-Augmented Schema | +| Computation | External to database | External to database | First-class ([Computed tables](computation-model.md)) | +| Target audience | Database administrators | Web developers | Research teams | + +--- + +## Is DataJoint an ORM? + +**Object-Relational Mapping (ORM)** is a technique for interacting with relational databases through object-oriented programming, abstracting direct SQL queries. Popular Python ORMs include SQLAlchemy, Django ORM, and Peewee, often used in web development. + +DataJoint shares certain ORM characteristicsβ€”tables are defined as Python classes, and queries return Python objects. However, DataJoint is fundamentally a **computational database framework** designed for scientific workflows: + +| Aspect | Traditional ORMs | DataJoint | +|--------|-----------------|-----------| +| Primary use case | Web applications | Scientific data pipelines | +| Focus | Simplify database CRUD | Data integrity + computation | +| Dependencies | Implicit (application logic) | Explicit (foreign keys define data flow) | +| Computation | External to database | First-class citizen in schema | +| Query model | Object navigation | Relational algebra | + +DataJoint can be considered an **ORM specialized for scientific databases**β€”purpose-built for structured experimental data and computational workflows where reproducibility and [data integrity](entity-integrity.md) are paramount. + +## Is DataJoint a Workflow Management System? + +Not exactly. DataJoint and workflow management systems (Airflow, Prefect, Flyte, Nextflow, Snakemake) solve related but distinct problems: + +| Aspect | Workflow Managers | DataJoint | +|--------|-------------------|-----------| +| Core abstraction | Tasks and DAGs | Tables and dependencies | +| State management | External (files, databases) | Integrated (relational database) | +| Scheduling | Built-in schedulers | External (or manual `populate()`) | +| Distributed execution | Built-in | Via external tools | +| Data model | Unstructured (files, blobs) | Structured (relational schema) | +| Query capability | Limited | Full relational algebra | + +**DataJoint excels at:** + +- Defining *what* needs to be computed based on data dependencies +- Ensuring computations are never duplicated +- Maintaining referential integrity across pipeline stages +- Querying intermediate and final results + +**Workflow managers excel at:** + +- Scheduling and orchestrating job execution +- Distributing work across clusters +- Retry logic and failure handling +- Resource management + +**They complement each other.** DataJoint formalizes data dependencies so that external schedulers can effectively manage computational tasks. A common pattern: + +1. DataJoint defines the pipeline structure and tracks what's computed +2. A workflow manager (or simple cron/SLURM scripts) calls [`populate()`](computation-model.md) on a schedule +3. DataJoint determines what work remains and executes it + +## Is DataJoint a Lakehouse? + +DataJoint and lakehouses share goalsβ€”integrating structured data management with scalable storage and computation. However, they differ in approach: + +| Aspect | Lakehouse | DataJoint | +|--------|-----------|-----------| +| Data model | Flexible (structured + semi-structured) | Strict relational schema | +| Schema enforcement | Schema-on-read optional | Schema-on-write enforced | +| Primary use | Analytics on diverse data | Scientific workflows | +| Computation model | SQL/Spark queries | Declarative `make()` methods | +| Dependency tracking | Limited | Explicit via foreign keys | + +A **lakehouse** merges data lake flexibility with data warehouse structure, optimized for analytics workloads. + +**DataJoint** prioritizes: + +- Rigorous schema definitions +- Explicit computational dependencies +- Data integrity and reproducibility +- Traceability within structured scientific datasets + +DataJoint can complement lakehouse architecturesβ€”using object storage for large files while maintaining relational structure for metadata and provenance. + +## Does DataJoint Require SQL Knowledge? + +No. DataJoint provides a Python API that abstracts SQL: + +| SQL | DataJoint | +|-----|-----------| +| `CREATE TABLE` | Define tables as Python classes | +| `INSERT INTO` | `.insert()` method | +| `SELECT * FROM` | `.to_arrays()`, `.to_dicts()`, `.to_pandas()` | +| `JOIN` | `table1 * table2` | +| `WHERE` | `table & condition` | +| `GROUP BY` | `.aggr()` | + +Understanding relational concepts ([primary keys](entity-integrity.md), foreign keys, [normalization](normalization.md)) is helpful but not required to start. The [tutorials](../tutorials/index.md) teach these concepts progressively. + +Since DataJoint uses standard database backends (MySQL, PostgreSQL), data remains accessible via SQL for users who prefer it or need integration with other tools. + +## How Does DataJoint Handle Large Files? + +DataJoint uses a hybrid storage model called **Object-Augmented Schemas (OAS)**: + +- **Relational database**: Stores metadata, parameters, and relationships +- **Object storage**: Stores large files (images, recordings, arrays) + +The database maintains references to external objects, preserving: + +- Referential integrity (files deleted with their parent records) +- Query capability (filter by metadata, join across tables) +- Deduplication (identical content stored once) + +See [Object Storage](../how-to/use-object-storage.md) for details. + +## Can Multiple Users Share a Pipeline? + +Yes. DataJoint pipelines are inherently collaborative: + +- **Shared database**: All users connect to the same MySQL/PostgreSQL instance +- **Shared schema**: Table definitions are stored in the database +- **Concurrent access**: ACID transactions prevent conflicts +- **Job reservation**: `populate()` coordinates work across processes + +Teams typically: + +1. Share pipeline code via Git +2. Connect to a shared database server +3. Run `populate()` from multiple machines simultaneously + +See [Distributed Computing](../how-to/distributed-computing.md) for multi-process patterns. diff --git a/src/explanation/index.md b/src/explanation/index.md new file mode 100644 index 00000000..1a311fbb --- /dev/null +++ b/src/explanation/index.md @@ -0,0 +1,67 @@ +# Concepts + +Understanding the principles behind DataJoint. + +DataJoint implements the **Relational Workflow Model**β€”a paradigm that extends +relational databases with native support for computational workflows. This section +explains the core concepts that make DataJoint pipelines reliable, reproducible, +and scalable. + +## Core Concepts + +
+ +- :material-sitemap: **[Relational Workflow Model](relational-workflow-model.md)** + + How DataJoint differs from traditional databases. The paradigm shift from + storage to workflow. + +- :material-key: **[Entity Integrity](entity-integrity.md)** + + Primary keys and the three questions. Ensuring one-to-one correspondence + between entities and records. + +- :material-table-split-cell: **[Normalization](normalization.md)** + + Schema design principles. Organizing tables around workflow steps to + minimize redundancy. + +- :material-set-split: **[Query Algebra](query-algebra.md)** + + The five operators: restriction, join, projection, aggregation, union. + Workflow-aware query semantics. + +- :material-code-tags: **[Type System](type-system.md)** + + Three-layer architecture: native, core, and codec types. Internal and + external storage modes. + +- :material-cog-play: **[Computation Model](computation-model.md)** + + AutoPopulate and Jobs 2.0. Automated, reproducible, distributed computation. + +- :material-puzzle: **[Custom Codecs](custom-codecs.md)** + + Extend DataJoint with domain-specific types. The codec extensibility system. + +- :material-pipe: **[Data Pipelines](data-pipelines.md)** + + From workflows to complete data operations systems. Project structure and + object-augmented schemas. + +- :material-frequently-asked-questions: **[FAQ](faq.md)** + + How DataJoint compares to ORMs, workflow managers, and lakehouses. + Common questions answered. + +
+ +## Why These Concepts Matter + +Traditional databases store data. DataJoint pipelines **process** data. Understanding +the Relational Workflow Model helps you: + +- Design schemas that naturally express your workflow +- Write queries that are both powerful and intuitive +- Build computations that scale from laptop to cluster +- Maintain data integrity throughout the pipeline lifecycle diff --git a/src/explanation/normalization.md b/src/explanation/normalization.md new file mode 100644 index 00000000..0beac611 --- /dev/null +++ b/src/explanation/normalization.md @@ -0,0 +1,161 @@ +# Schema Normalization + +Schema normalization ensures data integrity by organizing tables to minimize +redundancy and prevent update anomalies. DataJoint's workflow-centric approach +makes normalization intuitive. + +## The Workflow Normalization Principle + +> **"Every table represents an entity type that is created at a specific step +> in a workflow, and all attributes describe that entity as it exists at that +> workflow step."** + +This principle naturally leads to well-normalized schemas. + +## Why Normalization Matters + +Without normalization, databases suffer from: + +- **Redundancy** β€” Same information stored multiple times +- **Update anomalies** β€” Changes require updating multiple rows +- **Insertion anomalies** β€” Can't add data without unrelated data +- **Deletion anomalies** β€” Deleting data loses unrelated information + +## DataJoint's Approach + +Traditional normalization analyzes **functional dependencies** to determine +table structure. DataJoint takes a different approach: design tables around +**workflow steps**. + +### Example: Mouse Housing + +**Denormalized (problematic):** + +```python +# Wrong: cage info repeated for every mouse +class Mouse(dj.Manual): + definition = """ + mouse_id : int32 + --- + cage_id : int32 + cage_location : varchar(50) # Redundant! + cage_temperature : float32 # Redundant! + weight : float32 + """ +``` + +**Normalized (correct):** + +```python +@schema +class Cage(dj.Manual): + definition = """ + cage_id : int32 + --- + location : varchar(50) + temperature : float32 + """ + +@schema +class Mouse(dj.Manual): + definition = """ + mouse_id : int32 + --- + -> Cage + """ + +@schema +class MouseWeight(dj.Manual): + definition = """ + -> Mouse + weigh_date : date + --- + weight : float32 + """ +``` + +This normalized design: + +- Stores cage info once (no redundancy) +- Tracks weight history (temporal dimension) +- Allows cage changes without data loss + +## The Workflow Test + +Ask: "At which workflow step is this attribute determined?" + +- If an attribute is determined at a **different step**, it belongs in a + **different table** +- If an attribute **changes over time**, it needs its own table with a + **temporal key** + +## Common Patterns + +### Lookup Tables + +Store reference data that doesn't change: + +```python +@schema +class Species(dj.Lookup): + definition = """ + species : varchar(50) + --- + common_name : varchar(100) + """ + contents = [ + ('Mus musculus', 'House mouse'), + ('Rattus norvegicus', 'Brown rat'), + ] +``` + +### Parameter Sets + +Store versioned configurations: + +```python +@schema +class AnalysisParams(dj.Lookup): + definition = """ + params_id : int32 + --- + threshold : float32 + window_size : int32 + """ +``` + +### Temporal Tracking + +Track attributes that change over time: + +```python +@schema +class SubjectWeight(dj.Manual): + definition = """ + -> Subject + weight_date : date + --- + weight : float32 # grams + """ +``` + +## Benefits in DataJoint + +1. **Natural from workflow thinking** β€” Designing around workflow steps + naturally produces normalized schemas + +2. **Cascade deletes** β€” Normalization + foreign keys enable safe cascade + deletes that maintain consistency + +3. **Join efficiency** β€” Normalized tables with proper keys enable efficient + joins through the workflow graph + +4. **Clear provenance** β€” Each table represents a distinct workflow step, + making data lineage clear + +## Summary + +- Normalize by designing around **workflow steps** +- Each table = one entity type at one workflow step +- Attributes belong with the step that **determines** them +- Temporal data needs **temporal keys** diff --git a/src/explanation/query-algebra.md b/src/explanation/query-algebra.md new file mode 100644 index 00000000..da13e88f --- /dev/null +++ b/src/explanation/query-algebra.md @@ -0,0 +1,275 @@ +# Query Algebra + +DataJoint provides a powerful query algebra built on five core operators: restriction, join, projection, aggregation, and union. These operators work on **entity sets** (query expressions) and always return entity sets, enabling arbitrary composition. + +## Algebraic Closure + +A fundamental property of DataJoint's query algebra is **algebraic closure**: every query result is itself a valid entity set with a well-defined **entity type** β€” you always know what kind of entity the result represents, identified by a specific primary key. Unlike SQL where query results are unstructured "bags of rows," DataJoint determines the entity type of each result based on the operator and the functional dependencies between operands. + +This means operators can be chained indefinitely β€” the output of any operation is a valid input to any other operation. See [Primary Keys](../reference/specs/primary-keys.md) for the precise rules. + +## Core Operators + +```mermaid +graph LR + A[Entity Set] --> R[Restriction &] + A --> J[Join *] + A --> E[Extend .extend] + A --> P[Projection .proj] + A --> G[Aggregation .aggr] + A --> U[Union +] + R --> B[Entity Set] + J --> B + E --> B + P --> B + G --> B + U --> B +``` + +## Restriction (`&` and `-`) + +Filter entities based on conditions. + +### Include (`&`) + +```python +# Mice born after 2024 +Mouse & 'date_of_birth > "2024-01-01"' + +# Sessions for a specific mouse +Session & {'mouse_id': 42} + +# Sessions matching a query +Session & (Mouse & 'strain = "C57BL/6"') +``` + +### Exclude (`-`) + +```python +# Mice NOT in the study +Mouse - StudyMouse + +# Sessions without recordings +Session - Recording +``` + +### Top N (`dj.Top`) + +Select a limited number of entities with ordering: + +```python +# Most recent 10 sessions +Session & dj.Top(10, 'session_date DESC') + +# First session by primary key +Session & dj.Top() +``` + +The `order_by` parameter accepts attribute names with optional `DESC`/`ASC`. The special value `"KEY"` is an alias for all primary key attributes (e.g., `"KEY DESC"` for reverse primary key order). + +## Join (`*`) + +Combine entity sets along shared attributes. + +```python +# All session-recording pairs +Session * Recording + +# Chain through workflow +Mouse * Session * Scan * Segmentation +``` + +DataJoint joins are **natural joins** that: + +- Match on attributes with the same name **and** lineage +- Respect declared dependencies (no accidental matches) +- Produce the intersection of matching entities + +### Extend (`.extend()`) + +Add attributes from another entity set while preserving all entities in the original set. + +```python +# Add session info to each trial +Trial.extend(Session) # Adds session_date, subject_id to Trial + +# Add neuron properties to spike times +SpikeTime.extend(Neuron) # Adds cell_type, depth to SpikeTime +``` + +**How it differs from join:** + +- **Join (`*`)**: Returns only matching entities (inner join), primary key is the union of both PKs +- **Extend**: Returns all entities from the left side (left join), primary key stays as the left side's PK + +**Primary key formation:** + +```python +# Join: PK is union of both primary keys +result = Session * Trial +# PK: (session_id, trial_num) + +# Extend: PK stays as left side's PK +result = Trial.extend(Session) +# PK: (session_id, trial_num) - same as Trial +# session_date is added as a non-primary attribute +``` + +**Requirement:** The left side must **determine** the right side. This means all primary key attributes from the right side must exist in the left side. This requirement ensures: + +1. Every entity in the left side can match at most one entity in the right side +2. The left side's primary key uniquely identifies entities in the result +3. No NULL values appear in the result's primary key + +```python +# Valid: Trial determines Session +# (session_id is in Trial's primary key) +Trial.extend(Session) βœ“ +# Each trial belongs to exactly one session +# Result PK: (session_id, trial_num) + +# Invalid: Session does NOT determine Trial +# (trial_num is not in Session) +Session.extend(Trial) βœ— # Error: trial_num not in Session +# A session has multiple trials - PK would be ambiguous +``` + +**Why use extend?** + +1. **Preserve all entities**: When you need attributes from a parent but want to keep all children (even orphans) +2. **Clear intent**: Expresses "add attributes" rather than "combine entity sets" +3. **No filtering**: Guarantees the same number of entities in the result + +Think of extend as projection-like: it adds attributes to existing entities without changing which entities are present. + +## Projection (`.proj()`) + +Select and transform attributes. + +### Select attributes + +```python +# Only mouse_id and strain +Mouse.proj('strain') + +# Rename attributes +Mouse.proj(animal_id='mouse_id') +``` + +### Compute new attributes + +```python +# Calculate age +Mouse.proj( + age='DATEDIFF(CURDATE(), date_of_birth)' +) + +# Combine attributes +Session.proj( + session_label='CONCAT(subject_id, "-", session_date)' +) +``` + +### Aggregate in projection + +```python +# Count recordings per session +Session.aggr(Recording, n_recordings='COUNT(*)') +``` + +## Aggregation (`.aggr()`) + +Summarize across groups. + +```python +# Average spike rate per neuron +Neuron.aggr( + SpikeTime, + avg_rate='AVG(spike_rate)', + total_spikes='COUNT(*)' +) + +# Statistics per session +Session.aggr( + Trial, + n_trials='COUNT(*)', + success_rate='AVG(success)' +) +``` + +## Union (`+`) + +Combine entity sets with the same attributes. + +```python +# All subjects from two studies +StudyA_Subjects + StudyB_Subjects + +# Combine results from different analyses +AnalysisV1 + AnalysisV2 +``` + +Requirements: + +- Same primary key structure +- Compatible attribute types + +## Operator Composition + +Operators compose freely: + +```python +# Complex query +result = ( + (Mouse & 'strain = "C57BL/6"') # Filter mice + * Session # Join sessions + * Scan # Join scans + .proj('scan_date', 'depth') # Select attributes + & 'depth > 200' # Filter by depth +) +``` + +## Workflow-Aware Joins + +Unlike SQL's natural joins that match on **any** shared column name, DataJoint +joins match on **semantic lineage**. Two attributes match only if they: + +1. Have the same name +2. Trace back to the same source definition + +This prevents accidental joins on coincidentally-named columns. + +## Fetching Results + +Query expressions are lazyβ€”they build SQL but don't execute until you fetch: + +```python +# Fetch as NumPy recarray +data = query.to_arrays() + +# Fetch as list of dicts +data = query.to_dicts() + +# Fetch as pandas DataFrame +df = query.to_pandas() + +# Fetch specific attributes +ids, dates = query.to_arrays('mouse_id', 'session_date') + +# Fetch single row +row = (query & key).fetch1() +``` + +## Summary + +| Operator | Symbol/Method | Purpose | +|----------|---------------|---------| +| Restriction | `&`, `-` | Filter entities | +| Join | `*` | Combine entity sets (inner join) | +| Extend | `.extend()` | Add attributes (left join) | +| Projection | `.proj()` | Select/transform attributes | +| Aggregation | `.aggr()` | Summarize groups | +| Union | `+` | Combine parallel sets | + +These core operators, combined with workflow-aware join semantics, provide +complete query capability for scientific data pipelines. diff --git a/src/explanation/relational-workflow-model.md b/src/explanation/relational-workflow-model.md new file mode 100644 index 00000000..a48ff736 --- /dev/null +++ b/src/explanation/relational-workflow-model.md @@ -0,0 +1,213 @@ +# The Relational Workflow Model + +DataJoint implements the **Relational Workflow Model**β€”a paradigm that extends +relational databases with native support for computational workflows. This model +defines a new class of databases called **Computational Databases**, where +computational transformations are first-class citizens of the data model. + +These concepts, along with DataJoint's schema definition language and query algebra, +were first formalized in [Yatsenko et al., 2018](https://doi.org/10.48550/arXiv.1807.11104). + +## The Problem with Traditional Approaches + +Traditional relational databases excel at storing and querying data but struggle +with computational workflows. They can store inputs and outputs, but: + +- The database doesn't understand that outputs were *computed from* inputs +- It doesn't automatically recompute when inputs change +- It doesn't track provenance + +**DataJoint solves these problems by treating your database schema as an +executable workflow specification.** + +## Three Paradigms Compared + +The relational data model has been interpreted through different conceptual +frameworks, each with distinct strengths and limitations: + +| Aspect | Mathematical (Codd) | Entity-Relationship (Chen) | **Relational Workflow (DataJoint)** | +|--------|---------------------|----------------------------|-------------------------------------| +| **Core Question** | "What functional dependencies exist?" | "What entity types exist?" | **"When/how are entities created?"** | +| **Time Dimension** | Not addressed | Not central | **Fundamental** | +| **Implementation Gap** | High (abstract to SQL) | High (ERM to SQL) | **None (unified approach)** | +| **Workflow Support** | None | None | **Native workflow modeling** | + +### Codd's Mathematical Foundation + +Edgar F. Codd's original relational model is rooted in predicate calculus and +set theory. Tables represent logical predicates; rows assert true propositions. +While mathematically rigorous, this approach requires abstract reasoning that +doesn't map to intuitive domain thinking. + +### Chen's Entity-Relationship Model + +Peter Chen's Entity-Relationship Model (ERM) shifted focus to concrete domain +modelingβ€”entities and relationships visualized in diagrams. However, ERM: + +- Creates a gap between conceptual design and SQL implementation +- Lacks temporal dimension ("when" entities are created) +- Treats relationships as static connections, not dynamic processes + +## The Relational Workflow Model + +The Relational Workflow Model introduces four fundamental concepts: + +### 1. Workflow Entities + +Unlike traditional entities that exist independently, **workflow entities** are +artifacts of workflow executionβ€”they represent the products of specific +operations. This temporal dimension allows us to understand not just *what* +exists, but *when* and *how* it came to exist. + +### 2. Workflow Dependencies + +**Workflow dependencies** extend foreign keys with operational semantics. They +don't just ensure referential integrityβ€”they prescribe the order of operations. +Parent entities must be created before child entities. + +```mermaid +graph LR + A[Session] --> B[Scan] + B --> C[Segmentation] + C --> D[Analysis] +``` + +### 3. Workflow Steps (Table Tiers) + +Each table represents a distinct **workflow step** with a specific role: + +```mermaid +graph TD + subgraph "Lookup (Gray)" + L[Parameters] + end + subgraph "Manual (Green)" + M[Subject] + S[Session] + end + subgraph "Imported (Blue)" + I[Recording] + end + subgraph "Computed (Red)" + C[Analysis] + end + + L --> C + M --> S + S --> I + I --> C +``` + +| Tier | Role | Examples | +|------|------|----------| +| **Lookup** | Reference data, parameters | Species, analysis methods | +| **Manual** | Human-entered observations | Subjects, sessions | +| **Imported** | Automated data acquisition | Recordings, images | +| **Computed** | Derived results | Analyses, statistics | + +### 4. Directed Acyclic Graph (DAG) + +The schema forms a **DAG** that: + +- Prohibits circular dependencies +- Ensures valid execution sequences +- Enables efficient parallel execution +- Supports resumable computation + +## The Workflow Normalization Principle + +> **"Every table represents an entity type that is created at a specific step +> in a workflow, and all attributes describe that entity as it exists at that +> workflow step."** + +This principle extends entity normalization with temporal and operational +dimensions. + +## Why This Matters + +### Unified Design and Implementation + +Unlike the ERM-SQL gap, DataJoint provides unified: + +- **Diagramming** β€” Schema diagrams reflect actual structure +- **Definition** β€” Table definitions are executable code +- **Querying** β€” Operators understand workflow semantics + +No translation needed between conceptual design and implementation. + +### Temporal and Operational Awareness + +The model captures the dynamic nature of workflows: + +- Data processing sequences +- Computational dependencies +- Operation ordering + +### Immutability and Provenance + +Workflow artifacts are immutable once created: + +- Preserves execution history +- Maintains data provenance +- Enables reproducible science + +When you delete upstream data, dependent results cascade-delete automatically. +To correct errors, you delete, reinsert, and recomputeβ€”ensuring every result +represents a consistent computation from valid inputs. + +### Workflow Integrity + +The DAG structure guarantees: + +- No circular dependencies +- Valid operation sequences +- Enforced temporal order +- Computational validity + +## Query Algebra with Workflow Semantics + +DataJoint's five operators provide a complete query algebra: + +| Operator | Symbol | Purpose | +|----------|--------|---------| +| **Restriction** | `&` | Filter entities | +| **Join** | `*` | Combine from converging paths | +| **Projection** | `.proj()` | Select/compute attributes | +| **Aggregation** | `.aggr()` | Summarize groups | +| **Union** | `+` | Combine parallel branches | + +These operators: + +- Take entity sets as input, produce entity sets as output +- Preserve entity integrity +- Respect declared dependencies (no ambiguous joins) + +## From Transactions to Transformations + +The Relational Workflow Model represents a conceptual shift: + +| Traditional View | Workflow View | +|------------------|---------------| +| Tables store data | Entity sets are workflow steps | +| Rows are records | Entities are execution instances | +| Foreign keys enforce consistency | Dependencies specify information flow | +| Updates modify state | Computations create new states | +| Schemas organize storage | Schemas specify pipelines | +| Queries retrieve data | Queries trace provenance | + +This makes DataJoint feel less like a traditional database and more like a +**workflow engine with persistent state**β€”one that maintains computational +validity while supporting scientific flexibility. + +## Summary + +The Relational Workflow Model: + +1. **Extends** relational theory (doesn't replace it) +2. **Adds** temporal and operational semantics +3. **Eliminates** the design-implementation gap +4. **Enables** reproducible computational workflows +5. **Maintains** mathematical rigor + +It's not a departure from relational databasesβ€”it's their evolution for +computational workflows. diff --git a/src/explanation/type-system.md b/src/explanation/type-system.md new file mode 100644 index 00000000..4e2c4bb2 --- /dev/null +++ b/src/explanation/type-system.md @@ -0,0 +1,231 @@ +# Type System + +DataJoint's type system provides a three-layer architecture that balances +database efficiency with Python convenience. + +## Three-Layer Architecture + +```mermaid +graph TB + subgraph "Layer 3: Codecs" + blob["β€Ήblobβ€Ί"] + attach["β€Ήattachβ€Ί"] + object["β€Ήobject@β€Ί"] + hash["β€Ήhash@β€Ί"] + custom["β€Ήcustomβ€Ί"] + end + subgraph "Layer 2: Core Types" + int32 + float64 + varchar + json + bytes + end + subgraph "Layer 1: Native" + INT["INT"] + DOUBLE["DOUBLE"] + VARCHAR["VARCHAR"] + JSON_N["JSON"] + BLOB["LONGBLOB"] + end + + blob --> bytes + attach --> bytes + object --> json + hash --> json + bytes --> BLOB + json --> JSON_N + int32 --> INT + float64 --> DOUBLE + varchar --> VARCHAR +``` + +## Layer 1: Native Database Types + +Backend-specific types (MySQL, PostgreSQL). **Discouraged for direct use.** + +```python +# Native types (avoid) +column : TINYINT UNSIGNED +column : MEDIUMBLOB +``` + +## Layer 2: Core DataJoint Types + +Standardized, scientist-friendly types that work identically across backends. + +### Numeric Types + +| Type | Description | Range | +|------|-------------|-------| +| `int8` | 8-bit signed | -128 to 127 | +| `int16` | 16-bit signed | -32,768 to 32,767 | +| `int32` | 32-bit signed | Β±2 billion | +| `int64` | 64-bit signed | Β±9 quintillion | +| `uint8` | 8-bit unsigned | 0 to 255 | +| `uint16` | 16-bit unsigned | 0 to 65,535 | +| `uint32` | 32-bit unsigned | 0 to 4 billion | +| `uint64` | 64-bit unsigned | 0 to 18 quintillion | +| `float32` | 32-bit float | ~7 significant digits | +| `float64` | 64-bit float | ~15 significant digits | +| `decimal(n,f)` | Fixed-point | Exact decimal | + +### String Types + +| Type | Description | +|------|-------------| +| `char(n)` | Fixed-length string | +| `varchar(n)` | Variable-length string | +| `enum(...)` | Enumeration of string labels | + +### Other Types + +| Type | Description | +|------|-------------| +| `bool` | True/False | +| `date` | Date only | +| `datetime` | Date and time (UTC) | +| `json` | JSON document | +| `uuid` | Universally unique identifier | +| `bytes` | Raw binary | + +## Layer 3: Codec Types + +Codecs provide `encode()`/`decode()` semantics for complex Python objects. + +### Syntax + +- **Angle brackets**: ``, ``, `` +- **`@` indicates external storage**: `` stores externally +- **Store name**: `` uses named store "cold" + +### Built-in Codecs + +| Codec | Internal | External | Returns | +|-------|----------|----------|---------| +| `` | βœ… | βœ… `` | Python object | +| `` | βœ… | βœ… `` | Local file path | +| `` | ❌ | βœ… | ObjectRef | +| `` | ❌ | βœ… | bytes | +| `` | ❌ | βœ… | ObjectRef | + +### `` β€” Serialized Python Objects + +Stores NumPy arrays, dicts, lists, and other Python objects. + +```python +class Results(dj.Computed): + definition = """ + -> Analysis + --- + spike_times : # In database + waveforms : # External, default store + raw_data : # External, 'archive' store + """ +``` + +### `` β€” File Attachments + +Stores files with filename preserved. + +```python +class Config(dj.Manual): + definition = """ + config_id : int + --- + settings : # Small config file + data_file : # Large file, external + """ +``` + +### `` β€” Path-Addressed Storage + +For large/complex file structures (Zarr, HDF5). Path derived from primary key. + +```python +class ProcessedData(dj.Computed): + definition = """ + -> Recording + --- + zarr_data : # Stored at {schema}/{table}/{pk}/ + """ +``` + +### `` β€” Portable References + +References to externally-managed files with portable paths. + +```python +class RawData(dj.Manual): + definition = """ + session_id : int + --- + recording : # Relative to 'raw' store + """ +``` + +## Storage Modes + +| Mode | Database Storage | External Storage | Use Case | +|------|------------------|------------------|----------| +| Internal | Yes | No | Small data | +| External | Metadata only | Yes | Large data | +| Hash-addressed | Metadata only | Deduplicated | Repeated data | +| Path-addressed | Metadata only | PK-based path | Complex files | + +## Custom Codecs + +Extend the type system for domain-specific data: + +```python +class GraphCodec(dj.Codec): + """Store NetworkX graphs.""" + name = "graph" + + def get_dtype(self, is_external): + return "" + + def encode(self, graph, *, key=None, store_name=None): + return { + 'nodes': list(graph.nodes()), + 'edges': list(graph.edges()) + } + + def decode(self, stored, *, key=None): + import networkx as nx + G = nx.Graph() + G.add_nodes_from(stored['nodes']) + G.add_edges_from(stored['edges']) + return G +``` + +Usage: + +```python +class Network(dj.Computed): + definition = """ + -> Analysis + --- + connectivity : + """ +``` + +## Choosing Types + +| Data | Recommended Type | +|------|------------------| +| Small scalars | Core types (`int32`, `float64`) | +| Short strings | `varchar(n)` | +| NumPy arrays (small) | `` | +| NumPy arrays (large) | `` | +| Files to attach | `` or `` | +| Zarr/HDF5 | `` | +| External file refs | `` | +| Custom objects | Custom codec | + +## Summary + +1. **Core types** for simple data β€” `int32`, `varchar`, `datetime` +2. **``** for Python objects β€” NumPy arrays, dicts +3. **`@` suffix** for external storage β€” ``, `` +4. **Custom codecs** for domain-specific types diff --git a/src/explanation/whats-new-2.md b/src/explanation/whats-new-2.md new file mode 100644 index 00000000..7ee658d1 --- /dev/null +++ b/src/explanation/whats-new-2.md @@ -0,0 +1,290 @@ +# What's New in DataJoint 2.0 + +DataJoint 2.0 is a major release that establishes DataJoint as a mature framework for scientific data pipelines. The version jump from 0.14 to 2.0 reflects the significance of these changes. + +> **πŸ“˜ Upgrading from legacy DataJoint (pre-2.0)?** +> +> This page summarizes new features and concepts. For step-by-step migration instructions, see the **[Migration Guide](../how-to/migrate-from-0x.md)**. + +## Overview + +DataJoint 2.0 introduces fundamental improvements to type handling, job coordination, and object storage while maintaining compatibility with your existing pipelines during migration. Key themes: + +- **Explicit over implicit**: All type conversions are now explicit through the codec system +- **Better distributed computing**: Per-table job coordination with improved error handling +- **Object storage integration**: Native support for large arrays and files +- **Future-proof architecture**: Portable types preparing for PostgreSQL backend support + +### Breaking Changes at a Glance + +If you're upgrading from legacy DataJoint, these changes require code updates: + +| Area | Legacy | 2.0 | +|------|--------|-----| +| **Fetch API** | `table.fetch()` | `table.to_dicts()` or `.to_arrays()` | +| **Update** | `(table & key)._update('attr', val)` | `table.update1({**key, 'attr': val})` | +| **Join** | `table1 @ table2` | `table1 * table2` (with semantic check) | +| **Type syntax** | `longblob`, `int unsigned` | ``, `uint32` | +| **Jobs** | `~jobs` table | Per-table `~~table_name` | + +See the [Migration Guide](../how-to/migrate-from-0x.md) for complete upgrade steps. + +## Object-Augmented Schema (OAS) + +DataJoint 2.0 unifies relational tables with object storage into a single coherent system. The relational database stores metadata and references while large objects (arrays, files, Zarr datasets) are stored in object storageβ€”with full referential integrity maintained across both layers. + +β†’ [Type System Specification](../reference/specs/type-system.md) + +**Three storage sections:** + +| Section | Addressing | Use Case | +|---------|------------|----------| +| **Internal** | Row-based (in database) | Small objects (< 1 MB) | +| **Hash-addressed** | Content hash | Arrays, files (deduplication) | +| **Path-addressed** | Primary key path | Zarr, HDF5, streaming access | + +**New syntax:** + +```python +definition = """ +recording_id : uuid +--- +metadata : # Internal storage +raw_data : # Hash-addressed object storage +zarr_array : # Path-addressed for Zarr/HDF5 +""" +``` + +## Explicit Type System + +**Breaking change**: DataJoint 2.0 makes all type conversions explicit through a three-tier architecture. + +β†’ [Type System Specification](../reference/specs/type-system.md) Β· [Codec API Specification](../reference/specs/codec-api.md) + +### What Changed + +Legacy DataJoint overloaded MySQL types with implicit conversions: +- `longblob` could be blob serialization OR inline attachment +- `attach` was implicitly converted to longblob +- `uuid` was used internally for external storage + +**DataJoint 2.0 makes everything explicit:** + +| Legacy (Implicit) | 2.0 (Explicit) | +|-------------------|----------------| +| `longblob` | `` | +| `attach` | `` | +| `blob@store` | `` | +| `int unsigned` | `uint32` | + +### Three-Tier Architecture + +1. **Native types**: MySQL types (`INT`, `VARCHAR`, `LONGBLOB`) +2. **Core types**: Portable aliases (`int32`, `float64`, `varchar`, `uuid`, `json`) +3. **Codecs**: Serialization for Python objects (``, ``, ``) + +### Custom Codecs + +Replace legacy AdaptedTypes with the new codec API: + +```python +class GraphCodec(dj.Codec): + name = "graph" + + def encode(self, value, **kwargs): + return list(value.edges) + + def decode(self, stored, **kwargs): + import networkx as nx + return nx.Graph(stored) +``` + +## Jobs 2.0 + +**Breaking change**: Redesigned job coordination with per-table job management. + +β†’ [AutoPopulate Specification](../reference/specs/autopopulate.md) Β· [Job Metadata Specification](../reference/specs/job-metadata.md) + +### What Changed + +| Legacy (Schema-level) | 2.0 (Per-table) | +|----------------------|-----------------| +| One `~jobs` table per schema | One `~~table_name` per Computed/Imported table | +| Opaque hashed keys | Native primary keys (readable) | +| Statuses: `reserved`, `error`, `ignore` | Added: `pending`, `success` | +| No priority support | Priority column (lower = more urgent) | + +### New Features + +- **Automatic refresh**: Job queue synchronized with pending work automatically +- **Better coordination**: Multiple workers coordinate via database without conflicts +- **Error tracking**: Built-in error table (`Table.jobs.errors`) with full stack traces +- **Priority support**: Control computation order with priority values + +```python +# Distributed mode with coordination +Analysis.populate(reserve_jobs=True, processes=4) + +# Monitor progress +Analysis.jobs.progress() # {'pending': 10, 'reserved': 2, 'error': 0} + +# Handle errors +Analysis.jobs.errors.to_dicts() + +# Set priorities +Analysis.jobs.update({'session_id': 123}, priority=1) # High priority +``` + +## Semantic Matching + +**Breaking change**: Query operations now use **lineage-based matching** by default. + +β†’ [Semantic Matching Specification](../reference/specs/semantic-matching.md) + +### What Changed + +Legacy DataJoint used SQL-style natural joins: attributes matched if they had the same name, regardless of meaning. + +**DataJoint 2.0 validates semantic lineage**: Attributes must share common origin through foreign key chains, not just coincidentally matching names. + +```python +# 2.0: Semantic join (default) - validates lineage +result = TableA * TableB # Only matches attributes with shared origin + +# Legacy behavior (if needed) +result = TableA.join(TableB, semantic_check=False) +``` + +**Why this matters**: Prevents accidental matches between attributes like `session_id` that happen to share a name but refer to different entities in different parts of your schema. + +**During migration**: If semantic matching fails, it often indicates a malformed join that should be reviewed rather than forced. + +## Configuration System + +A cleaner configuration approach with separation of concerns. + +β†’ [Configuration Reference](../reference/configuration.md) + +- **`datajoint.json`**: Non-sensitive settings (commit to version control) +- **`.secrets/`**: Credentials (never commit) +- **Environment variables**: For CI/CD and production + +```bash +export DJ_HOST=db.example.com +export DJ_USER=myuser +export DJ_PASS=mypassword +``` + +## ObjectRef API (New) + +**New feature**: Path-addressed storage returns `ObjectRef` handles that support streaming access without downloading entire datasets. + +```python +ref = (Dataset & key).fetch1('zarr_array') + +# Direct fsspec access for Zarr/xarray +z = zarr.open(ref.fsmap, mode='r') + +# Or download locally +local_path = ref.download('/tmp/data') + +# Stream chunks without full download +with ref.open('rb') as f: + chunk = f.read(1024) +``` + +This enables efficient access to large datasets stored in Zarr, HDF5, or custom formats. + +## Deprecated and Removed + +### Removed APIs + +- **`.fetch()` method**: Replaced with `.to_dicts()`, `.to_arrays()`, or `.to_pandas()` +- **`._update()` method**: Replaced with `.update1()` +- **`@` operator (natural join)**: Use `*` with semantic matching or `.join(semantic_check=False)` +- **`dj.U() * table` pattern**: Use just `table` (universal set is implicit) + +### Deprecated Features + +- **AdaptedTypes**: Replaced by codec system (still works but migration recommended) +- **Native type syntax**: `int unsigned` β†’ `uint32` (warnings on new tables) +- **Legacy external storage** (`blob@store`): Replaced by `` codec syntax + +### Legacy Support + +During migration (Phases 1-3), both legacy and 2.0 APIs can coexist: +- Legacy clients can still access data +- 2.0 clients understand legacy column types +- Dual attributes enable cross-testing + +After finalization (Phase 4+), only 2.0 clients are supported. + +## License Change + +DataJoint 2.0 is licensed under the **Apache License 2.0** (previously LGPL-2.1). This provides: +- More permissive for commercial and academic use +- Clearer patent grant provisions +- Better compatibility with broader ecosystem + +## Migration Path + +β†’ **[Complete Migration Guide](../how-to/migrate-from-0x.md)** + +Upgrading from DataJoint 0.x is a **phased process** designed to minimize risk: + +### Phase 1: Code Updates (Reversible) +- Update Python code to 2.0 API patterns (`.fetch()` β†’ `.to_dicts()`, etc.) +- Update configuration files (`dj_local_conf.json` β†’ `datajoint.json` + `.secrets/`) +- **No database changes** β€” legacy clients still work + +### Phase 2: Type Migration (Reversible) +- Update database column comments to use core types (`:uint32:`, `::`) +- Rebuild `~lineage` tables for semantic matching +- Update Python table definitions +- **Legacy clients still work** β€” only metadata changed + +### Phase 3: External Storage Dual Attributes (Reversible) +- Create `*_v2` attributes alongside legacy external storage columns +- Both APIs can access data during transition +- Enables cross-testing between legacy and 2.0 +- **Legacy clients still work** + +### Phase 4: Finalize (Point of No Return) +- Remove legacy external storage columns +- Drop old `~jobs` and `~external_*` tables +- **Legacy clients stop working** β€” database backup required + +### Phase 5: Adopt New Features (Optional) +- Use new codecs (``, ``) +- Leverage Jobs 2.0 features (priority, better errors) +- Implement custom codecs for domain-specific types + +### Migration Support + +The migration guide includes: +- **AI agent prompts** for automated migration steps +- **Validation commands** to check migration status +- **Rollback procedures** for each phase +- **Dry-run modes** for all database changes + +Most users complete Phases 1-2 in a single session. Phases 3-4 only apply if you use legacy external storage. + +## See Also + +### Migration +- **[Migration Guide](../how-to/migrate-from-0x.md)** β€” Complete upgrade instructions +- [Configuration](../how-to/configure-database.md) β€” Setup new configuration system + +### Core Concepts +- [Type System](type-system.md) β€” Understand the three-tier type architecture +- [Computation Model](computation-model.md) β€” Jobs 2.0 and AutoPopulate +- [Query Algebra](query-algebra.md) β€” Semantic matching and operators + +### Getting Started +- [Installation](../how-to/installation.md) β€” Install DataJoint 2.0 +- [Tutorials](../tutorials/index.md) β€” Learn by example + +### Reference +- [Type System Specification](../reference/specs/type-system.md) β€” Complete type system details +- [Codec API](../reference/specs/codec-api.md) β€” Build custom codecs +- [AutoPopulate Specification](../reference/specs/autopopulate.md) β€” Jobs 2.0 reference diff --git a/src/how-to/alter-tables.md b/src/how-to/alter-tables.md new file mode 100644 index 00000000..c8d3c8a3 --- /dev/null +++ b/src/how-to/alter-tables.md @@ -0,0 +1,240 @@ +# Alter Tables + +Modify existing table structures for schema evolution. + +## Basic Alter + +Sync table definition with code: + +```python +# Update definition in code, then: +MyTable.alter() +``` + +This compares the current code definition with the database and generates `ALTER TABLE` statements. + +## What Can Be Altered + +| Change | Supported | +|--------|-----------| +| Add columns | Yes | +| Drop columns | Yes | +| Modify column types | Yes | +| Rename columns | Yes | +| Change defaults | Yes | +| Update table comment | Yes | +| **Modify primary key** | **No** | +| **Add/remove foreign keys** | **No** | +| **Modify indexes** | **No** | + +## Add a Column + +```python +# Original +@schema +class Subject(dj.Manual): + definition = """ + subject_id : varchar(16) + --- + species : varchar(32) + """ + +# Updated - add column +@schema +class Subject(dj.Manual): + definition = """ + subject_id : varchar(16) + --- + species : varchar(32) + weight = null : float32 # New column + """ + +# Apply change +Subject.alter() +``` + +## Drop a Column + +Remove from definition and alter: + +```python +# Column 'old_field' removed from definition +Subject.alter() +``` + +## Modify Column Type + +```python +# Change varchar(32) to varchar(100) +@schema +class Subject(dj.Manual): + definition = """ + subject_id : varchar(16) + --- + species : varchar(100) # Was varchar(32) + """ + +Subject.alter() +``` + +## Rename a Column + +DataJoint tracks renames via comment metadata: + +```python +# Original: species +# Renamed to: species_name +@schema +class Subject(dj.Manual): + definition = """ + subject_id : varchar(16) + --- + species_name : varchar(32) # Renamed from 'species' + """ + +Subject.alter() +``` + +## Skip Confirmation + +```python +# Apply without prompting +Subject.alter(prompt=False) +``` + +## View Pending Changes + +Check what would change without applying: + +```python +# Show current definition +print(Subject.describe()) + +# Compare with code definition +# (alter() shows diff before prompting) +``` + +## Unsupported Changes + +### Primary Key Changes + +Cannot modify primary key attributes: + +```python +# This will raise NotImplementedError +@schema +class Subject(dj.Manual): + definition = """ + new_id : uuid # Changed primary key + --- + species : varchar(32) + """ + +Subject.alter() # Error! +``` + +**Workaround**: Create new table, migrate data, drop old table. + +### Foreign Key Changes + +Cannot add or remove foreign key references: + +```python +# Cannot add new FK via alter() +definition = """ +subject_id : varchar(16) +--- +-> NewReference # Cannot add via alter +species : varchar(32) +""" +``` + +**Workaround**: Drop dependent tables, recreate with new structure. + +### Index Changes + +Cannot modify indexes via alter: + +```python +# Cannot add/remove indexes via alter() +definition = """ +subject_id : varchar(16) +--- +index(species) # Cannot add via alter +species : varchar(32) +""" +``` + +## Migration Pattern + +For unsupported changes, use this pattern: + +```python +# 1. Create new table with desired structure +@schema +class SubjectNew(dj.Manual): + definition = """ + subject_id : uuid # New primary key type + --- + species : varchar(32) + """ + +# 2. Migrate data +for row in Subject().to_dicts(): + SubjectNew.insert1({ + 'subject_id': uuid.uuid4(), # Generate new keys + 'species': row['species'] + }) + +# 3. Update dependent tables +# 4. Drop old table +# 5. Rename new table (if needed, via SQL) +``` + +## Add Job Metadata Columns + +For tables created before enabling job metadata: + +```python +from datajoint.migrate import add_job_metadata_columns + +# Dry run +add_job_metadata_columns(ProcessedData, dry_run=True) + +# Apply +add_job_metadata_columns(ProcessedData, dry_run=False) +``` + +## Best Practices + +### Plan Schema Carefully + +Primary keys and foreign keys cannot be changed easily. Design carefully upfront. + +### Use Migrations for Production + +For production systems, use versioned migration scripts: + +```python +# migrations/001_add_weight_column.py +def upgrade(): + Subject.alter(prompt=False) + +def downgrade(): + # Reverse the change + pass +``` + +### Test in Development First + +Always test schema changes on a copy: + +```python +# Clone schema for testing +test_schema = dj.Schema('test_' + schema.database) +``` + +## See Also + +- [Define Tables](define-tables.md) β€” Table definition syntax +- [Migrate from 0.x](migrate-from-0x.md) β€” Version migration diff --git a/src/how-to/backup-restore.md b/src/how-to/backup-restore.md new file mode 100644 index 00000000..543cb5a6 --- /dev/null +++ b/src/how-to/backup-restore.md @@ -0,0 +1,203 @@ +# Backup and Restore + +Protect your data with proper backup strategies. + +> **Tip:** [DataJoint.com](https://datajoint.com) provides automatic backups with point-in-time recovery as part of the managed service. + +## Overview + +A complete DataJoint backup includes: +1. **Database** β€” Table structures and relational data +2. **Object storage** β€” Large objects stored externally + +## Database Backup + +### Using mysqldump + +```bash +# Backup single schema +mysqldump -h host -u user -p database_name > backup.sql + +# Backup multiple schemas +mysqldump -h host -u user -p --databases schema1 schema2 > backup.sql + +# Backup all schemas +mysqldump -h host -u user -p --all-databases > backup.sql +``` + +### Include Routines and Triggers + +```bash +mysqldump -h host -u user -p \ + --routines \ + --triggers \ + database_name > backup.sql +``` + +### Compressed Backup + +```bash +mysqldump -h host -u user -p database_name | gzip > backup.sql.gz +``` + +## Database Restore + +```bash +# From SQL file +mysql -h host -u user -p database_name < backup.sql + +# From compressed file +gunzip < backup.sql.gz | mysql -h host -u user -p database_name +``` + +## Object Storage Backup + +### Filesystem Store + +```bash +# Sync to backup location +rsync -av /data/datajoint-store/ /backup/datajoint-store/ + +# With compression +tar -czvf store-backup.tar.gz /data/datajoint-store/ +``` + +### S3/MinIO Store + +```bash +# Using AWS CLI +aws s3 sync s3://source-bucket s3://backup-bucket + +# Using MinIO client +mc mirror source/bucket backup/bucket +``` + +## Backup Script Example + +```bash +#!/bin/bash +# backup-datajoint.sh + +DATE=$(date +%Y%m%d_%H%M%S) +BACKUP_DIR=/backups/datajoint + +# Backup database +mysqldump -h $DJ_HOST -u $DJ_USER -p$DJ_PASS \ + --databases my_schema \ + | gzip > $BACKUP_DIR/db_$DATE.sql.gz + +# Backup object storage +rsync -av /data/store/ $BACKUP_DIR/store_$DATE/ + +# Cleanup old backups (keep 7 days) +find $BACKUP_DIR -mtime +7 -delete + +echo "Backup completed: $DATE" +``` + +## Point-in-Time Recovery + +### Enable Binary Logging + +In MySQL configuration: + +```ini +[mysqld] +log-bin = mysql-bin +binlog-format = ROW +expire_logs_days = 7 +``` + +### Restore to Point in Time + +```bash +# Restore base backup +mysql -h host -u user -p < backup.sql + +# Apply binary logs up to specific time +mysqlbinlog --stop-datetime="2024-01-15 14:30:00" \ + mysql-bin.000001 mysql-bin.000002 \ + | mysql -h host -u user -p +``` + +## Schema-Level Export + +Export schema structure without data: + +```bash +# Structure only +mysqldump -h host -u user -p --no-data database_name > schema.sql +``` + +## Table-Level Backup + +Backup specific tables: + +```bash +mysqldump -h host -u user -p database_name table1 table2 > tables.sql +``` + +## DataJoint-Specific Considerations + +### Foreign Key Order + +When restoring, tables must be created in dependency order. mysqldump handles this automatically, but manual restoration may require: + +```bash +# Disable FK checks during restore +mysql -h host -u user -p -e "SET FOREIGN_KEY_CHECKS=0; SOURCE backup.sql; SET FOREIGN_KEY_CHECKS=1;" +``` + +### Jobs Tables + +Jobs tables (`~~table_name`) are recreated automatically. You can exclude them: + +```bash +# Exclude jobs tables from backup +mysqldump -h host -u user -p database_name \ + --ignore-table=database_name.~~table1 \ + --ignore-table=database_name.~~table2 \ + > backup.sql +``` + +### Blob Data + +Blobs stored internally (in database) are included in mysqldump. External objects need separate backup. + +## Verification + +### Verify Database Backup + +```bash +# Check backup file +gunzip -c backup.sql.gz | head -100 + +# Restore to test database +mysql -h host -u user -p test_restore < backup.sql +``` + +### Verify Object Storage + +```python +import datajoint as dj + +# Check external objects are accessible +for key in MyTable().keys(): + try: + (MyTable & key).fetch1('blob_column') + except Exception as e: + print(f"Missing: {key} - {e}") +``` + +## Disaster Recovery Plan + +1. **Regular backups**: Daily database, continuous object sync +2. **Offsite copies**: Replicate to different location/cloud +3. **Test restores**: Monthly restore verification +4. **Document procedures**: Written runbooks for recovery +5. **Monitor backups**: Alert on backup failures + +## See Also + +- [Configure Object Storage](configure-storage.md) β€” Storage setup +- [Manage Large Data](manage-large-data.md) β€” Object storage patterns diff --git a/src/how-to/configure-database.md b/src/how-to/configure-database.md new file mode 100644 index 00000000..867ee70d --- /dev/null +++ b/src/how-to/configure-database.md @@ -0,0 +1,181 @@ +# Configure Database Connection + +Set up your DataJoint database connection. + +> **Tip:** [DataJoint.com](https://datajoint.com) handles database configuration automatically with fully managed infrastructure and support. + +## Configuration Structure + +DataJoint separates configuration into two parts: + +1. **`datajoint.json`** β€” Non-sensitive settings (checked into version control) +2. **`.secrets/` directory** β€” Credentials and secrets (never committed) + +## Project Configuration (`datajoint.json`) + +Create `datajoint.json` in your project root for non-sensitive settings: + +```json +{ + "database.host": "db.example.com", + "database.port": 3306, + "database.use_tls": true, + "safemode": true +} +``` + +This file should be committed to version control. + +## Secrets Directory (`.secrets/`) + +Store credentials in `.secrets/datajoint.json`: + +```json +{ + "database.user": "myuser", + "database.password": "mypassword" +} +``` + +**Important:** Add `.secrets/` to your `.gitignore`: + +```gitignore +.secrets/ +``` + +## Environment Variables + +For CI/CD and production, use environment variables: + +```bash +export DJ_HOST=db.example.com +export DJ_USER=myuser +export DJ_PASS=mypassword +``` + +Environment variables take precedence over config files. + +## Configuration Settings + +| Setting | Environment | Default | Description | +|---------|-------------|---------|-------------| +| `database.host` | `DJ_HOST` | `localhost` | Database server hostname | +| `database.port` | `DJ_PORT` | `3306` | Database server port | +| `database.user` | `DJ_USER` | β€” | Database username | +| `database.password` | `DJ_PASS` | β€” | Database password | +| `database.use_tls` | `DJ_TLS` | `True` | Use TLS encryption | +| `database.reconnect` | β€” | `True` | Auto-reconnect on timeout | +| `safemode` | β€” | `True` | Prompt before destructive operations | + +## Test Connection + +```python +import datajoint as dj + +# Connects using configured credentials +conn = dj.conn() +print(f"Connected to {conn.host}") +``` + +## Programmatic Configuration + +For scripts, you can set configuration programmatically: + +```python +import datajoint as dj + +dj.config['database.host'] = 'localhost' +# Credentials from environment or secrets file +``` + +## Temporary Override + +```python +with dj.config.override(database={'host': 'test-server'}): + # Uses test-server for this block only + conn = dj.conn() +``` + +## Configuration Precedence + +1. Programmatic settings (highest priority) +2. Environment variables +3. `.secrets/datajoint.json` +4. `datajoint.json` +5. Default values (lowest priority) + +## TLS Configuration + +For production, always use TLS: + +```json +{ + "database.use_tls": true +} +``` + +For local development without TLS: + +```json +{ + "database.use_tls": false +} +``` + +## Connection Lifecycle + +### Persistent Connection (Default) + +DataJoint uses a persistent singleton connection by default: + +```python +import datajoint as dj + +# First call establishes connection +conn = dj.conn() + +# Subsequent calls return the same connection +conn2 = dj.conn() # Same as conn + +# Reset to create a new connection +conn3 = dj.conn(reset=True) # New connection +``` + +This is ideal for interactive sessions and notebooks. + +### Context Manager (Explicit Cleanup) + +For serverless environments (AWS Lambda, Cloud Functions) or when you need explicit connection lifecycle control, use the context manager: + +```python +import datajoint as dj + +with dj.Connection(host, user, password) as conn: + schema = dj.Schema('my_schema', connection=conn) + MyTable().insert(data) +# Connection automatically closed when exiting the block +``` + +The connection closes automatically even if an exception occurs: + +```python +try: + with dj.Connection(**creds) as conn: + schema = dj.Schema('my_schema', connection=conn) + MyTable().insert(data) + raise SomeError() +except SomeError: + pass +# Connection is still closed properly +``` + +### Manual Close + +You can also close a connection explicitly: + +```python +conn = dj.conn() +# ... do work ... +conn.close() +``` + diff --git a/src/how-to/configure-storage.md b/src/how-to/configure-storage.md new file mode 100644 index 00000000..501318a3 --- /dev/null +++ b/src/how-to/configure-storage.md @@ -0,0 +1,378 @@ +# Configure Object Stores + +Set up S3, MinIO, or filesystem storage for DataJoint's Object-Augmented Schema (OAS). + +> **Tip:** [DataJoint.com](https://datajoint.com) provides pre-configured object stores integrated with your databaseβ€”no setup required. + +## Overview + +DataJoint's Object-Augmented Schema (OAS) integrates relational tables with object storage as a single coherent system. Large data objects (arrays, files, Zarr datasets) are stored in file systems or cloud storage while maintaining full referential integrity with the relational database. + +**Storage models:** + +- **Hash-addressed** and **schema-addressed** storage are **integrated** into the OAS. DataJoint manages paths, lifecycle, integrity, garbage collection, transaction safety, and deduplication. +- **Filepath** storage stores only path strings. DataJoint provides no lifecycle management, garbage collection, transaction safety, or deduplication. Users control file creation, organization, and lifecycle. + +Storage is configured per-project using named stores. Each store can be used for: + +- **Hash-addressed storage** (``, ``) β€” content-addressed with deduplication using `_hash/` section +- **Schema-addressed storage** (``, ``) β€” key-based paths with streaming access using `_schema/` section +- **Filepath storage** (``) β€” user-managed paths anywhere in the store **except** `_hash/` and `_schema/` (reserved for DataJoint) + +Multiple stores can be configured for different data types or storage tiers. One store is designated as the default. + +## Configuration Methods + +DataJoint loads configuration in priority order: + +1. **Environment variables** (highest priority) +2. **Secrets directory** (`.secrets/`) +3. **Config file** (`datajoint.json`) +4. **Defaults** (lowest priority) + +## Single Store Configuration + +### File System Store + +For local or network-mounted storage: + +```json +{ + "stores": { + "default": "main", + "main": { + "protocol": "file", + "location": "/data/my-project/production" + } + } +} +``` + +Paths will be: + +- Hash: `/data/my-project/production/_hash/{schema}/{hash}` +- Schema: `/data/my-project/production/_schema/{schema}/{table}/{key}/` + +### S3 Store + +For Amazon S3 or S3-compatible storage: + +```json +{ + "stores": { + "default": "main", + "main": { + "protocol": "s3", + "endpoint": "s3.amazonaws.com", + "bucket": "my-bucket", + "location": "my-project/production", + "secure": true + } + } +} +``` + +Store credentials separately in `.secrets/`: + +``` +.secrets/ +β”œβ”€β”€ stores.main.access_key +└── stores.main.secret_key +``` + +Paths will be: + +- Hash: `s3://my-bucket/my-project/production/_hash/{schema}/{hash}` +- Schema: `s3://my-bucket/my-project/production/_schema/{schema}/{table}/{key}/` + +### MinIO Store + +MinIO uses the S3 protocol with a custom endpoint: + +```json +{ + "stores": { + "default": "main", + "main": { + "protocol": "s3", + "endpoint": "minio.example.com:9000", + "bucket": "datajoint", + "location": "lab-data", + "secure": false + } + } +} +``` + +## Multiple Stores Configuration + +Define multiple stores for different data types or storage tiers: + +```json +{ + "stores": { + "default": "main", + "main": { + "protocol": "file", + "location": "/data/my-project/main", + "partition_pattern": "subject_id/session_date" + }, + "raw": { + "protocol": "file", + "location": "/data/my-project/raw", + "subfolding": [2, 2] + }, + "archive": { + "protocol": "s3", + "endpoint": "s3.amazonaws.com", + "bucket": "archive-bucket", + "location": "my-project/long-term" + } + } +} +``` + +Store credentials in `.secrets/`: + +``` +.secrets/ +β”œβ”€β”€ stores.archive.access_key +└── stores.archive.secret_key +``` + +Use named stores in table definitions: + +```python +@schema +class Recording(dj.Manual): + definition = """ + recording_id : uuid + --- + raw_data : # Hash: _hash/{schema}/{hash} + zarr_scan : # Schema: _schema/{schema}/{table}/{key}/ + summary : # Uses default store (main) + old_data : # Archive store, hash-addressed + """ +``` + +Notice that `` and `` both use the "raw" store, just different `_hash` and `_schema` sections. + +**Example paths with partitioning:** + +For a Recording with `subject_id=042`, `session_date=2024-01-15` in the main store: +``` +/data/my-project/main/_schema/subject_id=042/session_date=2024-01-15/experiment/Recording/recording_id=uuid-value/zarr_scan.x8f2a9b1.zarr +``` + +Without those attributes, it follows normal structure: +``` +/data/my-project/main/_schema/experiment/Recording/recording_id=uuid-value/zarr_scan.x8f2a9b1.zarr +``` + +## Verify Configuration + +```python +import datajoint as dj + +# Check default store +spec = dj.config.get_store_spec() # Uses stores.default +print(spec) + +# Check named store +spec = dj.config.get_store_spec("archive") +print(spec) + +# List all configured stores +print(dj.config.stores.keys()) +``` + +## Configuration Options + +| Option | Required | Description | +|--------|----------|-------------| +| `stores.default` | Yes | Name of the default store | +| `stores..protocol` | Yes | `file`, `s3`, `gcs`, or `azure` | +| `stores..location` | Yes | Base path or prefix (includes project context) | +| `stores..bucket` | S3/GCS | Bucket name | +| `stores..endpoint` | S3 | S3 endpoint URL | +| `stores..secure` | No | Use HTTPS (default: true) | +| `stores..access_key` | S3 | Access key ID (store in `.secrets/`) | +| `stores..secret_key` | S3 | Secret access key (store in `.secrets/`) | +| `stores..subfolding` | No | Hash-addressed hierarchy: `[2, 2]` for 2-level nesting (default: no subfolding) | +| `stores..partition_pattern` | No | Schema-addressed path partitioning: `"subject_id/session_date"` (default: no partitioning) | +| `stores..token_length` | No | Random token length for schema-addressed filenames (default: `8`) | + +## Subfolding (Hash-Addressed Storage Only) + +Hash-addressed storage (``, ``) stores content using a Base32-encoded hash as the filename. By default, all files are stored in a flat directory structure: + +``` +_hash/{schema}/abcdefghijklmnopqrstuvwxyz +``` + +Some filesystems perform poorly with large directories (thousands of files). Subfolding creates a directory hierarchy to distribute files: + +```json +{ + "stores": { + "default": "main", + "main": { + "protocol": "file", + "location": "/data/store", + "project_name": "my_project", + "subfolding": [2, 2] + } + } +} +``` + +With `[2, 2]` subfolding, hash-addressed paths become: + +``` +_hash/{schema}/ab/cd/abcdefghijklmnopqrstuvwxyz +``` + +Schema-addressed storage (``, ``) does not use subfoldingβ€”it uses key-based paths: + +``` +{location}/_schema/{partition}/{schema}/{table}/{key}/{field_name}.{token}.{ext} +``` + +### Filesystem Recommendations + +| Filesystem | Subfolding Needed | Notes | +|------------|-------------------|-------| +| ext3 | Yes | Limited directory indexing | +| FAT32/exFAT | Yes | Linear directory scans | +| NFS | Yes | Network latency amplifies directory lookups | +| CIFS/SMB | Yes | Windows network shares | +| ext4 | No | HTree indexing handles large directories | +| XFS | No | B+ tree directories scale well | +| ZFS | No | Efficient directory handling | +| Btrfs | No | B-tree based | +| S3/MinIO | No | Object storage uses hash-based lookups | +| GCS | No | Object storage | +| Azure Blob | No | Object storage | + +**Recommendation:** Use `[2, 2]` for network-mounted filesystems and legacy systems. +Modern local filesystems and cloud object storage work well without subfolding. + +## URL Representation + +DataJoint uses consistent URL representation for all storage backends internally. This means: + +- Local filesystem paths are represented as `file://` URLs +- S3 paths use `s3://bucket/path` +- GCS paths use `gs://bucket/path` +- Azure paths use `az://container/path` + +You can use either format when specifying paths: + +```python +# Both are equivalent for local files +"/data/myfile.dat" +"file:///data/myfile.dat" +``` + +This unified approach enables: + +- **Consistent internal handling** across all storage types +- **Seamless switching** between local and cloud storage +- **Integration with fsspec** for streaming access + +## Customizing Storage Sections + +Each store is divided into sections for different storage types. By default, DataJoint uses `_hash/` for hash-addressed storage and `_schema/` for schema-addressed storage. You can customize the path prefix for each section using the `*_prefix` configuration parameters to map DataJoint to existing storage layouts: + +```json +{ + "stores": { + "legacy": { + "protocol": "file", + "location": "/data/existing_storage", + "hash_prefix": "content_addressed", + "schema_prefix": "structured_data", + "filepath_prefix": "raw_files" + } + } +} +``` + +**Requirements:** + +- Sections must be mutually exclusive (path prefixes cannot nest) +- The `hash_prefix` and `schema_prefix` sections are reserved for DataJoint-managed storage +- The `filepath_prefix` is optional (`null` = unrestricted, or set a required prefix) + +**Example with hierarchical layout:** + +```json +{ + "stores": { + "organized": { + "protocol": "s3", + "endpoint": "s3.amazonaws.com", + "bucket": "neuroscience-data", + "location": "lab-project-2024", + "hash_prefix": "managed/blobs", // Path prefix for hash section + "schema_prefix": "managed/arrays", // Path prefix for schema section + "filepath_prefix": "imported" // Path prefix for filepath section + } + } +} +``` + +Storage section paths become: + +- Hash: `s3://neuroscience-data/lab-project-2024/managed/blobs/{schema}/{hash}` +- Schema: `s3://neuroscience-data/lab-project-2024/managed/arrays/{schema}/{table}/{key}/` +- Filepath: `s3://neuroscience-data/lab-project-2024/imported/{user_path}` + +## Reserved Sections and Filepath Storage + +DataJoint reserves sections within each store for managed storage. These sections are defined by prefix configuration parameters: + +- **Hash-addressed section** (configured via `hash_prefix`, default: `_hash/`) β€” Content-addressed storage for `` and `` with deduplication +- **Schema-addressed section** (configured via `schema_prefix`, default: `_schema/`) β€” Key-based storage for `` and `` with streaming access + +### User-Managed Filepath Storage + +The `` codec stores paths to files that you manage. DataJoint does not manage lifecycle (no garbage collection), integrity (no transaction safety), or deduplication for filepath storage. You can reference existing files or create new onesβ€”DataJoint simply stores the path string. Files can be anywhere in the store **except** the reserved sections: + +```python +@schema +class RawData(dj.Manual): + definition = """ + session_id : int + --- + recording : # User-managed file path + """ + +# Valid paths (user-managed) +table.insert1({'session_id': 1, 'recording': 'subject01/session001/data.bin'}) # Existing or new file +table.insert1({'session_id': 2, 'recording': 'raw/experiment_2024/data.nwb'}) # Existing or new file + +# Invalid paths (reserved for DataJoint - will raise ValueError) +# These use the default prefixes (_hash and _schema) +table.insert1({'session_id': 3, 'recording': '_hash/abc123...'}) # Error! +table.insert1({'session_id': 4, 'recording': '_schema/myschema/...'}) # Error! + +# If you configured custom prefixes like "content_addressed", those would also be blocked +# table.insert1({'session_id': 5, 'recording': 'content_addressed/file.dat'}) # Error! +``` + +**Key characteristics of ``:** + +- Stores path string only (DataJoint does not manage the files) +- No lifecycle management: no garbage collection, no transaction safety, no deduplication +- User controls file creation, organization, and deletion +- Can reference existing files or create new ones +- Returns ObjectRef for lazy access on fetch +- Validates file exists on insert +- Cannot use reserved sections (configured by `hash_prefix` and `schema_prefix`) +- Can be restricted to specific prefix using `filepath_prefix` configuration + +## See Also + +- [Use Object Storage](use-object-storage.md) β€” When and how to use object storage +- [Manage Large Data](manage-large-data.md) β€” Working with blobs and objects diff --git a/src/how-to/create-custom-codec.md b/src/how-to/create-custom-codec.md new file mode 100644 index 00000000..fd2ac487 --- /dev/null +++ b/src/how-to/create-custom-codec.md @@ -0,0 +1,235 @@ +# Create Custom Codecs + +Define domain-specific types for seamless storage and retrieval. + +## Overview + +Codecs transform Python objects for storage. Create custom codecs for: + +- Domain-specific data types (graphs, images, alignments) +- Specialized serialization formats +- Integration with external libraries + +## Basic Codec Structure + +```python +import datajoint as dj + +class GraphCodec(dj.Codec): + """Store NetworkX graphs.""" + + name = "graph" # Used as in definitions + + def get_dtype(self, is_store: bool) -> str: + return "" # Delegate to blob for serialization + + def encode(self, value, *, key=None, store_name=None): + import networkx as nx + assert isinstance(value, nx.Graph) + return list(value.edges) + + def decode(self, stored, *, key=None): + import networkx as nx + return nx.Graph(stored) +``` + +## Use in Table Definition + +```python +@schema +class Connectivity(dj.Manual): + definition = """ + conn_id : int + --- + network : # Uses GraphCodec + network_large : # External storage + """ +``` + +## Required Methods + +### `get_dtype(is_store)` + +Return the storage type: + +- `is_store=False`: Inline storage (in database column) +- `is_store=True`: Object store (with `@` modifier) + +```python +def get_dtype(self, is_store: bool) -> str: + if is_store: + return "" # Hash-addressed storage + return "bytes" # Inline database blob +``` + +Common return values: + +- `"bytes"` β€” Binary in database +- `"json"` β€” JSON in database +- `""` β€” Chain to blob codec (hash-addressed when `@`) +- `""` β€” Hash-addressed storage + +### `encode(value, *, key=None, store_name=None)` + +Convert Python object to storable format: + +```python +def encode(self, value, *, key=None, store_name=None): + # value: Python object to store + # key: Primary key dict (for path construction) + # store_name: Target store name + return serialized_representation +``` + +### `decode(stored, *, key=None)` + +Reconstruct Python object: + +```python +def decode(self, stored, *, key=None): + # stored: Data from storage + # key: Primary key dict + return python_object +``` + +## Optional: Validation + +Override `validate()` for type checking: + +```python +def validate(self, value): + import networkx as nx + if not isinstance(value, nx.Graph): + raise TypeError(f"Expected nx.Graph, got {type(value).__name__}") +``` + +## Codec Chaining + +Codecs can delegate to other codecs: + +```python +class ImageCodec(dj.Codec): + name = "image" + + def get_dtype(self, is_store: bool) -> str: + return "" # Chain to blob codec + + def encode(self, value, *, key=None, store_name=None): + # Convert PIL Image to numpy array + # Blob codec handles numpy serialization + return np.array(value) + + def decode(self, stored, *, key=None): + from PIL import Image + return Image.fromarray(stored) +``` + +## Store-Only Codecs + +Some codecs require object storage (@ modifier): + +```python +class ZarrCodec(dj.Codec): + name = "zarr" + + def get_dtype(self, is_store: bool) -> str: + if not is_store: + raise DataJointError(" requires @ (store only)") + return "" # Schema-addressed storage + + def encode(self, path, *, key=None, store_name=None): + return path # Path to zarr directory + + def decode(self, stored, *, key=None): + return stored # Returns ObjectRef for lazy access +``` + +For custom file formats, consider inheriting from `SchemaCodec`: + +```python +class ParquetCodec(dj.SchemaCodec): + """Store DataFrames as Parquet files.""" + name = "parquet" + + # get_dtype inherited: requires @, returns "json" + + def encode(self, df, *, key=None, store_name=None): + schema, table, field, pk = self._extract_context(key) + path, _ = self._build_path(schema, table, field, pk, ext=".parquet") + backend = self._get_backend(store_name) + # ... upload parquet file + return {"path": path, "store": store_name, "shape": list(df.shape)} + + def decode(self, stored, *, key=None): + return ParquetRef(stored, self._get_backend(stored.get("store"))) +``` + +## Auto-Registration + +Codecs register automatically when defined: + +```python +class MyCodec(dj.Codec): + name = "mytype" # Registers as + ... + +# Now usable in table definitions: +# my_attr : +``` + +Skip registration for abstract bases: + +```python +class BaseCodec(dj.Codec, register=False): + # Abstract base, not registered + pass +``` + +## Complete Example + +```python +import datajoint as dj +import SimpleITK as sitk +import numpy as np + +class MedicalImageCodec(dj.Codec): + """Store SimpleITK medical images with metadata.""" + + name = "medimage" + + def get_dtype(self, is_store: bool) -> str: + return "" if is_store else "" + + def encode(self, image, *, key=None, store_name=None): + return { + 'array': sitk.GetArrayFromImage(image), + 'spacing': image.GetSpacing(), + 'origin': image.GetOrigin(), + 'direction': image.GetDirection(), + } + + def decode(self, stored, *, key=None): + image = sitk.GetImageFromArray(stored['array']) + image.SetSpacing(stored['spacing']) + image.SetOrigin(stored['origin']) + image.SetDirection(stored['direction']) + return image + + def validate(self, value): + if not isinstance(value, sitk.Image): + raise TypeError(f"Expected sitk.Image, got {type(value).__name__}") + + +@schema +class Scan(dj.Manual): + definition = """ + scan_id : uuid + --- + ct_image : # CT scan with metadata + """ +``` + +## See Also + +- [Use Object Storage](use-object-storage.md) β€” Storage patterns +- [Manage Large Data](manage-large-data.md) β€” Working with large objects diff --git a/src/how-to/define-tables.md b/src/how-to/define-tables.md new file mode 100644 index 00000000..cc6546be --- /dev/null +++ b/src/how-to/define-tables.md @@ -0,0 +1,321 @@ +# Define Tables + +Create DataJoint table classes with proper definitions. + +## Create a Schema + +```python +import datajoint as dj + +schema = dj.Schema('my_schema') # Creates schema in database if it doesn't exist +``` + +The `Schema` object connects to the database and creates the schema (database) if it doesn't already exist. + +## Basic Table Structure + +```python +@schema +class MyTable(dj.Manual): + definition = """ + # Table comment (optional) + primary_attr : type # attribute comment + --- + secondary_attr : type # attribute comment + optional_attr = null : type + """ +``` + +## Table Types + +| Type | Base Class | Purpose | +|------|------------|---------| +| Manual | `dj.Manual` | User-entered data | +| Lookup | `dj.Lookup` | Reference data with `contents` | +| Imported | `dj.Imported` | Data from external sources | +| Computed | `dj.Computed` | Derived data | +| Part | `dj.Part` | Child of master table | + +## Primary Key (Above `---`) + +```python +definition = """ +subject_id : varchar(16) # Subject identifier +session_idx : uint16 # Session number +--- +... +""" +``` + +Primary key attributes: + +- Cannot be NULL +- Must be unique together +- Cannot be changed after insertion + +## Secondary Attributes (Below `---`) + +```python +definition = """ +... +--- +session_date : date # Required attribute +notes = '' : varchar(1000) # Optional with default +score = null : float32 # Nullable attribute +""" +``` + +## Default Values and Nullable Attributes + +Default values are specified with `= value` before the type: + +```python +definition = """ +subject_id : varchar(16) +--- +weight = null : float32 # Nullable (default is NULL) +notes = '' : varchar(1000) # Default empty string +is_active = 1 : bool # Default true +created = CURRENT_TIMESTAMP : timestamp +""" +``` + +**Key rules:** + +- The **only** way to make an attribute nullable is `= null` +- Attributes without defaults are required (NOT NULL) +- Primary key attributes cannot be nullable +- Primary key attributes cannot have static defaults + +**Timestamp defaults:** + +Primary keys can use time-dependent defaults like `CURRENT_TIMESTAMP`: + +```python +definition = """ +created_at = CURRENT_TIMESTAMP : timestamp(6) # Microsecond precision +--- +data : +""" +``` + +Timestamp precision options: + +- `timestamp` or `datetime` β€” Second precision +- `timestamp(3)` or `datetime(3)` β€” Millisecond precision +- `timestamp(6)` or `datetime(6)` β€” Microsecond precision + +## Auto-Increment (Not Recommended) + +DataJoint core types do not support `AUTO_INCREMENT`. This is intentionalβ€”explicit key values enforce entity integrity and prevent silent creation of duplicate records. + +Use `uuid` or natural keys instead: + +```python +definition = """ +recording_id : uuid # Globally unique, client-generated +--- +... +""" +``` + +If you must use auto-increment, native MySQL types allow it (with a warning): + +```python +definition = """ +record_id : int unsigned auto_increment # Native type +--- +... +""" +``` + +See [Design Primary Keys](design-primary-keys.md) for detailed guidance on key selection and why DataJoint avoids auto-increment. + +## Core DataJoint Types + +| Type | Description | +|------|-------------| +| `bool` | Boolean (true/false) | +| `int8`, `int16`, `int32`, `int64` | Signed integers | +| `uint8`, `uint16`, `uint32`, `uint64` | Unsigned integers | +| `float32`, `float64` | Floating point | +| `decimal(m,n)` | Fixed precision decimal | +| `varchar(n)` | Variable-length string | +| `char(n)` | Fixed-length string | +| `date` | Date (YYYY-MM-DD) | +| `datetime` | Date and time | +| `datetime(3)` | With millisecond precision | +| `datetime(6)` | With microsecond precision | +| `uuid` | UUID type | +| `enum('a', 'b', 'c')` | Enumerated values | +| `json` | JSON data | +| `bytes` | Raw binary data | + +## Built-in Codecs + +Codecs serialize Python objects to database storage. Use angle brackets for codec types: + +| Codec | Description | +|-------|-------------| +| `` | Serialized Python objects (NumPy arrays, etc.) stored in database | +| `` | Serialized objects in object storage | +| `` | File attachments in database | +| `` | File attachments in object storage | +| `` | Files/folders via ObjectRef (path-addressed, supports Zarr/HDF5) | + +Example: + +```python +definition = """ +recording_id : uuid +--- +neural_data : # NumPy array in 'raw' store +config_file : # Attached file in database +parameters : json # JSON data (core type, no brackets) +""" +``` + +## Native Database Types + +You can also use native MySQL/MariaDB types directly when needed: + +```python +definition = """ +record_id : int unsigned # Native MySQL type +data : mediumblob # For larger binary data +description : text # Unlimited text +""" +``` + +Native types are flagged with a warning at declaration time but are allowed. Core DataJoint types (like `int32`, `float64`) are portable and recommended for most use cases. Native database types provide access to database-specific features when needed. + +## Foreign Keys + +```python +@schema +class Session(dj.Manual): + definition = """ + -> Subject # References Subject table + session_idx : uint16 + --- + session_date : date + """ +``` + +The `->` inherits primary key attributes from the referenced table. + +## Lookup Tables with Contents + +```python +@schema +class TaskType(dj.Lookup): + definition = """ + task_type : varchar(32) + --- + description : varchar(200) + """ + contents = [ + {'task_type': 'detection', 'description': 'Detect target stimulus'}, + {'task_type': 'discrimination', 'description': 'Distinguish between stimuli'}, + ] +``` + +## Part Tables + +```python +@schema +class Session(dj.Manual): + definition = """ + -> Subject + session_idx : uint16 + --- + session_date : date + """ + + class Trial(dj.Part): + definition = """ + -> master + trial_idx : uint16 + --- + outcome : enum('hit', 'miss') + reaction_time : float32 + """ +``` + +## Computed Tables + +```python +@schema +class SessionStats(dj.Computed): + definition = """ + -> Session + --- + n_trials : uint32 + hit_rate : float32 + """ + + def make(self, key): + trials = (Session.Trial & key).to_dicts() + self.insert1({ + **key, + 'n_trials': len(trials), + 'hit_rate': sum(t['outcome'] == 'hit' for t in trials) / len(trials) + }) +``` + +## Indexes + +Declare indexes at the end of the definition, after all attributes: + +```python +definition = """ +subject_id : varchar(16) +session_idx : uint16 +--- +session_date : date +experimenter : varchar(50) +index (session_date) # Index for faster queries +index (experimenter) # Another index +unique index (external_id) # Unique constraint +""" +``` + +## Declaring Tables + +Tables are declared in the database when the `@schema` decorator applies to the class: + +```python +@schema # Table is declared here +class Session(dj.Manual): + definition = """ + session_id : uint16 + --- + session_date : date + """ +``` + +The decorator reads the `definition` string, parses it, and creates the corresponding table in the database if it doesn't exist. + +## Dropping Tables and Schemas + +During prototyping (before data are populated), you can drop and recreate tables: + +```python +# Drop a single table +Session.drop() + +# Drop entire schema (all tables) +schema.drop() +``` + +**Warning:** These operations permanently delete data. Use only during development. + +## View Table Definition + +```python +# Show SQL definition +print(Session().describe()) + +# Show heading +print(Session().heading) +``` diff --git a/src/how-to/delete-data.md b/src/how-to/delete-data.md new file mode 100644 index 00000000..da44369d --- /dev/null +++ b/src/how-to/delete-data.md @@ -0,0 +1,196 @@ +# Delete Data + +Remove data safely with proper cascade handling. + +## Basic Delete + +Delete rows matching a restriction: + +```python +# Delete specific subject +(Subject & {'subject_id': 'M001'}).delete() + +# Delete with condition +(Session & 'session_date < "2024-01-01"').delete() +``` + +## Cascade Behavior + +Deleting a row automatically cascades to all dependent tables: + +```python +# Deletes subject AND all their sessions AND all trials +(Subject & {'subject_id': 'M001'}).delete() +``` + +This maintains referential integrityβ€”no orphaned records remain. + +## Confirmation Prompt + +The `prompt` parameter controls confirmation behavior: + +```python +# Uses dj.config['safemode'] setting (default behavior) +(Subject & key).delete() + +# Explicitly skip confirmation +(Subject & key).delete(prompt=False) + +# Explicitly require confirmation +(Subject & key).delete(prompt=True) +``` + +When prompted, you'll see what will be deleted: + +``` +About to delete: + 1 rows from `lab`.`subject` + 5 rows from `lab`.`session` + 127 rows from `lab`.`trial` + +Proceed? [yes, No]: +``` + +## Safe Mode Configuration + +Control the default prompting behavior: + +```python +import datajoint as dj + +# Check current setting +print(dj.config['safemode']) + +# Disable prompts globally (use with caution) +dj.config['safemode'] = False + +# Re-enable prompts +dj.config['safemode'] = True +``` + +Or temporarily override: + +```python +with dj.config.override(safemode=False): + (Subject & restriction).delete() +``` + +## Transaction Handling + +Deletes are atomicβ€”all cascading deletes succeed or none do: + +```python +# All-or-nothing delete (default) +(Subject & restriction).delete(transaction=True) +``` + +Within an existing transaction: + +```python +with dj.conn().transaction: + (Table1 & key1).delete(transaction=False) + (Table2 & key2).delete(transaction=False) + Table3.insert(rows) +``` + +## Part Tables + +Part tables cannot be deleted directly by default (master-part integrity): + +```python +# This raises an error +Session.Trial.delete() # DataJointError + +# Delete from master instead (cascades to parts) +(Session & key).delete() +``` + +Use `part_integrity` to control this behavior: + +```python +# Allow direct deletion (breaks master-part integrity) +(Session.Trial & key).delete(part_integrity="ignore") + +# Delete parts AND cascade up to delete master +(Session.Trial & key).delete(part_integrity="cascade") +``` + +| Policy | Behavior | +|--------|----------| +| `"enforce"` | (default) Error if parts deleted without masters | +| `"ignore"` | Allow deleting parts without masters | +| `"cascade"` | Also delete masters when parts are deleted | + +## Quick Delete + +Delete without cascade (fails if dependent rows exist): + +```python +# Only works if no dependent tables have matching rows +(Subject & key).delete_quick() +``` + +## Delete Patterns + +### By Primary Key + +```python +(Session & {'subject_id': 'M001', 'session_idx': 1}).delete() +``` + +### By Condition + +```python +(Trial & 'outcome = "miss"').delete() +``` + +### By Join + +```python +# Delete trials from sessions before 2024 +old_sessions = Session & 'session_date < "2024-01-01"' +(Trial & old_sessions).delete() +``` + +### All Rows + +```python +# Delete everything in table (and dependents) +MyTable.delete() +``` + +## The Recomputation Pattern + +When source data needs correction, use **delete β†’ insert β†’ populate**: + +```python +key = {'subject_id': 'M001', 'session_idx': 1} + +# 1. Delete cascades to computed tables +(Session & key).delete(prompt=False) + +# 2. Reinsert with corrected data +with dj.conn().transaction: + Session.insert1({**key, 'session_date': '2024-01-08', 'duration': 40.0}) + Session.Trial.insert(corrected_trials) + +# 3. Recompute derived data +ProcessedData.populate() +``` + +This ensures all derived data remains consistent with source data. + +## Return Value + +`delete()` returns the count of deleted rows from the primary table: + +```python +count = (Subject & restriction).delete(prompt=False) +print(f"Deleted {count} subjects") +``` + +## See Also + +- [Model Relationships](model-relationships.ipynb) β€” Foreign key patterns +- [Insert Data](insert-data.md) β€” Adding data to tables +- [Run Computations](run-computations.md) β€” Recomputing after changes diff --git a/src/how-to/design-primary-keys.md b/src/how-to/design-primary-keys.md new file mode 100644 index 00000000..37960b2d --- /dev/null +++ b/src/how-to/design-primary-keys.md @@ -0,0 +1,184 @@ +# Design Primary Keys + +Choose effective primary keys for your tables. + +## Primary Key Principles + +Primary key attributes: + +- Uniquely identify each entity +- Cannot be NULL +- Cannot be changed after insertion +- Are inherited by dependent tables via foreign keys + +## Natural Keys + +Use meaningful identifiers when they exist: + +```python +@schema +class Subject(dj.Manual): + definition = """ + subject_id : varchar(16) # Lab-assigned ID like 'M001' + --- + species : varchar(32) + """ +``` + +**Good candidates:** +- Lab-assigned IDs +- Standard identifiers (NCBI accession, DOI) +- Meaningful codes with enforced uniqueness + +## Composite Keys + +Combine attributes when a single attribute isn't unique: + +```python +@schema +class Session(dj.Manual): + definition = """ + -> Subject + session_idx : uint16 # Session number within subject + --- + session_date : date + """ +``` + +The primary key is `(subject_id, session_idx)`. + +## Surrogate Keys + +Use UUIDs when natural keys don't exist: + +```python +@schema +class Experiment(dj.Manual): + definition = """ + experiment_id : uuid + --- + description : varchar(500) + """ +``` + +Generate UUIDs: + +```python +import uuid + +Experiment.insert1({ + 'experiment_id': uuid.uuid4(), + 'description': 'Pilot study' +}) +``` + +## Why DataJoint Avoids Auto-Increment + +DataJoint discourages `auto_increment` for primary keys: + +1. **Encourages lazy design** β€” Users treat it as "row number" rather than thinking about what uniquely identifies the entity in their domain. + +2. **Incompatible with composite keys** β€” DataJoint schemas routinely use composite keys like `(subject_id, session_idx, trial_idx)`. MySQL allows only one auto_increment column per table, and it must be first in the key. + +3. **Breaks reproducibility** β€” Auto_increment values depend on insertion order. Rebuilding a pipeline produces different IDs. + +4. **No client-server handshake** β€” The client discovers the ID only *after* insertion, complicating error handling and concurrent access. + +5. **Meaningless foreign keys** β€” Downstream tables inherit opaque integers rather than traceable lineage. + +**Instead, use:** +- Natural keys that identify entities in your domain +- UUIDs when no natural identifier exists +- Composite keys combining foreign keys with sequence numbers + +## Foreign Keys in Primary Key + +Foreign keys above the `---` become part of the primary key: + +```python +@schema +class Trial(dj.Manual): + definition = """ + -> Session # In primary key + trial_idx : uint16 # In primary key + --- + -> Stimulus # NOT in primary key + outcome : enum('hit', 'miss') + """ +``` + +## Key Design Guidelines + +### Keep Keys Small + +Prefer `uint16` over `int64` when the range allows: + +```python +# Good: Appropriate size +session_idx : uint16 # Max 65,535 sessions per subject + +# Avoid: Unnecessarily large +session_idx : int64 # Wastes space, slower joins +``` + +### Use Fixed-Width for Joins + +Fixed-width types join faster: + +```python +# Good: Fixed width +subject_id : char(8) + +# Acceptable: Variable width +subject_id : varchar(16) +``` + +### Avoid Dates as Primary Keys + +Dates alone rarely guarantee uniqueness: + +```python +# Bad: Date might not be unique +session_date : date +--- +... + +# Good: Add a sequence number +-> Subject +session_idx : uint16 +--- +session_date : date +``` + +### Avoid Computed Values + +Primary keys should be stable inputs, not derived: + +```python +# Bad: Derived from other data +hash_id : varchar(64) # MD5 of some content + +# Good: Assigned identifier +recording_id : uuid +``` + +## Migration Considerations + +Once a table has data, primary keys cannot be changed. Plan carefully: + +```python +# Consider future needs +@schema +class Scan(dj.Manual): + definition = """ + -> Session + scan_idx : uint8 # Might need uint16 for high-throughput + --- + ... + """ +``` + +## See Also + +- [Define Tables](define-tables.md) β€” Table definition syntax +- [Model Relationships](model-relationships.ipynb) β€” Foreign key patterns diff --git a/src/how-to/distributed-computing.md b/src/how-to/distributed-computing.md new file mode 100644 index 00000000..5f523394 --- /dev/null +++ b/src/how-to/distributed-computing.md @@ -0,0 +1,192 @@ +# Distributed Computing + +Run computations across multiple workers with job coordination. + +## Enable Distributed Mode + +Use `reserve_jobs=True` to enable job coordination: + +```python +# Single worker (default) +ProcessedData.populate() + +# Distributed mode with job reservation +ProcessedData.populate(reserve_jobs=True) +``` + +## How It Works + +With `reserve_jobs=True`: +1. Worker checks the jobs table for pending work +2. Atomically reserves a job before processing +3. Other workers see the job as reserved and skip it +4. On completion, job is marked success (or error) + +## Multi-Process on Single Machine + +```python +# Use multiple processes +ProcessedData.populate(reserve_jobs=True, processes=4) +``` + +Each process: + +- Opens its own database connection +- Reserves jobs independently +- Processes in parallel + +## Multi-Machine Cluster + +Run the same script on multiple machines: + +```python +# worker_script.py - run on each machine +import datajoint as dj +from my_pipeline import ProcessedData + +# Each worker reserves and processes different jobs +ProcessedData.populate( + reserve_jobs=True, + display_progress=True, + suppress_errors=True +) +``` + +Workers automatically coordinate through the jobs table. + +## Job Table + +Each auto-populated table has a jobs table (`~~table_name`): + +```python +# View job status +ProcessedData.jobs + +# Filter by status +ProcessedData.jobs.pending +ProcessedData.jobs.reserved +ProcessedData.jobs.errors +ProcessedData.jobs.completed +``` + +## Job Statuses + +| Status | Description | +|--------|-------------| +| `pending` | Queued, ready to process | +| `reserved` | Being processed by a worker | +| `success` | Completed successfully | +| `error` | Failed with error | +| `ignore` | Marked to skip | + +## Refresh Job Queue + +Sync the job queue with current key_source: + +```python +# Add new pending jobs, remove stale ones +result = ProcessedData.jobs.refresh() +print(f"Added: {result['added']}, Removed: {result['removed']}") +``` + +## Priority Scheduling + +Control processing order with priorities: + +```python +# Refresh with specific priority +ProcessedData.jobs.refresh(priority=1) # Lower = more urgent + +# Process only high-priority jobs +ProcessedData.populate(reserve_jobs=True, priority=3) +``` + +## Error Recovery + +Handle failed jobs: + +```python +# View errors +errors = ProcessedData.jobs.errors +for job in errors.to_dicts(): + print(f"Key: {job}, Error: {job['error_message']}") + +# Clear errors to retry +errors.delete() +ProcessedData.populate(reserve_jobs=True) +``` + +## Orphan Detection + +Jobs from crashed workers are automatically recovered: + +```python +# Refresh with orphan timeout (seconds) +ProcessedData.jobs.refresh(orphan_timeout=3600) +``` + +Reserved jobs older than the timeout are reset to pending. + +## Configuration + +```python +import datajoint as dj + +# Auto-refresh on populate (default: True) +dj.config.jobs.auto_refresh = True + +# Keep completed job records (default: False) +dj.config.jobs.keep_completed = True + +# Stale job timeout in seconds (default: 3600) +dj.config.jobs.stale_timeout = 3600 + +# Default job priority (default: 5) +dj.config.jobs.default_priority = 5 + +# Track code version (default: None) +dj.config.jobs.version_method = "git" +``` + +## Populate Options + +| Option | Default | Description | +|--------|---------|-------------| +| `reserve_jobs` | `False` | Enable job coordination | +| `processes` | `1` | Number of worker processes | +| `max_calls` | `None` | Limit jobs per run | +| `display_progress` | `False` | Show progress bar | +| `suppress_errors` | `False` | Continue on errors | +| `priority` | `None` | Filter by priority | +| `refresh` | `None` | Force refresh before run | + +## Example: Cluster Setup + +```python +# config.py - shared configuration +import datajoint as dj + +dj.config.jobs.auto_refresh = True +dj.config.jobs.keep_completed = True +dj.config.jobs.version_method = "git" + +# worker.py - run on each node +from config import * +from my_pipeline import ProcessedData + +while True: + result = ProcessedData.populate( + reserve_jobs=True, + max_calls=100, + suppress_errors=True, + display_progress=True + ) + if result['success_count'] == 0: + break # No more work +``` + +## See Also + +- [Run Computations](run-computations.md) β€” Basic populate usage +- [Handle Errors](handle-errors.md) β€” Error recovery patterns +- [Monitor Progress](monitor-progress.md) β€” Tracking job status diff --git a/src/how-to/fetch-results.md b/src/how-to/fetch-results.md new file mode 100644 index 00000000..38a55255 --- /dev/null +++ b/src/how-to/fetch-results.md @@ -0,0 +1,126 @@ +# Fetch Results + +Retrieve query results in various formats. + +## List of Dictionaries + +```python +rows = Subject.to_dicts() +# [{'subject_id': 'M001', 'species': 'Mus musculus', ...}, ...] + +for row in rows: + print(row['subject_id'], row['species']) +``` + +## pandas DataFrame + +```python +df = Subject.to_pandas() +# Primary key becomes the index + +# With multi-column primary key +df = Session.to_pandas() +# MultiIndex on (subject_id, session_idx) +``` + +## NumPy Arrays + +```python +# Structured array (all columns) +arr = Subject.to_arrays() + +# Specific columns as separate arrays +species, weights = Subject.to_arrays('species', 'weight') +``` + +## Primary Keys Only + +```python +keys = Session.keys() +# [{'subject_id': 'M001', 'session_idx': 1}, ...] + +for key in keys: + process(Session & key) +``` + +## Single Row + +```python +# As dictionary (raises if not exactly 1 row) +row = (Subject & {'subject_id': 'M001'}).fetch1() + +# Specific attributes +species, weight = (Subject & {'subject_id': 'M001'}).fetch1('species', 'weight') +``` + +## Ordering and Limiting + +```python +# Sort by single attribute +Subject.to_dicts(order_by='weight DESC') + +# Sort by multiple attributes +Session.to_dicts(order_by=['session_date DESC', 'duration']) + +# Sort by primary key +Subject.to_dicts(order_by='KEY') + +# Limit rows +Subject.to_dicts(limit=10) + +# Pagination +Subject.to_dicts(order_by='KEY', limit=10, offset=20) +``` + +## Streaming (Lazy Iteration) + +```python +# Memory-efficient iteration +for row in Subject: + process(row) + if done: + break # Early termination +``` + +## polars DataFrame + +```python +# Requires: pip install datajoint[polars] +df = Subject.to_polars() +``` + +## PyArrow Table + +```python +# Requires: pip install datajoint[arrow] +table = Subject.to_arrow() +``` + +## Method Summary + +| Method | Returns | Use Case | +|--------|---------|----------| +| `to_dicts()` | `list[dict]` | JSON, iteration | +| `to_pandas()` | `DataFrame` | Data analysis | +| `to_polars()` | `polars.DataFrame` | Fast analysis | +| `to_arrow()` | `pyarrow.Table` | Interop | +| `to_arrays()` | `np.ndarray` | Numeric computation | +| `to_arrays('a', 'b')` | `tuple[array, ...]` | Specific columns | +| `keys()` | `list[dict]` | Primary keys | +| `fetch1()` | `dict` | Single row | +| `for row in table:` | Iterator | Streaming | + +## Common Parameters + +All output methods accept: + +| Parameter | Description | +|-----------|-------------| +| `order_by` | Sort by column(s): `'name'`, `'name DESC'`, `['a', 'b DESC']`, `'KEY'` | +| `limit` | Maximum rows to return | +| `offset` | Rows to skip | + +## See Also + +- [Query Data](query-data.md) β€” Building queries +- [Fetch API Specification](../reference/specs/fetch-api.md) β€” Complete reference diff --git a/src/how-to/garbage-collection.md b/src/how-to/garbage-collection.md new file mode 100644 index 00000000..e95a8f34 --- /dev/null +++ b/src/how-to/garbage-collection.md @@ -0,0 +1,216 @@ +# Clean Up External Storage + +Remove orphaned data from object storage after deleting database rows. + +## Why Garbage Collection? + +When you delete rows from tables with external storage (``, ``, +``, ``), the database records are removed but the external files +remain. This is by design: + +- **Hash-addressed storage** (``, ``) uses deduplicationβ€”the + same content may be referenced by multiple rows +- **Schema-addressed storage** (``, ``) stores each row's data + at a unique path, but immediate deletion could cause issues with concurrent + operations + +Run garbage collection periodically to reclaim storage space. + +## Basic Usage + +```python +import datajoint as dj + +# Scan for orphaned items (dry run) +stats = dj.gc.scan(schema1, schema2) +print(dj.gc.format_stats(stats)) + +# Remove orphaned items +stats = dj.gc.collect(schema1, schema2, dry_run=False) +print(dj.gc.format_stats(stats)) +``` + +## Scan Before Collecting + +Always scan first to see what would be deleted: + +```python +# Check what's orphaned +stats = dj.gc.scan(my_schema) + +print(f"Hash-addressed orphaned: {stats['hash_orphaned']}") +print(f"Schema paths orphaned: {stats['schema_paths_orphaned']}") +print(f"Total bytes: {stats['orphaned_bytes'] / 1e6:.1f} MB") +``` + +## Dry Run Mode + +The default `dry_run=True` reports what would be deleted without deleting: + +```python +# Safe: shows what would be deleted +stats = dj.gc.collect(my_schema, dry_run=True) +print(dj.gc.format_stats(stats)) + +# After review, actually delete +stats = dj.gc.collect(my_schema, dry_run=False) +``` + +## Multiple Schemas + +If your data spans multiple schemas, scan all of them together: + +```python +# Important: include ALL schemas that might share storage +stats = dj.gc.collect( + schema_raw, + schema_processed, + schema_analysis, + dry_run=False +) +``` + +!!! note "Per-schema deduplication" + Hash-addressed storage is deduplicated **within** each schema. Different + schemas have independent storage, so you only need to scan schemas that + share the same database. + +## Named Stores + +If you use multiple named stores, specify which to clean: + +```python +# Clean specific store +stats = dj.gc.collect(my_schema, store_name='archive', dry_run=False) + +# Or clean default store +stats = dj.gc.collect(my_schema, dry_run=False) # uses default store +``` + +## Verbose Mode + +See detailed progress: + +```python +stats = dj.gc.collect( + my_schema, + dry_run=False, + verbose=True # logs each deletion +) +``` + +## Understanding the Statistics + +```python +stats = dj.gc.scan(my_schema) + +# Hash-addressed storage (, , ) +stats['hash_referenced'] # Items still in database +stats['hash_stored'] # Items in storage +stats['hash_orphaned'] # Unreferenced (can be deleted) +stats['hash_orphaned_bytes'] # Size of orphaned items + +# Schema-addressed storage (, ) +stats['schema_paths_referenced'] # Paths still in database +stats['schema_paths_stored'] # Paths in storage +stats['schema_paths_orphaned'] # Unreferenced paths +stats['schema_paths_orphaned_bytes'] + +# Totals +stats['referenced'] # Total referenced items +stats['stored'] # Total stored items +stats['orphaned'] # Total orphaned items +stats['orphaned_bytes'] +``` + +## Scheduled Collection + +Run GC periodically in production: + +```python +# In a cron job or scheduled task +import datajoint as dj +from myproject import schema1, schema2, schema3 + +stats = dj.gc.collect( + schema1, schema2, schema3, + dry_run=False, + verbose=True +) + +if stats['errors'] > 0: + logging.warning(f"GC completed with {stats['errors']} errors") +else: + logging.info(f"GC freed {stats['bytes_freed'] / 1e6:.1f} MB") +``` + +## How Storage Addressing Works + +DataJoint uses two storage patterns: + +### Hash-Addressed (``, ``, ``) + +``` +_hash/ + {schema}/ + ab/ + cd/ + abcdefghij... # Content identified by Base32-encoded MD5 hash +``` + +- Duplicate content shares storage within each schema +- Paths are stored in metadataβ€”safe from config changes +- Cannot delete until no rows reference the content +- GC compares stored paths against filesystem + +### Schema-Addressed (``, ``) + +``` +myschema/ + mytable/ + primary_key_values/ + attribute_name/ + data.zarr/ + data.npy +``` + +- Each row has unique path based on schema structure +- Paths mirror database organization +- GC removes paths not referenced by any row + +## Troubleshooting + +### "At least one schema must be provided" + +```python +# Wrong +dj.gc.scan() + +# Right +dj.gc.scan(my_schema) +``` + +### Storage not decreasing + +Check that you're scanning all schemas: + +```python +# List all schemas that use this store +# Make sure to include them all in the scan +``` + +### Permission errors + +Ensure your storage credentials allow deletion: + +```python +# Check store configuration +spec = dj.config.get_object_store_spec('mystore') +# Verify write/delete permissions +``` + +## See Also + +- [Manage Large Data](manage-large-data.md) β€” Storage patterns and streaming +- [Configure Object Storage](configure-storage.md) β€” Storage setup +- [Delete Data](delete-data.md) β€” Row deletion with cascades diff --git a/src/how-to/handle-errors.md b/src/how-to/handle-errors.md new file mode 100644 index 00000000..ef500d7f --- /dev/null +++ b/src/how-to/handle-errors.md @@ -0,0 +1,194 @@ +# Handle Errors + +Manage computation errors and recover failed jobs. + +## Suppress Errors During Populate + +Continue processing despite individual failures: + +```python +# Stop on first error (default) +ProcessedData.populate() + +# Log errors but continue +ProcessedData.populate(suppress_errors=True) +``` + +## View Failed Jobs + +Check the jobs table for errors: + +```python +# All error jobs +ProcessedData.jobs.errors + +# View error details +for job in ProcessedData.jobs.errors.to_dicts(): + print(f"Key: {job}") + print(f"Message: {job['error_message']}") +``` + +## Get Full Stack Trace + +Error stack traces are stored in the jobs table: + +```python +job = (ProcessedData.jobs.errors & key).fetch1() +print(job['error_stack']) +``` + +## Retry Failed Jobs + +Clear error status and rerun: + +```python +# Delete error records to retry +ProcessedData.jobs.errors.delete() + +# Reprocess +ProcessedData.populate(reserve_jobs=True) +``` + +## Retry Specific Jobs + +Target specific failed jobs: + +```python +# Clear one error +(ProcessedData.jobs & key & 'status="error"').delete() + +# Retry just that key +ProcessedData.populate(key, reserve_jobs=True) +``` + +## Ignore Problematic Jobs + +Mark jobs to skip permanently: + +```python +# Mark job as ignored +ProcessedData.jobs.ignore(key) + +# View ignored jobs +ProcessedData.jobs.ignored +``` + +## Error Handling in make() + +Handle expected errors gracefully: + +```python +@schema +class ProcessedData(dj.Computed): + definition = """ + -> RawData + --- + result : float64 + """ + + def make(self, key): + try: + data = (RawData & key).fetch1('data') + result = risky_computation(data) + except ValueError as e: + # Log and skip this key + logger.warning(f"Skipping {key}: {e}") + return # Don't insert, job remains pending + + self.insert1({**key, 'result': result}) +``` + +## Transaction Rollback + +Failed `make()` calls automatically rollback: + +```python +def make(self, key): + # These inserts are in a transaction + self.insert1({**key, 'result': value1}) + PartTable.insert(parts) + + # If this raises, all inserts are rolled back + validate_result(key) +``` + +## Return Exception Objects + +Get exception objects for programmatic handling: + +```python +result = ProcessedData.populate( + suppress_errors=True, + return_exception_objects=True +) + +for key, exception in result['error_list']: + if isinstance(exception, TimeoutError): + # Handle timeout differently + schedule_for_later(key) +``` + +## Monitor Error Rate + +Track errors over time: + +```python +progress = ProcessedData.jobs.progress() +print(f"Pending: {progress.get('pending', 0)}") +print(f"Errors: {progress.get('error', 0)}") +print(f"Success: {progress.get('success', 0)}") + +error_rate = progress.get('error', 0) / sum(progress.values()) +print(f"Error rate: {error_rate:.1%}") +``` + +## Common Error Patterns + +### Data Quality Issues + +```python +def make(self, key): + data = (RawData & key).fetch1('data') + + if not validate_data(data): + raise DataJointError(f"Invalid data for {key}") + + # Process valid data + self.insert1({**key, 'result': process(data)}) +``` + +### Resource Constraints + +```python +def make(self, key): + try: + result = memory_intensive_computation(key) + except MemoryError: + # Clear caches and retry once + gc.collect() + result = memory_intensive_computation(key) + + self.insert1({**key, 'result': result}) +``` + +### External Service Failures + +```python +def make(self, key): + for attempt in range(3): + try: + data = fetch_from_external_api(key) + break + except ConnectionError: + if attempt == 2: + raise + time.sleep(2 ** attempt) # Exponential backoff + + self.insert1({**key, 'result': process(data)}) +``` + +## See Also + +- [Run Computations](run-computations.md) β€” Basic populate usage +- [Distributed Computing](distributed-computing.md) β€” Multi-worker error handling +- [Monitor Progress](monitor-progress.md) β€” Tracking job status diff --git a/src/how-to/index.md b/src/how-to/index.md new file mode 100644 index 00000000..ce495063 --- /dev/null +++ b/src/how-to/index.md @@ -0,0 +1,50 @@ +# How-To Guides + +Practical guides for common tasks. + +These guides help you accomplish specific tasks with DataJoint. Unlike tutorials, +they assume you understand the basics and focus on getting things done. + +## Setup + +- [Installation](installation.md) β€” Installing DataJoint +- [Configure Database Connection](configure-database.md) β€” Connection settings +- [Configure Object Storage](configure-storage.md) β€” S3, MinIO, file stores +- [Use the Command-Line Interface](use-cli.md) β€” Interactive REPL + +## Schema Design + +- [Define Tables](define-tables.md) β€” Table definition syntax +- [Model Relationships](model-relationships.ipynb) β€” Foreign key patterns +- [Design Primary Keys](design-primary-keys.md) β€” Key selection strategies + +## Project Management + +- [Manage a Pipeline Project](manage-pipeline-project.md) β€” Multi-schema pipelines, team collaboration + +## Data Operations + +- [Insert Data](insert-data.md) β€” Single rows, batches, transactions +- [Query Data](query-data.md) β€” Operators, restrictions, projections +- [Fetch Results](fetch-results.md) β€” DataFrames, dicts, streaming +- [Delete Data](delete-data.md) β€” Safe deletion with cascades + +## Computation + +- [Run Computations](run-computations.md) β€” populate() basics +- [Distributed Computing](distributed-computing.md) β€” Multi-process, cluster +- [Handle Errors](handle-errors.md) β€” Error recovery and job management +- [Monitor Progress](monitor-progress.md) β€” Dashboards and status + +## Object Storage + +- [Use Object Storage](use-object-storage.md) β€” When and how +- [Create Custom Codecs](create-custom-codec.md) β€” Domain-specific types +- [Manage Large Data](manage-large-data.md) β€” Blobs, streaming, efficiency +- [Clean Up External Storage](garbage-collection.md) β€” Garbage collection + +## Maintenance + +- [Migrate from 0.x](migrate-from-0x.md) β€” Upgrading existing pipelines +- [Alter Tables](alter-tables.md) β€” Schema evolution +- [Backup and Restore](backup-restore.md) β€” Data protection diff --git a/src/how-to/insert-data.md b/src/how-to/insert-data.md new file mode 100644 index 00000000..fd549c32 --- /dev/null +++ b/src/how-to/insert-data.md @@ -0,0 +1,145 @@ +# Insert Data + +Add data to DataJoint tables. + +## Single Row + +```python +Subject.insert1({ + 'subject_id': 'M001', + 'species': 'Mus musculus', + 'date_of_birth': '2026-01-15', + 'sex': 'M' +}) +``` + +## Multiple Rows + +```python +Subject.insert([ + {'subject_id': 'M001', 'species': 'Mus musculus', 'date_of_birth': '2026-01-15', 'sex': 'M'}, + {'subject_id': 'M002', 'species': 'Mus musculus', 'date_of_birth': '2026-02-01', 'sex': 'F'}, + {'subject_id': 'M003', 'species': 'Mus musculus', 'date_of_birth': '2026-02-15', 'sex': 'M'}, +]) +``` + +## From pandas DataFrame + +```python +import pandas as pd + +df = pd.DataFrame({ + 'subject_id': ['M004', 'M005'], + 'species': ['Mus musculus', 'Mus musculus'], + 'date_of_birth': ['2026-03-01', '2026-03-15'], + 'sex': ['F', 'M'] +}) + +Subject.insert(df) +``` + +## Handle Duplicates + +```python +# Skip rows with existing primary keys +Subject.insert(rows, skip_duplicates=True) + +# Replace existing rows (use sparinglyβ€”breaks immutability) +Subject.insert(rows, replace=True) +``` + +## Ignore Extra Fields + +```python +# Ignore fields not in the table definition +Subject.insert(rows, ignore_extra_fields=True) +``` + +## Master-Part Tables + +Use a transaction to maintain compositional integrity: + +```python +with dj.conn().transaction: + Session.insert1({ + 'subject_id': 'M001', + 'session_idx': 1, + 'session_date': '2026-01-20' + }) + Session.Trial.insert([ + {'subject_id': 'M001', 'session_idx': 1, 'trial_idx': 1, 'outcome': 'hit', 'reaction_time': 0.35}, + {'subject_id': 'M001', 'session_idx': 1, 'trial_idx': 2, 'outcome': 'miss', 'reaction_time': 0.82}, + ]) +``` + +## Insert from Query + +```python +# Copy data from another table or query result +NewTable.insert(OldTable & 'condition') + +# With projection +NewTable.insert(OldTable.proj('attr1', 'attr2', new_name='old_name')) +``` + +## Validate Before Insert + +```python +result = Subject.validate(rows) + +if result: + Subject.insert(rows) +else: + print("Validation errors:") + for error in result.errors: + print(f" {error}") +``` + +## Insert with Blobs + +```python +import numpy as np + +data = np.random.randn(100, 100) + +ImageData.insert1({ + 'image_id': 1, + 'pixel_data': data # Automatically serialized +}) +``` + +## Insert Options Summary + +| Option | Default | Description | +|--------|---------|-------------| +| `skip_duplicates` | `False` | Skip rows with existing keys | +| `replace` | `False` | Replace existing rows | +| `ignore_extra_fields` | `False` | Ignore unknown fields | + +## Best Practices + +### Batch inserts for performance + +```python +# Good: Single insert call +Subject.insert(all_rows) + +# Slow: Loop of insert1 calls +for row in all_rows: + Subject.insert1(row) +``` + +### Use transactions for related inserts + +```python +with dj.conn().transaction: + Parent.insert1(parent_row) + Child.insert(child_rows) +``` + +### Validate before bulk inserts + +```python +if Subject.validate(rows): + Subject.insert(rows) +``` diff --git a/src/how-to/installation.md b/src/how-to/installation.md new file mode 100644 index 00000000..872abdf7 --- /dev/null +++ b/src/how-to/installation.md @@ -0,0 +1,93 @@ +# Installation + +Install DataJoint Python and set up your environment. + +## Basic Installation + +```bash +pip install datajoint +``` + +## With Optional Dependencies + +```bash +# For polars DataFrame support +pip install datajoint[polars] + +# For PyArrow support +pip install datajoint[arrow] + +# For all optional dependencies +pip install datajoint[all] +``` + +## Development Installation + +```bash +git clone https://github.com/datajoint/datajoint-python.git +cd datajoint-python +pip install -e ".[dev]" +``` + +## Verify Installation + +```python +import datajoint as dj +print(dj.__version__) +``` + +## Database Server + +DataJoint requires a MySQL-compatible database server: + +### Local Development (Docker) + +```bash +docker run -d \ + --name datajoint-db \ + -p 3306:3306 \ + -e MYSQL_ROOT_PASSWORD=simple \ + mysql:8.0 +``` + +### DataJoint.com (Recommended) + +[DataJoint.com](https://datajoint.com) provides fully managed infrastructure for scientific data pipelinesβ€”cloud or on-premisesβ€”with comprehensive support, automatic backups, object storage, and team collaboration features. + +### Self-Managed Cloud Databases + +- **Amazon RDS** β€” MySQL or Aurora +- **Google Cloud SQL** β€” MySQL +- **Azure Database** β€” MySQL + +See [Configure Database Connection](configure-database.md) for connection setup. + +## Requirements + +- Python 3.10+ +- MySQL 8.0+ or MariaDB 10.6+ +- Network access to database server + +## Troubleshooting + +### `pymysql` connection errors + +```bash +pip install pymysql --force-reinstall +``` + +### SSL/TLS connection issues + +Set `use_tls=False` for local development: + +```python +dj.config['database.use_tls'] = False +``` + +### Permission denied + +Ensure your database user has appropriate privileges: + +```sql +GRANT ALL PRIVILEGES ON `your_schema%`.* TO 'username'@'%'; +``` diff --git a/src/how-to/manage-large-data.md b/src/how-to/manage-large-data.md new file mode 100644 index 00000000..1e56e241 --- /dev/null +++ b/src/how-to/manage-large-data.md @@ -0,0 +1,196 @@ +# Manage Large Data + +Work effectively with blobs and object storage. + +## Choose the Right Storage + +| Data Size | Recommended | Syntax | +|-----------|-------------|--------| +| < 1 MB | Database | `` | +| 1 MB - 1 GB | Hash-addressed | `` | +| > 1 GB | Schema-addressed | ``, `` | + +## Streaming Large Results + +Avoid loading everything into memory: + +```python +# Bad: loads all data at once +all_data = LargeTable().to_arrays('big_column') + +# Good: stream rows lazily (single cursor, one row at a time) +for row in LargeTable(): + process(row['big_column']) + +# Good: batch by ID range +keys = LargeTable().keys() +batch_size = 100 +for i in range(0, len(keys), batch_size): + batch_keys = keys[i:i + batch_size] + data = (LargeTable() & batch_keys).to_arrays('big_column') + process(data) +``` + +## Lazy Loading with ObjectRef + +`` and `` return lazy references: + +```python +# Returns ObjectRef, not the actual data +ref = (Dataset & key).fetch1('large_file') + +# Stream without full download +with ref.open('rb') as f: + # Process in chunks + while chunk := f.read(1024 * 1024): + process(chunk) + +# Or download when needed +local_path = ref.download('/tmp/working') +``` + +## Selective Fetching + +Fetch only what you need: + +```python +# Bad: fetches all columns including blobs +row = MyTable.fetch1() + +# Good: fetch only metadata +metadata = (MyTable & key).fetch1('name', 'date', 'status') + +# Then fetch blob only if needed +if needs_processing(metadata): + data = (MyTable & key).fetch1('large_data') +``` + +## Projection for Efficiency + +Exclude large columns from joins: + +```python +# Slow: joins include blob columns +result = Table1 * Table2 + +# Fast: project away blobs before join +result = Table1.proj('id', 'name') * Table2.proj('id', 'status') +``` + +## Batch Inserts + +Insert large data efficiently: + +```python +# Good: single transaction for related data +with dj.conn().transaction: + for item in large_batch: + MyTable.insert1(item) +``` + +## Content Deduplication + +`` and `` automatically deduplicate within each schema: + +```python +# Same array inserted twice +data = np.random.randn(1000, 1000) +Table.insert1({'id': 1, 'data': data}) +Table.insert1({'id': 2, 'data': data}) # References same storage + +# Only one copy exists in object storage (per schema) +``` + +Deduplication is per-schemaβ€”identical content in different schemas is stored separately. +This enables independent garbage collection per schema. + +## Storage Cleanup + +External storage items are not automatically deleted with rows. Run garbage +collection periodically: + +```python +import datajoint as dj + +# Objects are NOT automatically deleted with rows +(MyTable & old_data).delete() + +# Scan for orphaned items +stats = dj.gc.scan(my_schema) +print(dj.gc.format_stats(stats)) + +# Remove orphaned items +stats = dj.gc.collect(my_schema, dry_run=False) +``` + +See [Clean Up External Storage](garbage-collection.md) for details. + +## Monitor Storage Usage + +Check object store size: + +```python +# Get store configuration +spec = dj.config.get_object_store_spec() + +# For S3/MinIO, use boto3 or similar +# For filesystem, use standard tools +``` + +## Compression + +Blobs are compressed by default: + +```python +# Compression happens automatically in +large_array = np.zeros((10000, 10000)) # Compresses well +sparse_data = np.random.randn(10000, 10000) # Less compression +``` + +## Memory Management + +For very large computations: + +```python +def make(self, key): + # Process in chunks + for chunk_idx in range(n_chunks): + chunk_data = load_chunk(key, chunk_idx) + result = process(chunk_data) + save_partial_result(key, chunk_idx, result) + del chunk_data # Free memory + + # Combine results + final = combine_results(key) + self.insert1({**key, 'result': final}) +``` + +## External Tools for Very Large Data + +For datasets too large for DataJoint: + +```python +@schema +class LargeDataset(dj.Manual): + definition = """ + dataset_id : uuid + --- + zarr_path : # Reference to external Zarr + """ + +# Store path reference, process with specialized tools +import zarr +store = zarr.open(local_zarr_path) +# ... process with Zarr/Dask ... + +LargeDataset.insert1({ + 'dataset_id': uuid.uuid4(), + 'zarr_path': local_zarr_path +}) +``` + +## See Also + +- [Use Object Storage](use-object-storage.md) β€” Storage patterns +- [Configure Object Storage](configure-storage.md) β€” Storage setup +- [Create Custom Codecs](create-custom-codec.md) β€” Domain-specific types diff --git a/src/how-to/manage-pipeline-project.md b/src/how-to/manage-pipeline-project.md new file mode 100644 index 00000000..e0d1aad0 --- /dev/null +++ b/src/how-to/manage-pipeline-project.md @@ -0,0 +1,374 @@ +# Manage a Pipeline Project + +Organize multi-schema pipelines for team collaboration. + +## Overview + +A production DataJoint pipeline typically involves: + +- **Multiple schemas** β€” Organized by experimental modality or processing stage +- **Team of users** β€” With different roles and access levels +- **Shared infrastructure** β€” Database server, object storage, code repository +- **Coordination** β€” Between code, database, and storage permissions + +This guide covers practical project organization. For conceptual background on pipeline architecture and the DAG structure, see [Data Pipelines](../explanation/data-pipelines.md). + +For a fully managed solution, [request a DataJoint Platform account](https://www.datajoint.com/sign-up). + +## Project Structure + +Use a modern Python project layout with source code under `src/`: + +``` +my_pipeline/ +β”œβ”€β”€ datajoint.json # Shared settings (committed) +β”œβ”€β”€ .secrets/ # Local credentials (gitignored) +β”‚ β”œβ”€β”€ database.password +β”‚ └── storage.credentials +β”œβ”€β”€ .gitignore +β”œβ”€β”€ pyproject.toml # Package metadata and dependencies +β”œβ”€β”€ README.md +β”œβ”€β”€ src/ +β”‚ └── my_pipeline/ +β”‚ β”œβ”€β”€ __init__.py +β”‚ β”œβ”€β”€ subject.py # subject schema +β”‚ β”œβ”€β”€ session.py # session schema +β”‚ β”œβ”€β”€ ephys.py # ephys schema +β”‚ β”œβ”€β”€ imaging.py # imaging schema +β”‚ β”œβ”€β”€ analysis.py # analysis schema +β”‚ └── utils/ +β”‚ └── __init__.py +β”œβ”€β”€ tests/ +β”‚ β”œβ”€β”€ conftest.py +β”‚ └── test_ephys.py +└── docs/ + └── ... +``` + +### One Module Per Schema + +Each module defines and binds to its schema: + +```python +# src/my_pipeline/ephys.py +import datajoint as dj +from . import session # Import dependency + +schema = dj.Schema('ephys') + +@schema +class Probe(dj.Lookup): + definition = """ + probe_type : varchar(32) + --- + num_channels : uint16 + """ + +@schema +class Recording(dj.Imported): + definition = """ + -> session.Session + -> Probe + --- + recording_path : varchar(255) + """ +``` + +### Import Dependencies Mirror Foreign Keys + +Module imports reflect the schema DAG: + +```python +# analysis.py depends on both ephys and imaging +from . import ephys +from . import imaging + +schema = dj.Schema('analysis') + +@schema +class MultiModalAnalysis(dj.Computed): + definition = """ + -> ephys.Recording + -> imaging.Scan + --- + correlation : float64 + """ +``` + +## Repository Configuration + +### Shared Settings + +Store non-secret configuration in `datajoint.json` at the project root: + +**datajoint.json** (committed): +```json +{ + "database": { + "host": "db.example.com", + "port": 3306 + }, + "stores": { + "main": { + "protocol": "s3", + "endpoint": "s3.example.com", + "bucket": "my-org-data", + "location": "my_pipeline" + } + } +} +``` + +### Credentials Management + +Credentials are stored locally and never committed: + +**Option 1: `.secrets/` directory** +``` +.secrets/ +β”œβ”€β”€ database.user +β”œβ”€β”€ database.password +β”œβ”€β”€ storage.access_key +└── storage.secret_key +``` + +**Option 2: Environment variables** +```bash +export DJ_USER=alice +export DJ_PASS=alice_password +export DJ_STORES__MAIN__ACCESS_KEY=... +export DJ_STORES__MAIN__SECRET_KEY=... +``` + +### Essential `.gitignore` + +```gitignore +# Credentials +.secrets/ + +# Python +__pycache__/ +*.pyc +*.egg-info/ +dist/ +build/ + +# Environment +.env +.venv/ + +# IDE +.idea/ +.vscode/ +``` + +### `pyproject.toml` Example + +```toml +[project] +name = "my-pipeline" +version = "1.0.0" +requires-python = ">=3.10" +dependencies = [ + "datajoint>=2.0", + "numpy", +] + +[project.optional-dependencies] +dev = ["pytest", "pytest-cov"] + +[tool.setuptools.packages.find] +where = ["src"] +``` + +## Database Access Control + +### The Complexity + +Multi-user database access requires: + +1. **User accounts** β€” Individual credentials per team member +2. **Schema permissions** β€” Which users can access which schemas +3. **Operation permissions** β€” SELECT, INSERT, UPDATE, DELETE, CREATE, DROP +4. **Role hierarchy** β€” Admin, developer, analyst, viewer +5. **Audit trail** β€” Who modified what and when + +### Basic MySQL Grants + +```sql +-- Create user +CREATE USER 'alice'@'%' IDENTIFIED BY 'password'; + +-- Grant read-only on specific schema +GRANT SELECT ON ephys.* TO 'alice'@'%'; + +-- Grant read-write on specific schema +GRANT SELECT, INSERT, UPDATE, DELETE ON analysis.* TO 'alice'@'%'; + +-- Grant full access (developers) +GRANT ALL PRIVILEGES ON my_pipeline_*.* TO 'bob'@'%'; +``` + +### Role-Based Access Patterns + +| Role | Permissions | Typical Use | +|------|-------------|-------------| +| Viewer | SELECT | Browse data, run queries | +| Analyst | SELECT, INSERT on analysis | Add analysis results | +| Operator | SELECT, INSERT, DELETE on data schemas | Run pipeline | +| Developer | ALL on development schemas | Schema changes | +| Admin | ALL + GRANT | User management | + +### Considerations + +- Users need SELECT on parent schemas to INSERT into child schemas (FK validation) +- Cascading deletes require DELETE on all dependent schemas +- Schema creation requires CREATE privilege +- Coordinating permissions across many schemas becomes complex + +## Object Storage Access Control + +### The Complexity + +Object storage permissions must align with database permissions: + +1. **Bucket/prefix policies** β€” Map to schema access +2. **Read vs write** β€” Match SELECT vs INSERT/UPDATE +3. **Credential distribution** β€” Per-user or shared service accounts +4. **Cross-schema objects** β€” When computed tables reference multiple inputs + +### Hierarchical Storage Structure + +A DataJoint project creates a structured storage pattern: + +``` +πŸ“ project_name/ +β”œβ”€β”€ πŸ“ schema_name1/ +β”œβ”€β”€ πŸ“ schema_name2/ +β”œβ”€β”€ πŸ“ schema_name3/ +β”‚ β”œβ”€β”€ objects/ +β”‚ β”‚ └── table1/ +β”‚ β”‚ └── key1-value1/ +β”‚ └── fields/ +β”‚ └── table1-field1/ +└── ... +``` + +### S3/MinIO Policy Example + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": ["s3:GetObject"], + "Resource": "arn:aws:s3:::my-lab-data/datajoint/ephys/*" + }, + { + "Effect": "Allow", + "Action": ["s3:GetObject", "s3:PutObject"], + "Resource": "arn:aws:s3:::my-lab-data/datajoint/analysis/*" + } + ] +} +``` + +### Considerations + +- Object paths include schema name: `{project}/{schema}/{table}/...` +- Users need read access to fetch blobs from upstream schemas +- Content-addressed storage (``) shares objects across tables +- Garbage collection requires coordinated delete permissions + +## Pipeline Initialization + +### Schema Creation Order + +Initialize schemas in dependency order: + +```python +# src/my_pipeline/__init__.py +from . import subject # No dependencies +from . import session # Depends on subject +from . import ephys # Depends on session +from . import imaging # Depends on session +from . import analysis # Depends on ephys, imaging + +def initialize(): + """Create all schemas in dependency order.""" + # Schemas are created when modules are imported + # and tables are first accessed + subject.Subject() + session.Session() + ephys.Recording() + imaging.Scan() + analysis.MultiModalAnalysis() +``` + +### Version Coordination + +Track schema versions with your code: + +```python +# src/my_pipeline/version.py +__version__ = "1.2.0" + +SCHEMA_VERSIONS = { + 'subject': '1.0.0', + 'session': '1.1.0', + 'ephys': '1.2.0', + 'imaging': '1.2.0', + 'analysis': '1.2.0', +} +``` + +## Team Workflows + +### Development vs Production + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Development β”‚ β”‚ Production β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ dev_subject β”‚ β”‚ subject β”‚ +β”‚ dev_session β”‚ β”‚ session β”‚ +β”‚ dev_ephys β”‚ β”‚ ephys β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ β”‚ + β”‚ Schema promotion β”‚ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +### Branching Strategy + +``` +main ────────────────────────────────────▢ + β”‚ β”‚ + β”‚ feature/ β”‚ hotfix/ + β–Ό β–Ό + ephys-v2 fix-recording + β”‚ β”‚ + └──────────────┴──▢ main +``` + +## Summary of Complexities + +Managing a team pipeline requires coordinating: + +| Component | Challenges | +|-----------|------------| +| **Code** | Module dependencies, version control, deployment | +| **Database** | User accounts, schema permissions, role hierarchy | +| **Object Storage** | Bucket policies, credential distribution, path alignment | +| **Compute** | Worker deployment, job distribution, resource allocation | +| **Monitoring** | Progress tracking, error alerting, audit logging | + +These challenges grow with team size and pipeline complexity. The [DataJoint Platform](https://www.datajoint.com/sign-up) provides integrated management for all these concerns. + +## See Also + +- [Data Pipelines](../explanation/data-pipelines.md) β€” Conceptual overview and architecture +- [Configure Object Storage](configure-storage.md) β€” Storage setup +- [Distributed Computing](distributed-computing.md) β€” Multi-worker pipelines +- [Model Relationships](model-relationships.ipynb) β€” Foreign key patterns diff --git a/src/how-to/migrate-from-0x.md b/src/how-to/migrate-from-0x.md new file mode 100644 index 00000000..b75a99db --- /dev/null +++ b/src/how-to/migrate-from-0x.md @@ -0,0 +1,1410 @@ +# Migrate to DataJoint 2.0 + +Upgrade existing pipelines from legacy DataJoint (pre-2.0) to DataJoint 2.0. + +> **This guide is optimized for AI coding assistants.** Point your AI agent at this +> document and it will execute the migration with your oversight. + +## Requirements + +### System Requirements + +| Component | Legacy (0.14.x) | DataJoint 2.0 | +|-----------|-----------------|---------------| +| **Python** | 3.8+ | **3.10+** | +| **MySQL** | 5.7+ | **8.0+** | + +**Action required:** Upgrade your Python environment and MySQL server before installing DataJoint 2.0. + +### License Change + +DataJoint 2.0 is licensed under **Apache 2.0** (previously LGPL-2.1). + +- More permissive for commercial and academic use +- Compatible with broader ecosystem of tools +- Clearer patent grant provisions + +No action requiredβ€”the new license is more permissive. + +### Future Backend Support + +DataJoint 2.0 introduces portable type aliases (`uint32`, `float64`, etc.) that prepare the codebase for **PostgreSQL backend compatibility** in a future release. Migration to core types (Phase 2) ensures your schemas will work seamlessly when Postgres support is available. + +--- + +## Overview + +| Phase | Code Changes | Schema Changes | Legacy Works? | +|-------|--------------|----------------|---------------| +| 1 | Settings, fetch API, queries | None | Yes | +| 2 | Table definitions | Column comments, `~lineage` | Yes | +| 3 | β€” | Add `_v2` columns for external storage | Yes | +| 4 | β€” | Remove legacy external columns | **No** | +| 5 | Adopt new features | Optional | No | +| 6 | β€” | Drop `~log`, `~jobs`, `~external_*` | No | + +**After Phase 1:** Simple queries work. Blobs and complex queries may not work until Phase 2. + +**After Phase 2:** 2.0 clients can use all column types except legacy external storage and AdaptedTypes. + +**Most users stop after Phase 2.** Phases 3-4 only apply to schemas using legacy external storage (`blob@store`, `attach@store`, `filepath@store`) or AdaptedTypes. Phase 6 is optional cleanup. + +--- + +## What's New in 2.0 + +### 3-Tier Column Type System + +DataJoint 2.0 introduces a unified type system with three tiers: + +| Tier | Description | Examples | Migration | +|------|-------------|----------|-----------| +| **Native** | Raw MySQL types | `int unsigned`, `tinyint` | Auto-converted to core types | +| **Core** | Standardized portable types | `uint32`, `float64`, `varchar(100)`, `json` | Column comment only | +| **Codec** | Serialization to blob or external store | ``, ``, `` | Varies (see below) | + +**Migration:** Phase 2 makes all type conversions explicit. This includes native types (e.g., `int unsigned` β†’ `uint32`) and types with implicit serialization (e.g., `longblob` β†’ ``, `attach` β†’ ``). Legacy DataJoint overloaded some types with implicit conversions; 2.0 makes these explicit through codecs. + +**Learn more:** [Type System Concept](../explanation/type-system.md) Β· [Type System Reference](../reference/specs/type-system.md) + +### Codecs + +Codecs handle serialization for non-native data types: + +| Codec | Description | Store | Compatibility | +|-------|-------------|-------|---------------| +| `` | DataJoint serialization of Python objects | In-table (was `longblob`) | Column comment only | +| `` | Inline file attachments | In-table (was `attach`) | Column comment only | +| `` | Large blobs, deduplicated by hash | Hash-addressed | Requires migration | +| `` | File attachments, deduplicated by hash | Hash-addressed | Requires migration | +| `` | Managed file paths | Schema-addressed | Requires migration | +| `` | General object storage interface (zarr, HDF5, custom) | Schema-addressed | New in 2.0 | +| `` | NumPy arrays via object storage | Schema-addressed | New in 2.0 | +| `` | Zarr arrays (plugin, coming soon) | Schema-addressed | New in 2.0 | +| `` | TIFF images (plugin, coming soon) | Schema-addressed | New in 2.0 | +| Custom | User-defined serialization | Any | New feature | + +**Legacy AdaptedTypes:** Replaced by custom codecs. Users who implemented AdaptedTypes can convert them to the new codec API. + +**Learn more:** [Codec API Reference](../reference/specs/codec-api.md) Β· [Custom Codecs Concept](../explanation/custom-codecs.md) Β· [Create Custom Codec](create-custom-codec.md) + +### AutoPopulate 2.0 + +Per-table job management replaces the schema-level `~jobs` table: + +| Aspect | Legacy (`~jobs`) | 2.0 (`~~table_name`) | +|--------|------------------|----------------------| +| Scope | One table per schema | One table per Computed/Imported | +| Table name | `~jobs` | `~~analysis`, `~~spike_sorting`, etc. | +| Key storage | Hashed (opaque) | Native primary key (readable) | +| Statuses | `reserved`, `error`, `ignore` | + `pending`, `success` | +| Priority | Not supported | `priority` column (lower = more urgent) | +| Scheduling | Not supported | `scheduled_time` for delayed jobs | +| Job metadata | Not supported | `_job_start_time`, `_job_duration`, `_job_version` | +| Semantic matching | Not supported | `~lineage` table for join validation | + +**Migration:** Legacy `~jobs` continues to work. New `~~table_name` tables are created automatically when using `populate(reserve_jobs=True)`. Drop `~jobs` in Phase 4. + +**Learn more:** [AutoPopulate Reference](../reference/specs/autopopulate.md) Β· [Computation Tutorial](../tutorials/basics/05-computation.ipynb) + +### Fetch API Changes + +The `fetch()` method is replaced with explicit output methods: + +| Legacy | 2.0 | Returns | +|--------|-----|---------| +| `table.fetch()` | `table.to_arrays()` | NumPy record array | +| `table.fetch('a', 'b')` | `table.to_arrays('a', 'b')` | Tuple of arrays | +| `table.fetch("KEY", 'a', 'b')` | `table.to_arrays('a', 'b', include_key=True)` | Tuple: (key array, a, b) | +| `table.fetch(as_dict=True)` | `table.to_dicts()` | List of dicts | +| `table.fetch(format='frame')` | `table.to_pandas()` | DataFrame | +| `table.fetch("KEY")` | `table.keys()` | List of primary key dicts | +| `table.fetch(dj.key)` | `table.keys()` | List of primary key dicts | +| `table.fetch1()` | `table.fetch1()` | Single dict (unchanged) | +| `table.fetch1('a', 'b')` | `table.fetch1('a', 'b')` | Tuple of values (unchanged) | + +**For AI agents:** Apply these substitutions mechanically. The conversion is straightforward. + +### Removed API Components + +The following legacy API components have been removed in 2.0: + +| Legacy | Replacement | Notes | +|--------|-------------|-------| +| `dj.schema(...)` | `dj.Schema(...)` | Use capitalized class name | +| `dj.ERD(...)` | `dj.Diagram(...)` | ERD alias removed | +| `dj.Di(...)` | `dj.Diagram(...)` | Di alias removed | +| `dj.key` | `table.keys()` | Use keys() method instead | +| `dj.key_hash(...)` | β€” | Removed (was for legacy job debugging) | + +**For AI agents:** Search and replace these patterns: + +```python +# Schema alias +dj.schema( β†’ dj.Schema( + +# Diagram aliases +dj.ERD( β†’ dj.Diagram( +dj.Di( β†’ dj.Diagram( + +# Key access (magic string and constant) +.fetch("KEY") β†’ .keys() +.fetch(dj.key) β†’ .keys() +``` + +### Semantic Matching + +DataJoint 2.0 uses **semantic matching** for joins instead of classic natural joins. Rather than matching attributes solely by name, DataJoint validates that attributes share common lineage (origin) before allowing binary operations (`*`, `&`, `-`). + +**Why this matters:** In classic natural joins, two attributes named `session_id` would be matched even if they refer to different entities. Semantic matching prevents this by ensuring attributes have the same semantic meaning through their foreign key relationships. + +**Impact:** A small number of existing queries may fail if they join tables on attributes that have the same name but different origins. Phase 2 builds the `~lineage` table that tracks attribute origins through foreign key relationships. + +**If a query fails semantic checking:** This indicates the join is likely malformed. Review the query to ensure: + +- Attributes being matched represent the same entity (share lineage) +- You're not accidentally joining on attributes that happen to have the same name +- The tables have a logical relationship through foreign keys + +If you genuinely need to join on attributes with the same name but different lineage (rare), you can bypass the check: + +```python +# Only if intentionally joining on name-matched but semantically unrelated attributes +result = TableA.join(TableB, semantic_check=False) +``` + +**Learn more:** [Semantic Matching Specification](../reference/specs/semantic-matching.md) Β· [Query Algebra](../explanation/query-algebra.md) + +--- + +## Phase 1: Run DataJoint 2.0 on Existing Databases + +**Goal:** Get DataJoint 2.0 Python code working with existing legacy databases without any schema modifications. + +### 1.1 Configure and Verify Settings + +**First step:** Migrate configuration from `dj_local_conf.json` to 2.0 format. + +#### Configuration File Migration + +```bash +# legacy location +dj_local_conf.json + +# 2.0 locations (priority order) +.secrets/ # Credentials (gitignored) +datajoint.json # Non-sensitive settings +environment variables # DJ_HOST, DJ_USER, etc. +``` + +#### Migration Steps + +```python +import datajoint as dj + +# Step 1: Create template configuration +dj.config.save_template() # Creates datajoint.json template + +# Step 2: Move credentials to .secrets/ +# Create .secrets/datajoint.json with: +# { +# "database.host": "your-host", +# "database.user": "your-user", +# "database.password": "your-password" +# } + +# Step 3: Verify connection +dj.conn() # Should connect successfully + +# Step 4: Verify store configuration (if using external storage) +from datajoint.migrate import check_store_configuration +check_store_configuration(schema) +``` + +#### AI Agent Prompt (Phase 1 - Configuration) + +``` +You are setting up DataJoint 2.0 configuration for an existing project. + +TASK: Migrate from dj_local_conf.json to 2.0 configuration format. + +STEPS: +1. Read existing dj_local_conf.json (if present) +2. Create datajoint.json with non-sensitive settings +3. Create .secrets/datajoint.json with credentials +4. Add .secrets/ to .gitignore if not present +5. Verify connection: dj.conn() +6. If external stores configured, verify: check_store_configuration(schema) + +CONFIGURATION MAPPING: +- database.host β†’ .secrets/datajoint.json or DJ_HOST env var +- database.user β†’ .secrets/datajoint.json or DJ_USER env var +- database.password β†’ .secrets/datajoint.json or DJ_PASS env var +- stores.* β†’ datajoint.json (paths) + .secrets/ (credentials) + +VERIFICATION: +- dj.conn() succeeds +- dj.config shows expected values +- External stores accessible (if configured) + +DO NOT commit credentials to version control. +``` + +### 1.2 Breaking API Changes + +The following legacy patterns must be updated in Python code: + +#### Fetch API (Removed) + +```python +# legacy (REMOVED) +data = table.fetch() +data = table.fetch('attr1', 'attr2') +data = table.fetch(as_dict=True) +row = table.fetch1() + +# 2.0 Replacements +data = table.to_arrays() # recarray-like +data = table.to_arrays('attr1', 'attr2') # tuple of arrays +data = table.to_dicts() # list of dicts +row = table.fetch1() # unchanged for single row +keys = table.keys() # primary keys as dicts +df = table.to_pandas() # NEW: DataFrame output +``` + +#### Update Method (Removed) + +```python +# legacy (REMOVED) +(table & key)._update('attr', value) + +# 2.0 Replacement +table.update1({**key, 'attr': value}) +``` + +#### Join Operators (Changed) + +```python +# legacy (REMOVED) +result = table1 @ table2 # natural join without semantic check +result = dj.U('attr') * table # universal set multiplication + +# 2.0 Replacements +result = table1 * table2 # try natural join first (with semantic check) +# If semantic check fails, review the join - it may be malformed +# Only use semantic_check=False if the bypass is truly needed: +result = table1.join(table2, semantic_check=False) + +result = table # U(...) * table is just table +``` + +**Learn more:** [Query Algebra](../explanation/query-algebra.md) Β· [Query Algebra Specification](../reference/specs/query-algebra.md) + +#### Insert Method (Changed) + +```python +# legacy (DEPRECATED) - positional insert +table.insert1((1, 'subject_name', '2024-01-15')) +table.insert([(1, 'name1', '2024-01-15'), (2, 'name2', '2024-01-16')]) + +# 2.0 - key-value maps required +table.insert1({'subject_id': 1, 'name': 'subject_name', 'dob': '2024-01-15'}) +table.insert([ + {'subject_id': 1, 'name': 'name1', 'dob': '2024-01-15'}, + {'subject_id': 2, 'name': 'name2', 'dob': '2024-01-16'}, +]) +``` + +**Why:** Positional inserts are fragileβ€”they break silently when columns are added or reordered. Key-value maps are explicit and self-documenting. + +#### Download Path for External Storage (Changed) + +```python +# legacy - download_path parameter in fetch +data = table.fetch('attachment_col', download_path='/data/downloads') +filepath = (table & key).fetch1('filepath_col', download_path='/data/downloads') + +# 2.0 - use configuration context manager +with dj.config.override(download_path='/data/downloads'): + data = table.to_arrays('attachment_col') + filepath = (table & key).fetch1('filepath_col') + +# Or set globally +dj.config['download_path'] = '/data/downloads' +data = table.to_arrays('attachment_col') +``` + +**Why:** Separating download location from fetch calls simplifies the API and allows consistent configuration across multiple fetches. + +### 1.3 Code Migration Checklist + +For each Python module using DataJoint: + +- [ ] Replace all `.fetch()` calls with appropriate 2.0 method +- [ ] Replace `._update()` with `.update1()` +- [ ] Replace `@` operator with `*` (review if semantic check fails) +- [ ] Replace `dj.U(...) * table` with just `table` +- [ ] Replace positional inserts with key-value dicts +- [ ] Replace `download_path=` parameter with `dj.config.override()` +- [ ] Update imports if using deprecated modules + +### 1.4 AI Agent Prompt (Phase 1 - Code Migration) + +``` +You are migrating DataJoint code from legacy to 2.0. + +TASK: Update Python code to use 2.0 API patterns. + +CHANGES REQUIRED: + +Fetch API: +1. Replace table.fetch() β†’ table.to_arrays() or table.to_dicts() +2. Replace table.fetch(as_dict=True) β†’ table.to_dicts() +3. Replace table.fetch('a', 'b') β†’ table.to_arrays('a', 'b') +4. Replace table.fetch("KEY", 'a', 'b') β†’ table.to_arrays('a', 'b', include_key=True) +5. Replace table.fetch("KEY") β†’ table.keys() +6. Replace table.fetch(dj.key) β†’ table.keys() +7. Replace fetch('col', download_path='/path') β†’ with dj.config.override(download_path='/path'): to_arrays('col') + +Removed API: +8. Replace dj.schema( β†’ dj.Schema( +9. Replace dj.ERD( β†’ dj.Diagram( +10. Replace dj.Di( β†’ dj.Diagram( +11. Remove dj.key_hash() calls (no replacement needed) + +Query operators: +12. Replace (table & key)._update('attr', val) β†’ table.update1({**key, 'attr': val}) +13. Replace table1 @ table2 β†’ table1 * table2 (if semantic check fails, review join) +14. Replace dj.U(...) * table β†’ table (universal set * table is just table) + +Insert patterns: +15. Replace positional inserts with key-value dicts: + - table.insert1((val1, val2)) β†’ table.insert1({'col1': val1, 'col2': val2}) + - table.insert([(v1, v2), ...]) β†’ table.insert([{'c1': v1, 'c2': v2}, ...]) + +DO NOT modify table definitions or database schema. +``` + +--- + +## Phase 2: Schema Metadata Updates + +**Goal:** Update database metadata (column comments) to enable 2.0 type recognition while maintaining full legacy compatibility. + +### 2.0 Backup Before Schema Changes + +**Create a full database backup before proceeding.** Phase 2 modifies column comments and creates hidden tables. While these changes are designed to be backward-compatible, a backup ensures you can recover if anything goes wrong. + +```bash +# Full database dump (all schemas) +mysqldump -u root -p --all-databases --routines --triggers > backup_pre_phase2.sql + +# Or specific schemas +mysqldump -u root -p --databases lab subject session ephys > backup_pre_phase2.sql + +# Compressed backup for large databases +mysqldump -u root -p --all-databases | gzip > backup_pre_phase2.sql.gz +``` + +**For managed databases (AWS RDS, Azure, etc.):** Use your cloud provider's snapshot feature. + +**Verify your backup** before proceeding: +```bash +# Check backup file size (should be non-trivial) +ls -lh backup_pre_phase2.sql* + +# Optionally restore to a test database to verify +mysql -u root -p test_restore < backup_pre_phase2.sql +``` + +### 2.1 Column Type Labels + +DataJoint 2.0 uses column comments to identify types. Migration adds type labels to: + +**Numeric columns:** +```sql +-- legacy +COLUMN_TYPE = 'smallint unsigned' +COLUMN_COMMENT = 'trial number' + +-- 2.0: Comment prefixed with core type +COLUMN_TYPE = 'smallint unsigned' +COLUMN_COMMENT = ':uint16:trial number' +``` + +**Blob columns:** +```sql +-- legacy +COLUMN_TYPE = 'longblob' +COLUMN_COMMENT = 'neural waveform data' + +-- 2.0: Comment prefixed with codec +COLUMN_TYPE = 'longblob' +COLUMN_COMMENT = '::neural waveform data' +``` + +**Why safe:** Legacy clients ignore the `:type:` prefix in commentsβ€”they read the MySQL column type directly. + +### 2.2 Lineage Tables + +DataJoint 2.0 tracks **attribute lineage**β€”the origin of each attribute through foreign key relationships. This enables: + +- **Semantic matching:** Validates that join operands share common ancestors before allowing binary operations (`*`, `&`, `-`) +- **Query optimization:** Uses lineage to determine optimal join paths +- **Data provenance:** Traces how derived data relates to source data + +Lineage is stored in a hidden `~lineage` table in each schema. The migration builds this table by analyzing foreign key relationships. + +```sql +-- ~lineage table structure +CREATE TABLE `~lineage` ( + table_name VARCHAR(64) NOT NULL COMMENT 'table name within the schema', + attribute_name VARCHAR(64) NOT NULL COMMENT 'attribute name', + lineage VARCHAR(255) NOT NULL COMMENT 'origin: schema.table.attribute', + PRIMARY KEY (table_name, attribute_name) +); +``` + +The `lineage` column stores the origin as a dot-separated string: `schema.table.attribute`. For example, `subject.subject.subject_id` indicates the attribute originated in the `subject` table of the `subject` schema. + +**Why safe:** Legacy clients ignore tables prefixed with `~`. + +**Learn more:** [Semantic Matching Specification](../reference/specs/semantic-matching.md) Β· [Query Algebra](../explanation/query-algebra.md) Β· [Entity Integrity Concept](../explanation/entity-integrity.md) + +### 2.3 Migration Commands + +```python +import datajoint as dj +from datajoint.migrate import migrate_columns + +schema = dj.Schema('my_database') + +# Step 1: Preview what needs migration +result = migrate_columns(schema, dry_run=True) +for col in result['columns']: + print(f"{col['table']}.{col['column']}: {col['native_type']} β†’ {col['core_type']}") + +# Step 2: Apply migration (adds type labels to column comments) +result = migrate_columns(schema, dry_run=False) +print(f"Migrated {result['columns_migrated']} columns") + +# Step 3: Build lineage table +schema.rebuild_lineage() +``` + +**Important:** When migrating multiple schemas, process them in **topological order** (upstream schemas first). For each schema, complete both database migration AND Python code updates before moving to the next schema. + +If you process out of order, `rebuild_lineage()` raises a `DataJointError` identifying the missing upstream schema: + +``` +DataJointError: Cannot rebuild lineage for `session`.`session`: +referenced attribute `subject`.`subject`.`subject_id` has no lineage. +Rebuild lineage for schema `subject` first. +``` + +**Recovery:** Simply re-run in correct orderβ€”each `rebuild_lineage()` clears and rebuilds, so it's safe to retry. + +```python +# Example: multi-schema pipeline +# Process each schema fully before moving to the next + +# Schema 1: lab (no dependencies) +schema = dj.Schema('lab') +migrate_columns(schema, dry_run=False) +schema.rebuild_lineage() +# Now update src/pipeline/lab.py table definitions β†’ core types + +# Schema 2: subject (depends on lab) +schema = dj.Schema('subject') +migrate_columns(schema, dry_run=False) +schema.rebuild_lineage() +# Now update src/pipeline/subject.py table definitions β†’ core types + +# Schema 3: session (depends on subject) +schema = dj.Schema('session') +migrate_columns(schema, dry_run=False) +schema.rebuild_lineage() +# Now update src/pipeline/session.py table definitions β†’ core types + +# Schema 4: ephys (depends on session) +schema = dj.Schema('ephys') +migrate_columns(schema, dry_run=False) +schema.rebuild_lineage() +# Now update src/pipeline/ephys.py table definitions β†’ core types +``` + +The database migration makes all type conversions explicit: + +- Numeric: `int unsigned` β†’ `:uint32:`, `smallint` β†’ `:int16:`, etc. (MySQL native types) +- Blobs: `tinyblob`, `blob`, `mediumblob`, `longblob` β†’ `::` (was implicit serialization) +- Inline attachments: `attach` β†’ `::` (was implicit conversion to longblob) + +**Why this matters:** Legacy DataJoint overloaded all blob types and `attach` with implicit conversions. In 2.0, all serialization is explicit through codecs. + +External storage columns (`blob@store`, `attach@store`, `filepath@store`) are **not** migrated hereβ€”they require Phase 3-4. + +After the database migration for each schema, update the corresponding Python module(s) to use explicit type syntax (see section 2.4). + +### 2.4 Update Table Definitions + +After migrating each schema's database metadata (section 2.3), update the corresponding Python module(s) to use core types instead of native MySQL types. + +**Important:** Do this for each schema immediately after its database migration, maintaining topological order. This keeps the Python code in sync with the database as you progress through the pipeline. + +#### Type Replacements + +Replace legacy syntax with explicit 2.0 codecs: + +| Legacy Syntax | 2.0 Explicit Syntax | +|---------------|---------------------| +| `tinyint` | `int8` | +| `tinyint unsigned` | `uint8` | +| `smallint` | `int16` | +| `smallint unsigned` | `uint16` | +| `int` | `int32` | +| `int unsigned` | `uint32` | +| `bigint` | `int64` | +| `bigint unsigned` | `uint64` | +| `float` | `float32` | +| `double` | `float64` | +| `tinyblob`, `blob`, `mediumblob`, `longblob` | `` | +| `attach` | `` | + +#### Special Cases + +**Boolean attributes:** + +Legacy DataJoint allowed `bool` or `boolean` in definitions, but MySQL converted these to `tinyint(1)`. DataJoint 2.0 has an explicit `bool` core type. + +When migrating, the agent should infer intent from context: +- If the attribute stores true/false values β†’ use `bool` +- If it stores small integers (0-255) β†’ use `uint8` + +```python +# Legacy: was this meant to be boolean or integer? +is_valid : tinyint(1) # Likely boolean β†’ bool +error_code : tinyint(1) # Likely integer β†’ uint8 + +# Ask user to confirm ambiguous cases +``` + +**Datetime and timestamp attributes:** + +DataJoint 2.0 supports `datetime` with UTC onlyβ€”no timezone support. Existing `timestamp` columns need review: + +| Legacy Type | 2.0 Handling | +|-------------|--------------| +| `datetime` | Keep as `datetime` (UTC assumed) | +| `timestamp` | Convert to `datetime` (review timezone handling) | +| `date` | Keep as `date` (no change) | +| `time` | Keep as `time` (no change) | + +For `timestamp` columns, the agent should ask the user: +- Was this storing UTC times? β†’ Convert to `datetime` +- Was this using MySQL's auto-update behavior? β†’ Review application logic + +```python +# Legacy +created_at : timestamp # Review: convert to datetime? +session_date : date # No change needed + +# 2.0 +created_at : datetime # UTC assumed +session_date : date # Unchanged +``` + +**Enum attributes:** + +`enum` is a core type in DataJoint 2.0β€”no changes required. + +```python +# No change needed +sex : enum('M', 'F', 'U') +``` + +#### Example + +```python +# Legacy definition +@schema +class Trial(dj.Manual): + definition = """ + -> Session + trial_num : smallint unsigned # trial number + --- + start_time : float # seconds + duration : float # seconds + stimulus : longblob # stimulus parameters + """ + +# 2.0 definition +@schema +class Trial(dj.Manual): + definition = """ + -> Session + trial_num : uint16 # trial number + --- + start_time : float32 # seconds + duration : float32 # seconds + stimulus : # stimulus parameters + """ +``` + +**Why update definitions?** + +- **Clarity:** Core types are explicit about size and signedness +- **Portability:** Core types map consistently across database backends +- **Forward compatibility:** New tables should use core types; updating existing definitions maintains consistency + +### 2.5 AI Agent Prompt (Phase 2) + +``` +You are migrating a DataJoint schema from legacy to 2.0. + +TASK: Update database metadata AND corresponding Python module code. + +CRITICAL: For multi-schema pipelines, process schemas in TOPOLOGICAL ORDER +(upstream first). Each rebuild_lineage() assumes upstream schemas are done. +For EACH schema, you must migrate both the database AND the Python code before +moving to the next schema. + +WORKFLOW: +1. Identify all schemas and their dependencies (upstream β†’ downstream) +2. For each schema in topological order: + + A. MIGRATE DATABASE: + a. Connect: schema = dj.Schema('database_name') + b. Preview: result = migrate_columns(schema, dry_run=True) + c. Review columns needing migration + d. Apply: migrate_columns(schema, dry_run=False) + e. Build lineage: schema.rebuild_lineage() + + B. UPDATE PYTHON CODE: + a. Identify Python module(s) defining this schema's tables + (Look for @schema decorator or schema.context references) + b. Open each module file + c. Update table definition strings to use core types (see TYPE MAPPING below) + d. Save and commit changes + + C. VERIFY before proceeding to next schema: + - schema.rebuild_lineage() succeeded + - Python code uses core types + - Can import and instantiate tables with 2.0 client + +TYPE MAPPING (for Python definition strings): +- tinyint unsigned β†’ uint8 +- smallint unsigned β†’ uint16 +- int unsigned β†’ uint32 +- bigint unsigned β†’ uint64 +- tinyint β†’ int8 +- smallint β†’ int16 +- int β†’ int32 +- bigint β†’ int64 +- float β†’ float32 +- double β†’ float64 +- tinyblob, blob, mediumblob, longblob β†’ +- attach β†’ + +SPECIAL CASES (ask user to confirm): +- tinyint(1) / bool / boolean: Infer intent from context. + If stores true/false β†’ bool. If stores integers β†’ uint8. +- timestamp: Convert to datetime. DataJoint 2.0 uses UTC only. + Ask user about timezone handling if unclear. + +EXAMPLE WORKFLOW: +Schema: lab (no dependencies) + β†’ migrate_columns('lab') + β†’ rebuild_lineage() + β†’ Update src/pipeline/lab.py table definitions + β†’ Verify: import lab; lab.User() + +Schema: subject (depends on lab) + β†’ migrate_columns('subject') + β†’ rebuild_lineage() + β†’ Update src/pipeline/subject.py table definitions + β†’ Verify: import subject; subject.Subject() + +FINAL VERIFICATION: +- All schemas migrated in topological order +- All Python modules updated +- Legacy clients still work (ignore comment prefixes) +- 2.0 client recognizes all types (except legacy external storage and AdaptedTypes - see Phase 3) +- All ~lineage tables exist +``` + +### 2.6 Validation + +After Phase 2: + +- [ ] Legacy clients can still read/write all data +- [ ] 2.0 clients recognize all column types except: + - Legacy external storage (`blob@store`, `attach@store`, `filepath@store`) - requires Phase 3-4 + - Legacy AdaptedTypes - requires Phase 3 conversion to Codecs +- [ ] `~lineage` table exists and is populated for each schema +- [ ] Python definition strings updated to use core types +- [ ] No data format changes occurred + +**Why safe:** Legacy ignores `~lineage` tables (prefixed with `~`). Definition string changes don't affect the database. + +**Next steps:** If your schema uses legacy external storage or AdaptedTypes, proceed to Phase 3. Otherwise, your migration is complete and you can skip to Phase 5 to learn about new features. + +--- + +## Phase 3: External Storage Migration + +**Goal:** Create dual attributes for external storage columns, enabling both APIs to coexist safely during cross-testing. + +**Skip this phase** if your schema does not use legacy external storage (`blob@store`, `attach@store`, `filepath@store`). + +### 3.1 Create Per-Table Job Tables (Optional) + +Jobs 2.0 uses per-table job tracking. These are created automatically when using `populate(reserve_jobs=True)`, but you can create them explicitly: + +```python +# For each Computed/Imported table +MyComputedTable.jobs.refresh() # Creates ~~my_computed_table if missing +``` + +**Why safe:** Legacy ignores tables prefixed with `~~`. The legacy `~jobs` table remains functional. + +### 3.2 Add Job Metadata Columns (Optional) + +```python +from datajoint.migrate import add_job_metadata_columns + +# Preview +result = add_job_metadata_columns(schema, dry_run=True) + +# Apply (adds _job_start_time, _job_duration, _job_version) +result = add_job_metadata_columns(schema, dry_run=False) +``` + +**Why safe:** Legacy ignores columns prefixed with `_` (hidden attributes). + +### 3.3 Migrate Legacy AdaptedAttributes + +**Skip this section** if you did not create custom `dj.AttributeAdapter` subclasses. + +Legacy DataJoint allowed advanced users to define custom column types via `AttributeAdapter`. In DataJoint 2.0, this is replaced by the **[Codec API](../reference/specs/codec-api.md)**. + +#### Migration Steps + +1. **Identify existing adapters** in your codebase: + ```bash + grep -r "AttributeAdapter\|dj.AttributeAdapter" --include="*.py" . + ``` + +2. **For each adapter found**, point your AI agent to the [Codec API Specification](../reference/specs/codec-api.md) to rewrite it as a codec. + +3. **Update table definitions** to use the new codec syntax instead of adapter type names. + +#### Example Transformation + +```python +# Legacy AttributeAdapter +@schema +class MyAdapter(dj.AttributeAdapter): + attribute_type = 'longblob' + + def put(self, obj): + return pickle.dumps(obj) + + def get(self, value): + return pickle.loads(value) + +# 2.0 Codec (see Codec API Spec for full details) +@dj.codec('my_type') +class MyCodec: + dtype = 'bytes' # Use bytes since pickle already serializes + + def encode(self, obj): + return pickle.dumps(obj) + + def decode(self, value): + return pickle.loads(value) +``` + +#### AI Agent Prompt (AdaptedAttribute Migration) + +``` +You are migrating a legacy DataJoint AttributeAdapter to the 2.0 Codec API. + +REFERENCE: Read the Codec API Specification for the full codec interface. + +TASK: +1. Identify the AttributeAdapter subclass and its put/get methods +2. Create a new codec class with encode/decode methods +3. Register it with @dj.codec('type_name') decorator +4. Update table definitions to use the new codec type + +The user will point you to their adapter code. Ask clarifying questions +if the adapter behavior is unclear. +``` + +**Note:** Existing data stored via AttributeAdapter remains readableβ€”the underlying blob format is unchanged. Only the Python interface changes. + +### 3.4 Dual Attributes for External Storage + +For tables with external blob/attach/filepath attributes, create **duplicate attributes** that support the 2.0 API while preserving the original for legacy compatibility. + +#### Naming Convention + +``` +Original attribute: signal (legacy API - BINARY(16) with :blob@store:) +New attribute: signal_v2 (2.0 API - JSON with metadata) +``` + +#### How It Works + +1. **Idempotent migration script** scans for columns with `:external*:` in comments +2. For each legacy external attribute, adds a new `_v2` attribute with JSON type +3. Copies data from the `~external_` table into the new JSON field +4. Both attributes coexist - legacy reads `signal`, 2.0 reads `signal_v2` + +#### Migration Commands + +Two functions handle different external storage types: + +| Function | Handles | +|----------|---------| +| `migrate_external()` | Legacy `blob@store` and `attach@store` columns | +| `migrate_filepath()` | Legacy `filepath` columns | + +```python +from datajoint.migrate import migrate_external, migrate_filepath + +# Step 1: Preview external blobs/attachments +result = migrate_external(schema, dry_run=True) +for col in result['details']: + print(f"{col['table']}.{col['column']} β†’ {col['column']}_v2") + +# Step 2: Preview filepaths +result = migrate_filepath(schema, dry_run=True) +for col in result['details']: + print(f"{col['table']}.{col['column']} β†’ {col['column']}_v2") + +# Step 3: Create dual attributes (idempotent - safe to run multiple times) +migrate_external(schema, dry_run=False) +migrate_filepath(schema, dry_run=False) + +# Step 4: Verify data accessible via both APIs +# Legacy: table.fetch('signal') β†’ reads from BINARY(16) column +# 2.0: table.fetch1('signal_v2') β†’ reads from JSON column +``` + +#### Schema Change Example + +```sql +-- Before (legacy only) +CREATE TABLE recording ( + recording_id INT UNSIGNED NOT NULL, + signal BINARY(16) COMMENT ':blob@raw:neural signal data', + PRIMARY KEY (recording_id) +); + +-- After Phase 3 (both APIs supported) +CREATE TABLE recording ( + recording_id INT UNSIGNED NOT NULL, + signal BINARY(16) COMMENT ':blob@raw:neural signal data', + signal_v2 JSON COMMENT ':blob@raw: neural signal data', + PRIMARY KEY (recording_id) +); +``` + +#### Table Definition Update (Recommended) + +Update Python table definitions to declare both attributes: + +```python +@schema +class Recording(dj.Manual): + definition = ''' + recording_id : int unsigned + --- + signal : blob@raw # Legacy API + signal_v2 : # 2.0 API + ''' +``` + +**Why safe:** + +- Legacy reads `signal` (original column) +- 2.0 reads `signal_v2` (new column) +- Each API uses its own columnβ€”no interference +- Rollback: simply drop the `*_v2` columns + +**Cross-testing:** During this phase, test your pipeline with both APIs to verify data consistency before Phase 4. + +### 3.5 AI Agent Prompt (Phase 3) + +``` +You are creating dual attributes for external storage migration. + +TASK: Add _v2 columns for external storage to enable cross-testing. + +PREREQUISITE: Phase 2 must be complete (~lineage tables exist). + +STEPS: +1. Connect to schema: schema = dj.Schema('database_name') +2. Create dual external attributes: + - from datajoint.migrate import migrate_external + - result = migrate_external(schema, dry_run=False) +3. Optionally create job tables: + - TableClass.jobs.refresh() for Computed/Imported tables + +VERIFICATION: +- Fetch from original attribute with LEGACY client β†’ works +- Fetch from *_v2 attribute with 2.0 client β†’ works +- Compare data from both APIs for consistency + +REPORT: +- List all *_v2 columns created +- Row counts migrated per column +- Any data mismatches found during cross-testing +``` + +### 3.6 Phase 3 Checklist + +- [ ] Migrate any `AttributeAdapter` subclasses to Codec API +- [ ] Run `migrate_external()` for each schema with external storage +- [ ] Optionally run `Table.jobs.refresh()` for Computed/Imported tables +- [ ] Optionally run `add_job_metadata_columns()` +- [ ] Verify legacy clients can read original external attributes +- [ ] Verify 2.0 clients can read new `*_v2` attributes +- [ ] Cross-test: compare data from both APIs for consistency +- [ ] Update table definitions to declare both attributes + +--- + +## Phase 4: Point of No Return + +**WARNING:** After Phase 4, legacy clients will no longer work with the database. + +### 4.1 Pre-Flight Checklist + +Before proceeding: + +- [ ] **All clients upgraded:** Confirm no legacy processes running +- [ ] **Database backup:** Full backup with tested restore procedure +- [ ] **Dual attributes verified:** All `*_v2` attributes have valid data (from Phase 3) +- [ ] **Pipeline quiesced:** No active populate jobs +- [ ] **Team confirmation:** All users aware of cutover + +### 4.2 Finalize External Storage Migration + +Phase 3 created dual attributes (`signal` + `signal_v2`). Now remove the legacy attributes. + +```python +from datajoint.migrate import migrate_external + +# Step 1: Verify all *_v2 attributes have data +result = migrate_external(schema, dry_run=True, finalize=True) +for col in result['details']: + print(f"{col['table']}: {col['column']} β†’ finalize") + print(f" Rows migrated: {col['rows']}") + +# Step 2: Finalize (renames legacy β†’ _v1, renames _v2 β†’ original name) +result = migrate_external(schema, dry_run=False, finalize=True) + +# After finalization: +# - signal renamed to signal_v1 (legacy backup) +# - signal_v2 renamed to signal +# - ~external_* tables can be dropped +``` + +**Breaking:** Legacy clients cannot read the new JSON-format columns. + +### 4.3 Cleanup Legacy Tables + +```python +# Drop legacy jobs table (after confirming populate(reserve_jobs=True) works) +schema.connection.query(f"DROP TABLE IF EXISTS `{schema.database}`.`~jobs`") + +# Drop legacy external tracking tables (after external migration finalized) +for store in ['external', 'external_raw', ...]: # your store names + schema.connection.query(f"DROP TABLE IF EXISTS `{schema.database}`.`~external_{store}`") +``` + +### 4.4 Update Table Definitions + +Update Python source code to use 2.0 type syntax (remove dual attributes): + +```python +# Phase 3 syntax (dual attributes) +definition = ''' + recording_id : int unsigned + --- + signal : blob@raw # Legacy API + signal_v2 : # 2.0 API +''' + +# Phase 4 syntax (2.0 only) +definition = ''' + recording_id : uint32 + --- + signal : # Single attribute, 2.0 format +''' +``` + +#### Type Syntax Updates + +Replace legacy syntax with explicit 2.0 codecs: + +| Legacy Syntax | 2.0 Explicit Syntax | +|---------------|---------------------| +| `int unsigned` | `uint32` | +| `int` | `int32` | +| `smallint unsigned` | `uint16` | +| `tinyint unsigned` | `uint8` | +| `float` | `float32` | +| `double` | `float64` | +| `tinyblob`, `blob`, `mediumblob`, `longblob` | `` | +| `attach` | `` | +| `blob@store` | `` | +| `attach@store` | `` | +| `filepath@store` | `` | + +### 4.5 AI Agent Prompt (Phase 4 - Pre-Flight) + +``` +You are preparing for the point-of-no-return migration phase. + +TASK: Verify all prerequisites before breaking legacy compatibility. + +PRE-FLIGHT CHECKS: +1. Database backup exists and restore tested +2. No legacy client processes running (check SHOW PROCESSLIST) +3. All *_v2 dual attributes have complete data (from Phase 3) +4. No pending populate jobs +5. Team notified of cutover + +VERIFICATION COMMANDS: +- schema.connection.query("SHOW PROCESSLIST") - check for old clients +- from datajoint.migrate import migrate_columns +- result = migrate_columns(schema, dry_run=True) - verify Phase 2 complete (columns should be empty) +- from datajoint.migrate import migrate_external +- result = migrate_external(schema, dry_run=True, finalize=True) - verify Phase 3 data complete + +REPORT FORMAT: +- Backup status: [confirmed/missing] +- Active clients: [list any legacy processes] +- Dual attributes: [all complete/rows missing] +- Migration status: [ready/blockers] + +DO NOT proceed if any blockers found. Report issues to user. +``` + +### 4.6 AI Agent Prompt (Phase 4 - Execution) + +``` +You are finalizing DataJoint 2.0 migration. Legacy support is being removed. + +TASK: Finalize external storage and update table definitions. + +STEPS: +1. Finalize external migration: + - from datajoint.migrate import migrate_external + - migrate_external(schema, dry_run=False, finalize=True) + +2. Drop legacy tables: + - DROP TABLE IF EXISTS `schema`.`~jobs` + - DROP TABLE IF EXISTS `schema`.`~external_*` + +3. Update table definitions to 2.0 syntax: + - Remove dual attributes (keep only *_v2 version, rename to original) + - Update type syntax (see TYPE REPLACEMENTS below) + +TYPE REPLACEMENTS (legacy implicit conversions β†’ explicit codecs): +- int unsigned β†’ uint32 +- int β†’ int32 +- smallint unsigned β†’ uint16 +- tinyint unsigned β†’ uint8 +- float β†’ float32 +- double β†’ float64 +- tinyblob, blob, mediumblob, longblob β†’ +- attach β†’ +- blob@store β†’ +- attach@store β†’ +- filepath@store β†’ + +VERIFICATION: +- All tables accessible via 2.0 client +- All external data fetchable +- No legacy tables remaining +``` + +### 4.7 Phase 4 Checklist + +- [ ] Pre-flight checks passed +- [ ] Database backup verified +- [ ] `migrate_external(finalize=True)` executed successfully +- [ ] Legacy `~jobs` table dropped +- [ ] Legacy `~external_*` tables dropped +- [ ] Table definitions updated to 2.0 syntax +- [ ] All dual attributes consolidated +- [ ] Full functionality verified with 2.0 client only + +--- + +## Phase 5: Adopt New Features + +### 5.1 Feature Adoption Order + +Recommended order from simplest to most complex: + +| Order | Feature | Complexity | Tutorial | +|-------|---------|------------|----------| +| 1 | dj.Top operator | Low | [Query Algebra](../explanation/query-algebra.md) Β· [Queries Tutorial](../tutorials/basics/04-queries.ipynb) | +| 2 | Core types (uint32, float64) | Low | [Define Tables](define-tables.md) | +| 3 | Configuration system | Low | [Configuration Reference](../reference/configuration.md) | +| 4 | Semantic matching | Medium | [Query Algebra](../explanation/query-algebra.md) Β· [Semantic Matching Spec](../reference/specs/semantic-matching.md) | +| 5 | Jobs 2.0 | Medium | [Distributed Computing](../tutorials/advanced/distributed.ipynb) | +| 6 | Custom codecs | Medium | [Custom Codecs](../tutorials/advanced/custom-codecs.ipynb) | +| 7 | Object storage | High | [Object Storage Tutorial](../tutorials/basics/06-object-storage.ipynb) | + +### 5.2 AI Agent Prompt (Phase 5 - Learning) + +``` +You are helping a user learn DataJoint 2.0 features after migration. + +TASK: Guide adoption of new features based on user's needs. + +FEATURE PRIORITY: +1. dj.Top - If user has pagination/ordering queries +2. Semantic matching - If user has complex joins across schemas +3. Jobs 2.0 - If user runs distributed computations +4. Custom codecs - If user has domain-specific data types +5. Object storage - If user has large arrays or files + +FOR EACH FEATURE: +1. Assess current usage patterns in user's code +2. Identify where new feature would help +3. Provide minimal example from their codebase context +4. Link to appropriate tutorial document + +DO NOT introduce all features at once. Focus on immediate value. +``` + +### 5.3 Learning Resources + +- **Basics**: [Tutorials](../tutorials/index.md) - Start here for core concepts +- **Advanced**: [Advanced Tutorials](../tutorials/advanced/custom-codecs.ipynb) - Codecs, distributed computing +- **How-To**: [How-To Guides](index.md) - Task-oriented guides +- **Concepts**: [Explanation](../explanation/index.md) - Why things work the way they do +- **Reference**: [Reference](../reference/index.md) - Complete API and specification + +--- + +## Phase 6: Cleanup Legacy Tables (Optional) + +**Goal:** Remove legacy hidden tables that are no longer needed after full migration to 2.0. + +### 6.1 Tables to Remove + +| Table | Purpose | When to Drop | +|-------|---------|--------------| +| `~log` | Schema change log | After confirming no tools depend on it | +| `~jobs` | Legacy job reservation | After confirming `populate(reserve_jobs=True)` works | +| `~external_*` | Legacy external storage tracking | After Phase 4 (external migration finalized) | + +### 6.2 Cleanup Commands + +```python +import datajoint as dj + +schema = dj.Schema('my_database') +conn = schema.connection + +# Step 1: Verify no legacy processes are using these tables +# Check that all clients are on 2.0 + +# Step 2: Drop legacy log table +conn.query(f"DROP TABLE IF EXISTS `{schema.database}`.`~log`") + +# Step 3: Drop legacy jobs table (after populate(reserve_jobs=True) works) +conn.query(f"DROP TABLE IF EXISTS `{schema.database}`.`~jobs`") + +# Step 4: Drop legacy external tracking tables +# List your store names +for store in ['external', 'external_raw', 'external_analysis']: + conn.query(f"DROP TABLE IF EXISTS `{schema.database}`.`~external_{store}`") +``` + +### 6.3 Pre-Cleanup Checklist + +- [ ] All clients upgraded to DataJoint 2.0 +- [ ] No legacy processes running +- [ ] `populate(reserve_jobs=True)` works correctly +- [ ] External storage migration finalized (Phase 4 complete) +- [ ] Database backup taken + +### 6.4 AI Agent Prompt (Phase 6) + +``` +You are cleaning up legacy tables after DataJoint 2.0 migration. + +TASK: Remove legacy hidden tables that are no longer needed. + +PREREQUISITES: +- Phase 4 must be complete (no legacy clients) +- populate(reserve_jobs=True) must work +- Database backup must exist + +TABLES TO DROP: +- ~log: Schema change log (rarely used) +- ~jobs: Legacy job reservation table +- ~external_*: Legacy external storage tracking + +STEPS: +1. Verify no legacy processes: SHOW PROCESSLIST +2. Verify job reservation works: test populate(reserve_jobs=True) +3. Drop tables using: DROP TABLE IF EXISTS `schema`.`~table_name` +4. Verify cleanup complete + +DO NOT drop tables if any legacy clients are still running. +``` + +--- + +## Helper Functions in datajoint.migrate + +The migration module focuses on **integrity checks**, **rebuild/restore** utilities, and **idempotent migration scripts**. + +### Column Type Migration (Phase 2) + +```python +migrate_columns(schema, dry_run=True) -> dict +``` + +Analyzes and migrates column type labels. Returns dict with: + +- `columns`: list of columns to migrate (`table`, `column`, `native_type`, `core_type`) +- `columns_migrated`: count of columns updated (0 if dry_run=True) +- `external_storage`: columns requiring Phase 3-4 (not migrated here) + +Use `dry_run=True` to preview, `dry_run=False` to apply. Migrates numeric types, ``, ``. Skips external storage (`blob@store`, `attach@store`, `filepath@store`). + +### External Storage Migration (Phase 3-4) + +```python +# Analysis (internal) +_find_external_columns(schema) -> list[dict] +_find_filepath_columns(schema) -> list[dict] + +# Migration (idempotent) +migrate_external(schema, dry_run=True, finalize=False) -> dict +migrate_filepath(schema, dry_run=True, finalize=False) -> dict +``` + +Use `dry_run=True` to preview, `dry_run=False` to execute. +Use `finalize=True` in Phase 4 to complete the migration. + +### Job Metadata + +```python +add_job_metadata_columns(target, dry_run=True) -> dict +``` + +### Integrity & Rebuild Functions + +```python +def check_store_configuration(schema) -> dict: + """ + Verify external stores are properly configured. + + Returns dict with: + + - stores_configured: list of store names with valid config + - stores_missing: list of stores referenced but not configured + - stores_unreachable: list of stores that failed connection test + """ + +def rebuild_lineage(schema, dry_run=True) -> dict: + """ + Rebuild ~lineage table from current table definitions. + Use after schema changes or to repair corrupted lineage data. + """ + +def verify_external_integrity(schema, store_name=None) -> dict: + """ + Check that all external references point to existing files. + + Returns dict with: + + - total_references: count of external entries + - valid: count with accessible files + - missing: list of entries with inaccessible files + - stores_checked: list of store names checked + """ +``` + +--- + +## Verification Commands + +### Per-Phase Verification + +```python +import datajoint as dj +from datajoint.migrate import migrate_columns + +schema = dj.Schema('my_database') + +# Phase 1: Code works (manual testing) +# - Run existing queries with 2.0 client +# - Verify data readable + +# Phase 2: Column type labels migrated +result = migrate_columns(schema, dry_run=True) +print(f"Columns to migrate: {len(result['columns'])}") + +# Phase 3: Hidden tables exist +has_lineage = schema.connection.query( + "SELECT COUNT(*) FROM information_schema.TABLES " + "WHERE TABLE_SCHEMA=%s AND TABLE_NAME='~lineage'", + args=(schema.database,) +).fetchone()[0] > 0 +print(f"Lineage table: {'present' if has_lineage else 'missing'}") + +# Phase 4: External storage migrated +from datajoint.migrate import _find_external_columns +external = _find_external_columns(schema) +print(f"External columns remaining: {len(external)}") # Should be 0 + +# Phase 5: Feature adoption (per-feature testing) +``` + +--- + +## Troubleshooting + +### "Native type 'int' is used" + +Run Phase 2 to add type labels to numeric columns. + +### "No codec registered" + +Run Phase 2 to add codec labels to blob columns. + +### External data not found + +Phase 3/4: Store paths don't match legacy paths. Check: + +1. Store location in datajoint.json matches original +2. Path structure matches what's in `~external_*` table + +### Missing ~lineage table + +Run Phase 3 to create the lineage table with `schema.rebuild_lineage()`. + +### Dual attributes out of sync + +Re-run `migrate_external()` - it's idempotent and will update any missing rows. + +--- + +## See Also + +- [What's New in 2.0](../explanation/whats-new-2.md) +- [Type System](../explanation/type-system.md) +- [Configuration Reference](../reference/configuration.md) diff --git a/src/how-to/migrate-to-v20.md b/src/how-to/migrate-to-v20.md new file mode 100644 index 00000000..62b66cf4 --- /dev/null +++ b/src/how-to/migrate-to-v20.md @@ -0,0 +1,1984 @@ +# Migrate to DataJoint 2.0 + +Upgrade existing pipelines from legacy DataJoint (pre-2.0) to DataJoint 2.0. + +> **This guide is optimized for AI coding assistants.** Point your AI agent at this +> document and it will execute the migration with your oversight. + +## Requirements + +### System Requirements + +| Component | Legacy (pre-2.0) | DataJoint 2.0 | +|-----------|-----------------|---------------| +| **Python** | 3.8+ | **3.10+** | +| **MySQL** | 5.7+ | **8.0+** | +| **Character encoding** | (varies) | **UTF-8 (utf8mb4)** | +| **Collation** | (varies) | **utf8mb4_bin** | + +**Action required:** Upgrade your Python environment and MySQL server before installing DataJoint 2.0. + +**Character encoding and collation:** DataJoint 2.0 standardizes on UTF-8 encoding with binary collation (case-sensitive comparisons). This is configured **server-wide** and is assumed by DataJoint: + +- **MySQL:** `utf8mb4` character set with `utf8mb4_bin` collation +- **PostgreSQL (future):** `UTF8` encoding with `C` collation + +Like timezone handling, encoding is infrastructure configuration, not part of the data model. Ensure your MySQL server is configured with these defaults before migration. + +### License Change + +DataJoint 2.0 is licensed under **Apache 2.0** (previously LGPL-2.1). + +- More permissive for commercial and academic use +- Compatible with broader ecosystem of tools +- Clearer patent grant provisions + +No action requiredβ€”the new license is more permissive. + +### Future Backend Support + +DataJoint 2.0 introduces portable type aliases (`uint32`, `float64`, etc.) that prepare the codebase for **PostgreSQL backend compatibility** in a future release. Migration to core types ensures your schemas will work seamlessly when Postgres support is available. + +--- + +## What's New in 2.0 + +### 3-Tier Column Type System + +DataJoint 2.0 introduces a unified type system with three tiers: + +| Tier | Description | Examples | Migration | +|------|-------------|----------|-----------| +| **Native** | Raw MySQL types | `int unsigned`, `tinyint` | Auto-converted to core types | +| **Core** | Standardized portable types | `uint32`, `float64`, `varchar(100)`, `json` | Phase I | +| **Codec** | Serialization to blob or storage | ``, ``, `` | Phase I-III | + +**Learn more:** [Type System Concept](../explanation/type-system.md) Β· [Type System Reference](../reference/specs/type-system.md) + +### Codecs + +DataJoint 2.0 makes serialization **explicit** with codecs. In pre-2.0, `longblob` automatically serialized Python objects; in 2.0, you explicitly choose ``. + +#### Migration: Legacy β†’ 2.0 + +| pre-2.0 (Implicit) | 2.0 (Explicit) | Storage | Migration | +|-------------------|----------------|---------|-----------| +| `longblob` | `` | In-table | Phase I code, Phase III data | +| `mediumblob` | `` | In-table | Phase I code, Phase III data | +| `attach` | `` | In-table | Phase I code, Phase III data | +| `blob@store` | `` | In-store (hash) | Phase I code, Phase III data | +| `attach@store` | `` | In-store (hash) | Phase I code, Phase III data | +| `filepath@store` | `` | In-store (filepath) | Phase I code, Phase III data | + +#### New in 2.0: Schema-Addressed Storage + +These codecs are NEWβ€”there's no legacy equivalent to migrate: + +| Codec | Description | Storage | Adoption | +|-------|-------------|---------|----------| +| `` | NumPy arrays with lazy loading | In-store (schema) | Phase IV (optional) | +| `` | Zarr, HDF5, custom formats | In-store (schema) | Phase IV (optional) | + +**Key principles:** + +- All **legacy codec** conversions happen in Phase I (code) and Phase III (data) +- **New codecs** (``, ``) are adopted in Phase IV for new features or enhanced workflows +- Schema-addressed storage organizes data by table structureβ€”no migration needed, just new functionality + +**Learn more:** [Codec API Reference](../reference/specs/codec-api.md) Β· [Custom Codecs](../explanation/custom-codecs.md) + +### Unified Stores Configuration + +DataJoint 2.0 replaces `external.*` with unified `stores.*` configuration: + +**pre-2.0 (legacy):** +```json +{ + "external": { + "protocol": "file", + "location": "/data/external" + } +} +``` + +**2.0 (unified stores):** +```json +{ + "stores": { + "default": "main", + "main": { + "protocol": "file", + "location": "/data/stores" + } + } +} +``` + +**Learn more:** [Configuration Reference](../reference/configuration.md) Β· [Configure Object Storage](configure-storage.md) + +### Query API Changes + +| pre-2.0 | 2.0 | Phase | +|--------|-----|-------| +| `table.fetch()` | `table.to_arrays()` or `table.to_dicts()` | I | +| `table.fetch(..., format="frame")` | `table.to_pandas(...)` | I | +| `table.fetch1()` | `table.fetch1()` (unchanged) | β€” | +| `table.fetch1('KEY')` | `table.keys()` | I | +| `(table & key)._update('attr', val)` | `table.update1({**key, 'attr': val})` | I | +| `table1 @ table2` | `table1 * table2` (natural join with semantic checks) | I | +| `a.join(b, left=True)` | Consider `a.extend(b)` | I | +| `dj.U('attr') & table` | Unchanged (correct pattern) | β€” | +| `dj.U('attr') * table` | Refactor (was a hack to change primary key) | I | +| `dj.ERD(schema)` | `dj.Diagram(schema)` | I | + +**Learn more:** [Fetch API Reference](../reference/specs/fetch-api.md) Β· [Query Operators Reference](../reference/operators.md) + +--- + +## Migration Overview + +| Phase | Goal | Code Changes | Schema/Store Changes | Production Impact | +|-------|------|--------------|----------------------|-------------------| +| **I** | Branch & code migration | All API updates, type syntax, **all codecs** (in-table and in-store) | Empty `_v2` schemas + test stores | **None** | +| **II** | Test compatibility | β€” | Populate `_v2` schemas with sample data, test equivalence | **None** | +| **III** | Migrate production data | β€” | Multiple migration options | **Varies** | +| **IV** | Adopt new features | Optional enhancements | Optional | Running on 2.0 | + +**Key principles:** + +- Phase I implements ALL code changes including in-store codecs (using test stores) +- Production runs on pre-2.0 undisturbed through Phase II +- Phase III is data migration onlyβ€”the code is already complete + +**Timeline:** + +- **Phase I:** ~1-4 hours (with AI assistance) +- **Phase II:** ~1-2 days +- **Phase III:** ~1-7 days (depends on data size and option chosen) +- **Phase IV:** Ongoing feature adoption + +--- + +## Phase I: Branch and Code Migration + +**Goal:** Implement complete 2.0 API in code using test schemas and test stores. + +**End state:** + +- All Python code uses 2.0 API patterns (fetch, types, codecs) +- All codecs implemented (in-table ``, `` AND in-store ``, legacy only) +- Code points to `schema_v2` databases (empty) and test object stores +- Production continues on main branch with pre-2.0 undisturbed + +**What's NOT migrated yet:** Production data and production stores (Phase III) + +### Step 1: Pin Legacy DataJoint on Main Branch + +Ensure production code stays on pre-2.0: + +```bash +git checkout main + +# Pin legacy version in requirements +echo "datajoint<2.0.0" > requirements.txt + +git add requirements.txt +git commit -m "chore: pin legacy datajoint for production" +git push origin main +``` + +**Why:** This prevents accidental upgrades to 2.0 in production. + +### Step 2: Create Migration Branch + +```bash +# Create feature branch +git checkout -b pre/v2.0 + +# Install DataJoint 2.0 +pip install --upgrade pip +pip install "datajoint>=2.0.0" + +# Update requirements +echo "datajoint>=2.0.0" > requirements.txt + +git add requirements.txt +git commit -m "chore: upgrade to datajoint 2.0" +``` + +### Step 3: Configure DataJoint 2.0 + +Create new configuration files for 2.0. + +#### Background: Configuration Changes + +DataJoint 2.0 uses: + +- **`.secrets/datajoint.json`** for credentials (gitignored) +- **`datajoint.json`** for non-sensitive settings (checked in) +- **`stores.*`** instead of `external.*` + +**Learn more:** [Configuration Reference](../reference/configuration.md) + +#### Create Configuration Files + +```bash +# Create .secrets directory +mkdir -p .secrets +echo ".secrets/" >> .gitignore + +# Create template +python -c "import datajoint as dj; dj.config.save_template()" +``` + +**Edit `.secrets/datajoint.json`:** +```json +{ + "database.host": "your-database-host", + "database.user": "your-username", + "database.password": "your-password" +} +``` + +**Edit `datajoint.json`:** +```json +{ + "loglevel": "INFO", + "safemode": true, + "display.limit": 12, + "display.width": 100, + "display.show_tuple_count": true +} +``` + +#### Verify Connection + +```python +import datajoint as dj + +# Test connection +conn = dj.conn() +print(f"Connected to {conn.conn_info['host']}") +``` + +### Step 4: Configure Test Object Stores (If Applicable) + +**Skip this step if:** Your legacy pipeline uses only in-table storage (`longblob`, `mediumblob`, `blob`, `attach`). You can skip to Step 5. + +**Configure test stores if:** Your legacy pipeline uses pre-2.0 in-store formats: + +- `blob@store` (hash-addressed blobs in object store) +- `attach@store` (hash-addressed attachments in object store) +- `filepath@store` (filepath references to external files) + +**Note:** `` and `` are NEW in 2.0 (schema-addressed storage). They have no legacy equivalent and don't need migration. Adopt them in Phase IV for new features. + +#### Background: pre-2.0 Implicit vs 2.0 Explicit Codecs + +**pre-2.0 implicit serialization:** + +- `longblob` β†’ automatic Python object serialization (pickle) +- `mediumblob` β†’ automatic Python object serialization (pickle) +- `blob` β†’ automatic Python object serialization (pickle) +- No explicit codec choice - serialization was built-in + +**2.0 explicit codecs:** + +- `` β†’ explicit Python object serialization (same behavior, now explicit) +- `` β†’ explicit file attachment (was separate feature) +- Legacy in-store formats converted to explicit ``, ``, `` syntax + +#### Background: Unified Stores + +2.0 uses **unified stores** configuration: + +- Single `stores.*` config for all storage types (hash-addressed + schema-addressed + filepath) +- Named stores with `default` pointer +- Supports multiple stores with different backends + +**Learn more:** [Configure Object Storage](configure-storage.md) Β· [Object Store Configuration Spec](../reference/specs/object-store-configuration.md) + +#### Configure Test Stores + +**Edit `datajoint.json` to use test directories:** +```json +{ + "stores": { + "default": "main", + "main": { + "protocol": "file", + "location": "/data/v2_test_stores/main" + } + } +} +``` + +**Note:** Use separate test locations (e.g., `/data/v2_test_stores/`) to avoid conflicts with production stores. + +**For multiple test stores:** +```json +{ + "stores": { + "default": "main", + "filepath_default": "raw_data", + "main": { + "protocol": "file", + "location": "/data/v2_test_stores/main" + }, + "raw_data": { + "protocol": "file", + "location": "/data/v2_test_stores/raw" + } + } +} +``` + +**For cloud storage (using test bucket/prefix):** +```json +{ + "stores": { + "default": "s3_store", + "s3_store": { + "protocol": "s3", + "endpoint": "s3.amazonaws.com", + "bucket": "my-datajoint-test-bucket", + "location": "v2-test" + } + } +} +``` + +**Store credentials in `.secrets/stores.s3_store.access_key` and `.secrets/stores.s3_store.secret_key`:** +```bash +echo "YOUR_ACCESS_KEY" > .secrets/stores.s3_store.access_key +echo "YOUR_SECRET_KEY" > .secrets/stores.s3_store.secret_key +``` + +### Step 5: Convert Table Definitions + +Update table definitions in topological order (tables before their dependents). + +#### Background: Type Syntax Changes + +Convert ALL types and codecs in Phase I: + +**Integer and Float Types:** + +| pre-2.0 | 2.0 | Category | +|--------|-----|----------| +| `int unsigned` | `uint32` | Core type | +| `int` | `int32` | Core type | +| `smallint unsigned` | `uint16` | Core type | +| `tinyint unsigned` | `uint8` | Core type | +| `bigint unsigned` | `uint64` | Core type | +| `float` | `float32` | Core type | +| `double` | `float64` | Core type | + +**String, Date, and Structured Types:** + +| pre-2.0 | 2.0 | Notes | +|--------|-----|-------| +| `varchar(N)`, `char(N)` | Unchanged | Core types | +| `date` | Unchanged | Core type | +| `enum('a', 'b')` | Unchanged | Core type | +| `bool`, `boolean` | `bool` | Core type (MySQL stores as tinyint(1)) | +| `datetime` | `datetime` | Core type; UTC standard in 2.0 | +| `timestamp` | `datetime` | **Ask user:** Review timezone convention, convert to UTC datetime | +| `json` | `json` | Core type (was available but underdocumented) | +| `uuid` | `uuid` | Core type (widely used in legacy) | +| `text` | `varchar(N)` or keep as native | **Native type:** Consider migrating to `varchar(n)` | +| `time` | `datetime` or keep as native | **Native type:** Consider using `datetime` | +| `tinyint(1)` | `bool` or `uint8` | **Ask user:** was this boolean or small integer? | + +**Codecs:** + +| pre-2.0 | 2.0 | Category | +|--------|-----|----------| +| `longblob` | `` | Codec (in-table) | +| `attach` | `` | Codec (in-table) | +| `blob@store` | `` | Codec (in-store) | +| `attach@store` | `` | Codec (in-store) | +| `filepath@store` | `` | Codec (in-store) | + +**Important Notes:** + +- **Core vs Native Types:** DataJoint 2.0 distinguishes **core types** (portable, standardized) from **native types** (backend-specific). Core types are preferred. Native types like `text` and `time` are allowed but discouragedβ€”they may generate warnings and lack portability guarantees. + +- **Datetime/Timestamp:** DataJoint 2.0 adopts **UTC as the standard for all datetime storage**. The database stores UTC; timezones are handled by application front-ends and client APIs. For `timestamp` columns, review your existing timezone conventionβ€”you may need data conversion. We recommend adopting UTC throughout your pipeline and converting `timestamp` to `datetime`. + +- **Bool:** Legacy DataJoint supported `bool` and `boolean` types (MySQL stores as `tinyint(1)`). Keep as `bool` in 2.0. Only explicit `tinyint(1)` declarations need review: + - If used for boolean semantics (yes/no, active/inactive) β†’ `bool` + - If used for small integers (counts, indices 0-255) β†’ `uint8` + +- **Text Type:** `text` is a native MySQL type, not a core type. Consider migrating to `varchar(n)` with appropriate length. If your text truly needs unlimited length, you can keep `text` as a native type (will generate a warning). + +- **Time Type:** `time` is a native MySQL type with no core equivalent. We recommend migrating to `datetime` (which can represent both date and time components). If you only need time-of-day without date, you can keep `time` as a native type (will generate a warning). + +- **JSON:** Core type that was available in pre-2.0 but underdocumented. Many users serialized JSON into blobs. If you have custom JSON serialization in blobs, you can migrate to native `json` type (optional). + +- **Enum:** Core typeβ€”no changes needed. + +- **In-store codecs:** Code is converted in Phase I using test stores. Production data migration happens in Phase III. + +**Learn more:** [Type System Reference](../reference/specs/type-system.md) Β· [Definition Syntax](../reference/definition-syntax.md) + +#### AI Agent Prompt: Convert Table Definitions + +Use this prompt with your AI coding assistant: + +--- + +**πŸ€– AI Agent Prompt: Phase I - Table Definition Conversion** + +``` +You are converting DataJoint pre-2.0 table definitions to 2.0 syntax. + +TASK: Update all table definitions in this repository to DataJoint 2.0 type syntax. + +CONTEXT: + +- We are on branch: pre/v2.0 +- Production (main branch) remains on pre-2.0 +- All schemas will use _v2 suffix (e.g., my_pipeline β†’ my_pipeline_v2) +- Schemas will be created empty for now + +SCOPE - PHASE I: + +1. Update schema declarations (add _v2 suffix) +2. Convert ALL type syntax to 2.0 core types +3. Convert ALL legacy codecs (in-table AND in-store) + - In-table: longblob β†’ , mediumblob β†’ , attach β†’ + - In-store (legacy only): blob@store β†’ , attach@store β†’ , filepath@store β†’ +4. Code will use TEST stores configured in datajoint.json +5. Do NOT add new 2.0 codecs (, ) - these are for Phase IV adoption +6. Production data migration happens in Phase III (code is complete after Phase I) + +TYPE CONVERSIONS: + +Core Types (Integer and Float): + int unsigned β†’ uint32 + int β†’ int32 + smallint unsigned β†’ uint16 + smallint β†’ int16 + tinyint unsigned β†’ uint8 + tinyint β†’ int8 + bigint unsigned β†’ uint64 + bigint β†’ int64 + float β†’ float32 + double β†’ float64 + decimal(M,D) β†’ decimal(M,D) # unchanged + +Core Types (String and Date): + varchar(N) β†’ varchar(N) # unchanged (core type) + char(N) β†’ char(N) # unchanged (core type) + date β†’ date # unchanged (core type) + enum('a', 'b') β†’ enum('a', 'b') # unchanged (core type) + bool β†’ bool # unchanged (core type, MySQL stores as tinyint(1)) + boolean β†’ bool # unchanged (core type, MySQL stores as tinyint(1)) + datetime β†’ datetime # unchanged (core type) + +Core Types (Structured Data): + json β†’ json # unchanged (core type, was available but underdocumented in pre-2.0) + uuid β†’ uuid # unchanged (core type, widely used in pre-2.0) + +Native Types (Discouraged but Allowed): + text β†’ Consider varchar(N) with appropriate length, or keep as native type + time β†’ Consider datetime (can represent date+time), or keep as native type + +Special Cases - REQUIRE USER REVIEW: + + tinyint(1) β†’ ASK USER: bool or uint8? + Note: Legacy DataJoint had bool/boolean types. Only explicit tinyint(1) needs review. + - Boolean semantics (yes/no, active/inactive) β†’ bool + - Small integer (counts, indices 0-255) β†’ uint8 + Example: + is_active : tinyint(1) # Boolean semantics β†’ bool + priority : tinyint(1) # 0-10 scale β†’ uint8 + has_data : bool # Already bool β†’ keep as bool + + timestamp β†’ ASK USER about timezone convention, then convert to datetime + Example: + created_at : timestamp # pre-2.0 (UNKNOWN timezone convention) + created_at : datetime # 2.0 (UTC standard) + +IMPORTANT - Datetime and Timestamp Conversion: + +DataJoint 2.0 adopts UTC as the standard for all datetime storage (no timezone information). +The database stores UTC; timezones are handled by application front-ends and client APIs. + +Conversion rules: + +- datetime β†’ Keep as datetime (assume UTC, core type) +- timestamp β†’ ASK USER about timezone convention, then convert to datetime +- date β†’ Keep as date (core type) +- time β†’ ASK USER: recommend datetime (core type) or keep as time (native type) + +For EACH timestamp column, ASK THE USER: + +1. "What timezone convention was used for [column_name]?" + - UTC (no conversion needed) + - Server local time (requires conversion to UTC) + - Application local time (requires conversion to UTC) + - Mixed/unknown (requires data audit) + +2. "Does this use MySQL's auto-update behavior (ON UPDATE CURRENT_TIMESTAMP)?" + - If yes, may need to update table schema + - If no, application controls the value + +3. After clarifying, recommend: + - Convert type: timestamp β†’ datetime + - If not already UTC: Add data conversion script to Phase III + - Update application code to store UTC times + - Handle timezone display in application front-ends and client APIs + +Example conversation: + AI: "I found timestamp column 'session_time'. What timezone was used?" + User: "Server time (US/Eastern)" + AI: "I recommend converting to UTC. I'll convert the type to datetime and add a + data conversion step in Phase III to convert US/Eastern times to UTC." + +Example: + # pre-2.0 + session_time : timestamp # Was storing US/Eastern + event_time : timestamp # Already UTC + + # 2.0 (after user confirmation) + session_time : datetime # Converted to UTC in Phase III + event_time : datetime # No data conversion needed + +IMPORTANT - Bool Type: + +Legacy DataJoint already supported bool and boolean types (MySQL stores as tinyint(1)). + +Conversion rules: + +- bool β†’ Keep as bool (no change) +- boolean β†’ Keep as bool (no change) +- tinyint(1) β†’ ASK USER: was this boolean or small integer? + +Only explicit tinyint(1) declarations need review because: + +- Legacy had bool/boolean for true/false values +- Some users explicitly used tinyint(1) for small integers (0-255) + +Example: + # pre-2.0 + is_active : bool # Already bool β†’ no change + enabled : boolean # Already boolean β†’ bool + is_valid : tinyint(1) # ASK: Boolean semantics? β†’ bool + n_retries : tinyint(1) # ASK: Small integer? β†’ uint8 + + # 2.0 + is_active : bool # Unchanged + enabled : bool # boolean β†’ bool + is_valid : bool # Boolean semantics + n_retries : uint8 # Small integer + +IMPORTANT - Enum Types: + +enum is a core typeβ€”no changes required. + +Example: + sex : enum('M', 'F', 'U') # No change needed + +IMPORTANT - JSON Type: + +json is a core type that was available in pre-2.0 but underdocumented. Many users +serialized JSON into blobs. If you have custom JSON serialization in blobs, you can +migrate to native json type (optional migration, not required). + +Example: + # Optional: migrate blob with JSON to native json + config : longblob # Contains serialized JSON + config : json # Core JSON type (optional improvement) + +IMPORTANT - Native Types (text and time): + +text and time are NATIVE MySQL types, NOT core types. They are allowed but discouraged. + +For text: + +- ASK USER: What is the maximum expected length? +- Recommend migrating to varchar(n) with appropriate length (core type) +- Or keep as text (native type, will generate warning) + +For time: + +- ASK USER: Is this time-of-day only, or is date also relevant? +- Recommend migrating to datetime (core type, can represent date+time) +- Or keep as time (native type, will generate warning) + +Example: + # pre-2.0 + description : text # Native type + session_start : time # Native type (time-of-day) + + # 2.0 (recommended) + description : varchar(1000) # Core type (after asking user about max length) + session_start : datetime # Core type (if date is also relevant) + + # 2.0 (alternative - keep native) + description : text # Native type (if truly unlimited length needed) + session_start : time # Native type (if only time-of-day needed) + +In-Table Codecs: + longblob β†’ + attach β†’ + +In-Store Codecs (LEGACY formats only - convert these): + blob@store β†’ # Add angle brackets + attach@store β†’ # Add angle brackets + filepath@store β†’ # Add angle brackets + +IMPORTANT - Do NOT use these during migration (NEW in 2.0): + # Schema-addressed storage - NEW feature + # Schema-addressed storage - NEW feature + # These have NO legacy equivalent + # Adopt in Phase IV AFTER migration is complete + # Do NOT convert existing attributes to these codecs + +SCHEMA DECLARATIONS: + OLD: schema = dj.schema('my_pipeline') + NEW: schema = dj.schema('my_pipeline_v2') + +PROCESS: +1. Identify all Python files with DataJoint schemas +2. For each schema: + a. Update schema declaration (add _v2 suffix) + b. Create schema on database (empty for now) +3. For each table definition in TOPOLOGICAL ORDER: + a. Convert ALL type syntax (core types + all codecs) + b. Verify syntax is valid +4. Test that all tables can be declared (run file to create tables) +5. Verify in-store codecs work with test stores + +VERIFICATION: + +- All schema declarations use _v2 suffix +- All native types converted to core types +- All codecs converted (in-table AND in-store) +- Test stores configured and accessible +- No syntax errors +- All tables create successfully (empty) + +EXAMPLE CONVERSION: + +# pre-2.0 +schema = dj.schema('neuroscience_pipeline') + +@schema +class Recording(dj.Manual): + definition = """ + recording_id : int unsigned + --- + sampling_rate : float + signal : blob@raw # pre-2.0 in-store syntax + waveforms : blob@raw # pre-2.0 in-store syntax + metadata : longblob # pre-2.0 in-table + """ + +# 2.0 (Phase I with test stores) +schema = dj.schema('neuroscience_pipeline_v2') + +@schema +class Recording(dj.Manual): + definition = """ + recording_id : uint32 + --- + sampling_rate : float32 + signal : # Converted: blob@raw β†’ + waveforms : # Converted: blob@raw β†’ + metadata : # Converted: longblob β†’ + """ + +# Phase I: Only convert existing legacy formats +# Do NOT add new codecs like during migration + +# If you want to adopt later (Phase IV), that's a separate step: +# - After migration is complete +# - For new features or performance improvements +# - Not required for migration + +REPORT: + +- Schemas converted: [list with _v2 suffix] +- Tables converted: [count by schema] +- Type conversions: [count by type] +- Codecs converted: + - In-table: [count of , ] + - In-store: [count of , , ] +- Tables created successfully: [list] +- Test stores configured: [list store names] + +COMMIT MESSAGE FORMAT: +"feat(phase-i): convert table definitions to 2.0 syntax + +- Update schema declarations to *_v2 +- Convert native types to core types (uint32, float64, etc.) +- Convert all codecs (in-table + in-store) +- Configure test stores for development/testing + +Tables converted: X +Codecs converted: Y (in-table: Z, in-store: W)" +``` + +--- + +### Step 6: Convert Query and Insert Code + +Update all DataJoint API calls to 2.0 patterns. + +#### Background: API Changes + +**Fetch API:** +- `fetch()` β†’ `to_arrays()` (recarray-like) or `to_dicts()` (list of dicts) +- `fetch(..., format="frame")` β†’ `to_pandas()` (pandas DataFrame) +- `fetch('attr1', 'attr2')` β†’ `to_arrays('attr1', 'attr2')` (returns tuple) +- `fetch1()` β†’ unchanged (still returns dict for single row) + +**Update Method:** +- `(table & key)._update('attr', val)` β†’ `table.update1({**key, 'attr': val})` + +**Join Operators:** +- `table1 @ table2` β†’ `table1 * table2` (natural join with semantic checks enabled) +- `a.join(b, left=True)` β†’ Consider `a.extend(b)` + +**Universal Set:** +- `dj.U('attr') & table` β†’ Unchanged (correct pattern for projecting attributes) +- `dj.U('attr') * table` β†’ Refactor (was a hack to change primary key) + +**Visualization:** +- `dj.ERD(schema)` β†’ `dj.Diagram(schema)` (ERD deprecated) + +**Learn more:** [Fetch API Reference](../reference/specs/fetch-api.md) Β· [Query Operators](../reference/operators.md) + +#### AI Agent Prompt: Convert Query and Insert Code + +--- + +**πŸ€– AI Agent Prompt: Phase I - Query and Insert Code Conversion** + +``` +You are converting DataJoint pre-2.0 query and insert code to 2.0 API. + +TASK: Update all query, fetch, and insert code to use DataJoint 2.0 API patterns. + +CONTEXT: +- Branch: pre/v2.0 +- Schema declarations already updated to _v2 suffix +- Table definitions already converted +- Production code on main branch unchanged + +API CONVERSIONS: + +1. Fetch API (always convert): + OLD: data = table.fetch() + NEW: data = table.to_arrays() # recarray-like + + OLD: data = table.fetch(as_dict=True) + NEW: data = table.to_dicts() # list of dicts + + OLD: data = table.fetch(format="frame") + NEW: data = table.to_pandas() # pandas DataFrame + + OLD: data = table.fetch('attr1', 'attr2') + NEW: data = table.to_arrays('attr1', 'attr2') # returns tuple + + OLD: row = table.fetch1() + NEW: row = table.fetch1() # UNCHANGED + + OLD: keys = table.fetch1('KEY') + NEW: keys = table.keys() # Returns list of dicts with primary key values + + OLD: keys, a, b = table.fetch("KEY", "a", "b") + NEW: a, b = table.to_arrays('a', 'b', include_key=True) # Returns tuple with keys included + +2. Update Method (always convert): + OLD: (table & key)._update('attr', value) + NEW: table.update1({**key, 'attr': value}) + +3. Join Operator (always convert): + OLD: result = table1 @ table2 + NEW: result = table1 * table2 # Natural join WITH semantic checks + + IMPORTANT: The @ operator bypassed semantic checks. The * operator enables semantic checks by default. + If semantic checks fail, INVESTIGATEβ€”this may reveal errors in your schema or data. + + For left joins: + OLD: result = a.join(b, left=True) + NEW: result = a.extend(b) # Consider using extend for left joins + +4. Universal Set (CHECK - distinguish correct from hack): + CORRECT (unchanged): + result = dj.U('attr') & table # Projects specific attributes, keeps as is + + HACK (refactor): + result = dj.U('attr') * table # Was used to change primary key, needs refactoring + + Note: The * operator with dj.U() was a hack. Ask user about intent and suggest proper refactoring. + +5. Insert/Delete (unchanged): + table.insert(data) # unchanged + table.insert1(row) # unchanged + (table & key).delete() # unchanged + (table & restriction).delete() # unchanged + +PROCESS: +1. Find all Python files with DataJoint code +2. For each file: + a. Search for fetch patterns + b. Replace with 2.0 equivalents + c. Search for update patterns + d. Replace with update1() + e. Search for @ operator (replace with * for natural join) + f. Search for .join(x, left=True) patterns (consider .extend(x)) + g. Search for dj.U() * patterns (identify as hack, ask user to refactor) + h. Verify dj.U() & patterns remain unchanged +3. Run syntax checks +4. Run existing tests if available +5. If semantic checks fail after @ β†’ * conversion, investigate schema/data + +VERIFICATION: + +- No .fetch() calls remaining (except fetch1) +- No .fetch1('KEY') calls remaining (replaced with .keys()) +- No ._update() calls remaining +- No @ operator between tables +- dj.U() * patterns identified and flagged for refactoring +- dj.U() & patterns remain unchanged +- All tests pass (if available) +- Semantic check failures investigated and resolved + +COMMON PATTERNS: + +Pattern 1: Fetch all as dicts +OLD: sessions = Session.fetch(as_dict=True) +NEW: sessions = Session.to_dicts() + +Pattern 2: Fetch specific attributes +OLD: mouse_ids, dobs = Mouse.fetch('mouse_id', 'dob') +NEW: mouse_ids, dobs = Mouse.to_arrays('mouse_id', 'dob') + +Pattern 3: Fetch as pandas DataFrame +OLD: df = Mouse.fetch(format="frame") +NEW: df = Mouse.to_pandas() + +Pattern 4: Fetch single row +OLD: row = (Mouse & key).fetch1() # unchanged +NEW: row = (Mouse & key).fetch1() # unchanged + +Pattern 5: Update attribute +OLD: (Session & key)._update('experimenter', 'Alice') +NEW: Session.update1({**key, 'experimenter': 'Alice'}) + +Pattern 6: Fetch primary keys +OLD: keys = Mouse.fetch1('KEY') +NEW: keys = Mouse.keys() + +Pattern 7: Fetch with keys included +OLD: keys, weights, ages = Mouse.fetch("KEY", "weight", "age") +NEW: weights, ages = Mouse.to_arrays('weight', 'age', include_key=True) + +Pattern 8: Natural join (now WITH semantic checks) +OLD: result = Neuron @ Session +NEW: result = Neuron * Session # Semantic checks enabledβ€”may reveal schema errors + +Pattern 9: Left join +OLD: result = Session.join(Experiment, left=True) +NEW: result = Session.extend(Experiment) # Consider using extend + +Pattern 10: Universal set (distinguish correct from hack) +CORRECT (unchanged): +OLD: all_dates = dj.U('session_date') & Session +NEW: all_dates = dj.U('session_date') & Session # Unchanged, correct pattern + +HACK (needs refactoring): +OLD: result = dj.U('new_pk') * Session # Hack to change primary key +NEW: [Refactor - ask user about intent] + +REPORT: + +- Files modified: [list] +- fetch() β†’ to_arrays/to_dicts: [count] +- fetch(..., format="frame") β†’ to_pandas(): [count] +- fetch1('KEY') β†’ keys(): [count] +- _update() β†’ update1(): [count] +- @ β†’ * (natural join): [count] +- .join(x, left=True) β†’ .extend(x): [count] +- dj.U() * table patterns flagged for refactoring: [count] +- dj.U() & table patterns (unchanged): [count] +- dj.ERD() β†’ dj.Diagram(): [count] +- Semantic check failures: [count and resolution] +- Tests passed: [yes/no] + +COMMIT MESSAGE FORMAT: +"feat(phase-i): convert query and insert code to 2.0 API + +- Replace fetch() with to_arrays()/to_dicts()/to_pandas() +- Replace fetch1('KEY') with keys() +- Replace _update() with update1() +- Replace @ operator with * (enables semantic checks) +- Replace .join(x, left=True) with .extend(x) +- Replace dj.ERD() with dj.Diagram() +- Flag dj.U() * table patterns as hacks needing refactoring +- Keep dj.U() & table patterns unchanged (correct) +- Investigate and resolve semantic check failures + +API conversions: X fetch, Y update, Z join" +``` + +--- + +### Step 7: Convert Populate Methods + +Update `make()` methods in Computed and Imported tables. + +#### AI Agent Prompt: Convert Populate Methods + +--- + +**πŸ€– AI Agent Prompt: Phase I - Populate Method Conversion** + +``` +You are converting populate/make methods in Computed and Imported tables. + +TASK: Update make() methods to use 2.0 API patterns. + +CONTEXT: + +- Focus on dj.Computed and dj.Imported tables +- make() methods contain computation logic +- Often use fetch, insert, and query operations + +CONVERSIONS NEEDED: + +1. Apply all fetch API conversions from previous step +2. Apply all update conversions +3. Apply all join conversions +4. No changes to insert operations + +COMMON PATTERNS IN make(): + +Pattern 1: Fetch dependency data +OLD: +def make(self, key): + data = (DependencyTable & key).fetch(as_dict=True) + +NEW: +def make(self, key): + data = (DependencyTable & key).to_dicts() + +Pattern 2: Fetch arrays for computation +OLD: +def make(self, key): + signal = (Recording & key).fetch1('signal') + +NEW: +def make(self, key): + signal = (Recording & key).fetch1('signal') # unchanged for single attr + +Pattern 3: Fetch multiple attributes +OLD: +def make(self, key): + signals, rates = (Recording & key).fetch('signal', 'sampling_rate') + +NEW: +def make(self, key): + signals, rates = (Recording & key).to_arrays('signal', 'sampling_rate') + +Pattern 4: Join dependencies +OLD: +def make(self, key): + data = (Neuron @ Session & key).fetch() + +NEW: +def make(self, key): + data = (Neuron * Session & key).to_arrays() # Semantic checks now enabled + +PROCESS: +1. Find all dj.Computed and dj.Imported classes +2. For each class with make() method: + a. Apply API conversions + b. Verify logic unchanged + c. Test if possible +3. Commit changes by module or table + +VERIFICATION: + +- All make() methods use 2.0 API +- Computation logic unchanged +- Insert logic unchanged +- No syntax errors + +REPORT: + +- Computed tables updated: [count] +- Imported tables updated: [count] +- make() methods converted: [count] + +COMMIT MESSAGE FORMAT: +"feat(phase-i): convert populate methods to 2.0 API + +- Update make() methods in Computed tables +- Update make() methods in Imported tables +- Apply fetch/join API conversions + +Tables updated: X Computed, Y Imported" +``` + +--- + +### Step 8: Verify Phase I Complete + +#### Checklist + +- [ ] `pre/v2.0` branch created +- [ ] DataJoint 2.0 installed (`pip list | grep datajoint`) +- [ ] Configuration files created (`.secrets/`, `datajoint.json`) +- [ ] Stores configured (if using in-store codecs) +- [ ] All schema declarations use `_v2` suffix +- [ ] All table definitions use 2.0 type syntax +- [ ] All in-table codecs converted (``, ``) +- [ ] All in-store codecs converted (``, ``, ``) +- [ ] All `fetch()` calls converted (except `fetch1()`) +- [ ] All `fetch(..., format="frame")` converted to `to_pandas()` +- [ ] All `fetch1('KEY')` converted to `keys()` +- [ ] All `._update()` calls converted +- [ ] All `@` operators converted to `*` +- [ ] All `dj.U() * table` patterns flagged for refactoring (was a hack) +- [ ] All `dj.U() & table` patterns verified as unchanged (correct) +- [ ] All `dj.ERD()` calls converted to `dj.Diagram()` +- [ ] All populate methods updated +- [ ] No syntax errors +- [ ] All `_v2` schemas created (empty) + +#### Test Schema Creation + +```python +# Run your main module to create all tables +import your_pipeline_v2 + +# Verify schemas exist +import datajoint as dj +conn = dj.conn() + +schemas = conn.query("SHOW DATABASES LIKE '%_v2'").fetchall() +print(f"Created {len(schemas)} _v2 schemas:") +for schema in schemas: + print(f" - {schema[0]}") + +# Verify tables created +for schema_name in [s[0] for s in schemas]: + tables = conn.query( + f"SELECT COUNT(*) FROM information_schema.TABLES " + f"WHERE TABLE_SCHEMA='{schema_name}'" + ).fetchone()[0] + print(f"{schema_name}: {tables} tables") +``` + +#### Commit Phase I + +```bash +# Review all changes +git status +git diff + +# Commit +git add . +git commit -m "feat: complete Phase I migration to DataJoint 2.0 + +Summary: +- Created _v2 schemas (empty) +- Converted all table definitions to 2.0 syntax +- Converted all query/insert code to 2.0 API +- Converted all populate methods +- Configured test stores for in-store codecs +- Production data migration deferred to Phase III + +Schemas: X +Tables: Y +Code files: Z" + +git push origin pre/v2.0 +``` + +βœ… **Phase I Complete!** + +**You now have:** +- 2.0-compatible code on `pre/v2.0` branch +- Empty `_v2` schemas ready for testing +- Production still running on `main` branch with pre-2.0 + +**Next:** Phase II - Test with sample data + +--- + +## Phase II: Test Compatibility and Equivalence + +**Goal:** Validate that the 2.0 pipeline produces equivalent results to the legacy pipeline. + +**End state:** + +- 2.0 pipeline runs correctly with sample data in `_v2` schemas and test stores +- Results are equivalent to running legacy pipeline on same data +- Confidence that migration is correct before touching production +- Production still untouched + +**Key principle:** Test with identical data in both legacy and v2 schemas to verify equivalence. + +### Step 1: Insert Test Data + +```python +from your_pipeline_v2 import schema, Mouse, Session, Neuron + +# Insert manual tables +Mouse.insert([ + {'mouse_id': 0, 'dob': '2024-01-01', 'sex': 'M'}, + {'mouse_id': 1, 'dob': '2024-01-15', 'sex': 'F'}, +]) + +Session.insert([ + {'mouse_id': 0, 'session_date': '2024-06-01', 'experimenter': 'Alice'}, + {'mouse_id': 0, 'session_date': '2024-06-05', 'experimenter': 'Alice'}, + {'mouse_id': 1, 'session_date': '2024-06-03', 'experimenter': 'Bob'}, +]) + +# Verify +print(f"Inserted {len(Mouse())} mice") +print(f"Inserted {len(Session())} sessions") +``` + +### Step 2: Test Populate + +```python +# Populate imported/computed tables +Neuron.populate(display_progress=True) + +# Verify +print(f"Generated {len(Neuron())} neurons") +``` + +### Step 3: Test Queries + +```python +# Test basic queries +mice = Mouse.to_dicts() +print(f"Fetched {len(mice)} mice") + +# Test joins +neurons_with_sessions = Neuron.join(Session, semantic_check=False) +print(f"Join result: {len(neurons_with_sessions)} rows") + +# Test restrictions +alice_sessions = Session & 'experimenter="Alice"' +print(f"Alice's sessions: {len(alice_sessions)}") + +# Test fetch variants +mouse_ids, dobs = Mouse.to_arrays('mouse_id', 'dob') +print(f"Arrays: {len(mouse_ids)} ids, {len(dobs)} dobs") +``` + +### Step 4: Test New Features (Optional) + +If you converted any tables to use new codecs: + +```python +# Test object storage (if using or ) +from your_pipeline_v2 import Recording + +# Insert with object storage +Recording.insert1({ + 'recording_id': 0, + 'signal': np.random.randn(1000, 64), # Stored in object store +}) + +# Fetch with lazy loading +ref = (Recording & {'recording_id': 0}).fetch1('signal') +print(f"NpyRef: shape={ref.shape}, loaded={ref.is_loaded}") + +# Load when needed +signal = ref.load() +print(f"Loaded: shape={signal.shape}") +``` + +### Step 5: Compare with Legacy Schema (Equivalence Testing) + +**Critical:** Run identical data through both legacy and v2 pipelines to verify equivalence. + +#### Option A: Side-by-Side Comparison + +```python +# compare_legacy_v2.py +import datajoint as dj +import numpy as np + +# Import both legacy and v2 modules +import your_pipeline as legacy # pre-2.0 on main branch (checkout to test) +import your_pipeline_v2 as v2 # 2.0 on pre/v2.0 branch + +def compare_results(): + """Compare query results between legacy and v2.""" + + # Insert same data into both schemas + test_data = [ + {'mouse_id': 0, 'dob': '2024-01-01', 'sex': 'M'}, + {'mouse_id': 1, 'dob': '2024-01-15', 'sex': 'F'}, + ] + + legacy.Mouse.insert(test_data, skip_duplicates=True) + v2.Mouse.insert(test_data, skip_duplicates=True) + + # Compare query results + legacy_mice = legacy.Mouse.fetch(as_dict=True) # pre-2.0 syntax + v2_mice = v2.Mouse.to_dicts() # 2.0 syntax + + assert len(legacy_mice) == len(v2_mice), "Row count mismatch!" + + # Compare values (excluding fetch-specific artifacts) + for leg, v2_row in zip(legacy_mice, v2_mice): + for key in leg.keys(): + if leg[key] != v2_row[key]: + print(f"MISMATCH: {key}: {leg[key]} != {v2_row[key]}") + return False + + print("βœ“ Query results are equivalent!") + return True + +def compare_populate(): + """Compare populate results.""" + + # Populate both + legacy.Neuron.populate(display_progress=True) + v2.Neuron.populate(display_progress=True) + + # Compare counts + legacy_count = len(legacy.Neuron()) + v2_count = len(v2.Neuron()) + + assert legacy_count == v2_count, f"Count mismatch: {legacy_count} != {v2_count}" + + print(f"βœ“ Populate generated same number of rows: {v2_count}") + + # Compare computed values (if numeric) + for key in (legacy.Neuron & 'neuron_id=0').keys(): + leg_val = (legacy.Neuron & key).fetch1('activity') + v2_val = (v2.Neuron & key).fetch1('activity') + + if isinstance(leg_val, np.ndarray): + assert np.allclose(leg_val, v2_val, rtol=1e-9), "Array values differ!" + else: + assert leg_val == v2_val, f"Value mismatch: {leg_val} != {v2_val}" + + print("βœ“ Populate results are equivalent!") + return True + +if __name__ == '__main__': + print("Comparing legacy and v2 pipelines...") + compare_results() + compare_populate() + print("\nβœ“ All equivalence tests passed!") +``` + +Run comparison: + +```bash +python compare_legacy_v2.py +``` + +#### Option B: Data Copy and Validation + +If you can't easily import both modules: + +1. Copy sample data from production to both legacy test schema and `_v2` schema +2. Run populate on both +3. Use helper to compare: + +```python +from datajoint.migrate import compare_query_results + +# Compare table contents +result = compare_query_results( + prod_schema='my_pipeline', + test_schema='my_pipeline_v2', + table='neuron', + tolerance=1e-6, +) + +if result['match']: + print(f"βœ“ {result['row_count']} rows match") +else: + print(f"βœ— Discrepancies found:") + for disc in result['discrepancies']: + print(f" {disc}") +``` + +### Step 6: Run Existing Tests + +If you have a test suite: + +```bash +# Run tests against _v2 schemas +pytest tests/ -v + +# Or specific test modules +pytest tests/test_queries.py -v +pytest tests/test_populate.py -v +``` + +### Step 7: Validate Results + +Create a validation script: + +```python +# validate_v2.py +import datajoint as dj +from your_pipeline_v2 import schema + +def validate_phase_ii(): + """Validate Phase II migration.""" + + issues = [] + + # Check schemas exist + conn = dj.conn() + schemas_v2 = conn.query("SHOW DATABASES LIKE '%_v2'").fetchall() + + if not schemas_v2: + issues.append("No _v2 schemas found") + return issues + + print(f"βœ“ Found {len(schemas_v2)} _v2 schemas") + + # Check tables populated + for schema_name in [s[0] for s in schemas_v2]: + tables = conn.query( + f"SELECT TABLE_NAME FROM information_schema.TABLES " + f"WHERE TABLE_SCHEMA='{schema_name}' AND TABLE_NAME NOT LIKE '~%'" + ).fetchall() + + for table in tables: + table_name = table[0] + count = conn.query( + f"SELECT COUNT(*) FROM `{schema_name}`.`{table_name}`" + ).fetchone()[0] + + if count > 0: + print(f" βœ“ {schema_name}.{table_name}: {count} rows") + else: + print(f" β—‹ {schema_name}.{table_name}: empty (may be expected)") + + # Test basic operations + try: + # Test fetch + data = schema.connection.query( + f"SELECT * FROM {schema.database} LIMIT 1" + ).fetchall() + print("βœ“ Fetch operations work") + except Exception as e: + issues.append(f"Fetch error: {e}") + + return issues + +if __name__ == '__main__': + issues = validate_phase_ii() + + if issues: + print("\nβœ— Validation issues found:") + for issue in issues: + print(f" - {issue}") + else: + print("\nβœ“ Phase II validation passed!") +``` + +Run validation: + +```bash +python validate_v2.py +``` + +### Step 7: Document Test Results + +Create a test report: + +```bash +# test_report.md +cat > test_report.md << 'EOF' +# Phase II Test Report + +## Test Date +2025-01-14 + +## Summary +- Schemas tested: X +- Tables populated: Y +- Tests passed: Z + +## Manual Tables +- Mouse: N rows +- Session: M rows + +## Computed Tables +- Neuron: K rows +- Analysis: J rows + +## Query Tests +- Basic fetch: βœ“ +- Joins: βœ“ +- Restrictions: βœ“ +- Aggregations: βœ“ + +## Populate Tests +- Imported tables: βœ“ +- Computed tables: βœ“ +- Error handling: βœ“ + +## New Features Tested +- Object storage: βœ“ +- Lazy loading: βœ“ + +## Issues Found +- None + +## Conclusion +Phase II completed successfully. Ready for Phase III. +EOF + +git add test_report.md +git commit -m "docs: Phase II test report" +``` + +βœ… **Phase II Complete!** + +**You now have:** +- Validated 2.0 pipeline with sample data +- Confidence in code migration +- Test report documenting success +- Ready to migrate production data + +**Next:** Phase III - Migrate production data + +--- + +## Phase III: Migrate Production Data + +**Goal:** Migrate production data and configure production stores. Code is complete from Phase I. + +**End state:** + +- Production data migrated to `_v2` schemas +- Production stores configured (replacing test stores) +- In-store metadata updated (UUID β†’ JSON) +- Ready to switch production to 2.0 + +**Key principle:** All code changes were completed in Phase I. This phase is DATA migration only. + +**Prerequisites:** + +- Phase I complete (all code migrated) +- Phase II complete (equivalence validated) +- Production backup created +- Production workloads quiesced + +**Options:** + +- **Option A:** Copy data, rename schemas (recommended - safest) +- **Option B:** In-place migration (for very large databases) +- **Option C:** Gradual migration with legacy compatibility + +Choose the option that best fits your needs. + +### Option A: Copy Data and Rename Schemas (Recommended) + +**Best for:** Most pipelines, especially < 1 TB + +**Advantages:** + +- Safe - production unchanged until final step +- Easy rollback +- Can practice multiple times + +**Process:** + +#### 0. Configure Production Stores + +Update `datajoint.json` to point to production stores (not test stores): + +```json +{ + "stores": { + "default": "main", + "main": { + "protocol": "file", + "location": "/data/production_stores/main" # Production location + } + } +} +``` + +**For in-store data migration:** You can either: + +- **Keep files in place** (recommended): Point to existing pre-2.0 store locations +- **Copy to new location**: Configure new production stores and copy files + +**Commit this change:** +```bash +git add datajoint.json +git commit -m "config: update stores to production locations" +``` + +#### 1. Backup Production + +```bash +# Full backup +mysqldump --all-databases > backup_$(date +%Y%m%d).sql + +# Or schema-specific +mysqldump my_pipeline > my_pipeline_backup_$(date +%Y%m%d).sql +``` + +#### 2. Copy Manual Table Data + +```python +from datajoint.migrate import copy_table_data + +# Copy each manual table +tables = ['mouse', 'session', 'experimenter'] # Your manual tables + +for table in tables: + result = copy_table_data( + source_schema='my_pipeline', + dest_schema='my_pipeline_v2', + table=table, + ) + print(f"{table}: copied {result['rows_copied']} rows") +``` + +#### 3. Populate Computed Tables + +```python +from your_pipeline_v2 import Neuron, Analysis + +# Populate using 2.0 code +Neuron.populate(display_progress=True) +Analysis.populate(display_progress=True) +``` + +#### 4. Migrate In-Store Metadata + +**Important:** Your code already handles in-store codecs (converted in Phase I). This step just updates metadata format. + +If you have tables using ``, ``, or `` codecs, migrate the storage metadata from legacy BINARY(16) UUID format to 2.0 JSON format: + +```python +from datajoint.migrate import migrate_external_pointers_v2 + +# Update metadata format (UUID β†’ JSON) +# This does NOT move filesβ€”just updates database pointers +result = migrate_external_pointers_v2( + schema='my_pipeline_v2', + table='recording', + attribute='signal', + source_store='raw', # Legacy pre-2.0 store name + dest_store='raw', # 2.0 store name (from datajoint.json) + copy_files=False, # Keep files in place (recommended) +) + +print(f"Migrated {result['rows_migrated']} pointers") +``` + +**What this does:** + +- Reads legacy BINARY(16) UUID pointers from `~external_*` hidden tables +- Creates new JSON metadata with file path, store name, hash +- Writes JSON to the `` column (code written in Phase I) +- Does NOT copy files (unless `copy_files=True`) + +**Result:** Files stay in place, but 2.0 code can now access them via the new codec system. + +#### 5. Validate Data Integrity + +```python +from datajoint.migrate import compare_query_results + +# Compare production vs _v2 +tables_to_check = ['mouse', 'session', 'neuron', 'analysis'] + +all_match = True +for table in tables_to_check: + result = compare_query_results( + prod_schema='my_pipeline', + test_schema='my_pipeline_v2', + table=table, + tolerance=1e-6, + ) + + if result['match']: + print(f"βœ“ {table}: {result['row_count']} rows match") + else: + print(f"βœ— {table}: discrepancies found") + for disc in result['discrepancies'][:5]: + print(f" {disc}") + all_match = False + +if all_match: + print("\nβœ“ All tables validated! Ready for cutover.") +else: + print("\nβœ— Fix discrepancies before proceeding.") +``` + +#### 6. Schedule Cutover + +**Pre-cutover checklist:** +- [ ] Full backup verified +- [ ] All data copied +- [ ] All computed tables populated +- [ ] Validation passed +- [ ] Team notified +- [ ] Maintenance window scheduled +- [ ] All pre-2.0 clients stopped + +**Execute cutover:** + +```sql +-- Rename production β†’ old +RENAME TABLE `my_pipeline` TO `my_pipeline_old`; + +-- Rename _v2 β†’ production +RENAME TABLE `my_pipeline_v2` TO `my_pipeline`; +``` + +**Update code:** + +```bash +# On pre/v2.0 branch, update schema names back +sed -i '' 's/_v2//g' your_pipeline/*.py + +git add . +git commit -m "chore: remove _v2 suffix for production" + +# Merge to main +git checkout main +git merge pre/v2.0 +git push origin main + +# Deploy updated code +``` + +#### 7. Verify Production + +```python +# Test production after cutover +from your_pipeline import schema, Mouse, Neuron + +print(f"Mice: {len(Mouse())}") +print(f"Neurons: {len(Neuron())}") + +# Run a populate +Neuron.populate(limit=5, display_progress=True) +``` + +#### 8. Cleanup (After 1-2 Weeks) + +```sql +-- After confirming production stable +DROP DATABASE `my_pipeline_old`; +``` + +### Option B: In-Place Migration + +**Best for:** Very large databases (> 1 TB) where copying is impractical + +**Warning:** Modifies production schema directly. Test thoroughly first! + +```python +from datajoint.migrate import migrate_schema_in_place + +# Backup first +backup_schema('my_pipeline', 'my_pipeline_backup_20250114') + +# Migrate in place +result = migrate_schema_in_place( + schema='my_pipeline', + backup=True, + steps=[ + 'update_blob_comments', # Add :: markers + 'add_lineage_table', # Create ~lineage + 'migrate_external_storage', # BINARY(16) β†’ JSON + ] +) + +print(f"Migrated {result['steps_completed']} steps") +``` + +### Option C: Gradual Migration with Legacy Compatibility + +**Best for:** Pipelines that must support both pre-2.0 and 2.0 clients simultaneously + +**Strategy:** Create dual columns for in-store codecs + +#### 1. Add `_v2` Columns + +For each in-store attribute, add a corresponding `_v2` column: + +```sql +-- Add _v2 column for in-store codec +ALTER TABLE `my_pipeline`.`recording` + ADD COLUMN `signal_v2` JSON COMMENT '::signal data'; +``` + +#### 2. Populate `_v2` Columns + +```python +from datajoint.migrate import populate_v2_columns + +result = populate_v2_columns( + schema='my_pipeline', + table='recording', + attribute='signal', + v2_attribute='signal_v2', + source_store='raw', + dest_store='raw', +) + +print(f"Populated {result['rows']} _v2 columns") +``` + +#### 3. Update Code to Use `_v2` Columns + +```python +# Update table definition +@schema +class Recording(dj.Manual): + definition = """ + recording_id : uint32 + --- + signal : blob@raw # Legacy (pre-2.0 clients) + signal_v2 : # 2.0 clients + """ +``` + +**Both APIs work:** +- pre-2.0 clients use `signal` +- 2.0 clients use `signal_v2` + +#### 4. Final Cutover + +Once all clients upgraded to 2.0: + +```sql +-- Drop legacy column +ALTER TABLE `my_pipeline`.`recording` + DROP COLUMN `signal`; + +-- Rename _v2 to original name +ALTER TABLE `my_pipeline`.`recording` + CHANGE COLUMN `signal_v2` `signal` JSON; +``` + +--- + +## Phase IV: Adopt New Features + +After successful migration, adopt DataJoint 2.0 features: + +### 1. Object Storage with Lazy Loading + +Replace `` with `` for large arrays: + +```python +# Before +@schema +class Recording(dj.Manual): + definition = """ + recording_id : uint32 + --- + signal : # Stored in table + """ + +# After +@schema +class Recording(dj.Manual): + definition = """ + recording_id : uint32 + --- + signal : # Lazy-loading from object store + """ + +# Usage +ref = (Recording & key).fetch1('signal') +print(f"Shape: {ref.shape}, dtype: {ref.dtype}") # No download! +signal = ref.load() # Download when ready +``` + +**Learn more:** [Object Storage Tutorial](../tutorials/basics/06-object-storage.ipynb) Β· [NPY Codec Spec](../reference/specs/npy-codec.md) + +### 2. Partition Patterns + +Organize object storage by experimental hierarchy: + +```python +# Configure partitioning +dj.config['stores.main.partition_pattern'] = '{mouse_id}/{session_date}' + +# Storage structure: +# {store}/mouse_id=0/session_date=2024-06-01/{schema}/{table}/file.npy +``` + +**Learn more:** [Object Store Configuration](../reference/specs/object-store-configuration.md) + +### 3. Semantic Matching + +Enable lineage-based join validation: + +```python +# Validates lineage compatibility +result = Neuron.join(Session, semantic_check=True) + +# Raises error if lineage incompatible +``` + +**Learn more:** [Semantic Matching Spec](../reference/specs/semantic-matching.md) + +### 4. Custom Codecs + +Create domain-specific types: + +```python +from datajoint.codecs import Codec + +class SpikeTrainCodec(Codec): + """Custom codec for spike trains.""" + + def encode(self, obj, context): + # Compress spike times + return compressed_data + + def decode(self, blob, context): + # Decompress spike times + return spike_times +``` + +**Learn more:** [Custom Codecs Tutorial](../tutorials/advanced/custom-codecs.ipynb) Β· [Codec API](../reference/specs/codec-api.md) + +### 5. Jobs 2.0 + +Use per-table job management: + +```python +# Monitor job progress +Analysis.jobs.progress() + +# Priority-based populate +Analysis.populate(order='priority DESC') + +# Job tables: ~~analysis +``` + +**Learn more:** [Distributed Computing](../tutorials/advanced/distributed.ipynb) Β· [AutoPopulate Spec](../reference/specs/autopopulate.md) + +--- + +## Troubleshooting + +### Import Errors + +**Issue:** Module not found after migration + +**Solution:** +```python +# Ensure all imports use datajoint namespace +import datajoint as dj +from datajoint import schema, Manual, Computed +``` + +### Schema Not Found + +**Issue:** `Database 'schema_v2' doesn't exist` + +**Solution:** +```python +# Ensure schema declared and created +schema = dj.schema('schema_v2') +schema.spawn_missing_classes() +``` + +### Type Syntax Errors + +**Issue:** `Invalid type: 'int unsigned'` + +**Solution:** Update to core types +```python +# Wrong +definition = """ +id : int unsigned +""" + +# Correct +definition = """ +id : uint32 +""" +``` + +### External Storage Not Found + +**Issue:** Can't access external data after migration + +**Solution:** +```python +# Ensure stores configured +dj.config['stores.default'] = 'main' +dj.config['stores.main.location'] = '/data/stores' + +# Verify +from datajoint.settings import get_store_spec +print(get_store_spec('main')) +``` + +--- + +## Summary + +**Phase I:** Branch and code migration (~1-4 hours with AI) +- Create `pre/v2.0` branch +- Update all code to 2.0 API +- Create empty `_v2` schemas + +**Phase II:** Test with sample data (~1-2 days) +- Insert test data +- Validate functionality +- Test new features + +**Phase III:** Migrate production data (~1-7 days) +- Choose migration option +- Copy or migrate data +- Validate integrity +- Execute cutover + +**Phase IV:** Adopt new features (ongoing) +- Object storage +- Semantic matching +- Custom codecs +- Jobs 2.0 + +**Total timeline:** ~1-2 weeks for most pipelines + +--- + +## See Also + +**Core Documentation:** +- [Type System Concept](../explanation/type-system.md) +- [Configuration Reference](../reference/configuration.md) +- [Definition Syntax](../reference/definition-syntax.md) +- [Fetch API Reference](../reference/specs/fetch-api.md) + +**Tutorials:** +- [Object Storage](../tutorials/basics/06-object-storage.ipynb) +- [Custom Codecs](../tutorials/advanced/custom-codecs.ipynb) +- [Distributed Computing](../tutorials/advanced/distributed.ipynb) + +**Specifications:** +- [Type System Spec](../reference/specs/type-system.md) +- [Codec API Spec](../reference/specs/codec-api.md) +- [Object Store Configuration](../reference/specs/object-store-configuration.md) +- [Semantic Matching](../reference/specs/semantic-matching.md) diff --git a/src/how-to/model-relationships.ipynb b/src/how-to/model-relationships.ipynb new file mode 100644 index 00000000..00d7000a --- /dev/null +++ b/src/how-to/model-relationships.ipynb @@ -0,0 +1,1651 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "cell-intro", + "metadata": {}, + "source": [ + "# Model Relationships\n", + "\n", + "Define foreign key relationships between tables. This guide shows how different foreign key placements create different relationship types, with actual schema diagrams." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "cell-setup", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-13T18:57:32.442582Z", + "iopub.status.busy": "2026-01-13T18:57:32.442242Z", + "iopub.status.idle": "2026-01-13T18:57:33.152707Z", + "shell.execute_reply": "2026-01-13T18:57:33.152145Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2026-01-13 12:57:33,134][INFO]: DataJoint 2.0.0a18 connected to root@127.0.0.1:3306\n" + ] + } + ], + "source": [ + "import datajoint as dj\n", + "\n", + "schema = dj.Schema('howto_relationships')\n", + "schema.drop(prompt=False)\n", + "schema = dj.Schema('howto_relationships')" + ] + }, + { + "cell_type": "markdown", + "id": "cell-basic-md", + "metadata": {}, + "source": [ + "## Basic Foreign Key\n", + "\n", + "Reference another table with `->`:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "cell-basic", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-13T18:57:33.155314Z", + "iopub.status.busy": "2026-01-13T18:57:33.154920Z", + "iopub.status.idle": "2026-01-13T18:57:33.504340Z", + "shell.execute_reply": "2026-01-13T18:57:33.503971Z" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "Session\n", + "\n", + "\n", + "Session\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Subject\n", + "\n", + "\n", + "Subject\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Subject->Session\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "@schema\n", + "class Subject(dj.Manual):\n", + " definition = \"\"\"\n", + " subject_id : varchar(16)\n", + " ---\n", + " species : varchar(32)\n", + " \"\"\"\n", + "\n", + "@schema\n", + "class Session(dj.Manual):\n", + " definition = \"\"\"\n", + " -> Subject\n", + " session_idx : uint16\n", + " ---\n", + " session_date : date\n", + " \"\"\"\n", + "\n", + "dj.Diagram(Subject) + dj.Diagram(Session)" + ] + }, + { + "cell_type": "markdown", + "id": "cell-basic-explain", + "metadata": {}, + "source": [ + "The `->` syntax:\n", + "\n", + "- Inherits all primary key attributes from the referenced table\n", + "- Creates a foreign key constraint\n", + "- Establishes dependency for cascading deletes\n", + "- Defines workflow order (parent must exist before child)" + ] + }, + { + "cell_type": "markdown", + "id": "cell-placement-md", + "metadata": {}, + "source": [ + "## Foreign Key Placement\n", + "\n", + "Where you place a foreign key determines the relationship type:\n", + "\n", + "| Placement | Relationship | Diagram Line |\n", + "|-----------|--------------|-------------|\n", + "| Entire primary key | One-to-one extension | Thick solid |\n", + "| Part of primary key | One-to-many containment | Thin solid |\n", + "| Secondary attribute | One-to-many reference | Dashed |" + ] + }, + { + "cell_type": "markdown", + "id": "cell-contain-md", + "metadata": {}, + "source": [ + "## One-to-Many: Containment\n", + "\n", + "Foreign key as **part of** the primary key (above `---`):" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "cell-contain", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-13T18:57:33.505959Z", + "iopub.status.busy": "2026-01-13T18:57:33.505806Z", + "iopub.status.idle": "2026-01-13T18:57:33.633101Z", + "shell.execute_reply": "2026-01-13T18:57:33.632684Z" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "Session\n", + "\n", + "\n", + "Session\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Trial\n", + "\n", + "\n", + "Trial\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Session->Trial\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "@schema\n", + "class Trial(dj.Manual):\n", + " definition = \"\"\"\n", + " -> Session # Part of primary key\n", + " trial_idx : uint16 # Additional PK attribute\n", + " ---\n", + " outcome : varchar(20)\n", + " \"\"\"\n", + "\n", + "dj.Diagram(Session) + dj.Diagram(Trial)" + ] + }, + { + "cell_type": "markdown", + "id": "cell-contain-explain", + "metadata": {}, + "source": [ + "**Thin solid line** = containment. Trials are identified **within** their session. Trial #1 for Session A is different from Trial #1 for Session B.\n", + "\n", + "Notice `Trial` is **underlined** β€” it introduces a new [dimension](../explanation/entity-integrity.md#schema-dimensions) (`trial_idx`). A dimension is an independent axis of variation in your data, introduced by a table that defines new primary key attributes." + ] + }, + { + "cell_type": "markdown", + "id": "cell-ref-md", + "metadata": {}, + "source": [ + "## One-to-Many: Reference\n", + "\n", + "Foreign key as **secondary attribute** (below `---`):" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "cell-ref", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-13T18:57:33.635040Z", + "iopub.status.busy": "2026-01-13T18:57:33.634871Z", + "iopub.status.idle": "2026-01-13T18:57:33.782055Z", + "shell.execute_reply": "2026-01-13T18:57:33.781704Z" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "Recording\n", + "\n", + "\n", + "Recording\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Equipment\n", + "\n", + "\n", + "Equipment\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Equipment->Recording\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "@schema\n", + "class Equipment(dj.Lookup):\n", + " definition = \"\"\"\n", + " equipment_id : varchar(16)\n", + " ---\n", + " equipment_name : varchar(60)\n", + " \"\"\"\n", + " contents = [\n", + " {'equipment_id': 'rig1', 'equipment_name': 'Main Recording Rig'},\n", + " {'equipment_id': 'rig2', 'equipment_name': 'Backup Rig'},\n", + " ]\n", + "\n", + "@schema\n", + "class Recording(dj.Manual):\n", + " definition = \"\"\"\n", + " recording_id : uuid # Independent identity\n", + " ---\n", + " -> Equipment # Reference, not part of identity\n", + " duration : float32\n", + " \"\"\"\n", + "\n", + "dj.Diagram(Equipment) + dj.Diagram(Recording)" + ] + }, + { + "cell_type": "markdown", + "id": "cell-ref-explain", + "metadata": {}, + "source": [ + "**Dashed line** = reference. Recordings have their own global identity independent of equipment.\n", + "\n", + "Both tables are **underlined** β€” each introduces its own dimension." + ] + }, + { + "cell_type": "markdown", + "id": "cell-ext-md", + "metadata": {}, + "source": [ + "## One-to-One: Extension\n", + "\n", + "Foreign key **is** the entire primary key:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "cell-ext", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-13T18:57:33.783607Z", + "iopub.status.busy": "2026-01-13T18:57:33.783456Z", + "iopub.status.idle": "2026-01-13T18:57:33.907123Z", + "shell.execute_reply": "2026-01-13T18:57:33.906762Z" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "SubjectDetails\n", + "\n", + "\n", + "SubjectDetails\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Subject\n", + "\n", + "\n", + "Subject\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Subject->SubjectDetails\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "@schema\n", + "class SubjectDetails(dj.Manual):\n", + " definition = \"\"\"\n", + " -> Subject # Entire primary key\n", + " ---\n", + " weight : float32\n", + " notes : varchar(1000)\n", + " \"\"\"\n", + "\n", + "dj.Diagram(Subject) + dj.Diagram(SubjectDetails)" + ] + }, + { + "cell_type": "markdown", + "id": "cell-ext-explain", + "metadata": {}, + "source": [ + "**Thick solid line** = extension. Each subject has at most one details record. The tables share identity.\n", + "\n", + "Notice `SubjectDetails` is **not underlined** β€” it doesn't introduce a new dimension." + ] + }, + { + "cell_type": "markdown", + "id": "cell-null-md", + "metadata": {}, + "source": [ + "## Optional (Nullable) Foreign Keys\n", + "\n", + "Make a reference optional with `[nullable]`:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "cell-null", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-13T18:57:33.908897Z", + "iopub.status.busy": "2026-01-13T18:57:33.908720Z", + "iopub.status.idle": "2026-01-13T18:57:34.049172Z", + "shell.execute_reply": "2026-01-13T18:57:34.048743Z" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "TrialStimulus\n", + "\n", + "\n", + "TrialStimulus\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Trial\n", + "\n", + "\n", + "Trial\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Trial->TrialStimulus\n", + "\n", + "\n", + "\n", + "\n", + "Stimulus\n", + "\n", + "\n", + "Stimulus\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Stimulus->TrialStimulus\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "@schema\n", + "class Stimulus(dj.Lookup):\n", + " definition = \"\"\"\n", + " stimulus_type : varchar(32)\n", + " \"\"\"\n", + " contents = [{'stimulus_type': 'visual'}, {'stimulus_type': 'auditory'}]\n", + "\n", + "@schema\n", + "class TrialStimulus(dj.Manual):\n", + " definition = \"\"\"\n", + " -> Trial\n", + " ---\n", + " -> [nullable] Stimulus # Some trials have no stimulus\n", + " \"\"\"\n", + "\n", + "dj.Diagram(Trial) + dj.Diagram(Stimulus) + dj.Diagram(TrialStimulus)" + ] + }, + { + "cell_type": "markdown", + "id": "cell-null-explain", + "metadata": {}, + "source": [ + "Only secondary foreign keys (below `---`) can be nullable.\n", + "\n", + "**Note:** The `[nullable]` modifier is NOT visible in diagrams β€” check the table definition." + ] + }, + { + "cell_type": "markdown", + "id": "cell-unique-md", + "metadata": {}, + "source": [ + "## Unique Foreign Keys\n", + "\n", + "Enforce one-to-one on a secondary FK with `[unique]`:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "cell-unique", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-13T18:57:34.050943Z", + "iopub.status.busy": "2026-01-13T18:57:34.050789Z", + "iopub.status.idle": "2026-01-13T18:57:34.202115Z", + "shell.execute_reply": "2026-01-13T18:57:34.201748Z" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "ParkingSpot\n", + "\n", + "\n", + "ParkingSpot\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Employee\n", + "\n", + "\n", + "Employee\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Employee->ParkingSpot\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "@schema\n", + "class Employee(dj.Manual):\n", + " definition = \"\"\"\n", + " employee_id : uint32\n", + " ---\n", + " name : varchar(60)\n", + " \"\"\"\n", + "\n", + "@schema\n", + "class ParkingSpot(dj.Manual):\n", + " definition = \"\"\"\n", + " spot_id : uint32\n", + " ---\n", + " -> [unique] Employee # Each employee has at most one spot\n", + " location : varchar(30)\n", + " \"\"\"\n", + "\n", + "dj.Diagram(Employee) + dj.Diagram(ParkingSpot)" + ] + }, + { + "cell_type": "markdown", + "id": "cell-unique-explain", + "metadata": {}, + "source": [ + "**Note:** The `[unique]` modifier is NOT visible in diagrams β€” the line is still dashed. Check the table definition to see the constraint." + ] + }, + { + "cell_type": "markdown", + "id": "cell-m2m-md", + "metadata": {}, + "source": [ + "## Many-to-Many\n", + "\n", + "Use an association table with composite primary key:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "cell-m2m", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-13T18:57:34.203663Z", + "iopub.status.busy": "2026-01-13T18:57:34.203514Z", + "iopub.status.idle": "2026-01-13T18:57:34.341313Z", + "shell.execute_reply": "2026-01-13T18:57:34.340872Z" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "Assignment\n", + "\n", + "\n", + "Assignment\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Subject\n", + "\n", + "\n", + "Subject\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Subject->Assignment\n", + "\n", + "\n", + "\n", + "\n", + "Protocol\n", + "\n", + "\n", + "Protocol\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Protocol->Assignment\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "@schema\n", + "class Protocol(dj.Lookup):\n", + " definition = \"\"\"\n", + " protocol_id : varchar(16)\n", + " ---\n", + " protocol_name : varchar(100)\n", + " \"\"\"\n", + " contents = [\n", + " {'protocol_id': 'iacuc_01', 'protocol_name': 'Mouse Protocol'},\n", + " {'protocol_id': 'iacuc_02', 'protocol_name': 'Rat Protocol'},\n", + " ]\n", + "\n", + "@schema\n", + "class Assignment(dj.Manual):\n", + " definition = \"\"\"\n", + " -> Subject\n", + " -> Protocol\n", + " ---\n", + " assigned_date : date\n", + " \"\"\"\n", + "\n", + "dj.Diagram(Subject) + dj.Diagram(Protocol) + dj.Diagram(Assignment)" + ] + }, + { + "cell_type": "markdown", + "id": "cell-m2m-explain", + "metadata": {}, + "source": [ + "Two **thin solid lines** converge into `Assignment`. Each subject-protocol combination appears at most once.\n", + "\n", + "Notice `Assignment` is **not underlined** β€” it doesn't introduce a new dimension, just combines existing ones." + ] + }, + { + "cell_type": "markdown", + "id": "cell-hier-md", + "metadata": {}, + "source": [ + "## Hierarchies\n", + "\n", + "Cascading one-to-many relationships create tree structures:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "cell-hier", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-13T18:57:34.342828Z", + "iopub.status.busy": "2026-01-13T18:57:34.342691Z", + "iopub.status.idle": "2026-01-13T18:57:34.440421Z", + "shell.execute_reply": "2026-01-13T18:57:34.440059Z" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "Session\n", + "\n", + "\n", + "Session\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Trial\n", + "\n", + "\n", + "Trial\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Session->Trial\n", + "\n", + "\n", + "\n", + "\n", + "Subject\n", + "\n", + "\n", + "Subject\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Subject->Session\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Already defined: Subject -> Session -> Trial\n", + "# Show the full hierarchy\n", + "dj.Diagram(Subject) + dj.Diagram(Session) + dj.Diagram(Trial)" + ] + }, + { + "cell_type": "markdown", + "id": "cell-hier-explain", + "metadata": {}, + "source": [ + "Primary keys cascade: Trial's key is `(subject_id, session_idx, trial_idx)`.\n", + "\n", + "All three tables are **underlined** β€” each introduces a dimension." + ] + }, + { + "cell_type": "markdown", + "id": "cell-part-md", + "metadata": {}, + "source": [ + "## Part Tables\n", + "\n", + "Part tables use the `-> master` alias to reference their enclosing table:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "cell-part", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-13T18:57:34.442068Z", + "iopub.status.busy": "2026-01-13T18:57:34.441925Z", + "iopub.status.idle": "2026-01-13T18:57:34.589509Z", + "shell.execute_reply": "2026-01-13T18:57:34.589099Z" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "Session\n", + "\n", + "\n", + "Session\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Scan\n", + "\n", + "\n", + "Scan\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Session->Scan\n", + "\n", + "\n", + "\n", + "\n", + "Scan.ROI\n", + "\n", + "\n", + "Scan.ROI\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Scan->Scan.ROI\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "@schema\n", + "class Scan(dj.Manual):\n", + " definition = \"\"\"\n", + " -> Session\n", + " scan_idx : uint16\n", + " ---\n", + " depth : float32\n", + " \"\"\"\n", + "\n", + " class ROI(dj.Part):\n", + " definition = \"\"\"\n", + " -> master # References Scan's primary key\n", + " roi_idx : uint16 # Additional dimension\n", + " ---\n", + " x : float32\n", + " y : float32\n", + " \"\"\"\n", + "\n", + "dj.Diagram(Session) + dj.Diagram(Scan) + dj.Diagram(Scan.ROI)" + ] + }, + { + "cell_type": "markdown", + "id": "cell-part-explain", + "metadata": {}, + "source": [ + "`-> master` is the standard way to declare the foreign key to the enclosing table. It references the master's primary key.\n", + "\n", + "Notice:\n", + "- `Scan` is **underlined** (introduces `scan_idx`)\n", + "- `Scan.ROI` is **underlined** (introduces `roi_idx`) β€” Part tables CAN introduce dimensions" + ] + }, + { + "cell_type": "markdown", + "id": "cell-rename-md", + "metadata": {}, + "source": [ + "## Renamed Foreign Keys\n", + "\n", + "Reference the same table multiple times with `.proj()` to rename attributes:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "cell-rename", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-13T18:57:34.591160Z", + "iopub.status.busy": "2026-01-13T18:57:34.590995Z", + "iopub.status.idle": "2026-01-13T18:57:34.718293Z", + "shell.execute_reply": "2026-01-13T18:57:34.717871Z" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "1\n", + "\n", + "1\n", + "\n", + "\n", + "\n", + "Comparison\n", + "\n", + "\n", + "Comparison\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "1->Comparison\n", + "\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "0->Comparison\n", + "\n", + "\n", + "\n", + "\n", + "Session\n", + "\n", + "\n", + "Session\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Session->1\n", + "\n", + "\n", + "\n", + "\n", + "Session->0\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "@schema\n", + "class Comparison(dj.Manual):\n", + " definition = \"\"\"\n", + " -> Session.proj(session_a='session_idx')\n", + " -> Session.proj(session_b='session_idx')\n", + " ---\n", + " similarity : float32\n", + " \"\"\"\n", + "\n", + "dj.Diagram(Session) + dj.Diagram(Comparison)" + ] + }, + { + "cell_type": "markdown", + "id": "cell-rename-explain", + "metadata": {}, + "source": [ + "**Orange dots** indicate renamed foreign keys. Hover over them to see the projection expression.\n", + "\n", + "This creates attributes `session_a` and `session_b`, both referencing `Session.session_idx`." + ] + }, + { + "cell_type": "markdown", + "id": "cell-computed-md", + "metadata": {}, + "source": [ + "## Computed Dependencies\n", + "\n", + "Computed tables inherit keys from their dependencies:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "cell-computed", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-13T18:57:34.719823Z", + "iopub.status.busy": "2026-01-13T18:57:34.719678Z", + "iopub.status.idle": "2026-01-13T18:57:34.855181Z", + "shell.execute_reply": "2026-01-13T18:57:34.854454Z" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "Trial\n", + "\n", + "\n", + "Trial\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "TrialAnalysis\n", + "\n", + "\n", + "TrialAnalysis\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Trial->TrialAnalysis\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "@schema\n", + "class TrialAnalysis(dj.Computed):\n", + " definition = \"\"\"\n", + " -> Trial\n", + " ---\n", + " score : float64\n", + " \"\"\"\n", + " \n", + " def make(self, key):\n", + " self.insert1({**key, 'score': 0.95})\n", + "\n", + "dj.Diagram(Trial) + dj.Diagram(TrialAnalysis)" + ] + }, + { + "cell_type": "markdown", + "id": "cell-computed-explain", + "metadata": {}, + "source": [ + "**Thick solid line** to a **red (Computed) table** that is **not underlined**.\n", + "\n", + "Computed tables never introduce dimensions β€” their primary key is entirely inherited from dependencies." + ] + }, + { + "cell_type": "markdown", + "id": "cell-full-md", + "metadata": {}, + "source": [ + "## Full Schema View" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "cell-full", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-13T18:57:34.857463Z", + "iopub.status.busy": "2026-01-13T18:57:34.857244Z", + "iopub.status.idle": "2026-01-13T18:57:34.993420Z", + "shell.execute_reply": "2026-01-13T18:57:34.992950Z" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "8\n", + "\n", + "8\n", + "\n", + "\n", + "\n", + "Comparison\n", + "\n", + "\n", + "Comparison\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "8->Comparison\n", + "\n", + "\n", + "\n", + "\n", + "9\n", + "\n", + "9\n", + "\n", + "\n", + "\n", + "9->Comparison\n", + "\n", + "\n", + "\n", + "\n", + "TrialStimulus\n", + "\n", + "\n", + "TrialStimulus\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Trial\n", + "\n", + "\n", + "Trial\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Trial->TrialStimulus\n", + "\n", + "\n", + "\n", + "\n", + "TrialAnalysis\n", + "\n", + "\n", + "TrialAnalysis\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Trial->TrialAnalysis\n", + "\n", + "\n", + "\n", + "\n", + "SubjectDetails\n", + "\n", + "\n", + "SubjectDetails\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Subject\n", + "\n", + "\n", + "Subject\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Subject->SubjectDetails\n", + "\n", + "\n", + "\n", + "\n", + "Session\n", + "\n", + "\n", + "Session\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Subject->Session\n", + "\n", + "\n", + "\n", + "\n", + "Assignment\n", + "\n", + "\n", + "Assignment\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Subject->Assignment\n", + "\n", + "\n", + "\n", + "\n", + "Session->8\n", + "\n", + "\n", + "\n", + "\n", + "Session->9\n", + "\n", + "\n", + "\n", + "\n", + "Session->Trial\n", + "\n", + "\n", + "\n", + "\n", + "Scan\n", + "\n", + "\n", + "Scan\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Session->Scan\n", + "\n", + "\n", + "\n", + "\n", + "Scan.ROI\n", + "\n", + "\n", + "Scan.ROI\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Scan->Scan.ROI\n", + "\n", + "\n", + "\n", + "\n", + "Recording\n", + "\n", + "\n", + "Recording\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "ParkingSpot\n", + "\n", + "\n", + "ParkingSpot\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Employee\n", + "\n", + "\n", + "Employee\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Employee->ParkingSpot\n", + "\n", + "\n", + "\n", + "\n", + "Stimulus\n", + "\n", + "\n", + "Stimulus\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Stimulus->TrialStimulus\n", + "\n", + "\n", + "\n", + "\n", + "Protocol\n", + "\n", + "\n", + "Protocol\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Protocol->Assignment\n", + "\n", + "\n", + "\n", + "\n", + "Equipment\n", + "\n", + "\n", + "Equipment\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Equipment->Recording\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dj.Diagram(schema)" + ] + }, + { + "cell_type": "markdown", + "id": "cell-dag-md", + "metadata": {}, + "source": [ + "## Schema as DAG\n", + "\n", + "DataJoint schemas form a directed acyclic graph (DAG). Foreign keys:\n", + "\n", + "- Define data relationships\n", + "- Prescribe workflow execution order\n", + "- Enable cascading deletes\n", + "\n", + "There are no cyclic dependenciesβ€”parent tables must always be populated before their children.\n", + "\n", + "## Summary\n", + "\n", + "| Pattern | Declaration | Line Style | Dimensions |\n", + "|---------|-------------|------------|------------|\n", + "| One-to-one | FK is entire PK | Thick solid | No new dimension |\n", + "| One-to-many (contain) | FK + other attrs in PK | Thin solid | Usually new dimension |\n", + "| One-to-many (ref) | FK in secondary | Dashed | Independent dimensions |\n", + "| Many-to-many | Two FKs in PK | Two thin solid | No new dimension |\n", + "| Part table | `-> master` | Thin solid | May introduce dimension |\n", + "\n", + "## See Also\n", + "\n", + "- [Define Tables](define-tables.md) β€” Table definition syntax\n", + "- [Design Primary Keys](design-primary-keys.md) β€” Key selection strategies\n", + "- [Read Diagrams](read-diagrams.ipynb) β€” Diagram notation reference\n", + "- [Delete Data](delete-data.md) β€” Cascade behavior" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "cell-cleanup", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-13T18:57:34.995263Z", + "iopub.status.busy": "2026-01-13T18:57:34.995110Z", + "iopub.status.idle": "2026-01-13T18:57:35.044088Z", + "shell.execute_reply": "2026-01-13T18:57:35.043683Z" + } + }, + "outputs": [], + "source": [ + "schema.drop(prompt=False)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/src/how-to/monitor-progress.md b/src/how-to/monitor-progress.md new file mode 100644 index 00000000..fe8c243e --- /dev/null +++ b/src/how-to/monitor-progress.md @@ -0,0 +1,167 @@ +# Monitor Progress + +Track computation progress and job status. + +## Progress Display + +Show progress bar during populate: + +```python +ProcessedData.populate(display_progress=True) +``` + +## Check Remaining Work + +Count entries left to compute: + +```python +# What's left to compute +remaining = ProcessedData.key_source - ProcessedData +print(f"{len(remaining)} entries remaining") +``` + +## Job Status Summary + +Get counts by status: + +```python +progress = ProcessedData.jobs.progress() +# {'pending': 100, 'reserved': 5, 'error': 3, 'success': 892} + +for status, count in progress.items(): + print(f"{status}: {count}") +``` + +## Filter Jobs by Status + +Access jobs by their current status: + +```python +# Pending jobs (waiting to run) +ProcessedData.jobs.pending + +# Currently running +ProcessedData.jobs.reserved + +# Failed jobs +ProcessedData.jobs.errors + +# Completed jobs (if keep_completed=True) +ProcessedData.jobs.completed + +# Skipped jobs +ProcessedData.jobs.ignored +``` + +## View Job Details + +Inspect specific jobs: + +```python +# All jobs for a key +(ProcessedData.jobs & key).fetch1() + +# Recent errors +ProcessedData.jobs.errors.to_dicts( + order_by='completed_time DESC', + limit=10 +) +``` + +## Worker Information + +See which workers are processing: + +```python +for job in ProcessedData.jobs.reserved.to_dicts(): + print(f"Key: {job}") + print(f"Host: {job['host']}") + print(f"PID: {job['pid']}") + print(f"Started: {job['reserved_time']}") +``` + +## Computation Timing + +Track how long jobs take: + +```python +# Average duration of completed jobs +completed = ProcessedData.jobs.completed.to_arrays('duration') +print(f"Average: {np.mean(completed):.1f}s") +print(f"Median: {np.median(completed):.1f}s") +``` + +## Enable Job Metadata + +Store timing info in computed tables: + +```python +import datajoint as dj + +dj.config.jobs.add_job_metadata = True +dj.config.jobs.keep_completed = True +``` + +This adds hidden attributes to computed tables: + +- `_job_start_time` β€” When computation began +- `_job_duration` β€” How long it took +- `_job_version` β€” Code version (if configured) + +## Simple Progress Script + +```python +import time +from my_pipeline import ProcessedData + +while True: + remaining, total = ProcessedData.progress() + + print(f"\rProgress: {total - remaining}/{total} ({(total - remaining) / total:.0%})", end='') + + if remaining == 0: + print("\nDone!") + break + + time.sleep(10) +``` + +For distributed mode with job tracking: + +```python +import time +from my_pipeline import ProcessedData + +while True: + status = ProcessedData.jobs.progress() + + print(f"\rPending: {status.get('pending', 0)} | " + f"Running: {status.get('reserved', 0)} | " + f"Done: {status.get('success', 0)} | " + f"Errors: {status.get('error', 0)}", end='') + + if status.get('pending', 0) == 0 and status.get('reserved', 0) == 0: + print("\nDone!") + break + + time.sleep(10) +``` + +## Pipeline-Wide Status + +Check multiple tables: + +```python +tables = [RawData, ProcessedData, Analysis] + +for table in tables: + total = len(table.key_source) + done = len(table()) + print(f"{table.__name__}: {done}/{total} ({done/total:.0%})") +``` + +## See Also + +- [Run Computations](run-computations.md) β€” Basic populate usage +- [Distributed Computing](distributed-computing.md) β€” Multi-worker setup +- [Handle Errors](handle-errors.md) β€” Error recovery diff --git a/src/how-to/query-data.md b/src/how-to/query-data.md new file mode 100644 index 00000000..ccb96d26 --- /dev/null +++ b/src/how-to/query-data.md @@ -0,0 +1,178 @@ +# Query Data + +Filter, join, and transform data with DataJoint operators. + +## Restriction (`&`) + +Filter rows that match a condition: + +```python +# String condition +Session & "session_date > '2026-01-01'" +Session & "duration BETWEEN 30 AND 60" + +# Dictionary (exact match) +Session & {'subject_id': 'M001'} +Session & {'subject_id': 'M001', 'session_idx': 1} + +# Query expression +Session & Subject # Sessions for subjects in Subject +Session & (Subject & "sex = 'M'") # Sessions for male subjects + +# List (OR) +Session & [{'subject_id': 'M001'}, {'subject_id': 'M002'}] +``` + +## Top N Rows (`dj.Top`) + +Limit results with optional ordering: + +```python +# First 10 by primary key +Session & dj.Top(10) + +# Top 10 by date (descending) +Session & dj.Top(10, 'session_date DESC') + +# Pagination: skip 20, take 10 +Session & dj.Top(10, 'session_date DESC', offset=20) + +# All rows ordered +Session & dj.Top(None, 'session_date DESC') +``` + +Use `"KEY"` for primary key ordering, `"KEY DESC"` for reverse: + +```python +Session & dj.Top(10, 'KEY DESC') # Last 10 by primary key +``` + +## Anti-Restriction (`-`) + +Filter rows that do NOT match: + +```python +Subject - Session # Subjects without sessions +Session - {'subject_id': 'M001'} +``` + +## Projection (`.proj()`) + +Select, rename, or compute attributes: + +```python +# Primary key only +Subject.proj() + +# Specific attributes +Subject.proj('species', 'sex') + +# All attributes +Subject.proj(...) + +# All except some +Subject.proj(..., '-notes') + +# Rename +Subject.proj(animal_species='species') + +# Computed +Subject.proj(weight_kg='weight / 1000') +``` + +## Join (`*`) + +Combine tables on matching attributes: + +```python +Subject * Session +Subject * Session * Experimenter + +# Restrict then join +(Subject & "sex = 'M'") * Session +``` + +## Aggregation (`.aggr()`) + +Group and summarize: + +```python +# Count trials per session +Session.aggr(Session.Trial, n_trials='count(trial_idx)') + +# Multiple aggregates +Session.aggr( + Session.Trial, + n_trials='count(trial_idx)', + avg_rt='avg(reaction_time)', + min_rt='min(reaction_time)' +) + +# Exclude sessions without trials +Session.aggr(Session.Trial, n='count(trial_idx)', exclude_nonmatching=True) +``` + +## Universal Set (`dj.U()`) + +Group by arbitrary attributes: + +```python +# Unique values +dj.U('species') & Subject + +# Group by non-primary-key attribute +dj.U('session_date').aggr(Session, n='count(session_idx)') + +# Global aggregation (one row) +dj.U().aggr(Session, total='count(*)') +``` + +## Extension (`.extend()`) + +Add attributes without losing rows: + +```python +# Add experimenter info, keep all sessions +Session.extend(Experimenter) +``` + +## Chain Operations + +```python +result = ( + Subject + & "sex = 'M'" + * Session + & "duration > 30" +).proj('species', 'session_date', 'duration') +``` + +## Operator Precedence + +| Priority | Operator | Operation | +|----------|----------|-----------| +| Highest | `*` | Join | +| | `+`, `-` | Union, Anti-restriction | +| Lowest | `&` | Restriction | + +Use parentheses for clarity: + +```python +(Subject & condition) * Session # Restrict then join +Subject * (Session & condition) # Join then restrict +``` + +## View Query + +```python +# See generated SQL +print((Subject & condition).make_sql()) + +# Count rows without fetching +len(Subject & condition) +``` + +## See Also + +- [Operators Reference](../reference/operators.md) β€” Complete operator documentation +- [Fetch Results](fetch-results.md) β€” Retrieving query results diff --git a/src/how-to/read-diagrams.ipynb b/src/how-to/read-diagrams.ipynb new file mode 100644 index 00000000..ec38af4a --- /dev/null +++ b/src/how-to/read-diagrams.ipynb @@ -0,0 +1,1408 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "cell-intro", + "metadata": {}, + "source": [ + "# Read Schema Diagrams\n", + "\n", + "DataJoint diagrams visualize schema structure as directed acyclic graphs (DAGs). This guide teaches you to:\n", + "\n", + "- Interpret line styles and their semantic meaning\n", + "- Recognize dimensions (underlined vs non-underlined tables)\n", + "- Use diagram operations to explore large schemas\n", + "- Compare DataJoint notation to traditional ER diagrams" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "cell-setup", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-13T18:57:29.008773Z", + "iopub.status.busy": "2026-01-13T18:57:29.008500Z", + "iopub.status.idle": "2026-01-13T18:57:29.712700Z", + "shell.execute_reply": "2026-01-13T18:57:29.712356Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2026-01-13 12:57:29,697][INFO]: DataJoint 2.0.0a18 connected to root@127.0.0.1:3306\n" + ] + } + ], + "source": [ + "import datajoint as dj\n", + "\n", + "schema = dj.Schema('howto_diagrams')\n", + "schema.drop(prompt=False)\n", + "schema = dj.Schema('howto_diagrams')" + ] + }, + { + "cell_type": "markdown", + "id": "cell-ref", + "metadata": {}, + "source": [ + "## Quick Reference\n", + "\n", + "| Line Style | Relationship | Child's Primary Key |\n", + "|------------|--------------|---------------------|\n", + "| **Thick Solid** ━━━ | Extension | Parent PK only (one-to-one) |\n", + "| **Thin Solid** ─── | Containment | Parent PK + own fields (one-to-many) |\n", + "| **Dashed** β”„β”„β”„ | Reference | Own independent PK (one-to-many) |\n", + "\n", + "**Key principle:** Solid lines mean the parent's identity becomes part of the child's identity. Dashed lines mean the child maintains independent identity." + ] + }, + { + "cell_type": "markdown", + "id": "cell-thick-md", + "metadata": {}, + "source": [ + "## Thick Solid Line: Extension (One-to-One)\n", + "\n", + "The foreign key **is** the entire primary key. The child extends the parent." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "cell-thick", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-13T18:57:29.714484Z", + "iopub.status.busy": "2026-01-13T18:57:29.714242Z", + "iopub.status.idle": "2026-01-13T18:57:30.063885Z", + "shell.execute_reply": "2026-01-13T18:57:30.063544Z" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "Customer\n", + "\n", + "\n", + "Customer\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "CustomerPreferences\n", + "\n", + "\n", + "CustomerPreferences\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Customer->CustomerPreferences\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "@schema\n", + "class Customer(dj.Manual):\n", + " definition = \"\"\"\n", + " customer_id : uint32\n", + " ---\n", + " name : varchar(60)\n", + " \"\"\"\n", + "\n", + "@schema\n", + "class CustomerPreferences(dj.Manual):\n", + " definition = \"\"\"\n", + " -> Customer # FK is entire PK\n", + " ---\n", + " theme : varchar(20)\n", + " notifications : bool\n", + " \"\"\"\n", + "\n", + "dj.Diagram(Customer) + dj.Diagram(CustomerPreferences)" + ] + }, + { + "cell_type": "markdown", + "id": "cell-thick-erm", + "metadata": {}, + "source": [ + "**Equivalent ER Diagram:**\n", + "\n", + "\"ER\n", + "\n", + "**DataJoint vs ER:** The thick solid line immediately shows this is one-to-one. In ER notation, you must read the crow's foot symbols (`||--o|`).\n", + "\n", + "**Note:** `CustomerPreferences` is **not underlined** β€” it exists in the Customer dimension space." + ] + }, + { + "cell_type": "markdown", + "id": "cell-thin-md", + "metadata": {}, + "source": [ + "## Thin Solid Line: Containment (One-to-Many)\n", + "\n", + "The foreign key is **part of** the primary key, with additional fields." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "cell-thin", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-13T18:57:30.065617Z", + "iopub.status.busy": "2026-01-13T18:57:30.065387Z", + "iopub.status.idle": "2026-01-13T18:57:30.183092Z", + "shell.execute_reply": "2026-01-13T18:57:30.182724Z" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "Account\n", + "\n", + "\n", + "Account\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Customer\n", + "\n", + "\n", + "Customer\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Customer->Account\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "@schema\n", + "class Account(dj.Manual):\n", + " definition = \"\"\"\n", + " -> Customer # Part of PK\n", + " account_num : uint16 # Additional PK field\n", + " ---\n", + " balance : decimal(10,2)\n", + " \"\"\"\n", + "\n", + "dj.Diagram(Customer) + dj.Diagram(Account)" + ] + }, + { + "cell_type": "markdown", + "id": "cell-thin-erm", + "metadata": {}, + "source": [ + "**Equivalent ER Diagram:**\n", + "\n", + "\"ER\n", + "\n", + "**DataJoint vs ER:** The thin solid line shows containment β€” accounts belong to customers. In ER, you see `||--o{` (one-to-many).\n", + "\n", + "**Note:** `Account` is **underlined** β€” it introduces the Account dimension." + ] + }, + { + "cell_type": "markdown", + "id": "cell-dashed-md", + "metadata": {}, + "source": [ + "## Dashed Line: Reference (One-to-Many)\n", + "\n", + "The foreign key is a **secondary attribute** (below the `---` line)." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "cell-dashed", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-13T18:57:30.184750Z", + "iopub.status.busy": "2026-01-13T18:57:30.184531Z", + "iopub.status.idle": "2026-01-13T18:57:30.318119Z", + "shell.execute_reply": "2026-01-13T18:57:30.317803Z" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "Employee\n", + "\n", + "\n", + "Employee\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Department\n", + "\n", + "\n", + "Department\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Department->Employee\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "@schema\n", + "class Department(dj.Manual):\n", + " definition = \"\"\"\n", + " dept_id : uint16\n", + " ---\n", + " dept_name : varchar(60)\n", + " \"\"\"\n", + "\n", + "@schema\n", + "class Employee(dj.Manual):\n", + " definition = \"\"\"\n", + " employee_id : uint32 # Own independent PK\n", + " ---\n", + " -> Department # Secondary attribute\n", + " employee_name : varchar(60)\n", + " \"\"\"\n", + "\n", + "dj.Diagram(Department) + dj.Diagram(Employee)" + ] + }, + { + "cell_type": "markdown", + "id": "cell-dashed-erm", + "metadata": {}, + "source": [ + "**Equivalent ER Diagram:**\n", + "\n", + "\"ER\n", + "\n", + "**DataJoint vs ER:** Both show one-to-many, but DataJoint's dashed line tells you immediately that Employee has independent identity. In ER, you must examine whether the FK is part of the PK.\n", + "\n", + "**Note:** Both tables are **underlined** β€” each introduces its own dimension." + ] + }, + { + "cell_type": "markdown", + "id": "cell-dim-md", + "metadata": {}, + "source": [ + "## Dimensions and Underlined Names\n", + "\n", + "A **dimension** is a new entity type introduced by a table that defines new primary key attributes. Each underlined table introduces exactly **one** dimensionβ€”even if it has multiple new PK attributes, together they identify one new entity type.\n", + "\n", + "| Visual | Meaning |\n", + "|--------|--------|\n", + "| **Underlined** | Introduces a new dimension (new entity type) |\n", + "| Not underlined | Exists in the space defined by dimensions from referenced tables |\n", + "\n", + "**Key rules:**\n", + "- Computed tables **never** introduce dimensions (always non-underlined)\n", + "- Part tables **can** introduce dimensions (may be underlined)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "cell-dim", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-13T18:57:30.319688Z", + "iopub.status.busy": "2026-01-13T18:57:30.319533Z", + "iopub.status.idle": "2026-01-13T18:57:30.471166Z", + "shell.execute_reply": "2026-01-13T18:57:30.470754Z" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "SessionQC\n", + "\n", + "\n", + "SessionQC\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Account\n", + "\n", + "\n", + "Account\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Customer\n", + "\n", + "\n", + "Customer\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Customer->Account\n", + "\n", + "\n", + "\n", + "\n", + "CustomerPreferences\n", + "\n", + "\n", + "CustomerPreferences\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Customer->CustomerPreferences\n", + "\n", + "\n", + "\n", + "\n", + "Department\n", + "\n", + "\n", + "Department\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Employee\n", + "\n", + "\n", + "Employee\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Department->Employee\n", + "\n", + "\n", + "\n", + "\n", + "Session\n", + "\n", + "\n", + "Session\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Session->SessionQC\n", + "\n", + "\n", + "\n", + "\n", + "Subject\n", + "\n", + "\n", + "Subject\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Subject->Session\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "@schema\n", + "class Subject(dj.Manual):\n", + " definition = \"\"\"\n", + " subject_id : varchar(16) # NEW dimension\n", + " ---\n", + " species : varchar(50)\n", + " \"\"\"\n", + "\n", + "@schema\n", + "class Session(dj.Manual):\n", + " definition = \"\"\"\n", + " -> Subject # Inherits subject_id\n", + " session_idx : uint16 # NEW dimension\n", + " ---\n", + " session_date : date\n", + " \"\"\"\n", + "\n", + "@schema \n", + "class SessionQC(dj.Computed):\n", + " definition = \"\"\"\n", + " -> Session # Inherits both, adds nothing\n", + " ---\n", + " passed : bool\n", + " \"\"\"\n", + " def make(self, key):\n", + " self.insert1({**key, 'passed': True})\n", + "\n", + "dj.Diagram(schema)" + ] + }, + { + "cell_type": "markdown", + "id": "cell-dim-explain", + "metadata": {}, + "source": [ + "In this diagram:\n", + "- `Subject` is **underlined** β€” introduces the Subject dimension\n", + "- `Session` is **underlined** β€” introduces the Session dimension (within each Subject)\n", + "- `SessionQC` is **not underlined** β€” exists in the Session dimension space, adds no new dimension\n", + "\n", + "**Why this matters:** Dimensions determine [attribute lineage](../explanation/entity-integrity.md#dimensions-and-attribute-lineage). Primary key attributes trace back to the dimension where they originated, enabling [semantic matching](../reference/specs/semantic-matching.md) for safe joins." + ] + }, + { + "cell_type": "markdown", + "id": "cell-m2m-md", + "metadata": {}, + "source": [ + "## Many-to-Many: Converging Lines\n", + "\n", + "Many-to-many relationships appear as tables with multiple solid lines converging." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "cell-m2m", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-13T18:57:30.472743Z", + "iopub.status.busy": "2026-01-13T18:57:30.472577Z", + "iopub.status.idle": "2026-01-13T18:57:30.629738Z", + "shell.execute_reply": "2026-01-13T18:57:30.629375Z" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "Enrollment\n", + "\n", + "\n", + "Enrollment\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Course\n", + "\n", + "\n", + "Course\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Course->Enrollment\n", + "\n", + "\n", + "\n", + "\n", + "Student\n", + "\n", + "\n", + "Student\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Student->Enrollment\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "@schema\n", + "class Student(dj.Manual):\n", + " definition = \"\"\"\n", + " student_id : uint32\n", + " ---\n", + " name : varchar(60)\n", + " \"\"\"\n", + "\n", + "@schema\n", + "class Course(dj.Manual):\n", + " definition = \"\"\"\n", + " course_code : char(8)\n", + " ---\n", + " title : varchar(100)\n", + " \"\"\"\n", + "\n", + "@schema\n", + "class Enrollment(dj.Manual):\n", + " definition = \"\"\"\n", + " -> Student\n", + " -> Course\n", + " ---\n", + " grade : enum('A','B','C','D','F')\n", + " \"\"\"\n", + "\n", + "dj.Diagram(Student) + dj.Diagram(Course) + dj.Diagram(Enrollment)" + ] + }, + { + "cell_type": "markdown", + "id": "cell-m2m-erm", + "metadata": {}, + "source": [ + "**Equivalent ER Diagram:**\n", + "\n", + "\"ER\n", + "\n", + "**DataJoint vs ER:** Both show the association table pattern. DataJoint's converging solid lines immediately indicate the composite primary key.\n", + "\n", + "**Note:** `Enrollment` is **not underlined** β€” it exists in the space defined by Student Γ— Course dimensions." + ] + }, + { + "cell_type": "markdown", + "id": "cell-rename-md", + "metadata": {}, + "source": [ + "## Orange Dots: Renamed Foreign Keys\n", + "\n", + "When referencing the same table multiple times, use `.proj()` to rename. **Orange dots** indicate renamed FKs." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "cell-rename", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-13T18:57:30.631577Z", + "iopub.status.busy": "2026-01-13T18:57:30.631398Z", + "iopub.status.idle": "2026-01-13T18:57:30.768666Z", + "shell.execute_reply": "2026-01-13T18:57:30.768297Z" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "Marriage\n", + "\n", + "\n", + "Marriage\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "0->Marriage\n", + "\n", + "\n", + "\n", + "\n", + "1\n", + "\n", + "1\n", + "\n", + "\n", + "\n", + "1->Marriage\n", + "\n", + "\n", + "\n", + "\n", + "Person\n", + "\n", + "\n", + "Person\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Person->0\n", + "\n", + "\n", + "\n", + "\n", + "Person->1\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "@schema\n", + "class Person(dj.Manual):\n", + " definition = \"\"\"\n", + " person_id : uint32\n", + " ---\n", + " name : varchar(60)\n", + " \"\"\"\n", + "\n", + "@schema\n", + "class Marriage(dj.Manual):\n", + " definition = \"\"\"\n", + " marriage_id : uint32\n", + " ---\n", + " -> Person.proj(spouse1='person_id')\n", + " -> Person.proj(spouse2='person_id')\n", + " marriage_date : date\n", + " \"\"\"\n", + "\n", + "dj.Diagram(Person) + dj.Diagram(Marriage)" + ] + }, + { + "cell_type": "markdown", + "id": "cell-rename-explain", + "metadata": {}, + "source": [ + "The orange dots between `Person` and `Marriage` indicate that projections renamed the foreign key attributes (`spouse1` and `spouse2` both reference `person_id`).\n", + "\n", + "**Tip:** In Jupyter, hover over orange dots to see the projection expression." + ] + }, + { + "cell_type": "markdown", + "id": "cell-ops-md", + "metadata": {}, + "source": [ + "## Diagram Operations\n", + "\n", + "Filter and combine diagrams to explore large schemas:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "cell-ops1", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-13T18:57:30.770398Z", + "iopub.status.busy": "2026-01-13T18:57:30.770123Z", + "iopub.status.idle": "2026-01-13T18:57:30.869541Z", + "shell.execute_reply": "2026-01-13T18:57:30.869195Z" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "4\n", + "\n", + "4\n", + "\n", + "\n", + "\n", + "Marriage\n", + "\n", + "\n", + "Marriage\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "4->Marriage\n", + "\n", + "\n", + "\n", + "\n", + "5\n", + "\n", + "5\n", + "\n", + "\n", + "\n", + "5->Marriage\n", + "\n", + "\n", + "\n", + "\n", + "Subject\n", + "\n", + "\n", + "Subject\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Session\n", + "\n", + "\n", + "Session\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Subject->Session\n", + "\n", + "\n", + "\n", + "\n", + "Student\n", + "\n", + "\n", + "Student\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Enrollment\n", + "\n", + "\n", + "Enrollment\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Student->Enrollment\n", + "\n", + "\n", + "\n", + "\n", + "SessionQC\n", + "\n", + "\n", + "SessionQC\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Session->SessionQC\n", + "\n", + "\n", + "\n", + "\n", + "Person\n", + "\n", + "\n", + "Person\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Person->4\n", + "\n", + "\n", + "\n", + "\n", + "Person->5\n", + "\n", + "\n", + "\n", + "\n", + "Employee\n", + "\n", + "\n", + "Employee\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Department\n", + "\n", + "\n", + "Department\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Department->Employee\n", + "\n", + "\n", + "\n", + "\n", + "CustomerPreferences\n", + "\n", + "\n", + "CustomerPreferences\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Customer\n", + "\n", + "\n", + "Customer\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Customer->CustomerPreferences\n", + "\n", + "\n", + "\n", + "\n", + "Account\n", + "\n", + "\n", + "Account\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Customer->Account\n", + "\n", + "\n", + "\n", + "\n", + "Course\n", + "\n", + "\n", + "Course\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Course->Enrollment\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Entire schema\n", + "dj.Diagram(schema)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "cell-ops2", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-13T18:57:30.871029Z", + "iopub.status.busy": "2026-01-13T18:57:30.870876Z", + "iopub.status.idle": "2026-01-13T18:57:30.969057Z", + "shell.execute_reply": "2026-01-13T18:57:30.968702Z" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "Subject\n", + "\n", + "\n", + "Subject\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Session\n", + "\n", + "\n", + "Session\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Subject->Session\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Session and 1 level upstream (dependencies)\n", + "dj.Diagram(Session) - 1" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "cell-ops3", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-13T18:57:30.970585Z", + "iopub.status.busy": "2026-01-13T18:57:30.970420Z", + "iopub.status.idle": "2026-01-13T18:57:31.071840Z", + "shell.execute_reply": "2026-01-13T18:57:31.071494Z" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "Subject\n", + "\n", + "\n", + "Subject\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Session\n", + "\n", + "\n", + "Session\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Subject->Session\n", + "\n", + "\n", + "\n", + "\n", + "SessionQC\n", + "\n", + "\n", + "SessionQC\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Session->SessionQC\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Subject and 2 levels downstream (dependents)\n", + "dj.Diagram(Subject) + 2" + ] + }, + { + "cell_type": "markdown", + "id": "cell-ops-ref", + "metadata": {}, + "source": [ + "**Operation Reference:**\n", + "\n", + "| Operation | Meaning |\n", + "|-----------|--------|\n", + "| `dj.Diagram(schema)` | Entire schema |\n", + "| `dj.Diagram(Table) - N` | Table + N levels upstream |\n", + "| `dj.Diagram(Table) + N` | Table + N levels downstream |\n", + "| `D1 + D2` | Union of two diagrams |\n", + "| `D1 * D2` | Intersection (common nodes) |\n", + "\n", + "**Finding paths:** Use intersection to find connection paths:\n", + "```python\n", + "(dj.Diagram(upstream) + 100) * (dj.Diagram(downstream) - 100)\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "cell-hidden-md", + "metadata": {}, + "source": [ + "## What Diagrams Don't Show\n", + "\n", + "Diagrams do **NOT** show these FK modifiers:\n", + "\n", + "| Modifier | Effect | Must Check Definition |\n", + "|----------|--------|----------------------|\n", + "| `[nullable]` | Optional reference | `-> [nullable] Parent` |\n", + "| `[unique]` | One-to-one on secondary FK | `-> [unique] Parent` |\n", + "\n", + "A dashed line could be any of:\n", + "- Required one-to-many (default)\n", + "- Optional one-to-many (`[nullable]`)\n", + "- Required one-to-one (`[unique]`)\n", + "- Optional one-to-one (`[nullable, unique]`)\n", + "\n", + "**Always check the table definition** to see modifiers." + ] + }, + { + "cell_type": "markdown", + "id": "cell-compare-md", + "metadata": {}, + "source": [ + "## DataJoint vs Traditional ER Notation\n", + "\n", + "| Feature | Chen's ER | Crow's Foot | DataJoint |\n", + "|---------|-----------|-------------|----------|\n", + "| Cardinality | Numbers | Line symbols | **Line style** |\n", + "| Direction | None | None | **Top-to-bottom** |\n", + "| Cycles | Allowed | Allowed | **Not allowed** |\n", + "| PK cascade | Not shown | Not shown | **Solid lines** |\n", + "| Identity sharing | Not indicated | Not indicated | **Thick solid** |\n", + "| New dimensions | Not indicated | Not indicated | **Underlined** |\n", + "\n", + "**Why DataJoint differs:**\n", + "\n", + "1. **DAG structure** β€” No cycles means schemas read as workflows (top-to-bottom)\n", + "2. **Line semantics** β€” Immediately reveals relationship type\n", + "3. **Executable** β€” Diagram is generated from schema, cannot drift out of sync" + ] + }, + { + "cell_type": "markdown", + "id": "cell-summary-md", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "| Visual | Meaning |\n", + "|--------|--------|\n", + "| **Thick solid** | One-to-one extension |\n", + "| **Thin solid** | One-to-many containment |\n", + "| **Dashed** | Reference (independent identity) |\n", + "| **Underlined** | Introduces new dimension |\n", + "| **Orange dots** | Renamed FK via `.proj()` |\n", + "| **Colors** | Green=Manual, Gray=Lookup, Red=Computed, Blue=Imported |\n", + "\n", + "## Related\n", + "\n", + "- [Entity Integrity: Dimensions](../explanation/entity-integrity.md#schema-dimensions)\n", + "- [Semantic Matching](../reference/specs/semantic-matching.md)\n", + "- [Schema Design Tutorial](../tutorials/basics/02-schema-design.ipynb)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "cell-cleanup", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-13T18:57:31.073474Z", + "iopub.status.busy": "2026-01-13T18:57:31.073182Z", + "iopub.status.idle": "2026-01-13T18:57:31.128075Z", + "shell.execute_reply": "2026-01-13T18:57:31.127645Z" + } + }, + "outputs": [], + "source": [ + "schema.drop(prompt=False)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/src/how-to/run-computations.md b/src/how-to/run-computations.md new file mode 100644 index 00000000..10417280 --- /dev/null +++ b/src/how-to/run-computations.md @@ -0,0 +1,154 @@ +# Run Computations + +Execute automated computations with `populate()`. + +## Basic Usage + +```python +# Populate all missing entries +ProcessedData.populate() + +# With progress display +ProcessedData.populate(display_progress=True) +``` + +## Restrict What to Compute + +```python +# Only specific subjects +ProcessedData.populate(Subject & "sex = 'M'") + +# Only recent sessions +ProcessedData.populate(Session & "session_date > '2026-01-01'") + +# Specific key +ProcessedData.populate({'subject_id': 'M001', 'session_idx': 1}) +``` + +## Limit Number of Jobs + +```python +# Process at most 100 entries +ProcessedData.populate(limit=100) +``` + +## Error Handling + +```python +# Continue on errors (log but don't stop) +ProcessedData.populate(suppress_errors=True) + +# Check what failed +failed = ProcessedData.jobs & 'status = "error"' +print(failed) + +# Clear errors to retry +failed.delete() +ProcessedData.populate() +``` + +## Distributed Computing + +```python +# Reserve jobs to prevent conflicts between workers +ProcessedData.populate(reserve_jobs=True) + +# Run on multiple machines/processes simultaneously +# Each worker reserves and processes different keys +``` + +## Check Progress + +```python +# What's left to compute +remaining = ProcessedData.key_source - ProcessedData +print(f"{len(remaining)} entries remaining") + +# View job status +ProcessedData.jobs +``` + +## The `make()` Method + +```python +@schema +class ProcessedData(dj.Computed): + definition = """ + -> RawData + --- + result : float64 + """ + + def make(self, key): + # 1. Fetch input data + raw = (RawData & key).fetch1('data') + + # 2. Compute + result = process(raw) + + # 3. Insert + self.insert1({**key, 'result': result}) +``` + +## Three-Part Make for Long Computations + +For computations taking hours or days: + +```python +@schema +class LongComputation(dj.Computed): + definition = """ + -> RawData + --- + result : float64 + """ + + def make_fetch(self, key): + """Fetch input data (outside transaction)""" + data = (RawData & key).fetch1('data') + return (data,) + + def make_compute(self, key, fetched): + """Perform computation (outside transaction)""" + (data,) = fetched + result = expensive_computation(data) + return (result,) + + def make_insert(self, key, fetched, computed): + """Insert results (inside brief transaction)""" + (result,) = computed + self.insert1({**key, 'result': result}) +``` + +## Custom Key Source + +```python +@schema +class FilteredComputation(dj.Computed): + definition = """ + -> RawData + --- + result : float64 + """ + + @property + def key_source(self): + # Only compute for high-quality data + return (RawData & 'quality > 0.8') - self +``` + +## Populate Options + +| Option | Default | Description | +|--------|---------|-------------| +| `restriction` | `None` | Filter what to compute | +| `limit` | `None` | Max entries to process | +| `display_progress` | `False` | Show progress bar | +| `reserve_jobs` | `False` | Reserve jobs for distributed computing | +| `suppress_errors` | `False` | Continue on errors | + +## See Also + +- [Computation Model](../explanation/computation-model.md) β€” How computation works +- [Distributed Computing](distributed-computing.md) β€” Multi-worker setup +- [Handle Errors](handle-errors.md) β€” Error recovery diff --git a/src/how-to/use-cli.md b/src/how-to/use-cli.md new file mode 100644 index 00000000..ee080851 --- /dev/null +++ b/src/how-to/use-cli.md @@ -0,0 +1,138 @@ +# Use the Command-Line Interface + +Start an interactive Python REPL with DataJoint pre-loaded. + +The `dj` command provides quick access to DataJoint for exploring schemas, running queries, and testing connections without writing scripts. + +## Start the REPL + +```bash +dj +``` + +This opens a Python REPL with `dj` (DataJoint) already imported: + +``` +DataJoint 2.0.0 REPL +Type 'dj.' and press Tab for available functions. + +>>> dj.conn() # Connect to database +>>> dj.list_schemas() # List available schemas +``` + +## Specify Database Credentials + +Override config file settings from the command line: + +```bash +dj --host localhost:3306 --user root --password secret +``` + +| Option | Description | +|--------|-------------| +| `--host HOST` | Database host as `host:port` | +| `-u`, `--user USER` | Database username | +| `-p`, `--password PASS` | Database password | + +Credentials from command-line arguments override values in config files. + +## Load Schemas as Virtual Modules + +Load database schemas directly into the REPL namespace: + +```bash +dj -s my_lab:lab -s my_analysis:analysis +``` + +The format is `schema_name:alias` where: +- `schema_name` is the database schema name +- `alias` is the variable name in the REPL + +This outputs: + +``` +DataJoint 2.0.0 REPL +Type 'dj.' and press Tab for available functions. + +Loaded schemas: + lab -> my_lab + analysis -> my_analysis + +>>> lab.Subject.to_dicts() # Query Subject table +>>> dj.Diagram(lab.schema) # View schema diagram +``` + +## Common Workflows + +### Explore an Existing Schema + +```bash +dj -s production_db:db +``` + +```python +>>> list(db.schema) # List all tables +>>> db.Experiment().to_dicts()[:5] # Preview data +>>> dj.Diagram(db.schema) # Visualize structure +``` + +### Quick Data Check + +```bash +dj --host db.example.com -s my_lab:lab +``` + +```python +>>> len(lab.Session()) # Count sessions +>>> lab.Session.describe() # Show table definition +``` + +### Test Connection + +```bash +dj --host localhost:3306 --user testuser --password testpass +``` + +```python +>>> dj.conn() # Verify connection works +>>> dj.list_schemas() # Check accessible schemas +``` + +## Version Information + +Display DataJoint version: + +```bash +dj --version +``` + +## Help + +Display all options: + +```bash +dj --help +``` + +## Entry Points + +The CLI is available as both `dj` and `datajoint`: + +```bash +dj --version +datajoint --version # Same command +``` + +## Programmatic Usage + +The CLI function can also be called from Python: + +```python +from datajoint.cli import cli + +# Show version and exit +cli(["--version"]) + +# Start REPL with schemas +cli(["-s", "my_lab:lab"]) +``` diff --git a/src/how-to/use-npy-codec.md b/src/how-to/use-npy-codec.md new file mode 100644 index 00000000..68f3e4c6 --- /dev/null +++ b/src/how-to/use-npy-codec.md @@ -0,0 +1,284 @@ +# Use the `` Codec + +Store NumPy arrays with lazy loading and metadata access. + +## Overview + +The `` codec stores NumPy arrays as portable `.npy` files in object storage. On fetch, you get an `NpyRef` that provides metadata without downloading. + +**Key benefits:** +- Access shape, dtype, size without I/O +- Lazy loading - download only when needed +- Memory mapping - random access to large arrays +- Safe bulk fetch - inspect before downloading +- Portable `.npy` format + +## Quick Start + +### 1. Configure a Store + +```python +import datajoint as dj + +# Add store configuration +dj.config.object_storage.stores['mystore'] = { + 'protocol': 's3', + 'endpoint': 'localhost:9000', + 'bucket': 'my-bucket', + 'access_key': 'access_key', + 'secret_key': 'secret_key', + 'location': 'data', +} +``` + +Or in `datajoint.json`: +```json +{ + "object_storage": { + "stores": { + "mystore": { + "protocol": "s3", + "endpoint": "s3.amazonaws.com", + "bucket": "my-bucket", + "location": "data" + } + } + } +} +``` + +### 2. Define Table with `` + +```python +@schema +class Recording(dj.Manual): + definition = """ + recording_id : int32 + --- + waveform : + """ +``` + +### 3. Insert Arrays + +```python +import numpy as np + +Recording.insert1({ + 'recording_id': 1, + 'waveform': np.random.randn(1000, 32), +}) +``` + +### 4. Fetch with Lazy Loading + +```python +# Returns NpyRef, not array +ref = (Recording & 'recording_id=1').fetch1('waveform') + +# Metadata without download +print(ref.shape) # (1000, 32) +print(ref.dtype) # float64 + +# Load when ready +arr = ref.load() +``` + +## NpyRef Reference + +### Metadata Properties (No I/O) + +```python +ref.shape # Tuple of dimensions +ref.dtype # NumPy dtype +ref.ndim # Number of dimensions +ref.size # Total elements +ref.nbytes # Total bytes +ref.path # Storage path +ref.store # Store name +ref.is_loaded # Whether data is cached +``` + +### Loading Methods + +```python +# Explicit load (recommended) +arr = ref.load() + +# Via NumPy functions (auto-loads) +mean = np.mean(ref) +std = np.std(ref, axis=0) + +# Via conversion (auto-loads) +arr = np.asarray(ref) + +# Indexing (loads then indexes) +first_row = ref[0] +snippet = ref[100:200, :] +``` + +### Memory Mapping + +For large arrays, use `mmap_mode` to access data without loading it all into memory: + +```python +# Memory-mapped loading (random access) +arr = ref.load(mmap_mode='r') + +# Only reads the portion you access +slice = arr[1000:2000, :] # Efficient for large arrays +``` + +**Modes:** +- `'r'` - Read-only (recommended) +- `'r+'` - Read-write +- `'c'` - Copy-on-write (changes not saved) + +**Performance:** +- Local filesystem stores: mmaps directly (no copy) +- Remote stores (S3): downloads to cache first, then mmaps + +## Common Patterns + +### Bulk Fetch with Filtering + +```python +# Fetch all - returns NpyRefs, not arrays +results = MyTable.to_dicts() + +# Filter by metadata (no downloads) +large = [r for r in results if r['data'].shape[0] > 1000] + +# Load only what you need +for rec in large: + arr = rec['data'].load() + process(arr) +``` + +### Computed Tables + +```python +@schema +class ProcessedData(dj.Computed): + definition = """ + -> RawData + --- + result : + """ + + def make(self, key): + # Fetch lazy reference + ref = (RawData & key).fetch1('raw') + + # NumPy functions auto-load + result = np.fft.fft(ref, axis=1) + + self.insert1({**key, 'result': result}) +``` + +### Memory-Efficient Processing + +```python +# Process recordings one at a time +for key in Recording.keys(): + ref = (Recording & key).fetch1('data') + + # Check size before loading + if ref.nbytes > 1e9: # > 1 GB + print(f"Skipping large recording: {ref.nbytes/1e9:.1f} GB") + continue + + process(ref.load()) +``` + +## Comparison with `` + +| Aspect | `` | `` | +|--------|----------|----------| +| **On fetch** | NpyRef (lazy) | Array (eager) | +| **Metadata access** | Without download | Must download | +| **Memory mapping** | Yes, via `mmap_mode` | No | +| **Addressing** | Schema-addressed | Hash-addressed | +| **Deduplication** | No | Yes | +| **Format** | `.npy` (portable) | DJ blob (Python) | +| **Best for** | Large arrays, lazy loading | Small arrays, dedup | + +### When to Use Each + +**Use `` when:** +- Arrays are large (> 10 MB) +- You need to inspect shape/dtype before loading +- Fetching many rows but processing few +- Random access to slices of very large arrays (memory mapping) +- Interoperability matters (non-Python tools) + +**Use `` when:** +- Arrays are small (< 10 MB) +- Same arrays appear in multiple rows (deduplication) +- Storing non-array Python objects (dicts, lists) + +## Supported Array Types + +The `` codec supports any NumPy array except object dtype: + +```python +# Supported +np.array([1, 2, 3], dtype=np.int32) # Integer +np.array([1.0, 2.0], dtype=np.float64) # Float +np.array([True, False], dtype=np.bool_) # Boolean +np.array([1+2j, 3+4j], dtype=np.complex128) # Complex +np.zeros((10, 10, 10)) # N-dimensional +np.array(42) # 0-dimensional scalar + +# Structured arrays +dt = np.dtype([('x', np.float64), ('y', np.float64)]) +np.array([(1.0, 2.0), (3.0, 4.0)], dtype=dt) + +# NOT supported +np.array([{}, []], dtype=object) # Object dtype +``` + +## Troubleshooting + +### "Store not configured" + +Ensure your store is configured before using ``: + +```python +dj.config.object_storage.stores['store'] = {...} +``` + +### "requires @ (store only)" + +The `` codec requires the `@` modifier: + +```python +# Wrong +data : + +# Correct +data : +data : +``` + +### Memory issues with large arrays + +Use lazy loading or memory mapping to control memory: + +```python +# Check size before loading +if ref.nbytes > available_memory: + # Use memory mapping for random access + arr = ref.load(mmap_mode='r') + # Process in chunks + for i in range(0, len(arr), chunk_size): + process(arr[i:i+chunk_size]) +else: + arr = ref.load() +``` + +## See Also + +- [Use Object Storage](use-object-storage.md) - Complete storage guide +- [Configure Object Storage](configure-storage.md) - Store setup +- [`` Codec Specification](../reference/specs/npy-codec.md) - Full spec diff --git a/src/how-to/use-object-storage.md b/src/how-to/use-object-storage.md new file mode 100644 index 00000000..1700f4fe --- /dev/null +++ b/src/how-to/use-object-storage.md @@ -0,0 +1,346 @@ +# Use Object Storage + +Store large data objects as part of your Object-Augmented Schema. + +## Object-Augmented Schema (OAS) + +An **Object-Augmented Schema** extends relational tables with object storage as a unified system. The relational database stores metadata, references, and small values while large objects (arrays, files, datasets) are stored in object storage. DataJoint maintains referential integrity across both storage layersβ€”when you delete a row, its associated objects are cleaned up automatically. + +OAS supports two addressing schemes: + +| Addressing | Location | Path Derived From | Use Case | +|------------|----------|-------------------|----------| +| **Hash-addressed** | Object store | Content hash (MD5) | Blobs, attachments (with deduplication) | +| **Schema-addressed** | Object store | Schema structure | NumPy arrays, Zarr, HDF5 (browsable paths) | + +Data can also be stored **inline** directly in the database column (no `@` modifier). + +For complete details, see the [Type System specification](../reference/specs/type-system.md). + +## When to Use Object Storage + +Use the `@` modifier for: + +- Large arrays (images, videos, neural recordings) +- File attachments +- Zarr arrays and HDF5 files +- Any data too large for efficient database storage + +## Inline vs Object Store + +```python +@schema +class Recording(dj.Manual): + definition = """ + recording_id : uuid + --- + metadata : # Inline: stored in database column + raw_data : # Object store: hash-addressed + waveforms : # Object store: schema-addressed (lazy) + """ +``` + +| Syntax | Storage | Best For | +|--------|---------|----------| +| `` | Database | Small objects (< 1 MB) | +| `` | Default store | Large objects (hash-addressed) | +| `` | Default store | NumPy arrays (schema-addressed, lazy) | +| `` | Named store | Specific storage tier | + +## Store Data + +Insert works the same regardless of storage location: + +```python +import numpy as np + +Recording.insert1({ + 'recording_id': uuid.uuid4(), + 'metadata': {'channels': 32, 'rate': 30000}, + 'raw_data': np.random.randn(32, 30000) # ~7.7 MB array +}) +``` + +DataJoint automatically routes to the configured store. + +## Retrieve Data + +Fetch works transparently: + +```python +data = (Recording & key).fetch1('raw_data') +# Returns the numpy array, regardless of where it was stored +``` + +## Named Stores + +Use different stores for different data types: + +```python +@schema +class Experiment(dj.Manual): + definition = """ + experiment_id : uuid + --- + raw_video : # Fast local storage + processed : # S3 for long-term + """ +``` + +Configure stores in `datajoint.json`: + +```json +{ + "stores": { + "default": "raw", + "raw": { + "protocol": "file", + "location": "/fast/storage" + }, + "archive": { + "protocol": "s3", + "endpoint": "s3.amazonaws.com", + "bucket": "archive", + "location": "project-data" + } + } +} +``` + +## Hash-Addressed Storage + +`` and `` use **hash-addressed** storage: + +- Objects are stored by their content hash (MD5) +- Identical data is stored once (automatic deduplication) +- Multiple rows can reference the same object +- Immutableβ€”changing data creates a new object + +```python +# These two inserts store the same array only once +data = np.zeros((1000, 1000)) +Table.insert1({'id': 1, 'array': data}) +Table.insert1({'id': 2, 'array': data}) # References same object +``` + +## Schema-Addressed Storage + +`` and `` use **schema-addressed** storage: + +- Objects stored at paths that mirror database schema: `{schema}/{table}/{pk}/{attribute}.npy` +- Browsable organization in object storage +- One object per entity (no deduplication) +- Supports lazy loading with metadata access + +```python +@schema +class Dataset(dj.Manual): + definition = """ + dataset_id : uuid + --- + zarr_array : # Zarr array stored by path + """ +``` + +Use path-addressed storage for: + +- Zarr arrays (chunked, appendable) +- HDF5 files +- Large datasets requiring streaming access + +## Write Directly to Object Storage + +For large datasets like multi-GB imaging recordings, avoid intermediate copies by writing directly to object storage with `staged_insert1`: + +```python +import zarr + +@schema +class ImagingSession(dj.Manual): + definition = """ + subject_id : int32 + session_id : int32 + --- + n_frames : int32 + frame_rate : float32 + frames : + """ + +# Write Zarr directly to object storage +with ImagingSession.staged_insert1 as staged: + # 1. Set primary key values first + staged.rec['subject_id'] = 1 + staged.rec['session_id'] = 1 + + # 2. Get storage handle + store = staged.store('frames', '.zarr') + + # 3. Write directly (no local copy) + z = zarr.open(store, mode='w', shape=(1000, 512, 512), + chunks=(10, 512, 512), dtype='uint16') + for i in range(1000): + z[i] = acquire_frame() # Write frame-by-frame + + # 4. Set remaining attributes + staged.rec['n_frames'] = 1000 + staged.rec['frame_rate'] = 30.0 + +# Record inserted with computed metadata on successful exit +``` + +The `staged_insert1` context manager: + +- Writes directly to the object store (no intermediate files) +- Computes metadata (size, manifest) automatically on exit +- Cleans up storage if an error occurs (atomic) +- Requires primary key values before calling `store()` or `open()` + +Use `staged.store(field, ext)` for FSMap access (Zarr), or `staged.open(field, ext)` for file-like access. + +## Attachments + +Preserve original filenames with ``: + +```python +@schema +class Document(dj.Manual): + definition = """ + doc_id : uuid + --- + report : # Preserves filename + """ + +# Insert with AttachFileType +from datajoint import AttachFileType +Document.insert1({ + 'doc_id': uuid.uuid4(), + 'report': AttachFileType('/path/to/report.pdf') +}) +``` + +## NumPy Arrays with `` + +The `` codec stores NumPy arrays as portable `.npy` files with lazy loading: + +```python +@schema +class Recording(dj.Manual): + definition = """ + recording_id : int32 + --- + waveform : # NumPy array, schema-addressed + """ + +# Insert - just pass the array +Recording.insert1({ + 'recording_id': 1, + 'waveform': np.random.randn(1000, 32), +}) + +# Fetch returns NpyRef (lazy) +ref = (Recording & 'recording_id=1').fetch1('waveform') +``` + +### NpyRef: Lazy Array Reference + +`NpyRef` provides metadata without downloading: + +```python +ref = (Recording & key).fetch1('waveform') + +# Metadata access - NO download +ref.shape # (1000, 32) +ref.dtype # float64 +ref.nbytes # 256000 +ref.is_loaded # False + +# Explicit loading +arr = ref.load() # Downloads and caches +ref.is_loaded # True + +# Numpy integration (triggers download) +result = np.mean(ref) # Uses __array__ protocol +result = np.asarray(ref) + 1 # Convert then operate +``` + +### Bulk Fetch Safety + +Fetching many rows doesn't download until you access each array: + +```python +# Fetch 1000 recordings - NO downloads yet +results = Recording.to_dicts() + +# Inspect metadata without downloading +for rec in results: + ref = rec['waveform'] + if ref.shape[0] > 500: # Check without download + process(ref.load()) # Download only what you need +``` + +## Lazy Loading with ObjectRef + +`` and `` return lazy references: + +```python +ref = (Dataset & key).fetch1('zarr_array') + +# Open for streaming access +with ref.open() as f: + data = zarr.open(f) + +# Or download to local path +local_path = ref.download('/tmp/data') +``` + +## Storage Best Practices + +### Choose the Right Codec + +| Data Type | Codec | Addressing | Lazy | Best For | +|-----------|-------|------------|------|----------| +| NumPy arrays | `` | Schema | Yes | Arrays needing lazy load, metadata inspection | +| Python objects | `` | Hash | No | Dicts, lists, small arrays (with dedup) | +| File attachments | `` | Hash | No | Files with original filename preserved | +| Zarr/HDF5 | `` | Schema | Yes | Chunked arrays, streaming access | +| File references | `` | External | Yes | References to external files | + +### Size Guidelines + +- **< 1 MB**: Inline storage (``) is fine +- **1 MB - 1 GB**: Object store (`` or ``) +- **> 1 GB**: Schema-addressed (``, ``) for lazy loading + +### Store Tiers + +Configure stores for different access patterns: + +```json +{ + "stores": { + "default": "hot", + "hot": { + "protocol": "file", + "location": "/ssd/data" + }, + "warm": { + "protocol": "s3", + "endpoint": "s3.amazonaws.com", + "bucket": "project-data", + "location": "active" + }, + "cold": { + "protocol": "s3", + "endpoint": "s3.amazonaws.com", + "bucket": "archive", + "location": "long-term" + } + } +} +``` + +## See Also + +- [Configure Object Storage](configure-storage.md) β€” Storage setup +- [Create Custom Codecs](create-custom-codec.md) β€” Domain-specific types +- [Manage Large Data](manage-large-data.md) β€” Working with blobs diff --git a/src/images/calcium-pipeline.svg b/src/images/calcium-pipeline.svg new file mode 100644 index 00000000..c936aa20 --- /dev/null +++ b/src/images/calcium-pipeline.svg @@ -0,0 +1 @@ +

Mouse

Session

Scan

AverageFrame

Segmentation

SegmentationParam

Fluorescence

Roi

Trace

\ No newline at end of file diff --git a/src/images/dj-platform.png b/src/images/dj-platform.png new file mode 100644 index 00000000..b979013a Binary files /dev/null and b/src/images/dj-platform.png differ diff --git a/src/images/ephys-npy-pipeline.svg b/src/images/ephys-npy-pipeline.svg new file mode 100644 index 00000000..8201be3f --- /dev/null +++ b/src/images/ephys-npy-pipeline.svg @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + Mouse + + + + + + Session + + + + + + Neuron + + + + + + ActivityStats + + + + + + Spikes + + + + + + SpikeParams + + diff --git a/src/images/ephys-pipeline.svg b/src/images/ephys-pipeline.svg new file mode 100644 index 00000000..970c8f9e --- /dev/null +++ b/src/images/ephys-pipeline.svg @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + Mouse + + + + + + Session + + + + + + Neuron + + + + + + ActivityStats + + + + + + Spikes + + + + + + SpikeParams + + + + + + Waveform + + diff --git a/src/images/er-many-to-many.svg b/src/images/er-many-to-many.svg new file mode 100644 index 00000000..f94267bc --- /dev/null +++ b/src/images/er-many-to-many.svg @@ -0,0 +1 @@ +

enrolls

has

Student

int

student_id

PK

string

name

Enrollment

int

student_id

PK

string

course_code

PK

string

grade

Course

string

course_code

PK

string

title

\ No newline at end of file diff --git a/src/images/er-one-to-many.svg b/src/images/er-one-to-many.svg new file mode 100644 index 00000000..f886047c --- /dev/null +++ b/src/images/er-one-to-many.svg @@ -0,0 +1 @@ +

has

Customer

int

customer_id

PK

string

name

Account

int

customer_id

PK

int

account_num

PK

decimal

balance

\ No newline at end of file diff --git a/src/images/er-one-to-one.svg b/src/images/er-one-to-one.svg new file mode 100644 index 00000000..9f50665e --- /dev/null +++ b/src/images/er-one-to-one.svg @@ -0,0 +1 @@ +

has

Customer

int

customer_id

PK

string

name

CustomerPreferences

int

customer_id

PK

string

theme

boolean

notifications

\ No newline at end of file diff --git a/src/images/er-reference.svg b/src/images/er-reference.svg new file mode 100644 index 00000000..9b152526 --- /dev/null +++ b/src/images/er-reference.svg @@ -0,0 +1 @@ +

employs

Department

int

dept_id

PK

string

dept_name

Employee

int

employee_id

PK

int

dept_id

FK

string

employee_name

\ No newline at end of file diff --git a/src/images/pipeline-illustration.png b/src/images/pipeline-illustration.png new file mode 100644 index 00000000..4a6b506a Binary files /dev/null and b/src/images/pipeline-illustration.png differ diff --git a/src/images/schema-illustration.png b/src/images/schema-illustration.png new file mode 100644 index 00000000..d9d1eabb Binary files /dev/null and b/src/images/schema-illustration.png differ diff --git a/src/index.md b/src/index.md index f1a924f5..83a3cd98 100644 --- a/src/index.md +++ b/src/index.md @@ -1,41 +1,111 @@ -# **Welcome to the DataJoint Documentation** +# DataJoint Documentation -![pipeline](https://raw.githubusercontent.com/datajoint/datajoint-python/master/images/pipeline.png){: style="height:300px;"} +> **DataJoint 2.0 is a major breaking release.** Existing pipelines require migration. +> See the [Migration Guide](how-to/migrate-from-0x.md) for upgrade instructions. + +**DataJoint** is a framework for scientific data pipelines built on the [Relational Workflow Model](explanation/relational-workflow-model.md)β€”a paradigm where your database schema is an executable specification of your workflow. + +Unlike traditional databases that merely store data, DataJoint pipelines **process** data: tables represent workflow steps, foreign keys encode computational dependencies, and the schema itself defines what computations exist and how they relate. Combined with [Object-Augmented Schemas](explanation/data-pipelines.md#object-augmented-schemas) for seamless large-data handling, DataJoint delivers reproducible, scalable scientific computing with full provenance tracking.
-- **DataJoint Python** +- :material-lightbulb-outline: **Concepts** + + --- - --- + Understand the Relational Workflow Model and DataJoint's core principles - Open-source framework for defining, operating, and querying data pipelines + [:octicons-arrow-right-24: Learn the concepts](explanation/index.md) - [:octicons-arrow-right-24: Learn more](./core/datajoint-python/) - -- **DataJoint Elements** +- :material-school-outline: **Tutorials** - --- + --- - Open-source implementation of data pipelines for neuroscience studies + Build your first pipeline with hands-on Jupyter notebooks - [:octicons-arrow-right-24: Learn more](./elements/) + [:octicons-arrow-right-24: Start learning](tutorials/index.md) -- **DataJoint Platform** +- :material-tools: **How-To Guides** - --- + --- - A cloud platform for automated analysis workflows. It relies on DataJoint - Python and DataJoint Elements. + Practical guides for common tasks and patterns - [:octicons-arrow-right-24: Learn - more](https://datajoint.com/){:target="_blank"} | [Sign-in](https://works.datajoint.com){:target="_blank"} + [:octicons-arrow-right-24: Find solutions](how-to/index.md) -- **Project Showcase** +- :material-book-open-variant: **Reference** - --- + --- - Projects and research teams supported by DataJoint software + Specifications, API documentation, and technical details - [:octicons-arrow-right-24: Learn more](projects/index.md) + [:octicons-arrow-right-24: Look it up](reference/index.md)
+ +--- + +## Quick Start + +```bash +pip install datajoint +``` + +Configure database credentials in your project (see [Configuration](reference/configuration.md)): + +```bash +# Create datajoint.json for non-sensitive settings +echo '{"database": {"host": "localhost", "port": 3306}}' > datajoint.json + +# Create secrets directory for credentials +mkdir -p .secrets +echo "root" > .secrets/database.user +echo "password" > .secrets/database.password +``` + +Define and populate a simple pipeline: + +```python +import datajoint as dj + +schema = dj.Schema('my_pipeline') + +@schema +class Subject(dj.Manual): + definition = """ + subject_id : uint16 + --- + name : varchar(100) + date_of_birth : date + """ + +@schema +class Session(dj.Manual): + definition = """ + -> Subject + session_idx : uint8 + --- + session_date : date + """ + +@schema +class SessionAnalysis(dj.Computed): + definition = """ + -> Session + --- + result : float64 + """ + + def make(self, key): + # Compute result for this session + self.insert1({**key, 'result': 42.0}) + +# Insert data +Subject.insert1({'subject_id': 1, 'name': 'M001', 'date_of_birth': '2026-01-15'}) +Session.insert1({'subject_id': 1, 'session_idx': 1, 'session_date': '2026-01-06'}) + +# Run computations +SessionAnalysis.populate() +``` + +[:octicons-arrow-right-24: Continue with the tutorials](tutorials/index.md) diff --git a/src/javascripts/mathjax.js b/src/javascripts/mathjax.js new file mode 100644 index 00000000..442df098 --- /dev/null +++ b/src/javascripts/mathjax.js @@ -0,0 +1,8 @@ +window.MathJax = { + tex: { + inlineMath: [["$", "$"], ["\\(", "\\)"]], + displayMath: [["$$", "$$"], ["\\[", "\\]"]], + processEscapes: true, + processEnvironments: true + } +}; diff --git a/src/llms-full.txt b/src/llms-full.txt new file mode 100644 index 00000000..6e75c685 --- /dev/null +++ b/src/llms-full.txt @@ -0,0 +1,19867 @@ +# DataJoint Documentation (Full) + +> DataJoint is a Python framework for building scientific data pipelines with automated computation, integrity constraints, and seamless integration of relational databases with object storage. This documentation covers DataJoint 2.0. + +> This file contains the complete documentation for LLM consumption. For an index with links, see /llms.txt + +--- + + +============================================================ +# Concepts +============================================================ + + +--- +## File: explanation/computation-model.md + +# Computation Model + +DataJoint's computation model enables automated, reproducible data processing +through the `populate()` mechanism and Jobs 2.0 system. + +## AutoPopulate: The Core Concept + +Tables that inherit from `dj.Imported` or `dj.Computed` can automatically +populate themselves based on upstream data. + +```python +@schema +class Segmentation(dj.Computed): + definition = """ + -> Scan + --- + num_cells : uint32 + cell_masks : + """ + + def make(self, key): + # key contains primary key of one Scan + scan_data = (Scan & key).fetch1('image_data') + + # Your computation + masks, num_cells = segment_cells(scan_data) + + # Insert result + self.insert1({ + **key, + 'num_cells': num_cells, + 'cell_masks': masks + }) +``` + +## The `make()` Contract + +The `make(self, key)` method: + +1. **Receives** the primary key of one upstream entity +2. **Computes** results for that entity +3. **Inserts** results into the table + +DataJoint guarantees: + +- `make()` is called once per upstream entity +- Failed computations can be retried +- Parallel execution is safe + +## Key Source + +The **key source** determines what needs to be computed: + +```python +# Default: all upstream keys not yet in this table +key_source = Scan - Segmentation + +# Custom key source +@property +def key_source(self): + return (Scan & 'quality > 0.8') - self +``` + +## Calling `populate()` + +```python +# Populate all missing entries +Segmentation.populate() + +# Populate specific subset +Segmentation.populate(restriction) + +# Limit number of jobs +Segmentation.populate(limit=100) + +# Show progress +Segmentation.populate(display_progress=True) + +# Suppress errors, continue processing +Segmentation.populate(suppress_errors=True) +``` + +## Jobs 2.0: Distributed Computing + +For parallel and distributed execution, Jobs 2.0 provides: + +### Job States + +```mermaid +stateDiagram-v2 + [*] --> pending : key_source - table + pending --> reserved : reserve() + reserved --> success : complete() + reserved --> error : error() + reserved --> pending : timeout + success --> [*] + error --> pending : ignore/clear +``` + +### Job Table + +Each auto-populated table has an associated jobs table: + +```python +# View job status +Segmentation.jobs() + +# View errors +Segmentation.jobs & 'status = "error"' + +# Clear errors to retry +(Segmentation.jobs & 'status = "error"').delete() +``` + +### Parallel Execution + +```python +# Multiple workers can run simultaneously +# Each reserves different keys + +# Worker 1 +Segmentation.populate(reserve_jobs=True) + +# Worker 2 (different process/machine) +Segmentation.populate(reserve_jobs=True) +``` + +Jobs are reserved atomicallyβ€”no two workers process the same key. + +### Error Handling + +```python +# Populate with error suppression +Segmentation.populate(suppress_errors=True) + +# Check what failed +errors = (Segmentation.jobs & 'status = "error"').to_dicts() + +# Clear specific error to retry +(Segmentation.jobs & error_key).delete() + +# Clear all errors +(Segmentation.jobs & 'status = "error"').delete() +``` + +## Imported vs. Computed + +| Aspect | `dj.Imported` | `dj.Computed` | +|--------|---------------|---------------| +| Data source | External (files, APIs) | Other tables | +| Typical use | Load raw data | Derive results | +| Diagram color | Blue | Red | + +Both use the same `make()` mechanism. + +## Workflow Integrity + +The computation model maintains **workflow integrity**: + +1. **Dependency order** β€” Upstream tables populate before downstream +2. **Cascade deletes** β€” Deleting upstream deletes downstream +3. **Recomputation** β€” Delete and re-populate to update results + +```python +# Correct an upstream error +(Scan & problem_key).delete() # Cascades to Segmentation + +# Reinsert corrected data +Scan.insert1(corrected_data) + +# Recompute +Segmentation.populate() +``` + +## Job Metadata (Optional) + +Track computation metadata with hidden columns: + +```python +dj.config['jobs.add_job_metadata'] = True +``` + +This adds to computed tables: + +- `_job_start_time` β€” When computation started +- `_job_duration` β€” How long it took +- `_job_version` β€” Code version (if configured) + +## The Three-Part Make Model + +For long-running computations (hours or days), holding a database transaction +open for the entire duration causes problems: + +- Database locks block other operations +- Transaction timeouts may occur +- Resources are held unnecessarily + +The **three-part make pattern** solves this by separating the computation from +the transaction: + +```python +@schema +class SignalAverage(dj.Computed): + definition = """ + -> RawSignal + --- + avg_signal : float64 + """ + + def make_fetch(self, key): + """Step 1: Fetch input data (outside transaction)""" + raw_signal = (RawSignal & key).fetch1("signal") + return (raw_signal,) + + def make_compute(self, key, fetched): + """Step 2: Perform computation (outside transaction)""" + (raw_signal,) = fetched + avg = raw_signal.mean() + return (avg,) + + def make_insert(self, key, fetched, computed): + """Step 3: Insert results (inside brief transaction)""" + (avg,) = computed + self.insert1({**key, "avg_signal": avg}) +``` + +### How It Works + +DataJoint executes the three parts with verification: + +``` +fetched = make_fetch(key) # Outside transaction +computed = make_compute(key, fetched) # Outside transaction + + +fetched_again = make_fetch(key) # Re-fetch to verify +if fetched != fetched_again: + # Inputs changedβ€”abort +else: + make_insert(key, fetched, computed) + +``` + +The key insight: **the computation runs outside any transaction**, but +referential integrity is preserved by re-fetching and verifying inputs before +insertion. If upstream data changed during computation, the job is cancelled +rather than inserting inconsistent results. + +### Benefits + +| Aspect | Standard `make()` | Three-Part Pattern | +|--------|-------------------|--------------------| +| Transaction duration | Entire computation | Only final insert | +| Database locks | Held throughout | Minimal | +| Suitable for | Short computations | Hours/days | +| Integrity guarantee | Transaction | Re-fetch verification | + +### When to Use Each Pattern + +| Computation Time | Pattern | Rationale | +|------------------|---------|-----------| +| Seconds to minutes | Standard `make()` | Simple, transaction overhead acceptable | +| Minutes to hours | Three-part | Avoid long transactions | +| Hours to days | Three-part | Essential for stability | + +The three-part pattern trades off fetching data twice for dramatically reduced +transaction duration. Use it when computation time significantly exceeds fetch +time. + +## Best Practices + +### 1. Keep `make()` Focused + +```python +def make(self, key): + # Good: One clear computation + data = (UpstreamTable & key).fetch1('data') + result = process(data) + self.insert1({**key, 'result': result}) +``` + +### 2. Handle Large Data Efficiently + +```python +def make(self, key): + # Stream large data instead of loading all at once + for row in (LargeTable & key): + process_chunk(row['data']) +``` + +### 3. Use Transactions for Multi-Row Inserts + +```python +def make(self, key): + results = compute_multiple_results(key) + + # All-or-nothing insertion + with dj.conn().transaction: + self.insert(results) +``` + +### 4. Test with Single Keys First + +```python +# Test make() on one key +key = (Scan - Segmentation).fetch1('KEY') +Segmentation().make(key) + +# Then populate all +Segmentation.populate() +``` + +## Summary + +1. **`make(key)`** β€” Computes one entity at a time +2. **`populate()`** β€” Executes `make()` for all missing entities +3. **Jobs 2.0** β€” Enables parallel, distributed execution +4. **Three-part make** β€” For long computations without long transactions +5. **Cascade deletes** β€” Maintain workflow integrity +6. **Error handling** β€” Robust retry mechanisms + + +--- +## File: explanation/custom-codecs.md + +# Extending DataJoint with Custom Codecs + +DataJoint's type system is extensible through **codecs**β€”plugins that define +how domain-specific Python objects are stored and retrieved. This enables +seamless integration of specialized data types without modifying DataJoint itself. + +## Why Codecs? + +Scientific computing involves diverse data types: + +- **Neuroscience**: Spike trains, neural networks, connectivity graphs +- **Imaging**: Medical images, microscopy stacks, point clouds +- **Genomics**: Sequence alignments, phylogenetic trees, variant calls +- **Physics**: Simulation meshes, particle systems, field data + +Rather than forcing everything into NumPy arrays or JSON, codecs let you work +with native data structures while DataJoint handles storage transparently. + +## The Codec Contract + +A codec defines two operations: + +```mermaid +graph LR + A[Python Object] -->|encode| B[Storable Form] + B -->|decode| A +``` + +| Method | Input | Output | When Called | +|--------|-------|--------|-------------| +| `encode()` | Python object | bytes, dict, or another codec's input | On `insert()` | +| `decode()` | Stored data | Python object | On `fetch()` | + +## Creating a Custom Codec + +### Basic Structure + +```python +import datajoint as dj + +class MyCodec(dj.Codec): + """Store custom objects.""" + name = "mytype" # Used as in definitions + + def get_dtype(self, is_external: bool) -> str: + """Return storage type.""" + return "" # Chain to blob serialization + + def encode(self, value, *, key=None, store_name=None): + """Convert Python object to storable form.""" + return serialize(value) + + def decode(self, stored, *, key=None): + """Convert stored form back to Python object.""" + return deserialize(stored) +``` + +### Auto-Registration + +Codecs register automatically when the class is definedβ€”no decorator needed: + +```python +class GraphCodec(dj.Codec): + name = "graph" # Immediately available as + ... + +# Check registration +assert "graph" in dj.list_codecs() +``` + +## Example: NetworkX Graphs + +```python +import networkx as nx +import datajoint as dj + +class GraphCodec(dj.Codec): + """Store NetworkX graphs as adjacency data.""" + name = "graph" + + def get_dtype(self, is_external: bool) -> str: + # Store as blob (internal) or hash-addressed (external) + return "" if is_external else "" + + def encode(self, graph, *, key=None, store_name=None): + """Serialize graph to dict.""" + return { + 'directed': graph.is_directed(), + 'nodes': list(graph.nodes(data=True)), + 'edges': list(graph.edges(data=True)), + } + + def decode(self, stored, *, key=None): + """Reconstruct graph from dict.""" + cls = nx.DiGraph if stored['directed'] else nx.Graph + G = cls() + G.add_nodes_from(stored['nodes']) + G.add_edges_from(stored['edges']) + return G +``` + +Usage: + +```python +@schema +class Connectivity(dj.Computed): + definition = """ + -> Neurons + --- + network : # Small graphs in database + full_network : # Large graphs in object storage + """ + + def make(self, key): + # Build connectivity graph + G = nx.DiGraph() + G.add_edges_from(compute_connections(key)) + + self.insert1({**key, 'network': G, 'full_network': G}) + +# Fetch returns NetworkX graph directly +graph = (Connectivity & key).fetch1('network') +print(f"Nodes: {graph.number_of_nodes()}") +``` + +## Example: Domain-Specific Formats + +### Genomics: Pysam Alignments + +```python +import pysam +import tempfile +from pathlib import Path + +class BamCodec(dj.Codec): + """Store BAM alignments.""" + name = "bam" + + def get_dtype(self, is_external: bool) -> str: + if not is_external: + raise dj.DataJointError(" requires external storage: use ") + return "" # Path-addressed storage for file structure + + def encode(self, alignments, *, key=None, store_name=None): + """Write alignments to BAM format.""" + # alignments is a pysam.AlignmentFile or list of reads + # Storage handled by codec + return alignments + + def decode(self, stored, *, key=None): + """Return ObjectRef for lazy BAM access.""" + return stored # ObjectRef with .open() method +``` + +### Medical Imaging: SimpleITK + +```python +import SimpleITK as sitk +import io + +class MedicalImageCodec(dj.Codec): + """Store medical images with metadata.""" + name = "medimg" + + def get_dtype(self, is_external: bool) -> str: + return "" if is_external else "" + + def encode(self, image, *, key=None, store_name=None): + """Serialize SimpleITK image.""" + # Preserve spacing, origin, direction + buffer = io.BytesIO() + sitk.WriteImage(image, buffer, imageIO='NrrdImageIO') + return { + 'data': buffer.getvalue(), + 'spacing': image.GetSpacing(), + 'origin': image.GetOrigin(), + } + + def decode(self, stored, *, key=None): + """Reconstruct SimpleITK image.""" + buffer = io.BytesIO(stored['data']) + return sitk.ReadImage(buffer) +``` + +## Codec Chaining + +Codecs can chain to other codecs via `get_dtype()`: + +```mermaid +graph LR + A["β€Ήgraphβ€Ί"] -->|get_dtype| B["β€Ήblobβ€Ί"] + B -->|get_dtype| C["bytes"] + C -->|MySQL| D["LONGBLOB"] +``` + +```python +class CompressedGraphCodec(dj.Codec): + name = "cgraph" + + def get_dtype(self, is_external: bool) -> str: + return "" # Chain to graph codec + + def encode(self, graph, *, key=None, store_name=None): + # Simplify before passing to graph codec + return nx.to_sparse6_bytes(graph) + + def decode(self, stored, *, key=None): + return nx.from_sparse6_bytes(stored) +``` + +## Storage Mode Support + +### Internal Only + +```python +class SmallDataCodec(dj.Codec): + name = "small" + + def get_dtype(self, is_external: bool) -> str: + if is_external: + raise dj.DataJointError(" is internal-only") + return "json" +``` + +### External Only + +```python +class LargeDataCodec(dj.Codec): + name = "large" + + def get_dtype(self, is_external: bool) -> str: + if not is_external: + raise dj.DataJointError(" requires @: use ") + return "" +``` + +### Both Modes + +```python +class FlexibleCodec(dj.Codec): + name = "flex" + + def get_dtype(self, is_external: bool) -> str: + return "" if is_external else "" +``` + +## Validation + +Add validation to catch errors early: + +```python +class StrictGraphCodec(dj.Codec): + name = "strictgraph" + + def validate(self, value): + """Called before encode().""" + if not isinstance(value, nx.Graph): + raise dj.DataJointError( + f"Expected NetworkX graph, got {type(value).__name__}" + ) + if value.number_of_nodes() == 0: + raise dj.DataJointError("Graph must have at least one node") + + def encode(self, graph, *, key=None, store_name=None): + self.validate(graph) + return {...} +``` + +## Best Practices + +### 1. Choose Appropriate Storage + +| Data Size | Recommendation | +|-----------|----------------| +| < 1 KB | `json` or `` | +| 1 KB - 10 MB | `` or `` | +| > 10 MB | `` or `` | +| File structures | `` | + +### 2. Preserve Metadata + +```python +def encode(self, obj, *, key=None, store_name=None): + return { + 'data': serialize(obj), + 'version': '1.0', # For future compatibility + 'dtype': str(obj.dtype), + 'shape': obj.shape, + } +``` + +### 3. Handle Versioning + +```python +def decode(self, stored, *, key=None): + version = stored.get('version', '0.9') + if version == '1.0': + return deserialize_v1(stored) + else: + return deserialize_legacy(stored) +``` + +### 4. Document Your Codec + +```python +class WellDocumentedCodec(dj.Codec): + """ + Store XYZ data structures. + + Supports both internal () and external () storage. + + Examples + -------- + >>> @schema + ... class Results(dj.Computed): + ... definition = ''' + ... -> Experiment + ... --- + ... output : + ... ''' + """ + name = "xyz" +``` + +## Summary + +Custom codecs enable: + +1. **Domain-specific types** β€” Work with native data structures +2. **Transparent storage** β€” DataJoint handles serialization +3. **Flexible backends** β€” Internal, external, or both +4. **Composability** β€” Chain codecs for complex transformations +5. **Validation** β€” Catch errors before storage + +The codec system makes DataJoint extensible to any scientific domain without +modifying the core framework. + + +--- +## File: explanation/entity-integrity.md + +# Entity Integrity + +**Entity integrity** ensures a one-to-one correspondence between real-world +entities and their database records. This is the foundation of reliable data +management. + +## The Core Guarantee + +- Each real-world entity β†’ exactly one database record +- Each database record β†’ exactly one real-world entity + +Without entity integrity, databases become unreliable: + +| Integrity Failure | Consequence | +|-------------------|-------------| +| Same entity, multiple records | Fragmented data, conflicting information | +| Multiple entities, same record | Mixed data, privacy violations | +| Cannot match entity to record | Lost data, broken workflows | + +## The Three Questions + +When designing a primary key, answer these three questions: + +### 1. How do I prevent duplicate records? + +Ensure the same entity cannot appear twice in the table. + +### 2. How do I prevent record sharing? + +Ensure different entities cannot share the same record. + +### 3. How do I match entities to records? + +When an entity arrives, how do I find its corresponding record? + +## Example: Laboratory Mouse Database + +Consider a neuroscience lab tracking mice: + +| Question | Answer | +|----------|--------| +| Prevent duplicates? | Each mouse gets a unique ear tag at arrival; database rejects duplicate tags | +| Prevent sharing? | Ear tags are never reused; retired tags are archived | +| Match entities? | Read the ear tag β†’ look up record by primary key | + +```python +@schema +class Mouse(dj.Manual): + definition = """ + ear_tag : char(6) # unique ear tag (e.g., 'M00142') + --- + date_of_birth : date + sex : enum('M', 'F', 'U') + strain : varchar(50) + """ +``` + +The database enforces the first two questions through the primary key constraint. +The third question requires a **physical identification system**β€”ear tags, +barcodes, or RFID chips that link physical entities to database records. + +## Primary Key Requirements + +In DataJoint, every table must have a primary key. Primary key attributes: + +- **Cannot be NULL** β€” Every entity must be identifiable +- **Must be unique** β€” No two entities share the same key +- **Cannot be changed** β€” Keys are immutable after insertion +- **Declared above the `---` line** β€” Syntactic convention + +## Natural Keys vs. Surrogate Keys + +### Natural Keys + +Use attributes that naturally identify entities in your domain: + +```python +@schema +class Gene(dj.Lookup): + definition = """ + gene_symbol : varchar(20) # Official gene symbol (e.g., 'BRCA1') + --- + full_name : varchar(200) + chromosome : varchar(5) + """ +``` + +**Advantages:** + +- Meaningful to humans +- Self-documenting +- No additional lookup needed + +### Surrogate Keys + +A **surrogate key** is an identifier used *primarily inside* the database, with minimal or no exposure to end users. Users typically don't search for entities by surrogate keys or use them in conversation. + +```python +@schema +class InternalRecord(dj.Manual): + definition = """ + record_id : uuid # internal identifier, not exposed to users + --- + created_timestamp : datetime(3) + data : + """ +``` + +**Key distinction from natural keys:** Surrogate keys don't require external identification systems because users don't need to match physical entities to records by these keys. + +**When surrogate keys are appropriate:** + +- Entities that exist only within the system (no physical counterpart) +- Privacy-sensitive contexts where natural identifiers shouldn't be stored +- Internal system records that users never reference directly + +**Generating surrogate keys:** DataJoint requires explicit key values rather than database-generated auto-increment. This is intentional: + +- Auto-increment encourages treating keys as "row numbers" rather than entity identifiers +- It's incompatible with composite keys, which DataJoint uses extensively +- It breaks reproducibility (different IDs when rebuilding pipelines) +- It prevents the client-server handshake needed for proper entity integrity + +Use client-side generation instead: + +- **UUIDs** β€” Generate with `uuid.uuid4()` before insertion +- **ULIDs** β€” Sortable unique IDs +- **Client-side counters** β€” Query max value and increment + +**DataJoint recommendation:** Prefer natural keys when they're stable and +meaningful. Use surrogates only when no natural identifier exists or for +privacy-sensitive contexts. + +## Composite Keys + +When no single attribute uniquely identifies an entity, combine multiple +attributes: + +```python +@schema +class Recording(dj.Manual): + definition = """ + -> Session + recording_idx : uint16 # Recording number within session + --- + duration : float32 # seconds + """ +``` + +Here, `(subject_id, session_idx, recording_idx)` together form the primary key. +Neither alone would be unique. + +## Foreign Keys and Dependencies + +Foreign keys in DataJoint serve dual purposes: + +1. **Referential integrity** β€” Ensures referenced entities exist +2. **Workflow dependency** β€” Declares that this entity depends on another + +```python +@schema +class Segmentation(dj.Computed): + definition = """ + -> Scan # Depends on Scan + --- + num_cells : uint32 + """ +``` + +The arrow `->` inherits the primary key from `Scan` and establishes both +referential integrity and workflow dependency. + +## Schema Dimensions + +Primary keys across tables define **schema dimensions**β€”the axes along which +your data varies. Common dimensions in neuroscience: + +- **Subject** β€” Who/what is being studied +- **Session** β€” When data was collected +- **Modality** β€” What type of data (ephys, imaging, behavior) + +Understanding dimensions helps design schemas that naturally express your +experimental structure. + +## Best Practices + +1. **Answer the three questions** before designing any table +2. **Choose stable identifiers** that won't need to change +3. **Keep keys minimal** β€” Include only what's necessary for uniqueness +4. **Document key semantics** β€” Explain what the key represents +5. **Consider downstream queries** β€” Keys affect join performance + +## Common Mistakes + +### Too few key attributes + +```python +# Wrong: experiment_id alone isn't unique +class Trial(dj.Manual): + definition = """ + experiment_id : uint32 + --- + trial_number : uint16 # Should be part of key! + result : float32 + """ +``` + +### Too many key attributes + +```python +# Wrong: timestamp makes every row unique, losing entity semantics +class Measurement(dj.Manual): + definition = """ + subject_id : uint32 + timestamp : datetime(6) # Microsecond precision + --- + value : float32 + """ +``` + +### Mutable natural keys + +```python +# Risky: names can change +class Patient(dj.Manual): + definition = """ + patient_name : varchar(100) # What if they change their name? + --- + date_of_birth : date + """ +``` + +## Summary + +Entity integrity is maintained by: + +1. **Primary keys** that uniquely identify each entity +2. **Foreign keys** that establish valid references +3. **Physical systems** that link real-world entities to records + +The three questions framework ensures your primary keys provide meaningful, +stable identification for your domain entities. + + +--- +## File: explanation/index.md + +# Concepts + +Understanding the principles behind DataJoint. + +DataJoint implements the **Relational Workflow Model**β€”a paradigm that extends +relational databases with native support for computational workflows. This section +explains the core concepts that make DataJoint pipelines reliable, reproducible, +and scalable. + +## Core Concepts + +
+ +- :material-sitemap: **[Relational Workflow Model](relational-workflow-model.md)** + + How DataJoint differs from traditional databases. The paradigm shift from + storage to workflow. + +- :material-key: **[Entity Integrity](entity-integrity.md)** + + Primary keys and the three questions. Ensuring one-to-one correspondence + between entities and records. + +- :material-table-split-cell: **[Normalization](normalization.md)** + + Schema design principles. Organizing tables around workflow steps to + minimize redundancy. + +- :material-set-split: **[Query Algebra](query-algebra.md)** + + The five operators: restriction, join, projection, aggregation, union. + Workflow-aware query semantics. + +- :material-code-tags: **[Type System](type-system.md)** + + Three-layer architecture: native, core, and codec types. Internal and + external storage modes. + +- :material-cog-play: **[Computation Model](computation-model.md)** + + AutoPopulate and Jobs 2.0. Automated, reproducible, distributed computation. + +- :material-puzzle: **[Custom Codecs](custom-codecs.md)** + + Extend DataJoint with domain-specific types. The codec extensibility system. + +
+ +## Why These Concepts Matter + +Traditional databases store data. DataJoint pipelines **process** data. Understanding +the Relational Workflow Model helps you: + +- Design schemas that naturally express your workflow +- Write queries that are both powerful and intuitive +- Build computations that scale from laptop to cluster +- Maintain data integrity throughout the pipeline lifecycle + + +--- +## File: explanation/normalization.md + +# Schema Normalization + +Schema normalization ensures data integrity by organizing tables to minimize +redundancy and prevent update anomalies. DataJoint's workflow-centric approach +makes normalization intuitive. + +## The Workflow Normalization Principle + +> **"Every table represents an entity type that is created at a specific step +> in a workflow, and all attributes describe that entity as it exists at that +> workflow step."** + +This principle naturally leads to well-normalized schemas. + +## Why Normalization Matters + +Without normalization, databases suffer from: + +- **Redundancy** β€” Same information stored multiple times +- **Update anomalies** β€” Changes require updating multiple rows +- **Insertion anomalies** β€” Can't add data without unrelated data +- **Deletion anomalies** β€” Deleting data loses unrelated information + +## DataJoint's Approach + +Traditional normalization analyzes **functional dependencies** to determine +table structure. DataJoint takes a different approach: design tables around +**workflow steps**. + +### Example: Mouse Housing + +**Denormalized (problematic):** + +```python +# Wrong: cage info repeated for every mouse +class Mouse(dj.Manual): + definition = """ + mouse_id : int32 + --- + cage_id : int32 + cage_location : varchar(50) # Redundant! + cage_temperature : float32 # Redundant! + weight : float32 + """ +``` + +**Normalized (correct):** + +```python +@schema +class Cage(dj.Manual): + definition = """ + cage_id : int32 + --- + location : varchar(50) + temperature : float32 + """ + +@schema +class Mouse(dj.Manual): + definition = """ + mouse_id : int32 + --- + -> Cage + """ + +@schema +class MouseWeight(dj.Manual): + definition = """ + -> Mouse + weigh_date : date + --- + weight : float32 + """ +``` + +This normalized design: + +- Stores cage info once (no redundancy) +- Tracks weight history (temporal dimension) +- Allows cage changes without data loss + +## The Workflow Test + +Ask: "At which workflow step is this attribute determined?" + +- If an attribute is determined at a **different step**, it belongs in a + **different table** +- If an attribute **changes over time**, it needs its own table with a + **temporal key** + +## Common Patterns + +### Lookup Tables + +Store reference data that doesn't change: + +```python +@schema +class Species(dj.Lookup): + definition = """ + species : varchar(50) + --- + common_name : varchar(100) + """ + contents = [ + ('Mus musculus', 'House mouse'), + ('Rattus norvegicus', 'Brown rat'), + ] +``` + +### Parameter Sets + +Store versioned configurations: + +```python +@schema +class AnalysisParams(dj.Lookup): + definition = """ + params_id : int32 + --- + threshold : float32 + window_size : int32 + """ +``` + +### Temporal Tracking + +Track attributes that change over time: + +```python +@schema +class SubjectWeight(dj.Manual): + definition = """ + -> Subject + weight_date : date + --- + weight : float32 # grams + """ +``` + +## Benefits in DataJoint + +1. **Natural from workflow thinking** β€” Designing around workflow steps + naturally produces normalized schemas + +2. **Cascade deletes** β€” Normalization + foreign keys enable safe cascade + deletes that maintain consistency + +3. **Join efficiency** β€” Normalized tables with proper keys enable efficient + joins through the workflow graph + +4. **Clear provenance** β€” Each table represents a distinct workflow step, + making data lineage clear + +## Summary + +- Normalize by designing around **workflow steps** +- Each table = one entity type at one workflow step +- Attributes belong with the step that **determines** them +- Temporal data needs **temporal keys** + + +--- +## File: explanation/query-algebra.md + +# Query Algebra + +DataJoint provides a powerful query algebra with just five operators. These +operators work on **entity sets** (query expressions) and always return entity +sets, enabling arbitrary composition. + +## The Five Operators + +```mermaid +graph LR + A[Entity Set] --> R[Restriction &] + A --> J[Join *] + A --> P[Projection .proj] + A --> G[Aggregation .aggr] + A --> U[Union +] + R --> B[Entity Set] + J --> B + P --> B + G --> B + U --> B +``` + +## Restriction (`&` and `-`) + +Filter entities based on conditions. + +### Include (`&`) + +```python +# Mice born after 2024 +Mouse & 'date_of_birth > "2024-01-01"' + +# Sessions for a specific mouse +Session & {'mouse_id': 42} + +# Sessions matching a query +Session & (Mouse & 'strain = "C57BL/6"') +``` + +### Exclude (`-`) + +```python +# Mice NOT in the study +Mouse - StudyMouse + +# Sessions without recordings +Session - Recording +``` + +### Top N (`dj.Top`) + +Select a limited number of entities with ordering: + +```python +# Most recent 10 sessions +Session & dj.Top(10, 'session_date DESC') + +# First session by primary key +Session & dj.Top() +``` + +The `order_by` parameter accepts attribute names with optional `DESC`/`ASC`. The special value `"KEY"` is an alias for all primary key attributes (e.g., `"KEY DESC"` for reverse primary key order). + +## Join (`*`) + +Combine entity sets along shared attributes. + +```python +# All session-recording pairs +Session * Recording + +# Chain through workflow +Mouse * Session * Scan * Segmentation +``` + +DataJoint joins are **natural joins** that: + +- Match on attributes with the same name **and** lineage +- Respect declared dependencies (no accidental matches) +- Produce the intersection of matching entities + +## Projection (`.proj()`) + +Select and transform attributes. + +### Select attributes + +```python +# Only mouse_id and strain +Mouse.proj('strain') + +# Rename attributes +Mouse.proj(animal_id='mouse_id') +``` + +### Compute new attributes + +```python +# Calculate age +Mouse.proj( + age='DATEDIFF(CURDATE(), date_of_birth)' +) + +# Combine attributes +Session.proj( + session_label='CONCAT(subject_id, "-", session_date)' +) +``` + +### Aggregate in projection + +```python +# Count recordings per session +Session.aggr(Recording, n_recordings='COUNT(*)') +``` + +## Aggregation (`.aggr()`) + +Summarize across groups. + +```python +# Average spike rate per neuron +Neuron.aggr( + SpikeTime, + avg_rate='AVG(spike_rate)', + total_spikes='COUNT(*)' +) + +# Statistics per session +Session.aggr( + Trial, + n_trials='COUNT(*)', + success_rate='AVG(success)' +) +``` + +## Union (`+`) + +Combine entity sets with the same attributes. + +```python +# All subjects from two studies +StudyA_Subjects + StudyB_Subjects + +# Combine results from different analyses +AnalysisV1 + AnalysisV2 +``` + +Requirements: + +- Same primary key structure +- Compatible attribute types + +## Operator Composition + +Operators compose freely: + +```python +# Complex query +result = ( + (Mouse & 'strain = "C57BL/6"') # Filter mice + * Session # Join sessions + * Scan # Join scans + .proj('scan_date', 'depth') # Select attributes + & 'depth > 200' # Filter by depth +) +``` + +## Workflow-Aware Joins + +Unlike SQL's natural joins that match on **any** shared column name, DataJoint +joins match on **semantic lineage**. Two attributes match only if they: + +1. Have the same name +2. Trace back to the same source definition + +This prevents accidental joins on coincidentally-named columns. + +## Fetching Results + +Query expressions are lazyβ€”they build SQL but don't execute until you fetch: + +```python +# Fetch as NumPy recarray +data = query.to_arrays() + +# Fetch as list of dicts +data = query.to_dicts() + +# Fetch as pandas DataFrame +df = query.to_pandas() + +# Fetch specific attributes +ids, dates = query.to_arrays('mouse_id', 'session_date') + +# Fetch single row +row = (query & key).fetch1() +``` + +## Summary + +| Operator | Symbol | Purpose | +|----------|--------|---------| +| Restriction | `&`, `-` | Filter entities | +| Join | `*` | Combine entity sets | +| Projection | `.proj()` | Select/transform attributes | +| Aggregation | `.aggr()` | Summarize groups | +| Union | `+` | Combine parallel sets | + +These five operators, combined with workflow-aware join semantics, provide +complete query capability for scientific data pipelines. + + +--- +## File: explanation/relational-workflow-model.md + +# The Relational Workflow Model + +DataJoint implements the **Relational Workflow Model**β€”a paradigm that extends +relational databases with native support for computational workflows. This model +defines a new class of databases called **Computational Databases**, where +computational transformations are first-class citizens of the data model. + +## The Problem with Traditional Approaches + +Traditional relational databases excel at storing and querying data but struggle +with computational workflows. They can store inputs and outputs, but: + +- The database doesn't understand that outputs were *computed from* inputs +- It doesn't automatically recompute when inputs change +- It doesn't track provenance + +**DataJoint solves these problems by treating your database schema as an +executable workflow specification.** + +## Three Paradigms Compared + +The relational data model has been interpreted through different conceptual +frameworks, each with distinct strengths and limitations: + +| Aspect | Mathematical (Codd) | Entity-Relationship (Chen) | **Relational Workflow (DataJoint)** | +|--------|---------------------|----------------------------|-------------------------------------| +| **Core Question** | "What functional dependencies exist?" | "What entity types exist?" | **"When/how are entities created?"** | +| **Time Dimension** | Not addressed | Not central | **Fundamental** | +| **Implementation Gap** | High (abstract to SQL) | High (ERM to SQL) | **None (unified approach)** | +| **Workflow Support** | None | None | **Native workflow modeling** | + +### Codd's Mathematical Foundation + +Edgar F. Codd's original relational model is rooted in predicate calculus and +set theory. Tables represent logical predicates; rows assert true propositions. +While mathematically rigorous, this approach requires abstract reasoning that +doesn't map to intuitive domain thinking. + +### Chen's Entity-Relationship Model + +Peter Chen's Entity-Relationship Model (ERM) shifted focus to concrete domain +modelingβ€”entities and relationships visualized in diagrams. However, ERM: + +- Creates a gap between conceptual design and SQL implementation +- Lacks temporal dimension ("when" entities are created) +- Treats relationships as static connections, not dynamic processes + +## The Relational Workflow Model + +The Relational Workflow Model introduces four fundamental concepts: + +### 1. Workflow Entities + +Unlike traditional entities that exist independently, **workflow entities** are +artifacts of workflow executionβ€”they represent the products of specific +operations. This temporal dimension allows us to understand not just *what* +exists, but *when* and *how* it came to exist. + +### 2. Workflow Dependencies + +**Workflow dependencies** extend foreign keys with operational semantics. They +don't just ensure referential integrityβ€”they prescribe the order of operations. +Parent entities must be created before child entities. + +```mermaid +graph LR + A[Session] --> B[Scan] + B --> C[Segmentation] + C --> D[Analysis] +``` + +### 3. Workflow Steps (Table Tiers) + +Each table represents a distinct **workflow step** with a specific role: + +```mermaid +graph TD + subgraph "Lookup (Gray)" + L[Parameters] + end + subgraph "Manual (Green)" + M[Subject] + S[Session] + end + subgraph "Imported (Blue)" + I[Recording] + end + subgraph "Computed (Red)" + C[Analysis] + end + + L --> C + M --> S + S --> I + I --> C +``` + +| Tier | Role | Examples | +|------|------|----------| +| **Lookup** | Reference data, parameters | Species, analysis methods | +| **Manual** | Human-entered observations | Subjects, sessions | +| **Imported** | Automated data acquisition | Recordings, images | +| **Computed** | Derived results | Analyses, statistics | + +### 4. Directed Acyclic Graph (DAG) + +The schema forms a **DAG** that: + +- Prohibits circular dependencies +- Ensures valid execution sequences +- Enables efficient parallel execution +- Supports resumable computation + +## The Workflow Normalization Principle + +> **"Every table represents an entity type that is created at a specific step +> in a workflow, and all attributes describe that entity as it exists at that +> workflow step."** + +This principle extends entity normalization with temporal and operational +dimensions. + +## Why This Matters + +### Unified Design and Implementation + +Unlike the ERM-SQL gap, DataJoint provides unified: + +- **Diagramming** β€” Schema diagrams reflect actual structure +- **Definition** β€” Table definitions are executable code +- **Querying** β€” Operators understand workflow semantics + +No translation needed between conceptual design and implementation. + +### Temporal and Operational Awareness + +The model captures the dynamic nature of workflows: + +- Data processing sequences +- Computational dependencies +- Operation ordering + +### Immutability and Provenance + +Workflow artifacts are immutable once created: + +- Preserves execution history +- Maintains data provenance +- Enables reproducible science + +When you delete upstream data, dependent results cascade-delete automatically. +To correct errors, you delete, reinsert, and recomputeβ€”ensuring every result +represents a consistent computation from valid inputs. + +### Workflow Integrity + +The DAG structure guarantees: + +- No circular dependencies +- Valid operation sequences +- Enforced temporal order +- Computational validity + +## Query Algebra with Workflow Semantics + +DataJoint's five operators provide a complete query algebra: + +| Operator | Symbol | Purpose | +|----------|--------|---------| +| **Restriction** | `&` | Filter entities | +| **Join** | `*` | Combine from converging paths | +| **Projection** | `.proj()` | Select/compute attributes | +| **Aggregation** | `.aggr()` | Summarize groups | +| **Union** | `+` | Combine parallel branches | + +These operators: + +- Take entity sets as input, produce entity sets as output +- Preserve entity integrity +- Respect declared dependencies (no ambiguous joins) + +## From Transactions to Transformations + +The Relational Workflow Model represents a conceptual shift: + +| Traditional View | Workflow View | +|------------------|---------------| +| Tables store data | Entity sets are workflow steps | +| Rows are records | Entities are execution instances | +| Foreign keys enforce consistency | Dependencies specify information flow | +| Updates modify state | Computations create new states | +| Schemas organize storage | Schemas specify pipelines | +| Queries retrieve data | Queries trace provenance | + +This makes DataJoint feel less like a traditional database and more like a +**workflow engine with persistent state**β€”one that maintains computational +validity while supporting scientific flexibility. + +## Summary + +The Relational Workflow Model: + +1. **Extends** relational theory (doesn't replace it) +2. **Adds** temporal and operational semantics +3. **Eliminates** the design-implementation gap +4. **Enables** reproducible computational workflows +5. **Maintains** mathematical rigor + +It's not a departure from relational databasesβ€”it's their evolution for +computational workflows. + + +--- +## File: explanation/type-system.md + +# Type System + +DataJoint's type system provides a three-layer architecture that balances +database efficiency with Python convenience. + +## Three-Layer Architecture + +```mermaid +graph TB + subgraph "Layer 3: Codecs" + blob["β€Ήblobβ€Ί"] + attach["β€Ήattachβ€Ί"] + object["β€Ήobject@β€Ί"] + hash["β€Ήhash@β€Ί"] + custom["β€Ήcustomβ€Ί"] + end + subgraph "Layer 2: Core Types" + int32 + float64 + varchar + json + bytes + end + subgraph "Layer 1: Native" + INT["INT"] + DOUBLE["DOUBLE"] + VARCHAR["VARCHAR"] + JSON_N["JSON"] + BLOB["LONGBLOB"] + end + + blob --> bytes + attach --> bytes + object --> json + hash --> json + bytes --> BLOB + json --> JSON_N + int32 --> INT + float64 --> DOUBLE + varchar --> VARCHAR +``` + +## Layer 1: Native Database Types + +Backend-specific types (MySQL, PostgreSQL). **Discouraged for direct use.** + +```python +# Native types (avoid) +column : TINYINT UNSIGNED +column : MEDIUMBLOB +``` + +## Layer 2: Core DataJoint Types + +Standardized, scientist-friendly types that work identically across backends. + +### Numeric Types + +| Type | Description | Range | +|------|-------------|-------| +| `int8` | 8-bit signed | -128 to 127 | +| `int16` | 16-bit signed | -32,768 to 32,767 | +| `int32` | 32-bit signed | Β±2 billion | +| `int64` | 64-bit signed | Β±9 quintillion | +| `uint8` | 8-bit unsigned | 0 to 255 | +| `uint16` | 16-bit unsigned | 0 to 65,535 | +| `uint32` | 32-bit unsigned | 0 to 4 billion | +| `uint64` | 64-bit unsigned | 0 to 18 quintillion | +| `float32` | 32-bit float | ~7 significant digits | +| `float64` | 64-bit float | ~15 significant digits | +| `decimal(n,f)` | Fixed-point | Exact decimal | + +### String Types + +| Type | Description | +|------|-------------| +| `char(n)` | Fixed-length string | +| `varchar(n)` | Variable-length string | + +### Other Types + +| Type | Description | +|------|-------------| +| `bool` | True/False | +| `date` | Date only | +| `datetime` | Date and time (UTC) | +| `json` | JSON document | +| `uuid` | Universally unique identifier | +| `enum(...)` | Enumeration | +| `bytes` | Raw binary | + +## Layer 3: Codec Types + +Codecs provide `encode()`/`decode()` semantics for complex Python objects. + +### Syntax + +- **Angle brackets**: ``, ``, `` +- **`@` indicates external storage**: `` stores externally +- **Store name**: `` uses named store "cold" + +### Built-in Codecs + +| Codec | Internal | External | Returns | +|-------|----------|----------|---------| +| `` | βœ… | βœ… `` | Python object | +| `` | βœ… | βœ… `` | Local file path | +| `` | ❌ | βœ… | ObjectRef | +| `` | ❌ | βœ… | bytes | +| `` | ❌ | βœ… | ObjectRef | + +### `` β€” Serialized Python Objects + +Stores NumPy arrays, dicts, lists, and other Python objects. + +```python +class Results(dj.Computed): + definition = """ + -> Analysis + --- + spike_times : # In database + waveforms : # External, default store + raw_data : # External, 'archive' store + """ +``` + +### `` β€” File Attachments + +Stores files with filename preserved. + +```python +class Config(dj.Manual): + definition = """ + config_id : int + --- + settings : # Small config file + data_file : # Large file, external + """ +``` + +### `` β€” Path-Addressed Storage + +For large/complex file structures (Zarr, HDF5). Path derived from primary key. + +```python +class ProcessedData(dj.Computed): + definition = """ + -> Recording + --- + zarr_data : # Stored at {schema}/{table}/{pk}/ + """ +``` + +### `` β€” Portable References + +References to externally-managed files with portable paths. + +```python +class RawData(dj.Manual): + definition = """ + session_id : int + --- + recording : # Relative to 'raw' store + """ +``` + +## Storage Modes + +| Mode | Database Storage | External Storage | Use Case | +|------|------------------|------------------|----------| +| Internal | Yes | No | Small data | +| External | Metadata only | Yes | Large data | +| Hash-addressed | Metadata only | Deduplicated | Repeated data | +| Path-addressed | Metadata only | PK-based path | Complex files | + +## Custom Codecs + +Extend the type system for domain-specific data: + +```python +class GraphCodec(dj.Codec): + """Store NetworkX graphs.""" + name = "graph" + + def get_dtype(self, is_external): + return "" + + def encode(self, graph, *, key=None, store_name=None): + return { + 'nodes': list(graph.nodes()), + 'edges': list(graph.edges()) + } + + def decode(self, stored, *, key=None): + import networkx as nx + G = nx.Graph() + G.add_nodes_from(stored['nodes']) + G.add_edges_from(stored['edges']) + return G +``` + +Usage: + +```python +class Network(dj.Computed): + definition = """ + -> Analysis + --- + connectivity : + """ +``` + +## Choosing Types + +| Data | Recommended Type | +|------|------------------| +| Small scalars | Core types (`int32`, `float64`) | +| Short strings | `varchar(n)` | +| NumPy arrays (small) | `` | +| NumPy arrays (large) | `` | +| Files to attach | `` or `` | +| Zarr/HDF5 | `` | +| External file refs | `` | +| Custom objects | Custom codec | + +## Summary + +1. **Core types** for simple data β€” `int32`, `varchar`, `datetime` +2. **``** for Python objects β€” NumPy arrays, dicts +3. **`@` suffix** for external storage β€” ``, `` +4. **Custom codecs** for domain-specific types + + +--- +## File: explanation/whats-new-2.md + +# What's New in DataJoint 2.0 + +DataJoint 2.0 is a major release that establishes DataJoint as a mature framework for scientific data pipelines. The version jump from 0.14 to 2.0 reflects the significance of these changes. + +## Object-Augmented Schema (OAS) + +DataJoint 2.0 unifies relational tables with object storage into a single coherent system. The relational database stores metadata and references while large objects (arrays, files, Zarr datasets) are stored in object storageβ€”with full referential integrity maintained across both layers. + +β†’ [Type System Specification](../reference/specs/type-system.md) + +**Three storage sections:** + +| Section | Addressing | Use Case | +|---------|------------|----------| +| **Internal** | Row-based (in database) | Small objects (< 1 MB) | +| **Hash-addressed** | Content hash | Arrays, files (deduplication) | +| **Path-addressed** | Primary key path | Zarr, HDF5, streaming access | + +**New syntax:** + +```python +definition = """ +recording_id : uuid +--- +metadata : # Internal storage +raw_data : # Hash-addressed object storage +zarr_array : # Path-addressed for Zarr/HDF5 +""" +``` + +## Extensible Type System + +A three-layer architecture separates Python types, DataJoint core types, and storage. + +β†’ [Type System Specification](../reference/specs/type-system.md) Β· [Codec API Specification](../reference/specs/codec-api.md) + +- **Core types**: Portable types like `int32`, `float64`, `uuid`, `json` +- **Codecs**: Transform Python objects for storage (``, ``, ``) +- **Custom codecs**: Implement domain-specific types for your data + +```python +class GraphCodec(dj.Codec): + name = "graph" + + def encode(self, value, **kwargs): + return list(value.edges) + + def decode(self, stored, **kwargs): + import networkx as nx + return nx.Graph(stored) +``` + +## Jobs 2.0 + +A redesigned job coordination system for distributed computing. + +β†’ [AutoPopulate Specification](../reference/specs/autopopulate.md) Β· [Job Metadata Specification](../reference/specs/job-metadata.md) + +- **Per-table jobs**: Each computed table has its own jobs table (`Table.jobs`) +- **Automatic refresh**: Job queue synchronized with pending work +- **Distributed coordination**: Multiple workers coordinate via database +- **Error tracking**: Built-in error table with stack traces + +```python +# Distributed mode with coordination +Analysis.populate(reserve_jobs=True, processes=4) + +# Monitor progress +Analysis.jobs.progress() # {'pending': 10, 'reserved': 2, 'error': 0} + +# Handle errors +Analysis.jobs.errors.to_dicts() +``` + +## Semantic Matching + +Query operations now use **lineage-based matching**β€”attributes are matched not just by name but by their origin through foreign key chains. This prevents accidental matches between attributes that happen to share a name but represent different concepts. + +β†’ [Semantic Matching Specification](../reference/specs/semantic-matching.md) + +```python +# Attributes matched by lineage, not just name +result = TableA * TableB # Semantic join (default) +``` + +## Configuration System + +A cleaner configuration approach with separation of concerns. + +β†’ [Configuration Reference](../reference/configuration.md) + +- **`datajoint.json`**: Non-sensitive settings (commit to version control) +- **`.secrets/`**: Credentials (never commit) +- **Environment variables**: For CI/CD and production + +```bash +export DJ_HOST=db.example.com +export DJ_USER=myuser +export DJ_PASS=mypassword +``` + +## ObjectRef API + +Path-addressed storage returns `ObjectRef` handles that support streaming access: + +```python +ref = (Dataset & key).fetch1('zarr_array') + +# Direct fsspec access for Zarr/xarray +z = zarr.open(ref.fsmap, mode='r') + +# Or download locally +local_path = ref.download('/tmp/data') +``` + +## License Change + +DataJoint 2.0 is licensed under the **Apache License 2.0** (previously LGPL). This provides more flexibility for commercial and academic use. + +## Migration Path + +Upgrading from DataJoint 0.x requires: + +1. Update configuration files +2. Update blob syntax (`longblob` β†’ ``) +3. Update jobs code (schema-level β†’ per-table) +4. Test semantic matching behavior + +See [Migrate from 0.x](../how-to/migrate-from-0x.md) for detailed upgrade steps. + +## See Also + +- [Installation](../how-to/installation.md) β€” Get started with DataJoint 2.0 +- [Tutorials](../tutorials/index.md) β€” Learn DataJoint step by step +- [Type System](type-system.md) β€” Core types and codecs +- [Computation Model](computation-model.md) β€” Jobs 2.0 details + + +============================================================ +# Tutorials +============================================================ + + +--- +## File: tutorials/01-getting-started.ipynb + +# Getting Started + +This tutorial introduces DataJoint through a real image analysis pipeline that detects bright blobs in astronomical and biological images. By the end, you'll understand: + +- **Schemas** β€” Namespaces that group related tables +- **Table types** β€” Manual, Lookup, and Computed tables +- **Dependencies** β€” How tables relate through foreign keys +- **Computation** β€” Automatic population of derived data +- **Master-Part** β€” Atomic insertion of hierarchical results + +## The Problem + +We have images and want to detect bright spots (blobs) in them. Different detection parameters work better for different images, so we need to: + +1. Store our images +2. Define parameter sets to try +3. Run detection for each image Γ— parameter combination +4. Store and visualize results +5. Select the best parameters for each image + +This is a **computational workflow** β€” a series of steps where each step depends on previous results. DataJoint makes these workflows reproducible and manageable. + +## Setup + +First, let's import our tools and create a schema (database namespace) for this project. + + +```python +import datajoint as dj +import matplotlib.pyplot as plt +from skimage import data +from skimage.feature import blob_doh +from skimage.color import rgb2gray + +# Create a schema - this is our database namespace +schema = dj.Schema('tutorial_blobs') +``` + + +## Manual Tables: Storing Raw Data + +A **Manual table** stores data that users enter directly β€” it's the starting point of your pipeline. Here we define an `Image` table to store our sample images. + +The `definition` string specifies: +- **Primary key** (above `---`): attributes that uniquely identify each row +- **Secondary attributes** (below `---`): additional data for each row + + +```python +@schema +class Image(dj.Manual): + definition = """ + # Images for blob detection + image_id : uint8 + --- + image_name : varchar(100) + image : # serialized numpy array + """ +``` + + +Now let's insert two sample images from scikit-image: + + +```python +# Insert sample images +Image.insert([ + {'image_id': 1, 'image_name': 'Hubble Deep Field', + 'image': rgb2gray(data.hubble_deep_field())}, + {'image_id': 2, 'image_name': 'Human Mitosis', + 'image': data.human_mitosis() / 255.0}, +], skip_duplicates=True) + +Image() +``` + + + +```python +# Visualize the images +fig, axes = plt.subplots(1, 2, figsize=(10, 5)) +for ax, row in zip(axes, Image()): + ax.imshow(row['image'], cmap='gray_r') + ax.set_title(row['image_name']) + ax.axis('off') +plt.tight_layout() +``` + + +## Lookup Tables: Parameter Sets + +A **Lookup table** stores reference data that doesn't change often β€” things like experimental protocols, parameter configurations, or categorical options. + +For blob detection, we'll try different parameter combinations to find what works best for each image type. + + +```python +@schema +class DetectionParams(dj.Lookup): + definition = """ + # Blob detection parameter sets + params_id : uint8 + --- + min_sigma : float32 # minimum blob size + max_sigma : float32 # maximum blob size + threshold : float32 # detection sensitivity + """ + + # Pre-populate with parameter sets to try + contents = [ + {'params_id': 1, 'min_sigma': 2.0, 'max_sigma': 6.0, 'threshold': 0.001}, + {'params_id': 2, 'min_sigma': 3.0, 'max_sigma': 8.0, 'threshold': 0.002}, + {'params_id': 3, 'min_sigma': 4.0, 'max_sigma': 20.0, 'threshold': 0.01}, + ] + +DetectionParams() +``` + + +## Computed Tables: Automatic Processing + +A **Computed table** automatically derives data from other tables. You define: + +1. **Dependencies** (using `->`) β€” which tables provide input +2. **`make()` method** β€” how to compute results for one input combination + +DataJoint then handles: +- Determining what needs to be computed +- Running computations (optionally in parallel) +- Tracking what's done vs. pending + +### Master-Part Structure + +Our detection produces multiple blobs per image. We use a **master-part** structure: +- **Master** (`Detection`): One row per job, stores summary (blob count) +- **Part** (`Detection.Blob`): One row per blob, stores details (x, y, radius) + +Both are inserted atomically β€” if anything fails, the whole transaction rolls back. + + +```python +@schema +class Detection(dj.Computed): + definition = """ + # Blob detection results + -> Image # depends on Image + -> DetectionParams # depends on DetectionParams + --- + num_blobs : uint16 # number of blobs detected + """ + + class Blob(dj.Part): + definition = """ + # Individual detected blobs + -> master + blob_idx : uint16 + --- + x : float32 # x coordinate + y : float32 # y coordinate + radius : float32 # blob radius + """ + + def make(self, key): + # Fetch the image and parameters + img = (Image & key).fetch1('image') + params = (DetectionParams & key).fetch1() + + # Run blob detection + blobs = blob_doh( + img, + min_sigma=params['min_sigma'], + max_sigma=params['max_sigma'], + threshold=params['threshold'] + ) + + # Insert master row + self.insert1({**key, 'num_blobs': len(blobs)}) + + # Insert part rows (all blobs for this detection) + self.Blob.insert([ + {**key, 'blob_idx': i, 'x': x, 'y': y, 'radius': r} + for i, (x, y, r) in enumerate(blobs) + ]) +``` + + +## Viewing the Schema + +DataJoint can visualize the relationships between tables: + + +```python +dj.Diagram(schema) +``` + + +The diagram shows: +- **Green** = Manual tables (user-entered data) +- **Gray** = Lookup tables (reference data) +- **Red** = Computed tables (derived data) +- **Edges** = Dependencies (foreign keys), always flow top-to-bottom + +## Running the Pipeline + +Call `populate()` to run all pending computations. DataJoint automatically determines what needs to be computed: every combination of `Image` Γ— `DetectionParams` that doesn't already have a `Detection` result. + + +```python +# Run all pending computations +Detection.populate(display_progress=True) +``` + + + +```python +# View results summary +Detection() +``` + + +We computed 6 results: 2 images Γ— 3 parameter sets. Each shows how many blobs were detected. + +## Visualizing Results + +Let's see how different parameters affect detection: + + +```python +fig, axes = plt.subplots(2, 3, figsize=(12, 8)) + +for ax, key in zip(axes.ravel(), Detection.keys(order_by='image_id, params_id')): + # Get image and detection info in one fetch + name, img, num_blobs = (Detection * Image & key).fetch1('image_name', 'image', 'num_blobs') + + ax.imshow(img, cmap='gray_r') + + # Get all blob coordinates in one query + x, y, r = (Detection.Blob & key).to_arrays('x', 'y', 'radius') + for xi, yi, ri in zip(x, y, r): + circle = plt.Circle((yi, xi), ri * 1.2, color='red', fill=False, alpha=0.6) + ax.add_patch(circle) + + ax.set_title(f"{name}\nParams {key['params_id']}: {num_blobs} blobs", fontsize=10) + ax.axis('off') + +plt.tight_layout() +``` + + +## Querying Results + +DataJoint's query language makes it easy to explore results: + + +```python +# Find detections with fewer than 300 blobs +Detection & 'num_blobs < 300' +``` + + + +```python +# Join to see image names with blob counts +(Image * Detection).proj('image_name', 'num_blobs') +``` + + +## Storing Selections + +After reviewing the results, we can record which parameter set works best for each image. This is another Manual table that references our computed results: + + +```python +@schema +class SelectedDetection(dj.Manual): + definition = """ + # Best detection for each image + -> Image + --- + -> Detection + """ + +# Select params 3 for Hubble (fewer, larger blobs) +# Select params 1 for Mitosis (many small spots) +SelectedDetection.insert([ + {'image_id': 1, 'params_id': 3}, + {'image_id': 2, 'params_id': 1}, +], skip_duplicates=True) + +SelectedDetection() +``` + + + +```python +# View the final schema with selections +dj.Diagram(schema) +``` + + +## Key Concepts Recap + +| Concept | What It Does | Example | +|---------|--------------|--------| +| **Schema** | Groups related tables | `schema = dj.Schema('tutorial_blobs')` | +| **Manual Table** | Stores user-entered data | `Image`, `SelectedDetection` | +| **Lookup Table** | Stores reference/config data | `DetectionParams` | +| **Computed Table** | Derives data automatically | `Detection` | +| **Part Table** | Stores detailed results with master | `Detection.Blob` | +| **Foreign Key** (`->`) | Creates dependency | `-> Image` | +| **`populate()`** | Runs pending computations | `Detection.populate()` | +| **Restriction** (`&`) | Filters rows | `Detection & 'num_blobs < 300'` | +| **Join** (`*`) | Combines tables | `Image * Detection` | + +## Next Steps + +- [Schema Design](02-schema-design.ipynb) β€” Learn table types and relationships in depth +- [Queries](04-queries.ipynb) β€” Master DataJoint's query operators +- [Computation](05-computation.ipynb) β€” Build complex computational workflows + + +```python +# Cleanup: drop the schema for re-running the tutorial +schema.drop(prompt=False) +``` + + +--- +## File: tutorials/02-schema-design.ipynb + +# Schema Design + +This tutorial covers how to design DataJoint schemas effectively. You'll learn: + +- **Table tiers** β€” Manual, Lookup, Imported, and Computed tables +- **Primary keys** β€” Uniquely identifying entities +- **Foreign keys** β€” Creating dependencies between tables +- **Relationship patterns** β€” One-to-many, one-to-one, and many-to-many + +We'll build a schema for a neuroscience experiment tracking subjects, sessions, and trials. + + +```python +import datajoint as dj + +schema = dj.Schema('tutorial_design') +``` + + +## Table Tiers + +DataJoint has four table tiers, each serving a different purpose: + +| Tier | Class | Purpose | Data Entry | +|------|-------|---------|------------| +| **Manual** | `dj.Manual` | Core experimental data | Inserted by operators or instruments | +| **Lookup** | `dj.Lookup` | Reference/configuration data | Pre-populated, rarely changes | +| **Imported** | `dj.Imported` | Data from external files | Auto-populated via `make()` | +| **Computed** | `dj.Computed` | Derived/processed data | Auto-populated via `make()` | + +**Manual** tables are not necessarily populated by handβ€”they contain data entered into the pipeline by operators, instruments, or ingestion scripts using `insert` commands. In contrast, **Imported** and **Computed** tables are auto-populated by calling the `.populate()` method, which invokes the `make()` callback for each missing entry. + +### Manual Tables + +Manual tables store data that is inserted directlyβ€”the starting point of your pipeline. + + +```python +@schema +class Lab(dj.Manual): + definition = """ + # Research laboratory + lab_id : varchar(16) # short identifier (e.g., 'tolias') + --- + lab_name : varchar(100) + institution : varchar(100) + created_at = CURRENT_TIMESTAMP : datetime # when record was created + """ + +@schema +class Subject(dj.Manual): + definition = """ + # Experimental subject + subject_id : varchar(16) + --- + -> Lab + species : varchar(50) + date_of_birth : date + sex : enum('M', 'F', 'U') + """ +``` + + +### Lookup Tables + +Lookup tables store reference data that rarely changes. Use the `contents` attribute to pre-populate them. + + +```python +@schema +class TaskType(dj.Lookup): + definition = """ + # Types of behavioral tasks + task_type : varchar(32) + --- + description : varchar(255) + """ + contents = [ + {'task_type': 'go_nogo', 'description': 'Go/No-Go discrimination task'}, + {'task_type': '2afc', 'description': 'Two-alternative forced choice'}, + {'task_type': 'foraging', 'description': 'Foraging/exploration task'}, + ] + +@schema +class SessionStatus(dj.Lookup): + definition = """ + # Session status codes + status : varchar(16) + """ + contents = [ + {'status': 'scheduled'}, + {'status': 'in_progress'}, + {'status': 'completed'}, + {'status': 'aborted'}, + ] +``` + + + +```python +# Lookup tables are automatically populated +TaskType() +``` + + +## Primary Keys + +The **primary key** uniquely identifies each row. Attributes above the `---` line form the primary key. + +### Design Principles + +1. **Entity integrity** β€” Each row represents exactly one real-world entity +2. **No duplicates** β€” The primary key prevents inserting the same entity twice +3. **Minimal** β€” Include only attributes necessary for uniqueness + +### Natural vs Surrogate Keys + +- **Natural key**: An identifier used *outside* the database to refer to entities in the real world. Requires a real-world mechanism to establish and maintain the association (e.g., ear tags, cage labels, barcodes). Example: `subject_id = 'M001'` where M001 is printed on the animal's cage. + +- **Surrogate key**: An identifier used *only inside* the database, with minimal or no exposure to end users. Users don't search by surrogate keys or use them in conversation. Example: internal record IDs, auto-generated UUIDs for system tracking. + +DataJoint works well with both. Natural keys make data more interpretable and enable identification of physical entities. Surrogate keys are appropriate when entities exist only within the system or when natural identifiers shouldn't be stored (e.g., privacy). + + +```python +@schema +class Session(dj.Manual): + definition = """ + # Experimental session + -> Subject + session_idx : uint16 # session number for this subject + --- + -> TaskType + -> SessionStatus + session_date : date + session_notes = '' : varchar(1000) + task_params = NULL : json # task-specific parameters (nullable) + """ + + class Trial(dj.Part): + definition = """ + # Individual trial within a session + -> master + trial_idx : uint16 + --- + stimulus : varchar(50) + response : varchar(50) + correct : bool + reaction_time : float32 # seconds + """ +``` + + +The primary key of `Session` is `(subject_id, session_idx)` β€” a **composite key**. This means: +- Each subject can have multiple sessions (1, 2, 3, ...) +- Session 1 for subject A is different from session 1 for subject B + +## Foreign Keys + +The `->` syntax creates a **foreign key** dependency. Foreign keys: + +1. **Import attributes** β€” Primary key attributes are inherited from the parent +2. **Enforce referential integrity** β€” Can't insert a session for a non-existent subject +3. **Enable cascading deletes** β€” Deleting a subject removes all its sessions +4. **Define workflow** β€” The parent must exist before the child + + +```python +# Let's insert some data to see how foreign keys work +Lab.insert1({'lab_id': 'tolias', 'lab_name': 'Tolias Lab', 'institution': 'Baylor College of Medicine'}) +# Note: created_at is auto-populated with CURRENT_TIMESTAMP + +Subject.insert1({ + 'subject_id': 'M001', + 'lab_id': 'tolias', + 'species': 'Mus musculus', + 'date_of_birth': '2026-01-15', + 'sex': 'M' +}) + +Subject() +``` + + + +```python +# Insert sessions for this subject +Session.insert([ + {'subject_id': 'M001', 'session_idx': 1, 'task_type': 'go_nogo', + 'status': 'completed', 'session_date': '2026-01-06', + 'task_params': {'go_probability': 0.5, 'timeout_sec': 2.0}}, + {'subject_id': 'M001', 'session_idx': 2, 'task_type': 'go_nogo', + 'status': 'completed', 'session_date': '2026-01-07', + 'task_params': {'go_probability': 0.7, 'timeout_sec': 1.5}}, + {'subject_id': 'M001', 'session_idx': 3, 'task_type': '2afc', + 'status': 'in_progress', 'session_date': '2026-01-08', + 'task_params': None}, # NULL - no parameters for this session +]) + +Session() +``` + + + +```python +# This would fail - referential integrity prevents invalid foreign keys +try: + Session.insert1({'subject_id': 'INVALID', 'session_idx': 1, + 'task_type': 'go_nogo', 'status': 'completed', + 'session_date': '2026-01-06'}) +except Exception as e: + print(f"Error: {type(e).__name__}") + print("Cannot insert session for non-existent subject!") +``` + + +## Relationship Patterns + +### One-to-Many (Hierarchical) + +When a foreign key is part of the primary key, it creates a **one-to-many** relationship: +- One subject β†’ many sessions +- One session β†’ many trials + +### Master-Part (Compositional Integrity) + +A **part table** provides **compositional integrity**: master and parts are inserted and deleted as an atomic unit. Part tables: +- Reference the master with `-> master` +- Are inserted together with the master atomically +- Are deleted when the master is deleted +- Can be one-to-many or one-to-one with the master +- A master can have multiple part tables, which may reference each other + +We defined `Session.Trial` as a part table because trials belong to their session: +- A session and all its trials should be entered together +- Deleting a session removes all its trials +- Downstream computations can assume all trials are present once the session exists + +Use part tables when components must be complete before processing can begin. + + +```python +# Access the part table +Session.Trial() +``` + + +### One-to-One (Extension) + +When the child's primary key exactly matches the parent's, it creates a **one-to-one** relationship. This is useful for: +- Extending a table with optional or computed data +- Separating computed results from source data + +`SessionSummary` below has a one-to-one relationship with `Session`β€”each session has exactly one summary. + + +```python +@schema +class SessionSummary(dj.Computed): + definition = """ + # Summary statistics for a session + -> Session + --- + num_trials : uint16 + num_correct : uint16 + accuracy : float32 + mean_reaction_time : float32 + """ + + def make(self, key): + correct_vals, rt_vals = (Session.Trial & key).to_arrays('correct', 'reaction_time') + n_trials = len(correct_vals) + n_correct = sum(correct_vals) if n_trials else 0 + + self.insert1({ + **key, + 'num_trials': n_trials, + 'num_correct': n_correct, + 'accuracy': n_correct / n_trials if n_trials else 0.0, + 'mean_reaction_time': sum(rt_vals) / n_trials if n_trials else 0.0 + }) +``` + + +### Optional Foreign Keys (Nullable) + +Use `[nullable]` for optional relationships: + + +```python +@schema +class Experimenter(dj.Manual): + definition = """ + # Lab member who runs experiments + experimenter_id : uuid # anonymized identifier + --- + full_name : varchar(100) + email = '' : varchar(100) + """ + +@schema +class SessionExperimenter(dj.Manual): + definition = """ + # Links sessions to experimenters (optional) + -> Session + --- + -> [nullable] Experimenter # experimenter may be unknown + """ +``` + + +### Many-to-Many (Association Tables) + +For many-to-many relationships, create an association table with foreign keys to both parents: + + +```python +@schema +class Protocol(dj.Lookup): + definition = """ + # Experimental protocols + protocol_id : varchar(32) + --- + protocol_name : varchar(100) + version : varchar(16) + """ + contents = [ + {'protocol_id': 'iacuc_2024_01', 'protocol_name': 'Mouse Behavior', 'version': '1.0'}, + {'protocol_id': 'iacuc_2024_02', 'protocol_name': 'Imaging Protocol', 'version': '2.1'}, + ] + +@schema +class SubjectProtocol(dj.Manual): + definition = """ + # Protocols assigned to subjects (many-to-many) + -> Subject + -> Protocol + --- + assignment_date : date + """ +``` + + +## View the Schema + +DataJoint can visualize the schema as a diagram: + + +```python +dj.Diagram(schema) +``` + + +### Reading the Diagram + +- **Colors**: Green = Manual, Gray = Lookup, Red = Computed, Blue = Imported +- **Solid lines**: Foreign key in primary key (one-to-many containment) +- **Dashed lines**: Foreign key in secondary attributes (reference) + +## Insert Test Data and Populate + + +```python +# Insert trials for the first session +import random +random.seed(42) + +trials = [] +for i in range(20): + correct = random.random() > 0.3 + trials.append({ + 'subject_id': 'M001', + 'session_idx': 1, + 'trial_idx': i + 1, + 'stimulus': random.choice(['left', 'right']), + 'response': random.choice(['go', 'nogo']), + 'correct': correct, + 'reaction_time': random.uniform(0.2, 0.8) + }) + +Session.Trial.insert(trials, skip_duplicates=True) +print(f"Inserted {len(Session.Trial())} trials") +``` + + + +```python +# Populate the computed summary +SessionSummary.populate(display_progress=True) +SessionSummary() +``` + + +## Best Practices + +### 1. Choose Meaningful Primary Keys +- Use natural identifiers when possible (`subject_id = 'M001'`) +- Keep keys minimal but sufficient for uniqueness + +### 2. Use Appropriate Table Tiers +- **Manual**: Data entered by operators or instruments +- **Lookup**: Configuration, parameters, reference data +- **Imported**: Data read from files (recordings, images) +- **Computed**: Derived analyses and summaries + +### 3. Normalize Your Data +- Don't repeat information across rows +- Create separate tables for distinct entities +- Use foreign keys to link related data + +### 4. Use Core DataJoint Types + +DataJoint has a three-layer type architecture (see [Type System Specification](../reference/specs/type-system.md)): + +1. **Native database types** (Layer 1): Backend-specific types like `INT`, `FLOAT`, `TINYINT UNSIGNED`. These are **discouraged** but allowed for backward compatibility. + +2. **Core DataJoint types** (Layer 2): Standardized, scientist-friendly types that work identically across MySQL and PostgreSQL. **Always prefer these.** + +3. **Codec types** (Layer 3): Types with `encode()`/`decode()` semantics like ``, ``, ``. + +**Core types used in this tutorial:** + +| Type | Description | Example | +|------|-------------|---------| +| `uint8`, `uint16`, `int32` | Sized integers | `session_idx : uint16` | +| `float32`, `float64` | Sized floats | `reaction_time : float32` | +| `varchar(n)` | Variable-length string | `name : varchar(100)` | +| `bool` | Boolean | `correct : bool` | +| `date` | Date only | `date_of_birth : date` | +| `datetime` | Date and time (UTC) | `created_at : datetime` | +| `enum(...)` | Enumeration | `sex : enum('M', 'F', 'U')` | +| `json` | JSON document | `task_params : json` | +| `uuid` | Universally unique ID | `experimenter_id : uuid` | + +**Why native types are allowed but discouraged:** + +Native types (like `int`, `float`, `tinyint`) are passed through to the database but generate a **warning at declaration time**. They are discouraged because: +- They lack explicit size information +- They are not portable across database backends +- They are not recorded in field metadata for reconstruction + +If you see a warning like `"Native type 'int' used; consider 'int32' instead"`, update your definition to use the corresponding core type. + +### 5. Document Your Tables +- Add comments after `#` in definitions +- Document units in attribute comments + +## Key Concepts Recap + +| Concept | Description | +|---------|-------------| +| **Primary Key** | Attributes above `---` that uniquely identify rows | +| **Secondary Attributes** | Attributes below `---` that store additional data | +| **Foreign Key** (`->`) | Reference to another table, imports its primary key | +| **One-to-Many** | FK in primary key: parent has many children | +| **One-to-One** | FK is entire primary key: exactly one child per parent | +| **Master-Part** | Compositional integrity: master and parts inserted/deleted atomically | +| **Nullable FK** | `[nullable]` makes the reference optional | +| **Lookup Table** | Pre-populated reference data | + +## Next Steps + +- [Data Entry](03-data-entry.ipynb) β€” Inserting, updating, and deleting data +- [Queries](04-queries.ipynb) β€” Filtering, joining, and projecting +- [Computation](05-computation.ipynb) β€” Building computational pipelines + + +```python +# Cleanup +schema.drop(prompt=False) +``` + + +--- +## File: tutorials/03-data-entry.ipynb + +# Data Entry + +This tutorial covers how to manipulate data in DataJoint tables. You'll learn: + +- **Insert** β€” Adding rows to tables +- **Update** β€” Modifying existing rows (for corrections) +- **Delete** β€” Removing rows with cascading +- **Validation** β€” Checking data before insertion + +DataJoint is designed around **insert** and **delete** as the primary operations. Updates are intentionally limited to surgical corrections. + + +```python +import datajoint as dj +import numpy as np + +schema = dj.Schema('tutorial_data_entry') +``` + + + +```python +# Define tables for this tutorial +@schema +class Lab(dj.Manual): + definition = """ + lab_id : varchar(16) + --- + lab_name : varchar(100) + """ + +@schema +class Subject(dj.Manual): + definition = """ + subject_id : varchar(16) + --- + -> Lab + species : varchar(50) + date_of_birth : date + notes = '' : varchar(1000) + """ + +@schema +class Session(dj.Manual): + definition = """ + -> Subject + session_idx : uint16 + --- + session_date : date + duration : float32 # minutes + """ + + class Trial(dj.Part): + definition = """ + -> master + trial_idx : uint16 + --- + outcome : enum('hit', 'miss', 'false_alarm', 'correct_reject') + reaction_time : float32 # seconds + """ + +@schema +class ProcessedData(dj.Computed): + definition = """ + -> Session + --- + hit_rate : float32 + """ + + def make(self, key): + outcomes = (Session.Trial & key).to_arrays('outcome') + n_trials = len(outcomes) + hit_rate = np.sum(outcomes == 'hit') / n_trials if n_trials else 0.0 + self.insert1({**key, 'hit_rate': hit_rate}) +``` + + +## Insert Operations + +### `insert1()` β€” Single Row + +Use `insert1()` to add a single row as a dictionary: + + +```python +# Insert a single row +Lab.insert1({'lab_id': 'tolias', 'lab_name': 'Tolias Lab'}) + +Subject.insert1({ + 'subject_id': 'M001', + 'lab_id': 'tolias', + 'species': 'Mus musculus', + 'date_of_birth': '2026-01-15' +}) + +Subject() +``` + + +### `insert()` β€” Multiple Rows + +Use `insert()` to add multiple rows at once. This is more efficient than calling `insert1()` in a loop. + + +```python +# Insert multiple rows as a list of dictionaries +Subject.insert([ + {'subject_id': 'M002', 'lab_id': 'tolias', 'species': 'Mus musculus', 'date_of_birth': '2026-02-01'}, + {'subject_id': 'M003', 'lab_id': 'tolias', 'species': 'Mus musculus', 'date_of_birth': '2026-02-15'}, +]) + +Subject() +``` + + +### Accepted Input Formats + +`insert()` accepts several formats: + +| Format | Example | +|--------|--------| +| List of dicts | `[{'id': 1, 'name': 'A'}, ...]` | +| pandas DataFrame | `pd.DataFrame({'id': [1, 2], 'name': ['A', 'B']})` | +| numpy structured array | `np.array([(1, 'A')], dtype=[('id', int), ('name', 'U10')])` | +| QueryExpression | `OtherTable.proj(...)` (INSERT...SELECT) | + + +```python +# Insert from pandas DataFrame +import pandas as pd + +df = pd.DataFrame({ + 'subject_id': ['M004', 'M005'], + 'lab_id': ['tolias', 'tolias'], + 'species': ['Mus musculus', 'Mus musculus'], + 'date_of_birth': ['2026-03-01', '2026-03-15'] +}) + +Subject.insert(df) +print(f"Total subjects: {len(Subject())}") +``` + + +### Handling Duplicates + +By default, inserting a row with an existing primary key raises an error: + + +```python +# This will raise an error - duplicate primary key +try: + Subject.insert1({'subject_id': 'M001', 'lab_id': 'tolias', + 'species': 'Mus musculus', 'date_of_birth': '2026-01-15'}) +except Exception as e: + print(f"Error: {type(e).__name__}") + print("Cannot insert duplicate primary key!") +``` + + +Use `skip_duplicates=True` to silently skip rows with existing keys: + + +```python +# Skip duplicates - existing row unchanged +Subject.insert1( + {'subject_id': 'M001', 'lab_id': 'tolias', 'species': 'Mus musculus', 'date_of_birth': '2026-01-15'}, + skip_duplicates=True +) +print("Insert completed (duplicate skipped)") +``` + + +**Note:** `replace=True` is also available but has the same caveats as `update1()`β€”it bypasses immutability and can break provenance. Use sparingly for corrections only. + +### Extra Fields + +By default, inserting a row with fields not in the table raises an error: + + +```python +try: + Subject.insert1({'subject_id': 'M006', 'lab_id': 'tolias', + 'species': 'Mus musculus', 'date_of_birth': '2026-04-01', + 'unknown_field': 'some value'}) # Unknown field! +except Exception as e: + print(f"Error: {type(e).__name__}") + print("Field 'unknown_field' not in table!") +``` + + + +```python +# Use ignore_extra_fields=True to silently ignore unknown fields +Subject.insert1( + {'subject_id': 'M006', 'lab_id': 'tolias', 'species': 'Mus musculus', + 'date_of_birth': '2026-04-01', 'unknown_field': 'ignored'}, + ignore_extra_fields=True +) +print(f"Total subjects: {len(Subject())}") +``` + + +## Master-Part Tables and Transactions + +**Compositional integrity** means that a master and all its parts must be inserted (or deleted) as an atomic unit. This ensures downstream computations see complete data. + +- **Auto-populated tables** (Computed, Imported) enforce this automaticallyβ€”`make()` runs in a transaction +- **Manual tables** require explicit transactions to maintain compositional integrity + +### Inserting Master with Parts + + +```python +# Use a transaction to ensure master and parts are inserted atomically +with dj.conn().transaction: + Session.insert1({ + 'subject_id': 'M001', + 'session_idx': 1, + 'session_date': '2026-01-06', + 'duration': 45.5 + }) + Session.Trial.insert([ + {'subject_id': 'M001', 'session_idx': 1, 'trial_idx': 1, 'outcome': 'hit', 'reaction_time': 0.35}, + {'subject_id': 'M001', 'session_idx': 1, 'trial_idx': 2, 'outcome': 'miss', 'reaction_time': 0.82}, + {'subject_id': 'M001', 'session_idx': 1, 'trial_idx': 3, 'outcome': 'hit', 'reaction_time': 0.41}, + {'subject_id': 'M001', 'session_idx': 1, 'trial_idx': 4, 'outcome': 'false_alarm', 'reaction_time': 0.28}, + {'subject_id': 'M001', 'session_idx': 1, 'trial_idx': 5, 'outcome': 'hit', 'reaction_time': 0.39}, + ]) + +# Both master and parts committed together, or neither if error occurred +Session.Trial() +``` + + +## Update Operations + +DataJoint provides only `update1()` for modifying single rows. This is intentionalβ€”updates bypass the normal workflow and should be used sparingly for **corrective operations**. + +### When to Use Updates + +**Appropriate uses:** +- Fixing data entry errors (typos, wrong values) +- Adding notes or metadata after the fact +- Administrative corrections + +**Inappropriate uses** (use delete + insert + populate instead): +- Regular workflow operations +- Changes that should trigger recomputation + + +```python +# Update a single row - must provide all primary key values +Subject.update1({'subject_id': 'M001', 'notes': 'Primary subject for behavioral study'}) + +(Subject & 'subject_id="M001"').fetch1() +``` + + + +```python +# Update multiple attributes at once +Subject.update1({ + 'subject_id': 'M002', + 'notes': 'Control group', + 'species': 'Mus musculus (C57BL/6)' # More specific +}) + +(Subject & 'subject_id="M002"').fetch1() +``` + + +### Update Requirements + +1. **Complete primary key**: All PK attributes must be provided +2. **Exactly one match**: Must match exactly one existing row +3. **No restrictions**: Cannot call on a restricted table + + +```python +# Error: incomplete primary key +try: + Subject.update1({'notes': 'Missing subject_id!'}) +except Exception as e: + print(f"Error: {type(e).__name__}") + print("Primary key must be complete") +``` + + + +```python +# Error: cannot update restricted table +try: + (Subject & 'subject_id="M001"').update1({'subject_id': 'M001', 'notes': 'test'}) +except Exception as e: + print(f"Error: {type(e).__name__}") + print("Cannot update restricted table") +``` + + +### Reset to Default + +Setting an attribute to `None` resets it to its default value: + + +```python +# Reset notes to default (empty string) +Subject.update1({'subject_id': 'M003', 'notes': None}) + +(Subject & 'subject_id="M003"').fetch1() +``` + + +## Delete Operations + +### Cascading Deletes + +Deleting a row automatically cascades to all dependent tables. This maintains referential integrity across the pipeline. + + +```python +# First, let's see what we have +print(f"Sessions: {len(Session())}") +print(f"Trials: {len(Session.Trial())}") + +# Populate computed table +ProcessedData.populate() +print(f"ProcessedData: {len(ProcessedData())}") +``` + + + +```python +# Delete a session - cascades to Trial and ProcessedData +(Session & {'subject_id': 'M001', 'session_idx': 1}).delete(prompt=False) + +print(f"After delete:") +print(f"Sessions: {len(Session())}") +print(f"Trials: {len(Session.Trial())}") +print(f"ProcessedData: {len(ProcessedData())}") +``` + + +### Prompt Behavior + +The `prompt` parameter controls whether `delete()` asks for confirmation. When `prompt=None` (default), the behavior is determined by `dj.config['safemode']`: + +```python +# Uses config['safemode'] setting (default) +(Table & condition).delete() + +# Explicitly skip confirmation +(Table & condition).delete(prompt=False) + +# Explicitly require confirmation +(Table & condition).delete(prompt=True) +``` + + +```python +# Add more data for demonstration +with dj.conn().transaction: + Session.insert1({'subject_id': 'M002', 'session_idx': 1, 'session_date': '2026-01-07', 'duration': 30.0}) + Session.Trial.insert([ + {'subject_id': 'M002', 'session_idx': 1, 'trial_idx': 1, 'outcome': 'hit', 'reaction_time': 0.40}, + {'subject_id': 'M002', 'session_idx': 1, 'trial_idx': 2, 'outcome': 'hit', 'reaction_time': 0.38}, + ]) + +# Delete with prompt=False (no confirmation prompt) +(Session & {'subject_id': 'M002', 'session_idx': 1}).delete(prompt=False) +``` + + +### The Recomputation Pattern + +When source data needs to change, the correct pattern is **delete β†’ insert β†’ populate**. This ensures all derived data remains consistent: + + +```python +# Add a session with trials (using transaction for compositional integrity) +with dj.conn().transaction: + Session.insert1({'subject_id': 'M003', 'session_idx': 1, 'session_date': '2026-01-08', 'duration': 40.0}) + Session.Trial.insert([ + {'subject_id': 'M003', 'session_idx': 1, 'trial_idx': 1, 'outcome': 'hit', 'reaction_time': 0.35}, + {'subject_id': 'M003', 'session_idx': 1, 'trial_idx': 2, 'outcome': 'miss', 'reaction_time': 0.50}, + ]) + +# Compute results +ProcessedData.populate() +print("Before correction:", ProcessedData.fetch1()) +``` + + + +```python +# Suppose we discovered trial 2 was actually a 'hit' not 'miss' +# WRONG: Updating the trial would leave ProcessedData stale! +# Session.Trial.update1({...}) # DON'T DO THIS + +# CORRECT: Delete, reinsert, recompute +key = {'subject_id': 'M003', 'session_idx': 1} + +# 1. Delete cascades to ProcessedData +(Session & key).delete(prompt=False) + +# 2. Reinsert with corrected data (using transaction) +with dj.conn().transaction: + Session.insert1({**key, 'session_date': '2026-01-08', 'duration': 40.0}) + Session.Trial.insert([ + {**key, 'trial_idx': 1, 'outcome': 'hit', 'reaction_time': 0.35}, + {**key, 'trial_idx': 2, 'outcome': 'hit', 'reaction_time': 0.50}, # Corrected! + ]) + +# 3. Recompute +ProcessedData.populate() +print("After correction:", ProcessedData.fetch1()) +``` + + +## Validation + +Use `validate()` to check data before insertion: + + +```python +# Validate rows before inserting +rows_to_insert = [ + {'subject_id': 'M007', 'lab_id': 'tolias', 'species': 'Mus musculus', 'date_of_birth': '2026-05-01'}, + {'subject_id': 'M008', 'lab_id': 'tolias', 'species': 'Mus musculus', 'date_of_birth': '2026-05-15'}, +] + +result = Subject.validate(rows_to_insert) + +if result: + Subject.insert(rows_to_insert) + print(f"Inserted {len(rows_to_insert)} rows") +else: + print("Validation failed:") + print(result.summary()) +``` + + + +```python +# Example of validation failure +bad_rows = [ + {'subject_id': 'M009', 'species': 'Mus musculus', 'date_of_birth': '2026-05-20'}, # Missing lab_id! +] + +result = Subject.validate(bad_rows) + +if not result: + print("Validation failed!") + for error in result.errors: + print(f" {error}") +``` + + +## Transactions + +Single operations are atomic by default. Use explicit transactions for: + +1. **Master-part inserts** β€” Maintain compositional integrity +2. **Multi-table operations** β€” All succeed or all fail +3. **Complex workflows** β€” Coordinate related changes + + +```python +# Atomic transaction - all inserts succeed or none do +with dj.conn().transaction: + Session.insert1({'subject_id': 'M007', 'session_idx': 1, 'session_date': '2026-01-10', 'duration': 35.0}) + Session.Trial.insert([ + {'subject_id': 'M007', 'session_idx': 1, 'trial_idx': 1, 'outcome': 'hit', 'reaction_time': 0.33}, + {'subject_id': 'M007', 'session_idx': 1, 'trial_idx': 2, 'outcome': 'miss', 'reaction_time': 0.45}, + ]) + +print(f"Session inserted with {len(Session.Trial & {'subject_id': 'M007'})} trials") +``` + + +## Best Practices + +### 1. Prefer Insert/Delete Over Update + +When source data changes, delete and reinsert rather than updating. Updates and `replace=True` bypass immutability and break provenance: + +```python +# Good: Delete and reinsert +(Trial & key).delete(prompt=False) +Trial.insert1(corrected_trial) +DerivedTable.populate() + +# Avoid: Update that leaves derived data stale +Trial.update1({**key, 'value': new_value}) +``` + +### 2. Use Transactions for Master-Part Inserts + +```python +# Ensures compositional integrity +with dj.conn().transaction: + Session.insert1(session_data) + Session.Trial.insert(trials) +``` + +### 3. Batch Inserts for Performance + +```python +# Good: Single insert call +Subject.insert(all_rows) + +# Slow: Loop of insert1 calls +for row in all_rows: + Subject.insert1(row) # Creates many transactions +``` + +### 4. Validate Before Insert + +```python +result = Subject.validate(rows) +if not result: + raise ValueError(result.summary()) +Subject.insert(rows) +``` + +### 5. Configure Safe Mode for Production + +```python +# In production scripts, explicitly control prompt behavior +(Subject & condition).delete(prompt=False) # No confirmation + +# Or configure globally via settings +dj.config['safemode'] = True # Require confirmation by default +``` + +## Quick Reference + +| Operation | Method | Use Case | +|-----------|--------|----------| +| Insert one | `insert1(row)` | Adding single entity | +| Insert many | `insert(rows)` | Bulk data loading | +| Update one | `update1(row)` | Surgical corrections only | +| Delete | `delete()` | Removing entities (cascades) | +| Delete quick | `delete_quick()` | Internal cleanup (no cascade) | +| Validate | `validate(rows)` | Pre-insert check | + +See the [Data Manipulation Specification](../reference/specs/data-manipulation.md) for complete details. + +## Next Steps + +- [Queries](04-queries.ipynb) β€” Filtering, joining, and projecting data +- [Computation](05-computation.ipynb) β€” Building computational pipelines + + +```python +# Cleanup +schema.drop(prompt=False) +``` + + +--- +## File: tutorials/04-queries.ipynb + +# Queries + +This tutorial covers how to query data in DataJoint. You'll learn: + +- **Restriction** (`&`, `-`) β€” Filtering rows +- **Top** (`dj.Top`) β€” Limiting and ordering results +- **Projection** (`.proj()`) β€” Selecting and computing columns +- **Join** (`*`) β€” Combining tables +- **Extension** (`.extend()`) β€” Adding optional attributes +- **Aggregation** (`.aggr()`) β€” Grouping and summarizing +- **Fetching** β€” Retrieving data in various formats + +DataJoint queries are **lazy**β€”they build SQL expressions that execute only when you fetch data. + + +```python +import datajoint as dj +import numpy as np + +schema = dj.Schema('tutorial_queries') +``` + + + +```python +# Define tables for this tutorial +@schema +class Subject(dj.Manual): + definition = """ + subject_id : varchar(16) + --- + species : varchar(50) + date_of_birth : date + sex : enum('M', 'F', 'U') + weight : float32 # grams + """ + +@schema +class Experimenter(dj.Manual): + definition = """ + experimenter_id : varchar(16) + --- + full_name : varchar(100) + """ + +@schema +class Session(dj.Manual): + definition = """ + -> Subject + session_idx : uint16 + --- + -> Experimenter + session_date : date + duration : float32 # minutes + """ + + class Trial(dj.Part): + definition = """ + -> master + trial_idx : uint16 + --- + stimulus : varchar(50) + response : varchar(50) + correct : bool + reaction_time : float32 # seconds + """ +``` + + + +```python +# Insert sample data +import random +random.seed(42) + +Experimenter.insert([ + {'experimenter_id': 'alice', 'full_name': 'Alice Smith'}, + {'experimenter_id': 'bob', 'full_name': 'Bob Jones'}, +]) + +subjects = [ + {'subject_id': 'M001', 'species': 'Mus musculus', 'date_of_birth': '2026-01-15', 'sex': 'M', 'weight': 25.3}, + {'subject_id': 'M002', 'species': 'Mus musculus', 'date_of_birth': '2026-02-01', 'sex': 'F', 'weight': 22.1}, + {'subject_id': 'M003', 'species': 'Mus musculus', 'date_of_birth': '2026-02-15', 'sex': 'M', 'weight': 26.8}, + {'subject_id': 'R001', 'species': 'Rattus norvegicus', 'date_of_birth': '2024-01-01', 'sex': 'F', 'weight': 280.5}, +] +Subject.insert(subjects) + +# Insert sessions +sessions = [ + {'subject_id': 'M001', 'session_idx': 1, 'experimenter_id': 'alice', 'session_date': '2026-01-06', 'duration': 45.0}, + {'subject_id': 'M001', 'session_idx': 2, 'experimenter_id': 'alice', 'session_date': '2026-01-07', 'duration': 50.0}, + {'subject_id': 'M002', 'session_idx': 1, 'experimenter_id': 'bob', 'session_date': '2026-01-06', 'duration': 40.0}, + {'subject_id': 'M002', 'session_idx': 2, 'experimenter_id': 'bob', 'session_date': '2026-01-08', 'duration': 55.0}, + {'subject_id': 'M003', 'session_idx': 1, 'experimenter_id': 'alice', 'session_date': '2026-01-07', 'duration': 35.0}, +] +Session.insert(sessions) + +# Insert trials +trials = [] +for s in sessions: + for i in range(10): + trials.append({ + 'subject_id': s['subject_id'], + 'session_idx': s['session_idx'], + 'trial_idx': i + 1, + 'stimulus': random.choice(['left', 'right']), + 'response': random.choice(['left', 'right']), + 'correct': random.random() > 0.3, + 'reaction_time': random.uniform(0.2, 0.8) + }) +Session.Trial.insert(trials) + +print(f"Subjects: {len(Subject())}, Sessions: {len(Session())}, Trials: {len(Session.Trial())}") +``` + + +## Restriction (`&` and `-`) + +Restriction filters rows based on conditions. Use `&` to select matching rows, `-` to exclude them. + +### String Conditions + +SQL expressions using attribute names: + + +```python +# Simple comparison +Subject & "weight > 25" +``` + + + +```python +# Date comparison +Session & "session_date > '2026-01-06'" +``` + + + +```python +# Multiple conditions with AND +Subject & "sex = 'M' AND weight > 25" +``` + + +### Dictionary Conditions + +Dictionaries specify exact matches: + + +```python +# Single attribute +Subject & {'sex': 'F'} +``` + + + +```python +# Multiple attributes (AND) +Session & {'subject_id': 'M001', 'session_idx': 1} +``` + + +### Restriction by Query Expression + +Restrict by another query expression. DataJoint uses **semantic matching**: attributes with the same name are matched only if they share the same origin through foreign key lineage. This prevents accidental matches on unrelated attributes that happen to share names (like generic `id` columns in unrelated tables). + +See [Semantic Matching](../reference/specs/semantic-matching.md) for the full specification. + + +```python +# Subjects that have at least one session +Subject & Session +``` + + + +```python +# Subjects without any sessions (R001 has no sessions) +Subject - Session +``` + + +### Collection Conditions (OR) + +Lists create OR conditions: + + +```python +# Either of these subjects +Subject & [{'subject_id': 'M001'}, {'subject_id': 'M002'}] +``` + + +### Chaining Restrictions + +Sequential restrictions combine with AND: + + +```python +# These are equivalent +result1 = Subject & "sex = 'M'" & "weight > 25" +result2 = (Subject & "sex = 'M'") & "weight > 25" + +print(f"Result 1: {len(result1)} rows") +print(f"Result 2: {len(result2)} rows") +``` + + +### Top Restriction (`dj.Top`) + +`dj.Top` is a special restriction that limits and orders query results. Unlike fetch-time `order_by` and `limit`, `dj.Top` applies **within the query itself**, making it composable with other operators. + +```python +query & dj.Top(limit=N, order_by='attr DESC', offset=M) +``` + +This is useful when you need the "top N" rows as part of a larger queryβ€”for example, the 5 highest-scoring trials per session. + + +```python +# Top 2 heaviest subjects +Subject & dj.Top(limit=2, order_by='weight DESC') +``` + + + +```python +# Skip first 2, then get next 2 (pagination) +Subject & dj.Top(limit=2, order_by='weight DESC', offset=2) +``` + + + +```python +# Combine with other restrictions +(Subject & "sex = 'M'") & dj.Top(limit=1, order_by='weight DESC') +``` + + +**When to use `dj.Top` vs fetch-time `order_by`/`limit`:** + +- Use `dj.Top` when the limited result needs to be **joined or restricted further** +- Use fetch-time parameters (`to_dicts(order_by=..., limit=...)`) for **final output** + +**Note:** Some databases (including MySQL 8.0) don't support LIMIT in certain subquery contexts. If you encounter this limitation, fetch the keys first and use them as a restriction: + + +```python +# Get trials only from the 2 longest sessions +# Workaround: fetch keys first, then use as restriction +longest_session_keys = (Session & dj.Top(limit=2, order_by='duration DESC')).keys() +Session.Trial & longest_session_keys +``` + + +## Projection (`.proj()`) + +Projection selects, renames, or computes attributes. + +### Selecting Attributes + + +```python +# Primary key only (no arguments) +Subject.proj() +``` + + + +```python +# Primary key + specific attributes +Subject.proj('species', 'sex') +``` + + + +```python +# All attributes (using ellipsis) +Subject.proj(...) +``` + + + +```python +# All except specific attributes +Subject.proj(..., '-weight') +``` + + +### Renaming Attributes + + +```python +# Rename 'species' to 'animal_species' +Subject.proj(animal_species='species') +``` + + +### Computed Attributes + + +```python +# Arithmetic computation +Subject.proj('species', weight_kg='weight / 1000') +``` + + + +```python +# Date functions +Session.proj('session_date', year='YEAR(session_date)', month='MONTH(session_date)') +``` + + +## Join (`*`) + +Join combines tables on shared attributes. Unlike SQL, which offers many join variants (INNER, LEFT, RIGHT, FULL, CROSS, NATURAL), DataJoint provides **one rigorous join operator** with strict semantic rules. + +The `*` operator: +- Matches only **semantically compatible** attributes (same name AND same origin via foreign key lineage) +- Produces a result with a **valid primary key** determined by functional dependencies +- Follows clear algebraic properties + +This simplicity makes DataJoint queries unambiguous and composable. + + +```python +# Join Subject and Session on subject_id +Subject * Session +``` + + + +```python +# Join then restrict +(Subject * Session) & "sex = 'M'" +``` + + + +```python +# Restrict then join (equivalent result) +(Subject & "sex = 'M'") * Session +``` + + + +```python +# Three-way join +(Subject * Session * Experimenter).proj('species', 'session_date', 'full_name') +``` + + +### Primary Keys in Join Results + +Every query result has a valid primary key. For joins, the result's primary key depends on **functional dependencies** between the operands: + +| Condition | Result Primary Key | +|-----------|-------------------| +| `A β†’ B` (A determines B) | PK(A) | +| `B β†’ A` (B determines A) | PK(B) | +| Both | PK(A) | +| Neither | PK(A) βˆͺ PK(B) | + +**"A determines B"** means all of B's primary key attributes exist in A (as primary or secondary attributes). + +In our example: +- `Session` has PK: `(subject_id, session_idx)` +- `Trial` has PK: `(subject_id, session_idx, trial_idx)` + +Since Session's PK is a subset of Trial's PK, `Session β†’ Trial`. The join `Session * Trial` has the same primary key as Session. + +See the [Query Algebra Specification](../reference/specs/query-algebra.md) for the complete functional dependency rules. + +### Extension (`.extend()`) + +Sometimes you want to add attributes from a related table without losing rows that lack matching entries. The **extend** operator is a specialized join for this purpose. + +`A.extend(B)` is equivalent to a left join: it preserves all rows from A, adding B's attributes where matches exist (with NULL where they don't). + +**Requirement**: A must "determine" Bβ€”all of B's primary key attributes must exist in A. This ensures the result maintains A's entity identity. + + +```python +# Session contains experimenter_id (FK to Experimenter) +# extend adds Experimenter's attributes while keeping all Sessions +Session.extend(Experimenter) +``` + + +**Why extend instead of join?** + +A regular join (`*`) would exclude sessions if their experimenter wasn't in the Experimenter table. Extend preserves all sessions, filling in NULL for missing experimenter data. This is essential when you want to add optional attributes without filtering your results. + +## Aggregation (`.aggr()`) + +DataJoint aggregation operates **entity-to-entity**: you aggregate one entity type with respect to another. This differs fundamentally from SQL's `GROUP BY`, which groups by arbitrary attribute sets. + +In DataJoint: +```python +Session.aggr(Trial, n_trials='count(*)') +``` + +This reads: "For each **Session entity**, aggregate its associated **Trial entities**." + +The equivalent SQL would be: +```sql +SELECT session.*, COUNT(*) as n_trials +FROM session +JOIN trial USING (subject_id, session_idx) +GROUP BY session.subject_id, session.session_idx +``` + +The key insight: aggregation always groups by the **primary key of the left operand**. This enforces meaningful groupingsβ€”you aggregate over well-defined entities, not arbitrary attribute combinations. + + +```python +# Count trials per session +Session.aggr(Session.Trial, n_trials='count(*)') +``` + + + +```python +# Multiple aggregates +Session.aggr( + Session.Trial, + n_trials='count(*)', + n_correct='sum(correct)', + avg_rt='avg(reaction_time)' +) +``` + + + +```python +# Count sessions per subject +Subject.aggr(Session, n_sessions='count(*)') +``` + + +### The `exclude_nonmatching` Parameter + +By default, aggregation keeps all entities from the grouping table, even those without matches. This ensures you see zeros rather than missing rows. + +However, `count(*)` counts the NULL-joined row as 1. To correctly count 0 for entities without matches, use `count(pk_attribute)` which excludes NULLs: + + +```python +# All subjects, including those without sessions (n_sessions=0) +# count(session_idx) returns 0 for NULLs, unlike count(*) +Subject.aggr(Session, n_sessions='count(session_idx)') +``` + + + +```python +# Only subjects that have at least one session (exclude those without matches) +Subject.aggr(Session, n_sessions='count(session_idx)', exclude_nonmatching=True) +``` + + +### Universal Set (`dj.U()`) + +What if you need to aggregate but there's no appropriate entity to group by? DataJoint provides `dj.U()` (the "universal set") for these cases. + +**`dj.U()`** (no attributes) represents the singleton entityβ€”the "one universe." Aggregating against it produces a single row with global statistics. + +**`dj.U('attr1', 'attr2')`** creates an ad-hoc grouping entity from the specified attributes. This enables aggregation when no table exists with those attributes as its primary key. + +For example, suppose you want to count sessions by `session_date`, but no table has `session_date` as its primary key. You can use `dj.U('session_date')` to create the grouping: + + +```python +# Group by session_date (not a primary key in any table) +dj.U('session_date').aggr(Session, n_sessions='count(*)', total_duration='sum(duration)') +``` + + + +```python +# Universal aggregation: dj.U() with no attributes produces one row +# This aggregates against the singleton "universe" +dj.U().aggr(Session, total_sessions='count(*)', avg_duration='avg(duration)') +``` + + + +```python +# Group by experimenter_id (a foreign key in Session, not part of Session's PK) +# Without dj.U(), we couldn't aggregate sessions by experimenter +dj.U('experimenter_id').aggr(Session, n_sessions='count(*)') +``` + + + +```python +# Unique values +dj.U('species') & Subject +``` + + +## Fetching Data + +DataJoint 2.0 provides explicit methods for different output formats. + +### `to_dicts()` β€” List of Dictionaries + + +```python +# Get all rows as list of dicts +rows = Subject.to_dicts() +rows[:2] +``` + + +### `to_pandas()` β€” DataFrame + + +```python +# Get as pandas DataFrame (primary key as index) +df = Subject.to_pandas() +df +``` + + +### `to_arrays()` β€” NumPy Arrays + + +```python +# Structured array (all columns) +arr = Subject.to_arrays() +arr +``` + + + +```python +# Specific columns as separate arrays +species, weights = Subject.to_arrays('species', 'weight') +print(f"Species: {species}") +print(f"Weights: {weights}") +``` + + +### `keys()` β€” Primary Keys + + +```python +# Get primary keys for iteration +keys = Session.keys() +keys[:3] +``` + + +### `fetch1()` β€” Single Row + + +```python +# Fetch one row (raises error if not exactly 1) +row = (Subject & {'subject_id': 'M001'}).fetch1() +row +``` + + + +```python +# Fetch specific attributes from one row +species, weight = (Subject & {'subject_id': 'M001'}).fetch1('species', 'weight') +print(f"{species}: {weight}g") +``` + + +### Ordering and Limiting + + +```python +# Sort by weight descending, get top 2 +Subject.to_dicts(order_by='weight DESC', limit=2) +``` + + + +```python +# Sort by primary key +Subject.to_dicts(order_by='KEY') +``` + + +### Lazy Iteration + +Iterating directly over a table streams rows efficiently: + + +```python +# Stream rows (single database cursor) +for row in Subject: + print(f"{row['subject_id']}: {row['species']}") +``` + + +## Query Composition + +Queries are composable and immutable. Build complex queries step by step: + + +```python +# Build a complex query step by step +male_mice = Subject & "sex = 'M'" & "species LIKE '%musculus%'" +sessions_with_subject = male_mice * Session +alice_sessions = sessions_with_subject & {'experimenter_id': 'alice'} +result = alice_sessions.proj('session_date', 'duration', 'weight') + +result +``` + + + +```python +# Or as a single expression +((Subject & "sex = 'M'" & "species LIKE '%musculus%'") + * Session + & {'experimenter_id': 'alice'} +).proj('session_date', 'duration', 'weight') +``` + + +## Operator Precedence + +Python operator precedence applies: + +1. `*` (join) β€” highest +2. `+`, `-` (union, anti-restriction) +3. `&` (restriction) β€” lowest + +Use parentheses for clarity: + + +```python +# Without parentheses: join happens first +# Subject * Session & condition means (Subject * Session) & condition + +# With parentheses: explicit order +result1 = (Subject & "sex = 'M'") * Session # Restrict then join +result2 = Subject * (Session & "duration > 40") # Restrict then join + +print(f"Result 1: {len(result1)} rows") +print(f"Result 2: {len(result2)} rows") +``` + + +## Quick Reference + +### Operators + +| Operation | Syntax | Description | +|-----------|--------|-------------| +| Restrict | `A & cond` | Select matching rows | +| Anti-restrict | `A - cond` | Select non-matching rows | +| Top | `A & dj.Top(limit, order_by)` | Limit/order results | +| Project | `A.proj(...)` | Select/compute columns | +| Join | `A * B` | Combine tables | +| Extend | `A.extend(B)` | Add B's attributes, keep all A rows | +| Aggregate | `A.aggr(B, ...)` | Group and summarize | +| Union | `A + B` | Combine entity sets | + +### Fetch Methods + +| Method | Returns | Use Case | +|--------|---------|----------| +| `to_dicts()` | `list[dict]` | JSON, iteration | +| `to_pandas()` | `DataFrame` | Data analysis | +| `to_arrays()` | `np.ndarray` | Numeric computation | +| `to_arrays('a', 'b')` | `tuple[array, ...]` | Specific columns | +| `keys()` | `list[dict]` | Primary keys | +| `fetch1()` | `dict` | Single row | + +See the [Query Algebra Specification](../reference/specs/query-algebra.md) and [Fetch API](../reference/specs/fetch-api.md) for complete details. + +## Next Steps + +- [Computation](05-computation.ipynb) β€” Building computational pipelines + + +```python +# Cleanup +schema.drop(prompt=False) +``` + + +--- +## File: tutorials/05-computation.ipynb + +# Computation + +This tutorial covers how to build computational pipelines with DataJoint. You'll learn: + +- **Computed tables** β€” Automatic derivation from other tables +- **Imported tables** β€” Ingesting data from external files +- **The `make()` method** β€” Computing and inserting results +- **Part tables** β€” Storing detailed results +- **Populate patterns** β€” Running computations efficiently + +DataJoint's auto-populated tables (`Computed` and `Imported`) execute automatically based on their dependencies. + + +```python +import datajoint as dj +import numpy as np + +schema = dj.Schema('tutorial_computation') +``` + + +## Manual Tables (Source Data) + +First, let's define the source tables that our computations will depend on: + + +```python +@schema +class Subject(dj.Manual): + definition = """ + subject_id : varchar(16) + --- + species : varchar(50) + """ + +@schema +class Session(dj.Manual): + definition = """ + -> Subject + session_idx : uint16 + --- + session_date : date + """ + + class Trial(dj.Part): + definition = """ + -> master + trial_idx : uint16 + --- + stimulus : varchar(50) + response : varchar(50) + correct : bool + reaction_time : float32 # seconds + """ + +@schema +class AnalysisMethod(dj.Lookup): + definition = """ + method_name : varchar(32) + --- + description : varchar(255) + """ + contents = [ + {'method_name': 'basic', 'description': 'Simple accuracy calculation'}, + {'method_name': 'weighted', 'description': 'Reaction-time weighted accuracy'}, + ] +``` + + + +```python +# Insert sample data +import random +random.seed(42) + +Subject.insert([ + {'subject_id': 'M001', 'species': 'Mus musculus'}, + {'subject_id': 'M002', 'species': 'Mus musculus'}, +]) + +sessions = [ + {'subject_id': 'M001', 'session_idx': 1, 'session_date': '2026-01-06'}, + {'subject_id': 'M001', 'session_idx': 2, 'session_date': '2026-01-07'}, + {'subject_id': 'M002', 'session_idx': 1, 'session_date': '2026-01-06'}, +] +Session.insert(sessions) + +# Insert trials for each session +trials = [] +for s in sessions: + for i in range(15): + trials.append({ + 'subject_id': s['subject_id'], + 'session_idx': s['session_idx'], + 'trial_idx': i + 1, + 'stimulus': random.choice(['left', 'right']), + 'response': random.choice(['left', 'right']), + 'correct': random.random() > 0.3, + 'reaction_time': random.uniform(0.2, 0.8) + }) +Session.Trial.insert(trials) + +print(f"Subjects: {len(Subject())}, Sessions: {len(Session())}, Trials: {len(Session.Trial())}") +``` + + +## Computed Tables + +A `Computed` table derives its data from other DataJoint tables. The `make()` method computes and inserts one entry at a time. + +### Basic Computed Table + + +```python +@schema +class SessionSummary(dj.Computed): + definition = """ + # Summary statistics for each session + -> Session + --- + n_trials : uint16 + n_correct : uint16 + accuracy : float32 + mean_rt : float32 # mean reaction time (seconds) + """ + + def make(self, key): + # Fetch trial data for this session + correct, rt = (Session.Trial & key).to_arrays('correct', 'reaction_time') + + n_trials = len(correct) + n_correct = sum(correct) if n_trials else 0 + + # Insert computed result + self.insert1({ + **key, + 'n_trials': n_trials, + 'n_correct': n_correct, + 'accuracy': n_correct / n_trials if n_trials else 0.0, + 'mean_rt': np.mean(rt) if n_trials else 0.0 + }) +``` + + +### Running Computations with `populate()` + +The `populate()` method automatically finds entries that need computing and calls `make()` for each: + + +```python +# Check what needs computing +print(f"Entries to compute: {len(SessionSummary.key_source - SessionSummary)}") + +# Run the computation +SessionSummary.populate(display_progress=True) + +# View results +SessionSummary() +``` + + +### Key Source + +The `key_source` property defines which entries should be computed. By default, it's the join of all parent tables referenced in the primary key: + + +```python +# SessionSummary.key_source is automatically Session +# (the table referenced in the primary key) +print("Key source:") +SessionSummary.key_source +``` + + +## Multiple Dependencies + +Computed tables can depend on multiple parent tables. The `key_source` is the join of all parents: + + +```python +@schema +class SessionAnalysis(dj.Computed): + definition = """ + # Analysis with configurable method + -> Session + -> AnalysisMethod + --- + score : float32 + """ + + def make(self, key): + # Fetch trial data + correct, rt = (Session.Trial & key).to_arrays('correct', 'reaction_time') + + # Apply method-specific analysis + if key['method_name'] == 'basic': + score = sum(correct) / len(correct) if len(correct) else 0.0 + elif key['method_name'] == 'weighted': + # Weight correct trials by inverse reaction time + weights = 1.0 / rt + score = sum(correct * weights) / sum(weights) if len(correct) else 0.0 + else: + score = 0.0 + + self.insert1({**key, 'score': score}) +``` + + + +```python +# Key source is Session * AnalysisMethod (all combinations) +print(f"Key source has {len(SessionAnalysis.key_source)} entries") +print(f" = {len(Session())} sessions x {len(AnalysisMethod())} methods") + +SessionAnalysis.populate(display_progress=True) +SessionAnalysis() +``` + + +## Computed Tables with Part Tables + +Use part tables to store detailed results alongside summary data: + + +```python +@schema +class TrialAnalysis(dj.Computed): + definition = """ + # Per-trial analysis results + -> Session + --- + n_analyzed : uint16 + """ + + class TrialResult(dj.Part): + definition = """ + -> master + trial_idx : uint16 + --- + rt_percentile : float32 # reaction time percentile within session + is_fast : bool # below median reaction time + """ + + def make(self, key): + # Fetch trial data + trial_data = (Session.Trial & key).to_dicts() + + if not trial_data: + self.insert1({**key, 'n_analyzed': 0}) + return + + # Calculate percentiles + rts = [t['reaction_time'] for t in trial_data] + median_rt = np.median(rts) + + # Insert master entry + self.insert1({**key, 'n_analyzed': len(trial_data)}) + + # Insert part entries + parts = [] + for t in trial_data: + percentile = sum(rt <= t['reaction_time'] for rt in rts) / len(rts) * 100 + parts.append({ + **key, + 'trial_idx': t['trial_idx'], + 'rt_percentile': float(percentile), + 'is_fast': t['reaction_time'] < median_rt + }) + + self.TrialResult.insert(parts) +``` + + + +```python +TrialAnalysis.populate(display_progress=True) + +print("Master table:") +print(TrialAnalysis()) + +print("\nPart table (first session):") +print((TrialAnalysis.TrialResult & {'subject_id': 'M001', 'session_idx': 1})) +``` + + +## Cascading Computations + +Computed tables can depend on other computed tables, creating a pipeline: + + +```python +@schema +class SubjectSummary(dj.Computed): + definition = """ + # Summary across all sessions for a subject + -> Subject + --- + n_sessions : uint16 + total_trials : uint32 + overall_accuracy : float32 + """ + + def make(self, key): + # Fetch from SessionSummary (another computed table) + summaries = (SessionSummary & key).to_dicts() + + n_sessions = len(summaries) + total_trials = sum(s['n_trials'] for s in summaries) + total_correct = sum(s['n_correct'] for s in summaries) + + self.insert1({ + **key, + 'n_sessions': n_sessions, + 'total_trials': total_trials, + 'overall_accuracy': total_correct / total_trials if total_trials else 0.0 + }) +``` + + + +```python +# SubjectSummary depends on SessionSummary which is already populated +SubjectSummary.populate(display_progress=True) +SubjectSummary() +``` + + +## View the Pipeline + +Visualize the dependency structure: + + +```python +dj.Diagram(schema) +``` + + +## Recomputation After Changes + +When source data changes, delete the affected computed entries and re-populate: + + +```python +# Add a new session +Session.insert1({'subject_id': 'M001', 'session_idx': 3, 'session_date': '2026-01-08'}) + +# Add trials for the new session +new_trials = [ + {'subject_id': 'M001', 'session_idx': 3, 'trial_idx': i + 1, + 'stimulus': 'left', 'response': 'left', 'correct': True, 'reaction_time': 0.3} + for i in range(20) +] +Session.Trial.insert(new_trials) + +# Re-populate (only computes new entries) +print("Populating new session...") +SessionSummary.populate(display_progress=True) +TrialAnalysis.populate(display_progress=True) + +# SubjectSummary needs to be recomputed for M001 +# Delete old entry first (cascading not needed here since no dependents) +(SubjectSummary & {'subject_id': 'M001'}).delete(prompt=False) +SubjectSummary.populate(display_progress=True) + +print("\nUpdated SubjectSummary:") +SubjectSummary() +``` + + +## Populate Options + +### Restrict to Specific Entries + + +```python +# Populate only for a specific subject +SessionAnalysis.populate(Subject & {'subject_id': 'M001'}) +``` + + +### Limit Number of Computations + + +```python +# Process at most 5 entries +SessionAnalysis.populate(max_calls=5, display_progress=True) +``` + + +### Error Handling + + +```python +# Continue despite errors +result = SessionAnalysis.populate(suppress_errors=True) +print(f"Success: {result.get('success', 0)}, Errors: {result.get('error', 0)}") +``` + + +## Progress Tracking + + +```python +# Check progress +remaining, total = SessionAnalysis.progress() +print(f"SessionAnalysis: {total - remaining}/{total} computed") +``` + + +## Custom Key Source + +Override `key_source` to customize which entries to compute: + + +```python +@schema +class QualityCheck(dj.Computed): + definition = """ + -> Session + --- + passes_qc : bool + """ + + @property + def key_source(self): + # Only process sessions with at least 10 trials + good_sessions = dj.U('subject_id', 'session_idx').aggr( + Session.Trial, n='count(*)' + ) & 'n >= 10' + return Session & good_sessions + + def make(self, key): + # Fetch summary stats + summary = (SessionSummary & key).fetch1() + + # QC: accuracy > 50% and mean RT < 1 second + passes = summary['accuracy'] > 0.5 and summary['mean_rt'] < 1.0 + + self.insert1({**key, 'passes_qc': passes}) +``` + + + +```python +print(f"Key source entries: {len(QualityCheck.key_source)}") +QualityCheck.populate(display_progress=True) +QualityCheck() +``` + + +## Best Practices + +### 1. Keep `make()` Simple and Idempotent + +```python +def make(self, key): + # 1. Fetch source data + data = (SourceTable & key).fetch1() + + # 2. Compute result + result = compute(data) + + # 3. Insert result + self.insert1({**key, **result}) +``` + +### 2. Use Part Tables for Detailed Results + +Store summary in master, details in parts: + +```python +def make(self, key): + self.insert1({**key, 'summary': s}) # Master + self.Detail.insert(details) # Parts +``` + +### 3. Re-populate After Data Changes + +```python +# Delete affected entries (cascades automatically) +(SourceTable & key).delete() + +# Reinsert corrected data +SourceTable.insert1(corrected) + +# Re-populate +ComputedTable.populate() +``` + +### 4. Use Lookup Tables for Parameters + +```python +@schema +class Method(dj.Lookup): + definition = "..." + contents = [...] # Pre-defined methods + +@schema +class Analysis(dj.Computed): + definition = """ + -> Session + -> Method # Parameter combinations + --- + result : float64 + """ +``` + +See the [AutoPopulate Specification](../reference/specs/autopopulate.md) for complete details. + +## Quick Reference + +| Method | Description | +|--------|-------------| +| `populate()` | Compute all pending entries | +| `populate(restriction)` | Compute subset of entries | +| `populate(max_calls=N)` | Compute at most N entries | +| `populate(display_progress=True)` | Show progress bar | +| `populate(suppress_errors=True)` | Continue on errors | +| `progress()` | Check completion status | +| `key_source` | Entries that should be computed | + + +```python +# Cleanup +schema.drop(prompt=False) +``` + + +--- +## File: tutorials/06-object-storage.ipynb + +# Object-Augmented Schemas + +This tutorial covers DataJoint's Object-Augmented Schema (OAS) model. You'll learn: + +- **The OAS concept** β€” Unified relational + object storage +- **Blobs** β€” Storing arrays and Python objects +- **Object storage** β€” Scaling to large datasets +- **Staged insert** β€” Writing directly to object storage (Zarr, HDF5) +- **Attachments** β€” Preserving file names and formats +- **Codecs** β€” How data is serialized and deserialized + +In an Object-Augmented Schema, the relational database and object storage operate as a **single integrated system**β€”not as separate "internal" and "external" components. + + +```python +import datajoint as dj +import numpy as np + +schema = dj.Schema('tutorial_oas') +``` + + +## The Object-Augmented Schema Model + +Scientific data often combines: +- **Structured metadata** β€” Subjects, sessions, parameters (relational) +- **Large data objects** β€” Arrays, images, recordings (binary) + +DataJoint's OAS model manages both as a unified system: + +```mermaid +block-beta + columns 1 + block:oas:1 + columns 2 + OAS["Object-Augmented Schema"]:2 + block:db:1 + DB["Relational Database"] + DB1["Metadata"] + DB2["Keys"] + DB3["Relationships"] + end + block:os:1 + OS["Object Storage (S3/File/etc)"] + OS1["Large arrays"] + OS2["Images/videos"] + OS3["Recordings"] + end + end +``` + +From the user's perspective, this is **one schema**β€”storage location is transparent. + +## Blob Attributes + +Use `` to store arbitrary Python objects: + + +```python +@schema +class Recording(dj.Manual): + definition = """ + recording_id : int + --- + metadata : # Dict, stored in database + waveform : # NumPy array, stored in database + """ +``` + + + +```python +# Insert with blob data +Recording.insert1({ + 'recording_id': 1, + 'metadata': {'channels': 32, 'sample_rate': 30000, 'duration': 60.0}, + 'waveform': np.random.randn(32, 30000) # 32 channels x 1 second +}) + +Recording() +``` + + + +```python +# Fetch blob data +data = (Recording & {'recording_id': 1}).fetch1() +print(f"Metadata: {data['metadata']}") +print(f"Waveform shape: {data['waveform'].shape}") +``` + + +### What Can Be Stored in Blobs? + +The `` codec handles: + +- NumPy arrays (any dtype, any shape) +- Python dicts, lists, tuples, sets +- Strings, bytes, integers, floats +- datetime objects and UUIDs +- Nested combinations of the above + +**Note:** Pandas DataFrames should be converted before storage (e.g., `df.to_dict()` or `df.to_records()`). + + +```python +@schema +class AnalysisResult(dj.Manual): + definition = """ + result_id : int + --- + arrays : + nested_data : + """ + +# Store complex data structures +arrays = {'x': np.array([1, 2, 3]), 'y': np.array([4, 5, 6])} +nested = {'arrays': [np.array([1, 2]), np.array([3, 4])], 'params': {'a': 1, 'b': 2}} + +AnalysisResult.insert1({ + 'result_id': 1, + 'arrays': arrays, + 'nested_data': nested +}) + +# Fetch back +result = (AnalysisResult & {'result_id': 1}).fetch1() +print(f"Arrays type: {type(result['arrays'])}") +print(f"Arrays keys: {result['arrays'].keys()}") +``` + + +## Object Storage with `@` + +For large datasets, add `@` to route data to object storage. The schema remains unifiedβ€”only the physical storage location changes. + +### Configure Object Storage + +First, configure a store: + + +```python +import tempfile +import os + +# Create a store for this tutorial +store_path = tempfile.mkdtemp(prefix='dj_store_') + +# Configure object storage (global settings for staged_insert1) +dj.config.object_storage.protocol = 'file' +dj.config.object_storage.location = store_path +dj.config.object_storage.project_name = 'tutorial' + +# Also configure as a named store for syntax +dj.config.object_storage.stores['tutorial'] = { + 'protocol': 'file', + 'location': store_path +} + +print(f"Store configured at: {store_path}") +``` + + +### Using Object Storage + + +```python +@schema +class LargeRecording(dj.Manual): + definition = """ + recording_id : int + --- + small_data : # In database (small) + large_data : # In object storage (large) + """ +``` + + + +```python +# Insert data - usage is identical regardless of storage +small = np.random.randn(10, 10) +large = np.random.randn(1000, 1000) # ~8 MB array + +LargeRecording.insert1({ + 'recording_id': 1, + 'small_data': small, + 'large_data': large +}) + +LargeRecording() +``` + + + +```python +# Fetch is also identical - storage is transparent +data = (LargeRecording & {'recording_id': 1}).fetch1() +print(f"Small data shape: {data['small_data'].shape}") +print(f"Large data shape: {data['large_data'].shape}") +``` + + + +```python +# Objects are stored in the configured location +for root, dirs, files in os.walk(store_path): + for f in files: + path = os.path.join(root, f) + size = os.path.getsize(path) + print(f"{os.path.relpath(path, store_path)}: {size:,} bytes") +``` + + +### Content-Addressed Storage + +`` uses content-addressed (hash-based) storage. Identical data is stored only once: + + +```python +# Insert the same data twice +shared_data = np.ones((500, 500)) + +LargeRecording.insert([ + {'recording_id': 2, 'small_data': small, 'large_data': shared_data}, + {'recording_id': 3, 'small_data': small, 'large_data': shared_data}, # Same! +]) + +print(f"Rows in table: {len(LargeRecording())}") + +# Deduplication: identical data stored once +files = [f for _, _, fs in os.walk(store_path) for f in fs] +print(f"Files in store: {len(files)}") +``` + + +## Path-Addressed Storage with `` + +While `` uses content-addressed (hash-based) storage with deduplication, `` uses **path-addressed** storage where each row has its own dedicated storage path: + +| Aspect | `` | `` | +|--------|-----------|-------------| +| Addressing | By content hash | By primary key | +| Deduplication | Yes | No | +| Deletion | Garbage collected | With row | +| Use case | Arrays, serialized objects | Zarr, HDF5, multi-file outputs | + +Use `` when you need: +- Hierarchical formats like Zarr or HDF5 +- Direct write access during data generation +- Each row to have its own isolated storage location + + +```python +@schema +class ImagingSession(dj.Manual): + definition = """ + subject_id : int32 + session_id : int32 + --- + n_frames : int32 + frame_rate : float32 + frames : # Zarr array stored at path derived from PK + """ +``` + + +### Staged Insert for Direct Object Storage Writes + +For large datasets like multi-GB imaging recordings, copying data from local storage to object storage is inefficient. The `staged_insert1` context manager lets you **write directly to object storage** before finalizing the database insert: + +1. Set primary key values in `staged.rec` +2. Get a storage handle with `staged.store(field, extension)` +3. Write data directly (e.g., with Zarr) +4. On successful exit, metadata is computed and the record is inserted + + +```python +import zarr + +# Simulate acquiring imaging data frame-by-frame +n_frames = 100 +height, width = 512, 512 + +with ImagingSession.staged_insert1 as staged: + # Set primary key values first + staged.rec['subject_id'] = 1 + staged.rec['session_id'] = 1 + + # Get storage handle for the object field + store = staged.store('frames', '.zarr') + + # Create Zarr array directly in object storage + z = zarr.open(store, mode='w', shape=(n_frames, height, width), + chunks=(10, height, width), dtype='uint16') + + # Write frames as they are "acquired" + for i in range(n_frames): + z[i] = np.random.randint(0, 4096, (height, width), dtype='uint16') + + # Set remaining attributes + staged.rec['n_frames'] = n_frames + staged.rec['frame_rate'] = 30.0 + +# Record is now inserted with metadata computed from the Zarr +ImagingSession() +``` + + + +```python +# Fetch returns an ObjectRef for lazy access +ref = (ImagingSession & {'subject_id': 1, 'session_id': 1}).fetch1('frames') +print(f"Type: {type(ref).__name__}") +print(f"Path: {ref.path}") + +# Open as Zarr array (data stays in object storage) +z = zarr.open(ref.fsmap, mode='r') +print(f"Shape: {z.shape}") +print(f"Chunks: {z.chunks}") +print(f"First frame mean: {z[0].mean():.1f}") +``` + + +### Benefits of Staged Insert + +- **No intermediate copies** β€” Data flows directly to object storage +- **Streaming writes** β€” Write frame-by-frame as data is acquired +- **Atomic transactions** β€” If an error occurs, storage is cleaned up automatically +- **Automatic metadata** β€” File sizes and manifests are computed on finalize + +Use `staged_insert1` when: +- Data is too large to hold in memory +- You're generating data incrementally (e.g., during acquisition) +- You need direct control over storage format (Zarr chunks, HDF5 datasets) + +## Attachments + +Use `` to store files with their original names preserved: + + +```python +@schema +class Document(dj.Manual): + definition = """ + doc_id : int + --- + report : + """ +``` + + + +```python +# Create a sample file +sample_file = os.path.join(tempfile.gettempdir(), 'analysis_report.txt') +with open(sample_file, 'w') as f: + f.write('Analysis Results\n') + f.write('================\n') + f.write('Accuracy: 95.2%\n') + +# Insert using file path directly +Document.insert1({ + 'doc_id': 1, + 'report': sample_file # Just pass the path +}) + +Document() +``` + + + +```python +# Fetch returns path to extracted file +doc_path = (Document & {'doc_id': 1}).fetch1('report') +print(f"Type: {type(doc_path)}") +print(f"Path: {doc_path}") + +# Read the content +with open(doc_path, 'r') as f: + print(f"Content:\n{f.read()}") +``` + + +## Codec Summary + +| Codec | Syntax | Description | +|-------|--------|-------------| +| `` | In database | Python objects, arrays | +| `` | Default store | Large objects, hash-addressed | +| `` | Named store | Specific storage tier | +| `` | In database | Files with names | +| `` | Named store | Large files with names | +| `` | Named store | Path-addressed (Zarr, etc.) | +| `` | Named store | References to existing files | + +## Computed Tables with Large Data + +Computed tables commonly produce large results: + + +```python +@schema +class ProcessedRecording(dj.Computed): + definition = """ + -> LargeRecording + --- + filtered : # Result in object storage + mean_value : float64 + """ + + def make(self, key): + # Fetch source data + data = (LargeRecording & key).fetch1('large_data') + + # Process + from scipy.ndimage import gaussian_filter + filtered = gaussian_filter(data, sigma=2) + + self.insert1({ + **key, + 'filtered': filtered, + 'mean_value': float(np.mean(filtered)) + }) +``` + + + +```python +ProcessedRecording.populate(display_progress=True) +ProcessedRecording() +``` + + +## Efficient Data Access + +### Fetch Only What You Need + + +```python +# Fetch only scalar metadata (fast) +meta = (ProcessedRecording & {'recording_id': 1}).fetch1('mean_value') +print(f"Mean value: {meta}") +``` + + + +```python +# Fetch large data only when needed +filtered = (ProcessedRecording & {'recording_id': 1}).fetch1('filtered') +print(f"Filtered shape: {filtered.shape}") +``` + + +### Project Away Large Columns Before Joins + + +```python +# Efficient: project to scalar columns before join +result = LargeRecording.proj('recording_id') * ProcessedRecording.proj('mean_value') +result +``` + + +## Best Practices + +### 1. Choose Storage Based on Size + +```python +# Small objects (< 1 MB): no @ +parameters : + +# Large objects (> 1 MB): use @ +raw_data : +``` + +### 2. Use Named Stores for Different Tiers + +```python +# Fast local storage for active data +working_data : + +# Cold storage for archives +archived_data : +``` + +### 3. Separate Queryable Metadata from Large Data + +```python +@schema +class Experiment(dj.Manual): + definition = """ + exp_id : int + --- + # Queryable metadata + date : date + duration : float + n_trials : int + # Large data + raw_data : + """ +``` + +### 4. Use Attachments for Files + +```python +# Preserves filename +video : +config_file : +``` + +## Quick Reference + +| Pattern | Use Case | +|---------|----------| +| `` | Small Python objects | +| `` | Large arrays with deduplication | +| `` | Large arrays in specific store | +| `` | Files preserving names | +| `` | Path-addressed data (Zarr, HDF5) | + +## Next Steps + +- [Configure Object Storage](../how-to/configure-storage.md) β€” Set up S3, MinIO, or filesystem stores +- [Custom Codecs](advanced/custom-codecs.ipynb) β€” Define domain-specific types +- [Manage Large Data](../how-to/manage-large-data.md) β€” Performance optimization + + +```python +# Cleanup +schema.drop(prompt=False) +import shutil +shutil.rmtree(store_path, ignore_errors=True) +``` + + +--- +## File: tutorials/07-university.ipynb + +# University Database + +This tutorial builds a complete university registration system to demonstrate: + +- **Schema design** with realistic relationships +- **Data population** using Faker for synthetic data +- **Rich query patterns** from simple to complex + +University databases are classic examples because everyone understands students, courses, enrollments, and grades. The domain naturally demonstrates: + +- One-to-many relationships (department β†’ courses) +- Many-to-many relationships (students ↔ courses via enrollments) +- Workflow dependencies (enrollment requires both student and section to exist) + + +```python +import datajoint as dj +import numpy as np +from datetime import date + +schema = dj.Schema('tutorial_university') +``` + + +## Schema Design + +Our university schema models: + +| Table | Purpose | +|-------|--------| +| `Student` | Student records with contact info | +| `Department` | Academic departments | +| `StudentMajor` | Student-declared majors | +| `Course` | Course catalog | +| `Term` | Academic terms (Spring/Summer/Fall) | +| `Section` | Course offerings in specific terms | +| `Enroll` | Student enrollments in sections | +| `LetterGrade` | Grade scale (lookup) | +| `Grade` | Assigned grades | + + +```python +@schema +class Student(dj.Manual): + definition = """ + student_id : uint32 # university-wide ID + --- + first_name : varchar(40) + last_name : varchar(40) + sex : enum('F', 'M', 'U') + date_of_birth : date + home_city : varchar(60) + home_state : char(2) # US state code + """ +``` + + + +```python +@schema +class Department(dj.Manual): + definition = """ + dept : varchar(6) # e.g. BIOL, CS, MATH + --- + dept_name : varchar(200) + """ +``` + + + +```python +@schema +class StudentMajor(dj.Manual): + definition = """ + -> Student + --- + -> Department + declare_date : date + """ +``` + + + +```python +@schema +class Course(dj.Manual): + definition = """ + -> Department + course : uint32 # course number, e.g. 1010 + --- + course_name : varchar(200) + credits : decimal(3,1) + """ +``` + + + +```python +@schema +class Term(dj.Manual): + definition = """ + term_year : year + term : enum('Spring', 'Summer', 'Fall') + """ +``` + + + +```python +@schema +class Section(dj.Manual): + definition = """ + -> Course + -> Term + section : char(1) + --- + auditorium : varchar(12) + """ +``` + + + +```python +@schema +class Enroll(dj.Manual): + definition = """ + -> Student + -> Section + """ +``` + + + +```python +@schema +class LetterGrade(dj.Lookup): + definition = """ + grade : char(2) + --- + points : decimal(3,2) + """ + contents = [ + ['A', 4.00], ['A-', 3.67], + ['B+', 3.33], ['B', 3.00], ['B-', 2.67], + ['C+', 2.33], ['C', 2.00], ['C-', 1.67], + ['D+', 1.33], ['D', 1.00], + ['F', 0.00] + ] +``` + + + +```python +@schema +class Grade(dj.Manual): + definition = """ + -> Enroll + --- + -> LetterGrade + """ +``` + + + +```python +dj.Diagram(schema) +``` + + +## Populate with Synthetic Data + +We use [Faker](https://faker.readthedocs.io/) to generate realistic student data. + + +```python +import faker +import random + +fake = faker.Faker() +faker.Faker.seed(42) +random.seed(42) +``` + + + +```python +def generate_students(n=500): + """Generate n student records.""" + fake_name = {'F': fake.name_female, 'M': fake.name_male} + for student_id in range(1000, 1000 + n): + sex = random.choice(['F', 'M']) + name = fake_name[sex]().split()[:2] + yield { + 'student_id': student_id, + 'first_name': name[0], + 'last_name': name[-1], + 'sex': sex, + 'date_of_birth': fake.date_between(start_date='-35y', end_date='-17y'), + 'home_city': fake.city(), + 'home_state': fake.state_abbr() + } + +Student.insert(generate_students(500)) +print(f"Inserted {len(Student())} students") +``` + + + +```python +# Departments +Department.insert([ + {'dept': 'CS', 'dept_name': 'Computer Science'}, + {'dept': 'BIOL', 'dept_name': 'Life Sciences'}, + {'dept': 'PHYS', 'dept_name': 'Physics'}, + {'dept': 'MATH', 'dept_name': 'Mathematics'}, +]) + +# Assign majors to ~75% of students +students = Student.keys() +depts = Department.keys() +StudentMajor.insert( + {**s, **random.choice(depts), 'declare_date': fake.date_between(start_date='-4y')} + for s in students if random.random() < 0.75 +) +print(f"{len(StudentMajor())} students declared majors") +``` + + + +```python +# Course catalog +Course.insert([ + ['BIOL', 1010, 'Biology in the 21st Century', 3], + ['BIOL', 2020, 'Principles of Cell Biology', 3], + ['BIOL', 2325, 'Human Anatomy', 4], + ['BIOL', 2420, 'Human Physiology', 4], + ['PHYS', 2210, 'Physics for Scientists I', 4], + ['PHYS', 2220, 'Physics for Scientists II', 4], + ['PHYS', 2060, 'Quantum Mechanics', 3], + ['MATH', 1210, 'Calculus I', 4], + ['MATH', 1220, 'Calculus II', 4], + ['MATH', 2270, 'Linear Algebra', 4], + ['MATH', 2280, 'Differential Equations', 4], + ['CS', 1410, 'Intro to Object-Oriented Programming', 4], + ['CS', 2420, 'Data Structures & Algorithms', 4], + ['CS', 3500, 'Software Practice', 4], + ['CS', 3810, 'Computer Organization', 4], +]) +print(f"{len(Course())} courses in catalog") +``` + + + +```python +# Academic terms 2020-2024 +Term.insert( + {'term_year': year, 'term': term} + for year in range(2020, 2025) + for term in ['Spring', 'Summer', 'Fall'] +) + +# Create sections for each course-term with 1-3 sections +for course in Course.keys(): + for term in Term.keys(): + for sec in 'abc'[:random.randint(1, 3)]: + if random.random() < 0.7: # Not every course offered every term + Section.insert1({ + **course, **term, + 'section': sec, + 'auditorium': f"{random.choice('ABCDEF')}{random.randint(100, 400)}" + }, skip_duplicates=True) + +print(f"{len(Section())} sections created") +``` + + + +```python +# Enroll students in courses +terms = Term.keys() +for student in Student.keys(): + # Each student enrolls over 2-6 random terms + student_terms = random.sample(terms, k=random.randint(2, 6)) + for term in student_terms: + # Take 2-4 courses per term + available = (Section & term).keys() + if available: + for section in random.sample(available, k=min(random.randint(2, 4), len(available))): + Enroll.insert1({**student, **section}, skip_duplicates=True) + +print(f"{len(Enroll())} enrollments") +``` + + + +```python +# Assign grades to ~90% of enrollments (some incomplete) +grades = LetterGrade.to_arrays('grade') +# Weight toward B/C range +weights = [5, 8, 10, 15, 12, 10, 15, 10, 5, 5, 5] + +for enroll in Enroll.keys(): + if random.random() < 0.9: + Grade.insert1({**enroll, 'grade': random.choices(grades, weights=weights)[0]}) + +print(f"{len(Grade())} grades assigned") +``` + + +## Querying Data + +DataJoint queries are composable expressions. Displaying a query shows a preview; use `fetch()` to retrieve data. + + +```python +dj.config['display.limit'] = 8 # Limit preview rows +``` + + +### Restriction (`&` and `-`) + +Filter rows using `&` (keep matching) or `-` (remove matching). + + +```python +# Students from California +Student & {'home_state': 'CA'} +``` + + + +```python +# Female students NOT from California +(Student & {'sex': 'F'}) - {'home_state': 'CA'} +``` + + + +```python +# SQL-style string conditions +Student & 'home_state IN ("CA", "TX", "NY")' +``` + + + +```python +# OR conditions using a list +Student & [{'home_state': 'CA'}, {'home_state': 'TX'}] +``` + + +### Subqueries in Restrictions + +Use another query as a restriction condition. + + +```python +# Students majoring in Computer Science +Student & (StudentMajor & {'dept': 'CS'}) +``` + + + +```python +# Students who have NOT taken any Math courses +Student - (Enroll & {'dept': 'MATH'}) +``` + + + +```python +# Students with ungraded enrollments (enrolled but no grade yet) +Student & (Enroll - Grade) +``` + + + +```python +# All-A students: have grades AND no non-A grades +all_a = (Student & Grade) - (Grade - {'grade': 'A'}) +all_a +``` + + +### Projection (`.proj()`) + +Select, rename, or compute attributes. + + +```python +# Select specific attributes +Student.proj('first_name', 'last_name') +``` + + + +```python +# Computed attribute: full name +Student.proj(full_name="CONCAT(first_name, ' ', last_name)") +``` + + + +```python +# Calculate age in years +Student.proj('first_name', 'last_name', + age='TIMESTAMPDIFF(YEAR, date_of_birth, CURDATE())') +``` + + + +```python +# Keep all attributes plus computed ones with ... +Student.proj(..., age='TIMESTAMPDIFF(YEAR, date_of_birth, CURDATE())') +``` + + + +```python +# Exclude specific attributes with - +Student.proj(..., '-date_of_birth') +``` + + + +```python +# Rename attribute +Student.proj('first_name', family_name='last_name') +``` + + +### Universal Set (`dj.U()`) + +The universal set `dj.U()` extracts unique values of specified attributes. + + +```python +# All unique first names +dj.U('first_name') & Student +``` + + + +```python +# All unique home states of enrolled students +dj.U('home_state') & (Student & Enroll) +``` + + + +```python +# Birth years of students in CS courses +dj.U('birth_year') & ( + Student.proj(birth_year='YEAR(date_of_birth)') & (Enroll & {'dept': 'CS'}) +) +``` + + +### Join (`*`) + +Combine tables on matching attributes. + + +```python +# Students with their declared majors +Student.proj('first_name', 'last_name') * StudentMajor +``` + + + +```python +# Courses with department names +Course * Department.proj('dept_name') +``` + + + +```python +# Left join: all students, including those without majors (NULL for unmatched) +Student.proj('first_name', 'last_name').join(StudentMajor, left=True) +``` + + + +```python +# Multi-table join: grades with student names and course info +(Student.proj('first_name', 'last_name') + * Grade + * Course.proj('course_name', 'credits')) +``` + + +### Aggregation (`.aggr()`) + +Group rows and compute aggregate statistics. + + +```python +# Number of students per department +Department.aggr(StudentMajor, n_students='COUNT(*)') +``` + + + +```python +# Breakdown by sex per department +Department.aggr( + StudentMajor * Student, + n_female='SUM(sex="F")', + n_male='SUM(sex="M")' +) +``` + + + +```python +# Enrollment counts per course (with course name) +Course.aggr(Enroll, ..., n_enrolled='COUNT(*)') +``` + + + +```python +# Average grade points per course +Course.aggr( + Grade * LetterGrade, + 'course_name', + avg_gpa='AVG(points)', + n_grades='COUNT(*)' +) +``` + + +### Complex Queries + +Combine operators to answer complex questions. + + +```python +# Student GPA: weighted average of grade points by credits +student_gpa = Student.aggr( + Grade * LetterGrade * Course, + 'first_name', 'last_name', + total_credits='SUM(credits)', + gpa='SUM(points * credits) / SUM(credits)' +) +student_gpa +``` + + + +```python +# Top 5 students by GPA (with at least 12 credits) +student_gpa & 'total_credits >= 12' & dj.Top(5, order_by='gpa DESC') +``` + + + +```python +# Students who have taken courses in ALL departments +# (i.e., no department exists where they haven't enrolled) +all_depts = Student - ( + Student.proj() * Department - Enroll.proj('student_id', 'dept') +) +all_depts.proj('first_name', 'last_name') +``` + + + +```python +# Most popular courses (by enrollment) per department +course_enrollment = Course.aggr(Enroll, ..., n='COUNT(*)') + +# For each department, find the max enrollment +max_per_dept = Department.aggr(course_enrollment, max_n='MAX(n)') + +# Join to find courses matching the max +course_enrollment * max_per_dept & 'n = max_n' +``` + + + +```python +# Grade distribution: count of each grade across all courses +LetterGrade.aggr(Grade, ..., count='COUNT(*)') & 'count > 0' +``` + + +### Fetching Results + +Use the fetch methods to retrieve data into Python: +- `to_dicts()` β€” list of dictionaries +- `to_arrays()` β€” numpy arrays +- `to_pandas()` β€” pandas DataFrame +- `fetch1()` β€” single row (query must return exactly one row) + + +```python +# Fetch as numpy recarray +data = (Student & {'home_state': 'CA'}).to_arrays() +print(f"Type: {type(data).__name__}, shape: {data.shape}") +data[:3] +``` + + + +```python +# Fetch as list of dicts +(Student & {'home_state': 'CA'}).to_dicts(limit=3) +``` + + + +```python +# Fetch specific attributes as arrays +first_names, last_names = (Student & {'home_state': 'CA'}).to_arrays('first_name', 'last_name') +list(zip(first_names, last_names))[:5] +``` + + + +```python +# Fetch single row with fetch1 +student = (Student & {'student_id': 1000}).fetch1() +print(f"{student['first_name']} {student['last_name']} from {student['home_city']}, {student['home_state']}") +``` + + + +```python +# Fetch as pandas DataFrame +(student_gpa & 'total_credits >= 12').to_pandas().sort_values('gpa', ascending=False).head(10) +``` + + +## Summary + +This tutorial demonstrated: + +| Operation | Syntax | Purpose | +|-----------|--------|--------| +| Restriction | `A & cond` | Keep matching rows | +| Anti-restriction | `A - cond` | Remove matching rows | +| Projection | `A.proj(...)` | Select/compute attributes | +| Join | `A * B` | Combine tables | +| Left join | `A.join(B, left=True)` | Keep all rows from A | +| Aggregation | `A.aggr(B, ...)` | Group and aggregate | +| Universal | `dj.U('attr') & A` | Unique values | +| Top | `A & dj.Top(n, order_by=...)` | Limit/order results | +| Fetch keys | `A.keys()` | Primary key dicts | +| Fetch arrays | `A.to_arrays(...)` | Numpy arrays | +| Fetch dicts | `A.to_dicts()` | List of dicts | +| Fetch pandas | `A.to_pandas()` | DataFrame | +| Fetch one | `A.fetch1()` | Single row dict | + + +```python +# Cleanup +schema.drop(prompt=False) +``` + + +--- +## File: tutorials/08-fractal-pipeline.ipynb + +# Fractal Image Pipeline + +This tutorial demonstrates **computed tables** by building an image processing pipeline for Julia fractals. + +You'll learn: +- **Manual tables**: Parameters you define (experimental configurations) +- **Lookup tables**: Fixed reference data (processing methods) +- **Computed tables**: Automatically generated results via `populate()` +- **Many-to-many pipelines**: Processing every combination of inputs Γ— methods + + +```python +import datajoint as dj +import numpy as np +from matplotlib import pyplot as plt + +schema = dj.Schema('tutorial_fractal') +``` + + +## Julia Set Generator + +Julia sets are fractals generated by iterating $f(z) = z^2 + c$ for each point in the complex plane. Points that don't escape to infinity form intricate patterns. + + +```python +def julia(c, size=256, center=(0.0, 0.0), zoom=1.0, iters=256): + """Generate a Julia set image.""" + x, y = np.meshgrid( + np.linspace(-1, 1, size) / zoom + center[0], + np.linspace(-1, 1, size) / zoom + center[1] + ) + z = x + 1j * y + img = np.zeros(z.shape) + mask = np.ones(z.shape, dtype=bool) + for _ in range(iters): + z[mask] = z[mask] ** 2 + c + mask = np.abs(z) < 2 + img += mask + return img +``` + + + +```python +# Example fractal +plt.imshow(julia(-0.4 + 0.6j), cmap='magma') +plt.axis('off'); +``` + + +## Pipeline Architecture + +We'll build a pipeline with four tables: + +- **JuliaSpec** (Manual): Parameters we define for fractal generation +- **JuliaImage** (Computed): Generated from specs +- **DenoiseMethod** (Lookup): Fixed set of denoising algorithms +- **Denoised** (Computed): Each image Γ— each method + +After defining all tables, we'll visualize the schema with `dj.Diagram(schema)`. + + +```python +@schema +class JuliaSpec(dj.Manual): + """Parameters for generating Julia fractals.""" + definition = """ + spec_id : uint8 + --- + c_real : float64 # Real part of c + c_imag : float64 # Imaginary part of c + noise_level = 50 : float64 + """ +``` + + + +```python +@schema +class JuliaImage(dj.Computed): + """Generated fractal images with noise.""" + definition = """ + -> JuliaSpec + --- + image : # Generated fractal image + """ + + def make(self, key): + spec = (JuliaSpec & key).fetch1() + img = julia(spec['c_real'] + 1j * spec['c_imag']) + img += np.random.randn(*img.shape) * spec['noise_level'] + self.insert1({**key, 'image': img.astype(np.float32)}) +``` + + + +```python +from skimage import filters, restoration +from skimage.morphology import disk + +@schema +class DenoiseMethod(dj.Lookup): + """Image denoising algorithms.""" + definition = """ + method_id : uint8 + --- + method_name : varchar(20) + params : + """ + contents = [ + [0, 'gaussian', {'sigma': 1.8}], + [1, 'median', {'radius': 3}], + [2, 'tv', {'weight': 20.0}], + ] +``` + + + +```python +@schema +class Denoised(dj.Computed): + """Denoised images: each image Γ— each method.""" + definition = """ + -> JuliaImage + -> DenoiseMethod + --- + denoised : + """ + + def make(self, key): + img = (JuliaImage & key).fetch1('image') + method, params = (DenoiseMethod & key).fetch1('method_name', 'params') + + if method == 'gaussian': + result = filters.gaussian(img, **params) + elif method == 'median': + result = filters.median(img, disk(params['radius'])) + elif method == 'tv': + result = restoration.denoise_tv_chambolle(img, **params) + else: + raise ValueError(f"Unknown method: {method}") + + self.insert1({**key, 'denoised': result.astype(np.float32)}) +``` + + + +```python +dj.Diagram(schema) +``` + + +## Running the Pipeline + +1. Insert specs into Manual table +2. Call `populate()` on Computed tables + + +```python +# Define fractal parameters +JuliaSpec.insert([ + {'spec_id': 0, 'c_real': -0.4, 'c_imag': 0.6}, + {'spec_id': 1, 'c_real': -0.74543, 'c_imag': 0.11301}, + {'spec_id': 2, 'c_real': -0.1, 'c_imag': 0.651}, + {'spec_id': 3, 'c_real': -0.835, 'c_imag': -0.2321}, +]) +JuliaSpec() +``` + + + +```python +# Generate all fractal images +JuliaImage.populate(display_progress=True) +``` + + + +```python +# View generated images +fig, axes = plt.subplots(1, 4, figsize=(12, 3)) +for ax, row in zip(axes, JuliaImage()): + ax.imshow(row['image'], cmap='magma') + ax.set_title(f"spec_id={row['spec_id']}") + ax.axis('off') +plt.tight_layout() +``` + + + +```python +# Apply all denoising methods to all images +Denoised.populate(display_progress=True) +``` + + + +```python +# 4 images Γ— 3 methods = 12 results +print(f"JuliaImage: {len(JuliaImage())} rows") +print(f"DenoiseMethod: {len(DenoiseMethod())} rows") +print(f"Denoised: {len(Denoised())} rows") +``` + + + +```python +# Compare denoising methods on one image +spec_id = 0 +original = (JuliaImage & {'spec_id': spec_id}).fetch1('image') + +fig, axes = plt.subplots(1, 4, figsize=(14, 3.5)) +axes[0].imshow(original, cmap='magma') +axes[0].set_title('Original (noisy)') + +for ax, method_id in zip(axes[1:], [0, 1, 2]): + result = (Denoised & {'spec_id': spec_id, 'method_id': method_id}).fetch1('denoised') + method_name = (DenoiseMethod & {'method_id': method_id}).fetch1('method_name') + ax.imshow(result, cmap='magma') + ax.set_title(method_name) + +for ax in axes: + ax.axis('off') +plt.tight_layout() +``` + + +## Key Points + +| Table Type | Populated By | Use For | +|------------|-------------|--------| +| **Manual** | `insert()` | Experimental parameters, user inputs | +| **Lookup** | `contents` attribute | Fixed reference data, method catalogs | +| **Computed** | `populate()` | Derived results, processed outputs | + +The pipeline automatically: +- Tracks dependencies (can't process an image that doesn't exist) +- Skips already-computed results (idempotent) +- Computes all combinations when multiple tables converge + + +```python +# Add a new spec β€” populate only computes what's missing +JuliaSpec.insert1({'spec_id': 4, 'c_real': -0.7, 'c_imag': 0.27}) + +JuliaImage.populate(display_progress=True) # Only spec_id=4 +Denoised.populate(display_progress=True) # Only spec_id=4 Γ— 3 methods +``` + + + +```python +# Cleanup +schema.drop(prompt=False) +``` + + +--- +## File: tutorials/advanced/custom-codecs.ipynb + +# Custom Codecs + +This tutorial covers extending DataJoint's type system. You'll learn: + +- **Codec basics** β€” Encoding and decoding +- **Creating codecs** β€” Domain-specific types +- **Codec chaining** β€” Composing codecs + + +```python +import datajoint as dj +import numpy as np + +schema = dj.Schema('tutorial_codecs') +``` + + +## Creating a Custom Codec + + +```python +import networkx as nx + +class GraphCodec(dj.Codec): + """Store NetworkX graphs.""" + + name = "graph" # Use as + + def get_dtype(self, is_external: bool) -> str: + return "" + + def encode(self, value, *, key=None, store_name=None): + return {'nodes': list(value.nodes(data=True)), 'edges': list(value.edges(data=True))} + + def decode(self, stored, *, key=None): + g = nx.Graph() + g.add_nodes_from(stored['nodes']) + g.add_edges_from(stored['edges']) + return g + + def validate(self, value): + if not isinstance(value, nx.Graph): + raise TypeError(f"Expected nx.Graph") +``` + + + +```python +@schema +class Connectivity(dj.Manual): + definition = """ + conn_id : int + --- + network : + """ +``` + + + +```python +# Create and insert +g = nx.Graph() +g.add_edges_from([(1, 2), (2, 3), (1, 3)]) +Connectivity.insert1({'conn_id': 1, 'network': g}) + +# Fetch +result = (Connectivity & {'conn_id': 1}).fetch1('network') +print(f"Type: {type(result)}") +print(f"Edges: {list(result.edges())}") +``` + + +## Codec Structure + +```python +class MyCodec(dj.Codec): + name = "mytype" # Use as + + def get_dtype(self, is_external: bool) -> str: + return "" # Storage type + + def encode(self, value, *, key=None, store_name=None): + return serializable_data + + def decode(self, stored, *, key=None): + return python_object + + def validate(self, value): # Optional + pass +``` + +## Example: Spike Train + + +```python +from dataclasses import dataclass + +@dataclass +class SpikeTrain: + times: np.ndarray + unit_id: int + quality: str + +class SpikeTrainCodec(dj.Codec): + name = "spike_train" + + def get_dtype(self, is_external: bool) -> str: + return "" + + def encode(self, value, *, key=None, store_name=None): + return {'times': value.times, 'unit_id': value.unit_id, 'quality': value.quality} + + def decode(self, stored, *, key=None): + return SpikeTrain(times=stored['times'], unit_id=stored['unit_id'], quality=stored['quality']) +``` + + + +```python +@schema +class Unit(dj.Manual): + definition = """ + unit_id : int + --- + spikes : + """ + +train = SpikeTrain(times=np.sort(np.random.uniform(0, 100, 50)), unit_id=1, quality='good') +Unit.insert1({'unit_id': 1, 'spikes': train}) + +result = (Unit & {'unit_id': 1}).fetch1('spikes') +print(f"Type: {type(result)}, Spikes: {len(result.times)}") +``` + + + +```python +schema.drop(prompt=False) +``` + + +--- +## File: tutorials/advanced/distributed.ipynb + +# Distributed Computing + +This tutorial covers running computations across multiple workers. You'll learn: + +- **Jobs 2.0** β€” DataJoint's job coordination system +- **Multi-process** β€” Parallel workers on one machine +- **Multi-machine** β€” Cluster-scale computation +- **Error handling** β€” Recovery and monitoring + + +```python +import datajoint as dj +import numpy as np +import time + +schema = dj.Schema('tutorial_distributed') + +# Clean up from previous runs +schema.drop(prompt=False) +schema = dj.Schema('tutorial_distributed') +``` + + +## Setup + + +```python +@schema +class Experiment(dj.Manual): + definition = """ + exp_id : int + --- + n_samples : int + """ + +@schema +class Analysis(dj.Computed): + definition = """ + -> Experiment + --- + result : float64 + compute_time : float32 + """ + + def make(self, key): + start = time.time() + n = (Experiment & key).fetch1('n_samples') + result = float(np.mean(np.random.randn(n) ** 2)) + time.sleep(0.1) + self.insert1({**key, 'result': result, 'compute_time': time.time() - start}) +``` + + + +```python +Experiment.insert([{'exp_id': i, 'n_samples': 10000} for i in range(20)]) +print(f"To compute: {len(Analysis.key_source - Analysis)}") +``` + + +## Direct vs Distributed Mode + +**Direct mode** (default): No coordination, suitable for single worker. + +**Distributed mode** (`reserve_jobs=True`): Workers coordinate via jobs table. + + +```python +# Distributed mode +Analysis.populate(reserve_jobs=True, max_calls=5, display_progress=True) +``` + + +## The Jobs Table + + +```python +# Refresh job queue +result = Analysis.jobs.refresh() +print(f"Added: {result['added']}") + +# Check status +for status, count in Analysis.jobs.progress().items(): + print(f"{status}: {count}") +``` + + +## Multi-Process and Multi-Machine + +The `processes=N` parameter spawns multiple worker processes on one machine. However, this requires table classes to be defined in importable Python modules (not notebooks), because multiprocessing needs to pickle and transfer the class definitions to worker processes. + +For production use, define your tables in a module and run workers as scripts: + +```python +# pipeline.py - Define your tables +import datajoint as dj +schema = dj.Schema('my_pipeline') + +@schema +class Analysis(dj.Computed): + definition = """...""" + def make(self, key): ... +``` + +```python +# worker.py - Run workers +from pipeline import Analysis + +# Single machine, 4 processes +Analysis.populate(reserve_jobs=True, processes=4) + +# Or run this script on multiple machines +while True: + result = Analysis.populate(reserve_jobs=True, max_calls=100, suppress_errors=True) + if result['success_count'] == 0: + break +``` + +In this notebook, we'll demonstrate distributed coordination with a single process: + + +```python +# Complete remaining jobs with distributed coordination +Analysis.populate(reserve_jobs=True, display_progress=True) +print(f"Computed: {len(Analysis())}") +``` + + +## Error Handling + + +```python +# View errors +print(f"Errors: {len(Analysis.jobs.errors)}") + +# Retry failed jobs +Analysis.jobs.errors.delete() +Analysis.populate(reserve_jobs=True, suppress_errors=True) +``` + + +## Quick Reference + +| Option | Description | +|--------|-------------| +| `reserve_jobs=True` | Enable coordination | +| `processes=N` | N worker processes | +| `max_calls=N` | Limit jobs per run | +| `suppress_errors=True` | Continue on errors | + + +```python +schema.drop(prompt=False) +``` + + +--- +## File: tutorials/advanced/json-type.ipynb + +# JSON Data Type + +This tutorial covers the `json` data type in DataJoint, which allows storing semi-structured data within tables. You'll learn: + +- When to use the JSON type +- Defining tables with JSON attributes +- Inserting JSON data +- Querying and filtering JSON fields +- Projecting JSON subfields + +## Prerequisites + +- **MySQL 8.0+** with `JSON_VALUE` function support +- Percona is fully compatible +- MariaDB is **not supported** (different `JSON_VALUE` syntax) + + +```python +import datajoint as dj +``` + + +## Table Definition + +For this exercise, let's imagine we work for an awesome company that is organizing a fun RC car race across various teams in the company. Let's see which team has the fastest car! 🏎️ + +This establishes 2 important entities: a `Team` and a `Car`. Normally the entities are mapped to their own dedicated table, however, let's assume that `Team` is well-structured but `Car` is less structured than we'd prefer. In other words, the structure for what makes up a *car* is varying too much between entries (perhaps because users of the pipeline haven't agreed yet on the definition? 🀷). + +This would make it a good use-case to keep `Team` as a table but make `Car` a `json` type defined within the `Team` table. + +Let's begin. + + +```python +import datajoint as dj + +# Clean up any existing schema from previous runs +schema = dj.Schema('tutorial_json', create_tables=False) +schema.drop() + +# Create fresh schema +schema = dj.Schema('tutorial_json') +``` + + + +```python +@schema +class Team(dj.Lookup): + definition = """ + # A team within a company + name: varchar(40) # team name + --- + car=null: json # A car belonging to a team (null to allow registering first but specifying car later) + + unique index(car.length:decimal(4, 1)) # Add an index if this key is frequently accessed + """ +``` + + +## Insert + +Let's suppose that engineering is first up to register their car. + + +```python +Team.insert1( + { + "name": "engineering", + "car": { + "name": "Rever", + "length": 20.5, + "inspected": True, + "tire_pressure": [32, 31, 33, 34], + "headlights": [ + { + "side": "left", + "hyper_white": None, + }, + { + "side": "right", + "hyper_white": None, + }, + ], + }, + } +) +``` + + +Next, business and marketing teams are up and register their cars. + +A few points to notice below: +- The person signing up on behalf of marketing does not know the specifics of the car during registration but another team member will be updating this soon before the race. +- Notice how the `business` and `engineering` teams appear to specify the same property but refer to it as `safety_inspected` and `inspected` respectfully. + + +```python +Team.insert( + [ + { + "name": "marketing", + "car": None, + }, + { + "name": "business", + "car": { + "name": "Chaching", + "length": 100, + "safety_inspected": False, + "tire_pressure": [34, 30, 27, 32], + "headlights": [ + { + "side": "left", + "hyper_white": True, + }, + { + "side": "right", + "hyper_white": True, + }, + ], + }, + }, + ] +) +``` + + +We can preview the table data much like normal but notice how the value of `car` behaves like other BLOB-like attributes. + + +```python +Team() +``` + + +## Restriction + +Now let's see what kinds of queries we can form to demostrate how we can query this pipeline. + + +```python +# Which team has a `car` equal to 100 inches long? +Team & {"car.length": 100} +``` + + + +```python +# Which team has a `car` less than 50 inches long? +Team & "car->>'$.length' < 50" +``` + + + +```python +# Any team that has had their car inspected? +Team & [{"car.inspected:unsigned": True}, {"car.safety_inspected:unsigned": True}] +``` + + + +```python +# Which teams do not have hyper white lights for their first head light? +Team & {"car.headlights[0].hyper_white": None} +``` + + +Notice that the previous query will satisfy the `None` check if it experiences any of the following scenarious: +- if entire record missing (`marketing` satisfies this) +- JSON key is missing +- JSON value is set to JSON `null` (`engineering` satisfies this) + +## Projection + +Projections can be quite useful with the `json` type since we can extract out just what we need. This allows greater query flexibility but more importantly, for us to be able to fetch only what is pertinent. + + +```python +# Only interested in the car names and the length but let the type be inferred +q_untyped = Team.proj( + car_name="car.name", + car_length="car.length", +) +q_untyped +``` + + + +```python +q_untyped.to_dicts() +``` + + + +```python +# Nevermind, I'll specify the type explicitly +q_typed = Team.proj( + car_name="car.name", + car_length="car.length:float", +) +q_typed +``` + + + +```python +q_typed.to_dicts() +``` + + +## Describe + +Lastly, the `.describe()` function on the `Team` table can help us generate the table's definition. This is useful if we are connected directly to the pipeline without the original source. + + +```python +rebuilt_definition = Team.describe() +print(rebuilt_definition) +``` + + +## Cleanup + +Finally, let's clean up what we created in this tutorial. + + +```python +schema.drop(prompt=False) +``` + + + +```python + +``` + + +--- +## File: tutorials/advanced/migration.ipynb + +# Schema Migration + +This tutorial covers evolving existing pipelines. You'll learn: + +- **Schema changes** β€” Adding and modifying columns +- **The alter() method** β€” Syncing definitions with database +- **Migration patterns** β€” Safe evolution strategies +- **Limitations** β€” What cannot be changed + + +```python +import datajoint as dj +import numpy as np + +schema = dj.Schema('tutorial_migration') +``` + + +## Initial Schema + + +```python +@schema +class Subject(dj.Manual): + definition = """ + subject_id : varchar(16) + --- + species : varchar(32) + """ + +Subject.insert([ + {'subject_id': 'M001', 'species': 'mouse'}, + {'subject_id': 'M002', 'species': 'mouse'}, +]) +Subject() +``` + + +## Adding a Column + +Update definition, then call `alter()`: + + +```python +# Update definition +Subject.definition = """ +subject_id : varchar(16) +--- +species : varchar(32) +weight = null : float32 # New column +""" + +# Apply change +Subject.alter(prompt=False) +Subject() +``` + + +## Modifying Column Type + + +```python +# Widen varchar +Subject.definition = """ +subject_id : varchar(16) +--- +species : varchar(100) # Was 32 +weight = null : float32 +""" + +Subject.alter(prompt=False) +print(Subject.describe()) +``` + + +## What Can Be Altered + +| Change | Supported | +|--------|----------| +| Add columns | Yes | +| Drop columns | Yes | +| Modify types | Yes | +| Rename columns | Yes | +| **Primary keys** | **No** | +| **Foreign keys** | **No** | +| **Indexes** | **No** | + +## Migration Pattern for Unsupported Changes + +For primary key or foreign key changes: + +```python +# 1. Create new table +@schema +class SubjectNew(dj.Manual): + definition = """...new structure...""" + +# 2. Migrate data +for row in Subject().to_dicts(): + SubjectNew.insert1(transform(row)) + +# 3. Update dependents +# 4. Drop old table +# 5. Rename if needed +``` + +## DataJoint 2.0 Migration + +Upgrading from 0.x: + +| 0.x | 2.0 | +|-----|-----| +| `longblob` | `` | +| `blob@store` | `` | +| `attach` | `` | +| `schema.jobs` | `Table.jobs` | + + +```python +# Migrate blob columns +from datajoint.migrate import analyze_blob_columns, migrate_blob_columns + +# Find columns needing migration +# results = analyze_blob_columns(schema) + +# Apply (adds codec markers) +# migrate_blob_columns(schema, dry_run=False) +``` + + +## Best Practices + +1. **Test in development first** +2. **Backup before migration** +3. **Plan primary keys carefully** β€” they can't change +4. **Use versioned migration scripts** for production + + +```python +schema.drop(prompt=False) +``` + + +--- +## File: tutorials/index.md + +# Tutorials + +Learn DataJoint by building real pipelines. + +These tutorials guide you through building data pipelines step by step. Each tutorial +is a Jupyter notebook that you can run interactively. Start with the basics and +progress to advanced topics. + +## Getting Started + +1. [Getting Started](01-getting-started.ipynb) β€” Your first DataJoint pipeline +2. [Schema Design](02-schema-design.ipynb) β€” Tables, keys, and relationships +3. [Data Entry](03-data-entry.ipynb) β€” Inserting and managing data +4. [Queries](04-queries.ipynb) β€” Operators and fetching results +5. [Computation](05-computation.ipynb) β€” Imported and Computed tables +6. [Object-Augmented Schemas](06-object-storage.ipynb) β€” Blobs, attachments, and object storage +7. [University Database](07-university.ipynb) β€” A complete example pipeline +8. [Fractal Pipeline](08-fractal-pipeline.ipynb) β€” Iterative computation patterns + +## Advanced Topics + +- [JSON Data Type](advanced/json-type.ipynb) β€” Semi-structured data in tables +- [Distributed Computing](advanced/distributed.ipynb) β€” Multi-process and cluster workflows +- [Custom Codecs](advanced/custom-codecs.ipynb) β€” Extending the type system +- [Schema Migration](advanced/migration.ipynb) β€” Evolving existing pipelines + +## Running the Tutorials + +```bash +# Clone the repository +git clone https://github.com/datajoint/datajoint-docs.git +cd datajoint-docs + +# Start the tutorial environment +docker compose up -d + +# Launch Jupyter +jupyter lab src/tutorials/ +``` + +All tutorials use a local MySQL database that resets between sessions. + + +============================================================ +# How-To Guides +============================================================ + + +--- +## File: how-to/alter-tables.md + +# Alter Tables + +Modify existing table structures for schema evolution. + +## Basic Alter + +Sync table definition with code: + +```python +# Update definition in code, then: +MyTable.alter() +``` + +This compares the current code definition with the database and generates `ALTER TABLE` statements. + +## What Can Be Altered + +| Change | Supported | +|--------|-----------| +| Add columns | Yes | +| Drop columns | Yes | +| Modify column types | Yes | +| Rename columns | Yes | +| Change defaults | Yes | +| Update table comment | Yes | +| **Modify primary key** | **No** | +| **Add/remove foreign keys** | **No** | +| **Modify indexes** | **No** | + +## Add a Column + +```python +# Original +@schema +class Subject(dj.Manual): + definition = """ + subject_id : varchar(16) + --- + species : varchar(32) + """ + +# Updated - add column +@schema +class Subject(dj.Manual): + definition = """ + subject_id : varchar(16) + --- + species : varchar(32) + weight = null : float32 # New column + """ + +# Apply change +Subject.alter() +``` + +## Drop a Column + +Remove from definition and alter: + +```python +# Column 'old_field' removed from definition +Subject.alter() +``` + +## Modify Column Type + +```python +# Change varchar(32) to varchar(100) +@schema +class Subject(dj.Manual): + definition = """ + subject_id : varchar(16) + --- + species : varchar(100) # Was varchar(32) + """ + +Subject.alter() +``` + +## Rename a Column + +DataJoint tracks renames via comment metadata: + +```python +# Original: species +# Renamed to: species_name +@schema +class Subject(dj.Manual): + definition = """ + subject_id : varchar(16) + --- + species_name : varchar(32) # Renamed from 'species' + """ + +Subject.alter() +``` + +## Skip Confirmation + +```python +# Apply without prompting +Subject.alter(prompt=False) +``` + +## View Pending Changes + +Check what would change without applying: + +```python +# Show current definition +print(Subject.describe()) + +# Compare with code definition +# (alter() shows diff before prompting) +``` + +## Unsupported Changes + +### Primary Key Changes + +Cannot modify primary key attributes: + +```python +# This will raise NotImplementedError +@schema +class Subject(dj.Manual): + definition = """ + new_id : uuid # Changed primary key + --- + species : varchar(32) + """ + +Subject.alter() # Error! +``` + +**Workaround**: Create new table, migrate data, drop old table. + +### Foreign Key Changes + +Cannot add or remove foreign key references: + +```python +# Cannot add new FK via alter() +definition = """ +subject_id : varchar(16) +--- +-> NewReference # Cannot add via alter +species : varchar(32) +""" +``` + +**Workaround**: Drop dependent tables, recreate with new structure. + +### Index Changes + +Cannot modify indexes via alter: + +```python +# Cannot add/remove indexes via alter() +definition = """ +subject_id : varchar(16) +--- +index(species) # Cannot add via alter +species : varchar(32) +""" +``` + +## Migration Pattern + +For unsupported changes, use this pattern: + +```python +# 1. Create new table with desired structure +@schema +class SubjectNew(dj.Manual): + definition = """ + subject_id : uuid # New primary key type + --- + species : varchar(32) + """ + +# 2. Migrate data +for row in Subject().to_dicts(): + SubjectNew.insert1({ + 'subject_id': uuid.uuid4(), # Generate new keys + 'species': row['species'] + }) + +# 3. Update dependent tables +# 4. Drop old table +# 5. Rename new table (if needed, via SQL) +``` + +## Add Job Metadata Columns + +For tables created before enabling job metadata: + +```python +from datajoint.migrate import add_job_metadata_columns + +# Dry run +add_job_metadata_columns(ProcessedData, dry_run=True) + +# Apply +add_job_metadata_columns(ProcessedData, dry_run=False) +``` + +## Best Practices + +### Plan Schema Carefully + +Primary keys and foreign keys cannot be changed easily. Design carefully upfront. + +### Use Migrations for Production + +For production systems, use versioned migration scripts: + +```python +# migrations/001_add_weight_column.py +def upgrade(): + Subject.alter(prompt=False) + +def downgrade(): + # Reverse the change + pass +``` + +### Test in Development First + +Always test schema changes on a copy: + +```python +# Clone schema for testing +test_schema = dj.Schema('test_' + schema.database) +``` + +## See Also + +- [Define Tables](define-tables.md) β€” Table definition syntax +- [Migrate from 0.x](migrate-from-0x.md) β€” Version migration + + +--- +## File: how-to/backup-restore.md + +# Backup and Restore + +Protect your data with proper backup strategies. + +> **Tip:** [DataJoint.com](https://datajoint.com) provides automatic backups with point-in-time recovery as part of the managed service. + +## Overview + +A complete DataJoint backup includes: +1. **Database** β€” Table structures and relational data +2. **Object storage** β€” Large objects stored externally + +## Database Backup + +### Using mysqldump + +```bash +# Backup single schema +mysqldump -h host -u user -p database_name > backup.sql + +# Backup multiple schemas +mysqldump -h host -u user -p --databases schema1 schema2 > backup.sql + +# Backup all schemas +mysqldump -h host -u user -p --all-databases > backup.sql +``` + +### Include Routines and Triggers + +```bash +mysqldump -h host -u user -p \ + --routines \ + --triggers \ + database_name > backup.sql +``` + +### Compressed Backup + +```bash +mysqldump -h host -u user -p database_name | gzip > backup.sql.gz +``` + +## Database Restore + +```bash +# From SQL file +mysql -h host -u user -p database_name < backup.sql + +# From compressed file +gunzip < backup.sql.gz | mysql -h host -u user -p database_name +``` + +## Object Storage Backup + +### Filesystem Store + +```bash +# Sync to backup location +rsync -av /data/datajoint-store/ /backup/datajoint-store/ + +# With compression +tar -czvf store-backup.tar.gz /data/datajoint-store/ +``` + +### S3/MinIO Store + +```bash +# Using AWS CLI +aws s3 sync s3://source-bucket s3://backup-bucket + +# Using MinIO client +mc mirror source/bucket backup/bucket +``` + +## Backup Script Example + +```bash +#!/bin/bash +# backup-datajoint.sh + +DATE=$(date +%Y%m%d_%H%M%S) +BACKUP_DIR=/backups/datajoint + +# Backup database +mysqldump -h $DJ_HOST -u $DJ_USER -p$DJ_PASS \ + --databases my_schema \ + | gzip > $BACKUP_DIR/db_$DATE.sql.gz + +# Backup object storage +rsync -av /data/store/ $BACKUP_DIR/store_$DATE/ + +# Cleanup old backups (keep 7 days) +find $BACKUP_DIR -mtime +7 -delete + +echo "Backup completed: $DATE" +``` + +## Point-in-Time Recovery + +### Enable Binary Logging + +In MySQL configuration: + +```ini +[mysqld] +log-bin = mysql-bin +binlog-format = ROW +expire_logs_days = 7 +``` + +### Restore to Point in Time + +```bash +# Restore base backup +mysql -h host -u user -p < backup.sql + +# Apply binary logs up to specific time +mysqlbinlog --stop-datetime="2024-01-15 14:30:00" \ + mysql-bin.000001 mysql-bin.000002 \ + | mysql -h host -u user -p +``` + +## Schema-Level Export + +Export schema structure without data: + +```bash +# Structure only +mysqldump -h host -u user -p --no-data database_name > schema.sql +``` + +## Table-Level Backup + +Backup specific tables: + +```bash +mysqldump -h host -u user -p database_name table1 table2 > tables.sql +``` + +## DataJoint-Specific Considerations + +### Foreign Key Order + +When restoring, tables must be created in dependency order. mysqldump handles this automatically, but manual restoration may require: + +```bash +# Disable FK checks during restore +mysql -h host -u user -p -e "SET FOREIGN_KEY_CHECKS=0; SOURCE backup.sql; SET FOREIGN_KEY_CHECKS=1;" +``` + +### Jobs Tables + +Jobs tables (`~~table_name`) are recreated automatically. You can exclude them: + +```bash +# Exclude jobs tables from backup +mysqldump -h host -u user -p database_name \ + --ignore-table=database_name.~~table1 \ + --ignore-table=database_name.~~table2 \ + > backup.sql +``` + +### Blob Data + +Blobs stored internally (in database) are included in mysqldump. External objects need separate backup. + +## Verification + +### Verify Database Backup + +```bash +# Check backup file +gunzip -c backup.sql.gz | head -100 + +# Restore to test database +mysql -h host -u user -p test_restore < backup.sql +``` + +### Verify Object Storage + +```python +import datajoint as dj + +# Check external objects are accessible +for key in MyTable().keys(): + try: + (MyTable & key).fetch1('blob_column') + except Exception as e: + print(f"Missing: {key} - {e}") +``` + +## Disaster Recovery Plan + +1. **Regular backups**: Daily database, continuous object sync +2. **Offsite copies**: Replicate to different location/cloud +3. **Test restores**: Monthly restore verification +4. **Document procedures**: Written runbooks for recovery +5. **Monitor backups**: Alert on backup failures + +## See Also + +- [Configure Object Storage](configure-storage.md) β€” Storage setup +- [Manage Large Data](manage-large-data.md) β€” Object storage patterns + + +--- +## File: how-to/configure-database.md + +# Configure Database Connection + +Set up your DataJoint database connection. + +> **Tip:** [DataJoint.com](https://datajoint.com) handles database configuration automatically with fully managed infrastructure and support. + +## Configuration Structure + +DataJoint separates configuration into two parts: + +1. **`datajoint.json`** β€” Non-sensitive settings (checked into version control) +2. **`.secrets/` directory** β€” Credentials and secrets (never committed) + +## Project Configuration (`datajoint.json`) + +Create `datajoint.json` in your project root for non-sensitive settings: + +```json +{ + "database.host": "db.example.com", + "database.port": 3306, + "database.use_tls": true, + "safemode": true +} +``` + +This file should be committed to version control. + +## Secrets Directory (`.secrets/`) + +Store credentials in `.secrets/datajoint.json`: + +```json +{ + "database.user": "myuser", + "database.password": "mypassword" +} +``` + +**Important:** Add `.secrets/` to your `.gitignore`: + +```gitignore +.secrets/ +``` + +## Environment Variables + +For CI/CD and production, use environment variables: + +```bash +export DJ_HOST=db.example.com +export DJ_USER=myuser +export DJ_PASS=mypassword +``` + +Environment variables take precedence over config files. + +## Configuration Settings + +| Setting | Environment | Default | Description | +|---------|-------------|---------|-------------| +| `database.host` | `DJ_HOST` | `localhost` | Database server hostname | +| `database.port` | `DJ_PORT` | `3306` | Database server port | +| `database.user` | `DJ_USER` | β€” | Database username | +| `database.password` | `DJ_PASS` | β€” | Database password | +| `database.use_tls` | `DJ_TLS` | `True` | Use TLS encryption | +| `database.reconnect` | β€” | `True` | Auto-reconnect on timeout | +| `safemode` | β€” | `True` | Prompt before destructive operations | + +## Test Connection + +```python +import datajoint as dj + +# Connects using configured credentials +conn = dj.conn() +print(f"Connected to {conn.host}") +``` + +## Programmatic Configuration + +For scripts, you can set configuration programmatically: + +```python +import datajoint as dj + +dj.config['database.host'] = 'localhost' +# Credentials from environment or secrets file +``` + +## Temporary Override + +```python +with dj.config.override(database={'host': 'test-server'}): + # Uses test-server for this block only + conn = dj.conn() +``` + +## Configuration Precedence + +1. Programmatic settings (highest priority) +2. Environment variables +3. `.secrets/datajoint.json` +4. `datajoint.json` +5. Default values (lowest priority) + +## TLS Configuration + +For production, always use TLS: + +```json +{ + "database.use_tls": true +} +``` + +For local development without TLS: + +```json +{ + "database.use_tls": false +} +``` + +## Connection Lifecycle + +### Persistent Connection (Default) + +DataJoint uses a persistent singleton connection by default: + +```python +import datajoint as dj + +# First call establishes connection +conn = dj.conn() + +# Subsequent calls return the same connection +conn2 = dj.conn() # Same as conn + +# Reset to create a new connection +conn3 = dj.conn(reset=True) # New connection +``` + +This is ideal for interactive sessions and notebooks. + +### Context Manager (Explicit Cleanup) + +For serverless environments (AWS Lambda, Cloud Functions) or when you need explicit connection lifecycle control, use the context manager: + +```python +import datajoint as dj + +with dj.Connection(host, user, password) as conn: + schema = dj.schema('my_schema', connection=conn) + MyTable().insert(data) +# Connection automatically closed when exiting the block +``` + +The connection closes automatically even if an exception occurs: + +```python +try: + with dj.Connection(**creds) as conn: + schema = dj.schema('my_schema', connection=conn) + MyTable().insert(data) + raise SomeError() +except SomeError: + pass +# Connection is still closed properly +``` + +### Manual Close + +You can also close a connection explicitly: + +```python +conn = dj.conn() +# ... do work ... +conn.close() +``` + + + +--- +## File: how-to/configure-storage.md + +# Configure Object Storage + +Set up S3, MinIO, or filesystem storage for your Object-Augmented Schema. + +> **Tip:** [DataJoint.com](https://datajoint.com) provides pre-configured object storage integrated with your databaseβ€”no setup required. + +## Overview + +An Object-Augmented Schema (OAS) integrates relational tables with object storage as a single system. Large data objects (arrays, files, Zarr datasets) are stored in object storage while maintaining full referential integrity with the relational database. + +Object storage is configured per-project and can include multiple named stores for different data types or storage tiers. + +## Configuration Methods + +DataJoint loads configuration in priority order: + +1. **Environment variables** (highest priority) +2. **Secrets directory** (`.secrets/`) +3. **Config file** (`datajoint.json`) +4. **Defaults** (lowest priority) + +## File System Store + +For local or network-mounted storage: + +```json +{ + "object_storage": { + "project_name": "my_project", + "protocol": "file", + "location": "/data/datajoint-store" + } +} +``` + +## S3 Store + +For Amazon S3 or S3-compatible storage: + +```json +{ + "object_storage": { + "project_name": "my_project", + "protocol": "s3", + "endpoint": "s3.amazonaws.com", + "bucket": "my-bucket", + "location": "dj/objects", + "secure": true + } +} +``` + +Store credentials separately in `.secrets/`: + +``` +.secrets/ +β”œβ”€β”€ object_storage.access_key +└── object_storage.secret_key +``` + +Or use environment variables: + +```bash +export DJ_OBJECT_STORAGE_ACCESS_KEY=AKIAIOSFODNN7EXAMPLE +export DJ_OBJECT_STORAGE_SECRET_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY +``` + +## MinIO Store + +MinIO uses the S3 protocol with a custom endpoint: + +```json +{ + "object_storage": { + "project_name": "my_project", + "protocol": "s3", + "endpoint": "minio.example.com:9000", + "bucket": "datajoint", + "location": "dj/objects", + "secure": false + } +} +``` + +## Named Stores + +Define multiple stores for different data types or storage tiers: + +```json +{ + "object_storage": { + "project_name": "my_project", + "protocol": "file", + "location": "/data/default", + "stores": { + "raw": { + "protocol": "file", + "location": "/data/raw" + }, + "archive": { + "protocol": "s3", + "endpoint": "s3.amazonaws.com", + "bucket": "archive-bucket", + "location": "dj/archive" + } + } + } +} +``` + +Use named stores in table definitions: + +```python +@schema +class Recording(dj.Manual): + definition = """ + recording_id : uuid + --- + raw_data : # Uses 'raw' store + processed : # Uses 'archive' store + """ +``` + +## Verify Configuration + +```python +import datajoint as dj + +# Check default store +spec = dj.config.get_object_store_spec() +print(spec) + +# Check named store +spec = dj.config.get_object_store_spec("archive") +print(spec) +``` + +## Configuration Options + +| Option | Required | Description | +|--------|----------|-------------| +| `project_name` | Yes | Unique identifier for your project | +| `protocol` | Yes | `file`, `s3`, `gcs`, or `azure` | +| `location` | Yes | Base path or prefix within bucket | +| `bucket` | S3/GCS | Bucket name | +| `endpoint` | S3 | S3 endpoint URL | +| `secure` | No | Use HTTPS (default: true) | +| `access_key` | S3 | Access key ID | +| `secret_key` | S3 | Secret access key | + +## URL Representation + +DataJoint uses consistent URL representation for all storage backends internally. This means: + +- Local filesystem paths are represented as `file://` URLs +- S3 paths use `s3://bucket/path` +- GCS paths use `gs://bucket/path` +- Azure paths use `az://container/path` + +You can use either format when specifying paths: + +```python +# Both are equivalent for local files +"/data/myfile.dat" +"file:///data/myfile.dat" +``` + +This unified approach enables: + +- **Consistent internal handling** across all storage types +- **Seamless switching** between local and cloud storage +- **Integration with fsspec** for streaming access + +## See Also + +- [Use Object Storage](use-object-storage.md) β€” When and how to use object storage +- [Manage Large Data](manage-large-data.md) β€” Working with blobs and objects + + +--- +## File: how-to/create-custom-codec.md + +# Create Custom Codecs + +Define domain-specific types for seamless storage and retrieval. + +## Overview + +Codecs transform Python objects for storage. Create custom codecs for: + +- Domain-specific data types (graphs, images, alignments) +- Specialized serialization formats +- Integration with external libraries + +## Basic Codec Structure + +```python +import datajoint as dj + +class GraphCodec(dj.Codec): + """Store NetworkX graphs.""" + + name = "graph" # Used as in definitions + + def get_dtype(self, is_external: bool) -> str: + return "" # Delegate to blob for serialization + + def encode(self, value, *, key=None, store_name=None): + import networkx as nx + assert isinstance(value, nx.Graph) + return list(value.edges) + + def decode(self, stored, *, key=None): + import networkx as nx + return nx.Graph(stored) +``` + +## Use in Table Definition + +```python +@schema +class Connectivity(dj.Manual): + definition = """ + conn_id : int + --- + network : # Uses GraphCodec + network_large : # External storage + """ +``` + +## Required Methods + +### `get_dtype(is_external)` + +Return the storage type: + +- `is_external=False`: Internal storage (in database) +- `is_external=True`: Object storage (with `@`) + +```python +def get_dtype(self, is_external: bool) -> str: + if is_external: + return "" # Content-addressed external + return "bytes" # Database blob +``` + +Common return values: + +- `"bytes"` β€” Binary in database +- `"json"` β€” JSON in database +- `""` β€” Chain to blob codec +- `""` β€” Content-addressed storage + +### `encode(value, *, key=None, store_name=None)` + +Convert Python object to storable format: + +```python +def encode(self, value, *, key=None, store_name=None): + # value: Python object to store + # key: Primary key dict (for path construction) + # store_name: Target store name + return serialized_representation +``` + +### `decode(stored, *, key=None)` + +Reconstruct Python object: + +```python +def decode(self, stored, *, key=None): + # stored: Data from storage + # key: Primary key dict + return python_object +``` + +## Optional: Validation + +Override `validate()` for type checking: + +```python +def validate(self, value): + import networkx as nx + if not isinstance(value, nx.Graph): + raise TypeError(f"Expected nx.Graph, got {type(value).__name__}") +``` + +## Codec Chaining + +Codecs can delegate to other codecs: + +```python +class ImageCodec(dj.Codec): + name = "image" + + def get_dtype(self, is_external: bool) -> str: + return "" # Chain to blob codec + + def encode(self, value, *, key=None, store_name=None): + # Convert PIL Image to numpy array + # Blob codec handles numpy serialization + return np.array(value) + + def decode(self, stored, *, key=None): + from PIL import Image + return Image.fromarray(stored) +``` + +## External-Only Codec + +Some codecs require external storage: + +```python +class ZarrCodec(dj.Codec): + name = "zarr" + + def get_dtype(self, is_external: bool) -> str: + if not is_external: + raise DataJointError(" requires @store") + return "" # Path-addressed storage + + def encode(self, path, *, key=None, store_name=None): + return path # Path to zarr directory + + def decode(self, stored, *, key=None): + return stored # Returns ObjectRef for lazy access +``` + +## Auto-Registration + +Codecs register automatically when defined: + +```python +class MyCodec(dj.Codec): + name = "mytype" # Registers as + ... + +# Now usable in table definitions: +# my_attr : +``` + +Skip registration for abstract bases: + +```python +class BaseCodec(dj.Codec, register=False): + # Abstract base, not registered + pass +``` + +## Complete Example + +```python +import datajoint as dj +import SimpleITK as sitk +import numpy as np + +class MedicalImageCodec(dj.Codec): + """Store SimpleITK medical images with metadata.""" + + name = "medimage" + + def get_dtype(self, is_external: bool) -> str: + return "" if is_external else "" + + def encode(self, image, *, key=None, store_name=None): + return { + 'array': sitk.GetArrayFromImage(image), + 'spacing': image.GetSpacing(), + 'origin': image.GetOrigin(), + 'direction': image.GetDirection(), + } + + def decode(self, stored, *, key=None): + image = sitk.GetImageFromArray(stored['array']) + image.SetSpacing(stored['spacing']) + image.SetOrigin(stored['origin']) + image.SetDirection(stored['direction']) + return image + + def validate(self, value): + if not isinstance(value, sitk.Image): + raise TypeError(f"Expected sitk.Image, got {type(value).__name__}") + + +@schema +class Scan(dj.Manual): + definition = """ + scan_id : uuid + --- + ct_image : # CT scan with metadata + """ +``` + +## See Also + +- [Use Object Storage](use-object-storage.md) β€” Storage patterns +- [Manage Large Data](manage-large-data.md) β€” Working with large objects + + +--- +## File: how-to/define-tables.md + +# Define Tables + +Create DataJoint table classes with proper definitions. + +## Create a Schema + +```python +import datajoint as dj + +schema = dj.Schema('my_schema') # Creates schema in database if it doesn't exist +``` + +The `Schema` object connects to the database and creates the schema (database) if it doesn't already exist. + +## Basic Table Structure + +```python +@schema +class MyTable(dj.Manual): + definition = """ + # Table comment (optional) + primary_attr : type # attribute comment + --- + secondary_attr : type # attribute comment + optional_attr = null : type + """ +``` + +## Table Types + +| Type | Base Class | Purpose | +|------|------------|---------| +| Manual | `dj.Manual` | User-entered data | +| Lookup | `dj.Lookup` | Reference data with `contents` | +| Imported | `dj.Imported` | Data from external sources | +| Computed | `dj.Computed` | Derived data | +| Part | `dj.Part` | Child of master table | + +## Primary Key (Above `---`) + +```python +definition = """ +subject_id : varchar(16) # Subject identifier +session_idx : uint16 # Session number +--- +... +""" +``` + +Primary key attributes: + +- Cannot be NULL +- Must be unique together +- Cannot be changed after insertion + +## Secondary Attributes (Below `---`) + +```python +definition = """ +... +--- +session_date : date # Required attribute +notes = '' : varchar(1000) # Optional with default +score = null : float32 # Nullable attribute +""" +``` + +## Default Values and Nullable Attributes + +Default values are specified with `= value` before the type: + +```python +definition = """ +subject_id : varchar(16) +--- +weight = null : float32 # Nullable (default is NULL) +notes = '' : varchar(1000) # Default empty string +is_active = 1 : bool # Default true +created = CURRENT_TIMESTAMP : timestamp +""" +``` + +**Key rules:** + +- The **only** way to make an attribute nullable is `= null` +- Attributes without defaults are required (NOT NULL) +- Primary key attributes cannot be nullable +- Primary key attributes cannot have static defaults + +**Timestamp defaults:** + +Primary keys can use time-dependent defaults like `CURRENT_TIMESTAMP`: + +```python +definition = """ +created_at = CURRENT_TIMESTAMP : timestamp(6) # Microsecond precision +--- +data : +""" +``` + +Timestamp precision options: + +- `timestamp` or `datetime` β€” Second precision +- `timestamp(3)` or `datetime(3)` β€” Millisecond precision +- `timestamp(6)` or `datetime(6)` β€” Microsecond precision + +## Auto-Increment (Not Recommended) + +DataJoint core types do not support `AUTO_INCREMENT`. This is intentionalβ€”explicit key values enforce entity integrity and prevent silent creation of duplicate records. + +Use `uuid` or natural keys instead: + +```python +definition = """ +recording_id : uuid # Globally unique, client-generated +--- +... +""" +``` + +If you must use auto-increment, native MySQL types allow it (with a warning): + +```python +definition = """ +record_id : int unsigned auto_increment # Native type +--- +... +""" +``` + +See [Design Primary Keys](design-primary-keys.md) for detailed guidance on key selection and why DataJoint avoids auto-increment. + +## Core DataJoint Types + +| Type | Description | +|------|-------------| +| `bool` | Boolean (true/false) | +| `int8`, `int16`, `int32`, `int64` | Signed integers | +| `uint8`, `uint16`, `uint32`, `uint64` | Unsigned integers | +| `float32`, `float64` | Floating point | +| `decimal(m,n)` | Fixed precision decimal | +| `varchar(n)` | Variable-length string | +| `char(n)` | Fixed-length string | +| `date` | Date (YYYY-MM-DD) | +| `datetime` | Date and time | +| `datetime(3)` | With millisecond precision | +| `datetime(6)` | With microsecond precision | +| `uuid` | UUID type | +| `enum('a', 'b', 'c')` | Enumerated values | +| `json` | JSON data | +| `bytes` | Raw binary data | + +## Built-in Codecs + +Codecs serialize Python objects to database storage. Use angle brackets for codec types: + +| Codec | Description | +|-------|-------------| +| `` | Serialized Python objects (NumPy arrays, etc.) stored in database | +| `` | Serialized objects in object storage | +| `` | File attachments in database | +| `` | File attachments in object storage | +| `` | Files/folders via ObjectRef (path-addressed, supports Zarr/HDF5) | + +Example: + +```python +definition = """ +recording_id : uuid +--- +neural_data : # NumPy array in 'raw' store +config_file : # Attached file in database +parameters : json # JSON data (core type, no brackets) +""" +``` + +## Native Database Types + +You can also use native MySQL/MariaDB types directly when needed: + +```python +definition = """ +record_id : int unsigned # Native MySQL type +data : mediumblob # For larger binary data +description : text # Unlimited text +""" +``` + +Native types are flagged with a warning at declaration time but are allowed. Core DataJoint types (like `int32`, `float64`) are portable and recommended for most use cases. Native database types provide access to database-specific features when needed. + +## Foreign Keys + +```python +@schema +class Session(dj.Manual): + definition = """ + -> Subject # References Subject table + session_idx : uint16 + --- + session_date : date + """ +``` + +The `->` inherits primary key attributes from the referenced table. + +## Lookup Tables with Contents + +```python +@schema +class TaskType(dj.Lookup): + definition = """ + task_type : varchar(32) + --- + description : varchar(200) + """ + contents = [ + {'task_type': 'detection', 'description': 'Detect target stimulus'}, + {'task_type': 'discrimination', 'description': 'Distinguish between stimuli'}, + ] +``` + +## Part Tables + +```python +@schema +class Session(dj.Manual): + definition = """ + -> Subject + session_idx : uint16 + --- + session_date : date + """ + + class Trial(dj.Part): + definition = """ + -> master + trial_idx : uint16 + --- + outcome : enum('hit', 'miss') + reaction_time : float32 + """ +``` + +## Computed Tables + +```python +@schema +class SessionStats(dj.Computed): + definition = """ + -> Session + --- + n_trials : uint32 + hit_rate : float32 + """ + + def make(self, key): + trials = (Session.Trial & key).to_dicts() + self.insert1({ + **key, + 'n_trials': len(trials), + 'hit_rate': sum(t['outcome'] == 'hit' for t in trials) / len(trials) + }) +``` + +## Indexes + +Declare indexes at the end of the definition, after all attributes: + +```python +definition = """ +subject_id : varchar(16) +session_idx : uint16 +--- +session_date : date +experimenter : varchar(50) +index (session_date) # Index for faster queries +index (experimenter) # Another index +unique index (external_id) # Unique constraint +""" +``` + +## Declaring Tables + +Tables are declared in the database when the `@schema` decorator applies to the class: + +```python +@schema # Table is declared here +class Session(dj.Manual): + definition = """ + session_id : uint16 + --- + session_date : date + """ +``` + +The decorator reads the `definition` string, parses it, and creates the corresponding table in the database if it doesn't exist. + +## Dropping Tables and Schemas + +During prototyping (before data are populated), you can drop and recreate tables: + +```python +# Drop a single table +Session.drop() + +# Drop entire schema (all tables) +schema.drop() +``` + +**Warning:** These operations permanently delete data. Use only during development. + +## View Table Definition + +```python +# Show SQL definition +print(Session().describe()) + +# Show heading +print(Session().heading) +``` + + +--- +## File: how-to/delete-data.md + +# Delete Data + +Remove data safely with proper cascade handling. + +## Basic Delete + +Delete rows matching a restriction: + +```python +# Delete specific subject +(Subject & {'subject_id': 'M001'}).delete() + +# Delete with condition +(Session & 'session_date < "2024-01-01"').delete() +``` + +## Cascade Behavior + +Deleting a row automatically cascades to all dependent tables: + +```python +# Deletes subject AND all their sessions AND all trials +(Subject & {'subject_id': 'M001'}).delete() +``` + +This maintains referential integrityβ€”no orphaned records remain. + +## Confirmation Prompt + +The `prompt` parameter controls confirmation behavior: + +```python +# Uses dj.config['safemode'] setting (default behavior) +(Subject & key).delete() + +# Explicitly skip confirmation +(Subject & key).delete(prompt=False) + +# Explicitly require confirmation +(Subject & key).delete(prompt=True) +``` + +When prompted, you'll see what will be deleted: + +``` +About to delete: + 1 rows from `lab`.`subject` + 5 rows from `lab`.`session` + 127 rows from `lab`.`trial` + +Proceed? [yes, No]: +``` + +## Safe Mode Configuration + +Control the default prompting behavior: + +```python +import datajoint as dj + +# Check current setting +print(dj.config['safemode']) + +# Disable prompts globally (use with caution) +dj.config['safemode'] = False + +# Re-enable prompts +dj.config['safemode'] = True +``` + +Or temporarily override: + +```python +with dj.config.override(safemode=False): + (Subject & restriction).delete() +``` + +## Transaction Handling + +Deletes are atomicβ€”all cascading deletes succeed or none do: + +```python +# All-or-nothing delete (default) +(Subject & restriction).delete(transaction=True) +``` + +Within an existing transaction: + +```python +with dj.conn().transaction: + (Table1 & key1).delete(transaction=False) + (Table2 & key2).delete(transaction=False) + Table3.insert(rows) +``` + +## Part Tables + +Part tables cannot be deleted directly by default (master-part integrity): + +```python +# This raises an error +Session.Trial.delete() # DataJointError + +# Delete from master instead (cascades to parts) +(Session & key).delete() +``` + +Use `part_integrity` to control this behavior: + +```python +# Allow direct deletion (breaks master-part integrity) +(Session.Trial & key).delete(part_integrity="ignore") + +# Delete parts AND cascade up to delete master +(Session.Trial & key).delete(part_integrity="cascade") +``` + +| Policy | Behavior | +|--------|----------| +| `"enforce"` | (default) Error if parts deleted without masters | +| `"ignore"` | Allow deleting parts without masters | +| `"cascade"` | Also delete masters when parts are deleted | + +## Quick Delete + +Delete without cascade (fails if dependent rows exist): + +```python +# Only works if no dependent tables have matching rows +(Subject & key).delete_quick() +``` + +## Delete Patterns + +### By Primary Key + +```python +(Session & {'subject_id': 'M001', 'session_idx': 1}).delete() +``` + +### By Condition + +```python +(Trial & 'outcome = "miss"').delete() +``` + +### By Join + +```python +# Delete trials from sessions before 2024 +old_sessions = Session & 'session_date < "2024-01-01"' +(Trial & old_sessions).delete() +``` + +### All Rows + +```python +# Delete everything in table (and dependents) +MyTable.delete() +``` + +## The Recomputation Pattern + +When source data needs correction, use **delete β†’ insert β†’ populate**: + +```python +key = {'subject_id': 'M001', 'session_idx': 1} + +# 1. Delete cascades to computed tables +(Session & key).delete(prompt=False) + +# 2. Reinsert with corrected data +with dj.conn().transaction: + Session.insert1({**key, 'session_date': '2024-01-08', 'duration': 40.0}) + Session.Trial.insert(corrected_trials) + +# 3. Recompute derived data +ProcessedData.populate() +``` + +This ensures all derived data remains consistent with source data. + +## Return Value + +`delete()` returns the count of deleted rows from the primary table: + +```python +count = (Subject & restriction).delete(prompt=False) +print(f"Deleted {count} subjects") +``` + +## See Also + +- [Model Relationships](model-relationships.md) β€” Foreign key patterns +- [Insert Data](insert-data.md) β€” Adding data to tables +- [Run Computations](run-computations.md) β€” Recomputing after changes + + +--- +## File: how-to/design-primary-keys.md + +# Design Primary Keys + +Choose effective primary keys for your tables. + +## Primary Key Principles + +Primary key attributes: + +- Uniquely identify each entity +- Cannot be NULL +- Cannot be changed after insertion +- Are inherited by dependent tables via foreign keys + +## Natural Keys + +Use meaningful identifiers when they exist: + +```python +@schema +class Subject(dj.Manual): + definition = """ + subject_id : varchar(16) # Lab-assigned ID like 'M001' + --- + species : varchar(32) + """ +``` + +**Good candidates:** +- Lab-assigned IDs +- Standard identifiers (NCBI accession, DOI) +- Meaningful codes with enforced uniqueness + +## Composite Keys + +Combine attributes when a single attribute isn't unique: + +```python +@schema +class Session(dj.Manual): + definition = """ + -> Subject + session_idx : uint16 # Session number within subject + --- + session_date : date + """ +``` + +The primary key is `(subject_id, session_idx)`. + +## Surrogate Keys + +Use UUIDs when natural keys don't exist: + +```python +@schema +class Experiment(dj.Manual): + definition = """ + experiment_id : uuid + --- + description : varchar(500) + """ +``` + +Generate UUIDs: + +```python +import uuid + +Experiment.insert1({ + 'experiment_id': uuid.uuid4(), + 'description': 'Pilot study' +}) +``` + +## Why DataJoint Avoids Auto-Increment + +DataJoint discourages `auto_increment` for primary keys: + +1. **Encourages lazy design** β€” Users treat it as "row number" rather than thinking about what uniquely identifies the entity in their domain. + +2. **Incompatible with composite keys** β€” DataJoint schemas routinely use composite keys like `(subject_id, session_idx, trial_idx)`. MySQL allows only one auto_increment column per table, and it must be first in the key. + +3. **Breaks reproducibility** β€” Auto_increment values depend on insertion order. Rebuilding a pipeline produces different IDs. + +4. **No client-server handshake** β€” The client discovers the ID only *after* insertion, complicating error handling and concurrent access. + +5. **Meaningless foreign keys** β€” Downstream tables inherit opaque integers rather than traceable lineage. + +**Instead, use:** +- Natural keys that identify entities in your domain +- UUIDs when no natural identifier exists +- Composite keys combining foreign keys with sequence numbers + +## Foreign Keys in Primary Key + +Foreign keys above the `---` become part of the primary key: + +```python +@schema +class Trial(dj.Manual): + definition = """ + -> Session # In primary key + trial_idx : uint16 # In primary key + --- + -> Stimulus # NOT in primary key + outcome : enum('hit', 'miss') + """ +``` + +## Key Design Guidelines + +### Keep Keys Small + +Prefer `uint16` over `int64` when the range allows: + +```python +# Good: Appropriate size +session_idx : uint16 # Max 65,535 sessions per subject + +# Avoid: Unnecessarily large +session_idx : int64 # Wastes space, slower joins +``` + +### Use Fixed-Width for Joins + +Fixed-width types join faster: + +```python +# Good: Fixed width +subject_id : char(8) + +# Acceptable: Variable width +subject_id : varchar(16) +``` + +### Avoid Dates as Primary Keys + +Dates alone rarely guarantee uniqueness: + +```python +# Bad: Date might not be unique +session_date : date +--- +... + +# Good: Add a sequence number +-> Subject +session_idx : uint16 +--- +session_date : date +``` + +### Avoid Computed Values + +Primary keys should be stable inputs, not derived: + +```python +# Bad: Derived from other data +hash_id : varchar(64) # MD5 of some content + +# Good: Assigned identifier +recording_id : uuid +``` + +## Migration Considerations + +Once a table has data, primary keys cannot be changed. Plan carefully: + +```python +# Consider future needs +@schema +class Scan(dj.Manual): + definition = """ + -> Session + scan_idx : uint8 # Might need uint16 for high-throughput + --- + ... + """ +``` + +## See Also + +- [Define Tables](define-tables.md) β€” Table definition syntax +- [Model Relationships](model-relationships.md) β€” Foreign key patterns + + +--- +## File: how-to/distributed-computing.md + +# Distributed Computing + +Run computations across multiple workers with job coordination. + +## Enable Distributed Mode + +Use `reserve_jobs=True` to enable job coordination: + +```python +# Single worker (default) +ProcessedData.populate() + +# Distributed mode with job reservation +ProcessedData.populate(reserve_jobs=True) +``` + +## How It Works + +With `reserve_jobs=True`: +1. Worker checks the jobs table for pending work +2. Atomically reserves a job before processing +3. Other workers see the job as reserved and skip it +4. On completion, job is marked success (or error) + +## Multi-Process on Single Machine + +```python +# Use multiple processes +ProcessedData.populate(reserve_jobs=True, processes=4) +``` + +Each process: + +- Opens its own database connection +- Reserves jobs independently +- Processes in parallel + +## Multi-Machine Cluster + +Run the same script on multiple machines: + +```python +# worker_script.py - run on each machine +import datajoint as dj +from my_pipeline import ProcessedData + +# Each worker reserves and processes different jobs +ProcessedData.populate( + reserve_jobs=True, + display_progress=True, + suppress_errors=True +) +``` + +Workers automatically coordinate through the jobs table. + +## Job Table + +Each auto-populated table has a jobs table (`~~table_name`): + +```python +# View job status +ProcessedData.jobs + +# Filter by status +ProcessedData.jobs.pending +ProcessedData.jobs.reserved +ProcessedData.jobs.errors +ProcessedData.jobs.completed +``` + +## Job Statuses + +| Status | Description | +|--------|-------------| +| `pending` | Queued, ready to process | +| `reserved` | Being processed by a worker | +| `success` | Completed successfully | +| `error` | Failed with error | +| `ignore` | Marked to skip | + +## Refresh Job Queue + +Sync the job queue with current key_source: + +```python +# Add new pending jobs, remove stale ones +result = ProcessedData.jobs.refresh() +print(f"Added: {result['added']}, Removed: {result['removed']}") +``` + +## Priority Scheduling + +Control processing order with priorities: + +```python +# Refresh with specific priority +ProcessedData.jobs.refresh(priority=1) # Lower = more urgent + +# Process only high-priority jobs +ProcessedData.populate(reserve_jobs=True, priority=3) +``` + +## Error Recovery + +Handle failed jobs: + +```python +# View errors +errors = ProcessedData.jobs.errors +for job in errors.to_dicts(): + print(f"Key: {job}, Error: {job['error_message']}") + +# Clear errors to retry +errors.delete() +ProcessedData.populate(reserve_jobs=True) +``` + +## Orphan Detection + +Jobs from crashed workers are automatically recovered: + +```python +# Refresh with orphan timeout (seconds) +ProcessedData.jobs.refresh(orphan_timeout=3600) +``` + +Reserved jobs older than the timeout are reset to pending. + +## Configuration + +```python +import datajoint as dj + +# Auto-refresh on populate (default: True) +dj.config.jobs.auto_refresh = True + +# Keep completed job records (default: False) +dj.config.jobs.keep_completed = True + +# Stale job timeout in seconds (default: 3600) +dj.config.jobs.stale_timeout = 3600 + +# Default job priority (default: 5) +dj.config.jobs.default_priority = 5 + +# Track code version (default: None) +dj.config.jobs.version_method = "git" +``` + +## Populate Options + +| Option | Default | Description | +|--------|---------|-------------| +| `reserve_jobs` | `False` | Enable job coordination | +| `processes` | `1` | Number of worker processes | +| `max_calls` | `None` | Limit jobs per run | +| `display_progress` | `False` | Show progress bar | +| `suppress_errors` | `False` | Continue on errors | +| `priority` | `None` | Filter by priority | +| `refresh` | `None` | Force refresh before run | + +## Example: Cluster Setup + +```python +# config.py - shared configuration +import datajoint as dj + +dj.config.jobs.auto_refresh = True +dj.config.jobs.keep_completed = True +dj.config.jobs.version_method = "git" + +# worker.py - run on each node +from config import * +from my_pipeline import ProcessedData + +while True: + result = ProcessedData.populate( + reserve_jobs=True, + max_calls=100, + suppress_errors=True, + display_progress=True + ) + if result['success_count'] == 0: + break # No more work +``` + +## See Also + +- [Run Computations](run-computations.md) β€” Basic populate usage +- [Handle Errors](handle-errors.md) β€” Error recovery patterns +- [Monitor Progress](monitor-progress.md) β€” Tracking job status + + +--- +## File: how-to/fetch-results.md + +# Fetch Results + +Retrieve query results in various formats. + +## List of Dictionaries + +```python +rows = Subject.to_dicts() +# [{'subject_id': 'M001', 'species': 'Mus musculus', ...}, ...] + +for row in rows: + print(row['subject_id'], row['species']) +``` + +## pandas DataFrame + +```python +df = Subject.to_pandas() +# Primary key becomes the index + +# With multi-column primary key +df = Session.to_pandas() +# MultiIndex on (subject_id, session_idx) +``` + +## NumPy Arrays + +```python +# Structured array (all columns) +arr = Subject.to_arrays() + +# Specific columns as separate arrays +species, weights = Subject.to_arrays('species', 'weight') +``` + +## Primary Keys Only + +```python +keys = Session.keys() +# [{'subject_id': 'M001', 'session_idx': 1}, ...] + +for key in keys: + process(Session & key) +``` + +## Single Row + +```python +# As dictionary (raises if not exactly 1 row) +row = (Subject & {'subject_id': 'M001'}).fetch1() + +# Specific attributes +species, weight = (Subject & {'subject_id': 'M001'}).fetch1('species', 'weight') +``` + +## Ordering and Limiting + +```python +# Sort by single attribute +Subject.to_dicts(order_by='weight DESC') + +# Sort by multiple attributes +Session.to_dicts(order_by=['session_date DESC', 'duration']) + +# Sort by primary key +Subject.to_dicts(order_by='KEY') + +# Limit rows +Subject.to_dicts(limit=10) + +# Pagination +Subject.to_dicts(order_by='KEY', limit=10, offset=20) +``` + +## Streaming (Lazy Iteration) + +```python +# Memory-efficient iteration +for row in Subject: + process(row) + if done: + break # Early termination +``` + +## polars DataFrame + +```python +# Requires: pip install datajoint[polars] +df = Subject.to_polars() +``` + +## PyArrow Table + +```python +# Requires: pip install datajoint[arrow] +table = Subject.to_arrow() +``` + +## Method Summary + +| Method | Returns | Use Case | +|--------|---------|----------| +| `to_dicts()` | `list[dict]` | JSON, iteration | +| `to_pandas()` | `DataFrame` | Data analysis | +| `to_polars()` | `polars.DataFrame` | Fast analysis | +| `to_arrow()` | `pyarrow.Table` | Interop | +| `to_arrays()` | `np.ndarray` | Numeric computation | +| `to_arrays('a', 'b')` | `tuple[array, ...]` | Specific columns | +| `keys()` | `list[dict]` | Primary keys | +| `fetch1()` | `dict` | Single row | +| `for row in table:` | Iterator | Streaming | + +## Common Parameters + +All output methods accept: + +| Parameter | Description | +|-----------|-------------| +| `order_by` | Sort by column(s): `'name'`, `'name DESC'`, `['a', 'b DESC']`, `'KEY'` | +| `limit` | Maximum rows to return | +| `offset` | Rows to skip | + +## See Also + +- [Query Data](query-data.md) β€” Building queries +- [Fetch API Specification](../reference/specs/fetch-api.md) β€” Complete reference + + +--- +## File: how-to/handle-errors.md + +# Handle Errors + +Manage computation errors and recover failed jobs. + +## Suppress Errors During Populate + +Continue processing despite individual failures: + +```python +# Stop on first error (default) +ProcessedData.populate() + +# Log errors but continue +ProcessedData.populate(suppress_errors=True) +``` + +## View Failed Jobs + +Check the jobs table for errors: + +```python +# All error jobs +ProcessedData.jobs.errors + +# View error details +for job in ProcessedData.jobs.errors.to_dicts(): + print(f"Key: {job}") + print(f"Message: {job['error_message']}") +``` + +## Get Full Stack Trace + +Error stack traces are stored in the jobs table: + +```python +job = (ProcessedData.jobs.errors & key).fetch1() +print(job['error_stack']) +``` + +## Retry Failed Jobs + +Clear error status and rerun: + +```python +# Delete error records to retry +ProcessedData.jobs.errors.delete() + +# Reprocess +ProcessedData.populate(reserve_jobs=True) +``` + +## Retry Specific Jobs + +Target specific failed jobs: + +```python +# Clear one error +(ProcessedData.jobs & key & 'status="error"').delete() + +# Retry just that key +ProcessedData.populate(key, reserve_jobs=True) +``` + +## Ignore Problematic Jobs + +Mark jobs to skip permanently: + +```python +# Mark job as ignored +ProcessedData.jobs.ignore(key) + +# View ignored jobs +ProcessedData.jobs.ignored +``` + +## Error Handling in make() + +Handle expected errors gracefully: + +```python +@schema +class ProcessedData(dj.Computed): + definition = """ + -> RawData + --- + result : float64 + """ + + def make(self, key): + try: + data = (RawData & key).fetch1('data') + result = risky_computation(data) + except ValueError as e: + # Log and skip this key + logger.warning(f"Skipping {key}: {e}") + return # Don't insert, job remains pending + + self.insert1({**key, 'result': result}) +``` + +## Transaction Rollback + +Failed `make()` calls automatically rollback: + +```python +def make(self, key): + # These inserts are in a transaction + self.insert1({**key, 'result': value1}) + PartTable.insert(parts) + + # If this raises, all inserts are rolled back + validate_result(key) +``` + +## Return Exception Objects + +Get exception objects for programmatic handling: + +```python +result = ProcessedData.populate( + suppress_errors=True, + return_exception_objects=True +) + +for key, exception in result['error_list']: + if isinstance(exception, TimeoutError): + # Handle timeout differently + schedule_for_later(key) +``` + +## Monitor Error Rate + +Track errors over time: + +```python +progress = ProcessedData.jobs.progress() +print(f"Pending: {progress.get('pending', 0)}") +print(f"Errors: {progress.get('error', 0)}") +print(f"Success: {progress.get('success', 0)}") + +error_rate = progress.get('error', 0) / sum(progress.values()) +print(f"Error rate: {error_rate:.1%}") +``` + +## Common Error Patterns + +### Data Quality Issues + +```python +def make(self, key): + data = (RawData & key).fetch1('data') + + if not validate_data(data): + raise DataJointError(f"Invalid data for {key}") + + # Process valid data + self.insert1({**key, 'result': process(data)}) +``` + +### Resource Constraints + +```python +def make(self, key): + try: + result = memory_intensive_computation(key) + except MemoryError: + # Clear caches and retry once + gc.collect() + result = memory_intensive_computation(key) + + self.insert1({**key, 'result': result}) +``` + +### External Service Failures + +```python +def make(self, key): + for attempt in range(3): + try: + data = fetch_from_external_api(key) + break + except ConnectionError: + if attempt == 2: + raise + time.sleep(2 ** attempt) # Exponential backoff + + self.insert1({**key, 'result': process(data)}) +``` + +## See Also + +- [Run Computations](run-computations.md) β€” Basic populate usage +- [Distributed Computing](distributed-computing.md) β€” Multi-worker error handling +- [Monitor Progress](monitor-progress.md) β€” Tracking job status + + +--- +## File: how-to/index.md + +# How-To Guides + +Practical guides for common tasks. + +These guides help you accomplish specific tasks with DataJoint. Unlike tutorials, +they assume you understand the basics and focus on getting things done. + +## Setup + +- [Installation](installation.md) β€” Installing DataJoint +- [Configure Database Connection](configure-database.md) β€” Connection settings +- [Configure Object Storage](configure-storage.md) β€” S3, MinIO, file stores +- [Use the Command-Line Interface](use-cli.md) β€” Interactive REPL + +## Schema Design + +- [Define Tables](define-tables.md) β€” Table definition syntax +- [Model Relationships](model-relationships.md) β€” Foreign key patterns +- [Design Primary Keys](design-primary-keys.md) β€” Key selection strategies + +## Project Management + +- [Manage a Pipeline Project](manage-pipeline-project.md) β€” Multi-schema pipelines, team collaboration + +## Data Operations + +- [Insert Data](insert-data.md) β€” Single rows, batches, transactions +- [Query Data](query-data.md) β€” Operators, restrictions, projections +- [Fetch Results](fetch-results.md) β€” DataFrames, dicts, streaming +- [Delete Data](delete-data.md) β€” Safe deletion with cascades + +## Computation + +- [Run Computations](run-computations.md) β€” populate() basics +- [Distributed Computing](distributed-computing.md) β€” Multi-process, cluster +- [Handle Errors](handle-errors.md) β€” Error recovery and job management +- [Monitor Progress](monitor-progress.md) β€” Dashboards and status + +## Object Storage + +- [Use Object Storage](use-object-storage.md) β€” When and how +- [Create Custom Codecs](create-custom-codec.md) β€” Domain-specific types +- [Manage Large Data](manage-large-data.md) β€” Blobs, objects, garbage collection + +## Maintenance + +- [Migrate from 0.x](migrate-from-0x.md) β€” Upgrading existing pipelines +- [Alter Tables](alter-tables.md) β€” Schema evolution +- [Backup and Restore](backup-restore.md) β€” Data protection + + +--- +## File: how-to/insert-data.md + +# Insert Data + +Add data to DataJoint tables. + +## Single Row + +```python +Subject.insert1({ + 'subject_id': 'M001', + 'species': 'Mus musculus', + 'date_of_birth': '2026-01-15', + 'sex': 'M' +}) +``` + +## Multiple Rows + +```python +Subject.insert([ + {'subject_id': 'M001', 'species': 'Mus musculus', 'date_of_birth': '2026-01-15', 'sex': 'M'}, + {'subject_id': 'M002', 'species': 'Mus musculus', 'date_of_birth': '2026-02-01', 'sex': 'F'}, + {'subject_id': 'M003', 'species': 'Mus musculus', 'date_of_birth': '2026-02-15', 'sex': 'M'}, +]) +``` + +## From pandas DataFrame + +```python +import pandas as pd + +df = pd.DataFrame({ + 'subject_id': ['M004', 'M005'], + 'species': ['Mus musculus', 'Mus musculus'], + 'date_of_birth': ['2026-03-01', '2026-03-15'], + 'sex': ['F', 'M'] +}) + +Subject.insert(df) +``` + +## Handle Duplicates + +```python +# Skip rows with existing primary keys +Subject.insert(rows, skip_duplicates=True) + +# Replace existing rows (use sparinglyβ€”breaks immutability) +Subject.insert(rows, replace=True) +``` + +## Ignore Extra Fields + +```python +# Ignore fields not in the table definition +Subject.insert(rows, ignore_extra_fields=True) +``` + +## Master-Part Tables + +Use a transaction to maintain compositional integrity: + +```python +with dj.conn().transaction: + Session.insert1({ + 'subject_id': 'M001', + 'session_idx': 1, + 'session_date': '2026-01-20' + }) + Session.Trial.insert([ + {'subject_id': 'M001', 'session_idx': 1, 'trial_idx': 1, 'outcome': 'hit', 'reaction_time': 0.35}, + {'subject_id': 'M001', 'session_idx': 1, 'trial_idx': 2, 'outcome': 'miss', 'reaction_time': 0.82}, + ]) +``` + +## Insert from Query + +```python +# Copy data from another table or query result +NewTable.insert(OldTable & 'condition') + +# With projection +NewTable.insert(OldTable.proj('attr1', 'attr2', new_name='old_name')) +``` + +## Validate Before Insert + +```python +result = Subject.validate(rows) + +if result: + Subject.insert(rows) +else: + print("Validation errors:") + for error in result.errors: + print(f" {error}") +``` + +## Insert with Blobs + +```python +import numpy as np + +data = np.random.randn(100, 100) + +ImageData.insert1({ + 'image_id': 1, + 'pixel_data': data # Automatically serialized +}) +``` + +## Insert Options Summary + +| Option | Default | Description | +|--------|---------|-------------| +| `skip_duplicates` | `False` | Skip rows with existing keys | +| `replace` | `False` | Replace existing rows | +| `ignore_extra_fields` | `False` | Ignore unknown fields | + +## Best Practices + +### Batch inserts for performance + +```python +# Good: Single insert call +Subject.insert(all_rows) + +# Slow: Loop of insert1 calls +for row in all_rows: + Subject.insert1(row) +``` + +### Use transactions for related inserts + +```python +with dj.conn().transaction: + Parent.insert1(parent_row) + Child.insert(child_rows) +``` + +### Validate before bulk inserts + +```python +if Subject.validate(rows): + Subject.insert(rows) +``` + + +--- +## File: how-to/installation.md + +# Installation + +Install DataJoint Python and set up your environment. + +## Basic Installation + +```bash +pip install datajoint +``` + +## With Optional Dependencies + +```bash +# For polars DataFrame support +pip install datajoint[polars] + +# For PyArrow support +pip install datajoint[arrow] + +# For all optional dependencies +pip install datajoint[all] +``` + +## Development Installation + +```bash +git clone https://github.com/datajoint/datajoint-python.git +cd datajoint-python +pip install -e ".[dev]" +``` + +## Verify Installation + +```python +import datajoint as dj +print(dj.__version__) +``` + +## Database Server + +DataJoint requires a MySQL-compatible database server: + +### Local Development (Docker) + +```bash +docker run -d \ + --name datajoint-db \ + -p 3306:3306 \ + -e MYSQL_ROOT_PASSWORD=simple \ + mysql:8.0 +``` + +### DataJoint.com (Recommended) + +[DataJoint.com](https://datajoint.com) provides fully managed infrastructure for scientific data pipelinesβ€”cloud or on-premisesβ€”with comprehensive support, automatic backups, object storage, and team collaboration features. + +### Self-Managed Cloud Databases + +- **Amazon RDS** β€” MySQL or Aurora +- **Google Cloud SQL** β€” MySQL +- **Azure Database** β€” MySQL + +See [Configure Database Connection](configure-database.md) for connection setup. + +## Requirements + +- Python 3.10+ +- MySQL 8.0+ or MariaDB 10.6+ +- Network access to database server + +## Troubleshooting + +### `pymysql` connection errors + +```bash +pip install pymysql --force-reinstall +``` + +### SSL/TLS connection issues + +Set `use_tls=False` for local development: + +```python +dj.config['database.use_tls'] = False +``` + +### Permission denied + +Ensure your database user has appropriate privileges: + +```sql +GRANT ALL PRIVILEGES ON `your_schema%`.* TO 'username'@'%'; +``` + + +--- +## File: how-to/manage-large-data.md + +# Manage Large Data + +Work effectively with blobs and object storage. + +## Choose the Right Storage + +| Data Size | Recommended | Syntax | +|-----------|-------------|--------| +| < 1 MB | Database | `` | +| 1 MB - 1 GB | Object storage | `` | +| > 1 GB | Path-addressed | `` | + +## Streaming Large Results + +Avoid loading everything into memory: + +```python +# Bad: loads all data at once +all_data = LargeTable().to_arrays('big_column') + +# Good: stream rows lazily (single cursor, one row at a time) +for row in LargeTable(): + process(row['big_column']) + +# Good: batch by ID range +keys = LargeTable().keys() +batch_size = 100 +for i in range(0, len(keys), batch_size): + batch_keys = keys[i:i + batch_size] + data = (LargeTable() & batch_keys).to_arrays('big_column') + process(data) +``` + +## Lazy Loading with ObjectRef + +`` and `` return lazy references: + +```python +# Returns ObjectRef, not the actual data +ref = (Dataset & key).fetch1('large_file') + +# Stream without full download +with ref.open('rb') as f: + # Process in chunks + while chunk := f.read(1024 * 1024): + process(chunk) + +# Or download when needed +local_path = ref.download('/tmp/working') +``` + +## Selective Fetching + +Fetch only what you need: + +```python +# Bad: fetches all columns including blobs +row = MyTable.fetch1() + +# Good: fetch only metadata +metadata = (MyTable & key).fetch1('name', 'date', 'status') + +# Then fetch blob only if needed +if needs_processing(metadata): + data = (MyTable & key).fetch1('large_data') +``` + +## Projection for Efficiency + +Exclude large columns from joins: + +```python +# Slow: joins include blob columns +result = Table1 * Table2 + +# Fast: project away blobs before join +result = Table1.proj('id', 'name') * Table2.proj('id', 'status') +``` + +## Batch Inserts + +Insert large data efficiently: + +```python +# Good: single transaction for related data +with dj.conn().transaction: + for item in large_batch: + MyTable.insert1(item) +``` + +## Content Deduplication + +`` and `` automatically deduplicate: + +```python +# Same array inserted twice +data = np.random.randn(1000, 1000) +Table.insert1({'id': 1, 'data': data}) +Table.insert1({'id': 2, 'data': data}) # References same storage + +# Only one copy exists in object storage +``` + +## Storage Cleanup + +Remove orphaned objects after deletes: + +```python +# Objects are NOT automatically deleted with rows +(MyTable & old_data).delete() + +# Run garbage collection periodically +# (Implementation depends on your storage backend) +``` + +## Monitor Storage Usage + +Check object store size: + +```python +# Get store configuration +spec = dj.config.get_object_store_spec() + +# For S3/MinIO, use boto3 or similar +# For filesystem, use standard tools +``` + +## Compression + +Blobs are compressed by default: + +```python +# Compression happens automatically in +large_array = np.zeros((10000, 10000)) # Compresses well +sparse_data = np.random.randn(10000, 10000) # Less compression +``` + +## Memory Management + +For very large computations: + +```python +def make(self, key): + # Process in chunks + for chunk_idx in range(n_chunks): + chunk_data = load_chunk(key, chunk_idx) + result = process(chunk_data) + save_partial_result(key, chunk_idx, result) + del chunk_data # Free memory + + # Combine results + final = combine_results(key) + self.insert1({**key, 'result': final}) +``` + +## External Tools for Very Large Data + +For datasets too large for DataJoint: + +```python +@schema +class LargeDataset(dj.Manual): + definition = """ + dataset_id : uuid + --- + zarr_path : # Reference to external Zarr + """ + +# Store path reference, process with specialized tools +import zarr +store = zarr.open(local_zarr_path) +# ... process with Zarr/Dask ... + +LargeDataset.insert1({ + 'dataset_id': uuid.uuid4(), + 'zarr_path': local_zarr_path +}) +``` + +## See Also + +- [Use Object Storage](use-object-storage.md) β€” Storage patterns +- [Configure Object Storage](configure-storage.md) β€” Storage setup +- [Create Custom Codecs](create-custom-codec.md) β€” Domain-specific types + + +--- +## File: how-to/manage-pipeline-project.md + +# Manage a Pipeline Project + +Organize multi-schema pipelines for team collaboration. + +## Overview + +A production DataJoint pipeline typically involves: + +- **Multiple schemas** β€” Organized by experimental modality or processing stage +- **Team of users** β€” With different roles and access levels +- **Shared infrastructure** β€” Database server, object storage, code repository +- **Coordination** β€” Between code, database, and storage permissions + +This guide outlines the key considerations. For a fully managed solution, [request a DataJoint Platform account](https://www.datajoint.com/sign-up). + +## Pipeline Architecture + +A DataJoint pipeline integrates three core components: + +![DataJoint Platform Architecture](../images/dj-platform.png) + +**Core components:** + +- **Code Repository** β€” Version-controlled pipeline definitions, analysis code, configuration +- **Relational Database** β€” Metadata store, system of record, integrity enforcement +- **Object Store** β€” Scalable storage for large scientific data (images, recordings, videos) + +## Pipeline as a DAG + +A DataJoint pipeline forms a **Directed Acyclic Graph (DAG)** at two levels: + +![Pipeline DAG Structure](../images/pipeline-illustration.png) + +**Nodes** represent Python modules, which correspond to database schemas. + +**Edges** represent: + +- Python import dependencies between modules +- Bundles of foreign key references between schemas + +This dual structure ensures that both code dependencies and data dependencies flow in the same direction. + +## Schema Organization + +Each schema corresponds to a dedicated Python module: + +![Schema Structure](../images/schema-illustration.png) + +### One Module Per Schema + +``` +my_pipeline/ +β”œβ”€β”€ __init__.py +β”œβ”€β”€ subject.py # subject schema +β”œβ”€β”€ session.py # session schema +β”œβ”€β”€ ephys.py # ephys schema +β”œβ”€β”€ imaging.py # imaging schema +β”œβ”€β”€ analysis.py # analysis schema +└── utils/ + └── __init__.py +``` + +Each module defines and binds to its schema: + +```python +# my_pipeline/ephys.py +import datajoint as dj +from . import session # Import dependency + +schema = dj.Schema('ephys') + +@schema +class Probe(dj.Lookup): + definition = """ + probe_type : varchar(32) + --- + num_channels : uint16 + """ + +@schema +class Recording(dj.Imported): + definition = """ + -> session.Session + -> Probe + --- + recording_path : varchar(255) + """ +``` + +### Import Dependencies Mirror Foreign Keys + +Module imports reflect the schema DAG: + +```python +# analysis.py depends on both ephys and imaging +from . import ephys +from . import imaging + +schema = dj.Schema('analysis') + +@schema +class MultiModalAnalysis(dj.Computed): + definition = """ + -> ephys.Recording + -> imaging.Scan + --- + correlation : float64 + """ +``` + +### DAG Constraints + +> **All foreign key relationships within a schema MUST form a DAG.** +> +> **Dependencies between schemas (foreign keys + imports) MUST also form a DAG.** + +This ensures unidirectional flow of data and computational dependencies throughout the pipeline. + +## Repository Configuration + +### Shared Settings + +Store non-secret configuration in the repository: + +``` +my_pipeline/ +β”œβ”€β”€ datajoint.json # Shared settings (commit this) +β”œβ”€β”€ .secrets/ # Local secrets (gitignore) +β”‚ β”œβ”€β”€ database.password +β”‚ └── object_storage.secret_key +β”œβ”€β”€ .gitignore +└── src/ + └── my_pipeline/ +``` + +**datajoint.json** (committed): +```json +{ + "database": { + "host": "db.example.com", + "port": 3306 + }, + "object_storage": { + "project_name": "my_lab_pipeline", + "protocol": "s3", + "endpoint": "s3.example.com", + "bucket": "my-lab-data", + "location": "datajoint" + } +} +``` + +**.gitignore**: +``` +.secrets/ +*.pyc +__pycache__/ +``` + +### User-Specific Credentials + +Each team member provides their own credentials: + +```bash +# Set via environment +export DJ_USER=alice +export DJ_PASS=alice_password +export DJ_OBJECT_STORAGE_ACCESS_KEY=alice_key +export DJ_OBJECT_STORAGE_SECRET_KEY=alice_secret + +# Or via .secrets/ directory +echo "alice" > .secrets/database.user +echo "alice_password" > .secrets/database.password +``` + +## Database Access Control + +### The Complexity + +Multi-user database access requires: + +1. **User accounts** β€” Individual credentials per team member +2. **Schema permissions** β€” Which users can access which schemas +3. **Operation permissions** β€” SELECT, INSERT, UPDATE, DELETE, CREATE, DROP +4. **Role hierarchy** β€” Admin, developer, analyst, viewer +5. **Audit trail** β€” Who modified what and when + +### Basic MySQL Grants + +```sql +-- Create user +CREATE USER 'alice'@'%' IDENTIFIED BY 'password'; + +-- Grant read-only on specific schema +GRANT SELECT ON ephys.* TO 'alice'@'%'; + +-- Grant read-write on specific schema +GRANT SELECT, INSERT, UPDATE, DELETE ON analysis.* TO 'alice'@'%'; + +-- Grant full access (developers) +GRANT ALL PRIVILEGES ON my_pipeline_*.* TO 'bob'@'%'; +``` + +### Role-Based Access Patterns + +| Role | Permissions | Typical Use | +|------|-------------|-------------| +| Viewer | SELECT | Browse data, run queries | +| Analyst | SELECT, INSERT on analysis | Add analysis results | +| Operator | SELECT, INSERT, DELETE on data schemas | Run pipeline | +| Developer | ALL on development schemas | Schema changes | +| Admin | ALL + GRANT | User management | + +### Considerations + +- Users need SELECT on parent schemas to INSERT into child schemas (FK validation) +- Cascading deletes require DELETE on all dependent schemas +- Schema creation requires CREATE privilege +- Coordinating permissions across many schemas becomes complex + +## Object Storage Access Control + +### The Complexity + +Object storage permissions must align with database permissions: + +1. **Bucket/prefix policies** β€” Map to schema access +2. **Read vs write** β€” Match SELECT vs INSERT/UPDATE +3. **Credential distribution** β€” Per-user or shared service accounts +4. **Cross-schema objects** β€” When computed tables reference multiple inputs + +### Hierarchical Storage Structure + +A DataJoint project creates a structured storage pattern: + +``` +πŸ“ project_name/ +β”œβ”€β”€ πŸ“ schema_name1/ +β”œβ”€β”€ πŸ“ schema_name2/ +β”œβ”€β”€ πŸ“ schema_name3/ +β”‚ β”œβ”€β”€ objects/ +β”‚ β”‚ └── table1/ +β”‚ β”‚ └── key1-value1/ +β”‚ └── fields/ +β”‚ └── table1-field1/ +└── ... +``` + +### S3/MinIO Policy Example + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": ["s3:GetObject"], + "Resource": "arn:aws:s3:::my-lab-data/datajoint/ephys/*" + }, + { + "Effect": "Allow", + "Action": ["s3:GetObject", "s3:PutObject"], + "Resource": "arn:aws:s3:::my-lab-data/datajoint/analysis/*" + } + ] +} +``` + +### Considerations + +- Object paths include schema name: `{project}/{schema}/{table}/...` +- Users need read access to fetch blobs from upstream schemas +- Content-addressed storage (``) shares objects across tables +- Garbage collection requires coordinated delete permissions + +## Pipeline Initialization + +### Schema Creation Order + +Initialize schemas in dependency order: + +```python +# my_pipeline/__init__.py +from . import subject # No dependencies +from . import session # Depends on subject +from . import ephys # Depends on session +from . import imaging # Depends on session +from . import analysis # Depends on ephys, imaging + +def initialize(): + """Create all schemas in dependency order.""" + # Schemas are created when modules are imported + # and tables are first accessed + subject.Subject() + session.Session() + ephys.Recording() + imaging.Scan() + analysis.MultiModalAnalysis() +``` + +### Version Coordination + +Track schema versions with your code: + +```python +# my_pipeline/version.py +__version__ = "1.2.0" + +SCHEMA_VERSIONS = { + 'subject': '1.0.0', + 'session': '1.1.0', + 'ephys': '1.2.0', + 'imaging': '1.2.0', + 'analysis': '1.2.0', +} +``` + +## Team Workflows + +### Development vs Production + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Development β”‚ β”‚ Production β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ dev_subject β”‚ β”‚ subject β”‚ +β”‚ dev_session β”‚ β”‚ session β”‚ +β”‚ dev_ephys β”‚ β”‚ ephys β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ β”‚ + β”‚ Schema promotion β”‚ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +### Branching Strategy + +``` +main ────────────────────────────────────▢ + β”‚ β”‚ + β”‚ feature/ β”‚ hotfix/ + β–Ό β–Ό + ephys-v2 fix-recording + β”‚ β”‚ + └──────────────┴──▢ main +``` + +## Summary of Complexities + +Managing a team pipeline requires coordinating: + +| Component | Challenges | +|-----------|------------| +| **Code** | Module dependencies, version control, deployment | +| **Database** | User accounts, schema permissions, role hierarchy | +| **Object Storage** | Bucket policies, credential distribution, path alignment | +| **Compute** | Worker deployment, job distribution, resource allocation | +| **Monitoring** | Progress tracking, error alerting, audit logging | + +These challenges grow with team size and pipeline complexity. The [DataJoint Platform](https://www.datajoint.com/sign-up) provides integrated management for all these concerns. + +## See Also + +- [Configure Object Storage](configure-storage.md) β€” Storage setup +- [Distributed Computing](distributed-computing.md) β€” Multi-worker pipelines +- [Model Relationships](model-relationships.md) β€” Foreign key patterns + + +--- +## File: how-to/migrate-from-0x.md + +# Migrate from 0.x + +Upgrade existing pipelines from DataJoint 0.x to DataJoint 2.0. + +DataJoint jumped from version 0.14 directly to 2.0 to communicate the significance of this release. See [What's New in DataJoint 2.0](../explanation/whats-new-2.md) for a summary of major features. + +## Configuration Changes + +### Config File + +Replace `dj_local_conf.json` with `datajoint.json`: + +```json +{ + "database": { + "host": "localhost", + "user": "datajoint", + "port": 3306 + }, + "object_storage": { + "project_name": "my_project", + "protocol": "file", + "location": "/data/store" + } +} +``` + +### Secrets + +Move credentials to `.secrets/` directory: + +``` +.secrets/ +β”œβ”€β”€ database.password +β”œβ”€β”€ object_storage.access_key +└── object_storage.secret_key +``` + +### Environment Variables + +New prefix pattern: + +| 0.x | 2.0 | +|-----|-----| +| `DJ_HOST` | `DJ_HOST` (unchanged) | +| `DJ_USER` | `DJ_USER` (unchanged) | +| `DJ_PASS` | `DJ_PASS` (unchanged) | +| β€” | `DJ_OBJECT_STORAGE_*` | +| β€” | `DJ_JOBS_*` | + +## Type System Changes + +### Blob Types + +Update blob syntax: + +```python +# 0.x syntax +definition = """ +data : longblob +data_external : blob@store +""" + +# 2.0 syntax +definition = """ +data : +data_external : +""" +``` + +### Attach Types + +```python +# 0.x +attachment : attach + +# 2.0 +attachment : +attachment_ext : +``` + +### Filepath Types + +```python +# 0.x (copy-based) +file : filepath@store + +# 2.0 (ObjectRef-based) +file : +``` + +## Jobs System Changes + +### Per-Table Jobs + +Jobs are now per-table instead of per-schema: + +```python +# 0.x: schema-level ~jobs table +schema.jobs + +# 2.0: per-table ~~table_name +MyTable.jobs +MyTable.jobs.pending +MyTable.jobs.errors +``` + +### Jobs Configuration + +```python +# 2.0 job settings +dj.config.jobs.auto_refresh = True +dj.config.jobs.keep_completed = True +dj.config.jobs.stale_timeout = 3600 +dj.config.jobs.version_method = "git" +``` + +## Query Changes + +### Universal Set + +```python +# 0.x +dj.U() * expression + +# 2.0 +dj.U() & expression +``` + +### Natural Join + +```python +# 0.x: @ operator for natural join +A @ B + +# 2.0: explicit method +A.join(B, semantic_check=False) +``` + +### Semantic Matching + +2.0 uses lineage-based matching by default: + +```python +# Attributes matched by lineage, not just name +result = A * B # Semantic join (default) + +# Force name-only matching +result = A.join(B, semantic_check=False) +``` + +## Migration Steps + +### 1. Update Configuration + +```bash +# Move config file +mv dj_local_conf.json datajoint.json + +# Create secrets directory +mkdir .secrets +echo "password" > .secrets/database.password +chmod 600 .secrets/database.password +``` + +### 2. Update Table Definitions + +Run migration analysis: + +```python +from datajoint.migrate import analyze_blob_columns + +# Find columns needing migration +results = analyze_blob_columns(schema) +for table, columns in results: + print(f"{table}: {columns}") +``` + +Update definitions: + +```python +# Old +data : longblob + +# New +data : +``` + +### 3. Update Blob Column Metadata + +Add codec markers to existing columns: + +```python +from datajoint.migrate import migrate_blob_columns + +# Dry run +migrate_blob_columns(schema, dry_run=True) + +# Apply +migrate_blob_columns(schema, dry_run=False) +``` + +### 4. Update Jobs Code + +```python +# Old +schema.jobs + +# New +for table in [Table1, Table2, Table3]: + print(f"{table.__name__}: {table.jobs.progress()}") +``` + +### 5. Update Queries + +Search for deprecated patterns: + +```python +# Find uses of @ operator +grep -r " @ " *.py + +# Find dj.U() * pattern +grep -r "dj.U() \*" *.py +``` + +## Compatibility Notes + +### Semantic Matching + +2.0's semantic matching may change join behavior if: + +- Tables have attributes with same name but different lineage +- You relied on name-only matching + +Test joins carefully after migration. + +### External Storage + +Object storage paths changed. If using external storage: +1. Keep 0.x stores accessible during migration +2. Re-insert data to new storage format if needed +3. Or configure stores to use existing paths + +### Database Compatibility + +2.0 is compatible with MySQL 5.7+ and PostgreSQL 12+. +No database migration required for core functionality. + +## See Also + +- [Configure Object Storage](configure-storage.md) β€” New storage configuration +- [Distributed Computing](distributed-computing.md) β€” Jobs 2.0 system + + +--- +## File: how-to/model-relationships.md + +# Model Relationships + +Define foreign key relationships between tables. + +## Basic Foreign Key + +Reference another table with `->`: + +```python +@schema +class Subject(dj.Manual): + definition = """ + subject_id : varchar(16) + --- + species : varchar(32) + """ + +@schema +class Session(dj.Manual): + definition = """ + -> Subject + session_idx : uint16 + --- + session_date : date + """ +``` + +The `->` syntax: + +- Inherits all primary key attributes from the referenced table +- Creates a foreign key constraint +- Establishes dependency for cascading deletes +- Defines workflow order (parent must exist before child) + +## Foreign Key Placement + +Where you place a foreign key determines the relationship type: + +| Placement | Relationship | Diagram Line | +|-----------|--------------|--------------| +| Entire primary key | One-to-one extension | Thick solid | +| Part of primary key | One-to-many containment | Thin solid | +| Secondary attribute | One-to-many reference | Dashed | + +## One-to-Many: Containment + +Foreign key as part of the primary key (above `---`): + +```python +@schema +class Session(dj.Manual): + definition = """ + -> Subject # Part of primary key + session_idx : uint16 # Additional PK attribute + --- + session_date : date + """ +``` + +Sessions are identified **within** their subject. Session #1 for Subject A is different from Session #1 for Subject B. + +## One-to-Many: Reference + +Foreign key as secondary attribute (below `---`): + +```python +@schema +class Recording(dj.Manual): + definition = """ + recording_id : uuid # Independent identity + --- + -> Equipment # Reference, not part of identity + duration : float32 + """ +``` + +Recordings have their own global identity independent of equipment. + +## One-to-One: Extension + +Foreign key is the entire primary key: + +```python +@schema +class SubjectDetails(dj.Manual): + definition = """ + -> Subject # Entire primary key + --- + weight : float32 + notes : varchar(1000) + """ +``` + +Each subject has at most one details record. The tables share identity. + +## Optional (Nullable) Foreign Keys + +Make a reference optional with `[nullable]`: + +```python +@schema +class Trial(dj.Manual): + definition = """ + -> Session + trial_idx : uint16 + --- + -> [nullable] Stimulus # Some trials have no stimulus + outcome : enum('hit', 'miss') + """ +``` + +Only secondary foreign keys (below `---`) can be nullable. + +## Unique Foreign Keys + +Enforce one-to-one with `[unique]`: + +```python +@schema +class ParkingSpot(dj.Manual): + definition = """ + spot_id : uint32 + --- + -> [unique] Employee # Each employee has at most one spot + location : varchar(30) + """ +``` + +## Many-to-Many + +Use an association table with composite primary key: + +```python +@schema +class Assignment(dj.Manual): + definition = """ + -> Subject + -> Protocol + --- + assigned_date : date + """ +``` + +Each subject-protocol combination appears at most once. + +## Hierarchies + +Cascading one-to-many relationships create tree structures: + +```python +@schema +class Study(dj.Manual): + definition = """ + study : varchar(8) + --- + investigator : varchar(60) + """ + +@schema +class Subject(dj.Manual): + definition = """ + -> Study + subject_id : varchar(12) + --- + species : varchar(32) + """ + +@schema +class Session(dj.Manual): + definition = """ + -> Subject + session_idx : uint16 + --- + session_date : date + """ +``` + +Primary keys cascade: Session's key is `(study, subject_id, session_idx)`. + +## Part Tables + +Part tables have an implicit foreign key to their master: + +```python +@schema +class Session(dj.Manual): + definition = """ + -> Subject + session_idx : uint16 + --- + session_date : date + """ + + class Trial(dj.Part): + definition = """ + -> master + trial_idx : uint16 + --- + outcome : enum('hit', 'miss') + """ +``` + +`-> master` references the enclosing table's primary key. + +## Renamed Foreign Keys + +Reference the same table multiple times with renamed attributes: + +```python +@schema +class Comparison(dj.Manual): + definition = """ + -> Session.proj(session_a='session_idx') + -> Session.proj(session_b='session_idx') + --- + similarity : float32 + """ +``` + +## Computed Dependencies + +Computed tables inherit keys from their dependencies: + +```python +@schema +class ProcessedData(dj.Computed): + definition = """ + -> RawData + --- + result : float64 + """ + + def make(self, key): + data = (RawData & key).fetch1('data') + self.insert1({**key, 'result': process(data)}) +``` + +## Schema as DAG + +DataJoint schemas form a directed acyclic graph (DAG). Foreign keys: + +- Define data relationships +- Prescribe workflow execution order +- Enable cascading deletes + +There are no cyclic dependenciesβ€”parent tables must always be populated before their children. + +## See Also + +- [Define Tables](define-tables.md) β€” Table definition syntax +- [Design Primary Keys](design-primary-keys.md) β€” Key selection strategies +- [Delete Data](delete-data.md) β€” Cascade behavior + + +--- +## File: how-to/monitor-progress.md + +# Monitor Progress + +Track computation progress and job status. + +## Progress Display + +Show progress bar during populate: + +```python +ProcessedData.populate(display_progress=True) +``` + +## Check Remaining Work + +Count entries left to compute: + +```python +# What's left to compute +remaining = ProcessedData.key_source - ProcessedData +print(f"{len(remaining)} entries remaining") +``` + +## Job Status Summary + +Get counts by status: + +```python +progress = ProcessedData.jobs.progress() +# {'pending': 100, 'reserved': 5, 'error': 3, 'success': 892} + +for status, count in progress.items(): + print(f"{status}: {count}") +``` + +## Filter Jobs by Status + +Access jobs by their current status: + +```python +# Pending jobs (waiting to run) +ProcessedData.jobs.pending + +# Currently running +ProcessedData.jobs.reserved + +# Failed jobs +ProcessedData.jobs.errors + +# Completed jobs (if keep_completed=True) +ProcessedData.jobs.completed + +# Skipped jobs +ProcessedData.jobs.ignored +``` + +## View Job Details + +Inspect specific jobs: + +```python +# All jobs for a key +(ProcessedData.jobs & key).fetch1() + +# Recent errors +ProcessedData.jobs.errors.to_dicts( + order_by='completed_time DESC', + limit=10 +) +``` + +## Worker Information + +See which workers are processing: + +```python +for job in ProcessedData.jobs.reserved.to_dicts(): + print(f"Key: {job}") + print(f"Host: {job['host']}") + print(f"PID: {job['pid']}") + print(f"Started: {job['reserved_time']}") +``` + +## Computation Timing + +Track how long jobs take: + +```python +# Average duration of completed jobs +completed = ProcessedData.jobs.completed.to_arrays('duration') +print(f"Average: {np.mean(completed):.1f}s") +print(f"Median: {np.median(completed):.1f}s") +``` + +## Enable Job Metadata + +Store timing info in computed tables: + +```python +import datajoint as dj + +dj.config.jobs.add_job_metadata = True +dj.config.jobs.keep_completed = True +``` + +This adds hidden attributes to computed tables: + +- `_job_start_time` β€” When computation began +- `_job_duration` β€” How long it took +- `_job_version` β€” Code version (if configured) + +## Simple Progress Script + +```python +import time +from my_pipeline import ProcessedData + +while True: + remaining = len(ProcessedData.key_source - ProcessedData) + progress = ProcessedData.jobs.progress() + + print(f"\rRemaining: {remaining} | " + f"Pending: {progress.get('pending', 0)} | " + f"Running: {progress.get('reserved', 0)} | " + f"Errors: {progress.get('error', 0)}", end='') + + if remaining == 0: + print("\nDone!") + break + + time.sleep(10) +``` + +## Pipeline-Wide Status + +Check multiple tables: + +```python +tables = [RawData, ProcessedData, Analysis] + +for table in tables: + total = len(table.key_source) + done = len(table()) + print(f"{table.__name__}: {done}/{total} ({done/total:.0%})") +``` + +## See Also + +- [Run Computations](run-computations.md) β€” Basic populate usage +- [Distributed Computing](distributed-computing.md) β€” Multi-worker setup +- [Handle Errors](handle-errors.md) β€” Error recovery + + +--- +## File: how-to/query-data.md + +# Query Data + +Filter, join, and transform data with DataJoint operators. + +## Restriction (`&`) + +Filter rows that match a condition: + +```python +# String condition +Session & "session_date > '2026-01-01'" +Session & "duration BETWEEN 30 AND 60" + +# Dictionary (exact match) +Session & {'subject_id': 'M001'} +Session & {'subject_id': 'M001', 'session_idx': 1} + +# Query expression +Session & Subject # Sessions for subjects in Subject +Session & (Subject & "sex = 'M'") # Sessions for male subjects + +# List (OR) +Session & [{'subject_id': 'M001'}, {'subject_id': 'M002'}] +``` + +## Top N Rows (`dj.Top`) + +Limit results with optional ordering: + +```python +# First 10 by primary key +Session & dj.Top(10) + +# Top 10 by date (descending) +Session & dj.Top(10, 'session_date DESC') + +# Pagination: skip 20, take 10 +Session & dj.Top(10, 'session_date DESC', offset=20) + +# All rows ordered +Session & dj.Top(None, 'session_date DESC') +``` + +Use `"KEY"` for primary key ordering, `"KEY DESC"` for reverse: + +```python +Session & dj.Top(10, 'KEY DESC') # Last 10 by primary key +``` + +## Anti-Restriction (`-`) + +Filter rows that do NOT match: + +```python +Subject - Session # Subjects without sessions +Session - {'subject_id': 'M001'} +``` + +## Projection (`.proj()`) + +Select, rename, or compute attributes: + +```python +# Primary key only +Subject.proj() + +# Specific attributes +Subject.proj('species', 'sex') + +# All attributes +Subject.proj(...) + +# All except some +Subject.proj(..., '-notes') + +# Rename +Subject.proj(animal_species='species') + +# Computed +Subject.proj(weight_kg='weight / 1000') +``` + +## Join (`*`) + +Combine tables on matching attributes: + +```python +Subject * Session +Subject * Session * Experimenter + +# Restrict then join +(Subject & "sex = 'M'") * Session +``` + +## Aggregation (`.aggr()`) + +Group and summarize: + +```python +# Count trials per session +Session.aggr(Session.Trial, n_trials='count(trial_idx)') + +# Multiple aggregates +Session.aggr( + Session.Trial, + n_trials='count(trial_idx)', + avg_rt='avg(reaction_time)', + min_rt='min(reaction_time)' +) + +# Exclude sessions without trials +Session.aggr(Session.Trial, n='count(trial_idx)', exclude_nonmatching=True) +``` + +## Universal Set (`dj.U()`) + +Group by arbitrary attributes: + +```python +# Unique values +dj.U('species') & Subject + +# Group by non-primary-key attribute +dj.U('session_date').aggr(Session, n='count(session_idx)') + +# Global aggregation (one row) +dj.U().aggr(Session, total='count(*)') +``` + +## Extension (`.extend()`) + +Add attributes without losing rows: + +```python +# Add experimenter info, keep all sessions +Session.extend(Experimenter) +``` + +## Chain Operations + +```python +result = ( + Subject + & "sex = 'M'" + * Session + & "duration > 30" +).proj('species', 'session_date', 'duration') +``` + +## Operator Precedence + +| Priority | Operator | Operation | +|----------|----------|-----------| +| Highest | `*` | Join | +| | `+`, `-` | Union, Anti-restriction | +| Lowest | `&` | Restriction | + +Use parentheses for clarity: + +```python +(Subject & condition) * Session # Restrict then join +Subject * (Session & condition) # Join then restrict +``` + +## View Query + +```python +# See generated SQL +print((Subject & condition).make_sql()) + +# Count rows without fetching +len(Subject & condition) +``` + +## See Also + +- [Operators Reference](../reference/operators.md) β€” Complete operator documentation +- [Fetch Results](fetch-results.md) β€” Retrieving query results + + +--- +## File: how-to/run-computations.md + +# Run Computations + +Execute automated computations with `populate()`. + +## Basic Usage + +```python +# Populate all missing entries +ProcessedData.populate() + +# With progress display +ProcessedData.populate(display_progress=True) +``` + +## Restrict What to Compute + +```python +# Only specific subjects +ProcessedData.populate(Subject & "sex = 'M'") + +# Only recent sessions +ProcessedData.populate(Session & "session_date > '2026-01-01'") + +# Specific key +ProcessedData.populate({'subject_id': 'M001', 'session_idx': 1}) +``` + +## Limit Number of Jobs + +```python +# Process at most 100 entries +ProcessedData.populate(limit=100) +``` + +## Error Handling + +```python +# Continue on errors (log but don't stop) +ProcessedData.populate(suppress_errors=True) + +# Check what failed +failed = ProcessedData.jobs & 'status = "error"' +print(failed) + +# Clear errors to retry +failed.delete() +ProcessedData.populate() +``` + +## Distributed Computing + +```python +# Reserve jobs to prevent conflicts between workers +ProcessedData.populate(reserve_jobs=True) + +# Run on multiple machines/processes simultaneously +# Each worker reserves and processes different keys +``` + +## Check Progress + +```python +# What's left to compute +remaining = ProcessedData.key_source - ProcessedData +print(f"{len(remaining)} entries remaining") + +# View job status +ProcessedData.jobs +``` + +## The `make()` Method + +```python +@schema +class ProcessedData(dj.Computed): + definition = """ + -> RawData + --- + result : float64 + """ + + def make(self, key): + # 1. Fetch input data + raw = (RawData & key).fetch1('data') + + # 2. Compute + result = process(raw) + + # 3. Insert + self.insert1({**key, 'result': result}) +``` + +## Three-Part Make for Long Computations + +For computations taking hours or days: + +```python +@schema +class LongComputation(dj.Computed): + definition = """ + -> RawData + --- + result : float64 + """ + + def make_fetch(self, key): + """Fetch input data (outside transaction)""" + data = (RawData & key).fetch1('data') + return (data,) + + def make_compute(self, key, fetched): + """Perform computation (outside transaction)""" + (data,) = fetched + result = expensive_computation(data) + return (result,) + + def make_insert(self, key, fetched, computed): + """Insert results (inside brief transaction)""" + (result,) = computed + self.insert1({**key, 'result': result}) +``` + +## Custom Key Source + +```python +@schema +class FilteredComputation(dj.Computed): + definition = """ + -> RawData + --- + result : float64 + """ + + @property + def key_source(self): + # Only compute for high-quality data + return (RawData & 'quality > 0.8') - self +``` + +## Populate Options + +| Option | Default | Description | +|--------|---------|-------------| +| `restriction` | `None` | Filter what to compute | +| `limit` | `None` | Max entries to process | +| `display_progress` | `False` | Show progress bar | +| `reserve_jobs` | `False` | Reserve jobs for distributed computing | +| `suppress_errors` | `False` | Continue on errors | + +## See Also + +- [Computation Model](../explanation/computation-model.md) β€” How computation works +- [Distributed Computing](distributed-computing.md) β€” Multi-worker setup +- [Handle Errors](handle-errors.md) β€” Error recovery + + +--- +## File: how-to/use-cli.md + +# Use the Command-Line Interface + +Start an interactive Python REPL with DataJoint pre-loaded. + +The `dj` command provides quick access to DataJoint for exploring schemas, running queries, and testing connections without writing scripts. + +## Start the REPL + +```bash +dj +``` + +This opens a Python REPL with `dj` (DataJoint) already imported: + +``` +DataJoint 2.0.0 REPL +Type 'dj.' and press Tab for available functions. + +>>> dj.conn() # Connect to database +>>> dj.list_schemas() # List available schemas +``` + +## Specify Database Credentials + +Override config file settings from the command line: + +```bash +dj --host localhost:3306 --user root --password secret +``` + +| Option | Description | +|--------|-------------| +| `--host HOST` | Database host as `host:port` | +| `-u`, `--user USER` | Database username | +| `-p`, `--password PASS` | Database password | + +Credentials from command-line arguments override values in config files. + +## Load Schemas as Virtual Modules + +Load database schemas directly into the REPL namespace: + +```bash +dj -s my_lab:lab -s my_analysis:analysis +``` + +The format is `schema_name:alias` where: +- `schema_name` is the database schema name +- `alias` is the variable name in the REPL + +This outputs: + +``` +DataJoint 2.0.0 REPL +Type 'dj.' and press Tab for available functions. + +Loaded schemas: + lab -> my_lab + analysis -> my_analysis + +>>> lab.Subject.to_dicts() # Query Subject table +>>> dj.Diagram(lab.schema) # View schema diagram +``` + +## Common Workflows + +### Explore an Existing Schema + +```bash +dj -s production_db:db +``` + +```python +>>> list(db.schema) # List all tables +>>> db.Experiment().to_dicts()[:5] # Preview data +>>> dj.Diagram(db.schema) # Visualize structure +``` + +### Quick Data Check + +```bash +dj --host db.example.com -s my_lab:lab +``` + +```python +>>> len(lab.Session()) # Count sessions +>>> lab.Session.describe() # Show table definition +``` + +### Test Connection + +```bash +dj --host localhost:3306 --user testuser --password testpass +``` + +```python +>>> dj.conn() # Verify connection works +>>> dj.list_schemas() # Check accessible schemas +``` + +## Version Information + +Display DataJoint version: + +```bash +dj --version +``` + +## Help + +Display all options: + +```bash +dj --help +``` + +## Entry Points + +The CLI is available as both `dj` and `datajoint`: + +```bash +dj --version +datajoint --version # Same command +``` + +## Programmatic Usage + +The CLI function can also be called from Python: + +```python +from datajoint.cli import cli + +# Show version and exit +cli(["--version"]) + +# Start REPL with schemas +cli(["-s", "my_lab:lab"]) +``` + + +--- +## File: how-to/use-object-storage.md + +# Use Object Storage + +Store large data objects as part of your Object-Augmented Schema. + +## Object-Augmented Schema (OAS) + +An **Object-Augmented Schema** extends relational tables with object storage as a unified system. The relational database stores metadata, references, and small values while large objects (arrays, files, datasets) are stored in object storage. DataJoint maintains referential integrity across both storage layersβ€”when you delete a row, its associated objects are cleaned up automatically. + +OAS supports three storage sections: + +| Section | Location | Addressing | Use Case | +|---------|----------|------------|----------| +| **Internal** | Database | Row-based | Small objects (< 1 MB) | +| **Hash-addressed** | Object store | Content hash | Arrays, files (deduplication) | +| **Path-addressed** | Object store | Primary key path | Zarr, HDF5, streaming access | + +For complete details, see the [Type System specification](../reference/specs/type-system.md). + +## When to Use Object Storage + +Use the `@` modifier for: + +- Large arrays (images, videos, neural recordings) +- File attachments +- Zarr arrays and HDF5 files +- Any data too large for efficient database storage + +## Internal vs Object Storage + +```python +@schema +class Recording(dj.Manual): + definition = """ + recording_id : uuid + --- + metadata : # Internal: stored in database + raw_data : # Object storage: stored externally + """ +``` + +| Syntax | Storage | Best For | +|--------|---------|----------| +| `` | Database | Small objects (< 1 MB) | +| `` | Default store | Large objects | +| `` | Named store | Specific storage tier | + +## Store Data + +Insert works the same regardless of storage location: + +```python +import numpy as np + +Recording.insert1({ + 'recording_id': uuid.uuid4(), + 'metadata': {'channels': 32, 'rate': 30000}, + 'raw_data': np.random.randn(32, 30000) # ~7.7 MB array +}) +``` + +DataJoint automatically routes to the configured store. + +## Retrieve Data + +Fetch works transparently: + +```python +data = (Recording & key).fetch1('raw_data') +# Returns the numpy array, regardless of where it was stored +``` + +## Named Stores + +Use different stores for different data types: + +```python +@schema +class Experiment(dj.Manual): + definition = """ + experiment_id : uuid + --- + raw_video : # Fast local storage + processed : # S3 for long-term + """ +``` + +Configure stores in `datajoint.json`: + +```json +{ + "object_storage": { + "stores": { + "raw": {"protocol": "file", "location": "/fast/storage"}, + "archive": {"protocol": "s3", "bucket": "archive", ...} + } + } +} +``` + +## Hash-Addressed Storage + +`` and `` use **hash-addressed** storage: + +- Objects are stored by their content hash (SHA-256) +- Identical data is stored once (automatic deduplication) +- Multiple rows can reference the same object +- Immutableβ€”changing data creates a new object + +```python +# These two inserts store the same array only once +data = np.zeros((1000, 1000)) +Table.insert1({'id': 1, 'array': data}) +Table.insert1({'id': 2, 'array': data}) # References same object +``` + +## Path-Addressed Storage + +`` uses **path-addressed** storage for file-like objects: + +- Objects stored at predictable paths based on primary key +- Path format: `{schema}/{table}/{pk_hash}/{attribute}/` +- Supports streaming access and partial reads +- Mutableβ€”can update in place (e.g., append to Zarr) + +```python +@schema +class Dataset(dj.Manual): + definition = """ + dataset_id : uuid + --- + zarr_array : # Zarr array stored by path + """ +``` + +Use path-addressed storage for: + +- Zarr arrays (chunked, appendable) +- HDF5 files +- Large datasets requiring streaming access + +## Write Directly to Object Storage + +For large datasets like multi-GB imaging recordings, avoid intermediate copies by writing directly to object storage with `staged_insert1`: + +```python +import zarr + +@schema +class ImagingSession(dj.Manual): + definition = """ + subject_id : int32 + session_id : int32 + --- + n_frames : int32 + frame_rate : float32 + frames : + """ + +# Write Zarr directly to object storage +with ImagingSession.staged_insert1 as staged: + # 1. Set primary key values first + staged.rec['subject_id'] = 1 + staged.rec['session_id'] = 1 + + # 2. Get storage handle + store = staged.store('frames', '.zarr') + + # 3. Write directly (no local copy) + z = zarr.open(store, mode='w', shape=(1000, 512, 512), + chunks=(10, 512, 512), dtype='uint16') + for i in range(1000): + z[i] = acquire_frame() # Write frame-by-frame + + # 4. Set remaining attributes + staged.rec['n_frames'] = 1000 + staged.rec['frame_rate'] = 30.0 + +# Record inserted with computed metadata on successful exit +``` + +The `staged_insert1` context manager: + +- Writes directly to the object store (no intermediate files) +- Computes metadata (size, manifest) automatically on exit +- Cleans up storage if an error occurs (atomic) +- Requires primary key values before calling `store()` or `open()` + +Use `staged.store(field, ext)` for FSMap access (Zarr), or `staged.open(field, ext)` for file-like access. + +## Attachments + +Preserve original filenames with ``: + +```python +@schema +class Document(dj.Manual): + definition = """ + doc_id : uuid + --- + report : # Preserves filename + """ + +# Insert with AttachFileType +from datajoint import AttachFileType +Document.insert1({ + 'doc_id': uuid.uuid4(), + 'report': AttachFileType('/path/to/report.pdf') +}) +``` + +## Lazy Loading with ObjectRef + +`` and `` return lazy references: + +```python +ref = (Dataset & key).fetch1('zarr_array') + +# Open for streaming access +with ref.open() as f: + data = zarr.open(f) + +# Or download to local path +local_path = ref.download('/tmp/data') +``` + +## Storage Best Practices + +### Choose the Right Codec + +| Data Type | Codec | Storage | +|-----------|-------|---------| +| NumPy arrays | `` | Hash-addressed | +| File attachments | `` | Hash-addressed | +| Zarr/HDF5 | `` | Path-addressed | +| File references | `` | Path-addressed | + +### Size Guidelines + +- **< 1 MB**: Internal storage (``) is fine +- **1 MB - 1 GB**: Object storage (``) +- **> 1 GB**: Path-addressed (``) for streaming + +### Store Tiers + +Configure stores for different access patterns: + +```json +{ + "object_storage": { + "stores": { + "hot": {"protocol": "file", "location": "/ssd/data"}, + "warm": {"protocol": "s3", "bucket": "project-data"}, + "cold": {"protocol": "s3", "bucket": "archive", ...} + } + } +} +``` + +## See Also + +- [Configure Object Storage](configure-storage.md) β€” Storage setup +- [Create Custom Codecs](create-custom-codec.md) β€” Domain-specific types +- [Manage Large Data](manage-large-data.md) β€” Working with blobs + + +============================================================ +# Reference +============================================================ + + +--- +## File: reference/configuration.md + +# Configuration Reference + +DataJoint configuration options and settings. + +## Configuration Sources + +Configuration is loaded in priority order: + +1. **Environment variables** (highest priority) +2. **Secrets directory** (`.secrets/`) +3. **Config file** (`datajoint.json`) +4. **Defaults** (lowest priority) + +## Database Settings + +| Setting | Environment | Default | Description | +|---------|-------------|---------|-------------| +| `database.host` | `DJ_HOST` | `localhost` | MySQL server hostname | +| `database.port` | `DJ_PORT` | `3306` | MySQL server port | +| `database.user` | `DJ_USER` | β€” | Database username | +| `database.password` | `DJ_PASS` | β€” | Database password | + +## Object Storage Settings + +| Setting | Environment | Default | Description | +|---------|-------------|---------|-------------| +| `stores.default` | β€” | β€” | Default store name | +| `stores..protocol` | β€” | `file` | Storage protocol (file, s3, gs) | +| `stores..endpoint` | β€” | β€” | S3-compatible endpoint URL | +| `stores..bucket` | β€” | β€” | Bucket or root path | + +## Jobs Settings + +| Setting | Default | Description | +|---------|---------|-------------| +| `jobs.auto_refresh` | `True` | Auto-refresh job queue on populate | +| `jobs.keep_completed` | `False` | Retain success records | +| `jobs.stale_timeout` | `3600` | Seconds before stale job cleanup | +| `jobs.add_job_metadata` | `False` | Add hidden metadata to computed tables | + +## Display Settings + +| Setting | Default | Description | +|---------|---------|-------------| +| `display.limit` | `12` | Max rows to display | +| `display.width` | `14` | Column width | + +## Example Configuration + +### datajoint.json + +```json +{ + "database.host": "mysql.example.com", + "database.port": 3306, + "stores": { + "main": { + "protocol": "s3", + "endpoint": "s3.amazonaws.com", + "bucket": "my-data-bucket" + } + }, + "jobs": { + "add_job_metadata": true + } +} +``` + +### Environment Variables + +```bash +export DJ_HOST=mysql.example.com +export DJ_USER=analyst +export DJ_PASS=secret +``` + +### Secrets Directory + +``` +.secrets/ +β”œβ”€β”€ database.user # Contains: analyst +β”œβ”€β”€ database.password # Contains: secret +└── aws.access_key_id # Contains: AKIA... +``` + +## API Reference + +See [Settings API](../api/datajoint/settings.md) for programmatic access. + + +--- +## File: reference/definition-syntax.md + +# Table Definition Syntax + +DataJoint's declarative table definition language. + +## Basic Structure + +```python +@schema +class TableName(dj.Manual): + definition = """ + # Table comment + primary_attr1 : type # comment + primary_attr2 : type # comment + --- + secondary_attr1 : type # comment + secondary_attr2 = default : type # comment with default + """ +``` + +## Grammar + +``` +definition = [comment] pk_section "---" secondary_section +pk_section = attribute_line+ +secondary_section = attribute_line* + +attribute_line = [foreign_key | attribute] +foreign_key = "->" table_reference [alias] +attribute = [default "="] name ":" type [# comment] + +default = NULL | literal | CURRENT_TIMESTAMP +type = core_type | codec_type | native_type +core_type = int32 | float64 | varchar(n) | ... +codec_type = "<" name ["@" [store]] ">" +``` + +## Foreign Keys + +```python +-> ParentTable # Inherit all PK attributes +-> ParentTable.proj(new='old') # Rename attributes +``` + +## Attribute Types + +### Core Types + +```python +mouse_id : int32 # 32-bit integer +weight : float64 # 64-bit float +name : varchar(100) # Variable string up to 100 chars +is_active : bool # Boolean +created : datetime # Date and time +data : json # JSON document +``` + +### Codec Types + +```python +image : # Serialized Python object (in DB) +large_array : # Serialized Python object (external) +config_file : # File attachment (in DB) +data_file : # File attachment (named store) +zarr_data : # Path-addressed folder +raw_path : # Portable file reference +``` + +## Defaults + +```python +status = "pending" : varchar(20) # String default +count = 0 : int32 # Numeric default +notes = '' : varchar(1000) # Empty string default (preferred for strings) +created = CURRENT_TIMESTAMP : datetime # Auto-timestamp +ratio = NULL : float64 # Nullable (only NULL can be default) +``` + +**Nullable attributes:** An attribute is nullable if and only if its default is `NULL`. +DataJoint does not allow other defaults for nullable attributesβ€”this prevents ambiguity +about whether an attribute is optional. For strings, prefer empty string `''` as the +default rather than `NULL`. + +## Comments + +```python +# Table-level comment (first line) +mouse_id : int32 # Inline attribute comment +``` + +## Indexes + +```python +definition = """ + ... + --- + ... + INDEX (attr1) # Single-column index + INDEX (attr1, attr2) # Composite index + UNIQUE INDEX (email) # Unique constraint + """ +``` + +## Complete Example + +```python +@schema +class Session(dj.Manual): + definition = """ + # Experimental session + -> Subject + session_idx : int32 # Session number for this subject + --- + session_date : date # Date of session + -> [nullable] Experimenter # Optional experimenter + notes = '' : varchar(1000) # Session notes + start_time : datetime # Session start + duration : float64 # Duration in minutes + INDEX (session_date) + """ +``` + +## Validation + +DataJoint validates definitions at declaration time: + +- Primary key must have at least one attribute +- Attribute names must be valid identifiers +- Types must be recognized +- Foreign key references must exist +- No circular dependencies allowed + +## See Also + +- [Primary Keys](specs/primary-keys.md) β€” Key determination rules +- [Type System](specs/type-system.md) β€” Type architecture +- [Codec API](specs/codec-api.md) β€” Custom types + + +--- +## File: reference/errors.md + +# Error Reference + +DataJoint exception classes and their meanings. + +## Exception Hierarchy + +``` +Exception +└── DataJointError + β”œβ”€β”€ LostConnectionError + β”œβ”€β”€ QueryError + β”‚ β”œβ”€β”€ QuerySyntaxError + β”‚ β”œβ”€β”€ AccessError + β”‚ β”œβ”€β”€ DuplicateError + β”‚ β”œβ”€β”€ IntegrityError + β”‚ β”œβ”€β”€ UnknownAttributeError + β”‚ └── MissingAttributeError + β”œβ”€β”€ MissingTableError + β”œβ”€β”€ MissingExternalFile + └── BucketInaccessible +``` + +## Base Exception + +### DataJointError + +Base class for all DataJoint-specific errors. + +```python +try: + # DataJoint operation +except dj.DataJointError as e: + print(f"DataJoint error: {e}") +``` + +## Connection Errors + +### LostConnectionError + +Database connection was lost during operation. + +**Common causes:** +- Network interruption +- Server timeout +- Server restart + +**Resolution:** +- Check network connectivity +- Reconnect with `dj.conn().connect()` + +## Query Errors + +### QuerySyntaxError + +Invalid query syntax. + +**Common causes:** +- Malformed restriction string +- Invalid attribute reference +- SQL syntax error in projection + +### AccessError + +Insufficient database privileges. + +**Common causes:** +- User lacks SELECT/INSERT/DELETE privileges +- Schema access not granted + +**Resolution:** +- Contact database administrator +- Check user grants + +### DuplicateError + +Attempt to insert duplicate primary key. + +```python +try: + table.insert1({'id': 1, 'name': 'Alice'}) + table.insert1({'id': 1, 'name': 'Bob'}) # Raises DuplicateError +except dj.errors.DuplicateError: + print("Entry already exists") +``` + +**Resolution:** +- Use `insert(..., skip_duplicates=True)` +- Use `insert(..., replace=True)` to update +- Check if entry exists before inserting + +### IntegrityError + +Foreign key constraint violation. + +**Common causes:** +- Inserting row with non-existent parent +- Parent row deletion blocked by children + +**Resolution:** +- Insert parent rows first +- Use cascade delete for parent + +### UnknownAttributeError + +Referenced attribute doesn't exist. + +```python +# Raises UnknownAttributeError +table.to_arrays('nonexistent_column') +``` + +**Resolution:** +- Check `table.heading` for available attributes +- Verify spelling + +### MissingAttributeError + +Required attribute not provided in insert. + +```python +# Raises MissingAttributeError if 'name' is required +table.insert1({'id': 1}) # Missing 'name' +``` + +**Resolution:** +- Provide all required attributes +- Set default values in definition + +## Table Errors + +### MissingTableError + +Table not declared in database. + +**Common causes:** +- Schema not created +- Table class not instantiated +- Database dropped + +**Resolution:** +- Check schema exists: `schema.is_activated()` +- Verify table declaration + +## Storage Errors + +### MissingExternalFile + +External file managed by DataJoint is missing. + +**Common causes:** +- File manually deleted from store +- Store misconfigured +- Network/permission issues + +**Resolution:** +- Check store configuration +- Verify file exists at expected path +- Run garbage collection audit + +### BucketInaccessible + +S3 bucket cannot be accessed. + +**Common causes:** +- Invalid credentials +- Bucket doesn't exist +- Network/firewall issues + +**Resolution:** +- Verify AWS credentials +- Check bucket name and region +- Test with AWS CLI + +## Handling Errors + +### Catching Specific Errors + +```python +import datajoint as dj + +try: + table.insert1(data) +except dj.errors.DuplicateError: + print("Entry exists, skipping") +except dj.errors.IntegrityError: + print("Parent entry missing") +except dj.DataJointError as e: + print(f"Other DataJoint error: {e}") +``` + +### Error Information + +```python +try: + table.insert1(data) +except dj.DataJointError as e: + print(f"Error type: {type(e).__name__}") + print(f"Message: {e}") + print(f"Args: {e.args}") +``` + +## See Also + +- [API: errors module](../api/datajoint/errors.md) + + +--- +## File: reference/index.md + +# Reference + +Specifications, API documentation, and technical details. + +## Specifications + +Detailed specifications of DataJoint's behavior and semantics. + +- [Primary Key Rules](specs/primary-keys.md) β€” How primary keys are determined in query results +- [Semantic Matching](specs/semantic-matching.md) β€” Attribute lineage and homologous matching +- [Type System](specs/type-system.md) β€” Core types, codecs, and storage modes +- [Codec API](specs/codec-api.md) β€” Creating custom attribute types +- [AutoPopulate](specs/autopopulate.md) β€” Jobs 2.0 specification +- [Fetch API](specs/fetch-api.md) β€” Data retrieval methods +- [Job Metadata](specs/job-metadata.md) β€” Hidden job tracking columns + +## Quick Reference + +- [Configuration](configuration.md) β€” All `dj.config` options +- [Definition Syntax](definition-syntax.md) β€” Table definition grammar +- [Operators](operators.md) β€” Query operator summary +- [Errors](errors.md) β€” Exception types and meanings + +## API Documentation + +Auto-generated from source code docstrings. + +- [API Index](../api/index.md) + + +--- +## File: reference/operators.md + +# Query Operators Reference + +DataJoint provides a small set of operators for querying data. All operators return new query expressions without modifying the originalβ€”queries are immutable and composable. + +## Operator Summary + +| Operator | Syntax | Description | +|----------|--------|-------------| +| Restriction | `A & condition` | Select rows matching condition | +| Anti-restriction | `A - condition` | Select rows NOT matching condition | +| Projection | `A.proj(...)` | Select, rename, or compute attributes | +| Join | `A * B` | Combine tables on matching attributes | +| Extension | `A.extend(B)` | Add attributes from B, keeping all rows of A | +| Aggregation | `A.aggr(B, ...)` | Group B by A's primary key and compute summaries | +| Union | `A + B` | Combine entity sets | + +--- + +## Restriction (`&`) + +Select rows that match a condition. + +```python +# String condition (SQL expression) +Session & "session_date > '2024-01-01'" +Session & "duration BETWEEN 30 AND 60" + +# Dictionary (exact match) +Session & {'subject_id': 'M001'} +Session & {'subject_id': 'M001', 'session_idx': 1} + +# Query expression (matching keys) +Session & Subject # Sessions for subjects in Subject table +Session & (Subject & "sex = 'M'") # Sessions for male subjects + +# List (OR of conditions) +Session & [{'subject_id': 'M001'}, {'subject_id': 'M002'}] +``` + +**Chaining**: Multiple restrictions combine with AND: +```python +Session & "duration > 30" & {'experimenter': 'alice'} +``` + +### Top N Rows (`dj.Top`) + +Restrict to the top N rows with optional ordering: + +```python +# First row by primary key +Session & dj.Top() + +# First 10 rows by primary key (ascending) +Session & dj.Top(10) + +# First 10 rows by primary key (descending) +Session & dj.Top(10, 'KEY DESC') + +# Top 5 by score descending +Result & dj.Top(5, 'score DESC') + +# Top 10 most recent sessions +Session & dj.Top(10, 'session_date DESC') + +# Pagination: skip 20, take 10 +Session & dj.Top(10, 'session_date DESC', offset=20) + +# All rows ordered (no limit) +Session & dj.Top(None, 'session_date DESC') +``` + +**Parameters**: +- `limit` (default=1): Maximum rows. Use `None` for no limit. +- `order_by` (default="KEY"): Attribute(s) to sort by. `"KEY"` expands to all primary key attributes. Add `DESC` for descending order (e.g., `"KEY DESC"`, `"score DESC"`). Use `None` to inherit existing order. +- `offset` (default=0): Rows to skip. + +**Chaining Tops**: When chaining multiple Top restrictions, the second Top can inherit the first's ordering by using `order_by=None`: + +```python +# First Top sets the order, second inherits it +(Session & dj.Top(100, 'date DESC')) & dj.Top(10, order_by=None) +# Result: top 10 of top 100 by date descending +``` + +**Note**: `dj.Top` can only be used with restriction (`&`), not with anti-restriction (`-`). + +--- + +## Anti-Restriction (`-`) + +Select rows that do NOT match a condition. + +```python +# Subjects without any sessions +Subject - Session + +# Sessions not from subject M001 +Session - {'subject_id': 'M001'} + +# Sessions without trials +Session - Trial +``` + +--- + +## Projection (`.proj()`) + +Select, rename, or compute attributes. Primary key is always included. + +```python +# Primary key only +Subject.proj() + +# Specific attributes +Subject.proj('species', 'sex') + +# All attributes +Subject.proj(...) + +# All except some +Subject.proj(..., '-notes', '-internal_id') + +# Rename attribute +Subject.proj(animal_species='species') + +# Computed attribute (SQL expression) +Subject.proj(weight_kg='weight / 1000') +Session.proj(year='YEAR(session_date)') +Trial.proj(is_correct='response = stimulus') +``` + +--- + +## Join (`*`) + +Combine tables on shared attributes. DataJoint matches attributes by **semantic matching**β€”only attributes with the same name AND same origin (through foreign keys) are matched. + +```python +# Join Subject and Session on subject_id +Subject * Session + +# Three-way join +Subject * Session * Experimenter + +# Join then restrict +(Subject * Session) & "sex = 'M'" + +# Restrict then join (equivalent) +(Subject & "sex = 'M'") * Session +``` + +**Primary key of result**: Determined by functional dependencies between operands. See [Query Algebra Specification](specs/query-algebra.md) for details. + +--- + +## Extension (`.extend()`) + +Add attributes from another table while preserving all rows. This is useful for adding optional attributes. + +```python +# Add experimenter info to sessions +# Sessions without an experimenter get NULL values +Session.extend(Experimenter) +``` + +**Requirement**: The left operand must "determine" the right operandβ€”all of B's primary key attributes must exist in A. + +--- + +## Aggregation (`.aggr()`) + +Group one entity type by another and compute summary statistics. + +```python +# Count trials per session +Session.aggr(Session.Trial, n_trials='count(trial_idx)') + +# Multiple aggregates +Session.aggr( + Session.Trial, + n_trials='count(trial_idx)', + n_correct='sum(correct)', + avg_rt='avg(reaction_time)', + min_rt='min(reaction_time)', + max_rt='max(reaction_time)' +) + +# Count sessions per subject +Subject.aggr(Session, n_sessions='count(session_idx)') +``` + +**Default behavior**: Keeps all rows from the grouping table (left operand), even those without matches. Use `count(pk_attribute)` to get 0 for entities without matches. + +```python +# All subjects, including those with 0 sessions +Subject.aggr(Session, n_sessions='count(session_idx)') + +# Only subjects with at least one session +Subject.aggr(Session, n_sessions='count(session_idx)', exclude_nonmatching=True) +``` + +### Common Aggregate Functions + +| Function | Description | +|----------|-------------| +| `count(attr)` | Count non-NULL values | +| `count(*)` | Count all rows (including NULL) | +| `sum(attr)` | Sum of values | +| `avg(attr)` | Average | +| `min(attr)` | Minimum | +| `max(attr)` | Maximum | +| `std(attr)` | Standard deviation | +| `group_concat(attr)` | Concatenate values | + +--- + +## Union (`+`) + +Combine entity sets from two tables with the same primary key. + +```python +# All subjects that are either mice or rats +Mouse + Rat +``` + +**Requirements**: +- Same primary key attributes +- No overlapping secondary attributes + +--- + +## Universal Set (`dj.U()`) + +Create ad-hoc groupings or extract unique values. + +### Unique Values + +```python +# Unique species +dj.U('species') & Subject + +# Unique (year, month) combinations +dj.U('year', 'month') & Session.proj(year='YEAR(session_date)', month='MONTH(session_date)') +``` + +### Aggregation by Non-Primary-Key Attributes + +```python +# Count sessions by date (session_date is not a primary key) +dj.U('session_date').aggr(Session, n='count(session_idx)') + +# Count by experimenter +dj.U('experimenter_id').aggr(Session, n='count(session_idx)') +``` + +### Universal Aggregation (Single Row Result) + +```python +# Total count across all sessions +dj.U().aggr(Session, total='count(*)') + +# Global statistics +dj.U().aggr(Trial, + total='count(*)', + avg_rt='avg(reaction_time)', + std_rt='std(reaction_time)' +) +``` + +--- + +## Operator Precedence + +Python operator precedence applies: + +| Precedence | Operator | Operation | +|------------|----------|-----------| +| Highest | `*` | Join | +| | `+`, `-` | Union, Anti-restriction | +| Lowest | `&` | Restriction | + +Use parentheses to make intent clear: + +```python +# Join happens before restriction +Subject * Session & condition # Same as: (Subject * Session) & condition + +# Use parentheses to restrict first +(Subject & condition) * Session +``` + +--- + +## Semantic Matching + +DataJoint uses **semantic matching** for joins and restrictions by query expression. Attributes match only if they have: + +1. The same name +2. The same origin (traced through foreign key lineage) + +This prevents accidental matches on attributes that happen to share names but represent different things (like generic `id` columns in unrelated tables). + +```python +# These match on subject_id because Session references Subject +Subject * Session # Correct: subject_id has same lineage + +# These would error if both have 'name' from different origins +Student * Course # Error if both define their own 'name' attribute +``` + +**Resolution**: Rename attributes to avoid conflicts: +```python +Student * Course.proj(..., course_name='name') +``` + +--- + +## See Also + +- [Query Algebra Specification](specs/query-algebra.md) β€” Complete formal specification +- [Fetch API](specs/fetch-api.md) β€” Retrieving query results +- [Queries Tutorial](../tutorials/04-queries.ipynb) β€” Hands-on examples + + +--- +## File: reference/specs/autopopulate.md + +# AutoPopulate Specification + +Version: 2.0 +Status: Draft +Last Updated: 2026-01-07 + +## Overview + +AutoPopulate is DataJoint's mechanism for automated computation. Tables that inherit from `dj.Computed` or `dj.Imported` automatically populate themselves by executing a `make()` method for each entry defined by their dependencies. + +This specification covers: +- The populate process and key source calculation +- Transaction management and atomicity +- The `make()` method and tripartite pattern +- Part tables in computed results +- Distributed computing with job reservation + +--- + +## 1. Auto-Populated Tables + +### 1.1 Table Types + +| Type | Base Class | Purpose | +|------|------------|---------| +| Computed | `dj.Computed` | Results derived from other DataJoint tables | +| Imported | `dj.Imported` | Data ingested from external sources (files, instruments) | + +Both types share the same AutoPopulate mechanism. The distinction is semanticβ€”`Imported` indicates external data sources while `Computed` indicates derivation from existing tables. + +### 1.2 Basic Structure + +```python +@schema +class FilteredImage(dj.Computed): + definition = """ + -> RawImage + --- + filtered : + """ + + def make(self, key): + # Fetch source data + raw = (RawImage & key).fetch1('image') + + # Compute result + filtered = apply_filter(raw) + + # Insert result + self.insert1({**key, 'filtered': filtered}) +``` + +### 1.3 Primary Key Constraint + +Auto-populated tables must have primary keys composed entirely of foreign key references: + +```python +# Correct: all PK attributes from foreign keys +@schema +class Analysis(dj.Computed): + definition = """ + -> Session + -> AnalysisMethod + --- + result : float64 + """ + +# Error: non-FK primary key attribute +@schema +class Analysis(dj.Computed): + definition = """ + -> Session + method : varchar(32) # Not allowed - use FK to lookup table + --- + result : float64 + """ +``` + +**Rationale:** This ensures each computed entry is uniquely determined by its upstream dependencies, enabling automatic key source calculation and precise job tracking. + +--- + +## 2. Key Source Calculation + +### 2.1 Definition + +The `key_source` property defines which entries should exist in the tableβ€”the complete set of primary keys that `make()` should be called with. + +### 2.2 Automatic Key Source + +By default, DataJoint automatically calculates `key_source` as the join of all tables referenced by foreign keys in the primary key: + +```python +@schema +class SpikeDetection(dj.Computed): + definition = """ + -> Recording + -> DetectionMethod + --- + spike_times : + """ + # Automatic key_source = Recording * DetectionMethod +``` + +**Calculation rules:** +1. Identify all foreign keys in the primary key section +2. Join the referenced tables: `Parent1 * Parent2 * ...` +3. Project to primary key attributes only + +For a table with definition: +```python +-> Session +-> Probe +-> SortingMethod +--- +units : +``` + +The automatic `key_source` is: +```python +Session * Probe * SortingMethod +``` + +This produces all valid combinations of (session, probe, method) that could be computed. + +### 2.3 Custom Key Source + +Override `key_source` to customize which entries to compute: + +```python +@schema +class QualityAnalysis(dj.Computed): + definition = """ + -> Session + --- + score : float64 + """ + + @property + def key_source(self): + # Only process sessions marked as 'good' + return Session & "quality = 'good'" +``` + +**Common customizations:** + +```python +# Filter by condition +@property +def key_source(self): + return Session & "status = 'complete'" + +# Restrict to specific combinations +@property +def key_source(self): + return Recording * Method & "method_name != 'deprecated'" + +# Add complex logic +@property +def key_source(self): + # Only sessions with enough trials + good_sessions = dj.U('session_id').aggr( + Trial, n='count(*)') & 'n >= 100' + return Session & good_sessions +``` + +### 2.4 Pending Entries + +Entries to be computed = `key_source - self`: + +```python +# Entries that should exist but don't yet +pending = table.key_source - table + +# Check how many entries need computing +n_pending = len(table.key_source - table) +``` + +--- + +## 3. The Populate Process + +### 3.1 Basic Populate + +The `populate()` method iterates through pending entries and calls `make()` for each: + +```python +# Populate all pending entries +FilteredImage.populate() +``` + +**Execution flow (direct mode):** + +``` +1. Calculate pending keys: key_source - self +2. Apply restrictions: pending & restrictions +3. For each key in pending: + a. Start transaction + b. Call make(key) + c. Commit transaction (or rollback on error) +4. Return summary +``` + +### 3.2 Method Signature + +```python +def populate( + self, + *restrictions, + suppress_errors: bool = False, + return_exception_objects: bool = False, + reserve_jobs: bool = False, + max_calls: int = None, + display_progress: bool = False, + processes: int = 1, + make_kwargs: dict = None, + priority: int = None, + refresh: bool = None, +) -> dict +``` + +### 3.3 Parameters + +| Parameter | Default | Description | +|-----------|---------|-------------| +| `*restrictions` | β€” | Filter `key_source` to subset of entries | +| `suppress_errors` | `False` | Continue on errors instead of raising | +| `return_exception_objects` | `False` | Return exception objects vs strings | +| `reserve_jobs` | `False` | Enable job reservation for distributed computing | +| `max_calls` | `None` | Maximum number of `make()` calls | +| `display_progress` | `False` | Show progress bar | +| `processes` | `1` | Number of parallel worker processes | +| `make_kwargs` | `None` | Additional kwargs passed to `make()` | +| `priority` | `None` | Process only jobs at this priority or more urgent | +| `refresh` | `None` | Refresh jobs queue before processing | + +### 3.4 Common Usage Patterns + +```python +# Populate everything +Analysis.populate() + +# Populate specific subjects +Analysis.populate(Subject & "subject_id < 10") + +# Populate with progress bar +Analysis.populate(display_progress=True) + +# Populate limited batch +Analysis.populate(max_calls=100) + +# Populate with error collection +errors = Analysis.populate(suppress_errors=True) + +# Parallel populate (single machine) +Analysis.populate(processes=4) +``` + +### 3.5 Return Value + +```python +result = Analysis.populate() +# { +# 'success': 150, # Entries successfully computed +# 'error': 3, # Entries that failed +# 'skip': 0, # Entries skipped (already exist) +# } +``` + +--- + +## 4. The make() Method + +### 4.1 Basic Pattern + +The `make()` method computes and inserts one entry: + +```python +def make(self, key): + """ + Compute and insert one entry. + + Parameters + ---------- + key : dict + Primary key values identifying which entry to compute. + """ + # 1. Fetch source data + source_data = (SourceTable & key).fetch1() + + # 2. Compute result + result = compute(source_data) + + # 3. Insert result + self.insert1({**key, **result}) +``` + +### 4.2 Requirements + +- **Must insert**: `make()` must insert exactly one row matching the key +- **Idempotent**: Same input should produce same output +- **Atomic**: Runs within a transactionβ€”all or nothing +- **Self-contained**: Should not depend on external state that changes + +### 4.3 Accessing Source Data + +```python +def make(self, key): + # Fetch single row + data = (SourceTable & key).fetch1() + + # Fetch specific attributes + image, timestamp = (Recording & key).fetch1('image', 'timestamp') + + # Fetch multiple rows (e.g., trials for a session) + trials = (Trial & key).to_dicts() + + # Join multiple sources + combined = (TableA * TableB & key).to_dicts() +``` + +### 4.4 Tripartite Make Pattern + +For long-running computations, use the tripartite pattern to separate fetch, compute, and insert phases. This enables better transaction management for jobs that take minutes or hours. + +**Method-based tripartite:** + +```python +@schema +class HeavyComputation(dj.Computed): + definition = """ + -> Recording + --- + result : + """ + + def make_fetch(self, key): + """Fetch all required data (runs in transaction).""" + return (Recording & key).fetch1('raw_data') + + def make_compute(self, key, data): + """Perform computation (runs outside transaction).""" + # Long-running computation - no database locks held + return heavy_algorithm(data) + + def make_insert(self, key, result): + """Insert results (runs in transaction).""" + self.insert1({**key, 'result': result}) +``` + +**Generator-based tripartite:** + +```python +def make(self, key): + # Phase 1: Fetch (in transaction) + data = (Recording & key).fetch1('raw_data') + + yield # Exit transaction, release locks + + # Phase 2: Compute (outside transaction) + result = heavy_algorithm(data) # May take hours + + yield # Re-enter transaction + + # Phase 3: Insert (in transaction) + self.insert1({**key, 'result': result}) +``` + +**When to use tripartite:** +- Computation takes more than a few seconds +- You want to avoid holding database locks during computation +- Working with external resources (files, APIs) that may be slow + +### 4.5 Additional make() Arguments + +Pass extra arguments via `make_kwargs`: + +```python +@schema +class ConfigurableAnalysis(dj.Computed): + definition = """ + -> Session + --- + result : float64 + """ + + def make(self, key, threshold=0.5, method='default'): + data = (Session & key).fetch1('data') + result = analyze(data, threshold=threshold, method=method) + self.insert1({**key, 'result': result}) + +# Call with custom parameters +ConfigurableAnalysis.populate(make_kwargs={'threshold': 0.8}) +``` + +--- + +## 5. Transaction Management + +### 5.1 Automatic Transactions + +Each `make()` call runs within an automatic transaction: + +```python +# Pseudocode for populate loop +for key in pending_keys: + connection.start_transaction() + try: + self.make(key) + connection.commit() + except Exception: + connection.rollback() + raise # or log if suppress_errors=True +``` + +### 5.2 Atomicity Guarantees + +- **All or nothing**: If `make()` fails, no partial data is inserted +- **Isolation**: Concurrent workers see consistent state +- **Rollback on error**: Any exception rolls back the transaction + +```python +def make(self, key): + # If this succeeds... + self.insert1({**key, 'step1': result1}) + + # But this fails... + self.Part.insert(part_data) # Raises exception + + # Both inserts are rolled back - table unchanged +``` + +### 5.3 Transaction Scope + +**Simple make (single transaction):** +``` +BEGIN TRANSACTION + └── make(key) + β”œβ”€β”€ fetch source data + β”œβ”€β”€ compute + └── insert result +COMMIT +``` + +**Tripartite make (two transactions):** +``` +BEGIN TRANSACTION 1 + └── make_fetch(key) or yield point 1 +COMMIT + +[No transaction - computation runs here] + +BEGIN TRANSACTION 2 + └── make_insert(key, result) or yield point 2 +COMMIT +``` + +### 5.4 Nested Operations + +Inserts within `make()` share the same transaction: + +```python +def make(self, key): + # Main table insert + self.insert1({**key, 'summary': summary}) + + # Part table inserts - same transaction + self.Part1.insert(part1_data) + self.Part2.insert(part2_data) + + # All three inserts commit together or roll back together +``` + +### 5.5 Manual Transaction Control + +For complex scenarios, use explicit transactions: + +```python +def make(self, key): + # Fetch outside transaction + data = (Source & key).to_dicts() + + # Explicit transaction for insert + with dj.conn().transaction: + self.insert1({**key, 'result': compute(data)}) + self.Part.insert(parts) +``` + +--- + +## 6. Part Tables + +### 6.1 Part Tables in Computed Tables + +Computed tables can have Part tables for detailed results: + +```python +@schema +class SpikeSorting(dj.Computed): + definition = """ + -> Recording + --- + n_units : int + """ + + class Unit(dj.Part): + definition = """ + -> master + unit_id : int + --- + waveform : + spike_times : + """ + + def make(self, key): + # Compute spike sorting + units = sort_spikes((Recording & key).fetch1('data')) + + # Insert master entry + self.insert1({**key, 'n_units': len(units)}) + + # Insert part entries + self.Unit.insert([ + {**key, 'unit_id': i, **unit} + for i, unit in enumerate(units) + ]) +``` + +### 6.2 Transaction Behavior + +Master and part inserts share the same transaction: + +```python +def make(self, key): + self.insert1({**key, 'summary': s}) # Master + self.Part.insert(parts) # Parts + + # If Part.insert fails, master insert is also rolled back +``` + +### 6.3 Fetching Part Data + +```python +# Fetch master with parts +master = (SpikeSorting & key).fetch1() +parts = (SpikeSorting.Unit & key).to_dicts() + +# Join master and parts +combined = (SpikeSorting * SpikeSorting.Unit & key).to_dicts() +``` + +### 6.4 Key Source with Parts + +The key source is based on the master table's primary key only: + +```python +# key_source returns master keys, not part keys +SpikeSorting.key_source # Recording keys +``` + +### 6.5 Deleting Computed Parts + +Deleting master entries cascades to parts: + +```python +# Deletes SpikeSorting entry AND all SpikeSorting.Unit entries +(SpikeSorting & key).delete() +``` + +--- + +## 7. Progress and Monitoring + +### 7.1 Progress Method + +Check computation progress: + +```python +# Simple progress +remaining, total = Analysis.progress() +print(f"{remaining}/{total} entries remaining") + +# With display +Analysis.progress(display=True) +# Analysis: 150/200 (75%) [===========> ] +``` + +### 7.2 Display Progress During Populate + +```python +Analysis.populate(display_progress=True) +# [################----] 80% 160/200 [00:15<00:04] +``` + +--- + +## 8. Direct Mode vs Distributed Mode + +### 8.1 Direct Mode (Default) + +When `reserve_jobs=False` (default): + +```python +Analysis.populate() # Direct mode +``` + +**Characteristics:** +- Calculates `key_source - self` on each call +- No job tracking or status persistence +- Simple and efficient for single-worker scenarios +- No coordination overhead + +**Best for:** +- Interactive development +- Single-worker pipelines +- Small to medium datasets + +### 8.2 Distributed Mode + +When `reserve_jobs=True`: + +```python +Analysis.populate(reserve_jobs=True) # Distributed mode +``` + +**Characteristics:** +- Uses per-table jobs queue for coordination +- Workers reserve jobs before processing +- Full status tracking (pending, reserved, error, success) +- Enables monitoring and recovery + +**Best for:** +- Multi-worker distributed computing +- Long-running pipelines +- Production environments with monitoring needs + +--- + +## 9. Per-Table Jobs System + +### 9.1 Jobs Table + +Each auto-populated table has an associated jobs table: + +``` +Table: Analysis +Jobs: ~~analysis +``` + +Access via the `.jobs` property: + +```python +Analysis.jobs # Jobs table +Analysis.jobs.pending # Pending jobs +Analysis.jobs.errors # Failed jobs +Analysis.jobs.progress() # Status summary +``` + +### 9.2 Jobs Table Structure + +``` +# Job queue for Analysis + +--- +status : enum('pending', 'reserved', 'success', 'error', 'ignore') +priority : uint8 # Lower = more urgent (0 = highest) +created_time : timestamp +scheduled_time : timestamp # Process on or after this time +reserved_time : timestamp # When reserved +completed_time : timestamp # When completed +duration : float64 # Execution time in seconds +error_message : varchar(2047) # Truncated error +error_stack : # Full traceback +user : varchar(255) # Database user +host : varchar(255) # Worker hostname +pid : uint32 # Process ID +connection_id : uint64 # MySQL connection ID +version : varchar(255) # Code version +``` + +### 9.3 Job Statuses + +| Status | Description | +|--------|-------------| +| `pending` | Queued and ready to process | +| `reserved` | Currently being processed by a worker | +| `success` | Completed successfully (optional retention) | +| `error` | Failed with error details | +| `ignore` | Manually marked to skip | + +### 9.4 Jobs API + +```python +# Refresh job queue (sync with key_source) +Analysis.jobs.refresh() + +# Status queries +Analysis.jobs.pending # Pending jobs +Analysis.jobs.reserved # Currently processing +Analysis.jobs.errors # Failed jobs +Analysis.jobs.ignored # Skipped jobs +Analysis.jobs.completed # Success jobs (if kept) + +# Progress summary +Analysis.jobs.progress() +# {'pending': 150, 'reserved': 3, 'success': 847, 'error': 12, 'total': 1012} + +# Manual control +Analysis.jobs.ignore(key) # Skip a job +(Analysis.jobs & condition).delete() # Remove jobs +Analysis.jobs.errors.delete() # Clear errors +``` + +--- + +## 10. Priority and Scheduling + +### 10.1 Priority + +Lower values = higher priority (0 is most urgent): + +```python +# Urgent jobs (priority 0) +Analysis.jobs.refresh(priority=0) + +# Normal jobs (default priority 5) +Analysis.jobs.refresh() + +# Background jobs (priority 10) +Analysis.jobs.refresh(priority=10) + +# Urgent jobs for specific data +Analysis.jobs.refresh(Subject & "priority='urgent'", priority=0) +``` + +### 10.2 Scheduling + +Delay job availability using server time: + +```python +# Available in 2 hours +Analysis.jobs.refresh(delay=2*60*60) + +# Available tomorrow +Analysis.jobs.refresh(delay=24*60*60) +``` + +Jobs with `scheduled_time > now` are not processed by `populate()`. + +--- + +## 11. Distributed Computing + +### 11.1 Basic Pattern + +Multiple workers can run simultaneously: + +```python +# Worker 1 +Analysis.populate(reserve_jobs=True) + +# Worker 2 (different machine/process) +Analysis.populate(reserve_jobs=True) + +# Worker 3 +Analysis.populate(reserve_jobs=True) +``` + +### 11.2 Execution Flow (Distributed) + +``` +1. Refresh jobs queue (if auto_refresh=True) +2. Fetch pending jobs ordered by (priority, scheduled_time) +3. For each job: + a. Mark as 'reserved' + b. Start transaction + c. Call make(key) + d. Commit transaction + e. Mark as 'success' or delete job + f. On error: mark as 'error' with details +``` + +### 11.3 Conflict Resolution + +When two workers reserve the same job simultaneously: + +1. Both reservations succeed (optimistic, no locking) +2. Both call `make()` for the same key +3. First worker's transaction commits +4. Second worker gets duplicate key error (silently ignored) +5. First worker marks job complete + +This is acceptable because: +- The `make()` transaction guarantees data integrity +- Conflicts are rare with job reservation +- Wasted computation is minimal vs locking overhead + +--- + +## 12. Error Handling + +### 12.1 Default Behavior + +Errors stop populate and raise the exception: + +```python +Analysis.populate() # Stops on first error +``` + +### 12.2 Suppressing Errors + +Continue processing despite errors: + +```python +errors = Analysis.populate( + suppress_errors=True, + return_exception_objects=True +) +# errors contains list of (key, exception) tuples +``` + +### 12.3 Error Recovery (Distributed Mode) + +```python +# View errors +for err in Analysis.jobs.errors.to_dicts(): + print(f"Key: {err}, Error: {err['error_message']}") + +# Clear and retry +Analysis.jobs.errors.delete() +Analysis.jobs.refresh() +Analysis.populate(reserve_jobs=True) +``` + +### 12.4 Stale and Orphaned Jobs + +**Stale jobs**: Keys no longer in `key_source` (upstream deleted) +```python +Analysis.jobs.refresh(stale_timeout=3600) # Clean up after 1 hour +``` + +**Orphaned jobs**: Reserved jobs whose worker crashed +```python +Analysis.jobs.refresh(orphan_timeout=3600) # Reset after 1 hour +``` + +--- + +## 13. Configuration + +```python +dj.config['jobs.auto_refresh'] = True # Auto-refresh on populate +dj.config['jobs.keep_completed'] = False # Retain success records +dj.config['jobs.stale_timeout'] = 3600 # Seconds before stale cleanup +dj.config['jobs.default_priority'] = 5 # Default priority (lower=urgent) +dj.config['jobs.version'] = None # Version string ('git' for auto) +dj.config['jobs.add_job_metadata'] = False # Add hidden metadata columns +``` + +--- + +## 14. Hidden Job Metadata + +When `config['jobs.add_job_metadata'] = True`, auto-populated tables receive hidden columns: + +| Column | Type | Description | +|--------|------|-------------| +| `_job_start_time` | `datetime(3)` | When computation began | +| `_job_duration` | `float64` | Duration in seconds | +| `_job_version` | `varchar(64)` | Code version | + +```python +# Fetch with job metadata +Analysis().to_arrays('result', '_job_duration') + +# Query slow computations +slow = Analysis & '_job_duration > 3600' +``` + +--- + +## 15. Migration from Earlier Versions + +### 15.1 Changes from DataJoint 1.x + +DataJoint 2.0 replaces the schema-level `~jobs` table with per-table jobs: + +| Feature | 1.x | 2.0 | +|---------|-----|-----| +| Jobs table | Schema-level `~jobs` | Per-table `~~table_name` | +| Key storage | Hashed | Native (readable) | +| Statuses | `reserved`, `error`, `ignore` | + `pending`, `success` | + +### 15.2 Migration Steps + +1. Complete or clear pending work in the old system +2. Export error records if needed for reference +3. Use new system: `populate(reserve_jobs=True)` creates new jobs tables + +```python +# New system auto-creates jobs tables +Analysis.populate(reserve_jobs=True) +``` + +--- + +## 16. Quick Reference + +### 16.1 Common Operations + +```python +# Basic populate (direct mode) +Table.populate() +Table.populate(restriction) +Table.populate(max_calls=100, display_progress=True) + +# Distributed populate +Table.populate(reserve_jobs=True) + +# Check progress +remaining, total = Table.progress() +Table.jobs.progress() # Detailed status + +# Error handling +Table.populate(suppress_errors=True) +Table.jobs.errors.to_dicts() +Table.jobs.errors.delete() + +# Priority control +Table.jobs.refresh(priority=0) # Urgent +Table.jobs.refresh(delay=3600) # Scheduled +``` + +### 16.2 make() Patterns + +```python +# Simple make +def make(self, key): + data = (Source & key).fetch1() + self.insert1({**key, 'result': compute(data)}) + +# With parts +def make(self, key): + self.insert1({**key, 'summary': s}) + self.Part.insert(parts) + +# Tripartite (generator) +def make(self, key): + data = (Source & key).fetch1() + yield # Release transaction + result = heavy_compute(data) + yield # Re-acquire transaction + self.insert1({**key, 'result': result}) + +# Tripartite (methods) +def make_fetch(self, key): return data +def make_compute(self, key, data): return result +def make_insert(self, key, result): self.insert1(...) +``` + + +--- +## File: reference/specs/codec-api.md + +# Codec Specification + +This document specifies the DataJoint Codec API for creating custom attribute types +that extend DataJoint's native type system. + +## Overview + +Codecs define bidirectional conversion between Python objects and database storage. +They enable storing complex data types (graphs, models, custom formats) while +maintaining DataJoint's query capabilities. + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Python Object β”‚ ──── encode ────► β”‚ Storage Type β”‚ +β”‚ (e.g. Graph) β”‚ β”‚ (e.g. bytes) β”‚ +β”‚ β”‚ ◄─── decode ──── β”‚ β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +## Quick Start + +```python +import datajoint as dj +import networkx as nx + +class GraphCodec(dj.Codec): + """Store NetworkX graphs.""" + + name = "graph" # Use as in definitions + + def get_dtype(self, is_external: bool) -> str: + return "" # Delegate to blob for serialization + + def encode(self, graph, *, key=None, store_name=None): + return { + 'nodes': list(graph.nodes(data=True)), + 'edges': list(graph.edges(data=True)), + } + + def decode(self, stored, *, key=None): + G = nx.Graph() + G.add_nodes_from(stored['nodes']) + G.add_edges_from(stored['edges']) + return G + +# Use in table definition +@schema +class Connectivity(dj.Manual): + definition = ''' + conn_id : int + --- + network : + ''' +``` + +## The Codec Base Class + +All custom codecs inherit from `dj.Codec`: + +```python +class Codec(ABC): + """Base class for codec types.""" + + name: str | None = None # Required: unique identifier + + def get_dtype(self, is_external: bool) -> str: + """Return the storage dtype.""" + raise NotImplementedError + + @abstractmethod + def encode(self, value, *, key=None, store_name=None) -> Any: + """Encode Python value for storage.""" + ... + + @abstractmethod + def decode(self, stored, *, key=None) -> Any: + """Decode stored value back to Python.""" + ... + + def validate(self, value) -> None: + """Optional: validate value before encoding.""" + pass +``` + +## Required Components + +### 1. The `name` Attribute + +The `name` class attribute is a unique identifier used in table definitions with +`` syntax: + +```python +class MyCodec(dj.Codec): + name = "mycodec" # Use as in definitions +``` + +Naming conventions: +- Use lowercase with underscores: `spike_train`, `graph_embedding` +- Avoid generic names that might conflict: prefer `lab_model` over `model` +- Names must be unique across all registered codecs + +### 2. The `get_dtype()` Method + +Returns the underlying storage type. The `is_external` parameter indicates whether +the `@` modifier is present in the table definition: + +```python +def get_dtype(self, is_external: bool) -> str: + """ + Args: + is_external: True if @ modifier present (e.g., ) + + Returns: + - A core type: "bytes", "json", "varchar(N)", "int32", etc. + - Another codec: "", "", etc. + + Raises: + DataJointError: If external storage not supported but @ is present + """ +``` + +Examples: + +```python +# Simple: always store as bytes +def get_dtype(self, is_external: bool) -> str: + return "bytes" + +# Different behavior for internal/external +def get_dtype(self, is_external: bool) -> str: + return "" if is_external else "bytes" + +# External-only codec +def get_dtype(self, is_external: bool) -> str: + if not is_external: + raise DataJointError(" requires @ (external storage only)") + return "json" +``` + +### 3. The `encode()` Method + +Converts Python objects to the format expected by `get_dtype()`: + +```python +def encode(self, value: Any, *, key: dict | None = None, store_name: str | None = None) -> Any: + """ + Args: + value: The Python object to store + key: Primary key values (for context-dependent encoding) + store_name: Target store name (for external storage) + + Returns: + Value in the format expected by get_dtype() + """ +``` + +### 4. The `decode()` Method + +Converts stored values back to Python objects: + +```python +def decode(self, stored: Any, *, key: dict | None = None) -> Any: + """ + Args: + stored: Data retrieved from storage + key: Primary key values (for context-dependent decoding) + + Returns: + The reconstructed Python object + """ +``` + +### 5. The `validate()` Method (Optional) + +Called automatically before `encode()` during INSERT operations: + +```python +def validate(self, value: Any) -> None: + """ + Args: + value: The value to validate + + Raises: + TypeError: If the value has an incompatible type + ValueError: If the value fails domain validation + """ + if not isinstance(value, ExpectedType): + raise TypeError(f"Expected ExpectedType, got {type(value).__name__}") +``` + +## Auto-Registration + +Codecs automatically register when their class is defined. No decorator needed: + +```python +# This codec is registered automatically when the class is defined +class MyCodec(dj.Codec): + name = "mycodec" + # ... +``` + +### Skipping Registration + +For abstract base classes that shouldn't be registered: + +```python +class BaseCodec(dj.Codec, register=False): + """Abstract base - not registered.""" + name = None # Or omit entirely + +class ConcreteCodec(BaseCodec): + name = "concrete" # This one IS registered + # ... +``` + +### Registration Timing + +Codecs are registered at class definition time. Ensure your codec classes are +imported before any table definitions that use them: + +```python +# myproject/codecs.py +class GraphCodec(dj.Codec): + name = "graph" + ... + +# myproject/tables.py +import myproject.codecs # Ensure codecs are registered + +@schema +class Networks(dj.Manual): + definition = ''' + id : int + --- + network : + ''' +``` + +## Codec Composition (Chaining) + +Codecs can delegate to other codecs by returning `` from `get_dtype()`. +This enables layered functionality: + +```python +class CompressedJsonCodec(dj.Codec): + """Compress JSON data with zlib.""" + + name = "zjson" + + def get_dtype(self, is_external: bool) -> str: + return "" # Delegate serialization to blob codec + + def encode(self, value, *, key=None, store_name=None): + import json, zlib + json_bytes = json.dumps(value).encode('utf-8') + return zlib.compress(json_bytes) + + def decode(self, stored, *, key=None): + import json, zlib + json_bytes = zlib.decompress(stored) + return json.loads(json_bytes.decode('utf-8')) +``` + +### How Chaining Works + +When DataJoint encounters ``: + +1. Calls `ZjsonCodec.get_dtype(is_external=False)` β†’ returns `""` +2. Calls `BlobCodec.get_dtype(is_external=False)` β†’ returns `"bytes"` +3. Final storage type is `bytes` (LONGBLOB in MySQL) + +During INSERT: +1. `ZjsonCodec.encode()` converts Python dict β†’ compressed bytes +2. `BlobCodec.encode()` packs bytes β†’ DJ blob format +3. Stored in database + +During FETCH: +1. Read from database +2. `BlobCodec.decode()` unpacks DJ blob β†’ compressed bytes +3. `ZjsonCodec.decode()` decompresses β†’ Python dict + +### Built-in Codec Chains + +DataJoint's built-in codecs form these chains: + +``` + β†’ bytes (internal) + β†’ β†’ json (external) + + β†’ bytes (internal) + β†’ β†’ json (external) + + β†’ json (external only) + β†’ json (external only) + β†’ json (external only) +``` + +### Store Name Propagation + +When using external storage (`@`), the store name propagates through the chain: + +```python +# Table definition +data : + +# Resolution: +# 1. MyCodec.get_dtype(is_external=True) β†’ "" +# 2. BlobCodec.get_dtype(is_external=True) β†’ "" +# 3. HashCodec.get_dtype(is_external=True) β†’ "json" +# 4. store_name="coldstore" passed to HashCodec.encode() +``` + +## Plugin System (Entry Points) + +Codecs can be distributed as installable packages using Python entry points. + +### Package Structure + +``` +dj-graph-codecs/ +β”œβ”€β”€ pyproject.toml +└── src/ + └── dj_graph_codecs/ + β”œβ”€β”€ __init__.py + └── codecs.py +``` + +### pyproject.toml + +```toml +[project] +name = "dj-graph-codecs" +version = "1.0.0" +dependencies = ["datajoint>=2.0", "networkx"] + +[project.entry-points."datajoint.codecs"] +graph = "dj_graph_codecs.codecs:GraphCodec" +weighted_graph = "dj_graph_codecs.codecs:WeightedGraphCodec" +``` + +### Codec Implementation + +```python +# src/dj_graph_codecs/codecs.py +import datajoint as dj +import networkx as nx + +class GraphCodec(dj.Codec): + name = "graph" + + def get_dtype(self, is_external: bool) -> str: + return "" + + def encode(self, graph, *, key=None, store_name=None): + return { + 'nodes': list(graph.nodes(data=True)), + 'edges': list(graph.edges(data=True)), + } + + def decode(self, stored, *, key=None): + G = nx.Graph() + G.add_nodes_from(stored['nodes']) + G.add_edges_from(stored['edges']) + return G + +class WeightedGraphCodec(dj.Codec): + name = "weighted_graph" + + def get_dtype(self, is_external: bool) -> str: + return "" + + def encode(self, graph, *, key=None, store_name=None): + return { + 'nodes': list(graph.nodes(data=True)), + 'edges': [(u, v, d) for u, v, d in graph.edges(data=True)], + } + + def decode(self, stored, *, key=None): + G = nx.Graph() + G.add_nodes_from(stored['nodes']) + for u, v, d in stored['edges']: + G.add_edge(u, v, **d) + return G +``` + +### Usage After Installation + +```bash +pip install dj-graph-codecs +``` + +```python +# Codecs are automatically discovered and available +@schema +class Networks(dj.Manual): + definition = ''' + network_id : int + --- + topology : + weights : + ''' +``` + +### Entry Point Discovery + +DataJoint loads entry points lazily when a codec is first requested: + +1. Check explicit registry (codecs defined in current process) +2. Load entry points from `datajoint.codecs` group +3. Also checks legacy `datajoint.types` group for compatibility + +## API Reference + +### Module Functions + +```python +import datajoint as dj + +# List all registered codec names +dj.list_codecs() # Returns: ['blob', 'hash', 'object', 'attach', 'filepath', ...] + +# Get a codec instance by name +codec = dj.get_codec("blob") +codec = dj.get_codec("") # Angle brackets are optional +codec = dj.get_codec("") # Store parameter is stripped +``` + +### Internal Functions (for advanced use) + +```python +from datajoint.codecs import ( + is_codec_registered, # Check if codec exists + unregister_codec, # Remove codec (testing only) + resolve_dtype, # Resolve codec chain + parse_type_spec, # Parse "" syntax +) +``` + +## Built-in Codecs + +DataJoint provides these built-in codecs: + +| Codec | Internal | External | Description | +|-------|----------|----------|-------------| +| `` | `bytes` | `` | DataJoint serialization for Python objects | +| `` | N/A | `json` | Content-addressed storage with MD5 deduplication | +| `` | N/A | `json` | Path-addressed storage for files/folders | +| `` | `bytes` | `` | File attachments with filename preserved | +| `` | N/A | `json` | Reference to existing files in store | + +## Complete Examples + +### Example 1: Simple Serialization + +```python +import datajoint as dj +import numpy as np + +class SpikeTrainCodec(dj.Codec): + """Efficient storage for sparse spike timing data.""" + + name = "spike_train" + + def get_dtype(self, is_external: bool) -> str: + return "" + + def validate(self, value): + if not isinstance(value, np.ndarray): + raise TypeError("Expected numpy array of spike times") + if value.ndim != 1: + raise ValueError("Spike train must be 1-dimensional") + if len(value) > 1 and not np.all(np.diff(value) >= 0): + raise ValueError("Spike times must be sorted") + + def encode(self, spike_times, *, key=None, store_name=None): + # Store as differences (smaller values, better compression) + return np.diff(spike_times, prepend=0).astype(np.float32) + + def decode(self, stored, *, key=None): + # Reconstruct original spike times + return np.cumsum(stored).astype(np.float64) +``` + +### Example 2: External Storage + +```python +import datajoint as dj +import pickle + +class ModelCodec(dj.Codec): + """Store ML models with optional external storage.""" + + name = "model" + + def get_dtype(self, is_external: bool) -> str: + # Use hash-addressed storage for large models + return "" if is_external else "" + + def encode(self, model, *, key=None, store_name=None): + return pickle.dumps(model, protocol=pickle.HIGHEST_PROTOCOL) + + def decode(self, stored, *, key=None): + return pickle.loads(stored) + + def validate(self, value): + # Check that model has required interface + if not hasattr(value, 'predict'): + raise TypeError("Model must have a predict() method") +``` + +Usage: +```python +@schema +class Models(dj.Manual): + definition = ''' + model_id : int + --- + small_model : # Internal storage + large_model : # External (default store) + archive_model : # External (specific store) + ''' +``` + +### Example 3: JSON with Schema Validation + +```python +import datajoint as dj +import jsonschema + +class ConfigCodec(dj.Codec): + """Store validated JSON configuration.""" + + name = "config" + + SCHEMA = { + "type": "object", + "properties": { + "version": {"type": "integer", "minimum": 1}, + "settings": {"type": "object"}, + }, + "required": ["version", "settings"], + } + + def get_dtype(self, is_external: bool) -> str: + return "json" + + def validate(self, value): + jsonschema.validate(value, self.SCHEMA) + + def encode(self, config, *, key=None, store_name=None): + return config # JSON type handles serialization + + def decode(self, stored, *, key=None): + return stored +``` + +### Example 4: Context-Dependent Encoding + +```python +import datajoint as dj + +class VersionedDataCodec(dj.Codec): + """Handle different encoding versions based on primary key.""" + + name = "versioned" + + def get_dtype(self, is_external: bool) -> str: + return "" + + def encode(self, value, *, key=None, store_name=None): + version = key.get("schema_version", 1) if key else 1 + if version >= 2: + return {"v": 2, "data": self._encode_v2(value)} + return {"v": 1, "data": self._encode_v1(value)} + + def decode(self, stored, *, key=None): + version = stored.get("v", 1) + if version >= 2: + return self._decode_v2(stored["data"]) + return self._decode_v1(stored["data"]) + + def _encode_v1(self, value): + return value + + def _decode_v1(self, data): + return data + + def _encode_v2(self, value): + # New encoding format + return {"optimized": True, "payload": value} + + def _decode_v2(self, data): + return data["payload"] +``` + +### Example 5: External-Only Codec + +```python +import datajoint as dj +from pathlib import Path + +class ZarrCodec(dj.Codec): + """Store Zarr arrays in object storage.""" + + name = "zarr" + + def get_dtype(self, is_external: bool) -> str: + if not is_external: + raise dj.DataJointError(" requires @ (external storage only)") + return "" # Delegate to object storage + + def encode(self, value, *, key=None, store_name=None): + import zarr + import tempfile + + # If already a path, pass through + if isinstance(value, (str, Path)): + return str(value) + + # If zarr array, save to temp and return path + if isinstance(value, zarr.Array): + tmpdir = tempfile.mkdtemp() + path = Path(tmpdir) / "data.zarr" + zarr.save(path, value) + return str(path) + + raise TypeError(f"Expected zarr.Array or path, got {type(value)}") + + def decode(self, stored, *, key=None): + # ObjectCodec returns ObjectRef, use its fsmap for zarr + import zarr + return zarr.open(stored.fsmap, mode='r') +``` + +## Best Practices + +### 1. Choose Appropriate Storage Types + +| Data Type | Recommended `get_dtype()` | +|-----------|---------------------------| +| Python objects (dicts, arrays) | `""` | +| Large binary data | `""` (external) | +| Files/folders (Zarr, HDF5) | `""` (external) | +| Simple JSON-serializable | `"json"` | +| Short strings | `"varchar(N)"` | +| Numeric identifiers | `"int32"`, `"int64"` | + +### 2. Handle None Values + +Nullable columns may pass `None` to your codec: + +```python +def encode(self, value, *, key=None, store_name=None): + if value is None: + return None # Pass through for nullable columns + return self._actual_encode(value) + +def decode(self, stored, *, key=None): + if stored is None: + return None + return self._actual_decode(stored) +``` + +### 3. Test Round-Trips + +Always verify that `decode(encode(x)) == x`: + +```python +def test_codec_roundtrip(): + codec = MyCodec() + + test_values = [ + {"key": "value"}, + [1, 2, 3], + np.array([1.0, 2.0]), + ] + + for original in test_values: + encoded = codec.encode(original) + decoded = codec.decode(encoded) + assert decoded == original or np.array_equal(decoded, original) +``` + +### 4. Include Validation + +Catch errors early with `validate()`: + +```python +def validate(self, value): + if not isinstance(value, ExpectedType): + raise TypeError(f"Expected ExpectedType, got {type(value).__name__}") + + if not self._is_valid(value): + raise ValueError("Value fails validation constraints") +``` + +### 5. Document Expected Formats + +Include docstrings explaining input/output formats: + +```python +class MyCodec(dj.Codec): + """ + Store MyType objects. + + Input format (encode): + MyType instance with attributes: x, y, z + + Storage format: + Dict with keys: 'x', 'y', 'z' + + Output format (decode): + MyType instance reconstructed from storage + """ +``` + +### 6. Consider Versioning + +If your encoding format might change: + +```python +def encode(self, value, *, key=None, store_name=None): + return { + "_version": 2, + "_data": self._encode_v2(value), + } + +def decode(self, stored, *, key=None): + version = stored.get("_version", 1) + data = stored.get("_data", stored) + + if version == 1: + return self._decode_v1(data) + return self._decode_v2(data) +``` + +## Error Handling + +### Common Errors + +| Error | Cause | Solution | +|-------|-------|----------| +| `Unknown codec: ` | Codec not registered | Import module defining codec before table definition | +| `Codec already registered` | Duplicate name | Use unique names; check for conflicts | +| ` requires @` | External-only codec used without @ | Add `@` or `@store` to attribute type | +| `Circular codec reference` | Codec chain forms a loop | Check `get_dtype()` return values | + +### Debugging + +```python +# Check what codecs are registered +print(dj.list_codecs()) + +# Inspect a codec +codec = dj.get_codec("mycodec") +print(f"Name: {codec.name}") +print(f"Internal dtype: {codec.get_dtype(is_external=False)}") +print(f"External dtype: {codec.get_dtype(is_external=True)}") + +# Resolve full chain +from datajoint.codecs import resolve_dtype +final_type, chain, store = resolve_dtype("") +print(f"Final storage type: {final_type}") +print(f"Codec chain: {[c.name for c in chain]}") +print(f"Store: {store}") +``` + + +--- +## File: reference/specs/data-manipulation.md + +# DataJoint Data Manipulation Specification + +Version: 1.0 +Status: Draft +Last Updated: 2026-01-07 + +## Overview + +This document specifies data manipulation operations in DataJoint Python: insert, update, and delete. These operations maintain referential integrity across the pipeline while supporting the **workflow normalization** paradigm. + +## 1. Workflow Normalization Philosophy + +### 1.1 Insert and Delete as Primary Operations + +DataJoint pipelines are designed around **insert** and **delete** as the primary data manipulation operations: + +``` +Insert: Add complete entities (rows) to tables +Delete: Remove entities and all dependent data (cascading) +``` + +This design maintains referential integrity at the **entity level**β€”each row represents a complete, self-consistent unit of data. + +### 1.2 Updates as Surgical Corrections + +**Updates are intentionally limited** to the `update1()` method, which modifies a single row at a time. This is by design: + +- Updates bypass the normal workflow +- They can create inconsistencies with derived data +- They should be used sparingly for **corrective operations** + +**Appropriate uses of update1():** +- Fixing data entry errors +- Correcting metadata after the fact +- Administrative annotations + +**Inappropriate uses:** +- Regular workflow operations +- Batch modifications +- Anything that should trigger recomputation + +### 1.3 The Recomputation Pattern + +When source data changes, the correct pattern is: + +```python +# 1. Delete the incorrect data (cascades to all derived tables) +(SourceTable & {"key": value}).delete() + +# 2. Insert the corrected data +SourceTable.insert1(corrected_row) + +# 3. Recompute derived tables +DerivedTable.populate() +``` + +This ensures all derived data remains consistent with its sources. + +--- + +## 2. Insert Operations + +### 2.1 `insert()` Method + +**Signature:** +```python +def insert( + self, + rows, + replace=False, + skip_duplicates=False, + ignore_extra_fields=False, + allow_direct_insert=None, + chunk_size=None, +) +``` + +**Parameters:** + +| Parameter | Type | Default | Description | +|-----------|------|---------|-------------| +| `rows` | iterable | β€” | Data to insert | +| `replace` | bool | `False` | Replace existing rows with matching PK | +| `skip_duplicates` | bool | `False` | Silently skip duplicate keys | +| `ignore_extra_fields` | bool | `False` | Ignore fields not in table | +| `allow_direct_insert` | bool | `None` | Allow insert into auto-populated tables | +| `chunk_size` | int | `None` | Insert in batches of this size | + +### 2.2 Accepted Input Formats + +| Format | Example | +|--------|---------| +| List of dicts | `[{"id": 1, "name": "Alice"}, ...]` | +| pandas DataFrame | `pd.DataFrame({"id": [1, 2], "name": ["A", "B"]})` | +| polars DataFrame | `pl.DataFrame({"id": [1, 2], "name": ["A", "B"]})` | +| numpy structured array | `np.array([(1, "A")], dtype=[("id", int), ("name", "U10")])` | +| QueryExpression | `OtherTable.proj(...)` (INSERT...SELECT) | +| Path to CSV | `Path("data.csv")` | + +### 2.3 Basic Usage + +```python +# Single row +Subject.insert1({"subject_id": 1, "name": "Mouse001", "dob": "2024-01-15"}) + +# Multiple rows +Subject.insert([ + {"subject_id": 1, "name": "Mouse001", "dob": "2024-01-15"}, + {"subject_id": 2, "name": "Mouse002", "dob": "2024-01-16"}, +]) + +# From DataFrame +df = pd.DataFrame({"subject_id": [1, 2], "name": ["M1", "M2"], "dob": ["2024-01-15", "2024-01-16"]}) +Subject.insert(df) + +# From query (INSERT...SELECT) +ActiveSubjects.insert(Subject & "status = 'active'") +``` + +### 2.4 Handling Duplicates + +```python +# Error on duplicate (default) +Subject.insert1({"subject_id": 1, ...}) # Raises DuplicateError if exists + +# Skip duplicates silently +Subject.insert(rows, skip_duplicates=True) + +# Replace existing rows +Subject.insert(rows, replace=True) +``` + +**Difference between skip and replace:** +- `skip_duplicates`: Keeps existing row unchanged +- `replace`: Overwrites existing row with new values + +### 2.5 Extra Fields + +```python +# Error on extra fields (default) +Subject.insert1({"subject_id": 1, "unknown_field": "x"}) # Raises error + +# Ignore extra fields +Subject.insert1({"subject_id": 1, "unknown_field": "x"}, ignore_extra_fields=True) +``` + +### 2.6 Auto-Populated Tables + +Computed and Imported tables normally only accept inserts from their `make()` method: + +```python +# Raises DataJointError by default +ComputedTable.insert1({"key": 1, "result": 42}) + +# Explicit override +ComputedTable.insert1({"key": 1, "result": 42}, allow_direct_insert=True) +``` + +### 2.7 Chunked Insertion + +For large datasets, insert in batches: + +```python +# Insert 10,000 rows at a time +Subject.insert(large_dataset, chunk_size=10000) +``` + +Each chunk is a separate transaction. If interrupted, completed chunks persist. + +### 2.8 `insert1()` Method + +Convenience wrapper for single-row inserts: + +```python +def insert1(self, row, **kwargs) +``` + +Equivalent to `insert((row,), **kwargs)`. + +### 2.9 Staged Insert for Large Objects + +For large objects (Zarr arrays, HDF5 files), use staged insert to write directly to object storage: + +```python +with table.staged_insert1 as staged: + # Set primary key and metadata + staged.rec["session_id"] = 123 + staged.rec["timestamp"] = datetime.now() + + # Write large data directly to storage + zarr_path = staged.store("raw_data", ".zarr") + z = zarr.open(zarr_path, mode="w") + z[:] = large_array + staged.rec["raw_data"] = z + +# Row automatically inserted on successful exit +# Storage cleaned up if exception occurs +``` + +--- + +## 3. Update Operations + +### 3.1 `update1()` Method + +**Signature:** +```python +def update1(self, row: dict) -> None +``` + +**Parameters:** +- `row`: Dictionary containing all primary key values plus attributes to update + +### 3.2 Basic Usage + +```python +# Update a single attribute +Subject.update1({"subject_id": 1, "name": "NewName"}) + +# Update multiple attributes +Subject.update1({ + "subject_id": 1, + "name": "NewName", + "notes": "Updated on 2024-01-15" +}) +``` + +### 3.3 Requirements + +1. **Complete primary key**: All PK attributes must be provided +2. **Exactly one match**: Must match exactly one existing row +3. **No restrictions**: Cannot call on restricted table + +```python +# Error: incomplete primary key +Subject.update1({"name": "NewName"}) + +# Error: row doesn't exist +Subject.update1({"subject_id": 999, "name": "Ghost"}) + +# Error: cannot update restricted table +(Subject & "subject_id > 10").update1({...}) +``` + +### 3.4 Resetting to Default + +Setting an attribute to `None` resets it to its default value: + +```python +# Reset 'notes' to its default (NULL if nullable) +Subject.update1({"subject_id": 1, "notes": None}) +``` + +### 3.5 When to Use Updates + +**Appropriate:** +```python +# Fix a typo in metadata +Subject.update1({"subject_id": 1, "name": "Mouse001"}) # Was "Mous001" + +# Add a note to an existing record +Session.update1({"session_id": 5, "notes": "Excluded from analysis"}) +``` + +**Inappropriate (use delete + insert + populate instead):** +```python +# DON'T: Update source data that affects computed results +Trial.update1({"trial_id": 1, "stimulus": "new_stim"}) # Computed tables now stale! + +# DO: Delete and recompute +(Trial & {"trial_id": 1}).delete() # Cascades to computed tables +Trial.insert1({"trial_id": 1, "stimulus": "new_stim"}) +ComputedResults.populate() +``` + +### 3.6 Why No Bulk Update? + +DataJoint intentionally does not provide `update()` for multiple rows: + +1. **Consistency**: Bulk updates easily create inconsistencies with derived data +2. **Auditability**: Single-row updates are explicit and traceable +3. **Workflow**: The insert/delete pattern maintains referential integrity + +If you need to update many rows, iterate explicitly: + +```python +for key in (Subject & condition).keys(): + Subject.update1({**key, "status": "archived"}) +``` + +--- + +## 4. Delete Operations + +### 4.1 `delete()` Method + +**Signature:** +```python +def delete( + self, + transaction: bool = True, + prompt: bool | None = None, + part_integrity: str = "enforce", +) -> int +``` + +**Parameters:** + +| Parameter | Type | Default | Description | +|-----------|------|---------|-------------| +| `transaction` | bool | `True` | Wrap in atomic transaction | +| `prompt` | bool | `None` | Prompt for confirmation (default: config setting) | +| `part_integrity` | str | `"enforce"` | Master-part integrity policy (see below) | + +**`part_integrity` values:** + +| Value | Behavior | +|-------|----------| +| `"enforce"` | Error if parts would be deleted without masters | +| `"ignore"` | Allow deleting parts without masters (breaks integrity) | +| `"cascade"` | Also delete masters when parts are deleted | + +**Returns:** Number of deleted rows from the primary table. + +### 4.2 Cascade Behavior + +Delete automatically cascades to all dependent tables: + +```python +# Deleting a subject deletes all their sessions, trials, and computed results +(Subject & {"subject_id": 1}).delete() +``` + +**Cascade order:** +1. Identify all tables with foreign keys referencing target +2. Recursively delete matching rows in child tables +3. Delete rows in target table + +### 4.3 Basic Usage + +```python +# Delete specific rows +(Subject & {"subject_id": 1}).delete() + +# Delete matching a condition +(Session & "session_date < '2024-01-01'").delete() + +# Delete all rows (use with caution!) +Subject.delete() +``` + +### 4.4 Safe Mode + +When `prompt=True` (default from config): + +``` +About to delete: + Subject: 1 rows + Session: 5 rows + Trial: 150 rows + ProcessedData: 150 rows + +Commit deletes? [yes, No]: +``` + +Disable for automated scripts: + +```python +Subject.delete(prompt=False) +``` + +### 4.5 Transaction Control + +```python +# Atomic delete (default) - all or nothing +(Subject & condition).delete(transaction=True) + +# Non-transactional (for nested transactions) +(Subject & condition).delete(transaction=False) +``` + +### 4.6 Part Table Constraints + +Cannot delete from part tables without deleting from master (by default): + +```python +# Error: cannot delete part without master +Session.Recording.delete() + +# Allow breaking master-part integrity +Session.Recording.delete(part_integrity="ignore") + +# Delete parts AND cascade up to delete master +Session.Recording.delete(part_integrity="cascade") +``` + +**`part_integrity` parameter:** + +| Value | Behavior | +|-------|----------| +| `"enforce"` | (default) Error if parts would be deleted without masters | +| `"ignore"` | Allow deleting parts without masters (breaks integrity) | +| `"cascade"` | Also delete masters when parts are deleted (maintains integrity) | + +### 4.7 `delete_quick()` Method + +Fast delete without cascade or confirmation: + +```python +def delete_quick(self, get_count: bool = False) -> int | None +``` + +**Use cases:** +- Internal cleanup +- Tables with no dependents +- When you've already handled dependencies + +**Behavior:** +- No cascade to child tables +- No user confirmation +- Fails on FK constraint violation + +```python +# Quick delete (fails if has dependents) +(TempTable & condition).delete_quick() + +# Get count of deleted rows +n = (TempTable & condition).delete_quick(get_count=True) +``` + +--- + +## 5. Validation + +### 5.1 `validate()` Method + +Pre-validate rows before insertion: + +```python +def validate(self, rows, *, ignore_extra_fields=False) -> ValidationResult +``` + +**Returns:** `ValidationResult` with: +- `is_valid`: Boolean indicating all rows passed +- `errors`: List of (row_idx, field_name, error_message) +- `rows_checked`: Number of rows validated + +### 5.2 Usage + +```python +result = Subject.validate(rows) + +if result: + Subject.insert(rows) +else: + print(result.summary()) + # Row 3, field 'dob': Invalid date format + # Row 7, field 'subject_id': Missing required field +``` + +### 5.3 Validations Performed + +| Check | Description | +|-------|-------------| +| Field existence | All fields must exist in table | +| NULL constraints | Required fields must have values | +| Primary key completeness | All PK fields must be present | +| UUID format | Valid UUID string or object | +| JSON serializability | JSON fields must be serializable | +| Codec validation | Custom type validation via codecs | + +### 5.4 Limitations + +These constraints are only checked at database level: +- Foreign key references +- Unique constraints (beyond PK) +- Custom CHECK constraints + +--- + +## 6. Part Tables + +### 6.1 Inserting into Part Tables + +Part tables are inserted via their master: + +```python +@schema +class Session(dj.Manual): + definition = """ + session_id : int + --- + date : date + """ + + class Recording(dj.Part): + definition = """ + -> master + recording_id : int + --- + duration : float + """ + +# Insert master with parts +Session.insert1({"session_id": 1, "date": "2024-01-15"}) +Session.Recording.insert([ + {"session_id": 1, "recording_id": 1, "duration": 60.0}, + {"session_id": 1, "recording_id": 2, "duration": 45.5}, +]) +``` + +### 6.2 Deleting with Part Tables + +Deleting master cascades to parts: + +```python +# Deletes session AND all its recordings +(Session & {"session_id": 1}).delete() +``` + +Cannot delete parts independently (by default): + +```python +# Error +Session.Recording.delete() + +# Allow breaking master-part integrity +Session.Recording.delete(part_integrity="ignore") + +# Or cascade up to also delete master +Session.Recording.delete(part_integrity="cascade") +``` + +--- + +## 7. Transaction Handling + +### 7.1 Implicit Transactions + +Single operations are atomic: + +```python +Subject.insert1(row) # Atomic +Subject.update1(row) # Atomic +Subject.delete() # Atomic (by default) +``` + +### 7.2 Explicit Transactions + +For multi-table operations: + +```python +with dj.conn().transaction: + Parent.insert1(parent_row) + Child.insert(child_rows) + # Commits on successful exit + # Rolls back on exception +``` + +### 7.3 Chunked Inserts and Transactions + +With `chunk_size`, each chunk is a separate transaction: + +```python +# Each chunk of 1000 rows commits independently +Subject.insert(large_dataset, chunk_size=1000) +``` + +If interrupted, completed chunks persist. + +--- + +## 8. Error Handling + +### 8.1 Common Errors + +| Error | Cause | Resolution | +|-------|-------|------------| +| `DuplicateError` | Primary key already exists | Use `skip_duplicates=True` or `replace=True` | +| `IntegrityError` | Foreign key constraint violated | Insert parent rows first | +| `MissingAttributeError` | Required field not provided | Include all required fields | +| `UnknownAttributeError` | Field not in table | Use `ignore_extra_fields=True` or fix field name | +| `DataJointError` | Various validation failures | Check error message for details | + +### 8.2 Error Recovery Pattern + +```python +try: + Subject.insert(rows) +except dj.errors.DuplicateError as e: + # Handle specific duplicate + print(f"Duplicate: {e}") +except dj.errors.IntegrityError as e: + # Missing parent reference + print(f"Missing parent: {e}") +except dj.DataJointError as e: + # Other DataJoint errors + print(f"Error: {e}") +``` + +--- + +## 9. Best Practices + +### 9.1 Prefer Insert/Delete Over Update + +```python +# Good: Delete and reinsert +(Trial & key).delete() +Trial.insert1(corrected_trial) +DerivedTable.populate() + +# Avoid: Update that creates stale derived data +Trial.update1({**key, "value": new_value}) # Derived tables now inconsistent! +``` + +### 9.2 Validate Before Insert + +```python +result = Subject.validate(rows) +if not result: + raise ValueError(result.summary()) +Subject.insert(rows) +``` + +### 9.3 Use Transactions for Related Inserts + +```python +with dj.conn().transaction: + session_key = Session.insert1(session_data, skip_duplicates=True) + Session.Recording.insert(recordings) + Session.Stimulus.insert(stimuli) +``` + +### 9.4 Batch Inserts for Performance + +```python +# Good: Single insert call +Subject.insert(all_rows) + +# Avoid: Loop of insert1 calls +for row in all_rows: + Subject.insert1(row) # Slow! +``` + +### 9.5 Safe Deletion in Production + +```python +# Always use prompt in interactive sessions +(Subject & condition).delete(prompt=True) + +# Disable only in tested automated scripts +(Subject & condition).delete(prompt=False) +``` + +--- + +## 10. Quick Reference + +| Operation | Method | Cascades | Transaction | Typical Use | +|-----------|--------|----------|-------------|-------------| +| Insert one | `insert1()` | β€” | Implicit | Adding single entity | +| Insert many | `insert()` | β€” | Per-chunk | Bulk data loading | +| Insert large object | `staged_insert1` | β€” | On exit | Zarr, HDF5 files | +| Update one | `update1()` | β€” | Implicit | Surgical corrections | +| Delete | `delete()` | Yes | Optional | Removing entities | +| Delete quick | `delete_quick()` | No | No | Internal cleanup | +| Validate | `validate()` | β€” | β€” | Pre-insert check | + + +--- +## File: reference/specs/fetch-api.md + +# DataJoint 2.0 Fetch API Specification + +## Overview + +DataJoint 2.0 replaces the complex `fetch()` method with a set of explicit, composable output methods. This provides better discoverability, clearer intent, and more efficient iteration. + +## Design Principles + +1. **Explicit over implicit**: Each output format has its own method +2. **Composable**: Use existing `.proj()` for column selection +3. **Lazy iteration**: Single cursor streaming instead of fetch-all-keys +4. **Modern formats**: First-class support for polars and Arrow + +--- + +## New API Reference + +### Output Methods + +| Method | Returns | Description | +|--------|---------|-------------| +| `to_dicts()` | `list[dict]` | All rows as list of dictionaries | +| `to_pandas()` | `DataFrame` | pandas DataFrame with primary key as index | +| `to_polars()` | `polars.DataFrame` | polars DataFrame (requires `datajoint[polars]`) | +| `to_arrow()` | `pyarrow.Table` | PyArrow Table (requires `datajoint[arrow]`) | +| `to_arrays()` | `np.ndarray` | numpy structured array (recarray) | +| `to_arrays('a', 'b')` | `tuple[array, array]` | Tuple of arrays for specific columns | +| `keys()` | `list[dict]` | Primary key values only | +| `fetch1()` | `dict` | Single row as dict (raises if not exactly 1) | +| `fetch1('a', 'b')` | `tuple` | Single row attribute values | + +### Common Parameters + +All output methods accept these optional parameters: + +```python +table.to_dicts( + order_by=None, # str or list: column(s) to sort by, e.g. "KEY", "name DESC" + limit=None, # int: maximum rows to return + offset=None, # int: rows to skip + squeeze=False, # bool: remove singleton dimensions from arrays +) +``` + +For external storage types (attachments, filepaths), files are downloaded to `config["download_path"]`. Use `config.override()` to change: + +```python +with dj.config.override(download_path="/data"): + data = table.to_dicts() +``` + +### Iteration + +```python +# Lazy streaming - yields one dict per row from database cursor +for row in table: + process(row) # row is a dict +``` + +--- + +## Migration Guide + +### Basic Fetch Operations + +| Old Pattern (1.x) | New Pattern (2.0) | +|-------------------|-------------------| +| `table.fetch()` | `table.to_arrays()` or `table.to_dicts()` | +| `table.fetch(format="array")` | `table.to_arrays()` | +| `table.fetch(format="frame")` | `table.to_pandas()` | +| `table.fetch(as_dict=True)` | `table.to_dicts()` | + +### Attribute Fetching + +| Old Pattern (1.x) | New Pattern (2.0) | +|-------------------|-------------------| +| `table.fetch('a')` | `table.to_arrays('a')` | +| `a, b = table.fetch('a', 'b')` | `a, b = table.to_arrays('a', 'b')` | +| `table.fetch('a', 'b', as_dict=True)` | `table.proj('a', 'b').to_dicts()` | + +### Primary Key Fetching + +| Old Pattern (1.x) | New Pattern (2.0) | +|-------------------|-------------------| +| `table.fetch('KEY')` | `table.keys()` | +| `table.fetch(dj.key)` | `table.keys()` | +| `keys, a = table.fetch('KEY', 'a')` | See note below | + +For mixed KEY + attribute fetch: +```python +# Old: keys, a = table.fetch('KEY', 'a') +# New: Combine keys() with to_arrays() +keys = table.keys() +a = table.to_arrays('a') +# Or use to_dicts() which includes all columns +``` + +### Ordering, Limiting, Offset + +| Old Pattern (1.x) | New Pattern (2.0) | +|-------------------|-------------------| +| `table.fetch(order_by='name')` | `table.to_arrays(order_by='name')` | +| `table.fetch(limit=10)` | `table.to_arrays(limit=10)` | +| `table.fetch(order_by='KEY', limit=10, offset=5)` | `table.to_arrays(order_by='KEY', limit=10, offset=5)` | + +### Single Row Fetch (fetch1) + +| Old Pattern (1.x) | New Pattern (2.0) | +|-------------------|-------------------| +| `table.fetch1()` | `table.fetch1()` (unchanged) | +| `a, b = table.fetch1('a', 'b')` | `a, b = table.fetch1('a', 'b')` (unchanged) | +| `table.fetch1('KEY')` | `table.fetch1()` then extract pk columns | + +### Configuration + +| Old Pattern (1.x) | New Pattern (2.0) | +|-------------------|-------------------| +| `dj.config['fetch_format'] = 'frame'` | Use `.to_pandas()` explicitly | +| `with dj.config.override(fetch_format='frame'):` | Use `.to_pandas()` in the block | + +### Iteration + +| Old Pattern (1.x) | New Pattern (2.0) | +|-------------------|-------------------| +| `for row in table:` | `for row in table:` (same syntax, now lazy!) | +| `list(table)` | `table.to_dicts()` | + +### Column Selection with proj() + +Use `.proj()` for column selection, then apply output method: + +```python +# Select specific columns +table.proj('col1', 'col2').to_pandas() +table.proj('col1', 'col2').to_dicts() + +# Computed columns +table.proj(total='price * quantity').to_pandas() +``` + +--- + +## Removed Features + +### Removed Methods and Parameters + +- `fetch()` method - use explicit output methods +- `fetch('KEY')` - use `keys()` +- `dj.key` class - use `keys()` method +- `format=` parameter - use explicit methods +- `as_dict=` parameter - use `to_dicts()` +- `config['fetch_format']` setting - use explicit methods + +### Removed Imports + +```python +# Old (removed) +from datajoint import key +result = table.fetch(dj.key) + +# New +result = table.keys() +``` + +--- + +## Examples + +### Example 1: Basic Data Retrieval + +```python +# Get all data as DataFrame +df = Experiment().to_pandas() + +# Get all data as list of dicts +rows = Experiment().to_dicts() + +# Get all data as numpy array +arr = Experiment().to_arrays() +``` + +### Example 2: Filtered and Sorted Query + +```python +# Get recent experiments, sorted by date +recent = (Experiment() & 'date > "2024-01-01"').to_pandas( + order_by='date DESC', + limit=100 +) +``` + +### Example 3: Specific Columns + +```python +# Fetch specific columns as arrays +names, dates = Experiment().to_arrays('name', 'date') + +# Or with primary key included +names, dates = Experiment().to_arrays('name', 'date', include_key=True) +``` + +### Example 4: Primary Keys for Iteration + +```python +# Get keys for restriction +keys = Experiment().keys() +for key in keys: + process(Session() & key) +``` + +### Example 5: Single Row + +```python +# Get one row as dict +row = (Experiment() & key).fetch1() + +# Get specific attributes +name, date = (Experiment() & key).fetch1('name', 'date') +``` + +### Example 6: Lazy Iteration + +```python +# Stream rows efficiently (single database cursor) +for row in Experiment(): + if should_process(row): + process(row) + if done: + break # Early termination - no wasted fetches +``` + +### Example 7: Modern DataFrame Libraries + +```python +# Polars (fast, modern) +import polars as pl +df = Experiment().to_polars() +result = df.filter(pl.col('value') > 100).group_by('category').agg(pl.mean('value')) + +# PyArrow (zero-copy interop) +table = Experiment().to_arrow() +# Can convert to pandas or polars with zero copy +``` + +--- + +## Performance Considerations + +### Lazy Iteration + +The new iteration is significantly more efficient: + +```python +# Old (1.x): N+1 queries +# 1. fetch("KEY") gets ALL keys +# 2. fetch1() for EACH key + +# New (2.0): Single query +# Streams rows from one cursor +for row in table: + ... +``` + +### Memory Efficiency + +- `to_dicts()`: Returns full list in memory +- `for row in table:`: Streams one row at a time +- `to_arrays(limit=N)`: Fetches only N rows + +### Format Selection + +| Use Case | Recommended Method | +|----------|-------------------| +| Data analysis | `to_pandas()` or `to_polars()` | +| JSON API responses | `to_dicts()` | +| Numeric computation | `to_arrays()` | +| Large datasets | `for row in table:` (streaming) | +| Interop with other tools | `to_arrow()` | + +--- + +## Error Messages + +When attempting to use removed methods, users see helpful error messages: + +```python +>>> table.fetch() +AttributeError: fetch() has been removed in DataJoint 2.0. +Use to_dicts(), to_pandas(), to_arrays(), or keys() instead. +See table.fetch.__doc__ for details. +``` + +--- + +## Optional Dependencies + +Install optional dependencies for additional output formats: + +```bash +# For polars support +pip install datajoint[polars] + +# For PyArrow support +pip install datajoint[arrow] + +# For both +pip install datajoint[polars,arrow] +``` + + +--- +## File: reference/specs/index.md + +# Specifications + +Formal specifications of DataJoint's data model and behavior. + +These documents define how DataJoint works at a detailed level. They serve as +authoritative references for: + +- Understanding exact behavior of operations +- Implementing compatible tools and extensions +- Debugging complex scenarios + +## Document Structure + +Each specification follows a consistent structure: + +1. **Overview** β€” What this specifies +2. **User Guide** β€” Practical usage +3. **API Reference** β€” Methods and signatures +4. **Concepts** β€” Definitions and rules +5. **Implementation Details** β€” Internal behavior +6. **Examples** β€” Concrete code samples +7. **Best Practices** β€” Recommendations + +## Specifications + +### Schema Definition + +| Specification | Description | +|---------------|-------------| +| [Table Declaration](table-declaration.md) | Table definition syntax, tiers, foreign keys, and indexes | +| [Master-Part Relationships](master-part.md) | Compositional data modeling, integrity, and cascading operations | +| [Virtual Schemas](virtual-schemas.md) | Accessing schemas without Python source, introspection API | + +### Query Operations + +| Specification | Description | +|---------------|-------------| +| [Query Algebra](query-algebra.md) | Operators: restrict, proj, join, aggr, extend, union, U() | +| [Data Manipulation](data-manipulation.md) | Insert, update1, delete operations and workflow normalization | +| [Primary Keys](primary-keys.md) | How primary keys propagate through query operators | +| [Semantic Matching](semantic-matching.md) | Attribute lineage and join compatibility | + +### Type System + +| Specification | Description | +|---------------|-------------| +| [Type System](type-system.md) | Three-layer type architecture: native, core, and codec types | +| [Codec API](codec-api.md) | Custom type implementation with encode/decode semantics | + +### Queries + +| Specification | Description | +|---------------|-------------| +| [Fetch API](fetch-api.md) | Data retrieval methods and formats | + +### Computation + +| Specification | Description | +|---------------|-------------| +| [AutoPopulate](autopopulate.md) | Jobs 2.0 system for automated computation | +| [Job Metadata](job-metadata.md) | Hidden columns for job tracking | + + +--- +## File: reference/specs/job-metadata.md + +# Hidden Job Metadata in Computed Tables + +## Overview + +Job execution metadata (start time, duration, code version) should be persisted in computed tables themselves, not just in ephemeral job entries. This is accomplished using hidden attributes. + +## Motivation + +The current job table (`~~table_name`) tracks execution metadata, but: +1. Job entries are deleted after completion (unless `keep_completed=True`) +2. Users often need to know when and with what code version each row was computed +3. This metadata should be transparent - not cluttering the user-facing schema + +Hidden attributes (prefixed with `_`) provide the solution: stored in the database but filtered from user-facing APIs. + +## Hidden Job Metadata Attributes + +| Attribute | Type | Description | +|-----------|------|-------------| +| `_job_start_time` | datetime(3) | When computation began | +| `_job_duration` | float32 | Computation duration in seconds | +| `_job_version` | varchar(64) | Code version (e.g., git commit hash) | + +**Design notes:** +- `_job_duration` (elapsed time) rather than `_job_completed_time` because duration is more informative for performance analysis +- `varchar(64)` for version is sufficient for git hashes (40 chars for SHA-1, 7-8 for short hash) +- `datetime(3)` provides millisecond precision + +## Configuration + +### Settings Structure + +Job metadata is controlled via `config.jobs` settings: + +```python +class JobsSettings(BaseSettings): + """Job queue configuration for AutoPopulate 2.0.""" + + model_config = SettingsConfigDict( + env_prefix="DJ_JOBS_", + case_sensitive=False, + extra="forbid", + validate_assignment=True, + ) + + # Existing settings + auto_refresh: bool = Field(default=True, ...) + keep_completed: bool = Field(default=False, ...) + stale_timeout: int = Field(default=3600, ...) + default_priority: int = Field(default=5, ...) + version_method: Literal["git", "none"] | None = Field(default=None, ...) + allow_new_pk_fields_in_computed_tables: bool = Field(default=False, ...) + + # New setting for hidden job metadata + add_job_metadata: bool = Field( + default=False, + description="Add hidden job metadata attributes (_job_start_time, _job_duration, _job_version) " + "to Computed and Imported tables during declaration. Tables created without this setting " + "will not receive metadata updates during populate." + ) +``` + +### Access Patterns + +```python +import datajoint as dj + +# Read setting +dj.config.jobs.add_job_metadata # False (default) + +# Enable programmatically +dj.config.jobs.add_job_metadata = True + +# Enable via environment variable +# DJ_JOBS_ADD_JOB_METADATA=true + +# Enable in config file (dj_config.yaml) +# jobs: +# add_job_metadata: true + +# Temporary override +with dj.config.override(jobs={"add_job_metadata": True}): + schema(MyComputedTable) # Declared with metadata columns +``` + +### Setting Interactions + +| Setting | Effect on Job Metadata | +|---------|----------------------| +| `add_job_metadata=True` | New Computed/Imported tables get hidden metadata columns | +| `add_job_metadata=False` | Tables declared without metadata columns (default) | +| `version_method="git"` | `_job_version` populated with git short hash | +| `version_method="none"` | `_job_version` left empty | +| `version_method=None` | `_job_version` left empty (same as "none") | + +### Behavior at Declaration vs Populate + +| `add_job_metadata` at declare | `add_job_metadata` at populate | Result | +|------------------------------|-------------------------------|--------| +| True | True | Metadata columns created and populated | +| True | False | Metadata columns exist but not populated | +| False | True | No metadata columns, populate skips silently | +| False | False | No metadata columns, normal behavior | + +### Retrofitting Existing Tables + +Tables created before enabling `add_job_metadata` do not have the hidden metadata columns. +To add metadata columns to existing tables, use the migration utility (not automatic): + +```python +from datajoint.migrate import add_job_metadata_columns + +# Add hidden metadata columns to specific table +add_job_metadata_columns(MyComputedTable) + +# Add to all Computed/Imported tables in a schema +add_job_metadata_columns(schema) +``` + +This utility: +- ALTERs the table to add the three hidden columns +- Does NOT populate existing rows (metadata remains NULL) +- Future `populate()` calls will populate metadata for new rows + +## Behavior + +### Declaration-time + +When `config.jobs.add_job_metadata=True` and a Computed/Imported table is declared: +- Hidden metadata columns are added to the table definition +- Only master tables receive metadata columns; Part tables never get them + +### Population-time + +After `make()` completes successfully: +1. Check if the table has hidden metadata columns +2. If yes: UPDATE the just-inserted rows with start_time, duration, version +3. If no: Silently skip (no error, no ALTER) + +This applies to both: +- **Direct mode** (`reserve_jobs=False`): Single-process populate +- **Distributed mode** (`reserve_jobs=True`): Multi-worker with job table coordination + +## Excluding Hidden Attributes from Binary Operators + +### Problem Statement + +If two tables have hidden attributes with the same name (e.g., both have `_job_start_time`), SQL's NATURAL JOIN would incorrectly match on them: + +```sql +-- NATURAL JOIN matches ALL common attributes including hidden +SELECT * FROM table_a NATURAL JOIN table_b +-- Would incorrectly match on _job_start_time! +``` + +### Solution: Replace NATURAL JOIN with USING Clause + +Hidden attributes must be excluded from all binary operator considerations. The result of a join does not preserve hidden attributes from its operands. + +**Current implementation:** +```python +def from_clause(self): + clause = next(support) + for s, left in zip(support, self._left): + clause += " NATURAL{left} JOIN {clause}".format(...) +``` + +**Proposed implementation:** +```python +def from_clause(self): + clause = next(support) + for s, (left, using_attrs) in zip(support, self._joins): + if using_attrs: + using = "USING ({})".format(", ".join(f"`{a}`" for a in using_attrs)) + clause += " {left}JOIN {s} {using}".format( + left="LEFT " if left else "", + s=s, + using=using + ) + else: + # Cross join (no common non-hidden attributes) + clause += " CROSS JOIN " + s if not left else " LEFT JOIN " + s + " ON TRUE" + return clause +``` + +### Changes Required + +#### 1. `QueryExpression._left` β†’ `QueryExpression._joins` + +Replace `_left: List[bool]` with `_joins: List[Tuple[bool, List[str]]]` + +Each join stores: +- `left`: Whether it's a left join +- `using_attrs`: Non-hidden common attributes to join on + +```python +# Before +result._left = self._left + [left] + other._left + +# After +join_attributes = [n for n in self.heading.names if n in other.heading.names] +result._joins = self._joins + [(left, join_attributes)] + other._joins +``` + +#### 2. `heading.names` (existing behavior) + +Already filters out hidden attributes: +```python +@property +def names(self): + return [k for k in self.attributes] # attributes excludes is_hidden=True +``` + +This ensures join attribute computation automatically excludes hidden attributes. + +### Behavior Summary + +| Scenario | Hidden Attributes | Result | +|----------|-------------------|--------| +| `A * B` (join) | Same hidden attr in both | NOT matched - excluded from USING | +| `A & B` (restriction) | Same hidden attr in both | NOT matched | +| `A - B` (anti-restriction) | Same hidden attr in both | NOT matched | +| `A.proj()` | Hidden attrs in A | NOT projected (unless explicitly named) | +| `A.to_dicts()` | Hidden attrs in A | NOT returned by default | + +## Implementation Details + +### 1. Declaration (declare.py) + +```python +def declare(full_table_name, definition, context): + # ... existing code ... + + # Add hidden job metadata for auto-populated tables + if config.jobs.add_job_metadata and table_tier in (TableTier.COMPUTED, TableTier.IMPORTED): + # Only for master tables, not parts + if not is_part_table: + job_metadata_sql = [ + "`_job_start_time` datetime(3) DEFAULT NULL", + "`_job_duration` float DEFAULT NULL", + "`_job_version` varchar(64) DEFAULT ''", + ] + attribute_sql.extend(job_metadata_sql) +``` + +### 2. Population (autopopulate.py) + +```python +def _populate1(self, key, callback, use_jobs, jobs): + start_time = datetime.now() + version = _get_job_version() + + # ... call make() ... + + duration = time.time() - start_time.timestamp() + + # Update job metadata if table has the hidden attributes + if self._has_job_metadata_attrs(): + self._update_job_metadata( + key, + start_time=start_time, + duration=duration, + version=version + ) + +def _has_job_metadata_attrs(self): + """Check if table has hidden job metadata columns.""" + hidden_attrs = self.heading._attributes # includes hidden + return '_job_start_time' in hidden_attrs + +def _update_job_metadata(self, key, start_time, duration, version): + """Update hidden job metadata for the given key.""" + # UPDATE using primary key + pk_condition = make_condition(self, key, set()) + self.connection.query( + f"UPDATE {self.full_table_name} SET " + f"`_job_start_time`=%s, `_job_duration`=%s, `_job_version`=%s " + f"WHERE {pk_condition}", + args=(start_time, duration, version[:64]) + ) +``` + +### 3. Job table (jobs.py) + +Update version field length: +```python +version="" : varchar(64) +``` + +### 4. Version helper + +```python +def _get_job_version() -> str: + """Get version string, truncated to 64 chars.""" + from .settings import config + + method = config.jobs.version_method + if method is None or method == "none": + return "" + elif method == "git": + try: + result = subprocess.run( + ["git", "rev-parse", "--short", "HEAD"], + capture_output=True, + text=True, + timeout=5, + ) + return result.stdout.strip()[:64] if result.returncode == 0 else "" + except Exception: + return "" + return "" +``` + +## Example Usage + +```python +# Enable job metadata for new tables +dj.config.jobs.add_job_metadata = True + +@schema +class ProcessedData(dj.Computed): + definition = """ + -> RawData + --- + result : float + """ + + def make(self, key): + # User code - unaware of hidden attributes + self.insert1({**key, 'result': compute(key)}) + +# Job metadata automatically added and populated: +# _job_start_time, _job_duration, _job_version + +# User-facing API unaffected: +ProcessedData().heading.names # ['raw_data_id', 'result'] +ProcessedData().to_dicts() # Returns only visible attributes + +# Access hidden attributes explicitly if needed: +ProcessedData().to_arrays('_job_start_time', '_job_duration', '_job_version') +``` + +## Summary of Design Decisions + +| Decision | Resolution | +|----------|------------| +| Configuration | `config.jobs.add_job_metadata` (default False) | +| Environment variable | `DJ_JOBS_ADD_JOB_METADATA` | +| Existing tables | No automatic ALTER - silently skip metadata if columns absent | +| Retrofitting | Manual via `datajoint.migrate.add_job_metadata_columns()` utility | +| Populate modes | Record metadata in both direct and distributed modes | +| Part tables | No metadata columns - only master tables | +| Version length | varchar(64) in both jobs table and computed tables | +| Binary operators | Hidden attributes excluded via USING clause instead of NATURAL JOIN | +| Failed makes | N/A - transaction rolls back, no rows to update | + + +--- +## File: reference/specs/master-part.md + +# Master-Part Relationships Specification + +Version: 1.0 +Status: Draft +Last Updated: 2026-01-08 + +## Overview + +Master-Part relationships model compositional data where a master entity contains multiple detail records. Part tables provide a way to store variable-length, structured data associated with each master entity while maintaining strict referential integrity. + +--- + +## 1. Definition + +### 1.1 Master Table + +Any table class (`Manual`, `Lookup`, `Imported`, `Computed`) can serve as a master: + +```python +@schema +class Session(dj.Manual): + definition = """ + subject_id : varchar(16) + session_idx : uint8 + --- + session_date : date + """ +``` + +### 1.2 Part Table + +Part tables are nested classes inheriting from `dj.Part`: + +```python +@schema +class Session(dj.Manual): + definition = """ + subject_id : varchar(16) + session_idx : uint8 + --- + session_date : date + """ + + class Trial(dj.Part): + definition = """ + -> master + trial_idx : uint16 + --- + stimulus : varchar(32) + response : varchar(32) + """ +``` + +### 1.3 SQL Naming + +| Python | SQL Table Name | +|--------|----------------| +| `Session` | `schema`.`session` | +| `Session.Trial` | `schema`.`session__trial` | + +Part tables use double underscore (`__`) separator in SQL. + +### 1.4 Master Reference + +Within a Part definition, reference the master using: + +```python +-> master # lowercase keyword (preferred) +-> Session # explicit class name +``` + +The `-> master` reference: +- Automatically inherits master's primary key +- Creates foreign key constraint to master +- Enforces ON DELETE RESTRICT (by default) + +--- + +## 2. Integrity Constraints + +### 2.1 Compositional Integrity + +Master-Part relationships enforce **compositional integrity**: + +1. **Existence**: Parts cannot exist without their master +2. **Cohesion**: Parts should be deleted/dropped with their master +3. **Atomicity**: Master and parts form a logical unit + +### 2.2 Foreign Key Behavior + +Part tables have implicit foreign key to master: + +```sql +FOREIGN KEY (master_pk) REFERENCES master_table (master_pk) +ON UPDATE CASCADE +ON DELETE RESTRICT +``` + +The `ON DELETE RESTRICT` prevents orphaned parts at the database level. + +--- + +## 3. Insert Operations + +### 3.1 Master-First Insertion + +Master must exist before inserting parts: + +```python +# Insert master +Session.insert1({ + 'subject_id': 'M001', + 'session_idx': 1, + 'session_date': '2026-01-08' +}) + +# Insert parts +Session.Trial.insert([ + {'subject_id': 'M001', 'session_idx': 1, 'trial_idx': 1, 'stimulus': 'A', 'response': 'left'}, + {'subject_id': 'M001', 'session_idx': 1, 'trial_idx': 2, 'stimulus': 'B', 'response': 'right'}, +]) +``` + +### 3.2 Atomic Insertion + +For atomic master+parts insertion, use transactions: + +```python +with dj.conn().transaction: + Session.insert1(master_data) + Session.Trial.insert(trials_data) +``` + +### 3.3 Computed Tables with Parts + +In `make()` methods, use `self.insert1()` for master and `self.PartName.insert()` for parts: + +```python +class ProcessedSession(dj.Computed): + definition = """ + -> Session + --- + n_trials : uint16 + """ + + class TrialResult(dj.Part): + definition = """ + -> master + -> Session.Trial + --- + score : float32 + """ + + def make(self, key): + trials = (Session.Trial & key).fetch() + results = process(trials) + + self.insert1({**key, 'n_trials': len(trials)}) + self.TrialResult.insert(results) +``` + +--- + +## 4. Delete Operations + +### 4.1 Cascade from Master + +Deleting from master cascades to parts: + +```python +# Deletes session AND all its trials +(Session & {'subject_id': 'M001', 'session_idx': 1}).delete() +``` + +### 4.2 Part Integrity Parameter + +Direct deletion from Part tables is controlled by `part_integrity`: + +```python +def delete(self, part_integrity: str = "enforce", ...) -> int +``` + +| Value | Behavior | +|-------|----------| +| `"enforce"` | (default) Error if parts deleted without masters | +| `"ignore"` | Allow deleting parts without masters (breaks integrity) | +| `"cascade"` | Also delete masters when parts are deleted | + +### 4.3 Default Behavior (enforce) + +```python +# Error: Cannot delete from Part directly +Session.Trial.delete() +# DataJointError: Cannot delete from a Part directly. +# Delete from master instead, or use part_integrity='ignore' +# to break integrity, or part_integrity='cascade' to also delete master. +``` + +### 4.4 Breaking Integrity (ignore) + +```python +# Allow direct part deletion (master retains incomplete parts) +(Session.Trial & {'trial_idx': 1}).delete(part_integrity="ignore") +``` + +**Use cases:** +- Removing specific invalid trials +- Partial data cleanup +- Testing/debugging + +**Warning:** This leaves masters with incomplete part data. + +### 4.5 Cascade to Master (cascade) + +```python +# Delete parts AND their masters +(Session.Trial & condition).delete(part_integrity="cascade") +``` + +**Behavior:** +- Identifies affected masters +- Deletes masters (which cascades to ALL their parts) +- Maintains compositional integrity + +### 4.6 Behavior Matrix + +| Operation | Result | +|-----------|--------| +| `Master.delete()` | Deletes master + all parts | +| `Part.delete()` | Error (default) | +| `Part.delete(part_integrity="ignore")` | Deletes parts only | +| `Part.delete(part_integrity="cascade")` | Deletes parts + masters | + +--- + +## 5. Drop Operations + +### 5.1 Drop Master + +Dropping a master table also drops all its part tables: + +```python +Session.drop() # Drops Session AND Session.Trial +``` + +### 5.2 Drop Part Directly + +Part tables cannot be dropped directly by default: + +```python +Session.Trial.drop() +# DataJointError: Cannot drop a Part directly. Drop master instead, +# or use part_integrity='ignore' to force. + +# Override with part_integrity="ignore" +Session.Trial.drop(part_integrity="ignore") +``` + +**Note:** `part_integrity="cascade"` is not supported for drop (too destructive). + +### 5.3 Schema Drop + +Dropping schema drops all tables including masters and parts: + +```python +schema.drop(prompt=False) +``` + +--- + +## 6. Query Operations + +### 6.1 Accessing Parts + +```python +# From master class +Session.Trial + +# From master instance +session = Session() +session.Trial +``` + +### 6.2 Joining Master and Parts + +```python +# All trials with session info +Session * Session.Trial + +# Filtered +(Session & {'subject_id': 'M001'}) * Session.Trial +``` + +### 6.3 Aggregating Parts + +```python +# Count trials per session +Session.aggr(Session.Trial, n_trials='count(trial_idx)') + +# Statistics +Session.aggr( + Session.Trial, + n_trials='count(trial_idx)', + n_correct='sum(response = stimulus)' +) +``` + +--- + +## 7. Best Practices + +### 7.1 When to Use Part Tables + +**Good use cases:** +- Trials within sessions +- Electrodes within probes +- Cells within imaging fields +- Frames within videos +- Rows within files + +**Avoid when:** +- Parts have independent meaning (use regular FK instead) +- Need to query parts without master context +- Parts reference multiple masters + +### 7.2 Naming Conventions + +```python +class Master(dj.Manual): + class Detail(dj.Part): # Singular, descriptive + ... + class Items(dj.Part): # Or plural for collections + ... +``` + +### 7.3 Part Primary Keys + +Include minimal additional keys beyond master reference: + +```python +class Session(dj.Manual): + definition = """ + session_id : uint32 + --- + ... + """ + + class Trial(dj.Part): + definition = """ + -> master + trial_idx : uint16 # Only trial-specific key + --- + ... + """ +``` + +### 7.4 Avoiding Deep Nesting + +Part tables cannot have their own parts. For hierarchical data: + +```python +# Instead of nested parts, use separate tables with FKs +@schema +class Session(dj.Manual): + definition = """...""" + class Trial(dj.Part): + definition = """...""" + +@schema +class TrialEvent(dj.Manual): # Not a Part, but references Trial + definition = """ + -> Session.Trial + event_idx : uint8 + --- + event_time : float32 + """ +``` + +--- + +## 8. Implementation Reference + +| File | Purpose | +|------|---------| +| `user_tables.py` | Part class definition | +| `table.py` | delete() with part_integrity | +| `schemas.py` | Part table decoration | +| `declare.py` | Part table SQL generation | + +--- + +## 9. Error Messages + +| Error | Cause | Solution | +|-------|-------|----------| +| "Cannot delete from Part directly" | Called Part.delete() with part_integrity="enforce" | Delete from master, or use part_integrity="ignore" or "cascade" | +| "Cannot drop Part directly" | Called Part.drop() with part_integrity="enforce" | Drop master table, or use part_integrity="ignore" | +| "Attempt to delete part before master" | Cascade would delete part without master | Use part_integrity="ignore" or "cascade" | + + +--- +## File: reference/specs/migration-2.0.md + +# DataJoint 2.0 Migration Specification + +This specification defines the migration process from DataJoint 0.x to DataJoint 2.0. The migration preserves all existing data while updating metadata to leverage 2.0's enhanced type system. + +> **Warning: Read and understand this entire specification before migrating.** +> +> Migration involves irreversible changes to external storage metadata. We strongly recommend using an advanced AI coding assistant (e.g., Claude Code, Cursor, GitHub Copilot) to: +> +> 1. **Analyze your schema** β€” Identify all tables, data types, and external storage usage +> 2. **Generate a migration plan** β€” Create a step-by-step plan specific to your pipeline +> 3. **Execute with oversight** β€” Run migration steps with human review at each stage +> +> The migration process is designed and tested for agentic execution, allowing AI assistants to safely perform the migration while keeping you informed of each change. + +## Overview + +DataJoint 2.0 introduces a unified type system with explicit codecs for object storage. **Migration is required** to use 2.0's full feature set. The migration updates table metadata (column comments) to include type labels that 2.0 uses to interpret data correctly. + +**Key points:** +- DataJoint 2.0 can read 0.x schemas **before migration** (including external storage) +- Migration updates metadata only; underlying data remains unchanged +- **External storage migration is one-way** β€” once migrated, 0.14 loses access to external data + +### Migration Components + +| Step | Component | Description | +|------|-----------|-------------| +| 0 | Settings | Update configuration to `datajoint.json` format | +| 1 | Core Types | Add type labels to column comments for numeric/string types | +| 2 | Internal Blobs | Convert `LONGBLOB` columns to `` codec | +| 3 | Internal Attachments | Convert attachment columns to `` codec | +| 4 | External Objects | Convert external blobs/attachments to `` / `` codecs | +| 5 | Filepaths | Convert filepath columns to `` codec | + +--- + +## Step 0: Settings File Migration + +### Current (0.x) +```python +dj.config['database.host'] = 'localhost' +dj.config['database.user'] = 'root' +dj.config['database.password'] = 'secret' +dj.config['stores'] = { + 'external': { + 'protocol': 'file', + 'location': '/data/external' + } +} +``` + +### Target (2.0) +``` +project/ +β”œβ”€β”€ datajoint.json +└── .secrets/ + β”œβ”€β”€ database.password + └── database.user +``` + +**datajoint.json:** +```json +{ + "database.host": "localhost", + "stores": { + "external": { + "protocol": "file", + "location": "/data/external" + } + } +} +``` + +### Migration Actions +1. Create `datajoint.json` from existing `dj_local_conf.json` or `dj.config` settings +2. Move credentials to `.secrets/` directory +3. Add `.secrets/` to `.gitignore` +4. Update environment variables if used (`DJ_*` prefix) + +--- + +## Step 1: Core Type Labels + +DataJoint 2.0 uses explicit type aliases (`int32`, `float64`, etc.) stored in column comments. + +### Type Mapping + +| MySQL Native | DataJoint 2.0 | Comment Label | +|--------------|---------------|---------------| +| `TINYINT` | `int8` | `:int8:` | +| `TINYINT UNSIGNED` | `uint8` | `:uint8:` | +| `SMALLINT` | `int16` | `:int16:` | +| `SMALLINT UNSIGNED` | `uint16` | `:uint16:` | +| `INT` | `int32` | `:int32:` | +| `INT UNSIGNED` | `uint32` | `:uint32:` | +| `BIGINT` | `int64` | `:int64:` | +| `BIGINT UNSIGNED` | `uint64` | `:uint64:` | +| `FLOAT` | `float32` | `:float32:` | +| `DOUBLE` | `float64` | `:float64:` | +| `TINYINT(1)` | `bool` | `:bool:` | + +### Migration Actions +1. Query `INFORMATION_SCHEMA.COLUMNS` for all tables in schema +2. For each numeric column, determine the appropriate 2.0 type +3. Update column comment to include type label prefix + +### Example SQL +```sql +ALTER TABLE `schema`.`table_name` +MODIFY COLUMN `column_name` INT NOT NULL COMMENT ':int32: original comment'; +``` + +--- + +## Step 2: Internal Blobs (``) + +Internal blobs are stored directly in the database as `LONGBLOB` columns. + +### Identification +- Column type: `LONGBLOB` +- No external store reference in comment +- Used for numpy arrays, pickled objects + +### Current Storage +```sql +column_name LONGBLOB COMMENT 'some description' +``` + +### Target Format +```sql +column_name LONGBLOB COMMENT ':blob: some description' +``` + +### Migration Actions +1. Identify all `LONGBLOB` columns without external store markers +2. Add `:blob:` prefix to column comment +3. No data modification required (format unchanged) + +--- + +## Step 3: Internal Attachments (``) + +Internal attachments store files directly in the database with filename metadata. + +### Identification +- Column type: `LONGBLOB` +- Comment contains `:attach:` or attachment indicator +- Stores serialized (filename, content) tuples + +### Current Storage +```sql +attachment LONGBLOB COMMENT ':attach: uploaded file' +``` + +### Target Format +```sql +attachment LONGBLOB COMMENT ':attach: uploaded file' +``` + +### Migration Actions +1. Identify attachment columns (existing `:attach:` marker or known attachment pattern) +2. Verify comment format matches 2.0 specification +3. No data modification required + +--- + +## Step 4: External Objects (``, ``) + +External objects store data in configured storage backends (S3, filesystem) with metadata in the database. + +### Identification +- Column type: `VARCHAR(255)` or similar (stores hash/path) +- Comment contains store reference (e.g., `:external:`) +- Corresponding entry in external storage + +### Current Storage +```sql +external_data VARCHAR(255) COMMENT ':external: large array' +``` + +### Target Format +```sql +external_data JSON COMMENT ':blob@external: large array' +``` + +### Migration Actions +1. Identify external blob/attachment columns +2. Verify store configuration exists in `datajoint.json` +3. Update column comment to use `` or `` format +4. Migrate column type from `VARCHAR` to `JSON` if needed +5. Update path format to URL representation (`file://`, `s3://`) + +### Store Configuration +Ensure stores are defined in `datajoint.json`: +```json +{ + "stores": { + "external": { + "protocol": "file", + "location": "/data/external" + }, + "s3store": { + "protocol": "s3", + "endpoint": "s3.amazonaws.com", + "bucket": "my-bucket" + } + } +} +``` + +--- + +## Step 5: Filepath Codec (``) + +Filepath columns store references to managed files in external storage. + +### Identification +- Column type: `VARCHAR(255)` or similar +- Comment contains `:filepath:` or filepath indicator +- References files in managed storage location + +### Current Storage +```sql +file_path VARCHAR(255) COMMENT ':filepath@store: data file' +``` + +### Target Format +```sql +file_path JSON COMMENT ':filepath@store: data file' +``` + +### Migration Actions +1. Identify filepath columns +2. Verify store configuration +3. Update column type to `JSON` if needed +4. Convert stored paths to URL format +5. Update comment to 2.0 format + +--- + +## AI-Assisted Migration + +The migration process is optimized for execution by AI coding assistants. Before running the migration tool, use your AI assistant to: + +### 1. Schema Analysis +``` +Analyze my DataJoint schema at [database_host]: +- List all schemas and tables +- Identify column types requiring migration +- Flag external storage usage and store configurations +- Report any potential compatibility issues +``` + +### 2. Migration Plan Generation +``` +Create a migration plan for schema [schema_name]: +- Step-by-step actions with SQL statements +- Backup checkpoints before irreversible changes +- Validation queries after each step +- Estimated impact (rows affected, storage changes) +``` + +### 3. Supervised Execution +``` +Execute the migration plan for [schema_name]: +- Run each step and report results +- Pause for confirmation before external storage migration +- Verify data integrity after completion +``` + +The AI assistant will use this specification and the migration tool to execute the plan safely. + +--- + +## Migration Tool + +DataJoint 2.0 provides a migration utility: + +```python +from datajoint.migrate import migrate_schema + +# Analyze schema without making changes +report = migrate_schema('my_schema', dry_run=True) +print(report) + +# Perform migration +migrate_schema('my_schema', dry_run=False) +``` + +### Options +- `dry_run`: Analyze without modifying (default: True) +- `backup`: Create backup before migration (default: True) +- `stores`: Store configuration dict (uses config if not provided) + +--- + +## Rollback + +If migration issues occur: + +1. **Settings**: Restore original `dj_local_conf.json` +2. **Column comments**: Revert comment changes via SQL +3. **Core types and internal blobs**: Fully reversible + +**External storage cannot be rolled back.** Once external object references are migrated from hidden tables to JSON fields: +- The hidden `~external_*` tables are no longer updated +- DataJoint 0.14 cannot read the JSON field format +- Reverting requires restoring from backup + +**Recommendation:** Create a full database backup before migrating schemas with external storage. + +--- + +## Validation + +After migration, verify: + +```python +import datajoint as dj + +schema = dj.Schema('my_schema') + +# Check all tables load correctly +for table in schema.list_tables(): + tbl = schema(table) + print(f"{table}: {len(tbl)} rows") + # Fetch sample to verify data access + if len(tbl) > 0: + tbl.fetch(limit=1) +``` + +--- + +## Version Compatibility + +| DataJoint Version | Can Read 0.x Data | Can Read 2.0 Data | +|-------------------|-------------------|-------------------| +| 0.14.x | Yes | No (loses external data access) | +| 2.0.x | Yes (including external) | Yes | + +### External Storage Breaking Change + +**This is a one-way migration for external storage.** + +- **0.14.x** stores external object references in hidden tables (`~external_*`) +- **2.0** stores external object references as JSON fields directly in the table + +| Scenario | Result | +|----------|--------| +| Before migration, 2.0 reads 0.x schema | Works - 2.0 can read hidden table format | +| After migration, 2.0 reads schema | Works - uses JSON field format | +| After migration, 0.14 reads schema | **Breaks** - 0.14 cannot read JSON format, loses access to external data | + +**Warning:** Once external storage is migrated to 2.0 format, reverting to DataJoint 0.14 will result in loss of access to externally stored data. Ensure all users/pipelines are ready for 2.0 before migrating schemas with external storage. + +### Recommended Migration Order + +1. Update all code to DataJoint 2.0 +2. Test with existing schemas (2.0 can read 0.x format) +3. Migrate schemas once all systems are on 2.0 +4. Verify data access after migration + + +--- +## File: reference/specs/primary-keys.md + +# Primary Key Rules in Relational Operators + +In DataJoint, the result of each query operator produces a valid **entity set** with a well-defined **entity type** and **primary key**. This section specifies how the primary key is determined for each relational operator. + +## General Principle + +The primary key of a query result identifies unique entities in that result. For most operators, the primary key is preserved from the left operand. For joins, the primary key depends on the functional dependencies between the operands. + +## Integration with Semantic Matching + +Primary key determination is applied **after** semantic compatibility is verified. The evaluation order is: + +1. **Semantic Check**: `assert_join_compatibility()` ensures all namesakes are homologous (same lineage) +2. **PK Determination**: The "determines" relationship is computed using attribute names +3. **Left Join Validation**: If `left=True`, verify A β†’ B + +This ordering is important because: +- After semantic matching passes, namesakes represent semantically equivalent attributes +- The name-based "determines" check is therefore semantically valid +- Attribute names in the context of a semantically-valid join represent the same entity + +The "determines" relationship uses attribute **names** (not lineages directly) because: +- Lineage ensures namesakes are homologous +- Once verified, checking by name is equivalent to checking by semantic identity +- Aliased attributes (same lineage, different names) don't participate in natural joins anyway + +## Notation + +In the examples below, `*` marks primary key attributes: +- `A(x*, y*, z)` means A has primary key `{x, y}` and secondary attribute `z` +- `A β†’ B` means "A determines B" (defined below) + +### Rules by Operator + +| Operator | Primary Key Rule | +|----------|------------------| +| `A & B` (restriction) | PK(A) β€” preserved from left operand | +| `A - B` (anti-restriction) | PK(A) β€” preserved from left operand | +| `A.proj(...)` (projection) | PK(A) β€” preserved from left operand | +| `A.aggr(B, ...)` (aggregation) | PK(A) β€” preserved from left operand | +| `A.extend(B)` (extension) | PK(A) β€” requires A β†’ B | +| `A * B` (join) | Depends on functional dependencies (see below) | + +### Join Primary Key Rule + +The join operator requires special handling because it combines two entity sets. The primary key of `A * B` depends on the **functional dependency relationship** between the operands. + +#### Definitions + +**A determines B** (written `A β†’ B`): Every attribute in PK(B) is in A. + +``` +A β†’ B iff βˆ€b ∈ PK(B): b ∈ A +``` + +Since `PK(A) βˆͺ secondary(A) = all attributes in A`, this is equivalent to saying every attribute in B's primary key exists somewhere in A (as either a primary key or secondary attribute). + +Intuitively, `A β†’ B` means that knowing A's primary key is sufficient to determine B's primary key through the functional dependencies implied by A's structure. + +**B determines A** (written `B β†’ A`): Every attribute in PK(A) is in B. + +``` +B β†’ A iff βˆ€a ∈ PK(A): a ∈ B +``` + +#### Join Primary Key Algorithm + +For `A * B`: + +| Condition | PK(A * B) | Attribute Order | +|-----------|-----------|-----------------| +| A β†’ B | PK(A) | A's attributes first | +| B β†’ A (and not A β†’ B) | PK(B) | B's attributes first | +| Neither | PK(A) βˆͺ PK(B) | PK(A) first, then PK(B) βˆ’ PK(A) | + +When both `A β†’ B` and `B β†’ A` hold, the left operand takes precedence (use PK(A)). + +#### Examples + +**Example 1: B β†’ A** +``` +A: x*, y* +B: x*, z*, y (y is secondary in B, so z β†’ y) +``` +- A β†’ B? PK(B) = {x, z}. Is z in PK(A) or secondary in A? No (z not in A). **No.** +- B β†’ A? PK(A) = {x, y}. Is y in PK(B) or secondary in B? Yes (secondary). **Yes.** +- Result: **PK(A * B) = {x, z}** with B's attributes first. + +**Example 2: Both directions (bijection-like)** +``` +A: x*, y*, z (z is secondary in A) +B: y*, z*, x (x is secondary in B) +``` +- A β†’ B? PK(B) = {y, z}. Is z in PK(A) or secondary in A? Yes (secondary). **Yes.** +- B β†’ A? PK(A) = {x, y}. Is x in PK(B) or secondary in B? Yes (secondary). **Yes.** +- Both hold, prefer left operand: **PK(A * B) = {x, y}** with A's attributes first. + +**Example 3: Neither direction** +``` +A: x*, y* +B: z*, x (x is secondary in B) +``` +- A β†’ B? PK(B) = {z}. Is z in PK(A) or secondary in A? No. **No.** +- B β†’ A? PK(A) = {x, y}. Is y in PK(B) or secondary in B? No (y not in B). **No.** +- Result: **PK(A * B) = {x, y, z}** (union) with A's attributes first. + +**Example 4: A β†’ B (subordinate relationship)** +``` +Session: session_id* +Trial: session_id*, trial_num* (references Session) +``` +- A β†’ B? PK(Trial) = {session_id, trial_num}. Is trial_num in PK(Session) or secondary? No. **No.** +- B β†’ A? PK(Session) = {session_id}. Is session_id in PK(Trial)? Yes. **Yes.** +- Result: **PK(Session * Trial) = {session_id, trial_num}** with Trial's attributes first. + +**Join primary key determination**: + - `A * B` where `A β†’ B`: result has PK(A) + - `A * B` where `B β†’ A` (not `A β†’ B`): result has PK(B), B's attributes first + - `A * B` where both `A β†’ B` and `B β†’ A`: result has PK(A) (left preference) + - `A * B` where neither direction: result has PK(A) βˆͺ PK(B) + - Verify attribute ordering matches primary key source + - Verify non-commutativity: `A * B` vs `B * A` may differ in PK and order + +### Design Tradeoff: Predictability vs. Minimality + +The join primary key rule prioritizes **predictability** over **minimality**. In some cases, the resulting primary key may not be minimal (i.e., it may contain functionally redundant attributes). + +**Example of non-minimal result:** +``` +A: x*, y* +B: z*, x (x is secondary in B, so z β†’ x) +``` + +The mathematically minimal primary key for `A * B` would be `{y, z}` because: +- `z β†’ x` (from B's structure) +- `{y, z} β†’ {x, y, z}` (z gives us x, and we have y) + +However, `{y, z}` is problematic: +- It is **not the primary key of either operand** (A has `{x, y}`, B has `{z}`) +- It is **not the union** of the primary keys +- It represents a **novel entity type** that doesn't correspond to A, B, or their natural pairing + +This creates confusion: what kind of entity does `{y, z}` identify? + +**The simplified rule produces `{x, y, z}`** (the union), which: +- Is immediately recognizable as "one A entity paired with one B entity" +- Contains A's full primary key and B's full primary key +- May have redundancy (`x` is determined by `z`) but is semantically clear + +**Rationale:** Users can always project away redundant attributes if they need the minimal key. But starting with a predictable, interpretable primary key reduces confusion and errors. + +### Attribute Ordering + +The primary key attributes always appear **first** in the result's attribute list, followed by secondary attributes. When `B β†’ A` (and not `A β†’ B`), the join is conceptually reordered as `B * A` to maintain this invariant: + +- If PK = PK(A): A's attributes appear first +- If PK = PK(B): B's attributes appear first +- If PK = PK(A) βˆͺ PK(B): PK(A) attributes first, then PK(B) βˆ’ PK(A), then secondaries + +### Non-Commutativity + +With these rules, join is **not commutative** in terms of: +1. **Primary key selection**: `A * B` may have a different PK than `B * A` when one direction determines but not the other +2. **Attribute ordering**: The left operand's attributes appear first (unless B β†’ A) + +The **result set** (the actual rows returned) remains the same regardless of order, but the **schema** (primary key and attribute order) may differ. + +### Left Join Constraint + +For left joins (`A.join(B, left=True)`), the functional dependency **A β†’ B is required**. + +**Why this constraint exists:** + +In a left join, all rows from A are retained even if there's no matching row in B. For unmatched rows, B's attributes are NULL. This creates a problem for primary key validity: + +| Scenario | PK by inner join rule | Left join problem | +|----------|----------------------|-------------------| +| A β†’ B | PK(A) | βœ… Safe β€” A's attrs always present | +| B β†’ A | PK(B) | ❌ B's PK attrs could be NULL | +| Neither | PK(A) βˆͺ PK(B) | ❌ B's PK attrs could be NULL | + +**Example of invalid left join:** +``` +A: x*, y* PK(A) = {x, y} +B: x*, z*, y PK(B) = {x, z}, y is secondary + +Inner join: PK = {x, z} (B β†’ A rule) +Left join attempt: FAILS because z could be NULL for unmatched A rows +``` + +**Valid left join example:** +``` +Session: session_id*, date +Trial: session_id*, trial_num*, stimulus (references Session) + +Session.join(Trial, left=True) # OK: Session β†’ Trial +# PK = {session_id}, all sessions retained even without trials +``` + +**Error message:** +``` +DataJointError: Left join requires the left operand to determine the right operand (A β†’ B). +The following attributes from the right operand's primary key are not determined by +the left operand: ['z']. Use an inner join or restructure the query. +``` + +### Conceptual Note: Left Join as Extension + +When `A β†’ B`, the left join `A.join(B, left=True)` is conceptually distinct from the general join operator `A * B`. It is better understood as an **extension** operation rather than a join: + +| Aspect | General Join (A * B) | Left Join when A β†’ B | +|--------|---------------------|----------------------| +| Conceptual model | Cartesian product restricted to matching rows | Extend A with attributes from B | +| Row count | May increase, decrease, or stay same | Always equals len(A) | +| Primary key | Depends on functional dependencies | Always PK(A) | +| Relation to projection | Different operation | Variation of projection | + +**The extension perspective:** + +The operation `A.join(B, left=True)` when `A β†’ B` is closer to **projection** than to **join**: +- It adds new attributes to A (like `A.proj(..., new_attr=...)`) +- It preserves all rows of A +- It preserves A's primary key +- It lacks the Cartesian product aspect that defines joins + +DataJoint provides an explicit `extend()` method for this pattern: + +```python +# These are equivalent when A β†’ B: +A.join(B, left=True) +A.extend(B) # clearer intent: extend A with B's attributes +``` + +The `extend()` method: +- Requires `A β†’ B` (raises `DataJointError` otherwise) +- Does not expose `allow_nullable_pk` (that's an internal mechanism) +- Expresses the semantic intent: "add B's attributes to A's entities" + +**Relationship to aggregation:** + +A similar argument applies to `A.aggr(B, ...)`: +- It preserves A's primary key +- It adds computed attributes derived from B +- It's conceptually a variation of projection with grouping + +Both `A.join(B, left=True)` (when A β†’ B) and `A.aggr(B, ...)` can be viewed as **projection-like operations** that extend A's attributes while preserving its entity identity. + +### Bypassing the Left Join Constraint + +For special cases where the user takes responsibility for handling the potentially nullable primary key, the constraint can be bypassed using `allow_nullable_pk=True`: + +```python +# Normally blocked - A does not determine B +A.join(B, left=True) # Error: A β†’ B not satisfied + +# Bypass the constraint - user takes responsibility +A.join(B, left=True, allow_nullable_pk=True) # Allowed, PK = PK(A) βˆͺ PK(B) +``` + +When bypassed, the resulting primary key is the union of both operands' primary keys (PK(A) βˆͺ PK(B)). The user must ensure that subsequent operations (such as `GROUP BY` or projection) establish a valid primary key. The parameter name `allow_nullable_pk` reflects the specific issue: primary key attributes from the right operand could be NULL for unmatched rows. + +This mechanism is used internally by aggregation (`aggr`) when `exclude_nonmatching=False` (the default), which resets the primary key via the `GROUP BY` clause. + +### Aggregation Exception + +`A.aggr(B)` (with default `exclude_nonmatching=False`) uses a left join internally but has the **opposite requirement**: **B β†’ A** (the group expression B must have all of A's primary key attributes). + +This apparent contradiction is resolved by the `GROUP BY` clause: + +1. Aggregation requires B β†’ A so that B can be grouped by A's primary key +2. The intermediate left join `A LEFT JOIN B` would have an invalid PK under the normal left join rules +3. Aggregation internally allows the invalid PK, producing PK(A) βˆͺ PK(B) +4. The `GROUP BY PK(A)` clause then **resets** the primary key to PK(A) +5. The final result has PK(A), which consists entirely of non-NULL values from A + +Note: The semantic check (homologous namesake validation) is still performed for aggregation's internal join. Only the primary key validity constraint is bypassed. + +**Example:** +``` +Session: session_id*, date +Trial: session_id*, trial_num*, response_time (references Session) + +# Aggregation (default keeps all rows) +Session.aggr(Trial, avg_rt='avg(response_time)') + +# Internally: Session LEFT JOIN Trial (with invalid PK allowed) +# Intermediate PK would be {session_id} βˆͺ {session_id, trial_num} = {session_id, trial_num} +# But GROUP BY session_id resets PK to {session_id} +# Result: All sessions, with avg_rt=NULL for sessions without trials +``` + +## Universal Set `dj.U` + +`dj.U()` or `dj.U('attr1', 'attr2', ...)` represents the universal set of all possible values and lineages. + +### Homology with `dj.U` +Since `dj.U` conceptually contains all possible lineages, its attributes are **homologous to any namesake attribute** in other expressions. + +### Valid Operations + +```python +# Restriction: promotes a, b to PK; lineage transferred from A +dj.U('a', 'b') & A + +# Aggregation: groups by a, b +dj.U('a', 'b').aggr(A, count='count(*)') +``` + +### Invalid Operations + +```python +# Anti-restriction: produces infinite set +dj.U('a', 'b') - A # DataJointError + +# Join: deprecated, use & instead +dj.U('a', 'b') * A # DataJointError with migration guidance +``` + + + +--- +## File: reference/specs/query-algebra.md + +# DataJoint Query Algebra Specification + +Version: 1.0 +Status: Draft +Last Updated: 2026-01-07 + +## Overview + +This document specifies the query algebra in DataJoint Python. Query expressions are composable objects that represent database queries. All operators return new QueryExpression objects without modifying the originalβ€”expressions are immutable. + +## 1. Query Expression Fundamentals + +### 1.1 Immutability + +All query expressions are immutable. Every operator creates a new expression: + +```python +original = Session() +restricted = original & "session_date > '2024-01-01'" # New object +# original is unchanged +``` + +### 1.2 Primary Key Preservation + +Most operators preserve the primary key of their input. The exceptions are: + +- **Join**: May expand or contract PK based on functional dependencies +- **U & table**: Sets PK to U's attributes + +### 1.3 Lazy Evaluation + +Expressions are not executed until data is fetched: + +```python +expr = (Session * Trial) & "trial_type = 'test'" # No database query yet +data = expr.to_dicts() # Query executed here +``` + +--- + +## 2. Restriction (`&` and `-`) + +### 2.1 Syntax + +```python +result = expression & condition # Select matching rows +result = expression - condition # Select non-matching rows (anti-restriction) +result = expression.restrict(condition, semantic_check=True) +``` + +### 2.2 Condition Types + +| Type | Example | Behavior | +|------|---------|----------| +| String | `"x > 5"` | SQL WHERE condition | +| Dict | `{"status": "active"}` | Equality on attributes | +| QueryExpression | `OtherTable` | Rows with matching keys in other table | +| List/Tuple/Set | `[cond1, cond2]` | OR of conditions | +| Boolean | `True` / `False` | No effect / empty result | +| pandas.DataFrame | `df` | OR of row conditions | +| numpy.void | `record` | Treated as dict | + +### 2.3 String Conditions + +SQL expressions using attribute names: + +```python +Session & "session_date > '2024-01-01'" +Session & "subject_id IN (1, 2, 3)" +Session & "notes LIKE '%test%'" +Session & "(x > 0) AND (y < 100)" +``` + +### 2.4 Dictionary Conditions + +Attribute-value equality: + +```python +Session & {"subject_id": 1} +Session & {"subject_id": 1, "session_type": "training"} +``` + +Multiple key-value pairs are combined with AND. + +### 2.5 Restriction by Query Expression + +Restrict to rows with matching primary keys in another expression: + +```python +# Sessions that have at least one trial +Session & Trial + +# Sessions for active subjects only +Session & (Subject & "status = 'active'") +``` + +### 2.6 Collection Conditions (OR) + +Lists, tuples, and sets create OR conditions: + +```python +# Either condition matches +Session & [{"subject_id": 1}, {"subject_id": 2}] + +# Equivalent to +Session & "subject_id IN (1, 2)" +``` + +### 2.7 Anti-Restriction + +The `-` operator selects rows that do NOT match: + +```python +# Sessions without any trials +Session - Trial + +# Sessions not from subject 1 +Session - {"subject_id": 1} +``` + +### 2.8 Chaining Restrictions + +Sequential restrictions combine with AND: + +```python +(Session & cond1) & cond2 +# Equivalent to +Session & cond1 & cond2 +``` + +### 2.9 Semantic Matching + +With `semantic_check=True` (default), expression conditions match only on homologous namesakesβ€”attributes with the same name AND same lineage. + +```python +# Default: semantic matching +Session & Trial + +# Disable semantic check (natural join on all namesakes) +Session.restrict(Trial, semantic_check=False) +``` + +### 2.10 Algebraic Properties + +| Property | Value | +|----------|-------| +| Primary Key | Preserved: PK(result) = PK(input) | +| Attributes | Preserved: all attributes retained | +| Entity Type | Preserved | + +### 2.11 Error Conditions + +| Condition | Error | +|-----------|-------| +| Unknown attribute in string | `UnknownAttributeError` | +| Non-homologous namesakes | `DataJointError` (semantic mismatch) | + +--- + +## 3. Projection (`.proj()`) + +### 3.1 Syntax + +```python +result = expression.proj() # Primary key only +result = expression.proj(...) # All attributes +result = expression.proj('attr1', 'attr2') # PK + specified +result = expression.proj(..., '-secret') # All except secret +result = expression.proj(new_name='old_name') # Rename +result = expression.proj(computed='x + y') # Computed attribute +``` + +### 3.2 Attribute Selection + +| Syntax | Meaning | +|--------|---------| +| `'attr'` | Include attribute | +| `...` (Ellipsis) | Include all secondary attributes | +| `'-attr'` | Exclude attribute (use with `...`) | + +Primary key attributes are always included, even if not specified. + +### 3.3 Renaming Attributes + +```python +# Rename 'name' to 'subject_name' +Subject.proj(subject_name='name') + +# Duplicate attribute with new name (parentheses preserve original) +Subject.proj('name', subject_name='(name)') +``` + +### 3.4 Computed Attributes + +Create new attributes from SQL expressions: + +```python +# Arithmetic +Trial.proj(speed='distance / duration') + +# Functions +Session.proj(year='YEAR(session_date)') + +# Aggregation-like (per row) +Trial.proj(centered='value - mean_value') +``` + +### 3.5 Primary Key Renaming + +Primary key attributes CAN be renamed: + +```python +Subject.proj(mouse_id='subject_id') +# Result PK: (mouse_id,) instead of (subject_id,) +``` + +### 3.6 Excluding Attributes + +Use `-` prefix with ellipsis to exclude: + +```python +# All attributes except 'internal_notes' +Session.proj(..., '-internal_notes') + +# Multiple exclusions +Session.proj(..., '-notes', '-metadata') +``` + +Cannot exclude primary key attributes. + +### 3.7 Algebraic Properties + +| Property | Value | +|----------|-------| +| Primary Key | Preserved (may be renamed) | +| Attributes | Selected/computed subset | +| Entity Type | Preserved | + +### 3.8 Error Conditions + +| Condition | Error | +|-----------|-------| +| Attribute not found | `UnknownAttributeError` | +| Excluding PK attribute | `DataJointError` | +| Duplicate attribute name | `DataJointError` | + +--- + +## 4. Join (`*`) + +### 4.1 Syntax + +```python +result = A * B # Inner join +result = A.join(B, semantic_check=True, left=False) +``` + +### 4.2 Parameters + +| Parameter | Default | Description | +|-----------|---------|-------------| +| `semantic_check` | `True` | Match only homologous namesakes | +| `left` | `False` | LEFT JOIN (preserve all rows from A) | + +### 4.3 Join Condition + +Joins match on all shared non-hidden attributes (namesakes): + +```python +# If Session has (subject_id, session_id) and Trial has (subject_id, session_id, trial_id) +# Join matches on (subject_id, session_id) +Session * Trial +``` + +### 4.4 Primary Key Determination + +The result's primary key depends on functional dependencies: + +| Condition | Result PK | Attribute Order | +|-----------|-----------|-----------------| +| A β†’ B | PK(A) | A's attributes first | +| B β†’ A | PK(B) | B's attributes first | +| Both | PK(A) | A's attributes first | +| Neither | PK(A) βˆͺ PK(B) | A's PK, then B's additional PK | + +**A β†’ B** means: All of B's primary key attributes exist in A (as PK or secondary). + +### 4.5 Examples + +```python +# Session β†’ Trial (Session's PK is subset of Trial's PK) +Session * Trial +# Result PK: (subject_id, session_id) β€” same as Session + +# Neither determines the other +Subject * Experimenter +# Result PK: (subject_id, experimenter_id) β€” union of PKs +``` + +### 4.6 Left Join + +Preserve all rows from left operand: + +```python +# All sessions, with trial data where available +Session.join(Trial, left=True) +``` + +**Constraint**: Left join requires A β†’ B to prevent NULL values in result's primary key. + +### 4.7 Semantic Matching + +With `semantic_check=True`, only homologous namesakes are matched: + +```python +# Semantic join (default) +TableA * TableB + +# Natural join (match all namesakes regardless of lineage) +TableA.join(TableB, semantic_check=False) +``` + +### 4.8 Algebraic Properties + +| Property | Value | +|----------|-------| +| Primary Key | Depends on functional dependencies | +| Attributes | Union of both operands' attributes | +| Commutativity | Result rows same, but PK/order may differ | + +### 4.9 Error Conditions + +| Condition | Error | +|-----------|-------| +| Different database connections | `DataJointError` | +| Non-homologous namesakes (semantic mode) | `DataJointError` | +| Left join without A β†’ B | `DataJointError` | + +--- + +## 5. Aggregation (`.aggr()`) + +### 5.1 Syntax + +```python +result = A.aggr(B, ...) # All A attributes +result = A.aggr(B, 'attr1', 'attr2') # PK + specified from A +result = A.aggr(B, ..., count='count(*)') # With aggregate +result = A.aggr(B, ..., exclude_nonmatching=True) # Only rows with matches +``` + +### 5.2 Parameters + +| Parameter | Default | Description | +|-----------|---------|-------------| +| `*attributes` | β€” | Attributes from A to include | +| `exclude_nonmatching` | `False` | If True, exclude rows from A that have no matches in B (INNER JOIN). Default keeps all rows (LEFT JOIN). | +| `**named_attributes` | β€” | Computed aggregates | + +### 5.3 Requirement + +**B must contain all primary key attributes of A.** This enables grouping B's rows by A's primary key. + +### 5.4 Aggregate Functions + +```python +# Count +Session.aggr(Trial, n_trials='count(*)') + +# Sum, average, min, max +Session.aggr(Trial, + total='sum(score)', + avg_score='avg(score)', + best='max(score)', + worst='min(score)' +) + +# Group concatenation +Session.aggr(Trial, trial_list='group_concat(trial_id)') + +# Conditional count +Session.aggr(Trial, n_correct='sum(correct = 1)') +``` + +### 5.5 SQL Equivalent + +```sql +SELECT A.pk1, A.pk2, A.secondary, agg_func(B.col) AS new_attr +FROM A +[LEFT] JOIN B USING (pk1, pk2) +WHERE +GROUP BY A.pk1, A.pk2 +HAVING +``` + +### 5.6 Restriction Behavior + +Restrictions on A attributes β†’ WHERE clause (before GROUP BY) +Restrictions on B attributes β†’ HAVING clause (after GROUP BY) + +```python +# WHERE: only 2024 sessions, then count trials +(Session & "YEAR(session_date) = 2024").aggr(Trial, n='count(*)') + +# HAVING: sessions with more than 10 trials +Session.aggr(Trial, n='count(*)') & "n > 10" +``` + +### 5.7 Default Behavior: Keep All Rows + +By default (`exclude_nonmatching=False`), aggregation keeps all rows from A, even those without matches in B: + +```python +# All sessions included; those without trials have n=0 +Session.aggr(Trial, n='count(trial_id)') + +# Only sessions that have at least one trial +Session.aggr(Trial, n='count(trial_id)', exclude_nonmatching=True) +``` + +Note: Use `count(pk_attr)` rather than `count(*)` to correctly count 0 for sessions without trials. `count(*)` counts all rows including the NULL-filled left join row. + +### 5.8 Algebraic Properties + +| Property | Value | +|----------|-------| +| Primary Key | PK(A) β€” grouping expression's PK | +| Entity Type | Same as A | + +### 5.9 Error Conditions + +| Condition | Error | +|-----------|-------| +| B missing A's PK attributes | `DataJointError` | +| Semantic mismatch | `DataJointError` | + +--- + +## 6. Extension (`.extend()`) + +### 6.1 Syntax + +```python +result = A.extend(B) +result = A.extend(B, semantic_check=True) +``` + +### 6.2 Semantics + +Extend is a left join that adds attributes from B while preserving A's entity identity: + +```python +A.extend(B) +# Equivalent to: +A.join(B, left=True) +``` + +### 6.3 Requirement + +**A must determine B** (A β†’ B). All of B's primary key attributes must exist in A. + +### 6.4 Use Case + +Add optional attributes without losing rows: + +```python +# Add experimenter info to sessions (some sessions may lack experimenter) +Session.extend(Experimenter) +``` + +### 6.5 Algebraic Properties + +| Property | Value | +|----------|-------| +| Primary Key | PK(A) | +| Attributes | A's attributes + B's non-PK attributes | +| Entity Type | Same as A | + +### 6.6 Error Conditions + +| Condition | Error | +|-----------|-------| +| A does not determine B | `DataJointError` | + +--- + +## 7. Union (`+`) + +### 7.1 Syntax + +```python +result = A + B +``` + +### 7.2 Requirements + +1. **Same connection**: Both from same database +2. **Same primary key**: Identical PK attributes (names and types) +3. **No secondary attribute overlap**: A and B cannot share secondary attributes + +### 7.3 Semantics + +Combines entity sets from both operands: + +```python +# All subjects that are either mice or rats +Mouse + Rat +``` + +### 7.4 Attribute Handling + +| Scenario | Result | +|----------|--------| +| PK only in both | Union of PKs | +| A has secondary attrs | A's secondaries (NULL for B-only rows) | +| B has secondary attrs | B's secondaries (NULL for A-only rows) | +| Overlapping PKs | A's values take precedence | + +### 7.5 SQL Implementation + +```sql +-- With secondary attributes +(SELECT A.* FROM A LEFT JOIN B USING (pk)) +UNION +(SELECT B.* FROM B WHERE (B.pk) NOT IN (SELECT A.pk FROM A)) +``` + +### 7.6 Algebraic Properties + +| Property | Value | +|----------|-------| +| Primary Key | PK(A) = PK(B) | +| Associative | (A + B) + C = A + (B + C) | +| Commutative | A + B has same rows as B + A | + +### 7.7 Error Conditions + +| Condition | Error | +|-----------|-------| +| Different connections | `DataJointError` | +| Different primary keys | `DataJointError` | +| Overlapping secondary attributes | `DataJointError` | + +--- + +## 8. Universal Sets (`dj.U()`) + +### 8.1 Syntax + +```python +dj.U() # Singular entity (one row, no attributes) +dj.U('attr1', 'attr2') # Set of all combinations +``` + +### 8.2 Unique Value Enumeration + +Extract distinct values: + +```python +# All unique last names +dj.U('last_name') & Student + +# All unique (year, month) combinations +dj.U('year', 'month') & Session.proj(year='YEAR(date)', month='MONTH(date)') +``` + +Result has specified attributes as primary key, with DISTINCT semantics. + +### 8.3 Universal Aggregation + +Aggregate entire table (no grouping): + +```python +# Count all students +dj.U().aggr(Student, n='count(*)') +# Result: single row with n = total count + +# Global statistics +dj.U().aggr(Trial, + total='count(*)', + avg_score='avg(score)', + std_score='std(score)' +) +``` + +### 8.4 Arbitrary Grouping + +Group by attributes not in original PK: + +```python +# Count students by graduation year +dj.U('grad_year').aggr(Student, n='count(*)') + +# Monthly session counts +dj.U('year', 'month').aggr( + Session.proj(year='YEAR(date)', month='MONTH(date)'), + n='count(*)' +) +``` + +### 8.5 Primary Key Behavior + +| Usage | Result PK | +|-------|-----------| +| `dj.U() & table` | Empty (single row) | +| `dj.U('a', 'b') & table` | (a, b) | +| `dj.U().aggr(table, ...)` | Empty (single row) | +| `dj.U('a').aggr(table, ...)` | (a,) | + +### 8.6 Restrictions + +```python +# U attributes must exist in the table +dj.U('name') & Student # OK: 'name' in Student +dj.U('invalid') & Student # Error: 'invalid' not found +``` + +### 8.7 Error Conditions + +| Condition | Error | +|-----------|-------| +| `table * dj.U()` | `DataJointError` (use `&` instead) | +| `dj.U() - table` | `DataJointError` (infinite set) | +| U attributes not in table | `DataJointError` | +| `dj.U().aggr(..., exclude_nonmatching=False)` | `DataJointError` (cannot keep all rows from infinite set) | + +--- + +## 9. Semantic Matching + +### 9.1 Attribute Lineage + +Every attribute has a lineage tracing to its original definition: + +``` +schema.table.attribute +``` + +Foreign key inheritance preserves lineage: + +```python +class Session(dj.Manual): + definition = """ + -> Subject # Inherits subject_id with Subject's lineage + session_id : int + """ +``` + +### 9.2 Homologous Namesakes + +Two attributes are **homologous namesakes** if they have: +1. Same name +2. Same lineage (trace to same original definition) + +### 9.3 Non-Homologous Namesakes + +Attributes with same name but different lineage create semantic collisions: + +```python +# Both have 'name' but from different origins +Student * Course # Error if both have 'name' attribute +``` + +### 9.4 Resolution + +Rename to avoid collisions: + +```python +Student * Course.proj(..., course_name='name') +``` + +### 9.5 Semantic Check Parameter + +| Value | Behavior | +|-------|----------| +| `True` (default) | Match only homologous namesakes; error on collisions | +| `False` | Natural join on all namesakes regardless of lineage | + +--- + +## 10. Operator Precedence + +Python operator precedence applies: + +| Precedence | Operator | Operation | +|------------|----------|-----------| +| Highest | `*` | Join | +| | `+`, `-` | Union, Anti-restriction | +| Lowest | `&` | Restriction | + +Use parentheses for clarity: + +```python +(Session & condition) * Trial # Restrict then join +Session & (Trial * Stimulus) # Join then restrict +``` + +--- + +## 11. Subquery Generation + +Subqueries are generated automatically when needed: + +| Situation | Subquery Created | +|-----------|------------------| +| Restrict on computed attribute | Yes | +| Join on computed attribute | Yes | +| Aggregation operand | Yes | +| Union operand | Yes | +| Restriction after TOP | Yes | + +--- + +## 12. Top (`dj.Top`) + +### 12.1 Syntax + +```python +result = expression & dj.Top() # First row by primary key +result = expression & dj.Top(limit=5) # First 5 rows by primary key +result = expression & dj.Top(5, 'score DESC') # Top 5 by score descending +result = expression & dj.Top(10, order_by='date DESC') # Top 10 by date descending +result = expression & dj.Top(5, offset=10) # Skip 10, take 5 +result = expression & dj.Top(None, 'score DESC') # All rows, ordered by score +``` + +### 12.2 Parameters + +| Parameter | Type | Default | Description | +|-----------|------|---------|-------------| +| `limit` | `int` or `None` | `1` | Maximum rows to return. `None` = unlimited. | +| `order_by` | `str`, `list[str]`, or `None` | `"KEY"` | Ordering. `"KEY"` = primary key order. `None` = inherit existing order. | +| `offset` | `int` | `0` | Rows to skip before taking `limit`. | + +### 12.3 Ordering Specification + +| Format | Meaning | +|--------|---------| +| `"KEY"` | Order by primary key (ascending) | +| `"attr"` | Order by attribute (ascending) | +| `"attr DESC"` | Order by attribute (descending) | +| `"attr ASC"` | Order by attribute (ascending, explicit) | +| `["attr1 DESC", "attr2"]` | Multiple columns | +| `None` | Inherit ordering from existing Top | + +### 12.4 SQL Equivalent + +```sql +SELECT * FROM table +ORDER BY order_by +LIMIT limit OFFSET offset +``` + +### 12.5 Chaining Tops + +When multiple Tops are chained, behavior depends on the `order_by` parameter: + +| Scenario | Behavior | +|----------|----------| +| Second Top has `order_by=None` | **Merge**: inherits ordering, limits combined | +| Both Tops have identical `order_by` | **Merge**: ordering preserved, limits combined | +| Tops have different `order_by` | **Subquery**: first Top executed, then second applied | + +**Merge behavior:** +- `limit` = minimum of both limits +- `offset` = sum of both offsets +- `order_by` = preserved from first Top + +```python +# Merge: same result, single query +(Table & dj.Top(10, "score DESC")) & dj.Top(5, order_by=None) +# Effective: Top(5, "score DESC", offset=0) + +# Merge with offsets +(Table & dj.Top(10, "x", offset=5)) & dj.Top(3, order_by=None, offset=2) +# Effective: Top(3, "x", offset=7) + +# Subquery: different orderings +(Table & dj.Top(10, "score DESC")) & dj.Top(3, "id ASC") +# First selects top 10 by score, then reorders those 10 by id and takes 3 +``` + +### 12.6 Preview and Limit + +When fetching with a `limit` parameter, the limit is applied as an additional Top that inherits existing ordering: + +```python +# User applies custom ordering +query = Table & dj.Top(order_by="score DESC") + +# Preview respects the ordering +query.to_arrays("id", "score", limit=5) # Top 5 by score descending +``` + +Internally, `to_arrays(..., limit=N)` applies `dj.Top(N, order_by=None)`, which inherits the existing ordering. + +### 12.7 Use Cases + +**Top N rows:** +```python +# Top 10 highest scores +Result & dj.Top(10, "score DESC") +``` + +**Pagination:** +```python +# Page 3 (rows 20-29) sorted by date +Session & dj.Top(10, "session_date DESC", offset=20) +``` + +**Sampling (deterministic):** +```python +# First 100 rows by primary key +BigTable & dj.Top(100) +``` + +**Ordering without limit:** +```python +# All rows ordered by date +Session & dj.Top(None, "session_date DESC") +``` + +### 12.8 Algebraic Properties + +| Property | Value | +|----------|-------| +| Primary Key | Preserved: PK(result) = PK(input) | +| Attributes | Preserved: all attributes retained | +| Entity Type | Preserved | +| Row Order | Determined by `order_by` | + +### 12.9 Error Conditions + +| Condition | Error | +|-----------|-------| +| `limit` not int or None | `TypeError` | +| `order_by` not str, list[str], or None | `TypeError` | +| `offset` not int | `TypeError` | +| Top in OR list | `DataJointError` | +| Top in AndList | `DataJointError` | + +--- + +## 13. Implementation Reference + +| File | Purpose | +|------|---------| +| `expression.py` | QueryExpression base class, operators | +| `condition.py` | Restriction condition handling, Top class | +| `heading.py` | Attribute metadata and lineage | +| `table.py` | Table class, fetch interface | +| `U.py` | Universal set implementation | + +--- + +## 14. Quick Reference + +| Operation | Syntax | Result PK | +|-----------|--------|-----------| +| Restrict | `A & cond` | PK(A) | +| Anti-restrict | `A - cond` | PK(A) | +| Project | `A.proj(...)` | PK(A) | +| Join | `A * B` | Depends on Aβ†’B | +| Aggregate | `A.aggr(B, ...)` | PK(A) | +| Extend | `A.extend(B)` | PK(A) | +| Union | `A + B` | PK(A) = PK(B) | +| Unique values | `dj.U('x') & A` | (x,) | +| Global aggregate | `dj.U().aggr(A, ...)` | () | + + +--- +## File: reference/specs/semantic-matching.md + +# Semantic Matching for Joins - Specification + +## Overview + +This document specifies **semantic matching** for joins in DataJoint 2.0, replacing the current name-based matching rules. Semantic matching ensures that attributes are only matched when they share both the same name and the same **lineage** (origin), preventing accidental joins on unrelated attributes that happen to share names. + +### Goals + +1. **Prevent incorrect joins** on attributes that share names but represent different entities +2. **Enable valid joins** that are currently blocked due to overly restrictive rules +3. **Maintain backward compatibility** for well-designed schemas +4. **Provide clear error messages** when semantic conflicts are detected + +--- + +## User Guide + +### Quick Start + +Semantic matching is enabled by default in DataJoint 2.0. For most well-designed schemas, no changes are required. + +#### When You Might See Errors + +```python +# Two tables with generic 'id' attribute +class Student(dj.Manual): + definition = """ + id : uint32 + --- + name : varchar(100) + """ + +class Course(dj.Manual): + definition = """ + id : uint32 + --- + title : varchar(100) + """ + +# This will raise an error because 'id' has different lineages +Student() * Course() # DataJointError! +``` + +#### How to Resolve + +**Option 1: Rename attributes using projection** +```python +Student() * Course().proj(course_id='id') # OK +``` + +**Option 2: Bypass semantic check (use with caution)** +```python +Student().join(Course(), semantic_check=False) # OK, but be careful! +``` + +**Option 3: Use descriptive names (best practice)** +```python +class Student(dj.Manual): + definition = """ + student_id : uint32 + --- + name : varchar(100) + """ +``` + +### Migrating from DataJoint 1.x + +#### Removed Operators + +| Old Syntax | New Syntax | +|------------|------------| +| `A @ B` | `A.join(B, semantic_check=False)` | +| `A ^ B` | `A.restrict(B, semantic_check=False)` | +| `dj.U('a') * B` | `dj.U('a') & B` | + +#### Rebuilding Lineage for Existing Schemas + +If you have existing schemas created before DataJoint 2.0, rebuild their lineage tables: + +```python +import datajoint as dj + +# Connect and get your schema +schema = dj.Schema('my_database') + +# Rebuild lineage (do this once per schema) +schema.rebuild_lineage() + +# Restart Python kernel to pick up changes +``` + +**Important**: If your schema references tables in other schemas, rebuild those upstream schemas first. + +--- + +## API Reference + +### Schema Methods + +#### `schema.rebuild_lineage()` + +Rebuild the `~lineage` table for all tables in this schema. + +```python +schema.rebuild_lineage() +``` + +**Description**: Recomputes lineage for all attributes by querying FK relationships from the database's `information_schema`. Use this to restore lineage for schemas that predate the lineage system or after corruption. + +**Requirements**: +- Schema must exist +- Upstream schemas (referenced via cross-schema FKs) must have their lineage rebuilt first + +**Side Effects**: +- Creates `~lineage` table if it doesn't exist +- Deletes and repopulates all lineage entries for tables in the schema + +**Post-Action**: Restart Python kernel and reimport to pick up new lineage information. + +#### `schema.lineage_table_exists` + +Property indicating whether the `~lineage` table exists in this schema. + +```python +if schema.lineage_table_exists: + print("Lineage tracking is enabled") +``` + +**Returns**: `bool` - `True` if `~lineage` table exists, `False` otherwise. + +#### `schema.lineage` + +Property returning all lineage entries for the schema. + +```python +schema.lineage +# {'myschema.session.session_id': 'myschema.session.session_id', +# 'myschema.trial.session_id': 'myschema.session.session_id', +# 'myschema.trial.trial_num': 'myschema.trial.trial_num'} +``` + +**Returns**: `dict` - Maps `'schema.table.attribute'` to its lineage origin + +### Join Methods + +#### `expr.join(other, semantic_check=True)` + +Join two expressions with optional semantic checking. + +```python +result = A.join(B) # semantic_check=True (default) +result = A.join(B, semantic_check=False) # bypass semantic check +``` + +**Parameters**: +- `other`: Another query expression to join with +- `semantic_check` (bool): If `True` (default), raise error on non-homologous namesakes. If `False`, perform natural join without lineage checking. + +**Raises**: `DataJointError` if `semantic_check=True` and namesake attributes have different lineages. + +#### `expr.restrict(other, semantic_check=True)` + +Restrict expression with optional semantic checking. + +```python +result = A.restrict(B) # semantic_check=True (default) +result = A.restrict(B, semantic_check=False) # bypass semantic check +``` + +**Parameters**: +- `other`: Restriction condition (expression, dict, string, etc.) +- `semantic_check` (bool): If `True` (default), raise error on non-homologous namesakes when restricting by another expression. If `False`, no lineage checking. + +**Raises**: `DataJointError` if `semantic_check=True` and namesake attributes have different lineages. + +### Operators + +#### `A * B` (Join) + +Equivalent to `A.join(B, semantic_check=True)`. + +#### `A & B` (Restriction) + +Equivalent to `A.restrict(B, semantic_check=True)`. + +#### `A - B` (Anti-restriction) + +Restriction with negation. Semantic checking applies. + +To bypass semantic checking: `A.restrict(dj.Not(B), semantic_check=False)` + +#### `A + B` (Union) + +Union of expressions. Requires all namesake attributes to have matching lineage. + +### Removed Operators + +#### `A @ B` (Removed) + +Raises `DataJointError` with migration guidance to use `.join(semantic_check=False)`. + +#### `A ^ B` (Removed) + +Raises `DataJointError` with migration guidance to use `.restrict(semantic_check=False)`. + +#### `dj.U(...) * A` (Removed) + +Raises `DataJointError` with migration guidance to use `dj.U(...) & A`. + +### Universal Set (`dj.U`) + +#### Valid Operations + +```python +dj.U('a', 'b') & A # Restriction: promotes a, b to PK +dj.U('a', 'b').aggr(A, ...) # Aggregation: groups by a, b +dj.U() & A # Distinct primary keys of A +``` + +#### Invalid Operations + +```python +dj.U('a', 'b') - A # DataJointError: produces infinite set +dj.U('a', 'b') * A # DataJointError: use & instead +``` + +--- + +## Concepts + +### Attribute Lineage + +Lineage identifies the **origin** of an attribute - where it was first defined. It is represented as a string: + +``` +schema_name.table_name.attribute_name +``` + +#### Lineage Assignment Rules + +| Attribute Type | Lineage Value | +|----------------|---------------| +| Native primary key | `this_schema.this_table.attr_name` | +| FK-inherited (primary or secondary) | Traced to original definition | +| Native secondary | `None` | +| Computed (in projection) | `None` | + +#### Example + +```python +class Session(dj.Manual): # table: session + definition = """ + session_id : uint32 + --- + session_date : date + """ + +class Trial(dj.Manual): # table: trial + definition = """ + -> Session + trial_num : uint16 + --- + stimulus : varchar(100) + """ +``` + +Lineages: +- `Session.session_id` β†’ `myschema.session.session_id` (native PK) +- `Session.session_date` β†’ `None` (native secondary) +- `Trial.session_id` β†’ `myschema.session.session_id` (inherited via FK) +- `Trial.trial_num` β†’ `myschema.trial.trial_num` (native PK) +- `Trial.stimulus` β†’ `None` (native secondary) + +### Terminology + +| Term | Definition | +|------|------------| +| **Lineage** | The origin of an attribute: `schema.table.attribute` | +| **Homologous attributes** | Attributes with the same lineage | +| **Namesake attributes** | Attributes with the same name | +| **Homologous namesakes** | Same name AND same lineage β€” used for join matching | +| **Non-homologous namesakes** | Same name BUT different lineage β€” cause join errors | + +### Semantic Matching Rules + +| Scenario | Action | +|----------|--------| +| Same name, same lineage (both non-null) | **Match** | +| Same name, different lineage | **Error** | +| Same name, either lineage is null | **Error** | +| Different names | **No match** | + +--- + +## Implementation Details + +### `~lineage` Table + +Each schema has a hidden `~lineage` table storing lineage information: + +```sql +CREATE TABLE `schema_name`.`~lineage` ( + table_name VARCHAR(64) NOT NULL, + attribute_name VARCHAR(64) NOT NULL, + lineage VARCHAR(255) NOT NULL, + PRIMARY KEY (table_name, attribute_name) +) +``` + +### Lineage Population + +**At table declaration**: +1. Delete any existing lineage entries for the table +2. For FK attributes: copy lineage from parent (with warning if parent lineage missing) +3. For native PK attributes: set lineage to `schema.table.attribute` +4. Native secondary attributes: no entry (lineage = None) + +**At table drop**: +- Delete all lineage entries for the table + +### Missing Lineage Handling + +**If `~lineage` table doesn't exist**: +- Warning issued during semantic check +- Semantic checking disabled (join proceeds as natural join) + +**If parent lineage missing during declaration**: +- Warning issued +- Parent attribute used as origin +- Recommend rebuilding lineage after parent schema is fixed + +### Heading's `lineage_available` Property + +The `Heading` class tracks whether lineage information is available: + +```python +heading.lineage_available # True if ~lineage table exists for this schema +``` + +This property is: +- Set when heading is loaded from database +- Propagated through projections, joins, and other operations +- Used by `assert_join_compatibility` to decide whether to perform semantic checking + +--- + +## Error Messages + +### Non-Homologous Namesakes + +``` +DataJointError: Cannot join on attribute `id`: different lineages +(university.student.id vs university.course.id). +Use .proj() to rename one of the attributes. +``` + +### Removed `@` Operator + +``` +DataJointError: The @ operator has been removed in DataJoint 2.0. +Use .join(other, semantic_check=False) for permissive joins. +``` + +### Removed `^` Operator + +``` +DataJointError: The ^ operator has been removed in DataJoint 2.0. +Use .restrict(other, semantic_check=False) for permissive restrictions. +``` + +### Removed `dj.U * table` + +``` +DataJointError: dj.U(...) * table is no longer supported in DataJoint 2.0. +Use dj.U(...) & table instead. +``` + +### Missing Lineage Warning + +``` +WARNING: Semantic check disabled: ~lineage table not found. +To enable semantic matching, rebuild lineage with: schema.rebuild_lineage() +``` + +### Parent Lineage Missing Warning + +``` +WARNING: Lineage for `parent_db`.`parent_table`.`attr` not found +(parent schema's ~lineage table may be missing or incomplete). +Using it as origin. Once the parent schema's lineage is rebuilt, +run schema.rebuild_lineage() on this schema to correct the lineage. +``` + +--- + +## Examples + +### Example 1: Valid Join (Shared Lineage) + +```python +class Student(dj.Manual): + definition = """ + student_id : uint32 + --- + name : varchar(100) + """ + +class Enrollment(dj.Manual): + definition = """ + -> Student + -> Course + --- + grade : varchar(2) + """ + +# Works: student_id has same lineage in both +Student() * Enrollment() +``` + +### Example 2: Invalid Join (Different Lineage) + +```python +class TableA(dj.Manual): + definition = """ + id : uint32 + --- + value_a : int32 + """ + +class TableB(dj.Manual): + definition = """ + id : uint32 + --- + value_b : int32 + """ + +# Error: 'id' has different lineages +TableA() * TableB() + +# Solution 1: Rename +TableA() * TableB().proj(b_id='id') + +# Solution 2: Bypass (use with caution) +TableA().join(TableB(), semantic_check=False) +``` + +### Example 3: Multi-hop FK Inheritance + +```python +class Session(dj.Manual): + definition = """ + session_id : uint32 + --- + session_date : date + """ + +class Trial(dj.Manual): + definition = """ + -> Session + trial_num : uint16 + """ + +class Response(dj.Computed): + definition = """ + -> Trial + --- + response_time : float64 + """ + +# All work: session_id traces back to Session in all tables +Session() * Trial() +Session() * Response() +Trial() * Response() +``` + +### Example 4: Secondary FK Attribute + +```python +class Course(dj.Manual): + definition = """ + course_id : int unsigned + --- + title : varchar(100) + """ + +class FavoriteCourse(dj.Manual): + definition = """ + student_id : int unsigned + --- + -> Course + """ + +class RequiredCourse(dj.Manual): + definition = """ + major_id : int unsigned + --- + -> Course + """ + +# Works: course_id is secondary in both, but has same lineage +FavoriteCourse() * RequiredCourse() +``` + +### Example 5: Aliased Foreign Key + +```python +class Person(dj.Manual): + definition = """ + person_id : int unsigned + --- + full_name : varchar(100) + """ + +class Marriage(dj.Manual): + definition = """ + -> Person.proj(husband='person_id') + -> Person.proj(wife='person_id') + --- + marriage_date : date + """ + +# husband and wife both have lineage: schema.person.person_id +# They are homologous (same lineage) but have different names +``` + +--- + +## Best Practices + +1. **Use descriptive attribute names**: Prefer `student_id` over generic `id` + +2. **Leverage foreign keys**: Inherited attributes maintain lineage automatically + +3. **Rebuild lineage for legacy schemas**: Run `schema.rebuild_lineage()` once + +4. **Rebuild upstream schemas first**: For cross-schema FKs, rebuild parent schemas before child schemas + +5. **Restart after rebuilding**: Restart Python kernel to pick up new lineage information + +6. **Use `semantic_check=False` sparingly**: Only when you're certain the natural join is correct + + +--- +## File: reference/specs/table-declaration.md + +# DataJoint Table Declaration Specification + +Version: 1.0 +Status: Draft +Last Updated: 2026-01-07 + +## Overview + +This document specifies the table declaration mechanism in DataJoint Python. Table declarations define the schema structure using a domain-specific language (DSL) embedded in Python class definitions. + +## 1. Table Class Structure + +### 1.1 Basic Declaration Pattern + +```python +@schema +class TableName(dj.Manual): + definition = """ + # table comment + primary_attr : int32 + --- + secondary_attr : float64 + """ +``` + +### 1.2 Table Tiers + +| Tier | Base Class | Table Prefix | Purpose | +|------|------------|--------------|---------| +| Manual | `dj.Manual` | (none) | User-entered data | +| Lookup | `dj.Lookup` | `#` | Reference/enumeration data | +| Imported | `dj.Imported` | `_` | Data from external sources | +| Computed | `dj.Computed` | `__` | Derived from other tables | +| Part | `dj.Part` | `master__` | Detail records of master table | + +### 1.3 Class Naming Rules + +- **Format**: Strict CamelCase (e.g., `MyTable`, `ProcessedData`) +- **Pattern**: `^[A-Z][A-Za-z0-9]*$` +- **Conversion**: CamelCase to snake_case for SQL table name +- **Examples**: + - `SessionTrial` -> `session_trial` + - `ProcessedEMG` -> `processed_emg` + +### 1.4 Table Name Constraints + +- **Maximum length**: 64 characters (MySQL limit) +- **Final name**: prefix + snake_case(class_name) +- **Validation**: Checked at declaration time + +--- + +## 2. Definition String Grammar + +### 2.1 Overall Structure + +``` +[table_comment] +primary_key_section +--- +secondary_section +``` + +### 2.2 Table Comment (Optional) + +``` +# Free-form description of the table purpose +``` + +- Must be first non-empty line if present +- Starts with `#` +- Cannot start with `#:` +- Stored in MySQL table COMMENT + +### 2.3 Primary Key Separator + +``` +--- +``` + +or equivalently: + +``` +___ +``` + +- Three dashes or three underscores +- Separates primary key attributes (above) from secondary attributes (below) +- Required if table has secondary attributes + +### 2.4 Line Types + +Each non-empty, non-comment line is one of: + +1. **Attribute definition** +2. **Foreign key reference** +3. **Index declaration** + +--- + +## 3. Attribute Definition + +### 3.1 Syntax + +``` +attribute_name [= default_value] : type [# comment] +``` + +### 3.2 Components + +| Component | Required | Description | +|-----------|----------|-------------| +| `attribute_name` | Yes | Identifier for the column | +| `default_value` | No | Default value (before colon) | +| `type` | Yes | Data type specification | +| `comment` | No | Documentation (after `#`) | + +### 3.3 Attribute Name Rules + +- **Pattern**: `^[a-z][a-z0-9_]*$` +- **Start**: Lowercase letter +- **Contains**: Lowercase letters, digits, underscores +- **Convention**: snake_case + +### 3.4 Examples + +```python +definition = """ +# Experimental session with subject and timing info +session_id : int32 # auto-assigned +--- +subject_name : varchar(100) # subject identifier +trial_number = 1 : int32 # default to 1 +score = null : float32 # nullable +timestamp = CURRENT_TIMESTAMP : datetime # auto-timestamp +notes = '' : varchar(4000) # empty default +""" +``` + +--- + +## 4. Type System + +### 4.1 Core Types + +Scientist-friendly type names with guaranteed semantics: + +| Type | SQL Mapping | Size | Description | +|------|-------------|------|-------------| +| `int8` | `tinyint` | 1 byte | 8-bit signed integer | +| `uint8` | `tinyint unsigned` | 1 byte | 8-bit unsigned integer | +| `int16` | `smallint` | 2 bytes | 16-bit signed integer | +| `uint16` | `smallint unsigned` | 2 bytes | 16-bit unsigned integer | +| `int32` | `int` | 4 bytes | 32-bit signed integer | +| `uint32` | `int unsigned` | 4 bytes | 32-bit unsigned integer | +| `int64` | `bigint` | 8 bytes | 64-bit signed integer | +| `uint64` | `bigint unsigned` | 8 bytes | 64-bit unsigned integer | +| `float32` | `float` | 4 bytes | 32-bit IEEE 754 float | +| `float64` | `double` | 8 bytes | 64-bit IEEE 754 float | +| `bool` | `tinyint` | 1 byte | Boolean (0 or 1) | +| `uuid` | `binary(16)` | 16 bytes | UUID stored as binary | +| `bytes` | `longblob` | Variable | Binary data (up to 4GB) | + +### 4.2 String Types + +| Type | SQL Mapping | Description | +|------|-------------|-------------| +| `char(N)` | `char(N)` | Fixed-length string | +| `varchar(N)` | `varchar(N)` | Variable-length string (max N) | +| `enum('a','b',...)` | `enum(...)` | Enumerated values | + +### 4.3 Temporal Types + +| Type | SQL Mapping | Description | +|------|-------------|-------------| +| `date` | `date` | Date (YYYY-MM-DD) | +| `datetime` | `datetime` | Date and time | +| `datetime(N)` | `datetime(N)` | With fractional seconds (0-6) | + +### 4.4 Other Types + +| Type | SQL Mapping | Description | +|------|-------------|-------------| +| `json` | `json` | JSON document | +| `decimal(P,S)` | `decimal(P,S)` | Fixed-point decimal | + +### 4.5 Native SQL Types (Passthrough) + +These SQL types are accepted but generate a warning recommending core types: + +- Integer variants: `tinyint`, `smallint`, `mediumint`, `bigint`, `integer`, `serial` +- Float variants: `float`, `double`, `real` (with size specifiers) +- Text variants: `tinytext`, `mediumtext`, `longtext` +- Blob variants: `tinyblob`, `smallblob`, `mediumblob`, `longblob` +- Temporal: `time`, `timestamp`, `year` +- Numeric: `numeric(P,S)` + +### 4.6 Codec Types + +Format: `` or `` + +| Codec | Internal dtype | External dtype | Purpose | +|-------|---------------|----------------|---------| +| `` | `bytes` | `` | Serialized Python objects | +| `` | N/A (external only) | `json` | Hash-addressed deduped storage | +| `` | `bytes` | `` | File attachments with filename | +| `` | N/A (external only) | `json` | Reference to managed file | +| `` | N/A (external only) | `json` | Object storage (Zarr, HDF5) | + +External storage syntax: +- `` - default store +- `` - named store + +### 4.7 Type Reconstruction + +Core types and codecs are stored in the SQL COMMENT field for reconstruction: + +```sql +COMMENT ':float32:user comment here' +COMMENT '::user comment' +``` + +--- + +## 5. Default Values + +### 5.1 Syntax + +``` +attribute_name = default_value : type +``` + +### 5.2 Literal Types + +| Value | Meaning | SQL | +|-------|---------|-----| +| `null` | Nullable attribute | `DEFAULT NULL` | +| `CURRENT_TIMESTAMP` | Server timestamp | `DEFAULT CURRENT_TIMESTAMP` | +| `"string"` or `'string'` | String literal | `DEFAULT "string"` | +| `123` | Numeric literal | `DEFAULT 123` | +| `true`/`false` | Boolean | `DEFAULT 1`/`DEFAULT 0` | + +### 5.3 Constant Literals + +These values are used without quotes in SQL: +- `NULL` +- `CURRENT_TIMESTAMP` + +### 5.4 Nullable Attributes + +``` +score = null : float32 +``` + +- The special default `null` (case-insensitive) makes the attribute nullable +- Nullable attributes can be omitted from INSERT +- Primary key attributes CANNOT be nullable + +### 5.5 Blob/JSON Default Restrictions + +Blob and JSON attributes can only have `null` as default: + +```python +# Valid +data = null : + +# Invalid - raises DataJointError +data = '' : +``` + +--- + +## 6. Foreign Key References + +### 6.1 Syntax + +``` +-> [options] ReferencedTable +``` + +### 6.2 Options + +| Option | Effect | +|--------|--------| +| `nullable` | All inherited attributes become nullable | +| `unique` | Creates UNIQUE INDEX on FK attributes | + +Options are comma-separated in brackets: +``` +-> [nullable, unique] ParentTable +``` + +### 6.3 Attribute Inheritance + +Foreign keys automatically inherit all primary key attributes from the referenced table: + +```python +# Parent +class Subject(dj.Manual): + definition = """ + subject_id : int32 + --- + name : varchar(100) + """ + +# Child - inherits subject_id +class Session(dj.Manual): + definition = """ + -> Subject + session_id : int32 + --- + session_date : date + """ +``` + +### 6.4 Position Rules + +| Position | Effect | +|----------|--------| +| Before `---` | FK attributes become part of primary key | +| After `---` | FK attributes are secondary (dependent) | + +### 6.5 Nullable Foreign Keys + +``` +-> [nullable] OptionalParent +``` + +- Only allowed after `---` (secondary) +- Primary key FKs cannot be nullable +- Creates optional relationship + +### 6.6 Unique Foreign Keys + +``` +-> [unique] ParentTable +``` + +- Creates UNIQUE INDEX on inherited attributes +- Enforces one-to-one relationship from child perspective + +### 6.7 Projections in Foreign Keys + +``` +-> Parent.proj(alias='original_name') +``` + +- Reference same table multiple times with different attribute names +- Useful for self-referential or multi-reference patterns + +### 6.8 Referential Actions + +All foreign keys use: +- `ON UPDATE CASCADE` - Parent key changes propagate +- `ON DELETE RESTRICT` - Cannot delete parent with children + +### 6.9 Lineage Tracking + +Foreign key relationships are recorded in the `~lineage` table: + +```python +{ + 'child_attr': ('parent_schema.parent_table', 'parent_attr') +} +``` + +Used for semantic attribute matching in queries. + +--- + +## 7. Index Declarations + +### 7.1 Syntax + +``` +index(attr1, attr2, ...) +unique index(attr1, attr2, ...) +``` + +### 7.2 Examples + +```python +definition = """ +# User contact information +user_id : int32 +--- +first_name : varchar(50) +last_name : varchar(50) +email : varchar(100) +index(last_name, first_name) +unique index(email) +""" +``` + +### 7.3 Computed Expressions + +Indexes can include SQL expressions: + +``` +index(last_name, (YEAR(birth_date))) +``` + +### 7.4 Limitations + +- Cannot be altered after table creation (via `table.alter()`) +- Must reference existing attributes + +--- + +## 8. Part Tables + +### 8.1 Declaration + +```python +@schema +class Master(dj.Manual): + definition = """ + master_id : int32 + """ + + class Detail(dj.Part): + definition = """ + -> master + detail_id : int32 + --- + value : float32 + """ +``` + +### 8.2 Naming + +- SQL name: `master_table__part_name` +- Example: `experiment__trial` + +### 8.3 Master Reference + +Within Part definition, use: +- `-> master` (lowercase keyword) +- `-> MasterClassName` (class name) + +### 8.4 Constraints + +- Parts must reference their master +- Cannot delete Part records directly (use master) +- Cannot drop Part table directly (use master) +- Part inherits master's primary key + +--- + +## 9. Auto-Populated Tables + +### 9.1 Classes + +- `dj.Imported` - Data from external sources +- `dj.Computed` - Derived from other DataJoint tables + +### 9.2 Primary Key Constraint + +All primary key attributes must come from foreign key references. + +**Valid:** +```python +class Analysis(dj.Computed): + definition = """ + -> Session + -> Parameter + --- + result : float64 + """ +``` + +**Invalid** (by default): +```python +class Analysis(dj.Computed): + definition = """ + -> Session + analysis_id : int32 # ERROR: non-FK primary key + --- + result : float64 + """ +``` + +**Override:** +```python +dj.config['jobs.allow_new_pk_fields_in_computed_tables'] = True +``` + +### 9.3 Job Metadata + +When `config['jobs.add_job_metadata'] = True`, auto-populated tables receive: + +| Column | Type | Description | +|--------|------|-------------| +| `_job_start_time` | `datetime(3)` | Job start timestamp | +| `_job_duration` | `float64` | Duration in seconds | +| `_job_version` | `varchar(64)` | Code version | + +--- + +## 10. Validation + +### 10.1 Parse-Time Checks + +| Check | Error | +|-------|-------| +| Unknown type | `DataJointError: Unsupported attribute type` | +| Invalid attribute name | `DataJointError: Declaration error` | +| Comment starts with `:` | `DataJointError: comment must not start with colon` | +| Non-null blob default | `DataJointError: default value for blob can only be NULL` | + +### 10.2 Declaration-Time Checks + +| Check | Error | +|-------|-------| +| Table name > 64 chars | `DataJointError: Table name exceeds max length` | +| No primary key | `DataJointError: Table must have a primary key` | +| Nullable primary key attr | `DataJointError: Primary key attributes cannot be nullable` | +| Invalid CamelCase | `DataJointError: Invalid table name` | +| FK resolution failure | `DataJointError: Foreign key reference could not be resolved` | + +### 10.3 Insert-Time Validation + +The `table.validate()` method checks: +- Required fields present +- NULL constraints satisfied +- Primary key completeness +- Codec validation (if defined) +- UUID format +- JSON serializability + +--- + +## 11. SQL Generation + +### 11.1 CREATE TABLE Template + +```sql +CREATE TABLE `schema`.`table_name` ( + `attr1` TYPE1 NOT NULL COMMENT "...", + `attr2` TYPE2 DEFAULT NULL COMMENT "...", + PRIMARY KEY (`pk1`, `pk2`), + FOREIGN KEY (`fk_attr`) REFERENCES `parent` (`pk`) + ON UPDATE CASCADE ON DELETE RESTRICT, + INDEX (`idx_attr`), + UNIQUE INDEX (`uniq_attr`) +) ENGINE=InnoDB COMMENT="table comment" +``` + +### 11.2 Type Comment Encoding + +Core types and codecs are preserved in comments: + +```sql +`value` float NOT NULL COMMENT ":float32:measurement value" +`data` longblob DEFAULT NULL COMMENT "::serialized data" +`archive` json DEFAULT NULL COMMENT "::external storage" +``` + +--- + +## 12. Implementation Files + +| File | Purpose | +|------|---------| +| `declare.py` | Definition parsing, SQL generation | +| `heading.py` | Attribute metadata, type reconstruction | +| `table.py` | Base Table class, declaration interface | +| `user_tables.py` | Tier classes (Manual, Computed, etc.) | +| `schemas.py` | Schema binding, table decoration | +| `codecs.py` | Codec registry and resolution | +| `lineage.py` | Attribute lineage tracking | + +--- + +## 13. Future Considerations + +Potential improvements identified for the declaration system: + +1. **Better error messages** with suggestions and context +2. **Import-time validation** via `__init_subclass__` +3. **Parser alternatives** (regex-based for simpler grammar) +4. **SQL dialect abstraction** for multi-database support +5. **Extended constraints** (CHECK, custom validation) +6. **Migration support** for schema evolution +7. **Definition caching** for performance +8. **IDE tooling** support via structured intermediate representation + + +--- +## File: reference/specs/type-system.md + +# Storage Types Redesign Spec + +## Overview + +This document defines a three-layer type architecture: + +1. **Native database types** - Backend-specific (`FLOAT`, `TINYINT UNSIGNED`, `LONGBLOB`). Discouraged for direct use. +2. **Core DataJoint types** - Standardized across backends, scientist-friendly (`float32`, `uint8`, `bool`, `json`). +3. **Codec Types** - Programmatic types with `encode()`/`decode()` semantics. Composable. + +```mermaid +block-beta + columns 1 + block:layer3:1 + columns 1 + L3["Codec Types (Layer 3)"] + B3a["Built-in: <blob> <attach> <object@> <hash@> <filepath@>"] + B3b["User-defined: <graph> <image> <custom> ..."] + end + block:layer2:1 + columns 1 + L2["Core DataJoint Types (Layer 2)"] + B2["float32 float64 int64 uint64 int32 uint32 int16 uint16\nint8 uint8 bool uuid json bytes date datetime\nchar(n) varchar(n) enum(...) decimal(n,f)"] + end + block:layer1:1 + columns 1 + L1["Native Database Types (Layer 1)"] + B1["MySQL: TINYINT SMALLINT INT BIGINT FLOAT DOUBLE TEXT ...\nPostgreSQL: SMALLINT INTEGER BIGINT REAL DOUBLE PRECISION TEXT\n(pass through with warning β€” discouraged)"] + end + layer3 --> layer2 --> layer1 +``` + +| Layer | Description | Examples | +|-------|-------------|----------| +| **3. Codec Types** | Programmatic types with `encode()`/`decode()` semantics | ``, ``, ``, ``, `` | +| **2. Core DataJoint** | Standardized, scientist-friendly types (preferred) | `int32`, `float64`, `varchar(n)`, `bool`, `datetime` | +| **1. Native Database** | Backend-specific types (discouraged) | `INT`, `FLOAT`, `TINYINT UNSIGNED`, `LONGBLOB` | + +**Syntax distinction:** +- Core types: `int32`, `float64`, `varchar(255)` - no brackets +- Codec types: ``, ``, `` - angle brackets +- The `@` character indicates external storage (object store vs database) + +### OAS Storage Regions + +| Region | Path Pattern | Addressing | Use Case | +|--------|--------------|------------|----------| +| Object | `{schema}/{table}/{pk}/` | Primary key | Large objects, Zarr, HDF5 | +| Hash | `_hash/{hash}` | MD5 hash | Deduplicated blobs/files | + +### URL Representation + +DataJoint uses consistent URL representation for all storage backends: + +| Protocol | URL Format | Example | +|----------|------------|---------| +| Local filesystem | `file://` | `file:///data/objects/file.dat` | +| Amazon S3 | `s3://` | `s3://bucket/path/file.dat` | +| Google Cloud | `gs://` | `gs://bucket/path/file.dat` | +| Azure Blob | `az://` | `az://container/path/file.dat` | + +This unified approach treats all storage backends uniformly via fsspec, enabling: +- Consistent path handling across local and cloud storage +- Transparent switching between storage backends +- Streaming access to any storage type + +### External References + +`` provides portable relative paths within configured stores with lazy ObjectRef access. +For arbitrary URLs that don't need ObjectRef semantics, use `varchar` instead. + +## Core DataJoint Types (Layer 2) + +Core types provide a standardized, scientist-friendly interface that works identically across +MySQL and PostgreSQL backends. Users should prefer these over native database types. + +**All core types are recorded in field comments using `:type:` syntax for reconstruction.** + +### Numeric Types + +| Core Type | Description | MySQL | PostgreSQL | +|-----------|-------------|-------|------------| +| `int8` | 8-bit signed | `TINYINT` | `SMALLINT` | +| `int16` | 16-bit signed | `SMALLINT` | `SMALLINT` | +| `int32` | 32-bit signed | `INT` | `INTEGER` | +| `int64` | 64-bit signed | `BIGINT` | `BIGINT` | +| `uint8` | 8-bit unsigned | `TINYINT UNSIGNED` | `SMALLINT` | +| `uint16` | 16-bit unsigned | `SMALLINT UNSIGNED` | `INTEGER` | +| `uint32` | 32-bit unsigned | `INT UNSIGNED` | `BIGINT` | +| `uint64` | 64-bit unsigned | `BIGINT UNSIGNED` | `NUMERIC(20)` | +| `float32` | 32-bit float | `FLOAT` | `REAL` | +| `float64` | 64-bit float | `DOUBLE` | `DOUBLE PRECISION` | +| `decimal(n,f)` | Fixed-point | `DECIMAL(n,f)` | `NUMERIC(n,f)` | + +### String Types + +| Core Type | Description | MySQL | PostgreSQL | +|-----------|-------------|-------|------------| +| `char(n)` | Fixed-length | `CHAR(n)` | `CHAR(n)` | +| `varchar(n)` | Variable-length | `VARCHAR(n)` | `VARCHAR(n)` | + +**Encoding:** All strings use UTF-8 (`utf8mb4` in MySQL, `UTF8` in PostgreSQL). +See [Encoding and Collation Policy](#encoding-and-collation-policy) for details. + +### Boolean + +| Core Type | Description | MySQL | PostgreSQL | +|-----------|-------------|-------|------------| +| `bool` | True/False | `TINYINT` | `BOOLEAN` | + +### Date/Time Types + +| Core Type | Description | MySQL | PostgreSQL | +|-----------|-------------|-------|------------| +| `date` | Date only | `DATE` | `DATE` | +| `datetime` | Date and time | `DATETIME` | `TIMESTAMP` | + +**Timezone policy:** All `datetime` values should be stored as **UTC**. Timezone conversion is a +presentation concern handled by the application layer, not the database. This ensures: +- Reproducible computations regardless of server or client timezone settings +- Simple arithmetic on temporal values (no DST ambiguity) +- Portable data across systems and regions + +Use `CURRENT_TIMESTAMP` for auto-populated creation times: +``` +created_at : datetime = CURRENT_TIMESTAMP +``` + +### Binary Types + +The core `bytes` type stores raw bytes without any serialization. Use the `` codec +for serialized Python objects. + +| Core Type | Description | MySQL | PostgreSQL | +|-----------|-------------|-------|------------| +| `bytes` | Raw bytes | `LONGBLOB` | `BYTEA` | + +### Other Types + +| Core Type | Description | MySQL | PostgreSQL | +|-----------|-------------|-------|------------| +| `json` | JSON document | `JSON` | `JSONB` | +| `uuid` | UUID | `BINARY(16)` | `UUID` | +| `enum(...)` | Enumeration | `ENUM(...)` | `CREATE TYPE ... AS ENUM` | + +### Native Passthrough Types + +Users may use native database types directly (e.g., `int`, `float`, `mediumint`, `tinyblob`), +but these are discouraged and will generate a warning. Native types lack explicit size +information, are not recorded in field comments, and may have portability issues across +database backends. + +**Prefer core DataJoint types over native types:** + +| Native (discouraged) | Core DataJoint (preferred) | +|---------------------|---------------------------| +| `int` | `int32` | +| `float` | `float32` or `float64` | +| `double` | `float64` | +| `tinyint` | `int8` | +| `tinyint unsigned` | `uint8` | +| `smallint` | `int16` | +| `bigint` | `int64` | + +### Type Modifiers Policy + +DataJoint table definitions have their own syntax for constraints and metadata. SQL type +modifiers are **not allowed** in type specifications because they conflict with DataJoint's +declarative syntax: + +| Modifier | Status | DataJoint Alternative | +|----------|--------|----------------------| +| `NOT NULL` / `NULL` | ❌ Not allowed | Use `= NULL` for nullable; omit default for required | +| `DEFAULT value` | ❌ Not allowed | Use `= value` syntax before the type | +| `PRIMARY KEY` | ❌ Not allowed | Position above `---` line | +| `UNIQUE` | ❌ Not allowed | Use DataJoint index syntax | +| `COMMENT 'text'` | ❌ Not allowed | Use `# comment` syntax | +| `CHARACTER SET` | ❌ Not allowed | Database-level configuration | +| `COLLATE` | ❌ Not allowed | Database-level configuration | +| `AUTO_INCREMENT` | ⚠️ Discouraged | Allowed with native types only, generates warning | +| `UNSIGNED` | βœ… Allowed | Part of type semantics (use `uint*` core types) | + +**Nullability and defaults:** DataJoint handles nullability through the default value syntax. +An attribute is nullable if and only if its default is `NULL`: + +``` +# Required (NOT NULL, no default) +name : varchar(100) + +# Nullable (default is NULL) +nickname = NULL : varchar(100) + +# Required with default value +status = "active" : varchar(20) +``` + +**Auto-increment policy:** DataJoint discourages `AUTO_INCREMENT` / `SERIAL` because: +- Breaks reproducibility (IDs depend on insertion order) +- Makes pipelines non-deterministic +- Complicates data migration and replication +- Primary keys should be meaningful, not arbitrary + +If required, use native types: `int auto_increment` or `serial` (with warning). + +### Encoding and Collation Policy + +Character encoding and collation are **database-level configuration**, not part of type +definitions. This ensures consistent behavior across all tables and simplifies portability. + +**Configuration** (in `dj.config` or `datajoint.json`): +```json +{ + "database.charset": "utf8mb4", + "database.collation": "utf8mb4_bin" +} +``` + +**Defaults:** + +| Setting | MySQL | PostgreSQL | +|---------|-------|------------| +| Charset | `utf8mb4` | `UTF8` | +| Collation | `utf8mb4_bin` | `C` | + +**Policy:** +- **UTF-8 required**: DataJoint validates charset is UTF-8 compatible at connection time +- **Case-sensitive by default**: Binary collation (`utf8mb4_bin` / `C`) ensures predictable comparisons +- **No per-column overrides**: `CHARACTER SET` and `COLLATE` are rejected in type definitions +- **Like timezone**: Encoding is infrastructure configuration, not part of the data model + +## Codec Types (Layer 3) + +Codec types provide `encode()`/`decode()` semantics on top of core types. They are +composable and can be built-in or user-defined. + +### Storage Mode: `@` Convention + +The `@` character in codec syntax indicates **external storage** (object store): + +- **No `@`**: Internal storage (database) - e.g., ``, `` +- **`@` present**: External storage (object store) - e.g., ``, `` +- **`@` alone**: Use default store - e.g., `` +- **`@name`**: Use named store - e.g., `` + +Some codecs support both modes (``, ``), others are external-only (``, ``, ``). + +### Codec Base Class + +Codecs auto-register when subclassed using Python's `__init_subclass__` mechanism. +No decorator is needed. + +```python +from abc import ABC, abstractmethod +from typing import Any + +# Global codec registry +_codec_registry: dict[str, "Codec"] = {} + + +class Codec(ABC): + """ + Base class for codec types. Subclasses auto-register by name. + + Requires Python 3.10+. + """ + name: str | None = None # Must be set by concrete subclasses + + def __init_subclass__(cls, *, register: bool = True, **kwargs): + """Auto-register concrete codecs when subclassed.""" + super().__init_subclass__(**kwargs) + + if not register: + return # Skip registration for abstract bases + + if cls.name is None: + return # Skip registration if no name (abstract) + + if cls.name in _codec_registry: + existing = _codec_registry[cls.name] + if type(existing) is not cls: + raise DataJointError( + f"Codec <{cls.name}> already registered by {type(existing).__name__}" + ) + return # Same class, idempotent + + _codec_registry[cls.name] = cls() + + def get_dtype(self, is_external: bool) -> str: + """ + Return the storage dtype for this codec. + + Args: + is_external: True if @ modifier present (external storage) + + Returns: + A core type (e.g., "bytes", "json") or another codec (e.g., "") + """ + raise NotImplementedError + + @abstractmethod + def encode(self, value: Any, *, key: dict | None = None, store_name: str | None = None) -> Any: + """Encode Python value for storage.""" + ... + + @abstractmethod + def decode(self, stored: Any, *, key: dict | None = None) -> Any: + """Decode stored value back to Python.""" + ... + + def validate(self, value: Any) -> None: + """Optional validation before encoding. Override to add constraints.""" + pass + + +def list_codecs() -> list[str]: + """Return list of registered codec names.""" + return sorted(_codec_registry.keys()) + + +def get_codec(name: str) -> Codec: + """Get codec by name. Raises DataJointError if not found.""" + if name not in _codec_registry: + raise DataJointError(f"Unknown codec: <{name}>") + return _codec_registry[name] +``` + +**Usage - no decorator needed:** + +```python +class GraphCodec(dj.Codec): + """Auto-registered as .""" + name = "graph" + + def get_dtype(self, is_external: bool) -> str: + return "" + + def encode(self, graph, *, key=None, store_name=None): + return {'nodes': list(graph.nodes()), 'edges': list(graph.edges())} + + def decode(self, stored, *, key=None): + import networkx as nx + G = nx.Graph() + G.add_nodes_from(stored['nodes']) + G.add_edges_from(stored['edges']) + return G +``` + +**Skip registration for abstract bases:** + +```python +class ExternalOnlyCodec(dj.Codec, register=False): + """Abstract base for external-only codecs. Not registered.""" + + def get_dtype(self, is_external: bool) -> str: + if not is_external: + raise DataJointError(f"<{self.name}> requires @ (external only)") + return "json" +``` + +### Codec Resolution and Chaining + +Codecs resolve to core types through chaining. The `get_dtype(is_external)` method +returns the appropriate dtype based on storage mode: + +``` +Resolution at declaration time: + + β†’ get_dtype(False) β†’ "bytes" β†’ LONGBLOB/BYTEA + β†’ get_dtype(True) β†’ "" β†’ json β†’ JSON/JSONB + β†’ get_dtype(True) β†’ "" β†’ json (store=cold) + + β†’ get_dtype(False) β†’ "bytes" β†’ LONGBLOB/BYTEA + β†’ get_dtype(True) β†’ "" β†’ json β†’ JSON/JSONB + + β†’ get_dtype(True) β†’ "json" β†’ JSON/JSONB + β†’ get_dtype(False) β†’ ERROR (external only) + + β†’ get_dtype(True) β†’ "json" β†’ JSON/JSONB + β†’ get_dtype(True) β†’ "json" β†’ JSON/JSONB +``` + +### `` / `` - Path-Addressed Storage + +**Built-in codec. External only.** + +OAS (Object-Augmented Schema) storage for files and folders: + +- Path derived from primary key: `{schema}/{table}/{pk}/{attribute}/` +- One-to-one relationship with table row +- Deleted when row is deleted +- Returns `ObjectRef` for lazy access +- Supports direct writes (Zarr, HDF5) via fsspec +- **dtype**: `json` (stores path, store name, metadata) + +```python +class Analysis(dj.Computed): + definition = """ + -> Recording + --- + results : # default store + archive : # specific store + """ +``` + +#### Implementation + +```python +class ObjectCodec(dj.Codec): + """Path-addressed OAS storage. External only.""" + name = "object" + + def get_dtype(self, is_external: bool) -> str: + if not is_external: + raise DataJointError(" requires @ (external storage only)") + return "json" + + def encode(self, value, *, key=None, store_name=None) -> dict: + store = get_store(store_name or dj.config['stores']['default']) + path = self._compute_path(key) # {schema}/{table}/{pk}/{attr}/ + store.put(path, value) + return {"path": path, "store": store_name, ...} + + def decode(self, stored: dict, *, key=None) -> ObjectRef: + return ObjectRef(store=get_store(stored["store"]), path=stored["path"]) +``` + +### `` / `` - Hash-Addressed Storage + +**Built-in codec. External only.** + +Hash-addressed storage with deduplication: + +- **Single blob only**: stores a single file or serialized object (not folders) +- **Per-project scope**: content is shared across all schemas in a project (not per-schema) +- Path derived from content hash: `_hash/{hash[:2]}/{hash[2:4]}/{hash}` +- Many-to-one: multiple rows (even across schemas) can reference same content +- Reference counted for garbage collection +- Deduplication: identical content stored once across the entire project +- For folders/complex objects, use `object` type instead +- **dtype**: `json` (stores hash, store name, size, metadata) + +``` +store_root/ +β”œβ”€β”€ {schema}/{table}/{pk}/ # object storage (path-addressed by PK) +β”‚ └── {attribute}/ +β”‚ +└── _hash/ # content storage (hash-addressed) + └── {hash[:2]}/{hash[2:4]}/{hash} +``` + +#### Implementation + +```python +class HashCodec(dj.Codec): + """Hash-addressed storage. External only.""" + name = "hash" + + def get_dtype(self, is_external: bool) -> str: + if not is_external: + raise DataJointError(" requires @ (external storage only)") + return "json" + + def encode(self, data: bytes, *, key=None, store_name=None) -> dict: + """Store content, return metadata as JSON.""" + hash_id = hashlib.md5(data).hexdigest() # 32-char hex + store = get_store(store_name or dj.config['stores']['default']) + path = f"_hash/{hash_id[:2]}/{hash_id[2:4]}/{hash_id}" + + if not store.exists(path): + store.put(path, data) + + # Metadata stored in JSON column (no separate registry) + return {"hash": hash_id, "store": store_name, "size": len(data)} + + def decode(self, stored: dict, *, key=None) -> bytes: + """Retrieve content by hash.""" + store = get_store(stored["store"]) + path = f"_hash/{stored['hash'][:2]}/{stored['hash'][2:4]}/{stored['hash']}" + return store.get(path) +``` + +#### Database Column + +The `` type stores JSON metadata: + +```sql +-- content column (MySQL) +features JSON NOT NULL +-- Contains: {"hash": "abc123...", "store": "main", "size": 12345} + +-- content column (PostgreSQL) +features JSONB NOT NULL +``` + +### `` - Portable External Reference + +**Built-in codec. External only (store required).** + +Relative path references within configured stores: + +- **Relative paths**: paths within a configured store (portable across environments) +- **Store-aware**: resolves paths against configured store backend +- Returns `ObjectRef` for lazy access via fsspec +- Stores optional checksum for verification +- **dtype**: `json` (stores path, store name, checksum, metadata) + +**Key benefit**: Portability. The path is relative to the store, so pipelines can be moved +between environments (dev β†’ prod, cloud β†’ local) by changing store configuration without +updating data. + +```python +class RawData(dj.Manual): + definition = """ + session_id : int32 + --- + recording : # relative path within 'main' store + """ + +# Insert - user provides relative path within the store +table.insert1({ + 'session_id': 1, + 'recording': 'experiment_001/data.nwb' # relative to main store root +}) + +# Fetch - returns ObjectRef (lazy) +row = (table & 'session_id=1').fetch1() +ref = row['recording'] # ObjectRef +ref.download('/local/path') # explicit download +ref.open() # fsspec streaming access +``` + +#### When to Use `` vs `varchar` + +| Use Case | Recommended Type | +|----------|------------------| +| Need ObjectRef/lazy access | `` | +| Need portability (relative paths) | `` | +| Want checksum verification | `` | +| Just storing a URL string | `varchar` | +| External URLs you don't control | `varchar` | + +For arbitrary URLs (S3, HTTP, etc.) where you don't need ObjectRef semantics, +just use `varchar`. A string is simpler and more transparent. + +#### Implementation + +```python +class FilepathCodec(dj.Codec): + """Store-relative file references. External only.""" + name = "filepath" + + def get_dtype(self, is_external: bool) -> str: + if not is_external: + raise DataJointError(" requires @store") + return "json" + + def encode(self, relative_path: str, *, key=None, store_name=None) -> dict: + """Register reference to file in store.""" + store = get_store(store_name) # store_name required for filepath + return {'path': relative_path, 'store': store_name} + + def decode(self, stored: dict, *, key=None) -> ObjectRef: + """Return ObjectRef for lazy access.""" + return ObjectRef(store=get_store(stored['store']), path=stored['path']) +``` + +#### Database Column + +```sql +-- filepath column (MySQL) +recording JSON NOT NULL +-- Contains: {"path": "experiment_001/data.nwb", "store": "main", "checksum": "...", "size": ...} + +-- filepath column (PostgreSQL) +recording JSONB NOT NULL +``` + +#### Key Differences from Legacy `filepath@store` (now ``) + +| Feature | Legacy | New | +|---------|--------|-----| +| Access | Copy to local stage | ObjectRef (lazy) | +| Copying | Automatic | Explicit via `ref.download()` | +| Streaming | No | Yes via `ref.open()` | +| Paths | Relative | Relative (unchanged) | +| Store param | Required (`@store`) | Required (`@store`) | + +## Database Types + +### `json` - Cross-Database JSON Type + +JSON storage compatible across MySQL and PostgreSQL: + +```sql +-- MySQL +column_name JSON NOT NULL + +-- PostgreSQL (uses JSONB for better indexing) +column_name JSONB NOT NULL +``` + +The `json` database type: +- Used as dtype by built-in codecs (``, ``, ``) +- Stores arbitrary JSON-serializable data +- Automatically uses appropriate type for database backend +- Supports JSON path queries where available + +## Built-in Codecs + +### `` / `` - Serialized Python Objects + +**Supports both internal and external storage.** + +Serializes Python objects (NumPy arrays, dicts, lists, etc.) using DataJoint's +blob format. Compatible with MATLAB. + +- **``**: Stored in database (`bytes` β†’ `LONGBLOB`/`BYTEA`) +- **``**: Stored externally via `` with deduplication +- **``**: Stored in specific named store + +```python +class BlobCodec(dj.Codec): + """Serialized Python objects. Supports internal and external.""" + name = "blob" + + def get_dtype(self, is_external: bool) -> str: + return "" if is_external else "bytes" + + def encode(self, value, *, key=None, store_name=None) -> bytes: + from . import blob + return blob.pack(value, compress=True) + + def decode(self, stored, *, key=None) -> Any: + from . import blob + return blob.unpack(stored) +``` + +Usage: +```python +class ProcessedData(dj.Computed): + definition = """ + -> RawData + --- + small_result : # internal (in database) + large_result : # external (default store) + archive_result : # external (specific store) + """ +``` + +### `` / `` - File Attachments + +**Supports both internal and external storage.** + +Stores files with filename preserved. On fetch, extracts to configured download path. + +- **``**: Stored in database (`bytes` β†’ `LONGBLOB`/`BYTEA`) +- **``**: Stored externally via `` with deduplication +- **``**: Stored in specific named store + +```python +class AttachCodec(dj.Codec): + """File attachment with filename. Supports internal and external.""" + name = "attach" + + def get_dtype(self, is_external: bool) -> str: + return "" if is_external else "bytes" + + def encode(self, filepath, *, key=None, store_name=None) -> bytes: + path = Path(filepath) + return path.name.encode() + b"\0" + path.read_bytes() + + def decode(self, stored, *, key=None) -> str: + filename, contents = stored.split(b"\0", 1) + filename = filename.decode() + download_path = Path(dj.config['download_path']) / filename + download_path.write_bytes(contents) + return str(download_path) +``` + +Usage: +```python +class Attachments(dj.Manual): + definition = """ + attachment_id : int32 + --- + config : # internal (small file in DB) + data_file : # external (default store) + archive : # external (specific store) + """ +``` + +## User-Defined Codecs + +Users can define custom codecs for domain-specific data: + +```python +class GraphCodec(dj.Codec): + """Store NetworkX graphs. Internal only (no external support).""" + name = "graph" + + def get_dtype(self, is_external: bool) -> str: + if is_external: + raise DataJointError(" does not support external storage") + return "" # Chain to blob for serialization + + def encode(self, graph, *, key=None, store_name=None): + return {'nodes': list(graph.nodes()), 'edges': list(graph.edges())} + + def decode(self, stored, *, key=None): + import networkx as nx + G = nx.Graph() + G.add_nodes_from(stored['nodes']) + G.add_edges_from(stored['edges']) + return G +``` + +Custom codecs can support both modes by returning different dtypes: + +```python +class ImageCodec(dj.Codec): + """Store images. Supports both internal and external.""" + name = "image" + + def get_dtype(self, is_external: bool) -> str: + return "" if is_external else "bytes" + + def encode(self, image, *, key=None, store_name=None) -> bytes: + # Convert PIL Image to PNG bytes + buffer = io.BytesIO() + image.save(buffer, format='PNG') + return buffer.getvalue() + + def decode(self, stored: bytes, *, key=None): + return PIL.Image.open(io.BytesIO(stored)) +``` + +## Storage Comparison + +| Type | get_dtype | Resolves To | Storage Location | Dedup | Returns | +|------|-----------|-------------|------------------|-------|---------| +| `` | `bytes` | `LONGBLOB`/`BYTEA` | Database | No | Python object | +| `` | `` | `json` | `_hash/{hash}` | Yes | Python object | +| `` | `` | `json` | `_hash/{hash}` | Yes | Python object | +| `` | `bytes` | `LONGBLOB`/`BYTEA` | Database | No | Local file path | +| `` | `` | `json` | `_hash/{hash}` | Yes | Local file path | +| `` | `` | `json` | `_hash/{hash}` | Yes | Local file path | +| `` | `json` | `JSON`/`JSONB` | `{schema}/{table}/{pk}/` | No | ObjectRef | +| `` | `json` | `JSON`/`JSONB` | `{schema}/{table}/{pk}/` | No | ObjectRef | +| `` | `json` | `JSON`/`JSONB` | `_hash/{hash}` | Yes | bytes | +| `` | `json` | `JSON`/`JSONB` | `_hash/{hash}` | Yes | bytes | +| `` | `json` | `JSON`/`JSONB` | Configured store | No | ObjectRef | + +## Garbage Collection for Hash Storage + +Hash metadata (hash, store, size) is stored directly in each table's JSON column - no separate +registry table is needed. Garbage collection scans all tables to find referenced hashes: + +```python +def garbage_collect(store_name): + """Remove hash-addressed data not referenced by any table.""" + # Scan store for all hash files + store = get_store(store_name) + all_hashes = set(store.list_hashes()) # from _hash/ directory + + # Scan all tables for referenced hashes + referenced = set() + for schema in project.schemas: + for table in schema.tables: + for attr in table.heading.attributes: + if uses_hash_storage(attr): # , , + for row in table: + val = row.get(attr.name) + if val and val.get('store') == store_name: + referenced.add(val['hash']) + + # Delete orphaned files + for hash_id in (all_hashes - referenced): + store.delete(hash_path(hash_id)) +``` + +## Built-in Codec Comparison + +| Feature | `` | `` | `` | `` | `` | +|---------|----------|------------|-------------|--------------|---------------| +| Storage modes | Both | Both | External only | External only | External only | +| Internal dtype | `bytes` | `bytes` | N/A | N/A | N/A | +| External dtype | `` | `` | `json` | `json` | `json` | +| Addressing | Hash | Hash | Primary key | Hash | Relative path | +| Deduplication | Yes (external) | Yes (external) | No | Yes | No | +| Structure | Single blob | Single file | Files, folders | Single blob | Any | +| Returns | Python object | Local path | ObjectRef | bytes | ObjectRef | +| GC | Ref counted | Ref counted | With row | Ref counted | User managed | + +**When to use each:** +- **``**: Serialized Python objects (NumPy arrays, dicts). Use `` for large/duplicated data +- **``**: File attachments with filename preserved. Use `` for large files +- **``**: Large/complex file structures (Zarr, HDF5) where DataJoint controls organization +- **``**: Raw bytes with deduplication (typically used via `` or ``) +- **``**: Portable references to externally-managed files +- **`varchar`**: Arbitrary URLs/paths where ObjectRef semantics aren't needed + +## Key Design Decisions + +1. **Three-layer architecture**: + - Layer 1: Native database types (backend-specific, discouraged) + - Layer 2: Core DataJoint types (standardized, scientist-friendly) + - Layer 3: Codec types (encode/decode, composable) +2. **Core types are scientist-friendly**: `float32`, `uint8`, `bool`, `bytes` instead of `FLOAT`, `TINYINT UNSIGNED`, `LONGBLOB` +3. **Codecs use angle brackets**: ``, ``, `` - distinguishes from core types +4. **`@` indicates external storage**: No `@` = database, `@` present = object store +5. **`get_dtype(is_external)` method**: Codecs resolve dtype at declaration time based on storage mode +6. **Codecs are composable**: `` uses ``, which uses `json` +7. **Built-in external codecs use JSON dtype**: Stores metadata (path, hash, store name, etc.) +8. **Two OAS regions**: object (PK-addressed) and hash (hash-addressed) within managed stores +9. **Filepath for portability**: `` uses relative paths within stores for environment portability +10. **No `uri` type**: For arbitrary URLs, use `varchar`β€”simpler and more transparent +11. **Naming conventions**: + - `@` = external storage (object store) + - No `@` = internal storage (database) + - `@` alone = default store + - `@name` = named store +12. **Dual-mode codecs**: `` and `` support both internal and external storage +13. **External-only codecs**: ``, ``, `` require `@` +14. **Transparent access**: Codecs return Python objects or file paths +15. **Lazy access**: `` and `` return ObjectRef +16. **MD5 for content hashing**: See [Hash Algorithm Choice](#hash-algorithm-choice) below +17. **No separate registry**: Hash metadata stored in JSON columns, not a separate table +18. **Auto-registration via `__init_subclass__`**: Codecs register automatically when subclassedβ€”no decorator needed. Use `register=False` for abstract bases. Requires Python 3.10+. + +### Hash Algorithm Choice + +Content-addressed storage uses **MD5** (128-bit, 32-char hex) rather than SHA256 (256-bit, 64-char hex). + +**Rationale:** + +1. **Practical collision resistance is sufficient**: The birthday bound for MD5 is ~2^64 operations + before 50% collision probability. No scientific project will store anywhere near 10^19 files. + For content deduplication (not cryptographic verification), MD5 provides adequate uniqueness. + +2. **Storage efficiency**: 32-char hashes vs 64-char hashes in every JSON metadata field. + With millions of records, this halves the storage overhead for hash identifiers. + +3. **Performance**: MD5 is ~2-3x faster than SHA256 for large files. While both are fast, + the difference is measurable when hashing large scientific datasets. + +4. **Legacy compatibility**: DataJoint's existing `uuid_from_buffer()` function uses MD5. + The new system changes only the storage format (hex string in JSON vs binary UUID), + not the underlying hash algorithm. This simplifies migration. + +5. **Consistency with existing codebase**: The `dj.hash` module already uses MD5 for + `key_hash()` (job reservation) and `uuid_from_buffer()` (query caching). + +**Why not SHA256?** + +SHA256 is the modern standard for content-addressable storage (Git, Docker, IPFS). However: +- These systems prioritize cryptographic security against adversarial collision attacks +- Scientific data pipelines face no adversarial threat model +- The practical benefits (storage, speed, compatibility) outweigh theoretical security gains + +**Note**: If cryptographic verification is ever needed (e.g., for compliance or reproducibility +audits), SHA256 checksums can be computed on-demand without changing the storage addressing scheme. + +## Migration from Legacy Types + +| Legacy | New Equivalent | +|--------|----------------| +| `longblob` (auto-serialized) | `` | +| `blob@store` | `` | +| `attach` | `` | +| `attach@store` | `` | +| `filepath@store` (copy-based) | `` (ObjectRef-based) | + +### Migration from Legacy `~external_*` Stores + +Legacy external storage used per-schema `~external_{store}` tables with UUID references. +Migration to the new JSON-based hash storage requires: + +```python +def migrate_external_store(schema, store_name): + """ + Migrate legacy ~external_{store} to new HashRegistry. + + 1. Read all entries from ~external_{store} + 2. For each entry: + - Fetch content from legacy location + - Compute MD5 hash + - Copy to _hash/{hash}/ if not exists + - Update table column to new hash format + 3. After all schemas migrated, drop ~external_{store} tables + """ + external_table = schema.external[store_name] + + for entry in external_table: + legacy_uuid = entry['hash'] + + # Fetch content from legacy location + content = external_table.get(legacy_uuid) + + # Compute new content hash + hash_id = hashlib.md5(content).hexdigest() + + # Store in new location if not exists + new_path = f"_hash/{hash_id[:2]}/{hash_id[2:4]}/{hash_id}" + store = get_store(store_name) + if not store.exists(new_path): + store.put(new_path, content) + + # Update referencing tables: convert UUID column to JSON with hash metadata + # The JSON column stores {"hash": hash_id, "store": store_name, "size": len(content)} + # ... update all tables that reference this UUID ... + + # After migration complete for all schemas: + # DROP TABLE `{schema}`.`~external_{store}` +``` + +**Migration considerations:** +- Legacy UUIDs were based on MD5 content hash stored as `binary(16)` (UUID format) +- New system uses `char(32)` MD5 hex strings stored in JSON +- The hash algorithm is unchanged (MD5), only the storage format differs +- Migration can be done incrementally per schema +- Backward compatibility layer can read both formats during transition + +## Open Questions + +1. How long should the backward compatibility layer support legacy `~external_*` format? +2. Should `` (without store name) use a default store or require explicit store name? + + +--- +## File: reference/specs/virtual-schemas.md + +# Virtual Schemas Specification + +Version: 1.0 +Status: Stable +Last Updated: 2026-01-08 + +## Overview + +Virtual schemas provide a way to access existing database schemas without the original Python source code. This is useful for: + +- Exploring schemas created by other users +- Accessing legacy schemas +- Quick data inspection and queries +- Schema migration and maintenance + +--- + +## 1. Schema-Module Convention + +DataJoint maintains a **1:1 mapping** between database schemas and Python modules: + +| Database | Python | +|----------|--------| +| Schema | Module | +| Table | Class | + +This convention reduces conceptual complexity: **modules are schemas, classes are tables**. + +When you define tables in Python: +```python +# lab.py module +import datajoint as dj +schema = dj.Schema('lab') + +@schema +class Subject(dj.Manual): # Subject class β†’ `lab`.`subject` table + ... + +@schema +class Session(dj.Manual): # Session class β†’ `lab`.`session` table + ... +``` + +Virtual schemas recreate this mapping when the Python source isn't available: +```python +# Creates module-like object with table classes +lab = dj.virtual_schema('lab') +lab.Subject # Subject class for `lab`.`subject` +lab.Session # Session class for `lab`.`session` +``` + +--- + +## 2. Schema Introspection API + +### 2.1 Direct Table Access + +Access individual tables by name using bracket notation: + +```python +schema = dj.Schema('my_schema') + +# By CamelCase class name +experiment = schema['Experiment'] + +# By snake_case SQL name +experiment = schema['experiment'] + +# Query the table +experiment.fetch() +``` + +### 2.2 `get_table()` Method + +Explicit method for table access: + +```python +table = schema.get_table('Experiment') +table = schema.get_table('experiment') # also works +``` + +**Parameters:** +- `name` (str): Table name in CamelCase or snake_case + +**Returns:** `FreeTable` instance + +**Raises:** `DataJointError` if table doesn't exist + +### 2.3 Iteration + +Iterate over all tables in dependency order: + +```python +for table in schema: + print(table.full_table_name, len(table)) +``` + +Tables are yielded as `FreeTable` instances in topological order (dependencies before dependents). + +### 2.4 Containment Check + +Check if a table exists: + +```python +if 'Experiment' in schema: + print("Table exists") + +if 'nonexistent' not in schema: + print("Table doesn't exist") +``` + +--- + +## 3. Virtual Schema Function + +### 3.1 `dj.virtual_schema()` + +The recommended way to access existing schemas as modules: + +```python +lab = dj.virtual_schema('my_lab_schema') + +# Access tables as attributes (classes) +lab.Subject.fetch() +lab.Session & 'subject_id="M001"' + +# Full query algebra supported +(lab.Session * lab.Subject).fetch() +``` + +This maintains the module-class convention: `lab` behaves like a Python module with table classes as attributes. + +**Parameters:** + +| Parameter | Type | Default | Description | +|-----------|------|---------|-------------| +| `schema_name` | str | required | Database schema name | +| `connection` | Connection | None | Database connection (uses default) | +| `create_schema` | bool | False | Create schema if missing | +| `create_tables` | bool | False | Allow new table declarations | +| `add_objects` | dict | None | Additional objects for namespace | + +**Returns:** `VirtualModule` instance + +### 3.2 VirtualModule Class + +The underlying class (prefer `virtual_schema()` function): + +```python +module = dj.VirtualModule('lab', 'my_lab_schema') +module.Subject.fetch() +``` + +The first argument is the module display name, second is the schema name. + +### 3.3 Accessing the Schema Object + +Virtual modules expose the underlying Schema: + +```python +lab = dj.virtual_schema('my_lab_schema') +lab.schema.database # 'my_lab_schema' +lab.schema.list_tables() # ['subject', 'session', ...] +``` + +--- + +## 4. Table Class Generation + +### 4.1 `spawn_missing_classes()` + +Create Python classes for all tables in a schema: + +```python +schema = dj.Schema('existing_schema') +schema.spawn_missing_classes(context=locals()) + +# Now table classes are available in local namespace +Subject.fetch() +Session & 'date > "2024-01-01"' +``` + +**Parameters:** +- `context` (dict): Namespace to populate. Defaults to caller's locals. + +### 4.2 Generated Class Types + +Classes are created based on table naming conventions: + +| Table Name Pattern | Generated Class | +|-------------------|-----------------| +| `subject` | `dj.Manual` | +| `#lookup_table` | `dj.Lookup` | +| `_imported_table` | `dj.Imported` | +| `__computed_table` | `dj.Computed` | +| `master__part` | `dj.Part` | + +### 4.3 Part Table Handling + +Part tables are attached to their master classes: + +```python +lab = dj.virtual_schema('my_lab') + +# Part tables are nested attributes +lab.Session.Trial.fetch() # Session.Trial is a Part table +``` + +--- + +## 5. Use Cases + +### 5.1 Data Exploration + +```python +# Quick exploration of unknown schema +lab = dj.virtual_schema('collaborator_lab') + +# List all tables +print(lab.schema.list_tables()) + +# Check table structure +print(lab.Subject.describe()) + +# Preview data +lab.Subject.fetch(limit=5) +``` + +### 5.2 Cross-Schema Queries + +```python +my_schema = dj.Schema('my_analysis') +external = dj.virtual_schema('external_lab') + +# Reference external tables in queries +@my_schema +class Analysis(dj.Computed): + definition = """ + -> external.Session + --- + result : float + """ +``` + +### 5.3 Schema Migration + +```python +old = dj.virtual_schema('old_schema') +new = dj.Schema('new_schema') + +# Copy data +for table in old: + new_table = new.get_table(table.table_name) + new_table.insert(table.fetch(as_dict=True)) +``` + +### 5.4 Garbage Collection + +```python +from datajoint.gc import scan_content_references + +schema = dj.Schema('my_schema') + +# Scan all tables for content references +refs = scan_content_references(schema, verbose=True) +``` + +--- + +## 6. Comparison of Methods + +| Method | Use Case | Returns | +|--------|----------|---------| +| `schema['Name']` | Quick single table access | `FreeTable` | +| `schema.get_table('name')` | Explicit table access | `FreeTable` | +| `for t in schema` | Iterate all tables | `FreeTable` generator | +| `'Name' in schema` | Check existence | `bool` | +| `dj.virtual_schema(name)` | Module-like access | `VirtualModule` | +| `spawn_missing_classes()` | Populate namespace | None (side effect) | + +--- + +## 7. Implementation Reference + +| File | Purpose | +|------|---------| +| `schemas.py` | Schema, VirtualModule, virtual_schema | +| `table.py` | FreeTable class | +| `gc.py` | Uses get_table() for scanning | + +--- + +## 8. Error Messages + +| Error | Cause | Solution | +|-------|-------|----------| +| "Table does not exist" | `get_table()` on missing table | Check table name spelling | +| "Schema must be activated" | Operations on unactivated schema | Call `schema.activate(name)` | +| "Schema does not exist" | Schema name not in database | Check schema name, create if needed | + + +============================================================ +# About +============================================================ + + +--- +## File: about/citation.md + +# Citation Guidelines + +When your work uses the DataJoint Python, MATLAB, or Elements framework, please cite the +respective manuscripts and include their associated Research Resource Identifiers +(RRIDs). Proper citation helps credit the contributors and supports the broader +scientific community by highlighting the tools used in research. + +## Citing DataJoint Elements + +If your work utilizes **DataJoint Elements**, please cite the following manuscript: + +- **Manuscript**: Yatsenko D, Nguyen T, Shen S, Gunalan K, Turner CA, Guzman R, Sasaki + M, Sitonic D, Reimer J, Walker EY, Tolias AS. DataJoint Elements: Data Workflows for + Neurophysiology. bioRxiv. 2021 Jan 1. doi: https://doi.org/10.1101/2021.03.30.437358 + +- **RRID**: [RRID:SCR_021894](https://scicrunch.org/resolver/SCR_021894) + +You should also cite the **DataJoint Core manuscript** detailed below. + +## Citing the DataJoint Relational Model + +For any work relying on the **DataJoint Relational Model**, include the following +citation: + +- **Manuscript**: Yatsenko D, Walker EY, Tolias AS. DataJoint: A simpler relational data + model. arXiv:1807.11104. 2018 Jul 29. doi: https://doi.org/10.48550/arXiv.1807.11104 + +- **RRID**: [RRID:SCR_014543](https://scicrunch.org/resolver/SCR_014543) + +## Citing DataJoint Python and MATLAB + +For work using **DataJoint Python** or **DataJoint MATLAB**, cite the following +manuscript: + +- **Manuscript**: Yatsenko D, Reimer J, Ecker AS, Walker EY, Sinz F, Berens P, + Hoenselaar A, Cotton RJ, Siapas AS, Tolias AS. DataJoint: Managing big scientific data + using MATLAB or Python. bioRxiv. 2015 Jan 1:031658. doi: + https://doi.org/10.1101/031658 + +- **RRID**: [RRID:SCR_014543](https://scicrunch.org/resolver/SCR_014543) + +## Citing SciOps and Capability Maturity Model + +If your work references **SciOps** or the **Capability Maturity Model for Data-Intensive +Research**, please use the following citation: + +- Manuscript: Johnson EC, Nguyen TT, Dichter BK, Zappulla F, Kosma M, Gunalan K, + Halchenko YO, Neufeld SQ, Schirner M, Ritter P, Martone ME. SciOps: Achieving + Productivity and Reliability in Data-Intensive Research. arXiv preprint + arXiv:2401.00077v2. 2023 Dec 29. + +- **RRID**: TBD + +# Why Cite DataJoint? + +By citing DataJoint and its associated resources: + +You give credit to the authors and contributors who developed these tools. + +You help other researchers identify and use these tools effectively. + +You strengthen the visibility and impact of open-source tools in scientific research. + +For further questions or assistance with citations, please reach out to the DataJoint +support team (support@datajoint.com). + + +--- +## File: about/contributing.md + +# Contributing to DataJoint + +DataJoint is developed openly and welcomes contributions from the community. + +## Ways to Contribute + +### Report Issues + +Found a bug or have a feature request? Open an issue on GitHub: + +- [datajoint-python issues](https://github.com/datajoint/datajoint-python/issues) +- [datajoint-docs issues](https://github.com/datajoint/datajoint-docs/issues) + +### Improve Documentation + +Documentation improvements are valuable contributions: + +1. Fork the [datajoint-docs](https://github.com/datajoint/datajoint-docs) repository +2. Make your changes +3. Submit a pull request + +### Contribute Code + +For code contributions to datajoint-python: + +1. Fork the repository +2. Create a feature branch +3. Write tests for your changes +4. Ensure all tests pass +5. Submit a pull request + +See the [Developer Guide](https://github.com/datajoint/datajoint-python/blob/main/CONTRIBUTING.md) +for detailed instructions. + +## Development Setup + +### datajoint-python + +```bash +git clone https://github.com/datajoint/datajoint-python.git +cd datajoint-python +pip install -e ".[dev]" +pre-commit install +``` + +### datajoint-docs + +```bash +git clone https://github.com/datajoint/datajoint-docs.git +cd datajoint-docs +pip install -r pip_requirements.txt +mkdocs serve +``` + +## Code Style + +- Python code follows [PEP 8](https://pep8.org/) +- Docstrings use [NumPy style](https://numpydoc.readthedocs.io/en/latest/format.html) +- Pre-commit hooks enforce formatting + +## Testing + +```bash +# Run unit tests +pytest tests/unit + +# Run integration tests (requires Docker) +DOCKER_HOST=unix:///path/to/docker.sock pytest tests/ +``` + +## Questions? + +- Open a [GitHub Discussion](https://github.com/datajoint/datajoint-python/discussions) +- Join the [DataJoint Slack](https://datajoint.slack.com) + + +--- +## File: about/history.md + +# History + +Dimitri Yatsenko began development of DataJoint in Andreas S. Tolias' lab in the Neuroscience Department at Baylor College of Medicine in the fall of 2009. Initially implemented as a thin MySQL API in MATLAB, it defined the major principles of the DataJoint model. The [original DataJoint project](https://code.google.com/archive/p/datajoint/wikis/DataJoint.wiki) is archived on Google Code. + +In 2015, additional contributors joined to develop the Python implementation, resulting in the [foundational publication](https://doi.org/10.1101/031658) describing the DataJoint framework. + +In 2016, Vathes LLC was founded to provide support to groups using DataJoint. + +In 2017, DARPA awarded a Phase I SBIR grant (Contract D17PC00162, PI: Dimitri Yatsenko, $150,000, 2017–2018) titled "Tools for Sharing and Analyzing Neuroscience Data" to further develop and publicize the DataJoint framework. + +In 2018, the key theoretical framework was formulated in ["DataJoint: A Simpler Relational Data Model"](https://doi.org/10.48550/arXiv.1807.11104), establishing the formal basis for DataJoint's approach to scientific data management. + +In 2022, NIH awarded a Phase II SBIR grant ([R44 NS129492](https://reporter.nih.gov/project-details/10600812), PI: Dimitri Yatsenko, $2,124,457, 2022–2024) titled "DataJoint SciOps: A Managed Service for Neuroscience Data Workflows" to DataJoint (then Vathes LLC) in collaboration with the Johns Hopkins University Applied Physics Laboratory (Co-PI: Erik C. Johnson) to build a scalable cloud platform for DataJoint pipelines. + +## DataJoint Elements + +[DataJoint Elements](https://docs.datajoint.com/elements/) is an NIH-funded project ([U24 NS116470](https://reporter.nih.gov/project-details/10547509), PI: Dimitri Yatsenko, $3,780,000, 2020–2025) titled "DataJoint Pipelines for Neurophysiology." The project developed standard, open-source data pipelines for neurophysiology research ([Press Release](https://www.pr.com/press-release/873164)). + +Building on DataJoint's workflow framework, Elements provides curated, modular components for common experimental modalities including calcium imaging, electrophysiology, pose estimation, and optogenetics. The project distilled best practices from leading neuroscience labs into reusable pipeline modules that integrate with third-party analysis tools (Suite2p, DeepLabCut, Kilosort, etc.) and data standards (NWB, DANDI). + +The project is described in the position paper ["DataJoint Elements: Data Workflows for Neurophysiology"](https://www.biorxiv.org/content/10.1101/2021.03.30.437358v2). + +## Recent Developments + +In January 2024, Vathes LLC was re-incorporated as DataJoint Inc. + +In 2025, Jim Olson was appointed as CEO of DataJoint ([Press Release](https://www.prweb.com/releases/datajoint-appoints-former-flywheel-exec-jim-olson-as-new-ceo-302342644.html)). + +In August 2025, DataJoint closed a $4.9M seed funding round to expand data management and AI capabilities in academic and life sciences ([Press Release](https://www.prnewswire.com/news-releases/datajoint-closes-4-9m-seed-funding-to-revolutionize-data-management-and-ai-in-academic-and-life-sciences-pharma-302568792.html)). + +Today, DataJoint is used in hundreds of research labs worldwide for managing scientific data pipelines. + + +--- +## File: about/index.md + +# About DataJoint + +DataJoint is an open-source framework for building scientific data pipelines. +It was created to address the challenges of managing complex, interconnected +data in research laboratories. + +## What is DataJoint? + +DataJoint implements the **Relational Workflow Model**β€”a paradigm that extends +relational databases with native support for computational workflows. Unlike +traditional databases that only store data, DataJoint pipelines define how data +flows through processing steps, when computations run, and how results depend +on inputs. + +Key characteristics: + +- **Declarative schema design** β€” Define tables and relationships in Python +- **Automatic dependency tracking** β€” Foreign keys encode workflow dependencies +- **Built-in computation** β€” Imported and Computed tables run automatically +- **Data integrity** β€” Referential integrity and transaction support +- **Reproducibility** β€” Immutable data with full provenance + +## History + +DataJoint was developed at Baylor College of Medicine starting in 2009 to +support neuroscience research. It has since been adopted by laboratories +worldwide for a variety of scientific applications. + +[:octicons-arrow-right-24: Read the full history](history.md) + +## Citation + +If you use DataJoint in your research, please cite it appropriately. + +[:octicons-arrow-right-24: Citation guidelines](citation.md) + +## Contributing + +DataJoint is developed openly on GitHub. Contributions are welcome. + +[:octicons-arrow-right-24: Contribution guidelines](contributing.md) + +## License + +DataJoint is released under the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). + +Copyright 2024 DataJoint Inc. and contributors. + diff --git a/src/llms.txt b/src/llms.txt new file mode 100644 index 00000000..f3a44425 --- /dev/null +++ b/src/llms.txt @@ -0,0 +1,85 @@ +# DataJoint Documentation + +> DataJoint is a Python framework for building scientific data pipelines with automated computation, integrity constraints, and seamless integration of relational databases with object storage. This documentation covers DataJoint 2.0. + +## Concepts + +- [What's New in 2.0](/explanation/whats-new-2.md): Major changes and new features in DataJoint 2.0 +- [Relational Workflow Model](/explanation/relational-workflow-model.md): Core data model concepts +- [Entity Integrity](/explanation/entity-integrity.md): How DataJoint ensures data consistency +- [Normalization](/explanation/normalization.md): Database normalization principles +- [Query Algebra](/explanation/query-algebra.md): Operators for combining and filtering data +- [Type System](/explanation/type-system.md): Data types and codecs +- [Computation Model](/explanation/computation-model.md): Automated computation with populate() +- [Custom Codecs](/explanation/custom-codecs.md): Extending the type system + +## Tutorials (Basics) + +- [First Pipeline](/tutorials/basics/01-first-pipeline.ipynb): Your first DataJoint pipeline +- [Schema Design](/tutorials/basics/02-schema-design.ipynb): Tables, keys, and relationships +- [Data Entry](/tutorials/basics/03-data-entry.ipynb): Inserting and managing data +- [Queries](/tutorials/basics/04-queries.ipynb): Operators and fetching results +- [Computation](/tutorials/basics/05-computation.ipynb): Imported and Computed tables +- [Object Storage](/tutorials/basics/06-object-storage.ipynb): Blobs, attachments, and object storage + +## Tutorials (Examples) + +- [University Database](/tutorials/examples/university.ipynb): Complete example with students, courses, grades +- [Fractal Pipeline](/tutorials/examples/fractal-pipeline.ipynb): Iterative computation patterns +- [Blob Detection](/tutorials/examples/blob-detection.ipynb): Image processing with automated computation + +## Tutorials (Domain) + +- [Calcium Imaging](/tutorials/domain/calcium-imaging/calcium-imaging.ipynb): Import TIFF movies, segment cells, extract traces +- [Electrophysiology](/tutorials/domain/electrophysiology/electrophysiology.ipynb): Import recordings, detect spikes, extract waveforms +- [Allen CCF](/tutorials/domain/allen-ccf/allen-ccf.ipynb): Brain atlas with hierarchical region ontology + +## Tutorials (Advanced) + +- [SQL Comparison](/tutorials/advanced/sql-comparison.ipynb): DataJoint for SQL users +- [JSON Data Type](/tutorials/advanced/json-type.ipynb): Semi-structured data in tables +- [Distributed Computing](/tutorials/advanced/distributed.ipynb): Multi-process and cluster workflows +- [Custom Codecs](/tutorials/advanced/custom-codecs.ipynb): Extending the type system + +## How-To Guides + +- [Installation](/how-to/installation.md): Install DataJoint +- [Configure Database](/how-to/configure-database.md): Database connection setup +- [Configure Object Storage](/how-to/configure-storage.md): S3 and filesystem storage +- [Define Tables](/how-to/define-tables.md): Table definitions +- [Model Relationships](/how-to/model-relationships.ipynb): Foreign keys and dependencies +- [Design Primary Keys](/how-to/design-primary-keys.md): Key selection best practices +- [Insert Data](/how-to/insert-data.md): Adding data to tables +- [Query Data](/how-to/query-data.md): Filtering and combining tables +- [Fetch Results](/how-to/fetch-results.md): Retrieving data +- [Delete Data](/how-to/delete-data.md): Removing data safely +- [Run Computations](/how-to/run-computations.md): Using populate() +- [Distributed Computing](/how-to/distributed-computing.md): Multi-worker execution +- [Handle Errors](/how-to/handle-errors.md): Error handling in pipelines +- [Monitor Progress](/how-to/monitor-progress.md): Tracking computation status +- [Use Object Storage](/how-to/use-object-storage.md): External storage integration +- [Create Custom Codecs](/how-to/create-custom-codec.md): Custom data types +- [Manage Large Data](/how-to/manage-large-data.md): Scaling strategies +- [Migrate from 0.x](/how-to/migrate-from-0x.md): Upgrading from DataJoint 0.14 +- [Alter Tables](/how-to/alter-tables.md): Schema modifications +- [Backup and Restore](/how-to/backup-restore.md): Data backup strategies + +## Reference + +- [Table Declaration](/reference/specs/table-declaration.md): Table definition syntax +- [Query Algebra](/reference/specs/query-algebra.md): Query operator reference +- [Data Manipulation](/reference/specs/data-manipulation.md): Insert, update, delete operations +- [Primary Keys](/reference/specs/primary-keys.md): Key constraints specification +- [Semantic Matching](/reference/specs/semantic-matching.md): Join and restriction rules +- [Type System](/reference/specs/type-system.md): Data type specification +- [Codec API](/reference/specs/codec-api.md): Custom codec interface +- [AutoPopulate](/reference/specs/autopopulate.md): Computation engine specification +- [Fetch API](/reference/specs/fetch-api.md): Data retrieval methods +- [Job Metadata](/reference/specs/job-metadata.md): Job management tables + +## Optional + +- [API Reference](/api/): Auto-generated Python API documentation +- [Configuration](/reference/configuration.md): All configuration options +- [Definition Syntax](/reference/definition-syntax.md): Table definition grammar +- [Errors](/reference/errors.md): Error types and handling diff --git a/src/partnerships/dandi.md b/src/partnerships/dandi.md deleted file mode 100644 index 5867804b..00000000 --- a/src/partnerships/dandi.md +++ /dev/null @@ -1,91 +0,0 @@ -# Sustainability Roadmap between DataJoint Elements and DANDI Archive - -
- - - - ![datajoint](../../images/company-logo-black.svg){: style="height:50px; padding-right:25px"} - ![dandi](../../images/community-partnerships-dandi-logo.png){: style="height:83px"} -
- -## Aim - -**DataJoint Elements** and **The DANDI Archive (DANDI)** are two neuroinformatics -initiatives in active development. The projects develop independently yet they have -complementary aims and overlapping user communities. This document establishes key -processes for coordinating development and communications in order to promote -integration and interoperability across the two ecosystems. - -## Projects and Teams - -### DataJoint - -**DataJoint Elements** β€” https://docs.datajoint.com/elements/ β€” is a collection of - open-source reference database schemas and analysis workflows for neurophysiology - experiments, supported by **DataJoint** β€” https://docs.datajoint.com/core/ β€” an - open-source software framework. The project is funded by the NIH grant U24 NS116470 - and led by Dr. Dimitri Yatsenko. - -The principal developer of DataJoint Elements and the DataJoint framework is the company -DataJoint β€” https://datajoint.com. - -### Distributed Archives for Neurophysiology Data Integration (DANDI) - -**DANDI** - https://dandiarchive.org β€” is an archive for neurophysiology data, -providing neuroscientists with a common platform to share, archive, and process data. -The project is funded by the NIH grant R24 MH117295 and led by Dr. Satrajit S. Ghosh -and Dr. Yaroslav O. Halchenko. - -The principal developers of DANDI are at the Massachusetts Institute of Technology, -Dartmouth College, Catalyst Neuro, and Kitware. - -## General Principles - -### No obligation - -The developers of the two ecosystems acknowledge that this roadmap document creates no -contractual relationship between them but they agree to work together in the spirit of -partnership to ensure that there is a united, visible, and responsive leadership and to -demonstrate administrative and managerial commitment to coordinate development and -communications. - -### Coordinated Development - -The two projects will coordinate their development approaches to ensure maximum -interoperability. This includes: - -- coordinated use of terminology and nomenclatures -- support for testing infrastructure: unit testing and integration testing -- a coordinated software release process and versioning -- coordinated resolution of issues arising from joint use of the two tools - -### Points of Contact - -To achieve the aims of coordinated development, both projects appoint a primary point of -contact (POC) to respond to questions relating to the integration and interoperability -of DataJoint Elements and DANDI. - -For 2022, the DataJoint Elements POC is Dr. Kushal Bakshi (kushal@datajoint.com) - -For 2022, the DANDI POC is Dr.Satrajit Ghosh (satra@mit.edu) - -### Annual Review - -To achieve the aims of coordinated development, the principal developers conduct a -joint annual review of this roadmap document to ensure that the two programs are well -integrated and not redundant. The contents and resolutions of the review will be made -publicly available. - -### Licensing - -The two parties ensure that relevant software components are developed under licenses -that avoid any hindrance to integration and interoperability between DataJoint Elements -and DANDI. - -## Development Roadmap - -- [x] Mechanism to upload to DANDI - - [Element Interface DANDI module](https://github.com/datajoint/element-interface/blob/main/element_interface/dandi.py) - -- [x] Documentation to upload to DANDI - - [Jupyter notebook](https://github.com/datajoint/workflow-array-ephys/blob/main/notebooks/09-NWB-export.ipynb) diff --git a/src/partnerships/facemap.md b/src/partnerships/facemap.md deleted file mode 100644 index 2d36fe5d..00000000 --- a/src/partnerships/facemap.md +++ /dev/null @@ -1,101 +0,0 @@ -# Sustainability Roadmap between DataJoint Elements and Facemap - -
- - - - ![datajoint](../../images/company-logo-black.svg){: style="height:50px; padding-right:25px"} - ![facemap](../../images/community-partnerships-facemap-logo.png){: style="width:100px"} -
- -## Aim - -**DataJoint Elements** and **Facemap** are two neuroinformatics initiatives in active -development. The projects develop independently yet they have complementary aims and -overlapping user communities. This document establishes key processes for coordinating -development and communications in order to promote integration and interoperability -across the two ecosystems. - -## Projects and Teams - -### DataJoint - -**DataJoint Elements** β€” https://docs.datajoint.com/elements/ β€” is a collection of - open-source reference database schemas and analysis workflows for neurophysiology - experiments, supported by **DataJoint** β€” https://docs.datajoint.com/core/ β€” an - open-source software framework. The project is funded by the NIH grant U24 NS116470 - and led by Dr. Dimitri Yatsenko. - -The principal developer of DataJoint Elements and the DataJoint framework is the company -DataJoint β€” https://datajoint.com. - -### Facemap - -**Facemap** - https://github.com/MouseLand/facemap β€” is a pipeline for processing -imaging data. The project is funded by HHMI Janelia Research Campus and led by -Dr. Carsen Stringer and Atika Syeda. - -The principal developers of Facemap are at the Janelia Research Campus. - -## General Principles - -### No obligation - -The developers of the two ecosystems acknowledge that this roadmap document creates no -contractual relationship between them but they agree to work together in the spirit of -partnership to ensure that there is a united, visible, and responsive leadership and to -demonstrate administrative and managerial commitment to coordinate development and -communications. - -### Coordinated Development - -The two projects will coordinate their development approaches to ensure maximum -interoperability. This includes: - -- coordinated use of terminology and nomenclatures -- support for testing infrastructure: unit testing and integration testing -- a coordinated software release process and versioning -- coordinated resolution of issues arising from joint use of the two tools - -### Points of Contact - -To achieve the aims of coordinated development, both projects appoint a primary point of -contact (POC) to respond to questions relating to the integration and interoperability -of DataJoint Elements and Facemap. - -For 2022, the DataJoint Elements POC is Dr. Kushal Bakshi (kushal@datajoint.com) - -For 2022, the Facemap POC is Dr. Carsen Stringer (stringerc@janelia.hhmi.org) - -### Annual Review - -To achieve the aims of coordinated development, the principal developers conduct a joint -annual review of this roadmap document to ensure that the two programs are -well integrated and not redundant. The contents and resolutions of the review will be -made publicly available. - -### Licensing - -The two parties ensure that relevant software components are developed under licenses -that avoid any hindrance to integration and interoperability between DataJoint Elements -and Facemap. - -## Development Roadmap - -- [x] Mechanism to import Facemap results - -[Element Facemap](https://github.com/datajoint/element-facemap/blob/0ccab4ec6731cd612e7cf61a221c64fb9bf22566/element_facemap/facial_behavior_estimation.py#L389-L405) - -- [x] Mechanism to run Facemap within DataJoint Elements - -[Element Facemap](https://github.com/datajoint/element-facemap/blob/0ccab4ec6731cd612e7cf61a221c64fb9bf22566/element_facemap/facial_behavior_estimation.py#L259-L266) - -- [x] Tutorials on running DataJoint Element with Facemap - [Tutorial](https://github.com/datajoint/workflow-facemap/blob/main/notebooks/01-Facemap-DataJoint.ipynb) - -- [ ] Tests to verify loading Facemap data - -- [ ] Tests to verify running Facemap - -## Citation - -If you use Facemap please cite -[Stringer*, Pachitariu*, et al., Science 2019](https://doi.org/10.1126%2Fscience.aav7893) -in your publications. diff --git a/src/partnerships/incf.md b/src/partnerships/incf.md deleted file mode 100644 index 2d65abb0..00000000 --- a/src/partnerships/incf.md +++ /dev/null @@ -1,11 +0,0 @@ -# International Neuroinformatics Coordinating Facility (INCF) - -DataJoint is a [company member of the INCF](https://www.incf.org/network/companies). - -In 2023, Dr. Milagros MarΓ­n and Dr. Dimitri Yatsenko presented "Research workflows for collaborative neuroscience" at INCF Neuroinformatics Assembly. - -From 2023 to 2025, Dr. Milagros MarΓ­n is a member of the INCF Council for Training, Science, and Infrastructure (CTSI) and the INCF Training and Education Committee (TEC). - -In 2024, Dr. Dimitri Yatsenko served as the Chair of the Industry Advisory Council for the INCF. - -In 2025, Dr. Milagros MarΓ­n joined the Scientific Collaboration and Education Theme Team (Neuro Community). diff --git a/src/partnerships/nwb.md b/src/partnerships/nwb.md deleted file mode 100644 index 1c06263c..00000000 --- a/src/partnerships/nwb.md +++ /dev/null @@ -1,83 +0,0 @@ -# Sustainability Roadmap between DataJoint Elements and Neurodata Without Borders - -
- - - - ![datajoint](../../images/company-logo-black.svg){: style="height:50px; padding-right:25px"} - ![NWB](../../images/community-partnerships-nwb-logo.png){: style="width:300px"} -
- -## Aim - -**DataJoint Elements** and **Neurodata Without Borders (NWB)** are two neuroinformatics - initiatives in active development. The projects develop independently yet they have - complementary aims and overlapping user communities. This document establishes key - processes for coordinating development and communications in order to promote - integration and interoperability across the two ecosystems. - -## Projects and Teams - -### DataJoint - -**DataJoint Elements** β€” https://docs.datajoint.com/elements/ β€” is a collection of - open-source reference database schemas and analysis workflows for neurophysiology - experiments, supported by **DataJoint** β€” https://docs.datajoint.com/core/ β€” an - open-source software framework. The project is funded by the NIH grant U24 NS116470 - and led by Dr. Dimitri Yatsenko. - -The principal developer of DataJoint Elements and the DataJoint framework is the company -DataJoint β€” https://datajoint.com. - -### Neurodata without Borders (NWB) - -**NWB** - https://www.nwb.org β€” is a data standard for neurophysiology, providing - neuroscientists with a common standard to share, archive, use, and build analysis - tools for neurophysiology data. The project is funded by the NIH grant U24 NS120057 - and led by Dr. Oliver Rubel (Lawrence Berkeley National Laboratory) and Dr. Benjamin - Dichter (Catalyst Neuro). - -The principal developers of NWB are the Lawrence Berkeley National Laboratory and -Catalyst Neuro. - -## General Principles - -### No obligation - -The developers of the two ecosystems acknowledge that this roadmap document creates no contractual -relationship between them but they agree to work together in the spirit of partnership -to ensure that there is a united, visible, and responsive leadership and to demonstrate -administrative and managerial commitment to coordinate development and communications. - -### Coordinated Development - -The two projects will coordinate their development approaches to ensure maximum -interoperability. This includes: - -- coordinated use of terminology and nomenclatures -- support for testing infrastructure: unit testing and integration testing -- a coordinated software release process and versioning -- coordinated resolution of issues arising from joint use of the two tools - -### Points of Contact - -To achieve the aims of coordinated development, both projects appoint a primary point of -contact (POC) to respond to questions relating to the integration and interoperability -of DataJoint Elements and NWB. - -For 2022, the DataJoint Elements POC is Dr. Kushal Bakshi (kushal@datajoint.com) - -For 2022, the NWB POC is Dr. Ryan Ly (Lawrence Berkeley National Laboratory) - -### Annual Review - -To achieve the aims of coordinated development, the principal developers conduct a joint -annual review of this roadmap document to ensure that the two programs are -well integrated and not redundant. The contents and resolutions of the review will be -made publicly available. - -### Licensing - -The two parties ensure that relevant software components are developed under licenses -that avoid any hindrance to integration and interoperability between DataJoint Elements -workflows and NWB utilities. diff --git a/src/partnerships/openephysgui.md b/src/partnerships/openephysgui.md deleted file mode 100644 index 1fe71f5f..00000000 --- a/src/partnerships/openephysgui.md +++ /dev/null @@ -1,76 +0,0 @@ -# Sustainability Roadmap between DataJoint Elements and Open Ephys GUI - -
- - - - ![datajoint](../../images/company-logo-black.svg){: style="height:50px; padding-right:25px"} - ![openephysgui](../../images/community-partnerships-openephysgui-logo.png){: style="height:87px"} -
- -## Aim - -**DataJoint Elements** and **Open Ephys GUI** are two neuroinformatics initiatives in active development. The projects develop independently yet they have complementary aims and overlapping user communities. This document establishes key processes for coordinating development and communications in order to promote integration and interoperability across the two ecosystems. - -## Projects and Teams - -### DataJoint - -**DataJoint Elements** β€” https://docs.datajoint.com/elements/ β€” is a collection of open-source reference database schemas and analysis workflows for neurophysiology experiments, supported by **DataJoint Core** β€” https://docs.datajoint.com/core/ β€” an open-source software framework. The project is funded by the NIH grant U24 NS116470 and led by Dr. Dimitri Yatsenko. - -The principal developer of DataJoint Elements and DataJoint Core is the company -DataJoint β€” https://datajoint.com. - -### Open Ephys GUI - -**Open Ephys GUI** β€” https://open-ephys.org/gui β€” is an open-source, plugin-based application for processing, visualizing, and recording data from extracellular electrodes. The project is funded by the NIH grant U24 NS109043 and led by Dr. Josh Siegle. - -The principal developers of the Open Ephys GUI are at the Allen Institute. - -## General Principles - -### No obligation - -The developers of the two ecosystems acknowledge that this roadmap document creates no contractual relationship between them but they agree to work together in the spirit of partnership to ensure that there is a united, visible, and responsive leadership and to demonstrate administrative and managerial commitment to coordinate development and communications. - -### Coordinated Development - -The two projects will coordinate their development approaches to ensure maximum interoperability. This includes: - -- coordinated use of terminology and nomenclatures -- support for testing infrastructure -- a coordinated software release process and versioning -- coordinated resolution of issues arising from joint use of the two tools - -### Points of Contact - -To achieve the aims of coordinated development, both projects appoint a primary point of -contact (POC) to respond to questions relating to the integration and interoperability -of DataJoint Elements and Open Ephys GUI. - -For 2023, the DataJoint Elements POC is Dr. Thinh Nguyen (thinh@datajoint.com). - -For 2023, the Open Ephys GUI POC is Dr. Josh Siegle (joshs@alleninstitute.org). - -### Annual Review - -To achieve the aims of coordinated development, the principal developers conduct a joint -annual review of this roadmap document to ensure that the two programs are well integrated and not redundant. The contents and resolutions of the review will be made publicly available. - -### Licensing - -The two parties ensure that relevant software components are developed under licenses -that avoid any hindrance to integration and interoperability between DataJoint Elements -and Open Ephys GUI. - -## Development Roadmap - -- [x] Mechanism to import data acquired with the Open Ephys GUI - [DataJoint Element Array Ephys - Open Ephys module](https://github.com/datajoint/element-array-ephys/blob/main/element_array_ephys/readers/openephys.py) - -- [x] Tests to verify loading of Open Ephys data - [Pytests](https://github.com/datajoint/workflow-array-ephys/blob/main/tests/test_populate.py) - -- [x] The Open Ephys team will inform the DataJoint team about any software releases that include changes to the binary data format (ongoing). - -## Citation - -If you use this package, please cite the [Open Ephys paper](https://iopscience.iop.org/article/10.1088/1741-2552/aa5eea/meta) in your publications. diff --git a/src/partnerships/suite2p.md b/src/partnerships/suite2p.md deleted file mode 100644 index dc04ab34..00000000 --- a/src/partnerships/suite2p.md +++ /dev/null @@ -1,104 +0,0 @@ -# Sustainability Roadmap between DataJoint Elements and Suite2p - -
- - - - ![datajoint](../../images/company-logo-black.svg){: style="height:50px; padding-right:25px"} - ![suite2p](../../images/community-partnerships-suite2p-logo.png){: style="height:70px"} -
- -## Aim - -**DataJoint Elements** and **Suite2p** are two neuroinformatics initiatives in active - development. The projects develop independently yet they have complementary aims and - overlapping user communities. This document establishes key processes for - coordinating development and communications in order to promote integration and - interoperability across the two ecosystems. - -## Projects and Teams - -### DataJoint - -**DataJoint Elements** β€” https://docs.datajoint.com/elements/ β€” is a collection of - open-source reference database schemas and analysis workflows for neurophysiology - experiments, supported by **DataJoint** β€” https://docs.datajoint.com/core/ β€” an - open-source software framework. The project is funded by the NIH grant U24 NS116470 - and led by Dr. Dimitri Yatsenko. - -The principal developer of DataJoint Elements and the DataJoint framework is the company -DataJoint β€” https://datajoint.com. - -### Suite2p - -**Suite2p** β€” https://www.suite2p.org β€” is a pipeline for processing calcium imaging - data. The project is funded by HHMI Janelia Research Campus and led by Dr. Carsen - Stringer and Dr. Marius Pachitariu. - -The principal developers of Suite2p are at the Janelia Research Campus. - -## General Principles - -### No obligation - -The developers of the two ecosystems acknowledge that this roadmap document creates no -contractual relationship between them but they agree to work together in the spirit of -partnership to ensure that there is a united, visible, and responsive leadership and to -demonstrate administrative and managerial commitment to coordinate development and -communications. - -### Coordinated Development - -The two projects will coordinate their development approaches to ensure maximum -interoperability. This includes: - -- coordinated use of terminology and nomenclatures -- support for testing infrastructure: unit testing and integration testing -- a coordinated software release process and versioning -- coordinated resolution of issues arising from joint use of the two tools - -### Points of Contact - -To achieve the aims of coordinated development, both projects appoint a primary point of -contact (POC) to respond to questions relating to the integration and interoperability -of DataJoint Elements and Suite2p. - -For 2022, the DataJoint Elements POC is Dr. Kushal Bakshi (kushal@datajoint.com) - -For 2022, the Suite2p POC is Dr. Carsen Stringer (stringerc@janelia.hhmi.org) - -### Annual Review - -To achieve the aims of coordinated development, the principal developers conduct a joint -annual review of this roadmap document to ensure that the two programs are -well integrated and not redundant. The contents and resolutions of the review will be -made publicly available. - -### Licensing - -The two parties ensure that relevant software components are developed under licenses -that avoid any hindrance to integration and interoperability between DataJoint Elements -and Suite2p. - -## Development Roadmap - -- [x] Mechanism to import Suite2p results - -[Element Interface Suite2p module](https://github.com/datajoint/element-interface/blob/main/element_interface/suite2p_loader.py) - -- [x] Mechanism to run Suite2p within DataJoint Element - -[Element Calcium Imaging](https://github.com/datajoint/element-calcium-imaging/blob/00df4434fcfd6c1497d7950601248f046170139e/element_calcium_imaging/imaging.py#L267-L299) - -- [x] Tutorials on running DataJoint Element with Suite2p - -[Element Calcium Imaging Jupyter notebooks](https://github.com/datajoint/element-calcium-imaging/tree/main/notebooks) - -- [x] Tests to verify loading Suite2p data - -[Pytests](https://github.com/datajoint/element-calcium-imaging/blob/main/tests/test_populate.py) - -- [x] Tests to verify running Suite2p - -[Pytests](https://github.com/datajoint/element-calcium-imaging/blob/main/tests/test_populate.py) - -## Citation - -If you use Suite2p please cite -[Pachitariu et al., bioRxiv 2017](https://www.biorxiv.org/content/10.1101/061507v2) -in your publications. diff --git a/src/projects/index.md b/src/projects/index.md deleted file mode 100644 index 6e5c15b7..00000000 --- a/src/projects/index.md +++ /dev/null @@ -1,23 +0,0 @@ -# Project Showcase - -
- -- **Select projects supported by DataJoint software** - - --- - - [:octicons-arrow-right-24: Catalog](https://catalog.datajoint.io) - -- **Research teams supported by DataJoint software** - - --- - - [:octicons-arrow-right-24: Teams](teams.md) - -- **Publications supported by DataJoint software** - - --- - - [:octicons-arrow-right-24: Publications](./publications/) - -
diff --git a/src/projects/publications.md b/src/projects/publications.md deleted file mode 100644 index 10b34127..00000000 --- a/src/projects/publications.md +++ /dev/null @@ -1,221 +0,0 @@ ---- -Title: Publications ---- - - -The following publications relied on DataJoint open-source software for data analysis. If your work uses DataJoint or DataJoint Elements, please cite the respective -[manuscripts and RRIDs](../about/citation.md). - -## 2025 - -+ Hoegberg, Z., Donahue, S., & Major, M. J. (2025). [An Open-Source Wearable System for Real-Time Human Biomechanical Analysis](https://doi.org/10.3390/s25092931). *Sensors*, 25(9), 2931. - -+ Huang, J.Y., Hess, M., Bajpai, A., Li, X., Hobson, L.N., Xu, A.J., Barton, S.J. and Lu, H.C.(2025). [From initial formation to developmental refinement: GABAergic inputs shape neuronal subnetworks in the primary somatosensory cortex](https://doi.org/10.1016/j.isci.2025.112104). *iScience*, 28(3). - -+ Evangelou, A., Diamantaki, M., Georgelou, K., Drakaki, Z., Ntanavara, L., Gerardos, G., Morou, S., Chatziris, N., Dogani, Z., Petsalaki, E.A. and Raos, O.N. (2025). [EthoPy: Reproducible Behavioral Neuroscience Made Simple](https://doi.org/10.1101/2025.09.08.673974). *bioRxiv*, 2025-09. - -+ Gillon, C.J., Baker, C., Ly, R., Balzani, E., Brunton, B.W., Schottdorf, M., Ghosh, S. and Dehghani, N.(2025). [Open data in neurophysiology: Advancements, solutions & challenges](https://doi.org/10.1523/ENEURO.0486-24.2025). *eneuro*, 12(11). - -+ Ding, Z., Fahey, P.G., Papadopoulos, S., Wang, E.Y., Celii, B., Papadopoulos, C., Chang, A., Kunin, A.B., Tran, D., Fu, J. ... & Tolias, A. S. (2025). [Functional connectomics reveals general wiring rule in mouse visual cortex](https://doi.org/10.1038/s41586-025-08840-3). *Nature*, 640(8058), 459-469. - -## 2024 - -+ Reimer, M. L., Kauer, S. D., Benson, C. A., King, J. F., Patwa, S., Feng, S., Estacion, M. A., Bangalore, L., Waxman, S. G., & Tan, A. M. (2024). [A FAIR, open-source virtual reality platform for dendritic spine analysis. Patterns](https://www.cell.com/patterns/pdf/S2666-3899(24)00183-1.pdf), 5(9). *Patterns*, 5(9). - -+ Gillon, C. J., Baker, C., Ly, R., Balzani, E., Brunton, B. W., Schottdorf, M., Ghosh, S., & Dehghani, N. (2024). [Open Data In Neurophysiology: Advancements, Solutions & Challenges](https://doi.org/10.48550/arXiv.2407.00976). ArXiv, arXiv:2407.00976v1. - -+ Mosberger, A.C., Sibener, L.J., Chen, T.X., Rodrigues, H.F., Hormigo, R., Ingram, J.N., Athalye, V.R., Tabachnik, T., Wolpert, D.M., Murray, J.M. and Costa, R.M., 2024. [Exploration biases forelimb reaching strategies](https://www.cell.com/cell-reports/fulltext/S2211-1247(24)00286-9). *Cell Reports*, 43(4). - -+ Guidera, J. A., Gramling, D. P., Comrie, A. E., Joshi, A., Denovellis, E. L., Lee, K. H., ... & Frank, L. M. (2024). [Regional specialization manifests in the reliability of neural population codes](https://doi.org/10.1101/2024.01.25.576941). *bioRxiv*, 2024-01. - -+ Lee, K. H., Denovellis, E. L., Ly, R., Magland, J., Soules, J., Comrie, A. E., Gramling, D. P., Guidera, J. A., Nevers, R., Adenekan, P., Brozdowski, C., Bray, S. R., Monroe, E., Bak, J. H., Coulter, M. E., Sun, X., Broyles, E., Shin, D., Chiang, S., Holobetz, C., … Frank, L. M. (2024).[Spyglass: a framework for reproducible and shareable neuroscience research](https://doi.org/10.1101/2024.01.25.577295) *bioRxiv* 2024.01.25.577295 - -+ Chen, S., Liu, Y., Wang, Z. A., Colonell, J., Liu, L. D., Hou, H., ... & Svoboda, K. (2024). [Brain-wide neural activity underlying memory-guided movement](https://www.cell.com/cell/pdf/S0092-8674(23)01445-9.pdf). Cell, 187(3), 676-691. - -+ Gonzalo Cogno, S., Obenhaus, H. A., Lautrup, A., Jacobsen, R. I., Clopath, C., Andersson, S. O., ... & Moser, E. I. (2024). [Minute-scale oscillatory sequences in medial entorhinal cortex](https://www.nature.com/articles/s41586-023-06864-1). *Nature*, 625(7994), 338-344. - -+ Cimorelli, A., Patel, A., Karakostas, T., & Cotton, R. J. (2024). [Validation of portable in-clinic video-based gait analysis for prosthesis users](https://www.nature.com/articles/s41598-024-53217-7). *Nature Scientific Reports*, 14(1), 3840. - -+ Papadopouli, M., Koniotakis, E., Smyrnakis, I., Savaglio, M. A., Psilou, E., Brozi, C., ... & Smirnakis, S. M. (2024). [Brain orchestra under spontaneous conditions: Identifying communication modules from the functional architecture of area V1](https://doi.org/10.1101/2024.02.29.582364). *bioRxiv*, 2024-02. - -## 2023 - -+ Celii, B., Papadopoulos, S., Ding, Z., Fahey, P. G., Wang, E., Papadopoulos, C., ... & -Reimer, J. (2023). [NEURD: automated proofreading and feature extraction for -connectomics.](https://doi.org/10.1101/2023.03.14.532674){:target="_blank"}. *bioRxiv*. 2023-03. - -+ Chen, S., Liu, Y., Wang, Z., Colonell, J., Liu, L. D., Hou, H., ... & Svoboda, K. (2023). [Brain-wide neural activity underlying memory-guided movement](https://doi.org/10.1101/2023.03.01.530520){:target="_blank"}. *bioRxiv*. 2023-03. - -+ Cotton, R. J., Cimorelli, A., Shah, K., Anarwala, S., Uhlrich, S., & Karakostas, T. (2023). [Improved Trajectory Reconstruction for Markerless Pose Estimation](https://doi.org/10.48550/arXiv.2303.02413){:target="_blank"}. *arXiv*. 2303.02413. - -+ Ding, Z., Fahey, P. G., Papadopoulos, S., Wang, E., Celii, B., Papadopoulos, C., ... & Tolias, A. S. (2023). [Functional connectomics reveals general wiring rule in mouse visual cortex](https://doi.org/10.1101/2023.03.13.531369){:target="_blank"}. bioRxiv, 2023-03. - -+ Laboratory, I. B., Bonacchi, N., Chapuis, G. A., Churchland, A. K., DeWitt, E. E., Faulkner, M., ... & Wells, M. J. (2023). [A modular architecture for organizing, processing and sharing neurophysiology data](https://doi.org/10.1038/s41592-022-01742-6){:target="_blank"}. *Nature Methods*. 1-5. - -## 2022 - -+ Wang, Y., Chiola, S., Yang, G., Russell, C., Armstrong, C. J., Wu, Y., ... & Shcheglovitov, A. (2022). [Modeling human telencephalic development and autism-associated SHANK3 deficiency using organoids generated from single neural rosettes](https://www.nature.com/articles/s41467-022-33364-z){:target="_blank"}. *Nature Communications*, 13(1), 1-25. - -+ Franke, K., Willeke, K. F., Ponder, K., Galdamez, M., Zhou, N., Muhammad, T., ... & Tolias, A. S. (2022). [State-dependent pupil dilation rapidly shifts visual feature selectivity](https://www.nature.com/articles/s41586-022-05270-3){:target="_blank"}. *Nature*, 1-7. - -+ Pettit, N. H., Yap, E., Greenberg, M. E., Harvey, C. D. (2022). [Fos ensembles encode and shape stable spatial maps in the hippocampus](https://www.nature.com/articles/s41586-022-05113-1){:target="_blank"}. *Nature*. - -+ Saunders, J. L., Ott, L. A., Wehr, M. (2022). [AUTOPILOT: Automating experiments with lots of Raspberry Pis](https://doi.org/10.1101/807693){:target="_blank"}. *bioRxiv*. - -+ Born, G. (2022). [The effect of feedback on sensory processing in the mouse early visual system](https://edoc.ub.uni-muenchen.de/30350/1/Born_Gregory.pdf){:target="_blank"}. *Doctoral dissertation*. - -+ Cobos, E., Muhammad, T., Fahey, P. G., Ding, Z., Ding, Z., Reimer, J., ... & Tolias, A. (2022). [It takes neurons to understand neurons: Digital twins of visual cortex synthesize neural metamers](https://www.biorxiv.org/content/10.1101/2022.12.09.519708v1){:target="_blank"}. *bioRxiv*, 2022-12. - -+ Cadena, S. A., Willeke, K. F., Restivo, K., Denfield, G., Sinz, F. H., Bethge, M., ... & Ecker, A. S. (2022). [Diverse task-driven modeling of macaque V4 reveals functional specialization towards semantic tasks](https://doi.org/10.1101/2022.05.18.492503){:target="_blank"}. *bioRxiv*. - -+ Cotton, R. J. (2022). [PosePipe: Open-Source Human Pose Estimation Pipeline for Clinical Research](https://doi.org/10.48550/arXiv.2203.08792){:target="_blank"}. *arXiv*. 2203.08792. - -+ Cotton, R. J., McClerklin, E., Cimorelli, A., & Patel, A. (2022). [Spatiotemporal characterization of gait from monocular videos with transformers](https://openreview.net/forum?id=dXPou9HkXcZ){:target="_blank"}. - -+ Cotton, R. J., McClerklin, E., Cimorelli, A., Patel, A., & Karakostas, T. (2022). [Transforming Gait: Video-Based Spatiotemporal Gait Analysis](https://doi.org/10.48550/arXiv.2203.09371){:target="_blank"}. *arXiv*. 2203.09371. - -+ Fu, J., Willeke, K. F., Pierzchlewicz, P. A., Muhammad, T., Denfield, G. H., Sinz, F. H., & Tolias, A. S. (2022). [Heterogeneous Orientation Tuning Across Sub-Regions of Receptive Fields of V1 Neurons in Mice](https://dx.doi.org/10.2139/ssrn.4029075){:target="_blank"}. *Available at SSRN 4029075*. - -+ Zong, W., Obenhaus, H.A., SkytΓΈen, E.R., Eneqvist, H., de Jong, N.L., Vale, R., Jorge, M.R., Moser, M.B. and Moser, E.I., 2022. [Large-scale two-photon calcium imaging in freely moving mice](https://www.sciencedirect.com/science/article/pii/S0092867422001970)(:target="_blank"}. *Cell*, 185(7), pp.1240-1256. - -+ Goetz, J., Jessen, Z. F., Jacobi, A., Mani, A., Cooler, S., Greer, D., ... & Schwartz, G. W. (2022). [Unified classification of mouse retinal ganglion cells using function, morphology, and gene expression](https://doi.org/10.1016/j.celrep.2022.111040){:target="_blank"}. *Cell reports*, 40(2), 111040. - -+ Huang, J. Y., Hess, M., Bajpai, A., Barton, S. J., Li, X., Hobson, L. N., & Lu, H. C. - (2022). [Sex-and GABAergic-modulated neuronal subnetwork assemblies in - the developing somatosensory cortex](https://doi.org/10.1101/2022.10.23.513371){:target="_blank"}. bioRxiv, 2022-10. - -+ Jaffe, A. (2022). [Optical investigation of microcircuit computations in mouse primary visual cortex](https://nrs.harvard.edu/URN-3:HUL.INSTREPOS:37371150){:target="_blank"}. *Doctoral dissertation*. - -+ Obenhaus, H.A., Zong, W., Jacobsen, R.I., Rose, T., Donato, F., Chen, L., Cheng, H., Bonhoeffer, T., Moser, M.B. & Moser, E.I. (2022). [Functional network topography of the medial entorhinal cortex](https://doi.org/10.1073/pnas.2121655119){:target="_blank"}. *Proceedings of the National Academy of Sciences*, *119* (7). - -+ Roukes, M. L. (2022, May). [The Integrated Neurophotonics Paradigm](https://opg.optica.org/viewmedia.cfm?r=1&uri=CLEO_AT-2022-ATh4I.6&seq=0){:target="_blank"}. *In CLEO: Applications and Technology* (pp. ATh4I-6). Optica Publishing Group. - -+ Sanchez, M., Moore, D., Johnson, E. C., Wester, B., Lichtman, J. W., & Gray-Roncal, W. (2022). [Connectomics Annotation Metadata Standardization for Increased Accessibility and Queryability](https://doi.org/10.3389/fninf.2022.828458){:target="_blank"}. *Frontiers in Neuroinformatics*. - -+ Spacek, M. A., Crombie, D., Bauer, Y., Born, G., Liu, X., Katzner, S., & Busse, L. (2022). [Robust effects of corticothalamic feedback and behavioral state on movie responses in mouse dLGN](https://doi.org/10.7554/eLife.70469){:target="_blank"}. *Elife*, 11, e70469. - -+ Tseng, S. Y., Chettih, S. N., Arlt, C., Barroso-Luque, R., & Harvey, C. D. (2022). [Shared and specialized coding across posterior cortical areas for dynamic navigation decisions](https://doi.org/10.1016/j.neuron.2022.05.012){:target="_blank"}. *Neuron*. - -+ Turner, N. L., Macrina, T., Bae, J. A., Yang, R., Wilson, A. M., Schneider-Mizell, C., ... & Seung, H. S. (2022). [Reconstruction of neocortex: Organelles, compartments, cells, circuits, and activity](https://doi.org/10.1016/j.cell.2022.01.023){:target="_blank"}. *Cell, 185*(6), 1082-1100. - -+ Ustyuzhaninov, I., Burg, M.F., Cadena, S.A., Fu, J., Muhammad, T., Ponder, K., Froudarakis, E., Ding, Z., Bethge, M., Tolias, A. & Ecker, A.S. (2022). [Digital twin reveals combinatorial code of non-linear computations in the mouse primary visual cortex](https://doi.org/10.1101/2022.02.10.479884){:target="_blank"}. *bioRxiv*. - -+ Willeke, K. F., Fahey, P. G., Bashiri, M., Pede, L., Burg, M. F., Blessing, C., ... & Sinz, F. H. (2022). [The Sensorium competition on predicting large-scale mouse primary visual cortex activity](https://doi.org/10.48550/arXiv.2206.08666){:target="_blank"}. *arXiv preprint arXiv:2206.08666*. - -## 2021 - -+ Bae, J. A., Baptiste, M., Bodor, A. L., Brittain, D., Buchanan, J., Bumbarger, D. J., Castro, M. A., Celii, B., Cobos, E., Collman, F., ... (2021). [Functional connectomics spanning multiple areas of mouse visual cortex](https://doi.org/10.1101/2021.07.28.454025){:target="_blank"}. *bioRxiv*. - -+ Born, G., Schneider-Soupiadis, F. A., Erisken, S., Vaiceliunaite, A., Lao, C. L., Mobarhan, M. H., Spacek, M. A., Einevoll, G. T., & Busse, L. (2021). [Corticothalamic feedback sculpts visual spatial integration in mouse thalamus](https://doi.org/10.1038/s41593-021-00943-0){:target="_blank"}. *Nature Neuroscience*, *24*(12), 1711–1720. - -+ Burg, M. F., Cadena, S. A., Denfield, G. H., Walker, E. Y., Tolias, A. S., Bethge, M., & Ecker, A. S. (2021). [Learning divisive normalization in primary visual cortex](https://doi.org/10.1371/journal.pcbi.1009028){:target="_blank"}. *PLOS Computational Biology*, *17*(6), e1009028. - -+ Claudi, F., Campagner, D., & Branco, T. (2021). [Innate heuristics and fast learning support escape route selection in mice](https://doi.org/10.1016/j.cub.2022.05.020){:target="_blank"}. *bioRxiv*. - -+ Cohrs, K.H. (2021). [Investigation of feedback mechanisms in visual cortex using deep learning models](http://dx.doi.org/10.13140/RG.2.2.35328.35845){:target="_blank"}. Master’s thesis. University of GΓΆttingen. - -+ Dennis, E. J., El Hady, A., Michaiel, A., Clemens, A., Tervo, D. R. G., Voigts, J., & Datta, S. R. (2021). [Systems neuroscience of natural behaviors in rodents](https://www.jneurosci.org/content/41/5/911.abstract). *Journal of Neuroscience*, 41(5), 911-919. - -+ Finkelstein, A., Fontolan, L., Economo, M. N., Li, N., Romani, S., & Svoboda, K. (2021). [Attractor dynamics gate cortical information flow during decision-making](https://doi.org/10.1038/s41593-021-00840-6){:target="_blank"}. *Nature Neuroscience*. *24*(6), 843-850. - -+ Franke, K., Willeke, K. F., Ponder, K., Galdamez, M., Muhammad, T., Patel, S., Froudarakis, E., Reimer, J., Sinz, F., & Tolias, A. (2021). [Behavioral state tunes mouse vision to ethological features through pupil dilation](https://doi.org/10.1101/2021.09.03.458870){:target="_blank"}. *bioRxiv*. - -+ Jacobsen, R. I., Nair, R. R., Obenhaus, H. A., Donato, F., Slettmoen, T., Moser, M.-B., & Moser, E. I. (2021). [All-viral tracing of monosynaptic inputs to single birthdate-defined neurons in the intact brain](https://doi.org/10.1016/j.crmeth.2022.100221){:target="_blank"}. *bioRxiv*. - -+ Laboratory, T. I. B., Aguillon-Rodriguez, V., Angelaki, D., Bayer, H., Bonacchi, N., Carandini, M., Cazettes, F., Chapuis, G., Churchland, A. K., Dan, Y., ... (2021). [Standardized and reproducible measurement of decision-making in mice](https://doi.org/10.7554%2FeLife.63711){:target="_blank"}. *eLife*, *10*. - -+ Strauss, S., Korympidou, M. M., Ran, Y., Franke, K., Schubert, T., Baden, T., Berens, P., Euler, T., & Vlasits, A. L. (2021). [Center-surround interactions underlie bipolar cell motion sensing in the mouse retina](https://doi.org/10.1101/2021.05.31.446404){:target="_blank"}. *bioRxiv*. - -+ Subramaniyan, M., Manivannan, S., Chelur, V., Tsetsenis, T., Jiang, E., & Dani, J. A. (2021). [Fear conditioning potentiates the hippocampal CA1 commissural pathway in vivo and increases awake phase sleep](https://doi.org/10.1002/hipo.23381){:target="_blank"}. *Hippocampus*, *31*(10), 1154–1175. - -+ Urai, A. E., Aguillon-Rodriguez, V., Laranjeira, I. C., Cazettes, F., Laboratory, T. I. B., Mainen, Z. F., & Churchland, A. K. (2021). [Citric acid water as an alternative to water restriction for high-yield mouse behavior](https://doi.org/10.1523%2FENEURO.0230-20.2020){:target="_blank"}. *Eneuro*, *8*(1). - -+ Wal, A., Klein, F. J., Born, G., Busse, L., & Katzner, S. (2021). [Evaluating visual cues modulates their representation in mouse visual and cingulate cortex](https://doi.org/10.1523/JNEUROSCI.1828-20.2021){:target="_blank"}. *Journal of Neuroscience*, *41*(15), 3531–3544. - -+ Wang, Y., Chiola, S., Yang, G., Russell, C., Armstrong, C. J., Wu, Y., Spampanato, J., Tarboton, P., Chang, A. N., Harmin, D. A., ... (2021). [Modeling autism-associated SHANK3 deficiency using human cortico-striatal organoids generated from single neural rosettes](https://doi.org/10.1101/2021.01.25.428022){:target="_blank"}. *bioRxiv*. - -## 2020 - -+ Angelaki, D. E., Ng, J., Abrego, A. M., Cham, H. X., Asprodini, E. K., Dickman, J. D., & Laurens, J. (2020). [A gravity-based three-dimensional compass in the mouse brain](https://doi.org/10.1038/s41467-020-15566-5){:target="_blank"}. *Nature Communications*, *11*(1), 1–13. - -+ Cotton, R. J., Sinz, F. H., & Tolias, A. S. (2020). [Factorized neural processes for neural processes: *K*-shot prediction of neural responses](https://doi.org/10.48550/arXiv.2010.11810){:target="_blank"}. *arXiv Preprint arXiv:2010.11810*. - -+ Heath, S. L., Christenson, M. P., Oriol, E., Saavedra-Weisenhaus, M., Kohn, J. R., & Behnia, R. (2020). [Circuit mechanisms underlying chromatic encoding in drosophila photoreceptors](https://doi.org/10.1016/j.cub.2019.11.075){:target="_blank"}. *Current Biology*. - -+ Laturnus, S., Kobak, D., & Berens, P. (2020). [A systematic evaluation of interneuron morphology representations for cell type discrimination](https://doi.org/10.1016/j.cub.2019.11.075){:target="_blank"}. *Neuroinformatics*, *18*(4), 591–609. - -+ Sinz, F. H., Sachgau, C., Henninger, J., Benda, J., & Grewe, J. (2020). [Simultaneous spike-time locking to multiple frequencies](https://doi.org/10.1152/jn.00615.2019){:target="_blank"}. *Journal of Neurophysiology*, *123*(6), 2355–2372. - -+ Yatsenko, D., Moreaux, L. C., Choi, J., Tolias, A., Shepard, K. L., & Roukes, M. L. (2020). [Signal separability in integrated neurophotonics](https://doi.org/10.1101/2020.09.27.315556){:target="_blank"}. *bioRxiv*. - -+ Zhao, Z., Klindt, D. A., Chagas, A. M., Szatko, K. P., Rogerson, L., Protti, D. A., Behrens, C., Dalkara, D., Schubert, T., Bethge, M., others. (2020). [The temporal structure of the inner retina at a single glance](https://doi.org/10.1038/s41598-020-60214-z){:target="_blank"}. *Scientific Reports*, *10*(1), 1–17. - -## 2019 - -+ Cadena, S. A., Denfield, G. H., Walker, E. Y., Gatys, L. A., Tolias, A. S., Bethge, M., & Ecker, A. S. (2019). [Deep convolutional models improve predictions of macaque V1 responses to natural images](https://doi.org/10.1371/journal.pcbi.1006897){:target="_blank"}. *PLoS Computational Biology*, *15*(4), e1006897. - -+ Chettih, S. N., & Harvey, C. D. (2019). [Single-neuron perturbations reveal feature-specific competition in V1](https://doi.org/10.1038/s41586-019-0997-6){:target="_blank"}. *Nature*, *567*(7748), 334–340. - -+ Fahey, P. G., Muhammad, T., Smith, C., Froudarakis, E., Cobos, E., Fu, J., Walker, E. Y., Yatsenko, D., Sinz, F. H., Reimer, J., ... (2019). [A global map of orientation tuning in mouse visual cortex](https://doi.org/10.1101/745323){:target="_blank"}. *bioRxiv*, 745323. - -+ Laurens, J., Abrego, A., Cham, H., Popeney, B., Yu, Y., Rotem, N., Aarse, J., Asprodini, E. K., Dickman, J. D., & Angelaki, D. E. (2019). [Multiplexed code of navigation variables in anterior limbic areas](https://doi.org/10.1101/684464){:target="_blank"}. *bioRxiv*, 684464. - -+ Liu, G., Froudarakis, E., Patel, J. M., Kochukov, M. Y., Pekarek, B., Hunt, P. J., Patel, M., Ung, K., Fu, C.-H., Jo, J., ... (2019). [Target specific functions of EPL interneurons in olfactory circuits](https://doi.org/10.1038/s41467-019-11354-y){:target="_blank"}. *Nature Communications*, *10*(1), 1–14. - -+ RosΓ³n, M. R., Bauer, Y., Kotkat, A. H., Berens, P., Euler, T., & Busse, L. (2019). [Mouse dLGN receives functional input from a diverse population of retinal ganglion cells with limited convergence](https://doi.org/10.1016/j.neuron.2019.01.040){:target="_blank"}. *Neuron*, *102*(2), 462–476. - -+ Walker, E. Y., Sinz, F. H., Cobos, E., Muhammad, T., Froudarakis, E., Fahey, P. G., Ecker, A. S., Reimer, J., Pitkow, X., & Tolias, A. S. (2019). [Inception loops discover what excites neurons most using deep predictive models](https://doi.org/10.1038/s41593-019-0517-x){:target="_blank"}. *Nature Neuroscience*, *22*(12), 2060–2065. - -## 2018 - -+ Denfield, G. H., Ecker, A. S., Shinn, T. J., Bethge, M., & Tolias, A. S. (2018). [Attentional fluctuations induce shared variability in macaque primary visual cortex](https://doi.org/10.1038/s41467-018-05123-6){:target="_blank"}. *Nature Communications*, *9*(1), 2654. - -+ Ecker, A. S., Sinz, F. H., Froudarakis, E., Fahey, P. G., Cadena, S. A., Walker, E. Y., Cobos, E., Reimer, J., Tolias, A. S., & Bethge, M. (2018). [A rotation-equivariant convolutional neural network model of primary visual cortex](https://doi.org/10.48550/arXiv.1809.10504){:target="_blank"}. *arXiv Preprint arXiv:1809.10504*. - -+ Sinz, F., Ecker, A. S., Fahey, P., Walker, E., Cobos, E., Froudarakis, E., Yatsenko, D., Pitkow, Z., Reimer, J., & Tolias, A. (2018). [Stimulus domain transfer in recurrent models for large scale cortical population prediction on video](https://dl.acm.org/doi/10.5555/3327757.3327822){:target="_blank"}. *Advances in Neural Information Processing Systems*, 7199–7210. - -+ Walker, E. Y., Sinz, F. H., Froudarakis, E., Fahey, P. G., Muhammad, T., Ecker, A. S., Cobos, E., Reimer, J., Pitkow, X., & Tolias, A. S. (2018). [Inception in visual cortex: In vivo-silico loops reveal most exciting images](https://doi.org/10.1101/506956){:target="_blank"}. *bioRxiv*, 506956. - -## 2017 - -+ Franke, K., Berens, P., Schubert, T., Bethge, M., Euler, T., & Baden, T. (2017). [Inhibition decorrelates visual feature representations in the inner retina](https://doi.org/10.1038%2Fnature21394){:target="_blank"}. *Nature*, *542*(7642), 439. - -+ Jurjut, O., Georgieva, P., Busse, L., & Katzner, S. (2017). [Learning enhances sensory processing in mouse V1 before improving behavior](https://doi.org/10.1523/JNEUROSCI.3485-16.2017){:target="_blank"}. *Journal of Neuroscience*, *37*(27), 6460–6474. - -+ Shan, K. Q., Lubenov, E. V., & Siapas, A. G. (2017). [Model-based spike sorting with a mixture of drifting t-distributions](https://doi.org/10.1016/j.jneumeth.2017.06.017){:target="_blank"}. *Journal of Neuroscience Methods*, *288*, 82–98. - -## 2016 - -+ Baden, T., Berens, P., Franke, K., RosΓ³n, M. R., Bethge, M., & Euler, T. (2016). [The functional diversity of retinal ganglion cells in the mouse](https://doi.org/10.1038%2Fnature16468){:target="_blank"}. *Nature*, *529*(7586), 345–350. - -+ Cadwell, C. R., Palasantza, A., Jiang, X., Berens, P., Deng, Q., Yilmaz, M., Reimer, J., Shen, S., Bethge, M., Tolias, K. F., others. (2016). [Electrophysiological, transcriptomic and morphologic profiling of single neurons using patch-seq](https://doi.org/10.1038%2Fnbt.3445){:target="_blank"}. *Nature Biotechnology*, *34*(2), 199–203. - -+ Hartmann, L., Drewe-Boß, P., Wießner, T., Wagner, G., Geue, S., Lee, H.-C., ObermΓΌller, D. M., Kahles, A., Behr, J., Sinz, F. H., ... (2016). [Alternative splicing substantially diversifies the transcriptome during early photomorphogenesis and correlates with the energy availability in arabidopsis](https://doi.org/10.1105%2Ftpc.16.00508){:target="_blank"}. *The Plant Cell*, *28*(11), 2715–2734. - -+ Khastkhodaei, Z., Jurjut, O., Katzner, S., & Busse, L. (2016). [Mice can use second-order, contrast-modulated stimuli to guide visual perception](https://doi.org/10.1523/JNEUROSCI.4595-15.2016){:target="_blank"}. *Journal of Neuroscience*, *36*(16), 4457–4469. - -+ Reimer, J., McGinley, M. J., Liu, Y., Rodenkirch, C., Wang, Q., McCormick, D. A., & Tolias, A. S. (2016). [Pupil fluctuations track rapid changes in adrenergic and cholinergic activity in cortex](https://doi.org/10.1038/ncomms13289){:target="_blank"}. *Nature Communications*, *7*, 13289. - -+ Shan, K. Q., Lubenov, E. V., Papadopoulou, M., & Siapas, A. G. (2016). [Spatial tuning and brain state account for dorsal hippocampal CA1 activity in a non-spatial learning task](https://doi.org/10.7554/elife.14321){:target="_blank"}. *eLife*, *5*, e14321. - -## 2015 - -+ Jiang, X., Shen, S., Cadwell, C. R., Berens, P., Sinz, F., Ecker, A. S., Patel, S., & Tolias, A. S. (2015). [Principles of connectivity among morphologically defined cell types in adult neocortex](https://doi.org/10.1126%2Fscience.aac9462){:target="_blank"}. *Science*, *350*(6264), aac9462. - -+ Yatsenko, D., JosiΔ‡, K., Ecker, A. S., Froudarakis, E., Cotton, R. J., & Tolias, A. S. (2015). [Improved estimation and interpretation of correlations in neural circuits](https://doi.org/10.1371/journal.pcbi.1004083){:target="_blank"}. *PLoS Comput Biol*, *11*(3), e1004083. - -## 2014 - -+ Ecker, A. S., Berens, P., Cotton, R. J., Subramaniyan, M., Denfield, G. H., Cadwell, C. R., Smirnakis, S. M., Bethge, M., & Tolias, A. S. (2014). [State dependence of noise correlations in macaque primary visual cortex](https://doi.org/10.1016/j.neuron.2014.02.006){:target="_blank"}. *Neuron*, *82*(1), 235–248. - -+ Erisken, S., Vaiceliunaite, A., Jurjut, O., Fiorini, M., Katzner, S., & Busse, L. (2014). [Effects of locomotion extend throughout the mouse early visual system](https://doi.org/10.1016/j.cub.2014.10.045){:target="_blank"}. *Current Biology*, *24*(24), 2899–2907. - -+ Froudarakis, E., Berens, P., Ecker, A. S., Cotton, R. J., Sinz, F. H., Yatsenko, D., Saggau, P., Bethge, M., & Tolias, A. S. (2014). [Population code in mouse V1 facilitates readout of natural scenes through increased sparseness](https://doi.org/10.1038/nn.3707){:target="_blank"}. *Nat Neurosci*, *17*(6), 851–857. - -+ Reimer, J., Froudarakis, E., Cadwell, C. R., Yatsenko, D., Denfield, G. H., & Tolias, A. S. (2014). [Pupil fluctuations track fast switching of cortical states during quiet wakefulness](https://doi.org/10.1016/j.neuron.2014.09.033){:target="_blank"}. *Neuron*, *84*(2), 355–362. - -## 2013 - -+ Cotton, R. J., Froudarakis, E., Storer, P., Saggau, P., & Tolias, A. S. (2013). [Three-dimensional mapping of microcircuit correlation structure](https://doi.org/10.3389/fncir.2013.00151){:target="_blank"}. *Frontiers in Neural Circuits*, *7*, 151. - -+ Vaiceliunaite, A., Erisken, S., Franzen, F., Katzner, S., & Busse, L. (2013). [Spatial integration in mouse primary visual cortex](https://doi.org/10.1152/jn.00138.2013){:target="_blank"}. *Journal of Neurophysiology*, *110*(4), 964–972. diff --git a/src/projects/teams.md b/src/projects/teams.md deleted file mode 100644 index b5964cf9..00000000 --- a/src/projects/teams.md +++ /dev/null @@ -1,145 +0,0 @@ - -# Projects - -DataJoint was originally developed by working systems neuroscientists at Baylor College -of Medicine to meet the needs of their own research. Below is a partial list of known teams who use DataJoint. - -## Multi-lab collaboratives - -+ International Brain Lab (GitHub) -+ Mesoscale Activity Project -+ MICrONS -+ Sainsbury Wellcome Centre Aeon -+ U19 Projects - + NYU Osmonauts - + Harvard DOPE - + Columbia MoC3 - + Princeton BRAIN CoGS (GitHub) - + Rochester-NYU-Harvard Neural basis of causal inference - -## Individual Labs and Researchers - -+ Allen Institute - + Mindscope Program - + Karel Svoboda Lab - + Forrest Collman -+ Arizona State University - + Rick Gerkin Lab -+ Baylor College of Medicine - + Nuo Li Lab - + Matthew McGinley Lab - + Paul Pfaffinger Lab - + Jacob Reimer Lab - + Andreas Tolias Lab -+ Boston University - + Jerry Chen Lab - + Benjamin Scott Lab -+ California Institute of Technology - + Roukes Group - + Siapas Lab -+ Columbia University's Zuckerman Institute - + Mark Churchland Lab - + Elizabeth Hillman Lab - + Rui Costa Lab -+ EPFL - + Mackenzie Mathis Lab -+ FORTH - + Emmanouil Froudarakis Lab (GitHub) -+ Friedrich Miescher Institute for Biomedical Research: FMI - + Andreas Luthi Lab -+ Harvard Medical School - + Jan Drugowitsch Lab - + Datta Lab - + Harvey Lab - + Sabatini Lab - + Stelios Smirnakis Lab -+ Indiana University - + Lu Lab -+ Janelia Research Campus - + Emily Dennis Lab - + Sue Ann Koay Lab -+ Johns Hopkins University - + Applied Physics Lab (GitHub) - + Marshall Shuler -+ Ludwig-Maximilians-UniversitΓ€t MΓΌnchen - + Busse Lab - + Katzner Lab -+ MIT - + Fan Wang Lab -+ National Institutes of Health - + Eric E. Thomson - + Joshua Gordon Lab / David Kupferschmidt -+ New York University - + Dora Angelaki Lab -+ New York University Langone Medical Center - + Tanya Sippy Lab -+ Netherlands Neuroscience Institute - + Chris Van Der Togt (Github) - 7 labs. - -+ Northwestern University - + James Cotton Lab (GitHub) - + Gregory Schwartz Lab (GitHub) - + Lucas Pinto Lab -+ Princeton University - + Carlos Brody Lab - + David Tank Lab - + Ilana Witten Lab - + Tatiana Engel Lab - + Jonathan Pillow Lab - + Seung Lab -+ Norwegian University for Science and Technology - Kavli Institute for Systems Neuroscience - + Moser Group - + Horst Obenhaus -+ Sainsbury Wellcome Centre - + Tiago Branco Lab (GitHub) -+ Stanford University - + Karl Deisseroth Lab - + Shaul Druckmann Lab -+ Tel-Aviv University - + Arseny Finkelstein Lab (GitHub) - + Pablo Blinder Lab (GitHub) -+ [IFR-National Center for Biological Sciences, Bengaluru](https://www.ncbs.res.in/) - + [Abhilasha Joshi](https://profiles.ucsf.edu/abhilasha.joshi) -+ University of Bonn - + Tobias Rose Lab - + Mormann Workgroup -+ University of California, Los Angeles - + Anne Churchland Lab -+ University of California, San Diego - + David Kleinfeld Lab (GitHub) -+ University of California, San Francisco - + Loren Frank Lab - + Cathryn Cadwell Lab -+ University of Houston - + Lauri Nurminen Lab -+ University of Oregon - + Santiago Jaramillo Lab (GitHub) - + Michael Wehr Lab (GitHub) -+ University of Pennsylvania School of Medicine - + John A. Dani -+ University of Rochester - + Greg DeAngelis Lab - + Ralf Haefner Lab -+ UniversitΓ€t TΓΌbingen - + Berens Lab - + Euler Lab - + Macke Lab (GitHub) -+ University of Utah - + Oleksandr Shcheglovitov Lab (GitHub) - + Jan Kubanek Lab - -+ University of Valencia - + Kai-Hendrik Cohrs - -+ University of Washington - + Edgar Y. Walker Lab - + Tuthill Lab - + Anne Gillespie Lab - -+ University of Zurich - + Fritjof Helmchen Lab - -+ Wilhelm Schickard Institute for Computer Science - + Sinz Lab - + Bethge Lab -+ ... and more labs diff --git a/src/reference/configuration.md b/src/reference/configuration.md new file mode 100644 index 00000000..30b07d92 --- /dev/null +++ b/src/reference/configuration.md @@ -0,0 +1,244 @@ +# Configuration Reference + +DataJoint configuration options and settings. + +## Configuration Sources + +Configuration is loaded in priority order: + +1. **Environment variables** (highest priority) +2. **Secrets directory** (`.secrets/`) +3. **Config file** (`datajoint.json`) +4. **Defaults** (lowest priority) + +## Database Settings + +| Setting | Environment | Default | Description | +|---------|-------------|---------|-------------| +| `database.host` | `DJ_HOST` | `localhost` | MySQL server hostname | +| `database.port` | `DJ_PORT` | `3306` | MySQL server port | +| `database.user` | `DJ_USER` | β€” | Database username | +| `database.password` | `DJ_PASS` | β€” | Database password | +| `database.reconnect` | β€” | `True` | Auto-reconnect on connection loss | +| `database.use_tls` | β€” | `None` | Enable TLS encryption | + +## Connection Settings + +| Setting | Default | Description | +|---------|---------|-------------| +| `connection.init_function` | `None` | SQL function to run on connect | +| `connection.charset` | `""` | Character set (pymysql default) | + +## Stores Configuration + +Unified storage configuration for all external storage types (``, ``, ``, ``, ``). + +**Default stores:** + +DataJoint uses two default settings to reflect the architectural distinction between integrated and reference storage: + +| Setting | Default | Description | +|---------|---------|-------------| +| `stores.default` | β€” | Default store for integrated storage (``, ``, ``, ``) | +| `stores.filepath_default` | β€” | Default store for filepath references (``) β€” often different from `stores.default` | + +**Why separate defaults?** Hash and schema-addressed storage are integrated into the Object-Augmented Schema (OAS)β€”DataJoint manages paths, lifecycle, and integrity. Filepath storage is user-managed references to existing filesβ€”DataJoint only stores the path. These are architecturally distinct and often use different storage locations. + +**Common settings (all protocols):** + +| Setting | Required | Description | +|---------|----------|-------------| +| `stores..protocol` | Yes | Storage protocol: `file`, `s3`, `gcs`, `azure` | +| `stores..location` | Yes | Base path or prefix (includes project context) | +| `stores..hash_prefix` | No | Path prefix for hash-addressed section (default: `"_hash"`) | +| `stores..schema_prefix` | No | Path prefix for schema-addressed section (default: `"_schema"`) | +| `stores..filepath_prefix` | No | Required path prefix for filepath section, or `null` for unrestricted (default: `null`) | +| `stores..subfolding` | No | Directory nesting for hash-addressed storage, e.g., `[2, 2]` (default: no subfolding) | +| `stores..partition_pattern` | No | Path partitioning for schema-addressed storage, e.g., `"subject_id/session_date"` (default: no partitioning) | +| `stores..token_length` | No | Random token length for schema-addressed filenames (default: `8`) | + +**Storage sections:** + +Each store is divided into sections defined by prefix configuration. The `*_prefix` parameters set the path prefix for each storage section: + +- **`hash_prefix`**: Defines the hash-addressed section for `` and `` (default: `"_hash"`) +- **`schema_prefix`**: Defines the schema-addressed section for `` and `` (default: `"_schema"`) +- **`filepath_prefix`**: Optionally restricts the filepath section for `` (default: `null` = unrestricted) + +Prefixes must be mutually exclusive (no prefix can be a parent/child of another). This allows mapping DataJoint to existing storage layouts: + +```json +{ + "stores": { + "legacy": { + "protocol": "file", + "location": "/data/existing_storage", + "hash_prefix": "content_addressed", // Path prefix for hash section + "schema_prefix": "structured_data", // Path prefix for schema section + "filepath_prefix": "raw_files" // Path prefix for filepath section + } + } +} +``` + +**S3-specific settings:** + +| Setting | Required | Description | +|---------|----------|-------------| +| `stores..endpoint` | Yes | S3 endpoint URL (e.g., `s3.amazonaws.com`) | +| `stores..bucket` | Yes | Bucket name | +| `stores..access_key` | Yes | S3 access key ID | +| `stores..secret_key` | Yes | S3 secret access key | +| `stores..secure` | No | Use HTTPS (default: `True`) | + +**GCS-specific settings:** + +| Setting | Required | Description | +|---------|----------|-------------| +| `stores..bucket` | Yes | GCS bucket name | +| `stores..token` | Yes | Authentication token path | +| `stores..project` | No | GCS project ID | + +**Azure-specific settings:** + +| Setting | Required | Description | +|---------|----------|-------------| +| `stores..container` | Yes | Azure container name | +| `stores..account_name` | Yes | Storage account name | +| `stores..account_key` | Yes | Storage account key | +| `stores..connection_string` | No | Alternative to account_name + account_key | + +**How storage methods use stores:** + +- **Hash-addressed** (``, ``): `{location}/{hash_prefix}/{schema}/{hash}` with optional subfolding +- **Schema-addressed** (``, ``): `{location}/{schema_prefix}/{partition}/{schema}/{table}/{key}/{field}.{token}.{ext}` with optional partitioning +- **Filepath** (``): `{location}/{filepath_prefix}/{user_path}` (user-managed, cannot use hash or schema prefixes) + +All storage methods share the same stores and default store. DataJoint reserves the configured `hash_prefix` and `schema_prefix` sections for managed storage; `` references can use any other paths (unless `filepath_prefix` is configured to restrict them). + +**Path structure examples:** + +Without partitioning: +``` +{location}/_hash/{schema}/ab/cd/abcd1234... # hash-addressed with subfolding +{location}/_schema/{schema}/{table}/{key}/data.x8f2a9b1.zarr # schema-addressed, no partitioning +``` + +With `partition_pattern: "subject_id/session_date"`: +``` +{location}/_schema/subject_id=042/session_date=2024-01-15/{schema}/{table}/{remaining_key}/data.x8f2a9b1.zarr +``` + +If table lacks partition attributes, it follows normal path structure. + +**Credentials should be stored in secrets:** + +``` +.secrets/ +β”œβ”€β”€ stores.main.access_key +β”œβ”€β”€ stores.main.secret_key +β”œβ”€β”€ stores.archive.access_key +└── stores.archive.secret_key +``` + +## Jobs Settings + +| Setting | Default | Description | +|---------|---------|-------------| +| `jobs.auto_refresh` | `True` | Auto-refresh job queue on populate | +| `jobs.keep_completed` | `False` | Retain success records in jobs table | +| `jobs.stale_timeout` | `3600` | Seconds before stale job cleanup | +| `jobs.default_priority` | `5` | Default priority (0-255, lower = more urgent) | +| `jobs.version_method` | `None` | Version tracking: `git`, `none`, or `None` (disabled) | +| `jobs.add_job_metadata` | `False` | Add hidden metadata to computed tables | +| `jobs.allow_new_pk_fields_in_computed_tables` | `False` | Allow non-FK primary key fields | + +## Display Settings + +| Setting | Default | Description | +|---------|---------|-------------| +| `display.limit` | `12` | Max rows to display | +| `display.width` | `14` | Column width | +| `display.show_tuple_count` | `True` | Show row count in output | + +## Top-Level Settings + +| Setting | Environment | Default | Description | +|---------|-------------|---------|-------------| +| `loglevel` | `DJ_LOG_LEVEL` | `INFO` | Log level: `DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL` | +| `safemode` | β€” | `True` | Require confirmation for destructive operations | +| `enable_python_native_blobs` | β€” | `True` | Allow Python-native blob serialization | +| `cache` | β€” | `None` | Path for query result cache | +| `query_cache` | β€” | `None` | Path for compiled query cache | +| `download_path` | β€” | `.` | Download location for attachments/filepaths | + +## Example Configuration + +### datajoint.json (Non-sensitive settings) + +```json +{ + "database.host": "mysql.example.com", + "database.port": 3306, + "stores": { + "default": "main", + "filepath_default": "raw_data", + "main": { + "protocol": "s3", + "endpoint": "s3.amazonaws.com", + "bucket": "datajoint-bucket", + "location": "neuroscience-lab/production", + "partition_pattern": "subject_id/session_date", + "token_length": 8 + }, + "archive": { + "protocol": "s3", + "endpoint": "s3.amazonaws.com", + "bucket": "archive-bucket", + "location": "neuroscience-lab/long-term", + "subfolding": [2, 2] + }, + "raw_data": { + "protocol": "file", + "location": "/mnt/acquisition", + "filepath_prefix": "recordings" + } + }, + "jobs": { + "add_job_metadata": true + } +} +``` + +### .secrets/ (Credentials - never commit!) + +``` +.secrets/ +β”œβ”€β”€ database.user # analyst +β”œβ”€β”€ database.password # dbpass123 +β”œβ”€β”€ stores.main.access_key # AKIAIOSFODNN7EXAMPLE +β”œβ”€β”€ stores.main.secret_key # wJalrXUtnFEMI/K7MDENG... +β”œβ”€β”€ stores.archive.access_key # AKIAIOSFODNN8EXAMPLE +└── stores.archive.secret_key # xKbmsYVuoGFNJ/L8NEOH... +``` + +Add `.secrets/` to `.gitignore`: + +```bash +echo ".secrets/" >> .gitignore +``` + +### Environment Variables (Alternative to .secrets/) + +```bash +# Database +export DJ_HOST=mysql.example.com +export DJ_USER=analyst +export DJ_PASS=secret +``` + +**Note:** Per-store credentials must be configured in `datajoint.json` or `.secrets/` β€” environment variable overrides are not supported for nested store configurations. + +## API Reference + +See [Settings API](../api/datajoint/settings.md) for programmatic access. diff --git a/src/reference/definition-syntax.md b/src/reference/definition-syntax.md new file mode 100644 index 00000000..da307626 --- /dev/null +++ b/src/reference/definition-syntax.md @@ -0,0 +1,136 @@ +# Table Definition Syntax + +DataJoint's declarative table definition language. + +## Basic Structure + +```python +@schema +class TableName(dj.Manual): + definition = """ + # Table comment + primary_attr1 : type # comment + primary_attr2 : type # comment + --- + secondary_attr1 : type # comment + secondary_attr2 = default : type # comment with default + """ +``` + +## Grammar + +``` +definition = [comment] pk_section "---" secondary_section +pk_section = attribute_line+ +secondary_section = attribute_line* + +attribute_line = [foreign_key | attribute] +foreign_key = "->" table_reference [alias] +attribute = [default "="] name ":" type [# comment] + +default = NULL | literal | CURRENT_TIMESTAMP +type = core_type | codec_type | native_type +core_type = int32 | float64 | varchar(n) | ... +codec_type = "<" name ["@" [store]] ">" +``` + +## Foreign Keys + +```python +-> ParentTable # Inherit all PK attributes +-> ParentTable.proj(new='old') # Rename attributes +``` + +## Attribute Types + +### Core Types + +```python +mouse_id : int32 # 32-bit integer +weight : float64 # 64-bit float +name : varchar(100) # Variable string up to 100 chars +is_active : bool # Boolean +created : datetime # Date and time +data : json # JSON document +``` + +### Codec Types + +```python +image : # Serialized Python object (in DB) +large_array : # Serialized Python object (external) +config_file : # File attachment (in DB) +data_file : # File attachment (named store) +zarr_data : # Path-addressed folder +raw_path : # Portable file reference +``` + +## Defaults + +```python +status = "pending" : varchar(20) # String default +count = 0 : int32 # Numeric default +notes = '' : varchar(1000) # Empty string default (preferred for strings) +created = CURRENT_TIMESTAMP : datetime # Auto-timestamp +ratio = NULL : float64 # Nullable (only NULL can be default) +``` + +**Nullable attributes:** An attribute is nullable if and only if its default is `NULL`. +DataJoint does not allow other defaults for nullable attributesβ€”this prevents ambiguity +about whether an attribute is optional. For strings, prefer empty string `''` as the +default rather than `NULL`. + +## Comments + +```python +# Table-level comment (first line) +mouse_id : int32 # Inline attribute comment +``` + +## Indexes + +```python +definition = """ + ... + --- + ... + INDEX (attr1) # Single-column index + INDEX (attr1, attr2) # Composite index + UNIQUE INDEX (email) # Unique constraint + """ +``` + +## Complete Example + +```python +@schema +class Session(dj.Manual): + definition = """ + # Experimental session + -> Subject + session_idx : int32 # Session number for this subject + --- + session_date : date # Date of session + -> [nullable] Experimenter # Optional experimenter + notes = '' : varchar(1000) # Session notes + start_time : datetime # Session start + duration : float64 # Duration in minutes + INDEX (session_date) + """ +``` + +## Validation + +DataJoint validates definitions at declaration time: + +- Primary key must have at least one attribute +- Attribute names must be valid identifiers +- Types must be recognized +- Foreign key references must exist +- No circular dependencies allowed + +## See Also + +- [Primary Keys](specs/primary-keys.md) β€” Key determination rules +- [Type System](specs/type-system.md) β€” Type architecture +- [Codec API](specs/codec-api.md) β€” Custom types diff --git a/src/reference/errors.md b/src/reference/errors.md new file mode 100644 index 00000000..740ca951 --- /dev/null +++ b/src/reference/errors.md @@ -0,0 +1,204 @@ +# Error Reference + +DataJoint exception classes and their meanings. + +## Exception Hierarchy + +``` +Exception +└── DataJointError + β”œβ”€β”€ LostConnectionError + β”œβ”€β”€ QueryError + β”‚ β”œβ”€β”€ QuerySyntaxError + β”‚ β”œβ”€β”€ AccessError + β”‚ β”œβ”€β”€ DuplicateError + β”‚ β”œβ”€β”€ IntegrityError + β”‚ β”œβ”€β”€ UnknownAttributeError + β”‚ └── MissingAttributeError + β”œβ”€β”€ MissingTableError + β”œβ”€β”€ MissingExternalFile + └── BucketInaccessible +``` + +## Base Exception + +### DataJointError + +Base class for all DataJoint-specific errors. + +```python +try: + # DataJoint operation +except dj.DataJointError as e: + print(f"DataJoint error: {e}") +``` + +## Connection Errors + +### LostConnectionError + +Database connection was lost during operation. + +**Common causes:** +- Network interruption +- Server timeout +- Server restart + +**Resolution:** +- Check network connectivity +- Reconnect with `dj.conn().connect()` + +## Query Errors + +### QuerySyntaxError + +Invalid query syntax. + +**Common causes:** +- Malformed restriction string +- Invalid attribute reference +- SQL syntax error in projection + +### AccessError + +Insufficient database privileges. + +**Common causes:** +- User lacks SELECT/INSERT/DELETE privileges +- Schema access not granted + +**Resolution:** +- Contact database administrator +- Check user grants + +### DuplicateError + +Attempt to insert duplicate primary key. + +```python +try: + table.insert1({'id': 1, 'name': 'Alice'}) + table.insert1({'id': 1, 'name': 'Bob'}) # Raises DuplicateError +except dj.errors.DuplicateError: + print("Entry already exists") +``` + +**Resolution:** +- Use `insert(..., skip_duplicates=True)` +- Use `insert(..., replace=True)` to update +- Check if entry exists before inserting + +### IntegrityError + +Foreign key constraint violation. + +**Common causes:** +- Inserting row with non-existent parent +- Parent row deletion blocked by children + +**Resolution:** +- Insert parent rows first +- Use cascade delete for parent + +### UnknownAttributeError + +Referenced attribute doesn't exist. + +```python +# Raises UnknownAttributeError +table.to_arrays('nonexistent_column') +``` + +**Resolution:** +- Check `table.heading` for available attributes +- Verify spelling + +### MissingAttributeError + +Required attribute not provided in insert. + +```python +# Raises MissingAttributeError if 'name' is required +table.insert1({'id': 1}) # Missing 'name' +``` + +**Resolution:** +- Provide all required attributes +- Set default values in definition + +## Table Errors + +### MissingTableError + +Table not declared in database. + +**Common causes:** +- Schema not created +- Table class not instantiated +- Database dropped + +**Resolution:** +- Check schema exists: `schema.is_activated()` +- Verify table declaration + +## Storage Errors + +### MissingExternalFile + +External file managed by DataJoint is missing. + +**Common causes:** +- File manually deleted from store +- Store misconfigured +- Network/permission issues + +**Resolution:** +- Check store configuration +- Verify file exists at expected path +- Run garbage collection audit + +### BucketInaccessible + +S3 bucket cannot be accessed. + +**Common causes:** +- Invalid credentials +- Bucket doesn't exist +- Network/firewall issues + +**Resolution:** +- Verify AWS credentials +- Check bucket name and region +- Test with AWS CLI + +## Handling Errors + +### Catching Specific Errors + +```python +import datajoint as dj + +try: + table.insert1(data) +except dj.errors.DuplicateError: + print("Entry exists, skipping") +except dj.errors.IntegrityError: + print("Parent entry missing") +except dj.DataJointError as e: + print(f"Other DataJoint error: {e}") +``` + +### Error Information + +```python +try: + table.insert1(data) +except dj.DataJointError as e: + print(f"Error type: {type(e).__name__}") + print(f"Message: {e}") + print(f"Args: {e.args}") +``` + +## See Also + +- [API: errors module](../api/datajoint/errors.md) diff --git a/src/reference/index.md b/src/reference/index.md new file mode 100644 index 00000000..f1c49a54 --- /dev/null +++ b/src/reference/index.md @@ -0,0 +1,35 @@ +# Reference + +Specifications, API documentation, and technical details. + +## Specifications + +Detailed specifications of DataJoint's behavior and semantics. + +- [Primary Key Rules](specs/primary-keys.md) β€” How primary keys are determined in query results +- [Semantic Matching](specs/semantic-matching.md) β€” Attribute lineage and homologous matching +- [Type System](specs/type-system.md) β€” Core types, codecs, and storage modes +- [Codec API](specs/codec-api.md) β€” Creating custom attribute types +- [Object Store Configuration](specs/object-store-configuration.md) β€” Store configuration, path generation, and integrated storage models +- [AutoPopulate](specs/autopopulate.md) β€” Jobs 2.0 specification +- [Fetch API](specs/fetch-api.md) β€” Data retrieval methods +- [Job Metadata](specs/job-metadata.md) β€” Hidden job tracking columns + +## Quick Reference + +- [Configuration](configuration.md) β€” All `dj.config` options +- [Definition Syntax](definition-syntax.md) β€” Table definition grammar +- [Operators](operators.md) β€” Query operator summary +- [Errors](errors.md) β€” Exception types and meanings + +## Elements + +Curated pipeline modules for neurophysiology experiments. + +- [DataJoint Elements](../elements/index.md) β€” Pre-built pipelines for calcium imaging, electrophysiology, behavior tracking, and more + +## API Documentation + +Auto-generated from source code docstrings. + +- [API Index](../api/index.md) diff --git a/src/reference/operators.md b/src/reference/operators.md new file mode 100644 index 00000000..3b8849f1 --- /dev/null +++ b/src/reference/operators.md @@ -0,0 +1,322 @@ +# Query Operators Reference + +DataJoint provides a small set of operators for querying data. All operators return new query expressions without modifying the originalβ€”queries are immutable and composable. + +## Operator Summary + +| Operator | Syntax | Description | +|----------|--------|-------------| +| Restriction | `A & condition` | Select rows matching condition | +| Anti-restriction | `A - condition` | Select rows NOT matching condition | +| Projection | `A.proj(...)` | Select, rename, or compute attributes | +| Join | `A * B` | Combine tables on matching attributes | +| Extension | `A.extend(B)` | Add attributes from B, keeping all rows of A | +| Aggregation | `A.aggr(B, ...)` | Group B by A's primary key and compute summaries | +| Union | `A + B` | Combine entity sets | + +--- + +## Restriction (`&`) + +Select rows that match a condition. + +```python +# String condition (SQL expression) +Session & "session_date > '2024-01-01'" +Session & "duration BETWEEN 30 AND 60" + +# Dictionary (exact match) +Session & {'subject_id': 'M001'} +Session & {'subject_id': 'M001', 'session_idx': 1} + +# Query expression (matching keys) +Session & Subject # Sessions for subjects in Subject table +Session & (Subject & "sex = 'M'") # Sessions for male subjects + +# List (OR of conditions) +Session & [{'subject_id': 'M001'}, {'subject_id': 'M002'}] +``` + +**Chaining**: Multiple restrictions combine with AND: +```python +Session & "duration > 30" & {'experimenter': 'alice'} +``` + +### Top N Rows (`dj.Top`) + +Restrict to the top N rows with optional ordering: + +```python +# First row by primary key +Session & dj.Top() + +# First 10 rows by primary key (ascending) +Session & dj.Top(10) + +# First 10 rows by primary key (descending) +Session & dj.Top(10, 'KEY DESC') + +# Top 5 by score descending +Result & dj.Top(5, 'score DESC') + +# Top 10 most recent sessions +Session & dj.Top(10, 'session_date DESC') + +# Pagination: skip 20, take 10 +Session & dj.Top(10, 'session_date DESC', offset=20) + +# All rows ordered (no limit) +Session & dj.Top(None, 'session_date DESC') +``` + +**Parameters**: +- `limit` (default=1): Maximum rows. Use `None` for no limit. +- `order_by` (default="KEY"): Attribute(s) to sort by. `"KEY"` expands to all primary key attributes. Add `DESC` for descending order (e.g., `"KEY DESC"`, `"score DESC"`). Use `None` to inherit existing order. +- `offset` (default=0): Rows to skip. + +**Chaining Tops**: When chaining multiple Top restrictions, the second Top can inherit the first's ordering by using `order_by=None`: + +```python +# First Top sets the order, second inherits it +(Session & dj.Top(100, 'date DESC')) & dj.Top(10, order_by=None) +# Result: top 10 of top 100 by date descending +``` + +**Note**: `dj.Top` can only be used with restriction (`&`), not with anti-restriction (`-`). + +--- + +## Anti-Restriction (`-`) + +Select rows that do NOT match a condition. + +```python +# Subjects without any sessions +Subject - Session + +# Sessions not from subject M001 +Session - {'subject_id': 'M001'} + +# Sessions without trials +Session - Trial +``` + +--- + +## Projection (`.proj()`) + +Select, rename, or compute attributes. Primary key is always included. + +```python +# Primary key only +Subject.proj() + +# Specific attributes +Subject.proj('species', 'sex') + +# All attributes +Subject.proj(...) + +# All except some +Subject.proj(..., '-notes', '-internal_id') + +# Rename attribute +Subject.proj(animal_species='species') + +# Computed attribute (SQL expression) +Subject.proj(weight_kg='weight / 1000') +Session.proj(year='YEAR(session_date)') +Trial.proj(is_correct='response = stimulus') +``` + +--- + +## Join (`*`) + +Combine tables on shared attributes. DataJoint matches attributes by **semantic matching**β€”only attributes with the same name AND same origin (through foreign keys) are matched. + +```python +# Join Subject and Session on subject_id +Subject * Session + +# Three-way join +Subject * Session * Experimenter + +# Join then restrict +(Subject * Session) & "sex = 'M'" + +# Restrict then join (equivalent) +(Subject & "sex = 'M'") * Session +``` + +**Primary key of result**: Determined by functional dependencies between operands. See [Query Algebra Specification](specs/query-algebra.md) for details. + +--- + +## Extension (`.extend()`) + +Add attributes from another table while preserving all rows. This is useful for adding optional attributes. + +```python +# Add experimenter info to sessions +# Sessions without an experimenter get NULL values +Session.extend(Experimenter) +``` + +**Requirement**: The left operand must "determine" the right operandβ€”all of B's primary key attributes must exist in A. + +--- + +## Aggregation (`.aggr()`) + +Group one entity type by another and compute summary statistics. + +```python +# Count trials per session +Session.aggr(Session.Trial, n_trials='count(trial_idx)') + +# Multiple aggregates +Session.aggr( + Session.Trial, + n_trials='count(trial_idx)', + n_correct='sum(correct)', + avg_rt='avg(reaction_time)', + min_rt='min(reaction_time)', + max_rt='max(reaction_time)' +) + +# Count sessions per subject +Subject.aggr(Session, n_sessions='count(session_idx)') +``` + +**Default behavior**: Keeps all rows from the grouping table (left operand), even those without matches. Use `count(pk_attribute)` to get 0 for entities without matches. + +```python +# All subjects, including those with 0 sessions +Subject.aggr(Session, n_sessions='count(session_idx)') + +# Only subjects with at least one session +Subject.aggr(Session, n_sessions='count(session_idx)', exclude_nonmatching=True) +``` + +### Common Aggregate Functions + +| Function | Description | +|----------|-------------| +| `count(attr)` | Count non-NULL values | +| `count(*)` | Count all rows (including NULL) | +| `sum(attr)` | Sum of values | +| `avg(attr)` | Average | +| `min(attr)` | Minimum | +| `max(attr)` | Maximum | +| `std(attr)` | Standard deviation | +| `group_concat(attr)` | Concatenate values | + +--- + +## Union (`+`) + +Combine entity sets from two tables with the same primary key. + +```python +# All subjects that are either mice or rats +Mouse + Rat +``` + +**Requirements**: +- Same primary key attributes +- No overlapping secondary attributes + +--- + +## Universal Set (`dj.U()`) + +Create ad-hoc groupings or extract unique values. + +### Unique Values + +```python +# Unique species +dj.U('species') & Subject + +# Unique (year, month) combinations +dj.U('year', 'month') & Session.proj(year='YEAR(session_date)', month='MONTH(session_date)') +``` + +### Aggregation by Non-Primary-Key Attributes + +```python +# Count sessions by date (session_date is not a primary key) +dj.U('session_date').aggr(Session, n='count(session_idx)') + +# Count by experimenter +dj.U('experimenter_id').aggr(Session, n='count(session_idx)') +``` + +### Universal Aggregation (Single Row Result) + +```python +# Total count across all sessions +dj.U().aggr(Session, total='count(*)') + +# Global statistics +dj.U().aggr(Trial, + total='count(*)', + avg_rt='avg(reaction_time)', + std_rt='std(reaction_time)' +) +``` + +--- + +## Operator Precedence + +Python operator precedence applies: + +| Precedence | Operator | Operation | +|------------|----------|-----------| +| Highest | `*` | Join | +| | `+`, `-` | Union, Anti-restriction | +| Lowest | `&` | Restriction | + +Use parentheses to make intent clear: + +```python +# Join happens before restriction +Subject * Session & condition # Same as: (Subject * Session) & condition + +# Use parentheses to restrict first +(Subject & condition) * Session +``` + +--- + +## Semantic Matching + +DataJoint uses **semantic matching** for joins and restrictions by query expression. Attributes match only if they have: + +1. The same name +2. The same origin (traced through foreign key lineage) + +This prevents accidental matches on attributes that happen to share names but represent different things (like generic `id` columns in unrelated tables). + +```python +# These match on subject_id because Session references Subject +Subject * Session # Correct: subject_id has same lineage + +# These would error if both have 'name' from different origins +Student * Course # Error if both define their own 'name' attribute +``` + +**Resolution**: Rename attributes to avoid conflicts: +```python +Student * Course.proj(..., course_name='name') +``` + +--- + +## See Also + +- [Query Algebra Specification](specs/query-algebra.md) β€” Complete formal specification +- [Fetch API](specs/fetch-api.md) β€” Retrieving query results +- [Queries Tutorial](../tutorials/basics/04-queries.ipynb) β€” Hands-on examples diff --git a/src/reference/specs/autopopulate.md b/src/reference/specs/autopopulate.md new file mode 100644 index 00000000..6d0c8a9f --- /dev/null +++ b/src/reference/specs/autopopulate.md @@ -0,0 +1,980 @@ +# AutoPopulate Specification + +## Overview + +AutoPopulate is DataJoint's mechanism for automated computation. Tables that inherit from `dj.Computed` or `dj.Imported` automatically populate themselves by executing a `make()` method for each entry defined by their dependencies. + +This specification covers: +- The populate process and key source calculation +- Transaction management and atomicity +- The `make()` method and tripartite pattern +- Part tables in computed results +- Distributed computing with job reservation + +--- + +## 1. Auto-Populated Tables + +### 1.1 Table Types + +| Type | Base Class | Purpose | +|------|------------|---------| +| Computed | `dj.Computed` | Results derived from other DataJoint tables | +| Imported | `dj.Imported` | Data ingested from external sources (files, instruments) | + +Both types share the same AutoPopulate mechanism. The distinction is semanticβ€”`Imported` indicates external data sources while `Computed` indicates derivation from existing tables. + +### 1.2 Basic Structure + +```python +@schema +class FilteredImage(dj.Computed): + definition = """ + -> RawImage + --- + filtered : + """ + + def make(self, key): + # Fetch source data + raw = (RawImage & key).fetch1('image') + + # Compute result + filtered = apply_filter(raw) + + # Insert result + self.insert1({**key, 'filtered': filtered}) +``` + +### 1.3 Primary Key Constraint + +Auto-populated tables must have primary keys composed entirely of foreign key references: + +```python +# Correct: all PK attributes from foreign keys +@schema +class Analysis(dj.Computed): + definition = """ + -> Session + -> AnalysisMethod + --- + result : float64 + """ + +# Error: non-FK primary key attribute +@schema +class Analysis(dj.Computed): + definition = """ + -> Session + method : varchar(32) # Not allowed - use FK to lookup table + --- + result : float64 + """ +``` + +**Rationale:** This ensures each computed entry is uniquely determined by its upstream dependencies, enabling automatic key source calculation and precise job tracking. + +--- + +## 2. Key Source Calculation + +### 2.1 Definition + +The `key_source` property defines which entries should exist in the tableβ€”the complete set of primary keys that `make()` should be called with. + +### 2.2 Automatic Key Source + +By default, DataJoint automatically calculates `key_source` as the join of all tables referenced by foreign keys in the primary key: + +```python +@schema +class SpikeDetection(dj.Computed): + definition = """ + -> Recording + -> DetectionMethod + --- + spike_times : + """ + # Automatic key_source = Recording * DetectionMethod +``` + +**Calculation rules:** +1. Identify all foreign keys in the primary key section +2. Join the referenced tables: `Parent1 * Parent2 * ...` +3. Project to primary key attributes only + +For a table with definition: +```python +-> Session +-> Probe +-> SortingMethod +--- +units : +``` + +The automatic `key_source` is: +```python +Session * Probe * SortingMethod +``` + +This produces all valid combinations of (session, probe, method) that could be computed. + +### 2.3 Custom Key Source + +Override `key_source` to customize which entries to compute: + +```python +@schema +class QualityAnalysis(dj.Computed): + definition = """ + -> Session + --- + score : float64 + """ + + @property + def key_source(self): + # Only process sessions marked as 'good' + return Session & "quality = 'good'" +``` + +**Common customizations:** + +```python +# Filter by condition +@property +def key_source(self): + return Session & "status = 'complete'" + +# Restrict to specific combinations +@property +def key_source(self): + return Recording * Method & "method_name != 'deprecated'" + +# Add complex logic +@property +def key_source(self): + # Only sessions with enough trials + good_sessions = dj.U('session_id').aggr( + Trial, n='count(*)') & 'n >= 100' + return Session & good_sessions +``` + +### 2.4 Pending Entries + +Entries to be computed = `key_source - self`: + +```python +# Entries that should exist but don't yet +pending = table.key_source - table + +# Check how many entries need computing +n_pending = len(table.key_source - table) +``` + +--- + +## 3. The Populate Process + +### 3.1 Basic Populate + +The `populate()` method iterates through pending entries and calls `make()` for each: + +```python +# Populate all pending entries +FilteredImage.populate() +``` + +**Execution flow (direct mode):** + +``` +1. Calculate pending keys: key_source - self +2. Apply restrictions: pending & restrictions +3. For each key in pending: + a. Start transaction + b. Call make(key) + c. Commit transaction (or rollback on error) +4. Return summary +``` + +### 3.2 Method Signature + +```python +def populate( + self, + *restrictions, + suppress_errors: bool = False, + return_exception_objects: bool = False, + reserve_jobs: bool = False, + max_calls: int = None, + display_progress: bool = False, + processes: int = 1, + make_kwargs: dict = None, + priority: int = None, + refresh: bool = None, +) -> dict +``` + +### 3.3 Parameters + +| Parameter | Default | Description | +|-----------|---------|-------------| +| `*restrictions` | β€” | Filter `key_source` to subset of entries | +| `suppress_errors` | `False` | Continue on errors instead of raising | +| `return_exception_objects` | `False` | Return exception objects vs strings | +| `reserve_jobs` | `False` | Enable job reservation for distributed computing | +| `max_calls` | `None` | Maximum number of `make()` calls | +| `display_progress` | `False` | Show progress bar | +| `processes` | `1` | Number of parallel worker processes | +| `make_kwargs` | `None` | Additional kwargs passed to `make()` | +| `priority` | `None` | Process only jobs at this priority or more urgent | +| `refresh` | `None` | Refresh jobs queue before processing | + +### 3.4 Common Usage Patterns + +```python +# Populate everything +Analysis.populate() + +# Populate specific subjects +Analysis.populate(Subject & "subject_id < 10") + +# Populate with progress bar +Analysis.populate(display_progress=True) + +# Populate limited batch +Analysis.populate(max_calls=100) + +# Populate with error collection +errors = Analysis.populate(suppress_errors=True) + +# Parallel populate (single machine) +Analysis.populate(processes=4) +``` + +### 3.5 Return Value + +```python +result = Analysis.populate() +# { +# 'success': 150, # Entries successfully computed +# 'error': 3, # Entries that failed +# 'skip': 0, # Entries skipped (already exist) +# } +``` + +--- + +## 4. The make() Method + +### 4.1 Basic Pattern + +The `make()` method computes and inserts one entry: + +```python +def make(self, key): + """ + Compute and insert one entry. + + Parameters + ---------- + key : dict + Primary key values identifying which entry to compute. + """ + # 1. Fetch source data + source_data = (SourceTable & key).fetch1() + + # 2. Compute result + result = compute(source_data) + + # 3. Insert result + self.insert1({**key, **result}) +``` + +### 4.2 Requirements + +- **Must insert**: `make()` must insert exactly one row matching the key +- **Idempotent**: Same input should produce same output +- **Atomic**: Runs within a transactionβ€”all or nothing +- **Self-contained**: Should not depend on external state that changes + +### 4.3 Accessing Source Data + +```python +def make(self, key): + # Fetch single row + data = (SourceTable & key).fetch1() + + # Fetch specific attributes + image, timestamp = (Recording & key).fetch1('image', 'timestamp') + + # Fetch multiple rows (e.g., trials for a session) + trials = (Trial & key).to_dicts() + + # Join multiple sources + combined = (TableA * TableB & key).to_dicts() +``` + +**Upstream-only convention:** Inside `make()`, fetch only from tables that are strictly upstream in the pipelineβ€”tables referenced by foreign keys in the definition, their ancestors, and their part tables. This ensures reproducibility: computed results depend only on their declared dependencies. + +This convention is not currently enforced programmatically but is critical for pipeline integrity. Some pipelines violate this rule for operational reasons, which makes them non-reproducible. A future release may programmatically enforce upstream-only fetches inside `make()`. + +### 4.4 Tripartite Make Pattern + +For long-running computations, use the tripartite pattern to separate fetch, compute, and insert phases. This enables better transaction management for jobs that take minutes or hours. + +**Method-based tripartite:** + +```python +@schema +class HeavyComputation(dj.Computed): + definition = """ + -> Recording + --- + result : + """ + + def make_fetch(self, key): + """Fetch all required data (runs in transaction).""" + return (Recording & key).fetch1('raw_data') + + def make_compute(self, key, data): + """Perform computation (runs outside transaction).""" + # Long-running computation - no database locks held + return heavy_algorithm(data) + + def make_insert(self, key, result): + """Insert results (runs in transaction).""" + self.insert1({**key, 'result': result}) +``` + +**Generator-based tripartite:** + +```python +def make(self, key): + # Phase 1: Fetch (in transaction) + data = (Recording & key).fetch1('raw_data') + + yield # Exit transaction, release locks + + # Phase 2: Compute (outside transaction) + result = heavy_algorithm(data) # May take hours + + yield # Re-enter transaction + + # Phase 3: Insert (in transaction) + self.insert1({**key, 'result': result}) +``` + +**When to use tripartite:** +- Computation takes more than a few seconds +- You want to avoid holding database locks during computation +- Working with external resources (files, APIs) that may be slow + +### 4.5 Additional make() Arguments + +Pass extra arguments via `make_kwargs`: + +```python +@schema +class ConfigurableAnalysis(dj.Computed): + definition = """ + -> Session + --- + result : float64 + """ + + def make(self, key, threshold=0.5, method='default'): + data = (Session & key).fetch1('data') + result = analyze(data, threshold=threshold, method=method) + self.insert1({**key, 'result': result}) + +# Call with custom parameters +ConfigurableAnalysis.populate(make_kwargs={'threshold': 0.8}) +``` + +**Anti-pattern warning:** Passing arguments that affect the computed result breaks reproducibilityβ€”all inputs should come from `fetch` calls inside `make()`. If a parameter affects results, it should be stored in a lookup table and referenced via foreign key. + +**Acceptable use:** Directives that don't affect results, such as: +- `verbose=True` for logging +- `gpu_id=0` for device selection +- `n_workers=4` for parallelization + +--- + +## 5. Transaction Management + +### 5.1 Automatic Transactions + +Each `make()` call runs within an automatic transaction: + +```python +# Pseudocode for populate loop +for key in pending_keys: + connection.start_transaction() + try: + self.make(key) + connection.commit() + except Exception: + connection.rollback() + raise # or log if suppress_errors=True +``` + +### 5.2 Atomicity Guarantees + +- **All or nothing**: If `make()` fails, no partial data is inserted +- **Isolation**: Concurrent workers see consistent state +- **Rollback on error**: Any exception rolls back the transaction + +```python +def make(self, key): + # If this succeeds... + self.insert1({**key, 'step1': result1}) + + # But this fails... + self.Part.insert(part_data) # Raises exception + + # Both inserts are rolled back - table unchanged +``` + +### 5.3 Transaction Scope + +**Simple make (single transaction):** +``` +BEGIN TRANSACTION + └── make(key) + β”œβ”€β”€ fetch source data + β”œβ”€β”€ compute + └── insert result +COMMIT +``` + +**Tripartite make (single transaction):** +``` +[No transaction] + β”œβ”€β”€ make_fetch(key) # Fetch source data + └── make_compute(key, data) # Long-running computation + +BEGIN TRANSACTION + β”œβ”€β”€ make_fetch(key) # Repeat fetch, verify unchanged + └── make_insert(key, result) # Insert computed result +COMMIT +``` + +This pattern allows long computations without holding database locks, while ensuring data consistency by verifying the source data hasn't changed before inserting. + +### 5.4 Nested Operations + +Inserts within `make()` share the same transaction: + +```python +def make(self, key): + # Main table insert + self.insert1({**key, 'summary': summary}) + + # Part table inserts - same transaction + self.Part1.insert(part1_data) + self.Part2.insert(part2_data) + + # All three inserts commit together or roll back together +``` + +### 5.5 Manual Transaction Control + +For complex scenarios, use explicit transactions: + +```python +def make(self, key): + # Fetch outside transaction + data = (Source & key).to_dicts() + + # Explicit transaction for insert + with dj.conn().transaction: + self.insert1({**key, 'result': compute(data)}) + self.Part.insert(parts) +``` + +--- + +## 6. Part Tables + +### 6.1 Part Tables in Computed Tables + +Computed tables can have Part tables for detailed results: + +```python +@schema +class SpikeSorting(dj.Computed): + definition = """ + -> Recording + --- + n_units : int + """ + + class Unit(dj.Part): + definition = """ + -> master + unit_id : int + --- + waveform : + spike_times : + """ + + def make(self, key): + # Compute spike sorting + units = sort_spikes((Recording & key).fetch1('data')) + + # Insert master entry + self.insert1({**key, 'n_units': len(units)}) + + # Insert part entries + self.Unit.insert([ + {**key, 'unit_id': i, **unit} + for i, unit in enumerate(units) + ]) +``` + +### 6.2 Transaction Behavior + +Master and part inserts share the same transaction: + +```python +def make(self, key): + self.insert1({**key, 'summary': s}) # Master + self.Part.insert(parts) # Parts + + # If Part.insert fails, master insert is also rolled back +``` + +### 6.3 Fetching Part Data + +```python +# Fetch master with parts +master = (SpikeSorting & key).fetch1() +parts = (SpikeSorting.Unit & key).to_dicts() + +# Join master and parts +combined = (SpikeSorting * SpikeSorting.Unit & key).to_dicts() +``` + +### 6.4 Key Source with Parts + +The key source is based on the master table's primary key only: + +```python +# key_source returns master keys, not part keys +SpikeSorting.key_source # Recording keys +``` + +### 6.5 Deleting Computed Parts + +Deleting master entries cascades to parts: + +```python +# Deletes SpikeSorting entry AND all SpikeSorting.Unit entries +(SpikeSorting & key).delete() +``` + +--- + +## 7. Progress and Monitoring + +### 7.1 Progress Method + +Check computation progress: + +```python +# Simple progress +remaining, total = Analysis.progress() +print(f"{remaining}/{total} entries remaining") + +# With display +Analysis.progress(display=True) +# Analysis: 150/200 (75%) [===========> ] +``` + +### 7.2 Display Progress During Populate + +```python +Analysis.populate(display_progress=True) +# [################----] 80% 160/200 [00:15<00:04] +``` + +--- + +## 8. Direct Mode vs Distributed Mode + +### 8.1 Direct Mode (Default) + +When `reserve_jobs=False` (default): + +```python +Analysis.populate() # Direct mode +``` + +**Characteristics:** +- Calculates `key_source - self` on each call +- No job tracking or status persistence +- Simple and efficient for single-worker scenarios +- No coordination overhead + +**Best for:** +- Interactive development +- Single-worker pipelines +- Small to medium datasets + +### 8.2 Distributed Mode + +When `reserve_jobs=True`: + +```python +Analysis.populate(reserve_jobs=True) # Distributed mode +``` + +**Characteristics:** +- Uses per-table jobs queue for coordination +- Workers reserve jobs before processing +- Full status tracking (pending, reserved, error, success) +- Enables monitoring and recovery + +**Best for:** +- Multi-worker distributed computing +- Long-running pipelines +- Production environments with monitoring needs + +--- + +## 9. Per-Table Jobs System + +### 9.1 Jobs Table + +Each auto-populated table has an associated jobs table: + +``` +Table: Analysis +Jobs: ~~analysis +``` + +Access via the `.jobs` property: + +```python +Analysis.jobs # Jobs table +Analysis.jobs.pending # Pending jobs +Analysis.jobs.errors # Failed jobs +Analysis.jobs.progress() # Status summary +``` + +### 9.2 Jobs Table Structure + +``` +# Job queue for Analysis + +--- +status : enum('pending', 'reserved', 'success', 'error', 'ignore') +priority : uint8 # Lower = more urgent (0 = highest) +created_time : timestamp +scheduled_time : timestamp # Process on or after this time +reserved_time : timestamp # When reserved +completed_time : timestamp # When completed +duration : float64 # Execution time in seconds +error_message : varchar(2047) # Truncated error +error_stack : # Full traceback +user : varchar(255) # Database user +host : varchar(255) # Worker hostname +pid : uint32 # Process ID +connection_id : uint64 # MySQL connection ID +version : varchar(255) # Code version +``` + +### 9.3 Job Statuses + +| Status | Description | +|--------|-------------| +| `pending` | Queued and ready to process | +| `reserved` | Currently being processed by a worker | +| `success` | Completed successfully (when `jobs.keep_completed=True`) | +| `error` | Failed with error details | +| `ignore` | Manually marked to skip | + +```mermaid +stateDiagram-v2 + state "(none)" as none1 + state "(none)" as none2 + none1 --> pending : refresh() + none1 --> ignore : ignore() + pending --> reserved : reserve() + reserved --> none2 : complete() + reserved --> success : complete()* + reserved --> error : error() + success --> pending : refresh()* + error --> none2 : delete() + success --> none2 : delete() + ignore --> none2 : delete() +``` + +**Transitions:** + +| Method | Description | +|--------|-------------| +| `refresh()` | Adds new jobs as `pending`; re-pends `success` jobs if key is in `key_source` but not in target | +| `ignore()` | Marks a key as `ignore` (can be called on keys not yet in jobs table) | +| `reserve()` | Marks a `pending` job as `reserved` before calling `make()` | +| `complete()` | Deletes job (default) or marks as `success` (when `jobs.keep_completed=True`) | +| `error()` | Marks `reserved` job as `error` with message and stack trace | +| `delete()` | Removes job entry; use `(jobs & condition).delete()` pattern | + +**Notes:** + +- `ignore` is set manually via `jobs.ignore(key)` and skipped by `populate()` and `refresh()` +- To reset an ignored job: `jobs.ignored.delete(); jobs.refresh()` + +### 9.4 Jobs API + +```python +# Refresh job queue (sync with key_source) +Analysis.jobs.refresh() + +# Status queries +Analysis.jobs.pending # Pending jobs +Analysis.jobs.reserved # Currently processing +Analysis.jobs.errors # Failed jobs +Analysis.jobs.ignored # Skipped jobs +Analysis.jobs.completed # Success jobs (if kept) + +# Progress summary +Analysis.jobs.progress() +# {'pending': 150, 'reserved': 3, 'success': 847, 'error': 12, 'total': 1012} + +# Manual control +Analysis.jobs.ignore(key) # Skip a job +(Analysis.jobs & condition).delete() # Remove jobs +Analysis.jobs.errors.delete() # Clear errors +``` + +--- + +## 10. Priority and Scheduling + +### 10.1 Priority + +Lower values = higher priority (0 is most urgent): + +```python +# Urgent jobs (priority 0) +Analysis.jobs.refresh(priority=0) + +# Normal jobs (default priority 5) +Analysis.jobs.refresh() + +# Background jobs (priority 10) +Analysis.jobs.refresh(priority=10) + +# Urgent jobs for specific data +Analysis.jobs.refresh(Subject & "priority='urgent'", priority=0) +``` + +### 10.2 Scheduling + +Delay job availability using server time: + +```python +# Available in 2 hours +Analysis.jobs.refresh(delay=2*60*60) + +# Available tomorrow +Analysis.jobs.refresh(delay=24*60*60) +``` + +Jobs with `scheduled_time > now` are not processed by `populate()`. + +--- + +## 11. Distributed Computing + +### 11.1 Basic Pattern + +Multiple workers can run simultaneously: + +```python +# Worker 1 +Analysis.populate(reserve_jobs=True) + +# Worker 2 (different machine/process) +Analysis.populate(reserve_jobs=True) + +# Worker 3 +Analysis.populate(reserve_jobs=True) +``` + +### 11.2 Execution Flow (Distributed) + +``` +1. Refresh jobs queue (if auto_refresh=True) +2. Fetch pending jobs ordered by (priority, scheduled_time) +3. For each job: + a. Mark as 'reserved' + b. Start transaction + c. Call make(key) + d. Commit transaction + e. Mark as 'success' or delete job + f. On error: mark as 'error' with details +``` + +### 11.3 Conflict Resolution + +When two workers reserve the same job simultaneously: + +1. Both reservations succeed (optimistic, no locking) +2. Both call `make()` for the same key +3. First worker's transaction commits +4. Second worker gets duplicate key error (silently ignored) +5. First worker marks job complete + +This is acceptable because: +- The `make()` transaction guarantees data integrity +- Conflicts are rare with job reservation +- Wasted computation is minimal vs locking overhead + +--- + +## 12. Error Handling + +### 12.1 Default Behavior + +Errors stop populate and raise the exception: + +```python +Analysis.populate() # Stops on first error +``` + +### 12.2 Suppressing Errors + +Continue processing despite errors: + +```python +errors = Analysis.populate( + suppress_errors=True, + return_exception_objects=True +) +# errors contains list of (key, exception) tuples +``` + +### 12.3 Error Recovery (Distributed Mode) + +```python +# View errors +for err in Analysis.jobs.errors.to_dicts(): + print(f"Key: {err}, Error: {err['error_message']}") + +# Clear and retry +Analysis.jobs.errors.delete() +Analysis.jobs.refresh() +Analysis.populate(reserve_jobs=True) +``` + +### 12.4 Stale and Orphaned Jobs + +**Stale jobs**: Keys no longer in `key_source` (upstream deleted) +```python +Analysis.jobs.refresh(stale_timeout=3600) # Clean up after 1 hour +``` + +**Orphaned jobs**: Reserved jobs whose worker crashed +```python +Analysis.jobs.refresh(orphan_timeout=3600) # Reset after 1 hour +``` + +--- + +## 13. Configuration + +```python +dj.config['jobs.auto_refresh'] = True # Auto-refresh on populate +dj.config['jobs.keep_completed'] = False # Retain success records +dj.config['jobs.stale_timeout'] = 3600 # Seconds before stale cleanup +dj.config['jobs.default_priority'] = 5 # Default priority (lower=urgent) +dj.config['jobs.version'] = None # Version string ('git' for auto) +dj.config['jobs.add_job_metadata'] = False # Add hidden metadata columns +``` + +--- + +## 14. Hidden Job Metadata + +When `config['jobs.add_job_metadata'] = True`, auto-populated tables receive hidden columns: + +| Column | Type | Description | +|--------|------|-------------| +| `_job_start_time` | `datetime(3)` | When computation began | +| `_job_duration` | `float64` | Duration in seconds | +| `_job_version` | `varchar(64)` | Code version | + +```python +# Fetch with job metadata +Analysis().to_arrays('result', '_job_duration') + +# Query slow computations +slow = Analysis & '_job_duration > 3600' +``` + +--- + +## 15. Migration from Legacy DataJoint + +DataJoint 2.0 replaces the schema-level `~jobs` table with per-table `~~table_name` jobs tables. See the [Migration Guide](../../how-to/migrate-from-0x.md#autopopulate-20) for details. + +--- + +## 16. Quick Reference + +### 16.1 Common Operations + +```python +# Basic populate (direct mode) +Table.populate() +Table.populate(restriction) +Table.populate(max_calls=100, display_progress=True) + +# Distributed populate +Table.populate(reserve_jobs=True) + +# Check progress +remaining, total = Table.progress() +Table.jobs.progress() # Detailed status + +# Error handling +Table.populate(suppress_errors=True) +Table.jobs.errors.to_dicts() +Table.jobs.errors.delete() + +# Priority control +Table.jobs.refresh(priority=0) # Urgent +Table.jobs.refresh(delay=3600) # Scheduled +``` + +### 16.2 make() Patterns + +```python +# Simple make +def make(self, key): + data = (Source & key).fetch1() + self.insert1({**key, 'result': compute(data)}) + +# With parts +def make(self, key): + self.insert1({**key, 'summary': s}) + self.Part.insert(parts) + +# Tripartite (generator) +def make(self, key): + data = (Source & key).fetch1() + yield # Release transaction + result = heavy_compute(data) + yield # Re-acquire transaction + self.insert1({**key, 'result': result}) + +# Tripartite (methods) +def make_fetch(self, key): return data +def make_compute(self, key, data): return result +def make_insert(self, key, result): self.insert1(...) +``` diff --git a/src/reference/specs/codec-api.md b/src/reference/specs/codec-api.md new file mode 100644 index 00000000..b4641beb --- /dev/null +++ b/src/reference/specs/codec-api.md @@ -0,0 +1,847 @@ +# Codec API Specification + +This document specifies the DataJoint Codec API for creating custom attribute types. +For the complete type system architecture (core types, built-in codecs, storage modes), +see the [Type System Specification](type-system.md). + +## Overview + +Codecs define bidirectional conversion between Python objects and database storage. +They enable storing complex data types (graphs, models, custom formats) while +maintaining DataJoint's query capabilities. + +```mermaid +flowchart LR + A["Python Object
(e.g. Graph)"] -- encode --> B["Storage Type
(e.g. bytes)"] + B -- decode --> A +``` + +## Two Patterns for Custom Codecs + +There are two approaches for creating custom codecs: + +| Pattern | When to Use | Base Class | +|---------|-------------|------------| +| **Type Chaining** | Transform Python objects, use existing storage | `dj.Codec` | +| **SchemaCodec Subclassing** | Custom file formats with schema-addressed paths | `dj.SchemaCodec` | + +### Pattern 1: Type Chaining (Most Common) + +Chain to an existing codec for storage. Your codec transforms objects; the chained codec handles storage. + +```python +import datajoint as dj +import networkx as nx + +class GraphCodec(dj.Codec): + """Store NetworkX graphs.""" + + name = "graph" # Use as in definitions + + def get_dtype(self, is_store: bool) -> str: + return "" # Delegate to blob for serialization + + def encode(self, graph, *, key=None, store_name=None): + return { + 'nodes': list(graph.nodes(data=True)), + 'edges': list(graph.edges(data=True)), + } + + def decode(self, stored, *, key=None): + G = nx.Graph() + G.add_nodes_from(stored['nodes']) + G.add_edges_from(stored['edges']) + return G + +# Use in table definition +@schema +class Connectivity(dj.Manual): + definition = ''' + conn_id : int + --- + network : # inline storage + network_ext : # object store + ''' +``` + +### Pattern 2: SchemaCodec Subclassing (File Formats) + +For custom file formats that need schema-addressed storage paths. + +```python +import datajoint as dj + +class ParquetCodec(dj.SchemaCodec): + """Store DataFrames as Parquet files.""" + + name = "parquet" + + # get_dtype inherited: returns "json", requires @ + + def encode(self, df, *, key=None, store_name=None): + import io + schema, table, field, pk = self._extract_context(key) + path, _ = self._build_path(schema, table, field, pk, ext=".parquet") + backend = self._get_backend(store_name) + + buffer = io.BytesIO() + df.to_parquet(buffer) + backend.put_buffer(buffer.getvalue(), path) + + return {"path": path, "store": store_name, "shape": list(df.shape)} + + def decode(self, stored, *, key=None): + return ParquetRef(stored, self._get_backend(stored.get("store"))) + +# Use in table definition (store only) +@schema +class Results(dj.Manual): + definition = ''' + result_id : int + --- + data : + ''' +``` + +## The Codec Base Class + +All custom codecs inherit from `dj.Codec`: + +```python +class Codec(ABC): + """Base class for codec types.""" + + name: str | None = None # Required: unique identifier + + def get_dtype(self, is_store: bool) -> str: + """Return the storage dtype.""" + raise NotImplementedError + + @abstractmethod + def encode(self, value, *, key=None, store_name=None) -> Any: + """Encode Python value for storage.""" + ... + + @abstractmethod + def decode(self, stored, *, key=None) -> Any: + """Decode stored value back to Python.""" + ... + + def validate(self, value) -> None: + """Optional: validate value before encoding.""" + pass +``` + +## The SchemaCodec Base Class + +For schema-addressed storage (file formats), inherit from `dj.SchemaCodec`: + +```python +class SchemaCodec(Codec, register=False): + """Base class for schema-addressed codecs.""" + + def get_dtype(self, is_store: bool) -> str: + """Store only, returns 'json'.""" + if not is_store: + raise DataJointError(f"<{self.name}> requires @ (store only)") + return "json" + + def _extract_context(self, key: dict) -> tuple[str, str, str, dict]: + """Parse key into (schema, table, field, primary_key).""" + ... + + def _build_path(self, schema, table, field, pk, ext=None) -> tuple[str, str]: + """Build schema-addressed path: {schema}/{table}/{pk}/{field}{ext}""" + ... + + def _get_backend(self, store_name: str = None): + """Get storage backend by name.""" + ... +``` + +## Required Components + +### 1. The `name` Attribute + +The `name` class attribute is a unique identifier used in table definitions with +`` syntax: + +```python +class MyCodec(dj.Codec): + name = "mycodec" # Use as in definitions +``` + +Naming conventions: +- Use lowercase with underscores: `spike_train`, `graph_embedding` +- Avoid generic names that might conflict: prefer `lab_model` over `model` +- Names must be unique across all registered codecs + +### 2. The `get_dtype()` Method + +Returns the underlying storage type. The `is_store` parameter indicates whether +the `@` modifier is present in the table definition: + +```python +def get_dtype(self, is_store: bool) -> str: + """ + Args: + is_store: True if @ modifier present (e.g., ) + + Returns: + - A core type: "bytes", "json", "varchar(N)", "int32", etc. + - Another codec: "", "", etc. + + Raises: + DataJointError: If store not supported but @ is present + """ +``` + +Examples: + +```python +# Simple: always store as bytes +def get_dtype(self, is_store: bool) -> str: + return "bytes" + +# Different behavior for inline/store +def get_dtype(self, is_store: bool) -> str: + return "" if is_store else "bytes" + +# Store-only codec +def get_dtype(self, is_store: bool) -> str: + if not is_store: + raise DataJointError(" requires @ (store only)") + return "json" +``` + +### 3. The `encode()` Method + +Converts Python objects to the format expected by `get_dtype()`: + +```python +def encode(self, value: Any, *, key: dict | None = None, store_name: str | None = None) -> Any: + """ + Args: + value: The Python object to store + key: Primary key values (for context-dependent encoding) + store_name: Target store name (for external storage) + + Returns: + Value in the format expected by get_dtype() + """ +``` + +### 4. The `decode()` Method + +Converts stored values back to Python objects: + +```python +def decode(self, stored: Any, *, key: dict | None = None) -> Any: + """ + Args: + stored: Data retrieved from storage + key: Primary key values (for context-dependent decoding) + + Returns: + The reconstructed Python object + """ +``` + +### 5. The `validate()` Method (Optional) + +Called automatically before `encode()` during INSERT operations: + +```python +def validate(self, value: Any) -> None: + """ + Args: + value: The value to validate + + Raises: + TypeError: If the value has an incompatible type + ValueError: If the value fails domain validation + """ + if not isinstance(value, ExpectedType): + raise TypeError(f"Expected ExpectedType, got {type(value).__name__}") +``` + +## Auto-Registration + +Codecs automatically register when their class is defined. No decorator needed: + +```python +# This codec is registered automatically when the class is defined +class MyCodec(dj.Codec): + name = "mycodec" + # ... +``` + +### Skipping Registration + +For abstract base classes that shouldn't be registered: + +```python +class BaseCodec(dj.Codec, register=False): + """Abstract base - not registered.""" + name = None # Or omit entirely + +class ConcreteCodec(BaseCodec): + name = "concrete" # This one IS registered + # ... +``` + +### Registration Timing + +Codecs are registered at class definition time. Ensure your codec classes are +imported before any table definitions that use them: + +```python +# myproject/codecs.py +class GraphCodec(dj.Codec): + name = "graph" + ... + +# myproject/tables.py +import myproject.codecs # Ensure codecs are registered + +@schema +class Networks(dj.Manual): + definition = ''' + id : int + --- + network : + ''' +``` + +## Codec Composition (Chaining) + +Codecs can delegate to other codecs by returning `` from `get_dtype()`. +This enables layered functionality: + +```python +class CompressedJsonCodec(dj.Codec): + """Compress JSON data with zlib.""" + + name = "zjson" + + def get_dtype(self, is_store: bool) -> str: + return "" # Delegate serialization to blob codec + + def encode(self, value, *, key=None, store_name=None): + import json, zlib + json_bytes = json.dumps(value).encode('utf-8') + return zlib.compress(json_bytes) + + def decode(self, stored, *, key=None): + import json, zlib + json_bytes = zlib.decompress(stored) + return json.loads(json_bytes.decode('utf-8')) +``` + +### How Chaining Works + +When DataJoint encounters ``: + +1. Calls `ZjsonCodec.get_dtype(is_store=False)` β†’ returns `""` +2. Calls `BlobCodec.get_dtype(is_store=False)` β†’ returns `"bytes"` +3. Final storage type is `bytes` (LONGBLOB in MySQL) + +During INSERT: +1. `ZjsonCodec.encode()` converts Python dict β†’ compressed bytes +2. `BlobCodec.encode()` packs bytes β†’ DJ blob format +3. Stored in database + +During FETCH: +1. Read from database +2. `BlobCodec.decode()` unpacks DJ blob β†’ compressed bytes +3. `ZjsonCodec.decode()` decompresses β†’ Python dict + +### Built-in Codec Chains + +DataJoint's built-in codecs form these chains: + +| Codec | Chain | Final Storage | +|-------|-------|---------------| +| `` | `` β†’ `bytes` | Inline | +| `` | `` β†’ `` β†’ `json` | Store (hash-addressed) | +| `` | `` β†’ `bytes` | Inline | +| `` | `` β†’ `` β†’ `json` | Store (hash-addressed) | +| `` | `` β†’ `json` | Store only (hash-addressed) | +| `` | `` β†’ `json` | Store only (schema-addressed) | +| `` | `` β†’ `json` | Store only (schema-addressed) | +| `` | `` β†’ `json` | Store only (external ref) | + +### Store Name Propagation + +When using object storage (`@`), the store name propagates through the chain: + +```python +# Table definition +data : + +# Resolution: +# 1. MyCodec.get_dtype(is_store=True) β†’ "" +# 2. BlobCodec.get_dtype(is_store=True) β†’ "" +# 3. HashCodec.get_dtype(is_store=True) β†’ "json" +# 4. store_name="coldstore" passed to HashCodec.encode() +``` + +## Plugin System (Entry Points) + +Codecs can be distributed as installable packages using Python entry points. + +### Package Structure + +``` +dj-graph-codecs/ +β”œβ”€β”€ pyproject.toml +└── src/ + └── dj_graph_codecs/ + β”œβ”€β”€ __init__.py + └── codecs.py +``` + +### pyproject.toml + +```toml +[project] +name = "dj-graph-codecs" +version = "1.0.0" +dependencies = ["datajoint>=2.0", "networkx"] + +[project.entry-points."datajoint.codecs"] +graph = "dj_graph_codecs.codecs:GraphCodec" +weighted_graph = "dj_graph_codecs.codecs:WeightedGraphCodec" +``` + +### Codec Implementation + +```python +# src/dj_graph_codecs/codecs.py +import datajoint as dj +import networkx as nx + +class GraphCodec(dj.Codec): + name = "graph" + + def get_dtype(self, is_store: bool) -> str: + return "" + + def encode(self, graph, *, key=None, store_name=None): + return { + 'nodes': list(graph.nodes(data=True)), + 'edges': list(graph.edges(data=True)), + } + + def decode(self, stored, *, key=None): + G = nx.Graph() + G.add_nodes_from(stored['nodes']) + G.add_edges_from(stored['edges']) + return G + +class WeightedGraphCodec(dj.Codec): + name = "weighted_graph" + + def get_dtype(self, is_store: bool) -> str: + return "" + + def encode(self, graph, *, key=None, store_name=None): + return { + 'nodes': list(graph.nodes(data=True)), + 'edges': [(u, v, d) for u, v, d in graph.edges(data=True)], + } + + def decode(self, stored, *, key=None): + G = nx.Graph() + G.add_nodes_from(stored['nodes']) + for u, v, d in stored['edges']: + G.add_edge(u, v, **d) + return G +``` + +### Usage After Installation + +```bash +pip install dj-graph-codecs +``` + +```python +# Codecs are automatically discovered and available +@schema +class Networks(dj.Manual): + definition = ''' + network_id : int + --- + topology : + weights : + ''' +``` + +### Entry Point Discovery + +DataJoint loads entry points lazily when a codec is first requested: + +1. Check explicit registry (codecs defined in current process) +2. Load entry points from `datajoint.codecs` group +3. Also checks legacy `datajoint.types` group for compatibility + +## API Reference + +### Module Functions + +```python +import datajoint as dj + +# List all registered codec names +dj.list_codecs() # Returns: ['blob', 'hash', 'object', 'attach', 'filepath', ...] + +# Get a codec instance by name +codec = dj.get_codec("blob") +codec = dj.get_codec("") # Angle brackets are optional +codec = dj.get_codec("") # Store parameter is stripped +``` + +### Internal Functions (for advanced use) + +```python +from datajoint.codecs import ( + is_codec_registered, # Check if codec exists + unregister_codec, # Remove codec (testing only) + resolve_dtype, # Resolve codec chain + parse_type_spec, # Parse "" syntax +) +``` + +## Built-in Codecs + +DataJoint provides these built-in codecs. See the [Type System Specification](type-system.md) for detailed behavior and implementation. + +| Codec | Inline | Store | Addressing | Description | +|-------|--------|-------|------------|-------------| +| `` | `bytes` | `` | Hash | DataJoint serialization for Python objects | +| `` | `bytes` | `` | Hash | File attachments with filename preserved | +| `` | N/A | `json` | Hash | Hash-addressed storage with MD5 deduplication | +| `` | N/A | `json` | Schema | Schema-addressed storage for files/folders | +| `` | N/A | `json` | Schema | Schema-addressed storage for numpy arrays | +| `` | N/A | `json` | External | Reference to existing files in store | + +**Addressing schemes:** +- **Hash-addressed**: Path from content hash. Automatic deduplication. +- **Schema-addressed**: Path mirrors database structure. One location per entity. + +## Complete Examples + +### Example 1: Simple Serialization + +```python +import datajoint as dj +import numpy as np + +class SpikeTrainCodec(dj.Codec): + """Efficient storage for sparse spike timing data.""" + + name = "spike_train" + + def get_dtype(self, is_store: bool) -> str: + return "" + + def validate(self, value): + if not isinstance(value, np.ndarray): + raise TypeError("Expected numpy array of spike times") + if value.ndim != 1: + raise ValueError("Spike train must be 1-dimensional") + if len(value) > 1 and not np.all(np.diff(value) >= 0): + raise ValueError("Spike times must be sorted") + + def encode(self, spike_times, *, key=None, store_name=None): + # Store as differences (smaller values, better compression) + return np.diff(spike_times, prepend=0).astype(np.float32) + + def decode(self, stored, *, key=None): + # Reconstruct original spike times + return np.cumsum(stored).astype(np.float64) +``` + +### Example 2: External Storage + +```python +import datajoint as dj +import pickle + +class ModelCodec(dj.Codec): + """Store ML models with optional external storage.""" + + name = "model" + + def get_dtype(self, is_store: bool) -> str: + # Use hash-addressed storage for large models + return "" if is_store else "" + + def encode(self, model, *, key=None, store_name=None): + return pickle.dumps(model, protocol=pickle.HIGHEST_PROTOCOL) + + def decode(self, stored, *, key=None): + return pickle.loads(stored) + + def validate(self, value): + # Check that model has required interface + if not hasattr(value, 'predict'): + raise TypeError("Model must have a predict() method") +``` + +Usage: +```python +@schema +class Models(dj.Manual): + definition = ''' + model_id : int + --- + small_model : # Internal storage + large_model : # External (default store) + archive_model : # External (specific store) + ''' +``` + +### Example 3: JSON with Schema Validation + +```python +import datajoint as dj +import jsonschema + +class ConfigCodec(dj.Codec): + """Store validated JSON configuration.""" + + name = "config" + + SCHEMA = { + "type": "object", + "properties": { + "version": {"type": "integer", "minimum": 1}, + "settings": {"type": "object"}, + }, + "required": ["version", "settings"], + } + + def get_dtype(self, is_store: bool) -> str: + return "json" + + def validate(self, value): + jsonschema.validate(value, self.SCHEMA) + + def encode(self, config, *, key=None, store_name=None): + return config # JSON type handles serialization + + def decode(self, stored, *, key=None): + return stored +``` + +### Example 4: Context-Dependent Encoding + +```python +import datajoint as dj + +class VersionedDataCodec(dj.Codec): + """Handle different encoding versions based on primary key.""" + + name = "versioned" + + def get_dtype(self, is_store: bool) -> str: + return "" + + def encode(self, value, *, key=None, store_name=None): + version = key.get("schema_version", 1) if key else 1 + if version >= 2: + return {"v": 2, "data": self._encode_v2(value)} + return {"v": 1, "data": self._encode_v1(value)} + + def decode(self, stored, *, key=None): + version = stored.get("v", 1) + if version >= 2: + return self._decode_v2(stored["data"]) + return self._decode_v1(stored["data"]) + + def _encode_v1(self, value): + return value + + def _decode_v1(self, data): + return data + + def _encode_v2(self, value): + # New encoding format + return {"optimized": True, "payload": value} + + def _decode_v2(self, data): + return data["payload"] +``` + +### Example 5: External-Only Codec + +```python +import datajoint as dj +from pathlib import Path + +class ZarrCodec(dj.Codec): + """Store Zarr arrays in object storage.""" + + name = "zarr" + + def get_dtype(self, is_store: bool) -> str: + if not is_store: + raise dj.DataJointError(" requires @ (external storage only)") + return "" # Delegate to object storage + + def encode(self, value, *, key=None, store_name=None): + import zarr + import tempfile + + # If already a path, pass through + if isinstance(value, (str, Path)): + return str(value) + + # If zarr array, save to temp and return path + if isinstance(value, zarr.Array): + tmpdir = tempfile.mkdtemp() + path = Path(tmpdir) / "data.zarr" + zarr.save(path, value) + return str(path) + + raise TypeError(f"Expected zarr.Array or path, got {type(value)}") + + def decode(self, stored, *, key=None): + # ObjectCodec returns ObjectRef, use its fsmap for zarr + import zarr + return zarr.open(stored.fsmap, mode='r') +``` + +## Best Practices + +### 1. Choose Appropriate Storage Types + +| Data Type | Recommended `get_dtype()` | +|-----------|---------------------------| +| Python objects (dicts, arrays) | `""` | +| Large binary data | `""` (external) | +| Files/folders (Zarr, HDF5) | `""` (external) | +| Simple JSON-serializable | `"json"` | +| Short strings | `"varchar(N)"` | +| Numeric identifiers | `"int32"`, `"int64"` | + +### 2. Handle None Values + +Nullable columns may pass `None` to your codec: + +```python +def encode(self, value, *, key=None, store_name=None): + if value is None: + return None # Pass through for nullable columns + return self._actual_encode(value) + +def decode(self, stored, *, key=None): + if stored is None: + return None + return self._actual_decode(stored) +``` + +### 3. Test Round-Trips + +Always verify that `decode(encode(x)) == x`: + +```python +def test_codec_roundtrip(): + codec = MyCodec() + + test_values = [ + {"key": "value"}, + [1, 2, 3], + np.array([1.0, 2.0]), + ] + + for original in test_values: + encoded = codec.encode(original) + decoded = codec.decode(encoded) + assert decoded == original or np.array_equal(decoded, original) +``` + +### 4. Include Validation + +Catch errors early with `validate()`: + +```python +def validate(self, value): + if not isinstance(value, ExpectedType): + raise TypeError(f"Expected ExpectedType, got {type(value).__name__}") + + if not self._is_valid(value): + raise ValueError("Value fails validation constraints") +``` + +### 5. Document Expected Formats + +Include docstrings explaining input/output formats: + +```python +class MyCodec(dj.Codec): + """ + Store MyType objects. + + Input format (encode): + MyType instance with attributes: x, y, z + + Storage format: + Dict with keys: 'x', 'y', 'z' + + Output format (decode): + MyType instance reconstructed from storage + """ +``` + +### 6. Consider Versioning + +If your encoding format might change: + +```python +def encode(self, value, *, key=None, store_name=None): + return { + "_version": 2, + "_data": self._encode_v2(value), + } + +def decode(self, stored, *, key=None): + version = stored.get("_version", 1) + data = stored.get("_data", stored) + + if version == 1: + return self._decode_v1(data) + return self._decode_v2(data) +``` + +## Error Handling + +### Common Errors + +| Error | Cause | Solution | +|-------|-------|----------| +| `Unknown codec: ` | Codec not registered | Import module defining codec before table definition | +| `Codec already registered` | Duplicate name | Use unique names; check for conflicts | +| ` requires @` | External-only codec used without @ | Add `@` or `@store` to attribute type | +| `Circular codec reference` | Codec chain forms a loop | Check `get_dtype()` return values | + +### Debugging + +```python +# Check what codecs are registered +print(dj.list_codecs()) + +# Inspect a codec +codec = dj.get_codec("mycodec") +print(f"Name: {codec.name}") +print(f"Internal dtype: {codec.get_dtype(is_store=False)}") +print(f"External dtype: {codec.get_dtype(is_store=True)}") + +# Resolve full chain +from datajoint.codecs import resolve_dtype +final_type, chain, store = resolve_dtype("") +print(f"Final storage type: {final_type}") +print(f"Codec chain: {[c.name for c in chain]}") +print(f"Store: {store}") +``` diff --git a/src/reference/specs/data-manipulation.md b/src/reference/specs/data-manipulation.md new file mode 100644 index 00000000..e2841efa --- /dev/null +++ b/src/reference/specs/data-manipulation.md @@ -0,0 +1,664 @@ +# DataJoint Data Manipulation Specification + +## Overview + +This document specifies data manipulation operations in DataJoint Python: insert, update, and delete. These operations maintain referential integrity across the pipeline while supporting the **workflow normalization** paradigm. + +## 1. Workflow Normalization Philosophy + +### 1.1 Insert and Delete as Primary Operations + +DataJoint pipelines are designed around **insert** and **delete** as the primary data manipulation operations: + +``` +Insert: Add complete entities (rows) to tables +Delete: Remove entities and all dependent data (cascading) +``` + +This design maintains referential integrity at the **entity level**β€”each row represents a complete, self-consistent unit of data. + +### 1.2 Updates as Surgical Corrections + +**Updates are intentionally limited** to the `update1()` method, which modifies a single row at a time. This is by design: + +- Updates bypass the normal workflow +- They can create inconsistencies with derived data +- They should be used sparingly for **corrective operations** + +**Appropriate uses of update1():** +- Fixing data entry errors +- Correcting metadata after the fact +- Administrative annotations + +**Inappropriate uses:** +- Regular workflow operations +- Batch modifications +- Anything that should trigger recomputation + +### 1.3 The Recomputation Pattern + +When source data changes, the correct pattern is: + +```python +# 1. Delete the incorrect data (cascades to all derived tables) +(SourceTable & {"key": value}).delete() + +# 2. Insert the corrected data +SourceTable.insert1(corrected_row) + +# 3. Recompute derived tables +DerivedTable.populate() +``` + +This ensures all derived data remains consistent with its sources. + +--- + +## 2. Insert Operations + +### 2.1 `insert()` Method + +**Signature:** +```python +def insert( + self, + rows, + replace=False, + skip_duplicates=False, + ignore_extra_fields=False, + allow_direct_insert=None, + chunk_size=None, +) +``` + +**Parameters:** + +| Parameter | Type | Default | Description | +|-----------|------|---------|-------------| +| `rows` | iterable | β€” | Data to insert | +| `replace` | bool | `False` | Replace existing rows with matching PK | +| `skip_duplicates` | bool | `False` | Silently skip duplicate keys | +| `ignore_extra_fields` | bool | `False` | Ignore fields not in table | +| `allow_direct_insert` | bool | `None` | Allow insert into auto-populated tables | +| `chunk_size` | int | `None` | Insert in batches of this size | + +### 2.2 Accepted Input Formats + +| Format | Example | +|--------|---------| +| List of dicts | `[{"id": 1, "name": "Alice"}, ...]` | +| pandas DataFrame | `pd.DataFrame({"id": [1, 2], "name": ["A", "B"]})` | +| polars DataFrame | `pl.DataFrame({"id": [1, 2], "name": ["A", "B"]})` | +| numpy structured array | `np.array([(1, "A")], dtype=[("id", int), ("name", "U10")])` | +| QueryExpression | `OtherTable.proj(...)` (INSERT...SELECT) | +| Path to CSV | `Path("data.csv")` | + +### 2.3 Basic Usage + +```python +# Single row +Subject.insert1({"subject_id": 1, "name": "Mouse001", "dob": "2024-01-15"}) + +# Multiple rows +Subject.insert([ + {"subject_id": 1, "name": "Mouse001", "dob": "2024-01-15"}, + {"subject_id": 2, "name": "Mouse002", "dob": "2024-01-16"}, +]) + +# From DataFrame +df = pd.DataFrame({"subject_id": [1, 2], "name": ["M1", "M2"], "dob": ["2024-01-15", "2024-01-16"]}) +Subject.insert(df) + +# From query (INSERT...SELECT) +ActiveSubjects.insert(Subject & "status = 'active'") +``` + +### 2.4 Handling Duplicates + +```python +# Error on duplicate (default) +Subject.insert1({"subject_id": 1, ...}) # Raises DuplicateError if exists + +# Skip duplicates silently +Subject.insert(rows, skip_duplicates=True) + +# Replace existing rows +Subject.insert(rows, replace=True) +``` + +**Difference between skip and replace:** +- `skip_duplicates`: Keeps existing row unchanged +- `replace`: Overwrites existing row with new values + +### 2.5 Extra Fields + +```python +# Error on extra fields (default) +Subject.insert1({"subject_id": 1, "unknown_field": "x"}) # Raises error + +# Ignore extra fields +Subject.insert1({"subject_id": 1, "unknown_field": "x"}, ignore_extra_fields=True) +``` + +### 2.6 Auto-Populated Tables + +Computed and Imported tables normally only accept inserts from their `make()` method: + +```python +# Raises DataJointError by default +ComputedTable.insert1({"key": 1, "result": 42}) + +# Explicit override +ComputedTable.insert1({"key": 1, "result": 42}, allow_direct_insert=True) +``` + +### 2.7 Chunked Insertion + +For large datasets, insert in batches: + +```python +# Insert 10,000 rows at a time +Subject.insert(large_dataset, chunk_size=10000) +``` + +Each chunk is a separate transaction. If interrupted, completed chunks persist. + +### 2.8 `insert1()` Method + +Convenience wrapper for single-row inserts: + +```python +def insert1(self, row, **kwargs) +``` + +Equivalent to `insert((row,), **kwargs)`. + +### 2.9 Staged Insert for Large Objects + +For large objects (Zarr arrays, HDF5 files), use staged insert to write directly to object storage: + +```python +with table.staged_insert1 as staged: + # Set primary key and metadata + staged.rec["session_id"] = 123 + staged.rec["timestamp"] = datetime.now() + + # Write large data directly to storage + zarr_path = staged.store("raw_data", ".zarr") + z = zarr.open(zarr_path, mode="w") + z[:] = large_array + staged.rec["raw_data"] = z + +# Row automatically inserted on successful exit +# Storage cleaned up if exception occurs +``` + +--- + +## 3. Update Operations + +### 3.1 `update1()` Method + +**Signature:** +```python +def update1(self, row: dict) -> None +``` + +**Parameters:** +- `row`: Dictionary containing all primary key values plus attributes to update + +### 3.2 Basic Usage + +```python +# Update a single attribute +Subject.update1({"subject_id": 1, "name": "NewName"}) + +# Update multiple attributes +Subject.update1({ + "subject_id": 1, + "name": "NewName", + "notes": "Updated on 2024-01-15" +}) +``` + +### 3.3 Requirements + +1. **Complete primary key**: All PK attributes must be provided +2. **Exactly one match**: Must match exactly one existing row +3. **No restrictions**: Cannot call on restricted table + +```python +# Error: incomplete primary key +Subject.update1({"name": "NewName"}) + +# Error: row doesn't exist +Subject.update1({"subject_id": 999, "name": "Ghost"}) + +# Error: cannot update restricted table +(Subject & "subject_id > 10").update1({...}) +``` + +### 3.4 Resetting to Default + +Setting an attribute to `None` resets it to its default value: + +```python +# Reset 'notes' to its default (NULL if nullable) +Subject.update1({"subject_id": 1, "notes": None}) +``` + +### 3.5 When to Use Updates + +**Appropriate:** +```python +# Fix a typo in metadata +Subject.update1({"subject_id": 1, "name": "Mouse001"}) # Was "Mous001" + +# Add a note to an existing record +Session.update1({"session_id": 5, "notes": "Excluded from analysis"}) +``` + +**Inappropriate (use delete + insert + populate instead):** +```python +# DON'T: Update source data that affects computed results +Trial.update1({"trial_id": 1, "stimulus": "new_stim"}) # Computed tables now stale! + +# DO: Delete and recompute +(Trial & {"trial_id": 1}).delete() # Cascades to computed tables +Trial.insert1({"trial_id": 1, "stimulus": "new_stim"}) +ComputedResults.populate() +``` + +### 3.6 Why No Bulk Update? + +DataJoint intentionally does not provide `update()` for multiple rows: + +1. **Consistency**: Bulk updates easily create inconsistencies with derived data +2. **Auditability**: Single-row updates are explicit and traceable +3. **Workflow**: The insert/delete pattern maintains referential integrity + +If you need to update many rows, iterate explicitly: + +```python +for key in (Subject & condition).keys(): + Subject.update1({**key, "status": "archived"}) +``` + +--- + +## 4. Delete Operations + +### 4.1 `delete()` Method + +**Signature:** +```python +def delete( + self, + transaction: bool = True, + prompt: bool | None = None, + part_integrity: str = "enforce", +) -> int +``` + +**Parameters:** + +| Parameter | Type | Default | Description | +|-----------|------|---------|-------------| +| `transaction` | bool | `True` | Wrap in atomic transaction | +| `prompt` | bool | `None` | Prompt for confirmation (default: config setting) | +| `part_integrity` | str | `"enforce"` | Master-part integrity policy (see below) | + +**`part_integrity` values:** + +| Value | Behavior | +|-------|----------| +| `"enforce"` | Error if parts would be deleted without masters | +| `"ignore"` | Allow deleting parts without masters (breaks integrity) | +| `"cascade"` | Also delete masters when parts are deleted | + +**Returns:** Number of deleted rows from the primary table. + +### 4.2 Cascade Behavior + +Delete automatically cascades to all dependent tables: + +```python +# Deleting a subject deletes all their sessions, trials, and computed results +(Subject & {"subject_id": 1}).delete() +``` + +**Cascade order:** +1. Identify all tables with foreign keys referencing target +2. Recursively delete matching rows in child tables +3. Delete rows in target table + +### 4.3 Basic Usage + +```python +# Delete specific rows +(Subject & {"subject_id": 1}).delete() + +# Delete matching a condition +(Session & "session_date < '2024-01-01'").delete() + +# Delete all rows (use with caution!) +Subject.delete() +``` + +### 4.4 Safe Mode + +When `prompt=True` (default from config): + +``` +About to delete: + Subject: 1 rows + Session: 5 rows + Trial: 150 rows + ProcessedData: 150 rows + +Commit deletes? [yes, No]: +``` + +Disable for automated scripts: + +```python +Subject.delete(prompt=False) +``` + +### 4.5 Transaction Control + +```python +# Atomic delete (default) - all or nothing +(Subject & condition).delete(transaction=True) + +# Non-transactional (for nested transactions) +(Subject & condition).delete(transaction=False) +``` + +### 4.6 Part Table Constraints + +Cannot delete from part tables without deleting from master (by default): + +```python +# Error: cannot delete part without master +Session.Recording.delete() + +# Allow breaking master-part integrity +Session.Recording.delete(part_integrity="ignore") + +# Delete parts AND cascade up to delete master +Session.Recording.delete(part_integrity="cascade") +``` + +**`part_integrity` parameter:** + +| Value | Behavior | +|-------|----------| +| `"enforce"` | (default) Error if parts would be deleted without masters | +| `"ignore"` | Allow deleting parts without masters (breaks integrity) | +| `"cascade"` | Also delete masters when parts are deleted (maintains integrity) | + +### 4.7 `delete_quick()` Method + +Fast delete without cascade or confirmation: + +```python +def delete_quick(self, get_count: bool = False) -> int | None +``` + +**Use cases:** +- Internal cleanup +- Tables with no dependents +- When you've already handled dependencies + +**Behavior:** +- No cascade to child tables +- No user confirmation +- Fails on FK constraint violation + +```python +# Quick delete (fails if has dependents) +(TempTable & condition).delete_quick() + +# Get count of deleted rows +n = (TempTable & condition).delete_quick(get_count=True) +``` + +--- + +## 5. Validation + +### 5.1 `validate()` Method + +Pre-validate rows before insertion: + +```python +def validate(self, rows, *, ignore_extra_fields=False) -> ValidationResult +``` + +**Returns:** `ValidationResult` with: +- `is_valid`: Boolean indicating all rows passed +- `errors`: List of (row_idx, field_name, error_message) +- `rows_checked`: Number of rows validated + +### 5.2 Usage + +```python +result = Subject.validate(rows) + +if result: + Subject.insert(rows) +else: + print(result.summary()) + # Row 3, field 'dob': Invalid date format + # Row 7, field 'subject_id': Missing required field +``` + +### 5.3 Validations Performed + +| Check | Description | +|-------|-------------| +| Field existence | All fields must exist in table | +| NULL constraints | Required fields must have values | +| Primary key completeness | All PK fields must be present | +| UUID format | Valid UUID string or object | +| JSON serializability | JSON fields must be serializable | +| Codec validation | Custom type validation via codecs | + +### 5.4 Limitations + +These constraints are only checked at database level: +- Foreign key references +- Unique constraints (beyond PK) +- Custom CHECK constraints + +--- + +## 6. Part Tables + +### 6.1 Inserting into Part Tables + +Part tables are inserted via their master: + +```python +@schema +class Session(dj.Manual): + definition = """ + session_id : int + --- + date : date + """ + + class Recording(dj.Part): + definition = """ + -> master + recording_id : int + --- + duration : float + """ + +# Insert master with parts +Session.insert1({"session_id": 1, "date": "2024-01-15"}) +Session.Recording.insert([ + {"session_id": 1, "recording_id": 1, "duration": 60.0}, + {"session_id": 1, "recording_id": 2, "duration": 45.5}, +]) +``` + +### 6.2 Deleting with Part Tables + +Deleting master cascades to parts: + +```python +# Deletes session AND all its recordings +(Session & {"session_id": 1}).delete() +``` + +Cannot delete parts independently (by default): + +```python +# Error +Session.Recording.delete() + +# Allow breaking master-part integrity +Session.Recording.delete(part_integrity="ignore") + +# Or cascade up to also delete master +Session.Recording.delete(part_integrity="cascade") +``` + +--- + +## 7. Transaction Handling + +### 7.1 Implicit Transactions + +Single operations are atomic: + +```python +Subject.insert1(row) # Atomic +Subject.update1(row) # Atomic +Subject.delete() # Atomic (by default) +``` + +### 7.2 Explicit Transactions + +For multi-table operations: + +```python +with dj.conn().transaction: + Parent.insert1(parent_row) + Child.insert(child_rows) + # Commits on successful exit + # Rolls back on exception +``` + +### 7.3 Chunked Inserts and Transactions + +With `chunk_size`, each chunk is a separate transaction: + +```python +# Each chunk of 1000 rows commits independently +Subject.insert(large_dataset, chunk_size=1000) +``` + +If interrupted, completed chunks persist. + +--- + +## 8. Error Handling + +### 8.1 Common Errors + +| Error | Cause | Resolution | +|-------|-------|------------| +| `DuplicateError` | Primary key already exists | Use `skip_duplicates=True` or `replace=True` | +| `IntegrityError` | Foreign key constraint violated | Insert parent rows first | +| `MissingAttributeError` | Required field not provided | Include all required fields | +| `UnknownAttributeError` | Field not in table | Use `ignore_extra_fields=True` or fix field name | +| `DataJointError` | Various validation failures | Check error message for details | + +### 8.2 Error Recovery Pattern + +```python +try: + Subject.insert(rows) +except dj.errors.DuplicateError as e: + # Handle specific duplicate + print(f"Duplicate: {e}") +except dj.errors.IntegrityError as e: + # Missing parent reference + print(f"Missing parent: {e}") +except dj.DataJointError as e: + # Other DataJoint errors + print(f"Error: {e}") +``` + +--- + +## 9. Best Practices + +### 9.1 Prefer Insert/Delete Over Update + +```python +# Good: Delete and reinsert +(Trial & key).delete() +Trial.insert1(corrected_trial) +DerivedTable.populate() + +# Avoid: Update that creates stale derived data +Trial.update1({**key, "value": new_value}) # Derived tables now inconsistent! +``` + +### 9.2 Validate Before Insert + +```python +result = Subject.validate(rows) +if not result: + raise ValueError(result.summary()) +Subject.insert(rows) +``` + +### 9.3 Use Transactions for Related Inserts + +```python +with dj.conn().transaction: + session_key = Session.insert1(session_data, skip_duplicates=True) + Session.Recording.insert(recordings) + Session.Stimulus.insert(stimuli) +``` + +### 9.4 Batch Inserts for Performance + +```python +# Good: Single insert call +Subject.insert(all_rows) + +# Avoid: Loop of insert1 calls +for row in all_rows: + Subject.insert1(row) # Slow! +``` + +### 9.5 Safe Deletion in Production + +```python +# Always use prompt in interactive sessions +(Subject & condition).delete(prompt=True) + +# Disable only in tested automated scripts +(Subject & condition).delete(prompt=False) +``` + +--- + +## 10. Quick Reference + +| Operation | Method | Cascades | Transaction | Typical Use | +|-----------|--------|----------|-------------|-------------| +| Insert one | `insert1()` | β€” | Implicit | Adding single entity | +| Insert many | `insert()` | β€” | Per-chunk | Bulk data loading | +| Insert large object | `staged_insert1` | β€” | On exit | Zarr, HDF5 files | +| Update one | `update1()` | β€” | Implicit | Surgical corrections | +| Delete | `delete()` | Yes | Optional | Removing entities | +| Delete quick | `delete_quick()` | No | No | Internal cleanup | +| Validate | `validate()` | β€” | β€” | Pre-insert check | diff --git a/src/reference/specs/fetch-api.md b/src/reference/specs/fetch-api.md new file mode 100644 index 00000000..11528dea --- /dev/null +++ b/src/reference/specs/fetch-api.md @@ -0,0 +1,311 @@ +# DataJoint 2.0 Fetch API Specification + +## Overview + +DataJoint 2.0 replaces the complex `fetch()` method with a set of explicit, composable output methods. This provides better discoverability, clearer intent, and more efficient iteration. + +## Design Principles + +1. **Explicit over implicit**: Each output format has its own method +2. **Composable**: Use existing `.proj()` for column selection +3. **Lazy iteration**: Single cursor streaming instead of fetch-all-keys +4. **Modern formats**: First-class support for polars and Arrow + +--- + +## New API Reference + +### Output Methods + +| Method | Returns | Description | +|--------|---------|-------------| +| `to_dicts()` | `list[dict]` | All rows as list of dictionaries | +| `to_pandas()` | `DataFrame` | pandas DataFrame with primary key as index | +| `to_polars()` | `polars.DataFrame` | polars DataFrame (requires `datajoint[polars]`) | +| `to_arrow()` | `pyarrow.Table` | PyArrow Table (requires `datajoint[arrow]`) | +| `to_arrays()` | `np.ndarray` | numpy structured array (recarray) | +| `to_arrays('a', 'b')` | `tuple[array, array]` | Tuple of arrays for specific columns | +| `keys()` | `list[dict]` | Primary key values only | +| `fetch1()` | `dict` | Single row as dict (raises if not exactly 1) | +| `fetch1('a', 'b')` | `tuple` | Single row attribute values | +| `head(limit=25)` | `list[dict]` | Preview first N entries | +| `tail(limit=25)` | `list[dict]` | Preview last N entries | +| `cursor(as_dict=False)` | `cursor` | Raw database cursor for manual iteration | + +### Common Parameters + +All output methods accept these optional parameters: + +```python +table.to_dicts( + order_by=None, # str or list: column(s) to sort by, e.g. "KEY", "name DESC" + limit=None, # int: maximum rows to return + offset=None, # int: rows to skip + squeeze=False, # bool: remove singleton dimensions from arrays +) +``` + +For external storage types (attachments, filepaths), files are downloaded to `config["download_path"]`. Use `config.override()` to change: + +```python +with dj.config.override(download_path="/data"): + data = table.to_dicts() +``` + +### Iteration + +```python +# Lazy streaming - yields one dict per row from database cursor +for row in table: + process(row) # row is a dict +``` + +--- + +## Migration Guide + +### Basic Fetch Operations + +| Old Pattern (1.x) | New Pattern (2.0) | +|-------------------|-------------------| +| `table.fetch()` | `table.to_arrays()` or `table.to_dicts()` | +| `table.fetch(format="array")` | `table.to_arrays()` | +| `table.fetch(format="frame")` | `table.to_pandas()` | +| `table.fetch(as_dict=True)` | `table.to_dicts()` | + +### Attribute Fetching + +| Old Pattern (1.x) | New Pattern (2.0) | +|-------------------|-------------------| +| `table.fetch('a')` | `table.to_arrays('a')` | +| `a, b = table.fetch('a', 'b')` | `a, b = table.to_arrays('a', 'b')` | +| `table.fetch('a', 'b', as_dict=True)` | `table.proj('a', 'b').to_dicts()` | + +### Primary Key Fetching + +| Old Pattern (1.x) | New Pattern (2.0) | +|-------------------|-------------------| +| `table.fetch('KEY')` | `table.keys()` | +| `table.fetch(dj.key)` | `table.keys()` | +| `keys, a = table.fetch('KEY', 'a')` | See note below | + +For mixed KEY + attribute fetch: +```python +# Old: keys, a = table.fetch('KEY', 'a') +# New: Combine keys() with to_arrays() +keys = table.keys() +a = table.to_arrays('a') +# Or use to_dicts() which includes all columns +``` + +### Ordering, Limiting, Offset + +| Old Pattern (1.x) | New Pattern (2.0) | +|-------------------|-------------------| +| `table.fetch(order_by='name')` | `table.to_arrays(order_by='name')` | +| `table.fetch(limit=10)` | `table.to_arrays(limit=10)` | +| `table.fetch(order_by='KEY', limit=10, offset=5)` | `table.to_arrays(order_by='KEY', limit=10, offset=5)` | + +### Single Row Fetch (fetch1) + +| Old Pattern (1.x) | New Pattern (2.0) | +|-------------------|-------------------| +| `table.fetch1()` | `table.fetch1()` (unchanged) | +| `a, b = table.fetch1('a', 'b')` | `a, b = table.fetch1('a', 'b')` (unchanged) | +| `table.fetch1('KEY')` | `table.fetch1()` then extract pk columns | + +### Configuration + +| Old Pattern (1.x) | New Pattern (2.0) | +|-------------------|-------------------| +| `dj.config['fetch_format'] = 'frame'` | Use `.to_pandas()` explicitly | +| `with dj.config.override(fetch_format='frame'):` | Use `.to_pandas()` in the block | + +### Iteration + +| Old Pattern (1.x) | New Pattern (2.0) | +|-------------------|-------------------| +| `for row in table:` | `for row in table:` (same syntax, now lazy!) | +| `list(table)` | `table.to_dicts()` | + +### Column Selection with proj() + +Use `.proj()` for column selection, then apply output method: + +```python +# Select specific columns +table.proj('col1', 'col2').to_pandas() +table.proj('col1', 'col2').to_dicts() + +# Computed columns +table.proj(total='price * quantity').to_pandas() +``` + +--- + +## Removed Features + +### Removed Methods and Parameters + +- `fetch()` method - use explicit output methods +- `fetch('KEY')` - use `keys()` +- `dj.key` class - use `keys()` method +- `format=` parameter - use explicit methods +- `as_dict=` parameter - use `to_dicts()` +- `config['fetch_format']` setting - use explicit methods + +### Removed Imports + +```python +# Old (removed) +from datajoint import key +result = table.fetch(dj.key) + +# New +result = table.keys() +``` + +--- + +## Examples + +### Example 1: Basic Data Retrieval + +```python +# Get all data as DataFrame +df = Experiment().to_pandas() + +# Get all data as list of dicts +rows = Experiment().to_dicts() + +# Get all data as numpy array +arr = Experiment().to_arrays() +``` + +### Example 2: Filtered and Sorted Query + +```python +# Get recent experiments, sorted by date +recent = (Experiment() & 'date > "2024-01-01"').to_pandas( + order_by='date DESC', + limit=100 +) +``` + +### Example 3: Specific Columns + +```python +# Fetch specific columns as arrays +names, dates = Experiment().to_arrays('name', 'date') + +# Or with primary key included +names, dates = Experiment().to_arrays('name', 'date', include_key=True) +``` + +### Example 4: Primary Keys for Iteration + +```python +# Get keys for restriction +keys = Experiment().keys() +for key in keys: + process(Session() & key) +``` + +### Example 5: Single Row + +```python +# Get one row as dict +row = (Experiment() & key).fetch1() + +# Get specific attributes +name, date = (Experiment() & key).fetch1('name', 'date') +``` + +### Example 6: Lazy Iteration + +```python +# Stream rows efficiently (single database cursor) +for row in Experiment(): + if should_process(row): + process(row) + if done: + break # Early termination - no wasted fetches +``` + +### Example 7: Modern DataFrame Libraries + +```python +# Polars (fast, modern) +import polars as pl +df = Experiment().to_polars() +result = df.filter(pl.col('value') > 100).group_by('category').agg(pl.mean('value')) + +# PyArrow (zero-copy interop) +table = Experiment().to_arrow() +# Can convert to pandas or polars with zero copy +``` + +--- + +## Performance Considerations + +### Lazy Iteration + +The new iteration is significantly more efficient: + +```python +# Old (1.x): N+1 queries +# 1. fetch("KEY") gets ALL keys +# 2. fetch1() for EACH key + +# New (2.0): Single query +# Streams rows from one cursor +for row in table: + ... +``` + +### Memory Efficiency + +- `to_dicts()`: Returns full list in memory +- `for row in table:`: Streams one row at a time +- `to_arrays(limit=N)`: Fetches only N rows + +### Format Selection + +| Use Case | Recommended Method | +|----------|-------------------| +| Data analysis | `to_pandas()` or `to_polars()` | +| JSON API responses | `to_dicts()` | +| Numeric computation | `to_arrays()` | +| Large datasets | `for row in table:` (streaming) | +| Interop with other tools | `to_arrow()` | + +--- + +## Error Messages + +When attempting to use removed methods, users see helpful error messages: + +```python +>>> table.fetch() +AttributeError: fetch() has been removed in DataJoint 2.0. +Use to_dicts(), to_pandas(), to_arrays(), or keys() instead. +See table.fetch.__doc__ for details. +``` + +--- + +## Optional Dependencies + +Install optional dependencies for additional output formats: + +```bash +# For polars support +pip install datajoint[polars] + +# For PyArrow support +pip install datajoint[arrow] + +# For both +pip install datajoint[polars,arrow] +``` diff --git a/src/reference/specs/index.md b/src/reference/specs/index.md new file mode 100644 index 00000000..5b91e3e2 --- /dev/null +++ b/src/reference/specs/index.md @@ -0,0 +1,64 @@ +# Specifications + +Formal specifications of DataJoint's data model and behavior. + +These documents define how DataJoint works at a detailed level. They serve as +authoritative references for: + +- Understanding exact behavior of operations +- Implementing compatible tools and extensions +- Debugging complex scenarios + +## Document Structure + +Each specification follows a consistent structure: + +1. **Overview** β€” What this specifies +2. **User Guide** β€” Practical usage +3. **API Reference** β€” Methods and signatures +4. **Concepts** β€” Definitions and rules +5. **Implementation Details** β€” Internal behavior +6. **Examples** β€” Concrete code samples +7. **Best Practices** β€” Recommendations + +## Specifications + +### Schema Definition + +| Specification | Description | +|---------------|-------------| +| [Table Declaration](table-declaration.md) | Table definition syntax, tiers, foreign keys, and indexes | +| [Master-Part Relationships](master-part.md) | Compositional data modeling, integrity, and cascading operations | +| [Virtual Schemas](virtual-schemas.md) | Accessing schemas without Python source, introspection API | + +### Query Algebra + +| Specification | Description | +|---------------|-------------| +| [Query Operators](query-algebra.md) | Operators: restrict, proj, join, aggr, extend, union, U() | +| [Semantic Matching](semantic-matching.md) | Attribute lineage and join compatibility | +| [Primary Keys](primary-keys.md) | How primary keys propagate through query operators | +| [Fetch API](fetch-api.md) | Data retrieval methods and formats | + +### Type System + +| Specification | Description | +|---------------|-------------| +| [Type System](type-system.md) | Three-layer type architecture: native, core, and codec types | +| [Codec API](codec-api.md) | Custom type implementation with encode/decode semantics | +| [`` Codec](npy-codec.md) | Store numpy arrays as portable `.npy` files | + +### Object Store Configuration + +| Specification | Description | +|---------------|-------------| +| [Object Store Configuration](object-store-configuration.md) | Store configuration, path generation, and storage models: hash-addressed (integrated), schema-addressed (integrated), and filepath (reference) | + +### Data Operations + +| Specification | Description | +|---------------|-------------| +| [Data Manipulation](data-manipulation.md) | Insert, update1, delete operations and workflow normalization | +| [AutoPopulate](autopopulate.md) | Jobs 2.0 system for automated computation | +| [Job Metadata](job-metadata.md) | Hidden columns for job tracking | + diff --git a/src/reference/specs/job-metadata.md b/src/reference/specs/job-metadata.md new file mode 100644 index 00000000..ee09a9d1 --- /dev/null +++ b/src/reference/specs/job-metadata.md @@ -0,0 +1,355 @@ +# Hidden Job Metadata in Computed Tables + +## Overview + +Job execution metadata (start time, duration, code version) should be persisted in computed tables themselves, not just in ephemeral job entries. This is accomplished using hidden attributes. + +## Motivation + +The current job table (`~~table_name`) tracks execution metadata, but: +1. Job entries are deleted after completion (unless `keep_completed=True`) +2. Users often need to know when and with what code version each row was computed +3. This metadata should be transparent - not cluttering the user-facing schema + +Hidden attributes (prefixed with `_`) provide the solution: stored in the database but filtered from user-facing APIs. + +## Hidden Job Metadata Attributes + +| Attribute | Type | Description | +|-----------|------|-------------| +| `_job_start_time` | datetime(3) | When computation began | +| `_job_duration` | float32 | Computation duration in seconds | +| `_job_version` | varchar(64) | Code version (e.g., git commit hash) | + +**Design notes:** +- `_job_duration` (elapsed time) rather than `_job_completed_time` because duration is more informative for performance analysis +- `varchar(64)` for version is sufficient for git hashes (40 chars for SHA-1, 7-8 for short hash) +- `datetime(3)` provides millisecond precision + +## Configuration + +### Settings Structure + +Job metadata is controlled via `config.jobs` settings: + +```python +class JobsSettings(BaseSettings): + """Job queue configuration for AutoPopulate 2.0.""" + + model_config = SettingsConfigDict( + env_prefix="DJ_JOBS_", + case_sensitive=False, + extra="forbid", + validate_assignment=True, + ) + + # Existing settings + auto_refresh: bool = Field(default=True, ...) + keep_completed: bool = Field(default=False, ...) + stale_timeout: int = Field(default=3600, ...) + default_priority: int = Field(default=5, ...) + version_method: Literal["git", "none"] | None = Field(default=None, ...) + allow_new_pk_fields_in_computed_tables: bool = Field(default=False, ...) + + # New setting for hidden job metadata + add_job_metadata: bool = Field( + default=False, + description="Add hidden job metadata attributes (_job_start_time, _job_duration, _job_version) " + "to Computed and Imported tables during declaration. Tables created without this setting " + "will not receive metadata updates during populate." + ) +``` + +### Access Patterns + +```python +import datajoint as dj + +# Read setting +dj.config.jobs.add_job_metadata # False (default) + +# Enable programmatically +dj.config.jobs.add_job_metadata = True + +# Enable via environment variable +# DJ_JOBS_ADD_JOB_METADATA=true + +# Enable in config file (dj_config.yaml) +# jobs: +# add_job_metadata: true + +# Temporary override +with dj.config.override(jobs={"add_job_metadata": True}): + schema(MyComputedTable) # Declared with metadata columns +``` + +### Setting Interactions + +| Setting | Effect on Job Metadata | +|---------|----------------------| +| `add_job_metadata=True` | New Computed/Imported tables get hidden metadata columns | +| `add_job_metadata=False` | Tables declared without metadata columns (default) | +| `version_method="git"` | `_job_version` populated with git short hash | +| `version_method="none"` | `_job_version` left empty | +| `version_method=None` | `_job_version` left empty (same as "none") | + +### Behavior at Declaration vs Populate + +| `add_job_metadata` at declare | `add_job_metadata` at populate | Result | +|------------------------------|-------------------------------|--------| +| True | True | Metadata columns created and populated | +| True | False | Metadata columns exist but not populated | +| False | True | No metadata columns, populate skips silently | +| False | False | No metadata columns, normal behavior | + +### Retrofitting Existing Tables + +Tables created before enabling `add_job_metadata` do not have the hidden metadata columns. +To add metadata columns to existing tables, use the migration utility (not automatic): + +```python +from datajoint.migrate import add_job_metadata_columns + +# Add hidden metadata columns to specific table +add_job_metadata_columns(MyComputedTable) + +# Add to all Computed/Imported tables in a schema +add_job_metadata_columns(schema) +``` + +This utility: +- ALTERs the table to add the three hidden columns +- Does NOT populate existing rows (metadata remains NULL) +- Future `populate()` calls will populate metadata for new rows + +## Behavior + +### Declaration-time + +When `config.jobs.add_job_metadata=True` and a Computed/Imported table is declared: +- Hidden metadata columns are added to the table definition +- Only master tables receive metadata columns; Part tables never get them + +### Population-time + +After `make()` completes successfully: +1. Check if the table has hidden metadata columns +2. If yes: UPDATE the just-inserted rows with start_time, duration, version +3. If no: Silently skip (no error, no ALTER) + +This applies to both: +- **Direct mode** (`reserve_jobs=False`): Single-process populate +- **Distributed mode** (`reserve_jobs=True`): Multi-worker with job table coordination + +## Excluding Hidden Attributes from Binary Operators + +### Problem Statement + +If two tables have hidden attributes with the same name (e.g., both have `_job_start_time`), SQL's NATURAL JOIN would incorrectly match on them: + +```sql +-- NATURAL JOIN matches ALL common attributes including hidden +SELECT * FROM table_a NATURAL JOIN table_b +-- Would incorrectly match on _job_start_time! +``` + +### Solution: Replace NATURAL JOIN with USING Clause + +Hidden attributes must be excluded from all binary operator considerations. The result of a join does not preserve hidden attributes from its operands. + +**Current implementation:** +```python +def from_clause(self): + clause = next(support) + for s, left in zip(support, self._left): + clause += " NATURAL{left} JOIN {clause}".format(...) +``` + +**Proposed implementation:** +```python +def from_clause(self): + clause = next(support) + for s, (left, using_attrs) in zip(support, self._joins): + if using_attrs: + using = "USING ({})".format(", ".join(f"`{a}`" for a in using_attrs)) + clause += " {left}JOIN {s} {using}".format( + left="LEFT " if left else "", + s=s, + using=using + ) + else: + # Cross join (no common non-hidden attributes) + clause += " CROSS JOIN " + s if not left else " LEFT JOIN " + s + " ON TRUE" + return clause +``` + +### Changes Required + +#### 1. `QueryExpression._left` β†’ `QueryExpression._joins` + +Replace `_left: List[bool]` with `_joins: List[Tuple[bool, List[str]]]` + +Each join stores: +- `left`: Whether it's a left join +- `using_attrs`: Non-hidden common attributes to join on + +```python +# Before +result._left = self._left + [left] + other._left + +# After +join_attributes = [n for n in self.heading.names if n in other.heading.names] +result._joins = self._joins + [(left, join_attributes)] + other._joins +``` + +#### 2. `heading.names` (existing behavior) + +Already filters out hidden attributes: +```python +@property +def names(self): + return [k for k in self.attributes] # attributes excludes is_hidden=True +``` + +This ensures join attribute computation automatically excludes hidden attributes. + +### Behavior Summary + +| Scenario | Hidden Attributes | Result | +|----------|-------------------|--------| +| `A * B` (join) | Same hidden attr in both | NOT matched - excluded from USING | +| `A & B` (restriction) | Same hidden attr in both | NOT matched | +| `A - B` (anti-restriction) | Same hidden attr in both | NOT matched | +| `A.proj()` | Hidden attrs in A | NOT projected (unless explicitly named) | +| `A.to_dicts()` | Hidden attrs in A | NOT returned by default | + +## Implementation Details + +### 1. Declaration (declare.py) + +```python +def declare(full_table_name, definition, context): + # ... existing code ... + + # Add hidden job metadata for auto-populated tables + if config.jobs.add_job_metadata and table_tier in (TableTier.COMPUTED, TableTier.IMPORTED): + # Only for master tables, not parts + if not is_part_table: + job_metadata_sql = [ + "`_job_start_time` datetime(3) DEFAULT NULL", + "`_job_duration` float DEFAULT NULL", + "`_job_version` varchar(64) DEFAULT ''", + ] + attribute_sql.extend(job_metadata_sql) +``` + +### 2. Population (autopopulate.py) + +```python +def _populate1(self, key, callback, use_jobs, jobs): + start_time = datetime.now() + version = _get_job_version() + + # ... call make() ... + + duration = time.time() - start_time.timestamp() + + # Update job metadata if table has the hidden attributes + if self._has_job_metadata_attrs(): + self._update_job_metadata( + key, + start_time=start_time, + duration=duration, + version=version + ) + +def _has_job_metadata_attrs(self): + """Check if table has hidden job metadata columns.""" + hidden_attrs = self.heading._attributes # includes hidden + return '_job_start_time' in hidden_attrs + +def _update_job_metadata(self, key, start_time, duration, version): + """Update hidden job metadata for the given key.""" + # UPDATE using primary key + pk_condition = make_condition(self, key, set()) + self.connection.query( + f"UPDATE {self.full_table_name} SET " + f"`_job_start_time`=%s, `_job_duration`=%s, `_job_version`=%s " + f"WHERE {pk_condition}", + args=(start_time, duration, version[:64]) + ) +``` + +### 3. Job table (jobs.py) + +Update version field length: +```python +version="" : varchar(64) +``` + +### 4. Version helper + +```python +def _get_job_version() -> str: + """Get version string, truncated to 64 chars.""" + from .settings import config + + method = config.jobs.version_method + if method is None or method == "none": + return "" + elif method == "git": + try: + result = subprocess.run( + ["git", "rev-parse", "--short", "HEAD"], + capture_output=True, + text=True, + timeout=5, + ) + return result.stdout.strip()[:64] if result.returncode == 0 else "" + except Exception: + return "" + return "" +``` + +## Example Usage + +```python +# Enable job metadata for new tables +dj.config.jobs.add_job_metadata = True + +@schema +class ProcessedData(dj.Computed): + definition = """ + -> RawData + --- + result : float + """ + + def make(self, key): + # User code - unaware of hidden attributes + self.insert1({**key, 'result': compute(key)}) + +# Job metadata automatically added and populated: +# _job_start_time, _job_duration, _job_version + +# User-facing API unaffected: +ProcessedData().heading.names # ['raw_data_id', 'result'] +ProcessedData().to_dicts() # Returns only visible attributes + +# Access hidden attributes explicitly if needed: +ProcessedData().to_arrays('_job_start_time', '_job_duration', '_job_version') +``` + +## Summary of Design Decisions + +| Decision | Resolution | +|----------|------------| +| Configuration | `config.jobs.add_job_metadata` (default False) | +| Environment variable | `DJ_JOBS_ADD_JOB_METADATA` | +| Existing tables | No automatic ALTER - silently skip metadata if columns absent | +| Retrofitting | Manual via `datajoint.migrate.add_job_metadata_columns()` utility | +| Populate modes | Record metadata in both direct and distributed modes | +| Part tables | No metadata columns - only master tables | +| Version length | varchar(64) in both jobs table and computed tables | +| Binary operators | Hidden attributes excluded via USING clause instead of NATURAL JOIN | +| Failed makes | N/A - transaction rolls back, no rows to update | diff --git a/src/reference/specs/master-part.md b/src/reference/specs/master-part.md new file mode 100644 index 00000000..6f9ecc27 --- /dev/null +++ b/src/reference/specs/master-part.md @@ -0,0 +1,394 @@ +# Master-Part Relationships Specification + +## Overview + +Master-Part relationships model compositional data where a master entity contains multiple detail records. Part tables provide a way to store variable-length, structured data associated with each master entity while maintaining strict referential integrity. + +--- + +## 1. Definition + +### 1.1 Master Table + +Any table class (`Manual`, `Lookup`, `Imported`, `Computed`) can serve as a master: + +```python +@schema +class Session(dj.Manual): + definition = """ + subject_id : varchar(16) + session_idx : uint8 + --- + session_date : date + """ +``` + +### 1.2 Part Table + +Part tables are nested classes inheriting from `dj.Part`: + +```python +@schema +class Session(dj.Manual): + definition = """ + subject_id : varchar(16) + session_idx : uint8 + --- + session_date : date + """ + + class Trial(dj.Part): + definition = """ + -> master + trial_idx : uint16 + --- + stimulus : varchar(32) + response : varchar(32) + """ +``` + +### 1.3 SQL Naming + +| Python | SQL Table Name | +|--------|----------------| +| `Session` | `schema`.`session` | +| `Session.Trial` | `schema`.`session__trial` | + +Part tables use double underscore (`__`) separator in SQL. + +### 1.4 Master Reference + +Within a Part definition, reference the master using: + +```python +-> master # lowercase keyword (preferred) +-> Session # explicit class name +``` + +The `-> master` reference: +- Automatically inherits master's primary key +- Creates foreign key constraint to master +- Enforces ON DELETE RESTRICT (by default) + +--- + +## 2. Integrity Constraints + +### 2.1 Compositional Integrity + +Master-Part relationships enforce **compositional integrity**: + +1. **Existence**: Parts cannot exist without their master +2. **Cohesion**: Parts should be deleted/dropped with their master +3. **Atomicity**: Master and parts form a logical unit + +### 2.2 Foreign Key Behavior + +Part tables have implicit foreign key to master: + +```sql +FOREIGN KEY (master_pk) REFERENCES master_table (master_pk) +ON UPDATE CASCADE +ON DELETE RESTRICT +``` + +The `ON DELETE RESTRICT` prevents orphaned parts at the database level. + +--- + +## 3. Insert Operations + +### 3.1 Master-First Insertion + +Master must exist before inserting parts: + +```python +# Insert master +Session.insert1({ + 'subject_id': 'M001', + 'session_idx': 1, + 'session_date': '2026-01-08' +}) + +# Insert parts +Session.Trial.insert([ + {'subject_id': 'M001', 'session_idx': 1, 'trial_idx': 1, 'stimulus': 'A', 'response': 'left'}, + {'subject_id': 'M001', 'session_idx': 1, 'trial_idx': 2, 'stimulus': 'B', 'response': 'right'}, +]) +``` + +### 3.2 Atomic Insertion + +For atomic master+parts insertion, use transactions: + +```python +with dj.conn().transaction: + Session.insert1(master_data) + Session.Trial.insert(trials_data) +``` + +### 3.3 Computed Tables with Parts + +In `make()` methods, use `self.insert1()` for master and `self.PartName.insert()` for parts: + +```python +class ProcessedSession(dj.Computed): + definition = """ + -> Session + --- + n_trials : uint16 + """ + + class TrialResult(dj.Part): + definition = """ + -> master + -> Session.Trial + --- + score : float32 + """ + + def make(self, key): + trials = (Session.Trial & key).fetch() + results = process(trials) + + self.insert1({**key, 'n_trials': len(trials)}) + self.TrialResult.insert(results) +``` + +--- + +## 4. Delete Operations + +### 4.1 Cascade from Master + +Deleting from master cascades to parts: + +```python +# Deletes session AND all its trials +(Session & {'subject_id': 'M001', 'session_idx': 1}).delete() +``` + +### 4.2 Part Integrity Parameter + +Direct deletion from Part tables is controlled by `part_integrity`: + +```python +def delete(self, part_integrity: str = "enforce", ...) -> int +``` + +| Value | Behavior | +|-------|----------| +| `"enforce"` | (default) Error if parts deleted without masters | +| `"ignore"` | Allow deleting parts without masters (breaks integrity) | +| `"cascade"` | Also delete masters when parts are deleted | + +### 4.3 Default Behavior (enforce) + +```python +# Error: Cannot delete from Part directly +Session.Trial.delete() +# DataJointError: Cannot delete from a Part directly. +# Delete from master instead, or use part_integrity='ignore' +# to break integrity, or part_integrity='cascade' to also delete master. +``` + +### 4.4 Breaking Integrity (ignore) + +```python +# Allow direct part deletion (master retains incomplete parts) +(Session.Trial & {'trial_idx': 1}).delete(part_integrity="ignore") +``` + +**Use cases:** +- Removing specific invalid trials +- Partial data cleanup +- Testing/debugging + +**Warning:** This leaves masters with incomplete part data. + +### 4.5 Cascade to Master (cascade) + +```python +# Delete parts AND their masters +(Session.Trial & condition).delete(part_integrity="cascade") +``` + +**Behavior:** +- Identifies affected masters +- Deletes masters (which cascades to ALL their parts) +- Maintains compositional integrity + +### 4.6 Behavior Matrix + +| Operation | Result | +|-----------|--------| +| `Master.delete()` | Deletes master + all parts | +| `Part.delete()` | Error (default) | +| `Part.delete(part_integrity="ignore")` | Deletes parts only | +| `Part.delete(part_integrity="cascade")` | Deletes parts + masters | + +--- + +## 5. Drop Operations + +### 5.1 Drop Master + +Dropping a master table also drops all its part tables: + +```python +Session.drop() # Drops Session AND Session.Trial +``` + +### 5.2 Drop Part Directly + +Part tables cannot be dropped directly by default: + +```python +Session.Trial.drop() +# DataJointError: Cannot drop a Part directly. Drop master instead, +# or use part_integrity='ignore' to force. + +# Override with part_integrity="ignore" +Session.Trial.drop(part_integrity="ignore") +``` + +**Note:** `part_integrity="cascade"` is not supported for drop (too destructive). + +### 5.3 Schema Drop + +Dropping schema drops all tables including masters and parts: + +```python +schema.drop(prompt=False) +``` + +--- + +## 6. Query Operations + +### 6.1 Accessing Parts + +```python +# From master class +Session.Trial + +# From master instance +session = Session() +session.Trial +``` + +### 6.2 Joining Master and Parts + +```python +# All trials with session info +Session * Session.Trial + +# Filtered +(Session & {'subject_id': 'M001'}) * Session.Trial +``` + +### 6.3 Aggregating Parts + +```python +# Count trials per session +Session.aggr(Session.Trial, n_trials='count(trial_idx)') + +# Statistics +Session.aggr( + Session.Trial, + n_trials='count(trial_idx)', + n_correct='sum(response = stimulus)' +) +``` + +--- + +## 7. Best Practices + +### 7.1 When to Use Part Tables + +**Good use cases:** +- Trials within sessions +- Electrodes within probes +- Cells within imaging fields +- Frames within videos +- Rows within files + +**Avoid when:** +- Parts have independent meaning (use regular FK instead) +- Need to query parts without master context +- Parts reference multiple masters + +### 7.2 Naming Conventions + +```python +class Master(dj.Manual): + class Detail(dj.Part): # Singular, descriptive + ... + class Items(dj.Part): # Or plural for collections + ... +``` + +### 7.3 Part Primary Keys + +Include minimal additional keys beyond master reference: + +```python +class Session(dj.Manual): + definition = """ + session_id : uint32 + --- + ... + """ + + class Trial(dj.Part): + definition = """ + -> master + trial_idx : uint16 # Only trial-specific key + --- + ... + """ +``` + +### 7.4 Avoiding Deep Nesting + +Part tables cannot have their own parts. For hierarchical data: + +```python +# Instead of nested parts, use separate tables with FKs +@schema +class Session(dj.Manual): + definition = """...""" + class Trial(dj.Part): + definition = """...""" + +@schema +class TrialEvent(dj.Manual): # Not a Part, but references Trial + definition = """ + -> Session.Trial + event_idx : uint8 + --- + event_time : float32 + """ +``` + +--- + +## 8. Implementation Reference + +| File | Purpose | +|------|---------| +| `user_tables.py` | Part class definition | +| `table.py` | delete() with part_integrity | +| `schemas.py` | Part table decoration | +| `declare.py` | Part table SQL generation | + +--- + +## 9. Error Messages + +| Error | Cause | Solution | +|-------|-------|----------| +| "Cannot delete from Part directly" | Called Part.delete() with part_integrity="enforce" | Delete from master, or use part_integrity="ignore" or "cascade" | +| "Cannot drop Part directly" | Called Part.drop() with part_integrity="enforce" | Drop master table, or use part_integrity="ignore" | +| "Attempt to delete part before master" | Cascade would delete part without master | Use part_integrity="ignore" or "cascade" | diff --git a/src/reference/specs/npy-codec.md b/src/reference/specs/npy-codec.md new file mode 100644 index 00000000..eace4195 --- /dev/null +++ b/src/reference/specs/npy-codec.md @@ -0,0 +1,290 @@ +# `` Codec Specification + +Schema-addressed storage for numpy arrays as portable `.npy` files. + +## Overview + +The `` codec stores numpy arrays as standard `.npy` files using +schema-addressed paths that mirror the database structure. On fetch, it returns +`NpyRef`β€”a lazy reference that provides metadata access without downloading, +and transparent numpy integration via the `__array__` protocol. + +**Key characteristics:** + +- **Store only**: Requires `@` modifier (`` or ``) +- **Schema-addressed**: Paths mirror database structure (`{schema}/{table}/{pk}/{attr}.npy`) +- **Lazy loading**: Shape/dtype available without download +- **Transparent**: Use directly in numpy operations +- **Portable**: Standard `.npy` format readable by numpy, MATLAB, etc. + +## Quick Start + +```python +import datajoint as dj +import numpy as np + +@schema +class Recording(dj.Manual): + definition = """ + recording_id : int + --- + waveform : + """ + +# Insert - just pass the array +Recording.insert1({ + 'recording_id': 1, + 'waveform': np.random.randn(1000, 32), +}) + +# Fetch - returns NpyRef (lazy) +ref = (Recording & 'recording_id=1').fetch1('waveform') + +# Metadata without download +ref.shape # (1000, 32) +ref.dtype # float64 + +# Use in numpy ops - downloads automatically +mean = np.mean(ref, axis=0) + +# Or load explicitly +arr = ref.load() +``` + +## NpyRef: Lazy Array Reference + +When you fetch an `` attribute, you get an `NpyRef` object: + +```python +ref = (Recording & key).fetch1('waveform') +type(ref) # +``` + +### Metadata Access (No I/O) + +```python +ref.shape # tuple: (1000, 32) +ref.dtype # numpy.dtype: float64 +ref.ndim # int: 2 +ref.size # int: 32000 +ref.nbytes # int: 256000 (estimated) +ref.path # str: "my_schema/recording/recording_id=1/waveform.npy" +ref.store # str or None: store name +ref.is_loaded # bool: False (until loaded) +``` + +### Loading Data + +**Explicit loading:** +```python +arr = ref.load() # Downloads, caches, returns np.ndarray +arr = ref.load() # Returns cached copy (no re-download) +``` + +**Implicit loading via `__array__`:** +```python +# These all trigger automatic download +result = ref + 1 +result = np.mean(ref) +result = np.dot(ref, weights) +arr = np.asarray(ref) +``` + +**Indexing/slicing:** +```python +first_row = ref[0] # Loads then indexes +subset = ref[100:200] # Loads then slices +``` + +### Memory Mapping + +For very large arrays, use `mmap_mode` to access data without loading it all: + +```python +# Memory-mapped loading (random access) +arr = ref.load(mmap_mode='r') + +# Efficient random access - only reads needed portions +slice = arr[1000:2000, :] +chunk = arr[::100] +``` + +**Modes:** +- `'r'` - Read-only (recommended) +- `'r+'` - Read-write (modifications persist) +- `'c'` - Copy-on-write (changes not saved) + +**Performance characteristics:** +- Local filesystem stores: memory-maps the file directly (zero-copy) +- Remote stores (S3, GCS): downloads to local cache first, then memory-maps + +**When to use:** +- Arrays too large to fit in memory +- Only need random access to portions of the array +- Processing data in chunks + +### Safe Bulk Fetch + +The lazy design protects against accidental mass downloads: + +```python +# Fetch 10,000 recordings - NO downloads happen yet +recs = Recording.fetch() + +# Inspect without downloading +for rec in recs: + ref = rec['waveform'] + print(f"Shape: {ref.shape}, dtype: {ref.dtype}") # No I/O + +# Download only what you need +large_arrays = [rec['waveform'] for rec in recs if rec['waveform'].shape[0] > 1000] +for ref in large_arrays: + process(ref.load()) # Downloads here +``` + +### Repr for Debugging + +```python +>>> ref +NpyRef(shape=(1000, 32), dtype=float64, not loaded) + +>>> ref.load() +>>> ref +NpyRef(shape=(1000, 32), dtype=float64, loaded) +``` + +## Table Definition + +```python +@schema +class Recording(dj.Manual): + definition = """ + recording_id : int + --- + waveform : # default store + spectrogram : # specific store + """ +``` + +## Storage Details + +### Addressing Scheme + +The `` codec uses **schema-addressed** storage, where paths mirror the +database schema structure. This creates a browsable organization in object +storage that reflects your data model. + +### Type Chain + +``` + β†’ "json" (metadata stored in JSON column) +``` + +### File Format + +- Format: NumPy `.npy` (version 1.0 or 2.0 depending on array size) +- Encoding: `numpy.save()` with `allow_pickle=False` +- Extension: `.npy` + +### Schema-Addressed Path Construction + +``` +{schema}/{table}/{primary_key_values}/{attribute}.npy +``` + +Example: `lab_ephys/recording/recording_id=1/waveform.npy` + +This schema-addressed layout means you can browse the object store and understand +the organization because it mirrors your database schema. + +### JSON Metadata + +The database column stores: + +```json +{ + "path": "lab_ephys/recording/recording_id=1/waveform.npy", + "store": "main", + "dtype": "float64", + "shape": [1000, 32] +} +``` + +## Validation + +The codec validates on insert: + +- Value must be `numpy.ndarray` +- Array must not have `object` dtype + +```python +# Valid +Recording.insert1({'recording_id': 1, 'waveform': np.array([1, 2, 3])}) + +# Invalid - not an array +Recording.insert1({'recording_id': 1, 'waveform': [1, 2, 3]}) +# DataJointError: requires numpy.ndarray, got list + +# Invalid - object dtype +Recording.insert1({'recording_id': 1, 'waveform': np.array([{}, []])}) +# DataJointError: does not support object dtype arrays +``` + +## Direct File Access + +Files are stored at predictable paths and can be accessed directly: + +```python +# Get the storage path +ref = (Recording & 'recording_id=1').fetch1('waveform') +print(ref.path) # "my_schema/recording/recording_id=1/waveform.npy" + +# Load directly with numpy (if you have store access) +arr = np.load('/path/to/store/my_schema/recording/recording_id=1/waveform.npy') +``` + +## Comparison with Other Codecs + +| Codec | Format | Addressing | Lazy | Memory Map | Portability | +|-------|--------|------------|------|------------|-------------| +| `` | `.npy` | Schema | Yes (NpyRef) | Yes | High (numpy, MATLAB) | +| `` | varies | Schema | Yes (ObjectRef) | No | Depends on content | +| `` | pickle | Hash | No | No | Python only | +| `` | raw bytes | Hash | No | No | N/A | + +**Addressing schemes:** +- **Schema-addressed**: Path mirrors database structure. Browsable, one location per entity. +- **Hash-addressed**: Path from content hash. Automatic deduplication. + +## When to Use `` + +**Use `` when:** +- Storing single numpy arrays +- Interoperability matters (non-Python tools) +- You want lazy loading with metadata inspection +- Fetching many rows where not all arrays are needed +- Random access to large arrays via memory mapping +- Browsable object store organization is valuable + +**Use `` when:** +- Storing arbitrary Python objects (dicts, lists, mixed types) +- Arrays are small and eager loading is fine +- MATLAB compatibility with DataJoint's mYm format is needed +- Deduplication is beneficial (hash-addressed) + +**Use `` when:** +- Storing files/folders (Zarr, HDF5, multi-file outputs) +- Content is not a single numpy array + +## Limitations + +1. **Single array only**: For multiple arrays, use separate attributes or `` with `.npz` +2. **No compression**: For compressed storage, use a custom codec with `numpy.savez_compressed` +3. **No object dtype**: Arrays containing arbitrary Python objects are not supported +4. **Store only**: Cannot store inline in the database column + +## See Also + +- [Type System Specification](type-system.md) - Complete type system overview +- [Codec API](codec-api.md) - Creating custom codecs +- [Object Storage](type-system.md#object--path-addressed-storage) - Path-addressed storage details diff --git a/src/reference/specs/object-store-configuration.md b/src/reference/specs/object-store-configuration.md new file mode 100644 index 00000000..852c3ffd --- /dev/null +++ b/src/reference/specs/object-store-configuration.md @@ -0,0 +1,785 @@ +# Object Store Configuration Specification + +This specification defines DataJoint's unified object store system, including store configuration, path generation algorithms, and storage models. + +## Overview + +DataJoint's Object-Augmented Schema (OAS) integrates relational tables with object storage as a single coherent system. Large data objects are stored in file systems or cloud storage while maintaining full referential integrity with the relational database. + +### Storage Models + +DataJoint 2.0 supports three storage models, all sharing the same store configuration: + +| Model | Data Types | Path Structure | Integration | Use Case | +|-------|------------|----------------|-------------|----------| +| **Hash-addressed** | ``, `` | Content-addressed by hash | **Integrated** (OAS) | Immutable data, automatic deduplication | +| **Schema-addressed** | ``, `` | Key-based hierarchical paths | **Integrated** (OAS) | Mutable data, streaming access, arrays | +| **Filepath** | `` | User-managed paths | **Reference** | User-managed files (no lifecycle management) | + +**Key distinction:** +- **Hash-addressed** and **schema-addressed** storage are **integrated** into the Object-Augmented Schema. DataJoint manages their lifecycle, paths, integrity, garbage collection, transaction safety, and deduplication. +- **Filepath** storage stores only the path string. DataJoint provides no lifecycle management, garbage collection, transaction safety, or deduplication. Users control file creation, organization, and lifecycle. + +**Legacy note:** DataJoint 0.14.x only supported hash-addressed (called "external") and filepath storage. Schema-addressed storage is new in 2.0. + +## Store Configuration + +### Minimal Configuration + +Every store requires two fields: + +```json +{ + "stores": { + "default": "main", + "main": { + "protocol": "file", + "location": "/data/my-project" + } + } +} +``` + +This creates a store named `main` and designates it as the default. + +### Default Store + +DataJoint uses two default settings to reflect the architectural distinction between integrated and reference storage: + +#### stores.default β€” Integrated Storage (OAS) + +The `stores.default` setting determines which store is used for **integrated storage** (hash-addressed and schema-addressed) when no store is specified: + +```python +# These are equivalent when stores.default = "main" +signal : # Uses stores.default +signal : # Explicitly names store + +arrays : # Uses stores.default +arrays : # Explicitly names store +``` + +**Rules:** +- `stores.default` must be a string naming a configured store +- Required for ``, ``, ``, `` without explicit `@store` +- Each project typically uses one primary store for integrated data + +#### stores.filepath_default β€” Filepath References + +The `stores.filepath_default` setting determines which store is used for **filepath references** when no store is specified: + +```python +# These are equivalent when stores.filepath_default = "raw_data" +recording : # Uses stores.filepath_default +recording : # Explicitly names store +``` + +**Rules:** +- `stores.filepath_default` must be a string naming a configured store +- Required for `` without explicit store name +- Often configured differently from `stores.default` because filepath references are not part of OAS +- Users manage file lifecycle and organization + +**Why separate defaults?** + +Integrated storage (hash, schema) is managed by DataJoint as part of the Object-Augmented Schemaβ€”DataJoint controls paths, lifecycle, integrity, garbage collection, transaction safety, and deduplication. Filepath storage is user-managedβ€”DataJoint only stores the path string and provides no lifecycle management, garbage collection, transaction safety, or deduplication. These are architecturally distinct, so they often use different storage locations and require separate defaults. + +### Complete Store Configuration + +A fully configured store specifying all sections: + +```json +{ + "stores": { + "default": "main", + "main": { + "protocol": "s3", + "endpoint": "s3.amazonaws.com", + "bucket": "neuroscience-data", + "location": "lab-project-2024", + + "hash_prefix": "blobs", + "schema_prefix": "arrays", + "filepath_prefix": "imported", + + "subfolding": [2, 2], + "partition_pattern": "subject_id/session_date", + "token_length": 8 + } + } +} +``` + +### Section Prefixes + +Each store is divided into sections controlled by prefix configuration. The `*_prefix` parameters define the path prefix for each storage section: + +| Configuration Parameter | Default | Storage Section | Used By | +|------------------------|---------|-----------------|---------| +| `hash_prefix` | `"_hash"` | Hash-addressed section | ``, `` | +| `schema_prefix` | `"_schema"` | Schema-addressed section | ``, `` | +| `filepath_prefix` | `null` | Filepath section (optional) | `` | + +**Validation rules:** +1. All prefixes must be mutually exclusive (no nesting) +2. `hash_prefix` and `schema_prefix` are reserved for DataJoint +3. `filepath_prefix` is optional: + - `null` (default): filepaths can use any path except reserved sections + - `"some/prefix"`: all filepaths must start with this prefix + +**Example with custom prefixes:** + +```json +{ + "hash_prefix": "content_addressed", + "schema_prefix": "structured_data", + "filepath_prefix": "user_files" +} +``` + +Results in these sections: +- `{location}/content_addressed/{schema}/{hash}` β€” hash-addressed +- `{location}/structured_data/{schema}/{table}/{key}/` β€” schema-addressed +- `{location}/user_files/{user_path}` β€” filepath (required prefix) + +### Multiple Stores + +Configure multiple stores for different data types or storage tiers: + +```json +{ + "stores": { + "default": "main", + "filepath_default": "raw_data", + "main": { + "protocol": "file", + "location": "/data/fast-storage", + "hash_prefix": "blobs", + "schema_prefix": "arrays" + }, + "archive": { + "protocol": "s3", + "endpoint": "s3.amazonaws.com", + "bucket": "archive-bucket", + "location": "long-term-storage", + "hash_prefix": "archived_blobs", + "schema_prefix": "archived_arrays", + "subfolding": [2, 2] + }, + "raw_data": { + "protocol": "file", + "location": "/data/acquisition", + "filepath_prefix": "recordings" + } + } +} +``` + +Use named stores in table definitions: + +```python +@schema +class Recording(dj.Manual): + definition = """ + recording_id : uuid + --- + metadata : # Fast storage, hash-addressed + raw_file : # Reference existing acquisition file + processed : # Fast storage, schema-addressed + backup : # Long-term storage + """ +``` + +## Secret Management + +Store credentials separately from configuration files using the `.secrets/` directory. + +### Secrets Directory Structure + +``` +project/ +β”œβ”€β”€ datajoint.json # Non-sensitive configuration +└── .secrets/ # Credentials (gitignored) + β”œβ”€β”€ .gitignore # Ensures secrets aren't committed + β”œβ”€β”€ database.user + β”œβ”€β”€ database.password + β”œβ”€β”€ stores.main.access_key + β”œβ”€β”€ stores.main.secret_key + β”œβ”€β”€ stores.archive.access_key + └── stores.archive.secret_key +``` + +### Configuration Priority + +DataJoint loads configuration in this order (highest priority first): + +1. **Environment variables**: `DJ_HOST`, `DJ_USER`, `DJ_PASS` +2. **Secrets directory**: `.secrets/database.user`, `.secrets/stores.main.access_key` +3. **Config file**: `datajoint.json` +4. **Defaults**: Built-in defaults + +### Secrets File Format + +Each secret file contains a single value (no quotes, no JSON): + +```bash +# .secrets/database.password +my_secure_password +``` + +```bash +# .secrets/stores.main.access_key +AKIAIOSFODNN7EXAMPLE +``` + +### Per-Store Credentials + +Store credentials use the naming pattern: `stores..` + +**S3 stores:** +``` +.secrets/stores.main.access_key +.secrets/stores.main.secret_key +``` + +**GCS stores:** +``` +.secrets/stores.gcs_store.token +``` + +**Azure stores:** +``` +.secrets/stores.azure_store.account_key +``` + +### Setting Up Secrets + +```bash +# Create secrets directory +mkdir .secrets +echo "*" > .secrets/.gitignore + +# Add credentials (no quotes) +echo "analyst" > .secrets/database.user +echo "dbpass123" > .secrets/database.password +echo "AKIAIOSFODNN7EXAMPLE" > .secrets/stores.main.access_key +echo "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" > .secrets/stores.main.secret_key + +# Verify .secrets/ is gitignored +git check-ignore .secrets/database.password # Should output the path +``` + +### Template Generation + +Generate configuration templates: + +```python +import datajoint as dj + +# Create config file +dj.config.save_template('datajoint.json') + +# Create config + secrets directory with placeholders +dj.config.save_template('datajoint.json', create_secrets_dir=True) +``` + +## Path Generation + +### Hash-Addressed Storage + +**Data types:** ``, `` + +**Path structure:** +``` +{location}/{hash_prefix}/{schema_name}/{hash}[.ext] +``` + +**With subfolding `[2, 2]`:** +``` +{location}/{hash_prefix}/{schema_name}/{h1}{h2}/{h3}{h4}/{hash}[.ext] +``` + +**Algorithm:** + +1. Serialize value using codec-specific format +2. Compute Blake2b hash of serialized data +3. Encode hash as base32 (lowercase, no padding) +4. Apply subfolding if configured +5. Construct path: `{hash_prefix}/{schema}/{subfolded_hash}` +6. Store metadata in relational database as JSON + +**Properties:** +- **Immutable**: Content defines path, cannot be changed +- **Deduplicated**: Identical content stored once +- **Integrity**: Hash validates content on retrieval + +**Example:** + +```python +# Table definition +@schema +class Experiment(dj.Manual): + definition = """ + experiment_id : int + --- + data : + """ + +# With config: +# hash_prefix = "blobs" +# location = "/data/store" +# subfolding = [2, 2] + +# Insert +Experiment.insert1({'experiment_id': 1, 'data': my_data}) + +# Resulting path: +# /data/store/blobs/my_schema/ab/cd/abcdef123456... +``` + +### Schema-Addressed Storage + +**Data types:** ``, `` + +**Path structure (no partitioning):** +``` +{location}/{schema_prefix}/{schema_name}/{table_name}/{key_string}/{field_name}.{token}.{ext} +``` + +**With partitioning:** +``` +{location}/{schema_prefix}/{partition_path}/{schema_name}/{table_name}/{remaining_key}/{field_name}.{token}.{ext} +``` + +**Algorithm:** + +1. Extract primary key values from the row +2. If partition pattern configured, extract partition attributes +3. Build partition path from partition attributes (if any) +4. Build remaining key string from non-partition primary key attributes +5. Generate random token (default 8 characters) +6. Construct full path +7. Store path metadata in relational database as JSON + +**Partition pattern format:** + +```json +{ + "partition_pattern": "subject_id/session_date" +} +``` + +This creates paths like: +``` +{schema_prefix}/subject_id=042/session_date=2024-01-15/{schema}/{table}/{remaining_key}/ +``` + +**Key string encoding:** + +Primary key values are encoded as: `{attr}={value}` + +- Multiple attributes joined with `/` +- Values URL-encoded if necessary +- Order matches table definition + +**Properties:** +- **Mutable**: Can overwrite by writing to same path +- **Streaming**: fsspec integration for lazy loading +- **Organized**: Hierarchical structure mirrors data relationships + +**Example without partitioning:** + +```python +@schema +class Recording(dj.Manual): + definition = """ + subject_id : int + session_id : int + --- + neural_data : + """ + +# With config: +# schema_prefix = "arrays" +# location = "/data/store" +# token_length = 8 + +Recording.insert1({ + 'subject_id': 42, + 'session_id': 100, + 'neural_data': zarr_array +}) + +# Resulting path: +# /data/store/arrays/neuroscience/Recording/subject_id=42/session_id=100/neural_data.x8a7b2c4.zarr +``` + +**Example with partitioning:** + +```python +# Same table, but with partition configuration: +# partition_pattern = "subject_id/session_date" + +@schema +class Recording(dj.Manual): + definition = """ + subject_id : int + session_date : date + session_id : int + --- + neural_data : + """ + +Recording.insert1({ + 'subject_id': 42, + 'session_date': '2024-01-15', + 'session_id': 100, + 'neural_data': zarr_array +}) + +# Resulting path: +# /data/store/arrays/subject_id=42/session_date=2024-01-15/neuroscience/Recording/session_id=100/neural_data.x8a7b2c4.zarr +``` + +**Partition extraction:** + +When a partition pattern is configured: + +1. Check if table has all partition attributes in primary key +2. If yes: extract those attributes to partition path, remaining attributes to key path +3. If no: use normal structure (no partitioning for this table) + +This allows a single `partition_pattern` to apply to multiple tables, with automatic fallback for tables lacking partition attributes. + +**Path collision prevention:** + +The random token ensures uniqueness: +- 8 characters (default): 62^8 = ~218 trillion combinations +- Collision probability negligible for typical table sizes +- Token regenerated on each write + +### Filepath Storage + +**Data type:** `` + +**Path structure:** +``` +{location}/{filepath_prefix}/{user_path} +``` + +Or if `filepath_prefix = null`: +``` +{location}/{user_path} +``` + +**Algorithm:** + +1. User provides relative path within store +2. Validate path doesn't use reserved sections (`hash_prefix`, `schema_prefix`) +3. If `filepath_prefix` configured, validate path starts with it +4. Check file exists at `{location}/{user_path}` +5. Record path, size, and timestamp in JSON metadata +6. No file copying occurs + +**Properties:** +- **Path-only storage**: DataJoint stores path string, no file management +- **No lifecycle management**: No garbage collection, transaction safety, or deduplication +- **User-managed**: User controls file creation, organization, and lifecycle +- **Collision-prone**: **User responsible for avoiding name collisions** +- **Flexible**: Can reference existing files or create new ones + +**Collision handling:** + +DataJoint does **not** prevent filename collisions for filepath storage. Users must ensure: + +1. Unique paths for each referenced file +2. No overwrites of files still referenced by database +3. Coordination if multiple processes write to same store + +**Strategies for avoiding collisions:** + +```python +# Strategy 1: Include primary key in path +recording_path = f"subject_{subject_id}/session_{session_id}/data.bin" + +# Strategy 2: Use UUIDs +import uuid +recording_path = f"recordings/{uuid.uuid4()}.nwb" + +# Strategy 3: Timestamps +from datetime import datetime +recording_path = f"data_{datetime.now().isoformat()}.dat" + +# Strategy 4: Enforce via filepath_prefix +# Config: "filepath_prefix": "recordings" +# All paths must start with recordings/, organize within that namespace +``` + +**Reserved sections:** + +Filepath storage cannot use paths starting with configured `hash_prefix` or `schema_prefix`: + +```python +# Invalid (default prefixes) +table.insert1({'id': 1, 'file': '_hash/data.bin'}) # ERROR +table.insert1({'id': 2, 'file': '_schema/data.zarr'}) # ERROR + +# Invalid (custom prefixes: hash_prefix="blobs") +table.insert1({'id': 3, 'file': 'blobs/data.bin'}) # ERROR + +# Valid +table.insert1({'id': 4, 'file': 'raw/subject01/rec.bin'}) # OK +``` + +**Example:** + +```python +@schema +class RawRecording(dj.Manual): + definition = """ + recording_id : uuid + --- + acquisition_file : + """ + +# With config: +# filepath_prefix = "imported" +# location = "/data/acquisition" + +# File already exists at: /data/acquisition/imported/subject01/session001/data.nwb + +RawRecording.insert1({ + 'recording_id': my_uuid, + 'acquisition_file': 'imported/subject01/session001/data.nwb' +}) + +# DataJoint validates file exists, stores reference +# User responsible for ensuring path uniqueness across recordings +``` + +## Storage Type Comparison + +| Feature | Hash-addressed | Schema-addressed | Filepath | +|---------|----------------|------------------|----------| +| **Mutability** | Immutable | Mutable | User-managed | +| **Deduplication** | Automatic | None | None | +| **Streaming** | No (load full) | Yes (fsspec) | Yes (fsspec) | +| **Organization** | Flat (by hash) | Hierarchical (by key) | User-defined | +| **Collision handling** | Automatic (by content) | Automatic (token) | **User responsibility** | +| **DataJoint manages lifecycle** | Yes | Yes | **No** | +| **Suitable for** | Immutable blobs | Large mutable arrays | Existing files | + +## Protocol-Specific Configuration + +### File Protocol + +```json +{ + "protocol": "file", + "location": "/data/my-project", + "hash_prefix": "blobs", + "schema_prefix": "arrays", + "filepath_prefix": null +} +``` + +**Required:** `protocol`, `location` + +### S3 Protocol + +```json +{ + "protocol": "s3", + "endpoint": "s3.amazonaws.com", + "bucket": "my-bucket", + "location": "my-project/production", + "secure": true, + "hash_prefix": "blobs", + "schema_prefix": "arrays" +} +``` + +**Required:** `protocol`, `endpoint`, `bucket`, `location`, `access_key`, `secret_key` + +**Credentials:** Store in `.secrets/stores..access_key` and `.secrets/stores..secret_key` + +### GCS Protocol + +```json +{ + "protocol": "gcs", + "bucket": "my-gcs-bucket", + "location": "my-project", + "project": "my-gcp-project", + "hash_prefix": "blobs", + "schema_prefix": "arrays" +} +``` + +**Required:** `protocol`, `bucket`, `location`, `token` + +**Credentials:** Store in `.secrets/stores..token` (path to service account JSON) + +### Azure Protocol + +```json +{ + "protocol": "azure", + "container": "my-container", + "location": "my-project", + "hash_prefix": "blobs", + "schema_prefix": "arrays" +} +``` + +**Required:** `protocol`, `container`, `location`, `account_name`, `account_key` + +**Credentials:** Store in `.secrets/stores..account_key` + +## Migration from Legacy Storage + +DataJoint 0.14.x used separate configuration systems: + +### Legacy "External" Storage (Hash-addressed Integrated) + +```python +# 0.14.x config +dj.config['stores'] = { + 'my_store': { + 'protocol': 's3', + 'endpoint': 's3.amazonaws.com', + 'bucket': 'my-bucket', + 'location': 'my-project', + 'access_key': 'XXX', + 'secret_key': 'YYY' + } +} + +# 0.14.x usage +data : external-my_store +``` + +### 2.0 Equivalent + +```json +{ + "stores": { + "default": "my_store", + "my_store": { + "protocol": "s3", + "endpoint": "s3.amazonaws.com", + "bucket": "my-bucket", + "location": "my-project", + "hash_prefix": "_hash" + } + } +} +``` + +Credentials moved to `.secrets/`: +``` +.secrets/stores.my_store.access_key +.secrets/stores.my_store.secret_key +``` + +```python +# 2.0 usage (equivalent) +data : +``` + +### New in 2.0: Schema-addressed Storage + +Schema-addressed storage (``, ``) is entirely new in DataJoint 2.0. No migration needed as this feature didn't exist in 0.14.x. + +## Validation and Testing + +### Verify Store Configuration + +```python +import datajoint as dj + +# Check default store +spec = dj.config.get_store_spec() +print(f"Default store: {dj.config['stores']['default']}") +print(f"Protocol: {spec['protocol']}") +print(f"Location: {spec['location']}") +print(f"Hash prefix: {spec['hash_prefix']}") +print(f"Schema prefix: {spec['schema_prefix']}") +print(f"Filepath prefix: {spec['filepath_prefix']}") + +# Check named store +spec = dj.config.get_store_spec('archive') +print(f"Archive location: {spec['location']}") + +# List all stores +print(f"Configured stores: {list(dj.config['stores'].keys())}") +``` + +### Test Storage Access + +```python +from datajoint.hash_registry import get_store_backend + +# Test backend connectivity +backend = get_store_backend('main') +print(f"Backend type: {type(backend)}") + +# For file protocol, check paths exist +if spec['protocol'] == 'file': + import os + assert os.path.exists(spec['location']), f"Location not found: {spec['location']}" +``` + +## Best Practices + +### Store Organization + +1. **Use one default store** for most data +2. **Add specialized stores** for specific needs: + - `archive` β€” long-term cold storage + - `fast` β€” high-performance tier + - `shared` β€” cross-project data + - `raw` β€” acquisition files (filepath only) + +### Prefix Configuration + +1. **Use defaults** unless integrating with existing storage +2. **Choose meaningful names** if customizing: `blobs`, `arrays`, `user_files` +3. **Keep prefixes short** to minimize path length + +### Secret Management + +1. **Never commit credentials** to version control +2. **Use `.secrets/` directory** for all credentials +3. **Set restrictive permissions**: `chmod 700 .secrets` +4. **Document required secrets** in project README + +### Partitioning Strategy + +1. **Choose partition attributes carefully:** + - High cardinality (many unique values) + - Natural data organization (subject, date) + - Query patterns (often filtered by these attributes) + +2. **Example patterns:** + - Neuroscience: `subject_id/session_date` + - Genomics: `sample_id/sequencing_run` + - Microscopy: `experiment_id/imaging_session` + +3. **Avoid over-partitioning:** + - Don't partition by high-cardinality unique IDs + - Limit to 2-3 partition levels + +### Filepath Usage + +1. **Design naming conventions** before inserting data +2. **Include unique identifiers** in paths +3. **Document collision prevention strategy** for the team +4. **Consider using `filepath_prefix`** to enforce structure + +## See Also + +- [Configuration Reference](../configuration.md) β€” All configuration options +- [Configure Object Stores](../../how-to/configure-storage.md) β€” Setup guide +- [Type System Specification](type-system.md) β€” Data type definitions +- [Codec API Specification](codec-api.md) β€” Codec implementation details diff --git a/src/reference/specs/primary-keys.md b/src/reference/specs/primary-keys.md new file mode 100644 index 00000000..6a68220a --- /dev/null +++ b/src/reference/specs/primary-keys.md @@ -0,0 +1,318 @@ +# Primary Key Rules in Relational Operators + +In DataJoint, the result of each query operator produces a valid **entity set** with a well-defined **entity type** and **primary key**. This section specifies how the primary key is determined for each relational operator. + +## General Principle + +The primary key of a query result identifies unique entities in that result. For most operators, the primary key is preserved from the left operand. For joins, the primary key depends on the functional dependencies between the operands. + +## Integration with Semantic Matching + +Primary key determination is applied **after** semantic compatibility is verified. The evaluation order is: + +1. **Semantic Check**: `assert_join_compatibility()` ensures all namesakes are homologous (same lineage) +2. **PK Determination**: The "determines" relationship is computed using attribute names +3. **Left Join Validation**: If `left=True`, verify A β†’ B + +This ordering is important because: +- After semantic matching passes, namesakes represent semantically equivalent attributes +- The name-based "determines" check is therefore semantically valid +- Attribute names in the context of a semantically-valid join represent the same entity + +The "determines" relationship uses attribute **names** (not lineages directly) because: +- Lineage ensures namesakes are homologous +- Once verified, checking by name is equivalent to checking by semantic identity +- Aliased attributes (same lineage, different names) don't participate in natural joins anyway + +## Notation + +In the examples below, `*` marks primary key attributes: +- `A(x*, y*, z)` means A has primary key `{x, y}` and secondary attribute `z` +- `A β†’ B` means "A determines B" (defined below) + +### Rules by Operator + +| Operator | Primary Key Rule | +|----------|------------------| +| `A & B` (restriction) | PK(A) β€” preserved from left operand | +| `A - B` (anti-restriction) | PK(A) β€” preserved from left operand | +| `A.proj(...)` (projection) | PK(A) β€” preserved from left operand | +| `A.aggr(B, ...)` (aggregation) | PK(A) β€” preserved from left operand | +| `A.extend(B)` (extension) | PK(A) β€” requires A β†’ B | +| `A * B` (join) | Depends on functional dependencies (see below) | + +### Join Primary Key Rule + +The join operator requires special handling because it combines two entity sets. The primary key of `A * B` depends on the **functional dependency relationship** between the operands. + +#### Definitions + +**A determines B** (written `A β†’ B`): Every attribute in PK(B) is in A. + +``` +A β†’ B iff βˆ€b ∈ PK(B): b ∈ A +``` + +Since `PK(A) βˆͺ secondary(A) = all attributes in A`, this is equivalent to saying every attribute in B's primary key exists somewhere in A (as either a primary key or secondary attribute). + +Intuitively, `A β†’ B` means that knowing A's primary key is sufficient to determine B's primary key through the functional dependencies implied by A's structure. + +**B determines A** (written `B β†’ A`): Every attribute in PK(A) is in B. + +``` +B β†’ A iff βˆ€a ∈ PK(A): a ∈ B +``` + +#### Join Primary Key Algorithm + +For `A * B`: + +| Condition | PK(A * B) | Attribute Order | +|-----------|-----------|-----------------| +| A β†’ B | PK(A) | A's attributes first | +| B β†’ A (and not A β†’ B) | PK(B) | B's attributes first | +| Neither | PK(A) βˆͺ PK(B) | PK(A) first, then PK(B) βˆ’ PK(A) | + +When both `A β†’ B` and `B β†’ A` hold, the left operand takes precedence (use PK(A)). + +#### Examples + +**Example 1: B β†’ A** +``` +A: x*, y* +B: x*, z*, y (y is secondary in B, so z β†’ y) +``` +- A β†’ B? PK(B) = {x, z}. Is z in PK(A) or secondary in A? No (z not in A). **No.** +- B β†’ A? PK(A) = {x, y}. Is y in PK(B) or secondary in B? Yes (secondary). **Yes.** +- Result: **PK(A * B) = {x, z}** with B's attributes first. + +**Example 2: Both directions (bijection-like)** +``` +A: x*, y*, z (z is secondary in A) +B: y*, z*, x (x is secondary in B) +``` +- A β†’ B? PK(B) = {y, z}. Is z in PK(A) or secondary in A? Yes (secondary). **Yes.** +- B β†’ A? PK(A) = {x, y}. Is x in PK(B) or secondary in B? Yes (secondary). **Yes.** +- Both hold, prefer left operand: **PK(A * B) = {x, y}** with A's attributes first. + +**Example 3: Neither direction** +``` +A: x*, y* +B: z*, x (x is secondary in B) +``` +- A β†’ B? PK(B) = {z}. Is z in PK(A) or secondary in A? No. **No.** +- B β†’ A? PK(A) = {x, y}. Is y in PK(B) or secondary in B? No (y not in B). **No.** +- Result: **PK(A * B) = {x, y, z}** (union) with A's attributes first. + +**Example 4: A β†’ B (subordinate relationship)** +``` +Session: session_id* +Trial: session_id*, trial_num* (references Session) +``` +- A β†’ B? PK(Trial) = {session_id, trial_num}. Is trial_num in PK(Session) or secondary? No. **No.** +- B β†’ A? PK(Session) = {session_id}. Is session_id in PK(Trial)? Yes. **Yes.** +- Result: **PK(Session * Trial) = {session_id, trial_num}** with Trial's attributes first. + +**Join primary key determination**: + - `A * B` where `A β†’ B`: result has PK(A) + - `A * B` where `B β†’ A` (not `A β†’ B`): result has PK(B), B's attributes first + - `A * B` where both `A β†’ B` and `B β†’ A`: result has PK(A) (left preference) + - `A * B` where neither direction: result has PK(A) βˆͺ PK(B) + - Verify attribute ordering matches primary key source + - Verify non-commutativity: `A * B` vs `B * A` may differ in PK and order + +### Design Tradeoff: Predictability vs. Minimality + +The join primary key rule prioritizes **predictability** over **minimality**. In some cases, the resulting primary key may not be minimal (i.e., it may contain functionally redundant attributes). + +**Example of non-minimal result:** +``` +A: x*, y* +B: z*, x (x is secondary in B, so z β†’ x) +``` + +The mathematically minimal primary key for `A * B` would be `{y, z}` because: +- `z β†’ x` (from B's structure) +- `{y, z} β†’ {x, y, z}` (z gives us x, and we have y) + +However, `{y, z}` is problematic: +- It is **not the primary key of either operand** (A has `{x, y}`, B has `{z}`) +- It is **not the union** of the primary keys +- It represents a **novel entity type** that doesn't correspond to A, B, or their natural pairing + +This creates confusion: what kind of entity does `{y, z}` identify? + +**The simplified rule produces `{x, y, z}`** (the union), which: +- Is immediately recognizable as "one A entity paired with one B entity" +- Contains A's full primary key and B's full primary key +- May have redundancy (`x` is determined by `z`) but is semantically clear + +**Rationale:** Users can always project away redundant attributes if they need the minimal key. But starting with a predictable, interpretable primary key reduces confusion and errors. + +### Attribute Ordering + +The primary key attributes always appear **first** in the result's attribute list, followed by secondary attributes. When `B β†’ A` (and not `A β†’ B`), the join is conceptually reordered as `B * A` to maintain this invariant: + +- If PK = PK(A): A's attributes appear first +- If PK = PK(B): B's attributes appear first +- If PK = PK(A) βˆͺ PK(B): PK(A) attributes first, then PK(B) βˆ’ PK(A), then secondaries + +### Non-Commutativity + +With these rules, join is **not commutative** in terms of: +1. **Primary key selection**: `A * B` may have a different PK than `B * A` when one direction determines but not the other +2. **Attribute ordering**: The left operand's attributes appear first (unless B β†’ A) + +The **result set** (the actual rows returned) remains the same regardless of order, but the **schema** (primary key and attribute order) may differ. + +### Left Join Constraint + +For left joins (`A.join(B, left=True)`), the functional dependency **A β†’ B is required**. + +**Why this constraint exists:** + +In a left join, all rows from A are retained even if there's no matching row in B. For unmatched rows, B's attributes are NULL. This creates a problem for primary key validity: + +| Scenario | PK by inner join rule | Left join problem | +|----------|----------------------|-------------------| +| A β†’ B | PK(A) | βœ… Safe β€” A's attrs always present | +| B β†’ A | PK(B) | ❌ B's PK attrs could be NULL | +| Neither | PK(A) βˆͺ PK(B) | ❌ B's PK attrs could be NULL | + +**Example of invalid left join:** +``` +A: x*, y* PK(A) = {x, y} +B: x*, z*, y PK(B) = {x, z}, y is secondary + +Inner join: PK = {x, z} (B β†’ A rule) +Left join attempt: FAILS because z could be NULL for unmatched A rows +``` + +**Valid left join example:** +``` +Session: session_id*, date +Trial: session_id*, trial_num*, stimulus (references Session) + +Session.join(Trial, left=True) # OK: Session β†’ Trial +# PK = {session_id}, all sessions retained even without trials +``` + +**Error message:** +``` +DataJointError: Left join requires the left operand to determine the right operand (A β†’ B). +The following attributes from the right operand's primary key are not determined by +the left operand: ['z']. Use an inner join or restructure the query. +``` + +### Conceptual Note: Left Join as Extension + +When `A β†’ B`, the left join `A.join(B, left=True)` is conceptually distinct from the general join operator `A * B`. It is better understood as an **extension** operation rather than a join: + +| Aspect | General Join (A * B) | Left Join when A β†’ B | +|--------|---------------------|----------------------| +| Conceptual model | Cartesian product restricted to matching rows | Extend A with attributes from B | +| Row count | May increase, decrease, or stay same | Always equals len(A) | +| Primary key | Depends on functional dependencies | Always PK(A) | +| Relation to projection | Different operation | Variation of projection | + +**The extension perspective:** + +The operation `A.join(B, left=True)` when `A β†’ B` is closer to **projection** than to **join**: +- It adds new attributes to A (like `A.proj(..., new_attr=...)`) +- It preserves all rows of A +- It preserves A's primary key +- It lacks the Cartesian product aspect that defines joins + +DataJoint provides an explicit `extend()` method for this pattern: + +```python +# These are equivalent when A β†’ B: +A.join(B, left=True) +A.extend(B) # clearer intent: extend A with B's attributes +``` + +The `extend()` method: +- Requires `A β†’ B` (raises `DataJointError` otherwise) +- Does not expose `allow_nullable_pk` (that's an internal mechanism) +- Expresses the semantic intent: "add B's attributes to A's entities" + +**Relationship to aggregation:** + +A similar argument applies to `A.aggr(B, ...)`: +- It preserves A's primary key +- It adds computed attributes derived from B +- It's conceptually a variation of projection with grouping + +Both `A.join(B, left=True)` (when A β†’ B) and `A.aggr(B, ...)` can be viewed as **projection-like operations** that extend A's attributes while preserving its entity identity. + +### Bypassing the Left Join Constraint + +For special cases where the user takes responsibility for handling the potentially nullable primary key, the constraint can be bypassed using `allow_nullable_pk=True`: + +```python +# Normally blocked - A does not determine B +A.join(B, left=True) # Error: A β†’ B not satisfied + +# Bypass the constraint - user takes responsibility +A.join(B, left=True, allow_nullable_pk=True) # Allowed, PK = PK(A) βˆͺ PK(B) +``` + +When bypassed, the resulting primary key is the union of both operands' primary keys (PK(A) βˆͺ PK(B)). The user must ensure that subsequent operations (such as `GROUP BY` or projection) establish a valid primary key. The parameter name `allow_nullable_pk` reflects the specific issue: primary key attributes from the right operand could be NULL for unmatched rows. + +This mechanism is used internally by aggregation (`aggr`) when `exclude_nonmatching=False` (the default), which resets the primary key via the `GROUP BY` clause. + +### Aggregation Exception + +`A.aggr(B)` (with default `exclude_nonmatching=False`) uses a left join internally but has the **opposite requirement**: **B β†’ A** (the group expression B must have all of A's primary key attributes). + +This apparent contradiction is resolved by the `GROUP BY` clause: + +1. Aggregation requires B β†’ A so that B can be grouped by A's primary key +2. The intermediate left join `A LEFT JOIN B` would have an invalid PK under the normal left join rules +3. Aggregation internally allows the invalid PK, producing PK(A) βˆͺ PK(B) +4. The `GROUP BY PK(A)` clause then **resets** the primary key to PK(A) +5. The final result has PK(A), which consists entirely of non-NULL values from A + +Note: The semantic check (homologous namesake validation) is still performed for aggregation's internal join. Only the primary key validity constraint is bypassed. + +**Example:** +``` +Session: session_id*, date +Trial: session_id*, trial_num*, response_time (references Session) + +# Aggregation (default keeps all rows) +Session.aggr(Trial, avg_rt='avg(response_time)') + +# Internally: Session LEFT JOIN Trial (with invalid PK allowed) +# Intermediate PK would be {session_id} βˆͺ {session_id, trial_num} = {session_id, trial_num} +# But GROUP BY session_id resets PK to {session_id} +# Result: All sessions, with avg_rt=NULL for sessions without trials +``` + +## Universal Set `dj.U` + +`dj.U()` or `dj.U('attr1', 'attr2', ...)` represents the universal set of all possible values and lineages. + +### Homology with `dj.U` +Since `dj.U` conceptually contains all possible lineages, its attributes are **homologous to any namesake attribute** in other expressions. + +### Valid Operations + +```python +# Restriction: promotes a, b to PK; lineage transferred from A +dj.U('a', 'b') & A + +# Aggregation: groups by a, b +dj.U('a', 'b').aggr(A, count='count(*)') +``` + +### Invalid Operations + +```python +# Anti-restriction: produces infinite set +dj.U('a', 'b') - A # DataJointError + +# Join: deprecated, use & instead +dj.U('a', 'b') * A # DataJointError with migration guidance +``` + diff --git a/src/reference/specs/query-algebra.md b/src/reference/specs/query-algebra.md new file mode 100644 index 00000000..f7a92aa5 --- /dev/null +++ b/src/reference/specs/query-algebra.md @@ -0,0 +1,961 @@ +# DataJoint Query Algebra Specification + +## Overview + +This document specifies the query algebra in DataJoint Python. Query expressions are composable objects that represent database queries. All operators return new QueryExpression objects without modifying the originalβ€”expressions are immutable. + +## 1. Query Expression Fundamentals + +### 1.1 Immutability + +All query expressions are immutable. Every operator creates a new expression: + +```python +original = Session() +restricted = original & "session_date > '2024-01-01'" # New object +# original is unchanged +``` + +### 1.2 Primary Key Preservation + +Most operators preserve the primary key of their input. The exceptions are: + +- **Join**: May expand or contract PK based on functional dependencies +- **U & table**: Sets PK to U's attributes + +### 1.3 Lazy Evaluation + +Expressions are not executed until data is fetched: + +```python +expr = (Session * Trial) & "trial_type = 'test'" # No database query yet +data = expr.to_dicts() # Query executed here +``` + +--- + +## 2. Restriction (`&` and `-`) + +### 2.1 Syntax + +```python +result = expression & condition # Select matching rows +result = expression - condition # Select non-matching rows (anti-restriction) +result = expression.restrict(condition, semantic_check=True) +``` + +### 2.2 Condition Types + +| Type | Example | Behavior | +|------|---------|----------| +| String | `"x > 5"` | SQL WHERE condition | +| Dict | `{"status": "active"}` | Equality on attributes | +| QueryExpression | `OtherTable` | Rows with matching keys in other table | +| List/Tuple/Set | `[cond1, cond2]` | OR of conditions | +| Boolean | `True` / `False` | No effect / empty result | +| pandas.DataFrame | `df` | OR of row conditions | +| numpy.void | `record` | Treated as dict | + +### 2.3 String Conditions + +SQL expressions using attribute names: + +```python +Session & "session_date > '2024-01-01'" +Session & "subject_id IN (1, 2, 3)" +Session & "notes LIKE '%test%'" +Session & "(x > 0) AND (y < 100)" +``` + +### 2.4 Dictionary Conditions + +Attribute-value equality: + +```python +Session & {"subject_id": 1} +Session & {"subject_id": 1, "session_type": "training"} +``` + +Multiple key-value pairs are combined with AND. + +### 2.5 Restriction by Query Expression + +Restrict to rows with matching primary keys in another expression: + +```python +# Sessions that have at least one trial +Session & Trial + +# Sessions for active subjects only +Session & (Subject & "status = 'active'") +``` + +### 2.6 Collection Conditions (OR) + +Lists, tuples, and sets create OR conditions: + +```python +# Either condition matches +Session & [{"subject_id": 1}, {"subject_id": 2}] + +# Equivalent to +Session & "subject_id IN (1, 2)" +``` + +### 2.7 Anti-Restriction + +The `-` operator selects rows that do NOT match: + +```python +# Sessions without any trials +Session - Trial + +# Sessions not from subject 1 +Session - {"subject_id": 1} +``` + +### 2.8 Chaining Restrictions + +Sequential restrictions combine with AND: + +```python +(Session & cond1) & cond2 +# Equivalent to +Session & cond1 & cond2 +``` + +### 2.9 Semantic Matching + +With `semantic_check=True` (default), expression conditions match only on homologous namesakesβ€”attributes with the same name AND same lineage. + +```python +# Default: semantic matching +Session & Trial + +# Disable semantic check (natural join on all namesakes) +Session.restrict(Trial, semantic_check=False) +``` + +### 2.10 Algebraic Properties + +| Property | Value | +|----------|-------| +| Primary Key | Preserved: PK(result) = PK(input) | +| Attributes | Preserved: all attributes retained | +| Entity Type | Preserved | + +### 2.11 Error Conditions + +| Condition | Error | +|-----------|-------| +| Unknown attribute in string | `UnknownAttributeError` | +| Non-homologous namesakes | `DataJointError` (semantic mismatch) | + +--- + +## 3. Projection (`.proj()`) + +### 3.1 Syntax + +```python +result = expression.proj() # Primary key only +result = expression.proj(...) # All attributes +result = expression.proj('attr1', 'attr2') # PK + specified +result = expression.proj(..., '-secret') # All except secret +result = expression.proj(new_name='old_name') # Rename +result = expression.proj(computed='x + y') # Computed attribute +``` + +### 3.2 Attribute Selection + +| Syntax | Meaning | +|--------|---------| +| `'attr'` | Include attribute | +| `...` (Ellipsis) | Include all secondary attributes | +| `'-attr'` | Exclude attribute (use with `...`) | + +Primary key attributes are always included, even if not specified. + +### 3.3 Renaming Attributes + +```python +# Rename 'name' to 'subject_name' +Subject.proj(subject_name='name') + +# Duplicate attribute with new name (parentheses preserve original) +Subject.proj('name', subject_name='(name)') +``` + +### 3.4 Computed Attributes + +Create new attributes from SQL expressions: + +```python +# Arithmetic +Trial.proj(speed='distance / duration') + +# Functions +Session.proj(year='YEAR(session_date)') + +# Aggregation-like (per row) +Trial.proj(centered='value - mean_value') +``` + +### 3.5 Primary Key Renaming + +Primary key attributes CAN be renamed: + +```python +Subject.proj(mouse_id='subject_id') +# Result PK: (mouse_id,) instead of (subject_id,) +``` + +### 3.6 Excluding Attributes + +Use `-` prefix with ellipsis to exclude: + +```python +# All attributes except 'internal_notes' +Session.proj(..., '-internal_notes') + +# Multiple exclusions +Session.proj(..., '-notes', '-metadata') +``` + +Cannot exclude primary key attributes. + +### 3.7 Algebraic Properties + +| Property | Value | +|----------|-------| +| Primary Key | Preserved (may be renamed) | +| Attributes | Selected/computed subset | +| Entity Type | Preserved | + +### 3.8 Error Conditions + +| Condition | Error | +|-----------|-------| +| Attribute not found | `UnknownAttributeError` | +| Excluding PK attribute | `DataJointError` | +| Duplicate attribute name | `DataJointError` | + +--- + +## 4. Join (`*`) + +### 4.1 Syntax + +```python +result = A * B # Inner join +result = A.join(B, semantic_check=True, left=False) +``` + +### 4.2 Parameters + +| Parameter | Default | Description | +|-----------|---------|-------------| +| `semantic_check` | `True` | Match only homologous namesakes | +| `left` | `False` | LEFT JOIN (preserve all rows from A) | + +### 4.3 Join Condition + +Joins match on all shared non-hidden attributes (namesakes): + +```python +# If Session has (subject_id, session_id) and Trial has (subject_id, session_id, trial_id) +# Join matches on (subject_id, session_id) +Session * Trial +``` + +### 4.4 Primary Key Determination + +The result's primary key depends on functional dependencies: + +| Condition | Result PK | Attribute Order | +|-----------|-----------|-----------------| +| A β†’ B | PK(A) | A's attributes first | +| B β†’ A | PK(B) | B's attributes first | +| Both | PK(A) | A's attributes first | +| Neither | PK(A) βˆͺ PK(B) | A's PK, then B's additional PK | + +**A β†’ B** means: All of B's primary key attributes exist in A (as PK or secondary). + +### 4.5 Examples + +```python +# Session β†’ Trial (Session's PK is subset of Trial's PK) +Session * Trial +# Result PK: (subject_id, session_id) β€” same as Session + +# Neither determines the other +Subject * Experimenter +# Result PK: (subject_id, experimenter_id) β€” union of PKs +``` + +### 4.6 Left Join + +Preserve all rows from left operand: + +```python +# All sessions, with trial data where available +Session.join(Trial, left=True) +``` + +**Constraint**: Left join requires A β†’ B to prevent NULL values in result's primary key. + +### 4.7 Semantic Matching + +With `semantic_check=True`, only homologous namesakes are matched: + +```python +# Semantic join (default) +TableA * TableB + +# Natural join (match all namesakes regardless of lineage) +TableA.join(TableB, semantic_check=False) +``` + +### 4.8 Algebraic Properties + +| Property | Value | +|----------|-------| +| Primary Key | Depends on functional dependencies | +| Attributes | Union of both operands' attributes | +| Commutativity | Result rows same, but PK/order may differ | + +### 4.9 Error Conditions + +| Condition | Error | +|-----------|-------| +| Different database connections | `DataJointError` | +| Non-homologous namesakes (semantic mode) | `DataJointError` | +| Left join without A β†’ B | `DataJointError` | + +--- + +## 5. Aggregation (`.aggr()`) + +### 5.1 Syntax + +```python +result = A.aggr(B, ...) # All A attributes +result = A.aggr(B, 'attr1', 'attr2') # PK + specified from A +result = A.aggr(B, ..., count='count(*)') # With aggregate +result = A.aggr(B, ..., exclude_nonmatching=True) # Only rows with matches +``` + +### 5.2 Parameters + +| Parameter | Default | Description | +|-----------|---------|-------------| +| `*attributes` | β€” | Attributes from A to include | +| `exclude_nonmatching` | `False` | If True, exclude rows from A that have no matches in B (INNER JOIN). Default keeps all rows (LEFT JOIN). | +| `**named_attributes` | β€” | Computed aggregates | + +### 5.3 Requirement + +**B must contain all primary key attributes of A.** This enables grouping B's rows by A's primary key. + +### 5.4 Aggregate Functions + +```python +# Count +Session.aggr(Trial, n_trials='count(*)') + +# Sum, average, min, max +Session.aggr(Trial, + total='sum(score)', + avg_score='avg(score)', + best='max(score)', + worst='min(score)' +) + +# Group concatenation +Session.aggr(Trial, trial_list='group_concat(trial_id)') + +# Conditional count +Session.aggr(Trial, n_correct='sum(correct = 1)') +``` + +### 5.5 SQL Equivalent + +```sql +SELECT A.pk1, A.pk2, A.secondary, agg_func(B.col) AS new_attr +FROM A +[LEFT] JOIN B USING (pk1, pk2) +WHERE +GROUP BY A.pk1, A.pk2 +HAVING +``` + +### 5.6 Restriction Behavior + +Restrictions on A attributes β†’ WHERE clause (before GROUP BY) +Restrictions on B attributes β†’ HAVING clause (after GROUP BY) + +```python +# WHERE: only 2024 sessions, then count trials +(Session & "YEAR(session_date) = 2024").aggr(Trial, n='count(*)') + +# HAVING: sessions with more than 10 trials +Session.aggr(Trial, n='count(*)') & "n > 10" +``` + +### 5.7 Default Behavior: Keep All Rows + +By default (`exclude_nonmatching=False`), aggregation keeps all rows from A, even those without matches in B: + +```python +# All sessions included; those without trials have n=0 +Session.aggr(Trial, n='count(trial_id)') + +# Only sessions that have at least one trial +Session.aggr(Trial, n='count(trial_id)', exclude_nonmatching=True) +``` + +Note: Use `count(pk_attr)` rather than `count(*)` to correctly count 0 for sessions without trials. `count(*)` counts all rows including the NULL-filled left join row. + +### 5.8 Algebraic Properties + +| Property | Value | +|----------|-------| +| Primary Key | PK(A) β€” grouping expression's PK | +| Entity Type | Same as A | + +### 5.9 Error Conditions + +| Condition | Error | +|-----------|-------| +| B missing A's PK attributes | `DataJointError` | +| Semantic mismatch | `DataJointError` | + +--- + +## 6. Extension (`.extend()`) + +### 6.1 Syntax + +```python +result = A.extend(B) +result = A.extend(B, semantic_check=True) +``` + +### 6.2 Semantics + +Extend is a left join that adds attributes from B while preserving A's entity identity: + +```python +A.extend(B) +# Equivalent to: +A.join(B, left=True) +``` + +### 6.3 Requirement + +**A must determine B** (A β†’ B). All of B's primary key attributes must exist in A. + +### 6.4 Use Case + +Add optional attributes without losing rows: + +```python +# Add experimenter info to sessions (some sessions may lack experimenter) +Session.extend(Experimenter) +``` + +### 6.5 Algebraic Properties + +| Property | Value | +|----------|-------| +| Primary Key | PK(A) | +| Attributes | A's attributes + B's non-PK attributes | +| Entity Type | Same as A | + +### 6.6 Error Conditions + +| Condition | Error | +|-----------|-------| +| A does not determine B | `DataJointError` | + +--- + +## 7. Union (`+`) + +### 7.1 Syntax + +```python +result = A + B +``` + +### 7.2 Requirements + +1. **Same connection**: Both from same database +2. **Same primary key**: Identical PK attributes (names and types) +3. **No secondary attribute overlap**: A and B cannot share secondary attributes + +### 7.3 Semantics + +Combines entity sets from both operands: + +```python +# All subjects that are either mice or rats +Mouse + Rat +``` + +### 7.4 Attribute Handling + +| Scenario | Result | +|----------|--------| +| PK only in both | Union of PKs | +| A has secondary attrs | A's secondaries (NULL for B-only rows) | +| B has secondary attrs | B's secondaries (NULL for A-only rows) | +| Overlapping PKs | A's values take precedence | + +### 7.5 SQL Implementation + +```sql +-- With secondary attributes +(SELECT A.* FROM A LEFT JOIN B USING (pk)) +UNION +(SELECT B.* FROM B WHERE (B.pk) NOT IN (SELECT A.pk FROM A)) +``` + +### 7.6 Algebraic Properties + +| Property | Value | +|----------|-------| +| Primary Key | PK(A) = PK(B) | +| Associative | (A + B) + C = A + (B + C) | +| Commutative | A + B has same rows as B + A | + +### 7.7 Error Conditions + +| Condition | Error | +|-----------|-------| +| Different connections | `DataJointError` | +| Different primary keys | `DataJointError` | +| Overlapping secondary attributes | `DataJointError` | + +--- + +## 8. Universal Sets (`dj.U()`) + +### 8.1 Syntax + +```python +dj.U() # Singular entity (one row, no attributes) +dj.U('attr1', 'attr2') # Set of all combinations +``` + +### 8.2 Unique Value Enumeration + +Extract distinct values: + +```python +# All unique last names +dj.U('last_name') & Student + +# All unique (year, month) combinations +dj.U('year', 'month') & Session.proj(year='YEAR(date)', month='MONTH(date)') +``` + +Result has specified attributes as primary key, with DISTINCT semantics. + +### 8.3 Universal Aggregation + +Aggregate entire table (no grouping): + +```python +# Count all students +dj.U().aggr(Student, n='count(*)') +# Result: single row with n = total count + +# Global statistics +dj.U().aggr(Trial, + total='count(*)', + avg_score='avg(score)', + std_score='std(score)' +) +``` + +### 8.4 Arbitrary Grouping + +Group by attributes not in original PK: + +```python +# Count students by graduation year +dj.U('grad_year').aggr(Student, n='count(*)') + +# Monthly session counts +dj.U('year', 'month').aggr( + Session.proj(year='YEAR(date)', month='MONTH(date)'), + n='count(*)' +) +``` + +### 8.5 Primary Key Behavior + +| Usage | Result PK | +|-------|-----------| +| `dj.U() & table` | Empty (single row) | +| `dj.U('a', 'b') & table` | (a, b) | +| `dj.U().aggr(table, ...)` | Empty (single row) | +| `dj.U('a').aggr(table, ...)` | (a,) | + +### 8.6 Restrictions + +```python +# U attributes must exist in the table +dj.U('name') & Student # OK: 'name' in Student +dj.U('invalid') & Student # Error: 'invalid' not found +``` + +### 8.7 Error Conditions + +| Condition | Error | +|-----------|-------| +| `table * dj.U()` | `DataJointError` (use `&` instead) | +| `dj.U() - table` | `DataJointError` (infinite set) | +| U attributes not in table | `DataJointError` | +| `dj.U().aggr(..., exclude_nonmatching=False)` | `DataJointError` (cannot keep all rows from infinite set) | + +--- + +## 9. Semantic Matching + +### 9.1 Attribute Lineage + +Every attribute has a lineage tracing to its original definition: + +``` +schema.table.attribute +``` + +Foreign key inheritance preserves lineage: + +```python +class Session(dj.Manual): + definition = """ + -> Subject # Inherits subject_id with Subject's lineage + session_id : int + """ +``` + +### 9.2 Homologous Namesakes + +Two attributes are **homologous namesakes** if they have: +1. Same name +2. Same lineage (trace to same original definition) + +### 9.3 Non-Homologous Namesakes + +Attributes with same name but different lineage create semantic collisions: + +```python +# Both have 'name' but from different origins +Student * Course # Error if both have 'name' attribute +``` + +### 9.4 Resolution + +Rename to avoid collisions: + +```python +Student * Course.proj(..., course_name='name') +``` + +### 9.5 Semantic Check Parameter + +| Value | Behavior | +|-------|----------| +| `True` (default) | Match only homologous namesakes; error on collisions | +| `False` | Natural join on all namesakes regardless of lineage | + +--- + +## 10. Operator Precedence + +Python operator precedence applies: + +| Precedence | Operator | Operation | +|------------|----------|-----------| +| Highest | `*` | Join | +| | `+`, `-` | Union, Anti-restriction | +| Lowest | `&` | Restriction | + +Use parentheses for clarity: + +```python +(Session & condition) * Trial # Restrict then join +Session & (Trial * Stimulus) # Join then restrict +``` + +--- + +## 11. Subquery Generation + +Subqueries are generated automatically when needed: + +| Situation | Subquery Created | +|-----------|------------------| +| Restrict on computed attribute | Yes | +| Join on computed attribute | Yes | +| Aggregation operand | Yes | +| Union operand | Yes | +| Restriction after TOP | Yes | + +--- + +## 12. Top (`dj.Top`) + +### 12.1 Syntax + +```python +result = expression & dj.Top() # First row by primary key +result = expression & dj.Top(limit=5) # First 5 rows by primary key +result = expression & dj.Top(5, 'score DESC') # Top 5 by score descending +result = expression & dj.Top(10, order_by='date DESC') # Top 10 by date descending +result = expression & dj.Top(5, offset=10) # Skip 10, take 5 +result = expression & dj.Top(None, 'score DESC') # All rows, ordered by score +``` + +### 12.2 Parameters + +| Parameter | Type | Default | Description | +|-----------|------|---------|-------------| +| `limit` | `int` or `None` | `1` | Maximum rows to return. `None` = unlimited. | +| `order_by` | `str`, `list[str]`, or `None` | `"KEY"` | Ordering. `"KEY"` = primary key order. `None` = inherit existing order. | +| `offset` | `int` | `0` | Rows to skip before taking `limit`. | + +### 12.3 Ordering Specification + +| Format | Meaning | +|--------|---------| +| `"KEY"` | Order by primary key (ascending) | +| `"attr"` | Order by attribute (ascending) | +| `"attr DESC"` | Order by attribute (descending) | +| `"attr ASC"` | Order by attribute (ascending, explicit) | +| `["attr1 DESC", "attr2"]` | Multiple columns | +| `None` | Inherit ordering from existing Top | + +### 12.4 SQL Equivalent + +```sql +SELECT * FROM table +ORDER BY order_by +LIMIT limit OFFSET offset +``` + +### 12.5 Chaining Tops + +When multiple Tops are chained, behavior depends on the `order_by` parameter: + +| Scenario | Behavior | +|----------|----------| +| Second Top has `order_by=None` | **Merge**: inherits ordering, limits combined | +| Both Tops have identical `order_by` | **Merge**: ordering preserved, limits combined | +| Tops have different `order_by` | **Subquery**: first Top executed, then second applied | + +**Merge behavior:** +- `limit` = minimum of both limits +- `offset` = sum of both offsets +- `order_by` = preserved from first Top + +```python +# Merge: same result, single query +(Table & dj.Top(10, "score DESC")) & dj.Top(5, order_by=None) +# Effective: Top(5, "score DESC", offset=0) + +# Merge with offsets +(Table & dj.Top(10, "x", offset=5)) & dj.Top(3, order_by=None, offset=2) +# Effective: Top(3, "x", offset=7) + +# Subquery: different orderings +(Table & dj.Top(10, "score DESC")) & dj.Top(3, "id ASC") +# First selects top 10 by score, then reorders those 10 by id and takes 3 +``` + +### 12.6 Preview and Limit + +When fetching with a `limit` parameter, the limit is applied as an additional Top that inherits existing ordering: + +```python +# User applies custom ordering +query = Table & dj.Top(order_by="score DESC") + +# Preview respects the ordering +query.to_arrays("id", "score", limit=5) # Top 5 by score descending +``` + +Internally, `to_arrays(..., limit=N)` applies `dj.Top(N, order_by=None)`, which inherits the existing ordering. + +### 12.7 Use Cases + +**Top N rows:** +```python +# Top 10 highest scores +Result & dj.Top(10, "score DESC") +``` + +**Pagination:** +```python +# Page 3 (rows 20-29) sorted by date +Session & dj.Top(10, "session_date DESC", offset=20) +``` + +**Sampling (deterministic):** +```python +# First 100 rows by primary key +BigTable & dj.Top(100) +``` + +**Ordering without limit:** +```python +# All rows ordered by date +Session & dj.Top(None, "session_date DESC") +``` + +### 12.8 Algebraic Properties + +| Property | Value | +|----------|-------| +| Primary Key | Preserved: PK(result) = PK(input) | +| Attributes | Preserved: all attributes retained | +| Entity Type | Preserved | +| Row Order | Determined by `order_by` | + +### 12.9 Error Conditions + +| Condition | Error | +|-----------|-------| +| `limit` not int or None | `TypeError` | +| `order_by` not str, list[str], or None | `TypeError` | +| `offset` not int | `TypeError` | +| Top in OR list | `DataJointError` | +| Top in AndList | `DataJointError` | + +--- + +## 13. SQL Transpilation + +This section describes how DataJoint translates query expressions to SQL. + +### 13.1 MySQL Clause Evaluation Order + +MySQL differs from standard SQL in clause evaluation: + +``` +Standard SQL: FROM β†’ WHERE β†’ GROUP BY β†’ HAVING β†’ SELECT +MySQL: FROM β†’ WHERE β†’ SELECT β†’ GROUP BY β†’ HAVING +``` + +This allows `GROUP BY` and `HAVING` clauses to use alias column names created by `SELECT`. DataJoint targets MySQL's behavior where column aliases can be used in `HAVING`. + +### 13.2 QueryExpression Properties + +Each `QueryExpression` represents a `SELECT` statement with these properties: + +| Property | SQL Clause | Description | +|----------|------------|-------------| +| `heading` | `SELECT` | Attributes to retrieve | +| `restriction` | `WHERE` | List of conditions (AND) | +| `support` | `FROM` | Tables/subqueries to query | + +Operators create new expressions by combining these properties: +- `proj` β†’ creates new `heading` +- `&` β†’ appends to `restriction` +- `*` β†’ adds to `support` + +### 13.3 Subquery Generation Rules + +Operators merge properties when possible, avoiding subqueries. A subquery is generated when: + +| Situation | Reason | +|-----------|--------| +| Restriction uses alias attributes | Alias must exist in SELECT before WHERE can reference it | +| Projection creates alias from alias | Must materialize first alias | +| Join on alias attribute | Alias must exist before join condition | +| Aggregation as operand | GROUP BY requires complete subquery | +| Union operand | UNION requires complete subqueries | + +When a subquery is created, the input becomes a `FROM` clause element in a new `QueryExpression`. + +### 13.4 Join Mechanics + +Joins combine the properties of both inputs: + +```python +result.support = A.support + B.support +result.restriction = A.restriction + B.restriction +result.heading = merge(A.heading, B.heading) +``` + +Restrictions from inputs propagate to the output. Inputs that don't become subqueries donate their supports, restrictions, and projections directly to the join. + +### 13.5 Aggregation SQL + +Aggregation translates to: + +```sql +SELECT A.pk, A.secondary, agg_func(B.col) AS computed +FROM A +LEFT JOIN B USING (pk) +WHERE +GROUP BY A.pk +HAVING +``` + +Key behavior: +- Restrictions on A β†’ `WHERE` clause (before grouping) +- Restrictions on B or computed attributes β†’ `HAVING` clause (after grouping) +- Aggregation never generates a subquery when restricted + +### 13.6 Union SQL + +Union performs an outer join: + +```sql +(SELECT A.pk, A.secondary, NULL as B.secondary FROM A) +UNION +(SELECT B.pk, NULL as A.secondary, B.secondary FROM B + WHERE B.pk NOT IN (SELECT pk FROM A)) +``` + +All union inputs become subqueries except unrestricted unions. + +### 13.7 Query Backprojection + +Before execution, `finalize()` recursively projects out unnecessary attributes from all inputs. This optimization: + +- Reduces data transfer (especially for blobs) +- Compensates for MySQL's query optimizer limitations +- Produces leaner queries for complex expressions + +--- + +## 14. Implementation Reference + +| File | Purpose | +|------|---------| +| `expression.py` | QueryExpression base class, operators | +| `condition.py` | Restriction condition handling, Top class | +| `heading.py` | Attribute metadata and lineage | +| `table.py` | Table class, fetch interface | +| `U.py` | Universal set implementation | + +--- + +## 15. Quick Reference + +| Operation | Syntax | Result PK | +|-----------|--------|-----------| +| Restrict | `A & cond` | PK(A) | +| Anti-restrict | `A - cond` | PK(A) | +| Project | `A.proj(...)` | PK(A) | +| Join | `A * B` | Depends on Aβ†’B | +| Aggregate | `A.aggr(B, ...)` | PK(A) | +| Extend | `A.extend(B)` | PK(A) | +| Union | `A + B` | PK(A) = PK(B) | +| Unique values | `dj.U('x') & A` | (x,) | +| Global aggregate | `dj.U().aggr(A, ...)` | () | diff --git a/src/reference/specs/semantic-matching.md b/src/reference/specs/semantic-matching.md new file mode 100644 index 00000000..e520bba2 --- /dev/null +++ b/src/reference/specs/semantic-matching.md @@ -0,0 +1,542 @@ +# Semantic Matching for Joins - Specification + +## Overview + +This document specifies **semantic matching** for joins in DataJoint 2.0, replacing the current name-based matching rules. Semantic matching ensures that attributes are only matched when they share both the same name and the same **lineage** (origin), preventing accidental joins on unrelated attributes that happen to share names. + +### Goals + +1. **Prevent incorrect joins** on attributes that share names but represent different entities +2. **Enable valid joins** that are currently blocked due to overly restrictive rules +3. **Maintain backward compatibility** for well-designed schemas +4. **Provide clear error messages** when semantic conflicts are detected + +--- + +## User Guide + +### Quick Start + +Semantic matching is enabled by default in DataJoint 2.0. For most well-designed schemas, no changes are required. + +#### When You Might See Errors + +```python +# Two tables with generic 'id' attribute +class Student(dj.Manual): + definition = """ + id : uint32 + --- + name : varchar(100) + """ + +class Course(dj.Manual): + definition = """ + id : uint32 + --- + title : varchar(100) + """ + +# This will raise an error because 'id' has different lineages +Student() * Course() # DataJointError! +``` + +#### How to Resolve + +**Option 1: Rename attributes using projection** +```python +Student() * Course().proj(course_id='id') # OK +``` + +**Option 2: Bypass semantic check (use with caution)** +```python +Student().join(Course(), semantic_check=False) # OK, but be careful! +``` + +**Option 3: Use descriptive names (best practice)** +```python +class Student(dj.Manual): + definition = """ + student_id : uint32 + --- + name : varchar(100) + """ +``` + +### Migrating from DataJoint 1.x + +#### Removed Operators + +| Old Syntax | New Syntax | +|------------|------------| +| `A @ B` | `A.join(B, semantic_check=False)` | +| `A ^ B` | `A.restrict(B, semantic_check=False)` | +| `dj.U('a') * B` | `dj.U('a') & B` | + +#### Rebuilding Lineage for Existing Schemas + +If you have existing schemas created before DataJoint 2.0, rebuild their lineage tables: + +```python +import datajoint as dj + +# Connect and get your schema +schema = dj.Schema('my_database') + +# Rebuild lineage (do this once per schema) +schema.rebuild_lineage() + +# Restart Python kernel to pick up changes +``` + +**Important**: If your schema references tables in other schemas, rebuild those upstream schemas first. + +--- + +## API Reference + +### Schema Methods + +#### `schema.rebuild_lineage()` + +Rebuild the `~lineage` table for all tables in this schema. + +```python +schema.rebuild_lineage() +``` + +**Description**: Recomputes lineage for all attributes by querying FK relationships from the database's `information_schema`. Use this to restore lineage for schemas that predate the lineage system or after corruption. + +**Requirements**: +- Schema must exist +- Upstream schemas (referenced via cross-schema FKs) must have their lineage rebuilt first + +**Side Effects**: +- Creates `~lineage` table if it doesn't exist +- Deletes and repopulates all lineage entries for tables in the schema + +**Post-Action**: Restart Python kernel and reimport to pick up new lineage information. + +#### `schema.lineage_table_exists` + +Property indicating whether the `~lineage` table exists in this schema. + +```python +if schema.lineage_table_exists: + print("Lineage tracking is enabled") +``` + +**Returns**: `bool` - `True` if `~lineage` table exists, `False` otherwise. + +#### `schema.lineage` + +Property returning all lineage entries for the schema. + +```python +schema.lineage +# {'myschema.session.session_id': 'myschema.session.session_id', +# 'myschema.trial.session_id': 'myschema.session.session_id', +# 'myschema.trial.trial_num': 'myschema.trial.trial_num'} +``` + +**Returns**: `dict` - Maps `'schema.table.attribute'` to its lineage origin + +### Join Methods + +#### `expr.join(other, semantic_check=True)` + +Join two expressions with optional semantic checking. + +```python +result = A.join(B) # semantic_check=True (default) +result = A.join(B, semantic_check=False) # bypass semantic check +``` + +**Parameters**: +- `other`: Another query expression to join with +- `semantic_check` (bool): If `True` (default), raise error on non-homologous namesakes. If `False`, perform natural join without lineage checking. + +**Raises**: `DataJointError` if `semantic_check=True` and namesake attributes have different lineages. + +#### `expr.restrict(other, semantic_check=True)` + +Restrict expression with optional semantic checking. + +```python +result = A.restrict(B) # semantic_check=True (default) +result = A.restrict(B, semantic_check=False) # bypass semantic check +``` + +**Parameters**: +- `other`: Restriction condition (expression, dict, string, etc.) +- `semantic_check` (bool): If `True` (default), raise error on non-homologous namesakes when restricting by another expression. If `False`, no lineage checking. + +**Raises**: `DataJointError` if `semantic_check=True` and namesake attributes have different lineages. + +### Operators + +#### `A * B` (Join) + +Equivalent to `A.join(B, semantic_check=True)`. + +#### `A & B` (Restriction) + +Equivalent to `A.restrict(B, semantic_check=True)`. + +#### `A - B` (Anti-restriction) + +Restriction with negation. Semantic checking applies. + +To bypass semantic checking: `A.restrict(dj.Not(B), semantic_check=False)` + +#### `A + B` (Union) + +Union of expressions. Requires all namesake attributes to have matching lineage. + +### Removed Operators + +#### `A @ B` (Removed) + +Raises `DataJointError` with migration guidance to use `.join(semantic_check=False)`. + +#### `A ^ B` (Removed) + +Raises `DataJointError` with migration guidance to use `.restrict(semantic_check=False)`. + +#### `dj.U(...) * A` (Removed) + +Raises `DataJointError` with migration guidance to use `dj.U(...) & A`. + +### Universal Set (`dj.U`) + +#### Valid Operations + +```python +dj.U('a', 'b') & A # Restriction: promotes a, b to PK +dj.U('a', 'b').aggr(A, ...) # Aggregation: groups by a, b +dj.U() & A # Distinct primary keys of A +``` + +#### Invalid Operations + +```python +dj.U('a', 'b') - A # DataJointError: produces infinite set +dj.U('a', 'b') * A # DataJointError: use & instead +``` + +--- + +## Concepts + +### Attribute Lineage + +Lineage identifies the **origin** of an attributeβ€”the **dimension** where it was first defined. A dimension is an independent axis of variation introduced by a table that defines new primary key attributes. See [Schema Dimensions](../../explanation/entity-integrity.md#schema-dimensions) for details. + +Lineage is represented as a string: + +``` +schema_name.table_name.attribute_name +``` + +#### Lineage Assignment Rules + +| Attribute Type | Lineage Value | +|----------------|---------------| +| Native primary key | `this_schema.this_table.attr_name` | +| FK-inherited (primary or secondary) | Traced to original definition | +| Native secondary | `None` | +| Computed (in projection) | `None` | + +#### Example + +```python +class Session(dj.Manual): # table: session + definition = """ + session_id : uint32 + --- + session_date : date + """ + +class Trial(dj.Manual): # table: trial + definition = """ + -> Session + trial_num : uint16 + --- + stimulus : varchar(100) + """ +``` + +Lineages: +- `Session.session_id` β†’ `myschema.session.session_id` (native PK) +- `Session.session_date` β†’ `None` (native secondary) +- `Trial.session_id` β†’ `myschema.session.session_id` (inherited via FK) +- `Trial.trial_num` β†’ `myschema.trial.trial_num` (native PK) +- `Trial.stimulus` β†’ `None` (native secondary) + +### Terminology + +| Term | Definition | +|------|------------| +| **Lineage** | The origin of an attribute: `schema.table.attribute` | +| **Homologous attributes** | Attributes with the same lineage | +| **Namesake attributes** | Attributes with the same name | +| **Homologous namesakes** | Same name AND same lineage β€” used for join matching | +| **Non-homologous namesakes** | Same name BUT different lineage β€” cause join errors | + +### Semantic Matching Rules + +| Scenario | Action | +|----------|--------| +| Same name, same lineage (both non-null) | **Match** | +| Same name, different lineage | **Error** | +| Same name, either lineage is null | **Error** | +| Different names | **No match** | + +--- + +## Implementation Details + +### `~lineage` Table + +Each schema has a hidden `~lineage` table storing lineage information: + +```sql +CREATE TABLE `schema_name`.`~lineage` ( + table_name VARCHAR(64) NOT NULL, + attribute_name VARCHAR(64) NOT NULL, + lineage VARCHAR(255) NOT NULL, + PRIMARY KEY (table_name, attribute_name) +) +``` + +### Lineage Population + +**At table declaration**: +1. Delete any existing lineage entries for the table +2. For FK attributes: copy lineage from parent (with warning if parent lineage missing) +3. For native PK attributes: set lineage to `schema.table.attribute` +4. Native secondary attributes: no entry (lineage = None) + +**At table drop**: +- Delete all lineage entries for the table + +### Missing Lineage Handling + +**If `~lineage` table doesn't exist**: +- Warning issued during semantic check +- Semantic checking disabled (join proceeds as natural join) + +**If parent lineage missing during declaration**: +- Warning issued +- Parent attribute used as origin +- Recommend rebuilding lineage after parent schema is fixed + +### Heading's `lineage_available` Property + +The `Heading` class tracks whether lineage information is available: + +```python +heading.lineage_available # True if ~lineage table exists for this schema +``` + +This property is: +- Set when heading is loaded from database +- Propagated through projections, joins, and other operations +- Used by `assert_join_compatibility` to decide whether to perform semantic checking + +--- + +## Error Messages + +### Non-Homologous Namesakes + +``` +DataJointError: Cannot join on attribute `id`: different lineages +(university.student.id vs university.course.id). +Use .proj() to rename one of the attributes. +``` + +### Removed `@` Operator + +``` +DataJointError: The @ operator has been removed in DataJoint 2.0. +Use .join(other, semantic_check=False) for permissive joins. +``` + +### Removed `^` Operator + +``` +DataJointError: The ^ operator has been removed in DataJoint 2.0. +Use .restrict(other, semantic_check=False) for permissive restrictions. +``` + +### Removed `dj.U * table` + +``` +DataJointError: dj.U(...) * table is no longer supported in DataJoint 2.0. +Use dj.U(...) & table instead. +``` + +### Missing Lineage Warning + +``` +WARNING: Semantic check disabled: ~lineage table not found. +To enable semantic matching, rebuild lineage with: schema.rebuild_lineage() +``` + +### Parent Lineage Missing Warning + +``` +WARNING: Lineage for `parent_db`.`parent_table`.`attr` not found +(parent schema's ~lineage table may be missing or incomplete). +Using it as origin. Once the parent schema's lineage is rebuilt, +run schema.rebuild_lineage() on this schema to correct the lineage. +``` + +--- + +## Examples + +### Example 1: Valid Join (Shared Lineage) + +```python +class Student(dj.Manual): + definition = """ + student_id : uint32 + --- + name : varchar(100) + """ + +class Enrollment(dj.Manual): + definition = """ + -> Student + -> Course + --- + grade : varchar(2) + """ + +# Works: student_id has same lineage in both +Student() * Enrollment() +``` + +### Example 2: Invalid Join (Different Lineage) + +```python +class TableA(dj.Manual): + definition = """ + id : uint32 + --- + value_a : int32 + """ + +class TableB(dj.Manual): + definition = """ + id : uint32 + --- + value_b : int32 + """ + +# Error: 'id' has different lineages +TableA() * TableB() + +# Solution 1: Rename +TableA() * TableB().proj(b_id='id') + +# Solution 2: Bypass (use with caution) +TableA().join(TableB(), semantic_check=False) +``` + +### Example 3: Multi-hop FK Inheritance + +```python +class Session(dj.Manual): + definition = """ + session_id : uint32 + --- + session_date : date + """ + +class Trial(dj.Manual): + definition = """ + -> Session + trial_num : uint16 + """ + +class Response(dj.Computed): + definition = """ + -> Trial + --- + response_time : float64 + """ + +# All work: session_id traces back to Session in all tables +Session() * Trial() +Session() * Response() +Trial() * Response() +``` + +### Example 4: Secondary FK Attribute + +```python +class Course(dj.Manual): + definition = """ + course_id : int unsigned + --- + title : varchar(100) + """ + +class FavoriteCourse(dj.Manual): + definition = """ + student_id : int unsigned + --- + -> Course + """ + +class RequiredCourse(dj.Manual): + definition = """ + major_id : int unsigned + --- + -> Course + """ + +# Works: course_id is secondary in both, but has same lineage +FavoriteCourse() * RequiredCourse() +``` + +### Example 5: Aliased Foreign Key + +```python +class Person(dj.Manual): + definition = """ + person_id : int unsigned + --- + full_name : varchar(100) + """ + +class Marriage(dj.Manual): + definition = """ + -> Person.proj(husband='person_id') + -> Person.proj(wife='person_id') + --- + marriage_date : date + """ + +# husband and wife both have lineage: schema.person.person_id +# They are homologous (same lineage) but have different names +``` + +--- + +## Best Practices + +1. **Use descriptive attribute names**: Prefer `student_id` over generic `id` + +2. **Leverage foreign keys**: Inherited attributes maintain lineage automatically + +3. **Rebuild lineage for legacy schemas**: Run `schema.rebuild_lineage()` once + +4. **Rebuild upstream schemas first**: For cross-schema FKs, rebuild parent schemas before child schemas + +5. **Restart after rebuilding**: Restart Python kernel to pick up new lineage information + +6. **Use `semantic_check=False` sparingly**: Only when you're certain the natural join is correct diff --git a/src/reference/specs/table-declaration.md b/src/reference/specs/table-declaration.md new file mode 100644 index 00000000..9be38a08 --- /dev/null +++ b/src/reference/specs/table-declaration.md @@ -0,0 +1,582 @@ +# DataJoint Table Declaration Specification + +## Overview + +This document specifies the table declaration mechanism in DataJoint Python. Table declarations define the schema structure using a domain-specific language (DSL) embedded in Python class definitions. + +## 1. Table Class Structure + +### 1.1 Basic Declaration Pattern + +```python +@schema +class TableName(dj.Manual): + definition = """ + # table comment + primary_attr : int32 + --- + secondary_attr : float64 + """ +``` + +### 1.2 Table Tiers + +| Tier | Base Class | Table Prefix | Purpose | +|------|------------|--------------|---------| +| Manual | `dj.Manual` | (none) | User-entered data | +| Lookup | `dj.Lookup` | `#` | Reference/enumeration data | +| Imported | `dj.Imported` | `_` | Data from external sources | +| Computed | `dj.Computed` | `__` | Derived from other tables | +| Part | `dj.Part` | `master__` | Detail records of master table | + +### 1.3 Class Naming Rules + +- **Format**: Strict CamelCase (e.g., `MyTable`, `ProcessedData`) +- **Pattern**: `^[A-Z][A-Za-z0-9]*$` +- **Conversion**: CamelCase to snake_case for SQL table name +- **Examples**: + - `SessionTrial` -> `session_trial` + - `ProcessedEMG` -> `processed_emg` + +### 1.4 Table Name Constraints + +- **Maximum length**: 64 characters (MySQL limit) +- **Final name**: prefix + snake_case(class_name) +- **Validation**: Checked at declaration time + +--- + +## 2. Definition String Grammar + +### 2.1 Overall Structure + +``` +[table_comment] +primary_key_section +--- +secondary_section +``` + +### 2.2 Table Comment (Optional) + +``` +# Free-form description of the table purpose +``` + +- Must be first non-empty line if present +- Starts with `#` +- Cannot start with `#:` +- Stored in MySQL table COMMENT + +### 2.3 Primary Key Separator + +``` +--- +``` + +or equivalently: + +``` +___ +``` + +- Three dashes or three underscores +- Separates primary key attributes (above) from secondary attributes (below) +- Required if table has secondary attributes + +### 2.4 Line Types + +Each non-empty, non-comment line is one of: + +1. **Attribute definition** +2. **Foreign key reference** +3. **Index declaration** + +--- + +## 3. Attribute Definition + +### 3.1 Syntax + +``` +attribute_name [= default_value] : type [# comment] +``` + +### 3.2 Components + +| Component | Required | Description | +|-----------|----------|-------------| +| `attribute_name` | Yes | Identifier for the column | +| `default_value` | No | Default value (before colon) | +| `type` | Yes | Data type specification | +| `comment` | No | Documentation (after `#`) | + +### 3.3 Attribute Name Rules + +- **Pattern**: `^[a-z][a-z0-9_]*$` +- **Start**: Lowercase letter +- **Contains**: Lowercase letters, digits, underscores +- **Convention**: snake_case + +### 3.4 Examples + +```python +definition = """ +# Experimental session with subject and timing info +session_id : int32 # auto-assigned +--- +subject_name : varchar(100) # subject identifier +trial_number = 1 : int32 # default to 1 +score = null : float32 # nullable +timestamp = CURRENT_TIMESTAMP : datetime # auto-timestamp +notes = '' : varchar(4000) # empty default +""" +``` + +--- + +## 4. Type System + +### 4.1 Core Types + +Scientist-friendly type names with guaranteed semantics: + +| Type | SQL Mapping | Size | Description | +|------|-------------|------|-------------| +| `int8` | `tinyint` | 1 byte | 8-bit signed integer | +| `uint8` | `tinyint unsigned` | 1 byte | 8-bit unsigned integer | +| `int16` | `smallint` | 2 bytes | 16-bit signed integer | +| `uint16` | `smallint unsigned` | 2 bytes | 16-bit unsigned integer | +| `int32` | `int` | 4 bytes | 32-bit signed integer | +| `uint32` | `int unsigned` | 4 bytes | 32-bit unsigned integer | +| `int64` | `bigint` | 8 bytes | 64-bit signed integer | +| `uint64` | `bigint unsigned` | 8 bytes | 64-bit unsigned integer | +| `float32` | `float` | 4 bytes | 32-bit IEEE 754 float | +| `float64` | `double` | 8 bytes | 64-bit IEEE 754 float | +| `bool` | `tinyint` | 1 byte | Boolean (0 or 1) | +| `uuid` | `binary(16)` | 16 bytes | UUID stored as binary | +| `bytes` | `longblob` | Variable | Binary data (up to 4GB) | + +### 4.2 String Types + +| Type | SQL Mapping | Description | +|------|-------------|-------------| +| `char(N)` | `char(N)` | Fixed-length string | +| `varchar(N)` | `varchar(N)` | Variable-length string (max N) | +| `enum('a','b',...)` | `enum(...)` | Enumerated values | + +### 4.3 Temporal Types + +| Type | SQL Mapping | Description | +|------|-------------|-------------| +| `date` | `date` | Date (YYYY-MM-DD) | +| `datetime` | `datetime` | Date and time | +| `datetime(N)` | `datetime(N)` | With fractional seconds (0-6) | + +### 4.4 Other Types + +| Type | SQL Mapping | Description | +|------|-------------|-------------| +| `json` | `json` | JSON document | +| `decimal(P,S)` | `decimal(P,S)` | Fixed-point decimal | + +### 4.5 Native SQL Types (Passthrough) + +These SQL types are accepted but generate a warning recommending core types: + +- Integer variants: `tinyint`, `smallint`, `mediumint`, `bigint`, `integer`, `serial` +- Float variants: `float`, `double`, `real` (with size specifiers) +- Text variants: `tinytext`, `mediumtext`, `longtext` +- Blob variants: `tinyblob`, `smallblob`, `mediumblob`, `longblob` +- Temporal: `time`, `timestamp`, `year` +- Numeric: `numeric(P,S)` + +### 4.6 Codec Types + +Format: `` or `` + +| Codec | Internal dtype | External dtype | Purpose | +|-------|---------------|----------------|---------| +| `` | `bytes` | `` | Serialized Python objects | +| `` | N/A (external only) | `json` | Hash-addressed deduped storage | +| `` | `bytes` | `` | File attachments with filename | +| `` | N/A (external only) | `json` | Reference to managed file | +| `` | N/A (external only) | `json` | Object storage (Zarr, HDF5) | + +External storage syntax: +- `` - default store +- `` - named store + +### 4.7 Type Reconstruction + +Core types and codecs are stored in the SQL COMMENT field for reconstruction: + +```sql +COMMENT ':float32:user comment here' +COMMENT '::user comment' +``` + +--- + +## 5. Default Values + +### 5.1 Syntax + +``` +attribute_name = default_value : type +``` + +### 5.2 Literal Types + +| Value | Meaning | SQL | +|-------|---------|-----| +| `null` | Nullable attribute | `DEFAULT NULL` | +| `CURRENT_TIMESTAMP` | Server timestamp | `DEFAULT CURRENT_TIMESTAMP` | +| `"string"` or `'string'` | String literal | `DEFAULT "string"` | +| `123` | Numeric literal | `DEFAULT 123` | +| `true`/`false` | Boolean | `DEFAULT 1`/`DEFAULT 0` | + +### 5.3 Constant Literals + +These values are used without quotes in SQL: +- `NULL` +- `CURRENT_TIMESTAMP` + +### 5.4 Nullable Attributes + +``` +score = null : float32 +``` + +- The special default `null` (case-insensitive) makes the attribute nullable +- Nullable attributes can be omitted from INSERT +- Primary key attributes CANNOT be nullable + +### 5.5 Blob/JSON Default Restrictions + +Blob and JSON attributes can only have `null` as default: + +```python +# Valid +data = null : + +# Invalid - raises DataJointError +data = '' : +``` + +--- + +## 6. Foreign Key References + +### 6.1 Syntax + +``` +-> [options] ReferencedTable +``` + +### 6.2 Options + +| Option | Effect | +|--------|--------| +| `nullable` | All inherited attributes become nullable | +| `unique` | Creates UNIQUE INDEX on FK attributes | + +Options are comma-separated in brackets: +``` +-> [nullable, unique] ParentTable +``` + +### 6.3 Attribute Inheritance + +Foreign keys automatically inherit all primary key attributes from the referenced table: + +```python +# Parent +class Subject(dj.Manual): + definition = """ + subject_id : int32 + --- + name : varchar(100) + """ + +# Child - inherits subject_id +class Session(dj.Manual): + definition = """ + -> Subject + session_id : int32 + --- + session_date : date + """ +``` + +### 6.4 Position Rules + +| Position | Effect | +|----------|--------| +| Before `---` | FK attributes become part of primary key | +| After `---` | FK attributes are secondary (dependent) | + +### 6.5 Nullable Foreign Keys + +``` +-> [nullable] OptionalParent +``` + +- Only allowed after `---` (secondary) +- Primary key FKs cannot be nullable +- Creates optional relationship + +### 6.6 Unique Foreign Keys + +``` +-> [unique] ParentTable +``` + +- Creates UNIQUE INDEX on inherited attributes +- Enforces one-to-one relationship from child perspective + +### 6.7 Projections in Foreign Keys + +``` +-> Parent.proj(alias='original_name') +``` + +- Reference same table multiple times with different attribute names +- Useful for self-referential or multi-reference patterns + +### 6.8 Referential Actions + +All foreign keys use: +- `ON UPDATE CASCADE` - Parent key changes propagate +- `ON DELETE RESTRICT` - Cannot delete parent with children + +### 6.9 Lineage Tracking + +Foreign key relationships are recorded in the `~lineage` table: + +```python +{ + 'child_attr': ('parent_schema.parent_table', 'parent_attr') +} +``` + +Used for semantic attribute matching in queries. + +--- + +## 7. Index Declarations + +### 7.1 Syntax + +``` +index(attr1, attr2, ...) +unique index(attr1, attr2, ...) +``` + +### 7.2 Examples + +```python +definition = """ +# User contact information +user_id : int32 +--- +first_name : varchar(50) +last_name : varchar(50) +email : varchar(100) +index(last_name, first_name) +unique index(email) +""" +``` + +### 7.3 Computed Expressions + +Indexes can include SQL expressions: + +``` +index(last_name, (YEAR(birth_date))) +``` + +### 7.4 Limitations + +- Cannot be altered after table creation (via `table.alter()`) +- Must reference existing attributes + +--- + +## 8. Part Tables + +### 8.1 Declaration + +```python +@schema +class Master(dj.Manual): + definition = """ + master_id : int32 + """ + + class Detail(dj.Part): + definition = """ + -> master + detail_id : int32 + --- + value : float32 + """ +``` + +### 8.2 Naming + +- SQL name: `master_table__part_name` +- Example: `experiment__trial` + +### 8.3 Master Reference + +Within Part definition, use: +- `-> master` (lowercase keyword) +- `-> MasterClassName` (class name) + +### 8.4 Constraints + +- Parts must reference their master +- Cannot delete Part records directly (use master) +- Cannot drop Part table directly (use master) +- Part inherits master's primary key + +--- + +## 9. Auto-Populated Tables + +### 9.1 Classes + +- `dj.Imported` - Data from external sources +- `dj.Computed` - Derived from other DataJoint tables + +### 9.2 Primary Key Constraint + +All primary key attributes must come from foreign key references. + +**Valid:** +```python +class Analysis(dj.Computed): + definition = """ + -> Session + -> Parameter + --- + result : float64 + """ +``` + +**Invalid** (by default): +```python +class Analysis(dj.Computed): + definition = """ + -> Session + analysis_id : int32 # ERROR: non-FK primary key + --- + result : float64 + """ +``` + +**Override:** +```python +dj.config['jobs.allow_new_pk_fields_in_computed_tables'] = True +``` + +### 9.3 Job Metadata + +When `config['jobs.add_job_metadata'] = True`, auto-populated tables receive: + +| Column | Type | Description | +|--------|------|-------------| +| `_job_start_time` | `datetime(3)` | Job start timestamp | +| `_job_duration` | `float64` | Duration in seconds | +| `_job_version` | `varchar(64)` | Code version | + +--- + +## 10. Validation + +### 10.1 Parse-Time Checks + +| Check | Error | +|-------|-------| +| Unknown type | `DataJointError: Unsupported attribute type` | +| Invalid attribute name | `DataJointError: Declaration error` | +| Comment starts with `:` | `DataJointError: comment must not start with colon` | +| Non-null blob default | `DataJointError: default value for blob can only be NULL` | + +### 10.2 Declaration-Time Checks + +| Check | Error | +|-------|-------| +| Table name > 64 chars | `DataJointError: Table name exceeds max length` | +| No primary key | `DataJointError: Table must have a primary key` | +| Nullable primary key attr | `DataJointError: Primary key attributes cannot be nullable` | +| Invalid CamelCase | `DataJointError: Invalid table name` | +| FK resolution failure | `DataJointError: Foreign key reference could not be resolved` | + +### 10.3 Insert-Time Validation + +The `table.validate()` method checks: +- Required fields present +- NULL constraints satisfied +- Primary key completeness +- Codec validation (if defined) +- UUID format +- JSON serializability + +--- + +## 11. SQL Generation + +### 11.1 CREATE TABLE Template + +```sql +CREATE TABLE `schema`.`table_name` ( + `attr1` TYPE1 NOT NULL COMMENT "...", + `attr2` TYPE2 DEFAULT NULL COMMENT "...", + PRIMARY KEY (`pk1`, `pk2`), + FOREIGN KEY (`fk_attr`) REFERENCES `parent` (`pk`) + ON UPDATE CASCADE ON DELETE RESTRICT, + INDEX (`idx_attr`), + UNIQUE INDEX (`uniq_attr`) +) ENGINE=InnoDB COMMENT="table comment" +``` + +### 11.2 Type Comment Encoding + +Core types and codecs are preserved in comments: + +```sql +`value` float NOT NULL COMMENT ":float32:measurement value" +`data` longblob DEFAULT NULL COMMENT "::serialized data" +`archive` json DEFAULT NULL COMMENT "::external storage" +``` + +--- + +## 12. Implementation Files + +| File | Purpose | +|------|---------| +| `declare.py` | Definition parsing, SQL generation | +| `heading.py` | Attribute metadata, type reconstruction | +| `table.py` | Base Table class, declaration interface | +| `user_tables.py` | Tier classes (Manual, Computed, etc.) | +| `schemas.py` | Schema binding, table decoration | +| `codecs.py` | Codec registry and resolution | +| `lineage.py` | Attribute lineage tracking | + +--- + +## 13. Future Considerations + +Potential improvements identified for the declaration system: + +1. **Better error messages** with suggestions and context +2. **Import-time validation** via `__init_subclass__` +3. **Parser alternatives** (regex-based for simpler grammar) +4. **SQL dialect abstraction** for multi-database support +5. **Extended constraints** (CHECK, custom validation) +6. **Migration support** for schema evolution +7. **Definition caching** for performance +8. **IDE tooling** support via structured intermediate representation diff --git a/src/reference/specs/type-system.md b/src/reference/specs/type-system.md new file mode 100644 index 00000000..3fae8a5e --- /dev/null +++ b/src/reference/specs/type-system.md @@ -0,0 +1,776 @@ +# Storage Types Redesign Spec + +## Overview + +This document defines a three-layer type architecture: + +1. **Native database types** - Backend-specific (`FLOAT`, `TINYINT UNSIGNED`, `LONGBLOB`). Discouraged for direct use. +2. **Core DataJoint types** - Standardized across backends, scientist-friendly (`float32`, `uint8`, `bool`, `json`). +3. **Codec Types** - Programmatic types with `encode()`/`decode()` semantics. Composable. + +| Layer | Description | Examples | +|-------|-------------|----------| +| **3. Codec Types** | Programmatic types with `encode()`/`decode()` semantics | ``, ``, ``, ``, ``, user-defined | +| **2. Core DataJoint** | Standardized, scientist-friendly types (preferred) | `int32`, `float64`, `varchar(n)`, `bool`, `datetime`, `json`, `bytes` | +| **1. Native Database** | Backend-specific types (discouraged) | `INT`, `FLOAT`, `TINYINT UNSIGNED`, `LONGBLOB` | + +Codec types resolve through core types to native types: `` β†’ `bytes` β†’ `LONGBLOB`. + +**Syntax distinction:** +- Core types: `int32`, `float64`, `varchar(255)` - no brackets +- Codec types: ``, ``, `` - angle brackets +- The `@` character indicates store (object storage vs inline in database) + +### OAS Addressing Schemes + +| Scheme | Path Pattern | Description | Use Case | +|--------|--------------|-------------|----------| +| **Schema-addressed** | `{schema}/{table}/{pk}/` | Path mirrors database structure | Large objects, Zarr, HDF5, numpy arrays | +| **Hash-addressed** | `_hash/{hash}` | Path from content hash (MD5) | Deduplicated blobs/attachments | + +### URL Representation + +DataJoint uses consistent URL representation for all storage backends: + +| Protocol | URL Format | Example | +|----------|------------|---------| +| Local filesystem | `file://` | `file:///data/objects/file.dat` | +| Amazon S3 | `s3://` | `s3://bucket/path/file.dat` | +| Google Cloud | `gs://` | `gs://bucket/path/file.dat` | +| Azure Blob | `az://` | `az://container/path/file.dat` | + +This unified approach treats all storage backends uniformly via fsspec, enabling: +- Consistent path handling across local and cloud storage +- Transparent switching between storage backends +- Streaming access to any storage type + +### Store References + +`` provides portable relative paths within configured stores with lazy ObjectRef access. +For arbitrary URLs that don't need ObjectRef semantics, use `varchar` instead. + +## Core DataJoint Types (Layer 2) + +Core types provide a standardized, scientist-friendly interface that works identically across +MySQL and PostgreSQL backends. Users should prefer these over native database types. + +**All core types are recorded in field comments using `:type:` syntax for reconstruction.** + +### Numeric Types + +| Core Type | Description | MySQL | PostgreSQL | +|-----------|-------------|-------|------------| +| `int8` | 8-bit signed | `TINYINT` | `SMALLINT` | +| `int16` | 16-bit signed | `SMALLINT` | `SMALLINT` | +| `int32` | 32-bit signed | `INT` | `INTEGER` | +| `int64` | 64-bit signed | `BIGINT` | `BIGINT` | +| `uint8` | 8-bit unsigned | `TINYINT UNSIGNED` | `SMALLINT` | +| `uint16` | 16-bit unsigned | `SMALLINT UNSIGNED` | `INTEGER` | +| `uint32` | 32-bit unsigned | `INT UNSIGNED` | `BIGINT` | +| `uint64` | 64-bit unsigned | `BIGINT UNSIGNED` | `NUMERIC(20)` | +| `float32` | 32-bit float | `FLOAT` | `REAL` | +| `float64` | 64-bit float | `DOUBLE` | `DOUBLE PRECISION` | +| `decimal(n,f)` | Fixed-point | `DECIMAL(n,f)` | `NUMERIC(n,f)` | + +### String Types + +| Core Type | Description | MySQL | PostgreSQL | +|-----------|-------------|-------|------------| +| `char(n)` | Fixed-length | `CHAR(n)` | `CHAR(n)` | +| `varchar(n)` | Variable-length | `VARCHAR(n)` | `VARCHAR(n)` | + +**Encoding:** All strings use UTF-8 (`utf8mb4` in MySQL, `UTF8` in PostgreSQL). +See [Encoding and Collation Policy](#encoding-and-collation-policy) for details. + +### Boolean + +| Core Type | Description | MySQL | PostgreSQL | +|-----------|-------------|-------|------------| +| `bool` | True/False | `TINYINT` | `BOOLEAN` | + +### Date/Time Types + +| Core Type | Description | MySQL | PostgreSQL | +|-----------|-------------|-------|------------| +| `date` | Date only | `DATE` | `DATE` | +| `datetime` | Date and time | `DATETIME` | `TIMESTAMP` | + +**Timezone policy:** All `datetime` values should be stored as **UTC**. Timezone conversion is a +presentation concern handled by the application layer, not the database. This ensures: +- Reproducible computations regardless of server or client timezone settings +- Simple arithmetic on temporal values (no DST ambiguity) +- Portable data across systems and regions + +Use `CURRENT_TIMESTAMP` for auto-populated creation times: +``` +created_at : datetime = CURRENT_TIMESTAMP +``` + +### Binary Types + +The core `bytes` type stores raw bytes without any serialization. Use the `` codec +for serialized Python objects. + +| Core Type | Description | MySQL | PostgreSQL | +|-----------|-------------|-------|------------| +| `bytes` | Raw bytes | `LONGBLOB` | `BYTEA` | + +### Other Types + +| Core Type | Description | MySQL | PostgreSQL | +|-----------|-------------|-------|------------| +| `json` | JSON document | `JSON` | `JSONB` | +| `uuid` | UUID | `BINARY(16)` | `UUID` | +| `enum(...)` | Enumeration | `ENUM(...)` | `CREATE TYPE ... AS ENUM` | + +### Native Passthrough Types + +Users may use native database types directly (e.g., `int`, `float`, `mediumint`, `tinyblob`), +but these are discouraged and will generate a warning. Native types lack explicit size +information, are not recorded in field comments, and may have portability issues across +database backends. + +**Prefer core DataJoint types over native types:** + +| Native (discouraged) | Core DataJoint (preferred) | +|---------------------|---------------------------| +| `int` | `int32` | +| `float` | `float32` or `float64` | +| `double` | `float64` | +| `tinyint` | `int8` | +| `tinyint unsigned` | `uint8` | +| `smallint` | `int16` | +| `bigint` | `int64` | + +### Type Modifiers Policy + +DataJoint table definitions have their own syntax for constraints and metadata. SQL type +modifiers are **not allowed** in type specifications because they conflict with DataJoint's +declarative syntax: + +| Modifier | Status | DataJoint Alternative | +|----------|--------|----------------------| +| `NOT NULL` / `NULL` | ❌ Not allowed | Use `= NULL` for nullable; omit default for required | +| `DEFAULT value` | ❌ Not allowed | Use `= value` syntax before the type | +| `PRIMARY KEY` | ❌ Not allowed | Position above `---` line | +| `UNIQUE` | ❌ Not allowed | Use DataJoint index syntax | +| `COMMENT 'text'` | ❌ Not allowed | Use `# comment` syntax | +| `CHARACTER SET` | ❌ Not allowed | Database-level configuration | +| `COLLATE` | ❌ Not allowed | Database-level configuration | +| `AUTO_INCREMENT` | ⚠️ Discouraged | Allowed with native types only, generates warning | +| `UNSIGNED` | βœ… Allowed | Part of type semantics (use `uint*` core types) | + +**Nullability and defaults:** DataJoint handles nullability through the default value syntax. +An attribute is nullable if and only if its default is `NULL`: + +``` +# Required (NOT NULL, no default) +name : varchar(100) + +# Nullable (default is NULL) +nickname = NULL : varchar(100) + +# Required with default value +status = "active" : varchar(20) +``` + +**Auto-increment policy:** DataJoint discourages `AUTO_INCREMENT` / `SERIAL` because: +- Breaks reproducibility (IDs depend on insertion order) +- Makes pipelines non-deterministic +- Complicates data migration and replication +- Primary keys should be meaningful, not arbitrary + +If required, use native types: `int auto_increment` or `serial` (with warning). + +### Encoding and Collation Policy + +Character encoding and collation are **database-level configuration**, not part of type +definitions. This ensures consistent behavior across all tables and simplifies portability. + +**Configuration** (in `dj.config` or `datajoint.json`): +```json +{ + "database.charset": "utf8mb4", + "database.collation": "utf8mb4_bin" +} +``` + +**Defaults:** + +| Setting | MySQL | PostgreSQL | +|---------|-------|------------| +| Charset | `utf8mb4` | `UTF8` | +| Collation | `utf8mb4_bin` | `C` | + +**Policy:** +- **UTF-8 required**: DataJoint validates charset is UTF-8 compatible at connection time +- **Case-sensitive by default**: Binary collation (`utf8mb4_bin` / `C`) ensures predictable comparisons +- **No per-column overrides**: `CHARACTER SET` and `COLLATE` are rejected in type definitions +- **Like timezone**: Encoding is infrastructure configuration, not part of the data model + +## Codec Types (Layer 3) + +Codec types provide `encode()`/`decode()` semantics on top of core types. They are +composable and can be built-in or user-defined. + +### Storage Mode: `@` Convention + +The `@` character in codec syntax indicates **object store** (vs inline in database): + +- **No `@`**: Inline storage (database column) - e.g., ``, `` +- **`@` present**: Object store - e.g., ``, `` +- **`@` alone**: Use default store - e.g., `` +- **`@name`**: Use named store - e.g., `` + +Some codecs support both modes (``, ``), others are store-only (``, ``, ``, ``). + +### Codec Base Class + +Codecs inherit from `dj.Codec` and auto-register when their class is defined. See the [Codec API Specification](codec-api.md) for complete details on creating custom codecs. + +```python +class GraphCodec(dj.Codec): + """Auto-registered as .""" + name = "graph" + + def get_dtype(self, is_store: bool) -> str: + return "" + + def encode(self, graph, *, key=None, store_name=None): + return {'nodes': list(graph.nodes()), 'edges': list(graph.edges())} + + def decode(self, stored, *, key=None): + import networkx as nx + G = nx.Graph() + G.add_nodes_from(stored['nodes']) + G.add_edges_from(stored['edges']) + return G +``` + +### Codec Resolution and Chaining + +Codecs resolve to core types through chaining. The `get_dtype(is_store)` method +returns the appropriate dtype based on storage mode: + +| Codec | `is_store` | Resolution Chain | SQL Type | +|-------|------------|------------------|----------| +| `` | `False` | `"bytes"` | `LONGBLOB`/`BYTEA` | +| `` | `True` | `""` β†’ `"json"` | `JSON`/`JSONB` | +| `` | `True` | `""` β†’ `"json"` (store=cold) | `JSON`/`JSONB` | +| `` | `False` | `"bytes"` | `LONGBLOB`/`BYTEA` | +| `` | `True` | `""` β†’ `"json"` | `JSON`/`JSONB` | +| `` | `True` | `"json"` | `JSON`/`JSONB` | +| `` | `True` | `"json"` | `JSON`/`JSONB` | +| `` | `False` | ERROR (store only) | β€” | +| `` | `False` | ERROR (store only) | β€” | +| `` | `True` | `"json"` | `JSON`/`JSONB` | +| `` | `True` | `"json"` | `JSON`/`JSONB` | + +### `` / `` - Schema-Addressed Storage + +**Built-in codec. Store only.** + +Schema-addressed OAS storage for files and folders: + +- **Schema-addressed**: Path mirrors database structure: `{schema}/{table}/{pk}/{attribute}/` +- One-to-one relationship with table row +- Deleted when row is deleted +- Returns `ObjectRef` for lazy access +- Supports direct writes (Zarr, HDF5) via fsspec +- **dtype**: `json` (stores path, store name, metadata) + +```python +class Analysis(dj.Computed): + definition = """ + -> Recording + --- + results : # default store + archive : # specific store + """ +``` + +#### Implementation + +```python +class ObjectCodec(SchemaCodec): + """Schema-addressed OAS storage. Store only.""" + name = "object" + + # get_dtype inherited from SchemaCodec + + def encode(self, value, *, key=None, store_name=None) -> dict: + schema, table, field, pk = self._extract_context(key) + path, _ = self._build_path(schema, table, field, pk) + backend = self._get_backend(store_name) + backend.put(path, value) + return {"path": path, "store": store_name, ...} + + def decode(self, stored: dict, *, key=None) -> ObjectRef: + backend = self._get_backend(stored["store"]) + return ObjectRef.from_json(stored, backend=backend) +``` + +### `` / `` - Hash-Addressed Storage + +**Built-in codec. Store only.** + +Hash-addressed storage with deduplication: + +- **Hash-addressed**: Path derived from content hash: `_hash/{hash[:2]}/{hash[2:4]}/{hash}` +- **Single blob only**: stores a single file or serialized object (not folders) +- **Per-project scope**: content is shared across all schemas in a project (not per-schema) +- Many-to-one: multiple rows (even across schemas) can reference same content +- Reference counted for garbage collection +- Deduplication: identical content stored once across the entire project +- For folders/complex objects, use `` instead +- **dtype**: `json` (stores hash, store name, size, metadata) + +``` +store_root/ +β”œβ”€β”€ {schema}/{table}/{pk}/ # schema-addressed storage +β”‚ └── {attribute}/ +β”‚ +└── _hash/ # hash-addressed storage + └── {hash[:2]}/{hash[2:4]}/{hash} +``` + +#### Implementation + +```python +class HashCodec(dj.Codec): + """Hash-addressed storage. Store only.""" + name = "hash" + + def get_dtype(self, is_store: bool) -> str: + if not is_store: + raise DataJointError(" requires @ (store only)") + return "json" + + def encode(self, data: bytes, *, key=None, store_name=None) -> dict: + """Store content, return metadata as JSON.""" + hash_id = hashlib.md5(data).hexdigest() # 32-char hex + store = get_store(store_name or dj.config['stores']['default']) + path = f"_hash/{hash_id[:2]}/{hash_id[2:4]}/{hash_id}" + + if not store.exists(path): + store.put(path, data) + + # Metadata stored in JSON column (no separate registry) + return {"hash": hash_id, "store": store_name, "size": len(data)} + + def decode(self, stored: dict, *, key=None) -> bytes: + """Retrieve content by hash.""" + store = get_store(stored["store"]) + path = f"_hash/{stored['hash'][:2]}/{stored['hash'][2:4]}/{stored['hash']}" + return store.get(path) +``` + +#### Database Column + +The `` type stores JSON metadata: + +```sql +-- content column (MySQL) +features JSON NOT NULL +-- Contains: {"hash": "abc123...", "store": "main", "size": 12345} + +-- content column (PostgreSQL) +features JSONB NOT NULL +``` + +### `` - Portable External Reference + +**Built-in codec. External only (store required).** + +Relative path references within configured stores: + +- **Relative paths**: paths within a configured store (portable across environments) +- **Store-aware**: resolves paths against configured store backend +- Returns `ObjectRef` for lazy access via fsspec +- Stores optional checksum for verification +- **dtype**: `json` (stores path, store name, checksum, metadata) + +**Key benefit**: Portability. The path is relative to the store, so pipelines can be moved +between environments (dev β†’ prod, cloud β†’ local) by changing store configuration without +updating data. + +```python +class RawData(dj.Manual): + definition = """ + session_id : int32 + --- + recording : # relative path within 'main' store + """ + +# Insert - user provides relative path within the store +table.insert1({ + 'session_id': 1, + 'recording': 'experiment_001/data.nwb' # relative to main store root +}) + +# Fetch - returns ObjectRef (lazy) +row = (table & 'session_id=1').fetch1() +ref = row['recording'] # ObjectRef +ref.download('/local/path') # explicit download +ref.open() # fsspec streaming access +``` + +#### When to Use `` vs `varchar` + +| Use Case | Recommended Type | +|----------|------------------| +| Need ObjectRef/lazy access | `` | +| Need portability (relative paths) | `` | +| Want checksum verification | `` | +| Just storing a URL string | `varchar` | +| External URLs you don't control | `varchar` | + +For arbitrary URLs (S3, HTTP, etc.) where you don't need ObjectRef semantics, +just use `varchar`. A string is simpler and more transparent. + +#### Implementation + +```python +class FilepathCodec(dj.Codec): + """Store-relative file references. External only.""" + name = "filepath" + + def get_dtype(self, is_external: bool) -> str: + if not is_external: + raise DataJointError(" requires @store") + return "json" + + def encode(self, relative_path: str, *, key=None, store_name=None) -> dict: + """Register reference to file in store.""" + store = get_store(store_name) # store_name required for filepath + return {'path': relative_path, 'store': store_name} + + def decode(self, stored: dict, *, key=None) -> ObjectRef: + """Return ObjectRef for lazy access.""" + return ObjectRef(store=get_store(stored['store']), path=stored['path']) +``` + +#### Database Column + +```sql +-- filepath column (MySQL) +recording JSON NOT NULL +-- Contains: {"path": "experiment_001/data.nwb", "store": "main", "checksum": "...", "size": ...} + +-- filepath column (PostgreSQL) +recording JSONB NOT NULL +``` + +#### Key Differences from Legacy `filepath@store` (now ``) + +| Feature | Legacy | New | +|---------|--------|-----| +| Access | Copy to local stage | ObjectRef (lazy) | +| Copying | Automatic | Explicit via `ref.download()` | +| Streaming | No | Yes via `ref.open()` | +| Paths | Relative | Relative (unchanged) | +| Store param | Required (`@store`) | Required (`@store`) | + +## Database Types + +### `json` - Cross-Database JSON Type + +JSON storage compatible across MySQL and PostgreSQL: + +```sql +-- MySQL +column_name JSON NOT NULL + +-- PostgreSQL (uses JSONB for better indexing) +column_name JSONB NOT NULL +``` + +The `json` database type: +- Used as dtype by built-in codecs (``, ``, ``) +- Stores arbitrary JSON-serializable data +- Automatically uses appropriate type for database backend +- Supports JSON path queries where available + +## Built-in Codecs + +### `` / `` - Serialized Python Objects + +**Supports both internal and external storage.** + +Serializes Python objects (NumPy arrays, dicts, lists, etc.) using DataJoint's +blob format. Compatible with MATLAB. + +- **``**: Stored in database (`bytes` β†’ `LONGBLOB`/`BYTEA`) +- **``**: Stored externally via `` with deduplication +- **``**: Stored in specific named store + +```python +class BlobCodec(dj.Codec): + """Serialized Python objects. Supports internal and external.""" + name = "blob" + + def get_dtype(self, is_external: bool) -> str: + return "" if is_external else "bytes" + + def encode(self, value, *, key=None, store_name=None) -> bytes: + from . import blob + return blob.pack(value, compress=True) + + def decode(self, stored, *, key=None) -> Any: + from . import blob + return blob.unpack(stored) +``` + +Usage: +```python +class ProcessedData(dj.Computed): + definition = """ + -> RawData + --- + small_result : # internal (in database) + large_result : # external (default store) + archive_result : # external (specific store) + """ +``` + +### `` / `` - File Attachments + +**Supports both internal and external storage.** + +Stores files with filename preserved. On fetch, extracts to configured download path. + +- **``**: Stored in database (`bytes` β†’ `LONGBLOB`/`BYTEA`) +- **``**: Stored externally via `` with deduplication +- **``**: Stored in specific named store + +```python +class AttachCodec(dj.Codec): + """File attachment with filename. Supports internal and external.""" + name = "attach" + + def get_dtype(self, is_external: bool) -> str: + return "" if is_external else "bytes" + + def encode(self, filepath, *, key=None, store_name=None) -> bytes: + path = Path(filepath) + return path.name.encode() + b"\0" + path.read_bytes() + + def decode(self, stored, *, key=None) -> str: + filename, contents = stored.split(b"\0", 1) + filename = filename.decode() + download_path = Path(dj.config['download_path']) / filename + download_path.write_bytes(contents) + return str(download_path) +``` + +Usage: +```python +class Attachments(dj.Manual): + definition = """ + attachment_id : int32 + --- + config : # internal (small file in DB) + data_file : # external (default store) + archive : # external (specific store) + """ +``` + +## User-Defined Codecs + +Users can define custom codecs for domain-specific data. See the [Codec API Specification](codec-api.md) for complete examples including: + +- Simple serialization codecs +- External storage codecs +- JSON with schema validation +- Context-dependent encoding +- External-only codecs (Zarr, HDF5) + +## Storage Comparison + +| Type | get_dtype | Resolves To | Storage Location | Dedup | Returns | +|------|-----------|-------------|------------------|-------|---------| +| `` | `bytes` | `LONGBLOB`/`BYTEA` | Database | No | Python object | +| `` | `` | `json` | `_hash/{hash}` | Yes | Python object | +| `` | `` | `json` | `_hash/{hash}` | Yes | Python object | +| `` | `bytes` | `LONGBLOB`/`BYTEA` | Database | No | Local file path | +| `` | `` | `json` | `_hash/{hash}` | Yes | Local file path | +| `` | `` | `json` | `_hash/{hash}` | Yes | Local file path | +| `` | `json` | `JSON`/`JSONB` | `{schema}/{table}/{pk}/` | No | ObjectRef | +| `` | `json` | `JSON`/`JSONB` | `{schema}/{table}/{pk}/` | No | ObjectRef | +| `` | `json` | `JSON`/`JSONB` | `_hash/{hash}` | Yes | bytes | +| `` | `json` | `JSON`/`JSONB` | `_hash/{hash}` | Yes | bytes | +| `` | `json` | `JSON`/`JSONB` | Configured store | No | ObjectRef | + +## Garbage Collection for Hash Storage + +Hash metadata (hash, store, size) is stored directly in each table's JSON column - no separate +registry table is needed. Garbage collection scans all tables to find referenced hashes: + +```python +def garbage_collect(store_name): + """Remove hash-addressed data not referenced by any table.""" + # Scan store for all hash files + store = get_store(store_name) + all_hashes = set(store.list_hashes()) # from _hash/ directory + + # Scan all tables for referenced hashes + referenced = set() + for schema in project.schemas: + for table in schema.tables: + for attr in table.heading.attributes: + if uses_hash_storage(attr): # , , + for row in table: + val = row.get(attr.name) + if val and val.get('store') == store_name: + referenced.add(val['hash']) + + # Delete orphaned files + for hash_id in (all_hashes - referenced): + store.delete(hash_path(hash_id)) +``` + +## Built-in Codec Comparison + +| Feature | `` | `` | `` | `` | `` | +|---------|----------|------------|-------------|--------------|---------------| +| Storage modes | Both | Both | External only | External only | External only | +| Internal dtype | `bytes` | `bytes` | N/A | N/A | N/A | +| External dtype | `` | `` | `json` | `json` | `json` | +| Addressing | Hash | Hash | Primary key | Hash | Relative path | +| Deduplication | Yes (external) | Yes (external) | No | Yes | No | +| Structure | Single blob | Single file | Files, folders | Single blob | Any | +| Returns | Python object | Local path | ObjectRef | bytes | ObjectRef | +| GC | Ref counted | Ref counted | With row | Ref counted | User managed | + +**When to use each:** +- **``**: Serialized Python objects (NumPy arrays, dicts). Use `` for large/duplicated data +- **``**: File attachments with filename preserved. Use `` for large files +- **``**: Large/complex file structures (Zarr, HDF5) where DataJoint controls organization +- **``**: Raw bytes with deduplication (typically used via `` or ``) +- **``**: Portable references to externally-managed files +- **`varchar`**: Arbitrary URLs/paths where ObjectRef semantics aren't needed + +## Key Design Decisions + +1. **Three-layer architecture**: + - Layer 1: Native database types (backend-specific, discouraged) + - Layer 2: Core DataJoint types (standardized, scientist-friendly) + - Layer 3: Codec types (encode/decode, composable) +2. **Core types are scientist-friendly**: `float32`, `uint8`, `bool`, `bytes` instead of `FLOAT`, `TINYINT UNSIGNED`, `LONGBLOB` +3. **Codecs use angle brackets**: ``, ``, `` - distinguishes from core types +4. **`@` indicates external storage**: No `@` = database, `@` present = object store +5. **`get_dtype(is_external)` method**: Codecs resolve dtype at declaration time based on storage mode +6. **Codecs are composable**: `` uses ``, which uses `json` +7. **Built-in external codecs use JSON dtype**: Stores metadata (path, hash, store name, etc.) +8. **Two OAS regions**: object (PK-addressed) and hash (hash-addressed) within managed stores +9. **Filepath for portability**: `` uses relative paths within stores for environment portability +10. **No `uri` type**: For arbitrary URLs, use `varchar`β€”simpler and more transparent +11. **Naming conventions**: + - `@` = external storage (object store) + - No `@` = internal storage (database) + - `@` alone = default store + - `@name` = named store +12. **Dual-mode codecs**: `` and `` support both internal and external storage +13. **External-only codecs**: ``, ``, `` require `@` +14. **Transparent access**: Codecs return Python objects or file paths +15. **Lazy access**: `` and `` return ObjectRef +16. **MD5 for content hashing**: See [Hash Algorithm Choice](#hash-algorithm-choice) below +17. **No separate registry**: Hash metadata stored in JSON columns, not a separate table +18. **Auto-registration via `__init_subclass__`**: Codecs register automatically when subclassedβ€”no decorator needed. Use `register=False` for abstract bases. Requires Python 3.10+. + +### Hash Algorithm Choice + +Content-addressed storage uses **MD5** (128-bit, 32-char hex) rather than SHA256 (256-bit, 64-char hex). + +**Rationale:** + +1. **Practical collision resistance is sufficient**: The birthday bound for MD5 is ~2^64 operations + before 50% collision probability. No scientific project will store anywhere near 10^19 files. + For content deduplication (not cryptographic verification), MD5 provides adequate uniqueness. + +2. **Storage efficiency**: 32-char hashes vs 64-char hashes in every JSON metadata field. + With millions of records, this halves the storage overhead for hash identifiers. + +3. **Performance**: MD5 is ~2-3x faster than SHA256 for large files. While both are fast, + the difference is measurable when hashing large scientific datasets. + +4. **Legacy compatibility**: DataJoint's existing `uuid_from_buffer()` function uses MD5. + The new system changes only the storage format (hex string in JSON vs binary UUID), + not the underlying hash algorithm. This simplifies migration. + +5. **Consistency with existing codebase**: Internal functions use MD5 for query caching. + +**Why not SHA256?** + +SHA256 is the modern standard for content-addressable storage (Git, Docker, IPFS). However: +- These systems prioritize cryptographic security against adversarial collision attacks +- Scientific data pipelines face no adversarial threat model +- The practical benefits (storage, speed, compatibility) outweigh theoretical security gains + +**Note**: If cryptographic verification is ever needed (e.g., for compliance or reproducibility +audits), SHA256 checksums can be computed on-demand without changing the storage addressing scheme. + +## Migration from Legacy Types + +| Legacy | New Equivalent | +|--------|----------------| +| `longblob` (auto-serialized) | `` | +| `blob@store` | `` | +| `attach` | `` | +| `attach@store` | `` | +| `filepath@store` (copy-based) | `` (ObjectRef-based) | + +### Migration from Legacy `~external_*` Stores + +Legacy external storage used per-schema `~external_{store}` tables with UUID references. +Migration to the new JSON-based hash storage requires: + +```python +def migrate_external_store(schema, store_name): + """ + Migrate legacy ~external_{store} to new HashRegistry. + + 1. Read all entries from ~external_{store} + 2. For each entry: + - Fetch content from legacy location + - Compute MD5 hash + - Copy to _hash/{hash}/ if not exists + - Update table column to new hash format + 3. After all schemas migrated, drop ~external_{store} tables + """ + external_table = schema.external[store_name] + + for entry in external_table: + legacy_uuid = entry['hash'] + + # Fetch content from legacy location + content = external_table.get(legacy_uuid) + + # Compute new content hash + hash_id = hashlib.md5(content).hexdigest() + + # Store in new location if not exists + new_path = f"_hash/{hash_id[:2]}/{hash_id[2:4]}/{hash_id}" + store = get_store(store_name) + if not store.exists(new_path): + store.put(new_path, content) + + # Update referencing tables: convert UUID column to JSON with hash metadata + # The JSON column stores {"hash": hash_id, "store": store_name, "size": len(content)} + # ... update all tables that reference this UUID ... + + # After migration complete for all schemas: + # DROP TABLE `{schema}`.`~external_{store}` +``` + +**Migration considerations:** +- Legacy UUIDs were based on MD5 content hash stored as `binary(16)` (UUID format) +- New system uses `char(32)` MD5 hex strings stored in JSON +- The hash algorithm is unchanged (MD5), only the storage format differs +- Migration can be done incrementally per schema +- Backward compatibility layer can read both formats during transition + +## Open Questions + +1. How long should the backward compatibility layer support legacy `~external_*` format? +2. Should `` (without store name) use a default store or require explicit store name? diff --git a/src/reference/specs/virtual-schemas.md b/src/reference/specs/virtual-schemas.md new file mode 100644 index 00000000..e65e5512 --- /dev/null +++ b/src/reference/specs/virtual-schemas.md @@ -0,0 +1,296 @@ +# Virtual Schemas Specification + +## Overview + +Virtual schemas provide a way to access existing database schemas without the original Python source code. This is useful for: + +- Exploring schemas created by other users +- Accessing legacy schemas +- Quick data inspection and queries +- Schema migration and maintenance + +--- + +## 1. Schema-Module Convention + +DataJoint maintains a **1:1 mapping** between database schemas and Python modules: + +| Database | Python | +|----------|--------| +| Schema | Module | +| Table | Class | + +This convention reduces conceptual complexity: **modules are schemas, classes are tables**. + +When you define tables in Python: +```python +# lab.py module +import datajoint as dj +schema = dj.Schema('lab') + +@schema +class Subject(dj.Manual): # Subject class β†’ `lab`.`subject` table + ... + +@schema +class Session(dj.Manual): # Session class β†’ `lab`.`session` table + ... +``` + +Virtual schemas recreate this mapping when the Python source isn't available: +```python +# Creates module-like object with table classes +lab = dj.virtual_schema('lab') +lab.Subject # Subject class for `lab`.`subject` +lab.Session # Session class for `lab`.`session` +``` + +--- + +## 2. Schema Introspection API + +### 2.1 Direct Table Access + +Access individual tables by name using bracket notation: + +```python +schema = dj.Schema('my_schema') + +# By CamelCase class name +experiment = schema['Experiment'] + +# By snake_case SQL name +experiment = schema['experiment'] + +# Query the table +experiment.fetch() +``` + +### 2.2 `get_table()` Method + +Explicit method for table access: + +```python +table = schema.get_table('Experiment') +table = schema.get_table('experiment') # also works +``` + +**Parameters:** +- `name` (str): Table name in CamelCase or snake_case + +**Returns:** `FreeTable` instance + +**Raises:** `DataJointError` if table doesn't exist + +### 2.3 Iteration + +Iterate over all tables in dependency order: + +```python +for table in schema: + print(table.full_table_name, len(table)) +``` + +Tables are yielded as `FreeTable` instances in topological order (dependencies before dependents). + +### 2.4 Containment Check + +Check if a table exists: + +```python +if 'Experiment' in schema: + print("Table exists") + +if 'nonexistent' not in schema: + print("Table doesn't exist") +``` + +--- + +## 3. Virtual Schema Function + +### 3.1 `dj.virtual_schema()` + +The recommended way to access existing schemas as modules: + +```python +lab = dj.virtual_schema('my_lab_schema') + +# Access tables as attributes (classes) +lab.Subject.fetch() +lab.Session & 'subject_id="M001"' + +# Full query algebra supported +(lab.Session * lab.Subject).fetch() +``` + +This maintains the module-class convention: `lab` behaves like a Python module with table classes as attributes. + +**Parameters:** + +| Parameter | Type | Default | Description | +|-----------|------|---------|-------------| +| `schema_name` | str | required | Database schema name | +| `connection` | Connection | None | Database connection (uses default) | +| `create_schema` | bool | False | Create schema if missing | +| `create_tables` | bool | False | Allow new table declarations | +| `add_objects` | dict | None | Additional objects for namespace | + +**Returns:** `VirtualModule` instance + +### 3.2 VirtualModule Class + +The underlying class (prefer `virtual_schema()` function): + +```python +module = dj.VirtualModule('lab', 'my_lab_schema') +module.Subject.fetch() +``` + +The first argument is the module display name, second is the schema name. + +### 3.3 Accessing the Schema Object + +Virtual modules expose the underlying Schema: + +```python +lab = dj.virtual_schema('my_lab_schema') +lab.schema.database # 'my_lab_schema' +lab.schema.list_tables() # ['subject', 'session', ...] +``` + +--- + +## 4. Table Class Generation + +### 4.1 `make_classes()` + +Create Python classes for all tables in a schema: + +```python +schema = dj.Schema('existing_schema') +schema.make_classes() + +# Now table classes are available in local namespace +Subject.fetch() +Session & 'date > "2024-01-01"' +``` + +**Parameters:** +- `into` (dict, optional): Namespace to populate. Defaults to caller's locals. + +### 4.2 Generated Class Types + +Classes are created based on table naming conventions: + +| Table Name Pattern | Generated Class | +|-------------------|-----------------| +| `subject` | `dj.Manual` | +| `#lookup_table` | `dj.Lookup` | +| `_imported_table` | `dj.Imported` | +| `__computed_table` | `dj.Computed` | +| `master__part` | `dj.Part` | + +### 4.3 Part Table Handling + +Part tables are attached to their master classes: + +```python +lab = dj.virtual_schema('my_lab') + +# Part tables are nested attributes +lab.Session.Trial.fetch() # Session.Trial is a Part table +``` + +--- + +## 5. Use Cases + +### 5.1 Data Exploration + +```python +# Quick exploration of unknown schema +lab = dj.virtual_schema('collaborator_lab') + +# List all tables +print(lab.schema.list_tables()) + +# Check table structure +print(lab.Subject.describe()) + +# Preview data +lab.Subject.fetch(limit=5) +``` + +### 5.2 Cross-Schema Queries + +```python +my_schema = dj.Schema('my_analysis') +external = dj.virtual_schema('external_lab') + +# Reference external tables in queries +@my_schema +class Analysis(dj.Computed): + definition = """ + -> external.Session + --- + result : float + """ +``` + +### 5.3 Schema Migration + +```python +old = dj.virtual_schema('old_schema') +new = dj.Schema('new_schema') + +# Copy data in topological order (iteration yields dependencies first) +for table in old: + new_table = new.get_table(table.table_name) + # Server-side INSERT...SELECT (no client-side data transfer) + new_table.insert(table) +``` + +### 5.4 Garbage Collection + +```python +from datajoint.gc import scan_hash_references + +schema = dj.Schema('my_schema') + +# Scan all tables for hash references +refs = scan_hash_references(schema, verbose=True) +``` + +--- + +## 6. Comparison of Methods + +| Method | Use Case | Returns | +|--------|----------|---------| +| `schema['Name']` | Quick single table access | `FreeTable` | +| `schema.get_table('name')` | Explicit table access | `FreeTable` | +| `for t in schema` | Iterate all tables | `FreeTable` generator | +| `'Name' in schema` | Check existence | `bool` | +| `dj.virtual_schema(name)` | Module-like access | `VirtualModule` | +| `make_classes()` | Populate namespace | None (side effect) | + +--- + +## 7. Implementation Reference + +| File | Purpose | +|------|---------| +| `schemas.py` | Schema, VirtualModule, virtual_schema | +| `table.py` | FreeTable class | +| `gc.py` | Uses get_table() for scanning | + +--- + +## 8. Error Messages + +| Error | Cause | Solution | +|-------|-------|----------| +| "Table does not exist" | `get_table()` on missing table | Check table name spelling | +| "Schema must be activated" | Operations on unactivated schema | Call `schema.activate(name)` | +| "Schema does not exist" | Schema name not in database | Check schema name, create if needed | diff --git a/src/support-events.md b/src/support-events.md deleted file mode 100644 index 33d63e28..00000000 --- a/src/support-events.md +++ /dev/null @@ -1,168 +0,0 @@ -# Community Support & Events - -## Support - -- Email our team at support@datajoint.com - -- [DataJoint Slack](https://join.slack.com/t/datajoint/shared_invite/enQtMjkwNjQxMjI5MDk0LTQ3ZjFiZmNmNGVkYWFkYjgwYjdhNTBlZTBmMWEyZDc2NzZlYTBjOTNmYzYwOWRmOGFmN2MyYzU0OWQ0MWZiYTE) - -- [GitHub issue](https://github.com/datajoint) on the relevant repository - -- [DataJoint.com](https://www.datajoint.com) for fully managed services - -## Events - -Find us at the following workshops and conferences! - -- [10th World Congress of Biomechanics](https://wcb2026.com/) - July 11-15,2026 - -- [FENS Forum](https://fensforum.org/) - July 6-10, 2026 - -- [CoSyNe](https://www.cosyne.org/) - March 12-17, 2026 - -- [Society for Neuroscience](https://www.sfn.org/meetings/neuroscience-2025) - November - 15-19, 2025 - -- [PharmStars PharmaTech Innovation Summit](https://www.pharmstars.com/pharmatech-innovation-summit) - November 18, 2025 - -- [20th Meeting of the Spanish Society for Neuroscience](https://congresosenc.es/) - September 3-5, 2025 - -- [Neuropixels and OpenScope Workshop](https://alleninstitute.org/events/2025-neuropixels-and-openscope-workshop/) - July 9-11, 2025 - -- [ODIN (Open Data in Neurophysiology) Workshop](https://odin.mit.edu/conferences/odin_june25_workshop/odin_june2025_workshop.html) - June 24-26, 2025 - -- [COSYNE](https://www.cosyne.org/) - March 27-30, 2025 - -- [BRAIN NeuroAI Workshop](https://n4solutionsllc.com/brainneuroai/) - November 12, 2024 - -- [Society for Neuroscience 2024](https://www.sfn.org/meetings/neuroscience-2024) - - October 5-9, 2024 - -- [INCF Neuroinformatics Assembly](https://neuroinformatics.incf.org/) - September - 23-27, 2024 - -- [ACCN](https://neurosciencenetwork.org/) - -- [Gladstone Institutes - Neuroscience Seminar](https://gladstone.org/neuroscience-seminar/neuroscience-seminar-series) - - June 13, 2024 - -- [10th Annual NIH BRAIN Initiative Conference](https://braininitiative.nih.gov/news-events/events/10th-annual-brain-initiative-conference) - - June 16-18, 2024 - -- [BIO](https://convention.bio.org/) - June 3-6, 2024 - -- [2024 NWB Developer Hackathon](https://try.datajoint.com/nwb-hackathon2024) - April - 17-19, 2024 - -- [DataJoint SciOps Summit 2024](https://try.datajoint.com/sciops-summit-2024) - April - 15-17, 2024 - -- [COSYNE](https://www.cosyne.org/) - February 29 - March 3, 2024 - -- [Kavli NDI](https://kavlijhu.org/events) - January 18,2024 - -- UCSF - January 12, 2024 - -- [RESI](https://resiconference.com/) - January 9-11, 2024 - -- [Society for Neuroscience](https://www.sfn.org/meetings/neuroscience-2023) - November - 11-15, 2023 - -- [Harvard School of Medicine Workshop: Data Workflows for Neuroscience Teams](https://try.datajoint.com/hmsworkshop)- - October 17, 18 & 20, 2023 - -- [MIT ODIN Symposium](https://odin.mit.edu/schedule.html) - October 10-12, 2023 - -- [HLTH 2023](https://www.hlth.com/2023event) - October 8-11, 2023 - -- [INCF Short Course: Introduction to Neuroinformatics](https://datajoint.com/news/datajoint-presenter-incf-short-course) - - October 2-4, 2023 - -- [INCF Neuroinformatics Assembly Workshop: Research Workflows for Collaborative Neuroscience](https://datajoint.com/news/datajoint-collaborative-research-workflows-workshop) - - September 18-20, 2023 - -- [SciPy](https://www.scipy2023.scipy.org/) - July 12-14, 2023 - -- [Cold Spring Harbor Laboratory Neural Data Science Course](https://meetings.cshl.edu/courses.aspx?course=C-NEUDATA&year=23) - - July 11-24, 2023 - -- Allen Institute Neuropixels and OpenScope Workshop - June 21-22, 2023 - -- NIH BRAIN Initiative meeting - June 12-13, 2023 - -- Northwestern University - June 9, 2023 - -- University of Bonn - March 22-23, 2023 - -- Tel Aviv University - March 19-20, 2023 - -- [COSYNE](https://www.cosyne.org/) - March 9-12, 2023 - -- [Flatiron Institute CCN 2023 Workshop on Calcium & Voltage Imaging Analysis](https://indico.flatironinstitute.org/event/3293/) - - January 29 - February 1, 2023 - -- [Society for Neuroscience](https://www.sfn.org/meetings/neuroscience-2022) - November - 12-16, 2022 - -- [Senses in Motion Symposium](https://sensesinmotion.org/) - October 17, 2022 - -- [NeuroDataReHack Hackathon](https://alleninstitute.org/what-we-do/brain-science/events-training/2022-neurodatarehack-hackathon/) - - October 3-5, 2022 - -- [Neuromatch Conference](https://conference.neuromatch.io/) - September 27-28, 2022 - - - Recording: - [Automated Pipeline for Pose Estimation](https://www.youtube.com/watch?v=T3GPNTV5NqM) - -- [Neuropixels and OpenScope Workshop](https://alleninstitute.org/what-we-do/brain-science/events-training/2022-neuropixels-openscope-workshop/2022-workshop-attendee-information/) - - September 21-23, 2022 - -- [INCF Assembly](https://neuroinformatics.incf.org/) - September 12-16, 2022 - -- [Research Workflows Workshop](https://github.com/datajoint/sciops-workshop) - - September 6-8, 2022 - -- DataJoint Office Hours - August 24, 2022 - - - Recording: [LabBook Deployment](https://www.youtube.com/watch?v=MgL_F1X8Z1M) - - Recording: - [Attaching Element DeepLabCut](https://www.youtube.com/watch?v=F0GD8h4iios) - -- [Neurodata Without Borders Hackathon User Days](https://github.com/NeurodataWithoutBorders/nwb_hackathons/blob/main/HCK13_2022_Janelia/projects/PROJECTS.md) - - July 24-27, 2022 - - - Recording: - [Integrating DataJoint Pipelines with NWB](https://www.youtube.com/watch?v=-8OuJ69XtWc) - -- [NIH BRAIN Initiative](https://braininitiative.nih.gov/News-Events/event/8th-annual-brain-initiative-meeting) - - June 21-22, 2022 - -- DataJoint Office Hours - May 20, 2022 - - - Recording: - [MATLAB/Python interoperability](https://www.youtube.com/watch?v=Y7JG2-B2O5U) - -- DataJoint Office Hours - April 27, 2022 - - - Filepath handling, `linking_module`, and `key` management in `make` functions. - -- [UCL Neuropixels Course](https://www.ucl.ac.uk/neuropixels/training/2021-neuropixels-course) - - October 19, 2021 - -- INCF Neuroinformatics Training Week - August 30 - September 2, 2021 - - - Recording: [Scientific Workflows and DataJoint Basics](https://youtu.be/YOSNIW6vlQ8) - - Recording: - [Scientific Workflows, and DataJoint Imported & Computed Tables](https://youtu.be/dudHnEtT_30) - - Recording: [DataJoint Element Array Electrophysiology](https://youtu.be/KQlGYOBq7ow) - - Recording: - [Setup DataJoint Elements Development Environment](https://youtu.be/1j_OQiQDJV0) - -- NYU β€˜FAIR Thee Well’ Symposium - August 9-10, 2021 - - - Recording: - [Sessions 1-3](https://www.youtube.com/watch?v=EyKC-VPP93k&list=PLoxm1_YI8Y4Mv0wUYiRinKkmqTxx2_Z3Y) - -- Neuromatch Academy - July 29, 2021 - - Recording: [Session 1](https://www.crowdcast.io/e/nma2021/32) - - Recording: [Session 2](https://www.crowdcast.io/e/nma2021/34) diff --git a/src/tutorials/advanced/custom-codecs.ipynb b/src/tutorials/advanced/custom-codecs.ipynb new file mode 100644 index 00000000..1dc280f7 --- /dev/null +++ b/src/tutorials/advanced/custom-codecs.ipynb @@ -0,0 +1,307 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "cell-0", + "metadata": {}, + "source": [ + "# Custom Codecs\n", + "\n", + "This tutorial covers extending DataJoint's type system. You'll learn:\n", + "\n", + "- **Codec basics** β€” Encoding and decoding\n", + "- **Creating codecs** β€” Domain-specific types\n", + "- **Codec chaining** β€” Composing codecs" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "cell-1", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:14.538227Z", + "iopub.status.busy": "2026-01-14T07:34:14.538115Z", + "iopub.status.idle": "2026-01-14T07:34:15.383712Z", + "shell.execute_reply": "2026-01-14T07:34:15.383381Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2026-01-14 01:34:15,376][INFO]: DataJoint 2.0.0a22 connected to root@127.0.0.1:3306\n" + ] + } + ], + "source": [ + "import datajoint as dj\n", + "import numpy as np\n", + "\n", + "schema = dj.Schema('tutorial_codecs')" + ] + }, + { + "cell_type": "markdown", + "id": "cell-2", + "metadata": {}, + "source": [ + "## Creating a Custom Codec" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "cell-3", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:15.385411Z", + "iopub.status.busy": "2026-01-14T07:34:15.385218Z", + "iopub.status.idle": "2026-01-14T07:34:15.388222Z", + "shell.execute_reply": "2026-01-14T07:34:15.387997Z" + } + }, + "outputs": [], + "source": [ + "import networkx as nx\n", + "\n", + "class GraphCodec(dj.Codec):\n", + " \"\"\"Store NetworkX graphs.\"\"\"\n", + " \n", + " name = \"graph\" # Use as \n", + " \n", + " def get_dtype(self, is_store: bool) -> str:\n", + " return \"\"\n", + " \n", + " def encode(self, value, *, key=None, store_name=None):\n", + " return {'nodes': list(value.nodes(data=True)), 'edges': list(value.edges(data=True))}\n", + " \n", + " def decode(self, stored, *, key=None):\n", + " g = nx.Graph()\n", + " g.add_nodes_from(stored['nodes'])\n", + " g.add_edges_from(stored['edges'])\n", + " return g\n", + " \n", + " def validate(self, value):\n", + " if not isinstance(value, nx.Graph):\n", + " raise TypeError(f\"Expected nx.Graph\")" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "cell-4", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:15.389410Z", + "iopub.status.busy": "2026-01-14T07:34:15.389295Z", + "iopub.status.idle": "2026-01-14T07:34:15.413810Z", + "shell.execute_reply": "2026-01-14T07:34:15.413469Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2026-01-14 01:34:15,391][WARNING]: Native type 'int' is used in attribute 'conn_id'. Consider using a core DataJoint type for better portability.\n" + ] + } + ], + "source": [ + "@schema\n", + "class Connectivity(dj.Manual):\n", + " definition = \"\"\"\n", + " conn_id : int\n", + " ---\n", + " network : \n", + " \"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "cell-5", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:15.415420Z", + "iopub.status.busy": "2026-01-14T07:34:15.415302Z", + "iopub.status.idle": "2026-01-14T07:34:15.428595Z", + "shell.execute_reply": "2026-01-14T07:34:15.428288Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Type: \n", + "Edges: [(1, 2), (1, 3), (2, 3)]\n" + ] + } + ], + "source": [ + "# Create and insert\n", + "g = nx.Graph()\n", + "g.add_edges_from([(1, 2), (2, 3), (1, 3)])\n", + "Connectivity.insert1({'conn_id': 1, 'network': g})\n", + "\n", + "# Fetch\n", + "result = (Connectivity & {'conn_id': 1}).fetch1('network')\n", + "print(f\"Type: {type(result)}\")\n", + "print(f\"Edges: {list(result.edges())}\")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-6", + "metadata": {}, + "source": [ + "## Codec Structure\n", + "\n", + "```python\n", + "class MyCodec(dj.Codec):\n", + " name = \"mytype\" # Use as \n", + " \n", + " def get_dtype(self, is_store: bool) -> str:\n", + " return \"\" # Storage type\n", + " \n", + " def encode(self, value, *, key=None, store_name=None):\n", + " return serializable_data\n", + " \n", + " def decode(self, stored, *, key=None):\n", + " return python_object\n", + " \n", + " def validate(self, value): # Optional\n", + " pass\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "cell-7", + "metadata": {}, + "source": [ + "## Example: Spike Train" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "cell-8", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:15.430164Z", + "iopub.status.busy": "2026-01-14T07:34:15.430031Z", + "iopub.status.idle": "2026-01-14T07:34:15.432896Z", + "shell.execute_reply": "2026-01-14T07:34:15.432647Z" + } + }, + "outputs": [], + "source": [ + "from dataclasses import dataclass\n", + "\n", + "@dataclass\n", + "class SpikeTrain:\n", + " times: np.ndarray\n", + " unit_id: int\n", + " quality: str\n", + "\n", + "class SpikeTrainCodec(dj.Codec):\n", + " name = \"spike_train\"\n", + " \n", + " def get_dtype(self, is_store: bool) -> str:\n", + " return \"\"\n", + " \n", + " def encode(self, value, *, key=None, store_name=None):\n", + " return {'times': value.times, 'unit_id': value.unit_id, 'quality': value.quality}\n", + " \n", + " def decode(self, stored, *, key=None):\n", + " return SpikeTrain(times=stored['times'], unit_id=stored['unit_id'], quality=stored['quality'])" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "cell-9", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:15.434119Z", + "iopub.status.busy": "2026-01-14T07:34:15.434009Z", + "iopub.status.idle": "2026-01-14T07:34:15.459484Z", + "shell.execute_reply": "2026-01-14T07:34:15.459192Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2026-01-14 01:34:15,436][WARNING]: Native type 'int' is used in attribute 'unit_id'. Consider using a core DataJoint type for better portability.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Type: , Spikes: 50\n" + ] + } + ], + "source": [ + "@schema\n", + "class Unit(dj.Manual):\n", + " definition = \"\"\"\n", + " unit_id : int\n", + " ---\n", + " spikes : \n", + " \"\"\"\n", + "\n", + "train = SpikeTrain(times=np.sort(np.random.uniform(0, 100, 50)), unit_id=1, quality='good')\n", + "Unit.insert1({'unit_id': 1, 'spikes': train})\n", + "\n", + "result = (Unit & {'unit_id': 1}).fetch1('spikes')\n", + "print(f\"Type: {type(result)}, Spikes: {len(result.times)}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "cell-10", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:15.460848Z", + "iopub.status.busy": "2026-01-14T07:34:15.460735Z", + "iopub.status.idle": "2026-01-14T07:34:15.471851Z", + "shell.execute_reply": "2026-01-14T07:34:15.471484Z" + } + }, + "outputs": [], + "source": [ + "schema.drop(prompt=False)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/src/tutorials/advanced/distributed.ipynb b/src/tutorials/advanced/distributed.ipynb new file mode 100644 index 00000000..d258e3a3 --- /dev/null +++ b/src/tutorials/advanced/distributed.ipynb @@ -0,0 +1,606 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "cell-0", + "metadata": {}, + "source": [ + "# Distributed Computing\n", + "\n", + "This tutorial covers running computations across multiple workers. You'll learn:\n", + "\n", + "- **Jobs 2.0** β€” DataJoint's job coordination system\n", + "- **Multi-process** β€” Parallel workers on one machine\n", + "- **Multi-machine** β€” Cluster-scale computation\n", + "- **Error handling** β€” Recovery and monitoring" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "cell-1", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:17.769428Z", + "iopub.status.busy": "2026-01-14T07:34:17.769282Z", + "iopub.status.idle": "2026-01-14T07:34:18.497969Z", + "shell.execute_reply": "2026-01-14T07:34:18.497595Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2026-01-14 01:34:18,487][INFO]: DataJoint 2.0.0a22 connected to root@127.0.0.1:3306\n" + ] + } + ], + "source": [ + "import datajoint as dj\n", + "import numpy as np\n", + "import time\n", + "\n", + "schema = dj.Schema('tutorial_distributed')\n", + "\n", + "# Clean up from previous runs\n", + "schema.drop(prompt=False)\n", + "schema = dj.Schema('tutorial_distributed')" + ] + }, + { + "cell_type": "markdown", + "id": "cell-2", + "metadata": {}, + "source": [ + "## Setup" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "cell-3", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:18.499738Z", + "iopub.status.busy": "2026-01-14T07:34:18.499511Z", + "iopub.status.idle": "2026-01-14T07:34:18.543746Z", + "shell.execute_reply": "2026-01-14T07:34:18.543345Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2026-01-14 01:34:18,502][WARNING]: Native type 'int' is used in attribute 'exp_id'. Consider using a core DataJoint type for better portability.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2026-01-14 01:34:18,503][WARNING]: Native type 'int' is used in attribute 'n_samples'. Consider using a core DataJoint type for better portability.\n" + ] + } + ], + "source": [ + "@schema\n", + "class Experiment(dj.Manual):\n", + " definition = \"\"\"\n", + " exp_id : int\n", + " ---\n", + " n_samples : int\n", + " \"\"\"\n", + "\n", + "@schema\n", + "class Analysis(dj.Computed):\n", + " definition = \"\"\"\n", + " -> Experiment\n", + " ---\n", + " result : float64\n", + " compute_time : float32\n", + " \"\"\"\n", + "\n", + " def make(self, key):\n", + " start = time.time()\n", + " n = (Experiment & key).fetch1('n_samples')\n", + " result = float(np.mean(np.random.randn(n) ** 2))\n", + " time.sleep(0.1)\n", + " self.insert1({**key, 'result': result, 'compute_time': time.time() - start})" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "cell-4", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:18.545533Z", + "iopub.status.busy": "2026-01-14T07:34:18.545404Z", + "iopub.status.idle": "2026-01-14T07:34:18.565001Z", + "shell.execute_reply": "2026-01-14T07:34:18.564740Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "To compute: 20\n" + ] + } + ], + "source": [ + "Experiment.insert([{'exp_id': i, 'n_samples': 10000} for i in range(20)])\n", + "print(f\"To compute: {len(Analysis.key_source - Analysis)}\")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-5", + "metadata": {}, + "source": [ + "## Direct vs Distributed Mode\n", + "\n", + "**Direct mode** (default): No coordination, suitable for single worker.\n", + "\n", + "**Distributed mode** (`reserve_jobs=True`): Workers coordinate via jobs table." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "cell-6", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:18.566439Z", + "iopub.status.busy": "2026-01-14T07:34:18.566329Z", + "iopub.status.idle": "2026-01-14T07:34:19.229426Z", + "shell.execute_reply": "2026-01-14T07:34:19.229113Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2026-01-14 01:34:18,572][WARNING]: Native type 'int' is used in attribute 'exp_id'. Consider using a core DataJoint type for better portability.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + "Analysis: 0%| | 0/5 [00:00\n", + " .Table{\n", + " border-collapse:collapse;\n", + " }\n", + " .Table th{\n", + " background: #A0A0A0; color: #ffffff; padding:2px 4px; border:#f0e0e0 1px solid;\n", + " font-weight: normal; font-family: monospace; font-size: 75%; text-align: center;\n", + " }\n", + " .Table th p{\n", + " margin: 0;\n", + " }\n", + " .Table td{\n", + " padding:2px 4px; border:#f0e0e0 1px solid; font-size: 75%;\n", + " }\n", + " .Table tr:nth-child(odd){\n", + " background: #ffffff;\n", + " color: #000000;\n", + " }\n", + " .Table tr:nth-child(even){\n", + " background: #f3f1ff;\n", + " color: #000000;\n", + " }\n", + " /* Tooltip container */\n", + " .djtooltip {\n", + " }\n", + " /* Tooltip text */\n", + " .djtooltip .djtooltiptext {\n", + " visibility: hidden;\n", + " width: 120px;\n", + " background-color: black;\n", + " color: #fff;\n", + " text-align: center;\n", + " padding: 5px 0;\n", + " border-radius: 6px;\n", + " /* Position the tooltip text - see examples below! */\n", + " position: absolute;\n", + " z-index: 1;\n", + " }\n", + " #primary {\n", + " font-weight: bold;\n", + " color: black;\n", + " }\n", + " #nonprimary {\n", + " font-weight: normal;\n", + " color: white;\n", + " }\n", + "\n", + " /* Show the tooltip text when you mouse over the tooltip container */\n", + " .djtooltip:hover .djtooltiptext {\n", + " visibility: visible;\n", + " }\n", + "\n", + " /* Dark mode support */\n", + " @media (prefers-color-scheme: dark) {\n", + " .Table th{\n", + " background: #4a4a4a; color: #ffffff; border:#555555 1px solid; text-align: center;\n", + " }\n", + " .Table td{\n", + " border:#555555 1px solid;\n", + " }\n", + " .Table tr:nth-child(odd){\n", + " background: #2d2d2d;\n", + " color: #e0e0e0;\n", + " }\n", + " .Table tr:nth-child(even){\n", + " background: #3d3d3d;\n", + " color: #e0e0e0;\n", + " }\n", + " .djtooltip .djtooltiptext {\n", + " background-color: #555555;\n", + " color: #ffffff;\n", + " }\n", + " #primary {\n", + " color: #bd93f9;\n", + " }\n", + " #nonprimary {\n", + " color: #e0e0e0;\n", + " }\n", + " }\n", + " \n", + " \n", + " A team within a company\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "
\n", + "

name

\n", + " team name\n", + "
\n", + "

car

\n", + " A car belonging to a team (null to allow registering first but specifying car later)\n", + "
businessjson
engineeringjson
marketingjson
\n", + " \n", + "

Total: 3

\n", + " " + ], + "text/plain": [ + "*name car \n", + "+------------+ +------+\n", + "business json \n", + "engineering json \n", + "marketing json \n", + " (Total: 3)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Team()" + ] + }, + { + "cell_type": "markdown", + "id": "c95cbbee-4ef7-4870-ad42-a60345a3644f", + "metadata": {}, + "source": [ + "## Restriction" + ] + }, + { + "cell_type": "markdown", + "id": "8b454996", + "metadata": {}, + "source": [ + "Now let's see what kinds of queries we can form to demonstrate how we can query this pipeline." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "81efda24", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:26.621280Z", + "iopub.status.busy": "2026-01-14T07:34:26.621151Z", + "iopub.status.idle": "2026-01-14T07:34:26.626041Z", + "shell.execute_reply": "2026-01-14T07:34:26.625789Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " A team within a company\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "
\n", + "

name

\n", + " team name\n", + "
\n", + "

car

\n", + " A car belonging to a team (null to allow registering first but specifying car later)\n", + "
businessjson
\n", + " \n", + "

Total: 1

\n", + " " + ], + "text/plain": [ + "*name car \n", + "+----------+ +------+\n", + "business json \n", + " (Total: 1)" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Which team has a `car` equal to 100 inches long?\n", + "Team & {\"car.length\": 100}" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "fd7b855d", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:26.627431Z", + "iopub.status.busy": "2026-01-14T07:34:26.627321Z", + "iopub.status.idle": "2026-01-14T07:34:26.631854Z", + "shell.execute_reply": "2026-01-14T07:34:26.631539Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " A team within a company\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "
\n", + "

name

\n", + " team name\n", + "
\n", + "

car

\n", + " A car belonging to a team (null to allow registering first but specifying car later)\n", + "
engineeringjson
\n", + " \n", + "

Total: 1

\n", + " " + ], + "text/plain": [ + "*name car \n", + "+------------+ +------+\n", + "engineering json \n", + " (Total: 1)" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Which team has a `car` less than 50 inches long?\n", + "Team & \"car->>'$.length' < 50\"" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "b76ebb75", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:26.633064Z", + "iopub.status.busy": "2026-01-14T07:34:26.632971Z", + "iopub.status.idle": "2026-01-14T07:34:26.637476Z", + "shell.execute_reply": "2026-01-14T07:34:26.637219Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " A team within a company\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "
\n", + "

name

\n", + " team name\n", + "
\n", + "

car

\n", + " A car belonging to a team (null to allow registering first but specifying car later)\n", + "
engineeringjson
\n", + " \n", + "

Total: 1

\n", + " " + ], + "text/plain": [ + "*name car \n", + "+------------+ +------+\n", + "engineering json \n", + " (Total: 1)" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Any team that has had their car inspected?\n", + "Team & [{\"car.inspected:unsigned\": True}, {\"car.safety_inspected:unsigned\": True}]" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "b787784c", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:26.638754Z", + "iopub.status.busy": "2026-01-14T07:34:26.638669Z", + "iopub.status.idle": "2026-01-14T07:34:26.643075Z", + "shell.execute_reply": "2026-01-14T07:34:26.642835Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " A team within a company\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "
\n", + "

name

\n", + " team name\n", + "
\n", + "

car

\n", + " A car belonging to a team (null to allow registering first but specifying car later)\n", + "
engineeringjson
marketingjson
\n", + " \n", + "

Total: 2

\n", + " " + ], + "text/plain": [ + "*name car \n", + "+------------+ +------+\n", + "engineering json \n", + "marketing json \n", + " (Total: 2)" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Which teams do not have hyper white lights for their first head light?\n", + "Team & {\"car.headlights[0].hyper_white\": None}" + ] + }, + { + "cell_type": "markdown", + "id": "5bcf0b5d", + "metadata": {}, + "source": [ + "Notice that the previous query will satisfy the `None` check if it experiences any of the following scenarios:\n", + "- if entire record missing (`marketing` satisfies this)\n", + "- JSON key is missing\n", + "- JSON value is set to JSON `null` (`engineering` satisfies this)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "bcf1682e-a0c7-4c2f-826b-0aec9052a694", + "metadata": {}, + "source": [ + "## Projection" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "daea110e", + "metadata": {}, + "source": [ + "Projections can be quite useful with the `json` type since we can extract out just what we need. This allows greater query flexibility but more importantly, for us to be able to fetch only what is pertinent." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "8fb8334a", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:26.644631Z", + "iopub.status.busy": "2026-01-14T07:34:26.644533Z", + "iopub.status.idle": "2026-01-14T07:34:26.648994Z", + "shell.execute_reply": "2026-01-14T07:34:26.648738Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

name

\n", + " team name\n", + "
\n", + "

car_name

\n", + " calculated attribute\n", + "
\n", + "

car_length

\n", + " calculated attribute\n", + "
businessChaching100
engineeringRever20.5
marketingNoneNone
\n", + " \n", + "

Total: 3

\n", + " " + ], + "text/plain": [ + "*name car_name car_length \n", + "+------------+ +----------+ +------------+\n", + "business Chaching 100 \n", + "engineering Rever 20.5 \n", + "marketing None None \n", + " (Total: 3)" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Only interested in the car names and the length but let the type be inferred\n", + "q_untyped = Team.proj(\n", + " car_name=\"car.name\",\n", + " car_length=\"car.length\",\n", + ")\n", + "q_untyped" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "bb5f0448", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:26.650244Z", + "iopub.status.busy": "2026-01-14T07:34:26.650157Z", + "iopub.status.idle": "2026-01-14T07:34:26.652875Z", + "shell.execute_reply": "2026-01-14T07:34:26.652630Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[{'name': 'business', 'car_name': 'Chaching', 'car_length': '100'},\n", + " {'name': 'engineering', 'car_name': 'Rever', 'car_length': '20.5'},\n", + " {'name': 'marketing', 'car_name': None, 'car_length': None}]" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "q_untyped.to_dicts()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "a307dfd7", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:26.654024Z", + "iopub.status.busy": "2026-01-14T07:34:26.653939Z", + "iopub.status.idle": "2026-01-14T07:34:26.658277Z", + "shell.execute_reply": "2026-01-14T07:34:26.658041Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

name

\n", + " team name\n", + "
\n", + "

car_name

\n", + " calculated attribute\n", + "
\n", + "

car_length

\n", + " calculated attribute\n", + "
businessChaching100.0
engineeringRever20.5
marketingNoneNone
\n", + " \n", + "

Total: 3

\n", + " " + ], + "text/plain": [ + "*name car_name car_length \n", + "+------------+ +----------+ +------------+\n", + "business Chaching 100.0 \n", + "engineering Rever 20.5 \n", + "marketing None None \n", + " (Total: 3)" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Nevermind, I'll specify the type explicitly\n", + "q_typed = Team.proj(\n", + " car_name=\"car.name\",\n", + " car_length=\"car.length:float\",\n", + ")\n", + "q_typed" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "8a93dbf9", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:26.659471Z", + "iopub.status.busy": "2026-01-14T07:34:26.659396Z", + "iopub.status.idle": "2026-01-14T07:34:26.661925Z", + "shell.execute_reply": "2026-01-14T07:34:26.661715Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[{'name': 'business', 'car_name': 'Chaching', 'car_length': 100.0},\n", + " {'name': 'engineering', 'car_name': 'Rever', 'car_length': 20.5},\n", + " {'name': 'marketing', 'car_name': None, 'car_length': None}]" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "q_typed.to_dicts()" + ] + }, + { + "cell_type": "markdown", + "id": "62dd0239-fa70-4369-81eb-3d46c5053fee", + "metadata": {}, + "source": [ + "## Describe" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "73d9df01", + "metadata": {}, + "source": [ + "Lastly, the `.describe()` function on the `Team` table can help us generate the table's definition. This is useful if we are connected directly to the pipeline without the original source." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "0e739932", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:26.663144Z", + "iopub.status.busy": "2026-01-14T07:34:26.663068Z", + "iopub.status.idle": "2026-01-14T07:34:26.669565Z", + "shell.execute_reply": "2026-01-14T07:34:26.669360Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "# A team within a company\n", + "name : varchar(40) # team name\n", + "---\n", + "car=null : json # A car belonging to a team (null to allow registering first but specifying car later)\n", + "UNIQUE INDEX ((json_value(`car`, _utf8mb4'$.length' returning decimal(4, 1))))\n", + "\n" + ] + } + ], + "source": [ + "rebuilt_definition = Team.describe()\n", + "print(rebuilt_definition)" + ] + }, + { + "cell_type": "markdown", + "id": "be1070d5-765b-4bc2-92de-8a6ffd885984", + "metadata": {}, + "source": [ + "## Cleanup" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "cb959927", + "metadata": {}, + "source": [ + "Finally, let's clean up what we created in this tutorial." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "d9cc28a3-3ffd-4126-b7e9-bc6365040b93", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:26.670916Z", + "iopub.status.busy": "2026-01-14T07:34:26.670816Z", + "iopub.status.idle": "2026-01-14T07:34:26.680116Z", + "shell.execute_reply": "2026-01-14T07:34:26.679843Z" + } + }, + "outputs": [], + "source": [ + "schema.drop(prompt=False)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/src/tutorials/advanced/sql-comparison.ipynb b/src/tutorials/advanced/sql-comparison.ipynb new file mode 100644 index 00000000..659cbca8 --- /dev/null +++ b/src/tutorials/advanced/sql-comparison.ipynb @@ -0,0 +1,3104 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# DataJoint for SQL Users\n", + "\n", + "This tutorial maps SQL concepts to DataJoint for users with relational database experience. You'll see:\n", + "\n", + "- How DataJoint syntax corresponds to SQL\n", + "- What DataJoint adds beyond standard SQL\n", + "- When to use each approach\n", + "\n", + "**Prerequisites:** Familiarity with SQL (SELECT, JOIN, WHERE, GROUP BY)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setup" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:28.909045Z", + "iopub.status.busy": "2026-01-14T07:34:28.908940Z", + "iopub.status.idle": "2026-01-14T07:34:29.646875Z", + "shell.execute_reply": "2026-01-14T07:34:29.646577Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2026-01-14 01:34:29,639][INFO]: DataJoint 2.0.0a22 connected to root@127.0.0.1:3306\n" + ] + } + ], + "source": [ + "import datajoint as dj\n", + "\n", + "schema = dj.Schema('tutorial_sql_comparison')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Schema Definition\n", + "\n", + "### SQL\n", + "```sql\n", + "CREATE TABLE Researcher (\n", + " researcher_id INT NOT NULL,\n", + " name VARCHAR(100) NOT NULL,\n", + " email VARCHAR(100),\n", + " PRIMARY KEY (researcher_id)\n", + ");\n", + "\n", + "CREATE TABLE Subject (\n", + " subject_id INT NOT NULL,\n", + " species VARCHAR(32) NOT NULL,\n", + " sex ENUM('M', 'F', 'unknown'),\n", + " PRIMARY KEY (subject_id)\n", + ");\n", + "\n", + "CREATE TABLE Session (\n", + " subject_id INT NOT NULL,\n", + " session_date DATE NOT NULL,\n", + " researcher_id INT NOT NULL,\n", + " notes VARCHAR(255),\n", + " PRIMARY KEY (subject_id, session_date),\n", + " FOREIGN KEY (subject_id) REFERENCES Subject(subject_id),\n", + " FOREIGN KEY (researcher_id) REFERENCES Researcher(researcher_id)\n", + ");\n", + "```\n", + "\n", + "### DataJoint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:29.663781Z", + "iopub.status.busy": "2026-01-14T07:34:29.663424Z", + "iopub.status.idle": "2026-01-14T07:34:29.734266Z", + "shell.execute_reply": "2026-01-14T07:34:29.733911Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class Researcher(dj.Manual):\n", + " definition = \"\"\"\n", + " researcher_id : int32\n", + " ---\n", + " name : varchar(100)\n", + " email : varchar(100)\n", + " \"\"\"\n", + "\n", + "@schema\n", + "class Subject(dj.Manual):\n", + " definition = \"\"\"\n", + " subject_id : int32\n", + " ---\n", + " species : varchar(32)\n", + " sex : enum('M', 'F', 'unknown')\n", + " \"\"\"\n", + "\n", + "@schema\n", + "class Session(dj.Manual):\n", + " definition = \"\"\"\n", + " -> Subject\n", + " session_date : date\n", + " ---\n", + " -> Researcher\n", + " notes : varchar(255)\n", + " \"\"\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Key Differences\n", + "\n", + "| Aspect | SQL | DataJoint |\n", + "|--------|-----|----------|\n", + "| Primary key | `PRIMARY KEY (...)` | Above `---` line |\n", + "| Foreign key | `FOREIGN KEY ... REFERENCES` | `-> TableName` |\n", + "| Types | `INT`, `VARCHAR(n)` | `int32`, `varchar(n)` |\n", + "| Table metadata | None | Table tier (`Manual`, `Computed`, etc.) |" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Insert Sample Data" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:29.736145Z", + "iopub.status.busy": "2026-01-14T07:34:29.736013Z", + "iopub.status.idle": "2026-01-14T07:34:29.750092Z", + "shell.execute_reply": "2026-01-14T07:34:29.749732Z" + } + }, + "outputs": [], + "source": [ + "Researcher.insert([\n", + " {'researcher_id': 1, 'name': 'Alice Chen', 'email': 'alice@lab.org'},\n", + " {'researcher_id': 2, 'name': 'Bob Smith', 'email': 'bob@lab.org'},\n", + "])\n", + "\n", + "Subject.insert([\n", + " {'subject_id': 1, 'species': 'mouse', 'sex': 'M'},\n", + " {'subject_id': 2, 'species': 'mouse', 'sex': 'F'},\n", + " {'subject_id': 3, 'species': 'rat', 'sex': 'M'},\n", + "])\n", + "\n", + "Session.insert([\n", + " {'subject_id': 1, 'session_date': '2024-06-01',\n", + " 'researcher_id': 1, 'notes': 'First session'},\n", + " {'subject_id': 1, 'session_date': '2024-06-15',\n", + " 'researcher_id': 1, 'notes': 'Follow-up'},\n", + " {'subject_id': 2, 'session_date': '2024-06-10',\n", + " 'researcher_id': 2, 'notes': 'Initial'},\n", + " {'subject_id': 3, 'session_date': '2024-06-20',\n", + " 'researcher_id': 2, 'notes': 'Rat study'},\n", + "])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Query Comparison\n", + "\n", + "### SELECT * FROM table" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:29.751755Z", + "iopub.status.busy": "2026-01-14T07:34:29.751641Z", + "iopub.status.idle": "2026-01-14T07:34:29.757325Z", + "shell.execute_reply": "2026-01-14T07:34:29.757065Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

species

\n", + " \n", + "
\n", + "

sex

\n", + " \n", + "
1mouseM
2mouseF
3ratM
\n", + " \n", + "

Total: 3

\n", + " " + ], + "text/plain": [ + "*subject_id species sex \n", + "+------------+ +---------+ +-----+\n", + "1 mouse M \n", + "2 mouse F \n", + "3 rat M \n", + " (Total: 3)" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# SQL: SELECT * FROM Subject\n", + "Subject()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### WHERE β€” Restriction (`&`)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:29.758693Z", + "iopub.status.busy": "2026-01-14T07:34:29.758586Z", + "iopub.status.idle": "2026-01-14T07:34:29.762813Z", + "shell.execute_reply": "2026-01-14T07:34:29.762591Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

species

\n", + " \n", + "
\n", + "

sex

\n", + " \n", + "
1mouseM
3ratM
\n", + " \n", + "

Total: 2

\n", + " " + ], + "text/plain": [ + "*subject_id species sex \n", + "+------------+ +---------+ +-----+\n", + "1 mouse M \n", + "3 rat M \n", + " (Total: 2)" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# SQL: SELECT * FROM Subject WHERE sex = 'M'\n", + "Subject & {'sex': 'M'}" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:29.764027Z", + "iopub.status.busy": "2026-01-14T07:34:29.763923Z", + "iopub.status.idle": "2026-01-14T07:34:29.768221Z", + "shell.execute_reply": "2026-01-14T07:34:29.767991Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

species

\n", + " \n", + "
\n", + "

sex

\n", + " \n", + "
2mouseF
\n", + " \n", + "

Total: 1

\n", + " " + ], + "text/plain": [ + "*subject_id species sex \n", + "+------------+ +---------+ +-----+\n", + "2 mouse F \n", + " (Total: 1)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# SQL: SELECT * FROM Subject WHERE species = 'mouse' AND sex = 'F'\n", + "Subject & {'species': 'mouse', 'sex': 'F'}" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:29.769520Z", + "iopub.status.busy": "2026-01-14T07:34:29.769434Z", + "iopub.status.idle": "2026-01-14T07:34:29.774580Z", + "shell.execute_reply": "2026-01-14T07:34:29.774130Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

session_date

\n", + " \n", + "
\n", + "

researcher_id

\n", + " \n", + "
\n", + "

notes

\n", + " \n", + "
12024-06-151Follow-up
32024-06-202Rat study
\n", + " \n", + "

Total: 2

\n", + " " + ], + "text/plain": [ + "*subject_id *session_date researcher_id notes \n", + "+------------+ +------------+ +------------+ +-----------+\n", + "1 2024-06-15 1 Follow-up \n", + "3 2024-06-20 2 Rat study \n", + " (Total: 2)" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# SQL: SELECT * FROM Session WHERE session_date > '2024-06-10'\n", + "Session & 'session_date > \"2024-06-10\"'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Restriction by Query (Subqueries)\n", + "\n", + "In SQL, you often use subqueries to filter based on another table:\n", + "\n", + "```sql\n", + "-- Sessions with mice only\n", + "SELECT * FROM Session \n", + "WHERE subject_id IN (SELECT subject_id FROM Subject WHERE species = 'mouse')\n", + "```\n", + "\n", + "In DataJoint, you simply restrict by another query β€” no special subquery syntax needed:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:29.776458Z", + "iopub.status.busy": "2026-01-14T07:34:29.776269Z", + "iopub.status.idle": "2026-01-14T07:34:29.781765Z", + "shell.execute_reply": "2026-01-14T07:34:29.781478Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

session_date

\n", + " \n", + "
\n", + "

researcher_id

\n", + " \n", + "
\n", + "

notes

\n", + " \n", + "
12024-06-011First session
12024-06-151Follow-up
22024-06-102Initial
\n", + " \n", + "

Total: 3

\n", + " " + ], + "text/plain": [ + "*subject_id *session_date researcher_id notes \n", + "+------------+ +------------+ +------------+ +------------+\n", + "1 2024-06-01 1 First session \n", + "1 2024-06-15 1 Follow-up \n", + "2 2024-06-10 2 Initial \n", + " (Total: 3)" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# SQL: SELECT * FROM Session \n", + "# WHERE subject_id IN (SELECT subject_id FROM Subject WHERE species = 'mouse')\n", + "\n", + "# DataJoint: restrict Session by a query on Subject\n", + "mice = Subject & {'species': 'mouse'}\n", + "Session & mice" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:29.783082Z", + "iopub.status.busy": "2026-01-14T07:34:29.782993Z", + "iopub.status.idle": "2026-01-14T07:34:29.788052Z", + "shell.execute_reply": "2026-01-14T07:34:29.787766Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

species

\n", + " \n", + "
\n", + "

sex

\n", + " \n", + "
1mouseM
\n", + " \n", + "

Total: 1

\n", + " " + ], + "text/plain": [ + "*subject_id species sex \n", + "+------------+ +---------+ +-----+\n", + "1 mouse M \n", + " (Total: 1)" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Restrict by Alice's sessions (finds subjects she worked with)\n", + "alice_sessions = Session & (Researcher & {'name': 'Alice Chen'})\n", + "Subject & alice_sessions" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Semantic Matching\n", + "\n", + "A fundamental difference between SQL and DataJoint is **semantic matching** β€” the principle that attributes acquire meaning through foreign key relationships, and all binary operators use this meaning to determine how tables combine.\n", + "\n", + "### The Problem with SQL\n", + "\n", + "SQL requires you to explicitly specify how tables connect:\n", + "\n", + "```sql\n", + "SELECT * FROM Session \n", + "JOIN Subject ON Session.subject_id = Subject.subject_id;\n", + "```\n", + "\n", + "This is verbose and error-prone. Nothing prevents you from joining on unrelated columns that happen to share a name, or accidentally creating a Cartesian product when tables have no common columns.\n", + "\n", + "Experienced SQL programmers learn to always join through foreign key relationships. DataJoint makes this the **default and enforced behavior**.\n", + "\n", + "### How Semantic Matching Works\n", + "\n", + "In DataJoint, when you declare a foreign key with `-> Subject`, the `subject_id` attribute in your table inherits its **meaning** from the `Subject` table. This meaning propagates through the foreign key graph.\n", + "\n", + "**Semantic matching** means: all binary operators (`*`, `&`, `-`, `+`, `.aggr()`) match attributes based on shared meaning β€” those connected through foreign keys. If two tables have no semantically matching attributes, the operation raises an error rather than silently producing incorrect results." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:29.789485Z", + "iopub.status.busy": "2026-01-14T07:34:29.789367Z", + "iopub.status.idle": "2026-01-14T07:34:29.794154Z", + "shell.execute_reply": "2026-01-14T07:34:29.793898Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

session_date

\n", + " \n", + "
\n", + "

researcher_id

\n", + " \n", + "
\n", + "

notes

\n", + " \n", + "
\n", + " \n", + "

Total: 0

\n", + " " + ], + "text/plain": [ + "*subject_id *session_date researcher_id notes \n", + "+------------+ +------------+ +------------+ +-------+\n", + "\n", + " (Total: 0)" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# All these operations use semantic matching on subject_id:\n", + "\n", + "# Join: combines Session and Subject on subject_id\n", + "Session * Subject\n", + "\n", + "# Restriction: filters Session to rows matching the Subject query \n", + "Session & (Subject & {'species': 'mouse'})\n", + "\n", + "# Antijoin: Session rows NOT matching any Subject (none here, all subjects exist)\n", + "Session - Subject" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### One Join Operator Instead of Many\n", + "\n", + "SQL has multiple join types (`INNER`, `LEFT`, `RIGHT`, `FULL OUTER`, `CROSS`) because it must handle arbitrary column matching. DataJoint's single join operator (`*`) is sufficient because semantic matching is **more restrictive** than SQL's natural joins:\n", + "\n", + "- SQL natural joins match on **all columns with the same name** β€” which can accidentally match unrelated columns\n", + "- DataJoint semantic joins match only on **attributes connected through foreign keys** β€” and raise an error if you attempt to join on attributes that shouldn't be joined\n", + "\n", + "This catches errors at query time rather than producing silently incorrect results." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Algebraic Closure\n", + "\n", + "In standard SQL, query results are just \"bags of rows\" β€” they don't have a defined entity type. You cannot know what kind of thing each row represents without external context.\n", + "\n", + "DataJoint achieves **algebraic closure**: every query result is a valid entity set with a well-defined **entity type**. You always know what kind of entity the result represents, identified by a specific primary key. This means:\n", + "\n", + "1. **Every operator returns a valid relation** β€” not just rows, but a set of entities of a known type\n", + "2. **Operators compose indefinitely** β€” you can chain any sequence of operations\n", + "3. **Results remain queryable** β€” a query result can be used as an operand in further operations\n", + "\n", + "The entity type (and its primary key) is determined by precise rules based on the operator and the functional dependencies between operands. See the [Primary Keys specification](../../reference/specs/primary-keys.md) for details." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### SELECT columns β€” Projection (`.proj()`)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:29.795581Z", + "iopub.status.busy": "2026-01-14T07:34:29.795492Z", + "iopub.status.idle": "2026-01-14T07:34:29.799680Z", + "shell.execute_reply": "2026-01-14T07:34:29.799467Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

researcher_id

\n", + " \n", + "
\n", + "

name

\n", + " \n", + "
\n", + "

email

\n", + " \n", + "
1Alice Chenalice@lab.org
2Bob Smithbob@lab.org
\n", + " \n", + "

Total: 2

\n", + " " + ], + "text/plain": [ + "*researcher_id name email \n", + "+------------+ +------------+ +------------+\n", + "1 Alice Chen alice@lab.org \n", + "2 Bob Smith bob@lab.org \n", + " (Total: 2)" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# SQL: SELECT name, email FROM Researcher\n", + "Researcher.proj('name', 'email')" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:29.800903Z", + "iopub.status.busy": "2026-01-14T07:34:29.800786Z", + "iopub.status.idle": "2026-01-14T07:34:29.804524Z", + "shell.execute_reply": "2026-01-14T07:34:29.804305Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

animal_type

\n", + " \n", + "
1mouse
2mouse
3rat
\n", + " \n", + "

Total: 3

\n", + " " + ], + "text/plain": [ + "*subject_id animal_type \n", + "+------------+ +------------+\n", + "1 mouse \n", + "2 mouse \n", + "3 rat \n", + " (Total: 3)" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# SQL: SELECT subject_id, species AS animal_type FROM Subject\n", + "Subject.proj(animal_type='species')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### JOIN" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:29.805785Z", + "iopub.status.busy": "2026-01-14T07:34:29.805689Z", + "iopub.status.idle": "2026-01-14T07:34:29.809945Z", + "shell.execute_reply": "2026-01-14T07:34:29.809682Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

session_date

\n", + " \n", + "
\n", + "

researcher_id

\n", + " \n", + "
\n", + "

notes

\n", + " \n", + "
\n", + "

species

\n", + " \n", + "
\n", + "

sex

\n", + " \n", + "
12024-06-011First sessionmouseM
12024-06-151Follow-upmouseM
22024-06-102InitialmouseF
32024-06-202Rat studyratM
\n", + " \n", + "

Total: 4

\n", + " " + ], + "text/plain": [ + "*subject_id *session_date researcher_id notes species sex \n", + "+------------+ +------------+ +------------+ +------------+ +---------+ +-----+\n", + "1 2024-06-01 1 First session mouse M \n", + "1 2024-06-15 1 Follow-up mouse M \n", + "2 2024-06-10 2 Initial mouse F \n", + "3 2024-06-20 2 Rat study rat M \n", + " (Total: 4)" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# SQL: SELECT * FROM Session JOIN Subject USING (subject_id)\n", + "Session * Subject" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:29.811132Z", + "iopub.status.busy": "2026-01-14T07:34:29.811045Z", + "iopub.status.idle": "2026-01-14T07:34:29.815945Z", + "shell.execute_reply": "2026-01-14T07:34:29.815711Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

session_date

\n", + " \n", + "
\n", + "

species

\n", + " \n", + "
\n", + "

name

\n", + " \n", + "
12024-06-01mouseAlice Chen
12024-06-15mouseAlice Chen
22024-06-10mouseBob Smith
32024-06-20ratBob Smith
\n", + " \n", + "

Total: 4

\n", + " " + ], + "text/plain": [ + "*subject_id *session_date species name \n", + "+------------+ +------------+ +---------+ +------------+\n", + "1 2024-06-01 mouse Alice Chen \n", + "1 2024-06-15 mouse Alice Chen \n", + "2 2024-06-10 mouse Bob Smith \n", + "3 2024-06-20 rat Bob Smith \n", + " (Total: 4)" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# SQL: SELECT session_date, name, species \n", + "# FROM Session \n", + "# JOIN Subject USING (subject_id) \n", + "# JOIN Researcher USING (researcher_id)\n", + "(Session * Subject * Researcher).proj('session_date', 'name', 'species')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### GROUP BY β€” Aggregation (`.aggr()`)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:29.817193Z", + "iopub.status.busy": "2026-01-14T07:34:29.817117Z", + "iopub.status.idle": "2026-01-14T07:34:29.821251Z", + "shell.execute_reply": "2026-01-14T07:34:29.821016Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

num_sessions

\n", + " calculated attribute\n", + "
12
21
31
\n", + " \n", + "

Total: 3

\n", + " " + ], + "text/plain": [ + "*subject_id num_sessions \n", + "+------------+ +------------+\n", + "1 2 \n", + "2 1 \n", + "3 1 \n", + " (Total: 3)" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# SQL: SELECT subject_id, COUNT(*) as num_sessions \n", + "# FROM Session GROUP BY subject_id\n", + "Subject.aggr(Session, num_sessions='count(*)')" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:29.822547Z", + "iopub.status.busy": "2026-01-14T07:34:29.822459Z", + "iopub.status.idle": "2026-01-14T07:34:29.826544Z", + "shell.execute_reply": "2026-01-14T07:34:29.826331Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "
\n", + "

researcher_id

\n", + " \n", + "
\n", + "

num_sessions

\n", + " calculated attribute\n", + "
12
22
\n", + " \n", + "

Total: 2

\n", + " " + ], + "text/plain": [ + "*researcher_id num_sessions \n", + "+------------+ +------------+\n", + "1 2 \n", + "2 2 \n", + " (Total: 2)" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# SQL: SELECT researcher_id, name, COUNT(*) as num_sessions\n", + "# FROM Researcher JOIN Session USING (researcher_id)\n", + "# GROUP BY researcher_id\n", + "Researcher.aggr(Session, num_sessions='count(*)')" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:29.827847Z", + "iopub.status.busy": "2026-01-14T07:34:29.827755Z", + "iopub.status.idle": "2026-01-14T07:34:29.834095Z", + "shell.execute_reply": "2026-01-14T07:34:29.833844Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "
\n", + "

total_sessions

\n", + " calculated attribute\n", + "
4
\n", + " \n", + "

Total: 1

\n", + " " + ], + "text/plain": [ + "total_sessions\n", + "+------------+\n", + "4 \n", + " (Total: 1)" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# SQL: SELECT AVG(...), COUNT(*) FROM Session (no grouping)\n", + "dj.U().aggr(Session, total_sessions='count(*)')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### NOT IN β€” Negative Restriction (`-`)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:29.835503Z", + "iopub.status.busy": "2026-01-14T07:34:29.835409Z", + "iopub.status.idle": "2026-01-14T07:34:29.839647Z", + "shell.execute_reply": "2026-01-14T07:34:29.839392Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

species

\n", + " \n", + "
\n", + "

sex

\n", + " \n", + "
\n", + " \n", + "

Total: 0

\n", + " " + ], + "text/plain": [ + "*subject_id species sex \n", + "+------------+ +---------+ +-----+\n", + "\n", + " (Total: 0)" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# SQL: SELECT * FROM Subject \n", + "# WHERE subject_id NOT IN (SELECT subject_id FROM Session)\n", + "# (Subjects with no sessions)\n", + "Subject - Session" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Combined Example" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:29.841169Z", + "iopub.status.busy": "2026-01-14T07:34:29.841082Z", + "iopub.status.idle": "2026-01-14T07:34:29.845892Z", + "shell.execute_reply": "2026-01-14T07:34:29.845655Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "
\n", + "

researcher_id

\n", + " \n", + "
\n", + "

mouse_sessions

\n", + " calculated attribute\n", + "
12
21
\n", + " \n", + "

Total: 2

\n", + " " + ], + "text/plain": [ + "*researcher_id mouse_sessions\n", + "+------------+ +------------+\n", + "1 2 \n", + "2 1 \n", + " (Total: 2)" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# SQL: SELECT r.name, COUNT(*) as mouse_sessions\n", + "# FROM Researcher r\n", + "# JOIN Session s USING (researcher_id)\n", + "# JOIN Subject sub USING (subject_id)\n", + "# WHERE sub.species = 'mouse'\n", + "# GROUP BY r.researcher_id\n", + "\n", + "Researcher.aggr(\n", + " Session * (Subject & {'species': 'mouse'}),\n", + " mouse_sessions='count(*)'\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Operator Reference\n", + "\n", + "| SQL | DataJoint | Notes |\n", + "|-----|-----------|-------|\n", + "| `SELECT *` | `Table()` | Display table |\n", + "| `SELECT cols` | `.proj('col1', 'col2')` | Projection |\n", + "| `SELECT col AS alias` | `.proj(alias='col')` | Rename |\n", + "| `WHERE condition` | `& {'col': value}` or `& 'expr'` | Restriction |\n", + "| `JOIN ... USING` | `Table1 * Table2` | Natural join |\n", + "| `GROUP BY ... AGG()` | `.aggr(Table, alias='agg()')` | Aggregation |\n", + "| `NOT IN (subquery)` | `Table1 - Table2` | Antijoin |\n", + "| `UNION` | `Table1 + Table2` | Union |" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## What DataJoint Adds\n", + "\n", + "DataJoint is not just \"Python syntax for SQL.\" It adds:\n", + "\n", + "### 1. Table Tiers\n", + "\n", + "Tables are classified by their role in the workflow:\n", + "\n", + "| Tier | Purpose | SQL Equivalent |\n", + "|------|---------|----------------|\n", + "| `Lookup` | Reference data, parameters | Regular table |\n", + "| `Manual` | User-entered data | Regular table |\n", + "| `Imported` | Data from external files | Regular table + trigger |\n", + "| `Computed` | Derived results | Materialized view + trigger |\n", + "\n", + "### 2. Automatic Computation\n", + "\n", + "Computed tables have a `make()` method that runs automatically. An important principle: **`make()` should only fetch data from upstream tables** β€” those declared as dependencies in the table definition." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:29.847260Z", + "iopub.status.busy": "2026-01-14T07:34:29.847172Z", + "iopub.status.idle": "2026-01-14T07:34:29.867499Z", + "shell.execute_reply": "2026-01-14T07:34:29.867163Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class SessionAnalysis(dj.Computed):\n", + " definition = \"\"\"\n", + " -> Session # depends on Session\n", + " ---\n", + " day_of_week : varchar(10)\n", + " \"\"\"\n", + " \n", + " def make(self, key):\n", + " # Fetch only from upstream tables (Session and its dependencies)\n", + " date = (Session & key).fetch1('session_date')\n", + " self.insert1({**key, 'day_of_week': date.strftime('%A')})" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:29.868961Z", + "iopub.status.busy": "2026-01-14T07:34:29.868852Z", + "iopub.status.idle": "2026-01-14T07:34:29.923332Z", + "shell.execute_reply": "2026-01-14T07:34:29.922917Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + "SessionAnalysis: 0%| | 0/4 [00:00\n", + " .Table{\n", + " border-collapse:collapse;\n", + " }\n", + " .Table th{\n", + " background: #A0A0A0; color: #ffffff; padding:2px 4px; border:#f0e0e0 1px solid;\n", + " font-weight: normal; font-family: monospace; font-size: 75%; text-align: center;\n", + " }\n", + " .Table th p{\n", + " margin: 0;\n", + " }\n", + " .Table td{\n", + " padding:2px 4px; border:#f0e0e0 1px solid; font-size: 75%;\n", + " }\n", + " .Table tr:nth-child(odd){\n", + " background: #ffffff;\n", + " color: #000000;\n", + " }\n", + " .Table tr:nth-child(even){\n", + " background: #f3f1ff;\n", + " color: #000000;\n", + " }\n", + " /* Tooltip container */\n", + " .djtooltip {\n", + " }\n", + " /* Tooltip text */\n", + " .djtooltip .djtooltiptext {\n", + " visibility: hidden;\n", + " width: 120px;\n", + " background-color: black;\n", + " color: #fff;\n", + " text-align: center;\n", + " padding: 5px 0;\n", + " border-radius: 6px;\n", + " /* Position the tooltip text - see examples below! */\n", + " position: absolute;\n", + " z-index: 1;\n", + " }\n", + " #primary {\n", + " font-weight: bold;\n", + " color: black;\n", + " }\n", + " #nonprimary {\n", + " font-weight: normal;\n", + " color: white;\n", + " }\n", + "\n", + " /* Show the tooltip text when you mouse over the tooltip container */\n", + " .djtooltip:hover .djtooltiptext {\n", + " visibility: visible;\n", + " }\n", + "\n", + " /* Dark mode support */\n", + " @media (prefers-color-scheme: dark) {\n", + " .Table th{\n", + " background: #4a4a4a; color: #ffffff; border:#555555 1px solid; text-align: center;\n", + " }\n", + " .Table td{\n", + " border:#555555 1px solid;\n", + " }\n", + " .Table tr:nth-child(odd){\n", + " background: #2d2d2d;\n", + " color: #e0e0e0;\n", + " }\n", + " .Table tr:nth-child(even){\n", + " background: #3d3d3d;\n", + " color: #e0e0e0;\n", + " }\n", + " .djtooltip .djtooltiptext {\n", + " background-color: #555555;\n", + " color: #ffffff;\n", + " }\n", + " #primary {\n", + " color: #bd93f9;\n", + " }\n", + " #nonprimary {\n", + " color: #e0e0e0;\n", + " }\n", + " }\n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

session_date

\n", + " \n", + "
\n", + "

day_of_week

\n", + " \n", + "
12024-06-01Saturday
12024-06-15Saturday
22024-06-10Monday
32024-06-20Thursday
\n", + " \n", + "

Total: 4

\n", + " " + ], + "text/plain": [ + "*subject_id *session_date day_of_week \n", + "+------------+ +------------+ +------------+\n", + "1 2024-06-01 Saturday \n", + "1 2024-06-15 Saturday \n", + "2 2024-06-10 Monday \n", + "3 2024-06-20 Thursday \n", + " (Total: 4)" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Automatically compute for all sessions\n", + "SessionAnalysis.populate(display_progress=True)\n", + "SessionAnalysis()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In SQL, you'd need triggers, stored procedures, or external scheduling to achieve this.\n", + "\n", + "### 3. Cascading Deletes\n", + "\n", + "DataJoint enforces referential integrity with automatic cascading:" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:29.925007Z", + "iopub.status.busy": "2026-01-14T07:34:29.924877Z", + "iopub.status.idle": "2026-01-14T07:34:29.926777Z", + "shell.execute_reply": "2026-01-14T07:34:29.926528Z" + } + }, + "outputs": [], + "source": [ + "# Deleting a session would delete its computed analysis\n", + "# (Session & {'subject_id': 1, 'session_date': '2024-06-01'}).delete() # Uncomment to try" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4. Schema as Workflow\n", + "\n", + "The diagram shows the computational workflow, not just relationships:" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:29.928076Z", + "iopub.status.busy": "2026-01-14T07:34:29.927953Z", + "iopub.status.idle": "2026-01-14T07:34:30.330307Z", + "shell.execute_reply": "2026-01-14T07:34:30.329895Z" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "SessionAnalysis\n", + "\n", + "\n", + "SessionAnalysis\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Researcher\n", + "\n", + "\n", + "Researcher\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Session\n", + "\n", + "\n", + "Session\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Researcher->Session\n", + "\n", + "\n", + "\n", + "\n", + "Session->SessionAnalysis\n", + "\n", + "\n", + "\n", + "\n", + "Subject\n", + "\n", + "\n", + "Subject\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Subject->Session\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dj.Diagram(schema)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- **Green** = Manual (input)\n", + "- **Red** = Computed (derived)\n", + "- Arrows show dependency/execution order" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 5. Object Storage Integration\n", + "\n", + "Store large objects (arrays, files) with relational semantics:\n", + "\n", + "```python\n", + "class Recording(dj.Imported):\n", + " definition = \"\"\"\n", + " -> Session\n", + " ---\n", + " raw_data : # NumPy array stored in database\n", + " video : # Large file stored externally\n", + " \"\"\"\n", + "```\n", + "\n", + "SQL has no standard way to handle this." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## When to Use Raw SQL\n", + "\n", + "DataJoint generates SQL under the hood. Sometimes raw SQL is useful:" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:30.332138Z", + "iopub.status.busy": "2026-01-14T07:34:30.331997Z", + "iopub.status.idle": "2026-01-14T07:34:30.334719Z", + "shell.execute_reply": "2026-01-14T07:34:30.334484Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "SELECT `subject_id`,`session_date`,`researcher_id`,`notes`,`species`,`sex` FROM `tutorial_sql_comparison`.`session` JOIN `tutorial_sql_comparison`.`subject` USING (`subject_id`) WHERE ( (`species`=\"mouse\"))\n" + ] + } + ], + "source": [ + "# See the generated SQL for any query\n", + "query = Session * Subject & {'species': 'mouse'}\n", + "print(query.make_sql())" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:30.335845Z", + "iopub.status.busy": "2026-01-14T07:34:30.335755Z", + "iopub.status.idle": "2026-01-14T07:34:30.337331Z", + "shell.execute_reply": "2026-01-14T07:34:30.337054Z" + } + }, + "outputs": [], + "source": [ + "# Execute raw SQL when needed\n", + "# result = dj.conn().query('SELECT * FROM ...')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "| Feature | SQL | DataJoint |\n", + "|---------|-----|----------|\n", + "| Query language | SQL strings | Python operators |\n", + "| Schema definition | DDL | Python classes |\n", + "| Foreign keys | Manual declaration | `->` syntax |\n", + "| Table purpose | Implicit | Explicit tiers |\n", + "| Automatic computation | Triggers/procedures | `populate()` |\n", + "| Large objects | BLOBs (limited) | Codec system |\n", + "| Workflow visualization | None | `dj.Diagram()` |\n", + "\n", + "DataJoint uses SQL databases (MySQL/PostgreSQL) underneath but provides:\n", + "- **Pythonic syntax** for queries\n", + "- **Workflow semantics** for scientific pipelines\n", + "- **Automatic computation** via `populate()`\n", + "- **Object storage** for large scientific data" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:30.338571Z", + "iopub.status.busy": "2026-01-14T07:34:30.338484Z", + "iopub.status.idle": "2026-01-14T07:34:30.360472Z", + "shell.execute_reply": "2026-01-14T07:34:30.360193Z" + } + }, + "outputs": [], + "source": [ + "# Cleanup\n", + "schema.drop(prompt=False)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/src/tutorials/basics/01-first-pipeline.ipynb b/src/tutorials/basics/01-first-pipeline.ipynb new file mode 100644 index 00000000..22b6e5d5 --- /dev/null +++ b/src/tutorials/basics/01-first-pipeline.ipynb @@ -0,0 +1,2767 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# A Simple Pipeline\n", + "\n", + "This tutorial introduces DataJoint by building a simple research lab database. You'll learn to:\n", + "\n", + "- Define tables with primary keys and dependencies\n", + "- Insert and query data\n", + "- Use the four core operations: restriction, projection, join, aggregation\n", + "- Understand the schema diagram\n", + "\n", + "We'll work with **Manual tables** onlyβ€”tables where you enter data directly. Later tutorials introduce automated computation.\n", + "\n", + "For complete working examples, see:\n", + "- [University Database](../examples/university.ipynb) β€” Academic records with complex queries\n", + "- [Blob Detection](../examples/blob-detection.ipynb) β€” Image processing with computation" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setup" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:36.191506Z", + "iopub.status.busy": "2026-01-14T07:33:36.191302Z", + "iopub.status.idle": "2026-01-14T07:33:37.325713Z", + "shell.execute_reply": "2026-01-14T07:33:37.325310Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2026-01-14 01:33:37,316][INFO]: DataJoint 2.0.0a22 connected to root@127.0.0.1:3306\n" + ] + } + ], + "source": [ + "import datajoint as dj\n", + "\n", + "schema = dj.Schema('tutorial_first_pipeline')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The Domain: A Research Lab\n", + "\n", + "We'll model a research lab that:\n", + "- Has **researchers** who conduct experiments\n", + "- Works with **subjects** (e.g., mice)\n", + "- Runs **sessions** where data is collected\n", + "- Collects **recordings** during each session\n", + "\n", + "```mermaid\n", + "flowchart TD\n", + " Researcher --> Session\n", + " Subject --> Session\n", + " Session --> Recording\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Defining Tables\n", + "\n", + "Each table is a Python class. The `definition` string specifies:\n", + "- **Primary key** (above `---`) β€” uniquely identifies each row\n", + "- **Attributes** (below `---`) β€” additional data for each row\n", + "- **Dependencies** (`->`) β€” references to other tables" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:37.341491Z", + "iopub.status.busy": "2026-01-14T07:33:37.341230Z", + "iopub.status.idle": "2026-01-14T07:33:37.376354Z", + "shell.execute_reply": "2026-01-14T07:33:37.376024Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class Researcher(dj.Manual):\n", + " definition = \"\"\"\n", + " researcher_id : int32\n", + " ---\n", + " researcher_name : varchar(100)\n", + " email : varchar(100)\n", + " \"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:37.378092Z", + "iopub.status.busy": "2026-01-14T07:33:37.377902Z", + "iopub.status.idle": "2026-01-14T07:33:37.395813Z", + "shell.execute_reply": "2026-01-14T07:33:37.395474Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class Subject(dj.Manual):\n", + " definition = \"\"\"\n", + " subject_id : int32\n", + " ---\n", + " species : varchar(32)\n", + " date_of_birth : date\n", + " sex : enum('M', 'F', 'unknown')\n", + " \"\"\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Dependencies\n", + "\n", + "A `Session` involves one researcher and one subject. The `->` syntax creates a **dependency** (foreign key):" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:37.397483Z", + "iopub.status.busy": "2026-01-14T07:33:37.397394Z", + "iopub.status.idle": "2026-01-14T07:33:37.429726Z", + "shell.execute_reply": "2026-01-14T07:33:37.429287Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class Session(dj.Manual):\n", + " definition = \"\"\"\n", + " -> Subject\n", + " session_date : date\n", + " ---\n", + " -> Researcher\n", + " session_notes : varchar(255)\n", + " \"\"\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `-> Subject` in the primary key means:\n", + "- `subject_id` is automatically included in Session's primary key\n", + "- Combined with `session_date`, each session is uniquely identified\n", + "- You cannot create a session for a non-existent subject\n", + "\n", + "The `-> Researcher` below the line is a non-primary dependencyβ€”it records who ran the session but isn't part of the unique identifier." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:37.431665Z", + "iopub.status.busy": "2026-01-14T07:33:37.431524Z", + "iopub.status.idle": "2026-01-14T07:33:37.459190Z", + "shell.execute_reply": "2026-01-14T07:33:37.458884Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class Recording(dj.Manual):\n", + " definition = \"\"\"\n", + " -> Session\n", + " recording_id : int16\n", + " ---\n", + " duration : float32 # recording duration (seconds)\n", + " quality : enum('good', 'fair', 'poor')\n", + " \"\"\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Schema Diagram\n", + "\n", + "The diagram shows tables and their dependencies:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:37.460881Z", + "iopub.status.busy": "2026-01-14T07:33:37.460778Z", + "iopub.status.idle": "2026-01-14T07:33:37.882174Z", + "shell.execute_reply": "2026-01-14T07:33:37.881820Z" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "Recording\n", + "\n", + "\n", + "Recording\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Researcher\n", + "\n", + "\n", + "Researcher\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Session\n", + "\n", + "\n", + "Session\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Researcher->Session\n", + "\n", + "\n", + "\n", + "\n", + "Session->Recording\n", + "\n", + "\n", + "\n", + "\n", + "Subject\n", + "\n", + "\n", + "Subject\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Subject->Session\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dj.Diagram(schema)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Reading the diagram:**\n", + "- **Green boxes** = Manual tables (you enter data)\n", + "- **Solid lines** = Primary key dependencies (part of identity)\n", + "- **Dashed lines** = Non-primary dependencies (references)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Inserting Data\n", + "\n", + "Data must be inserted in dependency orderβ€”you can't reference something that doesn't exist." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:37.883908Z", + "iopub.status.busy": "2026-01-14T07:33:37.883766Z", + "iopub.status.idle": "2026-01-14T07:33:37.897150Z", + "shell.execute_reply": "2026-01-14T07:33:37.896690Z" + } + }, + "outputs": [], + "source": [ + "# First: tables with no dependencies\n", + "Researcher.insert([\n", + " {'researcher_id': 1, 'researcher_name': 'Alice Chen',\n", + " 'email': 'alice@lab.org'},\n", + " {'researcher_id': 2, 'researcher_name': 'Bob Smith',\n", + " 'email': 'bob@lab.org'},\n", + "])\n", + "\n", + "Subject.insert([\n", + " {'subject_id': 1, 'species': 'mouse',\n", + " 'date_of_birth': '2024-01-15', 'sex': 'M'},\n", + " {'subject_id': 2, 'species': 'mouse',\n", + " 'date_of_birth': '2024-01-20', 'sex': 'F'},\n", + " {'subject_id': 3, 'species': 'mouse',\n", + " 'date_of_birth': '2024-02-01', 'sex': 'M'},\n", + "])" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:37.898870Z", + "iopub.status.busy": "2026-01-14T07:33:37.898726Z", + "iopub.status.idle": "2026-01-14T07:33:37.902970Z", + "shell.execute_reply": "2026-01-14T07:33:37.902742Z" + } + }, + "outputs": [], + "source": [ + "# Then: tables that depend on others\n", + "Session.insert([\n", + " {'subject_id': 1, 'session_date': '2024-06-01',\n", + " 'researcher_id': 1, 'session_notes': 'First session'},\n", + " {'subject_id': 1, 'session_date': '2024-06-15',\n", + " 'researcher_id': 1, 'session_notes': 'Follow-up'},\n", + " {'subject_id': 2, 'session_date': '2024-06-10',\n", + " 'researcher_id': 2, 'session_notes': 'Initial recording'},\n", + "])" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:37.904281Z", + "iopub.status.busy": "2026-01-14T07:33:37.904177Z", + "iopub.status.idle": "2026-01-14T07:33:37.908759Z", + "shell.execute_reply": "2026-01-14T07:33:37.908363Z" + } + }, + "outputs": [], + "source": [ + "# Finally: tables at the bottom of the hierarchy\n", + "Recording.insert([\n", + " {'subject_id': 1, 'session_date': '2024-06-01', 'recording_id': 1,\n", + " 'duration': 300.5, 'quality': 'good'},\n", + " {'subject_id': 1, 'session_date': '2024-06-01', 'recording_id': 2,\n", + " 'duration': 450.0, 'quality': 'good'},\n", + " {'subject_id': 1, 'session_date': '2024-06-15', 'recording_id': 1,\n", + " 'duration': 600.0, 'quality': 'fair'},\n", + " {'subject_id': 2, 'session_date': '2024-06-10', 'recording_id': 1,\n", + " 'duration': 350.0, 'quality': 'good'},\n", + "])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Viewing Data\n", + "\n", + "Display a table by calling it:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:37.910330Z", + "iopub.status.busy": "2026-01-14T07:33:37.910228Z", + "iopub.status.idle": "2026-01-14T07:33:37.916798Z", + "shell.execute_reply": "2026-01-14T07:33:37.916516Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

species

\n", + " \n", + "
\n", + "

date_of_birth

\n", + " \n", + "
\n", + "

sex

\n", + " \n", + "
1mouse2024-01-15M
2mouse2024-01-20F
3mouse2024-02-01M
\n", + " \n", + "

Total: 3

\n", + " " + ], + "text/plain": [ + "*subject_id species date_of_birth sex \n", + "+------------+ +---------+ +------------+ +-----+\n", + "1 mouse 2024-01-15 M \n", + "2 mouse 2024-01-20 F \n", + "3 mouse 2024-02-01 M \n", + " (Total: 3)" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Subject()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:37.918055Z", + "iopub.status.busy": "2026-01-14T07:33:37.917968Z", + "iopub.status.idle": "2026-01-14T07:33:37.922176Z", + "shell.execute_reply": "2026-01-14T07:33:37.921958Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

session_date

\n", + " \n", + "
\n", + "

recording_id

\n", + " \n", + "
\n", + "

duration

\n", + " recording duration (seconds)\n", + "
\n", + "

quality

\n", + " \n", + "
12024-06-011300.5good
12024-06-012450.0good
12024-06-151600.0fair
22024-06-101350.0good
\n", + " \n", + "

Total: 4

\n", + " " + ], + "text/plain": [ + "*subject_id *session_date *recording_id duration quality \n", + "+------------+ +------------+ +------------+ +----------+ +---------+\n", + "1 2024-06-01 1 300.5 good \n", + "1 2024-06-01 2 450.0 good \n", + "1 2024-06-15 1 600.0 fair \n", + "2 2024-06-10 1 350.0 good \n", + " (Total: 4)" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Recording()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The Four Core Operations\n", + "\n", + "DataJoint queries use four fundamental operations. These compose to answer any question about your data." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1. Restriction (`&`) β€” Filter rows\n", + "\n", + "Keep only rows matching a condition:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:37.923503Z", + "iopub.status.busy": "2026-01-14T07:33:37.923413Z", + "iopub.status.idle": "2026-01-14T07:33:37.927426Z", + "shell.execute_reply": "2026-01-14T07:33:37.927154Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

species

\n", + " \n", + "
\n", + "

date_of_birth

\n", + " \n", + "
\n", + "

sex

\n", + " \n", + "
1mouse2024-01-15M
3mouse2024-02-01M
\n", + " \n", + "

Total: 2

\n", + " " + ], + "text/plain": [ + "*subject_id species date_of_birth sex \n", + "+------------+ +---------+ +------------+ +-----+\n", + "1 mouse 2024-01-15 M \n", + "3 mouse 2024-02-01 M \n", + " (Total: 2)" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Subjects that are male\n", + "Subject & {'sex': 'M'}" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:37.928613Z", + "iopub.status.busy": "2026-01-14T07:33:37.928527Z", + "iopub.status.idle": "2026-01-14T07:33:37.932821Z", + "shell.execute_reply": "2026-01-14T07:33:37.932584Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

session_date

\n", + " \n", + "
\n", + "

recording_id

\n", + " \n", + "
\n", + "

duration

\n", + " recording duration (seconds)\n", + "
\n", + "

quality

\n", + " \n", + "
12024-06-011300.5good
12024-06-012450.0good
22024-06-101350.0good
\n", + " \n", + "

Total: 3

\n", + " " + ], + "text/plain": [ + "*subject_id *session_date *recording_id duration quality \n", + "+------------+ +------------+ +------------+ +----------+ +---------+\n", + "1 2024-06-01 1 300.5 good \n", + "1 2024-06-01 2 450.0 good \n", + "2 2024-06-10 1 350.0 good \n", + " (Total: 3)" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Recordings with good quality\n", + "Recording & 'quality = \"good\"'" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:37.933946Z", + "iopub.status.busy": "2026-01-14T07:33:37.933875Z", + "iopub.status.idle": "2026-01-14T07:33:37.937750Z", + "shell.execute_reply": "2026-01-14T07:33:37.937533Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

session_date

\n", + " \n", + "
\n", + "

researcher_id

\n", + " \n", + "
\n", + "

session_notes

\n", + " \n", + "
12024-06-011First session
12024-06-151Follow-up
\n", + " \n", + "

Total: 2

\n", + " " + ], + "text/plain": [ + "*subject_id *session_date researcher_id session_notes \n", + "+------------+ +------------+ +------------+ +------------+\n", + "1 2024-06-01 1 First session \n", + "1 2024-06-15 1 Follow-up \n", + " (Total: 2)" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Sessions for subject 1\n", + "Session & {'subject_id': 1}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2. Projection (`.proj()`) β€” Select columns\n", + "\n", + "Choose which attributes to return, or compute new ones:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:37.939025Z", + "iopub.status.busy": "2026-01-14T07:33:37.938946Z", + "iopub.status.idle": "2026-01-14T07:33:37.943755Z", + "shell.execute_reply": "2026-01-14T07:33:37.943546Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

researcher_id

\n", + " \n", + "
\n", + "

researcher_name

\n", + " \n", + "
\n", + "

email

\n", + " \n", + "
1Alice Chenalice@lab.org
2Bob Smithbob@lab.org
\n", + " \n", + "

Total: 2

\n", + " " + ], + "text/plain": [ + "*researcher_id researcher_nam email \n", + "+------------+ +------------+ +------------+\n", + "1 Alice Chen alice@lab.org \n", + "2 Bob Smith bob@lab.org \n", + " (Total: 2)" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Just names and emails\n", + "Researcher.proj('researcher_name', 'email')" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:37.944947Z", + "iopub.status.busy": "2026-01-14T07:33:37.944859Z", + "iopub.status.idle": "2026-01-14T07:33:37.949191Z", + "shell.execute_reply": "2026-01-14T07:33:37.948946Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

session_date

\n", + " \n", + "
\n", + "

recording_id

\n", + " \n", + "
\n", + "

duration_min

\n", + " calculated attribute\n", + "
12024-06-0115.008333333333334
12024-06-0127.5
12024-06-15110.0
22024-06-1015.833333333333333
\n", + " \n", + "

Total: 4

\n", + " " + ], + "text/plain": [ + "*subject_id *session_date *recording_id duration_min \n", + "+------------+ +------------+ +------------+ +------------+\n", + "1 2024-06-01 1 5.008333333333\n", + "1 2024-06-01 2 7.5 \n", + "1 2024-06-15 1 10.0 \n", + "2 2024-06-10 1 5.833333333333\n", + " (Total: 4)" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Compute duration in minutes\n", + "Recording.proj(duration_min='duration / 60')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3. Join (`*`) β€” Combine tables\n", + "\n", + "Merge data from related tables:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:37.950435Z", + "iopub.status.busy": "2026-01-14T07:33:37.950358Z", + "iopub.status.idle": "2026-01-14T07:33:37.956013Z", + "shell.execute_reply": "2026-01-14T07:33:37.955780Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

session_date

\n", + " \n", + "
\n", + "

researcher_id

\n", + " \n", + "
\n", + "

session_notes

\n", + " \n", + "
\n", + "

species

\n", + " \n", + "
\n", + "

date_of_birth

\n", + " \n", + "
\n", + "

sex

\n", + " \n", + "
12024-06-011First sessionmouse2024-01-15M
12024-06-151Follow-upmouse2024-01-15M
22024-06-102Initial recordingmouse2024-01-20F
\n", + " \n", + "

Total: 3

\n", + " " + ], + "text/plain": [ + "*subject_id *session_date researcher_id session_notes species date_of_birth sex \n", + "+------------+ +------------+ +------------+ +------------+ +---------+ +------------+ +-----+\n", + "1 2024-06-01 1 First session mouse 2024-01-15 M \n", + "1 2024-06-15 1 Follow-up mouse 2024-01-15 M \n", + "2 2024-06-10 2 Initial record mouse 2024-01-20 F \n", + " (Total: 3)" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Sessions with subject info\n", + "Session * Subject" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:37.957337Z", + "iopub.status.busy": "2026-01-14T07:33:37.957254Z", + "iopub.status.idle": "2026-01-14T07:33:37.962643Z", + "shell.execute_reply": "2026-01-14T07:33:37.962415Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

session_date

\n", + " \n", + "
\n", + "

recording_id

\n", + " \n", + "
\n", + "

duration

\n", + " recording duration (seconds)\n", + "
\n", + "

quality

\n", + " \n", + "
\n", + "

species

\n", + " \n", + "
\n", + "

researcher_name

\n", + " \n", + "
12024-06-011300.5goodmouseAlice Chen
12024-06-012450.0goodmouseAlice Chen
12024-06-151600.0fairmouseAlice Chen
22024-06-101350.0goodmouseBob Smith
\n", + " \n", + "

Total: 4

\n", + " " + ], + "text/plain": [ + "*subject_id *session_date *recording_id duration quality species researcher_nam\n", + "+------------+ +------------+ +------------+ +----------+ +---------+ +---------+ +------------+\n", + "1 2024-06-01 1 300.5 good mouse Alice Chen \n", + "1 2024-06-01 2 450.0 good mouse Alice Chen \n", + "1 2024-06-15 1 600.0 fair mouse Alice Chen \n", + "2 2024-06-10 1 350.0 good mouse Bob Smith \n", + " (Total: 4)" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Full recording details with subject and researcher\n", + "(Recording * Session * Subject * Researcher).proj(\n", + " 'researcher_name', 'species', 'duration', 'quality'\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4. Aggregation (`.aggr()`) β€” Summarize groups\n", + "\n", + "Compute statistics across groups of rows:" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:37.963840Z", + "iopub.status.busy": "2026-01-14T07:33:37.963766Z", + "iopub.status.idle": "2026-01-14T07:33:37.968040Z", + "shell.execute_reply": "2026-01-14T07:33:37.967790Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

session_date

\n", + " \n", + "
\n", + "

num_recordings

\n", + " calculated attribute\n", + "
12024-06-012
12024-06-151
22024-06-101
\n", + " \n", + "

Total: 3

\n", + " " + ], + "text/plain": [ + "*subject_id *session_date num_recordings\n", + "+------------+ +------------+ +------------+\n", + "1 2024-06-01 2 \n", + "1 2024-06-15 1 \n", + "2 2024-06-10 1 \n", + " (Total: 3)" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Count recordings per session\n", + "Session.aggr(Recording, num_recordings='count(*)')" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:37.969219Z", + "iopub.status.busy": "2026-01-14T07:33:37.969138Z", + "iopub.status.idle": "2026-01-14T07:33:37.975608Z", + "shell.execute_reply": "2026-01-14T07:33:37.975266Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

total_duration

\n", + " calculated attribute\n", + "
11350.5
2350.0
3None
\n", + " \n", + "

Total: 3

\n", + " " + ], + "text/plain": [ + "*subject_id total_duration\n", + "+------------+ +------------+\n", + "1 1350.5 \n", + "2 350.0 \n", + "3 None \n", + " (Total: 3)" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Total recording time per subject\n", + "Subject.aggr(Recording, total_duration='sum(duration)')" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:37.976798Z", + "iopub.status.busy": "2026-01-14T07:33:37.976722Z", + "iopub.status.idle": "2026-01-14T07:33:37.980541Z", + "shell.execute_reply": "2026-01-14T07:33:37.980244Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "
\n", + "

avg_duration

\n", + " calculated attribute\n", + "
425.125
\n", + " \n", + "

Total: 1

\n", + " " + ], + "text/plain": [ + "avg_duration \n", + "+------------+\n", + "425.125 \n", + " (Total: 1)" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Average duration across all recordings\n", + "dj.U().aggr(Recording, avg_duration='avg(duration)')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Combining Operations\n", + "\n", + "Operations chain together to answer complex questions:" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:37.981915Z", + "iopub.status.busy": "2026-01-14T07:33:37.981832Z", + "iopub.status.idle": "2026-01-14T07:33:37.991220Z", + "shell.execute_reply": "2026-01-14T07:33:37.990976Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

session_date

\n", + " \n", + "
\n", + "

recording_id

\n", + " \n", + "
\n", + "

duration

\n", + " recording duration (seconds)\n", + "
\n", + "

quality

\n", + " \n", + "
\n", + "

researcher_id

\n", + " \n", + "
\n", + "

session_notes

\n", + " \n", + "
\n", + "

researcher_name

\n", + " \n", + "
12024-06-011300.5good1First sessionAlice Chen
12024-06-012450.0good1First sessionAlice Chen
\n", + " \n", + "

Total: 2

\n", + " " + ], + "text/plain": [ + "*subject_id *session_date *recording_id duration quality researcher_id session_notes researcher_nam\n", + "+------------+ +------------+ +------------+ +----------+ +---------+ +------------+ +------------+ +------------+\n", + "1 2024-06-01 1 300.5 good 1 First session Alice Chen \n", + "1 2024-06-01 2 450.0 good 1 First session Alice Chen \n", + " (Total: 2)" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Good-quality recordings for male subjects, with researcher name\n", + "(\n", + " Recording \n", + " & 'quality = \"good\"' \n", + " & (Subject & {'sex': 'M'})\n", + ") * Session * Researcher.proj('researcher_name')" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:37.992393Z", + "iopub.status.busy": "2026-01-14T07:33:37.992303Z", + "iopub.status.idle": "2026-01-14T07:33:37.998183Z", + "shell.execute_reply": "2026-01-14T07:33:37.997937Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "
\n", + "

researcher_id

\n", + " \n", + "
\n", + "

good_recordings

\n", + " calculated attribute\n", + "
12
21
\n", + " \n", + "

Total: 2

\n", + " " + ], + "text/plain": [ + "*researcher_id good_recording\n", + "+------------+ +------------+\n", + "1 2 \n", + "2 1 \n", + " (Total: 2)" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Count of good recordings per researcher\n", + "Researcher.aggr(\n", + " Session * (Recording & 'quality = \"good\"'),\n", + " good_recordings='count(*)'\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Fetching Data\n", + "\n", + "To get data into Python, use fetch methods:" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:37.999432Z", + "iopub.status.busy": "2026-01-14T07:33:37.999348Z", + "iopub.status.idle": "2026-01-14T07:33:38.002055Z", + "shell.execute_reply": "2026-01-14T07:33:38.001788Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[{'subject_id': 1,\n", + " 'species': 'mouse',\n", + " 'date_of_birth': datetime.date(2024, 1, 15),\n", + " 'sex': 'M'},\n", + " {'subject_id': 2,\n", + " 'species': 'mouse',\n", + " 'date_of_birth': datetime.date(2024, 1, 20),\n", + " 'sex': 'F'},\n", + " {'subject_id': 3,\n", + " 'species': 'mouse',\n", + " 'date_of_birth': datetime.date(2024, 2, 1),\n", + " 'sex': 'M'}]" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Fetch as list of dicts\n", + "Subject.to_dicts()" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:38.003249Z", + "iopub.status.busy": "2026-01-14T07:33:38.003169Z", + "iopub.status.idle": "2026-01-14T07:33:38.007139Z", + "shell.execute_reply": "2026-01-14T07:33:38.006908Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Good recording durations: [300.5 450. 350. ]\n" + ] + } + ], + "source": [ + "# Fetch specific attributes as arrays\n", + "durations = (Recording & 'quality = \"good\"').to_arrays('duration')\n", + "print(f\"Good recording durations: {durations}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:38.008275Z", + "iopub.status.busy": "2026-01-14T07:33:38.008200Z", + "iopub.status.idle": "2026-01-14T07:33:38.010496Z", + "shell.execute_reply": "2026-01-14T07:33:38.010267Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Subject 1: {'subject_id': 1, 'species': 'mouse', 'date_of_birth': datetime.date(2024, 1, 15), 'sex': 'M'}\n" + ] + } + ], + "source": [ + "# Fetch one row\n", + "one_subject = (Subject & {'subject_id': 1}).fetch1()\n", + "print(f\"Subject 1: {one_subject}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Deleting Data\n", + "\n", + "Deleting respects dependenciesβ€”downstream data is deleted automatically:" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:38.011700Z", + "iopub.status.busy": "2026-01-14T07:33:38.011623Z", + "iopub.status.idle": "2026-01-14T07:33:38.013118Z", + "shell.execute_reply": "2026-01-14T07:33:38.012868Z" + } + }, + "outputs": [], + "source": [ + "# This would delete the session AND all its recordings\n", + "# (Session & {'subject_id': 2, 'session_date': '2024-06-10'}).delete()\n", + "\n", + "# Uncomment to try (will prompt for confirmation)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "You've learned the fundamentals of DataJoint:\n", + "\n", + "| Concept | Description |\n", + "|---------|-------------|\n", + "| **Tables** | Python classes with a `definition` string |\n", + "| **Primary key** | Above `---`, uniquely identifies rows |\n", + "| **Dependencies** | `->` creates foreign keys |\n", + "| **Restriction** | `&` filters rows |\n", + "| **Projection** | `.proj()` selects/computes columns |\n", + "| **Join** | `*` combines tables |\n", + "| **Aggregation** | `.aggr()` summarizes groups |\n", + "\n", + "### Next Steps\n", + "\n", + "- [Schema Design](02-schema-design.ipynb) β€” Primary keys, relationships, table tiers\n", + "- [Queries](04-queries.ipynb) β€” Advanced query patterns\n", + "- [Computation](05-computation.ipynb) β€” Automated processing with Imported/Computed tables\n", + "\n", + "### Complete Examples\n", + "\n", + "- [University Database](../examples/university.ipynb) β€” Complex queries on academic records\n", + "- [Blob Detection](../examples/blob-detection.ipynb) β€” Image processing pipeline with computation" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:38.014218Z", + "iopub.status.busy": "2026-01-14T07:33:38.014132Z", + "iopub.status.idle": "2026-01-14T07:33:38.034847Z", + "shell.execute_reply": "2026-01-14T07:33:38.034483Z" + } + }, + "outputs": [], + "source": [ + "# Cleanup\n", + "schema.drop(prompt=False)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/src/tutorials/basics/02-schema-design.ipynb b/src/tutorials/basics/02-schema-design.ipynb new file mode 100644 index 00000000..831ca9e4 --- /dev/null +++ b/src/tutorials/basics/02-schema-design.ipynb @@ -0,0 +1,1679 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Schema Design\n", + "\n", + "This tutorial covers how to design DataJoint schemas effectively. You'll learn:\n", + "\n", + "- **Table tiers** β€” Manual, Lookup, Imported, and Computed tables\n", + "- **Primary keys** β€” Uniquely identifying entities\n", + "- **Foreign keys** β€” Creating dependencies between tables\n", + "- **Relationship patterns** β€” One-to-many, one-to-one, and many-to-many\n", + "\n", + "We'll build a schema for a neuroscience experiment tracking subjects, sessions, and trials." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:40.233346Z", + "iopub.status.busy": "2026-01-14T07:33:40.233242Z", + "iopub.status.idle": "2026-01-14T07:33:40.929097Z", + "shell.execute_reply": "2026-01-14T07:33:40.928811Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2026-01-14 01:33:40,922][INFO]: DataJoint 2.0.0a22 connected to root@127.0.0.1:3306\n" + ] + } + ], + "source": [ + "import datajoint as dj\n", + "\n", + "schema = dj.Schema('tutorial_design')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Table Tiers\n", + "\n", + "DataJoint has four table tiers, each serving a different purpose:\n", + "\n", + "| Tier | Class | Purpose | Data Entry |\n", + "|------|-------|---------|------------|\n", + "| **Manual** | `dj.Manual` | Core experimental data | Inserted by operators or instruments |\n", + "| **Lookup** | `dj.Lookup` | Reference/configuration data | Pre-populated, rarely changes |\n", + "| **Imported** | `dj.Imported` | Data from external files | Auto-populated via `make()` |\n", + "| **Computed** | `dj.Computed` | Derived/processed data | Auto-populated via `make()` |\n", + "\n", + "**Manual** tables are not necessarily populated by handβ€”they contain data entered into the pipeline by operators, instruments, or ingestion scripts using `insert` commands. In contrast, **Imported** and **Computed** tables are auto-populated by calling the `.populate()` method, which invokes the `make()` callback for each missing entry.\n", + "\n", + "### Manual Tables\n", + "\n", + "Manual tables store data that is inserted directlyβ€”the starting point of your pipeline." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:40.949541Z", + "iopub.status.busy": "2026-01-14T07:33:40.949155Z", + "iopub.status.idle": "2026-01-14T07:33:41.002125Z", + "shell.execute_reply": "2026-01-14T07:33:41.001799Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class Lab(dj.Manual):\n", + " definition = \"\"\"\n", + " # Research laboratory\n", + " lab_id : varchar(16) # short identifier (e.g., 'tolias')\n", + " ---\n", + " lab_name : varchar(100)\n", + " institution : varchar(100)\n", + " created_at = CURRENT_TIMESTAMP : datetime # when record was created\n", + " \"\"\"\n", + "\n", + "@schema\n", + "class Subject(dj.Manual):\n", + " definition = \"\"\"\n", + " # Experimental subject\n", + " subject_id : varchar(16)\n", + " ---\n", + " -> Lab\n", + " species : varchar(50)\n", + " date_of_birth : date\n", + " sex : enum('M', 'F', 'U')\n", + " \"\"\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Lookup Tables\n", + "\n", + "Lookup tables store reference data that rarely changes. Use the `contents` attribute to pre-populate them." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:41.003805Z", + "iopub.status.busy": "2026-01-14T07:33:41.003684Z", + "iopub.status.idle": "2026-01-14T07:33:41.044137Z", + "shell.execute_reply": "2026-01-14T07:33:41.043839Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class TaskType(dj.Lookup):\n", + " definition = \"\"\"\n", + " # Types of behavioral tasks\n", + " task_type : varchar(32)\n", + " ---\n", + " description : varchar(255)\n", + " \"\"\"\n", + " contents = [\n", + " {'task_type': 'go_nogo', 'description': 'Go/No-Go discrimination task'},\n", + " {'task_type': '2afc', 'description': 'Two-alternative forced choice'},\n", + " {'task_type': 'foraging', 'description': 'Foraging/exploration task'},\n", + " ]\n", + "\n", + "@schema\n", + "class SessionStatus(dj.Lookup):\n", + " definition = \"\"\"\n", + " # Session status codes\n", + " status : varchar(16)\n", + " \"\"\"\n", + " contents = [\n", + " {'status': 'scheduled'},\n", + " {'status': 'in_progress'},\n", + " {'status': 'completed'},\n", + " {'status': 'aborted'},\n", + " ]" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:41.045901Z", + "iopub.status.busy": "2026-01-14T07:33:41.045772Z", + "iopub.status.idle": "2026-01-14T07:33:41.051851Z", + "shell.execute_reply": "2026-01-14T07:33:41.051585Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " Types of behavioral tasks\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "
\n", + "

task_type

\n", + " \n", + "
\n", + "

description

\n", + " \n", + "
2afcTwo-alternative forced choice
foragingForaging/exploration task
go_nogoGo/No-Go discrimination task
\n", + " \n", + "

Total: 3

\n", + " " + ], + "text/plain": [ + "*task_type description \n", + "+-----------+ +------------+\n", + "2afc Two-alternativ\n", + "foraging Foraging/explo\n", + "go_nogo Go/No-Go discr\n", + " (Total: 3)" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Lookup tables are automatically populated\n", + "TaskType()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Primary Keys\n", + "\n", + "The **primary key** uniquely identifies each row. Attributes above the `---` line form the primary key.\n", + "\n", + "### Design Principles\n", + "\n", + "1. **Entity integrity** β€” Each row represents exactly one real-world entity\n", + "2. **No duplicates** β€” The primary key prevents inserting the same entity twice\n", + "3. **Minimal** β€” Include only attributes necessary for uniqueness\n", + "\n", + "### Natural vs Surrogate Keys\n", + "\n", + "- **Natural key**: An identifier used *outside* the database to refer to entities in the real world. Requires a real-world mechanism to establish and maintain the association (e.g., ear tags, cage labels, barcodes). Example: `subject_id = 'M001'` where M001 is printed on the animal's cage.\n", + "\n", + "- **Surrogate key**: An identifier used *only inside* the database, with minimal or no exposure to end users. Users don't search by surrogate keys or use them in conversation. Example: internal record IDs, auto-generated UUIDs for system tracking.\n", + "\n", + "DataJoint works well with both. Natural keys make data more interpretable and enable identification of physical entities. Surrogate keys are appropriate when entities exist only within the system or when natural identifiers shouldn't be stored (e.g., privacy)." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:41.053260Z", + "iopub.status.busy": "2026-01-14T07:33:41.053141Z", + "iopub.status.idle": "2026-01-14T07:33:41.103200Z", + "shell.execute_reply": "2026-01-14T07:33:41.102897Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class Session(dj.Manual):\n", + " definition = \"\"\"\n", + " # Experimental session\n", + " -> Subject\n", + " session_idx : uint16 # session number for this subject\n", + " ---\n", + " -> TaskType\n", + " -> SessionStatus\n", + " session_date : date\n", + " session_notes = '' : varchar(1000)\n", + " task_params = NULL : json # task-specific parameters (nullable)\n", + " \"\"\"\n", + "\n", + " class Trial(dj.Part):\n", + " definition = \"\"\"\n", + " # Individual trial within a session\n", + " -> master\n", + " trial_idx : uint16\n", + " ---\n", + " stimulus : varchar(50)\n", + " response : varchar(50)\n", + " correct : bool\n", + " reaction_time : float32 # seconds\n", + " \"\"\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The primary key of `Session` is `(subject_id, session_idx)` β€” a **composite key**. This means:\n", + "- Each subject can have multiple sessions (1, 2, 3, ...)\n", + "- Session 1 for subject A is different from session 1 for subject B\n", + "\n", + "## Foreign Keys\n", + "\n", + "The `->` syntax creates a **foreign key** dependency. Foreign keys:\n", + "\n", + "1. **Import attributes** β€” Primary key attributes are inherited from the parent\n", + "2. **Enforce referential integrity** β€” Can't insert a session for a non-existent subject\n", + "3. **Enable cascading deletes** β€” Deleting a subject removes all its sessions\n", + "4. **Define workflow** β€” The parent must exist before the child" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:41.104837Z", + "iopub.status.busy": "2026-01-14T07:33:41.104711Z", + "iopub.status.idle": "2026-01-14T07:33:41.112228Z", + "shell.execute_reply": "2026-01-14T07:33:41.111976Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " Experimental subject\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

lab_id

\n", + " short identifier (e.g., 'tolias')\n", + "
\n", + "

species

\n", + " \n", + "
\n", + "

date_of_birth

\n", + " \n", + "
\n", + "

sex

\n", + " \n", + "
M001toliasMus musculus2026-01-15M
\n", + " \n", + "

Total: 1

\n", + " " + ], + "text/plain": [ + "*subject_id lab_id species date_of_birth sex \n", + "+------------+ +--------+ +------------+ +------------+ +-----+\n", + "M001 tolias Mus musculus 2026-01-15 M \n", + " (Total: 1)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Let's insert some data to see how foreign keys work\n", + "Lab.insert1({\n", + " 'lab_id': 'tolias',\n", + " 'lab_name': 'Tolias Lab',\n", + " 'institution': 'Baylor College of Medicine'\n", + "})\n", + "# Note: created_at is auto-populated with CURRENT_TIMESTAMP\n", + "\n", + "Subject.insert1({\n", + " 'subject_id': 'M001',\n", + " 'lab_id': 'tolias',\n", + " 'species': 'Mus musculus',\n", + " 'date_of_birth': '2026-01-15',\n", + " 'sex': 'M'\n", + "})\n", + "\n", + "Subject()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:41.113587Z", + "iopub.status.busy": "2026-01-14T07:33:41.113470Z", + "iopub.status.idle": "2026-01-14T07:33:41.120557Z", + "shell.execute_reply": "2026-01-14T07:33:41.120309Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " Experimental session\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

session_idx

\n", + " session number for this subject\n", + "
\n", + "

task_type

\n", + " \n", + "
\n", + "

status

\n", + " \n", + "
\n", + "

session_date

\n", + " \n", + "
\n", + "

session_notes

\n", + " \n", + "
\n", + "

task_params

\n", + " task-specific parameters (nullable)\n", + "
M0011go_nogocompleted2026-01-06json
M0012go_nogocompleted2026-01-07json
M00132afcin_progress2026-01-08json
\n", + " \n", + "

Total: 3

\n", + " " + ], + "text/plain": [ + "*subject_id *session_idx task_type status session_date session_notes task_par\n", + "+------------+ +------------+ +-----------+ +------------+ +------------+ +------------+ +------+\n", + "M001 1 go_nogo completed 2026-01-06 json \n", + "M001 2 go_nogo completed 2026-01-07 json \n", + "M001 3 2afc in_progress 2026-01-08 json \n", + " (Total: 3)" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Insert sessions for this subject\n", + "Session.insert([\n", + " {'subject_id': 'M001', 'session_idx': 1, 'task_type': 'go_nogo', \n", + " 'status': 'completed', 'session_date': '2026-01-06',\n", + " 'task_params': {'go_probability': 0.5, 'timeout_sec': 2.0}},\n", + " {'subject_id': 'M001', 'session_idx': 2, 'task_type': 'go_nogo',\n", + " 'status': 'completed', 'session_date': '2026-01-07',\n", + " 'task_params': {'go_probability': 0.7, 'timeout_sec': 1.5}},\n", + " {'subject_id': 'M001', 'session_idx': 3, 'task_type': '2afc',\n", + " 'status': 'in_progress', 'session_date': '2026-01-08',\n", + " 'task_params': None}, # NULL - no parameters for this session\n", + "])\n", + "\n", + "Session()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:41.121901Z", + "iopub.status.busy": "2026-01-14T07:33:41.121790Z", + "iopub.status.idle": "2026-01-14T07:33:41.124601Z", + "shell.execute_reply": "2026-01-14T07:33:41.124371Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Error: IntegrityError\n", + "Cannot insert session for non-existent subject!\n" + ] + } + ], + "source": [ + "# This would fail - referential integrity prevents invalid foreign keys\n", + "try:\n", + " Session.insert1({'subject_id': 'INVALID', 'session_idx': 1, \n", + " 'task_type': 'go_nogo', 'status': 'completed',\n", + " 'session_date': '2026-01-06'})\n", + "except Exception as e:\n", + " print(f\"Error: {type(e).__name__}\")\n", + " print(\"Cannot insert session for non-existent subject!\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Relationship Patterns\n", + "\n", + "### One-to-Many (Hierarchical)\n", + "\n", + "When a foreign key is part of the primary key, it creates a **one-to-many** relationship:\n", + "- One subject β†’ many sessions\n", + "- One session β†’ many trials\n", + "\n", + "### Master-Part (Compositional Integrity)\n", + "\n", + "A **part table** provides **compositional integrity**: master and parts are inserted and deleted as an atomic unit. Part tables:\n", + "- Reference the master with `-> master`\n", + "- Are inserted together with the master atomically\n", + "- Are deleted when the master is deleted\n", + "- Can be one-to-many or one-to-one with the master\n", + "- A master can have multiple part tables, which may reference each other\n", + "\n", + "We defined `Session.Trial` as a part table because trials belong to their session:\n", + "- A session and all its trials should be entered together\n", + "- Deleting a session removes all its trials\n", + "- Downstream computations can assume all trials are present once the session exists\n", + "\n", + "Use part tables when components must be complete before processing can begin." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:41.125827Z", + "iopub.status.busy": "2026-01-14T07:33:41.125721Z", + "iopub.status.idle": "2026-01-14T07:33:41.137464Z", + "shell.execute_reply": "2026-01-14T07:33:41.137195Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " Individual trial within a session\n", + "
\n", + " \n", + " \n", + " \n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

session_idx

\n", + " session number for this subject\n", + "
\n", + "

trial_idx

\n", + " \n", + "
\n", + "

stimulus

\n", + " \n", + "
\n", + "

response

\n", + " \n", + "
\n", + "

correct

\n", + " \n", + "
\n", + "

reaction_time

\n", + " seconds\n", + "
\n", + " \n", + "

Total: 0

\n", + " " + ], + "text/plain": [ + "*subject_id *session_idx *trial_idx stimulus response correct reaction_time \n", + "+------------+ +------------+ +-----------+ +----------+ +----------+ +---------+ +------------+\n", + "\n", + " (Total: 0)" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Access the part table\n", + "Session.Trial()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### One-to-One (Extension)\n", + "\n", + "When the child's primary key exactly matches the parent's, it creates a **one-to-one** relationship. This is useful for:\n", + "- Extending a table with optional or computed data\n", + "- Separating computed results from source data\n", + "\n", + "`SessionSummary` below has a one-to-one relationship with `Session`β€”each session has exactly one summary." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:41.138930Z", + "iopub.status.busy": "2026-01-14T07:33:41.138819Z", + "iopub.status.idle": "2026-01-14T07:33:41.157806Z", + "shell.execute_reply": "2026-01-14T07:33:41.157481Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class SessionSummary(dj.Computed):\n", + " definition = \"\"\"\n", + " # Summary statistics for a session\n", + " -> Session\n", + " ---\n", + " num_trials : uint16\n", + " num_correct : uint16\n", + " accuracy : float32\n", + " mean_reaction_time : float32\n", + " \"\"\"\n", + " \n", + " def make(self, key):\n", + " correct_vals, rt_vals = (Session.Trial & key).to_arrays('correct', 'reaction_time')\n", + " n_trials = len(correct_vals)\n", + " n_correct = sum(correct_vals) if n_trials else 0\n", + "\n", + " self.insert1({\n", + " **key,\n", + " 'num_trials': n_trials,\n", + " 'num_correct': n_correct,\n", + " 'accuracy': n_correct / n_trials if n_trials else 0.0,\n", + " 'mean_reaction_time': sum(rt_vals) / n_trials if n_trials else 0.0\n", + " })" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Optional Foreign Keys (Nullable)\n", + "\n", + "Use `[nullable]` for optional relationships:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:41.159326Z", + "iopub.status.busy": "2026-01-14T07:33:41.159212Z", + "iopub.status.idle": "2026-01-14T07:33:41.202611Z", + "shell.execute_reply": "2026-01-14T07:33:41.202291Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class Experimenter(dj.Manual):\n", + " definition = \"\"\"\n", + " # Lab member who runs experiments\n", + " experimenter_id : uuid # anonymized identifier\n", + " ---\n", + " full_name : varchar(100)\n", + " email = '' : varchar(100)\n", + " \"\"\"\n", + "\n", + "@schema\n", + "class SessionExperimenter(dj.Manual):\n", + " definition = \"\"\"\n", + " # Links sessions to experimenters (optional)\n", + " -> Session\n", + " ---\n", + " -> [nullable] Experimenter # experimenter may be unknown\n", + " \"\"\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Many-to-Many (Association Tables)\n", + "\n", + "For many-to-many relationships, create an association table with foreign keys to both parents:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:41.204422Z", + "iopub.status.busy": "2026-01-14T07:33:41.204286Z", + "iopub.status.idle": "2026-01-14T07:33:41.244855Z", + "shell.execute_reply": "2026-01-14T07:33:41.244504Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class Protocol(dj.Lookup):\n", + " definition = \"\"\"\n", + " # Experimental protocols\n", + " protocol_id : varchar(32)\n", + " ---\n", + " protocol_name : varchar(100)\n", + " version : varchar(16)\n", + " \"\"\"\n", + " contents = [\n", + " {'protocol_id': 'iacuc_2024_01', 'protocol_name': 'Mouse Behavior', 'version': '1.0'},\n", + " {'protocol_id': 'iacuc_2024_02', 'protocol_name': 'Imaging Protocol', 'version': '2.1'},\n", + " ]\n", + "\n", + "@schema \n", + "class SubjectProtocol(dj.Manual):\n", + " definition = \"\"\"\n", + " # Protocols assigned to subjects (many-to-many)\n", + " -> Subject\n", + " -> Protocol\n", + " ---\n", + " assignment_date : date\n", + " \"\"\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## View the Schema\n", + "\n", + "DataJoint can visualize the schema as a diagram:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:41.246505Z", + "iopub.status.busy": "2026-01-14T07:33:41.246392Z", + "iopub.status.idle": "2026-01-14T07:33:41.591666Z", + "shell.execute_reply": "2026-01-14T07:33:41.591237Z" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "Protocol\n", + "\n", + "\n", + "Protocol\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "SubjectProtocol\n", + "\n", + "\n", + "SubjectProtocol\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Protocol->SubjectProtocol\n", + "\n", + "\n", + "\n", + "\n", + "SessionStatus\n", + "\n", + "\n", + "SessionStatus\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Session\n", + "\n", + "\n", + "Session\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "SessionStatus->Session\n", + "\n", + "\n", + "\n", + "\n", + "TaskType\n", + "\n", + "\n", + "TaskType\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "TaskType->Session\n", + "\n", + "\n", + "\n", + "\n", + "SessionSummary\n", + "\n", + "\n", + "SessionSummary\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Experimenter\n", + "\n", + "\n", + "Experimenter\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "SessionExperimenter\n", + "\n", + "\n", + "SessionExperimenter\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Experimenter->SessionExperimenter\n", + "\n", + "\n", + "\n", + "\n", + "Lab\n", + "\n", + "\n", + "Lab\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Subject\n", + "\n", + "\n", + "Subject\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Lab->Subject\n", + "\n", + "\n", + "\n", + "\n", + "Session->SessionSummary\n", + "\n", + "\n", + "\n", + "\n", + "Session.Trial\n", + "\n", + "\n", + "Session.Trial\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Session->Session.Trial\n", + "\n", + "\n", + "\n", + "\n", + "Session->SessionExperimenter\n", + "\n", + "\n", + "\n", + "\n", + "Subject->Session\n", + "\n", + "\n", + "\n", + "\n", + "Subject->SubjectProtocol\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dj.Diagram(schema)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Reading the Diagram\n", + "\n", + "DataJoint diagrams show tables as nodes and foreign keys as edges. The notation conveys relationship semantics at a glance.\n", + "\n", + "**Line Styles:**\n", + "\n", + "| Line | Style | Relationship | Meaning |\n", + "|------|-------|--------------|---------|\n", + "| ━━━ | Thick solid | Extension | FK **is** entire PK (one-to-one) |\n", + "| ─── | Thin solid | Containment | FK **in** PK with other fields (one-to-many) |\n", + "| β”„β”„β”„ | Dashed | Reference | FK in secondary attributes (one-to-many) |\n", + "\n", + "**Visual Indicators:**\n", + "\n", + "| Indicator | Meaning |\n", + "|-----------|---------|\n", + "| **Underlined name** | Introduces new dimension (new PK attributes) |\n", + "| Non-underlined name | Inherits all dimensions (PK entirely from FKs) |\n", + "| **Green** | Manual table |\n", + "| **Gray** | Lookup table |\n", + "| **Red** | Computed table |\n", + "| **Blue** | Imported table |\n", + "| **Orange dots** | Renamed foreign keys (via `.proj()`) |\n", + "\n", + "**Key principle:** Solid lines mean the parent's identity becomes part of the child's identity. Dashed lines mean the child maintains independent identity.\n", + "\n", + "**Note:** Diagrams do NOT show `[nullable]` or `[unique]` modifiersβ€”check table definitions for these constraints.\n", + "\n", + "See [How to Read Diagrams](../../how-to/read-diagrams.ipynb) for diagram operations and comparison to ER notation.\n", + "\n", + "## Insert Test Data and Populate" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:41.593499Z", + "iopub.status.busy": "2026-01-14T07:33:41.593350Z", + "iopub.status.idle": "2026-01-14T07:33:41.601944Z", + "shell.execute_reply": "2026-01-14T07:33:41.601695Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Inserted 20 trials\n" + ] + } + ], + "source": [ + "# Insert trials for the first session\n", + "import random\n", + "random.seed(42)\n", + "\n", + "trials = []\n", + "for i in range(20):\n", + " correct = random.random() > 0.3\n", + " trials.append({\n", + " 'subject_id': 'M001',\n", + " 'session_idx': 1,\n", + " 'trial_idx': i + 1,\n", + " 'stimulus': random.choice(['left', 'right']),\n", + " 'response': random.choice(['go', 'nogo']),\n", + " 'correct': correct,\n", + " 'reaction_time': random.uniform(0.2, 0.8)\n", + " })\n", + "\n", + "Session.Trial.insert(trials, skip_duplicates=True)\n", + "print(f\"Inserted {len(Session.Trial())} trials\")" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:41.603479Z", + "iopub.status.busy": "2026-01-14T07:33:41.603359Z", + "iopub.status.idle": "2026-01-14T07:33:41.653886Z", + "shell.execute_reply": "2026-01-14T07:33:41.653482Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + "SessionSummary: 0%| | 0/3 [00:00\n", + " .Table{\n", + " border-collapse:collapse;\n", + " }\n", + " .Table th{\n", + " background: #A0A0A0; color: #ffffff; padding:2px 4px; border:#f0e0e0 1px solid;\n", + " font-weight: normal; font-family: monospace; font-size: 75%; text-align: center;\n", + " }\n", + " .Table th p{\n", + " margin: 0;\n", + " }\n", + " .Table td{\n", + " padding:2px 4px; border:#f0e0e0 1px solid; font-size: 75%;\n", + " }\n", + " .Table tr:nth-child(odd){\n", + " background: #ffffff;\n", + " color: #000000;\n", + " }\n", + " .Table tr:nth-child(even){\n", + " background: #f3f1ff;\n", + " color: #000000;\n", + " }\n", + " /* Tooltip container */\n", + " .djtooltip {\n", + " }\n", + " /* Tooltip text */\n", + " .djtooltip .djtooltiptext {\n", + " visibility: hidden;\n", + " width: 120px;\n", + " background-color: black;\n", + " color: #fff;\n", + " text-align: center;\n", + " padding: 5px 0;\n", + " border-radius: 6px;\n", + " /* Position the tooltip text - see examples below! */\n", + " position: absolute;\n", + " z-index: 1;\n", + " }\n", + " #primary {\n", + " font-weight: bold;\n", + " color: black;\n", + " }\n", + " #nonprimary {\n", + " font-weight: normal;\n", + " color: white;\n", + " }\n", + "\n", + " /* Show the tooltip text when you mouse over the tooltip container */\n", + " .djtooltip:hover .djtooltiptext {\n", + " visibility: visible;\n", + " }\n", + "\n", + " /* Dark mode support */\n", + " @media (prefers-color-scheme: dark) {\n", + " .Table th{\n", + " background: #4a4a4a; color: #ffffff; border:#555555 1px solid; text-align: center;\n", + " }\n", + " .Table td{\n", + " border:#555555 1px solid;\n", + " }\n", + " .Table tr:nth-child(odd){\n", + " background: #2d2d2d;\n", + " color: #e0e0e0;\n", + " }\n", + " .Table tr:nth-child(even){\n", + " background: #3d3d3d;\n", + " color: #e0e0e0;\n", + " }\n", + " .djtooltip .djtooltiptext {\n", + " background-color: #555555;\n", + " color: #ffffff;\n", + " }\n", + " #primary {\n", + " color: #bd93f9;\n", + " }\n", + " #nonprimary {\n", + " color: #e0e0e0;\n", + " }\n", + " }\n", + " \n", + " \n", + " Summary statistics for a session\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

session_idx

\n", + " session number for this subject\n", + "
\n", + "

num_trials

\n", + " \n", + "
\n", + "

num_correct

\n", + " \n", + "
\n", + "

accuracy

\n", + " \n", + "
\n", + "

mean_reaction_time

\n", + " \n", + "
M001120140.70.536391
M0012000.00.0
M0013000.00.0
\n", + " \n", + "

Total: 3

\n", + " " + ], + "text/plain": [ + "*subject_id *session_idx num_trials num_correct accuracy mean_reaction_\n", + "+------------+ +------------+ +------------+ +------------+ +----------+ +------------+\n", + "M001 1 20 14 0.7 0.536391 \n", + "M001 2 0 0 0.0 0.0 \n", + "M001 3 0 0 0.0 0.0 \n", + " (Total: 3)" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Populate the computed summary\n", + "SessionSummary.populate(display_progress=True)\n", + "SessionSummary()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Best Practices\n", + "\n", + "### 1. Choose Meaningful Primary Keys\n", + "- Use natural identifiers when possible (`subject_id = 'M001'`)\n", + "- Keep keys minimal but sufficient for uniqueness\n", + "\n", + "### 2. Use Appropriate Table Tiers\n", + "- **Manual**: Data entered by operators or instruments\n", + "- **Lookup**: Configuration, parameters, reference data\n", + "- **Imported**: Data read from files (recordings, images)\n", + "- **Computed**: Derived analyses and summaries\n", + "\n", + "### 3. Normalize Your Data\n", + "- Don't repeat information across rows\n", + "- Create separate tables for distinct entities\n", + "- Use foreign keys to link related data\n", + "\n", + "### 4. Use Core DataJoint Types\n", + "\n", + "DataJoint has a three-layer type architecture (see [Type System Specification](../reference/specs/type-system.md)):\n", + "\n", + "1. **Native database types** (Layer 1): Backend-specific types like `INT`, `FLOAT`, `TINYINT UNSIGNED`. These are **discouraged** but allowed for backward compatibility.\n", + "\n", + "2. **Core DataJoint types** (Layer 2): Standardized, scientist-friendly types that work identically across MySQL and PostgreSQL. **Always prefer these.**\n", + "\n", + "3. **Codec types** (Layer 3): Types with `encode()`/`decode()` semantics like ``, ``, ``.\n", + "\n", + "**Core types used in this tutorial:**\n", + "\n", + "| Type | Description | Example |\n", + "|------|-------------|---------|\n", + "| `uint8`, `uint16`, `int32` | Sized integers | `session_idx : uint16` |\n", + "| `float32`, `float64` | Sized floats | `reaction_time : float32` |\n", + "| `varchar(n)` | Variable-length string | `name : varchar(100)` |\n", + "| `bool` | Boolean | `correct : bool` |\n", + "| `date` | Date only | `date_of_birth : date` |\n", + "| `datetime` | Date and time (UTC) | `created_at : datetime` |\n", + "| `enum(...)` | Enumeration | `sex : enum('M', 'F', 'U')` |\n", + "| `json` | JSON document | `task_params : json` |\n", + "| `uuid` | Universally unique ID | `experimenter_id : uuid` |\n", + "\n", + "**Why native types are allowed but discouraged:**\n", + "\n", + "Native types (like `int`, `float`, `tinyint`) are passed through to the database but generate a **warning at declaration time**. They are discouraged because:\n", + "- They lack explicit size information\n", + "- They are not portable across database backends\n", + "- They are not recorded in field metadata for reconstruction\n", + "\n", + "If you see a warning like `\"Native type 'int' used; consider 'int32' instead\"`, update your definition to use the corresponding core type.\n", + "\n", + "### 5. Document Your Tables\n", + "- Add comments after `#` in definitions\n", + "- Document units in attribute comments\n", + "\n", + "## Key Concepts Recap\n", + "\n", + "| Concept | Description |\n", + "|---------|-------------|\n", + "| **Primary Key** | Attributes above `---` that uniquely identify rows |\n", + "| **Secondary Attributes** | Attributes below `---` that store additional data |\n", + "| **Foreign Key** (`->`) | Reference to another table, imports its primary key |\n", + "| **One-to-Many** | FK in primary key: parent has many children |\n", + "| **One-to-One** | FK is entire primary key: exactly one child per parent |\n", + "| **Master-Part** | Compositional integrity: master and parts inserted/deleted atomically |\n", + "| **Nullable FK** | `[nullable]` makes the reference optional |\n", + "| **Lookup Table** | Pre-populated reference data |\n", + "\n", + "## Next Steps\n", + "\n", + "- [Data Entry](03-data-entry.ipynb) β€” Inserting, updating, and deleting data\n", + "- [Queries](04-queries.ipynb) β€” Filtering, joining, and projecting\n", + "- [Computation](05-computation.ipynb) β€” Building computational pipelines" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:41.655657Z", + "iopub.status.busy": "2026-01-14T07:33:41.655508Z", + "iopub.status.idle": "2026-01-14T07:33:41.698792Z", + "shell.execute_reply": "2026-01-14T07:33:41.698419Z" + } + }, + "outputs": [], + "source": [ + "# Cleanup\n", + "schema.drop(prompt=False)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/src/tutorials/basics/03-data-entry.ipynb b/src/tutorials/basics/03-data-entry.ipynb new file mode 100644 index 00000000..6838804e --- /dev/null +++ b/src/tutorials/basics/03-data-entry.ipynb @@ -0,0 +1,1651 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "cell-0", + "metadata": {}, + "source": [ + "# Data Entry\n", + "\n", + "This tutorial covers how to manipulate data in DataJoint tables. You'll learn:\n", + "\n", + "- **Insert** β€” Adding rows to tables\n", + "- **Update** β€” Modifying existing rows (for corrections)\n", + "- **Delete** β€” Removing rows with cascading\n", + "- **Validation** β€” Checking data before insertion\n", + "\n", + "DataJoint is designed around **insert** and **delete** as the primary operations. Updates are intentionally limited to surgical corrections." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "cell-1", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:46.340398Z", + "iopub.status.busy": "2026-01-14T07:33:46.340278Z", + "iopub.status.idle": "2026-01-14T07:33:47.094069Z", + "shell.execute_reply": "2026-01-14T07:33:47.093762Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2026-01-14 01:33:47,086][INFO]: DataJoint 2.0.0a22 connected to root@127.0.0.1:3306\n" + ] + } + ], + "source": [ + "import datajoint as dj\n", + "import numpy as np\n", + "\n", + "schema = dj.Schema('tutorial_data_entry')" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "cell-2", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:47.095903Z", + "iopub.status.busy": "2026-01-14T07:33:47.095665Z", + "iopub.status.idle": "2026-01-14T07:33:47.203044Z", + "shell.execute_reply": "2026-01-14T07:33:47.202647Z" + } + }, + "outputs": [], + "source": [ + "# Define tables for this tutorial\n", + "@schema\n", + "class Lab(dj.Manual):\n", + " definition = \"\"\"\n", + " lab_id : varchar(16)\n", + " ---\n", + " lab_name : varchar(100)\n", + " \"\"\"\n", + "\n", + "@schema\n", + "class Subject(dj.Manual):\n", + " definition = \"\"\"\n", + " subject_id : varchar(16)\n", + " ---\n", + " -> Lab\n", + " species : varchar(50)\n", + " date_of_birth : date\n", + " notes = '' : varchar(1000)\n", + " \"\"\"\n", + "\n", + "@schema\n", + "class Session(dj.Manual):\n", + " definition = \"\"\"\n", + " -> Subject\n", + " session_idx : uint16\n", + " ---\n", + " session_date : date\n", + " duration : float32 # minutes\n", + " \"\"\"\n", + "\n", + " class Trial(dj.Part):\n", + " definition = \"\"\"\n", + " -> master\n", + " trial_idx : uint16\n", + " ---\n", + " outcome : enum('hit', 'miss', 'false_alarm', 'correct_reject')\n", + " reaction_time : float32 # seconds\n", + " \"\"\"\n", + "\n", + "@schema\n", + "class ProcessedData(dj.Computed):\n", + " definition = \"\"\"\n", + " -> Session\n", + " ---\n", + " hit_rate : float32\n", + " \"\"\"\n", + " \n", + " def make(self, key):\n", + " outcomes = (Session.Trial & key).to_arrays('outcome')\n", + " n_trials = len(outcomes)\n", + " hit_rate = np.sum(outcomes == 'hit') / n_trials if n_trials else 0.0\n", + " self.insert1({**key, 'hit_rate': hit_rate})" + ] + }, + { + "cell_type": "markdown", + "id": "cell-3", + "metadata": {}, + "source": [ + "## Insert Operations\n", + "\n", + "### `insert1()` β€” Single Row\n", + "\n", + "Use `insert1()` to add a single row as a dictionary:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "cell-4", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:47.204813Z", + "iopub.status.busy": "2026-01-14T07:33:47.204690Z", + "iopub.status.idle": "2026-01-14T07:33:47.215108Z", + "shell.execute_reply": "2026-01-14T07:33:47.214824Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

lab_id

\n", + " \n", + "
\n", + "

species

\n", + " \n", + "
\n", + "

date_of_birth

\n", + " \n", + "
\n", + "

notes

\n", + " \n", + "
M001toliasMus musculus2026-01-15
\n", + " \n", + "

Total: 1

\n", + " " + ], + "text/plain": [ + "*subject_id lab_id species date_of_birth notes \n", + "+------------+ +--------+ +------------+ +------------+ +-------+\n", + "M001 tolias Mus musculus 2026-01-15 \n", + " (Total: 1)" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Insert a single row\n", + "Lab.insert1({'lab_id': 'tolias', 'lab_name': 'Tolias Lab'})\n", + "\n", + "Subject.insert1({\n", + " 'subject_id': 'M001',\n", + " 'lab_id': 'tolias',\n", + " 'species': 'Mus musculus',\n", + " 'date_of_birth': '2026-01-15'\n", + "})\n", + "\n", + "Subject()" + ] + }, + { + "cell_type": "markdown", + "id": "cell-5", + "metadata": {}, + "source": [ + "### `insert()` β€” Multiple Rows\n", + "\n", + "Use `insert()` to add multiple rows at once. This is more efficient than calling `insert1()` in a loop." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "cell-6", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:47.216524Z", + "iopub.status.busy": "2026-01-14T07:33:47.216407Z", + "iopub.status.idle": "2026-01-14T07:33:47.222478Z", + "shell.execute_reply": "2026-01-14T07:33:47.222166Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

lab_id

\n", + " \n", + "
\n", + "

species

\n", + " \n", + "
\n", + "

date_of_birth

\n", + " \n", + "
\n", + "

notes

\n", + " \n", + "
M001toliasMus musculus2026-01-15
M002toliasMus musculus2026-02-01
M003toliasMus musculus2026-02-15
\n", + " \n", + "

Total: 3

\n", + " " + ], + "text/plain": [ + "*subject_id lab_id species date_of_birth notes \n", + "+------------+ +--------+ +------------+ +------------+ +-------+\n", + "M001 tolias Mus musculus 2026-01-15 \n", + "M002 tolias Mus musculus 2026-02-01 \n", + "M003 tolias Mus musculus 2026-02-15 \n", + " (Total: 3)" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Insert multiple rows as a list of dictionaries\n", + "Subject.insert([\n", + " {\n", + " 'subject_id': 'M002',\n", + " 'lab_id': 'tolias',\n", + " 'species': 'Mus musculus',\n", + " 'date_of_birth': '2026-02-01'\n", + " },\n", + " {\n", + " 'subject_id': 'M003',\n", + " 'lab_id': 'tolias',\n", + " 'species': 'Mus musculus',\n", + " 'date_of_birth': '2026-02-15'\n", + " },\n", + "])\n", + "\n", + "Subject()" + ] + }, + { + "cell_type": "markdown", + "id": "cell-7", + "metadata": {}, + "source": [ + "### Accepted Input Formats\n", + "\n", + "`insert()` accepts several formats:\n", + "\n", + "| Format | Example |\n", + "|--------|--------|\n", + "| List of dicts | `[{'id': 1, 'name': 'A'}, ...]` |\n", + "| pandas DataFrame | `pd.DataFrame({'id': [1, 2], 'name': ['A', 'B']})` |\n", + "| numpy structured array | `np.array([(1, 'A')], dtype=[('id', int), ('name', 'U10')])` |\n", + "| QueryExpression | `OtherTable.proj(...)` (INSERT...SELECT) |" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "cell-8", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:47.223892Z", + "iopub.status.busy": "2026-01-14T07:33:47.223777Z", + "iopub.status.idle": "2026-01-14T07:33:47.232188Z", + "shell.execute_reply": "2026-01-14T07:33:47.231816Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Total subjects: 5\n" + ] + } + ], + "source": [ + "# Insert from pandas DataFrame\n", + "import pandas as pd\n", + "\n", + "df = pd.DataFrame({\n", + " 'subject_id': ['M004', 'M005'],\n", + " 'lab_id': ['tolias', 'tolias'],\n", + " 'species': ['Mus musculus', 'Mus musculus'],\n", + " 'date_of_birth': ['2026-03-01', '2026-03-15']\n", + "})\n", + "\n", + "Subject.insert(df)\n", + "print(f\"Total subjects: {len(Subject())}\")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-9", + "metadata": {}, + "source": [ + "### Handling Duplicates\n", + "\n", + "By default, inserting a row with an existing primary key raises an error:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "cell-10", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:47.233977Z", + "iopub.status.busy": "2026-01-14T07:33:47.233848Z", + "iopub.status.idle": "2026-01-14T07:33:47.236803Z", + "shell.execute_reply": "2026-01-14T07:33:47.236550Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Error: DuplicateError\n", + "Cannot insert duplicate primary key!\n" + ] + } + ], + "source": [ + "# This will raise an error - duplicate primary key\n", + "try:\n", + " Subject.insert1({'subject_id': 'M001', 'lab_id': 'tolias', \n", + " 'species': 'Mus musculus', 'date_of_birth': '2026-01-15'})\n", + "except Exception as e:\n", + " print(f\"Error: {type(e).__name__}\")\n", + " print(\"Cannot insert duplicate primary key!\")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-11", + "metadata": {}, + "source": [ + "Use `skip_duplicates=True` to silently skip rows with existing keys:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "cell-12", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:47.238431Z", + "iopub.status.busy": "2026-01-14T07:33:47.238300Z", + "iopub.status.idle": "2026-01-14T07:33:47.241745Z", + "shell.execute_reply": "2026-01-14T07:33:47.241473Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Insert completed (duplicate skipped)\n" + ] + } + ], + "source": [ + "# Skip duplicates - existing row unchanged\n", + "Subject.insert1(\n", + " {'subject_id': 'M001', 'lab_id': 'tolias', 'species': 'Mus musculus', 'date_of_birth': '2026-01-15'},\n", + " skip_duplicates=True\n", + ")\n", + "print(\"Insert completed (duplicate skipped)\")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-13", + "metadata": {}, + "source": [ + "**Note:** `replace=True` is also available but has the same caveats as `update1()`β€”it bypasses immutability and can break provenance. Use sparingly for corrections only." + ] + }, + { + "cell_type": "markdown", + "id": "cell-15", + "metadata": {}, + "source": [ + "### Extra Fields\n", + "\n", + "By default, inserting a row with fields not in the table raises an error:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "cell-16", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:47.243026Z", + "iopub.status.busy": "2026-01-14T07:33:47.242947Z", + "iopub.status.idle": "2026-01-14T07:33:47.244907Z", + "shell.execute_reply": "2026-01-14T07:33:47.244682Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Error: KeyError\n", + "Field 'unknown_field' not in table!\n" + ] + } + ], + "source": [ + "try:\n", + " Subject.insert1({'subject_id': 'M006', 'lab_id': 'tolias', \n", + " 'species': 'Mus musculus', 'date_of_birth': '2026-04-01',\n", + " 'unknown_field': 'some value'}) # Unknown field!\n", + "except Exception as e:\n", + " print(f\"Error: {type(e).__name__}\")\n", + " print(\"Field 'unknown_field' not in table!\")" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "cell-17", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:47.246063Z", + "iopub.status.busy": "2026-01-14T07:33:47.245976Z", + "iopub.status.idle": "2026-01-14T07:33:47.249866Z", + "shell.execute_reply": "2026-01-14T07:33:47.249648Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Total subjects: 6\n" + ] + } + ], + "source": [ + "# Use ignore_extra_fields=True to silently ignore unknown fields\n", + "Subject.insert1(\n", + " {'subject_id': 'M006', 'lab_id': 'tolias', 'species': 'Mus musculus',\n", + " 'date_of_birth': '2026-04-01', 'unknown_field': 'ignored'},\n", + " ignore_extra_fields=True\n", + ")\n", + "print(f\"Total subjects: {len(Subject())}\")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-18", + "metadata": {}, + "source": [ + "## Master-Part Tables and Transactions\n", + "\n", + "**Compositional integrity** means that a master and all its parts must be inserted (or deleted) as an atomic unit. This ensures downstream computations see complete data.\n", + "\n", + "- **Auto-populated tables** (Computed, Imported) enforce this automaticallyβ€”`make()` runs in a transaction\n", + "- **Manual tables** require explicit transactions to maintain compositional integrity\n", + "\n", + "### Inserting Master with Parts" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "cell-19", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:47.251081Z", + "iopub.status.busy": "2026-01-14T07:33:47.250986Z", + "iopub.status.idle": "2026-01-14T07:33:47.265715Z", + "shell.execute_reply": "2026-01-14T07:33:47.265458Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

session_idx

\n", + " \n", + "
\n", + "

trial_idx

\n", + " \n", + "
\n", + "

outcome

\n", + " \n", + "
\n", + "

reaction_time

\n", + " seconds\n", + "
M00111hit0.35
M00112miss0.82
M00113hit0.41
M00114false_alarm0.28
M00115hit0.39
\n", + " \n", + "

Total: 5

\n", + " " + ], + "text/plain": [ + "*subject_id *session_idx *trial_idx outcome reaction_time \n", + "+------------+ +------------+ +-----------+ +------------+ +------------+\n", + "M001 1 1 hit 0.35 \n", + "M001 1 2 miss 0.82 \n", + "M001 1 3 hit 0.41 \n", + "M001 1 4 false_alarm 0.28 \n", + "M001 1 5 hit 0.39 \n", + " (Total: 5)" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Use a transaction to ensure master and parts are inserted atomically\n", + "with dj.conn().transaction:\n", + " Session.insert1({\n", + " 'subject_id': 'M001',\n", + " 'session_idx': 1,\n", + " 'session_date': '2026-01-06',\n", + " 'duration': 45.5\n", + " })\n", + " Session.Trial.insert([\n", + " {'subject_id': 'M001', 'session_idx': 1, 'trial_idx': 1,\n", + " 'outcome': 'hit', 'reaction_time': 0.35},\n", + " {'subject_id': 'M001', 'session_idx': 1, 'trial_idx': 2,\n", + " 'outcome': 'miss', 'reaction_time': 0.82},\n", + " {'subject_id': 'M001', 'session_idx': 1, 'trial_idx': 3,\n", + " 'outcome': 'hit', 'reaction_time': 0.41},\n", + " {'subject_id': 'M001', 'session_idx': 1, 'trial_idx': 4,\n", + " 'outcome': 'false_alarm', 'reaction_time': 0.28},\n", + " {'subject_id': 'M001', 'session_idx': 1, 'trial_idx': 5,\n", + " 'outcome': 'hit', 'reaction_time': 0.39},\n", + " ])\n", + "\n", + "# Both master and parts committed together, or neither if error occurred\n", + "Session.Trial()" + ] + }, + { + "cell_type": "markdown", + "id": "cell-20", + "metadata": {}, + "source": [ + "## Update Operations\n", + "\n", + "DataJoint provides only `update1()` for modifying single rows. This is intentionalβ€”updates bypass the normal workflow and should be used sparingly for **corrective operations**.\n", + "\n", + "### When to Use Updates\n", + "\n", + "**Appropriate uses:**\n", + "- Fixing data entry errors (typos, wrong values)\n", + "- Adding notes or metadata after the fact\n", + "- Administrative corrections\n", + "\n", + "**Inappropriate uses** (use delete + insert + populate instead):\n", + "- Regular workflow operations\n", + "- Changes that should trigger recomputation" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "cell-21", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:47.267126Z", + "iopub.status.busy": "2026-01-14T07:33:47.267004Z", + "iopub.status.idle": "2026-01-14T07:33:47.271936Z", + "shell.execute_reply": "2026-01-14T07:33:47.271671Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'subject_id': 'M001',\n", + " 'lab_id': 'tolias',\n", + " 'species': 'Mus musculus',\n", + " 'date_of_birth': datetime.date(2026, 1, 15),\n", + " 'notes': 'Primary subject for behavioral study'}" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Update a single row - must provide all primary key values\n", + "Subject.update1({'subject_id': 'M001', 'notes': 'Primary subject for behavioral study'})\n", + "\n", + "(Subject & 'subject_id=\"M001\"').fetch1()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "cell-22", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:47.273159Z", + "iopub.status.busy": "2026-01-14T07:33:47.273073Z", + "iopub.status.idle": "2026-01-14T07:33:47.277729Z", + "shell.execute_reply": "2026-01-14T07:33:47.277508Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'subject_id': 'M002',\n", + " 'lab_id': 'tolias',\n", + " 'species': 'Mus musculus (C57BL/6)',\n", + " 'date_of_birth': datetime.date(2026, 2, 1),\n", + " 'notes': 'Control group'}" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Update multiple attributes at once\n", + "Subject.update1({\n", + " 'subject_id': 'M002',\n", + " 'notes': 'Control group',\n", + " 'species': 'Mus musculus (C57BL/6)' # More specific\n", + "})\n", + "\n", + "(Subject & 'subject_id=\"M002\"').fetch1()" + ] + }, + { + "cell_type": "markdown", + "id": "cell-23", + "metadata": {}, + "source": [ + "### Update Requirements\n", + "\n", + "1. **Complete primary key**: All PK attributes must be provided\n", + "2. **Exactly one match**: Must match exactly one existing row\n", + "3. **No restrictions**: Cannot call on a restricted table" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "cell-24", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:47.278982Z", + "iopub.status.busy": "2026-01-14T07:33:47.278873Z", + "iopub.status.idle": "2026-01-14T07:33:47.280761Z", + "shell.execute_reply": "2026-01-14T07:33:47.280529Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Error: DataJointError\n", + "Primary key must be complete\n" + ] + } + ], + "source": [ + "# Error: incomplete primary key\n", + "try:\n", + " Subject.update1({'notes': 'Missing subject_id!'})\n", + "except Exception as e:\n", + " print(f\"Error: {type(e).__name__}\")\n", + " print(\"Primary key must be complete\")" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "cell-25", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:47.281858Z", + "iopub.status.busy": "2026-01-14T07:33:47.281763Z", + "iopub.status.idle": "2026-01-14T07:33:47.283689Z", + "shell.execute_reply": "2026-01-14T07:33:47.283501Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Error: DataJointError\n", + "Cannot update restricted table\n" + ] + } + ], + "source": [ + "# Error: cannot update restricted table\n", + "try:\n", + " (Subject & 'subject_id=\"M001\"').update1({'subject_id': 'M001', 'notes': 'test'})\n", + "except Exception as e:\n", + " print(f\"Error: {type(e).__name__}\")\n", + " print(\"Cannot update restricted table\")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-26", + "metadata": {}, + "source": [ + "### Reset to Default\n", + "\n", + "Setting an attribute to `None` resets it to its default value:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "cell-27", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:47.284858Z", + "iopub.status.busy": "2026-01-14T07:33:47.284765Z", + "iopub.status.idle": "2026-01-14T07:33:47.288225Z", + "shell.execute_reply": "2026-01-14T07:33:47.288017Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'subject_id': 'M003',\n", + " 'lab_id': 'tolias',\n", + " 'species': 'Mus musculus',\n", + " 'date_of_birth': datetime.date(2026, 2, 15),\n", + " 'notes': ''}" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Reset notes to default (empty string)\n", + "Subject.update1({'subject_id': 'M003', 'notes': None})\n", + "\n", + "(Subject & 'subject_id=\"M003\"').fetch1()" + ] + }, + { + "cell_type": "markdown", + "id": "cell-28", + "metadata": {}, + "source": [ + "## Delete Operations\n", + "\n", + "### Cascading Deletes\n", + "\n", + "Deleting a row automatically cascades to all dependent tables. This maintains referential integrity across the pipeline." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "cell-29", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:47.289495Z", + "iopub.status.busy": "2026-01-14T07:33:47.289385Z", + "iopub.status.idle": "2026-01-14T07:33:47.313873Z", + "shell.execute_reply": "2026-01-14T07:33:47.313590Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Sessions: 1\n", + "Trials: 5\n", + "ProcessedData: 1\n" + ] + } + ], + "source": [ + "# First, let's see what we have\n", + "print(f\"Sessions: {len(Session())}\")\n", + "print(f\"Trials: {len(Session.Trial())}\")\n", + "\n", + "# Populate computed table\n", + "ProcessedData.populate()\n", + "print(f\"ProcessedData: {len(ProcessedData())}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "cell-30", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:47.315316Z", + "iopub.status.busy": "2026-01-14T07:33:47.315193Z", + "iopub.status.idle": "2026-01-14T07:33:47.333169Z", + "shell.execute_reply": "2026-01-14T07:33:47.332840Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2026-01-14 01:33:47,322][INFO]: Deleting 1 rows from `tutorial_data_entry`.`__processed_data`\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2026-01-14 01:33:47,327][INFO]: Deleting 5 rows from `tutorial_data_entry`.`session__trial`\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2026-01-14 01:33:47,328][INFO]: Deleting 1 rows from `tutorial_data_entry`.`session`\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "After delete:\n", + "Sessions: 0\n", + "Trials: 0\n", + "ProcessedData: 0\n" + ] + } + ], + "source": [ + "# Delete a session - cascades to Trial and ProcessedData\n", + "(Session & {'subject_id': 'M001', 'session_idx': 1}).delete(prompt=False)\n", + "\n", + "print(f\"After delete:\")\n", + "print(f\"Sessions: {len(Session())}\")\n", + "print(f\"Trials: {len(Session.Trial())}\")\n", + "print(f\"ProcessedData: {len(ProcessedData())}\")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-31", + "metadata": {}, + "source": [ + "### Prompt Behavior\n", + "\n", + "The `prompt` parameter controls whether `delete()` asks for confirmation. When `prompt=None` (default), the behavior is determined by `dj.config['safemode']`:\n", + "\n", + "```python\n", + "# Uses config['safemode'] setting (default)\n", + "(Table & condition).delete()\n", + "\n", + "# Explicitly skip confirmation\n", + "(Table & condition).delete(prompt=False)\n", + "\n", + "# Explicitly require confirmation\n", + "(Table & condition).delete(prompt=True)\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "cell-32", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:47.334805Z", + "iopub.status.busy": "2026-01-14T07:33:47.334664Z", + "iopub.status.idle": "2026-01-14T07:33:47.347762Z", + "shell.execute_reply": "2026-01-14T07:33:47.347471Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2026-01-14 01:33:47,343][INFO]: Deleting 2 rows from `tutorial_data_entry`.`session__trial`\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2026-01-14 01:33:47,344][INFO]: Deleting 1 rows from `tutorial_data_entry`.`session`\n" + ] + }, + { + "data": { + "text/plain": [ + "1" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Add more data for demonstration\n", + "with dj.conn().transaction:\n", + " Session.insert1({\n", + " 'subject_id': 'M002',\n", + " 'session_idx': 1,\n", + " 'session_date': '2026-01-07',\n", + " 'duration': 30.0\n", + " })\n", + " Session.Trial.insert([\n", + " {'subject_id': 'M002', 'session_idx': 1, 'trial_idx': 1,\n", + " 'outcome': 'hit', 'reaction_time': 0.40},\n", + " {'subject_id': 'M002', 'session_idx': 1, 'trial_idx': 2,\n", + " 'outcome': 'hit', 'reaction_time': 0.38},\n", + " ])\n", + "\n", + "# Delete with prompt=False (no confirmation prompt)\n", + "(Session & {'subject_id': 'M002', 'session_idx': 1}).delete(prompt=False)" + ] + }, + { + "cell_type": "markdown", + "id": "cell-33", + "metadata": {}, + "source": [ + "### The Recomputation Pattern\n", + "\n", + "When source data needs to change, the correct pattern is **delete β†’ insert β†’ populate**. This ensures all derived data remains consistent:" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "cell-34", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:47.349099Z", + "iopub.status.busy": "2026-01-14T07:33:47.349003Z", + "iopub.status.idle": "2026-01-14T07:33:47.361384Z", + "shell.execute_reply": "2026-01-14T07:33:47.361147Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Before correction: {'subject_id': 'M003', 'session_idx': 1, 'hit_rate': 0.5}\n" + ] + } + ], + "source": [ + "# Add a session with trials (using transaction for compositional integrity)\n", + "with dj.conn().transaction:\n", + " Session.insert1({\n", + " 'subject_id': 'M003',\n", + " 'session_idx': 1,\n", + " 'session_date': '2026-01-08',\n", + " 'duration': 40.0\n", + " })\n", + " Session.Trial.insert([\n", + " {'subject_id': 'M003', 'session_idx': 1, 'trial_idx': 1,\n", + " 'outcome': 'hit', 'reaction_time': 0.35},\n", + " {'subject_id': 'M003', 'session_idx': 1, 'trial_idx': 2,\n", + " 'outcome': 'miss', 'reaction_time': 0.50},\n", + " ])\n", + "\n", + "# Compute results\n", + "ProcessedData.populate()\n", + "print(\"Before correction:\", ProcessedData.fetch1())" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "cell-35", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:47.362732Z", + "iopub.status.busy": "2026-01-14T07:33:47.362618Z", + "iopub.status.idle": "2026-01-14T07:33:47.387305Z", + "shell.execute_reply": "2026-01-14T07:33:47.386975Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2026-01-14 01:33:47,369][INFO]: Deleting 1 rows from `tutorial_data_entry`.`__processed_data`\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2026-01-14 01:33:47,373][INFO]: Deleting 2 rows from `tutorial_data_entry`.`session__trial`\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2026-01-14 01:33:47,374][INFO]: Deleting 1 rows from `tutorial_data_entry`.`session`\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "After correction: {'subject_id': 'M003', 'session_idx': 1, 'hit_rate': 1.0}\n" + ] + } + ], + "source": [ + "# Suppose we discovered trial 2 was actually a 'hit' not 'miss'\n", + "# WRONG: Updating the trial would leave ProcessedData stale!\n", + "# Session.Trial.update1({...}) # DON'T DO THIS\n", + "\n", + "# CORRECT: Delete, reinsert, recompute\n", + "key = {'subject_id': 'M003', 'session_idx': 1}\n", + "\n", + "# 1. Delete cascades to ProcessedData\n", + "(Session & key).delete(prompt=False)\n", + "\n", + "# 2. Reinsert with corrected data (using transaction)\n", + "with dj.conn().transaction:\n", + " Session.insert1({**key, 'session_date': '2026-01-08', 'duration': 40.0})\n", + " Session.Trial.insert([\n", + " {**key, 'trial_idx': 1, 'outcome': 'hit', 'reaction_time': 0.35},\n", + " {**key, 'trial_idx': 2, 'outcome': 'hit', 'reaction_time': 0.50},\n", + " ])\n", + "\n", + "# 3. Recompute\n", + "ProcessedData.populate()\n", + "print(\"After correction:\", ProcessedData.fetch1())" + ] + }, + { + "cell_type": "markdown", + "id": "cell-36", + "metadata": {}, + "source": [ + "## Validation\n", + "\n", + "Use `validate()` to check data before insertion:" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "cell-37", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:47.389058Z", + "iopub.status.busy": "2026-01-14T07:33:47.388912Z", + "iopub.status.idle": "2026-01-14T07:33:47.394818Z", + "shell.execute_reply": "2026-01-14T07:33:47.394210Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Inserted 2 rows\n" + ] + } + ], + "source": [ + "# Validate rows before inserting\n", + "rows_to_insert = [\n", + " {'subject_id': 'M007', 'lab_id': 'tolias', 'species': 'Mus musculus', 'date_of_birth': '2026-05-01'},\n", + " {'subject_id': 'M008', 'lab_id': 'tolias', 'species': 'Mus musculus', 'date_of_birth': '2026-05-15'},\n", + "]\n", + "\n", + "result = Subject.validate(rows_to_insert)\n", + "\n", + "if result:\n", + " Subject.insert(rows_to_insert)\n", + " print(f\"Inserted {len(rows_to_insert)} rows\")\n", + "else:\n", + " print(\"Validation failed:\")\n", + " print(result.summary())" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "cell-38", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:47.396851Z", + "iopub.status.busy": "2026-01-14T07:33:47.396659Z", + "iopub.status.idle": "2026-01-14T07:33:47.399318Z", + "shell.execute_reply": "2026-01-14T07:33:47.398972Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Validation failed!\n", + " (0, 'lab_id', \"Required field 'lab_id' is missing\")\n" + ] + } + ], + "source": [ + "# Example of validation failure\n", + "bad_rows = [\n", + " {'subject_id': 'M009', 'species': 'Mus musculus', 'date_of_birth': '2026-05-20'}, # Missing lab_id!\n", + "]\n", + "\n", + "result = Subject.validate(bad_rows)\n", + "\n", + "if not result:\n", + " print(\"Validation failed!\")\n", + " for error in result.errors:\n", + " print(f\" {error}\")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-39", + "metadata": {}, + "source": [ + "## Transactions\n", + "\n", + "Single operations are atomic by default. Use explicit transactions for:\n", + "\n", + "1. **Master-part inserts** β€” Maintain compositional integrity\n", + "2. **Multi-table operations** β€” All succeed or all fail\n", + "3. **Complex workflows** β€” Coordinate related changes" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "cell-40", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:47.400930Z", + "iopub.status.busy": "2026-01-14T07:33:47.400722Z", + "iopub.status.idle": "2026-01-14T07:33:47.408223Z", + "shell.execute_reply": "2026-01-14T07:33:47.407960Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Session inserted with 2 trials\n" + ] + } + ], + "source": [ + "# Atomic transaction - all inserts succeed or none do\n", + "with dj.conn().transaction:\n", + " Session.insert1({\n", + " 'subject_id': 'M007',\n", + " 'session_idx': 1,\n", + " 'session_date': '2026-01-10',\n", + " 'duration': 35.0\n", + " })\n", + " Session.Trial.insert([\n", + " {'subject_id': 'M007', 'session_idx': 1, 'trial_idx': 1,\n", + " 'outcome': 'hit', 'reaction_time': 0.33},\n", + " {'subject_id': 'M007', 'session_idx': 1, 'trial_idx': 2,\n", + " 'outcome': 'miss', 'reaction_time': 0.45},\n", + " ])\n", + "\n", + "print(f\"Session inserted with {len(Session.Trial & {'subject_id': 'M007'})} trials\")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-41", + "metadata": {}, + "source": [ + "## Best Practices\n", + "\n", + "### 1. Prefer Insert/Delete Over Update\n", + "\n", + "When source data changes, delete and reinsert rather than updating. Updates and `replace=True` bypass immutability and break provenance:\n", + "\n", + "```python\n", + "# Good: Delete and reinsert\n", + "(Trial & key).delete(prompt=False)\n", + "Trial.insert1(corrected_trial)\n", + "DerivedTable.populate()\n", + "\n", + "# Avoid: Update that leaves derived data stale\n", + "Trial.update1({**key, 'value': new_value})\n", + "```\n", + "\n", + "### 2. Use Transactions for Master-Part Inserts\n", + "\n", + "```python\n", + "# Ensures compositional integrity\n", + "with dj.conn().transaction:\n", + " Session.insert1(session_data)\n", + " Session.Trial.insert(trials)\n", + "```\n", + "\n", + "### 3. Batch Inserts for Performance\n", + "\n", + "```python\n", + "# Good: Single insert call\n", + "Subject.insert(all_rows)\n", + "\n", + "# Slow: Loop of insert1 calls\n", + "for row in all_rows:\n", + " Subject.insert1(row) # Creates many transactions\n", + "```\n", + "\n", + "### 4. Validate Before Insert\n", + "\n", + "```python\n", + "result = Subject.validate(rows)\n", + "if not result:\n", + " raise ValueError(result.summary())\n", + "Subject.insert(rows)\n", + "```\n", + "\n", + "### 5. Configure Safe Mode for Production\n", + "\n", + "```python\n", + "# In production scripts, explicitly control prompt behavior\n", + "(Subject & condition).delete(prompt=False) # No confirmation\n", + "\n", + "# Or configure globally via settings\n", + "dj.config['safemode'] = True # Require confirmation by default\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "cell-42", + "metadata": {}, + "source": [ + "## Quick Reference\n", + "\n", + "| Operation | Method | Use Case |\n", + "|-----------|--------|----------|\n", + "| Insert one | `insert1(row)` | Adding single entity |\n", + "| Insert many | `insert(rows)` | Bulk data loading |\n", + "| Update one | `update1(row)` | Surgical corrections only |\n", + "| Delete | `delete()` | Removing entities (cascades) |\n", + "| Delete quick | `delete_quick()` | Internal cleanup (no cascade) |\n", + "| Validate | `validate(rows)` | Pre-insert check |\n", + "\n", + "See the [Data Manipulation Specification](../reference/specs/data-manipulation.md) for complete details.\n", + "\n", + "## Next Steps\n", + "\n", + "- [Queries](04-queries.ipynb) β€” Filtering, joining, and projecting data\n", + "- [Computation](05-computation.ipynb) β€” Building computational pipelines" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "cell-43", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:47.409674Z", + "iopub.status.busy": "2026-01-14T07:33:47.409543Z", + "iopub.status.idle": "2026-01-14T07:33:47.427966Z", + "shell.execute_reply": "2026-01-14T07:33:47.427678Z" + } + }, + "outputs": [], + "source": [ + "# Cleanup\n", + "schema.drop(prompt=False)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/src/tutorials/basics/04-queries.ipynb b/src/tutorials/basics/04-queries.ipynb new file mode 100644 index 00000000..e5fad587 --- /dev/null +++ b/src/tutorials/basics/04-queries.ipynb @@ -0,0 +1,6477 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "cell-0", + "metadata": {}, + "source": [ + "# Queries\n", + "\n", + "This tutorial covers how to query data in DataJoint. You'll learn:\n", + "\n", + "- **Restriction** (`&`, `-`) β€” Filtering rows\n", + "- **Top** (`dj.Top`) β€” Limiting and ordering results\n", + "- **Projection** (`.proj()`) β€” Selecting and computing columns\n", + "- **Join** (`*`) β€” Combining tables\n", + "- **Extension** (`.extend()`) β€” Adding optional attributes\n", + "- **Aggregation** (`.aggr()`) β€” Grouping and summarizing\n", + "- **Fetching** β€” Retrieving data in various formats\n", + "\n", + "DataJoint queries are **lazy**β€”they build SQL expressions that execute only when you fetch data." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "cell-1", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:49.768740Z", + "iopub.status.busy": "2026-01-14T07:33:49.768629Z", + "iopub.status.idle": "2026-01-14T07:33:50.505538Z", + "shell.execute_reply": "2026-01-14T07:33:50.505202Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2026-01-14 01:33:50,498][INFO]: DataJoint 2.0.0a22 connected to root@127.0.0.1:3306\n" + ] + } + ], + "source": [ + "import datajoint as dj\n", + "import numpy as np\n", + "\n", + "schema = dj.Schema('tutorial_queries')" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "cell-2", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:50.507302Z", + "iopub.status.busy": "2026-01-14T07:33:50.507077Z", + "iopub.status.idle": "2026-01-14T07:33:50.600059Z", + "shell.execute_reply": "2026-01-14T07:33:50.599734Z" + } + }, + "outputs": [], + "source": [ + "# Define tables for this tutorial\n", + "@schema\n", + "class Subject(dj.Manual):\n", + " definition = \"\"\"\n", + " subject_id : varchar(16)\n", + " ---\n", + " species : varchar(50)\n", + " date_of_birth : date\n", + " sex : enum('M', 'F', 'U')\n", + " weight : float32 # grams\n", + " \"\"\"\n", + "\n", + "@schema\n", + "class Experimenter(dj.Manual):\n", + " definition = \"\"\"\n", + " experimenter_id : varchar(16)\n", + " ---\n", + " full_name : varchar(100)\n", + " \"\"\"\n", + "\n", + "@schema\n", + "class Session(dj.Manual):\n", + " definition = \"\"\"\n", + " -> Subject\n", + " session_idx : uint16\n", + " ---\n", + " -> Experimenter\n", + " session_date : date\n", + " duration : float32 # minutes\n", + " \"\"\"\n", + "\n", + " class Trial(dj.Part):\n", + " definition = \"\"\"\n", + " -> master\n", + " trial_idx : uint16\n", + " ---\n", + " stimulus : varchar(50)\n", + " response : varchar(50)\n", + " correct : bool\n", + " reaction_time : float32 # seconds\n", + " \"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "cell-3", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:50.601993Z", + "iopub.status.busy": "2026-01-14T07:33:50.601828Z", + "iopub.status.idle": "2026-01-14T07:33:50.623908Z", + "shell.execute_reply": "2026-01-14T07:33:50.623618Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Subjects: 4, Sessions: 5, Trials: 50\n" + ] + } + ], + "source": [ + "# Insert sample data\n", + "import random\n", + "random.seed(42)\n", + "\n", + "Experimenter.insert([\n", + " {'experimenter_id': 'alice', 'full_name': 'Alice Smith'},\n", + " {'experimenter_id': 'bob', 'full_name': 'Bob Jones'},\n", + "])\n", + "\n", + "subjects = [\n", + " {'subject_id': 'M001', 'species': 'Mus musculus',\n", + " 'date_of_birth': '2026-01-15', 'sex': 'M', 'weight': 25.3},\n", + " {'subject_id': 'M002', 'species': 'Mus musculus',\n", + " 'date_of_birth': '2026-02-01', 'sex': 'F', 'weight': 22.1},\n", + " {'subject_id': 'M003', 'species': 'Mus musculus',\n", + " 'date_of_birth': '2026-02-15', 'sex': 'M', 'weight': 26.8},\n", + " {'subject_id': 'R001', 'species': 'Rattus norvegicus',\n", + " 'date_of_birth': '2024-01-01', 'sex': 'F', 'weight': 280.5},\n", + "]\n", + "Subject.insert(subjects)\n", + "\n", + "# Insert sessions\n", + "sessions = [\n", + " {'subject_id': 'M001', 'session_idx': 1, 'experimenter_id': 'alice',\n", + " 'session_date': '2026-01-06', 'duration': 45.0},\n", + " {'subject_id': 'M001', 'session_idx': 2, 'experimenter_id': 'alice',\n", + " 'session_date': '2026-01-07', 'duration': 50.0},\n", + " {'subject_id': 'M002', 'session_idx': 1, 'experimenter_id': 'bob',\n", + " 'session_date': '2026-01-06', 'duration': 40.0},\n", + " {'subject_id': 'M002', 'session_idx': 2, 'experimenter_id': 'bob',\n", + " 'session_date': '2026-01-08', 'duration': 55.0},\n", + " {'subject_id': 'M003', 'session_idx': 1, 'experimenter_id': 'alice',\n", + " 'session_date': '2026-01-07', 'duration': 35.0},\n", + "]\n", + "Session.insert(sessions)\n", + "\n", + "# Insert trials\n", + "trials = []\n", + "for s in sessions:\n", + " for i in range(10):\n", + " trials.append({\n", + " 'subject_id': s['subject_id'],\n", + " 'session_idx': s['session_idx'],\n", + " 'trial_idx': i + 1,\n", + " 'stimulus': random.choice(['left', 'right']),\n", + " 'response': random.choice(['left', 'right']),\n", + " 'correct': random.random() > 0.3,\n", + " 'reaction_time': random.uniform(0.2, 0.8)\n", + " })\n", + "Session.Trial.insert(trials)\n", + "\n", + "print(f\"Subjects: {len(Subject())}, Sessions: {len(Session())}, \"\n", + " f\"Trials: {len(Session.Trial())}\")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-4", + "metadata": {}, + "source": [ + "## Restriction (`&` and `-`)\n", + "\n", + "Restriction filters rows based on conditions. Use `&` to select matching rows, `-` to exclude them.\n", + "\n", + "### String Conditions\n", + "\n", + "SQL expressions using attribute names:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "cell-5", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:50.625781Z", + "iopub.status.busy": "2026-01-14T07:33:50.625637Z", + "iopub.status.idle": "2026-01-14T07:33:50.632003Z", + "shell.execute_reply": "2026-01-14T07:33:50.631716Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

species

\n", + " \n", + "
\n", + "

date_of_birth

\n", + " \n", + "
\n", + "

sex

\n", + " \n", + "
\n", + "

weight

\n", + " grams\n", + "
M001Mus musculus2026-01-15M25.3
M003Mus musculus2026-02-15M26.8
R001Rattus norvegicus2024-01-01F280.5
\n", + " \n", + "

Total: 3

\n", + " " + ], + "text/plain": [ + "*subject_id species date_of_birth sex weight \n", + "+------------+ +------------+ +------------+ +-----+ +--------+\n", + "M001 Mus musculus 2026-01-15 M 25.3 \n", + "M003 Mus musculus 2026-02-15 M 26.8 \n", + "R001 Rattus norvegi 2024-01-01 F 280.5 \n", + " (Total: 3)" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Simple comparison\n", + "Subject & \"weight > 25\"" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "cell-6", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:50.633561Z", + "iopub.status.busy": "2026-01-14T07:33:50.633397Z", + "iopub.status.idle": "2026-01-14T07:33:50.638784Z", + "shell.execute_reply": "2026-01-14T07:33:50.638280Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

session_idx

\n", + " \n", + "
\n", + "

experimenter_id

\n", + " \n", + "
\n", + "

session_date

\n", + " \n", + "
\n", + "

duration

\n", + " minutes\n", + "
M0012alice2026-01-0750.0
M0022bob2026-01-0855.0
M0031alice2026-01-0735.0
\n", + " \n", + "

Total: 3

\n", + " " + ], + "text/plain": [ + "*subject_id *session_idx experimenter_i session_date duration \n", + "+------------+ +------------+ +------------+ +------------+ +----------+\n", + "M001 2 alice 2026-01-07 50.0 \n", + "M002 2 bob 2026-01-08 55.0 \n", + "M003 1 alice 2026-01-07 35.0 \n", + " (Total: 3)" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Date comparison\n", + "Session & \"session_date > '2026-01-06'\"" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "cell-7", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:50.640675Z", + "iopub.status.busy": "2026-01-14T07:33:50.640527Z", + "iopub.status.idle": "2026-01-14T07:33:50.645689Z", + "shell.execute_reply": "2026-01-14T07:33:50.645450Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

species

\n", + " \n", + "
\n", + "

date_of_birth

\n", + " \n", + "
\n", + "

sex

\n", + " \n", + "
\n", + "

weight

\n", + " grams\n", + "
M001Mus musculus2026-01-15M25.3
M003Mus musculus2026-02-15M26.8
\n", + " \n", + "

Total: 2

\n", + " " + ], + "text/plain": [ + "*subject_id species date_of_birth sex weight \n", + "+------------+ +------------+ +------------+ +-----+ +--------+\n", + "M001 Mus musculus 2026-01-15 M 25.3 \n", + "M003 Mus musculus 2026-02-15 M 26.8 \n", + " (Total: 2)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Multiple conditions with AND\n", + "Subject & \"sex = 'M' AND weight > 25\"" + ] + }, + { + "cell_type": "markdown", + "id": "cell-8", + "metadata": {}, + "source": [ + "### Dictionary Conditions\n", + "\n", + "Dictionaries specify exact matches:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "cell-9", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:50.646962Z", + "iopub.status.busy": "2026-01-14T07:33:50.646863Z", + "iopub.status.idle": "2026-01-14T07:33:50.651673Z", + "shell.execute_reply": "2026-01-14T07:33:50.651381Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

species

\n", + " \n", + "
\n", + "

date_of_birth

\n", + " \n", + "
\n", + "

sex

\n", + " \n", + "
\n", + "

weight

\n", + " grams\n", + "
M002Mus musculus2026-02-01F22.1
R001Rattus norvegicus2024-01-01F280.5
\n", + " \n", + "

Total: 2

\n", + " " + ], + "text/plain": [ + "*subject_id species date_of_birth sex weight \n", + "+------------+ +------------+ +------------+ +-----+ +--------+\n", + "M002 Mus musculus 2026-02-01 F 22.1 \n", + "R001 Rattus norvegi 2024-01-01 F 280.5 \n", + " (Total: 2)" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Single attribute\n", + "Subject & {'sex': 'F'}" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "cell-10", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:50.653675Z", + "iopub.status.busy": "2026-01-14T07:33:50.653478Z", + "iopub.status.idle": "2026-01-14T07:33:50.659219Z", + "shell.execute_reply": "2026-01-14T07:33:50.658778Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

session_idx

\n", + " \n", + "
\n", + "

experimenter_id

\n", + " \n", + "
\n", + "

session_date

\n", + " \n", + "
\n", + "

duration

\n", + " minutes\n", + "
M0011alice2026-01-0645.0
\n", + " \n", + "

Total: 1

\n", + " " + ], + "text/plain": [ + "*subject_id *session_idx experimenter_i session_date duration \n", + "+------------+ +------------+ +------------+ +------------+ +----------+\n", + "M001 1 alice 2026-01-06 45.0 \n", + " (Total: 1)" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Multiple attributes (AND)\n", + "Session & {'subject_id': 'M001', 'session_idx': 1}" + ] + }, + { + "cell_type": "markdown", + "id": "cell-11", + "metadata": {}, + "source": [ + "### Restriction by Query Expression\n", + "\n", + "Restrict by another query expression. DataJoint uses **semantic matching**: attributes with the same name are matched only if they share the same origin through foreign key lineage. This prevents accidental matches on unrelated attributes that happen to share names (like generic `id` columns in unrelated tables).\n", + "\n", + "See [Semantic Matching](../reference/specs/semantic-matching.md) for the full specification." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "cell-12", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:50.660933Z", + "iopub.status.busy": "2026-01-14T07:33:50.660799Z", + "iopub.status.idle": "2026-01-14T07:33:50.666551Z", + "shell.execute_reply": "2026-01-14T07:33:50.666196Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

species

\n", + " \n", + "
\n", + "

date_of_birth

\n", + " \n", + "
\n", + "

sex

\n", + " \n", + "
\n", + "

weight

\n", + " grams\n", + "
M001Mus musculus2026-01-15M25.3
M002Mus musculus2026-02-01F22.1
M003Mus musculus2026-02-15M26.8
\n", + " \n", + "

Total: 3

\n", + " " + ], + "text/plain": [ + "*subject_id species date_of_birth sex weight \n", + "+------------+ +------------+ +------------+ +-----+ +--------+\n", + "M001 Mus musculus 2026-01-15 M 25.3 \n", + "M002 Mus musculus 2026-02-01 F 22.1 \n", + "M003 Mus musculus 2026-02-15 M 26.8 \n", + " (Total: 3)" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Subjects that have at least one session\n", + "Subject & Session" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "cell-13", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:50.668094Z", + "iopub.status.busy": "2026-01-14T07:33:50.667973Z", + "iopub.status.idle": "2026-01-14T07:33:50.672883Z", + "shell.execute_reply": "2026-01-14T07:33:50.672601Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

species

\n", + " \n", + "
\n", + "

date_of_birth

\n", + " \n", + "
\n", + "

sex

\n", + " \n", + "
\n", + "

weight

\n", + " grams\n", + "
R001Rattus norvegicus2024-01-01F280.5
\n", + " \n", + "

Total: 1

\n", + " " + ], + "text/plain": [ + "*subject_id species date_of_birth sex weight \n", + "+------------+ +------------+ +------------+ +-----+ +--------+\n", + "R001 Rattus norvegi 2024-01-01 F 280.5 \n", + " (Total: 1)" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Subjects without any sessions (R001 has no sessions)\n", + "Subject - Session" + ] + }, + { + "cell_type": "markdown", + "id": "cell-14", + "metadata": {}, + "source": [ + "### Collection Conditions (OR)\n", + "\n", + "Lists create OR conditions:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "cell-15", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:50.674572Z", + "iopub.status.busy": "2026-01-14T07:33:50.674426Z", + "iopub.status.idle": "2026-01-14T07:33:50.679750Z", + "shell.execute_reply": "2026-01-14T07:33:50.679466Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

species

\n", + " \n", + "
\n", + "

date_of_birth

\n", + " \n", + "
\n", + "

sex

\n", + " \n", + "
\n", + "

weight

\n", + " grams\n", + "
M001Mus musculus2026-01-15M25.3
M002Mus musculus2026-02-01F22.1
\n", + " \n", + "

Total: 2

\n", + " " + ], + "text/plain": [ + "*subject_id species date_of_birth sex weight \n", + "+------------+ +------------+ +------------+ +-----+ +--------+\n", + "M001 Mus musculus 2026-01-15 M 25.3 \n", + "M002 Mus musculus 2026-02-01 F 22.1 \n", + " (Total: 2)" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Either of these subjects\n", + "Subject & [{'subject_id': 'M001'}, {'subject_id': 'M002'}]" + ] + }, + { + "cell_type": "markdown", + "id": "cell-16", + "metadata": {}, + "source": [ + "### Chaining Restrictions\n", + "\n", + "Sequential restrictions combine with AND:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "cell-17", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:50.681189Z", + "iopub.status.busy": "2026-01-14T07:33:50.681072Z", + "iopub.status.idle": "2026-01-14T07:33:50.684262Z", + "shell.execute_reply": "2026-01-14T07:33:50.684024Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Result 1: 2 rows\n", + "Result 2: 2 rows\n" + ] + } + ], + "source": [ + "# These are equivalent\n", + "result1 = Subject & \"sex = 'M'\" & \"weight > 25\"\n", + "result2 = (Subject & \"sex = 'M'\") & \"weight > 25\"\n", + "\n", + "print(f\"Result 1: {len(result1)} rows\")\n", + "print(f\"Result 2: {len(result2)} rows\")" + ] + }, + { + "cell_type": "markdown", + "id": "dfc7839ypxn", + "metadata": {}, + "source": [ + "### Top Restriction (`dj.Top`)\n", + "\n", + "`dj.Top` is a special restriction that limits and orders query results. Unlike fetch-time `order_by` and `limit`, `dj.Top` applies **within the query itself**, making it composable with other operators.\n", + "\n", + "```python\n", + "query & dj.Top(limit=N, order_by='attr DESC', offset=M)\n", + "```\n", + "\n", + "This is useful when you need the \"top N\" rows as part of a larger queryβ€”for example, the 5 highest-scoring trials per session." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "p5xnoujskl8", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:50.685467Z", + "iopub.status.busy": "2026-01-14T07:33:50.685379Z", + "iopub.status.idle": "2026-01-14T07:33:50.690116Z", + "shell.execute_reply": "2026-01-14T07:33:50.689839Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

species

\n", + " \n", + "
\n", + "

date_of_birth

\n", + " \n", + "
\n", + "

sex

\n", + " \n", + "
\n", + "

weight

\n", + " grams\n", + "
R001Rattus norvegicus2024-01-01F280.5
M003Mus musculus2026-02-15M26.8
\n", + " \n", + "

Total: 2

\n", + " " + ], + "text/plain": [ + "*subject_id species date_of_birth sex weight \n", + "+------------+ +------------+ +------------+ +-----+ +--------+\n", + "R001 Rattus norvegi 2024-01-01 F 280.5 \n", + "M003 Mus musculus 2026-02-15 M 26.8 \n", + " (Total: 2)" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Top 2 heaviest subjects\n", + "Subject & dj.Top(limit=2, order_by='weight DESC')" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "hpibg94qotw", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:50.691373Z", + "iopub.status.busy": "2026-01-14T07:33:50.691268Z", + "iopub.status.idle": "2026-01-14T07:33:50.696180Z", + "shell.execute_reply": "2026-01-14T07:33:50.695914Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

species

\n", + " \n", + "
\n", + "

date_of_birth

\n", + " \n", + "
\n", + "

sex

\n", + " \n", + "
\n", + "

weight

\n", + " grams\n", + "
M001Mus musculus2026-01-15M25.3
M002Mus musculus2026-02-01F22.1
\n", + " \n", + "

Total: 2

\n", + " " + ], + "text/plain": [ + "*subject_id species date_of_birth sex weight \n", + "+------------+ +------------+ +------------+ +-----+ +--------+\n", + "M001 Mus musculus 2026-01-15 M 25.3 \n", + "M002 Mus musculus 2026-02-01 F 22.1 \n", + " (Total: 2)" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Skip first 2, then get next 2 (pagination)\n", + "Subject & dj.Top(limit=2, order_by='weight DESC', offset=2)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "lrsq7ozuhuj", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:50.697389Z", + "iopub.status.busy": "2026-01-14T07:33:50.697305Z", + "iopub.status.idle": "2026-01-14T07:33:50.701858Z", + "shell.execute_reply": "2026-01-14T07:33:50.701610Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

species

\n", + " \n", + "
\n", + "

date_of_birth

\n", + " \n", + "
\n", + "

sex

\n", + " \n", + "
\n", + "

weight

\n", + " grams\n", + "
M003Mus musculus2026-02-15M26.8
\n", + " \n", + "

Total: 1

\n", + " " + ], + "text/plain": [ + "*subject_id species date_of_birth sex weight \n", + "+------------+ +------------+ +------------+ +-----+ +--------+\n", + "M003 Mus musculus 2026-02-15 M 26.8 \n", + " (Total: 1)" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Combine with other restrictions\n", + "(Subject & \"sex = 'M'\") & dj.Top(limit=1, order_by='weight DESC')" + ] + }, + { + "cell_type": "markdown", + "id": "i9g7i7bvjm", + "metadata": {}, + "source": [ + "**When to use `dj.Top` vs fetch-time `order_by`/`limit`:**\n", + "\n", + "- Use `dj.Top` when the limited result needs to be **joined or restricted further**\n", + "- Use fetch-time parameters (`to_dicts(order_by=..., limit=...)`) for **final output**\n", + "\n", + "**Note:** Some databases (including MySQL 8.0) don't support LIMIT in certain subquery contexts. If you encounter this limitation, fetch the keys first and use them as a restriction:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "0pinn18w1ibn", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:50.703169Z", + "iopub.status.busy": "2026-01-14T07:33:50.703086Z", + "iopub.status.idle": "2026-01-14T07:33:50.708891Z", + "shell.execute_reply": "2026-01-14T07:33:50.708617Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

session_idx

\n", + " \n", + "
\n", + "

trial_idx

\n", + " \n", + "
\n", + "

stimulus

\n", + " \n", + "
\n", + "

response

\n", + " \n", + "
\n", + "

correct

\n", + " \n", + "
\n", + "

reaction_time

\n", + " seconds\n", + "
M00121rightleft10.227495
M00122leftright10.713191
M00123leftright00.581411
M00124rightleft10.325704
M00125rightleft10.302683
M00126leftleft10.361969
M00127leftright10.6656
M00128leftleft10.440699
M00129leftleft10.540308
M001210rightleft10.437379
M00221rightleft00.657506
M00222leftright10.267121
\n", + "

...

\n", + "

Total: 20

\n", + " " + ], + "text/plain": [ + "*subject_id *session_idx *trial_idx stimulus response correct reaction_time \n", + "+------------+ +------------+ +-----------+ +----------+ +----------+ +---------+ +------------+\n", + "M001 2 1 right left 1 0.227495 \n", + "M001 2 2 left right 1 0.713191 \n", + "M001 2 3 left right 0 0.581411 \n", + "M001 2 4 right left 1 0.325704 \n", + "M001 2 5 right left 1 0.302683 \n", + "M001 2 6 left left 1 0.361969 \n", + "M001 2 7 left right 1 0.6656 \n", + "M001 2 8 left left 1 0.440699 \n", + "M001 2 9 left left 1 0.540308 \n", + "M001 2 10 right left 1 0.437379 \n", + "M002 2 1 right left 0 0.657506 \n", + "M002 2 2 left right 1 0.267121 \n", + " ...\n", + " (Total: 20)" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Get trials only from the 2 longest sessions\n", + "# Workaround: fetch keys first, then use as restriction\n", + "longest_session_keys = (Session & dj.Top(limit=2, order_by='duration DESC')).keys()\n", + "Session.Trial & longest_session_keys" + ] + }, + { + "cell_type": "markdown", + "id": "cell-18", + "metadata": {}, + "source": [ + "## Projection (`.proj()`)\n", + "\n", + "Projection selects, renames, or computes attributes.\n", + "\n", + "### Selecting Attributes" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "cell-19", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:50.710206Z", + "iopub.status.busy": "2026-01-14T07:33:50.710121Z", + "iopub.status.idle": "2026-01-14T07:33:50.713947Z", + "shell.execute_reply": "2026-01-14T07:33:50.713713Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "
\n", + "

subject_id

\n", + " \n", + "
M001
M002
M003
R001
\n", + " \n", + "

Total: 4

\n", + " " + ], + "text/plain": [ + "*subject_id \n", + "+------------+\n", + "M001 \n", + "M002 \n", + "M003 \n", + "R001 \n", + " (Total: 4)" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Primary key only (no arguments)\n", + "Subject.proj()" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "cell-20", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:50.715106Z", + "iopub.status.busy": "2026-01-14T07:33:50.715026Z", + "iopub.status.idle": "2026-01-14T07:33:50.718921Z", + "shell.execute_reply": "2026-01-14T07:33:50.718625Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

species

\n", + " \n", + "
\n", + "

sex

\n", + " \n", + "
M001Mus musculusM
M002Mus musculusF
M003Mus musculusM
R001Rattus norvegicusF
\n", + " \n", + "

Total: 4

\n", + " " + ], + "text/plain": [ + "*subject_id species sex \n", + "+------------+ +------------+ +-----+\n", + "M001 Mus musculus M \n", + "M002 Mus musculus F \n", + "M003 Mus musculus M \n", + "R001 Rattus norvegi F \n", + " (Total: 4)" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Primary key + specific attributes\n", + "Subject.proj('species', 'sex')" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "cell-21", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:50.720386Z", + "iopub.status.busy": "2026-01-14T07:33:50.720282Z", + "iopub.status.idle": "2026-01-14T07:33:50.725156Z", + "shell.execute_reply": "2026-01-14T07:33:50.724913Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

species

\n", + " \n", + "
\n", + "

date_of_birth

\n", + " \n", + "
\n", + "

sex

\n", + " \n", + "
\n", + "

weight

\n", + " grams\n", + "
M001Mus musculus2026-01-15M25.3
M002Mus musculus2026-02-01F22.1
M003Mus musculus2026-02-15M26.8
R001Rattus norvegicus2024-01-01F280.5
\n", + " \n", + "

Total: 4

\n", + " " + ], + "text/plain": [ + "*subject_id species date_of_birth sex weight \n", + "+------------+ +------------+ +------------+ +-----+ +--------+\n", + "M001 Mus musculus 2026-01-15 M 25.3 \n", + "M002 Mus musculus 2026-02-01 F 22.1 \n", + "M003 Mus musculus 2026-02-15 M 26.8 \n", + "R001 Rattus norvegi 2024-01-01 F 280.5 \n", + " (Total: 4)" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# All attributes (using ellipsis)\n", + "Subject.proj(...)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "cell-22", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:50.726514Z", + "iopub.status.busy": "2026-01-14T07:33:50.726414Z", + "iopub.status.idle": "2026-01-14T07:33:50.730534Z", + "shell.execute_reply": "2026-01-14T07:33:50.730278Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

species

\n", + " \n", + "
\n", + "

date_of_birth

\n", + " \n", + "
\n", + "

sex

\n", + " \n", + "
M001Mus musculus2026-01-15M
M002Mus musculus2026-02-01F
M003Mus musculus2026-02-15M
R001Rattus norvegicus2024-01-01F
\n", + " \n", + "

Total: 4

\n", + " " + ], + "text/plain": [ + "*subject_id species date_of_birth sex \n", + "+------------+ +------------+ +------------+ +-----+\n", + "M001 Mus musculus 2026-01-15 M \n", + "M002 Mus musculus 2026-02-01 F \n", + "M003 Mus musculus 2026-02-15 M \n", + "R001 Rattus norvegi 2024-01-01 F \n", + " (Total: 4)" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# All except specific attributes\n", + "Subject.proj(..., '-weight')" + ] + }, + { + "cell_type": "markdown", + "id": "cell-23", + "metadata": {}, + "source": [ + "### Renaming Attributes" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "cell-24", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:50.731664Z", + "iopub.status.busy": "2026-01-14T07:33:50.731580Z", + "iopub.status.idle": "2026-01-14T07:33:50.735911Z", + "shell.execute_reply": "2026-01-14T07:33:50.735695Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

animal_species

\n", + " \n", + "
M001Mus musculus
M002Mus musculus
M003Mus musculus
R001Rattus norvegicus
\n", + " \n", + "

Total: 4

\n", + " " + ], + "text/plain": [ + "*subject_id animal_species\n", + "+------------+ +------------+\n", + "M001 Mus musculus \n", + "M002 Mus musculus \n", + "M003 Mus musculus \n", + "R001 Rattus norvegi\n", + " (Total: 4)" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Rename 'species' to 'animal_species'\n", + "Subject.proj(animal_species='species')" + ] + }, + { + "cell_type": "markdown", + "id": "cell-25", + "metadata": {}, + "source": [ + "### Computed Attributes" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "cell-26", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:50.737331Z", + "iopub.status.busy": "2026-01-14T07:33:50.737233Z", + "iopub.status.idle": "2026-01-14T07:33:50.741847Z", + "shell.execute_reply": "2026-01-14T07:33:50.741584Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

species

\n", + " \n", + "
\n", + "

weight_kg

\n", + " calculated attribute\n", + "
M001Mus musculus0.02529999923706055
M002Mus musculus0.022100000381469725
M003Mus musculus0.026799999237060546
R001Rattus norvegicus0.2805
\n", + " \n", + "

Total: 4

\n", + " " + ], + "text/plain": [ + "*subject_id species weight_kg \n", + "+------------+ +------------+ +------------+\n", + "M001 Mus musculus 0.025299999237\n", + "M002 Mus musculus 0.022100000381\n", + "M003 Mus musculus 0.026799999237\n", + "R001 Rattus norvegi 0.2805 \n", + " (Total: 4)" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Arithmetic computation\n", + "Subject.proj('species', weight_kg='weight / 1000')" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "cell-27", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:50.743103Z", + "iopub.status.busy": "2026-01-14T07:33:50.742993Z", + "iopub.status.idle": "2026-01-14T07:33:50.747667Z", + "shell.execute_reply": "2026-01-14T07:33:50.747397Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

session_idx

\n", + " \n", + "
\n", + "

session_date

\n", + " \n", + "
\n", + "

year

\n", + " calculated attribute\n", + "
\n", + "

month

\n", + " calculated attribute\n", + "
M00112026-01-0620261
M00122026-01-0720261
M00212026-01-0620261
M00222026-01-0820261
M00312026-01-0720261
\n", + " \n", + "

Total: 5

\n", + " " + ], + "text/plain": [ + "*subject_id *session_idx session_date year month \n", + "+------------+ +------------+ +------------+ +------+ +-------+\n", + "M001 1 2026-01-06 2026 1 \n", + "M001 2 2026-01-07 2026 1 \n", + "M002 1 2026-01-06 2026 1 \n", + "M002 2 2026-01-08 2026 1 \n", + "M003 1 2026-01-07 2026 1 \n", + " (Total: 5)" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Date functions\n", + "Session.proj('session_date', year='YEAR(session_date)', month='MONTH(session_date)')" + ] + }, + { + "cell_type": "markdown", + "id": "cell-28", + "metadata": {}, + "source": [ + "## Join (`*`)\n", + "\n", + "Join combines tables on shared attributes. Unlike SQL, which offers many join variants (INNER, LEFT, RIGHT, FULL, CROSS, NATURAL), DataJoint provides **one rigorous join operator** with strict semantic rules.\n", + "\n", + "The `*` operator:\n", + "- Matches only **semantically compatible** attributes (same name AND same origin via foreign key lineage)\n", + "- Produces a result with a **valid primary key** determined by functional dependencies\n", + "- Follows clear algebraic properties\n", + "\n", + "This simplicity makes DataJoint queries unambiguous and composable." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "cell-29", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:50.748934Z", + "iopub.status.busy": "2026-01-14T07:33:50.748842Z", + "iopub.status.idle": "2026-01-14T07:33:50.753952Z", + "shell.execute_reply": "2026-01-14T07:33:50.753687Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

session_idx

\n", + " \n", + "
\n", + "

experimenter_id

\n", + " \n", + "
\n", + "

session_date

\n", + " \n", + "
\n", + "

duration

\n", + " minutes\n", + "
\n", + "

species

\n", + " \n", + "
\n", + "

date_of_birth

\n", + " \n", + "
\n", + "

sex

\n", + " \n", + "
\n", + "

weight

\n", + " grams\n", + "
M0011alice2026-01-0645.0Mus musculus2026-01-15M25.3
M0012alice2026-01-0750.0Mus musculus2026-01-15M25.3
M0021bob2026-01-0640.0Mus musculus2026-02-01F22.1
M0022bob2026-01-0855.0Mus musculus2026-02-01F22.1
M0031alice2026-01-0735.0Mus musculus2026-02-15M26.8
\n", + " \n", + "

Total: 5

\n", + " " + ], + "text/plain": [ + "*subject_id *session_idx experimenter_i session_date duration species date_of_birth sex weight \n", + "+------------+ +------------+ +------------+ +------------+ +----------+ +------------+ +------------+ +-----+ +--------+\n", + "M001 1 alice 2026-01-06 45.0 Mus musculus 2026-01-15 M 25.3 \n", + "M001 2 alice 2026-01-07 50.0 Mus musculus 2026-01-15 M 25.3 \n", + "M002 1 bob 2026-01-06 40.0 Mus musculus 2026-02-01 F 22.1 \n", + "M002 2 bob 2026-01-08 55.0 Mus musculus 2026-02-01 F 22.1 \n", + "M003 1 alice 2026-01-07 35.0 Mus musculus 2026-02-15 M 26.8 \n", + " (Total: 5)" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Join Subject and Session on subject_id\n", + "Subject * Session" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "cell-30", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:50.755255Z", + "iopub.status.busy": "2026-01-14T07:33:50.755169Z", + "iopub.status.idle": "2026-01-14T07:33:50.760880Z", + "shell.execute_reply": "2026-01-14T07:33:50.760573Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

session_idx

\n", + " \n", + "
\n", + "

experimenter_id

\n", + " \n", + "
\n", + "

session_date

\n", + " \n", + "
\n", + "

duration

\n", + " minutes\n", + "
\n", + "

species

\n", + " \n", + "
\n", + "

date_of_birth

\n", + " \n", + "
\n", + "

sex

\n", + " \n", + "
\n", + "

weight

\n", + " grams\n", + "
M0011alice2026-01-0645.0Mus musculus2026-01-15M25.3
M0012alice2026-01-0750.0Mus musculus2026-01-15M25.3
M0031alice2026-01-0735.0Mus musculus2026-02-15M26.8
\n", + " \n", + "

Total: 3

\n", + " " + ], + "text/plain": [ + "*subject_id *session_idx experimenter_i session_date duration species date_of_birth sex weight \n", + "+------------+ +------------+ +------------+ +------------+ +----------+ +------------+ +------------+ +-----+ +--------+\n", + "M001 1 alice 2026-01-06 45.0 Mus musculus 2026-01-15 M 25.3 \n", + "M001 2 alice 2026-01-07 50.0 Mus musculus 2026-01-15 M 25.3 \n", + "M003 1 alice 2026-01-07 35.0 Mus musculus 2026-02-15 M 26.8 \n", + " (Total: 3)" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Join then restrict\n", + "(Subject * Session) & \"sex = 'M'\"" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "cell-31", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:50.762220Z", + "iopub.status.busy": "2026-01-14T07:33:50.762128Z", + "iopub.status.idle": "2026-01-14T07:33:50.766893Z", + "shell.execute_reply": "2026-01-14T07:33:50.766630Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

session_idx

\n", + " \n", + "
\n", + "

experimenter_id

\n", + " \n", + "
\n", + "

session_date

\n", + " \n", + "
\n", + "

duration

\n", + " minutes\n", + "
\n", + "

species

\n", + " \n", + "
\n", + "

date_of_birth

\n", + " \n", + "
\n", + "

sex

\n", + " \n", + "
\n", + "

weight

\n", + " grams\n", + "
M0011alice2026-01-0645.0Mus musculus2026-01-15M25.3
M0012alice2026-01-0750.0Mus musculus2026-01-15M25.3
M0031alice2026-01-0735.0Mus musculus2026-02-15M26.8
\n", + " \n", + "

Total: 3

\n", + " " + ], + "text/plain": [ + "*subject_id *session_idx experimenter_i session_date duration species date_of_birth sex weight \n", + "+------------+ +------------+ +------------+ +------------+ +----------+ +------------+ +------------+ +-----+ +--------+\n", + "M001 1 alice 2026-01-06 45.0 Mus musculus 2026-01-15 M 25.3 \n", + "M001 2 alice 2026-01-07 50.0 Mus musculus 2026-01-15 M 25.3 \n", + "M003 1 alice 2026-01-07 35.0 Mus musculus 2026-02-15 M 26.8 \n", + " (Total: 3)" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Restrict then join (equivalent result)\n", + "(Subject & \"sex = 'M'\") * Session" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "cell-32", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:50.768103Z", + "iopub.status.busy": "2026-01-14T07:33:50.768024Z", + "iopub.status.idle": "2026-01-14T07:33:50.772951Z", + "shell.execute_reply": "2026-01-14T07:33:50.772615Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

session_idx

\n", + " \n", + "
\n", + "

session_date

\n", + " \n", + "
\n", + "

species

\n", + " \n", + "
\n", + "

full_name

\n", + " \n", + "
M00112026-01-06Mus musculusAlice Smith
M00122026-01-07Mus musculusAlice Smith
M00212026-01-06Mus musculusBob Jones
M00222026-01-08Mus musculusBob Jones
M00312026-01-07Mus musculusAlice Smith
\n", + " \n", + "

Total: 5

\n", + " " + ], + "text/plain": [ + "*subject_id *session_idx session_date species full_name \n", + "+------------+ +------------+ +------------+ +------------+ +------------+\n", + "M001 1 2026-01-06 Mus musculus Alice Smith \n", + "M001 2 2026-01-07 Mus musculus Alice Smith \n", + "M002 1 2026-01-06 Mus musculus Bob Jones \n", + "M002 2 2026-01-08 Mus musculus Bob Jones \n", + "M003 1 2026-01-07 Mus musculus Alice Smith \n", + " (Total: 5)" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Three-way join\n", + "(Subject * Session * Experimenter).proj('species', 'session_date', 'full_name')" + ] + }, + { + "cell_type": "markdown", + "id": "tt5h1lmim2", + "metadata": {}, + "source": [ + "### Primary Keys in Join Results\n", + "\n", + "Every query result has a valid primary key. For joins, the result's primary key depends on **functional dependencies** between the operands:\n", + "\n", + "| Condition | Result Primary Key |\n", + "|-----------|-------------------|\n", + "| `A β†’ B` (A determines B) | PK(A) |\n", + "| `B β†’ A` (B determines A) | PK(B) |\n", + "| Both | PK(A) |\n", + "| Neither | PK(A) βˆͺ PK(B) |\n", + "\n", + "**\"A determines B\"** means all of B's primary key attributes exist in A (as primary or secondary attributes).\n", + "\n", + "In our example:\n", + "- `Session` has PK: `(subject_id, session_idx)`\n", + "- `Trial` has PK: `(subject_id, session_idx, trial_idx)`\n", + "\n", + "Since Session's PK is a subset of Trial's PK, `Session β†’ Trial`. The join `Session * Trial` has the same primary key as Session.\n", + "\n", + "See the [Query Algebra Specification](../reference/specs/query-algebra.md) for the complete functional dependency rules." + ] + }, + { + "cell_type": "markdown", + "id": "odzlwwyjml", + "metadata": {}, + "source": [ + "### Extension (`.extend()`)\n", + "\n", + "Sometimes you want to add attributes from a related table without losing rows that lack matching entries. The **extend** operator is a specialized join for this purpose.\n", + "\n", + "`A.extend(B)` is equivalent to a left join: it preserves all rows from A, adding B's attributes where matches exist (with NULL where they don't).\n", + "\n", + "**Requirement**: A must \"determine\" Bβ€”all of B's primary key attributes must exist in A. This ensures the result maintains A's entity identity." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "hlpgqqe045t", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:50.774422Z", + "iopub.status.busy": "2026-01-14T07:33:50.774314Z", + "iopub.status.idle": "2026-01-14T07:33:50.779599Z", + "shell.execute_reply": "2026-01-14T07:33:50.779314Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

session_idx

\n", + " \n", + "
\n", + "

experimenter_id

\n", + " \n", + "
\n", + "

session_date

\n", + " \n", + "
\n", + "

duration

\n", + " minutes\n", + "
\n", + "

full_name

\n", + " \n", + "
M0011alice2026-01-0645.0Alice Smith
M0012alice2026-01-0750.0Alice Smith
M0021bob2026-01-0640.0Bob Jones
M0022bob2026-01-0855.0Bob Jones
M0031alice2026-01-0735.0Alice Smith
\n", + " \n", + "

Total: 5

\n", + " " + ], + "text/plain": [ + "*subject_id *session_idx experimenter_i session_date duration full_name \n", + "+------------+ +------------+ +------------+ +------------+ +----------+ +------------+\n", + "M001 1 alice 2026-01-06 45.0 Alice Smith \n", + "M001 2 alice 2026-01-07 50.0 Alice Smith \n", + "M002 1 bob 2026-01-06 40.0 Bob Jones \n", + "M002 2 bob 2026-01-08 55.0 Bob Jones \n", + "M003 1 alice 2026-01-07 35.0 Alice Smith \n", + " (Total: 5)" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Session contains experimenter_id (FK to Experimenter)\n", + "# extend adds Experimenter's attributes while keeping all Sessions\n", + "Session.extend(Experimenter)" + ] + }, + { + "cell_type": "markdown", + "id": "243eo6srdgn", + "metadata": {}, + "source": [ + "**Why extend instead of join?** \n", + "\n", + "A regular join (`*`) would exclude sessions if their experimenter wasn't in the Experimenter table. Extend preserves all sessions, filling in NULL for missing experimenter data. This is essential when you want to add optional attributes without filtering your results." + ] + }, + { + "cell_type": "markdown", + "id": "cell-33", + "metadata": {}, + "source": [ + "## Aggregation (`.aggr()`)\n", + "\n", + "DataJoint aggregation operates **entity-to-entity**: you aggregate one entity type with respect to another. This differs fundamentally from SQL's `GROUP BY`, which groups by arbitrary attribute sets.\n", + "\n", + "In DataJoint:\n", + "```python\n", + "Session.aggr(Trial, n_trials='count(*)')\n", + "```\n", + "\n", + "This reads: \"For each **Session entity**, aggregate its associated **Trial entities**.\"\n", + "\n", + "The equivalent SQL would be:\n", + "```sql\n", + "SELECT session.*, COUNT(*) as n_trials\n", + "FROM session\n", + "JOIN trial USING (subject_id, session_idx)\n", + "GROUP BY session.subject_id, session.session_idx\n", + "```\n", + "\n", + "The key insight: aggregation always groups by the **primary key of the left operand**. This enforces meaningful groupingsβ€”you aggregate over well-defined entities, not arbitrary attribute combinations." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "cell-34", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:50.780934Z", + "iopub.status.busy": "2026-01-14T07:33:50.780838Z", + "iopub.status.idle": "2026-01-14T07:33:50.785529Z", + "shell.execute_reply": "2026-01-14T07:33:50.785284Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

session_idx

\n", + " \n", + "
\n", + "

n_trials

\n", + " calculated attribute\n", + "
M001110
M001210
M002110
M002210
M003110
\n", + " \n", + "

Total: 5

\n", + " " + ], + "text/plain": [ + "*subject_id *session_idx n_trials \n", + "+------------+ +------------+ +----------+\n", + "M001 1 10 \n", + "M001 2 10 \n", + "M002 1 10 \n", + "M002 2 10 \n", + "M003 1 10 \n", + " (Total: 5)" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Count trials per session\n", + "Session.aggr(Session.Trial, n_trials='count(*)')" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "cell-35", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:50.786680Z", + "iopub.status.busy": "2026-01-14T07:33:50.786598Z", + "iopub.status.idle": "2026-01-14T07:33:50.791517Z", + "shell.execute_reply": "2026-01-14T07:33:50.791250Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

session_idx

\n", + " \n", + "
\n", + "

n_trials

\n", + " calculated attribute\n", + "
\n", + "

n_correct

\n", + " calculated attribute\n", + "
\n", + "

avg_rt

\n", + " calculated attribute\n", + "
M00111080.5068969577550888
M00121090.45964379906654357
M00211070.4584552228450775
M00221060.5038441717624664
M00311060.5117030084133148
\n", + " \n", + "

Total: 5

\n", + " " + ], + "text/plain": [ + "*subject_id *session_idx n_trials n_correct avg_rt \n", + "+------------+ +------------+ +----------+ +-----------+ +------------+\n", + "M001 1 10 8 0.506896957755\n", + "M001 2 10 9 0.459643799066\n", + "M002 1 10 7 0.458455222845\n", + "M002 2 10 6 0.503844171762\n", + "M003 1 10 6 0.511703008413\n", + " (Total: 5)" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Multiple aggregates\n", + "Session.aggr(\n", + " Session.Trial,\n", + " n_trials='count(*)',\n", + " n_correct='sum(correct)',\n", + " avg_rt='avg(reaction_time)'\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "cell-36", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:50.792718Z", + "iopub.status.busy": "2026-01-14T07:33:50.792630Z", + "iopub.status.idle": "2026-01-14T07:33:50.796886Z", + "shell.execute_reply": "2026-01-14T07:33:50.796656Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

n_sessions

\n", + " calculated attribute\n", + "
M0012
M0022
M0031
R0011
\n", + " \n", + "

Total: 4

\n", + " " + ], + "text/plain": [ + "*subject_id n_sessions \n", + "+------------+ +------------+\n", + "M001 2 \n", + "M002 2 \n", + "M003 1 \n", + "R001 1 \n", + " (Total: 4)" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Count sessions per subject\n", + "Subject.aggr(Session, n_sessions='count(*)')" + ] + }, + { + "cell_type": "markdown", + "id": "z96rfjy2uv", + "metadata": {}, + "source": [ + "### The `exclude_nonmatching` Parameter\n", + "\n", + "By default, aggregation keeps all entities from the grouping table, even those without matches. This ensures you see zeros rather than missing rows.\n", + "\n", + "However, `count(*)` counts the NULL-joined row as 1. To correctly count 0 for entities without matches, use `count(pk_attribute)` which excludes NULLs:" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "dw3n6ogbac", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:50.798228Z", + "iopub.status.busy": "2026-01-14T07:33:50.798119Z", + "iopub.status.idle": "2026-01-14T07:33:50.802672Z", + "shell.execute_reply": "2026-01-14T07:33:50.802416Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

n_sessions

\n", + " calculated attribute\n", + "
M0012
M0022
M0031
R0010
\n", + " \n", + "

Total: 4

\n", + " " + ], + "text/plain": [ + "*subject_id n_sessions \n", + "+------------+ +------------+\n", + "M001 2 \n", + "M002 2 \n", + "M003 1 \n", + "R001 0 \n", + " (Total: 4)" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# All subjects, including those without sessions (n_sessions=0)\n", + "# count(session_idx) returns 0 for NULLs, unlike count(*)\n", + "Subject.aggr(Session, n_sessions='count(session_idx)')" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "fsvcrz4mxf7", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:50.803889Z", + "iopub.status.busy": "2026-01-14T07:33:50.803806Z", + "iopub.status.idle": "2026-01-14T07:33:50.808505Z", + "shell.execute_reply": "2026-01-14T07:33:50.808238Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

n_sessions

\n", + " calculated attribute\n", + "
M0012
M0022
M0031
\n", + " \n", + "

Total: 3

\n", + " " + ], + "text/plain": [ + "*subject_id n_sessions \n", + "+------------+ +------------+\n", + "M001 2 \n", + "M002 2 \n", + "M003 1 \n", + " (Total: 3)" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Only subjects that have at least one session (exclude those without matches)\n", + "Subject.aggr(Session, n_sessions='count(session_idx)', exclude_nonmatching=True)" + ] + }, + { + "cell_type": "markdown", + "id": "cell-37", + "metadata": {}, + "source": [ + "### Universal Set (`dj.U()`)\n", + "\n", + "What if you need to aggregate but there's no appropriate entity to group by? DataJoint provides `dj.U()` (the \"universal set\") for these cases.\n", + "\n", + "**`dj.U()`** (no attributes) represents the singleton entityβ€”the \"one universe.\" Aggregating against it produces a single row with global statistics.\n", + "\n", + "**`dj.U('attr1', 'attr2')`** creates an ad-hoc grouping entity from the specified attributes. This enables aggregation when no table exists with those attributes as its primary key.\n", + "\n", + "For example, suppose you want to count sessions by `session_date`, but no table has `session_date` as its primary key. You can use `dj.U('session_date')` to create the grouping:" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "5knwmdepyvu", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:50.809695Z", + "iopub.status.busy": "2026-01-14T07:33:50.809607Z", + "iopub.status.idle": "2026-01-14T07:33:50.814143Z", + "shell.execute_reply": "2026-01-14T07:33:50.813878Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

session_date

\n", + " \n", + "
\n", + "

n_sessions

\n", + " calculated attribute\n", + "
\n", + "

total_duration

\n", + " calculated attribute\n", + "
2026-01-06285.0
2026-01-07285.0
2026-01-08155.0
\n", + " \n", + "

Total: 3

\n", + " " + ], + "text/plain": [ + "*session_date n_sessions total_duration\n", + "+------------+ +------------+ +------------+\n", + "2026-01-06 2 85.0 \n", + "2026-01-07 2 85.0 \n", + "2026-01-08 1 55.0 \n", + " (Total: 3)" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Group by session_date (not a primary key in any table)\n", + "dj.U('session_date').aggr(Session, n_sessions='count(*)', total_duration='sum(duration)')" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "cell-38", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:50.815332Z", + "iopub.status.busy": "2026-01-14T07:33:50.815246Z", + "iopub.status.idle": "2026-01-14T07:33:50.819523Z", + "shell.execute_reply": "2026-01-14T07:33:50.819293Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "
\n", + "

total_sessions

\n", + " calculated attribute\n", + "
\n", + "

avg_duration

\n", + " calculated attribute\n", + "
545.0
\n", + " \n", + "

Total: 1

\n", + " " + ], + "text/plain": [ + "total_sessions avg_duration \n", + "+------------+ +------------+\n", + "5 45.0 \n", + " (Total: 1)" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Universal aggregation: dj.U() with no attributes produces one row\n", + "# This aggregates against the singleton \"universe\"\n", + "dj.U().aggr(Session, total_sessions='count(*)', avg_duration='avg(duration)')" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "cell-39", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:50.820641Z", + "iopub.status.busy": "2026-01-14T07:33:50.820557Z", + "iopub.status.idle": "2026-01-14T07:33:50.824920Z", + "shell.execute_reply": "2026-01-14T07:33:50.824685Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "
\n", + "

experimenter_id

\n", + " \n", + "
\n", + "

n_sessions

\n", + " calculated attribute\n", + "
alice3
bob2
\n", + " \n", + "

Total: 2

\n", + " " + ], + "text/plain": [ + "*experimenter_ n_sessions \n", + "+------------+ +------------+\n", + "alice 3 \n", + "bob 2 \n", + " (Total: 2)" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Group by experimenter_id (a foreign key in Session, not part of Session's PK)\n", + "# Without dj.U(), we couldn't aggregate sessions by experimenter\n", + "dj.U('experimenter_id').aggr(Session, n_sessions='count(*)')" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "cell-40", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:50.826221Z", + "iopub.status.busy": "2026-01-14T07:33:50.826126Z", + "iopub.status.idle": "2026-01-14T07:33:50.830342Z", + "shell.execute_reply": "2026-01-14T07:33:50.830118Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "
\n", + "

species

\n", + " \n", + "
Mus musculus
Rattus norvegicus
\n", + " \n", + "

Total: 2

\n", + " " + ], + "text/plain": [ + "*species \n", + "+------------+\n", + "Mus musculus \n", + "Rattus norvegi\n", + " (Total: 2)" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Unique values\n", + "dj.U('species') & Subject" + ] + }, + { + "cell_type": "markdown", + "id": "cell-41", + "metadata": {}, + "source": [ + "## Fetching Data\n", + "\n", + "DataJoint 2.0 provides explicit methods for different output formats.\n", + "\n", + "### `to_dicts()` β€” List of Dictionaries" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "cell-42", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:50.831497Z", + "iopub.status.busy": "2026-01-14T07:33:50.831417Z", + "iopub.status.idle": "2026-01-14T07:33:50.833947Z", + "shell.execute_reply": "2026-01-14T07:33:50.833727Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[{'subject_id': 'M001',\n", + " 'species': 'Mus musculus',\n", + " 'date_of_birth': datetime.date(2026, 1, 15),\n", + " 'sex': 'M',\n", + " 'weight': 25.3},\n", + " {'subject_id': 'M002',\n", + " 'species': 'Mus musculus',\n", + " 'date_of_birth': datetime.date(2026, 2, 1),\n", + " 'sex': 'F',\n", + " 'weight': 22.1}]" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Get all rows as list of dicts\n", + "rows = Subject.to_dicts()\n", + "rows[:2]" + ] + }, + { + "cell_type": "markdown", + "id": "cell-43", + "metadata": {}, + "source": [ + "### `to_pandas()` β€” DataFrame" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "cell-44", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:50.835380Z", + "iopub.status.busy": "2026-01-14T07:33:50.835278Z", + "iopub.status.idle": "2026-01-14T07:33:50.847962Z", + "shell.execute_reply": "2026-01-14T07:33:50.847718Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
speciesdate_of_birthsexweight
subject_id
M001Mus musculus2026-01-15M25.3
M002Mus musculus2026-02-01F22.1
M003Mus musculus2026-02-15M26.8
R001Rattus norvegicus2024-01-01F280.5
\n", + "
" + ], + "text/plain": [ + " species date_of_birth sex weight\n", + "subject_id \n", + "M001 Mus musculus 2026-01-15 M 25.3\n", + "M002 Mus musculus 2026-02-01 F 22.1\n", + "M003 Mus musculus 2026-02-15 M 26.8\n", + "R001 Rattus norvegicus 2024-01-01 F 280.5" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Get as pandas DataFrame (primary key as index)\n", + "df = Subject.to_pandas()\n", + "df" + ] + }, + { + "cell_type": "markdown", + "id": "cell-45", + "metadata": {}, + "source": [ + "### `to_arrays()` β€” NumPy Arrays" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "cell-46", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:50.849222Z", + "iopub.status.busy": "2026-01-14T07:33:50.849115Z", + "iopub.status.idle": "2026-01-14T07:33:50.852114Z", + "shell.execute_reply": "2026-01-14T07:33:50.851869Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([('M001', 'Mus musculus', datetime.date(2026, 1, 15), 'M', 25.3),\n", + " ('M002', 'Mus musculus', datetime.date(2026, 2, 1), 'F', 22.1),\n", + " ('M003', 'Mus musculus', datetime.date(2026, 2, 15), 'M', 26.8),\n", + " ('R001', 'Rattus norvegicus', datetime.date(2024, 1, 1), 'F', 280.5)],\n", + " dtype=[('subject_id', 'O'), ('species', 'O'), ('date_of_birth', 'O'), ('sex', 'O'), ('weight', '\n", + " .Table{\n", + " border-collapse:collapse;\n", + " }\n", + " .Table th{\n", + " background: #A0A0A0; color: #ffffff; padding:2px 4px; border:#f0e0e0 1px solid;\n", + " font-weight: normal; font-family: monospace; font-size: 75%; text-align: center;\n", + " }\n", + " .Table th p{\n", + " margin: 0;\n", + " }\n", + " .Table td{\n", + " padding:2px 4px; border:#f0e0e0 1px solid; font-size: 75%;\n", + " }\n", + " .Table tr:nth-child(odd){\n", + " background: #ffffff;\n", + " color: #000000;\n", + " }\n", + " .Table tr:nth-child(even){\n", + " background: #f3f1ff;\n", + " color: #000000;\n", + " }\n", + " /* Tooltip container */\n", + " .djtooltip {\n", + " }\n", + " /* Tooltip text */\n", + " .djtooltip .djtooltiptext {\n", + " visibility: hidden;\n", + " width: 120px;\n", + " background-color: black;\n", + " color: #fff;\n", + " text-align: center;\n", + " padding: 5px 0;\n", + " border-radius: 6px;\n", + " /* Position the tooltip text - see examples below! */\n", + " position: absolute;\n", + " z-index: 1;\n", + " }\n", + " #primary {\n", + " font-weight: bold;\n", + " color: black;\n", + " }\n", + " #nonprimary {\n", + " font-weight: normal;\n", + " color: white;\n", + " }\n", + "\n", + " /* Show the tooltip text when you mouse over the tooltip container */\n", + " .djtooltip:hover .djtooltiptext {\n", + " visibility: visible;\n", + " }\n", + "\n", + " /* Dark mode support */\n", + " @media (prefers-color-scheme: dark) {\n", + " .Table th{\n", + " background: #4a4a4a; color: #ffffff; border:#555555 1px solid; text-align: center;\n", + " }\n", + " .Table td{\n", + " border:#555555 1px solid;\n", + " }\n", + " .Table tr:nth-child(odd){\n", + " background: #2d2d2d;\n", + " color: #e0e0e0;\n", + " }\n", + " .Table tr:nth-child(even){\n", + " background: #3d3d3d;\n", + " color: #e0e0e0;\n", + " }\n", + " .djtooltip .djtooltiptext {\n", + " background-color: #555555;\n", + " color: #ffffff;\n", + " }\n", + " #primary {\n", + " color: #bd93f9;\n", + " }\n", + " #nonprimary {\n", + " color: #e0e0e0;\n", + " }\n", + " }\n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

session_idx

\n", + " \n", + "
\n", + "

session_date

\n", + " \n", + "
\n", + "

duration

\n", + " minutes\n", + "
\n", + "

weight

\n", + " grams\n", + "
M00112026-01-0645.025.3
M00122026-01-0750.025.3
M00312026-01-0735.026.8
\n", + " \n", + "

Total: 3

\n", + " " + ], + "text/plain": [ + "*subject_id *session_idx session_date duration weight \n", + "+------------+ +------------+ +------------+ +----------+ +--------+\n", + "M001 1 2026-01-06 45.0 25.3 \n", + "M001 2 2026-01-07 50.0 25.3 \n", + "M003 1 2026-01-07 35.0 26.8 \n", + " (Total: 3)" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Build a complex query step by step\n", + "male_mice = Subject & \"sex = 'M'\" & \"species LIKE '%musculus%'\"\n", + "sessions_with_subject = male_mice * Session\n", + "alice_sessions = sessions_with_subject & {'experimenter_id': 'alice'}\n", + "result = alice_sessions.proj('session_date', 'duration', 'weight')\n", + "\n", + "result" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "cell-60", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:50.885630Z", + "iopub.status.busy": "2026-01-14T07:33:50.885550Z", + "iopub.status.idle": "2026-01-14T07:33:50.890064Z", + "shell.execute_reply": "2026-01-14T07:33:50.889865Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

session_idx

\n", + " \n", + "
\n", + "

session_date

\n", + " \n", + "
\n", + "

duration

\n", + " minutes\n", + "
\n", + "

weight

\n", + " grams\n", + "
M00112026-01-0645.025.3
M00122026-01-0750.025.3
M00312026-01-0735.026.8
\n", + " \n", + "

Total: 3

\n", + " " + ], + "text/plain": [ + "*subject_id *session_idx session_date duration weight \n", + "+------------+ +------------+ +------------+ +----------+ +--------+\n", + "M001 1 2026-01-06 45.0 25.3 \n", + "M001 2 2026-01-07 50.0 25.3 \n", + "M003 1 2026-01-07 35.0 26.8 \n", + " (Total: 3)" + ] + }, + "execution_count": 49, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Or as a single expression\n", + "((Subject & \"sex = 'M'\" & \"species LIKE '%musculus%'\") \n", + " * Session \n", + " & {'experimenter_id': 'alice'}\n", + ").proj('session_date', 'duration', 'weight')" + ] + }, + { + "cell_type": "markdown", + "id": "cell-61", + "metadata": {}, + "source": [ + "## Operator Precedence\n", + "\n", + "Python operator precedence applies:\n", + "\n", + "1. `*` (join) β€” highest\n", + "2. `+`, `-` (union, anti-restriction)\n", + "3. `&` (restriction) β€” lowest\n", + "\n", + "Use parentheses for clarity:" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "cell-62", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:50.891233Z", + "iopub.status.busy": "2026-01-14T07:33:50.891144Z", + "iopub.status.idle": "2026-01-14T07:33:50.894240Z", + "shell.execute_reply": "2026-01-14T07:33:50.893996Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Result 1: 3 rows\n", + "Result 2: 3 rows\n" + ] + } + ], + "source": [ + "# Without parentheses: join happens first\n", + "# Subject * Session & condition means (Subject * Session) & condition\n", + "\n", + "# With parentheses: explicit order\n", + "result1 = (Subject & \"sex = 'M'\") * Session # Restrict then join\n", + "result2 = Subject * (Session & \"duration > 40\") # Restrict then join\n", + "\n", + "print(f\"Result 1: {len(result1)} rows\")\n", + "print(f\"Result 2: {len(result2)} rows\")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-63", + "metadata": {}, + "source": [ + "## Quick Reference\n", + "\n", + "### Operators\n", + "\n", + "| Operation | Syntax | Description |\n", + "|-----------|--------|-------------|\n", + "| Restrict | `A & cond` | Select matching rows |\n", + "| Anti-restrict | `A - cond` | Select non-matching rows |\n", + "| Top | `A & dj.Top(limit, order_by)` | Limit/order results |\n", + "| Project | `A.proj(...)` | Select/compute columns |\n", + "| Join | `A * B` | Combine tables |\n", + "| Extend | `A.extend(B)` | Add B's attributes, keep all A rows |\n", + "| Aggregate | `A.aggr(B, ...)` | Group and summarize |\n", + "| Union | `A + B` | Combine entity sets |\n", + "\n", + "### Fetch Methods\n", + "\n", + "| Method | Returns | Use Case |\n", + "|--------|---------|----------|\n", + "| `to_dicts()` | `list[dict]` | JSON, iteration |\n", + "| `to_pandas()` | `DataFrame` | Data analysis |\n", + "| `to_arrays()` | `np.ndarray` | Numeric computation |\n", + "| `to_arrays('a', 'b')` | `tuple[array, ...]` | Specific columns |\n", + "| `keys()` | `list[dict]` | Primary keys |\n", + "| `fetch1()` | `dict` | Single row |\n", + "\n", + "See the [Query Algebra Specification](../reference/specs/query-algebra.md) and [Fetch API](../reference/specs/fetch-api.md) for complete details.\n", + "\n", + "## Next Steps\n", + "\n", + "- [Computation](05-computation.ipynb) β€” Building computational pipelines" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "cell-64", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:50.895375Z", + "iopub.status.busy": "2026-01-14T07:33:50.895295Z", + "iopub.status.idle": "2026-01-14T07:33:50.910607Z", + "shell.execute_reply": "2026-01-14T07:33:50.910285Z" + } + }, + "outputs": [], + "source": [ + "# Cleanup\n", + "schema.drop(prompt=False)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/src/tutorials/basics/05-computation.ipynb b/src/tutorials/basics/05-computation.ipynb new file mode 100644 index 00000000..1da2da33 --- /dev/null +++ b/src/tutorials/basics/05-computation.ipynb @@ -0,0 +1,2165 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "cell-0", + "metadata": {}, + "source": [ + "# Computation\n", + "\n", + "This tutorial covers how to build computational pipelines with DataJoint. You'll learn:\n", + "\n", + "- **Computed tables** β€” Automatic derivation from other tables\n", + "- **Imported tables** β€” Ingesting data from external files\n", + "- **The `make()` method** β€” Computing and inserting results\n", + "- **Part tables** β€” Storing detailed results\n", + "- **Populate patterns** β€” Running computations efficiently\n", + "\n", + "DataJoint's auto-populated tables (`Computed` and `Imported`) execute automatically based on their dependencies." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "cell-1", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:53.085704Z", + "iopub.status.busy": "2026-01-14T07:33:53.085599Z", + "iopub.status.idle": "2026-01-14T07:33:53.825265Z", + "shell.execute_reply": "2026-01-14T07:33:53.824985Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2026-01-14 01:33:53,817][INFO]: DataJoint 2.0.0a22 connected to root@127.0.0.1:3306\n" + ] + } + ], + "source": [ + "import datajoint as dj\n", + "import numpy as np\n", + "\n", + "schema = dj.Schema('tutorial_computation')" + ] + }, + { + "cell_type": "markdown", + "id": "cell-2", + "metadata": {}, + "source": [ + "## Manual Tables (Source Data)\n", + "\n", + "First, let's define the source tables that our computations will depend on:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "cell-3", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:53.826947Z", + "iopub.status.busy": "2026-01-14T07:33:53.826736Z", + "iopub.status.idle": "2026-01-14T07:33:53.905877Z", + "shell.execute_reply": "2026-01-14T07:33:53.905420Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class Subject(dj.Manual):\n", + " definition = \"\"\"\n", + " subject_id : varchar(16)\n", + " ---\n", + " species : varchar(50)\n", + " \"\"\"\n", + "\n", + "@schema\n", + "class Session(dj.Manual):\n", + " definition = \"\"\"\n", + " -> Subject\n", + " session_idx : uint16\n", + " ---\n", + " session_date : date\n", + " \"\"\"\n", + "\n", + " class Trial(dj.Part):\n", + " definition = \"\"\"\n", + " -> master\n", + " trial_idx : uint16\n", + " ---\n", + " stimulus : varchar(50)\n", + " response : varchar(50)\n", + " correct : bool\n", + " reaction_time : float32 # seconds\n", + " \"\"\"\n", + "\n", + "@schema\n", + "class AnalysisMethod(dj.Lookup):\n", + " definition = \"\"\"\n", + " method_name : varchar(32)\n", + " ---\n", + " description : varchar(255)\n", + " \"\"\"\n", + " contents = [\n", + " {'method_name': 'basic', 'description': 'Simple accuracy calculation'},\n", + " {'method_name': 'weighted', 'description': 'Reaction-time weighted accuracy'},\n", + " ]" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "cell-4", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:53.907666Z", + "iopub.status.busy": "2026-01-14T07:33:53.907532Z", + "iopub.status.idle": "2026-01-14T07:33:53.925430Z", + "shell.execute_reply": "2026-01-14T07:33:53.925153Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Subjects: 2, Sessions: 3, Trials: 45\n" + ] + } + ], + "source": [ + "# Insert sample data\n", + "import random\n", + "random.seed(42)\n", + "\n", + "Subject.insert([\n", + " {'subject_id': 'M001', 'species': 'Mus musculus'},\n", + " {'subject_id': 'M002', 'species': 'Mus musculus'},\n", + "])\n", + "\n", + "sessions = [\n", + " {'subject_id': 'M001', 'session_idx': 1, 'session_date': '2026-01-06'},\n", + " {'subject_id': 'M001', 'session_idx': 2, 'session_date': '2026-01-07'},\n", + " {'subject_id': 'M002', 'session_idx': 1, 'session_date': '2026-01-06'},\n", + "]\n", + "Session.insert(sessions)\n", + "\n", + "# Insert trials for each session\n", + "trials = []\n", + "for s in sessions:\n", + " for i in range(15):\n", + " trials.append({\n", + " 'subject_id': s['subject_id'],\n", + " 'session_idx': s['session_idx'],\n", + " 'trial_idx': i + 1,\n", + " 'stimulus': random.choice(['left', 'right']),\n", + " 'response': random.choice(['left', 'right']),\n", + " 'correct': random.random() > 0.3,\n", + " 'reaction_time': random.uniform(0.2, 0.8)\n", + " })\n", + "Session.Trial.insert(trials)\n", + "\n", + "print(f\"Subjects: {len(Subject())}, Sessions: {len(Session())}, \"\n", + " f\"Trials: {len(Session.Trial())}\")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-5", + "metadata": {}, + "source": [ + "## Computed Tables\n", + "\n", + "A `Computed` table derives its data from other DataJoint tables. The `make()` method computes and inserts one entry at a time.\n", + "\n", + "### Basic Computed Table" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "cell-6", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:53.926808Z", + "iopub.status.busy": "2026-01-14T07:33:53.926680Z", + "iopub.status.idle": "2026-01-14T07:33:53.944781Z", + "shell.execute_reply": "2026-01-14T07:33:53.944450Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class SessionSummary(dj.Computed):\n", + " definition = \"\"\"\n", + " # Summary statistics for each session\n", + " -> Session\n", + " ---\n", + " n_trials : uint16\n", + " n_correct : uint16\n", + " accuracy : float32\n", + " mean_rt : float32 # mean reaction time (seconds)\n", + " \"\"\"\n", + "\n", + " def make(self, key):\n", + " # Fetch trial data for this session\n", + " correct, rt = (Session.Trial & key).to_arrays('correct', 'reaction_time')\n", + " \n", + " n_trials = len(correct)\n", + " n_correct = sum(correct) if n_trials else 0\n", + " \n", + " # Insert computed result\n", + " self.insert1({\n", + " **key,\n", + " 'n_trials': n_trials,\n", + " 'n_correct': n_correct,\n", + " 'accuracy': n_correct / n_trials if n_trials else 0.0,\n", + " 'mean_rt': np.mean(rt) if n_trials else 0.0\n", + " })" + ] + }, + { + "cell_type": "markdown", + "id": "cell-7", + "metadata": {}, + "source": [ + "### Running Computations with `populate()`\n", + "\n", + "The `populate()` method automatically finds entries that need computing and calls `make()` for each:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "cell-8", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:53.946426Z", + "iopub.status.busy": "2026-01-14T07:33:53.946309Z", + "iopub.status.idle": "2026-01-14T07:33:54.008653Z", + "shell.execute_reply": "2026-01-14T07:33:54.008276Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Entries to compute: 3\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + "SessionSummary: 0%| | 0/3 [00:00\n", + " .Table{\n", + " border-collapse:collapse;\n", + " }\n", + " .Table th{\n", + " background: #A0A0A0; color: #ffffff; padding:2px 4px; border:#f0e0e0 1px solid;\n", + " font-weight: normal; font-family: monospace; font-size: 75%; text-align: center;\n", + " }\n", + " .Table th p{\n", + " margin: 0;\n", + " }\n", + " .Table td{\n", + " padding:2px 4px; border:#f0e0e0 1px solid; font-size: 75%;\n", + " }\n", + " .Table tr:nth-child(odd){\n", + " background: #ffffff;\n", + " color: #000000;\n", + " }\n", + " .Table tr:nth-child(even){\n", + " background: #f3f1ff;\n", + " color: #000000;\n", + " }\n", + " /* Tooltip container */\n", + " .djtooltip {\n", + " }\n", + " /* Tooltip text */\n", + " .djtooltip .djtooltiptext {\n", + " visibility: hidden;\n", + " width: 120px;\n", + " background-color: black;\n", + " color: #fff;\n", + " text-align: center;\n", + " padding: 5px 0;\n", + " border-radius: 6px;\n", + " /* Position the tooltip text - see examples below! */\n", + " position: absolute;\n", + " z-index: 1;\n", + " }\n", + " #primary {\n", + " font-weight: bold;\n", + " color: black;\n", + " }\n", + " #nonprimary {\n", + " font-weight: normal;\n", + " color: white;\n", + " }\n", + "\n", + " /* Show the tooltip text when you mouse over the tooltip container */\n", + " .djtooltip:hover .djtooltiptext {\n", + " visibility: visible;\n", + " }\n", + "\n", + " /* Dark mode support */\n", + " @media (prefers-color-scheme: dark) {\n", + " .Table th{\n", + " background: #4a4a4a; color: #ffffff; border:#555555 1px solid; text-align: center;\n", + " }\n", + " .Table td{\n", + " border:#555555 1px solid;\n", + " }\n", + " .Table tr:nth-child(odd){\n", + " background: #2d2d2d;\n", + " color: #e0e0e0;\n", + " }\n", + " .Table tr:nth-child(even){\n", + " background: #3d3d3d;\n", + " color: #e0e0e0;\n", + " }\n", + " .djtooltip .djtooltiptext {\n", + " background-color: #555555;\n", + " color: #ffffff;\n", + " }\n", + " #primary {\n", + " color: #bd93f9;\n", + " }\n", + " #nonprimary {\n", + " color: #e0e0e0;\n", + " }\n", + " }\n", + " \n", + " \n", + " Summary statistics for each session\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

session_idx

\n", + " \n", + "
\n", + "

n_trials

\n", + " \n", + "
\n", + "

n_correct

\n", + " \n", + "
\n", + "

accuracy

\n", + " \n", + "
\n", + "

mean_rt

\n", + " mean reaction time (seconds)\n", + "
M001115120.80.481297
M001215120.80.4687
M00211590.60.493434
\n", + " \n", + "

Total: 3

\n", + " " + ], + "text/plain": [ + "*subject_id *session_idx n_trials n_correct accuracy mean_rt \n", + "+------------+ +------------+ +----------+ +-----------+ +----------+ +----------+\n", + "M001 1 15 12 0.8 0.481297 \n", + "M001 2 15 12 0.8 0.4687 \n", + "M002 1 15 9 0.6 0.493434 \n", + " (Total: 3)" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Check what needs computing\n", + "print(f\"Entries to compute: {len(SessionSummary.key_source - SessionSummary)}\")\n", + "\n", + "# Run the computation\n", + "SessionSummary.populate(display_progress=True)\n", + "\n", + "# View results\n", + "SessionSummary()" + ] + }, + { + "cell_type": "markdown", + "id": "cell-9", + "metadata": {}, + "source": [ + "### Key Source\n", + "\n", + "The `key_source` property defines which entries should be computed. By default, it's the join of all parent tables referenced in the primary key:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "cell-10", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:54.010573Z", + "iopub.status.busy": "2026-01-14T07:33:54.010410Z", + "iopub.status.idle": "2026-01-14T07:33:54.020175Z", + "shell.execute_reply": "2026-01-14T07:33:54.019867Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Key source:\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

session_idx

\n", + " \n", + "
M0011
M0012
M0021
\n", + " \n", + "

Total: 3

\n", + " " + ], + "text/plain": [ + "FreeTable(`tutorial_computation`.`session`)\n", + "*subject_id *session_idx \n", + "+------------+ +------------+\n", + "M001 1 \n", + "M001 2 \n", + "M002 1 \n", + " (Total: 3)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# SessionSummary.key_source is automatically Session\n", + "# (the table referenced in the primary key)\n", + "print(\"Key source:\")\n", + "SessionSummary.key_source" + ] + }, + { + "cell_type": "markdown", + "id": "cell-11", + "metadata": {}, + "source": [ + "## Multiple Dependencies\n", + "\n", + "Computed tables can depend on multiple parent tables. The `key_source` is the join of all parents:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "cell-12", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:54.021601Z", + "iopub.status.busy": "2026-01-14T07:33:54.021490Z", + "iopub.status.idle": "2026-01-14T07:33:54.043789Z", + "shell.execute_reply": "2026-01-14T07:33:54.043432Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class SessionAnalysis(dj.Computed):\n", + " definition = \"\"\"\n", + " # Analysis with configurable method\n", + " -> Session\n", + " -> AnalysisMethod\n", + " ---\n", + " score : float32\n", + " \"\"\"\n", + "\n", + " def make(self, key):\n", + " # Fetch trial data\n", + " correct, rt = (Session.Trial & key).to_arrays('correct', 'reaction_time')\n", + " \n", + " # Apply method-specific analysis\n", + " if key['method_name'] == 'basic':\n", + " score = sum(correct) / len(correct) if len(correct) else 0.0\n", + " elif key['method_name'] == 'weighted':\n", + " # Weight correct trials by inverse reaction time\n", + " weights = 1.0 / rt\n", + " score = sum(correct * weights) / sum(weights) if len(correct) else 0.0\n", + " else:\n", + " score = 0.0\n", + " \n", + " self.insert1({**key, 'score': score})" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "cell-13", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:54.045331Z", + "iopub.status.busy": "2026-01-14T07:33:54.045236Z", + "iopub.status.idle": "2026-01-14T07:33:54.099682Z", + "shell.execute_reply": "2026-01-14T07:33:54.099374Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Key source has 6 entries\n", + " = 3 sessions x 2 methods\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + "SessionAnalysis: 0%| | 0/6 [00:00\n", + " .Table{\n", + " border-collapse:collapse;\n", + " }\n", + " .Table th{\n", + " background: #A0A0A0; color: #ffffff; padding:2px 4px; border:#f0e0e0 1px solid;\n", + " font-weight: normal; font-family: monospace; font-size: 75%; text-align: center;\n", + " }\n", + " .Table th p{\n", + " margin: 0;\n", + " }\n", + " .Table td{\n", + " padding:2px 4px; border:#f0e0e0 1px solid; font-size: 75%;\n", + " }\n", + " .Table tr:nth-child(odd){\n", + " background: #ffffff;\n", + " color: #000000;\n", + " }\n", + " .Table tr:nth-child(even){\n", + " background: #f3f1ff;\n", + " color: #000000;\n", + " }\n", + " /* Tooltip container */\n", + " .djtooltip {\n", + " }\n", + " /* Tooltip text */\n", + " .djtooltip .djtooltiptext {\n", + " visibility: hidden;\n", + " width: 120px;\n", + " background-color: black;\n", + " color: #fff;\n", + " text-align: center;\n", + " padding: 5px 0;\n", + " border-radius: 6px;\n", + " /* Position the tooltip text - see examples below! */\n", + " position: absolute;\n", + " z-index: 1;\n", + " }\n", + " #primary {\n", + " font-weight: bold;\n", + " color: black;\n", + " }\n", + " #nonprimary {\n", + " font-weight: normal;\n", + " color: white;\n", + " }\n", + "\n", + " /* Show the tooltip text when you mouse over the tooltip container */\n", + " .djtooltip:hover .djtooltiptext {\n", + " visibility: visible;\n", + " }\n", + "\n", + " /* Dark mode support */\n", + " @media (prefers-color-scheme: dark) {\n", + " .Table th{\n", + " background: #4a4a4a; color: #ffffff; border:#555555 1px solid; text-align: center;\n", + " }\n", + " .Table td{\n", + " border:#555555 1px solid;\n", + " }\n", + " .Table tr:nth-child(odd){\n", + " background: #2d2d2d;\n", + " color: #e0e0e0;\n", + " }\n", + " .Table tr:nth-child(even){\n", + " background: #3d3d3d;\n", + " color: #e0e0e0;\n", + " }\n", + " .djtooltip .djtooltiptext {\n", + " background-color: #555555;\n", + " color: #ffffff;\n", + " }\n", + " #primary {\n", + " color: #bd93f9;\n", + " }\n", + " #nonprimary {\n", + " color: #e0e0e0;\n", + " }\n", + " }\n", + " \n", + " \n", + " Analysis with configurable method\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

session_idx

\n", + " \n", + "
\n", + "

method_name

\n", + " \n", + "
\n", + "

score

\n", + " \n", + "
M0011basic0.8
M0011weighted0.805006
M0012basic0.8
M0012weighted0.76322
M0021basic0.6
M0021weighted0.513276
\n", + " \n", + "

Total: 6

\n", + " " + ], + "text/plain": [ + "*subject_id *session_idx *method_name score \n", + "+------------+ +------------+ +------------+ +----------+\n", + "M001 1 basic 0.8 \n", + "M001 1 weighted 0.805006 \n", + "M001 2 basic 0.8 \n", + "M001 2 weighted 0.76322 \n", + "M002 1 basic 0.6 \n", + "M002 1 weighted 0.513276 \n", + " (Total: 6)" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Key source is Session * AnalysisMethod (all combinations)\n", + "print(f\"Key source has {len(SessionAnalysis.key_source)} entries\")\n", + "print(f\" = {len(Session())} sessions x {len(AnalysisMethod())} methods\")\n", + "\n", + "SessionAnalysis.populate(display_progress=True)\n", + "SessionAnalysis()" + ] + }, + { + "cell_type": "markdown", + "id": "cell-14", + "metadata": {}, + "source": [ + "## Computed Tables with Part Tables\n", + "\n", + "Use part tables to store detailed results alongside summary data:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "cell-15", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:54.101236Z", + "iopub.status.busy": "2026-01-14T07:33:54.101120Z", + "iopub.status.idle": "2026-01-14T07:33:54.145529Z", + "shell.execute_reply": "2026-01-14T07:33:54.145226Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class TrialAnalysis(dj.Computed):\n", + " definition = \"\"\"\n", + " # Per-trial analysis results\n", + " -> Session\n", + " ---\n", + " n_analyzed : uint16\n", + " \"\"\"\n", + "\n", + " class TrialResult(dj.Part):\n", + " definition = \"\"\"\n", + " -> master\n", + " trial_idx : uint16\n", + " ---\n", + " rt_percentile : float32 # reaction time percentile within session\n", + " is_fast : bool # below median reaction time\n", + " \"\"\"\n", + "\n", + " def make(self, key):\n", + " # Fetch trial data\n", + " trial_data = (Session.Trial & key).to_dicts()\n", + " \n", + " if not trial_data:\n", + " self.insert1({**key, 'n_analyzed': 0})\n", + " return\n", + " \n", + " # Calculate percentiles\n", + " rts = [t['reaction_time'] for t in trial_data]\n", + " median_rt = np.median(rts)\n", + " \n", + " # Insert master entry\n", + " self.insert1({**key, 'n_analyzed': len(trial_data)})\n", + " \n", + " # Insert part entries\n", + " parts = []\n", + " for t in trial_data:\n", + " percentile = sum(rt <= t['reaction_time'] for rt in rts) / len(rts) * 100\n", + " parts.append({\n", + " **key,\n", + " 'trial_idx': t['trial_idx'],\n", + " 'rt_percentile': float(percentile),\n", + " 'is_fast': t['reaction_time'] < median_rt\n", + " })\n", + " \n", + " self.TrialResult.insert(parts)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "cell-16", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:54.147705Z", + "iopub.status.busy": "2026-01-14T07:33:54.147516Z", + "iopub.status.idle": "2026-01-14T07:33:54.184788Z", + "shell.execute_reply": "2026-01-14T07:33:54.184485Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + "TrialAnalysis: 0%| | 0/3 [00:00 Subject\n", + " ---\n", + " n_sessions : uint16\n", + " total_trials : uint32\n", + " overall_accuracy : float32\n", + " \"\"\"\n", + "\n", + " def make(self, key):\n", + " # Fetch from SessionSummary (another computed table)\n", + " summaries = (SessionSummary & key).to_dicts()\n", + " \n", + " n_sessions = len(summaries)\n", + " total_trials = sum(s['n_trials'] for s in summaries)\n", + " total_correct = sum(s['n_correct'] for s in summaries)\n", + " \n", + " self.insert1({\n", + " **key,\n", + " 'n_sessions': n_sessions,\n", + " 'total_trials': total_trials,\n", + " 'overall_accuracy': total_correct / total_trials if total_trials else 0.0\n", + " })" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "cell-19", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:54.207857Z", + "iopub.status.busy": "2026-01-14T07:33:54.207726Z", + "iopub.status.idle": "2026-01-14T07:33:54.237252Z", + "shell.execute_reply": "2026-01-14T07:33:54.236987Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + "SubjectSummary: 0%| | 0/2 [00:00\n", + " .Table{\n", + " border-collapse:collapse;\n", + " }\n", + " .Table th{\n", + " background: #A0A0A0; color: #ffffff; padding:2px 4px; border:#f0e0e0 1px solid;\n", + " font-weight: normal; font-family: monospace; font-size: 75%; text-align: center;\n", + " }\n", + " .Table th p{\n", + " margin: 0;\n", + " }\n", + " .Table td{\n", + " padding:2px 4px; border:#f0e0e0 1px solid; font-size: 75%;\n", + " }\n", + " .Table tr:nth-child(odd){\n", + " background: #ffffff;\n", + " color: #000000;\n", + " }\n", + " .Table tr:nth-child(even){\n", + " background: #f3f1ff;\n", + " color: #000000;\n", + " }\n", + " /* Tooltip container */\n", + " .djtooltip {\n", + " }\n", + " /* Tooltip text */\n", + " .djtooltip .djtooltiptext {\n", + " visibility: hidden;\n", + " width: 120px;\n", + " background-color: black;\n", + " color: #fff;\n", + " text-align: center;\n", + " padding: 5px 0;\n", + " border-radius: 6px;\n", + " /* Position the tooltip text - see examples below! */\n", + " position: absolute;\n", + " z-index: 1;\n", + " }\n", + " #primary {\n", + " font-weight: bold;\n", + " color: black;\n", + " }\n", + " #nonprimary {\n", + " font-weight: normal;\n", + " color: white;\n", + " }\n", + "\n", + " /* Show the tooltip text when you mouse over the tooltip container */\n", + " .djtooltip:hover .djtooltiptext {\n", + " visibility: visible;\n", + " }\n", + "\n", + " /* Dark mode support */\n", + " @media (prefers-color-scheme: dark) {\n", + " .Table th{\n", + " background: #4a4a4a; color: #ffffff; border:#555555 1px solid; text-align: center;\n", + " }\n", + " .Table td{\n", + " border:#555555 1px solid;\n", + " }\n", + " .Table tr:nth-child(odd){\n", + " background: #2d2d2d;\n", + " color: #e0e0e0;\n", + " }\n", + " .Table tr:nth-child(even){\n", + " background: #3d3d3d;\n", + " color: #e0e0e0;\n", + " }\n", + " .djtooltip .djtooltiptext {\n", + " background-color: #555555;\n", + " color: #ffffff;\n", + " }\n", + " #primary {\n", + " color: #bd93f9;\n", + " }\n", + " #nonprimary {\n", + " color: #e0e0e0;\n", + " }\n", + " }\n", + " \n", + " \n", + " Summary across all sessions for a subject\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

n_sessions

\n", + " \n", + "
\n", + "

total_trials

\n", + " \n", + "
\n", + "

overall_accuracy

\n", + " \n", + "
M0012300.8
M0021150.6
\n", + " \n", + "

Total: 2

\n", + " " + ], + "text/plain": [ + "*subject_id n_sessions total_trials overall_accura\n", + "+------------+ +------------+ +------------+ +------------+\n", + "M001 2 30 0.8 \n", + "M002 1 15 0.6 \n", + " (Total: 2)" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# SubjectSummary depends on SessionSummary which is already populated\n", + "SubjectSummary.populate(display_progress=True)\n", + "SubjectSummary()" + ] + }, + { + "cell_type": "markdown", + "id": "cell-20", + "metadata": {}, + "source": [ + "## View the Pipeline\n", + "\n", + "Visualize the dependency structure:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "cell-21", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:54.238908Z", + "iopub.status.busy": "2026-01-14T07:33:54.238726Z", + "iopub.status.idle": "2026-01-14T07:33:54.587250Z", + "shell.execute_reply": "2026-01-14T07:33:54.586872Z" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "AnalysisMethod\n", + "\n", + "\n", + "AnalysisMethod\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "SessionAnalysis\n", + "\n", + "\n", + "SessionAnalysis\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "AnalysisMethod->SessionAnalysis\n", + "\n", + "\n", + "\n", + "\n", + "SessionSummary\n", + "\n", + "\n", + "SessionSummary\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "SubjectSummary\n", + "\n", + "\n", + "SubjectSummary\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "TrialAnalysis\n", + "\n", + "\n", + "TrialAnalysis\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "TrialAnalysis.TrialResult\n", + "\n", + "\n", + "TrialAnalysis.TrialResult\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "TrialAnalysis->TrialAnalysis.TrialResult\n", + "\n", + "\n", + "\n", + "\n", + "Session\n", + "\n", + "\n", + "Session\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Session->SessionAnalysis\n", + "\n", + "\n", + "\n", + "\n", + "Session->SessionSummary\n", + "\n", + "\n", + "\n", + "\n", + "Session->TrialAnalysis\n", + "\n", + "\n", + "\n", + "\n", + "Session.Trial\n", + "\n", + "\n", + "Session.Trial\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Session->Session.Trial\n", + "\n", + "\n", + "\n", + "\n", + "Subject\n", + "\n", + "\n", + "Subject\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Subject->SubjectSummary\n", + "\n", + "\n", + "\n", + "\n", + "Subject->Session\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dj.Diagram(schema)" + ] + }, + { + "cell_type": "markdown", + "id": "cell-22", + "metadata": {}, + "source": [ + "## Recomputation After Changes\n", + "\n", + "When source data changes, delete the affected computed entries and re-populate:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "cell-23", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:54.588989Z", + "iopub.status.busy": "2026-01-14T07:33:54.588835Z", + "iopub.status.idle": "2026-01-14T07:33:54.635679Z", + "shell.execute_reply": "2026-01-14T07:33:54.635438Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Populating new session...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + "SessionSummary: 0%| | 0/1 [00:00\n", + " .Table{\n", + " border-collapse:collapse;\n", + " }\n", + " .Table th{\n", + " background: #A0A0A0; color: #ffffff; padding:2px 4px; border:#f0e0e0 1px solid;\n", + " font-weight: normal; font-family: monospace; font-size: 75%; text-align: center;\n", + " }\n", + " .Table th p{\n", + " margin: 0;\n", + " }\n", + " .Table td{\n", + " padding:2px 4px; border:#f0e0e0 1px solid; font-size: 75%;\n", + " }\n", + " .Table tr:nth-child(odd){\n", + " background: #ffffff;\n", + " color: #000000;\n", + " }\n", + " .Table tr:nth-child(even){\n", + " background: #f3f1ff;\n", + " color: #000000;\n", + " }\n", + " /* Tooltip container */\n", + " .djtooltip {\n", + " }\n", + " /* Tooltip text */\n", + " .djtooltip .djtooltiptext {\n", + " visibility: hidden;\n", + " width: 120px;\n", + " background-color: black;\n", + " color: #fff;\n", + " text-align: center;\n", + " padding: 5px 0;\n", + " border-radius: 6px;\n", + " /* Position the tooltip text - see examples below! */\n", + " position: absolute;\n", + " z-index: 1;\n", + " }\n", + " #primary {\n", + " font-weight: bold;\n", + " color: black;\n", + " }\n", + " #nonprimary {\n", + " font-weight: normal;\n", + " color: white;\n", + " }\n", + "\n", + " /* Show the tooltip text when you mouse over the tooltip container */\n", + " .djtooltip:hover .djtooltiptext {\n", + " visibility: visible;\n", + " }\n", + "\n", + " /* Dark mode support */\n", + " @media (prefers-color-scheme: dark) {\n", + " .Table th{\n", + " background: #4a4a4a; color: #ffffff; border:#555555 1px solid; text-align: center;\n", + " }\n", + " .Table td{\n", + " border:#555555 1px solid;\n", + " }\n", + " .Table tr:nth-child(odd){\n", + " background: #2d2d2d;\n", + " color: #e0e0e0;\n", + " }\n", + " .Table tr:nth-child(even){\n", + " background: #3d3d3d;\n", + " color: #e0e0e0;\n", + " }\n", + " .djtooltip .djtooltiptext {\n", + " background-color: #555555;\n", + " color: #ffffff;\n", + " }\n", + " #primary {\n", + " color: #bd93f9;\n", + " }\n", + " #nonprimary {\n", + " color: #e0e0e0;\n", + " }\n", + " }\n", + " \n", + " \n", + " Summary across all sessions for a subject\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

n_sessions

\n", + " \n", + "
\n", + "

total_trials

\n", + " \n", + "
\n", + "

overall_accuracy

\n", + " \n", + "
M0013500.88
M0021150.6
\n", + " \n", + "

Total: 2

\n", + " " + ], + "text/plain": [ + "*subject_id n_sessions total_trials overall_accura\n", + "+------------+ +------------+ +------------+ +------------+\n", + "M001 3 50 0.88 \n", + "M002 1 15 0.6 \n", + " (Total: 2)" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Add a new session\n", + "Session.insert1({'subject_id': 'M001', 'session_idx': 3, 'session_date': '2026-01-08'})\n", + "\n", + "# Add trials for the new session\n", + "new_trials = [\n", + " {'subject_id': 'M001', 'session_idx': 3, 'trial_idx': i + 1,\n", + " 'stimulus': 'left', 'response': 'left', 'correct': True, 'reaction_time': 0.3}\n", + " for i in range(20)\n", + "]\n", + "Session.Trial.insert(new_trials)\n", + "\n", + "# Re-populate (only computes new entries)\n", + "print(\"Populating new session...\")\n", + "SessionSummary.populate(display_progress=True)\n", + "TrialAnalysis.populate(display_progress=True)\n", + "\n", + "# SubjectSummary needs to be recomputed for M001\n", + "# Delete old entry first (cascading not needed here since no dependents)\n", + "(SubjectSummary & {'subject_id': 'M001'}).delete(prompt=False)\n", + "SubjectSummary.populate(display_progress=True)\n", + "\n", + "print(\"\\nUpdated SubjectSummary:\")\n", + "SubjectSummary()" + ] + }, + { + "cell_type": "markdown", + "id": "cell-24", + "metadata": {}, + "source": [ + "## Populate Options\n", + "\n", + "### Restrict to Specific Entries" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "cell-25", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:54.637017Z", + "iopub.status.busy": "2026-01-14T07:33:54.636923Z", + "iopub.status.idle": "2026-01-14T07:33:54.654674Z", + "shell.execute_reply": "2026-01-14T07:33:54.654341Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'success_count': 2, 'error_list': []}" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Populate only for a specific subject\n", + "SessionAnalysis.populate(Subject & {'subject_id': 'M001'})" + ] + }, + { + "cell_type": "markdown", + "id": "cell-26", + "metadata": {}, + "source": [ + "### Limit Number of Computations" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "cell-27", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:54.656072Z", + "iopub.status.busy": "2026-01-14T07:33:54.655964Z", + "iopub.status.idle": "2026-01-14T07:33:54.667027Z", + "shell.execute_reply": "2026-01-14T07:33:54.666742Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'success_count': 0, 'error_list': []}" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Process at most 5 entries\n", + "SessionAnalysis.populate(max_calls=5, display_progress=True)" + ] + }, + { + "cell_type": "markdown", + "id": "cell-28", + "metadata": {}, + "source": [ + "### Error Handling" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "cell-29", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:54.668439Z", + "iopub.status.busy": "2026-01-14T07:33:54.668322Z", + "iopub.status.idle": "2026-01-14T07:33:54.679418Z", + "shell.execute_reply": "2026-01-14T07:33:54.679027Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Success: 0, Errors: 0\n" + ] + } + ], + "source": [ + "# Continue despite errors\n", + "result = SessionAnalysis.populate(suppress_errors=True)\n", + "print(f\"Success: {result.get('success', 0)}, Errors: {result.get('error', 0)}\")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-30", + "metadata": {}, + "source": [ + "## Progress Tracking" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "cell-31", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:54.681192Z", + "iopub.status.busy": "2026-01-14T07:33:54.681065Z", + "iopub.status.idle": "2026-01-14T07:33:54.692434Z", + "shell.execute_reply": "2026-01-14T07:33:54.692098Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "SessionAnalysis: 8/8 computed\n" + ] + } + ], + "source": [ + "# Check progress\n", + "remaining, total = SessionAnalysis.progress()\n", + "print(f\"SessionAnalysis: {total - remaining}/{total} computed\")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-32", + "metadata": {}, + "source": [ + "## Custom Key Source\n", + "\n", + "Override `key_source` to customize which entries to compute:" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "cell-33", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:54.694075Z", + "iopub.status.busy": "2026-01-14T07:33:54.693949Z", + "iopub.status.idle": "2026-01-14T07:33:54.711156Z", + "shell.execute_reply": "2026-01-14T07:33:54.710860Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class QualityCheck(dj.Computed):\n", + " definition = \"\"\"\n", + " -> Session\n", + " ---\n", + " passes_qc : bool\n", + " \"\"\"\n", + "\n", + " @property\n", + " def key_source(self):\n", + " # Only process sessions with at least 10 trials\n", + " good_sessions = dj.U('subject_id', 'session_idx').aggr(\n", + " Session.Trial, n='count(*)'\n", + " ) & 'n >= 10'\n", + " return Session & good_sessions\n", + "\n", + " def make(self, key):\n", + " # Fetch summary stats\n", + " summary = (SessionSummary & key).fetch1()\n", + " \n", + " # QC: accuracy > 50% and mean RT < 1 second\n", + " passes = summary['accuracy'] > 0.5 and summary['mean_rt'] < 1.0\n", + " \n", + " self.insert1({**key, 'passes_qc': passes})" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "cell-34", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:54.712614Z", + "iopub.status.busy": "2026-01-14T07:33:54.712491Z", + "iopub.status.idle": "2026-01-14T07:33:54.735692Z", + "shell.execute_reply": "2026-01-14T07:33:54.735415Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Key source entries: 4\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + "QualityCheck: 0%| | 0/4 [00:00\n", + " .Table{\n", + " border-collapse:collapse;\n", + " }\n", + " .Table th{\n", + " background: #A0A0A0; color: #ffffff; padding:2px 4px; border:#f0e0e0 1px solid;\n", + " font-weight: normal; font-family: monospace; font-size: 75%; text-align: center;\n", + " }\n", + " .Table th p{\n", + " margin: 0;\n", + " }\n", + " .Table td{\n", + " padding:2px 4px; border:#f0e0e0 1px solid; font-size: 75%;\n", + " }\n", + " .Table tr:nth-child(odd){\n", + " background: #ffffff;\n", + " color: #000000;\n", + " }\n", + " .Table tr:nth-child(even){\n", + " background: #f3f1ff;\n", + " color: #000000;\n", + " }\n", + " /* Tooltip container */\n", + " .djtooltip {\n", + " }\n", + " /* Tooltip text */\n", + " .djtooltip .djtooltiptext {\n", + " visibility: hidden;\n", + " width: 120px;\n", + " background-color: black;\n", + " color: #fff;\n", + " text-align: center;\n", + " padding: 5px 0;\n", + " border-radius: 6px;\n", + " /* Position the tooltip text - see examples below! */\n", + " position: absolute;\n", + " z-index: 1;\n", + " }\n", + " #primary {\n", + " font-weight: bold;\n", + " color: black;\n", + " }\n", + " #nonprimary {\n", + " font-weight: normal;\n", + " color: white;\n", + " }\n", + "\n", + " /* Show the tooltip text when you mouse over the tooltip container */\n", + " .djtooltip:hover .djtooltiptext {\n", + " visibility: visible;\n", + " }\n", + "\n", + " /* Dark mode support */\n", + " @media (prefers-color-scheme: dark) {\n", + " .Table th{\n", + " background: #4a4a4a; color: #ffffff; border:#555555 1px solid; text-align: center;\n", + " }\n", + " .Table td{\n", + " border:#555555 1px solid;\n", + " }\n", + " .Table tr:nth-child(odd){\n", + " background: #2d2d2d;\n", + " color: #e0e0e0;\n", + " }\n", + " .Table tr:nth-child(even){\n", + " background: #3d3d3d;\n", + " color: #e0e0e0;\n", + " }\n", + " .djtooltip .djtooltiptext {\n", + " background-color: #555555;\n", + " color: #ffffff;\n", + " }\n", + " #primary {\n", + " color: #bd93f9;\n", + " }\n", + " #nonprimary {\n", + " color: #e0e0e0;\n", + " }\n", + " }\n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

session_idx

\n", + " \n", + "
\n", + "

passes_qc

\n", + " \n", + "
M00111
M00121
M00131
M00211
\n", + " \n", + "

Total: 4

\n", + " " + ], + "text/plain": [ + "*subject_id *session_idx passes_qc \n", + "+------------+ +------------+ +-----------+\n", + "M001 1 1 \n", + "M001 2 1 \n", + "M001 3 1 \n", + "M002 1 1 \n", + " (Total: 4)" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "print(f\"Key source entries: {len(QualityCheck.key_source)}\")\n", + "QualityCheck.populate(display_progress=True)\n", + "QualityCheck()" + ] + }, + { + "cell_type": "markdown", + "id": "cell-35", + "metadata": {}, + "source": [ + "## Best Practices\n", + "\n", + "### 1. Keep `make()` Simple and Idempotent\n", + "\n", + "```python\n", + "def make(self, key):\n", + " # 1. Fetch source data\n", + " data = (SourceTable & key).fetch1()\n", + " \n", + " # 2. Compute result\n", + " result = compute(data)\n", + " \n", + " # 3. Insert result\n", + " self.insert1({**key, **result})\n", + "```\n", + "\n", + "### 2. Use Part Tables for Detailed Results\n", + "\n", + "Store summary in master, details in parts:\n", + "\n", + "```python\n", + "def make(self, key):\n", + " self.insert1({**key, 'summary': s}) # Master\n", + " self.Detail.insert(details) # Parts\n", + "```\n", + "\n", + "### 3. Re-populate After Data Changes\n", + "\n", + "```python\n", + "# Delete affected entries (cascades automatically)\n", + "(SourceTable & key).delete()\n", + "\n", + "# Reinsert corrected data\n", + "SourceTable.insert1(corrected)\n", + "\n", + "# Re-populate\n", + "ComputedTable.populate()\n", + "```\n", + "\n", + "### 4. Use Lookup Tables for Parameters\n", + "\n", + "```python\n", + "@schema\n", + "class Method(dj.Lookup):\n", + " definition = \"...\"\n", + " contents = [...] # Pre-defined methods\n", + "\n", + "@schema\n", + "class Analysis(dj.Computed):\n", + " definition = \"\"\"\n", + " -> Session\n", + " -> Method # Parameter combinations\n", + " ---\n", + " result : float64\n", + " \"\"\"\n", + "```\n", + "\n", + "See the [AutoPopulate Specification](../reference/specs/autopopulate.md) for complete details.\n", + "\n", + "## Quick Reference\n", + "\n", + "| Method | Description |\n", + "|--------|-------------|\n", + "| `populate()` | Compute all pending entries |\n", + "| `populate(restriction)` | Compute subset of entries |\n", + "| `populate(max_calls=N)` | Compute at most N entries |\n", + "| `populate(display_progress=True)` | Show progress bar |\n", + "| `populate(suppress_errors=True)` | Continue on errors |\n", + "| `progress()` | Check completion status |\n", + "| `key_source` | Entries that should be computed |" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "cell-36", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:54.737072Z", + "iopub.status.busy": "2026-01-14T07:33:54.736967Z", + "iopub.status.idle": "2026-01-14T07:33:54.768974Z", + "shell.execute_reply": "2026-01-14T07:33:54.768653Z" + } + }, + "outputs": [], + "source": [ + "# Cleanup\n", + "schema.drop(prompt=False)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/src/tutorials/basics/06-object-storage.ipynb b/src/tutorials/basics/06-object-storage.ipynb new file mode 100644 index 00000000..59cdde0a --- /dev/null +++ b/src/tutorials/basics/06-object-storage.ipynb @@ -0,0 +1,1810 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "cell-0", + "metadata": {}, + "source": [ + "# Object-Augmented Schemas\n", + "\n", + "This tutorial covers DataJoint's Object-Augmented Schema (OAS) model. You'll learn:\n", + "\n", + "- **The OAS concept** β€” Unified relational + object storage\n", + "- **Blobs** β€” Storing arrays and Python objects\n", + "- **Object storage** β€” Scaling to large datasets\n", + "- **Staged insert** β€” Writing directly to object storage (Zarr, HDF5)\n", + "- **Attachments** β€” Preserving file names and formats\n", + "- **Codecs** β€” How data is serialized and deserialized\n", + "\n", + "In an Object-Augmented Schema, the relational database and object storage operate as a **single integrated system**β€”not as separate \"internal\" and \"external\" components." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "cell-1", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:33:59.354198Z", + "iopub.status.busy": "2026-01-14T07:33:59.354081Z", + "iopub.status.idle": "2026-01-14T07:34:00.094780Z", + "shell.execute_reply": "2026-01-14T07:34:00.094318Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2026-01-14 01:34:00,086][INFO]: DataJoint 2.0.0a22 connected to root@127.0.0.1:3306\n" + ] + } + ], + "source": [ + "import datajoint as dj\n", + "import numpy as np\n", + "\n", + "schema = dj.Schema('tutorial_oas')" + ] + }, + { + "cell_type": "markdown", + "id": "cell-2", + "metadata": {}, + "source": [ + "## The Object-Augmented Schema Model\n", + "\n", + "Scientific data often combines:\n", + "- **Structured metadata** β€” Subjects, sessions, parameters (relational)\n", + "- **Large data objects** β€” Arrays, images, recordings (binary)\n", + "\n", + "DataJoint's OAS model manages both as a unified system:\n", + "\n", + "```mermaid\n", + "block-beta\n", + " columns 1\n", + " block:oas:1\n", + " columns 2\n", + " OAS[\"Object-Augmented Schema\"]:2\n", + " block:db:1\n", + " DB[\"Relational Database\"]\n", + " DB1[\"Metadata\"]\n", + " DB2[\"Keys\"]\n", + " DB3[\"Relationships\"]\n", + " end\n", + " block:os:1\n", + " OS[\"Object Storage (S3/File/etc)\"]\n", + " OS1[\"Large arrays\"]\n", + " OS2[\"Images/videos\"]\n", + " OS3[\"Recordings\"]\n", + " end\n", + " end\n", + "```\n", + "\n", + "From the user's perspective, this is **one schema**β€”storage location is transparent." + ] + }, + { + "cell_type": "markdown", + "id": "cell-3", + "metadata": {}, + "source": [ + "## Blob Attributes\n", + "\n", + "Use `` to store arbitrary Python objects:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "cell-4", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:00.096734Z", + "iopub.status.busy": "2026-01-14T07:34:00.096526Z", + "iopub.status.idle": "2026-01-14T07:34:00.123560Z", + "shell.execute_reply": "2026-01-14T07:34:00.123196Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class Recording(dj.Manual):\n", + " definition = \"\"\"\n", + " recording_id : uint16\n", + " ---\n", + " metadata : # Dict, stored in database\n", + " waveform : # NumPy array, stored in database\n", + " \"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "cell-5", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:00.125486Z", + "iopub.status.busy": "2026-01-14T07:34:00.125209Z", + "iopub.status.idle": "2026-01-14T07:34:01.120534Z", + "shell.execute_reply": "2026-01-14T07:34:01.120182Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "
\n", + "

recording_id

\n", + " \n", + "
\n", + "

metadata

\n", + " Dict, stored in database\n", + "
\n", + "

waveform

\n", + " NumPy array, stored in database\n", + "
1<blob><blob>
\n", + " \n", + "

Total: 1

\n", + " " + ], + "text/plain": [ + "*recording_id metadata waveform \n", + "+------------+ +--------+ +--------+\n", + "1 \n", + " (Total: 1)" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Insert with blob data\n", + "Recording.insert1({\n", + " 'recording_id': 1,\n", + " 'metadata': {'channels': 32, 'sample_rate': 30000, 'duration': 60.0},\n", + " 'waveform': np.random.randn(32, 30000) # 32 channels x 1 second\n", + "})\n", + "\n", + "Recording()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "cell-6", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:01.122343Z", + "iopub.status.busy": "2026-01-14T07:34:01.122146Z", + "iopub.status.idle": "2026-01-14T07:34:01.192491Z", + "shell.execute_reply": "2026-01-14T07:34:01.192186Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Metadata: {'channels': 32, 'sample_rate': 30000, 'duration': 60.0}\n", + "Waveform shape: (32, 30000)\n" + ] + } + ], + "source": [ + "# Fetch blob data\n", + "data = (Recording & {'recording_id': 1}).fetch1()\n", + "print(f\"Metadata: {data['metadata']}\")\n", + "print(f\"Waveform shape: {data['waveform'].shape}\")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-7", + "metadata": {}, + "source": [ + "### What Can Be Stored in Blobs?\n", + "\n", + "The `` codec handles:\n", + "\n", + "- NumPy arrays (any dtype, any shape)\n", + "- Python dicts, lists, tuples, sets\n", + "- Strings, bytes, integers, floats\n", + "- datetime objects and UUIDs\n", + "- Nested combinations of the above\n", + "\n", + "**Note:** Pandas DataFrames should be converted before storage (e.g., `df.to_dict()` or `df.to_records()`)." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "cell-8", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:01.194167Z", + "iopub.status.busy": "2026-01-14T07:34:01.193961Z", + "iopub.status.idle": "2026-01-14T07:34:01.220521Z", + "shell.execute_reply": "2026-01-14T07:34:01.220188Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Arrays type: \n", + "Arrays keys: dict_keys(['x', 'y'])\n" + ] + } + ], + "source": [ + "@schema\n", + "class AnalysisResult(dj.Manual):\n", + " definition = \"\"\"\n", + " result_id : uint16\n", + " ---\n", + " arrays : \n", + " nested_data : \n", + " \"\"\"\n", + "\n", + "# Store complex data structures\n", + "arrays = {'x': np.array([1, 2, 3]), 'y': np.array([4, 5, 6])}\n", + "nested = {'arrays': [np.array([1, 2]), np.array([3, 4])], 'params': {'a': 1, 'b': 2}}\n", + "\n", + "AnalysisResult.insert1({\n", + " 'result_id': 1,\n", + " 'arrays': arrays,\n", + " 'nested_data': nested\n", + "})\n", + "\n", + "# Fetch back\n", + "result = (AnalysisResult & {'result_id': 1}).fetch1()\n", + "print(f\"Arrays type: {type(result['arrays'])}\")\n", + "print(f\"Arrays keys: {result['arrays'].keys()}\")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-9", + "metadata": {}, + "source": [ + "## Object Storage with `@`\n", + "\n", + "For large datasets, add `@` to route data to object storage. The schema remains unifiedβ€”only the physical storage location changes.\n", + "\n", + "### Configure Object Storage\n", + "\n", + "First, configure a store:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "cell-10", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:01.222111Z", + "iopub.status.busy": "2026-01-14T07:34:01.221989Z", + "iopub.status.idle": "2026-01-14T07:34:01.224778Z", + "shell.execute_reply": "2026-01-14T07:34:01.224489Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Store configured at: /var/folders/cn/dpwf5t7j3gd8gzyw2r7dhm8r0000gn/T/dj_store_en8o731r\n" + ] + } + ], + "source": [ + "import tempfile\n", + "import os\n", + "\n", + "# Create a store for this tutorial\n", + "store_path = tempfile.mkdtemp(prefix='dj_store_')\n", + "\n", + "# Configure a named store for this tutorial\n", + "dj.config.stores['tutorial'] = {\n", + " 'protocol': 'file',\n", + " 'location': store_path\n", + "}\n", + "\n", + "print(f\"Store configured at: {store_path}\")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-11", + "metadata": {}, + "source": [ + "### Using Object Storage" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "cell-12", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:01.226096Z", + "iopub.status.busy": "2026-01-14T07:34:01.225979Z", + "iopub.status.idle": "2026-01-14T07:34:01.242642Z", + "shell.execute_reply": "2026-01-14T07:34:01.242168Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class LargeRecording(dj.Manual):\n", + " definition = \"\"\"\n", + " recording_id : uint16\n", + " ---\n", + " small_data : # In database (small)\n", + " large_data : # In object storage (large)\n", + " \"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "cell-13", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:01.244333Z", + "iopub.status.busy": "2026-01-14T07:34:01.244198Z", + "iopub.status.idle": "2026-01-14T07:34:01.497021Z", + "shell.execute_reply": "2026-01-14T07:34:01.496571Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "
\n", + "

recording_id

\n", + " \n", + "
\n", + "

small_data

\n", + " In database (small)\n", + "
\n", + "

large_data

\n", + " In object storage (large)\n", + "
1<blob><blob>
\n", + " \n", + "

Total: 1

\n", + " " + ], + "text/plain": [ + "*recording_id small_data large_data\n", + "+------------+ +--------+ +--------+\n", + "1 \n", + " (Total: 1)" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Insert data - usage is identical regardless of storage\n", + "small = np.random.randn(10, 10)\n", + "large = np.random.randn(1000, 1000) # ~8 MB array\n", + "\n", + "LargeRecording.insert1({\n", + " 'recording_id': 1,\n", + " 'small_data': small,\n", + " 'large_data': large\n", + "})\n", + "\n", + "LargeRecording()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "cell-14", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:01.498511Z", + "iopub.status.busy": "2026-01-14T07:34:01.498385Z", + "iopub.status.idle": "2026-01-14T07:34:01.543554Z", + "shell.execute_reply": "2026-01-14T07:34:01.543054Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Small data shape: (10, 10)\n", + "Large data shape: (1000, 1000)\n" + ] + } + ], + "source": [ + "# Fetch is also identical - storage is transparent\n", + "data = (LargeRecording & {'recording_id': 1}).fetch1()\n", + "print(f\"Small data shape: {data['small_data'].shape}\")\n", + "print(f\"Large data shape: {data['large_data'].shape}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "cell-15", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:01.545008Z", + "iopub.status.busy": "2026-01-14T07:34:01.544867Z", + "iopub.status.idle": "2026-01-14T07:34:01.547547Z", + "shell.execute_reply": "2026-01-14T07:34:01.547285Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "_hash/tutorial_oas/4kzr2dkriqqhjfxbluy225tnrq: 7,685,874 bytes\n" + ] + } + ], + "source": [ + "# Objects are stored in the configured location\n", + "for root, dirs, files in os.walk(store_path):\n", + " for f in files:\n", + " path = os.path.join(root, f)\n", + " size = os.path.getsize(path)\n", + " print(f\"{os.path.relpath(path, store_path)}: {size:,} bytes\")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-16", + "metadata": {}, + "source": [ + "### Hash-Addressed Storage\n", + "\n", + "`` uses hash-addressed storage. Data is identified by a Base32-encoded MD5 hash, enabling automatic deduplicationβ€”identical data is stored only once:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "cell-17", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:01.549029Z", + "iopub.status.busy": "2026-01-14T07:34:01.548897Z", + "iopub.status.idle": "2026-01-14T07:34:01.567398Z", + "shell.execute_reply": "2026-01-14T07:34:01.567116Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Rows in table: 3\n", + "Files in store: 2\n" + ] + } + ], + "source": [ + "# Insert the same data twice\n", + "shared_data = np.ones((500, 500))\n", + "\n", + "LargeRecording.insert([\n", + " {'recording_id': 2, 'small_data': small, 'large_data': shared_data},\n", + " {'recording_id': 3, 'small_data': small, 'large_data': shared_data}, # Same!\n", + "])\n", + "\n", + "print(f\"Rows in table: {len(LargeRecording())}\")\n", + "\n", + "# Deduplication: identical data stored once\n", + "files = [f for _, _, fs in os.walk(store_path) for f in fs]\n", + "print(f\"Files in store: {len(files)}\")" + ] + }, + { + "cell_type": "markdown", + "id": "fzmvk89rx1k", + "metadata": {}, + "source": [ + "## Schema-Addressed Storage with ``\n", + "\n", + "While `` uses hash-addressed storage with deduplication, `` uses **schema-addressed** storage where each row has its own dedicated storage path:\n", + "\n", + "| Aspect | `` | `` |\n", + "|--------|-----------|-------------|\n", + "| Addressing | By content hash | By primary key |\n", + "| Deduplication | Yes | No |\n", + "| Deletion | Garbage collected | With row |\n", + "| Use case | Arrays, serialized objects | Zarr, HDF5, multi-file outputs |\n", + "\n", + "Use `` when you need:\n", + "- Hierarchical formats like Zarr or HDF5\n", + "- Direct write access during data generation\n", + "- Each row to have its own isolated storage location" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "8q80k9agb3c", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:01.568810Z", + "iopub.status.busy": "2026-01-14T07:34:01.568693Z", + "iopub.status.idle": "2026-01-14T07:34:01.589020Z", + "shell.execute_reply": "2026-01-14T07:34:01.588674Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class ImagingSession(dj.Manual):\n", + " definition = \"\"\"\n", + " subject_id : int32\n", + " session_id : int32\n", + " ---\n", + " n_frames : int32\n", + " frame_rate : float32\n", + " frames : # Zarr array stored at path derived from PK\n", + " \"\"\"" + ] + }, + { + "cell_type": "markdown", + "id": "8eb6bvjm1o", + "metadata": {}, + "source": [ + "### Staged Insert for Direct Object Storage Writes\n", + "\n", + "For large datasets like multi-GB imaging recordings, copying data from local storage to object storage is inefficient. The `staged_insert1` context manager lets you **write directly to object storage** before finalizing the database insert:\n", + "\n", + "1. Set primary key values in `staged.rec`\n", + "2. Get a storage handle with `staged.store(field, extension)`\n", + "3. Write data directly (e.g., with Zarr)\n", + "4. On successful exit, metadata is computed and the record is inserted" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "m1gzyoazrxd", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:01.590640Z", + "iopub.status.busy": "2026-01-14T07:34:01.590515Z", + "iopub.status.idle": "2026-01-14T07:34:08.895848Z", + "shell.execute_reply": "2026-01-14T07:34:08.895385Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

subject_id

\n", + " \n", + "
\n", + "

session_id

\n", + " \n", + "
\n", + "

n_frames

\n", + " \n", + "
\n", + "

frame_rate

\n", + " \n", + "
\n", + "

frames

\n", + " Zarr array stored at path derived from PK\n", + "
1110030.0<object>
\n", + " \n", + "

Total: 1

\n", + " " + ], + "text/plain": [ + "*subject_id *session_id n_frames frame_rate frames \n", + "+------------+ +------------+ +----------+ +------------+ +----------+\n", + "1 1 100 30.0 \n", + " (Total: 1)" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import zarr\n", + "\n", + "# Simulate acquiring imaging data frame-by-frame\n", + "n_frames = 100\n", + "height, width = 512, 512\n", + "\n", + "with ImagingSession.staged_insert1 as staged:\n", + " # Set primary key values first\n", + " staged.rec['subject_id'] = 1\n", + " staged.rec['session_id'] = 1\n", + " \n", + " # Get storage handle for the object field\n", + " store = staged.store('frames', '.zarr')\n", + " \n", + " # Create Zarr array directly in object storage\n", + " z = zarr.open(store, mode='w', shape=(n_frames, height, width),\n", + " chunks=(10, height, width), dtype='uint16')\n", + " \n", + " # Write frames as they are \"acquired\"\n", + " for i in range(n_frames):\n", + " frame = np.random.randint(0, 4096, (height, width), dtype='uint16')\n", + " z[i] = frame\n", + " \n", + " # Set remaining attributes\n", + " staged.rec['n_frames'] = n_frames\n", + " staged.rec['frame_rate'] = 30.0\n", + "\n", + "# Record is now inserted with metadata computed from the Zarr\n", + "ImagingSession()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "btl186xeyeb", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:08.897359Z", + "iopub.status.busy": "2026-01-14T07:34:08.897220Z", + "iopub.status.idle": "2026-01-14T07:34:08.955140Z", + "shell.execute_reply": "2026-01-14T07:34:08.954901Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Type: ObjectRef\n", + "Path: tutorial_oas/ImagingSession/subject_id=1/session_id=1/frames_FpJH6G1M.zarr\n", + "Shape: (100, 512, 512)\n", + "Chunks: (10, 512, 512)\n", + "First frame mean: 2051.6\n" + ] + } + ], + "source": [ + "# Fetch returns an ObjectRef for lazy access\n", + "ref = (ImagingSession & {'subject_id': 1, 'session_id': 1}).fetch1('frames')\n", + "print(f\"Type: {type(ref).__name__}\")\n", + "print(f\"Path: {ref.path}\")\n", + "\n", + "# Open as Zarr array (data stays in object storage)\n", + "z = zarr.open(ref.fsmap, mode='r')\n", + "print(f\"Shape: {z.shape}\")\n", + "print(f\"Chunks: {z.chunks}\")\n", + "print(f\"First frame mean: {z[0].mean():.1f}\")" + ] + }, + { + "cell_type": "markdown", + "id": "su8znwb7nl7", + "metadata": {}, + "source": [ + "### Benefits of Staged Insert\n", + "\n", + "- **No intermediate copies** β€” Data flows directly to object storage\n", + "- **Streaming writes** β€” Write frame-by-frame as data is acquired\n", + "- **Atomic transactions** β€” If an error occurs, storage is cleaned up automatically\n", + "- **Automatic metadata** β€” File sizes and manifests are computed on finalize\n", + "\n", + "Use `staged_insert1` when:\n", + "- Data is too large to hold in memory\n", + "- You're generating data incrementally (e.g., during acquisition)\n", + "- You need direct control over storage format (Zarr chunks, HDF5 datasets)" + ] + }, + { + "cell_type": "markdown", + "id": "cell-18", + "metadata": {}, + "source": [ + "## Attachments\n", + "\n", + "Use `` to store files with their original names preserved:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "cell-19", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:08.956578Z", + "iopub.status.busy": "2026-01-14T07:34:08.956468Z", + "iopub.status.idle": "2026-01-14T07:34:08.979179Z", + "shell.execute_reply": "2026-01-14T07:34:08.978854Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class Document(dj.Manual):\n", + " definition = \"\"\"\n", + " doc_id : uint16\n", + " ---\n", + " report : \n", + " \"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "cell-20", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:08.980985Z", + "iopub.status.busy": "2026-01-14T07:34:08.980849Z", + "iopub.status.idle": "2026-01-14T07:34:08.995336Z", + "shell.execute_reply": "2026-01-14T07:34:08.995083Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "
\n", + "

doc_id

\n", + " \n", + "
\n", + "

report

\n", + " \n", + "
1<attach>
\n", + " \n", + "

Total: 1

\n", + " " + ], + "text/plain": [ + "*doc_id report \n", + "+--------+ +----------+\n", + "1 \n", + " (Total: 1)" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Create a sample file\n", + "sample_file = os.path.join(tempfile.gettempdir(), 'analysis_report.txt')\n", + "with open(sample_file, 'w') as f:\n", + " f.write('Analysis Results\\n')\n", + " f.write('================\\n')\n", + " f.write('Accuracy: 95.2%\\n')\n", + "\n", + "# Insert using file path directly\n", + "Document.insert1({\n", + " 'doc_id': 1,\n", + " 'report': sample_file # Just pass the path\n", + "})\n", + "\n", + "Document()" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "cell-21", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:08.996819Z", + "iopub.status.busy": "2026-01-14T07:34:08.996694Z", + "iopub.status.idle": "2026-01-14T07:34:09.000190Z", + "shell.execute_reply": "2026-01-14T07:34:08.999949Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Type: \n", + "Path: analysis_report.txt\n", + "Content:\n", + "Analysis Results\n", + "================\n", + "Accuracy: 95.2%\n", + "\n" + ] + } + ], + "source": [ + "# Fetch returns path to extracted file\n", + "doc_path = (Document & {'doc_id': 1}).fetch1('report')\n", + "print(f\"Type: {type(doc_path)}\")\n", + "print(f\"Path: {doc_path}\")\n", + "\n", + "# Read the content\n", + "with open(doc_path, 'r') as f:\n", + " print(f\"Content:\\n{f.read()}\")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-22", + "metadata": {}, + "source": [ + "## Codec Summary\n", + "\n", + "| Codec | Syntax | Description |\n", + "|-------|--------|-------------|\n", + "| `` | In database | Python objects, arrays |\n", + "| `` | Default store | Large objects, hash-addressed |\n", + "| `` | Named store | Specific storage tier |\n", + "| `` | In database | Files with names |\n", + "| `` | Named store | Large files with names |\n", + "| `` | Named store | Path-addressed (Zarr, etc.) |\n", + "| `` | Named store | References to existing files |" + ] + }, + { + "cell_type": "markdown", + "id": "cell-23", + "metadata": {}, + "source": [ + "## Computed Tables with Large Data\n", + "\n", + "Computed tables commonly produce large results:" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "cell-24", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:09.001628Z", + "iopub.status.busy": "2026-01-14T07:34:09.001531Z", + "iopub.status.idle": "2026-01-14T07:34:09.018149Z", + "shell.execute_reply": "2026-01-14T07:34:09.017790Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class ProcessedRecording(dj.Computed):\n", + " definition = \"\"\"\n", + " -> LargeRecording\n", + " ---\n", + " filtered : # Result in object storage\n", + " mean_value : float64\n", + " \"\"\"\n", + "\n", + " def make(self, key):\n", + " # Fetch source data\n", + " data = (LargeRecording & key).fetch1('large_data')\n", + " \n", + " # Process\n", + " from scipy.ndimage import gaussian_filter\n", + " filtered = gaussian_filter(data, sigma=2)\n", + " \n", + " self.insert1({\n", + " **key,\n", + " 'filtered': filtered,\n", + " 'mean_value': float(np.mean(filtered))\n", + " })" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "cell-25", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:09.019630Z", + "iopub.status.busy": "2026-01-14T07:34:09.019520Z", + "iopub.status.idle": "2026-01-14T07:34:09.701998Z", + "shell.execute_reply": "2026-01-14T07:34:09.701612Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + "ProcessedRecording: 0%| | 0/3 [00:00\n", + " .Table{\n", + " border-collapse:collapse;\n", + " }\n", + " .Table th{\n", + " background: #A0A0A0; color: #ffffff; padding:2px 4px; border:#f0e0e0 1px solid;\n", + " font-weight: normal; font-family: monospace; font-size: 75%; text-align: center;\n", + " }\n", + " .Table th p{\n", + " margin: 0;\n", + " }\n", + " .Table td{\n", + " padding:2px 4px; border:#f0e0e0 1px solid; font-size: 75%;\n", + " }\n", + " .Table tr:nth-child(odd){\n", + " background: #ffffff;\n", + " color: #000000;\n", + " }\n", + " .Table tr:nth-child(even){\n", + " background: #f3f1ff;\n", + " color: #000000;\n", + " }\n", + " /* Tooltip container */\n", + " .djtooltip {\n", + " }\n", + " /* Tooltip text */\n", + " .djtooltip .djtooltiptext {\n", + " visibility: hidden;\n", + " width: 120px;\n", + " background-color: black;\n", + " color: #fff;\n", + " text-align: center;\n", + " padding: 5px 0;\n", + " border-radius: 6px;\n", + " /* Position the tooltip text - see examples below! */\n", + " position: absolute;\n", + " z-index: 1;\n", + " }\n", + " #primary {\n", + " font-weight: bold;\n", + " color: black;\n", + " }\n", + " #nonprimary {\n", + " font-weight: normal;\n", + " color: white;\n", + " }\n", + "\n", + " /* Show the tooltip text when you mouse over the tooltip container */\n", + " .djtooltip:hover .djtooltiptext {\n", + " visibility: visible;\n", + " }\n", + "\n", + " /* Dark mode support */\n", + " @media (prefers-color-scheme: dark) {\n", + " .Table th{\n", + " background: #4a4a4a; color: #ffffff; border:#555555 1px solid; text-align: center;\n", + " }\n", + " .Table td{\n", + " border:#555555 1px solid;\n", + " }\n", + " .Table tr:nth-child(odd){\n", + " background: #2d2d2d;\n", + " color: #e0e0e0;\n", + " }\n", + " .Table tr:nth-child(even){\n", + " background: #3d3d3d;\n", + " color: #e0e0e0;\n", + " }\n", + " .djtooltip .djtooltiptext {\n", + " background-color: #555555;\n", + " color: #ffffff;\n", + " }\n", + " #primary {\n", + " color: #bd93f9;\n", + " }\n", + " #nonprimary {\n", + " color: #e0e0e0;\n", + " }\n", + " }\n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

recording_id

\n", + " \n", + "
\n", + "

filtered

\n", + " Result in object storage\n", + "
\n", + "

mean_value

\n", + " \n", + "
1<blob>0.0005760152725270041
2<blob>1.0000000000000002
3<blob>1.0000000000000002
\n", + " \n", + "

Total: 3

\n", + " " + ], + "text/plain": [ + "*recording_id filtered mean_value \n", + "+------------+ +--------+ +------------+\n", + "1 0.000576015272\n", + "2 1.000000000000\n", + "3 1.000000000000\n", + " (Total: 3)" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ProcessedRecording.populate(display_progress=True)\n", + "ProcessedRecording()" + ] + }, + { + "cell_type": "markdown", + "id": "cell-26", + "metadata": {}, + "source": [ + "## Efficient Data Access\n", + "\n", + "### Fetch Only What You Need" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "cell-27", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:09.703700Z", + "iopub.status.busy": "2026-01-14T07:34:09.703417Z", + "iopub.status.idle": "2026-01-14T07:34:09.706666Z", + "shell.execute_reply": "2026-01-14T07:34:09.706390Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Mean value: 0.0005760152725270041\n" + ] + } + ], + "source": [ + "# Fetch only scalar metadata (fast)\n", + "meta = (ProcessedRecording & {'recording_id': 1}).fetch1('mean_value')\n", + "print(f\"Mean value: {meta}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "cell-28", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:09.707951Z", + "iopub.status.busy": "2026-01-14T07:34:09.707862Z", + "iopub.status.idle": "2026-01-14T07:34:09.755362Z", + "shell.execute_reply": "2026-01-14T07:34:09.755050Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Filtered shape: (1000, 1000)\n" + ] + } + ], + "source": [ + "# Fetch large data only when needed\n", + "filtered = (ProcessedRecording & {'recording_id': 1}).fetch1('filtered')\n", + "print(f\"Filtered shape: {filtered.shape}\")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-29", + "metadata": {}, + "source": [ + "### Project Away Large Columns Before Joins" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "cell-30", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:09.756775Z", + "iopub.status.busy": "2026-01-14T07:34:09.756666Z", + "iopub.status.idle": "2026-01-14T07:34:09.761943Z", + "shell.execute_reply": "2026-01-14T07:34:09.761683Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "
\n", + "

recording_id

\n", + " \n", + "
\n", + "

mean_value

\n", + " \n", + "
10.0005760152725270041
21.0000000000000002
31.0000000000000002
\n", + " \n", + "

Total: 3

\n", + " " + ], + "text/plain": [ + "*recording_id mean_value \n", + "+------------+ +------------+\n", + "1 0.000576015272\n", + "2 1.000000000000\n", + "3 1.000000000000\n", + " (Total: 3)" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Efficient: project to scalar columns before join\n", + "result = LargeRecording.proj('recording_id') * ProcessedRecording.proj('mean_value')\n", + "result" + ] + }, + { + "cell_type": "markdown", + "id": "cell-31", + "metadata": {}, + "source": [ + "## Best Practices\n", + "\n", + "### 1. Choose Storage Based on Size\n", + "\n", + "```python\n", + "# Small objects (< 1 MB): no @\n", + "parameters : \n", + "\n", + "# Large objects (> 1 MB): use @\n", + "raw_data : \n", + "```\n", + "\n", + "### 2. Use Named Stores for Different Tiers\n", + "\n", + "```python\n", + "# Fast local storage for active data\n", + "working_data : \n", + "\n", + "# Cold storage for archives\n", + "archived_data : \n", + "```\n", + "\n", + "### 3. Separate Queryable Metadata from Large Data\n", + "\n", + "```python\n", + "@schema\n", + "class Experiment(dj.Manual):\n", + " definition = \"\"\"\n", + " exp_id : uint16\n", + " ---\n", + " # Queryable metadata\n", + " date : date\n", + " duration : float32\n", + " n_trials : uint16\n", + " # Large data\n", + " raw_data : \n", + " \"\"\"\n", + "```\n", + "\n", + "### 4. Use Attachments for Files\n", + "\n", + "```python\n", + "# Preserves filename\n", + "video : \n", + "config_file : \n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "wou1v0xdbyj", + "metadata": {}, + "source": [ + "## Garbage Collection\n", + "\n", + "Hash-addressed storage (``, ``, ``) uses deduplicationβ€”identical content is stored once. This means deleting a row doesn't automatically delete the stored content, since other rows might reference it.\n", + "\n", + "Use garbage collection to clean up orphaned content:\n", + "\n", + "```python\n", + "import datajoint as dj\n", + "\n", + "# Preview what would be deleted (dry run)\n", + "stats = dj.gc.collect(dry_run=True)\n", + "print(f\"Orphaned items: {stats['orphaned']}\")\n", + "print(f\"Space to reclaim: {stats['orphaned_bytes'] / 1e6:.1f} MB\")\n", + "\n", + "# Actually delete orphaned content\n", + "stats = dj.gc.collect()\n", + "print(f\"Deleted: {stats['deleted']} items\")\n", + "```\n", + "\n", + "### When to Run Garbage Collection\n", + "\n", + "- **After bulk deletions** β€” Clean up storage after removing many rows\n", + "- **Periodically** β€” Schedule weekly/monthly cleanup jobs\n", + "- **Before archiving** β€” Reclaim space before backups\n", + "\n", + "### Key Points\n", + "\n", + "- GC only affects hash-addressed types (``, ``, ``)\n", + "- Schema-addressed types (``, ``) are deleted with their rows\n", + "- Always use `dry_run=True` first to preview changes\n", + "- GC is safeβ€”it only deletes content with zero references\n", + "\n", + "See [Clean Up Storage](../how-to/garbage-collection.md) for detailed usage." + ] + }, + { + "cell_type": "markdown", + "id": "cell-32", + "metadata": {}, + "source": [ + "## Quick Reference\n", + "\n", + "| Pattern | Use Case |\n", + "|---------|----------|\n", + "| `` | Small Python objects |\n", + "| `` | Large arrays with deduplication |\n", + "| `` | Large arrays in specific store |\n", + "| `` | Files preserving names |\n", + "| `` | Schema-addressed data (Zarr, HDF5) |\n", + "\n", + "## Next Steps\n", + "\n", + "- [Configure Object Storage](../how-to/configure-storage.md) β€” Set up S3, MinIO, or filesystem stores\n", + "- [Clean Up Storage](../how-to/garbage-collection.md) β€” Garbage collection for hash-addressed storage\n", + "- [Custom Codecs](advanced/custom-codecs.ipynb) β€” Define domain-specific types\n", + "- [Manage Large Data](../how-to/manage-large-data.md) β€” Performance optimization" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "cell-33", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:09.763385Z", + "iopub.status.busy": "2026-01-14T07:34:09.763293Z", + "iopub.status.idle": "2026-01-14T07:34:09.782000Z", + "shell.execute_reply": "2026-01-14T07:34:09.781702Z" + } + }, + "outputs": [], + "source": [ + "# Cleanup\n", + "schema.drop(prompt=False)\n", + "import shutil\n", + "shutil.rmtree(store_path, ignore_errors=True)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/src/tutorials/basics/analysis_report.txt b/src/tutorials/basics/analysis_report.txt new file mode 100644 index 00000000..bd40ab02 --- /dev/null +++ b/src/tutorials/basics/analysis_report.txt @@ -0,0 +1,3 @@ +Analysis Results +================ +Accuracy: 95.2% diff --git a/src/tutorials/domain/allen-ccf/allen-ccf.ipynb b/src/tutorials/domain/allen-ccf/allen-ccf.ipynb new file mode 100644 index 00000000..0631ae14 --- /dev/null +++ b/src/tutorials/domain/allen-ccf/allen-ccf.ipynb @@ -0,0 +1,2288 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Allen Common Coordinate Framework (CCF)\n", + "\n", + "This tutorial demonstrates how to model the Allen Mouse Brain Common Coordinate Framework in DataJoint. You'll learn to:\n", + "\n", + "- Model **hierarchical structures** (brain region ontology)\n", + "- Use **Part tables** for large-scale voxel data\n", + "- Handle **self-referential relationships** (parent regions)\n", + "- **Batch insert** large datasets efficiently\n", + "\n", + "## The Allen CCF\n", + "\n", + "The CCF is a 3D reference atlas of the mouse brain, providing:\n", + "- Coordinate system with voxel resolution (10, 25, 50, or 100 Β΅m)\n", + "- Hierarchical ontology of ~1300 brain regions\n", + "- Region boundaries for each voxel\n", + "\n", + "**Reference:**\n", + "> Wang Q, Ding SL, Li Y, et al. (2020). The Allen Mouse Brain Common Coordinate Framework: A 3D Reference Atlas. *Cell*, 181(4), 936-953.e20. DOI: [10.1016/j.cell.2020.04.007](https://doi.org/10.1016/j.cell.2020.04.007)\n", + "\n", + "## Data Sources\n", + "\n", + "- **Ontology**: [structure_graph.csv](http://api.brain-map.org/api/v2/data/query.csv?criteria=model::Structure,rma::criteria,[ontology_id$eq1],rma::options[order$eq%27structures.graph_order%27][num_rows$eqall])\n", + "- **Volume**: [Allen Institute Archive](http://download.alleninstitute.org/informatics-archive/current-release/mouse_ccf/annotation/)\n", + "\n", + "> **Note**: This tutorial works with the ontology (small CSV). The full 3D volume requires ~100MB+ download." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setup" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:56.058347Z", + "iopub.status.busy": "2026-01-14T07:34:56.058240Z", + "iopub.status.idle": "2026-01-14T07:34:56.818647Z", + "shell.execute_reply": "2026-01-14T07:34:56.818319Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2026-01-14 01:34:56,811][INFO]: DataJoint 2.0.0a22 connected to root@127.0.0.1:3306\n" + ] + } + ], + "source": [ + "import datajoint as dj\n", + "import numpy as np\n", + "import pandas as pd\n", + "from pathlib import Path\n", + "import urllib.request\n", + "\n", + "schema = dj.Schema('tutorial_allen_ccf')\n", + "\n", + "DATA_DIR = Path('./data')\n", + "DATA_DIR.mkdir(exist_ok=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Download Brain Region Ontology\n", + "\n", + "The ontology defines the hierarchical structure of brain regions." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:56.837551Z", + "iopub.status.busy": "2026-01-14T07:34:56.837275Z", + "iopub.status.idle": "2026-01-14T07:34:56.855991Z", + "shell.execute_reply": "2026-01-14T07:34:56.855649Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using cached data/allen_structure_graph.csv\n", + "Loaded 1327 brain regions\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idatlas_idnameacronymst_levelontology_idhemisphere_idweightparent_structure_iddepth...graph_orderstructure_id_pathcolor_hex_tripletneuro_name_structure_idneuro_name_structure_id_pathfailedsphinx_idstructure_name_facetfailed_facetsafe_name
0997-1.0rootroot0138690NaN0...0/997/FFFFFFNaNNaNf1385153371734881840root
180.0Basic cell groups and regionsgrey1138690997.01...1/997/8/BFDAE3NaNNaNf22244697386734881840Basic cell groups and regions
256770.0CerebrumCH21386908.02...2/997/8/567/B0F0FFNaNNaNf32878815794734881840Cerebrum
368885.0Cerebral cortexCTX3138690567.03...3/997/8/567/688/B0FFB8NaNNaNf43591311804734881840Cerebral cortex
469586.0Cortical plateCTXpl4138690688.04...4/997/8/567/688/695/70FF70NaNNaNf53945900931734881840Cortical plate
\n", + "

5 rows Γ— 21 columns

\n", + "
" + ], + "text/plain": [ + " id atlas_id name acronym st_level \\\n", + "0 997 -1.0 root root 0 \n", + "1 8 0.0 Basic cell groups and regions grey 1 \n", + "2 567 70.0 Cerebrum CH 2 \n", + "3 688 85.0 Cerebral cortex CTX 3 \n", + "4 695 86.0 Cortical plate CTXpl 4 \n", + "\n", + " ontology_id hemisphere_id weight parent_structure_id depth ... \\\n", + "0 1 3 8690 NaN 0 ... \n", + "1 1 3 8690 997.0 1 ... \n", + "2 1 3 8690 8.0 2 ... \n", + "3 1 3 8690 567.0 3 ... \n", + "4 1 3 8690 688.0 4 ... \n", + "\n", + " graph_order structure_id_path color_hex_triplet neuro_name_structure_id \\\n", + "0 0 /997/ FFFFFF NaN \n", + "1 1 /997/8/ BFDAE3 NaN \n", + "2 2 /997/8/567/ B0F0FF NaN \n", + "3 3 /997/8/567/688/ B0FFB8 NaN \n", + "4 4 /997/8/567/688/695/ 70FF70 NaN \n", + "\n", + " neuro_name_structure_id_path failed sphinx_id structure_name_facet \\\n", + "0 NaN f 1 385153371 \n", + "1 NaN f 2 2244697386 \n", + "2 NaN f 3 2878815794 \n", + "3 NaN f 4 3591311804 \n", + "4 NaN f 5 3945900931 \n", + "\n", + " failed_facet safe_name \n", + "0 734881840 root \n", + "1 734881840 Basic cell groups and regions \n", + "2 734881840 Cerebrum \n", + "3 734881840 Cerebral cortex \n", + "4 734881840 Cortical plate \n", + "\n", + "[5 rows x 21 columns]" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ONTOLOGY_URL = (\n", + " \"http://api.brain-map.org/api/v2/data/query.csv?\"\n", + " \"criteria=model::Structure,rma::criteria,[ontology_id$eq1],\"\n", + " \"rma::options[order$eq%27structures.graph_order%27][num_rows$eqall]\"\n", + ")\n", + "ONTOLOGY_FILE = DATA_DIR / 'allen_structure_graph.csv'\n", + "\n", + "if not ONTOLOGY_FILE.exists():\n", + " print(\"Downloading Allen brain structure ontology...\")\n", + " urllib.request.urlretrieve(ONTOLOGY_URL, ONTOLOGY_FILE)\n", + " print(f\"Downloaded to {ONTOLOGY_FILE}\")\n", + "else:\n", + " print(f\"Using cached {ONTOLOGY_FILE}\")\n", + "\n", + "ontology = pd.read_csv(ONTOLOGY_FILE)\n", + "print(f\"Loaded {len(ontology)} brain regions\")\n", + "ontology.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Schema Design\n", + "\n", + "### CCF Master Table\n", + "\n", + "The master table stores atlas metadata. Multiple CCF versions (different resolutions) can coexist." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:56.857798Z", + "iopub.status.busy": "2026-01-14T07:34:56.857656Z", + "iopub.status.idle": "2026-01-14T07:34:56.882902Z", + "shell.execute_reply": "2026-01-14T07:34:56.882551Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class CCF(dj.Manual):\n", + " definition = \"\"\"\n", + " # Common Coordinate Framework atlas\n", + " ccf_id : int32\n", + " ---\n", + " ccf_version : varchar(64) # e.g., 'CCFv3'\n", + " ccf_resolution : float32 # voxel resolution in microns\n", + " ccf_description : varchar(255)\n", + " \"\"\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Brain Region Table\n", + "\n", + "Each brain region has an ID, name, acronym, and color code for visualization." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:56.884596Z", + "iopub.status.busy": "2026-01-14T07:34:56.884478Z", + "iopub.status.idle": "2026-01-14T07:34:56.913115Z", + "shell.execute_reply": "2026-01-14T07:34:56.912820Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class BrainRegion(dj.Imported):\n", + " definition = \"\"\"\n", + " # Brain region from Allen ontology\n", + " -> CCF\n", + " region_id : int32 # Allen structure ID\n", + " ---\n", + " acronym : varchar(32) # short name (e.g., 'VISp')\n", + " region_name : varchar(255) # full name\n", + " color_hex : varchar(6) # hex color code for visualization\n", + " structure_order : int32 # order in hierarchy\n", + " \"\"\"\n", + "\n", + " def make(self, key):\n", + " # Load ontology and insert all regions for this CCF\n", + " ontology = pd.read_csv(ONTOLOGY_FILE)\n", + " \n", + " entries = [\n", + " {\n", + " **key,\n", + " 'region_id': row['id'],\n", + " 'acronym': row['acronym'],\n", + " 'region_name': row['safe_name'],\n", + " 'color_hex': row['color_hex_triplet'],\n", + " 'structure_order': row['graph_order'],\n", + " }\n", + " for _, row in ontology.iterrows()\n", + " ]\n", + " \n", + " self.insert(entries)\n", + " print(f\"Inserted {len(entries)} brain regions\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Hierarchical Parent-Child Relationships\n", + "\n", + "Brain regions form a hierarchy (e.g., Visual Cortex β†’ Primary Visual Area β†’ Layer 1). We model this with a self-referential foreign key." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:56.914713Z", + "iopub.status.busy": "2026-01-14T07:34:56.914592Z", + "iopub.status.idle": "2026-01-14T07:34:56.943632Z", + "shell.execute_reply": "2026-01-14T07:34:56.943269Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class RegionParent(dj.Imported):\n", + " definition = \"\"\"\n", + " # Hierarchical parent-child relationships\n", + " -> BrainRegion\n", + " ---\n", + " -> BrainRegion.proj(parent_id='region_id') # parent region\n", + " depth : int16 # depth in hierarchy (root=0)\n", + " \"\"\"\n", + "\n", + " def make(self, key):\n", + " ontology = pd.read_csv(ONTOLOGY_FILE)\n", + " \n", + " # Build parent mapping\n", + " parent_map = dict(zip(ontology['id'], ontology['parent_structure_id']))\n", + " \n", + " entries = []\n", + " for _, row in ontology.iterrows():\n", + " parent_id = row['parent_structure_id']\n", + " # Skip root (no parent) or if parent not in ontology\n", + " if pd.isna(parent_id):\n", + " parent_id = row['id'] # root points to itself\n", + " \n", + " entries.append({\n", + " **key,\n", + " 'region_id': row['id'],\n", + " 'parent_id': int(parent_id),\n", + " 'depth': row['depth'],\n", + " })\n", + " \n", + " self.insert(entries)\n", + " print(f\"Inserted {len(entries)} parent relationships\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Voxel Data (Optional)\n", + "\n", + "For the full atlas, each voxel maps to a brain region. This is a large table (~10M+ rows for 10Β΅m resolution).\n", + "\n", + "**Design note:** `CCF` is part of the primary key because a voxel's identity depends on which atlas it belongs to. The coordinate `(x=5000, y=3000, z=4000)` exists in every atlas version (10Β΅m, 25Β΅m, etc.) but represents different physical mappings. Without `ccf_id` in the primary key, you couldn't store voxels from multiple atlas resolutions.\n", + "\n", + "> **Note**: We define the schema but don't populate it in this tutorial due to data size." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:56.945416Z", + "iopub.status.busy": "2026-01-14T07:34:56.945201Z", + "iopub.status.idle": "2026-01-14T07:34:56.966241Z", + "shell.execute_reply": "2026-01-14T07:34:56.965927Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class Voxel(dj.Imported):\n", + " definition = \"\"\"\n", + " # Brain atlas voxels\n", + " -> CCF\n", + " x : int32 # AP axis (Β΅m)\n", + " y : int32 # DV axis (Β΅m) \n", + " z : int32 # ML axis (Β΅m)\n", + " ---\n", + " -> BrainRegion\n", + " index(y, z) # for efficient coronal slice queries\n", + " \"\"\"\n", + " \n", + " # Note: make() would load NRRD file and insert voxels\n", + " # Skipped in this tutorial due to data size" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## View Schema" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:56.967959Z", + "iopub.status.busy": "2026-01-14T07:34:56.967844Z", + "iopub.status.idle": "2026-01-14T07:34:57.350339Z", + "shell.execute_reply": "2026-01-14T07:34:57.349944Z" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "RegionParent\n", + "\n", + "\n", + "RegionParent\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "0->RegionParent\n", + "\n", + "\n", + "\n", + "\n", + "CCF\n", + "\n", + "\n", + "CCF\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Voxel\n", + "\n", + "\n", + "Voxel\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "CCF->Voxel\n", + "\n", + "\n", + "\n", + "\n", + "BrainRegion\n", + "\n", + "\n", + "BrainRegion\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "CCF->BrainRegion\n", + "\n", + "\n", + "\n", + "\n", + "BrainRegion->0\n", + "\n", + "\n", + "\n", + "\n", + "BrainRegion->Voxel\n", + "\n", + "\n", + "\n", + "\n", + "BrainRegion->RegionParent\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dj.Diagram(schema)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Populate the Database" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:57.352095Z", + "iopub.status.busy": "2026-01-14T07:34:57.351968Z", + "iopub.status.idle": "2026-01-14T07:34:57.366017Z", + "shell.execute_reply": "2026-01-14T07:34:57.365723Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " Common Coordinate Framework atlas\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "
\n", + "

ccf_id

\n", + " \n", + "
\n", + "

ccf_version

\n", + " e.g., 'CCFv3'\n", + "
\n", + "

ccf_resolution

\n", + " voxel resolution in microns\n", + "
\n", + "

ccf_description

\n", + " \n", + "
1CCFv325.0Allen Mouse CCF v3 (25Β΅m resolution)
\n", + " \n", + "

Total: 1

\n", + " " + ], + "text/plain": [ + "*ccf_id ccf_version ccf_resolution ccf_descriptio\n", + "+--------+ +------------+ +------------+ +------------+\n", + "1 CCFv3 25.0 Allen Mouse CC\n", + " (Total: 1)" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Insert CCF metadata\n", + "CCF.insert1(\n", + " {\n", + " 'ccf_id': 1,\n", + " 'ccf_version': 'CCFv3',\n", + " 'ccf_resolution': 25.0,\n", + " 'ccf_description': 'Allen Mouse CCF v3 (25Β΅m resolution)'\n", + " },\n", + " skip_duplicates=True\n", + ")\n", + "\n", + "CCF()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:57.367341Z", + "iopub.status.busy": "2026-01-14T07:34:57.367256Z", + "iopub.status.idle": "2026-01-14T07:34:57.476572Z", + "shell.execute_reply": "2026-01-14T07:34:57.476115Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + "BrainRegion: 0%| | 0/1 [00:00\n", + " .Table{\n", + " border-collapse:collapse;\n", + " }\n", + " .Table th{\n", + " background: #A0A0A0; color: #ffffff; padding:2px 4px; border:#f0e0e0 1px solid;\n", + " font-weight: normal; font-family: monospace; font-size: 75%; text-align: center;\n", + " }\n", + " .Table th p{\n", + " margin: 0;\n", + " }\n", + " .Table td{\n", + " padding:2px 4px; border:#f0e0e0 1px solid; font-size: 75%;\n", + " }\n", + " .Table tr:nth-child(odd){\n", + " background: #ffffff;\n", + " color: #000000;\n", + " }\n", + " .Table tr:nth-child(even){\n", + " background: #f3f1ff;\n", + " color: #000000;\n", + " }\n", + " /* Tooltip container */\n", + " .djtooltip {\n", + " }\n", + " /* Tooltip text */\n", + " .djtooltip .djtooltiptext {\n", + " visibility: hidden;\n", + " width: 120px;\n", + " background-color: black;\n", + " color: #fff;\n", + " text-align: center;\n", + " padding: 5px 0;\n", + " border-radius: 6px;\n", + " /* Position the tooltip text - see examples below! */\n", + " position: absolute;\n", + " z-index: 1;\n", + " }\n", + " #primary {\n", + " font-weight: bold;\n", + " color: black;\n", + " }\n", + " #nonprimary {\n", + " font-weight: normal;\n", + " color: white;\n", + " }\n", + "\n", + " /* Show the tooltip text when you mouse over the tooltip container */\n", + " .djtooltip:hover .djtooltiptext {\n", + " visibility: visible;\n", + " }\n", + "\n", + " /* Dark mode support */\n", + " @media (prefers-color-scheme: dark) {\n", + " .Table th{\n", + " background: #4a4a4a; color: #ffffff; border:#555555 1px solid; text-align: center;\n", + " }\n", + " .Table td{\n", + " border:#555555 1px solid;\n", + " }\n", + " .Table tr:nth-child(odd){\n", + " background: #2d2d2d;\n", + " color: #e0e0e0;\n", + " }\n", + " .Table tr:nth-child(even){\n", + " background: #3d3d3d;\n", + " color: #e0e0e0;\n", + " }\n", + " .djtooltip .djtooltiptext {\n", + " background-color: #555555;\n", + " color: #ffffff;\n", + " }\n", + " #primary {\n", + " color: #bd93f9;\n", + " }\n", + " #nonprimary {\n", + " color: #e0e0e0;\n", + " }\n", + " }\n", + " \n", + " \n", + " Brain region from Allen ontology\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

ccf_id

\n", + " \n", + "
\n", + "

region_id

\n", + " Allen structure ID\n", + "
\n", + "

acronym

\n", + " short name (e.g., 'VISp')\n", + "
\n", + "

region_name

\n", + " full name\n", + "
\n", + "

color_hex

\n", + " hex color code for visualization\n", + "
\n", + "

structure_order

\n", + " order in hierarchy\n", + "
11TMvTuberomammillary nucleus ventral partFF4C3E775
12SSp-m6bPrimary somatosensory area mouth layer 6b18806478
13secsecondary fissureAAAAAA1316
14ICInferior colliculusFF7AFF812
16intinternal capsuleCCCCCC1201
17PSVPrincipal sensory nucleus of the trigeminalFFAE6F889
18greyBasic cell groups and regionsBFDAE31
19SSp-tr6aPrimary somatosensory area trunk layer 6a18806491
110SCigSuperior colliculus motor related intermediate gray layerFF90FF834
111plfposterolateral fissureAAAAAA1317
112IFInterfascicular nucleus rapheFFA6FF869
114iminternal medullary lamina of the thalamusCCCCCC1213
\n", + "

...

\n", + "

Total: 94

\n", + " " + ], + "text/plain": [ + "*ccf_id *region_id acronym region_name color_hex structure_orde\n", + "+--------+ +-----------+ +----------+ +------------+ +-----------+ +------------+\n", + "1 1 TMv Tuberomammilla FF4C3E 775 \n", + "1 2 SSp-m6b Primary somato 188064 78 \n", + "1 3 sec secondary fiss AAAAAA 1316 \n", + "1 4 IC Inferior colli FF7AFF 812 \n", + "1 6 int internal capsu CCCCCC 1201 \n", + "1 7 PSV Principal sens FFAE6F 889 \n", + "1 8 grey Basic cell gro BFDAE3 1 \n", + "1 9 SSp-tr6a Primary somato 188064 91 \n", + "1 10 SCig Superior colli FF90FF 834 \n", + "1 11 plf posterolateral AAAAAA 1317 \n", + "1 12 IF Interfascicula FFA6FF 869 \n", + "1 14 im internal medul CCCCCC 1213 \n", + " ...\n", + " (Total: 94)" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# View sample regions\n", + "BrainRegion() & 'region_id < 100'" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:57.485593Z", + "iopub.status.busy": "2026-01-14T07:34:57.485474Z", + "iopub.status.idle": "2026-01-14T07:34:58.382985Z", + "shell.execute_reply": "2026-01-14T07:34:58.382681Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + "RegionParent: 0%| | 0/1327 [00:00\n", + " .Table{\n", + " border-collapse:collapse;\n", + " }\n", + " .Table th{\n", + " background: #A0A0A0; color: #ffffff; padding:2px 4px; border:#f0e0e0 1px solid;\n", + " font-weight: normal; font-family: monospace; font-size: 75%; text-align: center;\n", + " }\n", + " .Table th p{\n", + " margin: 0;\n", + " }\n", + " .Table td{\n", + " padding:2px 4px; border:#f0e0e0 1px solid; font-size: 75%;\n", + " }\n", + " .Table tr:nth-child(odd){\n", + " background: #ffffff;\n", + " color: #000000;\n", + " }\n", + " .Table tr:nth-child(even){\n", + " background: #f3f1ff;\n", + " color: #000000;\n", + " }\n", + " /* Tooltip container */\n", + " .djtooltip {\n", + " }\n", + " /* Tooltip text */\n", + " .djtooltip .djtooltiptext {\n", + " visibility: hidden;\n", + " width: 120px;\n", + " background-color: black;\n", + " color: #fff;\n", + " text-align: center;\n", + " padding: 5px 0;\n", + " border-radius: 6px;\n", + " /* Position the tooltip text - see examples below! */\n", + " position: absolute;\n", + " z-index: 1;\n", + " }\n", + " #primary {\n", + " font-weight: bold;\n", + " color: black;\n", + " }\n", + " #nonprimary {\n", + " font-weight: normal;\n", + " color: white;\n", + " }\n", + "\n", + " /* Show the tooltip text when you mouse over the tooltip container */\n", + " .djtooltip:hover .djtooltiptext {\n", + " visibility: visible;\n", + " }\n", + "\n", + " /* Dark mode support */\n", + " @media (prefers-color-scheme: dark) {\n", + " .Table th{\n", + " background: #4a4a4a; color: #ffffff; border:#555555 1px solid; text-align: center;\n", + " }\n", + " .Table td{\n", + " border:#555555 1px solid;\n", + " }\n", + " .Table tr:nth-child(odd){\n", + " background: #2d2d2d;\n", + " color: #e0e0e0;\n", + " }\n", + " .Table tr:nth-child(even){\n", + " background: #3d3d3d;\n", + " color: #e0e0e0;\n", + " }\n", + " .djtooltip .djtooltiptext {\n", + " background-color: #555555;\n", + " color: #ffffff;\n", + " }\n", + " #primary {\n", + " color: #bd93f9;\n", + " }\n", + " #nonprimary {\n", + " color: #e0e0e0;\n", + " }\n", + " }\n", + " \n", + " \n", + " Brain region from Allen ontology\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

ccf_id

\n", + " \n", + "
\n", + "

region_id

\n", + " Allen structure ID\n", + "
\n", + "

acronym

\n", + " short name (e.g., 'VISp')\n", + "
\n", + "

region_name

\n", + " full name\n", + "
\n", + "

color_hex

\n", + " hex color code for visualization\n", + "
\n", + "

structure_order

\n", + " order in hierarchy\n", + "
1385VISpPrimary visual area08858C185
\n", + " \n", + "

Total: 1

\n", + " " + ], + "text/plain": [ + "*ccf_id *region_id acronym region_name color_hex structure_orde\n", + "+--------+ +-----------+ +---------+ +------------+ +-----------+ +------------+\n", + "1 385 VISp Primary visual 08858C 185 \n", + " (Total: 1)" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Find primary visual cortex\n", + "BrainRegion & 'acronym = \"VISp\"'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Find Children of a Region" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:58.390739Z", + "iopub.status.busy": "2026-01-14T07:34:58.390628Z", + "iopub.status.idle": "2026-01-14T07:34:58.397056Z", + "shell.execute_reply": "2026-01-14T07:34:58.396790Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

ccf_id

\n", + " \n", + "
\n", + "

region_id

\n", + " Allen structure ID\n", + "
\n", + "

acronym

\n", + " short name (e.g., 'VISp')\n", + "
\n", + "

region_name

\n", + " full name\n", + "
133VISp6aPrimary visual area layer 6a
1305VISp6bPrimary visual area layer 6b
1593VISp1Primary visual area layer 1
1721VISp4Primary visual area layer 4
1778VISp5Primary visual area layer 5
1821VISp2/3Primary visual area layer 2/3
\n", + " \n", + "

Total: 6

\n", + " " + ], + "text/plain": [ + "*ccf_id *region_id acronym region_name \n", + "+--------+ +-----------+ +---------+ +------------+\n", + "1 33 VISp6a Primary visual\n", + "1 305 VISp6b Primary visual\n", + "1 593 VISp1 Primary visual\n", + "1 721 VISp4 Primary visual\n", + "1 778 VISp5 Primary visual\n", + "1 821 VISp2/3 Primary visual\n", + " (Total: 6)" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Get VISp region ID\n", + "visp = (BrainRegion & 'acronym = \"VISp\"').fetch1()\n", + "visp_id = visp['region_id']\n", + "\n", + "# Find all children (direct descendants)\n", + "children = BrainRegion * (RegionParent & f'parent_id = {visp_id}' & f'region_id != {visp_id}')\n", + "children.proj('acronym', 'region_name')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Find Parent Path (Ancestors)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:58.398372Z", + "iopub.status.busy": "2026-01-14T07:34:58.398278Z", + "iopub.status.idle": "2026-01-14T07:34:58.407792Z", + "shell.execute_reply": "2026-01-14T07:34:58.407586Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Path from VISp1 to root:\n", + "root β†’ grey β†’ CH β†’ CTX β†’ CTXpl β†’ Isocortex β†’ VIS β†’ VISp β†’ VISp1\n" + ] + } + ], + "source": [ + "def get_ancestors(region_acronym, ccf_id=1):\n", + " \"\"\"Get the path from a region to the root.\"\"\"\n", + " region = (BrainRegion & f'acronym = \"{region_acronym}\"' & f'ccf_id = {ccf_id}').fetch1()\n", + " region_id = region['region_id']\n", + " \n", + " path = [region['acronym']]\n", + " \n", + " while True:\n", + " parent_id = (RegionParent & {'ccf_id': ccf_id, 'region_id': region_id}).fetch1('parent_id')\n", + " if parent_id == region_id: # reached root\n", + " break\n", + " parent = (BrainRegion & {'ccf_id': ccf_id, 'region_id': parent_id}).fetch1()\n", + " path.append(parent['acronym'])\n", + " region_id = parent_id\n", + " \n", + " return ' β†’ '.join(reversed(path))\n", + "\n", + "# Show path from VISp layer 1 to root\n", + "print(\"Path from VISp1 to root:\")\n", + "print(get_ancestors('VISp1'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Count Regions by Depth" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:58.409116Z", + "iopub.status.busy": "2026-01-14T07:34:58.409018Z", + "iopub.status.idle": "2026-01-14T07:34:58.547611Z", + "shell.execute_reply": "2026-01-14T07:34:58.547338Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "([,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ],\n", + " [Text(0, 0, '0'),\n", + " Text(1, 0, '1'),\n", + " Text(2, 0, '2'),\n", + " Text(3, 0, '3'),\n", + " Text(4, 0, '4'),\n", + " Text(5, 0, '5'),\n", + " Text(6, 0, '6'),\n", + " Text(7, 0, '7'),\n", + " Text(8, 0, '8'),\n", + " Text(9, 0, '9'),\n", + " Text(10, 0, '10')])" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Aggregate regions by depth in hierarchy\n", + "import matplotlib.pyplot as plt\n", + "\n", + "depths = (RegionParent & 'ccf_id = 1').to_arrays('depth')\n", + "unique, counts = np.unique(depths, return_counts=True)\n", + "\n", + "plt.figure(figsize=(10, 4))\n", + "plt.bar(unique, counts)\n", + "plt.xlabel('Depth in Hierarchy')\n", + "plt.ylabel('Number of Regions')\n", + "plt.title('Brain Regions by Hierarchy Depth')\n", + "plt.xticks(unique)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Search Regions by Name" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:58.549185Z", + "iopub.status.busy": "2026-01-14T07:34:58.549055Z", + "iopub.status.idle": "2026-01-14T07:34:58.555365Z", + "shell.execute_reply": "2026-01-14T07:34:58.555096Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

ccf_id

\n", + " \n", + "
\n", + "

region_id

\n", + " Allen structure ID\n", + "
\n", + "

acronym

\n", + " short name (e.g., 'VISp')\n", + "
\n", + "

region_name

\n", + " full name\n", + "
133VISp6aPrimary visual area layer 6a
141VISpm2/3posteromedial visual area layer 2/3
174VISl6aLateral visual area layer 6a
1121VISl6bLateral visual area layer 6b
1233VISal5Anterolateral visual area layer 5
1257VISpm6aposteromedial visual area layer 6a
1269VISpl2/3Posterolateral visual area layer 2/3
1281VISam1Anteromedial visual area layer 1
1305VISp6bPrimary visual area layer 6b
1377VISpl6aPosterolateral visual area layer 6a
1385VISpPrimary visual area
1393VISpl6bPosterolateral visual area layer 6b
\n", + "

...

\n", + "

Total: 85

\n", + " " + ], + "text/plain": [ + "*ccf_id *region_id acronym region_name \n", + "+--------+ +-----------+ +----------+ +------------+\n", + "1 33 VISp6a Primary visual\n", + "1 41 VISpm2/3 posteromedial \n", + "1 74 VISl6a Lateral visual\n", + "1 121 VISl6b Lateral visual\n", + "1 233 VISal5 Anterolateral \n", + "1 257 VISpm6a posteromedial \n", + "1 269 VISpl2/3 Posterolateral\n", + "1 281 VISam1 Anteromedial v\n", + "1 305 VISp6b Primary visual\n", + "1 377 VISpl6a Posterolateral\n", + "1 385 VISp Primary visual\n", + "1 393 VISpl6b Posterolateral\n", + " ...\n", + " (Total: 85)" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Find all visual-related regions\n", + "(BrainRegion & 'region_name LIKE \"%Visual%\"').proj('acronym', 'region_name')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Extending the Schema\n", + "\n", + "### Recording Locations\n", + "\n", + "A common use case is tracking where electrodes were placed during recordings.\n", + "\n", + "**Design choice:** Here we use `recording_id` alone as the primary key, with `BrainRegion` (which includes `ccf_id`) as a dependent attribute. This means each recording has exactly one canonical atlas registration.\n", + "\n", + "An alternative design would include `ccf_id` in the primary key:\n", + "```python\n", + "recording_id : int32\n", + "-> CCF\n", + "---\n", + "...\n", + "```\n", + "This would allow the same recording to be registered to multiple atlas versions (e.g., comparing assignments in CCFv2 vs CCFv3). Choose based on your use case:\n", + "\n", + "| Design | Primary Key | Use Case |\n", + "|--------|-------------|----------|\n", + "| Single registration | `recording_id` | One canonical atlas per lab |\n", + "| Multi-atlas | `(recording_id, ccf_id)` | Compare across atlas versions |" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:58.556774Z", + "iopub.status.busy": "2026-01-14T07:34:58.556688Z", + "iopub.status.idle": "2026-01-14T07:34:58.593144Z", + "shell.execute_reply": "2026-01-14T07:34:58.592883Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

recording_id

\n", + " \n", + "
\n", + "

ap

\n", + " anterior-posterior (Β΅m from bregma)\n", + "
\n", + "

dv

\n", + " dorsal-ventral (Β΅m from brain surface)\n", + "
\n", + "

ml

\n", + " medial-lateral (Β΅m from midline)\n", + "
\n", + "

ccf_id

\n", + " \n", + "
\n", + "

region_id

\n", + " Allen structure ID\n", + "
\n", + "

acronym

\n", + " short name (e.g., 'VISp')\n", + "
\n", + "

region_name

\n", + " full name\n", + "
1-3500.0500.02500.01385VISpPrimary visual area
2-1800.01200.01500.01382CA1Field CA1
\n", + " \n", + "

Total: 2

\n", + " " + ], + "text/plain": [ + "*recording_id ap dv ml ccf_id region_id acronym region_name \n", + "+------------+ +---------+ +--------+ +--------+ +--------+ +-----------+ +---------+ +------------+\n", + "1 -3500.0 500.0 2500.0 1 385 VISp Primary visual\n", + "2 -1800.0 1200.0 1500.0 1 382 CA1 Field CA1 \n", + " (Total: 2)" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "@schema\n", + "class RecordingSite(dj.Manual):\n", + " definition = \"\"\"\n", + " # Recording electrode location\n", + " recording_id : int32\n", + " ---\n", + " ap : float32 # anterior-posterior (Β΅m from bregma)\n", + " dv : float32 # dorsal-ventral (Β΅m from brain surface)\n", + " ml : float32 # medial-lateral (Β΅m from midline)\n", + " -> BrainRegion # assigned brain region (includes ccf_id)\n", + " \"\"\"\n", + "\n", + "# Insert example recording sites\n", + "RecordingSite.insert([\n", + " {'recording_id': 1, 'ccf_id': 1, 'ap': -3500, 'dv': 500, 'ml': 2500, \n", + " 'region_id': (BrainRegion & 'acronym=\"VISp\"').fetch1('region_id')},\n", + " {'recording_id': 2, 'ccf_id': 1, 'ap': -1800, 'dv': 1200, 'ml': 1500,\n", + " 'region_id': (BrainRegion & 'acronym=\"CA1\"').fetch1('region_id')},\n", + "], skip_duplicates=True)\n", + "\n", + "# View recordings with region info\n", + "RecordingSite * BrainRegion.proj('acronym', 'region_name')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "This tutorial demonstrated DataJoint patterns for atlas and ontology data:\n", + "\n", + "| Pattern | Example | Purpose |\n", + "|---------|---------|--------|\n", + "| **Hierarchical data** | `BrainRegion`, `RegionParent` | Model tree structures |\n", + "| **Self-referential FK** | `parent_id β†’ region_id` | Parent-child relationships |\n", + "| **Batch insert** | `self.insert(entries)` | Efficient bulk loading |\n", + "| **Secondary index** | `index(y, z)` | Optimize spatial queries |\n", + "| **Linked tables** | `RecordingSite β†’ BrainRegion` | Reference atlas in experiments |\n", + "\n", + "### Loading Full Atlas Data\n", + "\n", + "To load the complete 3D volume:\n", + "\n", + "1. Download NRRD file from [Allen Institute](http://download.alleninstitute.org/informatics-archive/current-release/mouse_ccf/annotation/ccf_2017/)\n", + "2. Install `pynrrd`: `pip install pynrrd`\n", + "3. Load and insert voxels (see [Element Electrode Localization](https://github.com/datajoint/element-electrode-localization))" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:58.594570Z", + "iopub.status.busy": "2026-01-14T07:34:58.594449Z", + "iopub.status.idle": "2026-01-14T07:34:58.717320Z", + "shell.execute_reply": "2026-01-14T07:34:58.716899Z" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "1\n", + "\n", + "1\n", + "\n", + "\n", + "\n", + "RegionParent\n", + "\n", + "\n", + "RegionParent\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "1->RegionParent\n", + "\n", + "\n", + "\n", + "\n", + "RecordingSite\n", + "\n", + "\n", + "RecordingSite\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "CCF\n", + "\n", + "\n", + "CCF\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Voxel\n", + "\n", + "\n", + "Voxel\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "CCF->Voxel\n", + "\n", + "\n", + "\n", + "\n", + "BrainRegion\n", + "\n", + "\n", + "BrainRegion\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "CCF->BrainRegion\n", + "\n", + "\n", + "\n", + "\n", + "BrainRegion->1\n", + "\n", + "\n", + "\n", + "\n", + "BrainRegion->RecordingSite\n", + "\n", + "\n", + "\n", + "\n", + "BrainRegion->Voxel\n", + "\n", + "\n", + "\n", + "\n", + "BrainRegion->RegionParent\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Final schema diagram\n", + "dj.Diagram(schema)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:58.719002Z", + "iopub.status.busy": "2026-01-14T07:34:58.718859Z", + "iopub.status.idle": "2026-01-14T07:34:58.744403Z", + "shell.execute_reply": "2026-01-14T07:34:58.744040Z" + } + }, + "outputs": [], + "source": [ + "# Cleanup\n", + "schema.drop(prompt=False)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/src/tutorials/domain/allen-ccf/data/allen_structure_graph.csv b/src/tutorials/domain/allen-ccf/data/allen_structure_graph.csv new file mode 100644 index 00000000..94979c76 --- /dev/null +++ b/src/tutorials/domain/allen-ccf/data/allen_structure_graph.csv @@ -0,0 +1,1328 @@ +id,atlas_id,name,acronym,st_level,ontology_id,hemisphere_id,weight,parent_structure_id,depth,graph_id,graph_order,structure_id_path,color_hex_triplet,neuro_name_structure_id,neuro_name_structure_id_path,failed,sphinx_id,structure_name_facet,failed_facet,safe_name +997,-1,root,root,0,1,3,8690,,0,1,0,/997/,FFFFFF,,,f,1,385153371,734881840,root +8,0,Basic cell groups and regions,grey,1,1,3,8690,997,1,1,1,/997/8/,BFDAE3,,,f,2,2244697386,734881840,Basic cell groups and regions +567,70,Cerebrum,CH,2,1,3,8690,8,2,1,2,/997/8/567/,B0F0FF,,,f,3,2878815794,734881840,Cerebrum +688,85,Cerebral cortex,CTX,3,1,3,8690,567,3,1,3,/997/8/567/688/,B0FFB8,,,f,4,3591311804,734881840,Cerebral cortex +695,86,Cortical plate,CTXpl,4,1,3,8690,688,4,1,4,/997/8/567/688/695/,70FF70,,,f,5,3945900931,734881840,Cortical plate +315,746,Isocortex,Isocortex,5,1,3,8690,695,5,1,5,/997/8/567/688/695/315/,70FF71,,,f,6,2323732626,734881840,Isocortex +184,871,"Frontal pole, cerebral cortex",FRP,8,1,3,8690,315,6,1,6,/997/8/567/688/695/315/184/,268F45,,,f,7,2565719060,734881840,Frontal pole cerebral cortex +68,998,"Frontal pole, layer 1",FRP1,11,1,3,8690,184,7,1,7,/997/8/567/688/695/315/184/68/,268F45,,,f,8,1397862467,734881840,Frontal pole layer 1 +667,1073,"Frontal pole, layer 2/3",FRP2/3,11,1,3,8690,184,7,1,8,/997/8/567/688/695/315/184/667/,268F45,,,f,9,4268100038,734881840,Frontal pole layer 2/3 +526157192,,"Frontal pole, layer 5",FRP5,11,1,3,8690,184,7,1,9,/997/8/567/688/695/315/184/526157192/,268F45,,,f,10,1413248090,734881840,Frontal pole layer 5 +526157196,,"Frontal pole, layer 6a",FRP6a,11,1,3,8690,184,7,1,10,/997/8/567/688/695/315/184/526157196/,268F45,,,f,11,1215326494,734881840,Frontal pole layer 6a +526322264,,"Frontal pole, layer 6b",FRP6b,11,1,3,8690,184,7,1,11,/997/8/567/688/695/315/184/526322264/,268F45,,,f,12,3514382500,734881840,Frontal pole layer 6b +500,203,Somatomotor areas,MO,6,1,3,8690,315,6,1,12,/997/8/567/688/695/315/500/,1F9D5A,,,f,13,356591023,734881840,Somatomotor areas +107,1003,"Somatomotor areas, Layer 1",MO1,11,1,3,8690,500,7,1,13,/997/8/567/688/695/315/500/107/,1F9D5A,,,f,14,900612548,734881840,Somatomotor areas Layer 1 +219,1017,"Somatomotor areas, Layer 2/3",MO2/3,11,1,3,8690,500,7,1,14,/997/8/567/688/695/315/500/219/,1F9D5A,,,f,15,1075749695,734881840,Somatomotor areas Layer 2/3 +299,1027,"Somatomotor areas, Layer 5",MO5,11,1,3,8690,500,7,1,15,/997/8/567/688/695/315/500/299/,1F9D5A,,,f,16,851674589,734881840,Somatomotor areas Layer 5 +644,787,"Somatomotor areas, Layer 6a",MO6a,11,1,3,8690,500,7,1,16,/997/8/567/688/695/315/500/644/,1F9D5A,,,f,17,1003126892,734881840,Somatomotor areas Layer 6a +947,825,"Somatomotor areas, Layer 6b",MO6b,11,1,3,8690,500,7,1,17,/997/8/567/688/695/315/500/947/,1F9D5A,,,f,18,2730742230,734881840,Somatomotor areas Layer 6b +985,830,Primary motor area,MOp,8,1,3,8690,500,7,1,18,/997/8/567/688/695/315/500/985/,1F9D5A,,,f,19,1852742012,734881840,Primary motor area +320,888,"Primary motor area, Layer 1",MOp1,11,1,3,8690,985,8,1,19,/997/8/567/688/695/315/500/985/320/,1F9D5A,,,f,20,571569106,734881840,Primary motor area Layer 1 +943,966,"Primary motor area, Layer 2/3",MOp2/3,11,1,3,8690,985,8,1,20,/997/8/567/688/695/315/500/985/943/,1F9D5A,,,f,21,2488357079,734881840,Primary motor area Layer 2/3 +648,929,"Primary motor area, Layer 5",MOp5,11,1,3,8690,985,8,1,21,/997/8/567/688/695/315/500/985/648/,1F9D5A,,,f,22,628930507,734881840,Primary motor area Layer 5 +844,1095,"Primary motor area, Layer 6a",MOp6a,11,1,3,8690,985,8,1,22,/997/8/567/688/695/315/500/985/844/,1F9D5A,,,f,23,3473508879,734881840,Primary motor area Layer 6a +882,1100,"Primary motor area, Layer 6b",MOp6b,11,1,3,8690,985,8,1,23,/997/8/567/688/695/315/500/985/882/,1F9D5A,,,f,24,1442896821,734881840,Primary motor area Layer 6b +993,831,Secondary motor area,MOs,8,1,3,8690,500,7,1,24,/997/8/567/688/695/315/500/993/,1F9D5A,,,f,25,1043755260,734881840,Secondary motor area +656,930,"Secondary motor area, layer 1",MOs1,11,1,3,8690,993,8,1,25,/997/8/567/688/695/315/500/993/656/,1F9D5A,,,f,26,4032915713,734881840,Secondary motor area layer 1 +962,1110,"Secondary motor area, layer 2/3",MOs2/3,11,1,3,8690,993,8,1,26,/997/8/567/688/695/315/500/993/962/,1F9D5A,,,f,27,3274108161,734881840,Secondary motor area layer 2/3 +767,944,"Secondary motor area, layer 5",MOs5,11,1,3,8690,993,8,1,27,/997/8/567/688/695/315/500/993/767/,1F9D5A,,,f,28,4144803096,734881840,Secondary motor area layer 5 +1021,1117,"Secondary motor area, layer 6a",MOs6a,11,1,3,8690,993,8,1,28,/997/8/567/688/695/315/500/993/1021/,1F9D5A,,,f,29,3489757563,734881840,Secondary motor area layer 6a +1085,1125,"Secondary motor area, layer 6b",MOs6b,11,1,3,8690,993,8,1,29,/997/8/567/688/695/315/500/993/1085/,1F9D5A,,,f,30,1225271489,734881840,Secondary motor area layer 6b +453,339,Somatosensory areas,SS,6,1,3,8690,315,6,1,30,/997/8/567/688/695/315/453/,188064,,,f,31,3016301862,734881840,Somatosensory areas +12993,,"Somatosensory areas, layer 1",SS1,11,1,3,8690,453,7,1,31,/997/8/567/688/695/315/453/12993/,188064,,,f,32,544207135,734881840,Somatosensory areas layer 1 +12994,,"Somatosensory areas, layer 2/3",SS2/3,11,1,3,8690,453,7,1,32,/997/8/567/688/695/315/453/12994/,188064,,,f,33,3920828838,734881840,Somatosensory areas layer 2/3 +12995,,"Somatosensory areas, layer 4",SS4,11,1,3,8690,453,7,1,33,/997/8/567/688/695/315/453/12995/,188064,,,f,34,1342506384,734881840,Somatosensory areas layer 4 +12996,,"Somatosensory areas, layer 5",SS5,11,1,3,8690,453,7,1,34,/997/8/567/688/695/315/453/12996/,188064,,,f,35,654456070,734881840,Somatosensory areas layer 5 +12997,,"Somatosensory areas, layer 6a",SS6a,11,1,3,8690,453,7,1,35,/997/8/567/688/695/315/453/12997/,188064,,,f,36,719211136,734881840,Somatosensory areas layer 6a +12998,,"Somatosensory areas, layer 6b",SS6b,11,1,3,8690,453,7,1,36,/997/8/567/688/695/315/453/12998/,188064,,,f,37,3017218874,734881840,Somatosensory areas layer 6b +322,747,Primary somatosensory area,SSp,8,1,3,8690,453,7,1,37,/997/8/567/688/695/315/453/322/,188064,,,f,38,131561364,734881840,Primary somatosensory area +793,1089,"Primary somatosensory area, layer 1",SSp1,11,1,3,8690,322,8,1,38,/997/8/567/688/695/315/453/322/793/,188064,,,f,39,1205993041,734881840,Primary somatosensory area layer 1 +346,1033,"Primary somatosensory area, layer 2/3",SSp2/3,11,1,3,8690,322,8,1,39,/997/8/567/688/695/315/453/322/346/,188064,,,f,40,401998130,734881840,Primary somatosensory area layer 2/3 +865,1098,"Primary somatosensory area, layer 4",SSp4,11,1,3,8690,322,8,1,40,/997/8/567/688/695/315/453/322/865/,188064,,,f,41,931859166,734881840,Primary somatosensory area layer 4 +921,1105,"Primary somatosensory area, layer 5",SSp5,11,1,3,8690,322,8,1,41,/997/8/567/688/695/315/453/322/921/,188064,,,f,42,1082931784,734881840,Primary somatosensory area layer 5 +686,934,"Primary somatosensory area, layer 6a",SSp6a,11,1,3,8690,322,8,1,42,/997/8/567/688/695/315/453/322/686/,188064,,,f,43,3151865880,734881840,Primary somatosensory area layer 6a +719,938,"Primary somatosensory area, layer 6b",SSp6b,11,1,3,8690,322,8,1,43,/997/8/567/688/695/315/453/322/719/,188064,,,f,44,584382882,734881840,Primary somatosensory area layer 6b +353,751,"Primary somatosensory area, nose",SSp-n,9,1,3,8690,322,8,1,44,/997/8/567/688/695/315/453/322/353/,188064,,,f,45,3014838097,734881840,Primary somatosensory area nose +558,635,"Primary somatosensory area, nose, layer 1",SSp-n1,11,1,3,8690,353,9,1,45,/997/8/567/688/695/315/453/322/353/558/,188064,,,f,46,3903637663,734881840,Primary somatosensory area nose layer 1 +838,953,"Primary somatosensory area, nose, layer 2/3",SSp-n2/3,11,1,3,8690,353,9,1,46,/997/8/567/688/695/315/453/322/353/838/,188064,,,f,47,2369110310,734881840,Primary somatosensory area nose layer 2/3 +654,647,"Primary somatosensory area, nose, layer 4",SSp-n4,11,1,3,8690,353,9,1,47,/997/8/567/688/695/315/453/322/353/654/,188064,,,f,48,2563128336,734881840,Primary somatosensory area nose layer 4 +702,653,"Primary somatosensory area, nose, layer 5",SSp-n5,11,1,3,8690,353,9,1,48,/997/8/567/688/695/315/453/322/353/702/,188064,,,f,49,4022406278,734881840,Primary somatosensory area nose layer 5 +889,1101,"Primary somatosensory area, nose, layer 6a",SSp-n6a,11,1,3,8690,353,9,1,49,/997/8/567/688/695/315/453/322/353/889/,188064,,,f,50,3350071961,734881840,Primary somatosensory area nose layer 6a +929,1106,"Primary somatosensory area, nose, layer 6b",SSp-n6b,11,1,3,8690,353,9,1,50,/997/8/567/688/695/315/453/322/353/929/,188064,,,f,51,1588026147,734881840,Primary somatosensory area nose layer 6b +329,748,"Primary somatosensory area, barrel field",SSp-bfd,9,1,3,8690,322,8,1,51,/997/8/567/688/695/315/453/322/329/,188064,,,f,52,3406319794,734881840,Primary somatosensory area barrel field +981,971,"Primary somatosensory area, barrel field, layer 1",SSp-bfd1,11,1,3,8690,329,9,1,52,/997/8/567/688/695/315/453/322/329/981/,188064,,,f,53,3178183090,734881840,Primary somatosensory area barrel field layer 1 +201,1015,"Primary somatosensory area, barrel field, layer 2/3",SSp-bfd2/3,11,1,3,8690,329,9,1,53,/997/8/567/688/695/315/453/322/329/201/,188064,,,f,54,1738869888,734881840,Primary somatosensory area barrel field layer 2/3 +1047,979,"Primary somatosensory area, barrel field, layer 4",SSp-bfd4,11,1,3,8690,329,9,1,54,/997/8/567/688/695/315/453/322/329/1047/,188064,,,f,55,3439709501,734881840,Primary somatosensory area barrel field layer 4 +1070,982,"Primary somatosensory area, barrel field, layer 5",SSp-bfd5,11,1,3,8690,329,9,1,55,/997/8/567/688/695/315/453/322/329/1070/,188064,,,f,56,3120758187,734881840,Primary somatosensory area barrel field layer 5 +1038,978,"Primary somatosensory area, barrel field, layer 6a",SSp-bfd6a,11,1,3,8690,329,9,1,56,/997/8/567/688/695/315/453/322/329/1038/,188064,,,f,57,2183435549,734881840,Primary somatosensory area barrel field layer 6a +1062,981,"Primary somatosensory area, barrel field, layer 6b",SSp-bfd6b,11,1,3,8690,329,9,1,57,/997/8/567/688/695/315/453/322/329/1062/,188064,,,f,58,455984295,734881840,Primary somatosensory area barrel field layer 6b +480149202,,Rostrolateral lateral visual area,VISrll,10,1,3,8690,329,9,1,58,/997/8/567/688/695/315/453/322/329/480149202/,188064,,,f,59,3664552515,734881840,Rostrolateral lateral visual area +480149206,,"Rostrolateral lateral visual area, layer 1",VISrll1,11,1,3,8690,480149202,10,1,59,/997/8/567/688/695/315/453/322/329/480149202/480149206/,188064,,,f,60,3014325736,734881840,Rostrolateral lateral visual area layer 1 +480149210,,"Rostrolateral lateral visual area, layer 2/3",VISrll2/3,11,1,3,8690,480149202,10,1,60,/997/8/567/688/695/315/453/322/329/480149202/480149210/,188064,,,f,61,3038984448,734881840,Rostrolateral lateral visual area layer 2/3 +480149214,,"Rostrolateral lateral visual area, layer 4",VISrll4,11,1,3,8690,480149202,10,1,61,/997/8/567/688/695/315/453/322/329/480149202/480149214/,188064,,,f,62,3284140391,734881840,Rostrolateral lateral visual area layer 4 +480149218,,"Rostrolateral lateral visual area,layer 5",VISrll5,11,1,3,8690,480149202,10,1,62,/997/8/567/688/695/315/453/322/329/480149202/480149218/,188064,,,f,63,1253499024,734881840,Rostrolateral lateral visual arealayer 5 +480149222,,"Rostrolateral lateral visual area, layer 6a",VISrll6a,11,1,3,8690,480149202,10,1,63,/997/8/567/688/695/315/453/322/329/480149202/480149222/,188064,,,f,64,160753723,734881840,Rostrolateral lateral visual area layer 6a +480149226,,"Rostrolateral lateral visual area, layer 6b",VISrll6b,11,1,3,8690,480149202,10,1,64,/997/8/567/688/695/315/453/322/329/480149202/480149226/,188064,,,f,65,2426255745,734881840,Rostrolateral lateral visual area layer 6b +337,749,"Primary somatosensory area, lower limb",SSp-ll,9,1,3,8690,322,8,1,65,/997/8/567/688/695/315/453/322/337/,188064,,,f,66,533428449,734881840,Primary somatosensory area lower limb +1030,977,"Primary somatosensory area, lower limb, layer 1",SSp-ll1,11,1,3,8690,337,9,1,66,/997/8/567/688/695/315/453/322/337/1030/,188064,,,f,67,1906118639,734881840,Primary somatosensory area lower limb layer 1 +113,1004,"Primary somatosensory area, lower limb, layer 2/3",SSp-ll2/3,11,1,3,8690,337,9,1,67,/997/8/567/688/695/315/453/322/337/113/,188064,,,f,68,2802480882,734881840,Primary somatosensory area lower limb layer 2/3 +1094,985,"Primary somatosensory area, lower limb, layer 4",SSp-ll4,11,1,3,8690,337,9,1,68,/997/8/567/688/695/315/453/322/337/1094/,188064,,,f,69,33028960,734881840,Primary somatosensory area lower limb layer 4 +1128,989,"Primary somatosensory area, lower limb, layer 5",SSp-ll5,11,1,3,8690,337,9,1,69,/997/8/567/688/695/315/453/322/337/1128/,188064,,,f,70,1995492342,734881840,Primary somatosensory area lower limb layer 5 +478,625,"Primary somatosensory area, lower limb, layer 6a",SSp-ll6a,11,1,3,8690,337,9,1,70,/997/8/567/688/695/315/453/322/337/478/,188064,,,f,71,2536655458,734881840,Primary somatosensory area lower limb layer 6a +510,629,"Primary somatosensory area, lower limb, layer 6b",SSp-ll6b,11,1,3,8690,337,9,1,71,/997/8/567/688/695/315/453/322/337/510/,188064,,,f,72,238754776,734881840,Primary somatosensory area lower limb layer 6b +345,750,"Primary somatosensory area, mouth",SSp-m,9,1,3,8690,322,8,1,72,/997/8/567/688/695/315/453/322/345/,188064,,,f,73,2638278704,734881840,Primary somatosensory area mouth +878,958,"Primary somatosensory area, mouth, layer 1",SSp-m1,11,1,3,8690,345,9,1,73,/997/8/567/688/695/315/453/322/345/878/,188064,,,f,74,3213023761,734881840,Primary somatosensory area mouth layer 1 +657,1072,"Primary somatosensory area, mouth, layer 2/3",SSp-m2/3,11,1,3,8690,345,9,1,74,/997/8/567/688/695/315/453/322/345/657/,188064,,,f,75,3683406469,734881840,Primary somatosensory area mouth layer 2/3 +950,967,"Primary somatosensory area, mouth, layer 4",SSp-m4,11,1,3,8690,345,9,1,75,/997/8/567/688/695/315/453/322/345/950/,188064,,,f,76,3488099998,734881840,Primary somatosensory area mouth layer 4 +974,970,"Primary somatosensory area, mouth, layer 5",SSp-m5,11,1,3,8690,345,9,1,76,/997/8/567/688/695/315/453/322/345/974/,188064,,,f,77,3102678536,734881840,Primary somatosensory area mouth layer 5 +1102,986,"Primary somatosensory area, mouth, layer 6a",SSp-m6a,11,1,3,8690,345,9,1,77,/997/8/567/688/695/315/453/322/345/1102/,188064,,,f,78,3455683244,734881840,Primary somatosensory area mouth layer 6a +2,990,"Primary somatosensory area, mouth, layer 6b",SSp-m6b,11,1,3,8690,345,9,1,78,/997/8/567/688/695/315/453/322/345/2/,188064,,,f,79,1425070870,734881840,Primary somatosensory area mouth layer 6b +369,753,"Primary somatosensory area, upper limb",SSp-ul,9,1,3,8690,322,8,1,79,/997/8/567/688/695/315/453/322/369/,188064,,,f,80,3184285306,734881840,Primary somatosensory area upper limb +450,1046,"Primary somatosensory area, upper limb, layer 1",SSp-ul1,11,1,3,8690,369,9,1,80,/997/8/567/688/695/315/453/322/369/450/,188064,,,f,81,2333546951,734881840,Primary somatosensory area upper limb layer 1 +854,955,"Primary somatosensory area, upper limb, layer 2/3",SSp-ul2/3,11,1,3,8690,369,9,1,81,/997/8/567/688/695/315/453/322/369/854/,188064,,,f,82,243505027,734881840,Primary somatosensory area upper limb layer 2/3 +577,1062,"Primary somatosensory area, upper limb, layer 4",SSp-ul4,11,1,3,8690,369,9,1,82,/997/8/567/688/695/315/453/322/369/577/,188064,,,f,83,4219333960,734881840,Primary somatosensory area upper limb layer 4 +625,1068,"Primary somatosensory area, upper limb, layer 5",SSp-ul5,11,1,3,8690,369,9,1,83,/997/8/567/688/695/315/453/322/369/625/,188064,,,f,84,2356862430,734881840,Primary somatosensory area upper limb layer 5 +945,1108,"Primary somatosensory area, upper limb, layer 6a",SSp-ul6a,11,1,3,8690,369,9,1,84,/997/8/567/688/695/315/453/322/369/945/,188064,,,f,85,2726127758,734881840,Primary somatosensory area upper limb layer 6a +1026,1118,"Primary somatosensory area, upper limb, layer 6b",SSp-ul6b,11,1,3,8690,369,9,1,85,/997/8/567/688/695/315/453/322/369/1026/,188064,,,f,86,997472564,734881840,Primary somatosensory area upper limb layer 6b +361,752,"Primary somatosensory area, trunk",SSp-tr,9,1,3,8690,322,8,1,86,/997/8/567/688/695/315/453/322/361/,188064,,,f,87,2078745056,734881840,Primary somatosensory area trunk +1006,974,"Primary somatosensory area, trunk, layer 1",SSp-tr1,11,1,3,8690,361,9,1,87,/997/8/567/688/695/315/453/322/361/1006/,188064,,,f,88,396802005,734881840,Primary somatosensory area trunk layer 1 +670,649,"Primary somatosensory area, trunk, layer 2/3",SSp-tr2/3,11,1,3,8690,361,9,1,88,/997/8/567/688/695/315/453/322/361/670/,188064,,,f,89,1192883470,734881840,Primary somatosensory area trunk layer 2/3 +1086,984,"Primary somatosensory area, trunk, layer 4",SSp-tr4,11,1,3,8690,361,9,1,89,/997/8/567/688/695/315/453/322/361/1086/,188064,,,f,90,1741439834,734881840,Primary somatosensory area trunk layer 4 +1111,987,"Primary somatosensory area, trunk, layer 5",SSp-tr5,11,1,3,8690,361,9,1,90,/997/8/567/688/695/315/453/322/361/1111/,188064,,,f,91,281768908,734881840,Primary somatosensory area trunk layer 5 +9,991,"Primary somatosensory area, trunk, layer 6a",SSp-tr6a,11,1,3,8690,361,9,1,91,/997/8/567/688/695/315/453/322/361/9/,188064,,,f,92,1364764776,734881840,Primary somatosensory area trunk layer 6a +461,623,"Primary somatosensory area, trunk, layer 6b",SSp-tr6b,11,1,3,8690,361,9,1,92,/997/8/567/688/695/315/453/322/361/461/,188064,,,f,93,3360815570,734881840,Primary somatosensory area trunk layer 6b +182305689,,"Primary somatosensory area, unassigned",SSp-un,9,1,3,8690,322,8,1,93,/997/8/567/688/695/315/453/322/182305689/,188064,,,f,94,10092796,734881840,Primary somatosensory area unassigned +182305693,,"Primary somatosensory area, unassigned, layer 1",SSp-un1,11,1,3,8690,182305689,9,1,94,/997/8/567/688/695/315/453/322/182305689/182305693/,188064,,,f,95,1824943704,734881840,Primary somatosensory area unassigned layer 1 +182305697,,"Primary somatosensory area, unassigned, layer 2/3",SSp-un2/3,11,1,3,8690,182305689,9,1,95,/997/8/567/688/695/315/453/322/182305689/182305697/,188064,,,f,96,909836824,734881840,Primary somatosensory area unassigned layer 2/3 +182305701,,"Primary somatosensory area, unassigned, layer 4",SSp-un4,11,1,3,8690,182305689,9,1,96,/997/8/567/688/695/315/453/322/182305689/182305701/,188064,,,f,97,481073879,734881840,Primary somatosensory area unassigned layer 4 +182305705,,"Primary somatosensory area, unassigned, layer 5",SSp-un5,11,1,3,8690,182305689,9,1,97,/997/8/567/688/695/315/453/322/182305689/182305705/,188064,,,f,98,1806412353,734881840,Primary somatosensory area unassigned layer 5 +182305709,,"Primary somatosensory area, unassigned, layer 6a",SSp-un6a,11,1,3,8690,182305689,9,1,98,/997/8/567/688/695/315/453/322/182305689/182305709/,188064,,,f,99,3257546540,734881840,Primary somatosensory area unassigned layer 6a +182305713,,"Primary somatosensory area, unassigned, layer 6b",SSp-un6b,11,1,3,8690,182305689,9,1,99,/997/8/567/688/695/315/453/322/182305689/182305713/,188064,,,f,100,1529046678,734881840,Primary somatosensory area unassigned layer 6b +378,754,Supplemental somatosensory area,SSs,8,1,3,8690,453,7,1,100,/997/8/567/688/695/315/453/378/,188064,,,f,101,713142416,734881840,Supplemental somatosensory area +873,1099,"Supplemental somatosensory area, layer 1",SSs1,11,1,3,8690,378,8,1,101,/997/8/567/688/695/315/453/378/873/,188064,,,f,102,697782769,734881840,Supplemental somatosensory area layer 1 +806,949,"Supplemental somatosensory area, layer 2/3",SSs2/3,11,1,3,8690,378,8,1,102,/997/8/567/688/695/315/453/378/806/,188064,,,f,103,4288179668,734881840,Supplemental somatosensory area layer 2/3 +1035,1119,"Supplemental somatosensory area, layer 4",SSs4,11,1,3,8690,378,8,1,103,/997/8/567/688/695/315/453/378/1035/,188064,,,f,104,1509795198,734881840,Supplemental somatosensory area layer 4 +1090,1126,"Supplemental somatosensory area, layer 5",SSs5,11,1,3,8690,378,8,1,104,/997/8/567/688/695/315/453/378/1090/,188064,,,f,105,788174312,734881840,Supplemental somatosensory area layer 5 +862,956,"Supplemental somatosensory area, layer 6a",SSs6a,11,1,3,8690,378,8,1,105,/997/8/567/688/695/315/453/378/862/,188064,,,f,106,1835367775,734881840,Supplemental somatosensory area layer 6a +893,960,"Supplemental somatosensory area, layer 6b",SSs6b,11,1,3,8690,378,8,1,106,/997/8/567/688/695/315/453/378/893/,188064,,,f,107,4100730085,734881840,Supplemental somatosensory area layer 6b +1057,131,Gustatory areas,GU,6,1,3,8690,315,6,1,107,/997/8/567/688/695/315/1057/,009C75,,,f,108,722362724,734881840,Gustatory areas +36,994,"Gustatory areas, layer 1",GU1,11,1,3,8690,1057,7,1,108,/997/8/567/688/695/315/1057/36/,009C75,,,f,109,2374290445,734881840,Gustatory areas layer 1 +180,729,"Gustatory areas, layer 2/3",GU2/3,11,1,3,8690,1057,7,1,109,/997/8/567/688/695/315/1057/180/,009C75,,,f,110,3375335567,734881840,Gustatory areas layer 2/3 +148,1008,"Gustatory areas, layer 4",GU4,11,1,3,8690,1057,7,1,110,/997/8/567/688/695/315/1057/148/,009C75,,,f,111,4260247682,734881840,Gustatory areas layer 4 +187,1013,"Gustatory areas, layer 5",GU5,11,1,3,8690,1057,7,1,111,/997/8/567/688/695/315/1057/187/,009C75,,,f,112,2330527764,734881840,Gustatory areas layer 5 +638,645,"Gustatory areas, layer 6a",GU6a,11,1,3,8690,1057,7,1,112,/997/8/567/688/695/315/1057/638/,009C75,,,f,113,3653947637,734881840,Gustatory areas layer 6a +662,648,"Gustatory areas, layer 6b",GU6b,11,1,3,8690,1057,7,1,113,/997/8/567/688/695/315/1057/662/,009C75,,,f,114,1086554447,734881840,Gustatory areas layer 6b +677,367,Visceral area,VISC,8,1,3,8690,315,6,1,114,/997/8/567/688/695/315/677/,11AD83,,,f,115,3549914160,734881840,Visceral area +897,1102,"Visceral area, layer 1",VISC1,11,1,3,8690,677,7,1,115,/997/8/567/688/695/315/677/897/,11AD83,,,f,116,1291666049,734881840,Visceral area layer 1 +1106,1128,"Visceral area, layer 2/3",VISC2/3,11,1,3,8690,677,7,1,116,/997/8/567/688/695/315/677/1106/,11AD83,,,f,117,1410936982,734881840,Visceral area layer 2/3 +1010,1116,"Visceral area, layer 4",VISC4,11,1,3,8690,677,7,1,117,/997/8/567/688/695/315/677/1010/,11AD83,,,f,118,1016575502,734881840,Visceral area layer 4 +1058,1122,"Visceral area, layer 5",VISC5,11,1,3,8690,677,7,1,118,/997/8/567/688/695/315/677/1058/,11AD83,,,f,119,1267762840,734881840,Visceral area layer 5 +857,1097,"Visceral area, layer 6a",VISC6a,11,1,3,8690,677,7,1,119,/997/8/567/688/695/315/677/857/,11AD83,,,f,120,1023764080,734881840,Visceral area layer 6a +849,1096,"Visceral area, layer 6b",VISC6b,11,1,3,8690,677,7,1,120,/997/8/567/688/695/315/677/849/,11AD83,,,f,121,2752264138,734881840,Visceral area layer 6b +247,30,Auditory areas,AUD,6,1,3,8690,315,6,1,121,/997/8/567/688/695/315/247/,019399,,,f,122,3638065128,734881840,Auditory areas +1011,833,Dorsal auditory area,AUDd,8,1,3,8690,247,7,1,122,/997/8/567/688/695/315/247/1011/,019399,,,f,123,2633724239,734881840,Dorsal auditory area +527,631,"Dorsal auditory area, layer 1",AUDd1,11,1,3,8690,1011,8,1,123,/997/8/567/688/695/315/247/1011/527/,019399,,,f,124,2852024941,734881840,Dorsal auditory area layer 1 +600,923,"Dorsal auditory area, layer 2/3",AUDd2/3,11,1,3,8690,1011,8,1,124,/997/8/567/688/695/315/247/1011/600/,019399,,,f,125,2148227545,734881840,Dorsal auditory area layer 2/3 +678,650,"Dorsal auditory area, layer 4",AUDd4,11,1,3,8690,1011,8,1,125,/997/8/567/688/695/315/247/1011/678/,019399,,,f,126,3650389730,734881840,Dorsal auditory area layer 4 +252,738,"Dorsal auditory area, layer 5",AUDd5,11,1,3,8690,1011,8,1,126,/997/8/567/688/695/315/247/1011/252/,019399,,,f,127,2928916084,734881840,Dorsal auditory area layer 5 +156,1009,"Dorsal auditory area, layer 6a",AUDd6a,11,1,3,8690,1011,8,1,127,/997/8/567/688/695/315/247/1011/156/,019399,,,f,128,2489109267,734881840,Dorsal auditory area layer 6a +243,1020,"Dorsal auditory area, layer 6b",AUDd6b,11,1,3,8690,1011,8,1,128,/997/8/567/688/695/315/247/1011/243/,019399,,,f,129,223713961,734881840,Dorsal auditory area layer 6b +480149230,,Laterolateral anterior visual area,VISlla,10,1,3,8690,1011,8,1,129,/997/8/567/688/695/315/247/1011/480149230/,019399,,,f,130,3171817402,734881840,Laterolateral anterior visual area +480149234,,"Laterolateral anterior visual area, layer 1",VISlla1,11,1,3,8690,480149230,9,1,130,/997/8/567/688/695/315/247/1011/480149230/480149234/,019399,,,f,131,1340972930,734881840,Laterolateral anterior visual area layer 1 +480149238,,"Laterolateral anterior visual area, layer 2/3",VISlla2/3,11,1,3,8690,480149230,9,1,131,/997/8/567/688/695/315/247/1011/480149230/480149238/,019399,,,f,132,2270613036,734881840,Laterolateral anterior visual area layer 2/3 +480149242,,"Laterolateral anterior visual area, layer 4",VISlla4,11,1,3,8690,480149230,9,1,132,/997/8/567/688/695/315/247/1011/480149230/480149242/,019399,,,f,133,1065839373,734881840,Laterolateral anterior visual area layer 4 +480149246,,"Laterolateral anterior visual area,layer 5",VISlla5,11,1,3,8690,480149230,9,1,133,/997/8/567/688/695/315/247/1011/480149230/480149246/,019399,,,f,134,3025467083,734881840,Laterolateral anterior visual arealayer 5 +480149250,,"Laterolateral anterior visual area, layer 6a",VISlla6a,11,1,3,8690,480149230,9,1,134,/997/8/567/688/695/315/247/1011/480149230/480149250/,019399,,,f,135,2752456471,734881840,Laterolateral anterior visual area layer 6a +480149254,,"Laterolateral anterior visual area, layer 6b",VISlla6b,11,1,3,8690,480149230,9,1,135,/997/8/567/688/695/315/247/1011/480149230/480149254/,019399,,,f,136,1023833773,734881840,Laterolateral anterior visual area layer 6b +1002,832,Primary auditory area,AUDp,8,1,3,8690,247,7,1,136,/997/8/567/688/695/315/247/1002/,019399,,,f,137,760301534,734881840,Primary auditory area +735,940,"Primary auditory area, layer 1",AUDp1,11,1,3,8690,1002,8,1,137,/997/8/567/688/695/315/247/1002/735/,019399,,,f,138,340215110,734881840,Primary auditory area layer 1 +251,1021,"Primary auditory area, layer 2/3",AUDp2/3,11,1,3,8690,1002,8,1,138,/997/8/567/688/695/315/247/1002/251/,019399,,,f,139,1321647110,734881840,Primary auditory area layer 2/3 +816,950,"Primary auditory area, layer 4",AUDp4,11,1,3,8690,1002,8,1,139,/997/8/567/688/695/315/247/1002/816/,019399,,,f,140,1680716233,734881840,Primary auditory area layer 4 +847,954,"Primary auditory area, layer 5",AUDp5,11,1,3,8690,1002,8,1,140,/997/8/567/688/695/315/247/1002/847/,019399,,,f,141,321552735,734881840,Primary auditory area layer 5 +954,1109,"Primary auditory area, layer 6a",AUDp6a,11,1,3,8690,1002,8,1,141,/997/8/567/688/695/315/247/1002/954/,019399,,,f,142,945654628,734881840,Primary auditory area layer 6a +1005,1115,"Primary auditory area, layer 6b",AUDp6b,11,1,3,8690,1002,8,1,142,/997/8/567/688/695/315/247/1002/1005/,019399,,,f,143,2706692830,734881840,Primary auditory area layer 6b +1027,835,Posterior auditory area,AUDpo,8,1,3,8690,247,7,1,143,/997/8/567/688/695/315/247/1027/,019399,,,f,144,57661303,734881840,Posterior auditory area +696,935,"Posterior auditory area, layer 1",AUDpo1,11,1,3,8690,1027,8,1,144,/997/8/567/688/695/315/247/1027/696/,019399,,,f,145,235681893,734881840,Posterior auditory area layer 1 +643,1070,"Posterior auditory area, layer 2/3",AUDpo2/3,11,1,3,8690,1027,8,1,145,/997/8/567/688/695/315/247/1027/643/,019399,,,f,146,3738950829,734881840,Posterior auditory area layer 2/3 +759,943,"Posterior auditory area, layer 4",AUDpo4,11,1,3,8690,1027,8,1,146,/997/8/567/688/695/315/247/1027/759/,019399,,,f,147,2120666346,734881840,Posterior auditory area layer 4 +791,947,"Posterior auditory area, layer 5",AUDpo5,11,1,3,8690,1027,8,1,147,/997/8/567/688/695/315/247/1027/791/,019399,,,f,148,157416572,734881840,Posterior auditory area layer 5 +249,455,"Posterior auditory area, layer 6a",AUDpo6a,11,1,3,8690,1027,8,1,148,/997/8/567/688/695/315/247/1027/249/,019399,,,f,149,2585833835,734881840,Posterior auditory area layer 6a +456,622,"Posterior auditory area, layer 6b",AUDpo6b,11,1,3,8690,1027,8,1,149,/997/8/567/688/695/315/247/1027/456/,019399,,,f,150,53076177,734881840,Posterior auditory area layer 6b +1018,834,Ventral auditory area,AUDv,8,1,3,8690,247,7,1,150,/997/8/567/688/695/315/247/1018/,019399,,,f,151,3132221761,734881840,Ventral auditory area +959,968,"Ventral auditory area, layer 1",AUDv1,11,1,3,8690,1018,8,1,151,/997/8/567/688/695/315/247/1018/959/,019399,,,f,152,2148641706,734881840,Ventral auditory area layer 1 +755,1084,"Ventral auditory area, layer 2/3",AUDv2/3,11,1,3,8690,1018,8,1,152,/997/8/567/688/695/315/247/1018/755/,019399,,,f,153,4223622095,734881840,Ventral auditory area layer 2/3 +990,972,"Ventral auditory area, layer 4",AUDv4,11,1,3,8690,1018,8,1,153,/997/8/567/688/695/315/247/1018/990/,019399,,,f,154,4034617125,734881840,Ventral auditory area layer 4 +1023,976,"Ventral auditory area, layer 5",AUDv5,11,1,3,8690,1018,8,1,154,/997/8/567/688/695/315/247/1018/1023/,019399,,,f,155,2273079219,734881840,Ventral auditory area layer 5 +520,630,"Ventral auditory area, layer 6a",AUDv6a,11,1,3,8690,1018,8,1,155,/997/8/567/688/695/315/247/1018/520/,019399,,,f,156,2440393689,734881840,Ventral auditory area layer 6a +598,640,"Ventral auditory area, layer 6b",AUDv6b,11,1,3,8690,1018,8,1,156,/997/8/567/688/695/315/247/1018/598/,019399,,,f,157,142352995,734881840,Ventral auditory area layer 6b +669,366,Visual areas,VIS,6,1,3,8690,315,6,1,157,/997/8/567/688/695/315/669/,08858C,,,f,158,3978948604,734881840,Visual areas +801,1090,"Visual areas, layer 1",VIS1,11,1,3,8690,669,7,1,158,/997/8/567/688/695/315/669/801/,08858C,,,f,159,3577010707,734881840,Visual areas layer 1 +561,1060,"Visual areas, layer 2/3",VIS2/3,11,1,3,8690,669,7,1,159,/997/8/567/688/695/315/669/561/,08858C,,,f,160,3921304241,734881840,Visual areas layer 2/3 +913,1104,"Visual areas, layer 4",VIS4,11,1,3,8690,669,7,1,160,/997/8/567/688/695/315/669/913/,08858C,,,f,161,2774412956,734881840,Visual areas layer 4 +937,1107,"Visual areas, layer 5",VIS5,11,1,3,8690,669,7,1,161,/997/8/567/688/695/315/669/937/,08858C,,,f,162,3529055754,734881840,Visual areas layer 5 +457,1047,"Visual areas, layer 6a",VIS6a,11,1,3,8690,669,7,1,162,/997/8/567/688/695/315/669/457/,08858C,,,f,163,597515648,734881840,Visual areas layer 6a +497,1052,"Visual areas, layer 6b",VIS6b,11,1,3,8690,669,7,1,163,/997/8/567/688/695/315/669/497/,08858C,,,f,164,3130264634,734881840,Visual areas layer 6b +402,757,Anterolateral visual area,VISal,8,1,3,8690,669,7,1,164,/997/8/567/688/695/315/669/402/,08858C,,,f,165,1250787960,734881840,Anterolateral visual area +1074,1124,"Anterolateral visual area, layer 1",VISal1,11,1,3,8690,402,8,1,165,/997/8/567/688/695/315/669/402/1074/,08858C,,,f,166,2830003304,734881840,Anterolateral visual area layer 1 +905,1103,"Anterolateral visual area, layer 2/3",VISal2/3,11,1,3,8690,402,8,1,166,/997/8/567/688/695/315/669/402/905/,08858C,,,f,167,125014447,734881840,Anterolateral visual area layer 2/3 +1114,1129,"Anterolateral visual area, layer 4",VISal4,11,1,3,8690,402,8,1,167,/997/8/567/688/695/315/669/402/1114/,08858C,,,f,168,3636762855,734881840,Anterolateral visual area layer 4 +233,453,"Anterolateral visual area, layer 5",VISal5,11,1,3,8690,402,8,1,168,/997/8/567/688/695/315/669/402/233/,08858C,,,f,169,2948835441,734881840,Anterolateral visual area layer 5 +601,1065,"Anterolateral visual area, layer 6a",VISal6a,11,1,3,8690,402,8,1,169,/997/8/567/688/695/315/669/402/601/,08858C,,,f,170,3828838274,734881840,Anterolateral visual area layer 6a +649,1071,"Anterolateral visual area, layer 6b",VISal6b,11,1,3,8690,402,8,1,170,/997/8/567/688/695/315/669/402/649/,08858C,,,f,171,2101231160,734881840,Anterolateral visual area layer 6b +394,756,Anteromedial visual area,VISam,8,1,3,8690,669,7,1,171,/997/8/567/688/695/315/669/394/,08858C,,,f,172,1045871632,734881840,Anteromedial visual area +281,1025,"Anteromedial visual area, layer 1",VISam1,11,1,3,8690,394,8,1,172,/997/8/567/688/695/315/669/394/281/,08858C,,,f,173,660054922,734881840,Anteromedial visual area layer 1 +1066,1123,"Anteromedial visual area, layer 2/3",VISam2/3,11,1,3,8690,394,8,1,173,/997/8/567/688/695/315/669/394/1066/,08858C,,,f,174,1625313305,734881840,Anteromedial visual area layer 2/3 +401,1040,"Anteromedial visual area, layer 4",VISam4,11,1,3,8690,394,8,1,174,/997/8/567/688/695/315/669/394/401/,08858C,,,f,175,1463637765,734881840,Anteromedial visual area layer 4 +433,1044,"Anteromedial visual area, layer 5",VISam5,11,1,3,8690,394,8,1,175,/997/8/567/688/695/315/669/394/433/,08858C,,,f,176,540698515,734881840,Anteromedial visual area layer 5 +1046,696,"Anteromedial visual area, layer 6a",VISam6a,11,1,3,8690,394,8,1,176,/997/8/567/688/695/315/669/394/1046/,08858C,,,f,177,2864452889,734881840,Anteromedial visual area layer 6a +441,762,"Anteromedial visual area, layer 6b",VISam6b,11,1,3,8690,394,8,1,177,/997/8/567/688/695/315/669/394/441/,08858C,,,f,178,867517603,734881840,Anteromedial visual area layer 6b +409,758,Lateral visual area,VISl,8,1,3,8690,669,7,1,178,/997/8/567/688/695/315/669/409/,08858C,,,f,179,1805245805,734881840,Lateral visual area +421,618,"Lateral visual area, layer 1",VISl1,11,1,3,8690,409,8,1,179,/997/8/567/688/695/315/669/409/421/,08858C,,,f,180,764316736,734881840,Lateral visual area layer 1 +973,687,"Lateral visual area, layer 2/3",VISl2/3,11,1,3,8690,409,8,1,180,/997/8/567/688/695/315/669/409/973/,08858C,,,f,181,4196685917,734881840,Lateral visual area layer 2/3 +573,637,"Lateral visual area, layer 4",VISl4,11,1,3,8690,409,8,1,181,/997/8/567/688/695/315/669/409/573/,08858C,,,f,182,1575254223,734881840,Lateral visual area layer 4 +613,642,"Lateral visual area, layer 5",VISl5,11,1,3,8690,409,8,1,182,/997/8/567/688/695/315/669/409/613/,08858C,,,f,183,719538265,734881840,Lateral visual area layer 5 +74,999,"Lateral visual area, layer 6a",VISl6a,11,1,3,8690,409,8,1,183,/997/8/567/688/695/315/669/409/74/,08858C,,,f,184,3506956184,734881840,Lateral visual area layer 6a +121,1005,"Lateral visual area, layer 6b",VISl6b,11,1,3,8690,409,8,1,184,/997/8/567/688/695/315/669/409/121/,08858C,,,f,185,1208923682,734881840,Lateral visual area layer 6b +385,755,Primary visual area,VISp,8,1,3,8690,669,7,1,185,/997/8/567/688/695/315/669/385/,08858C,,,f,186,3425643282,734881840,Primary visual area +593,1064,"Primary visual area, layer 1",VISp1,11,1,3,8690,385,8,1,186,/997/8/567/688/695/315/669/385/593/,08858C,,,f,187,1371845489,734881840,Primary visual area layer 1 +821,951,"Primary visual area, layer 2/3",VISp2/3,11,1,3,8690,385,8,1,187,/997/8/567/688/695/315/669/385/821/,08858C,,,f,188,2317291160,734881840,Primary visual area layer 2/3 +721,1080,"Primary visual area, layer 4",VISp4,11,1,3,8690,385,8,1,188,/997/8/567/688/695/315/669/385/721/,08858C,,,f,189,565069822,734881840,Primary visual area layer 4 +778,1087,"Primary visual area, layer 5",VISp5,11,1,3,8690,385,8,1,189,/997/8/567/688/695/315/669/385/778/,08858C,,,f,190,1453946728,734881840,Primary visual area layer 5 +33,428,"Primary visual area, layer 6a",VISp6a,11,1,3,8690,385,8,1,190,/997/8/567/688/695/315/669/385/33/,08858C,,,f,191,2158341533,734881840,Primary visual area layer 6a +305,462,"Primary visual area, layer 6b",VISp6b,11,1,3,8690,385,8,1,191,/997/8/567/688/695/315/669/385/305/,08858C,,,f,192,430767143,734881840,Primary visual area layer 6b +425,760,Posterolateral visual area,VISpl,8,1,3,8690,669,7,1,192,/997/8/567/688/695/315/669/425/,08858C,,,f,193,3499952040,734881840,Posterolateral visual area +750,942,"Posterolateral visual area, layer 1",VISpl1,11,1,3,8690,425,8,1,193,/997/8/567/688/695/315/669/425/750/,08858C,,,f,194,3976061451,734881840,Posterolateral visual area layer 1 +269,882,"Posterolateral visual area, layer 2/3",VISpl2/3,11,1,3,8690,425,8,1,194,/997/8/567/688/695/315/669/425/269/,08858C,,,f,195,1134773183,734881840,Posterolateral visual area layer 2/3 +869,957,"Posterolateral visual area, layer 4",VISpl4,11,1,3,8690,425,8,1,195,/997/8/567/688/695/315/669/425/869/,08858C,,,f,196,2627147396,734881840,Posterolateral visual area layer 4 +902,961,"Posterolateral visual area, layer 5",VISpl5,11,1,3,8690,425,8,1,196,/997/8/567/688/695/315/669/425/902/,08858C,,,f,197,3952092690,734881840,Posterolateral visual area layer 5 +377,1037,"Posterolateral visual area, layer 6a",VISpl6a,11,1,3,8690,425,8,1,197,/997/8/567/688/695/315/669/425/377/,08858C,,,f,198,818416878,734881840,Posterolateral visual area layer 6a +393,1039,"Posterolateral visual area, layer 6b",VISpl6b,11,1,3,8690,425,8,1,198,/997/8/567/688/695/315/669/425/393/,08858C,,,f,199,2848021844,734881840,Posterolateral visual area layer 6b +533,915,posteromedial visual area,VISpm,8,1,3,8690,669,7,1,199,/997/8/567/688/695/315/669/533/,08858C,,,f,200,558797901,734881840,posteromedial visual area +805,383,"posteromedial visual area, layer 1",VISpm1,11,1,3,8690,533,8,1,200,/997/8/567/688/695/315/669/533/805/,08858C,,,f,201,403944131,734881840,posteromedial visual area layer 1 +41,995,"posteromedial visual area, layer 2/3",VISpm2/3,11,1,3,8690,533,8,1,201,/997/8/567/688/695/315/669/533/41/,08858C,,,f,202,736869347,734881840,posteromedial visual area layer 2/3 +501,628,"posteromedial visual area, layer 4",VISpm4,11,1,3,8690,533,8,1,202,/997/8/567/688/695/315/669/533/501/,08858C,,,f,203,1752778316,734881840,posteromedial visual area layer 4 +565,636,"posteromedial visual area, layer 5",VISpm5,11,1,3,8690,533,8,1,203,/997/8/567/688/695/315/669/533/565/,08858C,,,f,204,528381658,734881840,posteromedial visual area layer 5 +257,456,"posteromedial visual area, layer 6a",VISpm6a,11,1,3,8690,533,8,1,204,/997/8/567/688/695/315/669/533/257/,08858C,,,f,205,2776868924,734881840,posteromedial visual area layer 6a +469,624,"posteromedial visual area, layer 6b",VISpm6b,11,1,3,8690,533,8,1,205,/997/8/567/688/695/315/669/533/469/,08858C,,,f,206,1015740806,734881840,posteromedial visual area layer 6b +312782574,,Laterointermediate area,VISli,8,1,3,8690,669,7,1,206,/997/8/567/688/695/315/669/312782574/,08858C,,,f,207,2157470672,734881840,Laterointermediate area +312782578,,"Laterointermediate area, layer 1",VISli1,11,1,3,8690,312782574,8,1,207,/997/8/567/688/695/315/669/312782574/312782578/,08858C,,,f,208,2221891232,734881840,Laterointermediate area layer 1 +312782582,,"Laterointermediate area, layer 2/3",VISli2/3,11,1,3,8690,312782574,8,1,208,/997/8/567/688/695/315/669/312782574/312782582/,08858C,,,f,209,3431444904,734881840,Laterointermediate area layer 2/3 +312782586,,"Laterointermediate area, layer 4",VISli4,11,1,3,8690,312782574,8,1,209,/997/8/567/688/695/315/669/312782574/312782586/,08858C,,,f,210,4094011951,734881840,Laterointermediate area layer 4 +312782590,,"Laterointermediate area, layer 5",VISli5,11,1,3,8690,312782574,8,1,210,/997/8/567/688/695/315/669/312782574/312782590/,08858C,,,f,211,2197985977,734881840,Laterointermediate area layer 5 +312782594,,"Laterointermediate area, layer 6a",VISli6a,11,1,3,8690,312782574,8,1,211,/997/8/567/688/695/315/669/312782574/312782594/,08858C,,,f,212,1906631730,734881840,Laterointermediate area layer 6a +312782598,,"Laterointermediate area, layer 6b",VISli6b,11,1,3,8690,312782574,8,1,212,/997/8/567/688/695/315/669/312782574/312782598/,08858C,,,f,213,3903698312,734881840,Laterointermediate area layer 6b +312782628,,Postrhinal area,VISpor,8,1,3,8690,669,7,1,213,/997/8/567/688/695/315/669/312782628/,08858C,,,f,214,2538084619,734881840,Postrhinal area +312782632,,"Postrhinal area, layer 1",VISpor1,11,1,3,8690,312782628,8,1,214,/997/8/567/688/695/315/669/312782628/312782632/,08858C,,,f,215,1476324402,734881840,Postrhinal area layer 1 +312782636,,"Postrhinal area, layer 2/3",VISpor2/3,11,1,3,8690,312782628,8,1,215,/997/8/567/688/695/315/669/312782628/312782636/,08858C,,,f,216,2862569473,734881840,Postrhinal area layer 2/3 +312782640,,"Postrhinal area, layer 4",VISpor4,11,1,3,8690,312782628,8,1,216,/997/8/567/688/695/315/669/312782628/312782640/,08858C,,,f,217,664017085,734881840,Postrhinal area layer 4 +312782644,,"Postrhinal area, layer 5",VISpor5,11,1,3,8690,312782628,8,1,217,/997/8/567/688/695/315/669/312782628/312782644/,08858C,,,f,218,1351821355,734881840,Postrhinal area layer 5 +312782648,,"Postrhinal area, layer 6a",VISpor6a,11,1,3,8690,312782628,8,1,218,/997/8/567/688/695/315/669/312782628/312782648/,08858C,,,f,219,1870039016,734881840,Postrhinal area layer 6a +312782652,,"Postrhinal area, layer 6b",VISpor6b,11,1,3,8690,312782628,8,1,219,/997/8/567/688/695/315/669/312782628/312782652/,08858C,,,f,220,4135573074,734881840,Postrhinal area layer 6b +31,3,Anterior cingulate area,ACA,8,1,3,8690,315,6,1,220,/997/8/567/688/695/315/31/,40A666,,,f,221,758743580,734881840,Anterior cingulate area +572,1061,"Anterior cingulate area, layer 1",ACA1,11,1,3,8690,31,7,1,221,/997/8/567/688/695/315/31/572/,40A666,,,f,222,1447442455,734881840,Anterior cingulate area layer 1 +1053,1121,"Anterior cingulate area, layer 2/3",ACA2/3,11,1,3,8690,31,7,1,222,/997/8/567/688/695/315/31/1053/,40A666,,,f,223,3285360531,734881840,Anterior cingulate area layer 2/3 +739,1082,"Anterior cingulate area, layer 5",ACA5,11,1,3,8690,31,7,1,223,/997/8/567/688/695/315/31/739/,40A666,,,f,224,1361837070,734881840,Anterior cingulate area layer 5 +179,1012,"Anterior cingulate area, layer 6a",ACA6a,11,1,3,8690,31,7,1,224,/997/8/567/688/695/315/31/179/,40A666,,,f,225,611576699,734881840,Anterior cingulate area layer 6a +227,1018,"Anterior cingulate area, layer 6b",ACA6b,11,1,3,8690,31,7,1,225,/997/8/567/688/695/315/31/227/,40A666,,,f,226,3178937025,734881840,Anterior cingulate area layer 6b +39,4,"Anterior cingulate area, dorsal part",ACAd,9,1,3,8690,31,7,1,226,/997/8/567/688/695/315/31/39/,40A666,,,f,227,1697985147,734881840,Anterior cingulate area dorsal part +935,965,"Anterior cingulate area, dorsal part, layer 1",ACAd1,11,1,3,8690,39,8,1,227,/997/8/567/688/695/315/31/39/935/,40A666,,,f,228,3009154534,734881840,Anterior cingulate area dorsal part layer 1 +211,1016,"Anterior cingulate area, dorsal part, layer 2/3",ACAd2/3,11,1,3,8690,39,8,1,228,/997/8/567/688/695/315/31/39/211/,40A666,,,f,229,2563141206,734881840,Anterior cingulate area dorsal part layer 2/3 +1015,975,"Anterior cingulate area, dorsal part, layer 5",ACAd5,11,1,3,8690,39,8,1,229,/997/8/567/688/695/315/31/39/1015/,40A666,,,f,230,3023161855,734881840,Anterior cingulate area dorsal part layer 5 +919,963,"Anterior cingulate area, dorsal part, layer 6a",ACAd6a,11,1,3,8690,39,8,1,230,/997/8/567/688/695/315/31/39/919/,40A666,,,f,231,3995874244,734881840,Anterior cingulate area dorsal part layer 6a +927,964,"Anterior cingulate area, dorsal part, layer 6b",ACAd6b,11,1,3,8690,39,8,1,231,/997/8/567/688/695/315/31/39/927/,40A666,,,f,232,1998938750,734881840,Anterior cingulate area dorsal part layer 6b +48,5,"Anterior cingulate area, ventral part",ACAv,9,1,3,8690,31,7,1,232,/997/8/567/688/695/315/31/48/,40A666,,,f,233,1783773415,734881840,Anterior cingulate area ventral part +588,1063,"Anterior cingulate area, ventral part, layer 1",ACAv1,11,1,3,8690,48,8,1,233,/997/8/567/688/695/315/31/48/588/,40A666,,,f,234,4171389733,734881840,Anterior cingulate area ventral part layer 1 +296,885,"Anterior cingulate area, ventral part, layer 2/3",ACAv2/3,11,1,3,8690,48,8,1,234,/997/8/567/688/695/315/31/48/296/,40A666,,,f,235,4195964388,734881840,Anterior cingulate area ventral part layer 2/3 +772,1086,"Anterior cingulate area, ventral part, layer 5",ACAv5,11,1,3,8690,48,8,1,235,/997/8/567/688/695/315/31/48/772/,40A666,,,f,236,4291796796,734881840,Anterior cingulate area ventral part layer 5 +810,1091,"Anterior cingulate area, ventral part, 6a",ACAv6a,11,1,3,8690,48,8,1,236,/997/8/567/688/695/315/31/48/810/,40A666,,,f,237,1257379109,734881840,Anterior cingulate area ventral part 6a +819,1092,"Anterior cingulate area, ventral part, 6b",ACAv6b,11,1,3,8690,48,8,1,237,/997/8/567/688/695/315/31/48/819/,40A666,,,f,238,3556459679,734881840,Anterior cingulate area ventral part 6b +972,262,Prelimbic area,PL,8,1,3,8690,315,6,1,238,/997/8/567/688/695/315/972/,2FA850,,,f,239,1936208719,734881840,Prelimbic area +171,1011,"Prelimbic area, layer 1",PL1,11,1,3,8690,972,7,1,239,/997/8/567/688/695/315/972/171/,2FA850,,,f,240,1260135134,734881840,Prelimbic area layer 1 +195,1014,"Prelimbic area, layer 2",PL2,11,1,3,8690,972,7,1,240,/997/8/567/688/695/315/972/195/,2FA850,,,f,241,3524621156,734881840,Prelimbic area layer 2 +304,886,"Prelimbic area, layer 2/3",PL2/3,11,1,3,8690,972,7,1,241,/997/8/567/688/695/315/972/304/,2FA850,,,f,242,612898740,734881840,Prelimbic area layer 2/3 +363,1035,"Prelimbic area, layer 5",PL5,11,1,3,8690,972,7,1,242,/997/8/567/688/695/315/972/363/,2FA850,,,f,243,1282533063,734881840,Prelimbic area layer 5 +84,1000,"Prelimbic area, layer 6a",PL6a,11,1,3,8690,972,7,1,243,/997/8/567/688/695/315/972/84/,2FA850,,,f,244,3335965557,734881840,Prelimbic area layer 6a +132,1006,"Prelimbic area, layer 6b",PL6b,11,1,3,8690,972,7,1,244,/997/8/567/688/695/315/972/132/,2FA850,,,f,245,1608489679,734881840,Prelimbic area layer 6b +44,146,Infralimbic area,ILA,8,1,3,8690,315,6,1,245,/997/8/567/688/695/315/44/,59B363,,,f,246,1110609938,734881840,Infralimbic area +707,1078,"Infralimbic area, layer 1",ILA1,11,1,3,8690,44,7,1,246,/997/8/567/688/695/315/44/707/,59B363,,,f,247,3257448349,734881840,Infralimbic area layer 1 +747,1083,"Infralimbic area, layer 2",ILA2,11,1,3,8690,44,7,1,247,/997/8/567/688/695/315/44/747/,59B363,,,f,248,1528948263,734881840,Infralimbic area layer 2 +556,1059,"Infralimbic area, layer 2/3",ILA2/3,11,1,3,8690,44,7,1,248,/997/8/567/688/695/315/44/556/,59B363,,,f,249,2142889357,734881840,Infralimbic area layer 2/3 +827,1093,"Infralimbic area, layer 5",ILA5,11,1,3,8690,44,7,1,249,/997/8/567/688/695/315/44/827/,59B363,,,f,250,3309663108,734881840,Infralimbic area layer 5 +1054,980,"Infralimbic area, layer 6a",ILA6a,11,1,3,8690,44,7,1,250,/997/8/567/688/695/315/44/1054/,59B363,,,f,251,696971210,734881840,Infralimbic area layer 6a +1081,983,"Infralimbic area, layer 6b",ILA6b,11,1,3,8690,44,7,1,251,/997/8/567/688/695/315/44/1081/,59B363,,,f,252,2961423984,734881840,Infralimbic area layer 6b +714,230,Orbital area,ORB,8,1,3,8690,315,6,1,252,/997/8/567/688/695/315/714/,248A5E,,,f,253,4148313092,734881840,Orbital area +264,881,"Orbital area, layer 1",ORB1,11,1,3,8690,714,7,1,253,/997/8/567/688/695/315/714/264/,248A5E,,,f,254,737328270,734881840,Orbital area layer 1 +492,1051,"Orbital area, layer 2/3",ORB2/3,11,1,3,8690,714,7,1,254,/997/8/567/688/695/315/714/492/,248A5E,,,f,255,2307167309,734881840,Orbital area layer 2/3 +352,892,"Orbital area, layer 5",ORB5,11,1,3,8690,714,7,1,255,/997/8/567/688/695/315/714/352/,248A5E,,,f,256,748648599,734881840,Orbital area layer 5 +476,1049,"Orbital area, layer 6a",ORB6a,11,1,3,8690,714,7,1,256,/997/8/567/688/695/315/714/476/,248A5E,,,f,257,2916971551,734881840,Orbital area layer 6a +516,1054,"Orbital area, layer 6b",ORB6b,11,1,3,8690,714,7,1,257,/997/8/567/688/695/315/714/516/,248A5E,,,f,258,886318501,734881840,Orbital area layer 6b +723,231,"Orbital area, lateral part",ORBl,9,1,3,8690,714,7,1,258,/997/8/567/688/695/315/714/723/,248A5E,,,f,259,1366834321,734881840,Orbital area lateral part +448,621,"Orbital area, lateral part, layer 1",ORBl1,11,1,3,8690,723,8,1,259,/997/8/567/688/695/315/714/723/448/,248A5E,,,f,260,370428134,734881840,Orbital area lateral part layer 1 +412,1041,"Orbital area, lateral part, layer 2/3",ORBl2/3,11,1,3,8690,723,8,1,260,/997/8/567/688/695/315/714/723/412/,248A5E,,,f,261,2658172417,734881840,Orbital area lateral part layer 2/3 +630,644,"Orbital area, lateral part, layer 5",ORBl5,11,1,3,8690,723,8,1,261,/997/8/567/688/695/315/714/723/630/,248A5E,,,f,262,293178623,734881840,Orbital area lateral part layer 5 +440,620,"Orbital area, lateral part, layer 6a",ORBl6a,11,1,3,8690,723,8,1,262,/997/8/567/688/695/315/714/723/440/,248A5E,,,f,263,4001987457,734881840,Orbital area lateral part layer 6a +488,626,"Orbital area, lateral part, layer 6b",ORBl6b,11,1,3,8690,723,8,1,263,/997/8/567/688/695/315/714/723/488/,248A5E,,,f,264,2004888123,734881840,Orbital area lateral part layer 6b +731,232,"Orbital area, medial part",ORBm,9,1,3,8690,714,7,1,264,/997/8/567/688/695/315/714/731/,248A5E,,,f,265,3012751712,734881840,Orbital area medial part +484,1050,"Orbital area, medial part, layer 1",ORBm1,11,1,3,8690,731,8,1,265,/997/8/567/688/695/315/714/731/484/,248A5E,,,f,266,1842613794,734881840,Orbital area medial part layer 1 +524,1055,"Orbital area, medial part, layer 2",ORBm2,11,1,3,8690,731,8,1,266,/997/8/567/688/695/315/714/731/524/,248A5E,,,f,267,4108148632,734881840,Orbital area medial part layer 2 +582,638,"Orbital area, medial part, layer 2/3",ORBm2/3,11,1,3,8690,731,8,1,267,/997/8/567/688/695/315/714/731/582/,248A5E,,,f,268,2925130542,734881840,Orbital area medial part layer 2/3 +620,1067,"Orbital area, medial part, layer 5",ORBm5,11,1,3,8690,731,8,1,268,/997/8/567/688/695/315/714/731/620/,248A5E,,,f,269,1790560827,734881840,Orbital area medial part layer 5 +910,962,"Orbital area, medial part, layer 6a",ORBm6a,11,1,3,8690,731,8,1,269,/997/8/567/688/695/315/714/731/910/,248A5E,,,f,270,1929100654,734881840,Orbital area medial part layer 6a +527696977,,"Orbital area, medial part, layer 6b",ORBm6b,11,1,3,8690,731,8,1,270,/997/8/567/688/695/315/714/731/527696977/,248A5E,,,f,271,3958566100,734881840,Orbital area medial part layer 6b +738,233,"Orbital area, ventral part",ORBv,9,1,3,8690,714,7,1,271,/997/8/567/688/695/315/714/738/,248A5E,,,f,272,2360937885,734881840,Orbital area ventral part +746,234,"Orbital area, ventrolateral part",ORBvl,9,1,3,8690,714,7,1,272,/997/8/567/688/695/315/714/746/,248A5E,,,f,273,981615620,734881840,Orbital area ventrolateral part +969,1111,"Orbital area, ventrolateral part, layer 1",ORBvl1,11,1,3,8690,746,8,1,273,/997/8/567/688/695/315/714/746/969/,248A5E,,,f,274,4095217692,734881840,Orbital area ventrolateral part layer 1 +288,884,"Orbital area, ventrolateral part, layer 2/3",ORBvl2/3,11,1,3,8690,746,8,1,274,/997/8/567/688/695/315/714/746/288/,248A5E,,,f,275,361975036,734881840,Orbital area ventrolateral part layer 2/3 +1125,1130,"Orbital area, ventrolateral part, layer 5",ORBvl5,11,1,3,8690,746,8,1,275,/997/8/567/688/695/315/714/746/1125/,248A5E,,,f,276,4084585477,734881840,Orbital area ventrolateral part layer 5 +608,924,"Orbital area, ventrolateral part, layer 6a",ORBvl6a,11,1,3,8690,746,8,1,276,/997/8/567/688/695/315/714/746/608/,248A5E,,,f,277,3003346139,734881840,Orbital area ventrolateral part layer 6a +680,933,"Orbital area, ventrolateral part, layer 6b",ORBvl6b,11,1,3,8690,746,8,1,277,/997/8/567/688/695/315/714/746/680/,248A5E,,,f,278,705314145,734881840,Orbital area ventrolateral part layer 6b +95,11,Agranular insular area,AI,8,1,3,8690,315,6,1,278,/997/8/567/688/695/315/95/,219866,,,f,279,3198937984,734881840,Agranular insular area +104,12,"Agranular insular area, dorsal part",AId,9,1,3,8690,95,7,1,279,/997/8/567/688/695/315/95/104/,219866,,,f,280,289370996,734881840,Agranular insular area dorsal part +996,1114,"Agranular insular area, dorsal part, layer 1",AId1,11,1,3,8690,104,8,1,280,/997/8/567/688/695/315/95/104/996/,219866,,,f,281,633930990,734881840,Agranular insular area dorsal part layer 1 +328,889,"Agranular insular area, dorsal part, layer 2/3",AId2/3,11,1,3,8690,104,8,1,281,/997/8/567/688/695/315/95/104/328/,219866,,,f,282,700697199,734881840,Agranular insular area dorsal part layer 2/3 +1101,1127,"Agranular insular area, dorsal part, layer 5",AId5,11,1,3,8690,104,8,1,282,/997/8/567/688/695/315/95/104/1101/,219866,,,f,283,581222647,734881840,Agranular insular area dorsal part layer 5 +783,946,"Agranular insular area, dorsal part, layer 6a",AId6a,11,1,3,8690,104,8,1,283,/997/8/567/688/695/315/95/104/783/,219866,,,f,284,3764465407,734881840,Agranular insular area dorsal part layer 6a +831,952,"Agranular insular area, dorsal part, layer 6b",AId6b,11,1,3,8690,104,8,1,284,/997/8/567/688/695/315/95/104/831/,219866,,,f,285,2036891461,734881840,Agranular insular area dorsal part layer 6b +111,13,"Agranular insular area, posterior part",AIp,9,1,3,8690,95,7,1,285,/997/8/567/688/695/315/95/111/,219866,,,f,286,1382517995,734881840,Agranular insular area posterior part +120,863,"Agranular insular area, posterior part, layer 1",AIp1,11,1,3,8690,111,8,1,286,/997/8/567/688/695/315/95/111/120/,219866,,,f,287,3201384576,734881840,Agranular insular area posterior part layer 1 +163,1010,"Agranular insular area, posterior part, layer 2/3",AIp2/3,11,1,3,8690,111,8,1,287,/997/8/567/688/695/315/95/111/163/,219866,,,f,288,2735510231,734881840,Agranular insular area posterior part layer 2/3 +344,891,"Agranular insular area, posterior part, layer 5",AIp5,11,1,3,8690,111,8,1,288,/997/8/567/688/695/315/95/111/344/,219866,,,f,289,3116139673,734881840,Agranular insular area posterior part layer 5 +314,1029,"Agranular insular area, posterior part, layer 6a",AIp6a,11,1,3,8690,111,8,1,289,/997/8/567/688/695/315/95/111/314/,219866,,,f,290,1257274084,734881840,Agranular insular area posterior part layer 6a +355,1034,"Agranular insular area, posterior part, layer 6b",AIp6b,11,1,3,8690,111,8,1,290,/997/8/567/688/695/315/95/111/355/,219866,,,f,291,3556322142,734881840,Agranular insular area posterior part layer 6b +119,14,"Agranular insular area, ventral part",AIv,9,1,3,8690,95,7,1,291,/997/8/567/688/695/315/95/119/,219866,,,f,292,4204343095,734881840,Agranular insular area ventral part +704,936,"Agranular insular area, ventral part, layer 1",AIv1,11,1,3,8690,119,8,1,292,/997/8/567/688/695/315/95/119/704/,219866,,,f,293,4142876190,734881840,Agranular insular area ventral part layer 1 +694,652,"Agranular insular area, ventral part, layer 2/3",AIv2/3,11,1,3,8690,119,8,1,293,/997/8/567/688/695/315/95/119/694/,219866,,,f,294,2779633736,734881840,Agranular insular area ventral part layer 2/3 +800,948,"Agranular insular area, ventral part, layer 5",AIv5,11,1,3,8690,119,8,1,294,/997/8/567/688/695/315/95/119/800/,219866,,,f,295,4051862023,734881840,Agranular insular area ventral part layer 5 +675,1074,"Agranular insular area, ventral part, layer 6a",AIv6a,11,1,3,8690,119,8,1,295,/997/8/567/688/695/315/95/119/675/,219866,,,f,296,1561328289,734881840,Agranular insular area ventral part layer 6a +699,1077,"Agranular insular area, ventral part, layer 6b",AIv6b,11,1,3,8690,119,8,1,296,/997/8/567/688/695/315/95/119/699/,219866,,,f,297,3288771355,734881840,Agranular insular area ventral part layer 6b +254,314,Retrosplenial area,RSP,8,1,3,8690,315,6,1,297,/997/8/567/688/695/315/254/,1AA698,,,f,298,2130272923,734881840,Retrosplenial area +894,394,"Retrosplenial area, lateral agranular part",RSPagl,9,1,3,8690,254,7,1,298,/997/8/567/688/695/315/254/894/,1AA698,,,f,299,3156484255,734881840,Retrosplenial area lateral agranular part +671,932,"Retrosplenial area, lateral agranular part, layer 1",RSPagl1,11,1,3,8690,894,8,1,299,/997/8/567/688/695/315/254/894/671/,1AA698,,,f,300,149448588,734881840,Retrosplenial area lateral agranular part layer 1 +965,969,"Retrosplenial area, lateral agranular part, layer 2/3",RSPagl2/3,11,1,3,8690,894,8,1,300,/997/8/567/688/695/315/254/894/965/,1AA698,,,f,301,2863914633,734881840,Retrosplenial area lateral agranular part layer 2/3 +774,945,"Retrosplenial area, lateral agranular part, layer 5",RSPagl5,11,1,3,8690,894,8,1,301,/997/8/567/688/695/315/254/894/774/,1AA698,,,f,302,260416405,734881840,Retrosplenial area lateral agranular part layer 5 +906,820,"Retrosplenial area, lateral agranular part, layer 6a",RSPagl6a,11,1,3,8690,894,8,1,302,/997/8/567/688/695/315/254/894/906/,1AA698,,,f,303,1139806184,734881840,Retrosplenial area lateral agranular part layer 6a +279,883,"Retrosplenial area, lateral agranular part, layer 6b",RSPagl6b,11,1,3,8690,894,8,1,303,/997/8/567/688/695/315/254/894/279/,1AA698,,,f,304,3673775698,734881840,Retrosplenial area lateral agranular part layer 6b +480149258,,Mediomedial anterior visual area,VISmma,10,1,3,8690,894,8,1,304,/997/8/567/688/695/315/254/894/480149258/,1AA698,,,f,305,1884752328,734881840,Mediomedial anterior visual area +480149262,,"Mediomedial anterior visual area, layer 1",VISmma1,11,1,3,8690,480149258,9,1,305,/997/8/567/688/695/315/254/894/480149258/480149262/,1AA698,,,f,306,2893913001,734881840,Mediomedial anterior visual area layer 1 +480149266,,"Mediomedial anterior visual area, layer 2/3",VISmma2/3,11,1,3,8690,480149258,9,1,306,/997/8/567/688/695/315/254/894/480149258/480149266/,1AA698,,,f,307,4132115660,734881840,Mediomedial anterior visual area layer 2/3 +480149270,,"Mediomedial anterior visual area, layer 4",VISmma4,11,1,3,8690,480149258,9,1,307,/997/8/567/688/695/315/254/894/480149258/480149270/,1AA698,,,f,308,3692523302,734881840,Mediomedial anterior visual area layer 4 +480149274,,"Mediomedial anterior visual area,layer 5",VISmma5,11,1,3,8690,480149258,9,1,308,/997/8/567/688/695/315/254/894/480149258/480149274/,1AA698,,,f,309,1197199171,734881840,Mediomedial anterior visual arealayer 5 +480149278,,"Mediomedial anterior visual area, layer 6a",VISmma6a,11,1,3,8690,480149258,9,1,309,/997/8/567/688/695/315/254/894/480149258/480149278/,1AA698,,,f,310,139480659,734881840,Mediomedial anterior visual area layer 6a +480149282,,"Mediomedial anterior visual area, layer 6b",VISmma6b,11,1,3,8690,480149258,9,1,310,/997/8/567/688/695/315/254/894/480149258/480149282/,1AA698,,,f,311,2438537193,734881840,Mediomedial anterior visual area layer 6b +480149286,,Mediomedial posterior visual area,VISmmp,10,1,3,8690,894,8,1,311,/997/8/567/688/695/315/254/894/480149286/,1AA698,,,f,312,1089292433,734881840,Mediomedial posterior visual area +480149290,,"Mediomedial posterior visual area, layer 1",VISmmp1,11,1,3,8690,480149286,9,1,312,/997/8/567/688/695/315/254/894/480149286/480149290/,1AA698,,,f,313,504923420,734881840,Mediomedial posterior visual area layer 1 +480149294,,"Mediomedial posterior visual area, layer 2/3",VISmmp2/3,11,1,3,8690,480149286,9,1,313,/997/8/567/688/695/315/254/894/480149286/480149294/,1AA698,,,f,314,2515976503,734881840,Mediomedial posterior visual area layer 2/3 +480149298,,"Mediomedial posterior visual area, layer 4",VISmmp4,11,1,3,8690,480149286,9,1,314,/997/8/567/688/695/315/254/894/480149286/480149298/,1AA698,,,f,315,1852993939,734881840,Mediomedial posterior visual area layer 4 +480149302,,"Mediomedial posterior visual area,layer 5",VISmmp5,11,1,3,8690,480149286,9,1,315,/997/8/567/688/695/315/254/894/480149286/480149302/,1AA698,,,f,316,2672710394,734881840,Mediomedial posterior visual arealayer 5 +480149306,,"Mediomedial posterior visual area, layer 6a",VISmmp6a,11,1,3,8690,480149286,9,1,316,/997/8/567/688/695/315/254/894/480149286/480149306/,1AA698,,,f,317,3018419278,734881840,Mediomedial posterior visual area layer 6a +480149310,,"Mediomedial posterior visual area, layer 6b",VISmmp6b,11,1,3,8690,480149286,9,1,317,/997/8/567/688/695/315/254/894/480149286/480149310/,1AA698,,,f,318,719338996,734881840,Mediomedial posterior visual area layer 6b +480149314,,Medial visual area,VISm,10,1,3,8690,894,8,1,318,/997/8/567/688/695/315/254/894/480149314/,1AA698,,,f,319,2667387940,734881840,Medial visual area +480149318,,"Medial visual area, layer 1",VISm1,11,1,3,8690,480149314,9,1,319,/997/8/567/688/695/315/254/894/480149314/480149318/,1AA698,,,f,320,1653035992,734881840,Medial visual area layer 1 +480149322,,"Medial visual area, layer 2/3",VISm2/3,11,1,3,8690,480149314,9,1,320,/997/8/567/688/695/315/254/894/480149314/480149322/,1AA698,,,f,321,1439750147,734881840,Medial visual area layer 2/3 +480149326,,"Medial visual area, layer 4",VISm4,11,1,3,8690,480149314,9,1,321,/997/8/567/688/695/315/254/894/480149314/480149326/,1AA698,,,f,322,317564759,734881840,Medial visual area layer 4 +480149330,,"Medial visual area,layer 5",VISm5,11,1,3,8690,480149314,9,1,322,/997/8/567/688/695/315/254/894/480149314/480149330/,1AA698,,,f,323,3698794804,734881840,Medial visual arealayer 5 +480149334,,"Medial visual area, layer 6a",VISm6a,11,1,3,8690,480149314,9,1,323,/997/8/567/688/695/315/254/894/480149314/480149334/,1AA698,,,f,324,798815537,734881840,Medial visual area layer 6a +480149338,,"Medial visual area, layer 6b",VISm6b,11,1,3,8690,480149314,9,1,324,/997/8/567/688/695/315/254/894/480149314/480149338/,1AA698,,,f,325,3063260299,734881840,Medial visual area layer 6b +879,392,"Retrosplenial area, dorsal part",RSPd,9,1,3,8690,254,7,1,325,/997/8/567/688/695/315/254/879/,1AA698,,,f,326,1698653345,734881840,Retrosplenial area dorsal part +442,1045,"Retrosplenial area, dorsal part, layer 1",RSPd1,11,1,3,8690,879,8,1,326,/997/8/567/688/695/315/254/879/442/,1AA698,,,f,327,3307182297,734881840,Retrosplenial area dorsal part layer 1 +434,761,"Retrosplenial area, dorsal part, layer 2/3",RSPd2/3,11,1,3,8690,879,8,1,327,/997/8/567/688/695/315/254/879/434/,1AA698,,,f,328,1081955810,734881840,Retrosplenial area dorsal part layer 2/3 +545,1058,"Retrosplenial area, dorsal part, layer 4",RSPd4,11,1,3,8690,879,8,1,328,/997/8/567/688/695/315/254/879/545/,1AA698,,,f,329,3044371542,734881840,Retrosplenial area dorsal part layer 4 +610,1066,"Retrosplenial area, dorsal part, layer 5",RSPd5,11,1,3,8690,879,8,1,329,/997/8/567/688/695/315/254/879/610/,1AA698,,,f,330,3262274752,734881840,Retrosplenial area dorsal part layer 5 +274,1024,"Retrosplenial area, dorsal part, layer 6a",RSPd6a,11,1,3,8690,879,8,1,330,/997/8/567/688/695/315/254/879/274/,1AA698,,,f,331,1480351084,734881840,Retrosplenial area dorsal part layer 6a +330,1031,"Retrosplenial area, dorsal part, layer 6b",RSPd6b,11,1,3,8690,879,8,1,331,/997/8/567/688/695/315/254/879/330/,1AA698,,,f,332,3241479382,734881840,Retrosplenial area dorsal part layer 6b +886,393,"Retrosplenial area, ventral part",RSPv,9,1,3,8690,254,7,1,332,/997/8/567/688/695/315/254/886/,1AA698,,,f,333,206834043,734881840,Retrosplenial area ventral part +542,633,"Retrosplenial area, ventral part, layer 1",RSPv1,11,1,3,8690,886,8,1,333,/997/8/567/688/695/315/254/886/542/,1AA698,,,f,334,1320301965,734881840,Retrosplenial area ventral part layer 1 +606,641,"Retrosplenial area, ventral part, layer 2",RSPv2,11,1,3,8690,886,8,1,334,/997/8/567/688/695/315/254/886/606/,1AA698,,,f,335,3619382327,734881840,Retrosplenial area ventral part layer 2 +430,619,"Retrosplenial area, ventral part, layer 2/3",RSPv2/3,11,1,3,8690,886,8,1,335,/997/8/567/688/695/315/254/886/430/,1AA698,,,f,336,919443786,734881840,Retrosplenial area ventral part layer 2/3 +687,651,"Retrosplenial area, ventral part, layer 5",RSPv5,11,1,3,8690,886,8,1,336,/997/8/567/688/695/315/254/886/687/,1AA698,,,f,337,1239413140,734881840,Retrosplenial area ventral part layer 5 +590,639,"Retrosplenial area, ventral part, layer 6a",RSPv6a,11,1,3,8690,886,8,1,337,/997/8/567/688/695/315/254/886/590/,1AA698,,,f,338,884041004,734881840,Retrosplenial area ventral part layer 6a +622,643,"Retrosplenial area, ventral part, layer 6b",RSPv6b,11,1,3,8690,886,8,1,338,/997/8/567/688/695/315/254/886/622/,1AA698,,,f,339,2914530454,734881840,Retrosplenial area ventral part layer 6b +22,285,Posterior parietal association areas,PTLp,6,1,3,8690,315,6,1,339,/997/8/567/688/695/315/22/,009FAC,,,f,340,4041380584,734881840,Posterior parietal association areas +532,1056,"Posterior parietal association areas, layer 1",PTLp1,11,1,3,8690,22,7,1,340,/997/8/567/688/695/315/22/532/,009FAC,,,f,341,1126558061,734881840,Posterior parietal association areas layer 1 +241,454,"Posterior parietal association areas, layer 2/3",PTLp2/3,11,1,3,8690,22,7,1,341,/997/8/567/688/695/315/22/241/,009FAC,,,f,342,3889625550,734881840,Posterior parietal association areas layer 2/3 +635,1069,"Posterior parietal association areas, layer 4",PTLp4,11,1,3,8690,22,7,1,342,/997/8/567/688/695/315/22/635/,009FAC,,,f,343,860823010,734881840,Posterior parietal association areas layer 4 +683,1075,"Posterior parietal association areas, layer 5",PTLp5,11,1,3,8690,22,7,1,343,/997/8/567/688/695/315/22/683/,009FAC,,,f,344,1145580916,734881840,Posterior parietal association areas layer 5 +308,1028,"Posterior parietal association areas, layer 6a",PTLp6a,11,1,3,8690,22,7,1,344,/997/8/567/688/695/315/22/308/,009FAC,,,f,345,2494959752,734881840,Posterior parietal association areas layer 6a +340,1032,"Posterior parietal association areas, layer 6b",PTLp6b,11,1,3,8690,22,7,1,345,/997/8/567/688/695/315/22/340/,009FAC,,,f,346,230637874,734881840,Posterior parietal association areas layer 6b +312782546,,Anterior area,VISa,8,1,3,8690,22,7,1,346,/997/8/567/688/695/315/22/312782546/,009FAC,,,f,347,3402453642,734881840,Anterior area +312782550,,"Anterior area, layer 1",VISa1,11,1,3,8690,312782546,8,1,347,/997/8/567/688/695/315/22/312782546/312782550/,009FAC,,,f,348,10340068,734881840,Anterior area layer 1 +312782554,,"Anterior area, layer 2/3",VISa2/3,11,1,3,8690,312782546,8,1,348,/997/8/567/688/695/315/22/312782546/312782554/,009FAC,,,f,349,2789647405,734881840,Anterior area layer 2/3 +312782558,,"Anterior area, layer 4",VISa4,11,1,3,8690,312782546,8,1,349,/997/8/567/688/695/315/22/312782546/312782558/,009FAC,,,f,350,1895248491,734881840,Anterior area layer 4 +312782562,,"Anterior area, layer 5",VISa5,11,1,3,8690,312782546,8,1,350,/997/8/567/688/695/315/22/312782546/312782562/,009FAC,,,f,351,133169917,734881840,Anterior area layer 5 +312782566,,"Anterior area, layer 6a",VISa6a,11,1,3,8690,312782546,8,1,351,/997/8/567/688/695/315/22/312782546/312782566/,009FAC,,,f,352,9540387,734881840,Anterior area layer 6a +312782570,,"Anterior area, layer 6b",VISa6b,11,1,3,8690,312782546,8,1,352,/997/8/567/688/695/315/22/312782546/312782570/,009FAC,,,f,353,2576925337,734881840,Anterior area layer 6b +417,759,Rostrolateral visual area,VISrl,8,1,3,8690,22,7,1,353,/997/8/567/688/695/315/22/417/,009FAC,,,f,354,1848950861,734881840,Rostrolateral visual area +312782604,,"Rostrolateral area, layer 1",VISrl1,11,1,3,8690,417,8,1,354,/997/8/567/688/695/315/22/417/312782604/,009FAC,,,f,355,3916570650,734881840,Rostrolateral area layer 1 +312782608,,"Rostrolateral area, layer 2/3",VISrl2/3,11,1,3,8690,417,8,1,355,/997/8/567/688/695/315/22/417/312782608/,009FAC,,,f,356,1695598268,734881840,Rostrolateral area layer 2/3 +312782612,,"Rostrolateral area, layer 4",VISrl4,11,1,3,8690,417,8,1,356,/997/8/567/688/695/315/22/417/312782612/,009FAC,,,f,357,2568541333,734881840,Rostrolateral area layer 4 +312782616,,"Rostrolateral area, layer 5",VISrl5,11,1,3,8690,417,8,1,357,/997/8/567/688/695/315/22/417/312782616/,009FAC,,,f,358,3995067395,734881840,Rostrolateral area layer 5 +312782620,,"Rostrolateral area, layer 6a",VISrl6a,11,1,3,8690,417,8,1,358,/997/8/567/688/695/315/22/417/312782620/,009FAC,,,f,359,1518183390,734881840,Rostrolateral area layer 6a +312782624,,"Rostrolateral area, layer 6b",VISrl6b,11,1,3,8690,417,8,1,359,/997/8/567/688/695/315/22/417/312782624/,009FAC,,,f,360,3279221348,734881840,Rostrolateral area layer 6b +541,350,Temporal association areas,TEa,6,1,3,8690,315,6,1,360,/997/8/567/688/695/315/541/,15B0B3,,,f,361,2291994334,734881840,Temporal association areas +97,1002,"Temporal association areas, layer 1",TEa1,11,1,3,8690,541,7,1,361,/997/8/567/688/695/315/541/97/,15B0B3,,,f,362,456768453,734881840,Temporal association areas layer 1 +1127,706,"Temporal association areas, layer 2/3",TEa2/3,11,1,3,8690,541,7,1,362,/997/8/567/688/695/315/541/1127/,15B0B3,,,f,363,74295275,734881840,Temporal association areas layer 2/3 +234,1019,"Temporal association areas, layer 4",TEa4,11,1,3,8690,541,7,1,363,/997/8/567/688/695/315/541/234/,15B0B3,,,f,364,1800621898,734881840,Temporal association areas layer 4 +289,1026,"Temporal association areas, layer 5",TEa5,11,1,3,8690,541,7,1,364,/997/8/567/688/695/315/541/289/,15B0B3,,,f,365,475299804,734881840,Temporal association areas layer 5 +729,1081,"Temporal association areas, layer 6a",TEa6a,11,1,3,8690,541,7,1,365,/997/8/567/688/695/315/541/729/,15B0B3,,,f,366,1289955072,734881840,Temporal association areas layer 6a +786,1088,"Temporal association areas, layer 6b",TEa6b,11,1,3,8690,541,7,1,366,/997/8/567/688/695/315/541/786/,15B0B3,,,f,367,3588912826,734881840,Temporal association areas layer 6b +922,256,Perirhinal area,PERI,8,1,3,8690,315,6,1,367,/997/8/567/688/695/315/922/,0E9684,,,f,368,173995527,734881840,Perirhinal area +540,1057,"Perirhinal area, layer 1",PERI1,11,1,3,8690,922,7,1,368,/997/8/567/688/695/315/922/540/,0E9684,,,f,369,161492388,734881840,Perirhinal area layer 1 +888,959,"Perirhinal area, layer 2/3",PERI2/3,11,1,3,8690,922,7,1,369,/997/8/567/688/695/315/922/888/,0E9684,,,f,370,1642584549,734881840,Perirhinal area layer 2/3 +692,1076,"Perirhinal area, layer 5",PERI5,11,1,3,8690,922,7,1,370,/997/8/567/688/695/315/922/692/,0E9684,,,f,371,248375741,734881840,Perirhinal area layer 5 +335,890,"Perirhinal area, layer 6a",PERI6a,11,1,3,8690,922,7,1,371,/997/8/567/688/695/315/922/335/,0E9684,,,f,372,1984229208,734881840,Perirhinal area layer 6a +368,894,"Perirhinal area, layer 6b",PERI6b,11,1,3,8690,922,7,1,372,/997/8/567/688/695/315/922/368/,0E9684,,,f,373,4014849762,734881840,Perirhinal area layer 6b +895,111,Ectorhinal area,ECT,8,1,3,8690,315,6,1,373,/997/8/567/688/695/315/895/,0D9F91,,,f,374,3399607880,734881840,Ectorhinal area +836,1094,Ectorhinal area/Layer 1,ECT1,11,1,3,8690,895,7,1,374,/997/8/567/688/695/315/895/836/,0D9F91,,,f,375,2240743692,734881840,Ectorhinal area/Layer 1 +427,1043,Ectorhinal area/Layer 2/3,ECT2/3,11,1,3,8690,895,7,1,375,/997/8/567/688/695/315/895/427/,0D9F91,,,f,376,993691642,734881840,Ectorhinal area/Layer 2/3 +988,1113,Ectorhinal area/Layer 5,ECT5,11,1,3,8690,895,7,1,376,/997/8/567/688/695/315/895/988/,0D9F91,,,f,377,2195901717,734881840,Ectorhinal area/Layer 5 +977,1112,Ectorhinal area/Layer 6a,ECT6a,11,1,3,8690,895,7,1,377,/997/8/567/688/695/315/895/977/,0D9F91,,,f,378,2932206502,734881840,Ectorhinal area/Layer 6a +1045,1120,Ectorhinal area/Layer 6b,ECT6b,11,1,3,8690,895,7,1,378,/997/8/567/688/695/315/895/1045/,0D9F91,,,f,379,936163868,734881840,Ectorhinal area/Layer 6b +698,228,Olfactory areas,OLF,5,1,3,8690,695,5,1,379,/997/8/567/688/695/698/,9AD2BD,,,f,380,1234982955,734881840,Olfactory areas +507,204,Main olfactory bulb,MOB,8,1,3,8690,698,6,1,380,/997/8/567/688/695/698/507/,9AD2BD,,,f,381,2457606556,734881840,Main olfactory bulb +212,733,"Main olfactory bulb, glomerular layer",MOBgl,11,1,3,8690,507,7,1,381,/997/8/567/688/695/698/507/212/,82C7AE,,,f,382,224250866,734881840,Main olfactory bulb glomerular layer +220,734,"Main olfactory bulb, granule layer",MOBgr,11,1,3,8690,507,7,1,382,/997/8/567/688/695/698/507/220/,82C7AE,,,f,383,1684821541,734881840,Main olfactory bulb granule layer +228,735,"Main olfactory bulb, inner plexiform layer",MOBipl,11,1,3,8690,507,7,1,383,/997/8/567/688/695/698/507/228/,9AD2BD,,,f,384,1125023575,734881840,Main olfactory bulb inner plexiform layer +236,736,"Main olfactory bulb, mitral layer",MOBmi,11,1,3,8690,507,7,1,384,/997/8/567/688/695/698/507/236/,82C7AE,,,f,385,1536894627,734881840,Main olfactory bulb mitral layer +244,737,"Main olfactory bulb, outer plexiform layer",MOBopl,11,1,3,8690,507,7,1,385,/997/8/567/688/695/698/507/244/,9AD2BD,,,f,386,164653746,734881840,Main olfactory bulb outer plexiform layer +151,18,Accessory olfactory bulb,AOB,8,1,3,8690,698,6,1,386,/997/8/567/688/695/698/151/,9DF0D2,,,f,387,3386724067,734881840,Accessory olfactory bulb +188,730,"Accessory olfactory bulb, glomerular layer",AOBgl,11,1,3,8690,151,7,1,387,/997/8/567/688/695/698/151/188/,9DF0D2,,,f,388,2369905656,734881840,Accessory olfactory bulb glomerular layer +196,731,"Accessory olfactory bulb, granular layer",AOBgr,11,1,3,8690,151,7,1,388,/997/8/567/688/695/698/151/196/,95E4C8,,,f,389,2164797365,734881840,Accessory olfactory bulb granular layer +204,732,"Accessory olfactory bulb, mitral layer",AOBmi,11,1,3,8690,151,7,1,389,/997/8/567/688/695/698/151/204/,9DF0D2,,,f,390,4294648998,734881840,Accessory olfactory bulb mitral layer +159,19,Anterior olfactory nucleus,AON,8,1,3,8690,698,6,1,390,/997/8/567/688/695/698/159/,54BF94,,,f,391,747766383,734881840,Anterior olfactory nucleus +167,20,"Anterior olfactory nucleus, dorsal part",AONd,9,1,3,8690,159,7,1,391,/997/8/567/688/695/698/159/167/,54BF94,,,f,392,130265477,734881840,Anterior olfactory nucleus dorsal part +175,21,"Anterior olfactory nucleus, external part",AONe,9,1,3,8690,159,7,1,392,/997/8/567/688/695/698/159/175/,54BF94,,,f,393,38711150,734881840,Anterior olfactory nucleus external part +183,22,"Anterior olfactory nucleus, lateral part",AONl,9,1,3,8690,159,7,1,393,/997/8/567/688/695/698/159/183/,54BF94,,,f,394,3992199283,734881840,Anterior olfactory nucleus lateral part +191,23,"Anterior olfactory nucleus, medial part",AONm,9,1,3,8690,159,7,1,394,/997/8/567/688/695/698/159/191/,54BF94,,,f,395,1494026705,734881840,Anterior olfactory nucleus medial part +199,24,"Anterior olfactory nucleus, posteroventral part",AONpv,9,1,3,8690,159,7,1,395,/997/8/567/688/695/698/159/199/,54BF94,,,f,396,2533672001,734881840,Anterior olfactory nucleus posteroventral part +160,868,"Anterior olfactory nucleus, layer 1",AON1,11,1,3,8690,159,7,1,396,/997/8/567/688/695/698/159/160/,54BF94,,,f,397,2989788171,734881840,Anterior olfactory nucleus layer 1 +168,869,"Anterior olfactory nucleus, layer 2",AON2,11,1,3,8690,159,7,1,397,/997/8/567/688/695/698/159/168/,54BF94,,,f,398,725474737,734881840,Anterior olfactory nucleus layer 2 +589,356,Taenia tecta,TT,8,1,3,8690,698,6,1,398,/997/8/567/688/695/698/589/,62D09F,,,f,399,2827574122,734881840,Taenia tecta +597,357,"Taenia tecta, dorsal part",TTd,9,1,3,8690,589,7,1,399,/997/8/567/688/695/698/589/597/,62D09F,,,f,400,2019823208,734881840,Taenia tecta dorsal part +297,744,"Taenia tecta, dorsal part, layers 1-4",TTd1-4,11,1,3,8690,597,8,1,400,/997/8/567/688/695/698/589/597/297/,62D09F,,,f,401,4046455694,734881840,Taenia tecta dorsal part layers 1-4 +1034,836,"Taenia tecta, dorsal part, layer 1",TTd1,11,1,3,8690,597,8,1,401,/997/8/567/688/695/698/589/597/1034/,62D09F,,,f,402,1896447081,734881840,Taenia tecta dorsal part layer 1 +1042,837,"Taenia tecta, dorsal part, layer 2",TTd2,11,1,3,8690,597,8,1,402,/997/8/567/688/695/698/589/597/1042/,62D09F,,,f,403,3892325843,734881840,Taenia tecta dorsal part layer 2 +1050,838,"Taenia tecta, dorsal part, layer 3",TTd3,11,1,3,8690,597,8,1,403,/997/8/567/688/695/698/589/597/1050/,62D09F,,,f,404,2668043589,734881840,Taenia tecta dorsal part layer 3 +1059,839,"Taenia tecta, dorsal part, layer 4",TTd4,11,1,3,8690,597,8,1,404,/997/8/567/688/695/698/589/597/1059/,62D09F,,,f,405,23300326,734881840,Taenia tecta dorsal part layer 4 +605,358,"Taenia tecta, ventral part",TTv,9,1,3,8690,589,7,1,405,/997/8/567/688/695/698/589/605/,62D09F,,,f,406,4008781829,734881840,Taenia tecta ventral part +306,745,"Taenia tecta, ventral part, layers 1-3",TTv1-3,11,1,3,8690,605,8,1,406,/997/8/567/688/695/698/589/605/306/,62D09F,,,f,407,3753542786,734881840,Taenia tecta ventral part layers 1-3 +1067,840,"Taenia tecta, ventral part, layer 1",TTv1,11,1,3,8690,605,8,1,407,/997/8/567/688/695/698/589/605/1067/,62D09F,,,f,408,2238157029,734881840,Taenia tecta ventral part layer 1 +1075,841,"Taenia tecta, ventral part, layer 2",TTv2,11,1,3,8690,605,8,1,408,/997/8/567/688/695/698/589/605/1075/,62D09F,,,f,409,477020511,734881840,Taenia tecta ventral part layer 2 +1082,842,"Taenia tecta, ventral part, layer 3",TTv3,11,1,3,8690,605,8,1,409,/997/8/567/688/695/698/589/605/1082/,62D09F,,,f,410,1802105289,734881840,Taenia tecta ventral part layer 3 +814,384,Dorsal peduncular area,DP,8,1,3,8690,698,6,1,410,/997/8/567/688/695/698/814/,A4DAA4,,,f,411,327990420,734881840,Dorsal peduncular area +496,627,"Dorsal peduncular area, layer 1",DP1,11,1,3,8690,814,7,1,411,/997/8/567/688/695/698/814/496/,A4DAA4,,,f,412,2060647510,734881840,Dorsal peduncular area layer 1 +535,632,"Dorsal peduncular area, layer 2",DP2,11,1,3,8690,814,7,1,412,/997/8/567/688/695/698/814/535/,A4DAA4,,,f,413,3822824940,734881840,Dorsal peduncular area layer 2 +360,893,"Dorsal peduncular area, layer 2/3",DP2/3,11,1,3,8690,814,7,1,413,/997/8/567/688/695/698/814/360/,A4DAA4,,,f,414,3065629674,734881840,Dorsal peduncular area layer 2/3 +646,646,"Dorsal peduncular area, layer 5",DP5,11,1,3,8690,814,7,1,414,/997/8/567/688/695/698/814/646/,A4DAA4,,,f,415,2109683791,734881840,Dorsal peduncular area layer 5 +267,1023,"Dorsal peduncular area, layer 6a",DP6a,11,1,3,8690,814,7,1,415,/997/8/567/688/695/698/814/267/,A4DAA4,,,f,416,629411513,734881840,Dorsal peduncular area layer 6a +961,261,Piriform area,PIR,8,1,3,8690,698,6,1,416,/997/8/567/688/695/698/961/,6ACBBA,,,f,417,3867654445,734881840,Piriform area +152,867,"Piriform area, layers 1-3",PIR1-3,11,1,3,8690,961,7,1,417,/997/8/567/688/695/698/961/152/,6ACBBA,,,f,418,2647697453,734881840,Piriform area layers 1-3 +276,741,"Piriform area, molecular layer",PIR1,11,1,3,8690,961,7,1,418,/997/8/567/688/695/698/961/276/,6ACBBA,,,f,419,2554470513,734881840,Piriform area molecular layer +284,742,"Piriform area, pyramidal layer",PIR2,11,1,3,8690,961,7,1,419,/997/8/567/688/695/698/961/284/,6ACBBA,,,f,420,274998294,734881840,Piriform area pyramidal layer +291,743,"Piriform area, polymorph layer",PIR3,11,1,3,8690,961,7,1,420,/997/8/567/688/695/698/961/291/,6ACBBA,,,f,421,1551580350,734881840,Piriform area polymorph layer +619,218,Nucleus of the lateral olfactory tract,NLOT,8,1,3,8690,698,6,1,421,/997/8/567/688/695/698/619/,95E4C8,,,f,422,1925788982,734881840,Nucleus of the lateral olfactory tract +392,897,"Nucleus of the lateral olfactory tract, layers 1-3",NLOT1-3,11,1,3,8690,619,7,1,422,/997/8/567/688/695/698/619/392/,95E4C8,,,f,423,1369727155,734881840,Nucleus of the lateral olfactory tract layers 1-3 +260,739,"Nucleus of the lateral olfactory tract, molecular layer",NLOT1,11,1,3,8690,619,7,1,423,/997/8/567/688/695/698/619/260/,95E4C8,,,f,424,1899636519,734881840,Nucleus of the lateral olfactory tract molecular layer +268,740,"Nucleus of the lateral olfactory tract, pyramidal layer",NLOT2,11,1,3,8690,619,7,1,424,/997/8/567/688/695/698/619/268/,95E4C8,,,f,425,4179370816,734881840,Nucleus of the lateral olfactory tract pyramidal layer +1139,1137,"Nucleus of the lateral olfactory tract, layer 3",NLOT3,11,1,3,8690,619,7,1,425,/997/8/567/688/695/698/619/1139/,95E4C8,,,f,426,2600277896,734881840,Nucleus of the lateral olfactory tract layer 3 +631,78,Cortical amygdalar area,COA,8,1,3,8690,698,6,1,426,/997/8/567/688/695/698/631/,61E7B7,,,f,427,1492043464,734881840,Cortical amygdalar area +639,79,"Cortical amygdalar area, anterior part",COAa,9,1,3,8690,631,7,1,427,/997/8/567/688/695/698/631/639/,61E7B7,,,f,428,3687551647,734881840,Cortical amygdalar area anterior part +192,872,"Cortical amygdalar area, anterior part, layer 1",COAa1,11,1,3,8690,639,8,1,428,/997/8/567/688/695/698/631/639/192/,61E7B7,,,f,429,1929526031,734881840,Cortical amygdalar area anterior part layer 1 +200,873,"Cortical amygdalar area, anterior part, layer 2",COAa2,11,1,3,8690,639,8,1,429,/997/8/567/688/695/698/631/639/200/,61E7B7,,,f,430,3926616757,734881840,Cortical amygdalar area anterior part layer 2 +208,874,"Cortical amygdalar area, anterior part, layer 3",COAa3,11,1,3,8690,639,8,1,430,/997/8/567/688/695/698/631/639/208/,61E7B7,,,f,431,2634832419,734881840,Cortical amygdalar area anterior part layer 3 +647,80,"Cortical amygdalar area, posterior part",COAp,9,1,3,8690,631,7,1,431,/997/8/567/688/695/698/631/647/,61E7B7,,,f,432,713144098,734881840,Cortical amygdalar area posterior part +655,81,"Cortical amygdalar area, posterior part, lateral zone",COApl,10,1,3,8690,647,8,1,432,/997/8/567/688/695/698/631/647/655/,61E7B7,,,f,433,687250718,734881840,Cortical amygdalar area posterior part lateral zone +584,921,"Cortical amygdalar area, posterior part, lateral zone, layers 1-2",COApl1-2,11,1,3,8690,655,9,1,433,/997/8/567/688/695/698/631/647/655/584/,61E7B7,,,f,434,2501743775,734881840,Cortical amygdalar area posterior part lateral zone layers 1-2 +376,895,"Cortical amygdalar area, posterior part, lateral zone, layers 1-3",COApl1-3,11,1,3,8690,655,9,1,434,/997/8/567/688/695/698/631/647/655/376/,61E7B7,,,f,435,3793396745,734881840,Cortical amygdalar area posterior part lateral zone layers 1-3 +216,875,"Cortical amygdalar area, posterior part, lateral zone, layer 1",COApl1,11,1,3,8690,655,9,1,435,/997/8/567/688/695/698/631/647/655/216/,61E7B7,,,f,436,2913726556,734881840,Cortical amygdalar area posterior part lateral zone layer 1 +224,876,"Cortical amygdalar area, posterior part, lateral zone, layer 2",COApl2,11,1,3,8690,655,9,1,436,/997/8/567/688/695/698/631/647/655/224/,61E7B7,,,f,437,883073510,734881840,Cortical amygdalar area posterior part lateral zone layer 2 +232,877,"Cortical amygdalar area, posterior part, lateral zone, layer 3",COApl3,11,1,3,8690,655,9,1,437,/997/8/567/688/695/698/631/647/655/232/,61E7B7,,,f,438,1134924144,734881840,Cortical amygdalar area posterior part lateral zone layer 3 +663,82,"Cortical amygdalar area, posterior part, medial zone",COApm,10,1,3,8690,647,8,1,438,/997/8/567/688/695/698/631/647/663/,61E7B7,,,f,439,2407177902,734881840,Cortical amygdalar area posterior part medial zone +592,922,"Cortical amygdalar area, posterior part, medial zone, layers 1-2",COApm1-2,11,1,3,8690,663,9,1,439,/997/8/567/688/695/698/631/647/663/592/,61E7B7,,,f,440,21515473,734881840,Cortical amygdalar area posterior part medial zone layers 1-2 +383,896,"Cortical amygdalar area, posterior part, medial zone, layers 1-3",COApm1-3,11,1,3,8690,663,9,1,440,/997/8/567/688/695/698/631/647/663/383/,61E7B7,,,f,441,1984920647,734881840,Cortical amygdalar area posterior part medial zone layers 1-3 +240,878,"Cortical amygdalar area, posterior part, medial zone, layer 1",COApm1,11,1,3,8690,663,9,1,441,/997/8/567/688/695/698/631/647/663/240/,61E7B7,,,f,442,3787500355,734881840,Cortical amygdalar area posterior part medial zone layer 1 +248,879,"Cortical amygdalar area, posterior part, medial zone, layer 2",COApm2,11,1,3,8690,663,9,1,442,/997/8/567/688/695/698/631/647/663/248/,61E7B7,,,f,443,2026502905,734881840,Cortical amygdalar area posterior part medial zone layer 2 +256,880,"Cortical amygdalar area, posterior part, medial zone, layer 3",COApm3,11,1,3,8690,663,9,1,443,/997/8/567/688/695/698/631/647/663/256/,61E7B7,,,f,444,265210479,734881840,Cortical amygdalar area posterior part medial zone layer 3 +788,239,Piriform-amygdalar area,PAA,8,1,3,8690,698,6,1,444,/997/8/567/688/695/698/788/,59DAAB,,,f,445,1121206289,734881840,Piriform-amygdalar area +400,898,"Piriform-amygdalar area, layers 1-3",PAA1-3,11,1,3,8690,788,7,1,445,/997/8/567/688/695/698/788/400/,59DAAB,,,f,446,908149344,734881840,Piriform-amygdalar area layers 1-3 +408,899,"Piriform-amygdalar area, molecular layer",PAA1,11,1,3,8690,788,7,1,446,/997/8/567/688/695/698/788/408/,59DAAB,,,f,447,2014732560,734881840,Piriform-amygdalar area molecular layer +416,900,"Piriform-amygdalar area, pyramidal layer",PAA2,11,1,3,8690,788,7,1,447,/997/8/567/688/695/698/788/416/,59DAAB,,,f,448,4029703543,734881840,Piriform-amygdalar area pyramidal layer +424,901,"Piriform-amygdalar area, polymorph layer",PAA3,11,1,3,8690,788,7,1,448,/997/8/567/688/695/698/788/424/,59DAAB,,,f,449,3157229023,734881840,Piriform-amygdalar area polymorph layer +566,353,Postpiriform transition area,TR,8,1,3,8690,698,6,1,449,/997/8/567/688/695/698/566/,A8ECD3,,,f,450,2552138473,734881840,Postpiriform transition area +517,913,"Postpiriform transition area, layers 1-3",TR1-3,11,1,3,8690,566,7,1,450,/997/8/567/688/695/698/566/517/,A8ECD3,,,f,451,3498621219,734881840,Postpiriform transition area layers 1-3 +1140,1138,"Postpiriform transition area, layers 1",TR1,11,1,3,8690,566,7,1,451,/997/8/567/688/695/698/566/1140/,A8ECD3,,,f,452,1927513861,734881840,Postpiriform transition area layers 1 +1141,1139,"Postpiriform transition area, layers 2",TR2,11,1,3,8690,566,7,1,452,/997/8/567/688/695/698/566/1141/,A8ECD3,,,f,453,3958036159,734881840,Postpiriform transition area layers 2 +1142,1140,"Postpiriform transition area, layers 3",TR3,11,1,3,8690,566,7,1,453,/997/8/567/688/695/698/566/1142/,A8ECD3,,,f,454,2632836649,734881840,Postpiriform transition area layers 3 +1089,135,Hippocampal formation,HPF,5,1,3,8690,695,5,1,454,/997/8/567/688/695/1089/,7ED04B,,,f,455,702348177,734881840,Hippocampal formation +1080,134,Hippocampal region,HIP,6,1,3,8690,1089,6,1,455,/997/8/567/688/695/1089/1080/,7ED04B,,,f,456,190910866,734881840,Hippocampal region +375,46,Ammon's horn,CA,8,1,3,8690,1080,7,1,456,/997/8/567/688/695/1089/1080/375/,7ED04B,,,f,457,1703331408,734881840,Ammon's horn +382,47,Field CA1,CA1,9,1,3,8690,375,8,1,457,/997/8/567/688/695/1089/1080/375/382/,7ED04B,,,f,458,612190852,734881840,Field CA1 +391,48,"Field CA1, stratum lacunosum-moleculare",CA1slm,11,1,3,8690,382,9,1,458,/997/8/567/688/695/1089/1080/375/382/391/,7ED04B,,,f,459,660945402,734881840,Field CA1 stratum lacunosum-moleculare +399,49,"Field CA1, stratum oriens",CA1so,11,1,3,8690,382,9,1,459,/997/8/567/688/695/1089/1080/375/382/399/,7ED04B,,,f,460,3671153130,734881840,Field CA1 stratum oriens +407,50,"Field CA1, pyramidal layer",CA1sp,11,1,3,8690,382,9,1,460,/997/8/567/688/695/1089/1080/375/382/407/,66A83D,,,f,461,434863076,734881840,Field CA1 pyramidal layer +415,51,"Field CA1, stratum radiatum",CA1sr,11,1,3,8690,382,9,1,461,/997/8/567/688/695/1089/1080/375/382/415/,7ED04B,,,f,462,58650859,734881840,Field CA1 stratum radiatum +423,52,Field CA2,CA2,9,1,3,8690,375,8,1,462,/997/8/567/688/695/1089/1080/375/423/,7ED04B,,,f,463,3178502974,734881840,Field CA2 +431,53,"Field CA2, stratum lacunosum-moleculare",CA2slm,11,1,3,8690,423,9,1,463,/997/8/567/688/695/1089/1080/375/423/431/,7ED04B,,,f,464,1673796834,734881840,Field CA2 stratum lacunosum-moleculare +438,54,"Field CA2, stratum oriens",CA2so,11,1,3,8690,423,9,1,464,/997/8/567/688/695/1089/1080/375/423/438/,7ED04B,,,f,465,4078562584,734881840,Field CA2 stratum oriens +446,55,"Field CA2, pyramidal layer",CA2sp,11,1,3,8690,423,9,1,465,/997/8/567/688/695/1089/1080/375/423/446/,66A83D,,,f,466,1248927840,734881840,Field CA2 pyramidal layer +454,56,"Field CA2, stratum radiatum",CA2sr,11,1,3,8690,423,9,1,466,/997/8/567/688/695/1089/1080/375/423/454/,7ED04B,,,f,467,3925355913,734881840,Field CA2 stratum radiatum +463,57,Field CA3,CA3,9,1,3,8690,375,8,1,467,/997/8/567/688/695/1089/1080/375/463/,7ED04B,,,f,468,3396545448,734881840,Field CA3 +471,58,"Field CA3, stratum lacunosum-moleculare",CA3slm,11,1,3,8690,463,9,1,468,/997/8/567/688/695/1089/1080/375/463/471/,7ED04B,,,f,469,1604648938,734881840,Field CA3 stratum lacunosum-moleculare +479,59,"Field CA3, stratum lucidum",CA3slu,11,1,3,8690,463,9,1,469,/997/8/567/688/695/1089/1080/375/463/479/,7ED04B,,,f,470,41818108,734881840,Field CA3 stratum lucidum +486,60,"Field CA3, stratum oriens",CA3so,11,1,3,8690,463,9,1,470,/997/8/567/688/695/1089/1080/375/463/486/,7ED04B,,,f,471,1567718537,734881840,Field CA3 stratum oriens +495,61,"Field CA3, pyramidal layer",CA3sp,11,1,3,8690,463,9,1,471,/997/8/567/688/695/1089/1080/375/463/495/,66A83D,,,f,472,3453479715,734881840,Field CA3 pyramidal layer +504,62,"Field CA3, stratum radiatum",CA3sr,11,1,3,8690,463,9,1,472,/997/8/567/688/695/1089/1080/375/463/504/,7ED04B,,,f,473,111844200,734881840,Field CA3 stratum radiatum +726,90,Dentate gyrus,DG,8,1,3,8690,1080,7,1,473,/997/8/567/688/695/1089/1080/726/,7ED04B,,,f,474,1938098114,734881840,Dentate gyrus +10703,,"Dentate gyrus, molecular layer",DG-mo,11,1,3,8690,726,8,1,474,/997/8/567/688/695/1089/1080/726/10703/,7ED04B,,,f,475,4100692564,734881840,Dentate gyrus molecular layer +10704,,"Dentate gyrus, polymorph layer",DG-po,11,1,3,8690,726,8,1,475,/997/8/567/688/695/1089/1080/726/10704/,7ED04B,,,f,476,810714779,734881840,Dentate gyrus polymorph layer +632,927,"Dentate gyrus, granule cell layer",DG-sg,11,1,3,8690,726,8,1,476,/997/8/567/688/695/1089/1080/726/632/,66A83D,,,f,477,2252434327,734881840,Dentate gyrus granule cell layer +10702,,"Dentate gyrus, subgranular zone",DG-sgz,11,1,3,8690,726,8,1,477,/997/8/567/688/695/1089/1080/726/10702/,7ED04B,,,f,478,2671485875,734881840,Dentate gyrus subgranular zone +734,91,Dentate gyrus crest,DGcr,9,1,3,8690,726,8,1,478,/997/8/567/688/695/1089/1080/726/734/,7ED04B,,,f,479,3600589931,734881840,Dentate gyrus crest +742,92,"Dentate gyrus crest, molecular layer",DGcr-mo,11,1,3,8690,734,9,1,479,/997/8/567/688/695/1089/1080/726/734/742/,7ED04B,,,f,480,1932703874,734881840,Dentate gyrus crest molecular layer +751,93,"Dentate gyrus crest, polymorph layer",DGcr-po,11,1,3,8690,734,9,1,480,/997/8/567/688/695/1089/1080/726/734/751/,7ED04B,,,f,481,3070993485,734881840,Dentate gyrus crest polymorph layer +758,94,"Dentate gyrus crest, granule cell layer",DGcr-sg,11,1,3,8690,734,9,1,481,/997/8/567/688/695/1089/1080/726/734/758/,7ED04B,,,f,482,3124792802,734881840,Dentate gyrus crest granule cell layer +766,95,Dentate gyrus lateral blade,DGlb,9,1,3,8690,726,8,1,482,/997/8/567/688/695/1089/1080/726/766/,7ED04B,,,f,483,3990340696,734881840,Dentate gyrus lateral blade +775,96,"Dentate gyrus lateral blade, molecular layer",DGlb-mo,11,1,3,8690,766,9,1,483,/997/8/567/688/695/1089/1080/726/766/775/,7ED04B,,,f,484,133010144,734881840,Dentate gyrus lateral blade molecular layer +782,97,"Dentate gyrus lateral blade, polymorph layer",DGlb-po,11,1,3,8690,766,9,1,484,/997/8/567/688/695/1089/1080/726/766/782/,7ED04B,,,f,485,3285487151,734881840,Dentate gyrus lateral blade polymorph layer +790,98,"Dentate gyrus lateral blade, granule cell layer",DGlb-sg,11,1,3,8690,766,9,1,485,/997/8/567/688/695/1089/1080/726/766/790/,7ED04B,,,f,486,2283049397,734881840,Dentate gyrus lateral blade granule cell layer +799,99,Dentate gyrus medial blade,DGmb,9,1,3,8690,726,8,1,486,/997/8/567/688/695/1089/1080/726/799/,7ED04B,,,f,487,2717315927,734881840,Dentate gyrus medial blade +807,100,"Dentate gyrus medial blade, molecular layer",DGmb-mo,11,1,3,8690,799,9,1,487,/997/8/567/688/695/1089/1080/726/799/807/,7ED04B,,,f,488,2851990255,734881840,Dentate gyrus medial blade molecular layer +815,101,"Dentate gyrus medial blade, polymorph layer",DGmb-po,11,1,3,8690,799,9,1,488,/997/8/567/688/695/1089/1080/726/799/815/,7ED04B,,,f,489,1841624608,734881840,Dentate gyrus medial blade polymorph layer +823,102,"Dentate gyrus medial blade, granule cell layer",DGmb-sg,11,1,3,8690,799,9,1,489,/997/8/567/688/695/1089/1080/726/799/823/,7ED04B,,,f,490,2031695292,734881840,Dentate gyrus medial blade granule cell layer +982,122,Fasciola cinerea,FC,8,1,3,8690,1080,7,1,490,/997/8/567/688/695/1089/1080/982/,7ED04B,,,f,491,2329016707,734881840,Fasciola cinerea +19,143,Induseum griseum,IG,8,1,3,8690,1080,7,1,491,/997/8/567/688/695/1089/1080/19/,7ED04B,,,f,492,2117099319,734881840,Induseum griseum +822,385,Retrohippocampal region,RHP,6,1,3,8690,1089,6,1,492,/997/8/567/688/695/1089/822/,32B825,,,f,493,3032553410,734881840,Retrohippocampal region +909,113,Entorhinal area,ENT,8,1,3,8690,822,7,1,493,/997/8/567/688/695/1089/822/909/,32B825,,,f,494,2103154195,734881840,Entorhinal area +918,114,"Entorhinal area, lateral part",ENTl,9,1,3,8690,909,8,1,494,/997/8/567/688/695/1089/822/909/918/,32B825,,,f,495,777102316,734881840,Entorhinal area lateral part +1121,988,"Entorhinal area, lateral part, layer 1",ENTl1,11,1,3,8690,918,9,1,495,/997/8/567/688/695/1089/822/909/918/1121/,32B825,,,f,496,1675684242,734881840,Entorhinal area lateral part layer 1 +20,992,"Entorhinal area, lateral part, layer 2",ENTl2,11,1,3,8690,918,9,1,496,/997/8/567/688/695/1089/822/909/918/20/,32B825,,,f,497,4209621032,734881840,Entorhinal area lateral part layer 2 +999,973,"Entorhinal area, lateral part, layer 2/3",ENTl2/3,11,1,3,8690,918,9,1,497,/997/8/567/688/695/1089/822/909/918/999/,32B825,,,f,498,1962026105,734881840,Entorhinal area lateral part layer 2/3 +715,1079,"Entorhinal area, lateral part, layer 2a",ENTl2a,11,1,3,8690,918,9,1,498,/997/8/567/688/695/1089/822/909/918/715/,32B825,,,f,499,3724082945,734881840,Entorhinal area lateral part layer 2a +764,1085,"Entorhinal area, lateral part, layer 2b",ENTl2b,11,1,3,8690,918,9,1,499,/997/8/567/688/695/1089/822/909/918/764/,32B825,,,f,500,1156689595,734881840,Entorhinal area lateral part layer 2b +52,996,"Entorhinal area, lateral part, layer 3",ENTl3,11,1,3,8690,918,9,1,500,/997/8/567/688/695/1089/822/909/918/52/,32B825,,,f,501,2381220030,734881840,Entorhinal area lateral part layer 3 +92,1001,"Entorhinal area, lateral part, layer 4",ENTl4,11,1,3,8690,918,9,1,501,/997/8/567/688/695/1089/822/909/918/92/,32B825,,,f,502,327818525,734881840,Entorhinal area lateral part layer 4 +312,887,"Entorhinal area, lateral part, layer 4/5",ENTl4/5,11,1,3,8690,918,9,1,502,/997/8/567/688/695/1089/822/909/918/312/,32B825,,,f,503,2568814078,734881840,Entorhinal area lateral part layer 4/5 +139,1007,"Entorhinal area, lateral part, layer 5",ENTl5,11,1,3,8690,918,9,1,503,/997/8/567/688/695/1089/822/909/918/139/,32B825,,,f,504,1686973835,734881840,Entorhinal area lateral part layer 5 +387,1038,"Entorhinal area, lateral part, layer 5/6",ENTl5/6,11,1,3,8690,918,9,1,504,/997/8/567/688/695/1089/822/909/918/387/,32B825,,,f,505,30918259,734881840,Entorhinal area lateral part layer 5/6 +28,993,"Entorhinal area, lateral part, layer 6a",ENTl6a,11,1,3,8690,918,9,1,505,/997/8/567/688/695/1089/822/909/918/28/,32B825,,,f,506,3113499141,734881840,Entorhinal area lateral part layer 6a +60,997,"Entorhinal area, lateral part, layer 6b",ENTl6b,11,1,3,8690,918,9,1,506,/997/8/567/688/695/1089/822/909/918/60/,32B825,,,f,507,547187647,734881840,Entorhinal area lateral part layer 6b +926,115,"Entorhinal area, medial part, dorsal zone",ENTm,9,1,3,8690,909,8,1,507,/997/8/567/688/695/1089/822/909/926/,32B825,,,f,508,3347737059,734881840,Entorhinal area medial part dorsal zone +526,914,"Entorhinal area, medial part, dorsal zone, layer 1",ENTm1,11,1,3,8690,926,9,1,508,/997/8/567/688/695/1089/822/909/926/526/,32B825,,,f,509,2408608441,734881840,Entorhinal area medial part dorsal zone layer 1 +543,916,"Entorhinal area, medial part, dorsal zone, layer 2",ENTm2,11,1,3,8690,926,9,1,509,/997/8/567/688/695/1089/822/909/926/543/,32B825,,,f,510,379134723,734881840,Entorhinal area medial part dorsal zone layer 2 +468,1048,"Entorhinal area, medial part, dorsal zone, layer 2a",ENTm2a,11,1,3,8690,926,9,1,510,/997/8/567/688/695/1089/822/909/926/468/,32B825,,,f,511,1906865882,734881840,Entorhinal area medial part dorsal zone layer 2a +508,1053,"Entorhinal area, medial part, dorsal zone, layer 2b",ENTm2b,11,1,3,8690,926,9,1,511,/997/8/567/688/695/1089/822/909/926/508/,32B825,,,f,512,3902875488,734881840,Entorhinal area medial part dorsal zone layer 2b +664,931,"Entorhinal area, medial part, dorsal zone, layer 3",ENTm3,11,1,3,8690,926,9,1,512,/997/8/567/688/695/1089/822/909/926/664/,32B825,,,f,513,1637749653,734881840,Entorhinal area medial part dorsal zone layer 3 +712,937,"Entorhinal area, medial part, dorsal zone, layer 4",ENTm4,11,1,3,8690,926,9,1,513,/997/8/567/688/695/1089/822/909/926/712/,32B825,,,f,514,4294608438,734881840,Entorhinal area medial part dorsal zone layer 4 +727,939,"Entorhinal area, medial part, dorsal zone, layer 5",ENTm5,11,1,3,8690,926,9,1,514,/997/8/567/688/695/1089/822/909/926/727/,32B825,,,f,515,2298328736,734881840,Entorhinal area medial part dorsal zone layer 5 +550,634,"Entorhinal area, medial part, dorsal zone, layer 5/6",ENTm5/6,11,1,3,8690,926,9,1,515,/997/8/567/688/695/1089/822/909/926/550/,32B825,,,f,516,276471206,734881840,Entorhinal area medial part dorsal zone layer 5/6 +743,941,"Entorhinal area, medial part, dorsal zone, layer 6",ENTm6,11,1,3,8690,926,9,1,516,/997/8/567/688/695/1089/822/909/926/743/,32B825,,,f,517,301262618,734881840,Entorhinal area medial part dorsal zone layer 6 +934,116,"Entorhinal area, medial part, ventral zone",ENTmv,9,1,3,8690,909,8,1,517,/997/8/567/688/695/1089/822/909/934/,32B825,,,f,518,2437560989,734881840,Entorhinal area medial part ventral zone +259,1022,"Entorhinal area, medial part, ventral zone, layer 1",ENTmv1,11,1,3,8690,934,9,1,518,/997/8/567/688/695/1089/822/909/934/259/,32B825,,,f,519,2194417390,734881840,Entorhinal area medial part ventral zone layer 1 +324,1030,"Entorhinal area, medial part, ventral zone, layer 2",ENTmv2,11,1,3,8690,934,9,1,519,/997/8/567/688/695/1089/822/909/934/324/,32B825,,,f,520,465925972,734881840,Entorhinal area medial part ventral zone layer 2 +371,1036,"Entorhinal area, medial part, ventral zone, layer 3",ENTmv3,11,1,3,8690,934,9,1,520,/997/8/567/688/695/1089/822/909/934/371/,32B825,,,f,521,1824671682,734881840,Entorhinal area medial part ventral zone layer 3 +419,1042,"Entorhinal area, medial part, ventral zone, layer 4",ENTmv4,11,1,3,8690,934,9,1,521,/997/8/567/688/695/1089/822/909/934/419/,32B825,,,f,522,4071019105,734881840,Entorhinal area medial part ventral zone layer 4 +1133,1131,"Entorhinal area, medial part, ventral zone, layer 5/6",ENTmv5/6,11,1,3,8690,934,9,1,522,/997/8/567/688/695/1089/822/909/934/1133/,32B825,,,f,523,2307313284,734881840,Entorhinal area medial part ventral zone layer 5/6 +843,246,Parasubiculum,PAR,8,1,3,8690,822,7,1,523,/997/8/567/688/695/1089/822/843/,72D569,,,f,524,2447067507,734881840,Parasubiculum +10693,,"Parasubiculum, layer 1",PAR1,11,1,3,8690,843,8,1,524,/997/8/567/688/695/1089/822/843/10693/,72D569,,,f,525,522985197,734881840,Parasubiculum layer 1 +10694,,"Parasubiculum, layer 2",PAR2,11,1,3,8690,843,8,1,525,/997/8/567/688/695/1089/822/843/10694/,72D569,,,f,526,2250592087,734881840,Parasubiculum layer 2 +10695,,"Parasubiculum, layer 3",PAR3,11,1,3,8690,843,8,1,526,/997/8/567/688/695/1089/822/843/10695/,72D569,,,f,527,4045569985,734881840,Parasubiculum layer 3 +1037,270,Postsubiculum,POST,8,1,3,8690,822,7,1,527,/997/8/567/688/695/1089/822/1037/,48C83C,,,f,528,2028146433,734881840,Postsubiculum +10696,,"Postsubiculum, layer 1",POST1,11,1,3,8690,1037,8,1,528,/997/8/567/688/695/1089/822/1037/10696/,48C83C,,,f,529,460318765,734881840,Postsubiculum layer 1 +10697,,"Postsubiculum, layer 2",POST2,11,1,3,8690,1037,8,1,529,/997/8/567/688/695/1089/822/1037/10697/,48C83C,,,f,530,2187770263,734881840,Postsubiculum layer 2 +10698,,"Postsubiculum, layer 3",POST3,11,1,3,8690,1037,8,1,530,/997/8/567/688/695/1089/822/1037/10698/,48C83C,,,f,531,4116809985,734881840,Postsubiculum layer 3 +1084,276,Presubiculum,PRE,8,1,3,8690,822,7,1,531,/997/8/567/688/695/1089/822/1084/,59B947,,,f,532,1788290302,734881840,Presubiculum +10699,,"Presubiculum, layer 1",PRE1,11,1,3,8690,1084,8,1,532,/997/8/567/688/695/1089/822/1084/10699/,59B947,,,f,533,2047674520,734881840,Presubiculum layer 1 +10700,,"Presubiculum, layer 2",PRE2,11,1,3,8690,1084,8,1,533,/997/8/567/688/695/1089/822/1084/10700/,59B947,,,f,534,3808712994,734881840,Presubiculum layer 2 +10701,,"Presubiculum, layer 3",PRE3,11,1,3,8690,1084,8,1,534,/997/8/567/688/695/1089/822/1084/10701/,59B947,,,f,535,2483251636,734881840,Presubiculum layer 3 +502,345,Subiculum,SUB,8,1,3,8690,822,7,1,535,/997/8/567/688/695/1089/822/502/,4FC244,,,f,536,3628141206,734881840,Subiculum +509,346,"Subiculum, dorsal part",SUBd,9,1,3,8690,502,8,1,536,/997/8/567/688/695/1089/822/502/509/,4FC244,,,f,537,454566553,734881840,Subiculum dorsal part +829,386,"Subiculum, dorsal part, molecular layer",SUBd-m,11,1,3,8690,509,9,1,537,/997/8/567/688/695/1089/822/502/509/829/,4FC244,,,f,538,3680523134,734881840,Subiculum dorsal part molecular layer +845,388,"Subiculum, dorsal part, pyramidal layer",SUBd-sp,11,1,3,8690,509,9,1,538,/997/8/567/688/695/1089/822/502/509/845/,4BB547,,,f,539,1397118745,734881840,Subiculum dorsal part pyramidal layer +837,387,"Subiculum, dorsal part, stratum radiatum",SUBd-sr,11,1,3,8690,509,9,1,539,/997/8/567/688/695/1089/822/502/509/837/,4FC244,,,f,540,3224949606,734881840,Subiculum dorsal part stratum radiatum +518,347,"Subiculum, ventral part",SUBv,9,1,3,8690,502,8,1,540,/997/8/567/688/695/1089/822/502/518/,4FC244,,,f,541,606639779,734881840,Subiculum ventral part +853,389,"Subiculum, ventral part, molecular layer",SUBv-m,11,1,3,8690,518,9,1,541,/997/8/567/688/695/1089/822/502/518/853/,4FC244,,,f,542,1565058070,734881840,Subiculum ventral part molecular layer +870,391,"Subiculum, ventral part, pyramidal layer",SUBv-sp,11,1,3,8690,518,9,1,542,/997/8/567/688/695/1089/822/502/518/870/,4BB547,,,f,543,3580813425,734881840,Subiculum ventral part pyramidal layer +861,390,"Subiculum, ventral part, stratum radiatum",SUBv-sr,11,1,3,8690,518,9,1,543,/997/8/567/688/695/1089/822/502/518/861/,4FC244,,,f,544,2211910331,734881840,Subiculum ventral part stratum radiatum +484682470,,Prosubiculum,ProS,8,1,3,8690,822,7,1,544,/997/8/567/688/695/1089/822/484682470/,58BA48,,,f,545,2109060151,734881840,Prosubiculum +484682475,,"Prosubiculum, dorsal part",ProSd,9,1,3,8690,484682470,8,1,545,/997/8/567/688/695/1089/822/484682470/484682475/,58BA48,,,f,546,1109550123,734881840,Prosubiculum dorsal part +484682479,,"Prosubiculum, dorsal part, molecular layer",ProSd-m,11,1,3,8690,484682475,9,1,546,/997/8/567/688/695/1089/822/484682470/484682475/484682479/,58BA48,,,f,547,4007318067,734881840,Prosubiculum dorsal part molecular layer +484682483,,"Prosubiculum, dorsal part, pyramidal layer",ProSd-sp,11,1,3,8690,484682475,9,1,547,/997/8/567/688/695/1089/822/484682470/484682475/484682483/,56B84B,,,f,548,1727845972,734881840,Prosubiculum dorsal part pyramidal layer +484682487,,"Prosubiculum, dorsal part, stratum radiatum",ProSd-sr,11,1,3,8690,484682475,9,1,548,/997/8/567/688/695/1089/822/484682470/484682475/484682487/,58BA48,,,f,549,3361756362,734881840,Prosubiculum dorsal part stratum radiatum +484682492,,"Prosubiculum, ventral part",ProSv,9,1,3,8690,484682470,8,1,549,/997/8/567/688/695/1089/822/484682470/484682492/,58BA48,,,f,550,18775621,734881840,Prosubiculum ventral part +484682496,,"Prosubiculum, ventral part, molecular layer",ProSv-m,11,1,3,8690,484682492,9,1,550,/997/8/567/688/695/1089/822/484682470/484682492/484682496/,58BA48,,,f,551,1427137466,734881840,Prosubiculum ventral part molecular layer +484682500,,"Prosubiculum, ventral part, pyramidal layer",ProSv-sp,11,1,3,8690,484682492,9,1,551,/997/8/567/688/695/1089/822/484682470/484682492/484682500/,56B84B,,,f,552,3711330269,734881840,Prosubiculum ventral part pyramidal layer +484682504,,"Prosubiculum, ventral part, stratum radiatum",Prosv-sr,11,1,3,8690,484682492,9,1,552,/997/8/567/688/695/1089/822/484682470/484682492/484682504/,58BA48,,,f,553,1556063743,734881840,Prosubiculum ventral part stratum radiatum +589508447,,Hippocampo-amygdalar transition area,HATA,8,1,3,8690,822,7,1,553,/997/8/567/688/695/1089/822/589508447/,33B932,,,f,554,1243801218,734881840,Hippocampo-amygdalar transition area +484682508,,Area prostriata,APr,8,1,3,8690,822,7,1,554,/997/8/567/688/695/1089/822/484682508/,33B932,,,f,555,407768279,734881840,Area prostriata +703,87,Cortical subplate,CTXsp,5,1,3,8690,688,4,1,555,/997/8/567/688/703/,8ADA87,,,f,556,1297404944,734881840,Cortical subplate +16,1,"Layer 6b, isocortex",6b,11,1,3,8690,703,5,1,556,/997/8/567/688/703/16/,8ADA87,,,f,557,2894025098,734881840,Layer 6b isocortex +583,72,Claustrum,CLA,8,1,3,8690,703,5,1,557,/997/8/567/688/703/583/,8ADA87,,,f,558,2624439303,734881840,Claustrum +942,117,Endopiriform nucleus,EP,8,1,3,8690,703,5,1,558,/997/8/567/688/703/942/,A0EE9D,,,f,559,2263280236,734881840,Endopiriform nucleus +952,118,"Endopiriform nucleus, dorsal part",EPd,9,1,3,8690,942,6,1,559,/997/8/567/688/703/942/952/,A0EE9D,,,f,560,1669532679,734881840,Endopiriform nucleus dorsal part +966,120,"Endopiriform nucleus, ventral part",EPv,9,1,3,8690,942,6,1,560,/997/8/567/688/703/942/966/,A0EE9D,,,f,561,870822862,734881840,Endopiriform nucleus ventral part +131,157,Lateral amygdalar nucleus,LA,8,1,3,8690,703,5,1,561,/997/8/567/688/703/131/,90EB8D,,,f,562,437540953,734881840,Lateral amygdalar nucleus +295,36,Basolateral amygdalar nucleus,BLA,8,1,3,8690,703,5,1,562,/997/8/567/688/703/295/,9DE79C,,,f,563,2535830127,734881840,Basolateral amygdalar nucleus +303,37,"Basolateral amygdalar nucleus, anterior part",BLAa,9,1,3,8690,295,6,1,563,/997/8/567/688/703/295/303/,9DE79C,,,f,564,2570788319,734881840,Basolateral amygdalar nucleus anterior part +311,38,"Basolateral amygdalar nucleus, posterior part",BLAp,9,1,3,8690,295,6,1,564,/997/8/567/688/703/295/311/,9DE79C,,,f,565,1545537085,734881840,Basolateral amygdalar nucleus posterior part +451,763,"Basolateral amygdalar nucleus, ventral part",BLAv,9,1,3,8690,295,6,1,565,/997/8/567/688/703/295/451/,9DE79C,,,f,566,1149064021,734881840,Basolateral amygdalar nucleus ventral part +319,39,Basomedial amygdalar nucleus,BMA,8,1,3,8690,703,5,1,566,/997/8/567/688/703/319/,84EA81,,,f,567,3634024678,734881840,Basomedial amygdalar nucleus +327,40,"Basomedial amygdalar nucleus, anterior part",BMAa,9,1,3,8690,319,6,1,567,/997/8/567/688/703/319/327/,84EA81,,,f,568,2574993876,734881840,Basomedial amygdalar nucleus anterior part +334,41,"Basomedial amygdalar nucleus, posterior part",BMAp,9,1,3,8690,319,6,1,568,/997/8/567/688/703/319/334/,84EA81,,,f,569,3419250657,734881840,Basomedial amygdalar nucleus posterior part +780,238,Posterior amygdalar nucleus,PA,8,1,3,8690,703,5,1,569,/997/8/567/688/703/780/,97EC93,,,f,570,2472141022,734881840,Posterior amygdalar nucleus +623,77,Cerebral nuclei,CNU,3,1,3,8690,567,3,1,570,/997/8/567/623/,98D6F9,,,f,571,3504435073,734881840,Cerebral nuclei +477,342,Striatum,STR,5,1,3,8690,623,4,1,571,/997/8/567/623/477/,98D6F9,,,f,572,3310200382,734881840,Striatum +485,343,Striatum dorsal region,STRd,6,1,3,8690,477,5,1,572,/997/8/567/623/477/485/,98D6F9,,,f,573,598493306,734881840,Striatum dorsal region +672,83,Caudoputamen,CP,8,1,3,8690,485,6,1,573,/997/8/567/623/477/485/672/,98D6F9,,,f,574,2140591882,734881840,Caudoputamen +493,344,Striatum ventral region,STRv,6,1,3,8690,477,5,1,574,/997/8/567/623/477/493/,80CDF8,,,f,575,1000674722,734881840,Striatum ventral region +56,6,Nucleus accumbens,ACB,8,1,3,8690,493,6,1,575,/997/8/567/623/477/493/56/,80CDF8,,,f,576,2053079136,734881840,Nucleus accumbens +998,124,Fundus of striatum,FS,8,1,3,8690,493,6,1,576,/997/8/567/623/477/493/998/,80CDF8,,,f,577,663741194,734881840,Fundus of striatum +754,235,Olfactory tubercle,OT,8,1,3,8690,493,6,1,577,/997/8/567/623/477/493/754/,80CDF8,,,f,578,1598442672,734881840,Olfactory tubercle +481,767,Islands of Calleja,isl,9,1,3,8690,754,7,1,578,/997/8/567/623/477/493/754/481/,80CDF8,,,f,579,2910337920,734881840,Islands of Calleja +489,768,Major island of Calleja,islm,9,1,3,8690,754,7,1,579,/997/8/567/623/477/493/754/489/,80CDF8,,,f,580,883243095,734881840,Major island of Calleja +144,866,"Olfactory tubercle, layers 1-3",OT1-3,11,1,3,8690,754,7,1,580,/997/8/567/623/477/493/754/144/,80CDF8,,,f,581,523471140,734881840,Olfactory tubercle layers 1-3 +458,764,"Olfactory tubercle, molecular layer",OT1,11,1,3,8690,754,7,1,581,/997/8/567/623/477/493/754/458/,80CDF8,,,f,582,801971819,734881840,Olfactory tubercle molecular layer +465,765,"Olfactory tubercle, pyramidal layer",OT2,11,1,3,8690,754,7,1,582,/997/8/567/623/477/493/754/465/,80CDF8,,,f,583,2817202700,734881840,Olfactory tubercle pyramidal layer +473,766,"Olfactory tubercle, polymorph layer",OT3,11,1,3,8690,754,7,1,583,/997/8/567/623/477/493/754/473/,80CDF8,,,f,584,3958637220,734881840,Olfactory tubercle polymorph layer +549009199,,Lateral strip of striatum,LSS,8,1,3,8690,493,6,1,584,/997/8/567/623/477/493/549009199/,80CDF8,,,f,585,1436254915,734881840,Lateral strip of striatum +275,175,Lateral septal complex,LSX,6,1,3,8690,477,5,1,585,/997/8/567/623/477/275/,90CBED,,,f,586,1570366689,734881840,Lateral septal complex +242,171,Lateral septal nucleus,LS,8,1,3,8690,275,6,1,586,/997/8/567/623/477/275/242/,90CBED,,,f,587,3913089740,734881840,Lateral septal nucleus +250,172,"Lateral septal nucleus, caudal (caudodorsal) part",LSc,9,1,3,8690,242,7,1,587,/997/8/567/623/477/275/242/250/,90CBED,,,f,588,3378904121,734881840,Lateral septal nucleus caudal (caudodorsal) part +258,173,"Lateral septal nucleus, rostral (rostroventral) part",LSr,9,1,3,8690,242,7,1,588,/997/8/567/623/477/275/242/258/,90CBED,,,f,589,2666394691,734881840,Lateral septal nucleus rostral (rostroventral) part +266,174,"Lateral septal nucleus, ventral part",LSv,9,1,3,8690,242,7,1,589,/997/8/567/623/477/275/242/266/,90CBED,,,f,590,1660459064,734881840,Lateral septal nucleus ventral part +310,321,Septofimbrial nucleus,SF,8,1,3,8690,275,6,1,590,/997/8/567/623/477/275/310/,90CBED,,,f,591,3780909616,734881840,Septofimbrial nucleus +333,324,Septohippocampal nucleus,SH,8,1,3,8690,275,6,1,591,/997/8/567/623/477/275/333/,90CBED,,,f,592,2151592702,734881840,Septohippocampal nucleus +278,317,Striatum-like amygdalar nuclei,sAMY,6,1,3,8690,477,5,1,592,/997/8/567/623/477/278/,80C0E2,,,f,593,746209354,734881840,Striatum-like amygdalar nuclei +23,2,Anterior amygdalar area,AAA,8,1,3,8690,278,6,1,593,/997/8/567/623/477/278/23/,80C0E2,,,f,594,4252873038,734881840,Anterior amygdalar area +292,460,Bed nucleus of the accessory olfactory tract,BA,8,1,3,8690,278,6,1,594,/997/8/567/623/477/278/292/,80C0E2,,,f,595,1650550173,734881840,Bed nucleus of the accessory olfactory tract +536,66,Central amygdalar nucleus,CEA,8,1,3,8690,278,6,1,595,/997/8/567/623/477/278/536/,80C0E2,,,f,596,3284898075,734881840,Central amygdalar nucleus +544,67,"Central amygdalar nucleus, capsular part",CEAc,9,1,3,8690,536,7,1,596,/997/8/567/623/477/278/536/544/,80C0E2,,,f,597,4187015181,734881840,Central amygdalar nucleus capsular part +551,68,"Central amygdalar nucleus, lateral part",CEAl,9,1,3,8690,536,7,1,597,/997/8/567/623/477/278/536/551/,80C0E2,,,f,598,1239602128,734881840,Central amygdalar nucleus lateral part +559,69,"Central amygdalar nucleus, medial part",CEAm,9,1,3,8690,536,7,1,598,/997/8/567/623/477/278/536/559/,80C0E2,,,f,599,2654652343,734881840,Central amygdalar nucleus medial part +1105,137,Intercalated amygdalar nucleus,IA,8,1,3,8690,278,6,1,599,/997/8/567/623/477/278/1105/,80C0E2,,,f,600,1834113869,734881840,Intercalated amygdalar nucleus +403,191,Medial amygdalar nucleus,MEA,8,1,3,8690,278,6,1,600,/997/8/567/623/477/278/403/,80C0E2,,,f,601,3783070713,734881840,Medial amygdalar nucleus +411,192,"Medial amygdalar nucleus, anterodorsal part",MEAad,9,1,3,8690,403,7,1,601,/997/8/567/623/477/278/403/411/,80C0E2,,,f,602,2891844805,734881840,Medial amygdalar nucleus anterodorsal part +418,193,"Medial amygdalar nucleus, anteroventral part",MEAav,9,1,3,8690,403,7,1,602,/997/8/567/623/477/278/403/418/,80C0E2,,,f,603,1178783058,734881840,Medial amygdalar nucleus anteroventral part +426,194,"Medial amygdalar nucleus, posterodorsal part",MEApd,9,1,3,8690,403,7,1,603,/997/8/567/623/477/278/403/426/,80C0E2,,,f,604,4033616565,734881840,Medial amygdalar nucleus posterodorsal part +472,907,"Medial amygdalar nucleus, posterodorsal part, sublayer a",MEApd-a,11,1,3,8690,426,8,1,604,/997/8/567/623/477/278/403/426/472/,80C0E2,,,f,605,204681813,734881840,Medial amygdalar nucleus posterodorsal part sublayer a +480,908,"Medial amygdalar nucleus, posterodorsal part, sublayer b",MEApd-b,11,1,3,8690,426,8,1,605,/997/8/567/623/477/278/403/426/480/,80C0E2,,,f,606,2503631855,734881840,Medial amygdalar nucleus posterodorsal part sublayer b +487,909,"Medial amygdalar nucleus, posterodorsal part, sublayer c",MEApd-c,11,1,3,8690,426,8,1,606,/997/8/567/623/477/278/403/426/487/,80C0E2,,,f,607,3795669881,734881840,Medial amygdalar nucleus posterodorsal part sublayer c +435,195,"Medial amygdalar nucleus, posteroventral part",MEApv,9,1,3,8690,403,7,1,607,/997/8/567/623/477/278/403/435/,80C0E2,,,f,608,370904696,734881840,Medial amygdalar nucleus posteroventral part +803,241,Pallidum,PAL,5,1,3,8690,623,4,1,608,/997/8/567/623/803/,8599CC,,,f,609,1451914672,734881840,Pallidum +818,243,"Pallidum, dorsal region",PALd,6,1,3,8690,803,5,1,609,/997/8/567/623/803/818/,8599CC,,,f,610,463940218,734881840,Pallidum dorsal region +1022,127,"Globus pallidus, external segment",GPe,8,1,3,8690,818,6,1,610,/997/8/567/623/803/818/1022/,8599CC,,,f,611,3096725950,734881840,Globus pallidus external segment +1031,128,"Globus pallidus, internal segment",GPi,8,1,3,8690,818,6,1,611,/997/8/567/623/803/818/1031/,8599CC,,,f,612,2033111499,734881840,Globus pallidus internal segment +835,245,"Pallidum, ventral region",PALv,6,1,3,8690,803,5,1,612,/997/8/567/623/803/835/,A2B1D8,,,f,613,1000152768,734881840,Pallidum ventral region +342,325,Substantia innominata,SI,8,1,3,8690,835,6,1,613,/997/8/567/623/803/835/342/,A2B1D8,,,f,614,4279866235,734881840,Substantia innominata +298,178,Magnocellular nucleus,MA,8,1,3,8690,835,6,1,614,/997/8/567/623/803/835/298/,A2B1D8,,,f,615,1799914489,734881840,Magnocellular nucleus +826,244,"Pallidum, medial region",PALm,6,1,3,8690,803,5,1,615,/997/8/567/623/803/826/,96A7D3,,,f,616,13293402,734881840,Pallidum medial region +904,395,Medial septal complex,MSC,8,1,3,8690,826,6,1,616,/997/8/567/623/803/826/904/,96A7D3,,,f,617,3136033045,734881840,Medial septal complex +564,211,Medial septal nucleus,MS,9,1,3,8690,904,7,1,617,/997/8/567/623/803/826/904/564/,96A7D3,,,f,618,239662904,734881840,Medial septal nucleus +596,215,Diagonal band nucleus,NDB,9,1,3,8690,904,7,1,618,/997/8/567/623/803/826/904/596/,96A7D3,,,f,619,278981173,734881840,Diagonal band nucleus +581,355,Triangular nucleus of septum,TRS,8,1,3,8690,826,6,1,619,/997/8/567/623/803/826/581/,96A7D3,,,f,620,609929054,734881840,Triangular nucleus of septum +809,242,"Pallidum, caudal region",PALc,6,1,3,8690,803,5,1,620,/997/8/567/623/803/809/,B3C0DF,,,f,621,1672245294,734881840,Pallidum caudal region +351,43,Bed nuclei of the stria terminalis,BST,8,1,3,8690,809,6,1,621,/997/8/567/623/803/809/351/,B3C0DF,,,f,622,972962091,734881840,Bed nuclei of the stria terminalis +359,44,"Bed nuclei of the stria terminalis, anterior division",BSTa,9,1,3,8690,351,7,1,622,/997/8/567/623/803/809/351/359/,B3C0DF,,,f,623,463308472,734881840,Bed nuclei of the stria terminalis anterior division +537,774,"Bed nuclei of the stria terminalis, anterior division, anterolateral area",BSTal,10,1,3,8690,359,8,1,623,/997/8/567/623/803/809/351/359/537/,B3C0DF,,,f,624,1166114521,734881840,Bed nuclei of the stria terminalis anterior division anterolateral area +498,769,"Bed nuclei of the stria terminalis, anterior division, anteromedial area",BSTam,10,1,3,8690,359,8,1,624,/997/8/567/623/803/809/351/359/498/,B3C0DF,,,f,625,718255829,734881840,Bed nuclei of the stria terminalis anterior division anteromedial area +505,770,"Bed nuclei of the stria terminalis, anterior division, dorsomedial nucleus",BSTdm,10,1,3,8690,359,8,1,625,/997/8/567/623/803/809/351/359/505/,B3C0DF,,,f,626,2749560296,734881840,Bed nuclei of the stria terminalis anterior division dorsomedial nucleus +513,771,"Bed nuclei of the stria terminalis, anterior division, fusiform nucleus",BSTfu,10,1,3,8690,359,8,1,626,/997/8/567/623/803/809/351/359/513/,B3C0DF,,,f,627,1253377207,734881840,Bed nuclei of the stria terminalis anterior division fusiform nucleus +546,775,"Bed nuclei of the stria terminalis, anterior division, juxtacapsular nucleus",BSTju,10,1,3,8690,359,8,1,627,/997/8/567/623/803/809/351/359/546/,B3C0DF,,,f,628,3052837647,734881840,Bed nuclei of the stria terminalis anterior division juxtacapsular nucleus +521,772,"Bed nuclei of the stria terminalis, anterior division, magnocellular nucleus",BSTmg,10,1,3,8690,359,8,1,628,/997/8/567/623/803/809/351/359/521/,B3C0DF,,,f,629,178858531,734881840,Bed nuclei of the stria terminalis anterior division magnocellular nucleus +554,776,"Bed nuclei of the stria terminalis, anterior division, oval nucleus",BSTov,10,1,3,8690,359,8,1,629,/997/8/567/623/803/809/351/359/554/,B3C0DF,,,f,630,3357819933,734881840,Bed nuclei of the stria terminalis anterior division oval nucleus +562,777,"Bed nuclei of the stria terminalis, anterior division, rhomboid nucleus",BSTrh,10,1,3,8690,359,8,1,630,/997/8/567/623/803/809/351/359/562/,B3C0DF,,,f,631,1020963585,734881840,Bed nuclei of the stria terminalis anterior division rhomboid nucleus +529,773,"Bed nuclei of the stria terminalis, anterior division, ventral nucleus",BSTv,10,1,3,8690,359,8,1,631,/997/8/567/623/803/809/351/359/529/,B3C0DF,,,f,632,2523776098,734881840,Bed nuclei of the stria terminalis anterior division ventral nucleus +367,45,"Bed nuclei of the stria terminalis, posterior division",BSTp,9,1,3,8690,351,7,1,632,/997/8/567/623/803/809/351/367/,B3C0DF,,,f,633,4020110230,734881840,Bed nuclei of the stria terminalis posterior division +569,778,"Bed nuclei of the stria terminalis, posterior division, dorsal nucleus",BSTd,10,1,3,8690,367,8,1,633,/997/8/567/623/803/809/351/367/569/,B3C0DF,,,f,634,1274650938,734881840,Bed nuclei of the stria terminalis posterior division dorsal nucleus +578,779,"Bed nuclei of the stria terminalis, posterior division, principal nucleus",BSTpr,10,1,3,8690,367,8,1,634,/997/8/567/623/803/809/351/367/578/,B3C0DF,,,f,635,366620301,734881840,Bed nuclei of the stria terminalis posterior division principal nucleus +585,780,"Bed nuclei of the stria terminalis, posterior division, interfascicular nucleus",BSTif,10,1,3,8690,367,8,1,635,/997/8/567/623/803/809/351/367/585/,B3C0DF,,,f,636,2460616957,734881840,Bed nuclei of the stria terminalis posterior division interfascicular nucleus +594,781,"Bed nuclei of the stria terminalis, posterior division, transverse nucleus",BSTtr,10,1,3,8690,367,8,1,636,/997/8/567/623/803/809/351/367/594/,B3C0DF,,,f,637,3708185785,734881840,Bed nuclei of the stria terminalis posterior division transverse nucleus +602,782,"Bed nuclei of the stria terminalis, posterior division, strial extension",BSTse,10,1,3,8690,367,8,1,637,/997/8/567/623/803/809/351/367/602/,B3C0DF,,,f,638,1576149119,734881840,Bed nuclei of the stria terminalis posterior division strial extension +287,35,Bed nucleus of the anterior commissure,BAC,8,1,3,8690,809,6,1,638,/997/8/567/623/803/809/287/,B3C0DF,,,f,639,1468320867,734881840,Bed nucleus of the anterior commissure +343,42,Brain stem,BS,2,1,3,8690,8,2,1,639,/997/8/343/,FF7080,,,f,640,1463546236,734881840,Brain stem +1129,140,Interbrain,IB,3,1,3,8690,343,3,1,640,/997/8/343/1129/,FF7080,,,f,641,3609083732,734881840,Interbrain +549,351,Thalamus,TH,5,1,3,8690,1129,4,1,641,/997/8/343/1129/549/,FF7080,,,f,642,3417047876,734881840,Thalamus +864,107,"Thalamus, sensory-motor cortex related",DORsm,6,1,3,8690,549,5,1,642,/997/8/343/1129/549/864/,FF8084,,,f,643,3240123133,734881840,Thalamus sensory-motor cortex related +637,362,Ventral group of the dorsal thalamus,VENT,7,1,3,8690,864,6,1,643,/997/8/343/1129/549/864/637/,FF8084,,,f,644,3720800461,734881840,Ventral group of the dorsal thalamus +629,361,Ventral anterior-lateral complex of the thalamus,VAL,8,1,3,8690,637,7,1,644,/997/8/343/1129/549/864/637/629/,FF8084,,,f,645,387269350,734881840,Ventral anterior-lateral complex of the thalamus +685,368,Ventral medial nucleus of the thalamus,VM,8,1,3,8690,637,7,1,645,/997/8/343/1129/549/864/637/685/,FF8084,,,f,646,1314288168,734881840,Ventral medial nucleus of the thalamus +709,371,Ventral posterior complex of the thalamus,VP,8,1,3,8690,637,7,1,646,/997/8/343/1129/549/864/637/709/,FF8084,,,f,647,359843477,734881840,Ventral posterior complex of the thalamus +718,372,Ventral posterolateral nucleus of the thalamus,VPL,9,1,3,8690,709,8,1,647,/997/8/343/1129/549/864/637/709/718/,FF8084,,,f,648,2885291680,734881840,Ventral posterolateral nucleus of the thalamus +725,373,"Ventral posterolateral nucleus of the thalamus, parvicellular part",VPLpc,9,1,3,8690,709,8,1,648,/997/8/343/1129/549/864/637/709/725/,FF8084,,,f,649,2868220330,734881840,Ventral posterolateral nucleus of the thalamus parvicellular part +733,374,Ventral posteromedial nucleus of the thalamus,VPM,9,1,3,8690,709,8,1,649,/997/8/343/1129/549/864/637/709/733/,FF8084,,,f,650,535836268,734881840,Ventral posteromedial nucleus of the thalamus +741,375,"Ventral posteromedial nucleus of the thalamus, parvicellular part",VPMpc,9,1,3,8690,709,8,1,650,/997/8/343/1129/549/864/637/709/741/,FF8084,,,f,651,2993275992,734881840,Ventral posteromedial nucleus of the thalamus parvicellular part +563807435,,Posterior triangular thalamic nucleus,PoT,8,1,3,8690,637,7,1,651,/997/8/343/1129/549/864/637/563807435/,FF8084,,,f,652,2408746103,734881840,Posterior triangular thalamic nucleus +406,333,Subparafascicular nucleus,SPF,8,1,3,8690,864,6,1,652,/997/8/343/1129/549/864/406/,FF8084,,,f,653,411188720,734881840,Subparafascicular nucleus +414,334,"Subparafascicular nucleus, magnocellular part",SPFm,9,1,3,8690,406,7,1,653,/997/8/343/1129/549/864/406/414/,FF8084,,,f,654,1493863119,734881840,Subparafascicular nucleus magnocellular part +422,335,"Subparafascicular nucleus, parvicellular part",SPFp,9,1,3,8690,406,7,1,654,/997/8/343/1129/549/864/406/422/,FF8084,,,f,655,1800790730,734881840,Subparafascicular nucleus parvicellular part +609,783,Subparafascicular area,SPA,8,1,3,8690,864,6,1,655,/997/8/343/1129/549/864/609/,FF8084,,,f,656,3168649413,734881840,Subparafascicular area +1044,271,Peripeduncular nucleus,PP,8,1,3,8690,864,6,1,656,/997/8/343/1129/549/864/1044/,FF8084,,,f,657,4073956777,734881840,Peripeduncular nucleus +1008,125,"Geniculate group, dorsal thalamus",GENd,7,1,3,8690,864,6,1,657,/997/8/343/1129/549/864/1008/,FF8084,,,f,658,4155059555,734881840,Geniculate group dorsal thalamus +475,200,Medial geniculate complex,MG,8,1,3,8690,1008,7,1,658,/997/8/343/1129/549/864/1008/475/,FF8084,,,f,659,3303425611,734881840,Medial geniculate complex +1072,416,"Medial geniculate complex, dorsal part",MGd,9,1,3,8690,475,8,1,659,/997/8/343/1129/549/864/1008/475/1072/,FF8084,,,f,660,69811582,734881840,Medial geniculate complex dorsal part +1079,417,"Medial geniculate complex, ventral part",MGv,9,1,3,8690,475,8,1,660,/997/8/343/1129/549/864/1008/475/1079/,FF8084,,,f,661,442093671,734881840,Medial geniculate complex ventral part +1088,418,"Medial geniculate complex, medial part",MGm,9,1,3,8690,475,8,1,661,/997/8/343/1129/549/864/1008/475/1088/,FF8084,,,f,662,1525122346,734881840,Medial geniculate complex medial part +170,162,Dorsal part of the lateral geniculate complex,LGd,8,1,3,8690,1008,7,1,662,/997/8/343/1129/549/864/1008/170/,FF8084,,,f,663,2639836426,734881840,Dorsal part of the lateral geniculate complex +496345664,,"Dorsal part of the lateral geniculate complex, shell",LGd-sh,9,1,3,8690,170,8,1,663,/997/8/343/1129/549/864/1008/170/496345664/,FF8084,,,f,664,3071297945,734881840,Dorsal part of the lateral geniculate complex shell +496345668,,"Dorsal part of the lateral geniculate complex, core",LGd-co,9,1,3,8690,170,8,1,664,/997/8/343/1129/549/864/1008/170/496345668/,FF8084,,,f,665,2339811100,734881840,Dorsal part of the lateral geniculate complex core +496345672,,"Dorsal part of the lateral geniculate complex, ipsilateral zone",LGd-ip,9,1,3,8690,170,8,1,665,/997/8/343/1129/549/864/1008/170/496345672/,FF8084,,,f,666,1161910872,734881840,Dorsal part of the lateral geniculate complex ipsilateral zone +856,106,"Thalamus, polymodal association cortex related",DORpm,6,1,3,8690,549,5,1,666,/997/8/343/1129/549/856/,FF909F,,,f,667,171097726,734881840,Thalamus polymodal association cortex related +138,158,Lateral group of the dorsal thalamus,LAT,7,1,3,8690,856,6,1,667,/997/8/343/1129/549/856/138/,FF909F,,,f,668,1237671945,734881840,Lateral group of the dorsal thalamus +218,168,Lateral posterior nucleus of the thalamus,LP,8,1,3,8690,138,7,1,668,/997/8/343/1129/549/856/138/218/,FF909F,,,f,669,910558492,734881840,Lateral posterior nucleus of the thalamus +1020,268,Posterior complex of the thalamus,PO,8,1,3,8690,138,7,1,669,/997/8/343/1129/549/856/138/1020/,FF909F,,,f,670,2102251263,734881840,Posterior complex of the thalamus +1029,269,Posterior limiting nucleus of the thalamus,POL,8,1,3,8690,138,7,1,670,/997/8/343/1129/549/856/138/1029/,FF909F,,,f,671,3921343755,734881840,Posterior limiting nucleus of the thalamus +325,323,Suprageniculate nucleus,SGN,8,1,3,8690,138,7,1,671,/997/8/343/1129/549/856/138/325/,FF909F,,,f,672,2630178778,734881840,Suprageniculate nucleus +560581551,,Ethmoid nucleus of the thalamus,Eth,8,1,3,8690,138,7,1,672,/997/8/343/1129/549/856/138/560581551/,FF909F,,,f,673,2246666137,734881840,Ethmoid nucleus of the thalamus +560581555,,Retroethmoid nucleus,REth,8,1,3,8690,138,7,1,673,/997/8/343/1129/549/856/138/560581555/,FF909F,,,f,674,214700216,734881840,Retroethmoid nucleus +239,29,Anterior group of the dorsal thalamus,ATN,7,1,3,8690,856,6,1,674,/997/8/343/1129/549/856/239/,FF909F,,,f,675,3414692864,734881840,Anterior group of the dorsal thalamus +255,31,Anteroventral nucleus of thalamus,AV,8,1,3,8690,239,7,1,675,/997/8/343/1129/549/856/239/255/,FF909F,,,f,676,2379451227,734881840,Anteroventral nucleus of thalamus +127,15,Anteromedial nucleus,AM,8,1,3,8690,239,7,1,676,/997/8/343/1129/549/856/239/127/,FF909F,,,f,677,70138096,734881840,Anteromedial nucleus +1096,419,"Anteromedial nucleus, dorsal part",AMd,9,1,3,8690,127,8,1,677,/997/8/343/1129/549/856/239/127/1096/,FF909F,,,f,678,2125395068,734881840,Anteromedial nucleus dorsal part +1104,420,"Anteromedial nucleus, ventral part",AMv,9,1,3,8690,127,8,1,678,/997/8/343/1129/549/856/239/127/1104/,FF909F,,,f,679,4096603778,734881840,Anteromedial nucleus ventral part +64,7,Anterodorsal nucleus,AD,8,1,3,8690,239,7,1,679,/997/8/343/1129/549/856/239/64/,FF909F,,,f,680,1062958533,734881840,Anterodorsal nucleus +1120,139,Interanteromedial nucleus of the thalamus,IAM,8,1,3,8690,239,7,1,680,/997/8/343/1129/549/856/239/1120/,FF909F,,,f,681,3666899134,734881840,Interanteromedial nucleus of the thalamus +1113,138,Interanterodorsal nucleus of the thalamus,IAD,8,1,3,8690,239,7,1,681,/997/8/343/1129/549/856/239/1113/,FF909F,,,f,682,3914886814,734881840,Interanterodorsal nucleus of the thalamus +155,160,Lateral dorsal nucleus of thalamus,LD,8,1,3,8690,239,7,1,682,/997/8/343/1129/549/856/239/155/,FF909F,,,f,683,3458000123,734881840,Lateral dorsal nucleus of thalamus +444,196,Medial group of the dorsal thalamus,MED,7,1,3,8690,856,6,1,683,/997/8/343/1129/549/856/444/,FF909F,,,f,684,2351110645,734881840,Medial group of the dorsal thalamus +59,148,Intermediodorsal nucleus of the thalamus,IMD,8,1,3,8690,444,7,1,684,/997/8/343/1129/549/856/444/59/,FF909F,,,f,685,80523806,734881840,Intermediodorsal nucleus of the thalamus +362,186,Mediodorsal nucleus of thalamus,MD,8,1,3,8690,444,7,1,685,/997/8/343/1129/549/856/444/362/,FF909F,,,f,686,2240499387,734881840,Mediodorsal nucleus of thalamus +617,784,"Mediodorsal nucleus of the thalamus, central part",MDc,9,1,3,8690,362,8,1,686,/997/8/343/1129/549/856/444/362/617/,FF909F,,,f,687,1540012109,734881840,Mediodorsal nucleus of the thalamus central part +626,785,"Mediodorsal nucleus of the thalamus, lateral part",MDl,9,1,3,8690,362,8,1,687,/997/8/343/1129/549/856/444/362/626/,FF909F,,,f,688,313529261,734881840,Mediodorsal nucleus of the thalamus lateral part +636,786,"Mediodorsal nucleus of the thalamus, medial part",MDm,9,1,3,8690,362,8,1,688,/997/8/343/1129/549/856/444/362/636/,FF909F,,,f,689,307537672,734881840,Mediodorsal nucleus of the thalamus medial part +366,328,Submedial nucleus of the thalamus,SMT,8,1,3,8690,444,7,1,689,/997/8/343/1129/549/856/444/366/,FF909F,,,f,690,524654949,734881840,Submedial nucleus of the thalamus +1077,275,Perireunensis nucleus,PR,8,1,3,8690,444,7,1,690,/997/8/343/1129/549/856/444/1077/,FF909F,,,f,691,985229058,734881840,Perireunensis nucleus +571,212,Midline group of the dorsal thalamus,MTN,7,1,3,8690,856,6,1,691,/997/8/343/1129/549/856/571/,FF909F,,,f,692,94203556,734881840,Midline group of the dorsal thalamus +149,301,Paraventricular nucleus of the thalamus,PVT,8,1,3,8690,571,7,1,692,/997/8/343/1129/549/856/571/149/,FF909F,,,f,693,3631961400,734881840,Paraventricular nucleus of the thalamus +15,284,Parataenial nucleus,PT,8,1,3,8690,571,7,1,693,/997/8/343/1129/549/856/571/15/,FF909F,,,f,694,1224128658,734881840,Parataenial nucleus +181,305,Nucleus of reuniens,RE,8,1,3,8690,571,7,1,694,/997/8/343/1129/549/856/571/181/,FF909F,,,f,695,2113641023,734881840,Nucleus of reuniens +560581559,,Xiphoid thalamic nucleus,Xi,8,1,3,8690,571,7,1,695,/997/8/343/1129/549/856/571/560581559/,FF909F,,,f,696,1561183712,734881840,Xiphoid thalamic nucleus +51,147,Intralaminar nuclei of the dorsal thalamus,ILM,7,1,3,8690,856,6,1,696,/997/8/343/1129/549/856/51/,FF909F,,,f,697,53488759,734881840,Intralaminar nuclei of the dorsal thalamus +189,306,Rhomboid nucleus,RH,8,1,3,8690,51,7,1,697,/997/8/343/1129/549/856/51/189/,FF909F,,,f,698,2507270646,734881840,Rhomboid nucleus +599,74,Central medial nucleus of the thalamus,CM,8,1,3,8690,51,7,1,698,/997/8/343/1129/549/856/51/599/,FF909F,,,f,699,769425900,734881840,Central medial nucleus of the thalamus +907,254,Paracentral nucleus,PCN,8,1,3,8690,51,7,1,699,/997/8/343/1129/549/856/51/907/,FF909F,,,f,700,34102893,734881840,Paracentral nucleus +575,71,Central lateral nucleus of the thalamus,CL,8,1,3,8690,51,7,1,700,/997/8/343/1129/549/856/51/575/,FF909F,,,f,701,1181786423,734881840,Central lateral nucleus of the thalamus +930,257,Parafascicular nucleus,PF,8,1,3,8690,51,7,1,701,/997/8/343/1129/549/856/51/930/,FF909F,,,f,702,2732022867,734881840,Parafascicular nucleus +560581563,,Posterior intralaminar thalamic nucleus,PIL,8,1,3,8690,51,7,1,702,/997/8/343/1129/549/856/51/560581563/,FF909F,,,f,703,809074043,734881840,Posterior intralaminar thalamic nucleus +262,315,Reticular nucleus of the thalamus,RT,8,1,3,8690,856,6,1,703,/997/8/343/1129/549/856/262/,FF909F,,,f,704,2529312902,734881840,Reticular nucleus of the thalamus +1014,126,"Geniculate group, ventral thalamus",GENv,7,1,3,8690,856,6,1,704,/997/8/343/1129/549/856/1014/,FF909F,,,f,705,401556039,734881840,Geniculate group ventral thalamus +27,144,Intergeniculate leaflet of the lateral geniculate complex,IGL,8,1,3,8690,1014,7,1,705,/997/8/343/1129/549/856/1014/27/,FF909F,,,f,706,1900856090,734881840,Intergeniculate leaflet of the lateral geniculate complex +563807439,,Intermediate geniculate nucleus,IntG,8,1,3,8690,1014,7,1,706,/997/8/343/1129/549/856/1014/563807439/,FF909F,,,f,707,2887461472,734881840,Intermediate geniculate nucleus +178,163,Ventral part of the lateral geniculate complex,LGv,8,1,3,8690,1014,7,1,707,/997/8/343/1129/549/856/1014/178/,FF909F,,,f,708,685555022,734881840,Ventral part of the lateral geniculate complex +300,461,"Ventral part of the lateral geniculate complex, lateral zone",LGvl,9,1,3,8690,178,8,1,708,/997/8/343/1129/549/856/1014/178/300/,FF909F,,,f,709,3780597444,734881840,Ventral part of the lateral geniculate complex lateral zone +316,463,"Ventral part of the lateral geniculate complex, medial zone",LGvm,9,1,3,8690,178,8,1,709,/997/8/343/1129/549/856/1014/178/316/,FF909F,,,f,710,579977949,734881840,Ventral part of the lateral geniculate complex medial zone +321,464,Subgeniculate nucleus,SubG,8,1,3,8690,1014,7,1,710,/997/8/343/1129/549/856/1014/321/,FF909F,,,f,711,3545734096,734881840,Subgeniculate nucleus +958,119,Epithalamus,EPI,7,1,3,8690,856,6,1,711,/997/8/343/1129/549/856/958/,FF909F,,,f,712,2649294941,734881840,Epithalamus +483,201,Medial habenula,MH,8,1,3,8690,958,7,1,712,/997/8/343/1129/549/856/958/483/,FF909F,,,f,713,176609275,734881840,Medial habenula +186,164,Lateral habenula,LH,8,1,3,8690,958,7,1,713,/997/8/343/1129/549/856/958/186/,FF909F,,,f,714,774070380,734881840,Lateral habenula +953,260,Pineal body,PIN,8,1,3,8690,958,7,1,714,/997/8/343/1129/549/856/958/953/,FF909F,,,f,715,1539032129,734881840,Pineal body +1097,136,Hypothalamus,HY,5,1,3,8690,1129,4,1,715,/997/8/343/1129/1097/,E64438,,,f,716,3938328193,734881840,Hypothalamus +157,302,Periventricular zone,PVZ,6,1,3,8690,1097,5,1,716,/997/8/343/1129/1097/157/,FF5D50,,,f,717,1581950529,734881840,Periventricular zone +390,331,Supraoptic nucleus,SO,8,1,3,8690,157,6,1,717,/997/8/343/1129/1097/157/390/,FF5D50,,,f,718,3787702178,734881840,Supraoptic nucleus +332,465,Accessory supraoptic group,ASO,7,1,3,8690,157,6,1,718,/997/8/343/1129/1097/157/332/,FF5D50,,,f,719,1856950247,734881840,Accessory supraoptic group +432,902,Nucleus circularis,NC,8,1,3,8690,332,7,1,719,/997/8/343/1129/1097/157/332/432/,FF5D50,,,f,720,163854910,734881840,Nucleus circularis +38,287,Paraventricular hypothalamic nucleus,PVH,8,1,3,8690,157,6,1,720,/997/8/343/1129/1097/157/38/,FF5D50,,,f,721,3443963014,734881840,Paraventricular hypothalamic nucleus +71,291,"Paraventricular hypothalamic nucleus, magnocellular division",PVHm,9,1,3,8690,38,7,1,721,/997/8/343/1129/1097/157/38/71/,FF5D50,,,f,722,4268996545,734881840,Paraventricular hypothalamic nucleus magnocellular division +47,288,"Paraventricular hypothalamic nucleus, magnocellular division, anterior magnocellular part",PVHam,10,1,3,8690,71,8,1,722,/997/8/343/1129/1097/157/38/71/47/,FF5D50,,,f,723,4203299482,734881840,Paraventricular hypothalamic nucleus magnocellular division anterior magnocellular part +79,292,"Paraventricular hypothalamic nucleus, magnocellular division, medial magnocellular part",PVHmm,10,1,3,8690,71,8,1,723,/997/8/343/1129/1097/157/38/71/79/,FF5D50,,,f,724,2109016078,734881840,Paraventricular hypothalamic nucleus magnocellular division medial magnocellular part +103,295,"Paraventricular hypothalamic nucleus, magnocellular division, posterior magnocellular part",PVHpm,10,1,3,8690,71,8,1,724,/997/8/343/1129/1097/157/38/71/103/,FF5D50,,,f,725,250376013,734881840,Paraventricular hypothalamic nucleus magnocellular division posterior magnocellular part +652,788,"Paraventricular hypothalamic nucleus, magnocellular division, posterior magnocellular part, lateral zone",PVHpml,11,1,3,8690,103,9,1,725,/997/8/343/1129/1097/157/38/71/103/652/,FF5D50,,,f,726,2251532786,734881840,Paraventricular hypothalamic nucleus magnocellular division posterior magnocellular part lateral zone +660,789,"Paraventricular hypothalamic nucleus, magnocellular division, posterior magnocellular part, medial zone",PVHpmm,11,1,3,8690,103,9,1,726,/997/8/343/1129/1097/157/38/71/103/660/,FF5D50,,,f,727,2602842182,734881840,Paraventricular hypothalamic nucleus magnocellular division posterior magnocellular part medial zone +94,294,"Paraventricular hypothalamic nucleus, parvicellular division",PVHp,9,1,3,8690,38,7,1,727,/997/8/343/1129/1097/157/38/94/,FF5D50,,,f,728,2057162096,734881840,Paraventricular hypothalamic nucleus parvicellular division +55,289,"Paraventricular hypothalamic nucleus, parvicellular division, anterior parvicellular part",PVHap,10,1,3,8690,94,8,1,728,/997/8/343/1129/1097/157/38/94/55/,FF5D50,,,f,729,1148389696,734881840,Paraventricular hypothalamic nucleus parvicellular division anterior parvicellular part +87,293,"Paraventricular hypothalamic nucleus, parvicellular division, medial parvicellular part, dorsal zone",PVHmpd,10,1,3,8690,94,8,1,729,/997/8/343/1129/1097/157/38/94/87/,FF5D50,,,f,730,4123394571,734881840,Paraventricular hypothalamic nucleus parvicellular division medial parvicellular part dorsal zone +110,296,"Paraventricular hypothalamic nucleus, parvicellular division, periventricular part",PVHpv,10,1,3,8690,94,8,1,730,/997/8/343/1129/1097/157/38/94/110/,FF5D50,,,f,731,3511387045,734881840,Paraventricular hypothalamic nucleus parvicellular division periventricular part +30,286,"Periventricular hypothalamic nucleus, anterior part",PVa,9,1,3,8690,157,6,1,731,/997/8/343/1129/1097/157/30/,FF5D50,,,f,732,4028794868,734881840,Periventricular hypothalamic nucleus anterior part +118,297,"Periventricular hypothalamic nucleus, intermediate part",PVi,9,1,3,8690,157,6,1,732,/997/8/343/1129/1097/157/118/,FF5D50,,,f,733,3086088557,734881840,Periventricular hypothalamic nucleus intermediate part +223,27,Arcuate hypothalamic nucleus,ARH,8,1,3,8690,157,6,1,733,/997/8/343/1129/1097/157/223/,FF5D50,,,f,734,218062747,734881840,Arcuate hypothalamic nucleus +141,300,Periventricular region,PVR,6,1,3,8690,1097,5,1,734,/997/8/343/1129/1097/141/,FF5547,,,f,735,227550009,734881840,Periventricular region +72,8,Anterodorsal preoptic nucleus,ADP,8,1,3,8690,141,6,1,735,/997/8/343/1129/1097/141/72/,FF5547,,,f,736,1069999127,734881840,Anterodorsal preoptic nucleus +80,9,Anterior hypothalamic area,AHA,8,1,3,8690,141,6,1,736,/997/8/343/1129/1097/141/80/,FF5547,,,f,737,1854528966,734881840,Anterior hypothalamic area +263,32,Anteroventral preoptic nucleus,AVP,8,1,3,8690,141,6,1,737,/997/8/343/1129/1097/141/263/,FF5547,,,f,738,3572986309,734881840,Anteroventral preoptic nucleus +272,33,Anteroventral periventricular nucleus,AVPV,8,1,3,8690,141,6,1,738,/997/8/343/1129/1097/141/272/,FF5547,,,f,739,1695582307,734881840,Anteroventral periventricular nucleus +830,103,Dorsomedial nucleus of the hypothalamus,DMH,8,1,3,8690,141,6,1,739,/997/8/343/1129/1097/141/830/,FF5547,,,f,740,761673421,734881840,Dorsomedial nucleus of the hypothalamus +668,790,"Dorsomedial nucleus of the hypothalamus, anterior part",DMHa,9,1,3,8690,830,7,1,740,/997/8/343/1129/1097/141/830/668/,FF5547,,,f,741,2890416846,734881840,Dorsomedial nucleus of the hypothalamus anterior part +676,791,"Dorsomedial nucleus of the hypothalamus, posterior part",DMHp,9,1,3,8690,830,7,1,741,/997/8/343/1129/1097/141/830/676/,FF5547,,,f,742,916084112,734881840,Dorsomedial nucleus of the hypothalamus posterior part +684,792,"Dorsomedial nucleus of the hypothalamus, ventral part",DMHv,9,1,3,8690,830,7,1,742,/997/8/343/1129/1097/141/830/684/,FF5547,,,f,743,2190129277,734881840,Dorsomedial nucleus of the hypothalamus ventral part +452,197,Median preoptic nucleus,MEPO,8,1,3,8690,141,6,1,743,/997/8/343/1129/1097/141/452/,FF5547,,,f,744,1579277564,734881840,Median preoptic nucleus +523,206,Medial preoptic area,MPO,8,1,3,8690,141,6,1,744,/997/8/343/1129/1097/141/523/,FF5547,,,f,745,1992330649,734881840,Medial preoptic area +763,236,Vascular organ of the lamina terminalis,OV,8,1,3,8690,141,6,1,745,/997/8/343/1129/1097/141/763/,FF5547,,,f,746,3273533441,734881840,Vascular organ of the lamina terminalis +914,255,Posterodorsal preoptic nucleus,PD,8,1,3,8690,141,6,1,746,/997/8/343/1129/1097/141/914/,FF5547,,,f,747,2759126254,734881840,Posterodorsal preoptic nucleus +1109,279,Parastrial nucleus,PS,8,1,3,8690,141,6,1,747,/997/8/343/1129/1097/141/1109/,FF5547,,,f,748,747009513,734881840,Parastrial nucleus +1124,281,Suprachiasmatic preoptic nucleus,PSCH,8,1,3,8690,141,6,1,748,/997/8/343/1129/1097/141/1124/,FF5547,,,f,749,1784798415,734881840,Suprachiasmatic preoptic nucleus +126,298,"Periventricular hypothalamic nucleus, posterior part",PVp,8,1,3,8690,141,6,1,749,/997/8/343/1129/1097/141/126/,FF5547,,,f,750,4039829223,734881840,Periventricular hypothalamic nucleus posterior part +133,299,"Periventricular hypothalamic nucleus, preoptic part",PVpo,8,1,3,8690,141,6,1,750,/997/8/343/1129/1097/141/133/,FF5547,,,f,751,2330540908,734881840,Periventricular hypothalamic nucleus preoptic part +347,467,Subparaventricular zone,SBPV,8,1,3,8690,141,6,1,751,/997/8/343/1129/1097/141/347/,FF5547,,,f,752,1671743599,734881840,Subparaventricular zone +286,318,Suprachiasmatic nucleus,SCH,8,1,3,8690,141,6,1,752,/997/8/343/1129/1097/141/286/,FF5547,,,f,753,3746645074,734881840,Suprachiasmatic nucleus +338,466,Subfornical organ,SFO,8,1,3,8690,141,6,1,753,/997/8/343/1129/1097/141/338/,FF5547,,,f,754,1450047394,734881840,Subfornical organ +576073699,,Ventromedial preoptic nucleus,VMPO,8,1,3,8690,141,6,1,754,/997/8/343/1129/1097/141/576073699/,FF5547,,,f,755,1315660689,734881840,Ventromedial preoptic nucleus +689,793,Ventrolateral preoptic nucleus,VLPO,8,1,3,8690,141,6,1,755,/997/8/343/1129/1097/141/689/,FF5547,,,f,756,2706711435,734881840,Ventrolateral preoptic nucleus +467,199,Hypothalamic medial zone,MEZ,6,1,3,8690,1097,5,1,756,/997/8/343/1129/1097/467/,FF4C3E,,,f,757,3546131949,734881840,Hypothalamic medial zone +88,10,Anterior hypothalamic nucleus,AHN,8,1,3,8690,467,6,1,757,/997/8/343/1129/1097/467/88/,FF4C3E,,,f,758,2309913226,734881840,Anterior hypothalamic nucleus +700,794,"Anterior hypothalamic nucleus, anterior part",AHNa,9,1,3,8690,88,7,1,758,/997/8/343/1129/1097/467/88/700/,FF4C3E,,,f,759,3087487115,734881840,Anterior hypothalamic nucleus anterior part +708,795,"Anterior hypothalamic nucleus, central part",AHNc,9,1,3,8690,88,7,1,759,/997/8/343/1129/1097/467/88/708/,FF4C3E,,,f,760,1484728461,734881840,Anterior hypothalamic nucleus central part +716,796,"Anterior hypothalamic nucleus, dorsal part",AHNd,9,1,3,8690,88,7,1,760,/997/8/343/1129/1097/467/88/716/,FF4C3E,,,f,761,1340658654,734881840,Anterior hypothalamic nucleus dorsal part +724,797,"Anterior hypothalamic nucleus, posterior part",AHNp,9,1,3,8690,88,7,1,761,/997/8/343/1129/1097/467/88/724/,FF4C3E,,,f,762,809021341,734881840,Anterior hypothalamic nucleus posterior part +331,182,Mammillary body,MBO,7,1,3,8690,467,6,1,762,/997/8/343/1129/1097/467/331/,FF4C3E,,,f,763,628444024,734881840,Mammillary body +210,167,Lateral mammillary nucleus,LM,8,1,3,8690,331,7,1,763,/997/8/343/1129/1097/467/331/210/,FF4C3E,,,f,764,3256479391,734881840,Lateral mammillary nucleus +491,202,Medial mammillary nucleus,MM,8,1,3,8690,331,7,1,764,/997/8/343/1129/1097/467/331/491/,FF4C3E,,,f,765,338961468,734881840,Medial mammillary nucleus +732,798,"Medial mammillary nucleus, median part",MMme,9,1,3,8690,491,8,1,765,/997/8/343/1129/1097/467/331/491/732/,FF4C3E,,,f,766,10911214,734881840,Medial mammillary nucleus median part +606826647,,"Medial mammillary nucleus, lateral part",MMl,9,1,3,8690,491,8,1,766,/997/8/343/1129/1097/467/331/491/606826647/,FF4C3E,,,f,767,3428103955,734881840,Medial mammillary nucleus lateral part +606826651,,"Medial mammillary nucleus, medial part",MMm,9,1,3,8690,491,8,1,767,/997/8/343/1129/1097/467/331/491/606826651/,FF4C3E,,,f,768,1299111141,734881840,Medial mammillary nucleus medial part +606826655,,"Medial mammillary nucleus, posterior part",MMp,9,1,3,8690,491,8,1,768,/997/8/343/1129/1097/467/331/491/606826655/,FF4C3E,,,f,769,2687554049,734881840,Medial mammillary nucleus posterior part +606826659,,"Medial mammillary nucleus, dorsal part",MMd,9,1,3,8690,491,8,1,769,/997/8/343/1129/1097/467/331/491/606826659/,FF4C3E,,,f,770,329278641,734881840,Medial mammillary nucleus dorsal part +525,348,Supramammillary nucleus,SUM,8,1,3,8690,331,7,1,770,/997/8/343/1129/1097/467/331/525/,FF4C3E,,,f,771,4172534656,734881840,Supramammillary nucleus +1110,421,"Supramammillary nucleus, lateral part",SUMl,9,1,3,8690,525,8,1,771,/997/8/343/1129/1097/467/331/525/1110/,FF4C3E,,,f,772,3001814184,734881840,Supramammillary nucleus lateral part +1118,422,"Supramammillary nucleus, medial part",SUMm,9,1,3,8690,525,8,1,772,/997/8/343/1129/1097/467/331/525/1118/,FF4C3E,,,f,773,1151982312,734881840,Supramammillary nucleus medial part +557,352,Tuberomammillary nucleus,TM,8,1,3,8690,331,7,1,773,/997/8/343/1129/1097/467/331/557/,FF4C3E,,,f,774,1759031183,734881840,Tuberomammillary nucleus +1126,423,"Tuberomammillary nucleus, dorsal part",TMd,9,1,3,8690,557,8,1,774,/997/8/343/1129/1097/467/331/557/1126/,FF4C3E,,,f,775,2136571968,734881840,Tuberomammillary nucleus dorsal part +1,424,"Tuberomammillary nucleus, ventral part",TMv,9,1,3,8690,557,8,1,775,/997/8/343/1129/1097/467/331/557/1/,FF4C3E,,,f,776,3678649713,734881840,Tuberomammillary nucleus ventral part +515,205,Medial preoptic nucleus,MPN,8,1,3,8690,467,6,1,776,/997/8/343/1129/1097/467/515/,FF4C3E,,,f,777,1542829951,734881840,Medial preoptic nucleus +740,799,"Medial preoptic nucleus, central part",MPNc,9,1,3,8690,515,7,1,777,/997/8/343/1129/1097/467/515/740/,FF4C3E,,,f,778,2445156071,734881840,Medial preoptic nucleus central part +748,800,"Medial preoptic nucleus, lateral part",MPNl,9,1,3,8690,515,7,1,778,/997/8/343/1129/1097/467/515/748/,FF4C3E,,,f,779,3636770055,734881840,Medial preoptic nucleus lateral part +756,801,"Medial preoptic nucleus, medial part",MPNm,9,1,3,8690,515,7,1,779,/997/8/343/1129/1097/467/515/756/,FF4C3E,,,f,780,3694168057,734881840,Medial preoptic nucleus medial part +980,263,Dorsal premammillary nucleus,PMd,8,1,3,8690,467,6,1,780,/997/8/343/1129/1097/467/980/,FF4C3E,,,f,781,282623527,734881840,Dorsal premammillary nucleus +1004,266,Ventral premammillary nucleus,PMv,8,1,3,8690,467,6,1,781,/997/8/343/1129/1097/467/1004/,FF4C3E,,,f,782,959948768,734881840,Ventral premammillary nucleus +63,290,"Paraventricular hypothalamic nucleus, descending division",PVHd,8,1,3,8690,467,6,1,782,/997/8/343/1129/1097/467/63/,FF4C3E,,,f,783,3500188330,734881840,Paraventricular hypothalamic nucleus descending division +439,903,"Paraventricular hypothalamic nucleus, descending division, dorsal parvicellular part",PVHdp,9,1,3,8690,63,7,1,783,/997/8/343/1129/1097/467/63/439/,FF4C3E,,,f,784,1456917687,734881840,Paraventricular hypothalamic nucleus descending division dorsal parvicellular part +447,904,"Paraventricular hypothalamic nucleus, descending division, forniceal part",PVHf,9,1,3,8690,63,7,1,784,/997/8/343/1129/1097/467/63/447/,FF4C3E,,,f,785,2729434072,734881840,Paraventricular hypothalamic nucleus descending division forniceal part +455,905,"Paraventricular hypothalamic nucleus, descending division, lateral parvicellular part",PVHlp,9,1,3,8690,63,7,1,785,/997/8/343/1129/1097/467/63/455/,FF4C3E,,,f,786,2133121895,734881840,Paraventricular hypothalamic nucleus descending division lateral parvicellular part +464,906,"Paraventricular hypothalamic nucleus, descending division, medial parvicellular part, ventral zone",PVHmpv,9,1,3,8690,63,7,1,786,/997/8/343/1129/1097/467/63/464/,FF4C3E,,,f,787,3253784525,734881840,Paraventricular hypothalamic nucleus descending division medial parvicellular part ventral zone +693,369,Ventromedial hypothalamic nucleus,VMH,8,1,3,8690,467,6,1,787,/997/8/343/1129/1097/467/693/,FF4C3E,,,f,788,313760851,734881840,Ventromedial hypothalamic nucleus +761,802,"Ventromedial hypothalamic nucleus, anterior part",VMHa,9,1,3,8690,693,7,1,788,/997/8/343/1129/1097/467/693/761/,FF4C3E,,,f,789,3570676002,734881840,Ventromedial hypothalamic nucleus anterior part +769,803,"Ventromedial hypothalamic nucleus, central part",VMHc,9,1,3,8690,693,7,1,789,/997/8/343/1129/1097/467/693/769/,FF4C3E,,,f,790,2374724825,734881840,Ventromedial hypothalamic nucleus central part +777,804,"Ventromedial hypothalamic nucleus, dorsomedial part",VMHdm,9,1,3,8690,693,7,1,790,/997/8/343/1129/1097/467/693/777/,FF4C3E,,,f,791,3277783810,734881840,Ventromedial hypothalamic nucleus dorsomedial part +785,805,"Ventromedial hypothalamic nucleus, ventrolateral part",VMHvl,9,1,3,8690,693,7,1,791,/997/8/343/1129/1097/467/693/785/,FF4C3E,,,f,792,2610967905,734881840,Ventromedial hypothalamic nucleus ventrolateral part +946,259,Posterior hypothalamic nucleus,PH,8,1,3,8690,467,6,1,792,/997/8/343/1129/1097/467/946/,FF4C3E,,,f,793,303854195,734881840,Posterior hypothalamic nucleus +290,177,Hypothalamic lateral zone,LZ,6,1,3,8690,1097,5,1,793,/997/8/343/1129/1097/290/,F2483B,,,f,794,3347032583,734881840,Hypothalamic lateral zone +194,165,Lateral hypothalamic area,LHA,8,1,3,8690,290,6,1,794,/997/8/343/1129/1097/290/194/,F2483B,,,f,795,1636673296,734881840,Lateral hypothalamic area +226,169,Lateral preoptic area,LPO,8,1,3,8690,290,6,1,795,/997/8/343/1129/1097/290/226/,F2483B,,,f,796,3138944663,734881840,Lateral preoptic area +356,468,Preparasubthalamic nucleus,PST,8,1,3,8690,290,6,1,796,/997/8/343/1129/1097/290/356/,F2483B,,,f,797,3604508725,734881840,Preparasubthalamic nucleus +364,469,Parasubthalamic nucleus,PSTN,8,1,3,8690,290,6,1,797,/997/8/343/1129/1097/290/364/,F2483B,,,f,798,2493706529,734881840,Parasubthalamic nucleus +576073704,,Perifornical nucleus,PeF,8,1,3,8690,290,6,1,798,/997/8/343/1129/1097/290/576073704/,F2483B,,,f,799,702937889,734881840,Perifornical nucleus +173,304,Retrochiasmatic area,RCH,8,1,3,8690,290,6,1,799,/997/8/343/1129/1097/290/173/,F2483B,,,f,800,3507634346,734881840,Retrochiasmatic area +470,341,Subthalamic nucleus,STN,8,1,3,8690,290,6,1,800,/997/8/343/1129/1097/290/470/,F2483B,,,f,801,3450179653,734881840,Subthalamic nucleus +614,359,Tuberal nucleus,TU,8,1,3,8690,290,6,1,801,/997/8/343/1129/1097/290/614/,F2483B,,,f,802,1119024411,734881840,Tuberal nucleus +797,382,Zona incerta,ZI,8,1,3,8690,290,6,1,802,/997/8/343/1129/1097/290/797/,F2483B,,,f,803,3420252476,734881840,Zona incerta +796,806,Dopaminergic A13 group,A13,9,1,3,8690,797,7,1,803,/997/8/343/1129/1097/290/797/796/,F2483B,,,f,804,4064653384,734881840,Dopaminergic A13 group +804,807,Fields of Forel,FF,9,1,3,8690,797,7,1,804,/997/8/343/1129/1097/290/797/804/,F2483B,,,f,805,89343914,734881840,Fields of Forel +10671,,Median eminence,ME,8,1,3,8690,1097,5,1,805,/997/8/343/1129/1097/10671/,F2483B,,,f,806,138849015,734881840,Median eminence +313,180,Midbrain,MB,5,1,3,8690,343,3,1,806,/997/8/343/313/,FF64FF,,,f,807,789921203,734881840,Midbrain +339,183,"Midbrain, sensory related",MBsen,6,1,3,8690,313,4,1,807,/997/8/343/313/339/,FF7AFF,,,f,808,3898370247,734881840,Midbrain sensory related +302,320,"Superior colliculus, sensory related",SCs,8,1,3,8690,339,5,1,808,/997/8/343/313/339/302/,FF7AFF,,,f,809,3203592176,734881840,Superior colliculus sensory related +851,813,"Superior colliculus, optic layer",SCop,9,1,3,8690,302,6,1,809,/997/8/343/313/339/302/851/,FF7AFF,,,f,810,1400323525,734881840,Superior colliculus optic layer +842,812,"Superior colliculus, superficial gray layer",SCsg,9,1,3,8690,302,6,1,810,/997/8/343/313/339/302/842/,FF7AFF,,,f,811,2271559886,734881840,Superior colliculus superficial gray layer +834,811,"Superior colliculus, zonal layer",SCzo,9,1,3,8690,302,6,1,811,/997/8/343/313/339/302/834/,FF7AFF,,,f,812,1177562266,734881840,Superior colliculus zonal layer +4,141,Inferior colliculus,IC,8,1,3,8690,339,5,1,812,/997/8/343/313/339/4/,FF7AFF,,,f,813,3456805092,734881840,Inferior colliculus +811,808,"Inferior colliculus, central nucleus",ICc,9,1,3,8690,4,6,1,813,/997/8/343/313/339/4/811/,FF7AFF,,,f,814,3750101210,734881840,Inferior colliculus central nucleus +820,809,"Inferior colliculus, dorsal nucleus",ICd,9,1,3,8690,4,6,1,814,/997/8/343/313/339/4/820/,FF7AFF,,,f,815,3008108572,734881840,Inferior colliculus dorsal nucleus +828,810,"Inferior colliculus, external nucleus",ICe,9,1,3,8690,4,6,1,815,/997/8/343/313/339/4/828/,FF7AFF,,,f,816,754697579,734881840,Inferior colliculus external nucleus +580,213,Nucleus of the brachium of the inferior colliculus,NB,8,1,3,8690,339,5,1,816,/997/8/343/313/339/580/,FF7AFF,,,f,817,3573918372,734881840,Nucleus of the brachium of the inferior colliculus +271,316,Nucleus sagulum,SAG,8,1,3,8690,339,5,1,817,/997/8/343/313/339/271/,FF7AFF,,,f,818,1209044118,734881840,Nucleus sagulum +874,250,Parabigeminal nucleus,PBG,8,1,3,8690,339,5,1,818,/997/8/343/313/339/874/,FF7AFF,,,f,819,1543308203,734881840,Parabigeminal nucleus +460,198,Midbrain trigeminal nucleus,MEV,8,1,3,8690,339,5,1,819,/997/8/343/313/339/460/,FF7AFF,,,f,820,881115082,734881840,Midbrain trigeminal nucleus +599626923,,Subcommissural organ,SCO,8,1,3,8690,339,5,1,820,/997/8/343/313/339/599626923/,FF7AFF,,,f,821,2789650011,734881840,Subcommissural organ +323,181,"Midbrain, motor related",MBmot,6,1,3,8690,313,4,1,821,/997/8/343/313/323/,FF90FF,,,f,822,780661248,734881840,Midbrain motor related +381,330,"Substantia nigra, reticular part",SNr,8,1,3,8690,323,5,1,822,/997/8/343/313/323/381/,FF90FF,,,f,823,1375238552,734881840,Substantia nigra reticular part +749,376,Ventral tegmental area,VTA,8,1,3,8690,323,5,1,823,/997/8/343/313/323/749/,FF90FF,,,f,824,393100752,734881840,Ventral tegmental area +607344830,,Paranigral nucleus,PN,8,1,3,8690,323,5,1,824,/997/8/343/313/323/607344830/,FF90FF,,,f,825,394864153,734881840,Paranigral nucleus +246,313,"Midbrain reticular nucleus, retrorubral area",RR,8,1,3,8690,323,5,1,825,/997/8/343/313/323/246/,FF90FF,,,f,826,2206996677,734881840,Midbrain reticular nucleus retrorubral area +128,864,Midbrain reticular nucleus,MRN,8,1,3,8690,323,5,1,826,/997/8/343/313/323/128/,FF90FF,,,f,827,2371196921,734881840,Midbrain reticular nucleus +539,208,"Midbrain reticular nucleus, magnocellular part",MRNm,9,1,3,8690,128,6,1,827,/997/8/343/313/323/128/539/,FF90FF,,,f,828,1986775418,734881840,Midbrain reticular nucleus magnocellular part +548,209,"Midbrain reticular nucleus, magnocellular part, general",MRNmg,9,1,3,8690,128,6,1,828,/997/8/343/313/323/128/548/,FF90FF,,,f,829,3215321597,734881840,Midbrain reticular nucleus magnocellular part general +555,210,"Midbrain reticular nucleus, parvicellular part",MRNp,9,1,3,8690,128,6,1,829,/997/8/343/313/323/128/555/,FF90FF,,,f,830,1144299903,734881840,Midbrain reticular nucleus parvicellular part +294,319,"Superior colliculus, motor related",SCm,8,1,3,8690,323,5,1,830,/997/8/343/313/323/294/,FF90FF,,,f,831,3666060048,734881840,Superior colliculus motor related +26,427,"Superior colliculus, motor related, deep gray layer",SCdg,9,1,3,8690,294,6,1,831,/997/8/343/313/323/294/26/,FF90FF,,,f,832,2056102031,734881840,Superior colliculus motor related deep gray layer +42,429,"Superior colliculus, motor related, deep white layer",SCdw,9,1,3,8690,294,6,1,832,/997/8/343/313/323/294/42/,FF90FF,,,f,833,3170401061,734881840,Superior colliculus motor related deep white layer +17,426,"Superior colliculus, motor related, intermediate white layer",SCiw,9,1,3,8690,294,6,1,833,/997/8/343/313/323/294/17/,FF90FF,,,f,834,2563539216,734881840,Superior colliculus motor related intermediate white layer +10,425,"Superior colliculus, motor related, intermediate gray layer",SCig,9,1,3,8690,294,6,1,834,/997/8/343/313/323/294/10/,FF90FF,,,f,835,4208210812,734881840,Superior colliculus motor related intermediate gray layer +494,910,"Superior colliculus, motor related, intermediate gray layer, sublayer a",SCig-a,10,1,3,8690,10,7,1,835,/997/8/343/313/323/294/10/494/,FF90FF,,,f,836,132347639,734881840,Superior colliculus motor related intermediate gray layer sublayer a +503,911,"Superior colliculus, motor related, intermediate gray layer, sublayer b",SCig-b,10,1,3,8690,10,7,1,836,/997/8/343/313/323/294/10/503/,FF90FF,,,f,837,2666145613,734881840,Superior colliculus motor related intermediate gray layer sublayer b +511,912,"Superior colliculus, motor related, intermediate gray layer, sublayer c",SCig-c,10,1,3,8690,10,7,1,837,/997/8/343/313/323/294/10/511/,FF90FF,,,f,838,3924629467,734881840,Superior colliculus motor related intermediate gray layer sublayer c +795,240,Periaqueductal gray,PAG,8,1,3,8690,323,5,1,838,/997/8/343/313/323/795/,FF90FF,,,f,839,3260726339,734881840,Periaqueductal gray +50,430,Precommissural nucleus,PRC,9,1,3,8690,795,6,1,839,/997/8/343/313/323/795/50/,FF90FF,,,f,840,3014276231,734881840,Precommissural nucleus +67,149,Interstitial nucleus of Cajal,INC,9,1,3,8690,795,6,1,840,/997/8/343/313/323/795/67/,FF90FF,,,f,841,4183673030,734881840,Interstitial nucleus of Cajal +587,214,Nucleus of Darkschewitsch,ND,9,1,3,8690,795,6,1,841,/997/8/343/313/323/795/587/,FF90FF,,,f,842,4174754247,734881840,Nucleus of Darkschewitsch +614454277,,Supraoculomotor periaqueductal gray,Su3,9,1,3,8690,795,6,1,842,/997/8/343/313/323/795/614454277/,FF90FF,,,f,843,349636566,734881840,Supraoculomotor periaqueductal gray +1100,278,Pretectal region,PRT,8,1,3,8690,323,5,1,843,/997/8/343/313/323/1100/,FF90FF,,,f,844,3274676419,734881840,Pretectal region +215,26,Anterior pretectal nucleus,APN,9,1,3,8690,1100,6,1,844,/997/8/343/313/323/1100/215/,FF90FF,,,f,845,3086286206,734881840,Anterior pretectal nucleus +531,207,Medial pretectal area,MPT,9,1,3,8690,1100,6,1,845,/997/8/343/313/323/1100/531/,FF90FF,,,f,846,3076683016,734881840,Medial pretectal area +628,219,Nucleus of the optic tract,NOT,9,1,3,8690,1100,6,1,846,/997/8/343/313/323/1100/628/,FF90FF,,,f,847,4240602259,734881840,Nucleus of the optic tract +634,220,Nucleus of the posterior commissure,NPC,9,1,3,8690,1100,6,1,847,/997/8/343/313/323/1100/634/,FF90FF,,,f,848,848474446,734881840,Nucleus of the posterior commissure +706,229,Olivary pretectal nucleus,OP,9,1,3,8690,1100,6,1,848,/997/8/343/313/323/1100/706/,FF90FF,,,f,849,4010106689,734881840,Olivary pretectal nucleus +1061,273,Posterior pretectal nucleus,PPT,9,1,3,8690,1100,6,1,849,/997/8/343/313/323/1100/1061/,FF90FF,,,f,850,834486063,734881840,Posterior pretectal nucleus +549009203,,Retroparafascicular nucleus,RPF,9,1,3,8690,1100,6,1,850,/997/8/343/313/323/1100/549009203/,FF90FF,,,f,851,2559458743,734881840,Retroparafascicular nucleus +549009207,,Intercollicular nucleus,InCo,8,1,3,8690,323,5,1,851,/997/8/343/313/323/549009207/,FF90FF,,,f,852,3796827043,734881840,Intercollicular nucleus +616,76,Cuneiform nucleus,CUN,8,1,3,8690,323,5,1,852,/997/8/343/313/323/616/,FF90FF,,,f,853,346062242,734881840,Cuneiform nucleus +214,309,Red nucleus,RN,8,1,3,8690,323,5,1,853,/997/8/343/313/323/214/,FF90FF,,,f,854,2118050513,734881840,Red nucleus +35,145,Oculomotor nucleus,III,8,1,3,8690,323,5,1,854,/997/8/343/313/323/35/,FF90FF,,,f,855,3545914074,734881840,Oculomotor nucleus +549009211,,Medial accesory oculomotor nucleus,MA3,8,1,3,8690,323,5,1,855,/997/8/343/313/323/549009211/,FF90FF,,,f,856,842672202,734881840,Medial accesory oculomotor nucleus +975,121,Edinger-Westphal nucleus,EW,8,1,3,8690,323,5,1,856,/997/8/343/313/323/975/,FF90FF,,,f,857,3165212518,734881840,Edinger-Westphal nucleus +115,155,Trochlear nucleus,IV,8,1,3,8690,323,5,1,857,/997/8/343/313/323/115/,FF90FF,,,f,858,4115476116,734881840,Trochlear nucleus +606826663,,Paratrochlear nucleus,Pa4,8,1,3,8690,323,5,1,858,/997/8/343/313/323/606826663/,FF90FF,,,f,859,2726323560,734881840,Paratrochlear nucleus +757,377,Ventral tegmental nucleus,VTN,8,1,3,8690,323,5,1,859,/997/8/343/313/323/757/,FF90FF,,,f,860,4044693766,734881840,Ventral tegmental nucleus +231,28,Anterior tegmental nucleus,AT,8,1,3,8690,323,5,1,860,/997/8/343/313/323/231/,FF90FF,,,f,861,569339657,734881840,Anterior tegmental nucleus +66,432,Lateral terminal nucleus of the accessory optic tract,LT,8,1,3,8690,323,5,1,861,/997/8/343/313/323/66/,FF90FF,,,f,862,1984958584,734881840,Lateral terminal nucleus of the accessory optic tract +75,433,Dorsal terminal nucleus of the accessory optic tract,DT,8,1,3,8690,323,5,1,862,/997/8/343/313/323/75/,FF90FF,,,f,863,313632257,734881840,Dorsal terminal nucleus of the accessory optic tract +58,431,Medial terminal nucleus of the accessory optic tract,MT,8,1,3,8690,323,5,1,863,/997/8/343/313/323/58/,FF90FF,,,f,864,1464326049,734881840,Medial terminal nucleus of the accessory optic tract +615,925,"Substantia nigra, lateral part",SNl,8,1,3,8690,323,5,1,864,/997/8/343/313/323/615/,FF90FF,,,f,865,3021759709,734881840,Substantia nigra lateral part +348,184,"Midbrain, behavioral state related",MBsta,6,1,3,8690,313,4,1,865,/997/8/343/313/348/,FF90FF,,,f,866,2552492373,734881840,Midbrain behavioral state related +374,329,"Substantia nigra, compact part",SNc,8,1,3,8690,348,5,1,866,/997/8/343/313/348/374/,FFA6FF,,,f,867,591190689,734881840,Substantia nigra compact part +1052,272,Pedunculopontine nucleus,PPN,8,1,3,8690,348,5,1,867,/997/8/343/313/348/1052/,FFA6FF,,,f,868,2704258246,734881840,Pedunculopontine nucleus +165,303,Midbrain raphe nuclei,RAmb,7,1,3,8690,348,5,1,868,/997/8/343/313/348/165/,FFA6FF,,,f,869,364635241,734881840,Midbrain raphe nuclei +12,142,Interfascicular nucleus raphe,IF,8,1,3,8690,165,6,1,869,/997/8/343/313/348/165/12/,FFA6FF,,,f,870,1057138099,734881840,Interfascicular nucleus raphe +100,153,Interpeduncular nucleus,IPN,8,1,3,8690,165,6,1,870,/997/8/343/313/348/165/100/,FFA6FF,,,f,871,814290991,734881840,Interpeduncular nucleus +607344834,,"Interpeduncular nucleus, rostral",IPR,9,1,3,8690,100,7,1,871,/997/8/343/313/348/165/100/607344834/,FFA6FF,,,f,872,3342923784,734881840,Interpeduncular nucleus rostral +607344838,,"Interpeduncular nucleus, caudal",IPC,9,1,3,8690,100,7,1,872,/997/8/343/313/348/165/100/607344838/,FFA6FF,,,f,873,3381879533,734881840,Interpeduncular nucleus caudal +607344842,,"Interpeduncular nucleus, apical",IPA,9,1,3,8690,100,7,1,873,/997/8/343/313/348/165/100/607344842/,FFA6FF,,,f,874,3327886198,734881840,Interpeduncular nucleus apical +607344846,,"Interpeduncular nucleus, lateral",IPL,9,1,3,8690,100,7,1,874,/997/8/343/313/348/165/100/607344846/,FFA6FF,,,f,875,2418971137,734881840,Interpeduncular nucleus lateral +607344850,,"Interpeduncular nucleus, intermediate",IPI,9,1,3,8690,100,7,1,875,/997/8/343/313/348/165/100/607344850/,FFA6FF,,,f,876,1366249262,734881840,Interpeduncular nucleus intermediate +607344854,,"Interpeduncular nucleus, dorsomedial",IPDM,9,1,3,8690,100,7,1,876,/997/8/343/313/348/165/100/607344854/,FFA6FF,,,f,877,1188587061,734881840,Interpeduncular nucleus dorsomedial +607344858,,"Interpeduncular nucleus, dorsolateral",IPDL,9,1,3,8690,100,7,1,877,/997/8/343/313/348/165/100/607344858/,FFA6FF,,,f,878,2095963207,734881840,Interpeduncular nucleus dorsolateral +607344862,,"Interpeduncular nucleus, rostrolateral",IPRL,9,1,3,8690,100,7,1,878,/997/8/343/313/348/165/100/607344862/,FFA6FF,,,f,879,2470356210,734881840,Interpeduncular nucleus rostrolateral +197,307,Rostral linear nucleus raphe,RL,8,1,3,8690,165,6,1,879,/997/8/343/313/348/165/197/,FFA6FF,,,f,880,4030987523,734881840,Rostral linear nucleus raphe +591,73,Central linear nucleus raphe,CLI,8,1,3,8690,165,6,1,880,/997/8/343/313/348/165/591/,FFA6FF,,,f,881,3351344971,734881840,Central linear nucleus raphe +872,108,Dorsal nucleus raphe,DR,8,1,3,8690,165,6,1,881,/997/8/343/313/348/165/872/,FFA6FF,,,f,882,1547411830,734881840,Dorsal nucleus raphe +1065,132,Hindbrain,HB,3,1,3,8690,343,3,1,882,/997/8/343/1065/,FF9B88,,,f,883,1911489865,734881840,Hindbrain +771,237,Pons,P,5,1,3,8690,1065,4,1,883,/997/8/343/1065/771/,FF9B88,,,f,884,2612017676,734881840,Pons +1132,282,"Pons, sensory related",P-sen,6,1,3,8690,771,5,1,884,/997/8/343/1065/771/1132/,FFAE6F,,,f,885,4249678601,734881840,Pons sensory related +612,217,Nucleus of the lateral lemniscus,NLL,8,1,3,8690,1132,6,1,885,/997/8/343/1065/771/1132/612/,FFAE6F,,,f,886,3619563008,734881840,Nucleus of the lateral lemniscus +82,434,"Nucleus of the lateral lemniscus, dorsal part",NLLd,9,1,3,8690,612,7,1,886,/997/8/343/1065/771/1132/612/82/,FFAE6F,,,f,887,713162928,734881840,Nucleus of the lateral lemniscus dorsal part +90,435,"Nucleus of the lateral lemniscus, horizontal part",NLLh,9,1,3,8690,612,7,1,887,/997/8/343/1065/771/1132/612/90/,FFAE6F,,,f,888,622626105,734881840,Nucleus of the lateral lemniscus horizontal part +99,436,"Nucleus of the lateral lemniscus, ventral part",NLLv,9,1,3,8690,612,7,1,888,/997/8/343/1065/771/1132/612/99/,FFAE6F,,,f,889,1722520813,734881840,Nucleus of the lateral lemniscus ventral part +7,283,Principal sensory nucleus of the trigeminal,PSV,8,1,3,8690,1132,6,1,889,/997/8/343/1065/771/1132/7/,FFAE6F,,,f,890,977401861,734881840,Principal sensory nucleus of the trigeminal +867,249,Parabrachial nucleus,PB,8,1,3,8690,1132,6,1,890,/997/8/343/1065/771/1132/867/,FFAE6F,,,f,891,1848997307,734881840,Parabrachial nucleus +123,156,Koelliker-Fuse subnucleus,KF,9,1,3,8690,867,7,1,891,/997/8/343/1065/771/1132/867/123/,FFAE6F,,,f,892,3695440306,734881840,Koelliker-Fuse subnucleus +881,251,"Parabrachial nucleus, lateral division",PBl,9,1,3,8690,867,7,1,892,/997/8/343/1065/771/1132/867/881/,FFAE6F,,,f,893,745283882,734881840,Parabrachial nucleus lateral division +860,814,"Parabrachial nucleus, lateral division, central lateral part",PBlc,10,1,3,8690,881,8,1,893,/997/8/343/1065/771/1132/867/881/860/,FFAE6F,,,f,894,4289412643,734881840,Parabrachial nucleus lateral division central lateral part +868,815,"Parabrachial nucleus, lateral division, dorsal lateral part",PBld,10,1,3,8690,881,8,1,894,/997/8/343/1065/771/1132/867/881/868/,FFAE6F,,,f,895,2459326582,734881840,Parabrachial nucleus lateral division dorsal lateral part +875,816,"Parabrachial nucleus, lateral division, external lateral part",PBle,10,1,3,8690,881,8,1,895,/997/8/343/1065/771/1132/867/881/875/,FFAE6F,,,f,896,609733919,734881840,Parabrachial nucleus lateral division external lateral part +883,817,"Parabrachial nucleus, lateral division, superior lateral part",PBls,10,1,3,8690,881,8,1,896,/997/8/343/1065/771/1132/867/881/883/,FFAE6F,,,f,897,2064930966,734881840,Parabrachial nucleus lateral division superior lateral part +891,818,"Parabrachial nucleus, lateral division, ventral lateral part",PBlv,10,1,3,8690,881,8,1,897,/997/8/343/1065/771/1132/867/881/891/,FFAE6F,,,f,898,887571737,734881840,Parabrachial nucleus lateral division ventral lateral part +890,252,"Parabrachial nucleus, medial division",PBm,9,1,3,8690,867,7,1,898,/997/8/343/1065/771/1132/867/890/,FFAE6F,,,f,899,2193337520,734881840,Parabrachial nucleus medial division +899,819,"Parabrachial nucleus, medial division, external medial part",PBme,10,1,3,8690,890,8,1,899,/997/8/343/1065/771/1132/867/890/899/,FFAE6F,,,f,900,4150585958,734881840,Parabrachial nucleus medial division external medial part +915,821,"Parabrachial nucleus, medial division, medial medial part",PBmm,10,1,3,8690,890,8,1,900,/997/8/343/1065/771/1132/867/890/915/,FFAE6F,,,f,901,524500806,734881840,Parabrachial nucleus medial division medial medial part +923,822,"Parabrachial nucleus, medial division, ventral medial part",PBmv,10,1,3,8690,890,8,1,901,/997/8/343/1065/771/1132/867/890/923/,FFAE6F,,,f,902,3813309817,734881840,Parabrachial nucleus medial division ventral medial part +398,332,Superior olivary complex,SOC,8,1,3,8690,1132,6,1,902,/997/8/343/1065/771/1132/398/,FFAE6F,,,f,903,1175552684,734881840,Superior olivary complex +122,439,"Superior olivary complex, periolivary region",POR,9,1,3,8690,398,7,1,903,/997/8/343/1065/771/1132/398/122/,FFAE6F,,,f,904,197155834,734881840,Superior olivary complex periolivary region +105,437,"Superior olivary complex, medial part",SOCm,9,1,3,8690,398,7,1,904,/997/8/343/1065/771/1132/398/105/,FFAE6F,,,f,905,3450441622,734881840,Superior olivary complex medial part +114,438,"Superior olivary complex, lateral part",SOCl,9,1,3,8690,398,7,1,905,/997/8/343/1065/771/1132/398/114/,FFAE6F,,,f,906,98062534,734881840,Superior olivary complex lateral part +987,264,"Pons, motor related",P-mot,6,1,3,8690,771,5,1,906,/997/8/343/1065/771/987/,FFBA86,,,f,907,583149041,734881840,Pons motor related +280,34,Barrington's nucleus,B,8,1,3,8690,987,6,1,907,/997/8/343/1065/771/987/280/,FFBA86,,,f,908,3614612098,734881840,Barrington's nucleus +880,109,Dorsal tegmental nucleus,DTN,8,1,3,8690,987,6,1,908,/997/8/343/1065/771/987/880/,FFBA86,,,f,909,978427151,734881840,Dorsal tegmental nucleus +283,176,Lateral tegmental nucleus,LTN,8,1,3,8690,987,6,1,909,/997/8/343/1065/771/987/283/,FFBA86,,,f,910,787158495,734881840,Lateral tegmental nucleus +599626927,,Posterodorsal tegmental nucleus,PDTg,8,1,3,8690,987,6,1,910,/997/8/343/1065/771/987/599626927/,FFBA86,,,f,911,1383431414,734881840,Posterodorsal tegmental nucleus +898,253,Pontine central gray,PCG,8,1,3,8690,987,6,1,911,/997/8/343/1065/771/987/898/,FFBA86,,,f,912,771958956,734881840,Pontine central gray +931,823,Pontine gray,PG,8,1,3,8690,987,6,1,912,/997/8/343/1065/771/987/931/,FFBA86,,,f,913,3482158520,734881840,Pontine gray +1093,277,"Pontine reticular nucleus, caudal part",PRNc,8,1,3,8690,987,6,1,913,/997/8/343/1065/771/987/1093/,FFBA86,,,f,914,3254684830,734881840,Pontine reticular nucleus caudal part +552,917,"Pontine reticular nucleus, ventral part",PRNv,8,1,3,8690,987,6,1,914,/997/8/343/1065/771/987/552/,FFBA86,,,f,915,3053786086,734881840,Pontine reticular nucleus ventral part +318,322,Supragenual nucleus,SG,8,1,3,8690,987,6,1,915,/997/8/343/1065/771/987/318/,FFBA86,,,f,916,4273181680,734881840,Supragenual nucleus +462,340,Superior salivatory nucleus,SSN,8,1,3,8690,987,6,1,916,/997/8/343/1065/771/987/462/,FFBA86,,,f,917,3836294039,734881840,Superior salivatory nucleus +534,349,Supratrigeminal nucleus,SUT,8,1,3,8690,987,6,1,917,/997/8/343/1065/771/987/534/,FFBA86,,,f,918,252744374,734881840,Supratrigeminal nucleus +574,354,Tegmental reticular nucleus,TRN,8,1,3,8690,987,6,1,918,/997/8/343/1065/771/987/574/,FFBA86,,,f,919,2119502237,734881840,Tegmental reticular nucleus +621,360,Motor nucleus of trigeminal,V,8,1,3,8690,987,6,1,919,/997/8/343/1065/771/987/621/,FFBA86,,,f,920,298495636,734881840,Motor nucleus of trigeminal +549009215,,Peritrigeminal zone,P5,8,1,3,8690,987,6,1,920,/997/8/343/1065/771/987/549009215/,FFBA86,,,f,921,2750316450,734881840,Peritrigeminal zone +549009219,,Accessory trigeminal nucleus,Acs5,8,1,3,8690,987,6,1,921,/997/8/343/1065/771/987/549009219/,FFBA86,,,f,922,1603998582,734881840,Accessory trigeminal nucleus +549009223,,Parvicellular motor 5 nucleus,PC5,8,1,3,8690,987,6,1,922,/997/8/343/1065/771/987/549009223/,FFBA86,,,f,923,2234903594,734881840,Parvicellular motor 5 nucleus +549009227,,Intertrigeminal nucleus,I5,8,1,3,8690,987,6,1,923,/997/8/343/1065/771/987/549009227/,FFBA86,,,f,924,1777267098,734881840,Intertrigeminal nucleus +1117,280,"Pons, behavioral state related",P-sat,6,1,3,8690,771,5,1,924,/997/8/343/1065/771/1117/,FFC395,,,f,925,2919861966,734881840,Pons behavioral state related +679,84,Superior central nucleus raphe,CS,8,1,3,8690,1117,6,1,925,/997/8/343/1065/771/1117/679/,FFC395,,,f,926,734395698,734881840,Superior central nucleus raphe +137,441,"Superior central nucleus raphe, lateral part",CSl,9,1,3,8690,679,7,1,926,/997/8/343/1065/771/1117/679/137/,FFC395,,,f,927,638768583,734881840,Superior central nucleus raphe lateral part +130,440,"Superior central nucleus raphe, medial part",CSm,9,1,3,8690,679,7,1,927,/997/8/343/1065/771/1117/679/130/,FFC395,,,f,928,3729469793,734881840,Superior central nucleus raphe medial part +147,159,Locus ceruleus,LC,8,1,3,8690,1117,6,1,928,/997/8/343/1065/771/1117/147/,FFC395,,,f,929,2295858987,734881840,Locus ceruleus +162,161,Laterodorsal tegmental nucleus,LDT,8,1,3,8690,1117,6,1,929,/997/8/343/1065/771/1117/162/,FFC395,,,f,930,1067465072,734881840,Laterodorsal tegmental nucleus +604,216,Nucleus incertus,NI,8,1,3,8690,1117,6,1,930,/997/8/343/1065/771/1117/604/,FFC395,,,f,931,3514282922,734881840,Nucleus incertus +146,442,Pontine reticular nucleus,PRNr,8,1,3,8690,1117,6,1,931,/997/8/343/1065/771/1117/146/,FFC395,,,f,932,1626550003,734881840,Pontine reticular nucleus +238,312,Nucleus raphe pontis,RPO,8,1,3,8690,1117,6,1,932,/997/8/343/1065/771/1117/238/,FFC395,,,f,933,663725501,734881840,Nucleus raphe pontis +350,326,Subceruleus nucleus,SLC,8,1,3,8690,1117,6,1,933,/997/8/343/1065/771/1117/350/,FFC395,,,f,934,3054129819,734881840,Subceruleus nucleus +358,327,Sublaterodorsal nucleus,SLD,8,1,3,8690,1117,6,1,934,/997/8/343/1065/771/1117/358/,FFC395,,,f,935,4160997876,734881840,Sublaterodorsal nucleus +354,185,Medulla,MY,5,1,3,8690,1065,4,1,935,/997/8/343/1065/354/,FF9BCD,,,f,936,1659540268,734881840,Medulla +386,189,"Medulla, sensory related",MY-sen,6,1,3,8690,354,5,1,936,/997/8/343/1065/354/386/,FFA5D2,,,f,937,846467907,734881840,Medulla sensory related +207,25,Area postrema,AP,8,1,3,8690,386,6,1,937,/997/8/343/1065/354/386/207/,FFA5D2,,,f,938,265254740,734881840,Area postrema +607,75,Cochlear nuclei,CN,7,1,3,8690,386,6,1,938,/997/8/343/1065/354/386/607/,FFA5D2,,,f,939,199055653,734881840,Cochlear nuclei +112,862,Granular lamina of the cochlear nuclei,CNlam,8,1,3,8690,607,7,1,939,/997/8/343/1065/354/386/607/112/,FFA5D2,,,f,940,3067613847,734881840,Granular lamina of the cochlear nuclei +560,918,"Cochlear nucleus, subpedunclular granular region",CNspg,8,1,3,8690,607,7,1,940,/997/8/343/1065/354/386/607/560/,FFA5D2,,,f,941,3306778024,734881840,Cochlear nucleus subpedunclular granular region +96,860,Dorsal cochlear nucleus,DCO,8,1,3,8690,607,7,1,941,/997/8/343/1065/354/386/607/96/,FFA5D2,,,f,942,1628596813,734881840,Dorsal cochlear nucleus +101,861,Ventral cochlear nucleus,VCO,8,1,3,8690,607,7,1,942,/997/8/343/1065/354/386/607/101/,FFA5D2,,,f,943,1142812669,734881840,Ventral cochlear nucleus +720,89,Dorsal column nuclei,DCN,7,1,3,8690,386,6,1,943,/997/8/343/1065/354/386/720/,FFA5D2,,,f,944,3104895435,734881840,Dorsal column nuclei +711,88,Cuneate nucleus,CU,8,1,3,8690,720,7,1,944,/997/8/343/1065/354/386/720/711/,FFA5D2,,,f,945,1566278280,734881840,Cuneate nucleus +1039,129,Gracile nucleus,GR,8,1,3,8690,720,7,1,945,/997/8/343/1065/354/386/720/1039/,FFA5D2,,,f,946,4095548839,734881840,Gracile nucleus +903,112,External cuneate nucleus,ECU,8,1,3,8690,386,6,1,946,/997/8/343/1065/354/386/903/,FFA5D2,,,f,947,868005914,734881840,External cuneate nucleus +642,221,Nucleus of the trapezoid body,NTB,8,1,3,8690,386,6,1,947,/997/8/343/1065/354/386/642/,FFA5D2,,,f,948,3384679656,734881840,Nucleus of the trapezoid body +651,222,Nucleus of the solitary tract,NTS,8,1,3,8690,386,6,1,948,/997/8/343/1065/354/386/651/,FFA5D2,,,f,949,1090041084,734881840,Nucleus of the solitary tract +659,223,"Nucleus of the solitary tract, central part",NTSce,9,1,3,8690,651,7,1,949,/997/8/343/1065/354/386/651/659/,FFA5D2,,,f,950,4015698646,734881840,Nucleus of the solitary tract central part +666,224,"Nucleus of the solitary tract, commissural part",NTSco,9,1,3,8690,651,7,1,950,/997/8/343/1065/354/386/651/666/,FFA5D2,,,f,951,133031180,734881840,Nucleus of the solitary tract commissural part +674,225,"Nucleus of the solitary tract, gelatinous part",NTSge,9,1,3,8690,651,7,1,951,/997/8/343/1065/354/386/651/674/,FFA5D2,,,f,952,2723763350,734881840,Nucleus of the solitary tract gelatinous part +682,226,"Nucleus of the solitary tract, lateral part",NTSl,9,1,3,8690,651,7,1,952,/997/8/343/1065/354/386/651/682/,FFA5D2,,,f,953,2787121462,734881840,Nucleus of the solitary tract lateral part +691,227,"Nucleus of the solitary tract, medial part",NTSm,9,1,3,8690,651,7,1,953,/997/8/343/1065/354/386/651/691/,FFA5D2,,,f,954,2313161716,734881840,Nucleus of the solitary tract medial part +429,336,"Spinal nucleus of the trigeminal, caudal part",SPVC,9,1,3,8690,386,6,1,954,/997/8/343/1065/354/386/429/,FFA5D2,,,f,955,3872657876,734881840,Spinal nucleus of the trigeminal caudal part +437,337,"Spinal nucleus of the trigeminal, interpolar part",SPVI,9,1,3,8690,386,6,1,955,/997/8/343/1065/354/386/437/,FFA5D2,,,f,956,3412250118,734881840,Spinal nucleus of the trigeminal interpolar part +445,338,"Spinal nucleus of the trigeminal, oral part",SPVO,9,1,3,8690,386,6,1,956,/997/8/343/1065/354/386/445/,FFA5D2,,,f,957,2940691791,734881840,Spinal nucleus of the trigeminal oral part +77,858,"Spinal nucleus of the trigeminal, oral part, caudal dorsomedial part",SPVOcdm,10,1,3,8690,445,7,1,957,/997/8/343/1065/354/386/445/77/,FFA5D2,,,f,958,4278948626,734881840,Spinal nucleus of the trigeminal oral part caudal dorsomedial part +53,855,"Spinal nucleus of the trigeminal, oral part, middle dorsomedial part, dorsal zone",SPVOmdmd,10,1,3,8690,445,7,1,958,/997/8/343/1065/354/386/445/53/,FFA5D2,,,f,959,217466567,734881840,Spinal nucleus of the trigeminal oral part middle dorsomedial part dorsal zone +61,856,"Spinal nucleus of the trigeminal, oral part, middle dorsomedial part, ventral zone",SPVOmdmv,10,1,3,8690,445,7,1,959,/997/8/343/1065/354/386/445/61/,FFA5D2,,,f,960,2911019619,734881840,Spinal nucleus of the trigeminal oral part middle dorsomedial part ventral zone +45,854,"Spinal nucleus of the trigeminal, oral part, rostral dorsomedial part",SPVOrdm,10,1,3,8690,445,7,1,960,/997/8/343/1065/354/386/445/45/,FFA5D2,,,f,961,3878567998,734881840,Spinal nucleus of the trigeminal oral part rostral dorsomedial part +69,857,"Spinal nucleus of the trigeminal, oral part, ventrolateral part",SPVOvl,10,1,3,8690,445,7,1,961,/997/8/343/1065/354/386/445/69/,FFA5D2,,,f,962,4273257522,734881840,Spinal nucleus of the trigeminal oral part ventrolateral part +589508451,,Paratrigeminal nucleus,Pa5,8,1,3,8690,386,6,1,962,/997/8/343/1065/354/386/589508451/,FFA5D2,,,f,963,2968278306,734881840,Paratrigeminal nucleus +789,381,Nucleus z,z,8,1,3,8690,386,6,1,963,/997/8/343/1065/354/386/789/,FFA5D2,,,f,964,2941323404,734881840,Nucleus z +370,187,"Medulla, motor related",MY-mot,6,1,3,8690,354,5,1,964,/997/8/343/1065/354/370/,FFB3D9,,,f,965,1608897191,734881840,Medulla motor related +653,364,Abducens nucleus,VI,8,1,3,8690,370,6,1,965,/997/8/343/1065/354/370/653/,FFB3D9,,,f,966,3487199484,734881840,Abducens nucleus +568,919,Accessory abducens nucleus,ACVI,8,1,3,8690,370,6,1,966,/997/8/343/1065/354/370/568/,FFB3D9,,,f,967,1529583787,734881840,Accessory abducens nucleus +661,365,Facial motor nucleus,VII,8,1,3,8690,370,6,1,967,/997/8/343/1065/354/370/661/,FFB3D9,,,f,968,3767076544,734881840,Facial motor nucleus +576,920,Accessory facial motor nucleus,ACVII,8,1,3,8690,370,6,1,968,/997/8/343/1065/354/370/576/,FFB3D9,,,f,969,3949410146,734881840,Accessory facial motor nucleus +640,928,Efferent vestibular nucleus,EV,8,1,3,8690,370,6,1,969,/997/8/343/1065/354/370/640/,FFB3D9,,,f,970,358747077,734881840,Efferent vestibular nucleus +135,16,Nucleus ambiguus,AMB,8,1,3,8690,370,6,1,970,/997/8/343/1065/354/370/135/,FFB3D9,,,f,971,1540571580,734881840,Nucleus ambiguus +939,824,"Nucleus ambiguus, dorsal division",AMBd,9,1,3,8690,135,7,1,971,/997/8/343/1065/354/370/135/939/,FFB3D9,,,f,972,2183877720,734881840,Nucleus ambiguus dorsal division +143,17,"Nucleus ambiguus, ventral division",AMBv,9,1,3,8690,135,7,1,972,/997/8/343/1065/354/370/135/143/,FFB3D9,,,f,973,1830643471,734881840,Nucleus ambiguus ventral division +839,104,Dorsal motor nucleus of the vagus nerve,DMX,8,1,3,8690,370,6,1,973,/997/8/343/1065/354/370/839/,FFB3D9,,,f,974,1434245940,734881840,Dorsal motor nucleus of the vagus nerve +887,110,Efferent cochlear group,ECO,8,1,3,8690,370,6,1,974,/997/8/343/1065/354/370/887/,FFB3D9,,,f,975,2312383346,734881840,Efferent cochlear group +1048,130,Gigantocellular reticular nucleus,GRN,8,1,3,8690,370,6,1,975,/997/8/343/1065/354/370/1048/,FFB3D9,,,f,976,3365807362,734881840,Gigantocellular reticular nucleus +372,470,Infracerebellar nucleus,ICB,8,1,3,8690,370,6,1,976,/997/8/343/1065/354/370/372/,FFB3D9,,,f,977,7302009,734881840,Infracerebellar nucleus +83,151,Inferior olivary complex,IO,8,1,3,8690,370,6,1,977,/997/8/343/1065/354/370/83/,FFB3D9,,,f,978,2657411510,734881840,Inferior olivary complex +136,865,Intermediate reticular nucleus,IRN,8,1,3,8690,370,6,1,978,/997/8/343/1065/354/370/136/,FFB3D9,,,f,979,484077622,734881840,Intermediate reticular nucleus +106,154,Inferior salivatory nucleus,ISN,8,1,3,8690,370,6,1,979,/997/8/343/1065/354/370/106/,FFB3D9,,,f,980,2611456062,734881840,Inferior salivatory nucleus +203,166,Linear nucleus of the medulla,LIN,8,1,3,8690,370,6,1,980,/997/8/343/1065/354/370/203/,FFB3D9,,,f,981,311698439,734881840,Linear nucleus of the medulla +235,170,Lateral reticular nucleus,LRN,8,1,3,8690,370,6,1,981,/997/8/343/1065/354/370/235/,FFB3D9,,,f,982,1748300472,734881840,Lateral reticular nucleus +955,826,"Lateral reticular nucleus, magnocellular part",LRNm,9,1,3,8690,235,7,1,982,/997/8/343/1065/354/370/235/955/,FFB3D9,,,f,983,68562325,734881840,Lateral reticular nucleus magnocellular part +963,827,"Lateral reticular nucleus, parvicellular part",LRNp,9,1,3,8690,235,7,1,983,/997/8/343/1065/354/370/235/963/,FFB3D9,,,f,984,910771600,734881840,Lateral reticular nucleus parvicellular part +307,179,Magnocellular reticular nucleus,MARN,8,1,3,8690,370,6,1,984,/997/8/343/1065/354/370/307/,FFB3D9,,,f,985,1658667243,734881840,Magnocellular reticular nucleus +395,190,Medullary reticular nucleus,MDRN,8,1,3,8690,370,6,1,985,/997/8/343/1065/354/370/395/,FFB3D9,,,f,986,90062647,734881840,Medullary reticular nucleus +1098,844,"Medullary reticular nucleus, dorsal part",MDRNd,9,1,3,8690,395,7,1,986,/997/8/343/1065/354/370/395/1098/,FFB3D9,,,f,987,2459648443,734881840,Medullary reticular nucleus dorsal part +1107,845,"Medullary reticular nucleus, ventral part",MDRNv,9,1,3,8690,395,7,1,987,/997/8/343/1065/354/370/395/1107/,FFB3D9,,,f,988,4055979044,734881840,Medullary reticular nucleus ventral part +852,247,Parvicellular reticular nucleus,PARN,8,1,3,8690,370,6,1,988,/997/8/343/1065/354/370/852/,FFB3D9,,,f,989,3605828329,734881840,Parvicellular reticular nucleus +859,248,Parasolitary nucleus,PAS,8,1,3,8690,370,6,1,989,/997/8/343/1065/354/370/859/,FFB3D9,,,f,990,2326551911,734881840,Parasolitary nucleus +938,258,Paragigantocellular reticular nucleus,PGRN,8,1,3,8690,370,6,1,990,/997/8/343/1065/354/370/938/,FFB3D9,,,f,991,4192283845,734881840,Paragigantocellular reticular nucleus +970,828,"Paragigantocellular reticular nucleus, dorsal part",PGRNd,9,1,3,8690,938,7,1,991,/997/8/343/1065/354/370/938/970/,FFB3D9,,,f,992,33977280,734881840,Paragigantocellular reticular nucleus dorsal part +978,829,"Paragigantocellular reticular nucleus, lateral part",PGRNl,9,1,3,8690,938,7,1,992,/997/8/343/1065/354/370/938/978/,FFB3D9,,,f,993,3947319470,734881840,Paragigantocellular reticular nucleus lateral part +154,443,Perihypoglossal nuclei,PHY,7,1,3,8690,370,6,1,993,/997/8/343/1065/354/370/154/,FFB3D9,,,f,994,2963771227,734881840,Perihypoglossal nuclei +161,444,Nucleus intercalatus,NIS,8,1,3,8690,154,7,1,994,/997/8/343/1065/354/370/154/161/,FFB3D9,,,f,995,66776727,734881840,Nucleus intercalatus +177,446,Nucleus of Roller,NR,8,1,3,8690,154,7,1,995,/997/8/343/1065/354/370/154/177/,FFB3D9,,,f,996,2483747197,734881840,Nucleus of Roller +169,445,Nucleus prepositus,PRP,8,1,3,8690,154,7,1,996,/997/8/343/1065/354/370/154/169/,FFB3D9,,,f,997,2889042614,734881840,Nucleus prepositus +995,265,Paramedian reticular nucleus,PMR,8,1,3,8690,370,6,1,997,/997/8/343/1065/354/370/995/,FFB3D9,,,f,998,1727467162,734881840,Paramedian reticular nucleus +1069,274,Parapyramidal nucleus,PPY,8,1,3,8690,370,6,1,998,/997/8/343/1065/354/370/1069/,FFB3D9,,,f,999,4065444564,734881840,Parapyramidal nucleus +185,447,"Parapyramidal nucleus, deep part",PPYd,9,1,3,8690,1069,7,1,999,/997/8/343/1065/354/370/1069/185/,FFB3D9,,,f,1000,3839043545,734881840,Parapyramidal nucleus deep part +193,448,"Parapyramidal nucleus, superficial part",PPYs,9,1,3,8690,1069,7,1,1000,/997/8/343/1065/354/370/1069/193/,FFB3D9,,,f,1001,419402085,734881840,Parapyramidal nucleus superficial part +701,370,Vestibular nuclei,VNC,7,1,3,8690,370,6,1,1001,/997/8/343/1065/354/370/701/,FFB3D9,,,f,1002,2805025276,734881840,Vestibular nuclei +209,450,Lateral vestibular nucleus,LAV,8,1,3,8690,701,7,1,1002,/997/8/343/1065/354/370/701/209/,FFB3D9,,,f,1003,2027918559,734881840,Lateral vestibular nucleus +202,449,Medial vestibular nucleus,MV,8,1,3,8690,701,7,1,1003,/997/8/343/1065/354/370/701/202/,FFB3D9,,,f,1004,2935119484,734881840,Medial vestibular nucleus +225,452,Spinal vestibular nucleus,SPIV,8,1,3,8690,701,7,1,1004,/997/8/343/1065/354/370/701/225/,FFB3D9,,,f,1005,3627168871,734881840,Spinal vestibular nucleus +217,451,Superior vestibular nucleus,SUV,8,1,3,8690,701,7,1,1005,/997/8/343/1065/354/370/701/217/,FFB3D9,,,f,1006,1654500180,734881840,Superior vestibular nucleus +765,378,Nucleus x,x,8,1,3,8690,370,6,1,1006,/997/8/343/1065/354/370/765/,FFB3D9,,,f,1007,1096772000,734881840,Nucleus x +773,379,Hypoglossal nucleus,XII,8,1,3,8690,370,6,1,1007,/997/8/343/1065/354/370/773/,FFB3D9,,,f,1008,2567805299,734881840,Hypoglossal nucleus +781,380,Nucleus y,y,8,1,3,8690,370,6,1,1008,/997/8/343/1065/354/370/781/,FFB3D9,,,f,1009,911759670,734881840,Nucleus y +76,150,Interstitial nucleus of the vestibular nerve,INV,8,1,3,8690,370,6,1,1009,/997/8/343/1065/354/370/76/,FFB3D9,,,f,1010,1070920716,734881840,Interstitial nucleus of the vestibular nerve +379,188,"Medulla, behavioral state related",MY-sat,6,1,3,8690,354,5,1,1010,/997/8/343/1065/354/379/,FFC6E2,,,f,1011,492266850,734881840,Medulla behavioral state related +206,308,Nucleus raphe magnus,RM,8,1,3,8690,379,6,1,1011,/997/8/343/1065/354/379/206/,FFC6E2,,,f,1012,2906210024,734881840,Nucleus raphe magnus +230,311,Nucleus raphe pallidus,RPA,8,1,3,8690,379,6,1,1012,/997/8/343/1065/354/379/230/,FFC6E2,,,f,1013,2034543671,734881840,Nucleus raphe pallidus +222,310,Nucleus raphe obscurus,RO,8,1,3,8690,379,6,1,1013,/997/8/343/1065/354/379/222/,FFC6E2,,,f,1014,2676196695,734881840,Nucleus raphe obscurus +512,63,Cerebellum,CB,2,1,3,8690,8,2,1,1014,/997/8/512/,F0F080,,,f,1015,4069546324,734881840,Cerebellum +528,65,Cerebellar cortex,CBX,5,1,3,8690,512,3,1,1015,/997/8/512/528/,F0F080,,,f,1016,1183639712,734881840,Cerebellar cortex +1144,1142,"Cerebellar cortex, molecular layer",CBXmo,11,1,3,8690,528,4,1,1016,/997/8/512/528/1144/,FFFC91,,,f,1017,2797331721,734881840,Cerebellar cortex molecular layer +1145,1143,"Cerebellar cortex, Purkinje layer",CBXpu,11,1,3,8690,528,4,1,1017,/997/8/512/528/1145/,FFFC91,,,f,1018,2145022156,734881840,Cerebellar cortex Purkinje layer +1143,1141,"Cerebellar cortex, granular layer",CBXgr,11,1,3,8690,528,4,1,1018,/997/8/512/528/1143/,ECE754,,,f,1019,706018392,734881840,Cerebellar cortex granular layer +645,363,Vermal regions,VERM,6,1,3,8690,528,4,1,1019,/997/8/512/528/645/,FFFC91,,,f,1020,210800080,734881840,Vermal regions +912,396,Lingula (I),LING,8,1,3,8690,645,5,1,1020,/997/8/512/528/645/912/,FFFC91,,,f,1021,1157192956,734881840,Lingula (I) +10707,,"Lingula (I), molecular layer",LINGmo,11,1,3,8690,912,6,1,1021,/997/8/512/528/645/912/10707/,FFFC91,,,f,1022,3473711823,734881840,Lingula (I) molecular layer +10706,,"Lingula (I), Purkinje layer",LINGpu,11,1,3,8690,912,6,1,1022,/997/8/512/528/645/912/10706/,FFFC91,,,f,1023,3462350943,734881840,Lingula (I) Purkinje layer +10705,,"Lingula (I), granular layer",LINGgr,11,1,3,8690,912,6,1,1023,/997/8/512/528/645/912/10705/,ECE754,,,f,1024,2610021579,734881840,Lingula (I) granular layer +920,397,Central lobule,CENT,7,1,3,8690,645,5,1,1024,/997/8/512/528/645/920/,FFFC91,,,f,1025,3534428959,734881840,Central lobule +976,404,Lobule II,CENT2,8,1,3,8690,920,6,1,1025,/997/8/512/528/645/920/976/,FFFC91,,,f,1026,3597550065,734881840,Lobule II +10710,,"Lobule II, molecular layer",CENT2mo,11,1,3,8690,976,7,1,1026,/997/8/512/528/645/920/976/10710/,FFFC91,,,f,1027,2316780061,734881840,Lobule II molecular layer +10709,,"Lobule II, Purkinje layer",CENT2pu,11,1,3,8690,976,7,1,1027,/997/8/512/528/645/920/976/10709/,FFFC91,,,f,1028,182710130,734881840,Lobule II Purkinje layer +10708,,"Lobule II, granular layer",CENT2gr,11,1,3,8690,976,7,1,1028,/997/8/512/528/645/920/976/10708/,ECE754,,,f,1029,1596810214,734881840,Lobule II granular layer +984,405,Lobule III,CENT3,8,1,3,8690,920,6,1,1029,/997/8/512/528/645/920/984/,FFFC91,,,f,1030,393132658,734881840,Lobule III +10713,,"Lobule III, molecular layer",CENT3mo,11,1,3,8690,984,7,1,1030,/997/8/512/528/645/920/984/10713/,FFFC91,,,f,1031,2843540171,734881840,Lobule III molecular layer +10712,,"Lobule III, Purkinje layer",CENT3pu,11,1,3,8690,984,7,1,1031,/997/8/512/528/645/920/984/10712/,FFFC91,,,f,1032,3090974341,734881840,Lobule III Purkinje layer +10711,,"Lobule III, granular layer",CENT3gr,11,1,3,8690,984,7,1,1032,/997/8/512/528/645/920/984/10711/,ECE754,,,f,1033,3992062481,734881840,Lobule III granular layer +928,398,Culmen,CUL,7,1,3,8690,645,5,1,1033,/997/8/512/528/645/928/,FFFC91,,,f,1034,2319676843,734881840,Culmen +992,406,Lobule IV,CUL4,8,1,3,8690,928,6,1,1034,/997/8/512/528/645/928/992/,FFFC91,,,f,1035,1533430788,734881840,Lobule IV +10716,,"Lobule IV, molecular layer",CUL4mo,11,1,3,8690,992,7,1,1035,/997/8/512/528/645/928/992/10716/,FFFC91,,,f,1036,1539631285,734881840,Lobule IV molecular layer +10715,,"Lobule IV, Purkinje layer",CUL4pu,11,1,3,8690,992,7,1,1036,/997/8/512/528/645/928/992/10715/,FFFC91,,,f,1037,1647228630,734881840,Lobule IV Purkinje layer +10714,,"Lobule IV, granular layer",CUL4gr,11,1,3,8690,992,7,1,1037,/997/8/512/528/645/928/992/10714/,ECE754,,,f,1038,937441858,734881840,Lobule IV granular layer +1001,407,Lobule V,CUL5,8,1,3,8690,928,6,1,1038,/997/8/512/528/645/928/1001/,FFFC91,,,f,1039,981492794,734881840,Lobule V +10719,,"Lobule V, molecular layer",CUL5mo,11,1,3,8690,1001,7,1,1039,/997/8/512/528/645/928/1001/10719/,FFFC91,,,f,1040,3910893890,734881840,Lobule V molecular layer +10718,,"Lobule V, Purkinje layer",CUL5pu,11,1,3,8690,1001,7,1,1040,/997/8/512/528/645/928/1001/10718/,FFFC91,,,f,1041,5007727,734881840,Lobule V Purkinje layer +10717,,"Lobule V, granular layer",CUL5gr,11,1,3,8690,1001,7,1,1041,/997/8/512/528/645/928/1001/10717/,ECE754,,,f,1042,1434641915,734881840,Lobule V granular layer +1091,843,Lobules IV-V,"CUL4, 5",8,1,3,8690,928,6,1,1042,/997/8/512/528/645/928/1091/,FFFC91,,,f,1043,3691274609,734881840,Lobules IV-V +10722,,"Lobules IV-V, molecular layer","CUL4, 5mo",11,1,3,8690,1091,7,1,1043,/997/8/512/528/645/928/1091/10722/,FFFC91,,,f,1044,983212771,734881840,Lobules IV-V molecular layer +10721,,"Lobules IV-V, Purkinje layer","CUL4, 5pu",11,1,3,8690,1091,7,1,1044,/997/8/512/528/645/928/1091/10721/,FFFC91,,,f,1045,1469788936,734881840,Lobules IV-V Purkinje layer +10720,,"Lobules IV-V, granular layer","CUL4, 5gr",11,1,3,8690,1091,7,1,1045,/997/8/512/528/645/928/1091/10720/,ECE754,,,f,1046,39174044,734881840,Lobules IV-V granular layer +936,399,Declive (VI),DEC,8,1,3,8690,645,5,1,1046,/997/8/512/528/645/936/,FFFC91,,,f,1047,1592716230,734881840,Declive (VI) +10725,,"Declive (VI), molecular layer",DECmo,11,1,3,8690,936,6,1,1047,/997/8/512/528/645/936/10725/,FFFC91,,,f,1048,1587631392,734881840,Declive (VI) molecular layer +10724,,"Declive (VI), Purkinje layer",DECpu,11,1,3,8690,936,6,1,1048,/997/8/512/528/645/936/10724/,FFFC91,,,f,1049,130297873,734881840,Declive (VI) Purkinje layer +10723,,"Declive (VI), granular layer",DECgr,11,1,3,8690,936,6,1,1049,/997/8/512/528/645/936/10723/,ECE754,,,f,1050,1376435333,734881840,Declive (VI) granular layer +944,400,Folium-tuber vermis (VII),FOTU,8,1,3,8690,645,5,1,1050,/997/8/512/528/645/944/,FFFC91,,,f,1051,1120315048,734881840,Folium-tuber vermis (VII) +10728,,"Folium-tuber vermis (VII), molecular layer",FOTUmo,11,1,3,8690,944,6,1,1051,/997/8/512/528/645/944/10728/,FFFC91,,,f,1052,2702663346,734881840,Folium-tuber vermis (VII) molecular layer +10727,,"Folium-tuber vermis (VII), Purkinje layer",FOTUpu,11,1,3,8690,944,6,1,1052,/997/8/512/528/645/944/10727/,FFFC91,,,f,1053,3198538440,734881840,Folium-tuber vermis (VII) Purkinje layer +10726,,"Folium-tuber vermis (VII), granular layer",FOTUgr,11,1,3,8690,944,6,1,1053,/997/8/512/528/645/944/10726/,ECE754,,,f,1054,3949682268,734881840,Folium-tuber vermis (VII) granular layer +951,401,Pyramus (VIII),PYR,8,1,3,8690,645,5,1,1054,/997/8/512/528/645/951/,FFFC91,,,f,1055,1195853048,734881840,Pyramus (VIII) +10731,,"Pyramus (VIII), molecular layer",PYRmo,11,1,3,8690,951,6,1,1055,/997/8/512/528/645/951/10731/,FFFC91,,,f,1056,3458346904,734881840,Pyramus (VIII) molecular layer +10730,,"Pyramus (VIII), Purkinje layer",PYRpu,11,1,3,8690,951,6,1,1056,/997/8/512/528/645/951/10730/,FFFC91,,,f,1057,1000544542,734881840,Pyramus (VIII) Purkinje layer +10729,,"Pyramus (VIII), granular layer",PYRgr,11,1,3,8690,951,6,1,1057,/997/8/512/528/645/951/10729/,ECE754,,,f,1058,1852675466,734881840,Pyramus (VIII) granular layer +957,402,Uvula (IX),UVU,8,1,3,8690,645,5,1,1058,/997/8/512/528/645/957/,FFFC91,,,f,1059,3218909973,734881840,Uvula (IX) +10734,,"Uvula (IX), molecular layer",UVUmo,11,1,3,8690,957,6,1,1059,/997/8/512/528/645/957/10734/,FFFC91,,,f,1060,276896234,734881840,Uvula (IX) molecular layer +10733,,"Uvula (IX), Purkinje layer",UVUpu,11,1,3,8690,957,6,1,1060,/997/8/512/528/645/957/10733/,FFFC91,,,f,1061,587968243,734881840,Uvula (IX) Purkinje layer +10732,,"Uvula (IX), granular layer",UVUgr,11,1,3,8690,957,6,1,1061,/997/8/512/528/645/957/10732/,ECE754,,,f,1062,1992630887,734881840,Uvula (IX) granular layer +968,403,Nodulus (X),NOD,8,1,3,8690,645,5,1,1062,/997/8/512/528/645/968/,FFFC91,,,f,1063,626869262,734881840,Nodulus (X) +10737,,"Nodulus (X), molecular layer",NODmo,11,1,3,8690,968,6,1,1063,/997/8/512/528/645/968/10737/,FFFC91,,,f,1064,3288502643,734881840,Nodulus (X) molecular layer +10736,,"Nodulus (X), Purkinje layer",NODpu,11,1,3,8690,968,6,1,1064,/997/8/512/528/645/968/10736/,FFFC91,,,f,1065,464770448,734881840,Nodulus (X) Purkinje layer +10735,,"Nodulus (X), granular layer",NODgr,11,1,3,8690,968,6,1,1065,/997/8/512/528/645/968/10735/,ECE754,,,f,1066,1316837636,734881840,Nodulus (X) granular layer +1073,133,Hemispheric regions,HEM,6,1,3,8690,528,4,1,1066,/997/8/512/528/1073/,FFFC91,,,f,1067,697387705,734881840,Hemispheric regions +1007,408,Simple lobule,SIM,8,1,3,8690,1073,5,1,1067,/997/8/512/528/1073/1007/,FFFC91,,,f,1068,3723950850,734881840,Simple lobule +10674,,"Simple lobule, molecular layer",SIMmo,11,1,3,8690,1007,6,1,1068,/997/8/512/528/1073/1007/10674/,FFFC91,,,f,1069,4097504869,734881840,Simple lobule molecular layer +10673,,"Simple lobule, Purkinje layer",SIMpu,11,1,3,8690,1007,6,1,1069,/997/8/512/528/1073/1007/10673/,FFFC91,,,f,1070,2519411327,734881840,Simple lobule Purkinje layer +10672,,"Simple lobule, granular layer",SIMgr,11,1,3,8690,1007,6,1,1070,/997/8/512/528/1073/1007/10672/,ECE754,,,f,1071,3286607595,734881840,Simple lobule granular layer +1017,409,Ansiform lobule,AN,7,1,3,8690,1073,5,1,1071,/997/8/512/528/1073/1017/,FFFC91,,,f,1072,3221901529,734881840,Ansiform lobule +1056,414,Crus 1,ANcr1,8,1,3,8690,1017,6,1,1072,/997/8/512/528/1073/1017/1056/,FFFC91,,,f,1073,1964034289,734881840,Crus 1 +10677,,"Crus 1, molecular layer",ANcr1mo,11,1,3,8690,1056,7,1,1073,/997/8/512/528/1073/1017/1056/10677/,FFFC91,,,f,1074,1036534048,734881840,Crus 1 molecular layer +10676,,"Crus 1, Purkinje layer",ANcr1pu,11,1,3,8690,1056,7,1,1074,/997/8/512/528/1073/1017/1056/10676/,FFFC91,,,f,1075,1757210892,734881840,Crus 1 Purkinje layer +10675,,"Crus 1, granular layer",ANcr1gr,11,1,3,8690,1056,7,1,1075,/997/8/512/528/1073/1017/1056/10675/,ECE754,,,f,1076,1030907288,734881840,Crus 1 granular layer +1064,415,Crus 2,ANcr2,8,1,3,8690,1017,6,1,1076,/997/8/512/528/1073/1017/1064/,FFFC91,,,f,1077,3961100619,734881840,Crus 2 +10680,,"Crus 2, molecular layer",ANcr2mo,11,1,3,8690,1064,7,1,1077,/997/8/512/528/1073/1017/1064/10680/,FFFC91,,,f,1078,1850874532,734881840,Crus 2 molecular layer +10679,,"Crus 2, Purkinje layer",ANcr2pu,11,1,3,8690,1064,7,1,1078,/997/8/512/528/1073/1017/1064/10679/,FFFC91,,,f,1079,1098145278,734881840,Crus 2 Purkinje layer +10678,,"Crus 2, granular layer",ANcr2gr,11,1,3,8690,1064,7,1,1079,/997/8/512/528/1073/1017/1064/10678/,ECE754,,,f,1080,347787626,734881840,Crus 2 granular layer +1025,410,Paramedian lobule,PRM,8,1,3,8690,1073,5,1,1080,/997/8/512/528/1073/1025/,FFFC91,,,f,1081,2367515256,734881840,Paramedian lobule +10683,,"Paramedian lobule, molecular layer",PRMmo,11,1,3,8690,1025,6,1,1081,/997/8/512/528/1073/1025/10683/,FFFC91,,,f,1082,636299035,734881840,Paramedian lobule molecular layer +10682,,"Paramedian lobule, Purkinje layer",PRMpu,11,1,3,8690,1025,6,1,1082,/997/8/512/528/1073/1025/10682/,FFFC91,,,f,1083,4204635611,734881840,Paramedian lobule Purkinje layer +10681,,"Paramedian lobule, granular layer",PRMgr,11,1,3,8690,1025,6,1,1083,/997/8/512/528/1073/1025/10681/,ECE754,,,f,1084,2941462863,734881840,Paramedian lobule granular layer +1033,411,Copula pyramidis,COPY,8,1,3,8690,1073,5,1,1084,/997/8/512/528/1073/1033/,FFFC91,,,f,1085,2916242466,734881840,Copula pyramidis +10686,,"Copula pyramidis, molecular layer",COPYmo,11,1,3,8690,1033,6,1,1085,/997/8/512/528/1073/1033/10686/,FFFC91,,,f,1086,536021991,734881840,Copula pyramidis molecular layer +10685,,"Copula pyramidis, Purkinje layer",COPYpu,11,1,3,8690,1033,6,1,1086,/997/8/512/528/1073/1033/10685/,FFFC91,,,f,1087,1373673402,734881840,Copula pyramidis Purkinje layer +10684,,"Copula pyramidis, granular layer",COPYgr,11,1,3,8690,1033,6,1,1087,/997/8/512/528/1073/1033/10684/,ECE754,,,f,1088,70130478,734881840,Copula pyramidis granular layer +1041,412,Paraflocculus,PFL,8,1,3,8690,1073,5,1,1088,/997/8/512/528/1073/1041/,FFFC91,,,f,1089,775625608,734881840,Paraflocculus +10689,,"Paraflocculus, molecular layer",PFLmo,11,1,3,8690,1041,6,1,1089,/997/8/512/528/1073/1041/10689/,FFFC91,,,f,1090,2192132592,734881840,Paraflocculus molecular layer +10688,,"Paraflocculus, Purkinje layer",PFLpu,11,1,3,8690,1041,6,1,1090,/997/8/512/528/1073/1041/10688/,FFFC91,,,f,1091,3654627135,734881840,Paraflocculus Purkinje layer +10687,,"Paraflocculus, granular layer",PFLgr,11,1,3,8690,1041,6,1,1091,/997/8/512/528/1073/1041/10687/,ECE754,,,f,1092,2350621611,734881840,Paraflocculus granular layer +1049,413,Flocculus,FL,8,1,3,8690,1073,5,1,1092,/997/8/512/528/1073/1049/,FFFC91,,,f,1093,1738627181,734881840,Flocculus +10692,,"Flocculus, molecular layer",FLmo,11,1,3,8690,1049,6,1,1093,/997/8/512/528/1073/1049/10692/,FFFC91,,,f,1094,1260681159,734881840,Flocculus molecular layer +10691,,"Flocculus, Purkinje layer",FLpu,11,1,3,8690,1049,6,1,1094,/997/8/512/528/1073/1049/10691/,FFFC91,,,f,1095,1489739340,734881840,Flocculus Purkinje layer +10690,,"Flocculus, granular layer",FLgr,11,1,3,8690,1049,6,1,1095,/997/8/512/528/1073/1049/10690/,ECE754,,,f,1096,218436312,734881840,Flocculus granular layer +519,64,Cerebellar nuclei,CBN,5,1,3,8690,512,3,1,1096,/997/8/512/519/,F0F080,,,f,1097,1080202909,734881840,Cerebellar nuclei +989,123,Fastigial nucleus,FN,8,1,3,8690,519,4,1,1097,/997/8/512/519/989/,FFFDBC,,,f,1098,960199658,734881840,Fastigial nucleus +91,152,Interposed nucleus,IP,8,1,3,8690,519,4,1,1098,/997/8/512/519/91/,FFFDBC,,,f,1099,3559061393,734881840,Interposed nucleus +846,105,Dentate nucleus,DN,8,1,3,8690,519,4,1,1099,/997/8/512/519/846/,FFFDBC,,,f,1100,928321645,734881840,Dentate nucleus +589508455,,Vestibulocerebellar nucleus,VeCB,8,1,3,8690,519,4,1,1100,/997/8/512/519/589508455/,FFFDBC,,,f,1101,3164461348,734881840,Vestibulocerebellar nucleus +1009,691,fiber tracts,fiber tracts,1,1,3,8690,997,1,1,1101,/997/1009/,CCCCCC,,,f,1102,771268094,734881840,fiber tracts +967,686,cranial nerves,cm,2,1,3,8690,1009,2,1,1102,/997/1009/967/,CCCCCC,,,f,1103,1191830544,734881840,cranial nerves +885,676,terminal nerve,tn,8,1,3,8690,967,3,1,1103,/997/1009/967/885/,CCCCCC,,,f,1104,3037669130,734881840,terminal nerve +949,684,vomeronasal nerve,von,8,1,3,8690,967,3,1,1104,/997/1009/967/949/,CCCCCC,,,f,1105,277092608,734881840,vomeronasal nerve +840,670,olfactory nerve,In,8,1,3,8690,967,3,1,1105,/997/1009/967/840/,CCCCCC,,,f,1106,1727601264,734881840,olfactory nerve +1016,692,olfactory nerve layer of main olfactory bulb,onl,9,1,3,8690,840,4,1,1106,/997/1009/967/840/1016/,CCCCCC,,,f,1107,3450858286,734881840,olfactory nerve layer of main olfactory bulb +21,568,"lateral olfactory tract, general",lotg,9,1,3,8690,840,4,1,1107,/997/1009/967/840/21/,CCCCCC,,,f,1108,2601931165,734881840,lateral olfactory tract general +665,507,"lateral olfactory tract, body",lot,10,1,3,8690,21,5,1,1108,/997/1009/967/840/21/665/,CCCCCC,,,f,1109,2791586724,734881840,lateral olfactory tract body +538,491,dorsal limb,lotd,10,1,3,8690,21,5,1,1109,/997/1009/967/840/21/538/,CCCCCC,,,f,1110,2177072245,734881840,dorsal limb +459,481,accessory olfactory tract,aolt,10,1,3,8690,21,5,1,1110,/997/1009/967/840/21/459/,CCCCCC,,,f,1111,1866105457,734881840,accessory olfactory tract +900,536,"anterior commissure, olfactory limb",aco,9,1,3,8690,840,4,1,1111,/997/1009/967/840/900/,CCCCCC,,,f,1112,1365430169,734881840,anterior commissure olfactory limb +848,671,optic nerve,IIn,8,1,3,8690,967,3,1,1112,/997/1009/967/848/,CCCCCC,,,f,1113,3100185865,734881840,optic nerve +876,533,accessory optic tract,aot,9,1,3,8690,848,4,1,1113,/997/1009/967/848/876/,CCCCCC,,,f,1114,2019784696,734881840,accessory optic tract +916,538,brachium of the superior colliculus,bsc,9,1,3,8690,848,4,1,1114,/997/1009/967/848/916/,CCCCCC,,,f,1115,2637319906,734881840,brachium of the superior colliculus +336,607,superior colliculus commissure,csc,9,1,3,8690,848,4,1,1115,/997/1009/967/848/336/,CCCCCC,,,f,1116,4201356620,734881840,superior colliculus commissure +117,580,optic chiasm,och,9,1,3,8690,848,4,1,1116,/997/1009/967/848/117/,CCCCCC,,,f,1117,1585611786,734881840,optic chiasm +125,581,optic tract,opt,9,1,3,8690,848,4,1,1117,/997/1009/967/848/125/,CCCCCC,,,f,1118,473050819,734881840,optic tract +357,610,tectothalamic pathway,ttp,9,1,3,8690,848,4,1,1118,/997/1009/967/848/357/,CCCCCC,,,f,1119,2212800702,734881840,tectothalamic pathway +832,669,oculomotor nerve,IIIn,8,1,3,8690,967,3,1,1119,/997/1009/967/832/,CCCCCC,,,f,1120,4065434170,734881840,oculomotor nerve +62,573,medial longitudinal fascicle,mlf,9,1,3,8690,832,4,1,1120,/997/1009/967/832/62/,CCCCCC,,,f,1121,2996842461,734881840,medial longitudinal fascicle +158,585,posterior commissure,pc,9,1,3,8690,832,4,1,1121,/997/1009/967/832/158/,CCCCCC,,,f,1122,4129046125,734881840,posterior commissure +911,679,trochlear nerve,IVn,8,1,3,8690,967,3,1,1122,/997/1009/967/911/,CCCCCC,,,f,1123,1219326126,734881840,trochlear nerve +384,613,trochlear nerve decussation,IVd,9,1,3,8690,911,4,1,1123,/997/1009/967/911/384/,CCCCCC,,,f,1124,2082477936,734881840,trochlear nerve decussation +710,654,abducens nerve,VIn,8,1,3,8690,967,3,1,1124,/997/1009/967/710/,CCCCCC,,,f,1125,12381790,734881840,abducens nerve +901,678,trigeminal nerve,Vn,8,1,3,8690,967,3,1,1125,/997/1009/967/901/,CCCCCC,,,f,1126,3826678836,734881840,trigeminal nerve +93,577,motor root of the trigeminal nerve,moV,9,1,3,8690,901,4,1,1126,/997/1009/967/901/93/,CCCCCC,,,f,1127,511291358,734881840,motor root of the trigeminal nerve +229,594,sensory root of the trigeminal nerve,sV,9,1,3,8690,901,4,1,1127,/997/1009/967/901/229/,CCCCCC,,,f,1128,1119694834,734881840,sensory root of the trigeminal nerve +705,512,midbrain tract of the trigeminal nerve,mtV,10,1,3,8690,229,5,1,1128,/997/1009/967/901/229/705/,CCCCCC,,,f,1129,1926814004,734881840,midbrain tract of the trigeminal nerve +794,523,spinal tract of the trigeminal nerve,sptV,10,1,3,8690,229,5,1,1129,/997/1009/967/901/229/794/,CCCCCC,,,f,1130,853181822,734881840,spinal tract of the trigeminal nerve +798,665,facial nerve,VIIn,8,1,3,8690,967,3,1,1130,/997/1009/967/798/,CCCCCC,,,f,1131,2302244085,734881840,facial nerve +1131,565,intermediate nerve,iVIIn,9,1,3,8690,798,4,1,1131,/997/1009/967/798/1131/,CCCCCC,,,f,1132,2336161075,734881840,intermediate nerve +1116,563,genu of the facial nerve,gVIIn,9,1,3,8690,798,4,1,1132,/997/1009/967/798/1116/,CCCCCC,,,f,1133,3232359188,734881840,genu of the facial nerve +933,682,vestibulocochlear nerve,VIIIn,8,1,3,8690,967,3,1,1133,/997/1009/967/933/,CCCCCC,,,f,1134,3849290809,734881840,vestibulocochlear nerve +1076,558,efferent cochleovestibular bundle,cvb,9,1,3,8690,933,4,1,1134,/997/1009/967/933/1076/,CCCCCC,,,f,1135,4075971237,734881840,efferent cochleovestibular bundle +413,617,vestibular nerve,vVIIIn,9,1,3,8690,933,4,1,1135,/997/1009/967/933/413/,CCCCCC,,,f,1136,3018519253,734881840,vestibular nerve +948,542,cochlear nerve,cVIIIn,9,1,3,8690,933,4,1,1136,/997/1009/967/933/948/,CCCCCC,,,f,1137,962095195,734881840,cochlear nerve +841,529,trapezoid body,tb,10,1,3,8690,948,5,1,1137,/997/1009/967/933/948/841/,CCCCCC,,,f,1138,1491826042,734881840,trapezoid body +641,504,intermediate acoustic stria,ias,10,1,3,8690,948,5,1,1138,/997/1009/967/933/948/641/,CCCCCC,,,f,1139,2460821868,734881840,intermediate acoustic stria +506,487,dorsal acoustic stria,das,10,1,3,8690,948,5,1,1139,/997/1009/967/933/948/506/,CCCCCC,,,f,1140,2563848709,734881840,dorsal acoustic stria +658,506,lateral lemniscus,ll,10,1,3,8690,948,5,1,1140,/997/1009/967/933/948/658/,CCCCCC,,,f,1141,2249670554,734881840,lateral lemniscus +633,503,inferior colliculus commissure,cic,10,1,3,8690,948,5,1,1141,/997/1009/967/933/948/633/,CCCCCC,,,f,1142,1506772234,734881840,inferior colliculus commissure +482,484,brachium of the inferior colliculus,bic,10,1,3,8690,948,5,1,1142,/997/1009/967/933/948/482/,CCCCCC,,,f,1143,2423549855,734881840,brachium of the inferior colliculus +808,666,glossopharyngeal nerve,IXn,8,1,3,8690,967,3,1,1143,/997/1009/967/808/,CCCCCC,,,f,1144,2892311360,734881840,glossopharyngeal nerve +917,680,vagus nerve,Xn,8,1,3,8690,967,3,1,1144,/997/1009/967/917/,CCCCCC,,,f,1145,2090451855,734881840,vagus nerve +237,595,solitary tract,ts,9,1,3,8690,917,4,1,1145,/997/1009/967/917/237/,CCCCCC,,,f,1146,3517832558,734881840,solitary tract +717,655,accessory spinal nerve,XIn,8,1,3,8690,967,3,1,1146,/997/1009/967/717/,CCCCCC,,,f,1147,2966859887,734881840,accessory spinal nerve +813,667,hypoglossal nerve,XIIn,8,1,3,8690,967,3,1,1147,/997/1009/967/813/,CCCCCC,,,f,1148,2776584549,734881840,hypoglossal nerve +925,681,ventral roots,vrt,7,1,3,8690,967,3,1,1148,/997/1009/967/925/,CCCCCC,,,f,1149,4038675037,734881840,ventral roots +792,664,dorsal roots,drt,7,1,3,8690,967,3,1,1149,/997/1009/967/792/,CCCCCC,,,f,1150,3729235522,734881840,dorsal roots +932,540,cervicothalamic tract,cett,8,1,3,8690,792,4,1,1150,/997/1009/967/792/932/,CCCCCC,,,f,1151,2955091529,734881840,cervicothalamic tract +570,495,dorsolateral fascicle,dl,9,1,3,8690,932,5,1,1151,/997/1009/967/792/932/570/,CCCCCC,,,f,1152,4232767129,734881840,dorsolateral fascicle +522,489,dorsal commissure of the spinal cord,dcm,9,1,3,8690,932,5,1,1152,/997/1009/967/792/932/522/,CCCCCC,,,f,1153,2940092852,734881840,dorsal commissure of the spinal cord +858,531,ventral commissure of the spinal cord,vc,9,1,3,8690,932,5,1,1153,/997/1009/967/792/932/858/,CCCCCC,,,f,1154,391042733,734881840,ventral commissure of the spinal cord +586,497,fasciculus proprius,fpr,9,1,3,8690,932,5,1,1154,/997/1009/967/792/932/586/,CCCCCC,,,f,1155,2538399429,734881840,fasciculus proprius +514,488,dorsal column,dc,9,1,3,8690,932,5,1,1155,/997/1009/967/792/932/514/,CCCCCC,,,f,1156,4021874632,734881840,dorsal column +380,471,cuneate fascicle,cuf,10,1,3,8690,514,6,1,1156,/997/1009/967/792/932/514/380/,CCCCCC,,,f,1157,1158547825,734881840,cuneate fascicle +388,472,gracile fascicle,grf,10,1,3,8690,514,6,1,1157,/997/1009/967/792/932/514/388/,CCCCCC,,,f,1158,4000740023,734881840,gracile fascicle +396,473,internal arcuate fibers,iaf,10,1,3,8690,514,6,1,1158,/997/1009/967/792/932/514/396/,CCCCCC,,,f,1159,3611554723,734881840,internal arcuate fibers +697,511,medial lemniscus,ml,9,1,3,8690,932,5,1,1159,/997/1009/967/792/932/697/,CCCCCC,,,f,1160,3519337805,734881840,medial lemniscus +871,674,spinothalamic tract,sst,8,1,3,8690,967,3,1,1160,/997/1009/967/871/,CCCCCC,,,f,1161,3879904993,734881840,spinothalamic tract +29,569,lateral spinothalamic tract,sttl,9,1,3,8690,871,4,1,1161,/997/1009/967/871/29/,CCCCCC,,,f,1162,1590160233,734881840,lateral spinothalamic tract +389,614,ventral spinothalamic tract,sttv,9,1,3,8690,871,4,1,1162,/997/1009/967/871/389/,CCCCCC,,,f,1163,797556340,734881840,ventral spinothalamic tract +245,596,spinocervical tract,scrt,9,1,3,8690,871,4,1,1163,/997/1009/967/871/245/,CCCCCC,,,f,1164,1786118986,734881840,spinocervical tract +261,598,spino-olivary pathway,sop,9,1,3,8690,871,4,1,1164,/997/1009/967/871/261/,CCCCCC,,,f,1165,3501259155,734881840,spino-olivary pathway +270,599,spinoreticular pathway,srp,9,1,3,8690,871,4,1,1165,/997/1009/967/871/270/,CCCCCC,,,f,1166,2749725572,734881840,spinoreticular pathway +293,602,spinovestibular pathway,svp,9,1,3,8690,871,4,1,1166,/997/1009/967/871/293/,CCCCCC,,,f,1167,2122676298,734881840,spinovestibular pathway +277,600,spinotectal pathway,stp,9,1,3,8690,871,4,1,1167,/997/1009/967/871/277/,CCCCCC,,,f,1168,2155059607,734881840,spinotectal pathway +253,597,spinohypothalamic pathway,shp,9,1,3,8690,871,4,1,1168,/997/1009/967/871/253/,CCCCCC,,,f,1169,966214946,734881840,spinohypothalamic pathway +285,601,spinotelenchephalic pathway,step,9,1,3,8690,871,4,1,1169,/997/1009/967/871/285/,CCCCCC,,,f,1170,1805493208,734881840,spinotelenchephalic pathway +627,502,hypothalamohypophysial tract,hht,10,1,3,8690,285,5,1,1170,/997/1009/967/871/285/627/,CCCCCC,,,f,1171,2160377595,734881840,hypothalamohypophysial tract +960,685,cerebellum related fiber tracts,cbf,2,1,3,8690,1009,2,1,1171,/997/1009/960/,CCCCCC,,,f,1172,4010653894,734881840,cerebellum related fiber tracts +744,658,cerebellar commissure,cbc,8,1,3,8690,960,3,1,1172,/997/1009/960/744/,CCCCCC,,,f,1173,137458081,734881840,cerebellar commissure +752,659,cerebellar peduncles,cbp,7,1,3,8690,960,3,1,1173,/997/1009/960/752/,CCCCCC,,,f,1174,3845133906,734881840,cerebellar peduncles +326,606,superior cerebelar peduncles,scp,8,1,3,8690,752,4,1,1174,/997/1009/960/752/326/,CCCCCC,,,f,1175,1423960324,734881840,superior cerebelar peduncles +812,525,superior cerebellar peduncle decussation,dscp,9,1,3,8690,326,5,1,1175,/997/1009/960/752/326/812/,CCCCCC,,,f,1176,3545529547,734881840,superior cerebellar peduncle decussation +85,859,spinocerebellar tract,sct,10,1,3,8690,812,6,1,1176,/997/1009/960/752/326/812/85/,CCCCCC,,,f,1177,855849778,734881840,spinocerebellar tract +850,530,uncinate fascicle,uf,9,1,3,8690,326,5,1,1177,/997/1009/960/752/326/850/,CCCCCC,,,f,1178,496405985,734881840,uncinate fascicle +866,532,ventral spinocerebellar tract,sctv,9,1,3,8690,326,5,1,1178,/997/1009/960/752/326/866/,CCCCCC,,,f,1179,744035824,734881840,ventral spinocerebellar tract +78,575,middle cerebellar peduncle,mcp,8,1,3,8690,752,4,1,1179,/997/1009/960/752/78/,CCCCCC,,,f,1180,733008278,734881840,middle cerebellar peduncle +1123,564,inferior cerebellar peduncle,icp,8,1,3,8690,752,4,1,1180,/997/1009/960/752/1123/,CCCCCC,,,f,1181,202676826,734881840,inferior cerebellar peduncle +553,493,dorsal spinocerebellar tract,sctd,9,1,3,8690,1123,5,1,1181,/997/1009/960/752/1123/553/,CCCCCC,,,f,1182,3857282012,734881840,dorsal spinocerebellar tract +499,486,cuneocerebellar tract,cct,9,1,3,8690,1123,5,1,1182,/997/1009/960/752/1123/499/,CCCCCC,,,f,1183,3833856484,734881840,cuneocerebellar tract +650,505,juxtarestiform body,jrb,9,1,3,8690,1123,5,1,1183,/997/1009/960/752/1123/650/,CCCCCC,,,f,1184,1765241487,734881840,juxtarestiform body +490,485,bulbocerebellar tract,bct,9,1,3,8690,1123,5,1,1184,/997/1009/960/752/1123/490/,CCCCCC,,,f,1185,4005859055,734881840,bulbocerebellar tract +404,474,olivocerebellar tract,oct,10,1,3,8690,490,6,1,1185,/997/1009/960/752/1123/490/404/,CCCCCC,,,f,1186,1173242057,734881840,olivocerebellar tract +410,475,reticulocerebellar tract,rct,10,1,3,8690,490,6,1,1186,/997/1009/960/752/1123/490/410/,CCCCCC,,,f,1187,3086551336,734881840,reticulocerebellar tract +373,612,trigeminocerebellar tract,tct,8,1,3,8690,752,4,1,1187,/997/1009/960/752/373/,CCCCCC,,,f,1188,496531143,734881840,trigeminocerebellar tract +728,656,arbor vitae,arb,8,1,3,8690,960,3,1,1188,/997/1009/960/728/,CCCCCC,,,f,1189,756994283,734881840,arbor vitae +484682512,,supra-callosal cerebral white matter,scwm,2,1,3,8690,1009,2,1,1189,/997/1009/484682512/,CCCCCC,,,f,1190,860296328,734881840,supra-callosal cerebral white matter +983,688,lateral forebrain bundle system,lfbs,2,1,3,8690,1009,2,1,1190,/997/1009/983/,CCCCCC,,,f,1191,1446894155,734881840,lateral forebrain bundle system +776,662,corpus callosum,cc,8,1,3,8690,983,3,1,1191,/997/1009/983/776/,CCCCCC,,,f,1192,3022588286,734881840,corpus callosum +956,543,"corpus callosum, anterior forceps",fa,9,1,3,8690,776,4,1,1192,/997/1009/983/776/956/,CCCCCC,,,f,1193,4281334996,734881840,corpus callosum anterior forceps +579,496,external capsule,ec,10,1,3,8690,956,5,1,1193,/997/1009/983/776/956/579/,CCCCCC,,,f,1194,1857747964,734881840,external capsule +964,544,"corpus callosum, extreme capsule",ee,9,1,3,8690,776,4,1,1194,/997/1009/983/776/964/,CCCCCC,,,f,1195,3643110747,734881840,corpus callosum extreme capsule +1108,562,genu of corpus callosum,ccg,9,1,3,8690,776,4,1,1195,/997/1009/983/776/1108/,CCCCCC,,,f,1196,3387198454,734881840,genu of corpus callosum +971,545,"corpus callosum, posterior forceps",fp,9,1,3,8690,776,4,1,1196,/997/1009/983/776/971/,CCCCCC,,,f,1197,2598038340,734881840,corpus callosum posterior forceps +979,546,"corpus callosum, rostrum",ccr,9,1,3,8690,776,4,1,1197,/997/1009/983/776/979/,CCCCCC,,,f,1198,2612427861,734881840,corpus callosum rostrum +484682516,,"corpus callosum, body",ccb,9,1,3,8690,776,4,1,1198,/997/1009/983/776/484682516/,CCCCCC,,,f,1199,1909459776,734881840,corpus callosum body +986,547,"corpus callosum, splenium",ccs,9,1,3,8690,776,4,1,1199,/997/1009/983/776/986/,CCCCCC,,,f,1200,2236557760,734881840,corpus callosum splenium +784,663,corticospinal tract,cst,8,1,3,8690,983,3,1,1200,/997/1009/983/784/,CCCCCC,,,f,1201,2338134602,734881840,corticospinal tract +6,566,internal capsule,int,9,1,3,8690,784,4,1,1201,/997/1009/983/784/6/,CCCCCC,,,f,1202,2936038281,734881840,internal capsule +924,539,cerebal peduncle,cpd,9,1,3,8690,784,4,1,1202,/997/1009/983/784/924/,CCCCCC,,,f,1203,993976011,734881840,cerebal peduncle +1036,553,corticotectal tract,cte,9,1,3,8690,784,4,1,1203,/997/1009/983/784/1036/,CCCCCC,,,f,1204,245941098,734881840,corticotectal tract +1012,550,corticorubral tract,crt,9,1,3,8690,784,4,1,1204,/997/1009/983/784/1012/,CCCCCC,,,f,1205,3552293109,734881840,corticorubral tract +1003,549,corticopontine tract,cpt,9,1,3,8690,784,4,1,1205,/997/1009/983/784/1003/,CCCCCC,,,f,1206,2049138094,734881840,corticopontine tract +994,548,corticobulbar tract,cbt,9,1,3,8690,784,4,1,1206,/997/1009/983/784/994/,CCCCCC,,,f,1207,1514915928,734881840,corticobulbar tract +190,589,pyramid,py,9,1,3,8690,784,4,1,1207,/997/1009/983/784/190/,CCCCCC,,,f,1208,3813563721,734881840,pyramid +198,590,pyramidal decussation,pyd,9,1,3,8690,784,4,1,1208,/997/1009/983/784/198/,CCCCCC,,,f,1209,3272625759,734881840,pyramidal decussation +1019,551,"corticospinal tract, crossed",cstc,9,1,3,8690,784,4,1,1209,/997/1009/983/784/1019/,CCCCCC,,,f,1210,188728262,734881840,corticospinal tract crossed +1028,552,"corticospinal tract, uncrossed",cstu,9,1,3,8690,784,4,1,1210,/997/1009/983/784/1028/,CCCCCC,,,f,1211,3178799578,734881840,corticospinal tract uncrossed +896,677,thalamus related,lfbst,7,1,3,8690,983,3,1,1211,/997/1009/983/896/,CCCCCC,,,f,1212,443856761,734881840,thalamus related +1092,560,external medullary lamina of the thalamus,em,8,1,3,8690,896,4,1,1212,/997/1009/983/896/1092/,CCCCCC,,,f,1213,3515725381,734881840,external medullary lamina of the thalamus +14,567,internal medullary lamina of the thalamus,im,8,1,3,8690,896,4,1,1213,/997/1009/983/896/14/,CCCCCC,,,f,1214,1272383137,734881840,internal medullary lamina of the thalamus +86,576,middle thalamic commissure,mtc,8,1,3,8690,896,4,1,1214,/997/1009/983/896/86/,CCCCCC,,,f,1215,48183717,734881840,middle thalamic commissure +365,611,thalamic peduncles,tp,8,1,3,8690,896,4,1,1215,/997/1009/983/896/365/,CCCCCC,,,f,1216,406163682,734881840,thalamic peduncles +484682520,,optic radiation,or,8,1,3,8690,896,4,1,1216,/997/1009/983/896/484682520/,CCCCCC,,,f,1217,3215415810,734881840,optic radiation +484682524,,auditory radiation,ar,8,1,3,8690,896,4,1,1217,/997/1009/983/896/484682524/,CCCCCC,,,f,1218,601332939,734881840,auditory radiation +1000,690,extrapyramidal fiber systems,eps,2,1,3,8690,1009,2,1,1218,/997/1009/1000/,CCCCCC,,,f,1219,738013408,734881840,extrapyramidal fiber systems +760,660,cerebral nuclei related,epsc,7,1,3,8690,1000,3,1,1219,/997/1009/1000/760/,CCCCCC,,,f,1220,3574075519,734881840,cerebral nuclei related +142,583,pallidothalamic pathway,pap,8,1,3,8690,760,4,1,1220,/997/1009/1000/760/142/,CCCCCC,,,f,1221,653835859,734881840,pallidothalamic pathway +102,578,nigrostriatal tract,nst,8,1,3,8690,760,4,1,1221,/997/1009/1000/760/102/,CCCCCC,,,f,1222,1908794680,734881840,nigrostriatal tract +109,579,nigrothalamic fibers,ntt,8,1,3,8690,760,4,1,1222,/997/1009/1000/760/109/,CCCCCC,,,f,1223,3579496032,734881840,nigrothalamic fibers +134,582,pallidotegmental fascicle,ptf,8,1,3,8690,760,4,1,1223,/997/1009/1000/760/134/,CCCCCC,,,f,1224,2146198276,734881840,pallidotegmental fascicle +309,604,striatonigral pathway,snp,8,1,3,8690,760,4,1,1224,/997/1009/1000/760/309/,CCCCCC,,,f,1225,4190731397,734881840,striatonigral pathway +317,605,subthalamic fascicle,stf,8,1,3,8690,760,4,1,1225,/997/1009/1000/760/317/,CCCCCC,,,f,1226,2911396376,734881840,subthalamic fascicle +877,675,tectospinal pathway,tsp,8,1,3,8690,1000,3,1,1226,/997/1009/1000/877/,CCCCCC,,,f,1227,1244119023,734881840,tectospinal pathway +1051,555,direct tectospinal pathway,tspd,9,1,3,8690,877,4,1,1227,/997/1009/1000/877/1051/,CCCCCC,,,f,1228,1709212737,734881840,direct tectospinal pathway +1060,556,doral tegmental decussation,dtd,9,1,3,8690,877,4,1,1228,/997/1009/1000/877/1060/,CCCCCC,,,f,1229,2067491806,734881840,doral tegmental decussation +1043,554,crossed tectospinal pathway,tspc,9,1,3,8690,877,4,1,1229,/997/1009/1000/877/1043/,CCCCCC,,,f,1230,3614935982,734881840,crossed tectospinal pathway +863,673,rubrospinal tract,rust,8,1,3,8690,1000,3,1,1230,/997/1009/1000/863/,CCCCCC,,,f,1231,3405101120,734881840,rubrospinal tract +397,615,ventral tegmental decussation,vtd,9,1,3,8690,863,4,1,1231,/997/1009/1000/863/397/,CCCCCC,,,f,1232,2482574838,734881840,ventral tegmental decussation +221,593,rubroreticular tract,rrt,9,1,3,8690,863,4,1,1232,/997/1009/1000/863/221/,CCCCCC,,,f,1233,1583476119,734881840,rubroreticular tract +736,657,central tegmental bundle,ctb,8,1,3,8690,1000,3,1,1233,/997/1009/1000/736/,CCCCCC,,,f,1234,3774459016,734881840,central tegmental bundle +855,672,retriculospinal tract,rst,8,1,3,8690,1000,3,1,1234,/997/1009/1000/855/,CCCCCC,,,f,1235,2997135223,734881840,retriculospinal tract +205,591,"retriculospinal tract, lateral part",rstl,9,1,3,8690,855,4,1,1235,/997/1009/1000/855/205/,CCCCCC,,,f,1236,4229476297,734881840,retriculospinal tract lateral part +213,592,"retriculospinal tract, medial part",rstm,9,1,3,8690,855,4,1,1236,/997/1009/1000/855/213/,CCCCCC,,,f,1237,3028938506,734881840,retriculospinal tract medial part +941,683,vestibulospinal pathway,vsp,8,1,3,8690,1000,3,1,1237,/997/1009/1000/941/,CCCCCC,,,f,1238,850039596,734881840,vestibulospinal pathway +991,689,medial forebrain bundle system,mfbs,2,1,3,8690,1009,2,1,1238,/997/1009/991/,CCCCCC,,,f,1239,2045370912,734881840,medial forebrain bundle system +768,661,cerebrum related,mfbc,7,1,3,8690,991,3,1,1239,/997/1009/991/768/,CCCCCC,,,f,1240,1315990495,734881840,cerebrum related +884,534,amygdalar capsule,amc,8,1,3,8690,768,4,1,1240,/997/1009/991/768/884/,CCCCCC,,,f,1241,4125640418,734881840,amygdalar capsule +892,535,ansa peduncularis,apd,8,1,3,8690,768,4,1,1241,/997/1009/991/768/892/,CCCCCC,,,f,1242,668804162,734881840,ansa peduncularis +908,537,"anterior commissure, temporal limb",act,8,1,3,8690,768,4,1,1242,/997/1009/991/768/908/,CCCCCC,,,f,1243,3387830123,734881840,anterior commissure temporal limb +940,541,cingulum bundle,cing,8,1,3,8690,768,4,1,1243,/997/1009/991/768/940/,CCCCCC,,,f,1244,1622445056,734881840,cingulum bundle +1099,561,fornix system,fxs,8,1,3,8690,768,4,1,1244,/997/1009/991/768/1099/,CCCCCC,,,f,1245,2860735463,734881840,fornix system +466,482,alveus,alv,9,1,3,8690,1099,5,1,1245,/997/1009/991/768/1099/466/,CCCCCC,,,f,1246,3047472302,734881840,alveus +530,490,dorsal fornix,df,9,1,3,8690,1099,5,1,1246,/997/1009/991/768/1099/530/,CCCCCC,,,f,1247,2407031315,734881840,dorsal fornix +603,499,fimbria,fi,9,1,3,8690,1099,5,1,1247,/997/1009/991/768/1099/603/,CCCCCC,,,f,1248,1937983833,734881840,fimbria +745,517,"precommissural fornix, general",fxprg,9,1,3,8690,1099,5,1,1248,/997/1009/991/768/1099/745/,CCCCCC,,,f,1249,3184126177,734881840,precommissural fornix general +420,476,precommissural fornix diagonal band,db,10,1,3,8690,745,6,1,1249,/997/1009/991/768/1099/745/420/,CCCCCC,,,f,1250,2942592889,734881840,precommissural fornix diagonal band +737,516,postcommissural fornix,fxpo,9,1,3,8690,1099,5,1,1250,/997/1009/991/768/1099/737/,CCCCCC,,,f,1251,267891942,734881840,postcommissural fornix +428,477,medial corticohypothalamic tract,mct,10,1,3,8690,737,6,1,1251,/997/1009/991/768/1099/737/428/,CCCCCC,,,f,1252,597319395,734881840,medial corticohypothalamic tract +436,478,columns of the fornix,fx,10,1,3,8690,737,6,1,1252,/997/1009/991/768/1099/737/436/,CCCCCC,,,f,1253,2234311931,734881840,columns of the fornix +618,501,hippocampal commissures,hc,9,1,3,8690,1099,5,1,1253,/997/1009/991/768/1099/618/,CCCCCC,,,f,1254,4236453345,734881840,hippocampal commissures +443,479,dorsal hippocampal commissure,dhc,10,1,3,8690,618,6,1,1254,/997/1009/991/768/1099/618/443/,CCCCCC,,,f,1255,1923336249,734881840,dorsal hippocampal commissure +449,480,ventral hippocampal commissure,vhc,10,1,3,8690,618,6,1,1255,/997/1009/991/768/1099/618/449/,CCCCCC,,,f,1256,1085412540,734881840,ventral hippocampal commissure +713,513,perforant path,per,9,1,3,8690,1099,5,1,1256,/997/1009/991/768/1099/713/,CCCCCC,,,f,1257,436991788,734881840,perforant path +474,483,angular path,ab,9,1,3,8690,1099,5,1,1257,/997/1009/991/768/1099/474/,CCCCCC,,,f,1258,1144121309,734881840,angular path +37,570,longitudinal association bundle,lab,8,1,3,8690,768,4,1,1258,/997/1009/991/768/37/,CCCCCC,,,f,1259,2214700383,734881840,longitudinal association bundle +301,603,stria terminalis,st,8,1,3,8690,768,4,1,1259,/997/1009/991/768/301/,CCCCCC,,,f,1260,2061919402,734881840,stria terminalis +484682528,,commissural branch of stria terminalis,stc,9,1,3,8690,301,5,1,1260,/997/1009/991/768/301/484682528/,CCCCCC,,,f,1261,2072512978,734881840,commissural branch of stria terminalis +824,668,hypothalamus related,mfsbshy,7,1,3,8690,991,3,1,1261,/997/1009/991/824/,CCCCCC,,,f,1262,2437385590,734881840,hypothalamus related +54,572,medial forebrain bundle,mfb,8,1,3,8690,824,4,1,1262,/997/1009/991/824/54/,CCCCCC,,,f,1263,4274696721,734881840,medial forebrain bundle +405,616,ventrolateral hypothalamic tract,vlt,8,1,3,8690,824,4,1,1263,/997/1009/991/824/405/,CCCCCC,,,f,1264,1856932850,734881840,ventrolateral hypothalamic tract +174,587,preoptic commissure,poc,8,1,3,8690,824,4,1,1264,/997/1009/991/824/174/,CCCCCC,,,f,1265,2036221800,734881840,preoptic commissure +349,609,supraoptic commissures,sup,8,1,3,8690,824,4,1,1265,/997/1009/991/824/349/,CCCCCC,,,f,1266,2214211240,734881840,supraoptic commissures +817,526,"supraoptic commissures, anterior",supa,9,1,3,8690,349,5,1,1266,/997/1009/991/824/349/817/,CCCCCC,,,f,1267,1403329227,734881840,supraoptic commissures anterior +825,527,"supraoptic commissures, dorsal",supd,9,1,3,8690,349,5,1,1267,/997/1009/991/824/349/825/,CCCCCC,,,f,1268,3242142431,734881840,supraoptic commissures dorsal +833,528,"supraoptic commissures, ventral",supv,9,1,3,8690,349,5,1,1268,/997/1009/991/824/349/833/,CCCCCC,,,f,1269,1115209038,734881840,supraoptic commissures ventral +166,586,premammillary commissure,pmx,8,1,3,8690,824,4,1,1269,/997/1009/991/824/166/,CCCCCC,,,f,1270,3539788693,734881840,premammillary commissure +341,608,supramammillary decussation,smd,8,1,3,8690,824,4,1,1270,/997/1009/991/824/341/,CCCCCC,,,f,1271,100905605,734881840,supramammillary decussation +182,588,propriohypothalamic pathways,php,8,1,3,8690,824,4,1,1271,/997/1009/991/824/182/,CCCCCC,,,f,1272,1784420150,734881840,propriohypothalamic pathways +762,519,"propriohypothalamic pathways, dorsal",phpd,9,1,3,8690,182,5,1,1272,/997/1009/991/824/182/762/,CCCCCC,,,f,1273,162338143,734881840,propriohypothalamic pathways dorsal +770,520,"propriohypothalamic pathways, lateral",phpl,9,1,3,8690,182,5,1,1273,/997/1009/991/824/182/770/,CCCCCC,,,f,1274,901943838,734881840,propriohypothalamic pathways lateral +779,521,"propriohypothalamic pathways, medial",phpm,9,1,3,8690,182,5,1,1274,/997/1009/991/824/182/779/,CCCCCC,,,f,1275,13726419,734881840,propriohypothalamic pathways medial +787,522,"propriohypothalamic pathways, ventral",phpv,9,1,3,8690,182,5,1,1275,/997/1009/991/824/182/787/,CCCCCC,,,f,1276,2936581201,734881840,propriohypothalamic pathways ventral +150,584,periventricular bundle of the hypothalamus,pvbh,8,1,3,8690,824,4,1,1276,/997/1009/991/824/150/,CCCCCC,,,f,1277,548763661,734881840,periventricular bundle of the hypothalamus +46,571,mammillary related,mfbsma,8,1,3,8690,824,4,1,1277,/997/1009/991/824/46/,CCCCCC,,,f,1278,2838641316,734881840,mammillary related +753,518,principal mammillary tract,pm,9,1,3,8690,46,5,1,1278,/997/1009/991/824/46/753/,CCCCCC,,,f,1279,856199296,734881840,principal mammillary tract +690,510,mammillothalamic tract,mtt,9,1,3,8690,46,5,1,1279,/997/1009/991/824/46/690/,CCCCCC,,,f,1280,1649345323,734881840,mammillothalamic tract +681,509,mammillotegmental tract,mtg,9,1,3,8690,46,5,1,1280,/997/1009/991/824/46/681/,CCCCCC,,,f,1281,1041591581,734881840,mammillotegmental tract +673,508,mammillary peduncle,mp,9,1,3,8690,46,5,1,1281,/997/1009/991/824/46/673/,CCCCCC,,,f,1282,4130265730,734881840,mammillary peduncle +1068,557,dorsal thalamus related,mfbst,8,1,3,8690,824,4,1,1282,/997/1009/991/824/1068/,CCCCCC,,,f,1283,3637129625,734881840,dorsal thalamus related +722,514,periventricular bundle of the thalamus,pvbt,9,1,3,8690,1068,5,1,1283,/997/1009/991/824/1068/722/,CCCCCC,,,f,1284,3496322953,734881840,periventricular bundle of the thalamus +1083,559,epithalamus related,mfbse,8,1,3,8690,824,4,1,1284,/997/1009/991/824/1083/,CCCCCC,,,f,1285,2734318942,734881840,epithalamus related +802,524,stria medullaris,sm,9,1,3,8690,1083,5,1,1285,/997/1009/991/824/1083/802/,CCCCCC,,,f,1286,1930258468,734881840,stria medullaris +595,498,fasciculus retroflexus,fr,9,1,3,8690,1083,5,1,1286,/997/1009/991/824/1083/595/,CCCCCC,,,f,1287,3233680072,734881840,fasciculus retroflexus +611,500,habenular commissure,hbc,9,1,3,8690,1083,5,1,1287,/997/1009/991/824/1083/611/,CCCCCC,,,f,1288,4058360785,734881840,habenular commissure +730,515,pineal stalk,PIS,9,1,3,8690,1083,5,1,1288,/997/1009/991/824/1083/730/,CCCCCC,,,f,1289,4197780532,734881840,pineal stalk +70,574,midbrain related,mfbsm,8,1,3,8690,824,4,1,1289,/997/1009/991/824/70/,CCCCCC,,,f,1290,4145502087,734881840,midbrain related +547,492,dorsal longitudinal fascicle,dlf,9,1,3,8690,70,5,1,1290,/997/1009/991/824/70/547/,CCCCCC,,,f,1291,3503738477,734881840,dorsal longitudinal fascicle +563,494,dorsal tegmental tract,dtt,9,1,3,8690,70,5,1,1291,/997/1009/991/824/70/563/,CCCCCC,,,f,1292,1985590940,734881840,dorsal tegmental tract +73,716,ventricular systems,VS,1,1,3,8690,997,1,1,1292,/997/73/,AAAAAA,,,f,1293,959784099,734881840,ventricular systems +81,717,lateral ventricle,VL,8,1,3,8690,73,2,1,1293,/997/73/81/,AAAAAA,,,f,1294,1797046580,734881840,lateral ventricle +89,718,rhinocele,RC,9,1,3,8690,81,3,1,1294,/997/73/81/89/,AAAAAA,,,f,1295,2684298025,734881840,rhinocele +98,719,subependymal zone,SEZ,9,1,3,8690,81,3,1,1295,/997/73/81/98/,AAAAAA,,,f,1296,1826888016,734881840,subependymal zone +108,720,choroid plexus,chpl,9,1,3,8690,81,3,1,1296,/997/73/81/108/,AAAAAA,,,f,1297,1492204019,734881840,choroid plexus +116,721,choroid fissure,chfl,9,1,3,8690,81,3,1,1297,/997/73/81/116/,AAAAAA,,,f,1298,3192898784,734881840,choroid fissure +124,722,interventricular foramen,IVF,8,1,3,8690,73,2,1,1298,/997/73/124/,AAAAAA,,,f,1299,1644273448,734881840,interventricular foramen +129,723,third ventricle,V3,8,1,3,8690,73,2,1,1299,/997/73/129/,AAAAAA,,,f,1300,562407244,734881840,third ventricle +140,724,cerebral aqueduct,AQ,8,1,3,8690,73,2,1,1300,/997/73/140/,AAAAAA,,,f,1301,3509002335,734881840,cerebral aqueduct +145,725,fourth ventricle,V4,8,1,3,8690,73,2,1,1301,/997/73/145/,AAAAAA,,,f,1302,2366263365,734881840,fourth ventricle +153,726,lateral recess,V4r,9,1,3,8690,145,3,1,1302,/997/73/145/153/,AAAAAA,,,f,1303,4006455201,734881840,lateral recess +164,727,"central canal, spinal cord/medulla",c,8,1,3,8690,73,2,1,1303,/997/73/164/,AAAAAA,,,f,1304,3758121442,734881840,central canal spinal cord/medulla +1024,693,grooves,grv,1,1,3,8690,997,1,1,1304,/997/1024/,AAAAAA,,,f,1305,1816833424,734881840,grooves +1032,694,grooves of the cerebral cortex,grv of CTX,7,1,3,8690,1024,2,1,1305,/997/1024/1032/,AAAAAA,,,f,1306,4010583074,734881840,grooves of the cerebral cortex +1055,697,endorhinal groove,eg,8,1,3,8690,1032,3,1,1306,/997/1024/1032/1055/,AAAAAA,,,f,1307,2757546022,734881840,endorhinal groove +1063,698,hippocampal fissure,hf,8,1,3,8690,1032,3,1,1307,/997/1024/1032/1063/,AAAAAA,,,f,1308,1845828307,734881840,hippocampal fissure +1071,699,rhinal fissure,rf,8,1,3,8690,1032,3,1,1308,/997/1024/1032/1071/,AAAAAA,,,f,1309,915997995,734881840,rhinal fissure +1078,700,rhinal incisure,ri,8,1,3,8690,1032,3,1,1309,/997/1024/1032/1078/,AAAAAA,,,f,1310,1408661066,734881840,rhinal incisure +1040,695,grooves of the cerebellar cortex,grv of CBX,7,1,3,8690,1024,2,1,1310,/997/1024/1040/,AAAAAA,,,f,1311,306524468,734881840,grooves of the cerebellar cortex +1087,701,precentral fissure,pce,8,1,3,8690,1040,3,1,1311,/997/1024/1040/1087/,AAAAAA,,,f,1312,2084828473,734881840,precentral fissure +1095,702,preculminate fissure,pcf,8,1,3,8690,1040,3,1,1312,/997/1024/1040/1095/,AAAAAA,,,f,1313,3439430666,734881840,preculminate fissure +1103,703,primary fissure,pri,8,1,3,8690,1040,3,1,1313,/997/1024/1040/1103/,AAAAAA,,,f,1314,1359711822,734881840,primary fissure +1112,704,posterior superior fissure,psf,8,1,3,8690,1040,3,1,1314,/997/1024/1040/1112/,AAAAAA,,,f,1315,706594763,734881840,posterior superior fissure +1119,705,prepyramidal fissure,ppf,8,1,3,8690,1040,3,1,1315,/997/1024/1040/1119/,AAAAAA,,,f,1316,90069120,734881840,prepyramidal fissure +3,707,secondary fissure,sec,8,1,3,8690,1040,3,1,1316,/997/1024/1040/3/,AAAAAA,,,f,1317,1603026106,734881840,secondary fissure +11,708,posterolateral fissure,plf,8,1,3,8690,1040,3,1,1317,/997/1024/1040/11/,AAAAAA,,,f,1318,3968698314,734881840,posterolateral fissure +18,709,nodular fissure,nf,8,1,3,8690,1040,3,1,1318,/997/1024/1040/18/,AAAAAA,,,f,1319,3778172686,734881840,nodular fissure +25,710,simple fissure,sif,8,1,3,8690,1040,3,1,1319,/997/1024/1040/25/,AAAAAA,,,f,1320,3504067713,734881840,simple fissure +34,711,intercrural fissure,icf,8,1,3,8690,1040,3,1,1320,/997/1024/1040/34/,AAAAAA,,,f,1321,1415991612,734881840,intercrural fissure +43,712,ansoparamedian fissure,apf,8,1,3,8690,1040,3,1,1321,/997/1024/1040/43/,AAAAAA,,,f,1322,2452402730,734881840,ansoparamedian fissure +49,713,intraparafloccular fissure,ipf,8,1,3,8690,1040,3,1,1322,/997/1024/1040/49/,AAAAAA,,,f,1323,2654107150,734881840,intraparafloccular fissure +57,714,paramedian sulcus,pms,8,1,3,8690,1040,3,1,1323,/997/1024/1040/57/,AAAAAA,,,f,1324,3972977495,734881840,paramedian sulcus +65,715,parafloccular sulcus,pfs,8,1,3,8690,1040,3,1,1324,/997/1024/1040/65/,AAAAAA,,,f,1325,771629690,734881840,parafloccular sulcus +624,926,Interpeduncular fossa,IPF,7,1,3,8690,1024,2,1,1325,/997/1024/624/,AAAAAA,,,f,1326,1476705011,734881840,Interpeduncular fossa +304325711,,retina,retina,1,1,3,8690,997,1,1,1326,/997/304325711/,7F2E7E,,,f,1327,3295290839,734881840,retina diff --git a/src/tutorials/domain/calcium-imaging/calcium-imaging.ipynb b/src/tutorials/domain/calcium-imaging/calcium-imaging.ipynb new file mode 100644 index 00000000..9ea31039 --- /dev/null +++ b/src/tutorials/domain/calcium-imaging/calcium-imaging.ipynb @@ -0,0 +1,1728 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Calcium Imaging Pipeline\n", + "\n", + "This tutorial builds a complete calcium imaging analysis pipeline using DataJoint. You'll learn to:\n", + "\n", + "- **Import** raw imaging data from TIFF files\n", + "- **Segment** cells using parameterized detection\n", + "- **Extract** fluorescence traces from detected ROIs\n", + "- Use **Lookup tables** for analysis parameters\n", + "- Use **Part tables** for one-to-many results\n", + "\n", + "## The Pipeline\n", + "\n", + "\"Calcium\n", + "\n", + "**Legend:** Green = Manual, Gray = Lookup, Blue = Imported, Red = Computed, White = Part\n", + "\n", + "Each scan produces a TIFF movie. We compute an average frame, segment cells using threshold-based detection, and extract fluorescence traces for each detected ROI." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setup" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:48.986361Z", + "iopub.status.busy": "2026-01-14T07:34:48.986238Z", + "iopub.status.idle": "2026-01-14T07:34:50.132550Z", + "shell.execute_reply": "2026-01-14T07:34:50.132259Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2026-01-14 01:34:50,124][INFO]: DataJoint 2.0.0a22 connected to root@127.0.0.1:3306\n" + ] + } + ], + "source": [ + "import datajoint as dj\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from pathlib import Path\n", + "from skimage import io\n", + "from scipy import ndimage\n", + "\n", + "schema = dj.Schema('tutorial_calcium_imaging')\n", + "\n", + "# Data directory (relative to this notebook)\n", + "DATA_DIR = Path('./data')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Manual Tables: Experiment Metadata\n", + "\n", + "We start with tables for subjects, sessions, and scan metadata. These are **Manual tables** - data entered by experimenters or recording systems." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:50.151008Z", + "iopub.status.busy": "2026-01-14T07:34:50.150698Z", + "iopub.status.idle": "2026-01-14T07:34:50.219681Z", + "shell.execute_reply": "2026-01-14T07:34:50.219348Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class Mouse(dj.Manual):\n", + " definition = \"\"\"\n", + " mouse_id : int32\n", + " ---\n", + " dob : date\n", + " sex : enum('M', 'F', 'unknown')\n", + " \"\"\"\n", + "\n", + "\n", + "@schema\n", + "class Session(dj.Manual):\n", + " definition = \"\"\"\n", + " -> Mouse\n", + " session_date : date\n", + " ---\n", + " experimenter : varchar(100)\n", + " \"\"\"\n", + "\n", + "\n", + "@schema\n", + "class Scan(dj.Manual):\n", + " definition = \"\"\"\n", + " -> Session\n", + " scan_idx : int16\n", + " ---\n", + " depth : float32 # imaging depth (um)\n", + " wavelength : float32 # laser wavelength (nm)\n", + " laser_power : float32 # laser power (mW)\n", + " fps : float32 # frames per second\n", + " file_name : varchar(128) # TIFF filename\n", + " \"\"\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Insert Sample Data" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:50.221516Z", + "iopub.status.busy": "2026-01-14T07:34:50.221390Z", + "iopub.status.idle": "2026-01-14T07:34:50.239729Z", + "shell.execute_reply": "2026-01-14T07:34:50.239313Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

mouse_id

\n", + " \n", + "
\n", + "

session_date

\n", + " \n", + "
\n", + "

scan_idx

\n", + " \n", + "
\n", + "

depth

\n", + " imaging depth (um)\n", + "
\n", + "

wavelength

\n", + " laser wavelength (nm)\n", + "
\n", + "

laser_power

\n", + " laser power (mW)\n", + "
\n", + "

fps

\n", + " frames per second\n", + "
\n", + "

file_name

\n", + " TIFF filename\n", + "
02017-05-151150.0920.026.015.0example_scan_01.tif
02017-05-152200.0920.024.015.0example_scan_02.tif
02017-05-153250.0920.025.015.0example_scan_03.tif
\n", + " \n", + "

Total: 3

\n", + " " + ], + "text/plain": [ + "*mouse_id *session_date *scan_idx depth wavelength laser_power fps file_name \n", + "+----------+ +------------+ +----------+ +-------+ +------------+ +------------+ +------+ +------------+\n", + "0 2017-05-15 1 150.0 920.0 26.0 15.0 example_scan_0\n", + "0 2017-05-15 2 200.0 920.0 24.0 15.0 example_scan_0\n", + "0 2017-05-15 3 250.0 920.0 25.0 15.0 example_scan_0\n", + " (Total: 3)" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Insert mouse\n", + "Mouse.insert1(\n", + " {'mouse_id': 0, 'dob': '2017-03-01', 'sex': 'M'},\n", + " skip_duplicates=True\n", + ")\n", + "\n", + "# Insert session\n", + "Session.insert1(\n", + " {'mouse_id': 0, 'session_date': '2017-05-15', 'experimenter': 'Alice'},\n", + " skip_duplicates=True\n", + ")\n", + "\n", + "# Insert scans (we have 3 TIFF files)\n", + "Scan.insert([\n", + " {'mouse_id': 0, 'session_date': '2017-05-15', 'scan_idx': 1,\n", + " 'depth': 150, 'wavelength': 920, 'laser_power': 26, 'fps': 15,\n", + " 'file_name': 'example_scan_01.tif'},\n", + " {'mouse_id': 0, 'session_date': '2017-05-15', 'scan_idx': 2,\n", + " 'depth': 200, 'wavelength': 920, 'laser_power': 24, 'fps': 15,\n", + " 'file_name': 'example_scan_02.tif'},\n", + " {'mouse_id': 0, 'session_date': '2017-05-15', 'scan_idx': 3,\n", + " 'depth': 250, 'wavelength': 920, 'laser_power': 25, 'fps': 15,\n", + " 'file_name': 'example_scan_03.tif'},\n", + "], skip_duplicates=True)\n", + "\n", + "Scan()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Imported Table: Average Frame\n", + "\n", + "An **Imported table** pulls data from external files. Here we load each TIFF movie and compute the average frame across all time points.\n", + "\n", + "The `make()` method defines how to compute one entry. DataJoint's `populate()` calls it for each pending entry." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:50.241335Z", + "iopub.status.busy": "2026-01-14T07:34:50.241216Z", + "iopub.status.idle": "2026-01-14T07:34:50.264896Z", + "shell.execute_reply": "2026-01-14T07:34:50.264465Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class AverageFrame(dj.Imported):\n", + " definition = \"\"\"\n", + " -> Scan\n", + " ---\n", + " average_frame : # mean fluorescence across frames\n", + " \"\"\"\n", + "\n", + " def make(self, key):\n", + " # Get filename from Scan table\n", + " file_name = (Scan & key).fetch1('file_name')\n", + " file_path = DATA_DIR / file_name\n", + " \n", + " # Load TIFF and compute average\n", + " movie = io.imread(file_path)\n", + " avg_frame = movie.mean(axis=0)\n", + " \n", + " # Insert result\n", + " self.insert1({**key, 'average_frame': avg_frame})\n", + " print(f\"Processed {file_name}: {movie.shape[0]} frames\")" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:50.266471Z", + "iopub.status.busy": "2026-01-14T07:34:50.266371Z", + "iopub.status.idle": "2026-01-14T07:34:50.375373Z", + "shell.execute_reply": "2026-01-14T07:34:50.374986Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + "AverageFrame: 0%| | 0/3 [00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Visualize average frames\n", + "fig, axes = plt.subplots(1, 3, figsize=(12, 4))\n", + "for ax, key in zip(axes, AverageFrame.keys()):\n", + " avg = (AverageFrame & key).fetch1('average_frame')\n", + " ax.imshow(avg, cmap='gray')\n", + " ax.set_title(f\"Scan {key['scan_idx']}\")\n", + " ax.axis('off')\n", + "plt.tight_layout()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Lookup Table: Segmentation Parameters\n", + "\n", + "A **Lookup table** stores parameter sets that don't change often. This lets us run the same analysis with different parameters and compare results.\n", + "\n", + "Our cell segmentation has two parameters:\n", + "- `threshold`: intensity threshold for detecting bright regions\n", + "- `min_size`: minimum blob size (filters out noise)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:50.537083Z", + "iopub.status.busy": "2026-01-14T07:34:50.536982Z", + "iopub.status.idle": "2026-01-14T07:34:50.569135Z", + "shell.execute_reply": "2026-01-14T07:34:50.568863Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

seg_param_id

\n", + " \n", + "
\n", + "

threshold

\n", + " intensity threshold\n", + "
\n", + "

min_size

\n", + " minimum blob size (pixels)\n", + "
150.050
260.050
\n", + " \n", + "

Total: 2

\n", + " " + ], + "text/plain": [ + "*seg_param_id threshold min_size \n", + "+------------+ +-----------+ +----------+\n", + "1 50.0 50 \n", + "2 60.0 50 \n", + " (Total: 2)" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "@schema\n", + "class SegmentationParam(dj.Lookup):\n", + " definition = \"\"\"\n", + " seg_param_id : int16\n", + " ---\n", + " threshold : float32 # intensity threshold\n", + " min_size : int32 # minimum blob size (pixels)\n", + " \"\"\"\n", + " \n", + " # Pre-populate with parameter sets to try\n", + " contents = [\n", + " {'seg_param_id': 1, 'threshold': 50.0, 'min_size': 50},\n", + " {'seg_param_id': 2, 'threshold': 60.0, 'min_size': 50},\n", + " ]\n", + "\n", + "SegmentationParam()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Computed Table with Part Table: Segmentation\n", + "\n", + "A **Computed table** derives data from other DataJoint tables. Here, `Segmentation` depends on both `AverageFrame` and `SegmentationParam` - DataJoint will compute all combinations.\n", + "\n", + "Since each segmentation produces multiple ROIs, we use a **Part table** (`Roi`) to store the individual masks. The master table stores summary info; part tables store detailed results." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:50.570679Z", + "iopub.status.busy": "2026-01-14T07:34:50.570547Z", + "iopub.status.idle": "2026-01-14T07:34:50.620789Z", + "shell.execute_reply": "2026-01-14T07:34:50.620452Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class Segmentation(dj.Computed):\n", + " definition = \"\"\"\n", + " -> AverageFrame\n", + " -> SegmentationParam\n", + " ---\n", + " num_rois : int16 # number of detected ROIs\n", + " segmented_mask : # labeled mask image\n", + " \"\"\"\n", + "\n", + " class Roi(dj.Part):\n", + " definition = \"\"\"\n", + " -> master\n", + " roi_idx : int16\n", + " ---\n", + " mask : # binary mask for this ROI\n", + " center_x : float32 # ROI center x coordinate\n", + " center_y : float32 # ROI center y coordinate\n", + " \"\"\"\n", + "\n", + " def make(self, key):\n", + " # Fetch inputs\n", + " avg_frame = (AverageFrame & key).fetch1('average_frame')\n", + " threshold, min_size = (SegmentationParam & key).fetch1('threshold', 'min_size')\n", + " \n", + " # Threshold to get binary mask\n", + " binary_mask = avg_frame > threshold\n", + " \n", + " # Label connected components\n", + " labeled, num_labels = ndimage.label(binary_mask)\n", + " \n", + " # Filter by size and extract ROIs\n", + " roi_masks = []\n", + " for i in range(1, num_labels + 1): # 0 is background\n", + " roi_mask = (labeled == i)\n", + " if roi_mask.sum() >= min_size:\n", + " roi_masks.append(roi_mask)\n", + " \n", + " # Re-label the filtered mask\n", + " final_mask = np.zeros_like(labeled)\n", + " for i, mask in enumerate(roi_masks, 1):\n", + " final_mask[mask] = i\n", + " \n", + " # Insert master entry\n", + " self.insert1({\n", + " **key,\n", + " 'num_rois': len(roi_masks),\n", + " 'segmented_mask': final_mask\n", + " })\n", + " \n", + " # Insert part entries (one per ROI)\n", + " for roi_idx, mask in enumerate(roi_masks):\n", + " # Compute center of mass\n", + " cy, cx = ndimage.center_of_mass(mask)\n", + " self.Roi.insert1({\n", + " **key,\n", + " 'roi_idx': roi_idx,\n", + " 'mask': mask,\n", + " 'center_x': cx,\n", + " 'center_y': cy\n", + " })\n", + " \n", + " print(f\"Scan {key['scan_idx']}, params {key['seg_param_id']}: {len(roi_masks)} ROIs\")" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:50.622637Z", + "iopub.status.busy": "2026-01-14T07:34:50.622513Z", + "iopub.status.idle": "2026-01-14T07:34:50.696343Z", + "shell.execute_reply": "2026-01-14T07:34:50.696110Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + "Segmentation: 0%| | 0/6 [00:00\n", + " .Table{\n", + " border-collapse:collapse;\n", + " }\n", + " .Table th{\n", + " background: #A0A0A0; color: #ffffff; padding:2px 4px; border:#f0e0e0 1px solid;\n", + " font-weight: normal; font-family: monospace; font-size: 75%; text-align: center;\n", + " }\n", + " .Table th p{\n", + " margin: 0;\n", + " }\n", + " .Table td{\n", + " padding:2px 4px; border:#f0e0e0 1px solid; font-size: 75%;\n", + " }\n", + " .Table tr:nth-child(odd){\n", + " background: #ffffff;\n", + " color: #000000;\n", + " }\n", + " .Table tr:nth-child(even){\n", + " background: #f3f1ff;\n", + " color: #000000;\n", + " }\n", + " /* Tooltip container */\n", + " .djtooltip {\n", + " }\n", + " /* Tooltip text */\n", + " .djtooltip .djtooltiptext {\n", + " visibility: hidden;\n", + " width: 120px;\n", + " background-color: black;\n", + " color: #fff;\n", + " text-align: center;\n", + " padding: 5px 0;\n", + " border-radius: 6px;\n", + " /* Position the tooltip text - see examples below! */\n", + " position: absolute;\n", + " z-index: 1;\n", + " }\n", + " #primary {\n", + " font-weight: bold;\n", + " color: black;\n", + " }\n", + " #nonprimary {\n", + " font-weight: normal;\n", + " color: white;\n", + " }\n", + "\n", + " /* Show the tooltip text when you mouse over the tooltip container */\n", + " .djtooltip:hover .djtooltiptext {\n", + " visibility: visible;\n", + " }\n", + "\n", + " /* Dark mode support */\n", + " @media (prefers-color-scheme: dark) {\n", + " .Table th{\n", + " background: #4a4a4a; color: #ffffff; border:#555555 1px solid; text-align: center;\n", + " }\n", + " .Table td{\n", + " border:#555555 1px solid;\n", + " }\n", + " .Table tr:nth-child(odd){\n", + " background: #2d2d2d;\n", + " color: #e0e0e0;\n", + " }\n", + " .Table tr:nth-child(even){\n", + " background: #3d3d3d;\n", + " color: #e0e0e0;\n", + " }\n", + " .djtooltip .djtooltiptext {\n", + " background-color: #555555;\n", + " color: #ffffff;\n", + " }\n", + " #primary {\n", + " color: #bd93f9;\n", + " }\n", + " #nonprimary {\n", + " color: #e0e0e0;\n", + " }\n", + " }\n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

mouse_id

\n", + " \n", + "
\n", + "

session_date

\n", + " \n", + "
\n", + "

scan_idx

\n", + " \n", + "
\n", + "

seg_param_id

\n", + " \n", + "
\n", + "

num_rois

\n", + " number of detected ROIs\n", + "
\n", + "

segmented_mask

\n", + " labeled mask image\n", + "
02017-05-15116<blob>
02017-05-15123<blob>
02017-05-15216<blob>
02017-05-15222<blob>
02017-05-15319<blob>
02017-05-15323<blob>
\n", + " \n", + "

Total: 6

\n", + " " + ], + "text/plain": [ + "*mouse_id *session_date *scan_idx *seg_param_id num_rois segmented_\n", + "+----------+ +------------+ +----------+ +------------+ +----------+ +--------+\n", + "0 2017-05-15 1 1 6 \n", + "0 2017-05-15 1 2 3 \n", + "0 2017-05-15 2 1 6 \n", + "0 2017-05-15 2 2 2 \n", + "0 2017-05-15 3 1 9 \n", + "0 2017-05-15 3 2 3 \n", + " (Total: 6)" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# View results summary\n", + "Segmentation()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:50.704825Z", + "iopub.status.busy": "2026-01-14T07:34:50.704581Z", + "iopub.status.idle": "2026-01-14T07:34:50.709877Z", + "shell.execute_reply": "2026-01-14T07:34:50.709637Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

mouse_id

\n", + " \n", + "
\n", + "

session_date

\n", + " \n", + "
\n", + "

scan_idx

\n", + " \n", + "
\n", + "

seg_param_id

\n", + " \n", + "
\n", + "

roi_idx

\n", + " \n", + "
\n", + "

mask

\n", + " binary mask for this ROI\n", + "
\n", + "

center_x

\n", + " ROI center x coordinate\n", + "
\n", + "

center_y

\n", + " ROI center y coordinate\n", + "
02017-05-15110<blob>109.9552.26816
02017-05-15111<blob>62.761545.2899
02017-05-15112<blob>1.6376854.7246
02017-05-15113<blob>108.04581.2955
02017-05-15114<blob>123.355100.0
02017-05-15115<blob>75.531110.158
02017-05-15120<blob>109.3151.58065
02017-05-15121<blob>62.824746.2311
02017-05-15122<blob>74.8566110.279
02017-05-15210<blob>85.93886.0068
02017-05-15211<blob>113.81612.7603
02017-05-15212<blob>70.368370.0539
\n", + "

...

\n", + "

Total: 29

\n", + " " + ], + "text/plain": [ + "*mouse_id *session_date *scan_idx *seg_param_id *roi_idx mask center_x center_y \n", + "+----------+ +------------+ +----------+ +------------+ +---------+ +--------+ +----------+ +----------+\n", + "0 2017-05-15 1 1 0 109.955 2.26816 \n", + "0 2017-05-15 1 1 1 62.7615 45.2899 \n", + "0 2017-05-15 1 1 2 1.63768 54.7246 \n", + "0 2017-05-15 1 1 3 108.045 81.2955 \n", + "0 2017-05-15 1 1 4 123.355 100.0 \n", + "0 2017-05-15 1 1 5 75.531 110.158 \n", + "0 2017-05-15 1 2 0 109.315 1.58065 \n", + "0 2017-05-15 1 2 1 62.8247 46.2311 \n", + "0 2017-05-15 1 2 2 74.8566 110.279 \n", + "0 2017-05-15 2 1 0 85.9388 6.0068 \n", + "0 2017-05-15 2 1 1 113.816 12.7603 \n", + "0 2017-05-15 2 1 2 70.3683 70.0539 \n", + " ...\n", + " (Total: 29)" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# View individual ROIs\n", + "Segmentation.Roi()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Visualize Segmentation Results" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:50.711238Z", + "iopub.status.busy": "2026-01-14T07:34:50.711154Z", + "iopub.status.idle": "2026-01-14T07:34:50.918830Z", + "shell.execute_reply": "2026-01-14T07:34:50.918488Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Compare segmentation with different parameters for scan 1\n", + "fig, axes = plt.subplots(1, 3, figsize=(12, 4))\n", + "\n", + "key = {'mouse_id': 0, 'session_date': '2017-05-15', 'scan_idx': 1}\n", + "avg_frame = (AverageFrame & key).fetch1('average_frame')\n", + "\n", + "axes[0].imshow(avg_frame, cmap='gray')\n", + "axes[0].set_title('Average Frame')\n", + "axes[0].axis('off')\n", + "\n", + "for ax, param_id in zip(axes[1:], [1, 2]):\n", + " seg_key = {**key, 'seg_param_id': param_id}\n", + " mask, num_rois = (Segmentation & seg_key).fetch1('segmented_mask', 'num_rois')\n", + " threshold = (SegmentationParam & {'seg_param_id': param_id}).fetch1('threshold')\n", + " \n", + " ax.imshow(avg_frame, cmap='gray')\n", + " ax.imshow(mask, cmap='tab10', alpha=0.5 * (mask > 0))\n", + " ax.set_title(f'Threshold={threshold}: {num_rois} ROIs')\n", + " ax.axis('off')\n", + "\n", + "plt.tight_layout()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Fluorescence Trace Extraction\n", + "\n", + "Now we extract the fluorescence time series for each ROI. This requires going back to the raw TIFF movie, so we use an **Imported table**.\n", + "\n", + "The master table (`Fluorescence`) stores shared time axis; the part table (`Trace`) stores each ROI's trace." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:50.921011Z", + "iopub.status.busy": "2026-01-14T07:34:50.920891Z", + "iopub.status.idle": "2026-01-14T07:34:50.965518Z", + "shell.execute_reply": "2026-01-14T07:34:50.965177Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class Fluorescence(dj.Imported):\n", + " definition = \"\"\"\n", + " -> Segmentation\n", + " ---\n", + " timestamps : # time for each frame (seconds)\n", + " \"\"\"\n", + "\n", + " class Trace(dj.Part):\n", + " definition = \"\"\"\n", + " -> master\n", + " -> Segmentation.Roi\n", + " ---\n", + " trace : # fluorescence trace (mean within ROI mask)\n", + " \"\"\"\n", + "\n", + " def make(self, key):\n", + " # Get scan info and load movie\n", + " file_name, fps = (Scan & key).fetch1('file_name', 'fps')\n", + " movie = io.imread(DATA_DIR / file_name)\n", + " n_frames = movie.shape[0]\n", + " \n", + " # Create time axis\n", + " timestamps = np.arange(n_frames) / fps\n", + " \n", + " # Insert master entry\n", + " self.insert1({**key, 'timestamps': timestamps})\n", + " \n", + " # Extract trace for each ROI\n", + " for roi_key in (Segmentation.Roi & key).keys():\n", + " mask = (Segmentation.Roi & roi_key).fetch1('mask')\n", + " \n", + " # Compute mean fluorescence within mask for each frame\n", + " trace = np.array([frame[mask].mean() for frame in movie])\n", + " \n", + " self.Trace.insert1({**roi_key, 'trace': trace})\n", + " \n", + " n_rois = len(Segmentation.Roi & key)\n", + " print(f\"Extracted {n_rois} traces from {file_name}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:50.967162Z", + "iopub.status.busy": "2026-01-14T07:34:50.967037Z", + "iopub.status.idle": "2026-01-14T07:34:51.090369Z", + "shell.execute_reply": "2026-01-14T07:34:51.090094Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + "Fluorescence: 0%| | 0/6 [00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Plot traces for one segmentation result\n", + "key = {'mouse_id': 0, 'session_date': '2017-05-15', 'scan_idx': 1, 'seg_param_id': 2}\n", + "\n", + "timestamps = (Fluorescence & key).fetch1('timestamps')\n", + "traces = (Fluorescence.Trace & key).to_arrays('trace')\n", + "\n", + "plt.figure(figsize=(12, 4))\n", + "for i, trace in enumerate(traces):\n", + " plt.plot(timestamps, trace + i * 20, label=f'ROI {i}') # offset for visibility\n", + "\n", + "plt.xlabel('Time (s)')\n", + "plt.ylabel('Fluorescence (offset)')\n", + "plt.title('Fluorescence Traces')\n", + "plt.legend()\n", + "plt.tight_layout()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Pipeline Diagram" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:51.174130Z", + "iopub.status.busy": "2026-01-14T07:34:51.174022Z", + "iopub.status.idle": "2026-01-14T07:34:51.321486Z", + "shell.execute_reply": "2026-01-14T07:34:51.321069Z" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "SegmentationParam\n", + "\n", + "\n", + "SegmentationParam\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Segmentation\n", + "\n", + "\n", + "Segmentation\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "SegmentationParam->Segmentation\n", + "\n", + "\n", + "\n", + "\n", + "Segmentation.Roi\n", + "\n", + "\n", + "Segmentation.Roi\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Segmentation->Segmentation.Roi\n", + "\n", + "\n", + "\n", + "\n", + "Fluorescence\n", + "\n", + "\n", + "Fluorescence\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Segmentation->Fluorescence\n", + "\n", + "\n", + "\n", + "\n", + "Fluorescence.Trace\n", + "\n", + "\n", + "Fluorescence.Trace\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Segmentation.Roi->Fluorescence.Trace\n", + "\n", + "\n", + "\n", + "\n", + "AverageFrame\n", + "\n", + "\n", + "AverageFrame\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "AverageFrame->Segmentation\n", + "\n", + "\n", + "\n", + "\n", + "Fluorescence->Fluorescence.Trace\n", + "\n", + "\n", + "\n", + "\n", + "Mouse\n", + "\n", + "\n", + "Mouse\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Session\n", + "\n", + "\n", + "Session\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Mouse->Session\n", + "\n", + "\n", + "\n", + "\n", + "Scan\n", + "\n", + "\n", + "Scan\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Scan->AverageFrame\n", + "\n", + "\n", + "\n", + "\n", + "Session->Scan\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dj.Diagram(schema)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Legend:**\n", + "- **Green rectangles**: Manual tables (user-entered data)\n", + "- **Gray rectangles**: Lookup tables (parameters)\n", + "- **Blue ovals**: Imported tables (data from files)\n", + "- **Red ovals**: Computed tables (derived from other tables)\n", + "- **Plain text**: Part tables (detailed results)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "This pipeline demonstrates key DataJoint patterns for imaging analysis:\n", + "\n", + "| Concept | Example | Purpose |\n", + "|---------|---------|--------|\n", + "| **Manual tables** | `Mouse`, `Session`, `Scan` | Store experiment metadata |\n", + "| **Imported tables** | `AverageFrame`, `Fluorescence` | Load data from external files |\n", + "| **Computed tables** | `Segmentation` | Derive data from other tables |\n", + "| **Lookup tables** | `SegmentationParam` | Store analysis parameters |\n", + "| **Part tables** | `Roi`, `Trace` | Store one-to-many results |\n", + "| **`populate()`** | Auto-compute missing entries | Automatic pipeline execution |\n", + "\n", + "### Key Benefits\n", + "\n", + "1. **Parameter tracking**: Different segmentation parameters stored alongside results\n", + "2. **Reproducibility**: Re-run `populate()` to recompute after changes\n", + "3. **Data integrity**: Foreign keys ensure consistent relationships\n", + "4. **Provenance**: Clear lineage from raw data to final traces" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:51.323159Z", + "iopub.status.busy": "2026-01-14T07:34:51.323011Z", + "iopub.status.idle": "2026-01-14T07:34:51.359817Z", + "shell.execute_reply": "2026-01-14T07:34:51.359440Z" + } + }, + "outputs": [], + "source": [ + "# Cleanup: drop schema for re-running\n", + "schema.drop(prompt=False)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/src/tutorials/domain/calcium-imaging/data/example_scan_01.tif b/src/tutorials/domain/calcium-imaging/data/example_scan_01.tif new file mode 100644 index 00000000..cc6b6184 Binary files /dev/null and b/src/tutorials/domain/calcium-imaging/data/example_scan_01.tif differ diff --git a/src/tutorials/domain/calcium-imaging/data/example_scan_02.tif b/src/tutorials/domain/calcium-imaging/data/example_scan_02.tif new file mode 100644 index 00000000..c42052fa Binary files /dev/null and b/src/tutorials/domain/calcium-imaging/data/example_scan_02.tif differ diff --git a/src/tutorials/domain/calcium-imaging/data/example_scan_03.tif b/src/tutorials/domain/calcium-imaging/data/example_scan_03.tif new file mode 100644 index 00000000..0e7bbbdf Binary files /dev/null and b/src/tutorials/domain/calcium-imaging/data/example_scan_03.tif differ diff --git a/src/tutorials/domain/electrophysiology/data/data_0_2017-05-15.npy b/src/tutorials/domain/electrophysiology/data/data_0_2017-05-15.npy new file mode 100644 index 00000000..93c93d90 Binary files /dev/null and b/src/tutorials/domain/electrophysiology/data/data_0_2017-05-15.npy differ diff --git a/src/tutorials/domain/electrophysiology/data/data_0_2017-05-19.npy b/src/tutorials/domain/electrophysiology/data/data_0_2017-05-19.npy new file mode 100644 index 00000000..d742d20b Binary files /dev/null and b/src/tutorials/domain/electrophysiology/data/data_0_2017-05-19.npy differ diff --git a/src/tutorials/domain/electrophysiology/data/data_100_2017-05-25.npy b/src/tutorials/domain/electrophysiology/data/data_100_2017-05-25.npy new file mode 100644 index 00000000..c6d8b338 Binary files /dev/null and b/src/tutorials/domain/electrophysiology/data/data_100_2017-05-25.npy differ diff --git a/src/tutorials/domain/electrophysiology/data/data_100_2017-06-01.npy b/src/tutorials/domain/electrophysiology/data/data_100_2017-06-01.npy new file mode 100644 index 00000000..57889245 Binary files /dev/null and b/src/tutorials/domain/electrophysiology/data/data_100_2017-06-01.npy differ diff --git a/src/tutorials/domain/electrophysiology/data/data_5_2017-01-05.npy b/src/tutorials/domain/electrophysiology/data/data_5_2017-01-05.npy new file mode 100644 index 00000000..f80e3be1 Binary files /dev/null and b/src/tutorials/domain/electrophysiology/data/data_5_2017-01-05.npy differ diff --git a/src/tutorials/domain/electrophysiology/electrophysiology.ipynb b/src/tutorials/domain/electrophysiology/electrophysiology.ipynb new file mode 100644 index 00000000..e912d001 --- /dev/null +++ b/src/tutorials/domain/electrophysiology/electrophysiology.ipynb @@ -0,0 +1,1960 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Electrophysiology Pipeline\n", + "\n", + "This tutorial builds an electrophysiology analysis pipeline using DataJoint. You'll learn to:\n", + "\n", + "- **Import** neural recordings from data files\n", + "- **Compute** activity statistics\n", + "- **Detect spikes** using parameterized thresholds\n", + "- **Extract waveforms** using Part tables\n", + "\n", + "## The Pipeline\n", + "\n", + "\"Electrophysiology\n", + "\n", + "**Legend:** Green = Manual, Gray = Lookup, Blue = Imported, Red = Computed, White = Part\n", + "\n", + "Each session records from neurons. We compute statistics, detect spikes with configurable thresholds, and extract spike waveforms." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setup" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:35.068430Z", + "iopub.status.busy": "2026-01-14T07:34:35.068320Z", + "iopub.status.idle": "2026-01-14T07:34:36.006024Z", + "shell.execute_reply": "2026-01-14T07:34:36.005704Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2026-01-14 01:34:35,997][INFO]: DataJoint 2.0.0a22 connected to root@127.0.0.1:3306\n" + ] + } + ], + "source": [ + "import datajoint as dj\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from pathlib import Path\n", + "\n", + "schema = dj.Schema('tutorial_electrophysiology')\n", + "\n", + "# Data directory (relative to this notebook)\n", + "DATA_DIR = Path('./data')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Manual Tables: Experiment Metadata" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:36.023448Z", + "iopub.status.busy": "2026-01-14T07:34:36.023173Z", + "iopub.status.idle": "2026-01-14T07:34:36.067723Z", + "shell.execute_reply": "2026-01-14T07:34:36.067304Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class Mouse(dj.Manual):\n", + " definition = \"\"\"\n", + " mouse_id : int32\n", + " ---\n", + " dob : date\n", + " sex : enum('M', 'F', 'unknown')\n", + " \"\"\"\n", + "\n", + "\n", + "@schema\n", + "class Session(dj.Manual):\n", + " definition = \"\"\"\n", + " -> Mouse\n", + " session_date : date\n", + " ---\n", + " experimenter : varchar(100)\n", + " \"\"\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Insert Sample Data\n", + "\n", + "Our data files follow the naming convention `data_{mouse_id}_{session_date}.npy`." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:36.069504Z", + "iopub.status.busy": "2026-01-14T07:34:36.069372Z", + "iopub.status.idle": "2026-01-14T07:34:36.086619Z", + "shell.execute_reply": "2026-01-14T07:34:36.086193Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

mouse_id

\n", + " \n", + "
\n", + "

session_date

\n", + " \n", + "
\n", + "

experimenter

\n", + " \n", + "
02017-05-15Alice
02017-05-19Alice
52017-01-05Bob
1002017-05-25Carol
1002017-06-01Carol
\n", + " \n", + "

Total: 5

\n", + " " + ], + "text/plain": [ + "*mouse_id *session_date experimenter \n", + "+----------+ +------------+ +------------+\n", + "0 2017-05-15 Alice \n", + "0 2017-05-19 Alice \n", + "5 2017-01-05 Bob \n", + "100 2017-05-25 Carol \n", + "100 2017-06-01 Carol \n", + " (Total: 5)" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Insert mice\n", + "Mouse.insert([\n", + " {'mouse_id': 0, 'dob': '2017-03-01', 'sex': 'M'},\n", + " {'mouse_id': 5, 'dob': '2016-12-25', 'sex': 'F'},\n", + " {'mouse_id': 100, 'dob': '2017-05-12', 'sex': 'F'},\n", + "], skip_duplicates=True)\n", + "\n", + "# Insert sessions (matching our data files)\n", + "Session.insert([\n", + " {'mouse_id': 0, 'session_date': '2017-05-15', 'experimenter': 'Alice'},\n", + " {'mouse_id': 0, 'session_date': '2017-05-19', 'experimenter': 'Alice'},\n", + " {'mouse_id': 5, 'session_date': '2017-01-05', 'experimenter': 'Bob'},\n", + " {'mouse_id': 100, 'session_date': '2017-05-25', 'experimenter': 'Carol'},\n", + " {'mouse_id': 100, 'session_date': '2017-06-01', 'experimenter': 'Carol'},\n", + "], skip_duplicates=True)\n", + "\n", + "Session()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Imported Table: Neuron Activity\n", + "\n", + "Each data file contains recordings from one or more neurons. We import each neuron's activity trace." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:36.088301Z", + "iopub.status.busy": "2026-01-14T07:34:36.088084Z", + "iopub.status.idle": "2026-01-14T07:34:36.109562Z", + "shell.execute_reply": "2026-01-14T07:34:36.109208Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class Neuron(dj.Imported):\n", + " definition = \"\"\"\n", + " -> Session\n", + " neuron_id : int16\n", + " ---\n", + " activity : # neural activity trace\n", + " \"\"\"\n", + "\n", + " def make(self, key):\n", + " # Construct filename from key\n", + " filename = f\"data_{key['mouse_id']}_{key['session_date']}.npy\"\n", + " filepath = DATA_DIR / filename\n", + " \n", + " # Load data (shape: n_neurons x n_timepoints)\n", + " data = np.load(filepath)\n", + " \n", + " # Insert one row per neuron\n", + " for neuron_id, activity in enumerate(data):\n", + " self.insert1({\n", + " **key,\n", + " 'neuron_id': neuron_id,\n", + " 'activity': activity\n", + " })\n", + " \n", + " print(f\"Imported {len(data)} neuron(s) from {filename}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:36.111098Z", + "iopub.status.busy": "2026-01-14T07:34:36.110992Z", + "iopub.status.idle": "2026-01-14T07:34:36.179133Z", + "shell.execute_reply": "2026-01-14T07:34:36.178749Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + "Neuron: 0%| | 0/5 [00:00\n", + " .Table{\n", + " border-collapse:collapse;\n", + " }\n", + " .Table th{\n", + " background: #A0A0A0; color: #ffffff; padding:2px 4px; border:#f0e0e0 1px solid;\n", + " font-weight: normal; font-family: monospace; font-size: 75%; text-align: center;\n", + " }\n", + " .Table th p{\n", + " margin: 0;\n", + " }\n", + " .Table td{\n", + " padding:2px 4px; border:#f0e0e0 1px solid; font-size: 75%;\n", + " }\n", + " .Table tr:nth-child(odd){\n", + " background: #ffffff;\n", + " color: #000000;\n", + " }\n", + " .Table tr:nth-child(even){\n", + " background: #f3f1ff;\n", + " color: #000000;\n", + " }\n", + " /* Tooltip container */\n", + " .djtooltip {\n", + " }\n", + " /* Tooltip text */\n", + " .djtooltip .djtooltiptext {\n", + " visibility: hidden;\n", + " width: 120px;\n", + " background-color: black;\n", + " color: #fff;\n", + " text-align: center;\n", + " padding: 5px 0;\n", + " border-radius: 6px;\n", + " /* Position the tooltip text - see examples below! */\n", + " position: absolute;\n", + " z-index: 1;\n", + " }\n", + " #primary {\n", + " font-weight: bold;\n", + " color: black;\n", + " }\n", + " #nonprimary {\n", + " font-weight: normal;\n", + " color: white;\n", + " }\n", + "\n", + " /* Show the tooltip text when you mouse over the tooltip container */\n", + " .djtooltip:hover .djtooltiptext {\n", + " visibility: visible;\n", + " }\n", + "\n", + " /* Dark mode support */\n", + " @media (prefers-color-scheme: dark) {\n", + " .Table th{\n", + " background: #4a4a4a; color: #ffffff; border:#555555 1px solid; text-align: center;\n", + " }\n", + " .Table td{\n", + " border:#555555 1px solid;\n", + " }\n", + " .Table tr:nth-child(odd){\n", + " background: #2d2d2d;\n", + " color: #e0e0e0;\n", + " }\n", + " .Table tr:nth-child(even){\n", + " background: #3d3d3d;\n", + " color: #e0e0e0;\n", + " }\n", + " .djtooltip .djtooltiptext {\n", + " background-color: #555555;\n", + " color: #ffffff;\n", + " }\n", + " #primary {\n", + " color: #bd93f9;\n", + " }\n", + " #nonprimary {\n", + " color: #e0e0e0;\n", + " }\n", + " }\n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

mouse_id

\n", + " \n", + "
\n", + "

session_date

\n", + " \n", + "
\n", + "

neuron_id

\n", + " \n", + "
\n", + "

activity

\n", + " neural activity trace\n", + "
02017-05-150<blob>
02017-05-190<blob>
52017-01-050<blob>
1002017-05-250<blob>
1002017-06-010<blob>
\n", + " \n", + "

Total: 5

\n", + " " + ], + "text/plain": [ + "*mouse_id *session_date *neuron_id activity \n", + "+----------+ +------------+ +-----------+ +--------+\n", + "0 2017-05-15 0 \n", + "0 2017-05-19 0 \n", + "5 2017-01-05 0 \n", + "100 2017-05-25 0 \n", + "100 2017-06-01 0 \n", + " (Total: 5)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Neuron()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Visualize Neural Activity" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:36.187330Z", + "iopub.status.busy": "2026-01-14T07:34:36.187211Z", + "iopub.status.idle": "2026-01-14T07:34:36.480800Z", + "shell.execute_reply": "2026-01-14T07:34:36.480507Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "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AAAAAAAAAADIGBCjAAAAAAAAAAAAAEDGgBgFAAAAAAAAAAAAADIGxCgAAAAAAAAAAAAAkDEgRgEAAAAAAAAAAACAjAExCgAAAAAAAAAAAABkDIhRAAAAAAAAAAAAACBjQIwCSkaPHk15eXnGZ+LEiSm/JxIJOuigg4zfTzzxxNifxZEjR9L5559PnTp1cj2mjRs30hVXXEEtWrSgevXqUb9+/ejLL79UrvvFF18Yv/N6vD5vx9v7ZdSoUXTeeedRx44dqW7dusY1uOaaa2jdunXK9d966y3q1asXFRQUULt27eimm26inTt3WtbZsWMH3XbbbTRo0CBq2bKlcfz33nuvsjzznlB9unbtqn0cOvXi+85uX99++23g54vXUe1r6NCh2scFQK6DtgFtQ7bbBpOvv/6azjzzTGratKnxfu/SpQs98MAD2vv65ZdfjHa/SZMm1KBBAzr11FNp9uzZKeu98sordPHFF9MhhxxCNWrUMNoKAAAAAKQPxCjgSMOGDemFF15IWT5p0iT6+eefjd9zgWeffZZWrFhBJ510kiHI2FFcXEwnn3yyIT7961//ovfff59at25Np59+unFORPj7GWecYfzO6/H6LE7x9lyOH+655x6j0/zQQw/Rp59+aohIH330EfXp04c2bNhgWff111+n3/72t3TkkUfSJ598YmzLA0nufIts2bKFnnvuOaNOLNw4MW3atJQPC3nMr3/9a61j0K2XCR+rvM8ePXoEfr6Y4447LmVft99+u9a+AKhOoG2wgrYhs23DG2+8QQMGDKDGjRsbYtG4ceOMdzVPlOmwadMm6t+/Py1ZsoRefPFF+u9//0t79+41JqIWL15sWffVV1+lH374gY466ig68MADtcoHAAAAgAYJABS89NJL3KNLXH311Ym6desmCgsLLb9feumliX79+iW6d++eGDBgQOzPYXl5efJvp2N66qmnjPMyderU5LLS0tLEoYcemjjqqKMs6x555JHGcv7d5JtvvjG2f/rpp33Vc8OGDSnLZsyYYZT5wAMPJJeVlZUl2rZtmxg0aJBl3ddff91Yd9y4ccll+/btMz7Mpk2bjN/vuece7TpdccUViby8vMRPP/3kuq6Xek2YMMFY9vbbbyf8onu+mAMOOCBx1lln+d4XANUBtA1oG7LdNqxevTpRv379xDXXXJPwy6233prIz89PLF++PLmM+zktWrRI/OY3v7HtH3AbwW0FAAAAANIHllHAEZ6lZN58883kssLCQho7dixdeeWVym22bt1K1157Le23335Uu3Zt6ty5M911110Wa6Dly5cb5vs86ykju4nxDOb//d//Ufv27alOnTqG5RJbsLCVkYhpddSoUSPDLY7XsXOfk2HTex3effddw1SfXe9MatWqRZdeeilNnz6d1qxZYyzj/2fMmEGXXXaZ8bvJscceSwcffLBRjh9atWqVsoytfGrWrEmrVq1KLmM3NnZF+/3vf29Z96KLLjIshcT9m64UfmAXv7ffftuYoWYXODe81CsIdM8XAMAbaBusoG3IXNvA7te7du1Ky2qVy2NL6AMOOCC5jPsObIX14YcfUllZmef+AQAAAAC8gRYWOMKdswsvvNAwYzdhYYo7Z4MHD05Zn83cBw4caJjNDxs2jD7++GNDqPnHP/5h64blBgs67733Ht199930+eefGx3RU045xXAvM3nttdeMmEdc35dfftkwuW/WrBmddtpp2oKUDgsWLKDDDjssZbm5jE35zfXE5fK65u9BwO6A5eXl1L17d0s9VfvPz8834ncEtX+O78GDgquvvlprfT/1uu666wxBj68tX0+OExL0+TKZPHmy4X7E9Tn00EPpn//8p7EuAMAK2obUdxvahsy0Dfye5vZ90aJFRnwpbh944oHj+xUVFbnua8+ePUaYAbvrxb9zPCkAAAAAhEuVyQYANrAFFAtMLLTwAJ6FKZ6tVMWLYiHo+++/N8QgXofhoKA8s8mzmOPHjze+e+Gbb74xOrR/+MMfkst+9atfJf/evXs33XjjjXT22WdbZk85sOkRRxxBd955J3333XeBXF8WwLgTLGMuMwUy83+7dUUhLR149pmt0NhqTLRUc9s/W6YFAccT4+CvF1xwgdb6XurFsUD4unIMj+bNm9PSpUvpkUceMb6zyMnCVFDniznrrLOob9++RkyQbdu2GbP6t9xyC82dO9eIGQIAsIK2wfpuQ9uQmbaBLY+53ec+xvDhw43YVGyJzDGmWLSaMmWKo7Uvv985tpTO9QIAAABAeMAyCrjCZvY8QGcRav78+Uanz85F76uvvqL69esb1lQinEWO8WOlxEFD2Z3vb3/7m2HKX1paavl96tSphmvg5ZdfbpjWm599+/YZgcW5vjxDGxROnVz5N7t1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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, axes = plt.subplots(2, 3, figsize=(12, 6))\n", + "\n", + "for ax, key in zip(axes.ravel(), Neuron.keys()):\n", + " activity = (Neuron & key).fetch1('activity')\n", + " ax.plot(activity)\n", + " ax.set_title(f\"Mouse {key['mouse_id']}, {key['session_date']}\")\n", + " ax.set_xlabel('Time bin')\n", + " ax.set_ylabel('Activity')\n", + "\n", + "# Hide unused subplot\n", + "axes[1, 2].axis('off')\n", + "plt.tight_layout()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Computed Table: Activity Statistics\n", + "\n", + "For each neuron, compute basic statistics of the activity trace." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:36.482495Z", + "iopub.status.busy": "2026-01-14T07:34:36.482364Z", + "iopub.status.idle": "2026-01-14T07:34:36.509601Z", + "shell.execute_reply": "2026-01-14T07:34:36.509267Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class ActivityStats(dj.Computed):\n", + " definition = \"\"\"\n", + " -> Neuron\n", + " ---\n", + " mean_activity : float32\n", + " std_activity : float32\n", + " max_activity : float32\n", + " \"\"\"\n", + "\n", + " def make(self, key):\n", + " activity = (Neuron & key).fetch1('activity')\n", + " \n", + " self.insert1({\n", + " **key,\n", + " 'mean_activity': activity.mean(),\n", + " 'std_activity': activity.std(),\n", + " 'max_activity': activity.max()\n", + " })" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:36.511226Z", + "iopub.status.busy": "2026-01-14T07:34:36.511105Z", + "iopub.status.idle": "2026-01-14T07:34:36.549081Z", + "shell.execute_reply": "2026-01-14T07:34:36.548829Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + "ActivityStats: 0%| | 0/5 [00:00\n", + " .Table{\n", + " border-collapse:collapse;\n", + " }\n", + " .Table th{\n", + " background: #A0A0A0; color: #ffffff; padding:2px 4px; border:#f0e0e0 1px solid;\n", + " font-weight: normal; font-family: monospace; font-size: 75%; text-align: center;\n", + " }\n", + " .Table th p{\n", + " margin: 0;\n", + " }\n", + " .Table td{\n", + " padding:2px 4px; border:#f0e0e0 1px solid; font-size: 75%;\n", + " }\n", + " .Table tr:nth-child(odd){\n", + " background: #ffffff;\n", + " color: #000000;\n", + " }\n", + " .Table tr:nth-child(even){\n", + " background: #f3f1ff;\n", + " color: #000000;\n", + " }\n", + " /* Tooltip container */\n", + " .djtooltip {\n", + " }\n", + " /* Tooltip text */\n", + " .djtooltip .djtooltiptext {\n", + " visibility: hidden;\n", + " width: 120px;\n", + " background-color: black;\n", + " color: #fff;\n", + " text-align: center;\n", + " padding: 5px 0;\n", + " border-radius: 6px;\n", + " /* Position the tooltip text - see examples below! */\n", + " position: absolute;\n", + " z-index: 1;\n", + " }\n", + " #primary {\n", + " font-weight: bold;\n", + " color: black;\n", + " }\n", + " #nonprimary {\n", + " font-weight: normal;\n", + " color: white;\n", + " }\n", + "\n", + " /* Show the tooltip text when you mouse over the tooltip container */\n", + " .djtooltip:hover .djtooltiptext {\n", + " visibility: visible;\n", + " }\n", + "\n", + " /* Dark mode support */\n", + " @media (prefers-color-scheme: dark) {\n", + " .Table th{\n", + " background: #4a4a4a; color: #ffffff; border:#555555 1px solid; text-align: center;\n", + " }\n", + " .Table td{\n", + " border:#555555 1px solid;\n", + " }\n", + " .Table tr:nth-child(odd){\n", + " background: #2d2d2d;\n", + " color: #e0e0e0;\n", + " }\n", + " .Table tr:nth-child(even){\n", + " background: #3d3d3d;\n", + " color: #e0e0e0;\n", + " }\n", + " .djtooltip .djtooltiptext {\n", + " background-color: #555555;\n", + " color: #ffffff;\n", + " }\n", + " #primary {\n", + " color: #bd93f9;\n", + " }\n", + " #nonprimary {\n", + " color: #e0e0e0;\n", + " }\n", + " }\n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

mouse_id

\n", + " \n", + "
\n", + "

session_date

\n", + " \n", + "
\n", + "

neuron_id

\n", + " \n", + "
\n", + "

mean_activity

\n", + " \n", + "
\n", + "

std_activity

\n", + " \n", + "
\n", + "

max_activity

\n", + " \n", + "
02017-05-1500.2073570.4008672.48161
02017-05-1900.132740.2914621.82805
52017-01-0500.08917860.2364121.37389
1002017-05-2500.219070.3287831.76383
1002017-06-0100.08732660.2378581.32454
\n", + " \n", + "

Total: 5

\n", + " " + ], + "text/plain": [ + "*mouse_id *session_date *neuron_id mean_activity std_activity max_activity \n", + "+----------+ +------------+ +-----------+ +------------+ +------------+ +------------+\n", + "0 2017-05-15 0 0.207357 0.400867 2.48161 \n", + "0 2017-05-19 0 0.13274 0.291462 1.82805 \n", + "5 2017-01-05 0 0.0891786 0.236412 1.37389 \n", + "100 2017-05-25 0 0.21907 0.328783 1.76383 \n", + "100 2017-06-01 0 0.0873266 0.237858 1.32454 \n", + " (Total: 5)" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ActivityStats.populate(display_progress=True)\n", + "ActivityStats()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Lookup Table: Spike Detection Parameters\n", + "\n", + "Spike detection depends on threshold choice. Using a Lookup table, we can run detection with multiple thresholds and compare results." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:36.550442Z", + "iopub.status.busy": "2026-01-14T07:34:36.550323Z", + "iopub.status.idle": "2026-01-14T07:34:36.575015Z", + "shell.execute_reply": "2026-01-14T07:34:36.574578Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "
\n", + "

spike_param_id

\n", + " \n", + "
\n", + "

threshold

\n", + " spike detection threshold\n", + "
10.5
20.9
\n", + " \n", + "

Total: 2

\n", + " " + ], + "text/plain": [ + "*spike_param_i threshold \n", + "+------------+ +-----------+\n", + "1 0.5 \n", + "2 0.9 \n", + " (Total: 2)" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "@schema\n", + "class SpikeParams(dj.Lookup):\n", + " definition = \"\"\"\n", + " spike_param_id : int16\n", + " ---\n", + " threshold : float32 # spike detection threshold\n", + " \"\"\"\n", + " \n", + " contents = [\n", + " {'spike_param_id': 1, 'threshold': 0.5},\n", + " {'spike_param_id': 2, 'threshold': 0.9},\n", + " ]\n", + "\n", + "SpikeParams()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Computed Table with Part Table: Spike Detection\n", + "\n", + "Detect spikes by finding threshold crossings. Store:\n", + "- **Master table**: spike count and binary spike array\n", + "- **Part table**: waveform for each spike" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:36.576552Z", + "iopub.status.busy": "2026-01-14T07:34:36.576413Z", + "iopub.status.idle": "2026-01-14T07:34:36.622926Z", + "shell.execute_reply": "2026-01-14T07:34:36.622542Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class Spikes(dj.Computed):\n", + " definition = \"\"\"\n", + " -> Neuron\n", + " -> SpikeParams\n", + " ---\n", + " spike_times : # indices of detected spikes\n", + " spike_count : int32 # total number of spikes\n", + " \"\"\"\n", + "\n", + " class Waveform(dj.Part):\n", + " definition = \"\"\"\n", + " -> master\n", + " spike_idx : int32\n", + " ---\n", + " waveform : # activity around spike (Β±40 samples)\n", + " \"\"\"\n", + "\n", + " def make(self, key):\n", + " # Fetch inputs\n", + " activity = (Neuron & key).fetch1('activity')\n", + " threshold = (SpikeParams & key).fetch1('threshold')\n", + " \n", + " # Detect threshold crossings (rising edge)\n", + " above_threshold = (activity > threshold).astype(int)\n", + " rising_edge = np.diff(above_threshold) > 0\n", + " spike_times = np.where(rising_edge)[0] + 1 # +1 to get crossing point\n", + " \n", + " # Insert master entry\n", + " self.insert1({\n", + " **key,\n", + " 'spike_times': spike_times,\n", + " 'spike_count': len(spike_times)\n", + " })\n", + " \n", + " # Extract and insert waveforms\n", + " window = 40 # samples before and after spike\n", + " for spike_idx, t in enumerate(spike_times):\n", + " # Skip spikes too close to edges\n", + " if t < window or t >= len(activity) - window:\n", + " continue\n", + " \n", + " waveform = activity[t - window : t + window]\n", + " self.Waveform.insert1({\n", + " **key,\n", + " 'spike_idx': spike_idx,\n", + " 'waveform': waveform\n", + " })" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:36.624567Z", + "iopub.status.busy": "2026-01-14T07:34:36.624450Z", + "iopub.status.idle": "2026-01-14T07:34:36.778992Z", + "shell.execute_reply": "2026-01-14T07:34:36.778740Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + "Spikes: 0%| | 0/10 [00:00\n", + " .Table{\n", + " border-collapse:collapse;\n", + " }\n", + " .Table th{\n", + " background: #A0A0A0; color: #ffffff; padding:2px 4px; border:#f0e0e0 1px solid;\n", + " font-weight: normal; font-family: monospace; font-size: 75%; text-align: center;\n", + " }\n", + " .Table th p{\n", + " margin: 0;\n", + " }\n", + " .Table td{\n", + " padding:2px 4px; border:#f0e0e0 1px solid; font-size: 75%;\n", + " }\n", + " .Table tr:nth-child(odd){\n", + " background: #ffffff;\n", + " color: #000000;\n", + " }\n", + " .Table tr:nth-child(even){\n", + " background: #f3f1ff;\n", + " color: #000000;\n", + " }\n", + " /* Tooltip container */\n", + " .djtooltip {\n", + " }\n", + " /* Tooltip text */\n", + " .djtooltip .djtooltiptext {\n", + " visibility: hidden;\n", + " width: 120px;\n", + " background-color: black;\n", + " color: #fff;\n", + " text-align: center;\n", + " padding: 5px 0;\n", + " border-radius: 6px;\n", + " /* Position the tooltip text - see examples below! */\n", + " position: absolute;\n", + " z-index: 1;\n", + " }\n", + " #primary {\n", + " font-weight: bold;\n", + " color: black;\n", + " }\n", + " #nonprimary {\n", + " font-weight: normal;\n", + " color: white;\n", + " }\n", + "\n", + " /* Show the tooltip text when you mouse over the tooltip container */\n", + " .djtooltip:hover .djtooltiptext {\n", + " visibility: visible;\n", + " }\n", + "\n", + " /* Dark mode support */\n", + " @media (prefers-color-scheme: dark) {\n", + " .Table th{\n", + " background: #4a4a4a; color: #ffffff; border:#555555 1px solid; text-align: center;\n", + " }\n", + " .Table td{\n", + " border:#555555 1px solid;\n", + " }\n", + " .Table tr:nth-child(odd){\n", + " background: #2d2d2d;\n", + " color: #e0e0e0;\n", + " }\n", + " .Table tr:nth-child(even){\n", + " background: #3d3d3d;\n", + " color: #e0e0e0;\n", + " }\n", + " .djtooltip .djtooltiptext {\n", + " background-color: #555555;\n", + " color: #ffffff;\n", + " }\n", + " #primary {\n", + " color: #bd93f9;\n", + " }\n", + " #nonprimary {\n", + " color: #e0e0e0;\n", + " }\n", + " }\n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

mouse_id

\n", + " \n", + "
\n", + "

session_date

\n", + " \n", + "
\n", + "

neuron_id

\n", + " \n", + "
\n", + "

spike_param_id

\n", + " \n", + "
\n", + "

spike_count

\n", + " total number of spikes\n", + "
02017-05-150126
02017-05-150227
02017-05-190124
02017-05-190221
52017-01-050118
52017-01-050214
1002017-05-250141
1002017-05-250235
1002017-06-010118
1002017-06-010215
\n", + " \n", + "

Total: 10

\n", + " " + ], + "text/plain": [ + "*mouse_id *session_date *neuron_id *spike_param_i spike_count \n", + "+----------+ +------------+ +-----------+ +------------+ +------------+\n", + "0 2017-05-15 0 1 26 \n", + "0 2017-05-15 0 2 27 \n", + "0 2017-05-19 0 1 24 \n", + "0 2017-05-19 0 2 21 \n", + "5 2017-01-05 0 1 18 \n", + "5 2017-01-05 0 2 14 \n", + "100 2017-05-25 0 1 41 \n", + "100 2017-05-25 0 2 35 \n", + "100 2017-06-01 0 1 18 \n", + "100 2017-06-01 0 2 15 \n", + " (Total: 10)" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# View spike counts for each neuron Γ— parameter combination\n", + "Spikes.proj('spike_count')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Compare Detection Thresholds" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:36.786348Z", + "iopub.status.busy": "2026-01-14T07:34:36.786235Z", + "iopub.status.idle": "2026-01-14T07:34:36.943326Z", + "shell.execute_reply": "2026-01-14T07:34:36.943011Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAAJOCAYAAABm7rQwAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzsnQe4FNX5xj96B1FBQFFREUVFEYxdbAFBjb1h7GKPBVtsUWyosWBiiw1jw66xYI+9izVK0z8KIooVBOns/3ln+e799tyZ2Zmts7vv73kW7t07OzvlzDnfec9XGqVSqZQQQgghhBBCCCGEEFJCGpfyywghhBBCCCGEEEIIARSlCCGEEEIIIYQQQkjJoShFCCGEEEIIIYQQQkoORSlCCCGEEEIIIYQQUnIoShFCCCGEEEIIIYSQkkNRihBCCCGEEEIIIYSUHIpShBBCCCGEEEIIIaTkUJQihBBCCCGEEEIIISWHohQhhBBCCCGEEEIIKTkUpQghhJAy0ahRo0ivl19+2Xvh54ceeigR96sYx3PBBRd4+4zC6quvLoceemhBvnfOnDly8sknS7du3aRly5ay0UYbyX333Rfps3fccUfgffvuu+9yOp7Zs2fLJZdcIttuu6106dJF2rZtKxtssIFcfvnlMn/+fN/P/O9//5N99tlHOnXqJC1atPCuz3HHHSelBueN++hen/fff1+SiHu8Ufn222+9z3300UdFOa5SfI/em6+++qrg+yaEEEKi0jTyloQQQggpKG+99VbG7xdddJG89NJL8t///jfj/d69e8sHH3zAq18k9txzT3nvvffksssuk7XXXlvuvfdeOeCAA2Tp0qUydOjQSPsYPXq0rLPOOhnvrbDCCjkdz9SpU2XUqFFy0EEHyfDhwz1R6rXXXvPEieeff957WfEObWbnnXeWrbfeWm666SZZccUVvX18+OGHUo42vcoqq0i1A7FoxIgRnvgHEbPSv4cQQggpFxSlCCGEkDKx2WabZfwOL5fGjRs3eL8Q/P7779K6deuC77fSGTt2rCfyqBAFtttuO/n666/l9NNPl/3220+aNGmSdT/rr7++9O/fvyDH1KNHD897pU2bNnXvbb/99t7vOKY33nhDttpqq7r7euCBB3p/f+KJJzLEKohapaYYbZcQQggh1QvD9wghhJAKYtGiRXLOOed4oWbt27eXHXfcUSZOnJixDcK+IJK8+uqrssUWW3hi1OGHH14XGnbaaad5wkfz5s1l5ZVX9kLX5s6dm7GPBx98UDbddFPp0KGD9/k11lijbh9xjwfcfvvtsuGGG3rhccsvv7zsscceMn78+Ejne8YZZ3hhbDgOiDHvvvuuFIpHH33U80RC6JvlsMMO87xU3nnnHSk1EJ+sIKX84Q9/8P6fNm1axn2aMWOGJ1ZFDX20/PDDD3LUUUdJ9+7dvbA/CKNbbrmlvPDCCw3aE7y1IDq1atXKazfnnXeeLFmyJHY4HI63X79+0rNnT5k8eXJR2qUL9j9s2DDPew33e6eddpJJkyb5botjgodc586dvWuy7rrryvXXX58RurrJJpvUtRMN17TnjXDFP/3pT15bR5vv27evPPDAAw2+a/r06XXXH+eN52jvvfeW77//vqDf8/bbb3v3FdvgO8466yzv2SKEEELKDUUpQgghpII4++yzPS+eW2+9VW6++WZvAr3rrrs2EAcw8f/zn//sTa7hDYT8QvCqGTBggPz73/+WE088UZ5++mk588wzvdwymNimUqm6ECx4CGHCj9xKTz31lPztb3+TxYsX53Q8I0eOlCOOOELWW289eeSRR+Taa6+VTz75RDbffPM6USIICAlXXnmlHHzwwfKf//xH9tprLy/c7pdffmmwLY4vykvPU3MxQXRo2jTTebxPnz51f4/CLrvs4nlUQRzA8fl9TnNmQWzIBQ3rxHVUIDwCXG8IdhA2Onbs6Hl9QVTLBrypHnvsMe/+Pvfcc959hLD4008/ZWyH/Fj777+/55WF+wDh5OKLL5aTTjop1jngukBUgtiDdgZhqhjt0oLP77777nLXXXfJqaee6gmRENcGDx7cYNvPP//cE4JwnFdddZU8+eSTXmgkjgthdGDjjTf2wjXBueee6x0XXkceeWRdOCUEoF9//dULp8T1Qugdjh3nZAUpfBeOB2GaOG+EbUJwQ/su1PfgnHbYYQdvO7yPbRHaiftHCCGElJ0UIYQQQhLBIYcckmrTpo3v31566SXMzFNDhgzJeP+BBx7w3n/rrbfq3hswYID33osvvpix7ciRI1ONGzdOvffeexnvP/TQQ972Y8eO9X6/8sorvd9//fXXwGONejy//PJLqlWrVg22mzp1aqpFixapoUOH1r13/vnne59Vxo8f7/1+yimnZHz2nnvu8d7H9VKmTJnivRflhWNXevbsmRo0aFCD8/v222+9bS+99NJUGE8//XTqnHPOST3xxBOpV155JXXdddelVlllFe8+fvTRRxnbjhgxItWkSZPUyy+/nIrLxx9/7F3HPfbYI+N9HDuOc7nllkudccYZqf/+97+pm266KbXCCiuk1lprrdTcuXND99u2bdvUySefHLqNtqf//Oc/Ge8PGzbMa09ff/113XvYDvdRGT16tPce2tzzzz+fat++fWrvvfdOzZs3ryjtMuge4XPXXnttxvuXXHJJg+PF9cT9mzVrVsa2J5xwQqply5apn3/+2fsdx4rP4vxc1llnnVTfvn1TixYtynh/l112SXXt2jW1ZMkS7/fDDz881axZs9Tnn38eeOyF+J799tvPazvfffdd3TaLFy/2Po9949khhBBCygU9pQghhJAKAp4jfh498FaywFsGeYYs8PpAGBa8Kazn0KBBgzI8eDRkaN999/VCgeDRkevxwLNj3rx5DSrlIVwJx/fiiy8G7hueIADeORYcl+vZhJAkJCuP8kLomCUs7C1bSBzCwOBxAk+pbbbZRo4//ngvzA2fgxePRb164BUUB+SXwv5xzeDJZEEydgDvGFTnQz6so48+Wm677Tb54osvvFxZYSAkEN4zOAeEeAWFdLVr167BvYYXHr5fvbXCgBfUkCFDPC8ftCmEkRWzXUZpR24Se1Q2RHtEaClCA+2x4Njxd1yjMHDNJ0yYUPdd7j7gwajhrfCMwv2Cp15c4nwPzh+eUiuttFLd5+HVhzZDCCGElBuKUoQQQkgF4VZ0QxgUgPBj6dq1a4PPIk8NwuaaNWuW8YLgACeXH3/80dsO4gpCujDBRdgcqqlBNBgzZkzs49EwML/jgZDkholZ9G/IJ2WBIOV+L8LWIGpEeSGnkD1+v2P4+eefvf8RjhcXVEpDKF02ASMKEPcgXOCcIZi4x6PXAQKORQWdbFUb77//fjnkkEM8sQvhlNg/7jnC9SxW0FD0voTdQwXhdshFBVHKFfqK0S4tOD6/NuO2K2yHff/zn/9scCwQeoAeSxA4F4D8WO4+EEJr94F8XrlWKozzPTgv91z9zp8QQggpB6y+RwghhFQhfh4+K664oicMIOm4H/i7sttuu3mvBQsWeOIK8kLBswSCC8SLqKgQAM8NF+Q8st8Z9FkIJEh8rUA4cIUQeBMhSXYU4DmC5N1ggw028EQN7NN6X3366afe/xA9cgFiCiop5itI4TixL3gL+QkY8EyD4BNEtmPA9UceI7ymTp0qjz/+uPz1r3+VmTNnyjPPPNNABLGocOWKPX7cc889XmJ0eIkhdxXEwVK1Sxyfthl7rK7wBu9CeBAhzxY83vzI1sb0WJFIHLnF/OjVq5f3P5LKf/PNN6H7K8T34JzdcwV+7xFCCCGlhqIUIYQQUiMgBOzSSy/1JqlRBRx4PkFIWG655eTZZ5/1EiTHEaWwLQSHu+++O6PCHSbjSNyNhNlBqHAEQcOG3CF0y01ureF7UdDJOkCo1i233CIPP/xwRjgTws2wTyTljsuUKVPkjTfe8BKG5woEIpw/EphDkFpttdV8t8Pxo/ohQsHws4LfIWYhoXdUVl11VTnhhBM8jywcv+W3337zBCsbwofQQIhe8GDKBjywUNEPbRCeXzg+PbZit0t83xVXXOG1IyQst8dvQcgetsW+IPbB+y7s+/08FNG2kLz9448/9s4pDCRaR/J1hNnZNlno78E54d5BWFSPN7QreMkRQggh5YaiFCGEEFIjnHzyyZ74AhHhlFNO8SbeyAkEAQTeK6hMBhEGuY8gGiEPDbxzULULFfMQGhQ3HxJEA3jIoEofQq5QFQ4eK6hkhrxC559/fuBnkWsHFQThxYPvhsiDqmioxte+ffuMbSEg9O/fP/Y1gTDwxz/+UY499liZPXu2rLXWWp7nFLyEIKTBc0ZBBUGIVV9++WWdSIRjwvXEtcQxwcMKAgg81S666KKM77rwwgu9F0SfsOsILyUICfAuQ24o/I6XgnuiXlPrrLOO59Vzww03eOFuOJ9JkyZ51dr69u3r5V8KYtasWd73wNMI+8HnIezh3F3vGwhGuEZoK2uvvbZX0RFiHt6DmBUF7F/3jWsOoQTfX+x2OXDgQG/fZ5xxhsydO9drJxDdIAi5YH8Ivdx66629c4MHFgQ55HB64okn6iogrrnmmp7YCqEL7RQhoRAx8frXv/7l3QeEUCKXGrz8EA46fvx4L5zywQcf9PaBtgBxDseG5wNeezgnXCNU48M9KcT3oC3gWiOHG64hxLfrr7/euxaEEEJI2SlbinVCCCGExK6+9+CDD2a8r1XnbHUuVEtbb731fPczZ86c1Lnnnpvq1atXqnnz5qkOHTqkNthgA6/CnVbnevLJJ1ODBw9Orbzyyt42nTt39qrnvfbaazkdD7j11ltTffr0qfvO3XbbLfXZZ59lbONW3wMLFixInXrqqd4xoPrZZptt5lX2W2211TKq7+XDb7/9ljrxxBNTXbp08Y4PxzlmzJgG2+H73GplqFzXu3fvVLt27VJNmzZNdevWLfXnP/85NXHixAaf1/Oz1f/80Gsb9LLV4rSS2mWXXeZV20M1N1ReO/bYY73Kh2HMnz8/dcwxx3jni6p4qNCGdoH926p92p5QNbB///5e1UR8x9lnn92g8ltY9T17T/faay/vfj711FMFbZdBoGIfqt2hSmHr1q1Tf/zjH1MTJkzwvZ64v9gW34Pr2alTp9QWW2yRuvjiizO2QxtBBTts4+4H1RL33Xdf7xjxd7St7bff3quMaJk2bZr3Xfg7tkP7wee+//77gn7PG2+84T07uHfY5vTTT0/dfPPNrL5HCCGk7DTCP+UWxgghhBBCSDJBGCGSZsNLjRBCCCGkkLD6HiGEEEIIIYQQQggpORSlCCGEEEIIIYQQQkjJYfgeIYQQQgghhBBCCCk59JQihBBCCCGEEEIIISWHohQhhBBCCCGEEEIIKTkUpQghhBBCCCGEEEJIyWla+q+sLJYuXSrffvuttGvXTho1alTuwyGEEEIIIYQQQghJNKlUSn777Tfp1q2bNG4c7A9FUSoLEKS6d+9e6PtDCCGEEEIIIYQQUtVMmzZNVllllcC/U5TKAjyk9EK2b9++sHeHEEIIIYQQQgghpMqYPXu25+CjmkoQFKWyoCF7EKQoShFCCCGEEEIIIYREI1saJCY6J4QQQgghhBBCCCElh6IUIYQQQgghhBBCCCk5FSNKjRw5UjbZZBMvHrFz586y++67y8SJE0M/8/LLL3uuYu5rwoQJJTtuQgghhBBCCCGEEFLBOaVeeeUVOf744z1havHixXLOOefIwIED5fPPP5c2bdqEfhbilc0H1alTpxIcMSGEEEIIIYQQUn6WLl0qCxcuLPdhkCqiWbNm0qRJk9oRpZ555pmM30ePHu15TI0bN0622Wab0M9iu+WWW67IR0gIIYQQQgghhCQLiFFTpkzxhClCCgl0li5dumRNZl4VopTLrFmzvP+XX375rNv27dtX5s+fL71795Zzzz1XtttuuxIcISGEEEIIIYQQUj5SqZTMmDHD82jp3r27NG5cMRl8SMLb1e+//y4zZ870fu/atWttiVK4AMOHD5etttpK1l9//cDtcGFuvvlm6devnyxYsEDuuusu2WGHHbxcU0HeVdgOL2X27NlFOQdSz9y5Iq1bo1QkrwohhBBCCCGEFAqkvoF40K1bN2mNSRchBaJVq1be/xCmEJ2WayhfRYpSJ5xwgnzyySfy+uuvh27Xq1cv76VsvvnmMm3aNLnyyisDRSkkVB8xYkTBj5n48/77Irjcu+8ucsQRvEqEEEIIIYQQUiiWLFni/d+8eXNeVFJwVOhctGhRzqJUxfnu/eUvf5HHH39cXnrpJVlllVVif36zzTaTyZMnB/79rLPO8kID9QURixSP225L///YY7zKhBBCCCGEEFIM8sn5Q0gx21XTSgrZgyD16KOPeuF3PXr0yGk/H374YWi8Y4sWLbwXKQ3sGwkhhBBCCCGEkNqkYjyljj/+eLn77rvl3nvvlXbt2sl3333nvebNm5fh5XTwwQfX/T5q1Ch57LHHPM+ozz77zPv7ww8/7IX/kWRAUYoQQgghhBBCSLG54447vGpxUYEzDDyBfv3116IeV61TMaLUjTfe6IXTbbvttp6nk77uv//+um1QVWDq1KkZpS9PO+006dOnj2y99dZeDqqnnnpK9txzzzKdBXFh8QdCCCGEEEIIIX68+eabXq6inXbaKdYFWn311T0nFct+++0nkyZNiryPLbbYwtMYOnTokJOoRaowfC8baCSWM844w3sRQgghhBBCCCGksrj99tu9ND633nqr54Cy6qqr5lUtTivGRQHJ4bt06ZLz95Eq85Qi1Qk9pQghhBBCCCGEuMydO1ceeOABOfbYY2WXXXZp4ISCAmj9+/eXli1byoorrlgXEYXoqq+//lpOOeUUL/xOk3FbT6eJEyd670+YMCFjn1dffbXnZQWnGBu+h58PO+wwL3pL93nBBRfIhRdeKBtssEGDY+/Xr5/87W9/402NAEUpQgghhBBCCCGkBkAA0vz55XlFCH7KAKl6evXq5b3+/Oc/y+jRo+siqDQtz8477+wVM3vxxRc9gQo88sgjssoqq3iCEcLv8HLBPiEc3XPPPRnvI4f10KFDG1SVQygfwgHbt29ft0+kCjr88MPl888/l/fee69u208++cQ7pkMPPTTeCdcoFRO+R6oTekoRQgghhBBCSGlYsEBkn33Kc7UffFCkZcvo2992222eGAWQU2rOnDme+LTjjjvKJZdcIvvvv7+MGDGibvsNN9zQ+3/55Zf38lChQFpY+N2BBx4o1113nVx00UXe78g3NW7cOLnzzjt9Q/mQWwpild1n27ZtZdCgQZ5gtskmm3jv4ecBAwbIGmusEf1kaxh6SpGywup7hBBCCCGEEEIsCK979913PeEJNG3a1EtUjhxT4KOPPpIddtghr4uGfSPM7+233/Z+h9fURhttJL179461n2HDhsmYMWNk/vz5smjRIm8/8KAi0aCnFCkrFKUIIYQQQgghpDS0aJH2WCrXd8fxklq8eLGsvPLKde8hdK9Zs2byyy+/xEpYHkTXrl1lu+2280L2NttsM09YOvroo2PvZ9ddd5UWLVrIo48+6v2/YMEC2WuvvfI+vlqBohQpKxSlCCGEEEIIIaR08684IXTlAGIUQuiuuuoqGThwYMbfIPbAE6lPnz5eKB+Sj/uBcLslS5Zk/S6E8J155plywAEHyJdfflnnmRVnn/DiOuSQQ7ywPYhS2Efr1q0jnSuhKEXKDEUpQgghhBBCCCHKk08+6XlDHXHEEV4eJ8vee+/teVFdc801Xvjemmuu6YlAELKefvppOeOMM7ztUEHv1Vdf9f4GoQjV+fxAsnRU98MLXlPWM8sF+9S8VshfBeFJxacjjzxS1l13Xe/nN954gzczBswpRcoKRSlCCCGEEEIIIQpEJyQzdwUp9ZRCPilUwXvwwQfl8ccf9/JAbb/99vLOO+/UbYfKe1999ZUnWnXq1Cnw4mI/CL/7+OOPPa+pMFCB75hjjvFyW2GfV1xxRd3fevbs6f0dVf023XRT3swYNEppTUXiy+zZs72HYdasWV6DJYUFQvb48emfn3iCV5cQQgghhBBCCgWSb0+ZMkV69OghLZMet1fBQFZZZ511vJxUw4cPl1phfkj7iqqlMKcUKSuNja8e5FF6ThFCCCGEEEIIqRRmzpwpd911l0yfPj0wxxUJhqIUKStWhFq8WKRZs3IeDSGEEEIIIYQQEp2VVlrJy1l18803S8eOHXnpYkJRipQVilKEEEIIIYQQQioVZkTKDyY6J4kSpQghhBBCCCGEEFIbUJQiZWXp0vqfFy0q55EQQgghhBBCCCGklFCUImVlyZL6n+kpRQghhBBCCCGE1A4UpUhZoShFCCGEEEIIIYTUJhSlSFmx3lH0lCKEEEIIIYQQQmoHilIkMTmlKEoRQgghhBBCCCG1A0UpUlasEMVE54QQQgghhBBCsvHVV19Jo0aN5KOPPirpxXr55Ze97/3111/z2g/28dhjjyXu/MoBRSlSVphTihBCCCGEEEKIAjEm7HXooYfyYkXglVdekX79+knLli1ljTXWkJtuuinrZ/yud5TP5UPTou6dkCxQlCKEEEIIIYQQosyYMaPu5/vvv1/+9re/ycSJE+vea9Wqlfzyyy+xL9iSJUs8kaVx4+r3zZkyZYoMGTJEhg0bJnfffbe88cYbctxxx0mnTp1kr732Cv3s6NGjZaeddqr7vUOHDkU91uq/GyTRUJQihBBCCCGEEKJ06dKl7gVBBEKS+57yf//3f7LddttJ69atZcMNN5S33nqr7m933HGHLLfccvLkk09K7969pUWLFvL111/LwoUL5YwzzpCVV15Z2rRpI5tuuqkXlqdgm1133VU6duzo/X299daTsWPHZtygcePGSf/+/b3v3WKLLTJEM3DjjTfKmmuuKc2bN5devXrJXXfdFXqD3333Xenbt6/n1YT9fvjhh3k1CHg3rbrqqjJq1ChZd9115cgjj5TDDz9crrzyyqyfxTWz1xsiYDGhKEXKCqvvEVI9vPGGyLHHIga+3EdCCCGEEEJCmTs3+DV/fvRt582Ltm2ROOecc+S0007zci+tvfbacsABB8hiM8n8/fffZeTIkXLrrbfKZ599Jp07d5bDDjvM8xy677775JNPPpF99tnH8wyaPHmy95njjz9eFixYIK+++qp8+umncvnll0vbtm0bfO9VV10l77//vjRt2tQTfJRHH31UTjrpJDn11FPlf//7nxx99NHed7700ku+5zB37lzZZZddPPEKYtcFF1zgnZMLjiHsNXjw4LptIc4NHDgw4/ODBg3yjndRlmTOJ5xwgqy44oqyySabeOLWUludrAgwfI8kxlOKic4JqWwuuyz9/+WXY3Wo3EdDCCGEEEICcUSWDIYMEXnqqfrfO3eGuuO/7YAByP5d//vqq4v8+GPD7VKpotwMiDc777yz9/OIESM8r6YvvvhC1llnHe89CDA33HCD50UFvvzySxkzZox888030q1bt7p9PPPMM17Y2qWXXipTp071Qtw22GAD7+/Ix+RyySWXyACcu4j89a9/9Y5h/vz5nqcTvJGQ9wrhcmD48OHy9ttve+/Dq8vlnnvu8UILb7/9ds/zCueA4zsWq72GbEnPrUfTd999JyuttFLG3/E7BLsff/xRunbt6ruPiy66SHbYYQdvXy+++KInrGH7c889V4oFRSlSVhi+R0j1MXt2uY+AEEIIIYTUAn369Kn7WYWWmTNn1olSCJ+z23zwwQeSSqU8ryoLPKNWWGEF7+cTTzzRE4See+452XHHHT2Byu4j7HsRMjd+/Hg56qijMrbfcsst5dprr/U9h/Hjx3uiGQQpZfPNN2+w3VprrSVxQNijBeft977Fik8bbbSR9/+FF15IUYpULxSlCKnu55oQQgghhCSQOXOC/9akSebvM2cGb+smDS9xHodmzZrV/axiiw03g8ePFWHwtyZNmnhhcvjfoiF6yL+EULennnrKE6YQ/odQvb/85S+Rv9dPEAoSg1IRvcjcEEKXrbfeWp5++mnvZ+SCgreUBaIZQg1VfIvCZpttJrNnz5bvv/++gedVzXlKoSE88sgjMmHCBK9hIZkYYjsRd5mtDCLc5RA/Cvc8JDQ75phjSnbcJByKUoRUHwzFJYQQQghJOG3alH/bMoBk4giVg0ADESeI7t27e7oBXmeddZbccsstGaJUGEgs/vrrr8vBBx9c996bb77pve9H7969vUTo8+bNqwvBQ7ifS5zwPXhaPfHEExl/h8CGJOpWUMsGEq4jJBHJz4tFxYhSEJeQcAzJthAHicRiSNz1+eefexnxC10GkRQfCMLMKUVI9UFRihBCCCGEJBGE7R144IGeYATvJ4hUyJn03//+18shBf3g5JNP9pKGY9tffvnF+1uQoOTH6aefLvvuu69svPHGXn4miENwsHnhhRd8tx86dKinbxxxxBFemNxXX33lWyUvTvgexLTrrrvOc9CBHoLE57fddpuXT8smZIfgBscfgOOEdxUELQhcSMyO40IoIioXSq2LUkg8ZkESMmTOh9vdNttsk7UMIkBDQrZ53GCKUuXHTeJvK/ERQupBIZBZs0T696+Mq1KkPJaEEEIIIYTkDbSEiy++2EviPX36dC+cDUIMBCkATyo4xCDZePv27b3KfNdcc03k/e++++5e/qi///3vXn6qHj16eN+57bbbBoblPfHEE56QBJEMnlOICstHs8B3jh07Vk455RS5/vrrvaixf/zjHxn7nDVrlkycOLHud3hQISk8hCyEIiLBO/JJ4VoUk0apqAGMCQMZ9Xv27OmVaFx//fV9t4FYhZtqE4pBDYRqidKQfm5rSHCGl4L4Sbju4YahQZLCsXChiH3O4N24zz68woS47Lpr+v+bb0YixeQfJ3C8hQkhhBBCSBlARThEEEGkQBgWIaVqX9BSOnTokFVLcbKSVQbQ0aDebbXVVoGCVJQyiEG5q3Dh9AVBipQmGTI9pQgJZ8YMXiFCCCGEEEJI9VCRotQJJ5wgn3zySUY8ZKHKICKmEkqevqZNm1agoyYurghFUYqQeCGvhBBCCCGEEFLJVExOKQUZ7x9//HF59dVXZZVVVgndNpcyiEjgVcwkXiR4gs3kyIQ0xAZYu96FhBBCCCGEEFLJVIynFDyc4CGFrPXIfo+YxWwgWdnzzz+fdxlEUl5PqV9/ZeJkUrtYIYqiFCGEEEIKzVVXiVx2Ge1tQkh5qBhRChnf7777brn33nulXbt2ngcUXvPmzcsIvUNpRwXZ67/++msv/9T48ePl9ttv98ognnbaaWU6CxI3p9SkSekE6LfcwmtHahPrUVhJ4XuVdKyEEEJIrYKp1Msvi7zxhshPP5X7aAghtUjFiFI33nijl+MJZRS7du1a97r//vvrtpkxY4ZMnTq1QRnEl19+WTbaaCO56KKLGpRBJMkWpXA7Eb40ZUrJDouQxD4nlST0mPUCQgghhCQUpgmoHTS3MiGFZGkBJihNq+khuuOOOxq8N2DAAPnggw+KdFSk2KKUvrdgAa81iQa6ioA6BhWJfS6SHL7ndtEQpdq0KdfREEIIIaSaPbJJdJC2BkW+fvjhB+nUqVNgwS9C4uozCxcu9NpV48aNpXnz5lL1ohSpPlwRyiY6/+UXkeWWoyhF4vHttyKnniqy224i++9fHVfPGohJFqXcY5s/v1xHQgghhJBq98gm0WnSpIlXIOybb76Rr776ipeOFJTWrVvLqquu6glTuUJRiiSu+t64cSIXXAAvN5G11kq/xwkuicKdd4rMmSNyzz3VI0pZYzHJFSpdkZnhe4QQQkhl2RlBRYdI5dO2bVvp2bOnLEqyMUkqUvBs2rRp3t53FKVI4jylHnoo/f8rr4isvnr6Z4bvkShUozeyfU4WLpTE4to4FKUIIYSQylokpihV/QICXoQkjYpJdE6qDzfcRyfcTY1UypxSJA55eI0mlkrxlKIoRQghhFQelWJnEEKqlyqcwpFKFaV0ILSilL4HTykWjCC16CllVzCT7CnF8D1CCCGk8mD4HiGk3FCUIomZxOqE23qV6jYQpLh6Q2rRU8o+J0l+BugpRQghhFQe9JQihJSbKpzCkUoP32vWzH9CzrxSpBZFKfucJNlTyhWlfv+9XEdCCCGEkCR6Sr39tsi//pXsasKEkNLDROck0eF7rijVrl2JDo5UJNUUvgfvQLwqVZT67bdyHQkhhBBCckkTUGyP7EsuSf+/2moiO+1U3O8ihFQOVehXQCoFnWy3bBkcvmcHR3pKkVrylDr/fJHjjsts90kO33NXV2fPLteREEIIISTJ4XvffVea7yGEVAb0lCJlHwRbtxaZP79+IGT4HsmVahKlPvww/f/48fXv0VOKEEIIIZWe6DzJ9gwhpPRU0RSOVIunlA3fs3lpIFwRElWUsu7olYatNFkpnlIM3yOEEEIqj3J4SjH6gRBioShFyoauxrRqVT8QYjJuw/fmzq3/mQMYiSNKJVnAyUZQHqkknxPD9wghhJDKo5Q5pUr9PYSQyoCiFCn7IKiilN8gNWdO/c8UpUicROfVIkrZdp9kd3e93vo8M9E5IYQQknzKEb5Hm54QYqEoRRLjKaUTWzsg0lOK5Eoli1L2GbBCVCWIUssvXy9K2TBEQgghhCSPcoTvVbKNRggpPBSlSNkHwRYt6j1cMOm2g6MVpZhTikRtU9XqKZXkc1IhbYUV6s+BzywhhBCSbMoRvkdPKUKIhaIUKfvEGzmktOIeBkM7IbeJzjmAkahtSttSNZyHFXYqwVOqTZv655khfIQQQkiyYfU9Qki5oShFEiFKNW9eP+kOqppGUYrECXurFlFq3rzKEqUgSLVrl/559uyyHhIhhBBCErigl2R7hhBSeihKkbILCK4oZQdHC0OBSK14SgXlVUvyOVlRqn379M/0lCKEEEKSDT2lSBJ44AGRM87gfK9WoShFEhe+F1T5g55SJGqb0rZUqQSFsCZ5ZVGfW+spRVGKEEIISTalsp1s8ZMk2zOkPNx1l8j48SLPPss7UItQlCJlHwSbNmX4Hilsm6p0UcoKszZ8L8nnpMeG55nhe4QQQkhlUKpE50FFXAixWLuX1A4UpUiiPKXCwvc4gJFazCllPaVwTnalManhe0h2DmhYEEIIIcmmVOF75ajyRyqPoHkgqW4oSpFEJTp3q+9ZKEqRqG1K21K1GYgQpJI6WNvwPSsyE0IIISS5lMp2sqIU7QMSRDGFUZJcKEqRsnc6bvheFFEKuWrOO0/kpZdKcKCkYqgWUSpsQE6qIWfD9+zzTAghhJDkUipPKfd7kur5TcpLUhdfSXGhKEXK3uk0bpyZ6DxK9b377xf56CORq68uwYGSiqEaw/dcknpeNnzPej4SQgghJLmUakHPtW1oIxA/6ClVm1CUIolLdB7FU2rOnBIcIKk46CmVPM9HQgghhCQXG1ZXqpxSgHkniR8UpWoTilKkIhOdw7uKkKA2Vc2eUkk14vxyxFGUIoQQQpJNuTylkmrPkPLC8L3apKKm9q+++qrsuuuu0q1bN2nUqJE89thjodu//PLL3nbua8KECSU7ZhJPlIoavkdRitRq+N7s2ZJIdAXUFZkJIYQQklzKkVPKtesJCWonpDZoKhXE3LlzZcMNN5TDDjtM9tprr8ifmzhxorRv377u906dOhXpCEmpqu81asRrnUSQtLKc96Zayg2HGYWzZknF5IijKEUIIYQkG3pKkSRRyfY7qRFRavDgwd4rLp07d5bllluuKMdECp+Dxo05Vxi+l2zefFPk+utFzjxTpE+f8hxDLXhKJVWU8vOU8rsHc+eKtGlT2mMjhBBCSHlFKde+p6cUidJOSG1QUeF7udK3b1/p2rWr7LDDDvLSSy+FbrtgwQKZPXt2xouUtvpekJcIRCktH4uJL0kWI0emQ8vOOad8x1AtOaXCPKWS2iWpEYHnOSinFCKu999f5MUXS398hBBCCElOonN6UxNF53fFboMkuVS1KAUh6uabb5aHH35YHnnkEenVq5cnTCE3VRAjR46UDh061L26d+9e0mOuJeJW39O/A+aUImFtqtJFqbBn4NdfpWLD9267Lf3/qFElPjhCCCGEJCp8z0ZAkNqmVMIoSS4VFb4XF4hQeCmbb765TJs2Ta688krZZpttfD9z1llnyfDhw+t+h6cUhanyVt+DYKWTWwxgLVpkilLlzmNEkkO1hO/5DcgdOqRD9yohfA/PKOAqKCGEEJJsypXonKIU8ROlmOi8NqlqTyk/NttsM5k8eXLg31u0aOElRbcvUtpE5657L35X0UoHMCtKUVEnbpvStlRN8fTLL1854XthOaUIIYQQkhzoKUWS1AYpStUmNSdKffjhh15YH0mWKNWyZfrn339v2BlBdNK/a1JEK0px4kvcNlXp7cJPaFVRKqmeUjZ8LyinFCGEEEKSazth3Lb5fYq54EZPKeLXNirZfic1Er43Z84c+eKLL+p+nzJlinz00Uey/PLLy6qrruqF3k2fPl3uvPNO7++jRo2S1VdfXdZbbz1ZuHCh3H333V5+KbxIsqrvdeyY/vmXX/wn5AgH+u03f08pdl7EbVOV3i78Von0GamE8D2KUoQQQkhl2hzHHy9y3XWFz9/qfg8Xrohf22D1vdqkokSp999/X7bbbru63zX30yGHHCJ33HGHzJgxQ6ZOnVr3dwhRp512midUtWrVyhOnnnrqKRkyZEhZjp8Ee1aoF8jPP/t3RpqjRkUpKurEj2ppF2GeUgjfS2IetSjV9wghhBCSLFy7e9q0tK2x3HKF/R7mlCJR2iDTstQmFSVKbbvttpIK8SmFMGU544wzvBdJfvU9nXCjshh+DxKlNHyvWsK0SGGpZk8pfUYwcM+ZI9KunVRE9b0kCmiEEEIISeO3GFyMRSX3e7hwRfzaRiXb7yR3ai6nFEmegIBwH1QWw8QVE1i/zsj1lCpVpRBSOaDt2EEN+cmqSZRCXrVWrZKb7NwvfA/3hAkrCSGEkOSi4/TgwcXN9+TaA7rQTAidDQhFKZKISSy8KzRnjmK9Kxi+R+IaO0nNvRQFP6EVz4gm/E9iclC/ROfuSmih81MQQgghpDDj92qr1Xtl+3oxTZok8vTTIiFVzMNgonMSpW0k0cYlxSf2FOGCCy6Qr7/+ujhHQ2rWUwqssELm39u2rf/ZnYxTUSfZRCmEghargkyx8fMuQlirirNJdHm3OaU0fA9Yz0e/0FxCCCGEJKMatq+dgYSvO+0k0quXCPLyrr12+ndUJ8rhe5Qk2jKkPDB8j8QWpZ544glZc801ZYcddpB7771X5tP3khRgEASup1SbNsGeUtWSO4gUz7sIxk6lrrb4eUrZsLgknpf1fISXo80rpVCUIoQQQpJrj/sWKhk6VOSFFzI/hN8POCCn71GSaMuQ8mDbBsXK2iS2KDVu3Dj54IMPpE+fPnLKKadI165d5dhjj5X33nuvOEdIakaUUpdhpU+faDmlKEoRd5VFjSp4S1WLp1TgCmYCw/eAn2FLUYoQQgipoOq5CNl79tmGhgl+x/sxQvmY6JxEaRtaJIfUFjll+IAgdc0118j06dPl9ttv9/7fcsstZYMNNpBrr71WZlVyMhdSlup7fuF7hx4qsu++IqNGNQzfo5snCfIugpeOljGu1K4oyFPKFWeTatQCilKEEEJIZYbv1dkZX34Z/uEvvoj9PUoSbRlSHuy8jkVyapO80s4uXbpUFi5cKAsWLJBUKiXLL7+83HjjjdK9e3e5//77C3eUpCY8pVRIUFq3FjnoIJE116wfJDValJ5SJKw9aShopXtK4RmoNFFKn+ds4XusmkkIIYQky35qMHbDCA9jrbVif49+RxJtGVIemG+M5CRKIYTvhBNO8EL3EMLXt29fGT9+vLzyyisyYcIEOf/88+XEE0/k1SWxRCk7AXcrdTF8j8RpTx06VIco1b595eSUCgrfs+G1+qwnNQSREEIIqTVCc0ohqfmgQZKyA7huPGiQSM+esRevWrVKri1DygNDO0njXEL3NttsM5kyZYrcdtttMm3aNLnssstkLaOUH3zwwfLDDz/w6pJQ1FNCvSd0kNKJLcKwFDd8j4nOSVh7UlGq0sP39DwqIaeU6ynlJ6BZoZnGKCGEEJLw8D0wZoykdtgx80M77ui9n8v36CI07QCiUJQisQt077PPPnL44YfLyiuvHLhNp06dvNA+QuJ4VlhRyl2QccP3mFMqeeA+lvOxt0aVhoLSU6r8OaWsp5RtHzRGCSGEkIQnOgcdO8riJ56REwZNlm6/fyE7n7SWbDK0Z87fQ08pki18j0Wsao/YnlLIHdVRE7YY5s2bJxdeeGGhjotUOUhip5UV1FPKzZ/jJ0r9/nv6f+aUSh7WC6YcVFP4nnpKueF7lV59zz63FKUIIYSQhIfvGUFpRtueMq7zYJnTtWde36P2PqusEdu+LLQRa4/Y08gRI0bInDlzGrz/+++/e38jJAp2cqoCVJinVI8e6f8nTEh7S1GUSh7lFqVUyLGeUpUavqeDc5AoVUmJzu1ql31ukyisEUIIIbWGX/ieO0bb8dv1aslVlILdkOu+SHWLUvSUqj1y8pRqZJP9LOPjjz/2qu8REgWbE8pPlHIFjtVWE+nWLT1IvvsuRakkYu+ZesGVEjVs4HnXpk2mZ121eUolQpSaNEnk6adFJk8ODd+zx0pPKUIIIaS847X7t3WmPC1d50zO6imVb/VctQGsvZ8Ie4aUHVec9PF/IVVO5JxSCNmDGIXX2muvnSFMLVmyxPOeOuaYY4p1nKTGPKVchRzNbautRB54QOSttyhKJV2UgsGinjLlWOnTxPjz5knVVN/De4movvfzzyJDh4o8+2z9e4MGSUsZI3OadQzNKUVRilTF5O7LL9Nl0GNUnSKEkKSM116CcqweLvvbCcv+NOeYQTL5cCQv79jAzihEhIIKW7APYNfjEPA9upBIahfXU+qXX8p1JCTxotSoUaM8LykkOUeYXgdTFqp58+ay+uqry+abb16s4yRVhh3cNKeUTmKDJt2oSgtmzsx8ny6eycA6UJZblFLX8EoVpXQVsm3bzGciETmlYMS+8ELGW6kXXpDTlj9ALtj0mTqR2U8YpChFqnJy55Nnk5BYUOwkJRqvvd8POKD+Z0Obt1+QLX4/QG5f+ZnQ8L1cbRDr0Q57Buk46ClF/EQpDLmktogsSh1yyCHe/z169JAttthCmpV6xkmqCp10Q8hQMcOKGn7hX7qSMndu/YQXUJRKpqdUqYGx023OJNngmy+lzbdriUjPumqNlYYabuhm4S01e3Y6hPWbb9Lvl82Iw8TJTsqX0WjJEun3w7Oe+3/jxmnvEV23sHm9KEpVKJwwe5M7iK+N/CZ3zzxTvntDKhuKnaTE47U3EPu9v2wsX+nDZ6Vrh8mycGGmJ2ghql7bgigqSjG/JLFtQ6EoVXtEEqVmz54t7ZfFkfTt29ertIeXH7odIXGSIkfBilJWE6UolTxKfk9+/lnWOG6o/OvtZYbW4yIXdBokV248RlIphB5LRWFXE0ePThtt8P4qu6cUwpZCQKloV5SyFRApSlUYnDBnTO4aBU3ukKeFoXyk0J4sFDtJEcfrbGO5K0oVYvy2tn+icmSSsi9M0VOKNI6aT2rmspip5ZZbzvvdfen7pEYTJeZRKS0XUcoOjm++KfLjj3kfEsmTQiTBzJmhQ6X9u5mG/UY/viCnfXBARa7C2ecDYa0axld2I27NNUP//G3rteqeaa2ACC8vhaJUlYV+1ArZJndffFGqIyHV6MniughYsZOQIo3X2cbysJxSudpVtiBKInJkkuwLUzvtJNKrl8iQIek8Kvi9CAmfKEqRSJ5S//3vf+sq6+Fnv+p7pIopwmq59QSJK0rBC8eGZaFCw/nni1x/fU6HQgpEIZJgFtKLoUkqHVI2+3+TpUW/ykpIbPNjWcouSsEgwbMPYcLc8FSTJvLB8jvKjLY968I41WlWPaUQkmvDcitRLKwpsoV+1JJ3ULbJHVaPCSmG2Fkrzxgp2njthR271YV23NH70f0bxvJZm6TH8vaLgkWDnMbvSZOk60dfStc5WLzqWZeGg6JUgimhJ6c2Q4iVaF9MdF57RJIEBgwYUPfztttuW8zjITXSKdm48qjY6ny//Zb5t6lTczoMUg2eUlkM+8UTvhCpMFFKr58r2iZiZRFiNJ59I1gs2XZH+XuTMRnPtHpKaU4p1xng999LdLwkNzhhbji5e/4FabTUZ3JH4YDkQi2KncxPV1rGjJEFex4gLV82CwzoszCOYwFx7wOk+X/r/7Zg6x1l2ogxIn9vaGfk7OlsFrYHiniv6T8Okqk7pqv8VWruz6qnxAtTOodYcUWRb79NNxssZNIPpnaIIQmkWWONNeS8886TiRMnFueISE24lwd5SoV5TmGyq1XVOIglj7KJUlkM+zldKs+wz+YpVVYvI3hHPvOMHLXtJLngD2O9/+c+/IzMbd4x45g1pxTC99A23C7khx9KfeAkFrU4YQ5jzBj5pX/au8BvckdIzmJnY6ejRycKj9RqEjtLGAZEDB07yk9314/XJ+40Kb2YjHG8Y0eZfX/mWI7fm6zY0dfOyNlTymdhu+vnL8iBT6TDwGnPJ5QSh61r+1phhfp5BCJhSO0QW5Q64YQT5JlnnpF1111X+vXrJ6NGjZIZM2YU5+hI1XZKQTml1BMkCBWlSPKwokNOolSuOcuWGfZLHcN+SaMmMq7TIJnTtfIM+yBPqbKH7xng3j+u82Dvf733tpqmhu9hpQueja4otSxNIUkqGqrZpAYmzFHo2FE+vaJ+Arf4czO5IyRXxoyR3zarAbGT+enKBib7Ol5Padozwz7DuGzHciz+aiEhV3jKKadUwMJ246VLZK0v0xV7KUollBIvTGkTgZ3brl36559+KuhXkGoTpYYPHy7vvfeeTJgwQXbZZRe58cYbZdVVV5WBAwfKnXfeWZyjJFXXKQVV38smSmleKZdsnyPFxc0XFCunVCFWUMeMkZ83zjTsJ3XfUf7ed4wEFApNNJ1+mST9Zj4tLaZO9m3nScvHZJOXKni21bBACB89pSoQTIyX5R6p6glzDpO7BavWmChHikPHjvL1TfVi509vVaHYyYTuZcUde6195i4ghlXFy8lTKkLF3ooSpQpY8KliPDlLtDBl7Ui/Qjmk+oktSilrr722jBgxwgvje+211+SHH36Qww47rLBHR6p2tTxXTylXlIKOoQOkW7mBlM/oieUpVYgV1I4d5YNL0ob9vX8e6xkO/z4gHVJWUaLUMoHu6qd6yQXvDpGuAzIFOhu+Z0XAchMkMmsIH5Kdu88nVsDcdkMShhOqecPJVThhjoFtwxXVr5BEg75cxc7ZK1Wh2MnqlWXFHXutoOT+TSv+utvl7CkVoWJvRYhSuSyeVoOANWaMLN62NAtT1o5MRP5UUjmiFHj33Xfl5JNPlj322MMTp/bee+/CHRmp6tXyoJw5cUWpv/yl/md2XuXDNWwie0oVcAVVvRimrDPYE0s1MX5FGDwRBToVpYrmLRXDiLKhhUGFC2yycxUqEd6Hz2IiRtfsykAnzD92rMIJc479XEX1KyTR2HY1d65UH8xPl1hRyjW9MIZbUcoufuWU6DxgYRvpFqavP8gbWyqiLx061KtUGGnxtJryp3XsKHMerF+Y+r9nircwZe3IpEYFkISJUpMmTZLzzz9fevbsKVtuuaV8/vnnctlll8n3338v999/f3GOkiRitfz2v6Y7pTN2z79TKpQoBeFBc9hw5To5Rk9kT6kCrqC6IWRabrhi2kUEgc4+HwUVYXMwomw1TL/wPddTSk8L+So6dUr/zGTnlUVJCxgkEDtBq5h+hSQe2+VXZbtifrrEilJun46FL138Qn9n/55zonOfhe0fNtxR3j4pvbCdeFFqmW3WKOriaZXlT7OenMXM0WrtyEQU9SHJF6XWWWcdefrpp+X444+XadOmyXPPPSeHHHKItNPkIUXk1VdflV133VW6desmjRo1ksceeyzrZ1555RUvIXvLli29yoE33XRT0Y+zWvl5hXSnNFl65h06FFR97/DD0///6U/REp3j8yo+JH5gq9GcBaVaQXWFERVNKsbIjyDQ4dz0mSnoYJ2DEaXPnRXIgsL3kBfAroKpKMVk55VFrYtSDN8jxcDaU1XpKQWYny7xnlI33JBeNLKLX0Hb4v3I44FPxd73LnxGmnbqWBm2e5zF0yrMn2bbTzEjUmz4XpKK+pDS4UgC2UGCc+STKgdz586VDTfc0Mtdtddee2XdfsqUKTJkyBAZNmyY3H333fLGG2/IcccdJ506dYr0eeLfYWAgwiBiPSUK5Sm14YYi990XXGWvbdvM3/F5HAeEh8QPbFVMzp5Sy1ZQlzz3gjRJLcm8sVhZi5GzrOJFqYgCHQZrfQYLghpRLtaI8rkPVpRCdb1snlLW4KCnVGVCUar+WnC8IcUYP3//vUqvqwoT2032klu33WgtOe1ftR0OXCpcfcQvp1S3biLdu6d/xsIXxml8Dv2cRijY/WBB6aijRLDOH7XQELxt8ALYvy6wJb4vjbN4GkXAqrDKtaUSpRi+R2J7SpVLkAKDBw+Wiy++WPbcc89I28MrCpUBR40aJeuuu64ceeSRcvjhh8uVV15Z9GOtRmzHlG9FhCBRCmAA1JA8F1eswiSYnlLJE6XeeCOGJ8+YMV6lvHxzlgWF7yXe4IlZ6UTPq2DGQY4hlHZ1P0iUsjml7DOvYtWcObkeNCkHtZ6YnjmlSDGwfWnVilLL0DAgFSdIMsL3rNkB+1ttbdse3f0g/P7rr3M7JnxfxdhounjaKELBpyrMn1ZqTynmlKpdIolSyy+/vPz444/ezx07dvR+D3olibfeeksGDhyY8d6gQYPk/fffl0UB8UULFiyQ2bNnZ7xI4UUpHQjd8L1suDml7MBWMR4xNTBZffddkYcfjvjhjh1l9H71rt2e504OOcvUsK9YTykwZoyktg8X6Are3nM0ouw91/4grPqefeYr8t4Qekqx+h4pArYvrdrwPckxxJ+UJHzPHbt1jLaiVCEXJWCnVVQxmjFjZMIqERZPlwlYSOReyIrltbAYw/A9EkkSuOaaa+pyRuFn5HOqBL777jtZaaWVMt7D74sXL/ZEtq5duzb4zMiRI2XEiBElPMra9pRyPSvyEaUqYmCrEaMHQFeKmtcRIWl1rt0982tT2j1VpPDRsaMsfPwZOXFwOsTh7NvXkubrZV6QghtymoQWOaSWRA+htPc8W/iem1OqIu8NqXlRynq0cLwhhaKWPKUUJjBOtiiltrYVSf3svFz7QZs3qCL6Uiye7vuMzB6Xts0uuHutYIFpzBiZud0B0uXjZwtWsbycMHyPJEqUQiJz5dBDD5VKwhXQUstG/yBh7ayzzpLhw4fX/Q5Pqe4aaF3j+HlG5LuvuJ5Sbvie5pSqmIGtSvFbQYvjpazGCcAjmovuHZRTqtLaBa6lCnSNfKKliyLCwliCgmhySy3ZfkdpEmJE2XuuopRr2Gr4nptTiqJUZcLwvfprQUGVFIqayCnlQE+p0uGKSfbaZxOlwsL38hWlKm1BGcc7McriaceO8urZz8gLN06WVeZ/Ief9ey1ptHbleUj5ieYM3yOJSnTepEkTmTFjhnTu3Dnj/Z9++sl7b0mCrNYuXbp43lKWmTNnStOmTWWFFVbw/UyLFi28FylN+J5fTqkw/BKdV9rAVo34GStx7q195GAwRU2c6XcM+r1qVEEQqdRr6edJWBRBZ1kS2gsPmixLJ30h37ZeS079Z0/p1TFefxDkKYXVVluhj89sEUH4K/KEQRUucKhArSc6t+YNxxtSKGxfyvA9Uuj+3rXPrLCQb/he1H7QrdhdiflgbXGXbIunuOa6uPj7yiJOkEdFUapxj+F7JHaic/U08svF1DyXmWQR2XzzzeX555/PeO+5556T/v37SzPUPSVlE6VcASEXTykMCHgxp1T58TNW4hjXtuvIdaXYzSnVo0f6/6lTKytUIJsoVUxD7rt29Ulov/8++j2fMsX/eCEi63s//5z+n55SRQIXeKedRHr1EhkyJB2Wid9/+aVgX1HropQ1f+gpRQpFLeYqo6dU6fr7fDylrB2XjyjlfrYSRSlbcTybTVnIyJJyw/A9kjhPqX/84x91YW+33nqrtDUuK/COevXVV2WdddaRYjJnzhz5wlSCmjJlinz00UdegnVU2UPo3fTp0+XOO+/0/n7MMcfIdddd54XjDRs2zEt8ftttt8mYCo3rrSZRqtHkSdJv5pey4i+I8eqZU04pHUQLXo2M5BU6t+mmKDIQT1xywxc07CuXY9DVq06d0p46qPwG0QS2WyVgc2P5rcQVU4SNY3zYbb/6yt+wxfHjHsBO9hOlaiVUpSQMHZrOC2bB7wjLRIK3AlDrolQtigek+NSip1QlLRRVen/vCkJRckr5Vd/LR5RyhTHrMQ1bI9e0DaXE+jLgOQ0LqnHTG/ikMK4YGL5HEidKIcG5ekrddNNNXhifAg+p1Vdf3Xu/mKBq3nbbbVf3u+Z+Qs6rO+64wwsrnAq3iGX06NFDxo4dK6eccopcf/310q1bN09c22uvvYp6nNVKQUQpzEyHDpXBzz4rg/H7uyLyyaB0TpsI1dasKKX5qJifpvzu4joAQ4DYfff4opQdwHMVKtycUjBwsHj43nvpQ64UUSqbF2Exc2XFqbLiF7Lp59kVJkpVygpp4kEDN/nAMh4svD95ckFC+RIUnV/VVYhIbWEnfbUiStFTqnT9fS6Jzv1EKd3P5punbXFoYLmKUjgGGw4HYcr+XgkFCcIKzvsVgqlUSuUp5Re+R/G6togsSsErCUAUeuSRR6RjzHLthWDbbbcNDB8EEKZcBgwYIB988EGRj6w2KIg76tChknrhBWmU42o+wrwgRmHF3vWU4iShyCwTFDOMIVRtGzNGli5N9we4J2rMxDGuiyFKAStKVQp+52EpZnuPY3z4CRR+x6xebz/9lP6f4XtFACJxGPAwLoAoRU+p+mtBTylSaZO+JBFiypMC9/eFqr5nt41rh7j2Aj5nPY2OPFLk+uvr81BWekGCag3fK+Y8y1Zo1pQetdIfkhxzSr300ktlEaRIFXhKLVvdaeSOTnZ1JwvwflHRQyfAzClVfndxO5j4rbCVIizGT8xZffX0/9OnS8Vgr6UfxfQMzCV8z7ql+3l3tW/fUJSyzywnJwVgzTXD/x6nFGYIFKXqrwUXQUgx+l16BpBC9/eFDt+z+aCiigauMIb+E/a8fi/SLLz9tiQailKsvkcSJkrtvffectlllzV4/+9//7vss88+hTouUo2iVJTVnQjoCg5zSpXBXTxAUGz85eQGnlJwz4/qol8sTyk9lkqaQGYL3yuVp1TU8D3k7lL8hLR27TL7DNtGIEhxElYA4BIIr0W30eB3vF+gKny1Hr5nBdRK6lNIsrH9bi2FtXFBIr/+PuX090sb+/f3hQ7fcxeWouAeg3rC2DHFJhKv9NxvDN+LOb94+mlp9139PILhe7VJbFHqlVdekZ133rnB+zvttJOX7JzUjigV26Ao0Gq+K0oxp1QJyCIoNvv6iwaeUnEEpmKJUjqwVZILcLbwvVJ5SmWbdOs9s4ak3zHr82pFKdwXTWrKMKgCgbx8O+6Y+R5+z7Owh+3na30SyUTnpNjtCt6Ifvn6qgG3/6h1z8u8GDNG5m6e2d9/v75/f59P+F42T6lcwve22AKpYBpuk3Q7jZ5SBb5HTgXJgy5aWy54Zydp8fsvDN+rUSLnlLIV8JDY3KVZs2Yyu9IDZ0nkDhk/Y7Cyicejru4sff4FabzUjFAYDTF5iriar6KH6ynFyW0RySIozlt5rTpjRQ0WGCtoI1FyBFjjNNdEr35iTiUm1M4WvpeEnFKYXOgEw4pSft5d+rxqsk9sA0EKwhTOAc9tLtUWiQPC6p95Ro7abrJ0+/0L+XG5teS6ZwrjIUXSMNE5KYVY4yaBrhb8QrhsRTMSg44dZdrNz8g1x6X7+29bryUb7NlT/uKTXSUfTylrj1kbK+6Cn34WOWHPOst/m6TbabmKUpWe6Lxo1fd8UoJs9OMLsvI/DpA5D6ZzDNOTvraI7Sm1/vrry/3339/g/fvuu0969+5dqOMiCcQd2HLSIMeMkRnr5bea37Zt5iCqKc40Zw0pXXiQuovP756e/Oqf4+aVsm0LldoKJUpVYhL8qOF75cwpZbeL6imluG2EYnJhjccZbXvKuM6D5evmPeX44/M36mo9ZM9CTylS7HZVzRMxP1GK5Nc3a3+P/2fODN7OYkNEcw3fi+uxHbTYdsklleMpZa9jnPC9SvfXKEohhoCUIE1SS6TLR89Km28nV3VfSArkKXXeeefJXnvtJV9++aVsv/323nsvvvii3HvvvfLQQw/F3R2pcFHKJjmORMeO8twpz8hbd06WvTb8QgYdv1bsfCeup5TmtIGYAY8brMSQIgDhEFUSTfW96evuKN3HjJEl/5dpcECIgGduVK8nOy49+aRI9+6eN2/BwvcwsOHvQd5HlRi+V05PqSBRyk9Ic0UpFigoHu7kY+pUkW++EVljjcL1+/iOIMG01hJS1/K1IIWjVkQpvwpspHDX84cforUvO7bnEr5nc0rF9ZRyv6dPn7StN3Zs8kWpOJ5S1SRK2XZWsGc2S0qQVtOREqRn4tsEKSyxp+9/+tOf5LHHHpNLL73UE6FatWolG264ofz3v/+V9lpmidTEAJhrR6urO9/17Yk+JzZuTimEh8EFHKs/EEI6d87tuEi08KBrjp8ss95Pu4v32aunnNCxocER1wvGbVsfflgYUcqGQGBwS3oizXKH70U1PoKSk/ods80xBpgLrnj45aLJNUdb0D7Rz9aqEOPn6RErhJ2QGhal6ClVWHQcRkYVtJlff4123a2nlKZOCPKUwn51sdfaJrrgFzenlJ+NUCke7XGEJobv5ZcSpPHaa9W1P3iAaw5SUt3k5DeAROdvvPGGzJ07V7744gvZc8895eSTT5Z+/foV/ghJ4jpkN3FxXIJWZnIVpdBZrbhi+ucg92VSOGa2r3cXV9HJFYT88hFEaRNIgAmCjKu4ohSMNR3Mkm7wRA3fS0Kic7udFZ2ihO+pJ2Ml5vtKOva+wNuwEO3EL99NreJeC7ZdUghqRZRyF5/oBVGY66ljcND11Pbl590UZG/YxSZd2MgnfC/MrqlEUQoL4FG3RU6pSi4SYs8Fba4gBQoCUoIsadREfth4kDRdt2dNViStdXIOZoFn1J///Gfp1q2bXHfddTJkyBB5//33C3t0JJEdkyYlzlWUClqZyVWUsiF8P/6Y2z5JdOyApAaJuwqWqyilE+lcRCkd9K0wogm1K8HgiRq+Zw24Qhs6UcP3gjylooTv0VOqeNj7p7n3Cu0pVa0T5ijQ04MUA7cfr1axhs9Pca6njsFBlRtdUSpKTikboqd2nN02bqLzKJ5SSW/3cUQpayNhzEz6uYXhtqlZs4pXMfijFXeUT84aU1d9D1TytSNFDN/75ptv5I477pDbb7/d85Lad999ZdGiRfLwww8zyXkNoB0TwuWmT0+OpxRQT6mgmHpSXFGqUOF7K6yQv6eU6+arlQArRZTKFr6nBigmMjB21Dgs5HfH8ZSKG76n2xTT46tWKYUoVcurlq6nB9suKQS18oy5z8+MGeU6kuq6nnYMRttxbQIrXsG2spN8tef8crFi7NYqyvb7tMIyiGpXhXlKVcrCYa6eUuotVakVNd1zwfxPbfVCpAQ5YdBkWfHXdEoQRGCc2CHdHtHO8N21vBBWa0T2lIInFKrrff755/LPf/5Tvv32W+9/Ujtox9SuXTwvGJewQTAK3bplClH2Z3pKlVaUUiPC9e6BcBmnIqIaO3ofcxGRgsScSgsTyxa+Zw3OQp4TRK6opX/1WltPtLjV94pZRbBWoadUcWH4HikGYYmoq/k8x48v15FUB64HFPCbwOt2OlZb0TPMM9utwGdtE+vdFMVju9pySmH+E9WbXEWpanluUTylkHzTqj4liLUR1VuKolTtEFkWeO655+TEE0+UY489VnrGrJZGqgPtZDWffa6iVL6eUuusI3LVVSKrrNIwfI+eUuUN39N7uvrq6f+nTIm2T/08vDts0s4uXaIfV5BxVSmrcFHD9yAEqfcXrr8KgKUMIbHGqRWlglZBdcXLbqPidi5ecSS7WMjwveIb5xRUSTHaVbVOwihKFS/ROcZV/I5xW8dWdztdoItSfc+vAp9f9T3dXzYvoGrLKaXeUkEVyAtVGCqpnlKFAnane63U9oXtiDZRrSI9ycNT6rXXXpPffvtN+vfvL5tuuqmXR+oHKgA1hXZMOtnJV5TK1VMKEy7kyLNhQSpKffddbvsk0bEDSFD4Xo8e9aJUnFU0fF5zlsUVK/xySlWSwRNHtFUhqpCegX4TI7/8FHZbW4VHf/d7Xu2zque18srFWXWrZex9iRtCm22f1R5aFAW3L6MoRYrRrh56SGTcuOoWzdFHYfyid3v+1xNjqnqV+PXPYZ5S2cL3gF/4XlyP7TBPqbj5qZIkSkXdtppEqULabK4gZdsIPaVqj8ii1Oabby633HKLzJgxQ44++mi57777ZOWVV5alS5fK888/7wlWpLbC93LNVZJvonM/1GsKOQr8OjlSOKxBE5ToHIJDs2ZpYyWKUGhFrVxFqSAPo0oTpbJ5SoFVV03/P3Vq4b83yop9kHEadMx+opQmtZ82LccDJpFEqVwXD9x9VrsXRxTcsaVS+hSSbNxnbNIkkQsukKo9T/RN6k395ZdlPaSKxo7DOoH3E3bcMD/bh4eJRe4YYscX9diOKs5H8ZSqJlHKCrCgkqfIKpprGyu2KKVtRG3L226r7cWwWiJ29b3WrVvL4YcfLq+//rp8+umncuqpp8pll10mnTt3lj/96U/FOUpSVTml8g3f86Nz53SHCcFr5szC7ZdkT4aNAcs1OPD/aqtFD+ErhKdULYlSem2//rrw32sJumb2ftsqKUHPtM0r5YpSyDuWbzJuEixKFTrR+VtvVXZ563xg+B4pBrWykGb7Jx3n8xXNaxk/USosp5SOCbCTdXE4TCwKyylloyaiCC5RPKWSbqPpOag9E0WU0vlSNXhK6WIogqQKtTgV5ik1cGBa1Pv8c+afqxVii1KWXr16yRVXXOFV5RuD0o6kqim0p1Su4Xt+oOPScCB6XpQupxQmp1jd8jM4NITvq6+i75OiVDTRVo2DQopS1jjQ+xi0chknfC9IlMJ7KL4CGMJXOaLU2LEin30mNQkTnZNStKtqxS8nUdKFiCTjtzjkJxa4AokVA3MJ39MxXIXFWbPiHatLpbQFPQdNFxJWyEe31WtUyZ5S9lww10J/VaiFxDBRao890jmEwZw5hfk+UsWilNKkSRPZfffd5fHHHy/E7kiVe0plqy6WK+p5wQlu6UQpdd32u6c6cP/yS7zJtAoVUT4XtI9KdA3PxVMK4XuFmtBY8UGN0SAjMSh8L+hY/ML3AEP4itd2NKltoXJKQUTs27e2c/fptdAJYNInUaQyCMrdV21iVTH6p1rGikQ6Dod5SiGlgi4QqUgSJdG52vru4qPmtozi1R72PZVio+k5rLBC9vN2Ralq8JSyYnKhnlt3PqHfE9QGSXVTEFGK1GaicytGlNtTyuaVoqdUcXEHEUzM/DyltEpjlMHYJr+PY+jUavge2jpWrGBYxhXvsn0v0AlDlPA9K0r5GRjus26r1egz++23uR41KZWnFPapz2Ylr/oWSqADnFCTQhAkPlVbHhUrTGQbY0h27DgMwSmbKIU+XBeVXVEqLKdUUPheLp5SYeF7Nqwwieg5LL989vPW61pNohRszkKLyX6eUpqHCxTKjiGVAUUpErvzUFEq146iGDmlrNdFIcuVkoao0aADR5CnVC6iFD6f68Q3myhVKRPIKM8HPDV0tS7MhTyX77UJTINWLq0hawWnIINygw3S/++8s8iAAfXvW4Gb5I+9L4UWpdAudEJTq670bm4WTqhJMXNKJd1zJC52jK60cbmSPaXsuBAkSuUTvhfHU8pPlNK2oEmtkypMaftVb/4onlK6bSUv5BTzuXUTwrtiPEWp2qLAviqkFlbyMPhhUozBD4OVFanKVX2vWlYkKmFw0raA+46BFm2gUJ5S+Hycz1n0uFyjp1LKDcfxlNLrj3Laiz+fJPLFlyJrrSXSs2dBXbSz5ZTCtkHGhGWXXUS22y4zt1QlerElHXtfCmXM2efKDf2odVGKE2pSCGrFU8r2TwzfK32i8zBRKp/wvXxzSkEQwz6xzZNPiqy9dtpeSBq17illw24LZbPpfBBjqrYzO65SlKot6ClFckqCnE+58bCVmXygkVN87AqWipEYnPLxlHKr9+UqSlmPDkulhQlEFaU6NflZLnhnJ1l3914iQ4akLbmddso5ns8veXnQpDvoGMMmUa4gBShKFT98D8JiPivPYROaWoPhe6SY7cp6jFTSQkpUrKjBvr9w1zNbonNrX7kV88JEqajhe1E8pcLsGthsNn1AUsV+1/sJolSQoFyNOaWKkQvOr/1ZW13tRobv1QYUpUgk7ICBziOf5HPFCt+rNPGhErGTW52gYnAK85SC8ROWsNUKnq4oFSfRa5B7eKUZv1Gfj6FPDZWNfnwh880XXhA54ICcvjdOsvmgax1X/Ki0e1OJxmO+BqRf6Eethu9pf8TwPVIKUYqeUqSQopT1RM9FlHK3jeMpFRa+51LoBetiiVKwd4LEEtdTCjZOpT7PxRSl/HIMayoWoN9HUao2oChFYotS+eYrKVaicxvrXG1Va5KCFZB0gmoTnVvDRv+Ov4W1E1fwVKMp2+eC9uMaV+r1U1WeUpMmyVpfPCtNUk4yEly0Z58VmTw5r+9dccX0zwgPjHOt44pSlRZamXTsPUT/qhOVfAxIu09dZa9VUcqtQFur14EUFnpKkXzaTZzwPbcPjxK+53pKqW2SS6LzKIvRSfeUwlxDxZKgc9frirFCvfcr1cPYhvAXK6cU9n3DDSJnnSWy/vr1f2f4Xm1BUYrkJEol0VNKOy90oJzkFgdd6cEgaw0WHWytkAIjSQewMNdl11Mq6uei5pTSCWQUw6liRKkvvwzfyRdf5PW9mkQ9myiVr6dUpQmGSce9L/qM5iOe2OeK4XvRE90SEpVa9JSil2xxPKX8bF8/Tym1raJ6SmEcCMsplW0hOGpagiTbA36VaIPsSt0Wi0M6bv7+0SSRp5/OadEwadX3CnWPbDoXeEhtsUXm3/OZa5LKg6IUyctTKpeOoliJzjHBtRXhSOGxA4gKF7femh5n/QyOKPmhXFEq6uei5pTq1KleYKkED7pIou2aa4bvZOTI2Lml/ESpoMp+QcfI8L3y4hr+hRCR/HJK1aqHkJvoFtc1qHIaIVHRcckVpfy8XioZK2owB2hxRCk/IdNe9zieUnah1y93qAoz2Mf//V/0Y/Xj5JMrU5QKWpiw59uleTr/5yo7FCb/ZzWG7wW1C3pK1RYVJ0rdcMMN0qNHD2nZsqX069dPXnvttcBtX375ZWnUqFGD14QJE0p6zNWcUyqX8L1ieUrZUvYUpYqDHUD+9KeGf3fvqQ7cUUUpnUznI0q5wpiGosHQqYTJdKQVxbXXlpl9B8mSRgEP0Ztvxs4t5Re+FyRK5ZLo3A+ulhcWdyXbzR+SC1bs1QkNFiNqUYzRa4F+TcVvb6V8UmWugJNktSv1HK1WUaqYk9taxIpExfCUwj41zYYV4HV8wd/Ua/SUU8LHmWx2zQ47iOy/f7LbhD2HbKGL9t4c9XJh839WU9XMbIWvWOm2tqgoUer++++Xk08+Wc455xz58MMPZeutt5bBgwfL1KlTQz83ceJEmTFjRt2rZx5l02sVK0rZyUkuk/xiVd8DNHRKI0o1a5YWLo46KvPvbntQz4ooohQGep3oFVKUgmGl4tgPP0jiiermPmnEGBm/3Ob+f8wht1SQKOXnXRaUHyKuKMWcUoXFvS+5VrL026cN265Vd3p9FnB90ae0XfiztNxjJ5FelbkCTpJnX1WzKGUFEC5IFO56Rs0pZavvRfGUgj1mK+z5bXvGGfV944wZ+S1GJ71N2Osd1VOq+VeTpNdXhc3/WWrswlSxckpl85SqRXujFqkoUerqq6+WI444Qo488khZd911ZdSoUdK9e3e58cYbQz/XuXNn6dKlS92rSaFddGoAd6Ksk51c8vQUK3wPUJQqLu4AsuuuIo8/Xv931yiJE75n20MUD6s4Yk7nzpUjSkX1JGzRpaM81PPsguWWsgYXDFEYIHjP7xl3V0w1mnDAAIlF0o3QagnfK4QohfaIhQTtYys1aWshV8pP+3CotHq9clfASbLalet9WCueUpUQVl+L1ffc/Hl+i1FISr3GGpn7zHWxLen2gD1/tVGzVShuNrXw+T+T8NwWOqdUUPvThTD2E7VBQgtvNmThwoUybtw4+etf/5rx/sCBA+VNhKqE0LdvX5k/f7707t1bzj33XNluu+3iHwBkWr+nxi756HZBuHW642yrmQb9wOxR5eS42+JJD1qmMz0CNmm+ZJ40k6Uic0VWaCnSYrHI3Jk4j8xtG5Rkc2jquRe3qfeUCtnWA8erLjTwTQ5JXNOqJc6tUVrFz7Ktd311hMRIHubmEWdbtAdtK3G2xXZhVijcSvSixdkW1yAs8zusGbg+Rdh20e+wfJqld417Nn++4M6ceYLIbbeJ7LeLaQ/Nmkn79mlL6bdfl4jM9R/Flv4m0nRpM2nSZJlVtXSpLN9inte+foeI5D4mOFa1wNAwly3ZoF3hM03mm8/gQFu08PJKTZ6Ukp+n/S5iKntksGxbDzw/YbGpcZ77mH3E0qXp595rbiHbtmvaWGa0zpJbqlu39D4i9BGpOenr13JpI2natLVnjP78s8hP38yT5Zo5fcTc9LZ44Vm++GKR8eNF+q4zT2Ru9v7EY/58ablkSXofi9Pfn5EPLGJ/ErePiLVthfURSxei/TZNH8aiRdKx+cLg5yhqH4Ghb2lzadw43Ud0aLNYlv62IN33L1tFD+xPlvURgdhnOc625rnPe9s4z/0CXK8W3vVdc/FE6ffDsw230RXw//0vs4xQAfuISrUjYm+b7bmvkj4CYxae047NtU8VWdSkpSxcWF12hI4xzaS5tGxZ30cs+nV+3eNa8X1ECe2IRr+nr2fzRSKtl9nkuMYyL/O5bzJ/rvc32Egdmoq0XJK2u76ZKNJ4Adpjq/rpjfPcd2otMnWxyOwZIo3n45loXS8sLdsW84Hpi0XmfG/GGaePSP0Om25pun37nWabNnWnt/i3eHZEqfqIZgtFGi0WaTxPZPXV0nONDz8USc1fII2WNNw2hfvRpatEstESZEe4fUST+Qvr2hmuJn5eBA+xufn3EWiH2F+rpU67WLatdzlSS6TZkvmeHWNvZx3sI5JvR0R1dUtVCNOnT8cVSL3xxhsZ719yySWptdde2/czEyZMSN18882pcePGpd58883Usccem2rUqFHqlVdeCfye+fPnp2bNmlX3mjZtmve9y4pLNHwNGZK5g9at/bfDa8CAzG1XXDF42/79M7ddbbXgbXv3ztwWvwdti/1Y8D1B2+L4lvH996nUJ8sPCN4W523BdQnaViS1yy6p1E8/Ldt2771Dt03NmVO/30MOCd324pNmevv2bvFxx4Xvd8qU+v2edlr4tv/7X/22558fvu2779Zve8UV4du+9FL9ttddF77tk0/Wbzt6dPi2DzxQvy1+DtsW+1LwHSHbzjj3Ou/6HnlkKn3sYfu94orUQw+lvO3vPund0G3v6Xl+ar/9lh0DrnXYfnGvFNzDsG3RBlKp1C23pFJD/zgzfFu0LQVtLmxbtFlL2LYx+4i77kpfs3/9K7yPWNCnv7fd+50GpRY3ahJ+DDH6iB/apvuIU05JH8dv6wb3EXNa1/cRHujjCtRHZFDAPiI1c2b9tlXWR0y46knvnp16amH7iGs2HJ066aT0pjftGt5HeMeoROgj6sA1CdsW1zRVvD7CA20jZNu31znEu74ffJBKPXrwI+H73XLLzDYctm2N2BEe7CMi9RGnbPVu6j//qU474snB16WWLEmPL3/drLr6iKTYERZvnA7Y9ssV0nbEF19k7yOmL9fb2/azz+L3ET+tmb2PwPTOO5buybcj5k2dmdprr/Tx/jI03I74usc22W20BNkRSegj1I5YujSVOmdL9hGVbkdAQ/G0lFmzUmFUVPgeQKJyC26R+57Sq1cvGTZsmGy88cay+eabe0nSd955Z7nyyisD9z9y5Ejp0KFD3QvhgaQ4SW2LEb7HROfFJSiXUBBaxS1KmGcxo2q1Al8l4IbGBdF42fX6e98x8tGKOxbs+7U3XWml6ixLXs3EKbsdF92nXTCrNVLmWixdrUf4xpq8hZAcqbbwPQUmu82DRMoHZoxR7a9UPrZaKrr9HuZImRRwrJttlv45LJcW+PG8fxTURqslbB4rUv00SgtvlRG+17p1a3nwwQdljz32qHv/pJNOko8++kheeeWVSPu55JJL5O6775bxiDXxYcGCBd5LmT17tidMzfr2W2mvwdiV4i4XZduIrvTTp4ucOGyetG29VP79b5EffxQ55pj06d933zKP1whusvDYRIWNBU3beJ/zPlJAt/srb2gtr7zaSI44QmT3wdUVmpOE8L2PPm8u513YTFZfXeSfo7K70v9vUnM56yyRlbsskZtG+W/79dciJ5/eTNqt0FzuvDNtkSyZM0+OOy6daPukk0S23jq72/2xx6ZzRo0cKVJXy2CZK/1bb4lceklKWixJu9LfdZfP5Doh4Xuj72sljzwigm7u8P2Ct120pLHseWD9Saw2+xPpOvdLWWPHNeSA89aK3Ud8+qnIiBEiK6/SSK69pbXcfTeKS4jsvP08OeaozD7ipZdErr9eZOONRc6+JL/QnKFD0035hhvqc38FbVuJoTml7CNef6+FXH5VUy9qbOSFi2TcWwu952GttUQuuyy3PuK990Qu+XtzWWvdZoL1nCsuXSzvvrZADj88ndsb7L13+n+02QMPq97wvROHN5Up37aQSy4RmTQxJWseN1D6/PRSZhJb3CukCHjiiaL1EZVqR8TetkbC99CeEAZ0/PHppnPLLSJPvtBS9hvaxOsfq8WOQLq1m24S2Xiz5nL2+c28/mLponRoDsD4b5tVJfYRpbQjrrlG5I03xOuLMXaij4ftM/LyzOf+gtPnetHEJ58sstVW6cPab7/0aacaNZaFTVp546+3Bu8892PHitx+u8gWW4hMnNRIvv21tVx99TIba9m2sOUfekhk0CCRYcP8+4gH/j1PHrhvqQwc2LBAjkebNl4KACROX7XTPLn+n8nqI3BJ9tkn/TOuR/sureXpZxp5122LfgvkrNODt23XuZWM+7Cx3Hz6ZOk+Z7yc+s/VpPUGjo2WIDvC7SP+fctCbzjbfXeRP/xB5Oyz0wu9XjrnPPsItSX79hU55xz/bY86Yon8/O18L03EOuv47Jd9ROLtCGgpHbp1k1mzZvlrKZWWU6p58+bSr18/ef755zNEKfy+2267Rd4PqvZ17Roc49uiRQvv5dux+Qaz+mwXlTjbNhip42+LPgiK/qqrmtwtEZe9MXhh4FqEMbyNSIfmy9JroIpHSqSduygcIG0vnl//ubrVljgyOO6N3/1ZRqtlp+7ZLVm2zQAdYNRlu2Jti45VO+xCbosBI2qpwyzbLm5k7h3+ydKG1VPqx1+aSKp1m8ycQbrPFiKLG5v20LixNGnfRrYZnBY83/pEZOudAr7AlASb32RZ28KvzmH16yfyx4GN5Pnn03/45EuRTTcNOXAcaLGe5SzbZnijhWzr3v2v2/fxXkt9zj9KH7GkZfr6LV32OK68cvr/aT+2arA/9APYFp/JII4bzbLnvlFbkQWz0/cv8LgL2EfkvG0F9BFLl9mynk3brJm06dzMu08//J6lTYQ897jXSxrX28ltOjSVBU2byqzF9fvUPn3yt07DjNBH5LStWwqwUNtmee4XNjKJzjs2kss3fkBO//CAzNxSO+4oMmZMwzZbpv6k0HaEL3Ge+xz6iIJvm7A+As+PHbvQJy5tJPL+++kFme7dq8OO0HGj0bJT8eb8jZp4i5Tgg4lp0aSS+4ictwUxt7U2T9MO6Z9hj4vziOH6ZrQvbLJiOmekUmd/Oc99uy5SN4bMb+y/betO6W1+hh4RcAqYP2CbVOvgbfQR/m1xQ5uj3H0EUkbpONcYBUQa1Vcp/v7XFiJtgrdt1ESkf3+Ry1fsKTPa9pRZq4m0blM5c42FzZrV2XstV0if2+wlIh9/kZ5XbrJJ7n2E9gleKtWAa9K6XROZ0bSN/AbbONt1Yx+RTDsiYrhVxYhSYPjw4XLQQQdJ//79vXC8m2++WaZOnSrHwGVHRM466yyZPn263Om5W4hXnW/11VeX9dZbz/O0gofUww8/7L1qkcsvF3n33bQarW6nuYYUoT9DG4a4itAsrfIUdT8gat8VB7V3wxanSO7o/Yt671SUwuIJ2opfRIsuRrkhR6utlv4fXnn5hhZirD7xxHS7xcrfO++kXxCrttxSKjJ8D8Bmchemcq1G74Z+If+meklm2zYfYCeiOlxSK+5UQ/W9fCrlxdlnMcIGk4TtY1B9b27zjnLBps9I1zmTpdvvX8iRl60lq2ynbpqExGtXumijc2FUi4fHMLwUqoFsY1su1ZxrGds3h1Xf87vu6L98RSkHbKd2RdD9izLORLFrkpx+wzp36jmofQuP/qBt7XXFdYKdg+sU4htREdX3YLOde27659Gj6wW6YswptA3mU0WYVAYVZULut99+ntB04YUXykYbbSSvvvqqjB07VlZbNnudMWOGJ1IpEKJOO+006dOnj2y99dby+uuvy1NPPSV77rmn1CIQpMBTT8X/rN+EXzsKlIqNivWCL0YOIVtmmBQe9Q6OKkrBUFKDxR24s4lJOsgFfS5oP2FGz0Ybpf9//vn0q0FIUwKII/ig4iHcxzfcsHiiFK7/gQeKfPdd9DK+cdAJGEWp/HHvoXpJoz8Mi0AKQ720dZ8qLM9BlSeHgPSOVYNeC5wnPI4VrH6P6zxYfuxIQYrk3q7sop/f3yudbGNbPuJ5LWLHYRWlIDRh4flf/4pmvytBYzmq8KqdH2Sr6TgTdv+i5CNV+x0LbUlr82GiFMRUO76GiVKVKK7Y59bP2WzChNz3HbQobenQIf5ck1QmFSVKgeOOO06++uorL+/TuHHjZJtttqn72x133CEvv/xy3e9nnHGGfPHFFzJv3jz5+eef5bXXXpMhmgSjxrAd/PLLF8aYyEWU0kEURn0xJjAUpZLlKWXFpSCPp6B92lWoKAaKa9j7ocm7qyWZPAZr5IG44AKRf/6zXpTKxaAL8ohRIwp5uYK2zQc1cqzHV9IM0krBvS8QkLSfzdUQDmoXtShK2WuBnBpqLCs0mkm+7Qq4UTjVssjmLmYgNw289ndaFp5PUSp3W0HbDBZ3PvlE5Mkn68fRMPs9qqcUPN31/gR5SoWNMXE8pXDcYamJkiJKQYyD3YrjtV5nNiLEnm8U8a4SPKXcexiQorlgcwodZ+lJWf1UnChFcgMJoO0AEreqi9+gZtVrvKJMJHMRNeJAUaq46KpGnPsX5OKczesGK3SY5OLvUQYjNwTCD9cQSyJxwvcU3I9VVqn/fC5Gj98z3qVL/c9WhCimp9S4cSJ//nOmCEZyu4d4FtwJw+uvp5OvRhX+3OdKPaVqOXxPF1U075py1VUib75ZlkMjVSxKVdokNup5br552qtHQ5mq5TxLhR2HkejcXXBWz/Z8RCmk6XDF9yBPqTBRKspiG2wBHWfeflsSL0rhWPWaW/s2yFMqynVKIrb9wNbs3btwopTOKcLaBT2laocqNyGJYvPC/Oc/6WpJH3+czlkQZXISNqghRddBB4k8/nhhOqB8oCiVPFEqqqeUO6HFd2gbixLCF8V7B4Nb0r05cvVCwvVSAcKu2uXzvah8qNj7VwxPKRWl4PUFoy2JoZVJJ4pHK3ILPvpoWvyLs0/ts938IXZVOOnPVr6418LP6xjVDgkppChVaZPYIPLJSUSCr6cW3UI1NOTOdAtq5SNKoU+/9NJ0VUjFbZ96/7DYHbTgHWWxDd+li1QQ+D/6SBJDkNDkt+gaNCb6tXN4hGGRKJ8QuGLjth/kYrV8+WV8Rwd331FySr32Wrpydq6pCEjyoShVI3zzTebvEKKQpG74cJFnTeGgIMIGNZ2s3nprcjylwqpbktzJRVTUVY4gwzrM66auel+EZOdRjB58h5uUP6w6edLD91zUiyWXRP9+z/j666f7CICQAAjaMD7yOcZsopR7PCS/e6jCCYRKazhGzeHlFxJoPefsfmrFU0rPs67qECEFylVWC55S7rhBUSo3XJsHha7++Mf6gldqBwQlOreEjeXInwc7ADWl4MXsivH4Pv18kJ0X1Waw40nUhZNSYO0RKzSFiVJR2vkDD6QXiU4/XSqmf3LHPVybqLlf8/GUwra4Xo89ltt3keRT5SYkCRKlLFE8nPwmO+qKGodie0pp8tmvvvLPeUJK7ymllUaDhJIoolSUAU8HzmxtSxN3KknLXZBL+J6iq4y5nFOQ95MVBiE8o1BCPscYdszWINXvJdHxuy/a3pFr7Pvv69+Peu/Cqu/hmbP3rNqFRDeUEd4DRx8t4qaqZNJ+UkhPqWqxZYLGjbCQYJL9ero2jytK+QlC1g6CQKXjcBg774yCUw3f9wsTDzrWODZDknKpBdlHfgV5siWEt9cIXkZJxz0fzLMw9m21Vf355+rNGSUVhBs+qkW7SPVBUapG8CvrrkQRiKKKUtk8lArpYRGUyBrFGPE9SYtJr1VRSg2koLZRKFEqSk4pvxXCpE0g8wmNC/I6ikLQfXDFIeQPKFb43v/9X/77q2XCJh8QpWbOjG/wu8+VTj7wPvZh21rSBN5C4xZTwDXZZReRNdfM3I4JWUkc3Al7tYbv5VO9jQRfT3cctqIU+qxsnlIDBuQfeq37C+r7crEZwuYtpSbo+K0ncjYBzi9qoBIWctzzQVuB59yZZ9bbF7n2UVHmFK7NDqcDhvBVJxSlaoR99xXZeGP/v7nlh/MRpaZMKbyoEZdNN03/f+216RcpHLkkuFZPqa+/Frn5ZpHvvou+z2z5qHIxeipFlMpFuC2mp5Rd1S5konPtR2DUffFF/ftRiyeQaOF7rqdUXFHKTph10gxD1HpAVrsoFfSMIGEzEg2HVeHD2HfeeSL33FPkgyQVL3ZWe/hekKcUPMLQpyCXEPv+/D2l0OfDk3PGjIbX3XpKbbut5E22ZNRR7Zo99qj/+X//S6cMwHmUmyChyU9QDbovanva86kEUcoN3/M7/1wXYnLxlILtkuQcXCR3KErVCH36iAwd6v+3KBNLvw7Z7SiiiFKFnMwGsc029T8jMZ5NOkjyQ6u5RBEyXVEKE+Innkgnso7aJrT6mxpVhRClXDE1aaJUPqFx+XhKBV0/3acCo7OQnlIacgvR0hoauA7VEraShPC9V19NJ8LNV5Syk8hhw+pzjtWyKAXvsdtuE+nZM3hihqp8mGzfd18JDpRUdLtyBZlqEaWyJTrHeZ9ySlq8ffnl0h9fpREk9KjNhT7f2k6u/Y6CR3i5np65oPMBhKP5zQOi2jWHHy4yZkz970gZcNRR4SlIkublFzRO+Al3lTA/CbP38q0oGGVO6Ir0YeInqWwoStUQunriEsVrya9D9vOUguiAyeWoUSJTp5bHUwrhe6NH10+Spk0r3nfVGrmIim67c12yw1bQVlkl/T/uYdjKKf7mrjYH4a72JE2UykfwycdTKqrRiFDKQorLeF4B+otPP838WxJWSCsJv7bj5lArhCgVVN0xac9SqZ9Nt9KhhcU3SLZ2pWOT239XiygVNNZjkUsXPzTEmKJU/p5SEydmvu/2W4cckn4Vomqq9n3wbEIFQNf+j+MBrosedlxBhbqzziqfGBHU9+s8CPOem25Kh5YF2VJ6jfA86zaV4CkVRZRCVbx//zv+vnOdEyYp3xgpHBSlagitTFeonFJuFTOsAmBV5oQTRF58UeRvfyuPp5SGfcE7DEyaVNzvqiXySXQeRFibWHnltMEEj5kw92ArWFW6KJXPM1KI8D2/77WhSRClCukp1a1buj3hPsDgxM/IDQcoSsUjW0LbQolSffv6b1srnlJBk7gwUYo5MEjUZ2yjjUS6d69vZ9UmSvmNG64QEccbu1bJJkq53ivFrI7qpkV4773M3+PaDJtt1nB/COe7805JnJcsQGVbFIE57bRwryp9ptWetaJUUseIsHtnK+M99FC0qIZc7F1UlYR926tX7hWmSfKhKFVDBHlKRXEf9VP+XaNhr70yf/dLTl0qUQqsvXb6f4pSyUh0nm2ffm0CbrsqiMAtHKVz/QY9O7BnM3q0XVRzovNC5pQCF18scuCB9caU7r8QzzH2gQmYghAoilLJ8ZTy80BE2N5xxzWsxFTtolQ2b0ydmN19t8i//pX5NzvhyHV1HOE4b72V22dJZeWUuv56kXPOqS5RKsz+cz3vKUpFv55Bic5diml3u6LUt9/mZ/vD2+qqq0S23DIZSf+z5ZSyY2DQuUKQckP47PwrqeNnFE+pXO9P1Hbxl7+I3HuvSI8e6d/pKVWdUJSqIYI8paJ0hFFcb3UiGUYpwvdc8cEmTyb5oQNIMTylgiZ6KliMHJl24f7rX/MTpbbeOj2hVuOgmkQp6ymFECvXfT/X7+3aNS1A6ERBE88XauVV80qBTTYJ9zip1EnnLbekQxuKid89tBOUnXYSGTgwf08pPJODBzfs85NqVBeKbH2VnZg9+WSwKIVV9bhADP7730UuvbQ+tx+pDvyeMUxgK7EqHSqoPvecf7h9nMkt8wnm7ynlUkxPKTfHrLsYHNeugQcSbHi1aZKcv8v1nA07V9e2sWNBUoWWKJ5SSlybLWxR2oJrDLFe57H0lKpOKErVEEEhB1E6wigDShRRqpSeUlq5rVrKKScBnQzFEaUwkLj3W9sBDFf1fArap4pSOuH1y2djRals+RHwd0yoe/eu3vA9nBMmr3Alj1pWOdszjuumldx++CF821yKE8AIReUdvNS7p1rC9zBRe/zxdNLWYlaVCprcojoc7t2f/yyy3nrxjLqwkDVtDwqe0VJXzYIHJZKtf/JJcb8nSt46d2Jt80jZFfFcRCnreVwtYi2Jlq8GY16lVKM76SSRf/5T5J134o1tWiQgW966YjB+vMixx4qMGydVlei8nKIUcizZuUWudo1fkuskPaNWPHa39TtXFaXefju9OIrrpJTTFsVCY1CKjLBxzz33uDZb3IVuFVyTKuCR/KAoRSJ1hFFEKZt3BvitcJTSU0o7LyrqhUMHgjj3D4O22xZUKER1RCTHDwtp0WTnYcTxlCpEpbqkh+/hPmGybr2aCvG9K6yQmYy2UOLyH/4gcs896co7aFvVJkpZEaKYCa+D7uHZZ6e9DDFx0JXGuJ5Sfvda24M1XkudF2PECJHJk+tDnUpBFE8prTiq2HHItgfkIXHzr/hV7nvhhfJM2EnxCRJ+UX0Wk3KIvXFztRSKl15KJzGOK4rp+BN1jFGxXCll33/ZZenqbm5l4GoL3yumKOWGiaO92Ip5udo12Tyl4EX4wQfFTxgedvxufl0d48M8pZ5+umERJh2TS538HDbwYYelF63CPBz9FqZK5SmlhHlKoZ9EovlKEfBJQyhKEd/JCTopdPTaYUQZUNxElX4rHPmUu4+L7bzYSeUPOnxdSXTzMmXDzVumKzI2tDLoHtl8Q0kSpWzugKSF7yGfgz67Ub0yonyvGp5qEBTyObYGT7WF79lwq7CE/fkSdg/V6NN+EaGdxxyTPUwmbJ+uKFWOEL5STV7tsx7U7jfcsD73GvjuO/9xVq8RxDRUbLrwwmBBAEVDELqs4n2xngtMkCrNU6RaCBJ+8btWJ4W3ZTm4+mqRBx4Q+eyzeJ/zGxvDBO51120oNpRK4K5UkTdu+F4xIxT8qnFb4SBXT6lsohQq8p1/vsgzz0hRCRsH3dQouhAY5inlh4rPQ4fmVskuV6wXrl8u4LDnNl9PqThVGbN5SqG4FnJPvf9+vGMgyYGiFPEeblcQuOGGdEf/4IPhHbIaEhApXBXdb7+55CTKFe28cAzVnuukFCDBLu4pwjTdVc24BqpOqqzRqblu4nhKYfA/44zM8tFRBzcrSqGNIA8GJolRwErY/vunw+OSFL6n52TLMUdt+1FEKXdFsFhGbhxPKXijfP55biFRpcIa58UUUaLcQ2tAI7QTwkeu+3QXIsLaG7wjX3+9/BWG8HzBaI3rsRYlRBjvo19AOGqYp5SKlPbv7lgJb0QIAqNGNfyeYrQhhJLAU6TY4gcmXci3xbxYDe+9X7taY430/1OmSFmJK9z4iVJhi5J+QkqpFiVKYY9We/ie2h4W9LHo9yF4F8tTSsPf4HVfaLBwc8opaUE27PjdvkyFHT/7KCy9BOxrVBfEdUMlu1Jhj9/13oprA8Qdm+JGz4R5SsEOVC80UplQlCJeh+N2qjpRGTMmvFNC0mkkQMZqhV9n4+43rqtmPmAw0wGAIXz5A885MGBA9rxNLu5EVI1NXe04+OB0GewgIcR1EVYjHqtJyAfhVrqKY+y8+2463w/yYCA3je4fFbT88mIAlCbGORUjiX4hPKWsQBNXlAp7Nl0DpFhGblRRCvfnyCNFzjwzHf6XVKwAUi5PqaDJX1RPKb9n3u+9oPaG8LrLL09X0CwnyOWBkD+EK8TxkrSiUbbxC2FXrqeUHYP0Gtnx0b1uYSJAMT07bJ+GsMHbbitsOAnEL/TXDz8cvl2leDfj2sBLw4Yq5bKPoOdWq02VQ5Sy43Zcr+C4nlLgiitEdt65fvGjVF6QdkKcb1tHu/3009Ikag9awLILD2utVf9zsSMUhgxJf1+fPvXj3vHHp595DT/NN6dUUL9QDGHxvPPS/SHGrrBn1F0Q00VBv201d5rf2InxqJj2QRB27AkTpYJsADy3KKKSi5AcdxE2Sk6pYkQwkNJAUarG6NfP//0g41wHgKAOWZPnalJxF3dgLqWnFDpLJsUr/MQ6SkL7bOjAq+0uqDJkUAifTvDcqkS451EFM/1OTCaQgNoCT4r77xe5+GL/zxbT26MQopQlqgdRlNBa11OqWEauurhjlRXXA/0IVg7d/Fj//W/9z3FyrqDd4N5i0l0KrCBRzNX/KPfQfdbQ/nHtgtpJ3PY4YUI6B407piDXAyj2Nc/2bGrifxi1KDEdlTjFFLKJUnqt7WTANbLDziOfyTraiHtv7LnZ70XY4GOPibzxhhQM3X9YYnrkz4JdEad6aLlArrbrrxe58src9xH2jKmnVDnC92w7iTLRs9vE9ZRSz3uEFOvzU47w7XwFX3htI4cfPLiDwHiGhdx8Q86CrqdWyXUTyBd7MRjJ4q+5pn78Rl+r91Cva6E9pZQocwrMZ+IsRGifjOscR5TSMc7vem+5ZboYwB13NPQuw7HlKmbmI+JHFaXCntvttos+NkG0RdtHLkUdB+ImOg9zNCi3NzbJHYpSNQYGS4QEuKAzxOAxdmzDThudXdSJCQZau40bIqGdfCk8pQCTnRcOHQSyCUhR0IFL20O2fbohfNqu/HJw5ONuDuAtBcMqbOU0m/HtB0SV//ynNOF7lkoM34NnHCb+6HsgYMKLDV5xqCiowMtEvfdAnPA9hCXDywqTbhgw8LKCmFLpolQUbzf3WXv1VZGjjhI59FB/gzJbu0Cf379/fdvDs4McNEGCj9uGCgnawz77hE/2rHeSrXxUyLx1KtxnS3RuJyCuKBW2EpyPKIUJEXKW2P37hRZatNqmiphoM/l6MoUJe9demxak/UIXkwT6au3T/RJ7RyXsGevWrT4kqNQhj9YWjDKO2D44F08p11PWzW8Dr2jYr4X0oMIx2/O0bT3bwsYtt6TFQpzrK6+khRcNI/Ob3CtoM/C2hpiZD0G2AvKQQfzYa69ML/NS5HK1HtXwSnXJ11MqyN6yQpwfSM0Ary2MD9ZuKMQzutlm/p/x2xbv7bhjekHfzcfkilJRvfbwmSOOSKddKYYola3qrOvdDo9oRNEEiUOYh6Lt21yKcROdh42PSRGlEIIPe6hc+QArEYpSNQY6eKycYDK21VaZRinySdx4Y9ogtMAwiJqgfIst0hM+XemyHSxWyjUcUA2tWhSlcB1gXCUVDIwwmHQggvGFlR+9l4UQpTT2W43BIIFI0WSvrijlrq7EMbqCVuBgvFgPLK0UGGQYRZkoQFiBqAKPLJwzVlORwBjP2t//njnBK4WnFNofhAMY0DAgcEy5FDMolpGL/aoxDSNHVx5tzi+sttnJRBxRyt5fVD+77z6R00+XomH7n3KH7wU9a7gmfjnVsk0k0ecj/6DrQfnxx/U/WwMSolSxQrM++ihtkIZ54QSJMYUUpdRAtwKknyhl+xbXyA5bMc91Uo7rDiEOfZb1QrLHpsdhJyp67jCy4Q2BPsuG+WFf6E/ihE2419BPcEh6GIZt43g+cF38JuL5PLeYuOqEG6IHxK9SVeKz/WuUHGy2D/abGEa1I9Xz3hWl4H2E1BK5hOtH9YyKKkphQo2wf0w6EYoKTzmEeUWxjwpR8RfPsvajbt8MwReiABYarE1QKlFK7W71SrXk6yll+yXbP2TztEEeOxVcsiXCxv1B/sOobRfpJ7Cws/XWme9nE1rctBToe22/HzXv4aRJ6XYblG6i2J5SdszDvnDtkIfLr58KstPihu+5Y3cuC8XFBiIhvPmxEOQHxmHMAyq10EIxqND0fiRf1l8//YJhiRADW0Le7YxtksIoHQeEL528QtzAahI6bRiu6JDg6onViloUpXAdUR0CwDvDr2JJMcDkB5MR3POwFWoMKEjejW3hAYEJJypa2AlILqIUDCQYbQjJgNsyvFIwOdcJUDZRavvt09tDPAgruRsn15VfdUg/MGC4FVPsoIc2ne34rXGBa3vVVZl/P/zw+kpm+YhSUTylYMgiB4ANhYPol0v4XlglmXyBkYNJfZBnkeZYwTnDiIwjStk2XIpcLUkK3wvrw13jCJMKDZHM9my5kwc7KbUeQ/CyQZU3rJbi3mGRJG6OOsUVt3RC6Yb1Bt0LPJcY/xDKufvu6RVsF4gkmGxCkFGyPZs62cD+cR0wYfLzRiq1KGX7AutZYI9Nj8kem34OlQIVCAYaGqQFHzCeaW6RbLjXUMOdbF9ZyDB/rFZjkgBbRHPe5IsVTfDsoW3jZSsl5pvoHO9BpMEED5Np3AN4WdjqXPDChc0V9dpHxbbJKGFFtn35CS9RxzYdC3HOeO46d878+4cfpidzEAGijuNRnyX7nAeB/kU9a7HIqOcKL0K3imC2cVr7h7hYGySsT7ffVSpRKijReiGq79k2FqevsPcZ1YnDuPlmkeefz3wvbA4Ee2LXXUU23TRtT2h+uWzjGra3C0EYf91nLopnsZ5brqF/9ppqygTbVqLYFWhn6KesXaljCJ4XnBeeY7/qfrmE72EMxXFr+7DXLSmeUtnaGVKE4LXyypljay1DT6kaRwessHK/SNoXd6KsgxIqSaDTRcJAnShg0M7XkIiKdmAQxhC/DLCKnq2zKBbW4PHzwCkWEIUwCQxzW8axYfKlIS3wRAFuMu+gcsNhwJUcK+lwJ0eODBjhMLCjhu/hO1FqvVev9O9YkYbI6Rq+cYyuqKuVfhNAK4DozxBggwQOayz45WfxC3solKeUK0phVc3NzYT3dPUwTqLzTp2kaKjgFTQB12uqxxBHlLKGelA+nUoTpf7xj/RELRfDX6+hK0ohv4v229nao9v2rAehFaV0MoG+5tRT094GuWKfYUwAVJQK61ut8Yqfkf8KfZ7rIaygH8TCjH2Osk02MJHQbXBMEG1sH6D7ChOlwlbJ8Uzk4m0WNGmx362efPbY9D3bv/mFT9iqn37YYw66hnaSVsjwYCS3x5iBdlcosi124XyxyIdk8eodjTaLY7HCVTb7Sj2HsKCjz6m2D7RdCFQIhylkQvowASAI2wejzbjPfdTQdD1fhMQhLAkekLbt4LojtBMTunxxx5conlI2Lx6O1T4r1pZxxxMc92WX1dui+diB9l6HXc9yekr5ka+nFGwXbQ+2TWbzWLceyq4HF9o5vNe1vbuCFIgyB4Loct11/t/pB+xhFGrZfHP/cHL015ivZLMZdNzG8xd2HbDAZL07g2xEv4XMKPcOi6sWPX94keE5xr0LEqXiVs0Ge+9d741l++JCOiEgqgNe9BjbcD9gY0Xdf7ZFWw319fMorFUoStU4OoCGuZxjRSjuRNlvpUQN4mLmFAk6PxgacLeGkQOj9OST67fBpKtUyrqt0FOqEvYYUNQlN6xsLpR6G9IRVE0o1/A9XZn/wx/qq95FDd9zRREMwhgoXEM5jsEDQwACmetC7eLnWut6PcDbAp5lJ57ovw/rueF6IroTvDheiS5+1xHtDJOiYcPSBrBfomkYydpG4nhKBRU4KATqDg4D1M/Y1Wuqq+pxnicrittJSaHdqPHsIZwZ3hPFFKXwPdaQzvYcrL56+n/0iQjlHjgw+/lH9Q5SYHyqMWsTfrtArM4VK7Lgu3QSHFWUwnOcre93DdAofQwEF/WCxWTHTdidS/geqpNqhUkccy6r4ra/tM+Ln6eUnVBpm7X9GP6OSUacqoT2HHEd8VnXq81ug9VznGshwtWKESIRltcE4L4jPBrJ4nWyinxCWACAN0ZcUcov95EVAqOG+0QlbqirbVOYTGPCrQUOQNTFTXdcwaImPBn9EuJnA9cE/W/QIpTbLqK0E7uog2fDXhs7trhtG2F+WJSy+cfiej2+9VZaHLaeUlHDtUudU8qPuMfgLmDjeqE94Fra+58t55kddzFO2H4fqUvgvY6xOkgw10WLbMdv+8AgAcb2b7vtVu9x6i4Aw17HfOWEEzLb80UXZeZNtG02aFxAH4pQ03PPbdgus4lSYdX3LEgJA6HNHUv0mCCIBYm+Ue1dbGe31TbgN4YpCGtEm3EXY6OAys6YA6Mfx2I4xPCoXk1qwwZ5b1dKhdlSQlGqxtEBy6/KjYYywANEO/BCiFJhA1axV2y0Qg6MLZwTFGoo+BiUok5S8sHGa2czaAuFHRiDkkFCWNEVlKOPDk8CnG9OKRWl4LWlg0fUfdp2hQ7dHYDjGDxohzA0sPqsk3I/YAThOBFeMnp0+j03l5HNEebXfuxx+g3KdkAtdE4pGDGYFEEYwOCcrfpZHFGqmOGnOqBjUm+fGR3I9ZoilCVMlIIh4noQ2NVEO6lzjRYYcjBC/ITEKOB6w1vUErZ6CgEuLB9SoYQTGFcQKvv2TYf06jW0xq1rMGXb55prZv6O+4FnB+3v6aeloOAaIV+Krb4YJJ64uPmTbJ/iN3F1++moz6U+G35JTv1EKfceun0bxFfsU5/BXMTNIFHKvu8XvofvwvZ2soL2g5Vx5PiJOrFw+7m77057wMLG8LsH2N8jj6RX2vOtVFYMgkQg7W+sGItFHjeXl7t9UNvy80jVvsraFPA6LFR1S4xp9vmKG75nRZS4nlK60GDJVnAEQOxBaLr1SIfYoP2dH/ocaR/oikToBzEptc+Lffbc8d6OLcghaUU5P5EijiiFe41iH1j8sscT1idZm6DUBYb8iLuQFRRVAe9Au6ARJkrhHtr+DL/rs4mftf+B5x3SVfiJBVE9hi1RRWKdh7njjz5/1mZA1AcWdG2SfDtuB32nfSbc8TiqKJXt3CFaYVz+4x8zQwEV/B4k1MXxGPTLJWbPW8PmFYTnw7ZybbE4oL1opIkd88Kw516qPICVDkWpGscVA3QFHTl8IE7ggccArCu0UQc1P+EpCaKU28mgY8ekA4IMBp39908r41GBQRFncmC9jwqR7DIK1igKWgXUfF/wdsC9t2JMoUWptdZKG4A4fx1cou7TbTv5eEopaOPI84XJuR+4ZpdckjbSMUFy7x2MUCs0+a0oh02S3YlvPuF7EB3d1Szrrg2hMcxrJdv3WgPR77sKyTbbiHTtmvmeFSL1moaJUjAiDjssPSmxRoo1uuwzgVAufV5wTzEZhrs2Js+54BeqifbhZ/SiH8FqHlZG41bZcp/TbG0HRrDN06LX0BqMbpvNts+11274HlZmcQ3D3NNzaUMIgcGxBt0X3N8gkdI+a7gP9ne/ZyMXTynrOeZX1CKKp5Tbt+nERUMCwgTEIOw+7TOQLacU2qafKIHvtZVKsy20uIIgPAOwDz+hRu0NPJMg30plUa4N7JwgD2E/gryH9FrZySQmKLffnhm6pfcgqqeUnyhlQyqRc1ErivqBQjZYmMsW5of+B4swVozHpO7RR8Pbmp8w4BcqHTWnVDbc88QCArxLEC6L5wMVQPV6P/ec/z60n9NiKvic3S/EUHhl20qQYUKS7XfgoWXDufz6uiiiFNoRrq3tnyBMxA3fK+Z4HSWnFAT1uCH/QQVpsrU9iLMQ7yCKwrNF72n37un/dUxyq2YiX1kYxfA2C4oU8OtfNEQ/qA0Ficd2noI+VRdY/a6dOzeJu1CqYx/GELsv/O63KIvz791bckJtFvdaQbx1zyOuV6K1gew9Csp/5S442u/3E6VsX1qq+WDSoShV47jGDnJ8YBBFeBseQiRgs0TtlPxC9JImSmHCqnmTdBBDJ4H8OlGA8QExA5PeqCsihfaUwkCTLTGnFaXcSRfOH95Curq64Ybpa6YTVndCBeMnW+ndbMAwUm8pJWr4nmt8xZ2M52JIYRVNqwWq94td2YcBb++rnyGRbZXZz1Mql1VNXFs14tT4swPls8/WbxdE1GsY9Z7lCkIrEeKyxx7+hoLrKeUn5GASBTC52m+/enE9SLDAfYV7u35GgQFrDQh8HsIIEgzb+wbxS78Thl5QWLSfAWJd94O8qZALz8+DMd/nwM9LwDXg4npK6UQWx4ZxZN99pWBEKU8ftPLq9ru2//QzHN3to07s1DD3u5c4fogsdtzI5imlz5u9V2iTmICjuk8UIdMvr5V7jkGiVDZhHWTbxp4jngH93qCFHbQ5K1Bky1mVK3im4EkDUceG9rvPnttvBIlSeh3ce48KYBb8PUqeLWunqQepTu7s+K74XU8c69ix6RQGVtDwI6g6MEQ1m38U55ktJYGdwGm/l82GiDq2qMe7+yzj2cB91GrPYbagPhOrrlp/XZGr5p//TO9b+3NNfYBFo6DJLWwI9xrAntTnPBdRCiIZbEwIY/b5UpEN+wzrk6xdUw5Ryo4LPXrEP4ZcRSmIsxBsIU6g3evipy68a1+frRKfS5SxNa4HuRv6rgs8tk/Hz0G5cKN4SrntDAusmr/PvXYQrOBdn6sopefvilI4BtdTatCgtNdbrl73Ks674yXEaPS31qsqLJcxBGREzdichlawtM8e9oO+Adtq/w2PfhRy0v7CHVeziVIo/nXfskJOtQxFqRpHVw2Ubt3SK0Y6cKCihCVqp+SWB0+CKDVgQObf4AZrsaE7auhAtNGVSExMrcqPDhZGJbZFWXkYh0Ehb2oUWqM6ysQqDKx2oJIQPNrCvteupEKUsh0hkp8jJluTrqq3EAQBdT+3YFAvhGGjhoErpGTDFeDcldJ8RKmgduleW7gC28EKRqjdJhdPKXwGYhcmDPmE7wG9lvYaK2ogQHwMIur35usxFxWECEGcUpHNzVPg5ymFdoK2YdsV/q6Dflj+KZ1Iuium1tiD9xm8oGBMqSs3BC0YNpi44RnDsx60+qXGCvoU9Dv4nK2m5TdRQbvAs478Em57KpQohcmsGnFxRSk7EYGojdBAtEEkS8dCx5/+FO+Yon5XELhWqPIXR5RyRXtcZ9fYjZpM2p1owGNs223TP8OYdcPRonpKqSiB+4Njg5cR+vhsQoO7TzwDWIyAsOq+j7HJCio4tmz5UaL0c/Z7sE8956CJOY7DTswQipVv3iR3lRshO3imNCebjsvo0/W7ES6K9uTmEglaWPLzlPIDkyC7z6BnzApzO+yQ/h+2CPoXP+8+93qiL7TvZcvFFOYtYpOXwxPl2GPrJ1x+/SqeQfS76FfUfipUgQw8i9Ym69Il+Bq4ohT6aPS9eq9WWaX+bzhWiD7IMWSTFUNkh2ClC5euuIbr7F4DfI8KeX73N5unPZ5ttEP8bxdKtPpftsUriEIoNOPa8sXEXmu1JXO977mKUn7gXur91L4qSr8Wd2yFlyHsWjfxdxAYKy1a0MeCvsSG9ms/hvYVJaeUPg/IYYWqlUAX1Vw7Bc8sRHrt/3IVpXDMdt8Ya11PKYxncYsnwZtc7yOeYaTguPrqhtvh3tprE3b8WFDE8eF/v4VCO2/Ccw/Ba/jw+nmkfj/sPyWbF7bbV9yzbNG0lqk4UeqGG26QHj16SMuWLaVfv37yWljmZq96xyvedth+jTXWkJtYdzEDdVnWiYmrJEPFRlK9QohSOgiUMtG57ez23DOdjNp66dgVOdtZwmhD04JoA8MLndvxx6d/ViHEdv4wXuA15TdhVDAxc43ybAS5yuN9dIr4H8eDQRArQti/TiohdMCDR40X7QTDjCD1kEIYI4wBtyPNpfJeNiMb3xNV6AoKsSuEKJXrueE+Wk8pv0lTNk8pDJwQuxBaodvmei46aUWYZBBhJdGT4illQRifGiFBohSeAxhPEIgx2UP+gKBjzJYUHX93K5Ja49V6U9rVeAXPTZgHI9oIPGUg2OBYYQhZjwc8oxC57DHY51aFZpS4RyUv95mO23YgoGjiad2XO6mL8owiPxCeZxiNSKIOb4Odd04b0EHPFwxXCDZRPVSjPqu4h8gV6Pah2u/q+dhrZ1czce0h+rvhElFDK92V3y22qJ80u1XJ7HEF9Rk6OXNFKSVK3jM3fA/eBBBDbTEBAIHcFc1sHxdEtn7OrXxoRSm/kAjsT593TL6RnwuJwsNw7w/alw39s30CJjR+IaC4lhjLNRm5VnmDcGVX3vV6uv2MmyzeTsbdvle9OMKeW3iYIIEwBCC12cIqWdlnF88B7Bb0NdaLIMj+0Mq4QcAjAEI82o8u5KnnsJ8wgAkuJlvw0tXrFUWc0EWifv3SE+kgrPdIWF4adxEFeXXggaR5YvBcubYpRAD7HsKr7UKYFVzCwoZVTHBzYPn1s2i/mODqYodtzzb0U8kmSqGfQ/Vl9LGlwi4aWHHehoxHJWql7iiiFPpkHTt08TBuwaEoYysW/SD4uF7eQUDkUA9NFODx8xpC27ZhzmiHeOGZsm0km6cU2jm8cgAWMmAzBV077b+iVt/L5imFRX7X2zVboSE/NtssPd8B6IOQ9D7IrrZjbZS8VXYhIcgzDW1S+20s6GNs9Ltn9txdG82vyIcFC5boswudjzPpVJQodf/998vJJ58s55xzjnz44Yey9dZby+DBg2VqgE/3lClTZMiQId522P7ss8+WE088UR4OasE17ikV5D7phvBFwa5YKdr5l9JTyk6kIJRhYqDlVwEGDT0/24xgxCJhpoKEijAoYCTr5Ml2KLbz8QvZweChkwb9vmwxxMhhACPUbzt0lm4JVMTOQ0zCxBDGKkrEH3dcenIMg1+NK78JkaITHqyuYTJZLO8YK0rF2SeOCQZ2UKnVfLy4/LwvorRVtAdrqObiKeVOCvNJSnrKKekw3HXWCd7Gz4sq6veqIa7JLEuF9k+4lngW9TrbtgRBStcd8HPQKms2QxThmtgGgpdeqyBRCs8XDAxr2KEv8ROltD0h14lO+v08b5DgFAI6kq7qsVrRHF4cuAYwWDCBdD0b4opSeG7cvFK5CF3ofzCBdydr2UJ2IAbFyRkU1VsJQMjA8wmhBQanGvB+eWus0Q9BK5+iF9bYRjvE9dX2qPcSv6sHA66Bm6w1myhl+xVMMLK1a7tP2z7dPEp2tTiOKKXHg3PBpNoKgjDeUcEoSJTym7DrMaLtaAWqMMEEHodYfILHqQKh3wps2o4xDqKf9EPPH5/zC8dStA+yVZasOKfPkHrIYUKMxYeNN/b/3qBnTBMIDxlSL+igDQVNslyvKPfe4flRQQnechrWrX2PX0igHasgmlgzWu9dWPtDEnbtA6OM+bC/IApjYRBV/IJQIRltLcwzzR3XkF/LguNy7yP62bDFQ4iFUYRZeNbi+PxsA/Q51ktfRT/1vMi2eFmq5OVxsCIt7jXylMJm87MpcxWlXFsviigFGziOKIX5gkvUsTWqmGY9IOEJCvvWzxZF27YLzHrOrqiZzVMKbRzCNtoNxjcIN9lEqajV9/xC1935C77TCvO5Lm5qSHOY5yzmSXa+g+PBswWxJ2g8s2N+0L5hQ9jt0H/a8R7X1M1X6d6nbEW1LrkkLUxh4bGWqChR6uqrr5YjjjhCjjzySFl33XVl1KhR0r17d7nRHV2WAa+oVVdd1dsO2+Nzhx9+uFypJdhIxqQ7aAXY5jOIWlY5SOBCp1Yob5soWKNdO3orxGFCoMcaFgJnVzN1AhjU+avzns2ZgW3RSeH8NXQqzNjAtlihR6cE13e3oo4axpoHwYKOFIaOTbIMDyM977CyqFbs8csRE9WVOht2QhgnRxW2hRiiJXQLaaC5q3uY3Li5r/yw1YXsYGMnZEH5YRTX2MjHUwqCACZBQUYRriHCdIPI9r3wgIFgUspwAKDPKcRaG5Zl26wtsw7xN6i9ukYYjCSsJiu68o/cDtpW8dxAnMYEw05MMSHD5NM+z5i46cTOrg7rsWbzatG/w2DWiacVxbBv26bcZzqXtqOTXZuXJZd95voMuvcEItJBB6WvJfozrIxqHx0lv5ECgQL5MSAG2CIWfqIUBCxcW9zPfBOPWiN13XXTfb/2dWqMon/RiS1WkfFcod/AM+ZOYP3C9+x1QFsJG58RjmTzXdjxLkpInObaCAud1DaJ/DeYVNtVXvts6v3Wc4TA4ucVrGIHbBAVcnAcrviA44cXk4pJ1sRzBX9tZxCtg66XFT0hglmRRj1rgB6/28+4ebk22STdfiG8oh0EeQdEecbUCx3XLGglX59dtOGgNVj0J2iH8JaDFzfMaOSXDKpS52I9RHFeWAALKvduE0tH9ZaBvQKPjmyTe20L6H/Vhj3kkIbbZRN3/Bag8HyF2YV+98uvb0L7wQKoX2VEXDMsICp2MQDtJyhvWZJFKSteQJSCFxA8MnPxivETQjCHsPkco4pS6Cd0/qF9XtC8B+0O/bGb9qMYic4V2Btoh35tEc+Pu3iA59vtw7QPxvWwfaq2K4wfOAcd7+HVHXTt9DNx85wGeUoBnJu1tXIF7cpvLELu0H/9y1+UwvlgXAoTe6xQpNfSnW+4CdvhuW7vGfofzBltn+Mu8oV5baVS0RaBqpGKEaUWLlwo48aNk4FO7Xb8/mZADdy33nqrwfaDBg2S999/XxbFLW9UAwR5hdhBIczLJugz7neUKtmiVvDCRKB//8yOH67MCEvEyol6EEV141WjNEiUwqQVf0O4HyZVdmKJ89dBEQMBQoyweqyDB/63FcYAjEoYjjYBn8Y6Q+CCsYPwJmu8uZMMTIr0/uJvMNRt1STgGst+olTUKk/ZsEJCLrm17ITStqd8DAa7H8SFw7V/993rhZ6gihuuoQAjGSsxWN1Vsck1VG3YbBD5Gj9BggyuXVgIbbbvRRvBCmKpjWF7/TWOH4YJ2r3fsbhlgcPyfmDyg7wb+mxq2BxEX21rMIKRxw2J0PF8ol9R4wsTPGt8IbRWyzkPHpw2nuC5Zj0E8B7c0G0eCYSquGhf4BpBYW7mudwbrXQIzwNcI5uLLtd9xsFdyICIpBUJkcwb4i88zNRj1e3fgsCYpfdCJ8ZoM+4zoKHB2NbPczEudv8HHOD/TOJZsm0C1xx9hl+YjpvoHOOMm5A6SGSBuYNQSoufN4x7TdBGN920XrBzQ/Ndj0sNH9e2qR6BQaKXPp/ZBEA8gzhv9cCzwpB+j53Y67ji9/zjfYi+moMLY3QYEK/sBALtQ/erkw53kcH1lELb3mCD+gW+oMl5FNsI+0C/pHmPwkQpTLyCwojRVuzfMImCVxXGKhwfvJTigEkU0hhkI9d8UphMwtMGHgQI51OvGzdUEvcCeZ+sABtFeEXbt+O0LuKFTR7VkwbChY5Pbt+kz4ifJyDEW13ohL0Ae9D263hG/UQpK+wlUZSyEQHoP9CuCynm6Lhvox40nC3Mlse11TFen92gqaDuA7nkkMBaKcXU0a9/0MVwjNMqxviJUuiv4DGKfFYI7ffzlLL9OPoAtcHd/kfbYtyK0Hr8bm5CjLEYh/Cs6fMV5DUaBb+qpFpZGMeKe2gXfG0fgIVHCPBYDLJjh12Q0GfZtjN3GwDh2p3H2IqPANcBn8OYjffD+pVJZtET96RQ865KoGJEqR9//FGWLFkiKznJivD7dwE1zvG+3/aLFy/29ufHggULZPbs2RmvagfJ2vAQ25wDQUQVpYIoZeieGrPIGYEwGPuQw8tjo41yy3EFccgmyHRBxwODVzt7GBbajPBdOgmBAQQjDgayCk6o6IVB0G8FVBMnY786aYaCr4mg0Qmq2GO9KmAc6MQYwMjBRE8nagoMZ2vg6CTV4mdY5YId3HJJXGvd7G2oaD6Cpx1oVOCDFwMMe4TyZPMS08EV9xvPCe4TJtYYhFzhys/DzSVfj8IwUSrsOSzmSmA+WO8u7fL1PKwgq8IOnk8/4xTtzb6PyZfbF+jzBfFQRSm3egranQ4veN6CVuLRhpCIE8KyFSDwvNnkupjY+IlSfglZYQTZlTfXcySXe2hFKYQRuMJMsRcTooTkQaxxzxXHHdaH4/q5ogHug/t8oY9UsSdu8ls/IEJqGLSWu3a9PlxRCtiKsGHhezbXkYIJCsYIjDsIl4O4jp9VjLP4jV825Bf9GcZONwzYmlR+HtH22mk+J7T9fFAhTo/F7U+tV7CddARV68NCkF6TrbYKFxw0H5DmtUO/Di9mG47lhpPDuxkv7RPcv+fjKWWP2VaFtWACiokNQlWwT7/JG+5TkKcVBHq95gDtNyyvUxxyySuktg5sVHi1QsBR0cMVpfTauotIuFdhkzvXQ8UNzcPfkLvTjqtYFITtBRta39f+GscLIc0vxM9eV/0cbAbYg9bGhkjtJ0ppfwIgdiYReDSjiluu9zsM7c9xP6zYrmGSQbb5Lrs0DN/LJjJhbLGVY7N5rhUCP092XYjG37TNoP93+z7YNvAYxXMBj3KtUKnPiY4fel/Q3nRRwO2X1MbQ5yaqDYD7o17B2lcjmTvGAe2L0D4wvth+Ji5+qWVwnnj2dZwKK9oAD2qEB2uRC3eeo3OToFy2ePZwTdD3uH2pO3/CPrFAgzaLeV5QqPHixZnVvYPCfquVhE4/gmnkPBWpVKrBe9m293tfGTlypHTo0KHuhfDAame77dKKcVhiZDWC0KlHxc/AKrUoBTAIhXWm2UqRwmMGHlfI6YDOCU0Ixl5YUlebVwoTaDVU8F06oFr3TAwK2C+c/jAp9KuOg8EGKx9IjIzqb+j0rUGCFUitqqH7xjZwy7cVLoJEIDefgt/9K5QoZcklb4tdbbXXIJ+Qm6AwAXQBuDZhYYa4r9pVWI0cAw8GIZdsnlJoI/nm77LnY92cYQSETX6SKkohbNNNEqxihD1XNbYwkPsJRXhudVULq+6a9NPuT40wiId+Ezq9pipYhYlSOB7cTxhK9p7iu6woBQPLL1ean6eUW/HRJV9Ryi/peLHbRbbS6DqBQFif9UBC7hkrOqnni7YJ9L2uQOuKUriXWvEoKB9YXHBMMLztYo+fKOWKY2qQ4ngw2bX7A2FGPPoeFNwYNiw9WYa3CEIlXK+3IKwABQ8PtFnXuLaTTIzn+B54fOh5aMJeCyaL+aDPmdoPeLbR12NBB8+Cn+2CCZlfWLSL62WsuJ5CEAIQ0q15f3TMBrANsB/rwauVlPyS/AfZQVGfMYhGYZNYPEsatgf7zoYg6blCwAwTpaxdBGEVQhD6YIxd8CyIUgHTj0JV3tMJNCahsId04dFOrO2kFXaGChCuOIXrjuty0knpcRz7csdoCCywrzSXoo73uO/4vPYx+h24XhCmwnIvol24opWt7BskSlnPUG2TSQP9VdDYmS96rfFs2WrhWDzEApAbsoq2ivBZ5GTTdqt2cJBXlX1m7fyhFAIB+lhXVFWPKPQxOhZgHqLjYdC1hpiFZwRtHu1Un2tbdEPtoSBRKm71PVwvHU81kMm1Z/G85RLOafGL5tB9hqWoyIYKRmp7BS164Rz1Orr2n14zzBu0zSH9A8A988s9rO1LvZLj2EbVQkKnHw1ZccUVpUmTJg28ombOnNnAG0rp0qWL7/ZNmzaVFfwSSghiiM+SWbNm1b2m1Wpgp0/yZKjcdgKXDQzs7kS+HKJUNrJ5SiFJI4xuVL/BzwBeRio0Wd1SyzXbDgdNyFYe1AHFThTQ+VunPD9jEZNSq6Bj8uUORHouujqBDloHVHeFyMXPyITXln0/ToLhYoJVbKzcYgKEZPBKPuXCce9gRA4d6v/3sNwWuEZ6nQIcNzPIpnW7AmEu2Im4Nc6zeWAlNRwAbdkV+LQ/sf2MnTT7hTNZDyr3ntr+CQYYrlvAUBEoSmESgr7CbxJmrz2eVWs44We/+46+Awal673jem4VUpTSPsKuEBdblEIfiPPU/EAu2rdBENDjxbMKIU/7VM0Fh9BsDV3QUMtsohTaDf7H5LUQ4Xt++IlS7uRDPaXQbuwx6vOMY0RouB8wetH/WCMWkxK9ZnFEKR1bXOPePl84FtwHLNpom4mT7ysqeiw2BB0eEvB4wn22q866SIFz1hAu9Ot+C1MIfcf79r6gnUHYw3nbsQ/XRj0qMXbrWIPnAttCnLPPvYJJYNSkzFE9ETB+2Dbtegzg+DTXIZ4HaydoCGSQKIVzwDV0E/UDJGFG/in1IIaI4wf6QJvXCQKnPr+FEqVs3hrkitP+1x43RApbAU3vmbugqHYNJpk4L+QAs2IRnlG9BhAgIThh3xZX+NY2hWvphs7afsgNgXXDtPW8bP+LsO/11kuLhWGLydWKXYTAM2Ov/SOP1CfVV3CdcB9g26g4EuYphcUoRBP4EaVqdr7gXgcJNnh+/JKD2wUuO6fBApOGauOz2sfotNmKUu4CvZvoPI4NoGHfOhcpVD5ai2376INxnzWs1+aBwvMbJTrBPoO4btpfYBxAv4d5h+2j0UcEFQ3SYCzcK11stGK4n40D8J2uKBU1l3M1UDGiVPPmzaVfv37yvHMn8fsWfiUSvDjQzRts/9xzz0n//v2lWYDbQ4sWLaR9+/YZL5IeYOElFJRXxw+EosBItoN73FC5UpDtmOzgoE0NHa0adLZj3HHHhp0PXOy1Y7aeUtZDCBMy2/HY1TLF5g+BEOPnTq9Gu36fneRm85TyM4jhGWcTmiZFlMIgAcMQQpJtk/kYDLgvcLfX/C8uYZ5SNldYUOgP7heMeHg/ZFtBLIQoZSdatg3reeh7SKqMUJNiesMVCjw/9ry0vVuDx1Z38rsXYaKU7e5h5OBaYTLqd+9xv1WUQj+neYBwb1W8ts87sD/jOK04CYPRekqp0YgJDcRXN3Q6yMshX1EK10wnbXC5z2efLtr2kasN/6N/0ecX9wTeJ3Btd/MDAQgfNmTJ9tt6XXENsT+IBzr5hUjiCvGuKIV9of/TCbvftc21SlA2UQptwJ6LjgtWbHO/f6ed6gtm2OcgqP9zczD5gf1bUQq5F4HrKWXXAG3f6xfujecSkzt4dqD9ZCtqEbS6rc+ZikQ4H+RN0fA69YiCiAqxQPMDQaDDNYZHJHLC2X4Q11Bzxdi2jfxUSEWK9mAnerg2uFeY2GIMVU9FHJOOnX4VT/0ml/a5UrCPqKIUtrNh6+510yTHaM+ut6e2cTznrrCN84Po4uaX9PPahceeTjxdcDw2DwvaMrz3YD/Z/J75oH01JtxW5LMLC7hGSG9gUxdEneTZyaYVFtGmMZa7YWnus21/x778PByxz6BKwgBtTAVmuzgC+wD9ZJSUG9WI68UWJHigT8KYg+TXSpScUgg5DgrZKlUoVdDUE8+y31hkbQkklUeEB4C4oiHINqpA+3EsdKud5PZVhRClCjl+uti5F74Pz4N+j+2LcW2CFhf9QN5QW5kV/QfaHBLf2+/Ee+4CM1J2WDsafac+47bfQX+A+QBEcFut+Oef60PLVUirJVEqhsRQfoYPHy4HHXSQJypBcLr55ptl6tSpcsyynhleTtOnT5c7kS1Q0ECPkeuuu8773LBhw7zE57fddpuMsbNsUlTckJV84odL3fljtezAAzMNRXRO6MwxQdS8M+hQ4EarP+OcreCEAUEHBZtTyuKKUn7CkXpJoaOCG7IfapDppNsOMmqYxXUFtedfSMECkxV436FqTyUQttIDQycsnAECmhUR/cQSm9Cw0J5S9medGMLwghefhqSWciUwV3CNIDbooK0TMzvZxX3Ac4Dz8LvONqeUe0/thEZdw7E/iBxu8mm8byd76lSL5xvPKCpZuZ6hbvge/o77gOPHZNfed6yEqxBlV86wDZ7hME+pXLzd9HisF4GdeBVClEIoEV4AYcgARSfggYuJJfrBIC8lVKpDEld7vH6ilKLXHvt1jTo8r1aU0m3RfwfldMI4kW9FPj9RCseO3E8QVuzqPO5zkCgFbNtDewvKLxQVtHEcH9otRDkNv8D34jh1gmIna7adYaEEIWuolKgeNxB9MB5iLNVrhwUTGOKaI8WC5xHtAgUFbFiNK0oF5eNAG8E5IMxKK+aifelzZ593HJPejyhiEK4xngFMQiCE6PW2zzRW51H5D4n5Fb8FCOwLYjPalHoUxU1mC+FH+xwrUOEcVaRR8csegy4S6n2y2P4qSmhNkOc7jsEVfe2zX0y7zS/vKY4F/b7aVVFsIFwztDd8JsratDuW+Hln+oFcdvC8tyHDaO9oD+i31HbEeKReVKUsFpQEIOrhmYPdC1HIra4Y5HkIUdltc9qHoH/xK3qSjVKJUkHPX5AoBcEXYwbGMLQ9XVRAP6vtxqY/QD+G/s+ev9vOcw3fU0EQ8z0de4shSoU9l1aUgigEb9Kw/FIWO87jGvmlwsC4hn26OW3d/t6KUnasxMKlXhOMuZgHTZuWnlfi2dd7iXQCtRS+V1Gi1H777Sc//fSTXHjhhTJjxgxZf/31ZezYsbLaMtkc70GkUnr06OH9/ZRTTpHrr79eunXrJv/4xz9kLz8fa1I07GAcx4WyVFgxAZ2ATgC33dY/ZhkDJAwfNSLRuWM1TnNHYH9BRrMN33M7/6gdT1istOv1ZTtDPc9cktVjooBYfbjvFwpMIOBhkm31PCmEHSeurRsWh3ahkwY1EOz2foOoesMVQry1E0YYzBA5MOCpNx+MHjV8rJGbZFEKWFFKk8vbCQHuA54DGGJ+nn1hnlL2+bHu31j3gPeiFTds+J5ff2dXv9y/2e+yfSL2iZVd3Du/5NQ4N7SrbKJUrgISBHcVpXBN/Tx4Co16C6BfchNYByX3dQ1SXTlXIUWvFa4D2oBbqh7PF55JFYJ18u729zAw1Q2/EOEHfqIUwJjghgHgmlhPJPf7rQAXRZRC/4UVdOR3QtibK4SrFzDardt2MQmEdxJW323fZfsYXEMIW3/6U/3x6vHje7Tt47kKmqDjM/CigwcdhHwVlV1Ryq+PtSIJjheTIvQP9vlyCw1ke17weYg3+F7dBqIOJsi6SOT2+2iDOF499oDsEoFhH1GxdgCuKSrO4fwxadbcJdqubT8V9r1WZLLtLUgws+MG8lBp0mW0c3tdwkLfc8W1dfA84DnXirkW3D/8TQWFKLYWzg39Cp6rKB7+7vOZ7XfbFyGnKwR3FKtRwRRhicjHo2MYQiKxre3jagUk7sZ4iH7JT5CzIgK8bNVO9RNNbR+A9hC3ml6pKqFZsQPjg55jUPgennGbXkX7B4idKnha71o8Ewg5hmekUsjwPT2mYopSAAsfSCDu5ju2YwXG2VzDXN0xR9sUxh6Mb3Yc1gVRiw3fU+At6l4P/Z677qrv03WRkp5SCea4447zXn7cgVmzw4ABA+SDKL7rpGjYQcC6wycFazRCiFJRKkiFh6Fik+2iE7J5C8JEKTecR0GUaVCMcZSKE1FEKTUSg0SpQYOC9wtDD6tUhTYuCyVIYT/FLtWbLaeUOzmBq7ROmNxJHtoAujEYx+q4CWNTRakwl/6oWOMNBjHy7KBdZgsdzNcbpNjYlUoVKmw7wn0Iy10H0UXbSlRRCh5DGF6Qy0fvKb4HwgYmvbbKV1iCej9RykVXdlE9zQXtSM8tzDjOVZTCpEdDh10BvZjtQkUpVC0NAscCoUHFOCvcIrQPbcFOvtH+ca38CuhigofnDaFauI56L9xKVpgYqChViL7P7bttO8U1sCIYfrfPsDtuuKJUUAg9En4D5N9Sbzg7HiFvIMRAjH1B4Hr5JWx22xmOF6vA8BzW3B5+BHmV2gTG+jP2qca5+zmMxVaU0r/j2fQTJ+w1tON7kOcJwgHxzCKHjwJRCuenIqBfjj4cr4pSxag+5opSmHSp9wgWuCBwoL1qQmy0JXi4aVJ4neSiveN/rf5r2wauCewa5DUKCmVSEQD3ANfeilL2eYmT9iEqaB/W00Mr5PpdbzePUNRJHgS8XEUp17bJNilXsQnHCqHguefqk0QDXF+bP7OWwLXzWyDO1sf6eUGhz9L2b0UpLJJi/EF0RBJAfw3hG4uICFXWeQnGCD+B0/WuxzOPRQONbsBz4S52YryE3f/ss8GJzjE+qq0R166w31csUQqhmTY804K0B8gvhqIVfh5uWKjFgrsWFMF4op66fn2i/V3FfdvfuB7YQZ5SfovOdmxr2zZ9zOrZRVGKkCKRxGKGmHggr46dkIEgQ8RdaXS3s50L8ipgENEJZpCnVBBYeUaHZCe9YaKU24H6eUq5IXiYuKBT98uHYSnGamehwLmpq3GxsOcPZ0tca3geBIXvYYCDoYzP+RkRcNuH94mKUtabqhDhexZ8P4zkKNVwku4pBeMUeRJwXdXwt/fGT5SCwY9JFkKk7ADvtmkrbLpCIj7vJsfGs4zwOxiQmuA57Pn2CxkLwu/vOKag8AFMlrV4Qq6ilG13+H47WQ8KkSgE2k9pnqAg7P1yRXS/to3+1k+U0gmge43dffglGs8HGKjIVXHVVemx0BVDIISqKIV7YYUnd2Jvj9XmWIHQoCGIGNsgpEIgUQdxex6YhGjF1lxwvdcAFi+CwssVN+RBJz322PQ5sh5jfn0sKvDlUsTBTsDgUfTiiw3HcnyvXXDSySuqe0HgR3tE/qmw5yhbYm8NEYuLvf9WYMP1QlJerSin1xjVx/RnhImin8e5PP108AQMHuDZQL+Dl/XsxH20bbtYxTOs6ACRLkj80nYDj5Enn6w/XyUoNxY8lnB9MHnNRlhOKXdBAraW5h1UIBbiHmHhFsfr2mPZ2jZJ9xn2ugdN5nEtXVEKnpkoHhRUGRn3A/ZDqRbW0YegcjaAMKqiFJ4tPxvDfQ/PP0Qn9ZKyfa4FbVtFKbf/g32KuYd6SsUNG7V9VLFEqTCQc1aLT9l5D/oJCPbI6WSdEmBPYizAcavvizvmwNsM4baaM8/277hO2IcVy/Hc2wVOv+Im7vM9eHC6HWreQobvEVJA1MhOavU96+ZuK6cFiVLuoOWek+3E0CHZ7YNySvkBBR5iGQYCuObrpDCOKGUN7yCjBkasLTFciZRalMJ1dpNru9cX9xqCXxgYnJDzBIaRdS8udO61KBNqtANcw0Iloi0W8AjAM4RExUo2UQru/KhGBaPS5iVyJw7WQPEzouyzbe83rp2KUmHPt91nttV3v79DlLJVO4stSlmKKUppkuwgwU0ntXDRhwiIYgR+ibVd3HNAeAOM1DDjWnMGut4ohRLl4ZGECYKfNyT6AK2ahr+jDSD3kDvJd41hXAsYyRAa8PyqKIX+3z4nbl+Qq0cmJktYwAmazGfDXlech06c/PLgWe83d4JgPcRc75xsIoZ9fpGEG+PtgAHZjx3j7+jR6UkirrufR7W9rtk8pXCPcxGlrF3h9jl+Aq1tPza3jLtCnyu2PboLG6Wo6BrmjaX3GmFyFiQuhjgR1I7xLCEUMsqEOqj6nl+bQDiaH9ZT0/V+pCgVvQ2qx6lWy3TBtYRghfHG5pcMG1POPju9uBwWUVAsEFoNLy59hqMKPFFEKYTdPvhgcK4qFP/RRYO4z7Htu8shSlnssaOfhxeVrS6PBWb1RLR9mTvubrVV+n6ojWU9IrUfRz9qwxZtfxsURWP74TXXrBdCcWxRbJ1qoaJySpHKF6WSjp3MBYXvYYUbIg5CrWAIuYayK0pZ48IN38OqS1AeFazSaYeIkB64cmNVO8yjyTUq7SQ7KGQiKRX18qEUYqcdfNwJkFZis6v+UQt37rprw1LqhTofNc5sJaQgkHwYKzNRVoXLCdqxVpbxMxw0p5QFBqfb/mGkuEYWDDSsmAZdgyBPJ0w4bKLzfML3/PZvvTTd/EgKDHCs4OUbvlcOUQreKI89lpnUVsFzpQYkJgRYQIgaEmWvMfYDl/hsoG2hshWMz/33T19vCEkvvCAFI6gPt2KNTmKDcgBZgx/niUkTsJ5Dfslyg6pyxgHjVj4eA/Y8YXDrxMmOjVFEKSvMRJn02DbsFjCBt2OcsSAst49td0E5pfLt6zFxwqIV+qR8El/b789n3AkTBIPEgVIRZPtAdMomZEadTFtRCnahe0/ghYP8ZK5IHHbMtsAARalgMGYjFFsrpkH0e//94MT6ei1hc6n9my2VBBZsoowfxQBedVi4tMUnFBTQCfJMRR+hKSGCRCm0fyz0AOQbVDDOInzMFlnJJadUUkQpraqHcD63r8f1tZ6L9lj9FgyCroOK8Xh2VZTCPCBKmhL7nWss89KHneN6VFY7FKVI0cFgfM014TkmkoIVaIK8S9QVHtV90OG4E9swUQpGn+18kKsCpaotMGiwXxsnjRAMvLLhHosNCQsyaoqdi6kUYAD1qyZUSGx78KvIgfsKTwcNDYiSh8JiJwRxyteGgTAODI5RwmZxvGG5Q5KMTcKNZ86dXOFeZSvhrcaGrZLoYp8h11PKfn8hRCn37zBINfGu7YsQCobVXrvvQnhKheWnKzQQw1CJ85FH0qIQhBVMMk44IXNlGuebbZJvsecQ9XmEMIlqODDicY//+tf0+6+9JkUHnpW4zphMZDNkcWwIw4IIbscUe5/87lkhPKXyxa782vuZzVPK9YaxE60olWGLKaxa7LFkW5zIRwhSD+98KJSnFICNghxmGhJ6661pgRkLbMVAc8xBQM62nQv6y0KmJAiqdqugHWs4VlTQD6goFdXDvhbBmI0CCyoEYjEuTPzTsRue00qSC+7gvOz52P4eOaeCih/ZvjNs3NTr5lYndavVxRW/kyZKwSMyrndvLtUWbZ+qCyeXXCIyYkQ6MsIPG2raJUBArAUoSpGig9UKrAxXwoOGeGEMaAiFCeuAYRxrlSEXV5TC71hhwaqM61YPN1ArSmG/cCN1Y+NzAWEGVqTCsVhPnmoSpZCQFoZGMUPPrNGiOZrcew4PGxWlonpKKbg3yEGF1ZYouZ+igOMKWiWuJmwbhiDjJ0phwg/3bJ0Y5OIhaK+l/TmqKGWf6TieUvBiU2HRimEQczRfgc3pUkhPqb/9TeTttxtWtyk0EERVFIWHElYI800Sba9hHJHYr3IiRMFsOa/yBW0HIUZR7x9yArlY7ye/Psi2wbh9VKGw4REYj7RQhVtFE4T1hXZ8i1IdMm7591yxz2i2iVy5UxoUUpTCxNlOnjERjiMix+X889NJ5/2S2ltcz1fcExu+Uwhs2y2UwIFJ/RdfFC9ZfDURRzDRfgOLIJUgSrm4qSOi9LNR5l9WOIJ3oy28UQ2eUrkQxU5UrzKtbugnSiGED3O9oHZqP9MoD8/XSofdHCk6eMCClPykgY4Tq3u5Tur8RClgS7WqGymqgGFCiQknfkY4BIzmfCcK6vLtimZalttV/itBLMwGDAo3IW2hsZM5m2TbTkLsZDaX+5gtBxXxx52Qujm5YMTBEIWbu4pSuXhNBHlK2Wc+qvGVTSzUROOYtNuJnTVCrWhjDdVcc7j45ZTCimmxPB2CiOsRFYQVovKdcMPTF8JJsUOR8l2M8Ku4arHtpFzeF9boRhJXHDPCJO2xIdkrntGwqoCWJIlSCMn+6KNoOaqSJEpV2gIGFt5QEj6uyIwQnmJ7UheCQi1OkXD7APZ+KfKeFUMoCbMz7d+ijKdW+ESffNNN6QIQajPlI0pVGkiCjvOPIl6ffno6vF/DRe1YZCNlwsQmLMT9+mt63KtlKEoR4pDv4BSUDNliXUgLXZEQYTCIA0eZdBccj4pSCFPB70gaTPITpXRiAU8tDNwQ+pJcrbDacCek1hjC/SjUKrOfd1yciT4mR/C4gZiUzcBDP3T33WlRyg0V9ROU7TG43pBRKVc4V7HQ4gEwBqPkVct2P7SCXZKxIoffRMS2pXKuXmPcQx42hLCjQqIrSiFvY5wCHFHC9xDmg2qn8FAuJhBDr7gi+rZJaS+VNDGPQym8jIohSkEAt4U5SGHAxP/55+t/rzRbzdo7Ycdu+5Yoi6TWJoEdg+cG/bOKUnGfI2sLVZptgbBIeGtHEeJwne2iuPUuizrGQig9e1leyFqGohQhBSYXr4lCG/tBQpet/IAO1y/8g/hjB3/1vHHFRwxOd95JV/skeUq5hhS8gQpRYtcKznZCEmbEoM1ceWX07/AzJO33BnlK5RqSa9t4NYT1QiS++ea0QVwrOVkgwKE6HO6fn+eLO/EoF0gmjzyA8A5FHqJSJHNGnkZUOLO5FstNrsnmC4V95osZalduUMUKuU3PPLNyRCksXiJPF9JJkMKBCAUkR0dURKWF7sXx+ERYGXIyYjEsSkgYIlrg7QO7Q+0m2FIXX5y7uIuk8z/9VDnRMpZ8ImZIblCUIqTA+IXvJQUMDKiwhuPaeONyH01le0pZbxR7z8s9yahFXFHKrsq5BhxCIgohSlkjL9/cR4XwhLGGdSEEpUo0Iv3uUS2VU44b9lPOyS4mPhoWipyA8G6E925ckIfsf/+L5v0EURiiVJIYOFDk2WfLOx4jhQA8qG34brWBRTi0r6ACNvli+5lCVTR2E1yTwmFttkoTpZDYH17Ua66Zvf2gWEhUsP3w4Q3f11xJuRBWLbxawTXH4uOwYeU+ksqDohQhNSRKHXFEuooUEq8zcWY8rOECUQp5wBSWay4vSGSLKk864QhbFUS+l6uvzm7Q+RH0zMDjEPvNZZ/59C/WI8yecz4r9Qj//fTTaPlwSGUyalQ6f0WhQ8fzCbPUUMtsoLIbxjANl0B1RPweNfdU0oCNAFGonCSlHRSbYglSmshYwVhEko212SotfA+51FAQqdyhvyR4oeSOO3h1coGiFCE1JErBnbcQZaRrkbCSz9Wai6NSOOSQtHdIFE8LTF4h5vhVWIuSZ+DppxuGvUIQCir1W0xj2lbXAcccI/Ltt/mFJ9kqeKQ6KYV4WixOPDH9HKoIAM/UYleGJCQbGANQSGPs2OIXQyC17Snll6ydkGqAohQhBSZKonNS+Z5SWK2CGFIN1QsrHYi/e++d+R7ukV/uBUwecnVHx7ONiizlBMd/9NEiv/2WWdlFK8QRUs0gTyNDz0kSQb+MBYGkhYiShljbvBJFKUKqEYpShBQYDnbViQ3dUndvVwghyQG5l37+WaoSeoYQQkjyEiPvsEO5j4LEXTyutPA9QqoVilKEFGGwQ3JKJBuutDKopPy5KUhhqGZRihBCCCH5i1LMr0pIMmDBQ0KKAMr4nnxytDKspPLgylryGTq0PjEyIYQQQogb0VCIarWEkPyhpxQhhEQglcp00yfJBiXikf9ppZXKfSSEEEIISQo2jxRFKUKSAUUpQgghVQe8FJGMnhBCCCHED4pShCQDrvcTQkgE1l+/vgQ5IYQQQgipbChKEZIM6ClFCCER6NhR5K67RFq14uUihBBCCKl0Fi4s9xEQQgBFKUIIiQirKRJCCCGEVAf0lCIkGTB8jxBCCCGEEEJITUFRipBkQFGKEEIIIYQQQkhN0bJluY+AEAIoShFCCCGEEEIIqQnOPz9dofecc8p9JIQQwJxShBBCCCGEEEJqgv790y9CSDKgpxQhhBBCCCGEEEIIKTkUpQghhBBCCCGEEEJIyakYUeqXX36Rgw46SDp06OC98POvv/4a+plDDz1UGjVqlPHabLPNSnbMhBBCCCGEEEIIIaTCc0oNHTpUvvnmG3nmmWe834866ihPmHriiSdCP7fTTjvJ6NGj635v3rx50Y+VEEIIIYQQQgghhFSBKDV+/HhPjHr77bdl00039d675ZZbZPPNN5eJEydKr169Aj/bokUL6dKlSwmPlhBCCCGEEEIIIYRURfjeW2+95YXsqSAFEIaH9958883Qz7788svSuXNnWXvttWXYsGEyc+bMEhwxIYQQQgghhBBCCKl4T6nvvvvOE5Zc8B7+FsTgwYNln332kdVWW02mTJki5513nmy//fYybtw4z4PKjwULFngvZfbs2QU6C0IIIYQQQgghhBCSCFHqggsukBEjRoRu895773n/I0m5SyqV8n1f2W+//ep+Xn/99aV///6eQPXUU0/Jnnvu6fuZkSNH+h4TxSlCCCGEEEIIIYSQ7KiGAt0msaLUCSecIPvvv3/oNquvvrp88skn8v333zf42w8//CArrbRS5O/r2rWrJ0pNnjw5cJuzzjpLhg8fXvf79OnTpXfv3tK9e/fI30MIIYQQQgghhBBS6/z2229e6qVEilIrrrii98oGEprPmjVL3n33XfnDH/7gvffOO+94722xxRaRv++nn36SadOmeeJUEAjrs6F9bdu29T7Trl27UK+sSlApIazhXNq3b1/uwyEkkfA5IYTPCCEcSwihvUVIuZldBfN3eEhBkOrWrVvodo1S2XypEgLyQ3377bfyr3/9y/v9qKOO8ryennjiibpt1llnHS/8bo899pA5c+Z44YF77bWXJ0J99dVXcvbZZ8vUqVO9an4QmWqtUUOdhJBXqY2akGLD54QQPiOEcCwhhPYWIeVmdg3N3yui+h645557ZIMNNpCBAwd6rz59+shdd92Vsc3EiRO9mwaaNGkin376qey2225e5b1DDjnE+x+V/GpNkCKEEEIIIYQQQghJGhVRfQ8sv/zycvfdd4duY52+WrVqJc8++2wJjowQQgghhBBCCCGEVK2nFMkP5Mk6//zzM/JlEUL4nBDCsYSQwkKbixA+I4RwLIlOxeSUIoQQQgghhBBCCCHVAz2lCCGEEEIIIYQQQkjJoShFCCGEEEIIIYQQQkoORSlCCCGEEEIIIYQQUnIoShFCCCGEEEIIIYSQkkNRihBCCCGEEEIIIYSUHIpShBBCCCGEEEIIIaTkUJQihBBCCCGEEEIIISWHohQhhBBCCCGEEEIIKTkUpQghhBBCCCGEEEJIyaEoRQghhBBCCCGEEEJKDkUpQgghhBBCCCGEEFJyKEoRQgghhBBCCCGEkJJDUYoQQgghhBBCCCGElByKUoQQQgghhBBCCCGk5FCUIoQQQgghhBBCCCElh6IUIYQQUiYaNWoU6fXyyy97L/z80EMPJeJ+FeN4LrjgAm+fUVh99dXl0EMPLcj3zpkzR04++WTp1q2btGzZUjbaaCO57777In/+2WeflS233FJatWolHTp0kF133VU+++yznI9n9uzZcskll8i2224rXbp0kbZt28oGG2wgl19+ucyfP9/3mgW94pxHIcB34piUO+64w3vv/ffflyTiHm9Uvv32W+9zH330UVGOqxTfo/fmq6++Kvi+CSGEkKg0jbwlIYQQQgrKW2+9lfH7RRddJC+99JL897//zXi/d+/e8sEHH/DqF4k999xT3nvvPbnssstk7bXXlnvvvVcOOOAAWbp0qQwdOjT0s//5z39kjz32kN12200efvhhmTVrlowYMUK23nprb59rrrlm7OOZOnWqjBo1Sg466CAZPny4J0q99tprnjjx/PPPey8V74488kjZaaedGuxj2LBh8uWXX/r+rdhtepVVVpFqB2IR7jPEUYiYlf49hBBCSLmgKEUIIYSUic022yzj906dOknjxo0bvF8Ifv/9d2ndunXB91vpjB071hN5VIgC2223nXz99ddy+umny3777SdNmjQJ/PyZZ57peTE98sgjdULRFlts4Ylbf/vb3+See+6JfUw9evTwvFfatGlT997222/v/Y5jeuONN2Srrbby3ocA5IpA+Cw8tQ488EBZbrnlpJQUo+0SQgghpHph+B4hhBBSQSxatEjOOeccL9Ssffv2suOOO8rEiRMztkHY1/rrry+vvvqqJ5BAjDr88MPrQsNOO+00T/ho3ry5rLzyyl7o2ty5czP28eCDD8qmm27qhaPh82ussUbdPuIeD7j99ttlww039MLjll9+ec+7aPz48ZHO94wzzvDC2HAcEGPeffddKRSPPvqo54m0zz77ZLx/2GGHeV4q77zzTuBnf/rpJ+9cBw8enBF2uNpqq3nX/7HHHpMlS5bEPiaIT1aQUv7whz94/0+bNi3087jWqVTK86LKxg8//CBHHXWUdO/eXVq0aOEJowhFfOGFFxq0J3hrQXRCmCLazXnnndfg/KKEw82YMUP69esnPXv2lMmTJxelXbpg//AeW2GFFbz7DQ+ySZMm+W6LY4KHXOfOnb1rsu6668r111+fEbq6ySab1LUTDZW0541wxT/96U9eW0eb79u3rzzwwAMNvmv69Ol11x/njedo7733lu+//76g3/P222979xXb4DvOOuss79kihBBCyg09pQghhJAK4uyzz/Yml7feeqs30YanDnIYQeCxHj2Y+P/5z3/2BJ1LL73U88CCt9SAAQPkm2++8fbTp08fz6MGHj2ffvqpJ0Rg0osQLHgI4YUJMCay8BxywwqjHs/IkSO97eCJhJ8h5mC/m2++uRfiBnEiCAgJd955pydY/PGPf5T//e9/Xrjdb7/91mDbxYsXR7qGOC4VkbA/iA5Nm2aaRLg2+ncIe34sXLjQ+x/ChQvew/VGCB28pgDOGaFYCNGE0BMXvf7rrbde4DYIOUSuoLXWWsu719lAiCBCQ5HDCsf566+/er/jHlm+++472X///eWvf/2rXHjhhfLUU0/JxRdfLL/88otcd911kc8B13PIkCGedxfa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VDn3NWHChJIdNyGEEEIIIYQQQgipYFHqlVdekeOPP17efvttef7552Xx4sUycOBAmTt3btbPQryaMWNG3atnz54lOWZCCCGEEEIIIYQQUuE5pZ555pmM30ePHu15TI0bN0622Wab0M9iu+WWW67IR0gIIYQQQgghhCSPJUuWyKJFi8p9GKSKaNKkiTRt2jRrzqiqEaVcZs2a5f2//PLLZ922b9++Mn/+fOndu7ece+65st1225XgCAkhhBBCCCGEkPIyZ84c+eabbySVSvFWkILSunVr6dq1qzRv3ry2RCk8TMOHD5etttpK1l9//cDtcHFuvvlm6devnyxYsEDuuusu2WGHHbxcU0HeVdgOL1vGkBBCCCGEEEIIqUQPKQhSEA86deqUt1cLIarJLFy4UH744QeZMmWKlyKpcePGtSNKnXDCCfLJJ5/I66+/Hrpdr169vJey+eaby7Rp0+TKK68MFKWQUH3EiBEFP2biz7ffilx1lcjee+P+8CoRQgghhBBCSKFAyB4EBAhSrVq14oUlBQPtqVmzZvL11197AlXLli2rO9G58pe//EUef/xxeemll2SVVVaJ/fnNNttMJk+eHPj3s846ywsN1BdELFI8rr1WZNIkkUsv5VUmhBBCCCGEkGJADylSDHL1jqpITymouxCkHn30US/8rkePHjnt58MPP/TC+oJo0aKF9yKl4bffeKUJIYQQQgghhJBapGI8pY4//ni5++675d5775V27drJd999573mzZuX4eV08MEH1/0+atQoeeyxxzzPqM8++8z7+8MPP+yF/5FkwJBmQgghhBBCCCHF5o477pDlllsu8vZwhoGH2a+//lrU46p1KkaUuvHGG71wum233dbzdNLX/fffX7fNjBkzZOrUqXW/I67xtNNOkz59+sjWW2/t5aB66qmnZM899yzTWRAXilKEEEIIIYQQQvx48803pUmTJrLTTjvFukCrr76656Ri2W+//WQScsdEZIsttvA0hg4dOuQkapEqDN/LBhqJ5YwzzvBeJLlQlCKEEEIIIYQQ4sftt9/upfG59dZbPQeUVVddNa/E3HGSvTdv3ly6dOnCG1NkKsZTilQnFKUIIYQQQgghhLjMnTtXHnjgATn22GNll112aeCEggJo/fv396q+rbjiinURUYiuQkW4U045xQu/0yTv1tNp4sSJ3vsTJkzI2OfVV1/teVnBKcaG7+Hnww47zIve0n1ecMEFcuGFF8oGG2zQ4Nj79esnf/vb33hTI0BRipQVilKEEEIIIYQQUhoQgDR/fnleEYKfMkCqnl69enmvP//5zzJ69Oi6CCpNy7Pzzjt7xcxefPFFT6ACjzzyiKyyyiqeYITwO7xcsE8IR/fcc0/G+8hhPXTo0AbVChHKh3DA9u3b1+0TqYIOP/xw+fzzz+W9996r2/aTTz7xjunQQw+Nd8I1SsWE75HqhKIUIYQQQgghhJSGBQtE9tmnPFf7wQdFWraMvv1tt93miVEAOaXmzJnjiU877rijXHLJJbL//vvLiBEj6rbfcMMNvf+XX355Lw8VCqSFhd8deOCBct1118lFF13k/Y58U+PGjZM777zTN5QPuaUgVtl9tm3bVgYNGuQJZptsson3Hn4eMGCArLHGGtFPtoahpxQpKxSlCCGEEEIIIYRYEF737rvvesITaNq0qZeoHDmmwEcffSQ77LBDXhcN+0aY39tvv+39Dq+pjTbaSHr37h1rP8OGDZMxY8bI/PnzZdGiRd5+4EFFokFPKVJWKEoRQgghhBBCSGlo0SLtsVSu747jJbV48WJZeeWV695D6F6zZs3kl19+iZWwPIiuXbvKdttt54XsbbbZZp6wdPTRR8fez6677iotWrSQRx991Pt/wYIFstdee+V9fLUCRSlSVihKEUIIIYQQQkjp5l9xQujKAcQohNBdddVVMnDgwIy/QeyBJ1KfPn28UD4kH/cD4XZLlizJ+l0I4TvzzDPlgAMOkC+//LLOMyvOPuHFdcghh3hhexClsI/WrVtHOldCUYqUGYpShBBCCCGEEEKUJ5980vOGOuKII7w8Tpa9997b86K65pprvPC9Nddc0xOBIGQ9/fTTcsYZZ3jboYLeq6++6v0NQhGq8/mBZOmo7ocXvKasZ5YL9ql5rZC/CsKTik9HHnmkrLvuut7Pb7zxBm9mDJhTipQVilKEEEIIIYQQQhSITkhm7gpS6imFfFKogvfggw/K448/7uWB2n777eWdd96p2w6V97766itPtOrUqVPgxcV+EH738ccfe15TYaAC3zHHHOPltsI+r7jiirq/9ezZ0/s7qvptuummvJkxaJTSmorEl9mzZ3sPw6xZs7wGSwoLhOzx49M/P/EEry4hhBBCCCGEFAok354yZYr06NFDWiY9bq+CgayyzjrreDmphg8fLrXC/JD2FVVLYU4pkhhPKcij9JwihBBCCCGEEFIpzJw5U+666y6ZPn16YI4rEgxFKVJWGpsAUuSMa8oWSQghhBBCCCGkQlhppZW8nFU333yzdOzYsdyHU3FQAiCJYfFiilKEEEIIIYQQQioHZkTKDyY6J4nxlFq0qJxHQgghhBBCCCGEkFJCUYqUFZtmH55ShBBCCCGEEEIIqQ0oSpGyYoUoilKEEEIIIYQQQkjtQFGKlJWlS+t/pihFCCGEEEIIIYTUDhSlSFmhpxQhhBBCCCGEEFKbUJQiZWXJkvqfmeicEEIIIYQQQgipHShKkcSIUgzfI4QQQgghhBCSja+++koaNWokH330UUkv1ssvv+x976+//prXfrCPxx57LHHnVw4oSpGyQlGKEEIIIYQQQogCMSbsdeihh/JiReCVV16Rfv36ScuWLWWNNdaQm266KetnXnzxRdliiy2kXbt20rVrVznzzDNlcZG9RyhKkbLCnFKEEEIIIYQQQpQZM2bUvUaNGiXt27fPeO/aa6/N6WItWbJEltpKW1XMlClTZMiQIbL11lvLhx9+KGeffbaceOKJ8vDDDwd+5pNPPvE+s9NOO3mfue++++Txxx+Xv/71r0U9VopSpKzYPoE5pQghhBBCCCGktunSpUvdq0OHDp53lPue8n//93+y3XbbSevWrWXDDTeUt956q+5vd9xxhyy33HLy5JNPSu/evaVFixby9ddfy8KFC+WMM86QlVdeWdq0aSObbrqpF5anYJtdd91VOnbs6P19vfXWk7Fjx2Yc47hx46R///7e98KzaOLEiRl/v/HGG2XNNdeU5s2bS69eveSuu+4KPed3331X+vbt63k1Yb8QhfIBXlGrrrqqJ+qtu+66cuSRR8rhhx8uV155ZeBnIEL16dNH/va3v8laa60lAwYMkJEjR8r1118vv/32mxQLilKkrNBTipDq4auvMACKzJpV7iMhhBBCCCGhzJ0b/Jo/P/q28+ZF27ZInHPOOXLaaad5uZfWXnttOeCAAzLCzX7//XdPWLn11lvls88+k86dO8thhx0mb7zxhifCwDton3328byDJk+e7H3m+OOPlwULFsirr74qn376qVx++eXStm3bBt971VVXyfvvvy9Nmzb1BB/l0UcflZNOOklOPfVU+d///idHH320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N7v97q233pKVVlop8ecNHTq04jU1derU0GNOPPFEOfbYYzuff/DBB7LaaqvRY4oQQgghhBBCCCEkARp1BmeiwopSgwcPrjziQEJziEOPPvqofO5zn6u89q9//avy2uabb57489555x155ZVXKuJUGAjrs6F9eiHpMUUIIYQQQgghhBCSnA8//LAShRZGj4442aogID/U66+/Lr///e8rzw899NCK19NNN93Uecy6665bCb/bc889Zc6cOZXwwL333rsiQr300kty0kknyYwZMyrV/JZZZplEn7to0aLK5+L4qFDBogNxDcIaRLlll1222adDSCFhPyGEfYQQziWE0N4ipNnMboH1O6QmCFLDhg2Tnj17ljvRObjqqqvkyCOPlB122KHyfPfdd5fzzz+/6pgXXnih4j0FevXqJU8//bT88Y9/lPfff78iTG2zzTZy7bXXJhakAC7eKqusIq0CGnRZGzUhjYL9hBD2EUI4lxBCe4uQZrNsydfvUR5SpROlBg0aJOPHj488xjp99evXT2677bYGnBkhhBBCCCGEEEIIKVX1PUIIIYQQQgghhBDSnlCUahOQvP2UU06pSuJOCGE/IYRzCSG0uQhpJFyXEMJ+UspE54QQQgghhBBCCCGkdaCnFCGEEEIIIYQQQghpOBSlCCGEEEIIIYQQQkjDoShFCCGEEEIIIYQQQhoORak24YILLpA111xTllxySRk9erTcf//9zT4lQhrCGWecIZ/97GdlmWWWkRVXXFH22GMPeeGFF6qOQWq9U089VYYNGyb9+vWTrbfeWp599tmqY+bPny/f/e53ZfDgwbLUUkvJ7rvvLq+++irvImnJPtOjRw85+uijO19jHyHtzmuvvSZf/epXZfnll5f+/fvLZz7zGZk0aVLn79lHSLvzySefyA9/+MPKegO21FprrSWnn366LFq0qPMY9hPSbtx3332y2267VdYYsK1uuOGGqt/n1Sfee+89OfDAA2XAgAGVB35+//33pSxQlGoDrr322sri4uSTT5Ynn3xSttxyS9l5551lxowZzT41QurOvffeK9/5znfkkUcekTvuuKNiNO2www7y0UcfdR7zy1/+Us4++2w5//zz5bHHHpMhQ4bIF7/4Rfnwww87j0Efuv766+Waa66RBx54QObMmSO77rqrLFy4kHeRtAxo/xdffLF8+tOfrnqdfYS0MzD2P//5z0vv3r3l1ltvleeee05+/etfy3LLLdd5DPsIaXd+8YtfyEUXXVSxpSZPnlzpE7/61a/kt7/9becx7Cek3cB6Y8MNN6z0Cx959Yn9999f/v3vf8vEiRMrD/wMYao0oPoeaW0+97nPdRx22GFVr6277rodP/jBD5p2ToQ0i1mzZqHiaMe9995beb5o0aKOIUOGdJx55pmdx/zvf//rGDBgQMdFF11Uef7+++939O7du+Oaa67pPOa1117r6NmzZ8fEiROb8C0IyZ8PP/ywY8SIER133HFHx1ZbbdVx1FFHVV5nHyHtzve///2OLbbYIvT37COEdHTssssuHQcffHDVpdhrr706vvrVr7KfEAKXKJGO66+/Pve547nnnqu89yOPPNJ5zMMPP1x57fnnny/FtaenVIuzYMGCins5PEMseP7QQw817bwIaRYffPBB5f9BgwZV/p8+fbq88cYbVX2kb9++stVWW3X2EfShjz/+uOoYuNmOGjWK/Yi0DPAo3GWXXWT77bevep19hLQ7N954o2yyySay7777VsLAN9poI7nkkks6f88+QojIFltsIf/85z9lypQplcvxn//8p+LVMXbsWPYTQjzkNXc8/PDDlZC9TTfdtPOYzTbbrPJaWdb7SzT7BEh9efvttyuufSuttFLV63iOTkBIO4FNimOPPbZiOGEwB9oPfH3k5Zdf7jymT58+MnDgwG7HsB+RVgAu4U888UTFddyFfYS0O//973/lwgsvrMwfJ510kjz66KNy5JFHVhYPX/va19hHCBGR73//+5WNv3XXXVd69epVWX/87Gc/k3HjxlWuD+cSQqrJq0+88cYblQ0TF7xWlnUKRak2AYnV3MW5+xohrc4RRxwhTz31VGXnLo8+wn5EWoFXXnlFjjrqKLn99tsrxTDCYB8h7QoSNcNT6uc//3nlOTylkIgWQhVEKYV9hLR7Dtvx48fL1VdfLeuvv34lpw1y4cCr46CDDuo8jv2EkGp65LAG8R1fpnUKw/daHGTpx26Fq5LOmjWrmypLSCuDqhUIwbj77rtllVVW6XwdCQVBVB/BMQiFRbLbsGMIKStwDUdbRmXWJZZYovJAgYDzzjuv8rO2cfYR0q4MHTpUPvWpT1W9tt5663UWjOE8QojI8ccfLz/4wQ9kv/32kw022KCSZPmYY46pVHRlPyGkO3nNHUOGDJE333yz2/u/9dZbpVmnUJRqceDuh4UGqo5Z8HzzzTdv2nkR0iiwSwAPqb/97W9y1113VUoVW/Acg7ntIxj8sSjXPoI+hKpL9piZM2fKM888w35ESs92220nTz/9dGVXWx/wCjnggAMqP6OsN/sIaWdQee+FF16oeg15c1ZfffXKz5xHCBGZO3eu9OxZvbTExjg8DdlPCOlOXnPHmDFjKqGzCC1X/vWvf1VeK816v9mZ1kn9QbZ+ZO2/7LLLKtn5jz766I6lllqq46WXXuLlJy3Pt7/97UoVi3vuuadj5syZnY+5c+d2HoOqFzjmb3/7W8fTTz/dMW7cuI6hQ4d2zJ49u/MYVLBcZZVVOu68886OJ554omPbbbft2HDDDTs++eSTJn0zQuqHrb4H2EdIO/Poo492LLHEEh0/+9nPOqZOndpx1VVXdfTv379j/Pjxncewj5B256CDDupYeeWVO26++eaO6dOnV2yqwYMHd5xwwgmdx7CfkHasbPzkk09WHpBezj777MrPL7/8cq59Yqeddur49Kc/Xam6h8cGG2zQseuuu3aUBYpSbcLvfve7jtVXX72jT58+HRtvvHHHvffe2+xTIqQhYALwPa644oqqkqynnHJKpSxr3759O77whS9UJgbLvHnzOo444oiOQYMGdfTr168y0M+YMYN3kbSFKMU+Qtqdm266qWPUqFGVOWLdddftuPjii6t+zz5C2h0sojFvrLbaah1LLrlkx1prrdVx8sknd8yfP7/zGPYT0m7cfffd3nUIRNw8+8Q777zTccABB3Qss8wylQd+fu+99zrKQg/802xvLUIIIYQQQgghhBDSXjCnFCGEEEIIIYQQQghpOBSlCCGEEEIIIYQQQkjDoShFCCGEEEIIIYQQQhoORSlCCCGEEEIIIYQQ0nAoShFCCCGEEEIIIYSQhkNRihBCCCGEEEIIIYQ0HIpShBBCCCGEEEIIIaThUJQihBBCCCGEEEIIIQ2HohQhhBBCSIM49dRT5TOf+UzDr/c999wjPXr0kPfffz/0mCuvvFKWW265hp4XIYQQQtobilKEEEIIITkA0Sfq8fWvf12OO+44+ec//1nI6/2Vr3xFpkyZ0uzTIIQQQkgbsUSzT4AQQgghpBWYOXNm58/XXnut/PjHP5YXXnih87V+/frJ0ksvXXkUEZwfHoQQQgghjYKeUoQQQgghOTBkyJDOx4ABAyreUe5rbvgevKf22GMP+fnPfy4rrbRSJXzutNNOk08++USOP/54GTRokKyyyipy+eWXV33Wa6+9VvFsGjhwoCy//PLypS99SV566aXYc3zwwQdlww03lCWXXFI23XRTefrpp0PD9/Rc//SnP8kaa6xROf/99ttPPvzwQ7YXQgghhOQCRSlCCCGEkCZy1113yeuvvy733XefnH322RUxaNddd60ITv/617/ksMMOqzxeeeWVyvFz586VbbbZpuJxhb954IEHKj/vtNNOsmDBgsjPgtB11llnyWOPPSYrrrii7L777vLxxx+HHv/iiy/KDTfcIDfffHPlce+998qZZ56Z+zUghBBCSHtCUYoQQgghpInAG+q8886TkSNHysEHH1z5H8LTSSedJCNGjJATTzxR+vTpU/FyAtdcc4307NlTLr30Utlggw1kvfXWkyuuuEJmzJhRSWgexSmnnCJf/OIXK3/3hz/8Qd588025/vrrQ49ftGhRxYNq1KhRsuWWW8qBBx5Y2JxYhBBCCCkfzClFCCGEENJE1l9//YrIpCCMDyKQ0qtXr0qI3qxZsyrPJ02aJNOmTZNlllmm6n3+97//VTybohgzZkyVGAYBbPLkyaHHI2zPfs7QoUM7z4MQQgghpFYoShFCCCGENJHevXtXPUcuKt9r8FoC+H/06NFy1VVXdXuvFVZYIfXn473TnJueByGEEEJIrVCUIoQQQggpERtvvHGluh9yQi277LKp/vaRRx6R1VZbrfLze++9J1OmTJF11123TmdKCCGEEBINc0oRQgghhJSIAw44QAYPHlypuHf//ffL9OnTKwnIjzrqKHn11Vcj//b000+v5IR65plnKpX/8D6o/kcIIYQQ0gwoShFCCCGElIj+/ftXqu7B42mvvfaqJDpHgvR58+bFek6hch7EK4T/zZw5U2688cZKEnVCCCGEkGbQo6Ojo6Mpn0wIIYQQQgghhBBC2hZ6ShFCCCGEEEIIIYSQhkNRihBCCCGEEEIIIYQ0HIpShBBCCCGEEEIIIaThUJQihBBCCCGEEEIIIQ2HohQhhBBCCCGEEEIIaTgUpQghhBBCCCGEEEJIw6EoRQghhBBCCCGEEEIaDkUpQgghhBBCCCGEENJwKEoRQgghhBBCCCGEkIZDUYoQQgghhBBCCCGENByKUoQQQgghhBBCCCGk4VCUIoQQQgghhBBCCCHSaP4fHJgGQvP7bDYAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Pick one neuron to visualize\n", + "neuron_key = {'mouse_id': 0, 'session_date': '2017-05-15', 'neuron_id': 0}\n", + "activity = (Neuron & neuron_key).fetch1('activity')\n", + "\n", + "fig, axes = plt.subplots(2, 1, figsize=(12, 6), sharex=True)\n", + "\n", + "for ax, param_id in zip(axes, [1, 2]):\n", + " key = {**neuron_key, 'spike_param_id': param_id}\n", + " spike_times, spike_count = (Spikes & key).fetch1('spike_times', 'spike_count')\n", + " threshold = (SpikeParams & {'spike_param_id': param_id}).fetch1('threshold')\n", + " \n", + " ax.plot(activity, 'b-', alpha=0.7, label='Activity')\n", + " ax.axhline(threshold, color='r', linestyle='--', label=f'Threshold={threshold}')\n", + " ax.scatter(spike_times, activity[spike_times], color='red', s=20, zorder=5)\n", + " ax.set_title(f'Threshold={threshold}: {spike_count} spikes detected')\n", + " ax.set_ylabel('Activity')\n", + " ax.legend(loc='upper right')\n", + "\n", + "axes[1].set_xlabel('Time bin')\n", + "plt.tight_layout()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Average Waveform" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:36.944860Z", + "iopub.status.busy": "2026-01-14T07:34:36.944727Z", + "iopub.status.idle": "2026-01-14T07:34:37.125684Z", + "shell.execute_reply": "2026-01-14T07:34:37.125390Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAArMAAAGHCAYAAACj5No9AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzsnQe4pVV19/cwwAwdpEivAqIogihFFNTYaywxxt5iLDGoifk0YjcaKxoVYyUmFkw0fjFWvoiAYqOKdJUmIE3pMEy53/N77/zuXXfPfss599w2867nuXPvnPOWXdf+77X/a61FY2NjY6mXXnrppZdeeumll14WoKw31wXopZdeeumll1566aWXYaUHs7300ksvvfTSSy+9LFjpwWwvvfTSSy+99NJLLwtWejDbSy+99NJLL7300suClR7M9tJLL7300ksvvfSyYKUHs7300ksvvfTSSy+9LFjpwWwvvfTSSy+99NJLLwtWejDbSy+99NJLL7300suClR7M9tJLL7300ksvvfSyYKUHs7300svA8rOf/Sz96Z/+adp1113TkiVL0j3vec902GGHpde//vVDteZll12WFi1alI4//viJz972trdVn91www0z0kNPfOIT02abbZZWrFgx5fOzzjqreu8OO+ywxj2nnnpq9d1HP/rRNJdCez3hCU9I97jHParyHH300WltENqX8XT55ZfP2jvPPvvsqi0ZyxtttFHVpozlf//3fy9ev3z58vShD30o3e9+96uu33LLLdPhhx+eTjvttIlrLr744rThhhumM888c9bq0Usv67KsP9cF6KWXXhaWfOtb30pPfvKT01FHHZXe9773VaDvmmuuSaeffnr6yle+kj74wQ8O/Eye8ZOf/CTttddeabbk4Q9/eFUXyn3ooYdOfP7DH/4wbbLJJun3v/99uvDCC9O9733vKd9571zKa1/72mpD8bnPfS5tv/32ReC90ITM6oDyl73sZWm33XabtffedNNNaZdddknPfvaz00477ZRuv/329MUvfjE973nPqzYNb37zmyeuXblyZbWJ+9GPfpTe8IY3VCCW688444zqt7LPPvuk5zznOVU/nXzyybNWl156WWdlrJdeeullAHnYwx42ttdee40tX758je9Wrlw5srZ861vfOoaKuv7662ekf84444zq+e95z3umfP7kJz957C/+4i/Gdthhh7FPfOITU757xCMeMbbNNtuMrVq1amwu5V73utfY4x73uJE9b8WKFWN33XXX2FzKt7/97ao/LrzwwrH5IIcccsjYLrvsMuWzD3/4w2Prrbfe2E9+8pPW+08//fSqPj/+8Y9nsJS99NIL0tMMeumll4HkxhtvTNtss01af/01D3bWW2+qStl9992r4/z/+q//Sve///3T0qVL05577rnGMX2JZlASLKXcf8ghh6Trrruu+gwL6stf/vK08847V0e7e+yxR3r729++Bn0glwc84AFpq622mrC2IqtWraqOurE6H3nkkemkk06a+O7uu++urMd8R1l//etfpxe96EVp7733ThtvvHFl1XvSk56Uzj333Il7rr/++qpMxxxzTLEuOWWhrS6U1Xd/5zvfqf7mh/ZDrrjiivTc5z43bbfddtVx/X777VdZyqlX3tZY1d/1rndV7+Ba6iq145e//GV65jOfmbbYYovq2P11r3tdVYaLLrooPfaxj63oGfQtz4jCe3jmvvvuO3EET79/5CMfSW1y3HHHpQc96EHVvaUx9N3vfjcddNBB1XOxlmOVnkkpjXHq8bCHPWyKJb9OHvjAB1bt/8lPfnIGS9lLL71U0mP6XnrpZRB56UtfWlmc/vqv/3rspz/96djdd99de+1uu+02ttNOO43tuuuuY5/73Ocq69tznvOc6v73v//9E9ddeuml1Wef//znay2zP/zhD8e22mqrsac85Sljt99+e/XZNddcU1nPeM+//Mu/jP2///f/xt75zneOLVmyZOyFL3xha1141iabbDJhZdZae9FFF40dd9xxY9ttt93EtSeffHL13cc//vGJ/7/+9a8f+8///M/q7//6r/8ae+pTnzq20UYbTbEu/umf/mlVxtxq/YY3vGFsww03HLvhhhs61+Xmm2+urILbb7/92EMe8pDqb36wql533XVVW2+77bZjn/zkJ8e++93vjr361a+uyvyKV7xijbbm2oc//OFV+b///e9Xn9vm++67b/XuE088sSonn/Gse9/73mMf/ehHq89f9KIXVZ9/7Wtfm3g2Vu7FixdXz/nf//3fqgzHHnvs2Nve9rbGfli2bFnVbryrNIZ23nnnsfvc5z5jX/jCF8a+973vjT3zmc+s3k27R6Efu/yULOv0D9/RjvTx+uuvX7WjcsUVV0yM+ze+8Y3V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tt566+p+QmwRAi1GgLCtY2i0tkQVL3jBC6oQZrlQT/pVIQoCkS0IR0VfMy5oo8suu2ysTY455pgq9FqevKGurnXtPKgQMu6hD31oVWbCcW255ZbVc4mgUZJzzz23Ks9mm21WRVk49NBDx775zW+ucR2RPRgXeWSIXnrpZfSyiH9mEiz30ksv665wFIulDk/9XnppEizWJHDAuvysZz1rwTfWZz/72eqUAs5wb5ntpZeZld4BrJdeeumllzkX6ChwawnFFjOWLUTBcQwaDdEQeiDbSy8zLz1ntpdeeumll3khb37zmyseNU5ju+yyS1qogjWWtMKvf/3r57oovfSyTkhPM+ill1566aWXXnrpZcFKTzPopZdeeumll1566WXBSg9me+mll1566aWXXnpZsNKD2V566aWXXnrppZdeFqyscw5geMkSAobsQzORzrGXXnrppZdeeumll+kJkWNvvfXWKtJJnio6retgFiC7kL1ke+mll1566aWXXtYVufLKK1szOa5zYBaLrI1DKsJeeumll1566aWXXuaX3HLLLZXxUdzWJOscmJVaAJDtwWwvvfSytsny5cvTpz71qervv/zLv0wbbLDBXBepl1566WVo6UIJXefAbC+99NLL2s4zu/766yf+7qWXXnpZ26WPZtBLL7300ksvvfTSy4KVHsz20ksvvfTSSy+99LJgpacZ9NJLL7300ss6LNBRVqxYkVauXDnXRellHZMNNtggLV68eNrP6cFsL7300ksvvayjcvfdd6drrrkm3XHHHXNdlF7WUeeunXfeOW266abTek4PZnvppZdeeullHRSSCF166aWVZYzA9BtuuGGfTKiXWXdW/d3vfpf23nvvaVloezDbSy+99LKWWTq23HLLib976aXJKgugJZbnxhtv3DdUL7Mu2267bbrsssuqkII9mO2ll1566WWCg3b00Uf3rdFLZ2lLFdpLLzMlo9pw9yO4l1566aWXXnrppZcFKz2Y7WUkcvvt8K/6xuxldEK8/9tuG//dy+wIzuy9H1AvvcwPQfcxJ3sd2C49mO1l2nLzzSldeGFKV17ZN2Yvo5PrrkvpoovGf/cyeDpbfvh7ELn00pQuuKAHtL30Mh9kxYqU7rqLOT1ap6u//Mu/TPe4xz2qI/6zzz47rQ3Sg9lepi3Llk1aZ3vpZdTjqrcUDr5YXX311dXPoOls+zbvZSHIC1/4wgqI/dVf/dUa373yla+svuOahS5O31Geen73u99Nxx9/fPqf//mfKiTb/vvvn9YG6cFsL9MWJ5oLYS+9jEKM396Pq9mTvs17WShCBIavfOUr6c4775z47K677kpf/vKX06677prWBhHMjpJm8Jvf/CbtsMMO6fDDD0/bb799Wn/99YdOsjGfpAezvYwMzPJ7lMchvazb0m+S+jbvpZc6OeiggyrQ+vWvf33iM/4G5B544IFrgK/3ve99ac8990wbbbRROuCAA9J//ud/TnxP5rOXvOQlaY899qi+33fffdNHPvKRKc/A0vvUpz41feADH6jA4NZbb51e9apX1VJ5br755irU1BlnnDFRBo72H/SgB01cA/DmWcrf//3fp3322acKk0ZZ3/a2Y6rnowsvuuiiyuJ8IZy+IB/60IfS7rvvPnEKc/7556fHP/7xVRKCe97znul5z3teuuGGGybq8Nd//dfpiiuuqJ7FfciyZcvSa17zmrTddtulpUuXpiOOOCL94he/mHjHD3/4w+r6733ve+nggw9OS5YsSaeeemo66qijqucRPWWrrbaq3ge96fbbb08vetGL0mabbZb22muv9J3vfGfGB3IPZnuZtsQMiL0VrZdRjysMAH2WzdmRfgPRSyUHH5zSzjvP7g/vHFAATJ///Ocn/v+5z30uvfjFL17juje/+c3Vdccdd1w677zz0mtf+9r03Oc+N5188smrx/2qKgvVV7/61QoMvuUtb0lvetObqv9HOemkkyrLJr//9V//tTqu56ckW2yxRXrAAx5QAUHkl7/85cTvW265pfqb74488siJewB/PI8yAKY///lPp4997MPVd3vvvW964AMfmL74xS9Oec+XvvSl9Bd/8RcV2IQ2wPN47+mnn15RCq699tr0Z3/2Z9W1PPMd73hHVVeuFbC+4Q1vSF/72teqOp155pnpXve6V3rMYx6T/vCHP0x5F9e95z3vSRdccEG6//3vX33GPdtss036+c9/XgHbV7ziFemZz3xmZfnlWTwHQD3jGebG1jG5+eab2b5Uv3sZjVx22djY6aeP/9xwQ9+qvYxGLrhgclzdfnvfql1l2bJlY29961urH/7uKitXTrb3WWf17b0uyJ133jl2/vnnV7+nyE47Yeeb3R/e2VFe8IIXjD3lKU8Zu/7668eWLFkydumll45ddtllY0uXLq0+4zuuQW677bbq89NOO23KM17ykpeMPfvZz659xytf+cqxpz/96VPeudtuu42tWLFi4rNnPvOZY8961rNqn/G6171u7IlPfGL197HHHjv2jGc8Y+yggw4a+9a3vlV9ts8++4wdd9xxtfe/+93vGzvwwAeO3Xbb2Biv/dCHPjS25557Tnx/0UUXVXjmvPPOq/5/zDHHjD360Y+e8owrr7yyuoZrkQ9/+MNVPRTaZ4MNNhj74he/OPHZ3XffPbbjjjuOve9976v+f9JJJ1XP+MY3vjHl2UceeeTYEUccMfF/2maTTTYZe97znjfx2TXXXFPd+5Of/GSwMTggXuszgPUybekts73MxrjqExTNrEQnE9oei/gQdLpe1gbZfvsF8U4sgk94whMq6yDH7PzNZ1GwcsKlfdSjHrVG9rNIR/jkJz+ZPvOZz6TLL7+84uHyPRbOKPe9732nZKmCInDuuefWlo9j+M9+9rOV5Rcr8CMf+ciKGsHf0CQuvvjiKZZZqA/HHnts+vWvf51uu+22ipe62WabT8zPP//zP09/93d/l37605+mQw89tLLSUsb73Oc+1TVQGrAaQzHIBYsyFIbS51AZHvKQh0xJvPLgBz+4ssBGgWKQixZahLaBfnG/+91v4jOoB8h1MxyWpldVvYx0EexpBr2MSvpxNbwMk5o0p3Iwl3swu47K6aenhSLQCl796ldXf3/84x9f43uAJPKtb30r7bTTTlO+g/uJQCeAevDBD34wHXbYYdVx//vf//70s5/9bMr1gLwoHO37/JI87GEPS7feemt13A7H9J3vfGfF6f3Hf/zHCoTCUd1vv/2qawGogNW3v/3t1dE8NIV/+7evpI9+9IPV95ivAc8Pf/jDK2oBYBbO7ctf/vIpdX3Sk56U/umf/mmNskRubhS5tnkmLj7PP9tkk03WuL/UJvEzn9HUTqOQHsz2Mm3pLbO9zIT0YHY42XDDDStu23TaWzBbWLt66WVeyWMf+9jKiooAAnPBagloxekpWkGjADTheBLWK1ospyvyZj/2sY9VoI6y7Ljjjumss86qQmPF8vz4xz9Ou+22W/qHf/iHic+uuOLyib+NaPCc5zynchR79rOfXZURAKxg7YX7imNX1ygF8GPRGT/60Y8q7i2CpRbO7UJKi907gPUybelBRy8zIf0maXal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8j5xiIccckj5/ogRI9Laa6+dHnzwwdTuHHXUUWnFFVcsK9LNPvvs6Stf+Up66KGHunymU9sGTjrppLT00kvXEnGvuuqq6c9//nPt/U5um3p9ibE1duzY2mud3D7cN+2R/8w555y19zu5beCZZ55JW2+9dRo1alQaOXJkWnbZZdNdd92VOr19Ro8ePUm/4WfXXXft6HaB9957Lx1wwAGlTsO9jxkzJh166KFlZVUZsPYhm0HQHM4555xi2mmnLU499dTin//8Z7HnnnsW0003XfHEE090XJP/6U9/Kn7yk58UF154IdkziosvvrjL+0cffXQxwwwzlO8/8MADxRZbbFHMNddcxeuvv160M+utt14xbty44h//+Edx7733FhtttFHx6U9/unjzzTeLTm8buPTSS4srrriieOihh8qf/fffvxxTtFent03OHXfcUYwePbpYeumlSzkjndw+Bx98cLHEEksUzz33XO3nhRdeqL3fyW3z8ssvF/PPP3+x/fbbF7fffnsxfvz44tprry0effTRotPbhz6S95lrrrmmnLNuuOGGjm4XOPzww4tRo0YVl19+edlnzj///GL66acvjj322EIGqn1CmW0iK620UrHLLrt0eW3RRRct9t1336KTqSqzH3zwQTHnnHOWg0AmTJhQzDjjjMXJJ59cdBIIUtrnpptuKv+OtpmUmWeeufjtb38bbfMRb7zxRvGZz3ymnHTXWmutmjLb6X0HZXaZZZap+16nt80+++xTrLHGGg3f7/T2yWE8LbjggmWbdHq7bLTRRsUOO+zQ5bWvfe1rxdZbb13+PpDtE24GTeKdd94pt2zWXXfdLq/z92233das07Yk48ePT//973+7tBWJl9daa62Oa6vXXnut/H+WWWYp/4+2+Zj3338/nXPOOemtt94q3Q2ibT6E7c+NNtooffGLX+zSl6J9UnrkkUfK7U62Rb/5zW+mxx57LNompXTppZemz372s2mzzTYr3ZuWW265dOqpp0bfqTOPn3nmmWmHHXYoXQ06fUytscYa6brrrksPP/xw+fd9992Xbr311rThhhuWfw9k+wxp6tE7mBdffLGcfOeYY44ur/M3Dzv4GNujXls98cQTHdNUGK1/+MMflgJjySWXLF+LtknpgQceKJXXCRMmpOmnnz5dfPHFafHFF68Jx07uNyj3d999d7rzzjsnea/T+87KK6+czjjjjLTwwgun559/Ph1++OFptdVWK/33Or1tUOrxR0fe7L///umOO+5Ie+yxR6l4bLvtth3fPkJsx6uvvpq233778u9O7zf77LNPaXBZdNFF0zTTTFPqOEcccUTacsstB7x9QpltMqzmqgpL9bUg2gp22223dP/995cr3ehHH7PIIouke++9t5xULrzwwrTddtulm266qePH2FNPPZX23HPPdPXVV5cBpiGDurLBBhvUfl9qqaXKBdGCCy6YTj/99LTKKqt0tHwmYAfL7JFHHln+jWUWJR8FF2VWOrV95LTTTiv7Edb9nE5tl3PPPbe0VJ999tlpiSWWKOUyAae0D3J5INsn3AyaxKyzzlquXKpW2BdeeGGSVUunY4RxJ7fV7rvvXm793XDDDWneeeetvR5tk9LQoUPTQgstVE6+ROwvs8wy6bjjjuv4tsGNiTFClpQhQ4aUPyj5xx9/fPm7Y6eTx1XOdNNNVyq1uB50+riaa665yt2NnMUWWyw9+eST5e+d3j6AJfHaa69NO+64Y+21Tm+XvfbaK+27776lyw5jaZtttkk/+MEPSrk80O0TymwTJ2AmmWuuuabL6/zNVlfwMfizMQjytsJXiYm53duKFSsW2Ysuuihdf/31ZVvkdHLbTK7NJk6c2PFts84665QuGFhH/EHh32qrrcrfSZsTfedj6DP/+te/SkWu08fV6quvPkkKQPwg559//vL3Tm8fGDduXOlPjD+6dHq7vP3222nqqbuqjRjtTM01oO3T1PCyDsfUXKeddlqZmmvs2LFlaq7HH3+86DSIuL7nnnvKH7rdMcccU/5umjKiH4l4vOiii8p0HltuuWVHpDv53ve+V973jTfe2CUdzNtvv137TKe2Dey3337FzTffXKaBuf/++8vUXFNPPXVx9dVXF53eNvXIsxl0evv86Ec/KsfVY4+WjbMEAAAM8klEQVQ9Vvztb38rNt544zJlkPK3k9uGVG5DhgwpjjjiiOKRRx4pzjrrrGLkyJHFmWeeWftMJ7fP+++/X6ZIJOtDlU5ul+22266YZ555aqm5aINZZ5212HvvvQe8fUKZbTInnHBCmc9v6NChxfLLL19LudRpkKMPJbb6w+AwpQepdEjrMWzYsGLNNdcsB0K7U69N+CH3rHRq2wBpYBw/s802W7HOOuvUFNlOb5ueKLOd3D7mt8SgMPfcc5cphB588MHa+53cNnDZZZcVSy65ZHnvpIw85ZRTurzfye1z1VVXlXKY3NZVOrldXn/99VK+oOgPHz68GDNmTJk/fuLEiQPePlPxT3Ntv0EQBEEQBEHQHMJnNgiCIAiCIGhZQpkNgiAIgiAIWpZQZoMgCIIgCIKWJZTZIAiCIAiCoGUJZTYIgiAIgiBoWUKZDYIgCIIgCFqWUGaDIAiCIAiCliWU2SAIgiAIgqBlCWU2CIIgpTTVVFOlSy655BO3xYEHHph23nnnT3yctddeO40dO3bQHKcV+N3vfpdmmmmm2t+HHHJIWnbZZaf4eJdffnlabrnlarXngyAYnIQyGwRBv/DCCy+k7373u+nTn/50GjZsWJpzzjnTeuutl/7617+2zRN4/vnn03HHHZf233//fj/3jTfeWCrkr776apfXL7roonTYYYc19dyDRWHeYost0sMPP9xnx9t4443LNj377LP77JhBEPQ9Q5pwzCAIgkn4+te/nt599910+umnpzFjxpSK33XXXZdefvnltmmt0047La266qpp9OjRDT/zzjvvpKFDh/bbNc0yyyypUxgxYkT505d8+9vfTr/+9a/T1ltv3afHDYKg7wjLbBAETQdr4a233pp+9rOfpc9//vNp/vnnTyuttFLab7/90kYbbVT73DHHHJOWWmqpNN1006X55psvff/7309vvvnmJNvIbP8ussgiaeTIkekb3/hGeuutt0olGSVy5plnTrvvvnt6//33a9/jdayT3/rWt9L000+f5p577lJBmRzPPPNMaenjeKNGjUqbbrppevzxxyf7nXPOOSd9+ctfnsRqudtuu6Uf/vCHadZZZ01f+tKXytf/+c9/pg033LC8njnmmCNts8026cUXX2x47DPPPDN99rOfTTPMMENp1eZesHYD10W7AteLNXH77befxGpKe6+yyiqTHHvppZdOBx98cO3vcePGpcUWWywNHz48LbroounEE09seF2c56abbiot0pyXH9uJ13nOWOLnmmuutO+++6b33nuv4bGeeOKJtMkmm5T3QB9YYokl0p/+9KculucrrrgiLbPMMuW1rbzyyumBBx5o6GZQZfz48WmhhRZK3/ve90rXARYWe++9d5pnnnnK83E8zpPD87zjjjvSY4891vC4QRAMLKHMBkHQdFDY+MEndeLEiY0F0tRTp+OPPz794x//KJXT66+/vlQ2ct5+++3yMyiOV155Zal8fO1rXyuVHn5+//vfp1NOOSVdcMEFXb73i1/8olTa7r777lKp+8EPfpCuueaautfBOVAOueabb765VMT5ff311y8VoHq88sor5XWjcFbhXoYMGZL+8pe/pN/85jfpueeeS2uttVbpz/n3v/+9vA8s1ZtvvnnDtuG8KOT33Xdf2Y4oZiqsKP4XXnhh+ftDDz1UHh/lsspWW22Vbr/99vSf//yn9tqDDz5YKoS8B6eeemr6yU9+ko444oj0r3/9Kx155JGlHzD3UA/OgzV6p512Ks/LD9fDYgBlfcUVVyyv+aSTTiot14cffnjDe9x1113L/kGbc00sfmj3nL322iv98pe/THfeeWeaffbZS2UTi3938GxWX331tNlmm5XXQl/D6sozoS/df//95Xs840ceeaT2PRZenOeWW27p9hxBEAwQRRAEQT9wwQUXFDPPPHMxfPjwYrXVViv222+/4r777pvsd84777xi1KhRtb/HjRtXILYeffTR2mvf/e53i5EjRxZvvPFG7bX11luvfF3mn3/+Yv311+9y7C222KLYYIMNan9z3Isvvrj8/bTTTisWWWSR4oMPPqi9P3HixGLEiBHFVVddVfda77nnnvIYTz75ZJfX11prrWLZZZft8tqBBx5YrLvuul1ee+qpp8rvP/TQQ7Xv7bnnng3b5o477ig/733fcMMN5d+vvPLKJOfPj7P00ksXhx56aO1vnsOKK65Y+3u++eYrzj777C7HOOyww4pVV1214bXUu9b9999/kjY84YQTiumnn754//336x5nqaWWKg455JC673l/55xzTu21l156qXwm5557bq1/zDjjjLX3Dz744GKZZZYpbrvttmKWWWYpfvGLX9Teow9NNdVUxTPPPNPlPOuss07ZJjnLLbdcw+sKgmDgCctsEAT95jP77LPPpksvvbQM/MKiuvzyy5dbw3LDDTeU2/Bs+7Kdvu2226aXXnqpdCMQXAsWXHDB2t9s0eNGkFvweM0teMF6WP0by2M97rrrrvToo4+W16BVGd/TCRMmdLFq5vzf//1f+T/b31Wq1lqOz716bH7YzodGx7/nnntKVwcshVwX7gPw5JNPpt6ABfass84qf0eH/8Mf/lCzyv7vf/9LTz31VPrOd77T5dqwpja6rkbQtrQxrgGCZRS3kaeffrrud/bYY4/yXHwOtwespVXy58gzwd2k0XO0fb74xS+mAw44IP34xz+uvY6FnvtfeOGFu9wrrhHVe8UPF2t9EASDkwgAC4Kg30DRQ1nl56CDDko77rhjqbSwXY6/JNvSu+yyS7mdjqLC9j6KVb6NPO2003Y5JspSvdd6kk4pV7Ry+O4KK6xQU/pyZptttrrfwR9Wd4PqZ/DHrB4f31C20avgW1oFZX7dddctf/Cd5fgoaSwKGrk9NAJfW3xXUeZQwFFev/nNb9auS1cD/Edzpplmml6dB0Wx2r4fGsAbtzv9gXvCL/bqq69ORx11VPrVr35V+kBPjkbHA9oKH2lcCehLn/rUp2r3yj2xsKjeW9W1gSDFRs89CIKBJ5TZIAgGjMUXX7yW2xXfUYKDUF7wZ4Tzzjuvz871t7/9bZK/tYZWwWJ87rnnlr6SKj/dgbWYzxLYhbVvcnB8fFyxKONL2x3//ve/y+Cwo48+uvRHtb1yzJCQB77VY955501rrrlmqaijzGK1xJIN/I9VnGAnrbU9gXNXz8uz5R5zpfa2224rrcqcoxHcHwsafvBtRrHOlVmeG+ndXDiQiqvRc9SqSsAgCyUUZZRkroH8sVwzFvzPfe5zDb+vNZ7PB0EwOAk3gyAImg6uAl/4whdKqyJbxwQvnX/++ennP/95uXWuMogyS5YBlCkCuU4++eQ+uwYCfTgfys8JJ5xQnn/PPfes+1kUOSytXBuBP1wv2898vtEWOQo4iiHW5O4g0Alr35ZbblmLlEfJ2mGHHeoqoyhvKIy2Da4a1dyxuB+gNKK44S6QZ4God39YKmmDasopCg1gESWwi7YiEIvsBmSaaARKOYFlZDFA6cbqSSYKrL4ooijjf/zjH0srPFkdXKxUIevCVVddVbY3lmMCAMmqkHPooYeWKd0I6MKiz3P6yle+kiYHlnGsvSwcNthgg7JtWHDQDriykIuXcxJUhrXcDAoqz2RjqLqpBEEwiBhop90gCNqfCRMmFPvuu2+x/PLLlwE6BGwRHHTAAQcUb7/9du1zxxxzTDHXXHOVQT0EcZ1xxhldgpqqAT55kE/OdtttV2y66aZdAsB++tOfFptvvnl57jnmmKM49thju3wnDwCD5557rth2222LWWedtRg2bFgxZsyYYqeddipee+21hvd55ZVXFvPMM0+XAKdGgVwPP/xw8dWvfrWYaaaZyvtddNFFi7Fjx9YCpqrfIyhr9OjR5bUQjHXppZeW10zgmRDYNeecc5aBTbRBo/PTnhynGjgnZ511Vhm0NnTo0DJob8011ywuuuiihvdN0Noqq6xS3gfXNH78+PL1G2+8sQwu4zhc1z777FO8++67DY+z2267FQsuuGB5bbPNNluxzTbbFC+++GKXALDLLrusWGKJJcpjcux777239v1GAWDCvRJ8+LnPfa548803i3feeac46KCDynaddtppy2vkmdx///217+y8885dggmDIBh8TMU/A61QB0EQNBMsh1j9ml2lCnFKHlfOg9U16DsIGCRdGq4Fk8sl25dg4caFAZeOBRZYoF/OGQRB7wk3gyAIgj6CbX5y3E6uMEDQOuB6QMGIUGSDYHATAWBBEAR9CNWp+AlaH6qX8RMEweAm3AyCIAiCIAiCliXcDIIgCIIgCIKWJZTZIAiCIAiCoGUJZTYIgiAIgiBoWUKZDYIgCIIgCFqWUGaDIAiCIAiCliWU2SAIgiAIgqBlCWU2CIIgCIIgaFlCmQ2CIAiCIAhSq/L/hgE/NmxE7DcAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Get waveforms for one neuron with threshold=0.5\n", + "key = {'mouse_id': 100, 'session_date': '2017-05-25', 'neuron_id': 0, 'spike_param_id': 1}\n", + "waveforms = (Spikes.Waveform & key).to_arrays('waveform')\n", + "\n", + "if len(waveforms) > 0:\n", + " waveform_matrix = np.vstack(waveforms)\n", + " \n", + " plt.figure(figsize=(8, 4))\n", + " # Plot individual waveforms (light)\n", + " for wf in waveform_matrix:\n", + " plt.plot(wf, 'b-', alpha=0.2)\n", + " # Plot mean waveform (bold)\n", + " plt.plot(waveform_matrix.mean(axis=0), 'r-', linewidth=2, label='Mean waveform')\n", + " plt.axvline(40, color='k', linestyle='--', alpha=0.5, label='Spike time')\n", + " plt.xlabel('Sample (relative to spike)')\n", + " plt.ylabel('Activity')\n", + " plt.title(f'Spike Waveforms (n={len(waveforms)})')\n", + " plt.legend()\n", + "else:\n", + " print(\"No waveforms found for this key\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Pipeline Diagram" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:37.127477Z", + "iopub.status.busy": "2026-01-14T07:34:37.127356Z", + "iopub.status.idle": "2026-01-14T07:34:37.266203Z", + "shell.execute_reply": "2026-01-14T07:34:37.265702Z" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "SpikeParams\n", + "\n", + "\n", + "SpikeParams\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Spikes\n", + "\n", + "\n", + "Spikes\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "SpikeParams->Spikes\n", + "\n", + "\n", + "\n", + "\n", + "ActivityStats\n", + "\n", + "\n", + "ActivityStats\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Spikes.Waveform\n", + "\n", + "\n", + "Spikes.Waveform\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Spikes->Spikes.Waveform\n", + "\n", + "\n", + "\n", + "\n", + "Neuron\n", + "\n", + "\n", + "Neuron\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Neuron->ActivityStats\n", + "\n", + "\n", + "\n", + "\n", + "Neuron->Spikes\n", + "\n", + "\n", + "\n", + "\n", + "Mouse\n", + "\n", + "\n", + "Mouse\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Session\n", + "\n", + "\n", + "Session\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Mouse->Session\n", + "\n", + "\n", + "\n", + "\n", + "Session->Neuron\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dj.Diagram(schema)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Querying Results\n", + "\n", + "DataJoint makes it easy to query across the pipeline." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:37.268105Z", + "iopub.status.busy": "2026-01-14T07:34:37.267939Z", + "iopub.status.idle": "2026-01-14T07:34:37.277949Z", + "shell.execute_reply": "2026-01-14T07:34:37.277652Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

mouse_id

\n", + " \n", + "
\n", + "

session_date

\n", + " \n", + "
\n", + "

neuron_id

\n", + " \n", + "
\n", + "

spike_param_id

\n", + " \n", + "
\n", + "

spike_count

\n", + " total number of spikes\n", + "
02017-05-150126
02017-05-190124
1002017-05-250141
\n", + " \n", + "

Total: 3

\n", + " " + ], + "text/plain": [ + "*mouse_id *session_date *neuron_id *spike_param_i spike_count \n", + "+----------+ +------------+ +-----------+ +------------+ +------------+\n", + "0 2017-05-15 0 1 26 \n", + "0 2017-05-19 0 1 24 \n", + "100 2017-05-25 0 1 41 \n", + " (Total: 3)" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Find neurons with high spike counts (threshold=0.5)\n", + "(Spikes & 'spike_param_id = 1' & 'spike_count > 20').proj('spike_count')" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:37.279290Z", + "iopub.status.busy": "2026-01-14T07:34:37.279181Z", + "iopub.status.idle": "2026-01-14T07:34:37.288786Z", + "shell.execute_reply": "2026-01-14T07:34:37.288469Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

mouse_id

\n", + " \n", + "
\n", + "

session_date

\n", + " \n", + "
\n", + "

neuron_id

\n", + " \n", + "
\n", + "

spike_param_id

\n", + " \n", + "
\n", + "

spike_count

\n", + " total number of spikes\n", + "
02017-05-150126
02017-05-190124
52017-01-050118
1002017-05-250141
1002017-06-010118
\n", + " \n", + "

Total: 5

\n", + " " + ], + "text/plain": [ + "*mouse_id *session_date *neuron_id *spike_param_i spike_count \n", + "+----------+ +------------+ +-----------+ +------------+ +------------+\n", + "0 2017-05-15 0 1 26 \n", + "0 2017-05-19 0 1 24 \n", + "5 2017-01-05 0 1 18 \n", + "100 2017-05-25 0 1 41 \n", + "100 2017-06-01 0 1 18 \n", + " (Total: 5)" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Join with Mouse to see which mice have most spikes\n", + "(Mouse * Session * Spikes & 'spike_param_id = 1').proj('spike_count')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "This pipeline demonstrates key patterns for electrophysiology analysis:\n", + "\n", + "| Concept | Example | Purpose |\n", + "|---------|---------|--------|\n", + "| **Imported tables** | `Neuron` | Load data from files |\n", + "| **Computed tables** | `ActivityStats`, `Spikes` | Derive results |\n", + "| **Lookup tables** | `SpikeParams` | Parameterize analysis |\n", + "| **Part tables** | `Waveform` | Store variable-length results |\n", + "| **Multi-parent keys** | `Spikes` | Compute all Neuron Γ— Param combinations |\n", + "\n", + "### Key Benefits\n", + "\n", + "1. **Parameter comparison**: Different thresholds stored alongside results\n", + "2. **Automatic tracking**: `populate()` knows what's computed vs. pending\n", + "3. **Cascading**: Delete a parameter set, all derived results cascade\n", + "4. **Provenance**: Trace any spike back to its source recording" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:37.290279Z", + "iopub.status.busy": "2026-01-14T07:34:37.290166Z", + "iopub.status.idle": "2026-01-14T07:34:37.323969Z", + "shell.execute_reply": "2026-01-14T07:34:37.323662Z" + } + }, + "outputs": [], + "source": [ + "# Cleanup: drop schema for re-running\n", + "schema.drop(prompt=False)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/src/tutorials/domain/electrophysiology/ephys-with-npy.ipynb b/src/tutorials/domain/electrophysiology/ephys-with-npy.ipynb new file mode 100644 index 00000000..e984115b --- /dev/null +++ b/src/tutorials/domain/electrophysiology/ephys-with-npy.ipynb @@ -0,0 +1,2495 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "cell-0", + "metadata": {}, + "source": [ + "# Electrophysiology Pipeline with Object Storage\n", + "\n", + "This tutorial builds an electrophysiology analysis pipeline using DataJoint with the `` codec for efficient array storage. You'll learn to:\n", + "\n", + "- **Configure** object storage for neural data\n", + "- **Import** neural recordings using `` (lazy loading)\n", + "- **Compute** activity statistics\n", + "- **Detect spikes** using parameterized thresholds\n", + "- **Extract waveforms** as stacked arrays\n", + "- **Use memory mapping** for efficient random access\n", + "- **Access files directly** without database queries\n", + "\n", + "## The Pipeline\n", + "\n", + "\"Electrophysiology\n", + "\n", + "**Legend:** Green = Manual, Gray = Lookup, Blue = Imported, Red = Computed\n", + "\n", + "Each session records from neurons. We compute statistics, detect spikes with configurable thresholds, and extract spike waveforms.\n", + "\n", + "## Why `` Instead of ``?\n", + "\n", + "| Feature | `` | `` |\n", + "|---------|----------|-----------|\n", + "| **Lazy loading** | Yes - inspect shape/dtype without download | No - always downloads |\n", + "| **Memory mapping** | Yes - random access via `mmap_mode` | No |\n", + "| **Format** | Portable `.npy` files | DataJoint serialization |\n", + "| **Bulk fetch** | Safe - returns references | Downloads everything |\n", + "| **Direct access** | Yes - navigable file paths | No - hash-addressed |" + ] + }, + { + "cell_type": "markdown", + "id": "cell-1", + "metadata": {}, + "source": [ + "## Setup\n", + "\n", + "First, configure object storage for the `` codec." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "cell-2", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:42.056616Z", + "iopub.status.busy": "2026-01-14T07:34:42.056479Z", + "iopub.status.idle": "2026-01-14T07:34:42.991972Z", + "shell.execute_reply": "2026-01-14T07:34:42.991674Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2026-01-14 01:34:42,984][INFO]: DataJoint 2.0.0a22 connected to root@127.0.0.1:3306\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Store configured at: /var/folders/cn/dpwf5t7j3gd8gzyw2r7dhm8r0000gn/T/dj_ephys_2560fwod\n", + "Partitioning: {mouse_id}/{session_date}/{neuron_id}\n" + ] + } + ], + "source": [ + "import datajoint as dj\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from pathlib import Path\n", + "import tempfile\n", + "\n", + "# Create a temporary directory for object storage\n", + "STORE_PATH = tempfile.mkdtemp(prefix='dj_ephys_')\n", + "\n", + "# Configure object storage with partitioning by mouse_id, session_date, and neuron_id\n", + "dj.config.stores['ephys'] = {\n", + " 'protocol': 'file',\n", + " 'location': STORE_PATH,\n", + " 'partition_pattern': '{mouse_id}/{session_date}/{neuron_id}', # Partition by subject, session, and neuron\n", + "}\n", + "\n", + "schema = dj.Schema('tutorial_electrophysiology_npy')\n", + "\n", + "# Data directory (relative to this notebook)\n", + "DATA_DIR = Path('./data')\n", + "\n", + "print(f\"Store configured at: {STORE_PATH}\")\n", + "print(\"Partitioning: {mouse_id}/{session_date}/{neuron_id}\")" + ] + }, + { + "cell_type": "markdown", + "id": "fukj6mero1r", + "metadata": {}, + "source": [ + "### Partitioning by Subject, Session, and Neuron\n", + "\n", + "We've configured the store with `partition_pattern: '{mouse_id}/{session_date}/{neuron_id}'`. This organizes storage by the complete experimental hierarchyβ€”grouping all data for each individual neuron together at the top of the directory structure.\n", + "\n", + "**Without partitioning:**\n", + "```\n", + "{store}/{schema}/{table}/{mouse_id=X}/{session_date=Y}/{neuron_id=Z}/file.npy\n", + "```\n", + "\n", + "**With partitioning:**\n", + "```\n", + "{store}/{mouse_id=X}/{session_date=Y}/{neuron_id=Z}/{schema}/{table}/file.npy\n", + "```\n", + "\n", + "Partitioning moves the specified primary key attributes to the front of the path, making it easy to:\n", + "- **Browse by experimental hierarchy** - Navigate: subject β†’ session β†’ neuron\n", + "- **Selective sync** - Copy all data for one neuron: `rsync mouse_id=100/session_date=2017-05-25/neuron_id=0/ backup/`\n", + "- **Efficient queries** - Filesystem can quickly locate specific neurons\n", + "- **Publication-ready** - Export complete hierarchies to data repositories\n", + "\n", + "The remaining primary key attributes (like `spike_param_id` in the Spikes table) stay in their normal position after the schema/table path." + ] + }, + { + "cell_type": "markdown", + "id": "cell-3", + "metadata": {}, + "source": [ + "## Manual Tables: Experiment Metadata" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "cell-4", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:42.993738Z", + "iopub.status.busy": "2026-01-14T07:34:42.993507Z", + "iopub.status.idle": "2026-01-14T07:34:43.039321Z", + "shell.execute_reply": "2026-01-14T07:34:43.038902Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class Mouse(dj.Manual):\n", + " definition = \"\"\"\n", + " mouse_id : int32\n", + " ---\n", + " dob : date\n", + " sex : enum('M', 'F', 'unknown')\n", + " \"\"\"\n", + "\n", + "\n", + "@schema\n", + "class Session(dj.Manual):\n", + " definition = \"\"\"\n", + " -> Mouse\n", + " session_date : date\n", + " ---\n", + " experimenter : varchar(100)\n", + " \"\"\"" + ] + }, + { + "cell_type": "markdown", + "id": "cell-5", + "metadata": {}, + "source": [ + "### Insert Sample Data\n", + "\n", + "Our data files follow the naming convention `data_{mouse_id}_{session_date}.npy`." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "cell-6", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:43.041056Z", + "iopub.status.busy": "2026-01-14T07:34:43.040923Z", + "iopub.status.idle": "2026-01-14T07:34:43.057771Z", + "shell.execute_reply": "2026-01-14T07:34:43.057465Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

mouse_id

\n", + " \n", + "
\n", + "

session_date

\n", + " \n", + "
\n", + "

experimenter

\n", + " \n", + "
02017-05-15Alice
02017-05-19Alice
52017-01-05Bob
1002017-05-25Carol
1002017-06-01Carol
\n", + " \n", + "

Total: 5

\n", + " " + ], + "text/plain": [ + "*mouse_id *session_date experimenter \n", + "+----------+ +------------+ +------------+\n", + "0 2017-05-15 Alice \n", + "0 2017-05-19 Alice \n", + "5 2017-01-05 Bob \n", + "100 2017-05-25 Carol \n", + "100 2017-06-01 Carol \n", + " (Total: 5)" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Insert mice\n", + "Mouse.insert([\n", + " {'mouse_id': 0, 'dob': '2017-03-01', 'sex': 'M'},\n", + " {'mouse_id': 5, 'dob': '2016-12-25', 'sex': 'F'},\n", + " {'mouse_id': 100, 'dob': '2017-05-12', 'sex': 'F'},\n", + "], skip_duplicates=True)\n", + "\n", + "# Insert sessions (matching our data files)\n", + "Session.insert([\n", + " {'mouse_id': 0, 'session_date': '2017-05-15', 'experimenter': 'Alice'},\n", + " {'mouse_id': 0, 'session_date': '2017-05-19', 'experimenter': 'Alice'},\n", + " {'mouse_id': 5, 'session_date': '2017-01-05', 'experimenter': 'Bob'},\n", + " {'mouse_id': 100, 'session_date': '2017-05-25', 'experimenter': 'Carol'},\n", + " {'mouse_id': 100, 'session_date': '2017-06-01', 'experimenter': 'Carol'},\n", + "], skip_duplicates=True)\n", + "\n", + "Session()" + ] + }, + { + "cell_type": "markdown", + "id": "cell-7", + "metadata": {}, + "source": [ + "## Imported Table: Neuron Activity with ``\n", + "\n", + "Each data file contains recordings from one or more neurons. We import each neuron's activity trace using `` for schema-addressed object storage." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "cell-8", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:43.059584Z", + "iopub.status.busy": "2026-01-14T07:34:43.059433Z", + "iopub.status.idle": "2026-01-14T07:34:43.077732Z", + "shell.execute_reply": "2026-01-14T07:34:43.077380Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class Neuron(dj.Imported):\n", + " definition = \"\"\"\n", + " -> Session\n", + " neuron_id : int16\n", + " ---\n", + " activity : # neural activity trace (lazy loading)\n", + " \"\"\"\n", + "\n", + " def make(self, key):\n", + " # Construct filename from key\n", + " filename = f\"data_{key['mouse_id']}_{key['session_date']}.npy\"\n", + " filepath = DATA_DIR / filename\n", + " \n", + " # Load data (shape: n_neurons x n_timepoints)\n", + " data = np.load(filepath)\n", + " \n", + " # Insert one row per neuron\n", + " for neuron_id, activity in enumerate(data):\n", + " self.insert1({\n", + " **key,\n", + " 'neuron_id': neuron_id,\n", + " 'activity': activity\n", + " })\n", + " \n", + " print(f\"Imported {len(data)} neuron(s) from {filename}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "cell-9", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:43.079358Z", + "iopub.status.busy": "2026-01-14T07:34:43.079262Z", + "iopub.status.idle": "2026-01-14T07:34:43.141576Z", + "shell.execute_reply": "2026-01-14T07:34:43.141223Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + "Neuron: 0%| | 0/5 [00:00\n", + " .Table{\n", + " border-collapse:collapse;\n", + " }\n", + " .Table th{\n", + " background: #A0A0A0; color: #ffffff; padding:2px 4px; border:#f0e0e0 1px solid;\n", + " font-weight: normal; font-family: monospace; font-size: 75%; text-align: center;\n", + " }\n", + " .Table th p{\n", + " margin: 0;\n", + " }\n", + " .Table td{\n", + " padding:2px 4px; border:#f0e0e0 1px solid; font-size: 75%;\n", + " }\n", + " .Table tr:nth-child(odd){\n", + " background: #ffffff;\n", + " color: #000000;\n", + " }\n", + " .Table tr:nth-child(even){\n", + " background: #f3f1ff;\n", + " color: #000000;\n", + " }\n", + " /* Tooltip container */\n", + " .djtooltip {\n", + " }\n", + " /* Tooltip text */\n", + " .djtooltip .djtooltiptext {\n", + " visibility: hidden;\n", + " width: 120px;\n", + " background-color: black;\n", + " color: #fff;\n", + " text-align: center;\n", + " padding: 5px 0;\n", + " border-radius: 6px;\n", + " /* Position the tooltip text - see examples below! */\n", + " position: absolute;\n", + " z-index: 1;\n", + " }\n", + " #primary {\n", + " font-weight: bold;\n", + " color: black;\n", + " }\n", + " #nonprimary {\n", + " font-weight: normal;\n", + " color: white;\n", + " }\n", + "\n", + " /* Show the tooltip text when you mouse over the tooltip container */\n", + " .djtooltip:hover .djtooltiptext {\n", + " visibility: visible;\n", + " }\n", + "\n", + " /* Dark mode support */\n", + " @media (prefers-color-scheme: dark) {\n", + " .Table th{\n", + " background: #4a4a4a; color: #ffffff; border:#555555 1px solid; text-align: center;\n", + " }\n", + " .Table td{\n", + " border:#555555 1px solid;\n", + " }\n", + " .Table tr:nth-child(odd){\n", + " background: #2d2d2d;\n", + " color: #e0e0e0;\n", + " }\n", + " .Table tr:nth-child(even){\n", + " background: #3d3d3d;\n", + " color: #e0e0e0;\n", + " }\n", + " .djtooltip .djtooltiptext {\n", + " background-color: #555555;\n", + " color: #ffffff;\n", + " }\n", + " #primary {\n", + " color: #bd93f9;\n", + " }\n", + " #nonprimary {\n", + " color: #e0e0e0;\n", + " }\n", + " }\n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

mouse_id

\n", + " \n", + "
\n", + "

session_date

\n", + " \n", + "
\n", + "

neuron_id

\n", + " \n", + "
\n", + "

activity

\n", + " neural activity trace (lazy loading)\n", + "
02017-05-150<npy>
02017-05-190<npy>
52017-01-050<npy>
1002017-05-250<npy>
1002017-06-010<npy>
\n", + " \n", + "

Total: 5

\n", + " " + ], + "text/plain": [ + "*mouse_id *session_date *neuron_id activity \n", + "+----------+ +------------+ +-----------+ +-------+\n", + "0 2017-05-15 0 \n", + "0 2017-05-19 0 \n", + "5 2017-01-05 0 \n", + "100 2017-05-25 0 \n", + "100 2017-06-01 0 \n", + " (Total: 5)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Neuron()" + ] + }, + { + "cell_type": "markdown", + "id": "cell-lazy", + "metadata": {}, + "source": [ + "### Lazy Loading with NpyRef\n", + "\n", + "When fetching `` attributes, you get an `NpyRef` that provides metadata without downloading the array." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "cell-lazy-demo", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:43.149712Z", + "iopub.status.busy": "2026-01-14T07:34:43.149589Z", + "iopub.status.idle": "2026-01-14T07:34:43.153125Z", + "shell.execute_reply": "2026-01-14T07:34:43.152818Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Type: NpyRef\n", + "Shape: (1000,) (no download!)\n", + "Dtype: float64\n", + "Is loaded: False\n" + ] + } + ], + "source": [ + "# Fetch returns NpyRef, not the array\n", + "key = {'mouse_id': 0, 'session_date': '2017-05-15', 'neuron_id': 0}\n", + "ref = (Neuron & key).fetch1('activity')\n", + "\n", + "print(f\"Type: {type(ref).__name__}\")\n", + "print(f\"Shape: {ref.shape} (no download!)\")\n", + "print(f\"Dtype: {ref.dtype}\")\n", + "print(f\"Is loaded: {ref.is_loaded}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "cell-load", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:43.154777Z", + "iopub.status.busy": "2026-01-14T07:34:43.154641Z", + "iopub.status.idle": "2026-01-14T07:34:43.157053Z", + "shell.execute_reply": "2026-01-14T07:34:43.156794Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loaded: (1000,), is_loaded: True\n" + ] + } + ], + "source": [ + "# Explicitly load when ready\n", + "activity = ref.load()\n", + "print(f\"Loaded: {activity.shape}, is_loaded: {ref.is_loaded}\")" + ] + }, + { + "cell_type": "markdown", + "id": "uxt0sp9urx", + "metadata": {}, + "source": [ + "### Memory Mapping for Large Arrays\n", + "\n", + "For very large arrays, use `mmap_mode` to access data without loading it all into memory. This is especially efficient for local filesystem stores." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "1lxvmzs7fegh", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:43.158359Z", + "iopub.status.busy": "2026-01-14T07:34:43.158274Z", + "iopub.status.idle": "2026-01-14T07:34:43.168232Z", + "shell.execute_reply": "2026-01-14T07:34:43.167927Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Type: memmap\n", + "Shape: (1000,)\n", + "Slice [100:200]: [-0.09536487 0.00759549 -0.14405436 -0.08785159 -0.14242823]...\n" + ] + } + ], + "source": [ + "# Memory-mapped loading - efficient for large arrays\n", + "key = {'mouse_id': 0, 'session_date': '2017-05-15', 'neuron_id': 0}\n", + "ref = (Neuron & key).fetch1('activity')\n", + "\n", + "# Load as memory-mapped array (read-only)\n", + "mmap_arr = ref.load(mmap_mode='r')\n", + "\n", + "print(f\"Type: {type(mmap_arr).__name__}\")\n", + "print(f\"Shape: {mmap_arr.shape}\")\n", + "\n", + "# Random access only reads the needed portion from disk\n", + "slice_data = mmap_arr[100:200]\n", + "print(f\"Slice [100:200]: {slice_data[:5]}...\")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-11", + "metadata": {}, + "source": [ + "### Visualize Neural Activity\n", + "\n", + "NpyRef works transparently with NumPy functions via `__array__`." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "cell-12", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:43.169614Z", + "iopub.status.busy": "2026-01-14T07:34:43.169499Z", + "iopub.status.idle": "2026-01-14T07:34:43.455788Z", + "shell.execute_reply": "2026-01-14T07:34:43.455512Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "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AAAAAAAAAADIGBCjAAAAAAAAAAAAAEDGgBgFAAAAAAAAAAAAADIGxCgAAAAAAAAAAAAAkDEgRgEAAAAAAAAAAACAjAExCgAAAAAAAAAAAABkDIhRAAAAAAAAAAAAACBjQIwCSkaPHk15eXnGZ+LEiSm/JxIJOuigg4zfTzzxxNifxZEjR9L5559PnTp1cj2mjRs30hVXXEEtWrSgevXqUb9+/ejLL79UrvvFF18Yv/N6vD5vx9v7ZdSoUXTeeedRx44dqW7dusY1uOaaa2jdunXK9d966y3q1asXFRQUULt27eimm26inTt3WtbZsWMH3XbbbTRo0CBq2bKlcfz33nuvsjzznlB9unbtqn0cOvXi+85uX99++23g54vXUe1r6NCh2scFQK6DtgFtQ7bbBpOvv/6azjzzTGratKnxfu/SpQs98MAD2vv65ZdfjHa/SZMm1KBBAzr11FNp9uzZKeu98sordPHFF9MhhxxCNWrUMNoKAAAAAKQPxCjgSMOGDemFF15IWT5p0iT6+eefjd9zgWeffZZWrFhBJ510kiHI2FFcXEwnn3yyIT7961//ovfff59at25Np59+unFORPj7GWecYfzO6/H6LE7x9lyOH+655x6j0/zQQw/Rp59+aohIH330EfXp04c2bNhgWff111+n3/72t3TkkUfSJ598YmzLA0nufIts2bKFnnvuOaNOLNw4MW3atJQPC3nMr3/9a61j0K2XCR+rvM8ePXoEfr6Y4447LmVft99+u9a+AKhOoG2wgrYhs23DG2+8QQMGDKDGjRsbYtG4ceOMdzVPlOmwadMm6t+/Py1ZsoRefPFF+u9//0t79+41JqIWL15sWffVV1+lH374gY466ig68MADtcoHAAAAgAYJABS89NJL3KNLXH311Ym6desmCgsLLb9feumliX79+iW6d++eGDBgQOzPYXl5efJvp2N66qmnjPMyderU5LLS0tLEoYcemjjqqKMs6x555JHGcv7d5JtvvjG2f/rpp33Vc8OGDSnLZsyYYZT5wAMPJJeVlZUl2rZtmxg0aJBl3ddff91Yd9y4ccll+/btMz7Mpk2bjN/vuece7TpdccUViby8vMRPP/3kuq6Xek2YMMFY9vbbbyf8onu+mAMOOCBx1lln+d4XANUBtA1oG7LdNqxevTpRv379xDXXXJPwy6233prIz89PLF++PLmM+zktWrRI/OY3v7HtH3AbwW0FAAAAANIHllHAEZ6lZN58883kssLCQho7dixdeeWVym22bt1K1157Le23335Uu3Zt6ty5M911110Wa6Dly5cb5vs86ykju4nxDOb//d//Ufv27alOnTqG5RJbsLCVkYhpddSoUSPDLY7XsXOfk2HTex3effddw1SfXe9MatWqRZdeeilNnz6d1qxZYyzj/2fMmEGXXXaZ8bvJscceSwcffLBRjh9atWqVsoytfGrWrEmrVq1KLmM3NnZF+/3vf29Z96KLLjIshcT9m64UfmAXv7ffftuYoWYXODe81CsIdM8XAMAbaBusoG3IXNvA7te7du1Ky2qVy2NL6AMOOCC5jPsObIX14YcfUllZmef+AQAAAAC8gRYWOMKdswsvvNAwYzdhYYo7Z4MHD05Zn83cBw4caJjNDxs2jD7++GNDqPnHP/5h64blBgs67733Ht199930+eefGx3RU045xXAvM3nttdeMmEdc35dfftkwuW/WrBmddtpp2oKUDgsWLKDDDjssZbm5jE35zfXE5fK65u9BwO6A5eXl1L17d0s9VfvPz8834ncEtX+O78GDgquvvlprfT/1uu666wxBj68tX0+OExL0+TKZPHmy4X7E9Tn00EPpn//8p7EuAMAK2obUdxvahsy0Dfye5vZ90aJFRnwpbh944oHj+xUVFbnua8+ePUaYAbvrxb9zPCkAAAAAhEuVyQYANrAFFAtMLLTwAJ6FKZ6tVMWLYiHo+++/N8QgXofhoKA8s8mzmOPHjze+e+Gbb74xOrR/+MMfkst+9atfJf/evXs33XjjjXT22WdbZk85sOkRRxxBd955J3333XeBXF8WwLgTLGMuMwUy83+7dUUhLR149pmt0NhqTLRUc9s/W6YFAccT4+CvF1xwgdb6XurFsUD4unIMj+bNm9PSpUvpkUceMb6zyMnCVFDniznrrLOob9++RkyQbdu2GbP6t9xyC82dO9eIGQIAsIK2wfpuQ9uQmbaBLY+53ec+xvDhw43YVGyJzDGmWLSaMmWKo7Uvv985tpTO9QIAAABAeMAyCrjCZvY8QGcRav78+Uanz85F76uvvqL69esb1lQinEWO8WOlxEFD2Z3vb3/7m2HKX1paavl96tSphmvg5ZdfbpjWm599+/YZgcW5vjxDGxROnVz5N7t1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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, axes = plt.subplots(2, 3, figsize=(12, 6))\n", + "\n", + "for ax, key in zip(axes.ravel(), Neuron.keys()):\n", + " # fetch1 returns NpyRef, but plotting works via __array__\n", + " activity = (Neuron & key).fetch1('activity')\n", + " ax.plot(np.asarray(activity)) # Convert to array for plotting\n", + " ax.set_title(f\"Mouse {key['mouse_id']}, {key['session_date']}\")\n", + " ax.set_xlabel('Time bin')\n", + " ax.set_ylabel('Activity')\n", + "\n", + "# Hide unused subplot\n", + "axes[1, 2].axis('off')\n", + "plt.tight_layout()" + ] + }, + { + "cell_type": "markdown", + "id": "cell-13", + "metadata": {}, + "source": [ + "## Computed Table: Activity Statistics\n", + "\n", + "For each neuron, compute basic statistics of the activity trace. NumPy functions work directly with NpyRef." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "cell-14", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:43.457287Z", + "iopub.status.busy": "2026-01-14T07:34:43.457173Z", + "iopub.status.idle": "2026-01-14T07:34:43.492362Z", + "shell.execute_reply": "2026-01-14T07:34:43.492050Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class ActivityStats(dj.Computed):\n", + " definition = \"\"\"\n", + " -> Neuron\n", + " ---\n", + " mean_activity : float32\n", + " std_activity : float32\n", + " max_activity : float32\n", + " \"\"\"\n", + "\n", + " def make(self, key):\n", + " # fetch1 returns NpyRef, but np.mean/std/max work via __array__\n", + " activity = (Neuron & key).fetch1('activity')\n", + " \n", + " self.insert1({\n", + " **key,\n", + " 'mean_activity': np.mean(activity), # Auto-loads via __array__\n", + " 'std_activity': np.std(activity),\n", + " 'max_activity': np.max(activity)\n", + " })" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "cell-15", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:43.493866Z", + "iopub.status.busy": "2026-01-14T07:34:43.493758Z", + "iopub.status.idle": "2026-01-14T07:34:43.536596Z", + "shell.execute_reply": "2026-01-14T07:34:43.536291Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + "ActivityStats: 0%| | 0/5 [00:00\n", + " .Table{\n", + " border-collapse:collapse;\n", + " }\n", + " .Table th{\n", + " background: #A0A0A0; color: #ffffff; padding:2px 4px; border:#f0e0e0 1px solid;\n", + " font-weight: normal; font-family: monospace; font-size: 75%; text-align: center;\n", + " }\n", + " .Table th p{\n", + " margin: 0;\n", + " }\n", + " .Table td{\n", + " padding:2px 4px; border:#f0e0e0 1px solid; font-size: 75%;\n", + " }\n", + " .Table tr:nth-child(odd){\n", + " background: #ffffff;\n", + " color: #000000;\n", + " }\n", + " .Table tr:nth-child(even){\n", + " background: #f3f1ff;\n", + " color: #000000;\n", + " }\n", + " /* Tooltip container */\n", + " .djtooltip {\n", + " }\n", + " /* Tooltip text */\n", + " .djtooltip .djtooltiptext {\n", + " visibility: hidden;\n", + " width: 120px;\n", + " background-color: black;\n", + " color: #fff;\n", + " text-align: center;\n", + " padding: 5px 0;\n", + " border-radius: 6px;\n", + " /* Position the tooltip text - see examples below! */\n", + " position: absolute;\n", + " z-index: 1;\n", + " }\n", + " #primary {\n", + " font-weight: bold;\n", + " color: black;\n", + " }\n", + " #nonprimary {\n", + " font-weight: normal;\n", + " color: white;\n", + " }\n", + "\n", + " /* Show the tooltip text when you mouse over the tooltip container */\n", + " .djtooltip:hover .djtooltiptext {\n", + " visibility: visible;\n", + " }\n", + "\n", + " /* Dark mode support */\n", + " @media (prefers-color-scheme: dark) {\n", + " .Table th{\n", + " background: #4a4a4a; color: #ffffff; border:#555555 1px solid; text-align: center;\n", + " }\n", + " .Table td{\n", + " border:#555555 1px solid;\n", + " }\n", + " .Table tr:nth-child(odd){\n", + " background: #2d2d2d;\n", + " color: #e0e0e0;\n", + " }\n", + " .Table tr:nth-child(even){\n", + " background: #3d3d3d;\n", + " color: #e0e0e0;\n", + " }\n", + " .djtooltip .djtooltiptext {\n", + " background-color: #555555;\n", + " color: #ffffff;\n", + " }\n", + " #primary {\n", + " color: #bd93f9;\n", + " }\n", + " #nonprimary {\n", + " color: #e0e0e0;\n", + " }\n", + " }\n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

mouse_id

\n", + " \n", + "
\n", + "

session_date

\n", + " \n", + "
\n", + "

neuron_id

\n", + " \n", + "
\n", + "

mean_activity

\n", + " \n", + "
\n", + "

std_activity

\n", + " \n", + "
\n", + "

max_activity

\n", + " \n", + "
02017-05-1500.2073570.4008672.48161
02017-05-1900.132740.2914621.82805
52017-01-0500.08917860.2364121.37389
1002017-05-2500.219070.3287831.76383
1002017-06-0100.08732660.2378581.32454
\n", + " \n", + "

Total: 5

\n", + " " + ], + "text/plain": [ + "*mouse_id *session_date *neuron_id mean_activity std_activity max_activity \n", + "+----------+ +------------+ +-----------+ +------------+ +------------+ +------------+\n", + "0 2017-05-15 0 0.207357 0.400867 2.48161 \n", + "0 2017-05-19 0 0.13274 0.291462 1.82805 \n", + "5 2017-01-05 0 0.0891786 0.236412 1.37389 \n", + "100 2017-05-25 0 0.21907 0.328783 1.76383 \n", + "100 2017-06-01 0 0.0873266 0.237858 1.32454 \n", + " (Total: 5)" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ActivityStats.populate(display_progress=True)\n", + "ActivityStats()" + ] + }, + { + "cell_type": "markdown", + "id": "cell-16", + "metadata": {}, + "source": [ + "## Lookup Table: Spike Detection Parameters\n", + "\n", + "Spike detection depends on threshold choice. Using a Lookup table, we can run detection with multiple thresholds and compare results." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "cell-17", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:43.538357Z", + "iopub.status.busy": "2026-01-14T07:34:43.538223Z", + "iopub.status.idle": "2026-01-14T07:34:43.567296Z", + "shell.execute_reply": "2026-01-14T07:34:43.567001Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "
\n", + "

spike_param_id

\n", + " \n", + "
\n", + "

threshold

\n", + " spike detection threshold\n", + "
10.5
20.9
\n", + " \n", + "

Total: 2

\n", + " " + ], + "text/plain": [ + "*spike_param_i threshold \n", + "+------------+ +-----------+\n", + "1 0.5 \n", + "2 0.9 \n", + " (Total: 2)" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "@schema\n", + "class SpikeParams(dj.Lookup):\n", + " definition = \"\"\"\n", + " spike_param_id : int16\n", + " ---\n", + " threshold : float32 # spike detection threshold\n", + " \"\"\"\n", + " \n", + " contents = [\n", + " {'spike_param_id': 1, 'threshold': 0.5},\n", + " {'spike_param_id': 2, 'threshold': 0.9},\n", + " ]\n", + "\n", + "SpikeParams()" + ] + }, + { + "cell_type": "markdown", + "id": "cell-18", + "metadata": {}, + "source": [ + "## Computed Table: Spike Detection\n", + "\n", + "Detect spikes by finding threshold crossings. Store spike times and all waveforms as `` arrays." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "cell-19", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:43.568792Z", + "iopub.status.busy": "2026-01-14T07:34:43.568690Z", + "iopub.status.idle": "2026-01-14T07:34:43.593026Z", + "shell.execute_reply": "2026-01-14T07:34:43.592573Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class Spikes(dj.Computed):\n", + " definition = \"\"\"\n", + " -> Neuron\n", + " -> SpikeParams\n", + " ---\n", + " spike_times : # indices of detected spikes\n", + " spike_count : uint32 # total number of spikes\n", + " waveforms : # all waveforms stacked (n_spikes x window_size)\n", + " \"\"\"\n", + "\n", + " def make(self, key):\n", + " # Fetch inputs - activity is NpyRef\n", + " activity_ref = (Neuron & key).fetch1('activity')\n", + " threshold = (SpikeParams & key).fetch1('threshold')\n", + " \n", + " # Load activity for processing\n", + " activity = activity_ref.load()\n", + " \n", + " # Detect threshold crossings (rising edge)\n", + " above_threshold = (activity > threshold).astype(int)\n", + " rising_edge = np.diff(above_threshold) > 0\n", + " spike_times = np.where(rising_edge)[0] + 1 # +1 to get crossing point\n", + " \n", + " # Extract waveforms for all spikes\n", + " window = 40 # samples before and after spike\n", + " waveforms = []\n", + " for t in spike_times:\n", + " # Skip spikes too close to edges\n", + " if t < window or t >= len(activity) - window:\n", + " continue\n", + " waveforms.append(activity[t - window : t + window])\n", + " \n", + " # Stack into 2D array (n_spikes x window_size)\n", + " waveforms = np.vstack(waveforms) if waveforms else np.empty((0, 2 * window))\n", + " \n", + " # Insert entry with all data\n", + " self.insert1({\n", + " **key,\n", + " 'spike_times': spike_times,\n", + " 'spike_count': len(spike_times),\n", + " 'waveforms': waveforms, # All waveforms as single array\n", + " })" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "cell-20", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:43.594724Z", + "iopub.status.busy": "2026-01-14T07:34:43.594602Z", + "iopub.status.idle": "2026-01-14T07:34:43.682006Z", + "shell.execute_reply": "2026-01-14T07:34:43.681714Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + "Spikes: 0%| | 0/10 [00:00\n", + " .Table{\n", + " border-collapse:collapse;\n", + " }\n", + " .Table th{\n", + " background: #A0A0A0; color: #ffffff; padding:2px 4px; border:#f0e0e0 1px solid;\n", + " font-weight: normal; font-family: monospace; font-size: 75%; text-align: center;\n", + " }\n", + " .Table th p{\n", + " margin: 0;\n", + " }\n", + " .Table td{\n", + " padding:2px 4px; border:#f0e0e0 1px solid; font-size: 75%;\n", + " }\n", + " .Table tr:nth-child(odd){\n", + " background: #ffffff;\n", + " color: #000000;\n", + " }\n", + " .Table tr:nth-child(even){\n", + " background: #f3f1ff;\n", + " color: #000000;\n", + " }\n", + " /* Tooltip container */\n", + " .djtooltip {\n", + " }\n", + " /* Tooltip text */\n", + " .djtooltip .djtooltiptext {\n", + " visibility: hidden;\n", + " width: 120px;\n", + " background-color: black;\n", + " color: #fff;\n", + " text-align: center;\n", + " padding: 5px 0;\n", + " border-radius: 6px;\n", + " /* Position the tooltip text - see examples below! */\n", + " position: absolute;\n", + " z-index: 1;\n", + " }\n", + " #primary {\n", + " font-weight: bold;\n", + " color: black;\n", + " }\n", + " #nonprimary {\n", + " font-weight: normal;\n", + " color: white;\n", + " }\n", + "\n", + " /* Show the tooltip text when you mouse over the tooltip container */\n", + " .djtooltip:hover .djtooltiptext {\n", + " visibility: visible;\n", + " }\n", + "\n", + " /* Dark mode support */\n", + " @media (prefers-color-scheme: dark) {\n", + " .Table th{\n", + " background: #4a4a4a; color: #ffffff; border:#555555 1px solid; text-align: center;\n", + " }\n", + " .Table td{\n", + " border:#555555 1px solid;\n", + " }\n", + " .Table tr:nth-child(odd){\n", + " background: #2d2d2d;\n", + " color: #e0e0e0;\n", + " }\n", + " .Table tr:nth-child(even){\n", + " background: #3d3d3d;\n", + " color: #e0e0e0;\n", + " }\n", + " .djtooltip .djtooltiptext {\n", + " background-color: #555555;\n", + " color: #ffffff;\n", + " }\n", + " #primary {\n", + " color: #bd93f9;\n", + " }\n", + " #nonprimary {\n", + " color: #e0e0e0;\n", + " }\n", + " }\n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

mouse_id

\n", + " \n", + "
\n", + "

session_date

\n", + " \n", + "
\n", + "

neuron_id

\n", + " \n", + "
\n", + "

spike_param_id

\n", + " \n", + "
\n", + "

spike_count

\n", + " total number of spikes\n", + "
02017-05-150126
02017-05-150227
02017-05-190124
02017-05-190221
52017-01-050118
52017-01-050214
1002017-05-250141
1002017-05-250235
1002017-06-010118
1002017-06-010215
\n", + " \n", + "

Total: 10

\n", + " " + ], + "text/plain": [ + "*mouse_id *session_date *neuron_id *spike_param_i spike_count \n", + "+----------+ +------------+ +-----------+ +------------+ +------------+\n", + "0 2017-05-15 0 1 26 \n", + "0 2017-05-15 0 2 27 \n", + "0 2017-05-19 0 1 24 \n", + "0 2017-05-19 0 2 21 \n", + "5 2017-01-05 0 1 18 \n", + "5 2017-01-05 0 2 14 \n", + "100 2017-05-25 0 1 41 \n", + "100 2017-05-25 0 2 35 \n", + "100 2017-06-01 0 1 18 \n", + "100 2017-06-01 0 2 15 \n", + " (Total: 10)" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# View spike counts for each neuron x parameter combination\n", + "Spikes.proj('spike_count')" + ] + }, + { + "cell_type": "markdown", + "id": "cell-22", + "metadata": {}, + "source": [ + "### Compare Detection Thresholds" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "cell-23", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:43.689817Z", + "iopub.status.busy": "2026-01-14T07:34:43.689697Z", + "iopub.status.idle": "2026-01-14T07:34:43.862179Z", + "shell.execute_reply": "2026-01-14T07:34:43.861815Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAAJOCAYAAABm7rQwAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzsnQe4FNX5xj96B1FBQFFREUVFEYxdbAFBjb1h7GKPBVtsUWyosWBiiw1jw66xYI+9izVK0z8KIooVBOns/3ln+e799tyZ2Zmts7vv73kW7t07OzvlzDnfec9XGqVSqZQQQgghhBBCCCGEEFJCGpfyywghhBBCCCGEEEIIARSlCCGEEEIIIYQQQkjJoShFCCGEEEIIIYQQQkoORSlCCCGEEEIIIYQQUnIoShFCCCGEEEIIIYSQkkNRihBCCCGEEEIIIYSUHIpShBBCCCGEEEIIIaTkUJQihBBCCCGEEEIIISWHohQhhBBCCCGEEEIIKTkUpQghhJAy0ahRo0ivl19+2Xvh54ceeigR96sYx3PBBRd4+4zC6quvLoceemhBvnfOnDly8sknS7du3aRly5ay0UYbyX333Rfps3fccUfgffvuu+9yOp7Zs2fLJZdcIttuu6106dJF2rZtKxtssIFcfvnlMn/+fN/P/O9//5N99tlHOnXqJC1atPCuz3HHHSelBueN++hen/fff1+SiHu8Ufn222+9z3300UdFOa5SfI/em6+++qrg+yaEEEKi0jTyloQQQggpKG+99VbG7xdddJG89NJL8t///jfj/d69e8sHH3zAq18k9txzT3nvvffksssuk7XXXlvuvfdeOeCAA2Tp0qUydOjQSPsYPXq0rLPOOhnvrbDCCjkdz9SpU2XUqFFy0EEHyfDhwz1R6rXXXvPEieeff957WfEObWbnnXeWrbfeWm666SZZccUVvX18+OGHUo42vcoqq0i1A7FoxIgRnvgHEbPSv4cQQggpFxSlCCGEkDKx2WabZfwOL5fGjRs3eL8Q/P7779K6deuC77fSGTt2rCfyqBAFtttuO/n666/l9NNPl/3220+aNGmSdT/rr7++9O/fvyDH1KNHD897pU2bNnXvbb/99t7vOKY33nhDttpqq7r7euCBB3p/f+KJJzLEKohapaYYbZcQQggh1QvD9wghhJAKYtGiRXLOOed4oWbt27eXHXfc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lCKEEEIIIYQQQmoHilIkMTmlKEoRQgghhBBCCCG1A0UpUlasEMVE54QQQgghhBBCsvHVV19Jo0aN5KOPPirpxXr55Ze97/3111/z2g/28dhjjyXu/MoBRSlSVphTihBCCCGEEEKIAjEm7HXooYfyYkXglVdekX79+knLli1ljTXWkJtuuinrZ/yud5TP5UPTou6dkCxQlCKEEEIIIYQQosyYMaPu5/vvv1/+9re/ycSJE+vea9Wqlfzyyy+xL9iSJUs8kaVx4+r3zZkyZYoMGTJEhg0bJnfffbe88cYbctxxx0mnTp1kr732Cv3s6NGjZaeddqr7vUOHDkU91uq/GyTRUJQihBBCCCGEEKJ06dKl7gVBBEKS+57yf//3f7LddttJ69atZcMNN5S33nqr7m933HGHLLfccvLkk09K7969pUWLFvL111/LwoUL5YwzzpCVV15Z2rRpI5tuuqkXlqdgm1133VU6duzo/X299daTsWPHZtygcePGSf/+/b3v3WKLLTJEM3DjjTfKmmuuKc2bN5devXrJXXfdFXqD3333Xenbt6/n1YT9fvjhh3k1CHg3rbrqqjJq1ChZd9115cgjj5TDDz9crrzyyqyfxTWz1xsiYDGhKEXKCqvvEVI9vPGGyLHHIga+3EdCCCGEEEJCmTs3+DV/fvRt582Ltm2ROOecc+S0007zci+tvfbacsABB8hiM8n8/fffZeTIkXLrrbfKZ599Jp07d5bDDjvM8xy677775JNPPpF99tnH8wyaPHmy95njjz9eFixYIK+++qp8+umncvnll0vbtm0bfO9VV10l77//vjRt2tQTfJRHH31UTjrpJDn11FPlf//7nxx99NHed7700ku+5zB37lzZZZddPPEKYtcFF1zgnZMLjiHsNXjw4LptIc4NHDgw4/ODBg3yjndRlmTOJ5xwgqy44oqyySabeOLWUludrAgwfI8kxlOKic4JqWwuuyz9/+WXY3Wo3EdDCCGEEEICcUSWDIYMEXnqqfrfO3eGuuO/7YAByP5d//vqq4v8+GPD7VKpotwMiDc777yz9/OIESM8r6YvvvhC1llnHe89CDA33HCD50UFvvzySxkzZox888030q1bt7p9PPPMM17Y2qWXXipTp071Qtw22GAD7+/Ix+RyySWXyACcu4j89a9/9Y5h/vz5nqcTvJGQ9wrhcmD48OHy9ttve+/Dq8vlnnvu8UILb7/9ds/zCueA4zsWq72GbEnPrUfTd999JyuttFLG3/E7BLsff/xRunbt6ruPiy66SHbYYQdvXy+++KInrGH7c889V4oFRSlSVhi+R0j1MXt2uY+AEEIIIYTUAn369Kn7WYWWmTNn1olSCJ+z23zwwQeSSqU8ryoLPKNWWGEF7+cTTzzRE4See+452XHHHT2Byu4j7HsRMjd+/Hg56qijMrbfcsst5dprr/U9h/Hjx3uiGQQpZfPNN2+w3VprrSVxQNijBeft977Fik8bbbSR9/+FF15IUYpULxSlCKnu55oQQgghhCSQOXOC/9akSebvM2cGb+smDS9xHodmzZrV/axiiw03g8ePFWHwtyZNmnhhcvjfoiF6yL+EULennnrKE6YQ/odQvb/85S+Rv9dPEAoSg1IRvcjcEEKXrbfeWp5++mnvZ+SCgreUBaIZQg1VfIvCZpttJrNnz5bvv/++gedVzXlKoSE88sgjMmHCBK9hIZkYYjsRd5mtDCLc5RA/Cvc8JDQ75phjSnbcJByKUoRUHwzFJYQQQghJOG3alH/bMoBk4giVg0ADESeI7t27e7oBXmeddZbccsstGaJUGEgs/vrrr8vBBx9c996bb77pve9H7969vUTo8+bNqwvBQ7ifS5zwPXhaPfHEExl/h8CGJOpWUMsGEq4jJBHJz4tFxYhSEJeQcAzJthAHicRiSNz1+eefexnxC10GkRQfCMLMKUVI9UFRihBCCCGEJBGE7R144IGeYATvJ4hUyJn03//+18shBf3g5JNP9pKGY9tffvnF+1uQoOTH6aefLvvuu69svPHGXn4miENwsHnhhRd8tx86dKinbxxxxBFemNxXX33lWyUvTvgexLTrrrvOc9CBHoLE57fddpuXT8smZIfgBscfgOOEdxUELQhcSMyO40IoIioXSq2LUkg8ZkESMmTOh9vdNttsk7UMIkBDQrZ53GCKUuXHTeJvK/ERQupBIZBZs0T696+Mq1KkPJaEEEIIIYTkDbSEiy++2EviPX36dC+cDUIMBCkATyo4xCDZePv27b3KfNdcc03k/e++++5e/qi///3vXn6qHj16eN+57bbbBoblPfHEE56QBJEMnlOICstHs8B3jh07Vk455RS5/vrrvaixf/zjHxn7nDVrlkycOLHud3hQISk8hCyE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EprPmjVL3n33XfnDH/7gvffOO+94722xxRaRv++nn36SadOmeeJUEAjrs6F9bdu29T7Trl27UK+sSlApIazhXNq3b1/uwyEkkfA5IYTPCCEcSwihvUVIuZldBfN3eEhBkOrWrVvodo1S2XypEgLyQ3377bfyr3/9y/v9qKOO8ryennjiibpt1llnHS/8bo899pA5c+Z44YF77bWXJ0J99dVXcvbZZ8vUqVO9an4QmWqtUUOdhJBXqY2akGLD54QQPiOEcCwhhPYWIeVmdg3N3yui+h645557ZIMNNpCBAwd6rz59+shdd92Vsc3EiRO9mwaaNGkin376qey2225e5b1DDjnE+x+V/GpNkCKEEEIIIYQQQghJGhVRfQ8sv/zycvfdd4duY52+WrVqJc8++2wJjowQQgghhBBCCCGEVK2nFMkP5Mk6//zzM/JlEUL4nBDCsYSQwkKbixA+I4RwLIlOxeSUIoQQQgghhBBCCCHVAz2lCCGEEEIIIYQQQkjJoShFCCGEEEIIIYQQQkoORSlCCCGEEEIIIYQQUnIoShFCCCGEEEIIIYSQkkNRihBCCCGEEEIIIYSUHIpShBBCCCGEEEIIIaTkUJQihBBCCCGEEEIIISWHohQhhBBCCCGEEEIIKTkUpQghhBBCCCGEEEJIyaEoRQghhBBCCCGEEEJKDkUpQgghhBBCCCGEEFJyKEoRQgghhBBCCCGEkJJDUYoQQgghhBBCCCGElByKUoQQQgghhBBCCCGk5FCUIoQQQgghhBBCCCElh6IUIYQQUiYaNWoU6fXyyy97L/z80EMPJeJ+FeN4LrjgAm+fUVh99dXl0EMPLcj3zpkzR04++WTp1q2btGzZUjbaaCO57777In/+2WeflS233FJatWolHTp0kF133VU+++yznI9n9uzZcskll8i2224rXbp0kbZt28oGG2wgl19+ucyfP9/3mgW94pxHIcB34piUO+64w3vv/ffflyTiHm9Uvv32W+9zH330UVGOqxTfo/fmq6++Kvi+CSGEkKg0jbwlIYQQQgrKW2+9lfH7RRddJC+99JL897//zXi/d+/e8sEHH/DqF4k999xT3nvvPbnssstk7bXXlnvvvVcOOOAAWbp0qQwdOjT0s//5z39kjz32kN12200efvhhmTVrlowYMUK23nprb59rrrlm7OOZOnWqjBo1Sg466CAZPny4J0q99tprnjjx/PPPey8V74488kjZaaedGuxj2LBh8uWXX/r+rdhtepVVVpFqB2IR7jPEUYiYlf49hBBCSLmgKEUIIYSUic022yzj906dOknjxo0bvF8Ifv/9d2ndunXB91vpjB071hN5VIgC2223nXz99ddy+umny3777SdNmjQJ/PyZZ57peTE98sgjdULRFlts4Ylbf/vb3+See+6JfUw9evTwvFfatGlT997222/v/Y5jeuONN2Srrbby3ocA5IpA+Cw8tQ488EBZbrnlpJQUo+0SQgghpHph+B4hhBBSQSxatEjOOeccL9Ssffv2suOOO8rEiRMztkHY1/rrry+vvvqqJ5BAjDr88MPrQsNOO+00T/ho3ry5rLzyyl7o2ty5czP28eCDD8qmm27qhaPh82ussUbdPuIeD7j99ttlww039MLjll9+ec+7aPz48ZHO94wzzvDC2HAcEGPeffddKRSPPvqo54m0zz77ZLx/2GGHeV4q77zzTuBnf/rpJ+9cBw8enBF2uNpqq3nX/7HHHpMlS5bEPiaIT1aQUv7whz94/0+bNi3087jWqVTK86LKxg8//CBHHXWUdO/eXVq0aOEJowhFfOGFFxq0J3hrQXRCmCLazXnnndfg/KKEw82YMUP69esnPXv2lMmTJxelXbpg//AeW2GFFbz7DQ+ySZMm+W6LY4KHXOfOnb1rsu6668r111+fEbq6ySab1LUTDZW0541wxT/96U9eW0eb79u3rzzwwAMNvmv69Ol11x/njedo7733lu+//76g3/P222979xXb4DvOOuss79kihBBCyg09pQghhJAK4uyzz/Yml7feeqs30YanDnIYQeCxHj2Y+P/5z3/2BJ1LL73U88CCt9SAAQPkm2++8fbTp08fz6MGHj2ffvqpJ0Rg0osQLHgI4YUJMCay8BxywwqjHs/IkSO97eCJhJ8h5mC/m2++uRfiBnEiCAgJd955pydY/PGPf5T//e9/Xrjdb7/91mDbxYsXR7qGOC4VkbA/iA5Nm2aaRLg2+ncIe34sXLjQ+x/ChQvew/VGCB28pgDOGaFYCNGE0BMXvf7rrbde4DYIOUSuoLXWWsu719lAiCBCQ5HDCsf566+/er/jHlm+++472X///eWvf/2rXHjhhfLUU0/JxRdfLL/88otcd911kc8B13PIkCGedxfa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VDn3NWHChJIdNyGEEEIIIYQQQgipYFHqlVdekeOPP17efvttef7552Xx4sUycOBAmTt3btbPQryaMWNG3atnz54lOWZCCCGEEEIIIYQQUuE5pZ555pmM30ePHu15TI0bN0622Wab0M9iu+WWW67IR0gIIYQQQgghhCSPJUuWyKJFi8p9GKSKaNKkiTRt2jRrzqiqEaVcZs2a5f2//PLLZ922b9++Mn/+fOndu7ece+65st1225XgCAkhhBBCCCGEkPIyZ84c+eabbySVSvFWkILSunVr6dq1qzRv3ry2RCk8TMOHD5etttpK1l9//cDtcHFuvvlm6devnyxYsEDuuusu2WGHHbxcU0HeVdgOL1vGkBBCCCGEEEIIqUQPKQhSEA86deqUt1cLIarJLFy4UH744QeZMmWKlyKpcePGtSNKnXDCCfLJJ5/I66+/Hrpdr169vJey+eaby7Rp0+TKK68MFKWQUH3EiBEFP2biz7ffilx1lcjee+P+8CoRQgghhBBCSKFAyB4EBAhSrVq14oUlBQPtqVmzZvL11197AlXLli2rO9G58pe//EUef/xxeemll2SVVVaJ/fnNNttMJk+eHPj3s846ywsN1BdELFI8rr1WZNIkkUsv5VUmhBBCCCGEkGJADylSDHL1jqpITymouxCkHn30US/8rkePHjnt58MPP/TC+oJo0aKF9yKl4bffeKUJIYQQQgghhJBapGI8pY4//ni5++675d5775V27drJd999573mzZuX4eV08MEH1/0+atQoeeyxxzzPqM8++8z7+8MPP+yF/5FkwJBmQgghhBBCCCHF5o477pDlllsu8vZwhoGH2a+//lrU46p1KkaUuvHGG71wum233dbzdNLX/fffX7fNjBkzZOrUqXW/I67xtNNOkz59+sjWW2/t5aB66qmnZM899yzTWRAXilKEEEIIIYQQQvx48803pUmTJrLTTjvFukCrr76656Ri2W+//WQScsdEZIsttvA0hg4dOuQkapEqDN/LBhqJ5YwzzvBeJLlQlCKEEEIIIYQQ4sftt9/upfG59dZbPQeUVVddNa/E3HGSvTdv3ly6dOnCG1NkKsZTilQnFKUIIYQQQgghhLjMnTtXHnjgATn22GNll112aeCEggJo/fv396q+rbjiinURUYiuQkW4U045xQu/0yTv1tNp4sSJ3vsTJkzI2OfVV1/teVnBKcaG7+Hnww47zIve0n1ecMEFcuGFF8oGG2zQ4Nj79esnf/vb33hTI0BRipQVilKEEEIIIYQQUhoQgDR/fnleEYKfMkCqnl69enmvP//5zzJ69Oi6CCpNy7Pzzjt7xcxefPFFT6ACjzzyiKyyyiqeYITwO7xcsE8IR/fcc0/G+8hhPXTo0AbVChHKh3DA9u3b1+0TqYIOP/xw+fzzz+W9996r2/aTTz7xjunQQw+Nd8I1SsWE75HqhKIUIYQQQgghhJSGBQtE9tmnPFf7wQdFWraMvv1tt93miVEAOaXmzJnjiU877rijXHLJJbL//vvLiBEj6rbfcMMNvf+XX355Lw8VCqSFhd8deOCBct1118lFF13k/Y58U+PGjZM777zTN5QPuaUgVtl9tm3bVgYNGuQJZptsson3Hn4eMGCArLHGGtFPtoahpxQpKxSlCCGEEEIIIYRYEF737rvvesITaNq0qZeoHDmmwEcffSQ77LBDXhcN+0aY39tvv+39Dq+pjTbaSHr37h1rP8OGDZMxY8bI/PnzZdGiRd5+4EFFokFPKVJWKEoRQgghhBBCSGlo0SLtsVSu747jJbV48WJZeeWV695D6F6zZs3kl19+iZWwPIiuXbvKdttt54XsbbbZZp6wdPTRR8fez6677iotWrSQRx991Pt/wYIFstdee+V9fLUCRSlSVihKEUIIIYQQQkjp5l9xQujKAcQohNBdddVVMnDgwIy/QeyBJ1KfPn28UD4kH/cD4XZLlizJ+l0I4TvzzDPlgAMOkC+//LLOMyvOPuHFdcghh3hhexClsI/WrVtHOldCUYqUGYpShBBCCCGEEEKUJ5980vOGOuKII7w8Tpa9997b86K65pprvPC9Nddc0xOBIGQ9/fTTcsYZZ3jboYLeq6++6v0NQhGq8/mBZOmo7ocXvKasZ5YL9ql5rZC/CsKTik9HHnmkrLvuut7Pb7zxBm9mDJhTipQVilKEEEIIIYQQQhSITkhm7gpS6imFfFKogvfggw/K448/7uWB2n777eWdd96p2w6V97766itPtOrUqVPgxcV+EH738ccfe15TYaAC3zHHHOPltsI+r7jiirq/9ezZ0/s7qvptuummvJkxaJTSmorEl9mzZ3sPw6xZs7wGSwoLhOzx49M/P/EEry4hhBBCCCGEFAok354yZYr06NFDWiY9bq+CgayyzjrreDmphg8fLrXC/JD2FVVLYU4pkhhPKcij9JwihBBCCCGEEFIpzJw5U+666y6ZPn16YI4rEgxFKVJWGpsAUuSMa8oWSQghhBBCCCGkQlhppZW8nFU333yzdOzYsdyHU3FQAiCJYfFiilKEEEIIIYQQQioHZkTKDyY6J4nxlFq0qJxHQgghhBBCCCGEkFJCUYqUFZtmH55ShBBCCCGEEEIIqQ0oSpGyYoUoilKEEEIIIYQQQkjtQFGKlJWlS+t/pihFCCGEEEIIIYTUDhSlSFmhpxQhhBBCCCGEEFKbUJQiZWXJkvqfmeicEEIIIYQQQgipHShKkcSIUgzfI4QQQgghhBCSja+++koaNWokH330UUkv1ssvv+x976+//prXfrCPxx57LHHnVw4oSpGyQlGKEEIIIYQQQogCMSbsdeihh/JiReCVV16Rfv36ScuWLWWNNdaQm266KetnXnzxRdliiy2kXbt20rVrVznzzDNlcZG9RyhKkbLCnFKEEEIIIYQQQpQZM2bUvUaNGiXt27fPeO/aa6/N6WItWbJEltpKW1XMlClTZMiQIbL11lvLhx9+KGeffbaceOKJ8vDDDwd+5pNPPvE+s9NOO3mfue++++Txxx+Xv/71r0U9VopSpKzYPoE5pQghhBBCCCGktunSpUvdq0OHDp53lPue8n//93+y3XbbSevWrWXDDTeUt956q+5vd9xxhyy33HLy5JNPSu/evaVFixby9ddfy8KFC+WMM86QlVdeWdq0aSObbrqpF5anYJtdd91VOnbs6P19vfXWk7Fjx2Yc47hx46R///7e98KzaOLEiRl/v/HGG2XNNdeU5s2bS69eveSuu+4KPed3331X+vbt63k1Yb8QhfIBXlGrrrqqJ+qtu+66cuSRR8rhhx8uV155ZeBnIEL16dNH/va3v8laa60lAwYMkJEjR8r1118vv/32mxQLilKkrNBTipDq4auvMACKzJpV7iMhhBBCCCGhzJ0b/Jo/P/q28+ZF27ZInHPOOXLaaad5uZfWXnttOeCAAzLCzX7//XdPWLn11lvls88+k86dO8thhx0mb7zxhifCwDton3328byDJk+e7H3m+OOPlwULFsirr74qn376qVx++eXStm3bBt971VVXyfvvvy9Nmzb1BB/l0UcflZNOOklOPfVU+d///idHH320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N7v97q233pKVVlop8ecNHTq04jU1derU0GNOPPFEOfbYYzuff/DBB7LaaqvRY4oQQgghhBBCCCEkARp1BmeiwopSgwcPrjziQEJziEOPPvqofO5zn6u89q9//avy2uabb57489555x155ZVXKuJUGAjrs6F9eiHpMUUIIYQQQgghhBCSnA8//LAShRZGj4442aogID/U66+/Lr///e8rzw899NCK19NNN93Uecy6665bCb/bc889Zc6cOZXwwL333rsiQr300kty0kknyYwZMyrV/JZZZplEn7to0aLK5+L4qFDBogNxDcIaRLlll1222adDSCFhPyGEfYQQziWE0N4ipNnMboH1O6QmCFLDhg2Tnj17ljvRObjqqqvkyCOPlB122KHyfPfdd5fzzz+/6pgXXnih4j0FevXqJU8//bT88Y9/lPfff78iTG2zzTZy7bXXJhakAC7eKqusIq0CGnRZGzUhjYL9hBD2EUI4lxBCe4uQZrNsydfvUR5SpROlBg0aJOPHj488xjp99evXT2677bYGnBkhhBBCCCGEEEIIKVX1PUIIIYQQQgghhBDSnlCUahOQvP2UU06pSuJOCGE/IYRzCSG0uQhpJFyXEMJ+UspE54QQQgghhBBCCCGkdaCnFCGEEEIIIYQQQghpOBSlCCGEEEIIIYQQQkjDoShFCCGEEEIIIYQQQhoORak24YILLpA111xTllxySRk9erTcf//9zT4lQhrCGWecIZ/97GdlmWWWkRVXXFH22GMPeeGFF6qOQWq9U089VYYNGyb9+vWTrbfeWp599tmqY+bPny/f/e53ZfDgwbLUUkvJ7rvvLq+++irvImnJPtOjRw85+uijO19jHyHtzmuvvSZf/epXZfnll5f+/fvLZz7zGZk0aVLn79lHSLvzySefyA9/+MPKegO21FprrSWnn366LFq0qPMY9hPSbtx3332y2267VdYYsK1uuOGGqt/n1Sfee+89OfDAA2XAgAGVB35+//33pSxQlGoDrr322sri4uSTT5Ynn3xSttxyS9l5551lxowZzT41QurOvffeK9/5znfkkUcekTvuuKNiNO2www7y0UcfdR7zy1/+Us4++2w5//zz5bHHHpMhQ4bIF7/4Rfnwww87j0Efuv766+Waa66RBx54QObMmSO77rqrLFy4kHeRtAxo/xdffLF8+tOfrnqdfYS0MzD2P//5z0vv3r3l1ltvleeee05+/etfy3LLLdd5DPsIaXd+8YtfyEUXXVSxpSZPnlzpE7/61a/kt7/9becx7Cek3cB6Y8MNN6z0Cx959Yn9999f/v3vf8vEiRMrD/wMYao0oPoeaW0+97nPdRx22GFVr6277rodP/jBD5p2ToQ0i1mzZqHiaMe9995beb5o0aKOIUOGdJx55pmdx/zvf//rGDBgQMdFF11Uef7+++939O7du+Oaa67pPOa1117r6NmzZ8fEiROb8C0IyZ8PP/ywY8SIER133HFHx1ZbbdVx1FFHVV5nHyHtzve///2OLbbYIvT37COEdHTssssuHQcffHDVpdhrr706vvrVr7KfEAKXKJGO66+/Pve547nnnqu89yOPPNJ5zMMPP1x57fnnny/FtaenVIuzYMGCins5PEMseP7QQw817bwIaRYffPBB5f9BgwZV/p8+fbq88cYbVX2kb9++stVWW3X2EfShjz/+uOoYuNmOGjWK/Yi0DPAo3GWXXWT77bevep19hLQ7N954o2yyySay7777VsLAN9poI7nkkks6f88+QojIFltsIf/85z9lypQplcvxn//8p+LVMXbsWPYTQjzkNXc8/PDDlZC9TTfdtPOYzTbbrPJaWdb7SzT7BEh9efvttyuufSuttFLV63iOTkBIO4FNimOPPbZiOGEwB9oPfH3k5Zdf7jymT58+MnDgwG7HsB+RVgAu4U888UTFddyFfYS0O//973/lwgsvrMwfJ510kjz66KNy5JFHVhYPX/va19hHCBGR73//+5WNv3XXXVd69epVWX/87Gc/k3HjxlWuD+cSQqrJq0+88cYblQ0TF7xWlnUKRak2AYnV3MW5+xohrc4RRxwhTz31VGXnLo8+wn5EWoFXXnlFjjrqKLn99tsrxTDCYB8h7QoSNcNT6uc//3nlOTylkIgWQhVEKYV9hLR7Dtvx48fL1VdfLeuvv34lpw1y4cCr46CDDuo8jv2EkGp65LAG8R1fpnUKw/daHGTpx26Fq5LOmjWrmypLSCuDqhUIwbj77rtllVVW6XwdCQVBVB/BMQiFRbLbsGMIKStwDUdbRmXWJZZYovJAgYDzzjuv8rO2cfYR0q4MHTpUPvWpT1W9tt5663UWjOE8QojI8ccfLz/4wQ9kv/32kw022KCSZPmYY46pVHRlPyGkO3nNHUOGDJE333yz2/u/9dZbpVmnUJRqceDuh4UGqo5Z8HzzzTdv2nkR0iiwSwAPqb/97W9y1113VUoVW/Acg7ntIxj8sSjXPoI+hKpL9piZM2fKM888w35ESs92220nTz/9dGVXWx/wCjnggAMqP6OsN/sIaWdQee+FF16oeg15c1ZfffXKz5xHCBGZO3eu9OxZvbTExjg8DdlPCOlOXnPHmDFjKqGzCC1X/vWvf1VeK816v9mZ1kn9QbZ+ZO2/7LLLKtn5jz766I6lllqq46WXXuLlJy3Pt7/97UoVi3vuuadj5syZnY+5c+d2HoOqFzjmb3/7W8fTTz/dMW7cuI6hQ4d2zJ49u/MYVLBcZZVVOu68886OJ554omPbbbft2HDDDTs++eSTJn0zQuqHrb4H2EdIO/Poo492LLHEEh0/+9nPOqZOndpx1VVXdfTv379j/Pjxncewj5B256CDDupYeeWVO26++eaO6dOnV2yqwYMHd5xwwgmdx7CfkHasbPzkk09WHpBezj777MrPL7/8cq59Yqeddur49Kc/Xam6h8cGG2zQseuuu3aUBYpSbcLvfve7jtVXX72jT58+HRtvvHHHvffe2+xTIqQhYALwPa644oqqkqynnHJKpSxr3759O77whS9UJgbLvHnzOo444oiOQYMGdfTr168y0M+YMYN3kbSFKMU+Qtqdm266qWPUqFGVOWLdddftuPjii6t+zz5C2h0sojFvrLbaah1LLrlkx1prrdVx8sknd8yfP7/zGPYT0m7cfffd3nUIRNw8+8Q777zTccABB3Qss8wylQd+fu+99zrKQg/802xvLUIIIYQQQgghhBDSXjCnFCGEEEIIIYQQQghpOBSlCCGEEEIIIYQQQkjDoShFCCGEEEIIIYQQQhoORSlCCCGEEEIIIYQQ0nAoShFCCCGEEEIIIYSQhkNRihBCCCGEEEIIIYQ0HIpShBBCCCGEEEIIIaThUJQihBBCCCGEEEIIIQ2HohQhhBBCSIM49dRT5TOf+UzDr/c999wjPXr0kPfffz/0mCuvvFKWW265hp4XIYQQQtobilKEEEIIITkA0Sfq8fWvf12OO+44+ec//1nI6/2Vr3xFpkyZ0uzTIIQQQkgbsUSzT4AQQgghpBWYOXNm58/XXnut/PjHP5YXXnih87V+/frJ0ksvXXkUEZwfHoQQQgghjYKeUoQQQgghOTBkyJDOx4ABAyreUe5rbvgevKf22GMP+fnPfy4rrbRSJXzutNNOk08++USOP/54GTRokKyyyipy+eWXV33Wa6+9VvFsGjhwoCy//PLypS99SV566aXYc3zwwQdlww03lCWXXFI23XRTefrpp0PD9/Rc//SnP8kaa6xROf/99ttPPvzwQ7YXQgghhOQCRSlCCCGEkCZy1113yeuvvy733XefnH322RUxaNddd60ITv/617/ksMMOqzxeeeWVyvFz586VbbbZpuJxhb954IEHKj/vtNNOsmDBgsjPgtB11llnyWOPPSYrrrii7L777vLxxx+HHv/iiy/KDTfcIDfffHPlce+998qZZ56Z+zUghBBCSHtCUYoQQgghpInAG+q8886TkSNHysEHH1z5H8LTSSedJCNGjJATTzxR+vTpU/FyAtdcc4307NlTLr30Utlggw1kvfXWkyuuuEJmzJhRSWgexSmnnCJf/OIXK3/3hz/8Qd588025/vrrQ49ftGhRxYNq1KhRsuWWW8qBBx5Y2JxYhBBCCCkfzClFCCGEENJE1l9//YrIpCCMDyKQ0qtXr0qI3qxZsyrPJ02aJNOmTZNlllmm6n3+97//VTybohgzZkyVGAYBbPLkyaHHI2zPfs7QoUM7z4MQQgghpFYoShFCCCGENJHevXtXPUcuKt9r8FoC+H/06NFy1VVXdXuvFVZYIfXn473TnJueByGEEEJIrVCUIoQQQggpERtvvHGluh9yQi277LKp/vaRRx6R1VZbrfLze++9J1OmTJF11123TmdKCCGEEBINc0oRQgghhJSIAw44QAYPHlypuHf//ffL9OnTKwnIjzrqKHn11Vcj//b000+v5IR65plnKpX/8D6o/kcIIYQQ0gwoShFCCCGElIj+/ftXqu7B42mvvfaqJDpHgvR58+bFek6hch7EK4T/zZw5U2688cZKEnVCCCGEkGbQo6Ojo6Mpn0wIIYQQQgghhBBC2hZ6ShFCCCGEEEIIIYSQhkNRihBCCCGEEEIIIYQ0HIpShBBCCCGEEEIIIaThUJQihBBCCCGEEEIIIQ2HohQhhBBCCCGEEEIIaTgUpQghhBBCCCGEEEJIw6EoRQghhBBCCCGEEEIaDkUpQgghhBBCCCGEENJwKEoRQgghhBBCCCGEkIZDUYoQQgghhBBCCCGENByKUoQQQgghhBBCCCGk4VCUIoQQQgghhBBCCCHSaP4fHJgGQvP7bDYAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Pick one neuron to visualize\n", + "neuron_key = {'mouse_id': 0, 'session_date': '2017-05-15', 'neuron_id': 0}\n", + "activity = (Neuron & neuron_key).fetch1('activity').load() # Explicit load\n", + "\n", + "fig, axes = plt.subplots(2, 1, figsize=(12, 6), sharex=True)\n", + "\n", + "for ax, param_id in zip(axes, [1, 2]):\n", + " key = {**neuron_key, 'spike_param_id': param_id}\n", + " spike_times_ref = (Spikes & key).fetch1('spike_times')\n", + " spike_times = spike_times_ref.load() # Load spike times\n", + " spike_count = (Spikes & key).fetch1('spike_count')\n", + " threshold = (SpikeParams & {'spike_param_id': param_id}).fetch1('threshold')\n", + " \n", + " ax.plot(activity, 'b-', alpha=0.7, label='Activity')\n", + " ax.axhline(threshold, color='r', linestyle='--', label=f'Threshold={threshold}')\n", + " ax.scatter(spike_times, activity[spike_times], color='red', s=20, zorder=5)\n", + " ax.set_title(f'Threshold={threshold}: {spike_count} spikes detected')\n", + " ax.set_ylabel('Activity')\n", + " ax.legend(loc='upper right')\n", + "\n", + "axes[1].set_xlabel('Time bin')\n", + "plt.tight_layout()" + ] + }, + { + "cell_type": "markdown", + "id": "cell-24", + "metadata": {}, + "source": [ + "### Average Waveform" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "cell-25", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:43.863787Z", + "iopub.status.busy": "2026-01-14T07:34:43.863663Z", + "iopub.status.idle": "2026-01-14T07:34:44.052092Z", + "shell.execute_reply": "2026-01-14T07:34:44.051780Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAArMAAAGHCAYAAACj5No9AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzsnQe4pVV19/cwwAwdpEivAqIogihFFNTYaywxxt5iLDGoifk0YjcaKxoVYyUmFkw0fjFWvoiAYqOKdJUmIE3pMEy53/N77/zuXXfPfss599w2867nuXPvnPOWXdf+77X/a61FY2NjY6mXXnrppZdeeumll14WoKw31wXopZdeeumll1566aWXYaUHs7300ksvvfTSSy+9LFjpwWwvvfTSSy+99NJLLwtWejDbSy+99NJLL7300suClR7M9tJLL7300ksvvfSyYKUHs7300ksvvfTSSy+9LFjpwWwvvfTSSy+99NJLLwtWejDbSy+99NJLL7300suClR7M9tJLL7300ksvvfSyYKUHs7300svA8rOf/Sz96Z/+adp1113TkiVL0j3vec902GGHpde//vVDteZll12WFi1alI4//viJz972trdVn91www0z0kNPfOIT02abbZZWrFgx5fOzzjqreu8OO+ywxj2nnnpq9d1HP/rRNJdCez3hCU9I97jHParyHH300WltENqX8XT55ZfP2jvPPvvsqi0ZyxtttFHVpozlf//3fy9ev3z58vShD30o3e9+96uu33LLLdPhhx+eTjvttIlrLr744rThhhumM888c9bq0Usv67KsP9cF6KWXXhaWfOtb30pPfvKT01FHHZXe9773VaDvmmuuSaeffnr6yle+kj74wQ8O/Eye8ZOf/CTttddeabbk4Q9/eFUXyn3ooYdOfP7DH/4wbbLJJun3v/99uvDCC9O9733vKd9571zKa1/72mpD8bnPfS5tv/32ReC90ITM6oDyl73sZWm33XabtffedNNNaZdddknPfvaz00477ZRuv/329MUvfjE973nPqzYNb37zmyeuXblyZbWJ+9GPfpTe8IY3VCCW688444zqt7LPPvuk5zznOVU/nXzyybNWl156WWdlrJdeeullAHnYwx42ttdee40tX758je9Wrlw5srZ861vfOoaKuv7662ekf84444zq+e95z3umfP7kJz957C/+4i/Gdthhh7FPfOITU757xCMeMbbNNtuMrVq1amwu5V73utfY4x73uJE9b8WKFWN33XXX2FzKt7/97ao/LrzwwrH5IIcccsjYLrvsMuWzD3/4w2Prrbfe2E9+8pPW+08//fSqPj/+8Y9nsJS99NIL0tMMeumll4HkxhtvTNtss01af/01D3bWW2+qStl9992r4/z/+q//Sve///3T0qVL05577rnGMX2JZlASLKXcf8ghh6Trrruu+gwL6stf/vK08847V0e7e+yxR3r729++Bn0glwc84AFpq622mrC2IqtWraqOurE6H3nkkemkk06a+O7uu++urMd8R1l//etfpxe96EVp7733ThtvvHFl1XvSk56Uzj333Il7rr/++qpMxxxzTLEuOWWhrS6U1Xd/5zvfqf7mh/ZDrrjiivTc5z43bbfddtVx/X777VdZyqlX3tZY1d/1rndV7+Ba6iq145e//GV65jOfmbbYYovq2P11r3tdVYaLLrooPfaxj63oGfQtz4jCe3jmvvvuO3EET79/5CMfSW1y3HHHpQc96EHVvaUx9N3vfjcddNBB1XOxlmOVnkkpjXHq8bCHPWyKJb9OHvjAB1bt/8lPfnIGS9lLL71U0mP6XnrpZRB56UtfWlmc/vqv/3rspz/96djdd99de+1uu+02ttNOO43tuuuuY5/73Ocq69tznvOc6v73v//9E9ddeuml1Wef//znay2zP/zhD8e22mqrsac85Sljt99+e/XZNddcU1nPeM+//Mu/jP2///f/xt75zneOLVmyZOyFL3xha1141iabbDJhZdZae9FFF40dd9xxY9ttt93EtSeffHL13cc//vGJ/7/+9a8f+8///M/q7//6r/8ae+pTnzq20UYbTbEu/umf/mlVxtxq/YY3vGFsww03HLvhhhs61+Xmm2+urILbb7/92EMe8pDqb36wql533XVVW2+77bZjn/zkJ8e++93vjr361a+uyvyKV7xijbbm2oc//OFV+b///e9Xn9vm++67b/XuE088sSonn/Gse9/73mMf/ehHq89f9KIXVZ9/7Wtfm3g2Vu7FixdXz/nf//3fqgzHHnvs2Nve9rbGfli2bFnVbryrNIZ23nnnsfvc5z5jX/jCF8a+973vjT3zmc+s3k27R6Efu/yULOv0D9/RjvTx+uuvX7WjcsUVV0yM+ze+8Y3V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tt566+p+QmwRAi1GgLCtY2i0tkQVL3jBC6oQZrlQT/pVIQoCkS0IR0VfMy5oo8suu2ysTY455pgq9FqevKGurnXtPKgQMu6hD31oVWbCcW255ZbVc4mgUZJzzz23Ks9mm21WRVk49NBDx775zW+ucR2RPRgXeWSIXnrpZfSyiH9mEiz30ksv665wFIulDk/9XnppEizWJHDAuvysZz1rwTfWZz/72eqUAs5wb5ntpZeZld4BrJdeeumllzkX6ChwawnFFjOWLUTBcQwaDdEQeiDbSy8zLz1ntpdeeumll3khb37zmyseNU5ju+yyS1qogjWWtMKvf/3r57oovfSyTkhPM+ill1566aWXXnrpZcFKTzPopZdeeumll1566WXBSg9me+mll1566aWXXnpZsNKD2V566aWXXnrppZdeFqyscw5geMkSAobsQzORzrGXXnrppZdeeumll+kJkWNvvfXWKtJJnio6retgFiC7kL1ke+mll1566aWXXtYVufLKK1szOa5zYBaLrI1DKsJeeumll1566aWXXuaX3HLLLZXxUdzWJOscmJVaAJDtwWwvvfSytsny5cvTpz71qervv/zLv0wbbLDBXBepl1566WVo6UIJXefAbC+99NLL2s4zu/766yf+7qWXXnpZ26WPZtBLL7300ksvvfTSy4KVHsz20ksvvfTSSy+99LJgpacZ9NJLL7300ss6LNBRVqxYkVauXDnXRellHZMNNtggLV68eNrP6cFsL7300ksvvayjcvfdd6drrrkm3XHHHXNdlF7WUeeunXfeOW266abTek4PZnvppZdeeullHRSSCF166aWVZYzA9BtuuGGfTKiXWXdW/d3vfpf23nvvaVloezDbSy+99LKWWTq23HLLib976aXJKgugJZbnxhtv3DdUL7Mu2267bbrsssuqkII9mO2ll1566WWCg3b00Uf3rdFLZ2lLFdpLLzMlo9pw9yO4l1566aWXXnrppZcFKz2Y7WUkcvvt8K/6xuxldEK8/9tuG//dy+wIzuy9H1AvvcwPQfcxJ3sd2C49mO1l2nLzzSldeGFKV17ZN2Yvo5PrrkvpoovGf/cyeDpbfvh7ELn00pQuuKAHtL30Mh9kxYqU7rqLOT1ap6u//Mu/TPe4xz2qI/6zzz47rQ3Sg9lepi3Llk1aZ3vpZdTjqrcUDr5YXX311dXPoOls+zbvZSHIC1/4wgqI/dVf/dUa373yla+svuOahS5O31Geen73u99Nxx9/fPqf//mfKiTb/vvvn9YG6cFsL9MWJ5oLYS+9jEKM396Pq9mTvs17WShCBIavfOUr6c4775z47K677kpf/vKX06677prWBhHMjpJm8Jvf/CbtsMMO6fDDD0/bb799Wn/99YdOsjGfpAezvYwMzPJ7lMchvazb0m+S+jbvpZc6OeiggyrQ+vWvf33iM/4G5B544IFrgK/3ve99ac8990wbbbRROuCAA9J//ud/TnxP5rOXvOQlaY899qi+33fffdNHPvKRKc/A0vvUpz41feADH6jA4NZbb51e9apX1VJ5br755irU1BlnnDFRBo72H/SgB01cA/DmWcrf//3fp3322acKk0ZZ3/a2Y6rnowsvuuiiyuJ8IZy+IB/60IfS7rvvPnEKc/7556fHP/7xVRKCe97znul5z3teuuGGGybq8Nd//dfpiiuuqJ7FfciyZcvSa17zmrTddtulpUuXpiOOOCL94he/mHjHD3/4w+r6733ve+nggw9OS5YsSaeeemo66qijqucRPWWrrbaq3ge96fbbb08vetGL0mabbZb22muv9J3vfGfGB3IPZnuZtsQMiL0VrZdRjysMAH2WzdmRfgPRSyUHH5zSzjvP7g/vHFAATJ///Ocn/v+5z30uvfjFL17juje/+c3Vdccdd1w677zz0mtf+9r03Oc+N5188smrx/2qKgvVV7/61QoMvuUtb0lvetObqv9HOemkkyrLJr//9V//tTqu56ckW2yxRXrAAx5QAUHkl7/85cTvW265pfqb74488siJewB/PI8yAKY///lPp4997MPVd3vvvW964AMfmL74xS9Oec+XvvSl9Bd/8RcV2IQ2wPN47+mnn15RCq699tr0Z3/2Z9W1PPMd73hHVVeuFbC+4Q1vSF/72teqOp155pnpXve6V3rMYx6T/vCHP0x5F9e95z3vSRdccEG6//3vX33GPdtss036+c9/XgHbV7ziFemZz3xmZfnlWTwHQD3jGebG1jG5+eab2b5Uv3sZjVx22djY6aeP/9xwQ9+qvYxGLrhgclzdfnvfql1l2bJlY29961urH/7uKitXTrb3WWf17b0uyJ133jl2/vnnV7+nyE47Yeeb3R/e2VFe8IIXjD3lKU8Zu/7668eWLFkydumll45ddtllY0uXLq0+4zuuQW677bbq89NOO23KM17ykpeMPfvZz659xytf+cqxpz/96VPeudtuu42tWLFi4rNnPvOZY8961rNqn/G6171u7IlPfGL197HHHjv2jGc8Y+yggw4a+9a3vlV9ts8++4wdd9xxtfe/+93vGzvwwAeO3Xbb2Biv/dCHPjS25557Tnx/0UUXVXjmvPPOq/5/zDHHjD360Y+e8owrr7yyuoZrkQ9/+MNVPRTaZ4MNNhj74he/OPHZ3XffPbbjjjuOve9976v+f9JJJ1XP+MY3vjHl2UceeeTYEUccMfF/2maTTTYZe97znjfx2TXXXFPd+5Of/GSwMTggXuszgPUybekts73MxrjqExTNrEQnE9oei/gQdLpe1gbZfvsF8U4sgk94whMq6yDH7PzNZ1GwcsKlfdSjHrVG9rNIR/jkJz+ZPvOZz6TLL7+84uHyPRbOKPe9732nZKmCInDuuefWlo9j+M9+9rOV5Rcr8CMf+ciKGsHf0CQuvvjiKZZZqA/HHnts+vWvf51uu+22ipe62WabT8zPP//zP09/93d/l37605+mQw89tLLSUsb73Oc+1TVQGrAaQzHIBYsyFIbS51AZHvKQh0xJvPLgBz+4ssBGgWKQixZahLaBfnG/+91v4jOoB8h1MxyWpldVvYx0EexpBr2MSvpxNbwMk5o0p3Iwl3swu47K6aenhSLQCl796ldXf3/84x9f43uAJPKtb30r7bTTTlO+g/uJQCeAevDBD34wHXbYYdVx//vf//70s5/9bMr1gLwoHO37/JI87GEPS7feemt13A7H9J3vfGfF6f3Hf/zHCoTCUd1vv/2qawGogNW3v/3t1dE8NIV/+7evpI9+9IPV95ivAc8Pf/jDK2oBYBbO7ctf/vIpdX3Sk56U/umf/mmNskRubhS5tnkmLj7PP9tkk03WuL/UJvEzn9HUTqOQHsz2Mm3pLbO9zIT0YHY42XDDDStu23TaWzBbWLt66WVeyWMf+9jKiooAAnPBagloxekpWkGjADTheBLWK1ospyvyZj/2sY9VoI6y7Ljjjumss86qQmPF8vz4xz9Ou+22W/qHf/iHic+uuOLyib+NaPCc5zynchR79rOfXZURAKxg7YX7imNX1ygF8GPRGT/60Y8q7i2CpRbO7UJKi907gPUybelBRy8zIf0maXal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8j5xiIccckj5/ogRI9Laa6+dHnzwwdTuHHXUUWnFFVcsK9LNPvvs6Stf+Up66KGHunymU9sGTjrppLT00kvXEnGvuuqq6c9//nPt/U5um3p9ibE1duzY2mud3D7cN+2R/8w555y19zu5beCZZ55JW2+9dRo1alQaOXJkWnbZZdNdd92VOr19Ro8ePUm/4WfXXXft6HaB9957Lx1wwAGlTsO9jxkzJh166KFlZVUZsPYhm0HQHM4555xi2mmnLU499dTin//8Z7HnnnsW0003XfHEE090XJP/6U9/Kn7yk58UF154IdkziosvvrjL+0cffXQxwwwzlO8/8MADxRZbbFHMNddcxeuvv160M+utt14xbty44h//+Edx7733FhtttFHx6U9/unjzzTeLTm8buPTSS4srrriieOihh8qf/fffvxxTtFent03OHXfcUYwePbpYeumlSzkjndw+Bx98cLHEEksUzz33XO3nhRdeqL3fyW3z8ssvF/PPP3+x/fbbF7fffnsxfvz44tprry0effTRotPbhz6S95lrrrmmnLNuuOGGjm4XOPzww4tRo0YVl19+edlnzj///GL66acvjj322EIGqn1CmW0iK620UrHLLrt0eW3RRRct9t1336KTqSqzH3zwQTHnnHOWg0AmTJhQzDjjjMXJJ59cdBIIUtrnpptuKv+OtpmUmWeeufjtb38bbfMRb7zxRvGZz3ymnHTXWmutmjLb6X0HZXaZZZap+16nt80+++xTrLHGGg3f7/T2yWE8LbjggmWbdHq7bLTRRsUOO+zQ5bWvfe1rxdZbb13+PpDtE24GTeKdd94pt2zWXXfdLq/z92233das07Yk48ePT//973+7tBWJl9daa62Oa6vXXnut/H+WWWYp/4+2+Zj3338/nXPOOemtt94q3Q2ibT6E7c+NNtooffGLX+zSl6J9UnrkkUfK7U62Rb/5zW+mxx57LNompXTppZemz372s2mzzTYr3ZuWW265dOqpp0bfqTOPn3nmmWmHHXYoXQ06fUytscYa6brrrksPP/xw+fd9992Xbr311rThhhuWfw9k+wxp6tE7mBdffLGcfOeYY44ur/M3Dzv4GNujXls98cQTHdNUGK1/+MMflgJjySWXLF+LtknpgQceKJXXCRMmpOmnnz5dfPHFafHFF68Jx07uNyj3d999d7rzzjsnea/T+87KK6+czjjjjLTwwgun559/Ph1++OFptdVWK/33Or1tUOrxR0fe7L///umOO+5Ie+yxR6l4bLvtth3fPkJsx6uvvpq233778u9O7zf77LNPaXBZdNFF0zTTTFPqOEcccUTacsstB7x9QpltMqzmqgpL9bUg2gp22223dP/995cr3ehHH7PIIouke++9t5xULrzwwrTddtulm266qePH2FNPPZX23HPPdPXVV5cBpiGDurLBBhvUfl9qqaXKBdGCCy6YTj/99LTKKqt0tHwmYAfL7JFHHln+jWUWJR8FF2VWOrV95LTTTiv7Edb9nE5tl3PPPbe0VJ999tlpiSWWKOUyAae0D3J5INsn3AyaxKyzzlquXKpW2BdeeGGSVUunY4RxJ7fV7rvvXm793XDDDWneeeetvR5tk9LQoUPTQgstVE6+ROwvs8wy6bjjjuv4tsGNiTFClpQhQ4aUPyj5xx9/fPm7Y6eTx1XOdNNNVyq1uB50+riaa665yt2NnMUWWyw9+eST5e+d3j6AJfHaa69NO+64Y+21Tm+XvfbaK+27776lyw5jaZtttkk/+MEPSrk80O0TymwTJ2AmmWuuuabL6/zNVlfwMfizMQjytsJXiYm53duKFSsW2Ysuuihdf/31ZVvkdHLbTK7NJk6c2PFts84665QuGFhH/EHh32qrrcrfSZsTfedj6DP/+te/SkWu08fV6quvPkkKQPwg559//vL3Tm8fGDduXOlPjD+6dHq7vP3222nqqbuqjRjtTM01oO3T1PCyDsfUXKeddlqZmmvs2LFlaq7HH3+86DSIuL7nnnvKH7rdMcccU/5umjKiH4l4vOiii8p0HltuuWVHpDv53ve+V973jTfe2CUdzNtvv137TKe2Dey3337FzTffXKaBuf/++8vUXFNPPXVx9dVXF53eNvXIsxl0evv86Ec/KsfVY4+WjbMEAAAM8klEQVQ9Vvztb38rNt544zJlkPK3k9uGVG5DhgwpjjjiiOKRRx4pzjrrrGLkyJHFmWeeWftMJ7fP+++/X6ZIJOtDlU5ul+22266YZ555aqm5aINZZ5212HvvvQe8fUKZbTInnHBCmc9v6NChxfLLL19LudRpkKMPJbb6w+AwpQepdEjrMWzYsGLNNdcsB0K7U69N+CH3rHRq2wBpYBw/s802W7HOOuvUFNlOb5ueKLOd3D7mt8SgMPfcc5cphB588MHa+53cNnDZZZcVSy65ZHnvpIw85ZRTurzfye1z1VVXlXKY3NZVOrldXn/99VK+oOgPHz68GDNmTJk/fuLEiQPePlPxT3Ntv0EQBEEQBEHQHMJnNgiCIAiCIGhZQpkNgiAIgiAIWpZQZoMgCIIgCIKWJZTZIAiCIAiCoGUJZTYIgiAIgiBoWUKZDYIgCIIgCFqWUGaDIAiCIAiCliWU2SAIgiAIgqBlCWU2CIIgpTTVVFOlSy655BO3xYEHHph23nnnT3yctddeO40dO3bQHKcV+N3vfpdmmmmm2t+HHHJIWnbZZaf4eJdffnlabrnlarXngyAYnIQyGwRBv/DCCy+k7373u+nTn/50GjZsWJpzzjnTeuutl/7617+2zRN4/vnn03HHHZf233//fj/3jTfeWCrkr776apfXL7roonTYYYc19dyDRWHeYost0sMPP9xnx9t4443LNj377LP77JhBEPQ9Q5pwzCAIgkn4+te/nt599910+umnpzFjxpSK33XXXZdefvnltmmt0047La266qpp9OjRDT/zzjvvpKFDh/bbNc0yyyypUxgxYkT505d8+9vfTr/+9a/T1ltv3afHDYKg7wjLbBAETQdr4a233pp+9rOfpc9//vNp/vnnTyuttFLab7/90kYbbVT73DHHHJOWWmqpNN1006X55psvff/7309vvvnmJNvIbP8ussgiaeTIkekb3/hGeuutt0olGSVy5plnTrvvvnt6//33a9/jdayT3/rWt9L000+f5p577lJBmRzPPPNMaenjeKNGjUqbbrppevzxxyf7nXPOOSd9+ctfnsRqudtuu6Uf/vCHadZZZ01f+tKXytf/+c9/pg033LC8njnmmCNts8026cUXX2x47DPPPDN99rOfTTPMMENp1eZesHYD10W7AteLNXH77befxGpKe6+yyiqTHHvppZdOBx98cO3vcePGpcUWWywNHz48LbroounEE09seF2c56abbiot0pyXH9uJ13nOWOLnmmuutO+++6b33nuv4bGeeOKJtMkmm5T3QB9YYokl0p/+9KculucrrrgiLbPMMuW1rbzyyumBBx5o6GZQZfz48WmhhRZK3/ve90rXARYWe++9d5pnnnnK83E8zpPD87zjjjvSY4891vC4QRAMLKHMBkHQdFDY+MEndeLEiY0F0tRTp+OPPz794x//KJXT66+/vlQ2ct5+++3yMyiOV155Zal8fO1rXyuVHn5+//vfp1NOOSVdcMEFXb73i1/8olTa7r777lKp+8EPfpCuueaautfBOVAOueabb765VMT5ff311y8VoHq88sor5XWjcFbhXoYMGZL+8pe/pN/85jfpueeeS2uttVbpz/n3v/+9vA8s1ZtvvnnDtuG8KOT33Xdf2Y4oZiqsKP4XXnhh+ftDDz1UHh/lsspWW22Vbr/99vSf//yn9tqDDz5YKoS8B6eeemr6yU9+ko444oj0r3/9Kx155JGlHzD3UA/OgzV6p512Ks/LD9fDYgBlfcUVVyyv+aSTTiot14cffnjDe9x1113L/kGbc00sfmj3nL322iv98pe/THfeeWeaffbZS2UTi3938GxWX331tNlmm5XXQl/D6sozoS/df//95Xs840ceeaT2PRZenOeWW27p9hxBEAwQRRAEQT9wwQUXFDPPPHMxfPjwYrXVViv222+/4r777pvsd84777xi1KhRtb/HjRtXILYeffTR2mvf/e53i5EjRxZvvPFG7bX11luvfF3mn3/+Yv311+9y7C222KLYYIMNan9z3Isvvrj8/bTTTisWWWSR4oMPPqi9P3HixGLEiBHFVVddVfda77nnnvIYTz75ZJfX11prrWLZZZft8tqBBx5YrLvuul1ee+qpp8rvP/TQQ7Xv7bnnng3b5o477ig/733fcMMN5d+vvPLKJOfPj7P00ksXhx56aO1vnsOKK65Y+3u++eYrzj777C7HOOyww4pVV1214bXUu9b9999/kjY84YQTiumnn754//336x5nqaWWKg455JC673l/55xzTu21l156qXwm5557bq1/zDjjjLX3Dz744GKZZZYpbrvttmKWWWYpfvGLX9Teow9NNdVUxTPPPNPlPOuss07ZJjnLLbdcw+sKgmDgCctsEAT95jP77LPPpksvvbQM/MKiuvzyy5dbw3LDDTeU2/Bs+7Kdvu2226aXXnqpdCMQXAsWXHDB2t9s0eNGkFvweM0teMF6WP0by2M97rrrrvToo4+W16BVGd/TCRMmdLFq5vzf//1f+T/b31Wq1lqOz716bH7YzodGx7/nnntKVwcshVwX7gPw5JNPpt6ABfass84qf0eH/8Mf/lCzyv7vf/9LTz31VPrOd77T5dqwpja6rkbQtrQxrgGCZRS3kaeffrrud/bYY4/yXHwOtwespVXy58gzwd2k0XO0fb74xS+mAw44IP34xz+uvY6FnvtfeOGFu9wrrhHVe8UPF2t9EASDkwgAC4Kg30DRQ1nl56CDDko77rhjqbSwXY6/JNvSu+yyS7mdjqLC9j6KVb6NPO2003Y5JspSvdd6kk4pV7Ry+O4KK6xQU/pyZptttrrfwR9Wd4PqZ/DHrB4f31C20avgW1oFZX7dddctf/Cd5fgoaSwKGrk9NAJfW3xXUeZQwFFev/nNb9auS1cD/Edzpplmml6dB0Wx2r4fGsAbtzv9gXvCL/bqq69ORx11VPrVr35V+kBPjkbHA9oKH2lcCehLn/rUp2r3yj2xsKjeW9W1gSDFRs89CIKBJ5TZIAgGjMUXX7yW2xXfUYKDUF7wZ4Tzzjuvz871t7/9bZK/tYZWwWJ87rnnlr6SKj/dgbWYzxLYhbVvcnB8fFyxKONL2x3//ve/y+Cwo48+uvRHtb1yzJCQB77VY955501rrrlmqaijzGK1xJIN/I9VnGAnrbU9gXNXz8uz5R5zpfa2224rrcqcoxHcHwsafvBtRrHOlVmeG+ndXDiQiqvRc9SqSsAgCyUUZZRkroH8sVwzFvzPfe5zDb+vNZ7PB0EwOAk3gyAImg6uAl/4whdKqyJbxwQvnX/++ennP/95uXWuMogyS5YBlCkCuU4++eQ+uwYCfTgfys8JJ5xQnn/PPfes+1kUOSytXBuBP1wv2898vtEWOQo4iiHW5O4g0Alr35ZbblmLlEfJ2mGHHeoqoyhvKIy2Da4a1dyxuB+gNKK44S6QZ4God39YKmmDasopCg1gESWwi7YiEIvsBmSaaARKOYFlZDFA6cbqSSYKrL4ooijjf/zjH0srPFkdXKxUIevCVVddVbY3lmMCAMmqkHPooYeWKd0I6MKiz3P6yle+kiYHlnGsvSwcNthgg7JtWHDQDriykIuXcxJUhrXcDAoqz2RjqLqpBEEwiBhop90gCNqfCRMmFPvuu2+x/PLLlwE6BGwRHHTAAQcUb7/9du1zxxxzTDHXXHOVQT0EcZ1xxhldgpqqAT55kE/OdtttV2y66aZdAsB++tOfFptvvnl57jnmmKM49thju3wnDwCD5557rth2222LWWedtRg2bFgxZsyYYqeddipee+21hvd55ZVXFvPMM0+XAKdGgVwPP/xw8dWvfrWYaaaZyvtddNFFi7Fjx9YCpqrfIyhr9OjR5bUQjHXppZeW10zgmRDYNeecc5aBTbRBo/PTnhynGjgnZ511Vhm0NnTo0DJob8011ywuuuiihvdN0Noqq6xS3gfXNH78+PL1G2+8sQwu4zhc1z777FO8++67DY+z2267FQsuuGB5bbPNNluxzTbbFC+++GKXALDLLrusWGKJJcpjcux777239v1GAWDCvRJ8+LnPfa548803i3feeac46KCDynaddtppy2vkmdx///217+y8885dggmDIBh8TMU/A61QB0EQNBMsh1j9ml2lCnFKHlfOg9U16DsIGCRdGq4Fk8sl25dg4caFAZeOBRZYoF/OGQRB7wk3gyAIgj6CbX5y3E6uMEDQOuB6QMGIUGSDYHATAWBBEAR9CNWp+AlaH6qX8RMEweAm3AyCIAiCIAiCliXcDIIgCIIgCIKWJZTZIAiCIAiCoGUJZTYIgiAIgiBoWUKZDYIgCIIgCFqWUGaDIAiCIAiCliWU2SAIgiAIgqBlCWU2CIIgCIIgaFlCmQ2CIAiCIAhSq/L/hgE/NmxE7DcAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Get waveforms for one neuron with threshold=0.5\n", + "key = {'mouse_id': 100, 'session_date': '2017-05-25', 'neuron_id': 0, 'spike_param_id': 1}\n", + "\n", + "# Fetch waveforms NpyRef directly from Spikes table\n", + "waveforms_ref = (Spikes & key).fetch1('waveforms')\n", + "\n", + "# Load the waveform matrix\n", + "waveform_matrix = waveforms_ref.load()\n", + "\n", + "if len(waveform_matrix) > 0:\n", + " plt.figure(figsize=(8, 4))\n", + " # Plot individual waveforms (light)\n", + " for wf in waveform_matrix:\n", + " plt.plot(wf, 'b-', alpha=0.2)\n", + " # Plot mean waveform (bold)\n", + " plt.plot(waveform_matrix.mean(axis=0), 'r-', linewidth=2, label='Mean waveform')\n", + " plt.axvline(40, color='k', linestyle='--', alpha=0.5, label='Spike time')\n", + " plt.xlabel('Sample (relative to spike)')\n", + " plt.ylabel('Activity')\n", + " plt.title(f'Spike Waveforms (n={len(waveform_matrix)})')\n", + " plt.legend()\n", + "else:\n", + " print(\"No waveforms found for this key\")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-bulk", + "metadata": {}, + "source": [ + "### Bulk Fetch with Lazy Loading\n", + "\n", + "Fetching many rows returns NpyRefs - inspect metadata before downloading." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "cell-bulk-demo", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:44.053814Z", + "iopub.status.busy": "2026-01-14T07:34:44.053678Z", + "iopub.status.idle": "2026-01-14T07:34:44.057911Z", + "shell.execute_reply": "2026-01-14T07:34:44.057641Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Fetched 5 neurons\n", + "\n", + "Mouse 0, 2017-05-15: shape=(1000,), loaded=False\n", + "Mouse 0, 2017-05-19: shape=(1000,), loaded=False\n", + "Mouse 5, 2017-01-05: shape=(1000,), loaded=False\n", + "Mouse 100, 2017-05-25: shape=(1000,), loaded=False\n", + "Mouse 100, 2017-06-01: shape=(1000,), loaded=False\n" + ] + } + ], + "source": [ + "# Fetch all neurons - returns NpyRefs, NOT arrays\n", + "all_neurons = Neuron.to_dicts()\n", + "print(f\"Fetched {len(all_neurons)} neurons\\n\")\n", + "\n", + "# Inspect metadata without downloading\n", + "for neuron in all_neurons:\n", + " ref = neuron['activity']\n", + " print(f\"Mouse {neuron['mouse_id']}, {neuron['session_date']}: \"\n", + " f\"shape={ref.shape}, loaded={ref.is_loaded}\")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-26", + "metadata": {}, + "source": [ + "## Pipeline Diagram" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "cell-27", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:44.059231Z", + "iopub.status.busy": "2026-01-14T07:34:44.059137Z", + "iopub.status.idle": "2026-01-14T07:34:44.192583Z", + "shell.execute_reply": "2026-01-14T07:34:44.192179Z" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "SpikeParams\n", + "\n", + "\n", + "SpikeParams\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Spikes\n", + "\n", + "\n", + "Spikes\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "SpikeParams->Spikes\n", + "\n", + "\n", + "\n", + "\n", + "ActivityStats\n", + "\n", + "\n", + "ActivityStats\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Neuron\n", + "\n", + "\n", + "Neuron\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Neuron->ActivityStats\n", + "\n", + "\n", + "\n", + "\n", + "Neuron->Spikes\n", + "\n", + "\n", + "\n", + "\n", + "Mouse\n", + "\n", + "\n", + "Mouse\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Session\n", + "\n", + "\n", + "Session\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Mouse->Session\n", + "\n", + "\n", + "\n", + "\n", + "Session->Neuron\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dj.Diagram(schema)" + ] + }, + { + "cell_type": "markdown", + "id": "cell-28", + "metadata": {}, + "source": [ + "## Querying Results\n", + "\n", + "DataJoint makes it easy to query across the pipeline." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "cell-29", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:44.194340Z", + "iopub.status.busy": "2026-01-14T07:34:44.194184Z", + "iopub.status.idle": "2026-01-14T07:34:44.203871Z", + "shell.execute_reply": "2026-01-14T07:34:44.203595Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

mouse_id

\n", + " \n", + "
\n", + "

session_date

\n", + " \n", + "
\n", + "

neuron_id

\n", + " \n", + "
\n", + "

spike_param_id

\n", + " \n", + "
\n", + "

spike_count

\n", + " total number of spikes\n", + "
02017-05-150126
02017-05-190124
1002017-05-250141
\n", + " \n", + "

Total: 3

\n", + " " + ], + "text/plain": [ + "*mouse_id *session_date *neuron_id *spike_param_i spike_count \n", + "+----------+ +------------+ +-----------+ +------------+ +------------+\n", + "0 2017-05-15 0 1 26 \n", + "0 2017-05-19 0 1 24 \n", + "100 2017-05-25 0 1 41 \n", + " (Total: 3)" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Find neurons with high spike counts (threshold=0.5)\n", + "(Spikes & 'spike_param_id = 1' & 'spike_count > 20').proj('spike_count')" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "cell-30", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:44.205229Z", + "iopub.status.busy": "2026-01-14T07:34:44.205138Z", + "iopub.status.idle": "2026-01-14T07:34:44.214655Z", + "shell.execute_reply": "2026-01-14T07:34:44.214322Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

mouse_id

\n", + " \n", + "
\n", + "

session_date

\n", + " \n", + "
\n", + "

neuron_id

\n", + " \n", + "
\n", + "

spike_param_id

\n", + " \n", + "
\n", + "

spike_count

\n", + " total number of spikes\n", + "
02017-05-150126
02017-05-190124
52017-01-050118
1002017-05-250141
1002017-06-010118
\n", + " \n", + "

Total: 5

\n", + " " + ], + "text/plain": [ + "*mouse_id *session_date *neuron_id *spike_param_i spike_count \n", + "+----------+ +------------+ +-----------+ +------------+ +------------+\n", + "0 2017-05-15 0 1 26 \n", + "0 2017-05-19 0 1 24 \n", + "5 2017-01-05 0 1 18 \n", + "100 2017-05-25 0 1 41 \n", + "100 2017-06-01 0 1 18 \n", + " (Total: 5)" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Join with Mouse to see which mice have most spikes\n", + "(Mouse * Session * Spikes & 'spike_param_id = 1').proj('spike_count')" + ] + }, + { + "cell_type": "markdown", + "id": "cell-31", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "This pipeline demonstrates key patterns for electrophysiology analysis with object storage:\n", + "\n", + "| Concept | Example | Purpose |\n", + "|---------|---------|--------|\n", + "| **Object storage** | `` | Store arrays in file/S3/MinIO |\n", + "| **Lazy loading** | `NpyRef` | Inspect shape/dtype without download |\n", + "| **Memory mapping** | `ref.load(mmap_mode='r')` | Random access to large arrays |\n", + "| **Imported tables** | `Neuron` | Load data from files |\n", + "| **Computed tables** | `ActivityStats`, `Spikes` | Derive results |\n", + "| **Lookup tables** | `SpikeParams` | Parameterize analysis |\n", + "| **Array attributes** | `waveforms` | Store multi-spike data as single array |\n", + "\n", + "### Key Benefits of ``\n", + "\n", + "1. **Lazy loading**: Inspect array metadata without downloading\n", + "2. **Memory mapping**: Random access to large arrays via `mmap_mode`\n", + "3. **Safe bulk fetch**: Fetching 1000 rows doesn't download 1000 arrays\n", + "4. **NumPy integration**: `np.mean(ref)` auto-downloads via `__array__`\n", + "5. **Portable format**: `.npy` files readable by NumPy, MATLAB, etc.\n", + "6. **Schema-addressed**: Files organized by schema/table/key\n", + "7. **Direct access**: Navigate and load files without database queries" + ] + }, + { + "cell_type": "markdown", + "id": "rk66adf0kda", + "metadata": {}, + "source": [ + "## Direct File Access: Navigating the Store\n", + "\n", + "A key advantage of `` is **schema-addressed storage**: files are organized in a predictable directory structure that mirrors your database schema. This means you can navigate and access data files directlyβ€”without querying the database.\n", + "\n", + "### Store Directory Structure with Partitioning\n", + "\n", + "This tutorial uses `partition_pattern: '{mouse_id}/{session_date}/{neuron_id}'` to organize files by the complete experimental hierarchy:\n", + "\n", + "```\n", + "{store}/{mouse_id=X}/{session_date=Y}/{neuron_id=Z}/{schema}/{table}/{remaining_key}/{file}.npy\n", + "```\n", + "\n", + "**Without partitioning**, the structure would be:\n", + "```\n", + "{store}/{schema}/{table}/{mouse_id=X}/{session_date=Y}/{neuron_id=Z}/{remaining_key}/{file}.npy\n", + "```\n", + "\n", + "**Partitioning moves the experimental hierarchy to the top** of the path, creating a browsable structure that matches how you think about your data:\n", + "1. Navigate to a subject (mouse_id=100)\n", + "2. Navigate to a session (session_date=2017-05-25)\n", + "3. Navigate to a neuron (neuron_id=0)\n", + "4. See all data for that neuron organized by table\n", + "\n", + "This structure enables:\n", + "- **Direct file access** for external tools (MATLAB, Julia, shell scripts)\n", + "- **Browsable data** organized by subject/session/neuron\n", + "- **Selective backup/sync** - Copy entire subjects, sessions, or individual neurons\n", + "- **Debugging** by inspecting raw files in the experimental hierarchy" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "2kz8efx5jnv", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:44.216137Z", + "iopub.status.busy": "2026-01-14T07:34:44.216023Z", + "iopub.status.idle": "2026-01-14T07:34:44.221325Z", + "shell.execute_reply": "2026-01-14T07:34:44.221104Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Store location: /var/folders/cn/dpwf5t7j3gd8gzyw2r7dhm8r0000gn/T/dj_ephys_2560fwod\n", + "\n", + "Directory structure (one subject shown in full):\n", + "└── mouse_id=0/\n", + " β”œβ”€β”€ session_date=2017-05-15/\n", + " β”‚ └── neuron_id=0/\n", + " β”‚ └── tutorial_electrophysiology_npy/\n", + " β”‚ β”œβ”€β”€ __spikes/\n", + " β”‚ β”‚ β”œβ”€β”€ spike_param_id=1/\n", + " β”‚ β”‚ β”‚ β”œβ”€β”€ spike_times_SI94Y7oe.npy (0.3 KB)\n", + " β”‚ β”‚ β”‚ └── waveforms_OnJ99skw.npy (15.1 KB)\n", + " β”‚ β”‚ └── spike_param_id=2/\n", + " β”‚ β”‚ β”œβ”€β”€ spike_times_uKXtgJLZ.npy (0.3 KB)\n", + " β”‚ β”‚ └── waveforms_WSmyUpSb.npy (15.8 KB)\n", + " β”‚ └── _neuron/\n", + " β”‚ └── activity_yrUmxoXK.npy (7.9 KB)\n", + " └── session_date=2017-05-19/\n", + " └── neuron_id=0/\n", + " └── tutorial_electrophysiology_npy/\n", + " β”œβ”€β”€ __spikes/\n", + " β”‚ β”œβ”€β”€ spike_param_id=1/\n", + " β”‚ β”‚ β”œβ”€β”€ spike_times_ZddKmGQU.npy (0.3 KB)\n", + " β”‚ β”‚ └── waveforms_AaVe3_vZ.npy (14.5 KB)\n", + " β”‚ └── spike_param_id=2/\n", + " β”‚ β”œβ”€β”€ spike_times_jo_ZsD-U.npy (0.3 KB)\n", + " β”‚ └── waveforms_7dthcNVS.npy (12.6 KB)\n", + " └── _neuron/\n", + " └── activity_uZVrtJAe.npy (7.9 KB)\n", + "└── ... and 2 more subjects (mouse_id=5, mouse_id=100)\n" + ] + } + ], + "source": [ + "# Explore the store directory structure\n", + "from pathlib import Path\n", + "\n", + "print(f\"Store location: {STORE_PATH}\\n\")\n", + "print(\"Directory structure (one subject shown in full):\")\n", + "\n", + "def print_tree(directory, prefix=\"\", max_depth=7, current_depth=0, limit_items=True):\n", + " \"\"\"Print directory tree with limited depth.\"\"\"\n", + " if current_depth >= max_depth:\n", + " return\n", + " \n", + " try:\n", + " entries = sorted(Path(directory).iterdir())\n", + " except PermissionError:\n", + " return\n", + " \n", + " dirs = [e for e in entries if e.is_dir()]\n", + " files = [e for e in entries if e.is_file()]\n", + " \n", + " # At depth 0 (root), only show first subject in detail\n", + " if current_depth == 0 and limit_items:\n", + " dirs = dirs[:1] # Only show first mouse_id\n", + " \n", + " # Show directories\n", + " for i, d in enumerate(dirs):\n", + " is_last_dir = (i == len(dirs) - 1) and len(files) == 0\n", + " connector = \"└── \" if is_last_dir else \"β”œβ”€β”€ \"\n", + " print(f\"{prefix}{connector}{d.name}/\")\n", + " \n", + " extension = \" \" if is_last_dir else \"β”‚ \"\n", + " print_tree(d, prefix + extension, max_depth, current_depth + 1, limit_items=False)\n", + " \n", + " if current_depth == 0 and limit_items and len(sorted(Path(directory).iterdir(), key=lambda x: x.is_file())) > 1:\n", + " total_mice = len([e for e in Path(directory).iterdir() if e.is_dir()])\n", + " if total_mice > 1:\n", + " print(f\"{prefix}└── ... and {total_mice - 1} more subjects (mouse_id=5, mouse_id=100)\")\n", + " \n", + " # Show files\n", + " for i, f in enumerate(files):\n", + " is_last = i == len(files) - 1\n", + " connector = \"└── \" if is_last else \"β”œβ”€β”€ \"\n", + " size_kb = f.stat().st_size / 1024\n", + " print(f\"{prefix}{connector}{f.name} ({size_kb:.1f} KB)\")\n", + "\n", + "print_tree(STORE_PATH)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "eqnx7twjnru", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:44.227578Z", + "iopub.status.busy": "2026-01-14T07:34:44.227352Z", + "iopub.status.idle": "2026-01-14T07:34:44.232964Z", + "shell.execute_reply": "2026-01-14T07:34:44.232633Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "NpyRef path (relative): mouse_id=0/session_date=2017-05-15/neuron_id=0/tutorial_electrophysiology_npy/_neuron/activity_yrUmxoXK.npy\n", + "Full path: /var/folders/cn/dpwf5t7j3gd8gzyw2r7dhm8r0000gn/T/dj_ephys_2560fwod/mouse_id=0/session_date=2017-05-15/neuron_id=0/tutorial_electrophysiology_npy/_neuron/activity_yrUmxoXK.npy\n", + "\n", + "Loaded array: shape=(1000,), dtype=float64\n", + "First 5 values: [0.35788741 0.44753156 0.19641299 0.39111449 0.17669518]\n" + ] + } + ], + "source": [ + "# Get the actual path from an NpyRef\n", + "key = {'mouse_id': 0, 'session_date': '2017-05-15', 'neuron_id': 0}\n", + "ref = (Neuron & key).fetch1('activity')\n", + "\n", + "print(f\"NpyRef path (relative): {ref.path}\")\n", + "print(f\"Full path: {Path(STORE_PATH) / ref.path}\\n\")\n", + "\n", + "# Load directly with NumPy - bypass the database!\n", + "direct_path = Path(STORE_PATH) / ref.path\n", + "activity_direct = np.load(direct_path)\n", + "print(f\"Loaded array: shape={activity_direct.shape}, dtype={activity_direct.dtype}\")\n", + "print(f\"First 5 values: {activity_direct[:5]}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "yofvgv01h5h", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:44.234558Z", + "iopub.status.busy": "2026-01-14T07:34:44.234401Z", + "iopub.status.idle": "2026-01-14T07:34:44.239586Z", + "shell.execute_reply": "2026-01-14T07:34:44.239275Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "All .npy files in store (25 total):\n", + "\n", + " mouse_id=0/session_date=2017-05-15/neuron_id=0/tutorial_electrophysiology_npy/__spikes/spike_param_id=1/spike_times_SI94Y7oe.npy (0.3 KB)\n", + " mouse_id=0/session_date=2017-05-15/neuron_id=0/tutorial_electrophysiology_npy/__spikes/spike_param_id=1/waveforms_OnJ99skw.npy (15.1 KB)\n", + " mouse_id=0/session_date=2017-05-15/neuron_id=0/tutorial_electrophysiology_npy/__spikes/spike_param_id=2/spike_times_uKXtgJLZ.npy (0.3 KB)\n", + " mouse_id=0/session_date=2017-05-15/neuron_id=0/tutorial_electrophysiology_npy/__spikes/spike_param_id=2/waveforms_WSmyUpSb.npy (15.8 KB)\n", + " mouse_id=0/session_date=2017-05-15/neuron_id=0/tutorial_electrophysiology_npy/_neuron/activity_yrUmxoXK.npy (7.9 KB)\n", + " mouse_id=0/session_date=2017-05-19/neuron_id=0/tutorial_electrophysiology_npy/__spikes/spike_param_id=1/spike_times_ZddKmGQU.npy (0.3 KB)\n", + " mouse_id=0/session_date=2017-05-19/neuron_id=0/tutorial_electrophysiology_npy/__spikes/spike_param_id=1/waveforms_AaVe3_vZ.npy (14.5 KB)\n", + " mouse_id=0/session_date=2017-05-19/neuron_id=0/tutorial_electrophysiology_npy/__spikes/spike_param_id=2/spike_times_jo_ZsD-U.npy (0.3 KB)\n", + " ... and 17 more files\n" + ] + } + ], + "source": [ + "# Find all .npy files for a specific mouse using filesystem tools\n", + "# This works without any database query!\n", + "\n", + "store_path = Path(STORE_PATH)\n", + "all_npy_files = list(store_path.rglob(\"*.npy\"))\n", + "\n", + "print(f\"All .npy files in store ({len(all_npy_files)} total):\\n\")\n", + "for f in sorted(all_npy_files)[:8]:\n", + " rel_path = f.relative_to(STORE_PATH)\n", + " size_kb = f.stat().st_size / 1024\n", + " print(f\" {rel_path} ({size_kb:.1f} KB)\")\n", + "if len(all_npy_files) > 8:\n", + " print(f\" ... and {len(all_npy_files) - 8} more files\")" + ] + }, + { + "cell_type": "markdown", + "id": "n4nfl73erra", + "metadata": {}, + "source": [ + "### Use Cases for Direct Access\n", + "\n", + "**External tools**: Load data in MATLAB, Julia, or R without DataJoint:\n", + "```matlab\n", + "% MATLAB - use the path from NpyRef or navigate the store\n", + "activity = readNPY('store/schema/table/key_hash/activity.npy');\n", + "```\n", + "\n", + "**Shell scripting**: Process files with command-line tools:\n", + "```bash\n", + "# List all .npy files in store\n", + "find $STORE -name \"*.npy\"\n", + "\n", + "# Backup the entire store\n", + "rsync -av $STORE/ backup/\n", + "```\n", + "\n", + "**Disaster recovery**: If the database is lost, the store contains all array data in standard `.npy` format. The path structure and JSON metadata in the database can help reconstruct mappings.\n", + "\n", + "### Publishing to Data Repositories\n", + "\n", + "Many scientific data repositories accept **structured file-folder hierarchies**β€”exactly what `` provides. The schema-addressed storage format makes your data publication-ready:\n", + "\n", + "| Repository | Accepted Formats | Schema-Addressed Benefit |\n", + "|------------|-----------------|-------------------------|\n", + "| [DANDI](https://dandiarchive.org) | NWB, folders | Export subject/session hierarchy |\n", + "| [OpenNeuro](https://openneuro.org) | BIDS folders | Map to BIDS-like structure |\n", + "| [Figshare](https://figshare.com) | Any files/folders | Upload store directly |\n", + "| [Zenodo](https://zenodo.org) | Any files/folders | Archive with DOI |\n", + "| [OSF](https://osf.io) | Any files/folders | Version-controlled sharing |\n", + "\n", + "**Export for publication**:\n", + "```python\n", + "# Export one subject's data for publication\n", + "subject_dir = Path(STORE_PATH) / \"schema\" / \"table\" / \"objects\" / \"mouse_id=100\"\n", + "\n", + "# Copy to publication directory\n", + "import shutil\n", + "shutil.copytree(subject_dir, \"publication_data/mouse_100/\")\n", + "\n", + "# The resulting structure is self-documenting:\n", + "# publication_data/\n", + "# mouse_100/\n", + "# session_date=2017-05-25/\n", + "# neuron_id=0/\n", + "# activity_xyz.npy\n", + "# spike_times_abc.npy\n", + "# waveforms_def.npy\n", + "```\n", + "\n", + "**Key advantages for publishing**:\n", + "\n", + "1. **Self-documenting paths**: Primary key values are in folder namesβ€”no lookup table needed\n", + "2. **Standard format**: `.npy` files are readable by NumPy, MATLAB, Julia, R, and most analysis tools\n", + "3. **Selective export**: Copy only specific subjects, sessions, or tables\n", + "4. **Reproducibility**: Published data has the same structure as your working pipeline\n", + "5. **Metadata preservation**: Path encodes experimental metadata (subject, session, parameters)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "cell-32", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:34:44.241060Z", + "iopub.status.busy": "2026-01-14T07:34:44.240920Z", + "iopub.status.idle": "2026-01-14T07:34:44.272594Z", + "shell.execute_reply": "2026-01-14T07:34:44.272243Z" + } + }, + "outputs": [], + "source": [ + "# Cleanup: drop schema and remove temporary store\n", + "schema.drop(prompt=False)\n", + "import shutil\n", + "shutil.rmtree(STORE_PATH, ignore_errors=True)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/src/tutorials/examples/blob-detection.ipynb b/src/tutorials/examples/blob-detection.ipynb new file mode 100644 index 00000000..5c9dd268 --- /dev/null +++ b/src/tutorials/examples/blob-detection.ipynb @@ -0,0 +1,1653 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Blob Detection Pipeline\n", + "\n", + "This tutorial introduces DataJoint through a real image analysis pipeline that detects bright blobs in astronomical and biological images. By the end, you'll understand:\n", + "\n", + "- **Schemas** β€” Namespaces that group related tables\n", + "- **Table types** β€” Manual, Lookup, and Computed tables\n", + "- **Dependencies** β€” How tables relate through foreign keys\n", + "- **Computation** β€” Automatic population of derived data\n", + "- **Master-Part** β€” Atomic insertion of hierarchical results\n", + "\n", + "## The Problem\n", + "\n", + "We have images and want to detect bright spots (blobs) in them. Different detection parameters work better for different images, so we need to:\n", + "\n", + "1. Store our images\n", + "2. Define parameter sets to try\n", + "3. Run detection for each image Γ— parameter combination\n", + "4. Store and visualize results\n", + "5. Select the best parameters for each image\n", + "\n", + "This is a **computational workflow** β€” a series of steps where each step depends on previous results. DataJoint makes these workflows reproducible and manageable." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setup\n", + "\n", + "First, let's import our tools and create a schema (database namespace) for this project." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:03.429347Z", + "iopub.status.busy": "2026-01-14T07:35:03.429219Z", + "iopub.status.idle": "2026-01-14T07:35:04.646297Z", + "shell.execute_reply": "2026-01-14T07:35:04.645959Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2026-01-14 01:35:04,638][INFO]: DataJoint 2.0.0a22 connected to root@127.0.0.1:3306\n" + ] + } + ], + "source": [ + "import datajoint as dj\n", + "import matplotlib.pyplot as plt\n", + "from skimage import data\n", + "from skimage.feature import blob_doh\n", + "from skimage.color import rgb2gray\n", + "\n", + "# Create a schema - this is our database namespace\n", + "schema = dj.Schema('tutorial_blobs')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Manual Tables: Storing Raw Data\n", + "\n", + "A **Manual table** stores data that users enter directly β€” it's the starting point of your pipeline. Here we define an `Image` table to store our sample images.\n", + "\n", + "The `definition` string specifies:\n", + "- **Primary key** (above `---`): attributes that uniquely identify each row\n", + "- **Secondary attributes** (below `---`): additional data for each row" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:04.663708Z", + "iopub.status.busy": "2026-01-14T07:35:04.663425Z", + "iopub.status.idle": "2026-01-14T07:35:04.695940Z", + "shell.execute_reply": "2026-01-14T07:35:04.695620Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class Image(dj.Manual):\n", + " definition = \"\"\"\n", + " # Images for blob detection\n", + " image_id : uint8\n", + " ---\n", + " image_name : varchar(100)\n", + " image : # serialized numpy array\n", + " \"\"\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's insert two sample images from scikit-image:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:04.697609Z", + "iopub.status.busy": "2026-01-14T07:35:04.697510Z", + "iopub.status.idle": "2026-01-14T07:35:05.302043Z", + "shell.execute_reply": "2026-01-14T07:35:05.301711Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " Images for blob detection\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

image_id

\n", + " \n", + "
\n", + "

image_name

\n", + " \n", + "
\n", + "

image

\n", + " serialized numpy array\n", + "
1Hubble Deep Field<blob>
2Human Mitosis<blob>
\n", + " \n", + "

Total: 2

\n", + " " + ], + "text/plain": [ + "*image_id image_name image \n", + "+----------+ +------------+ +--------+\n", + "1 Hubble Deep Fi \n", + "2 Human Mitosis \n", + " (Total: 2)" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Insert sample images\n", + "Image.insert([\n", + " {'image_id': 1, 'image_name': 'Hubble Deep Field', \n", + " 'image': rgb2gray(data.hubble_deep_field())},\n", + " {'image_id': 2, 'image_name': 'Human Mitosis', \n", + " 'image': data.human_mitosis() / 255.0},\n", + "], skip_duplicates=True)\n", + "\n", + "Image()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:05.303554Z", + "iopub.status.busy": "2026-01-14T07:35:05.303424Z", + "iopub.status.idle": "2026-01-14T07:35:05.557283Z", + "shell.execute_reply": "2026-01-14T07:35:05.556955Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA9gAAAH6CAYAAAD80eRlAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzsvQfUvUtV33/utfdYEbEXkN57r9JRBBQsCCoWiIplmViWLYlGY2IFzYpGUcECggiKCIjSLr1IFbwCImCPiT3q/a/vk/t5/5/fZmaeec77/q7AffZaZ51znjJlz56Z/d17z8wFl1xyySWHnXbaaaeddtppp5122mmnnXba6VR04ele32mnnXbaaaeddtppp5122mmnnXaAvdNOO+2000477bTTTjvttNNOZ0S7B3unnXbaaaeddtppp5122mmnnc6AdoC900477bTTTjvttNNOO+20005nQDvA3mmnnXbaaaeddtppp5122mmnM6AdYO+000477bTTTjvttNNOO+200xnQDrB32mmnnXbaaaeddtppp5122ukMaAfYO+2000477bTTTjvttNNOO+10BrQD7J122mmnnXbaaaeddtppp512OgPaAfZOO+2000477bTTTu909FM/9VOHCy644PCiF72oef/ud7/74RM/8RMP7870xje+ceFBPt/+7d/efObBD37wyTOm29zmNssH+tu//dsljWc+85nntczJo5Zlp50uT7QD7J122mmnnXbaaaeddnonpg/6oA9aDA7/8i//cs71v/7rvz780i/90uGDP/iD3+GdRzziEcvHAPs7vuM7zjvA/pIv+ZLD8573vPOax047vTPTDrB32mmnnXbaaaeddtrpnZg+53M+5/CmN73p8PSnP/2c67/wC79w+Od//ufDPe95z3d452pXu9ryuazpYz/2Yw83uclNLvN8d9rpnYV2gL3TTjvttNNOO+2007tNOHU8vZVqiDVhzK94xSsO973vfQ8f8iEfcviwD/uww9d+7dce/umf/unwute97nDnO9958RwnDP17v/d7z0nv7//+7w9f93Vfd7jOda5z8u5Nb3rTw6/8yq80837Ywx52+Jmf+ZnDVa961cP7v//7H6597WsfnvSkJ03X7SpXucrhZje72eEnf/Inz7me//e+972XMlRyiHh485Ef+ZHL73ixCSn/oi/6opPnn/3sZx9uf/vbL3VOGZPfk5/85HPSjBf867/+6w+f9EmfdHjf933fpd43uMENDo95zGPegbemZzzjGUtZPvzDP/zwfu/3foeP//iPP3z2Z3/2kt5OO7270Q6wd9ppp5122mmnnXZ6p6V4aAN66+eSSy45ddr3u9/9FrD7uMc97vClX/qlh//23/7b4eEPf/jhMz/zMw93u9vdDo9//OMPt7vd7Q7f+I3fePjlX/7lk/f+4R/+4fAXf/EXC9h8whOesADMW9ziFgvYfdSjHvUO+QSo/siP/MjhO7/zO5e8Akw/67M+63DxxRdPl/WLv/iLl7z+8i//cvkfI8Bzn/vc5foaXfGKVzw85SlPOUknIdz5fOu3futy7bd/+7eXev7VX/3V4Sd+4ieW+gRo3+Me91i85FAMEI985CMPX/VVX7WkF6NBDBR//ud/3s074D68fO/3fu/FIJD3vud7vufwAR/wAYd//Md/nK7/Tju9q9B7/msXYKeddtppp5122mmnnXo0Cjf+hE/4hFMx7iEPecgCGkN3uMMdDk996lMXIBwwHQAciuc13uaf+7mfWwB0KB7j//k//+c5RoB4fwN+f+AHfuDwhV/4hefk83d/93eHpz3taQtoDV3vetc7fMzHfMzhF3/xFw//7t/9u2ljwFd/9VcfHv3oRx8e+tCHLkA4nuSUL6B9RO/zPu9zuP71r98N4U4ZPvRDP3RZn/2BH/iBJ5vIxUMfI0Lyjlf6Oc95zuFOd7rTYoSAAp5H9OIXv3jx+H/f933fYsyAHvCAB0zVe6ed3tVo92DvtNNOO+2000477fROS/EIv/CFL3yHTzzGp6WASFNCuAMk73KXu5xce8/3fM/Dp37qpy5roE3ZXOzmN7/5AkjzzHu913stoPc1r3nNO+Rz29ve9gRch65whSscPuqjPuod0hxR8om3OF7gePDDlwc96EGn3rH7b/7mbw7Pf/7zD/e5z31OwHXoPd7jPQ5f8AVfcHjLW96yeMtDN7rRjQ6//uu/vgDygPEYDtYoID3e6xgzfvqnf3qT136nnd4VaQfYO+2000477bTTTju901JAb9b51k9r3fFWSqi2KUAw64+zvrhejxcWioc7Xt0rXelKh5/92Z9dwq0D+nNklp+Dsva45VWeAaimhHe/5CUvOfzH//gfD3/6p396zhrqYyle94TbJ4y8UrzsIULAf+iHfmgJl0+oeowG4V/C6V//+td30/+UT/mUxXsfg0I87/mfzw/+4A+euuw77fTOSDvA3mmnnXbaaaeddtrpXZ4AxVkfbRqtDz6WAqoTnp31yQGYCbkO6K95nzXFY54Nz7KW+453vOPh4z7u406dZkLDL7zwwsPb3va2d7j31re+dfn+iI/4iOU766azSdprX/vaw9vf/vZlPfZFF120rNUe0S1vecvDr/7qry5rvPN8NoT7mq/5msPP//zPn7r8O+30zkY7wN5pp5122mmnnXba6V2eEnYdkJ2dwU2tnb1PSwnLjlfb4dkBnOcjr0rf8i3fsgDa7GK+heIxD1WveUDzjW9848Ur73s5czuGhKzZvvKVr9zkdzzo97///ZcQ8pkdwRN2nrx+9Ed/dPkfb/xOO7270b7J2U477bTTTjvttNNO7/IUsPv5n//5yxrlhCBnQ60XvOAFy6ZgZ01Zux1A+pVf+ZXL2uU//MM/PHzXd33XEmY9Cpc+C0od89lKWQOeTeFiBMiGbAnvjmc6x5B993d/9+IRT9h3NjWL8eARj3jE4ZWvfOWyoziGhIDj1P1a17rW4vnOevPsJB6PdELrW/RjP/ZjyzFd2Qwtx3MlhJ7jxrKx3E47vbvRDrB32mmnnXbaaaeddnq3oO///u9fvnNu9V//9V8vR09lB/CAyLOkbC72J3/yJwt4DFj85E/+5GXjr2wIlhDqd1bKJmzf8A3fcLjnPe+5hLM/8IEPXM4Nv/Wtb72A4G/7tm9bvNLxXsdA8cQnPvGcjeDCz1zLcWbxWGcNenZM/+Zv/ubhJmfZnT1px8ufjdSucY1rLOlkR/Kddnp3owsuOYtDBHfaaaeddtppp5122mmnnXba6XJO+xrsnXbaaaeddtppp5122mmnnXY6A9oB9k477bTTTjvttNNOO+200047nQHtAHunnXbaaaeddtppp5122mmnnc6AdoC900477bTTTjvttNNOO+20005nQDvA3mmnnXbaaaeddtppp5122mmnM6AdYO+000477bTTTjvttNNOO+200xnQDrB32mmnnXbaaaeddtppp5122ukM6D3PIpGddtppp5122umdm/7lX/7lcMEFF7zD9UsuueToNP/5n/95+fz1X//14c/+7M8O//f//t+Tz3u8x3sc3ud93udw4YX/z5af31e4whUO7/u+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fQrQmYiYoAOwaDojRq97RzV0NfQA3/xwiJkHyAC8Mb4wuDjkzGjtCvjW+PT6ou6hoy6NblJ1MTT5nHZRP8aqp5UD8Il2G10+c8XLrj2Teko4vOF/U939XJBNeyG+N23Rg60E27u67wHXOYbTOHzEiD4T8TyK2D1npHwCpEZwZxuP+DKfXX3GGHhfLmNhFkJBHM+ZxqvjRKeIBrv37U4AMNuoM8iIt3PJ75AP5g+yO51Qj2Q2TB7tnDb3AM5TZeLIabejzn/mtBFdedpIqPN6Jxurvs02PsLbjtGqrB1/dvUJiOkjPx6EiJ41av/pn/7pLz7jMz7jJlc4Gz/84Q/fUsL5H12DQxGnnhkPnINBBtFqT/EqMnumv0ff+XcPvexecYH3r//6r9/62kP7dKRaTrOO7rVntqH9oxwANmuAOthtPPYd3vG968NR3450DO/C7zP0ptcemQkXXXTRRRdddNFFF1100UUXXXTRktYbGy666KKLLrrooosuuuiiiy666KKH6ALYF1100UUXXXTRRRdddNFFF130DHQB7Isuuuiiiy666KKLLrrooosuega6APZFF1100UUXXXTRRRdddNFFFz0DXQD7oosuuuiiiy666KKLLrrooouegS6AfdFFF1100UUXXXTRRRdddNFFz0AXwL7ooosuuuiiiy666KKLLrroomegC2BfdNFFF1100UUXXXTRRRdddNEz0AWwL7rooosuuuiiiy666KKLLrroxavT/wuCMrFkczxAyQAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Visualize the images\n", + "fig, axes = plt.subplots(1, 2, figsize=(10, 5))\n", + "for ax, row in zip(axes, Image()):\n", + " ax.imshow(row['image'], cmap='gray_r')\n", + " ax.set_title(row['image_name'])\n", + " ax.axis('off')\n", + "plt.tight_layout()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Lookup Tables: Parameter Sets\n", + "\n", + "A **Lookup table** stores reference data that doesn't change often β€” things like experimental protocols, parameter configurations, or categorical options.\n", + "\n", + "For blob detection, we'll try different parameter combinations to find what works best for each image type." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:05.560513Z", + "iopub.status.busy": "2026-01-14T07:35:05.560367Z", + "iopub.status.idle": "2026-01-14T07:35:05.594274Z", + "shell.execute_reply": "2026-01-14T07:35:05.593916Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " Blob detection parameter sets\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

params_id

\n", + " \n", + "
\n", + "

min_sigma

\n", + " minimum blob size\n", + "
\n", + "

max_sigma

\n", + " maximum blob size\n", + "
\n", + "

threshold

\n", + " detection sensitivity\n", + "
12.06.00.001
23.08.00.002
34.020.00.01
\n", + " \n", + "

Total: 3

\n", + " " + ], + "text/plain": [ + "*params_id min_sigma max_sigma threshold \n", + "+-----------+ +-----------+ +-----------+ +-----------+\n", + "1 2.0 6.0 0.001 \n", + "2 3.0 8.0 0.002 \n", + "3 4.0 20.0 0.01 \n", + " (Total: 3)" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "@schema\n", + "class DetectionParams(dj.Lookup):\n", + " definition = \"\"\"\n", + " # Blob detection parameter sets\n", + " params_id : uint8\n", + " ---\n", + " min_sigma : float32 # minimum blob size\n", + " max_sigma : float32 # maximum blob size \n", + " threshold : float32 # detection sensitivity\n", + " \"\"\"\n", + " \n", + " # Pre-populate with parameter sets to try\n", + " contents = [\n", + " {'params_id': 1, 'min_sigma': 2.0, 'max_sigma': 6.0, 'threshold': 0.001},\n", + " {'params_id': 2, 'min_sigma': 3.0, 'max_sigma': 8.0, 'threshold': 0.002},\n", + " {'params_id': 3, 'min_sigma': 4.0, 'max_sigma': 20.0, 'threshold': 0.01},\n", + " ]\n", + "\n", + "DetectionParams()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Computed Tables: Automatic Processing\n", + "\n", + "A **Computed table** automatically derives data from other tables. You define:\n", + "\n", + "1. **Dependencies** (using `->`) β€” which tables provide input\n", + "2. **`make()` method** β€” how to compute results for one input combination\n", + "\n", + "DataJoint then handles:\n", + "- Determining what needs to be computed\n", + "- Running computations (optionally in parallel)\n", + "- Tracking what's done vs. pending\n", + "\n", + "### Master-Part Structure\n", + "\n", + "Our detection produces multiple blobs per image. We use a **master-part** structure:\n", + "- **Master** (`Detection`): One row per job, stores summary (blob count)\n", + "- **Part** (`Detection.Blob`): One row per blob, stores details (x, y, radius)\n", + "\n", + "Both are inserted atomically β€” if anything fails, the whole transaction rolls back." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:05.595789Z", + "iopub.status.busy": "2026-01-14T07:35:05.595652Z", + "iopub.status.idle": "2026-01-14T07:35:05.672742Z", + "shell.execute_reply": "2026-01-14T07:35:05.672442Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class Detection(dj.Computed):\n", + " definition = \"\"\"\n", + " # Blob detection results\n", + " -> Image # depends on Image\n", + " -> DetectionParams # depends on DetectionParams\n", + " ---\n", + " num_blobs : uint16 # number of blobs detected\n", + " \"\"\"\n", + " \n", + " class Blob(dj.Part):\n", + " definition = \"\"\"\n", + " # Individual detected blobs\n", + " -> master\n", + " blob_idx : uint16\n", + " ---\n", + " x : float32 # x coordinate\n", + " y : float32 # y coordinate \n", + " radius : float32 # blob radius\n", + " \"\"\"\n", + " \n", + " def make(self, key):\n", + " # Fetch the image and parameters\n", + " img = (Image & key).fetch1('image')\n", + " params = (DetectionParams & key).fetch1()\n", + " \n", + " # Run blob detection\n", + " blobs = blob_doh(\n", + " img,\n", + " min_sigma=params['min_sigma'],\n", + " max_sigma=params['max_sigma'],\n", + " threshold=params['threshold']\n", + " )\n", + " \n", + " # Insert master row\n", + " self.insert1({**key, 'num_blobs': len(blobs)})\n", + " \n", + " # Insert part rows (all blobs for this detection)\n", + " self.Blob.insert([\n", + " {**key, 'blob_idx': i, 'x': x, 'y': y, 'radius': r}\n", + " for i, (x, y, r) in enumerate(blobs)\n", + " ])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Viewing the Schema\n", + "\n", + "DataJoint can visualize the relationships between tables:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:05.674424Z", + "iopub.status.busy": "2026-01-14T07:35:05.674295Z", + "iopub.status.idle": "2026-01-14T07:35:05.800011Z", + "shell.execute_reply": "2026-01-14T07:35:05.799605Z" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "DetectionParams\n", + "\n", + "\n", + "DetectionParams\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Detection\n", + "\n", + "\n", + "Detection\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "DetectionParams->Detection\n", + "\n", + "\n", + "\n", + "\n", + "Detection.Blob\n", + "\n", + "\n", + "Detection.Blob\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Detection->Detection.Blob\n", + "\n", + "\n", + "\n", + "\n", + "Image\n", + "\n", + "\n", + "Image\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Image->Detection\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dj.Diagram(schema)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The diagram shows:\n", + "- **Green** = Manual tables (user-entered data)\n", + "- **Gray** = Lookup tables (reference data)\n", + "- **Red** = Computed tables (derived data)\n", + "- **Edges** = Dependencies (foreign keys), always flow top-to-bottom" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Running the Pipeline\n", + "\n", + "Call `populate()` to run all pending computations. DataJoint automatically determines what needs to be computed: every combination of `Image` Γ— `DetectionParams` that doesn't already have a `Detection` result." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:05.801754Z", + "iopub.status.busy": "2026-01-14T07:35:05.801603Z", + "iopub.status.idle": "2026-01-14T07:35:08.008842Z", + "shell.execute_reply": "2026-01-14T07:35:08.008403Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + "Detection: 0%| | 0/6 [00:00\n", + " .Table{\n", + " border-collapse:collapse;\n", + " }\n", + " .Table th{\n", + " background: #A0A0A0; color: #ffffff; padding:2px 4px; border:#f0e0e0 1px solid;\n", + " font-weight: normal; font-family: monospace; font-size: 75%; text-align: center;\n", + " }\n", + " .Table th p{\n", + " margin: 0;\n", + " }\n", + " .Table td{\n", + " padding:2px 4px; border:#f0e0e0 1px solid; font-size: 75%;\n", + " }\n", + " .Table tr:nth-child(odd){\n", + " background: #ffffff;\n", + " color: #000000;\n", + " }\n", + " .Table tr:nth-child(even){\n", + " background: #f3f1ff;\n", + " color: #000000;\n", + " }\n", + " /* Tooltip container */\n", + " .djtooltip {\n", + " }\n", + " /* Tooltip text */\n", + " .djtooltip .djtooltiptext {\n", + " visibility: hidden;\n", + " width: 120px;\n", + " background-color: black;\n", + " color: #fff;\n", + " text-align: center;\n", + " padding: 5px 0;\n", + " border-radius: 6px;\n", + " /* Position the tooltip text - see examples below! */\n", + " position: absolute;\n", + " z-index: 1;\n", + " }\n", + " #primary {\n", + " font-weight: bold;\n", + " color: black;\n", + " }\n", + " #nonprimary {\n", + " font-weight: normal;\n", + " color: white;\n", + " }\n", + "\n", + " /* Show the tooltip text when you mouse over the tooltip container */\n", + " .djtooltip:hover .djtooltiptext {\n", + " visibility: visible;\n", + " }\n", + "\n", + " /* Dark mode support */\n", + " @media (prefers-color-scheme: dark) {\n", + " .Table th{\n", + " background: #4a4a4a; color: #ffffff; border:#555555 1px solid; text-align: center;\n", + " }\n", + " .Table td{\n", + " border:#555555 1px solid;\n", + " }\n", + " .Table tr:nth-child(odd){\n", + " background: #2d2d2d;\n", + " color: #e0e0e0;\n", + " }\n", + " .Table tr:nth-child(even){\n", + " background: #3d3d3d;\n", + " color: #e0e0e0;\n", + " }\n", + " .djtooltip .djtooltiptext {\n", + " background-color: #555555;\n", + " color: #ffffff;\n", + " }\n", + " #primary {\n", + " color: #bd93f9;\n", + " }\n", + " #nonprimary {\n", + " color: #e0e0e0;\n", + " }\n", + " }\n", + " \n", + " \n", + " Blob detection results\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

image_id

\n", + " \n", + "
\n", + "

params_id

\n", + " \n", + "
\n", + "

num_blobs

\n", + " number of blobs detected\n", + "
111921
12971
13229
21364
22232
2311
\n", + " \n", + "

Total: 6

\n", + " " + ], + "text/plain": [ + "*image_id *params_id num_blobs \n", + "+----------+ +-----------+ +-----------+\n", + "1 1 1921 \n", + "1 2 971 \n", + "1 3 229 \n", + "2 1 364 \n", + "2 2 232 \n", + "2 3 11 \n", + " (Total: 6)" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# View results summary\n", + "Detection()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We computed 6 results: 2 images Γ— 3 parameter sets. Each shows how many blobs were detected.\n", + "\n", + "## Visualizing Results\n", + "\n", + "Let's see how different parameters affect detection:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:08.016865Z", + "iopub.status.busy": "2026-01-14T07:35:08.016757Z", + "iopub.status.idle": "2026-01-14T07:35:12.852052Z", + "shell.execute_reply": "2026-01-14T07:35:12.851650Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "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1UE2VthYYZNNNtlkY8X/yD5X2GTT0clWStlUrVSzZk3J60SFhyo7zETcSkxATi8mJtgmzZ07V5Q39erVi1zDz0zi382aNTtM6UNi/ii+l54/lSVVP1ZicnYmS1fvJD6f1fmsiiGlTp06iQcX8zH169fviM9l8nbme1KvqLVr1+LQoUPioXSixDZ++umn0v+qVORr1arVEdtjk0022XQyycYKGytssskmm2yssM8VNtlEshOd21StdMYZZ4gHz7/+9S8JGXvuuefw9ddfH3YdK9XdcMMNUi2O3z/66KOSNJyeVkoM5bv33ntFUcJk6M888wzuuuuuSt9L5RHD+84991xMmjRJknezWh4r9lHpcjSiEoYKra1bt0pi8wsvvBDvv/++hCqql9WDDz6IOXPm4I477hAlG5OXjx8/Hr/5zW/ke4bGsWLf1VdfjbFjx0pI34IFC8RriYnXlTwej9zDsMfFixdLcnSGKR4tdK+qxLYxqftll12G+fPnY9OmTfjmm29w/fXXi8LMSi1atJBE7DfddJO0h15eN954Y0RRaJNNNtl0ssjGChsrbLLJJptsrLDPFTbZRLKVUjZVK9H7hhXcqIxi3igqR+6///7DrmNVPHo99e/fX6rDMeyMJcJNooKH3lRU2FDhQmXOzTffXOl76ZVF5Q+fRyUMlUSsakflVK1atY7aZiqGGN5Gb6XbbrtNPLbY7ssvvzxyTfv27fHdd9+JMoqeUPSMeuSRR6LC4t544w1p83333ScKn9GjR4uyp379+pFrmEeLCi4+m0o0KoBYra86qG7dulLRjwooVgps27atKPFSUlKilH0msc1sH6v2sbIgxzczM7Na2mOTTTbZdCSyscLGCptsssmmHyMbK2yssOnXQQ5mOz/djbDJpl8Dvfnmm7j77rvt8DibbLLJJptsrLDJJptsssk+V9hkk+0pZZNNNtlkk0022WSTTTbZZJNNNtlk0+kgO3zPJptssskmm2yyySabbLLJJptsssmmU052+J5NNtlkk0022WSTTTbZZJNNNtlkk02nnGxPKZtssskmm2yyySabbLLJJptssskmm0452Uopm2z6mRIrC7Lq4A8//HDEa6ZPny7XHDp0qMrPbdiwIZ588slqaqVNNtlkk02nkijzx40bd0LYYaUzzjhDCnXYZJNNNtn0yyAbK2z6KZGtlPqV0rXX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S5YsWbJkyZIlS5YsWTrhZJVSlixZsmTJkiVLlixZsmTJkiVLlk44WaWUJUuWLFmyZMmSJUuWLFmyZMmSpRNOVillyZIlS5YsWbJkyZIlS5YsWbJk6YSTVUpZsnSKkMfjwbvvvhv3+02bNsk1ixcvTrrNoUOH4v7776+hHlqyZMmSpW+aLFZYsmTJkiWTWrVqhUceeeSYsMNN3/ve93DRRRfZgbZUI2SVUpYijIXMiD+pqalo06YNHnzwQRw5cuRbMULjxo3DqFGjUL9+/Worbky644470LZtW2RmZqJBgwa48MIL8dVXX1W6buLEiejXr59cx2decsklMdvbv38/mjVrJn06ePDgUfXJkiVLlk4UfZuxoqKiAj/5yU9w2mmnITs7G02aNMENN9yAHTt2VKudAwcO4Pvf/z46duyIrKwstGjRAvfddx8OHToUdd3YsWPlu4yMDDRu3BjXX3991LOWLFmCq6++Gs2bNxcs6dy5M/71r3/V2PtasmTJ0omibzN2kH7zm9+gU6dOgh1169bFOeecg7lz51a7nf/9739iMM7NzY0rG/zhD3/AWWedJfhSp06dGnoDS5a+WbJKKUsROvfcc7Fz505s2LAB/+///T889thjAhhHQ6FQCH6//6QZXYLegAED8Oc///mY2unduzeee+45rFq1Ch9//LG858iRIxEIBCLXvPPOOyJc3HTTTSJUzJo1C9dcc03M9m655RZ07979mPpkyZIlSyeSvq1YUVxcjIULF+KXv/yl/E9jxpo1a0R5VB2iYok/f//737Fs2TI8//zz+Oijj4TfmzRs2DC8+eabWL16teDG+vXrcdlll0W+X7BggRg/Xn75ZaxYsQK/+MUv8LOf/Qz//e9/a+ydLVmyZOlE0bcVO0gdOnQQ3kyeP3PmTPFMonywd+/eauMQx+nnP/953GvKy8tx+eWX46677qqBnluydJJQyJKlUCh04403hi688MKosbj11ltD+fn58vtLL70U6t27dygnJyfUqFGj0NVXXx3avXt35NpPP/00xOX00UcfyXWpqamhadOmhdatWxcaO3ZsqGHDhqHs7OxQnz59QlOmTIl6TsuWLUO///3vQ9dff71c06JFi9C7774b2rNnj9zLz7p16xaaN29e5J5NmzaFzj///FCdOnVCWVlZoS5duoQmTpxY5Vxu3LhR+rlo0aIa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xkwjjAvRqf06fPFYbnK/KPHECm68Bw1CZN48HDar1uhYsX/AAGRt3IiGujqk5ed/jhU9emBQfb1ESTElOkiem2uvNSpvfve7RmWtBQuaYIW0ybZtiGzahI2FhXFYQQ/53r17BbRTxgpbnzpixfjxCG3diihT1U2jsY4VOR99JCTDx/r1azJXfaxIASsGD+ZOVLgFnbCCqfaZn32GKrOSpnUuVvpk+g95jGIxmeeqCpZan1REBklrpbIQScipEDKqKAnxsSIFrOD+i3s/kqtrSr8dK6qOHkXt3Lk4wj0CcWPTJk+s6MTCJ8Q0szhCS2CFrmi4YYWqrkZpFlawuEV+PoILFlj364YVShkuWr1aOCtjw4ef/lhhRhdwT0PDkR0rKGrPw+fXsaJnz56S2qeiA3TOFmXscsIKYgGvtXHjxjbFCvYB71P0Bwes4Gdq/PtY0Xys0PvES6/gWHPTq5LFCl+vaF29Qp9PrlhRVSVzl9Fw7GP2qxdWMKpS32ufNlgRi9dJk8EKGl6/CL2ixarv+eKLL7744osvvvjiiy+++OKLL7744kubR0r54osvvvjiiy+++OKLL7744osvvvjiS7LiG6V88cUXX3zxxRdffPHFF1988cUXX3xpc/GNUr744osvvvjiiy+++OKLL7744osvvrS5+EYpX3zxxRdffPHFF1988cUXX3zxxRdf2lx8o5Qvvvjiiy+++OKLL7744osvvvjiiy9tLr5RyhdffPHFF1988cUXX3zxxRdffPHFlzYX3yjliy+++OKLL7744osvvvjiiy+++OJLm4tvlPLFF1988cUXX3zxxRdffPHFF1988aXNxTdK+eKLL7744osvvvjiiy+++OKLL774graW/w/2Brvi0kYj+QAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, axes = plt.subplots(2, 3, figsize=(12, 8))\n", + "\n", + "for ax, key in zip(axes.ravel(),\n", + " Detection.keys(order_by='image_id, params_id')):\n", + " # Get image and detection info in one fetch\n", + " name, img, num_blobs = (Detection * Image & key).fetch1(\n", + " 'image_name', 'image', 'num_blobs')\n", + " \n", + " ax.imshow(img, cmap='gray_r')\n", + " \n", + " # Get all blob coordinates in one query\n", + " x, y, r = (Detection.Blob & key).to_arrays('x', 'y', 'radius')\n", + " for xi, yi, ri in zip(x, y, r):\n", + " circle = plt.Circle((yi, xi), ri * 1.2,\n", + " color='red', fill=False, alpha=0.6)\n", + " ax.add_patch(circle)\n", + " \n", + " ax.set_title(f\"{name}\\nParams {key['params_id']}: {num_blobs} blobs\",\n", + " fontsize=10)\n", + " ax.axis('off')\n", + "\n", + "plt.tight_layout()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Querying Results\n", + "\n", + "DataJoint's query language makes it easy to explore results:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:12.858239Z", + "iopub.status.busy": "2026-01-14T07:35:12.857977Z", + "iopub.status.idle": "2026-01-14T07:35:12.865735Z", + "shell.execute_reply": "2026-01-14T07:35:12.865451Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " Blob detection results\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

image_id

\n", + " \n", + "
\n", + "

params_id

\n", + " \n", + "
\n", + "

num_blobs

\n", + " number of blobs detected\n", + "
13229
22232
2311
\n", + " \n", + "

Total: 3

\n", + " " + ], + "text/plain": [ + "*image_id *params_id num_blobs \n", + "+----------+ +-----------+ +-----------+\n", + "1 3 229 \n", + "2 2 232 \n", + "2 3 11 \n", + " (Total: 3)" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Find detections with fewer than 300 blobs\n", + "Detection & 'num_blobs < 300'" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:12.867200Z", + "iopub.status.busy": "2026-01-14T07:35:12.867092Z", + "iopub.status.idle": "2026-01-14T07:35:12.874198Z", + "shell.execute_reply": "2026-01-14T07:35:12.873924Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

image_id

\n", + " \n", + "
\n", + "

params_id

\n", + " \n", + "
\n", + "

num_blobs

\n", + " number of blobs detected\n", + "
\n", + "

image_name

\n", + " \n", + "
111921Hubble Deep Field
12971Hubble Deep Field
13229Hubble Deep Field
21364Human Mitosis
22232Human Mitosis
2311Human Mitosis
\n", + " \n", + "

Total: 6

\n", + " " + ], + "text/plain": [ + "*image_id *params_id num_blobs image_name \n", + "+----------+ +-----------+ +-----------+ +------------+\n", + "1 1 1921 Hubble Deep Fi\n", + "1 2 971 Hubble Deep Fi\n", + "1 3 229 Hubble Deep Fi\n", + "2 1 364 Human Mitosis \n", + "2 2 232 Human Mitosis \n", + "2 3 11 Human Mitosis \n", + " (Total: 6)" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Join to see image names with blob counts\n", + "(Image * Detection).proj('image_name', 'num_blobs')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Storing Selections\n", + "\n", + "After reviewing the results, we can record which parameter set works best for each image. This is another Manual table that references our computed results:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:12.875584Z", + "iopub.status.busy": "2026-01-14T07:35:12.875479Z", + "iopub.status.idle": "2026-01-14T07:35:12.927789Z", + "shell.execute_reply": "2026-01-14T07:35:12.927437Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " Best detection for each image\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "
\n", + "

image_id

\n", + " \n", + "
\n", + "

params_id

\n", + " \n", + "
13
21
\n", + " \n", + "

Total: 2

\n", + " " + ], + "text/plain": [ + "*image_id params_id \n", + "+----------+ +-----------+\n", + "1 3 \n", + "2 1 \n", + " (Total: 2)" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "@schema\n", + "class SelectedDetection(dj.Manual):\n", + " definition = \"\"\"\n", + " # Best detection for each image\n", + " -> Image\n", + " ---\n", + " -> Detection\n", + " \"\"\"\n", + "\n", + "# Select params 3 for Hubble (fewer, larger blobs)\n", + "# Select params 1 for Mitosis (many small spots)\n", + "SelectedDetection.insert([\n", + " {'image_id': 1, 'params_id': 3},\n", + " {'image_id': 2, 'params_id': 1},\n", + "], skip_duplicates=True)\n", + "\n", + "SelectedDetection()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:12.929325Z", + "iopub.status.busy": "2026-01-14T07:35:12.929191Z", + "iopub.status.idle": "2026-01-14T07:35:13.065992Z", + "shell.execute_reply": "2026-01-14T07:35:13.065546Z" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "DetectionParams\n", + "\n", + "\n", + "DetectionParams\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Detection\n", + "\n", + "\n", + "Detection\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "DetectionParams->Detection\n", + "\n", + "\n", + "\n", + "\n", + "Detection.Blob\n", + "\n", + "\n", + "Detection.Blob\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Detection->Detection.Blob\n", + "\n", + "\n", + "\n", + "\n", + "SelectedDetection\n", + "\n", + "\n", + "SelectedDetection\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Detection->SelectedDetection\n", + "\n", + "\n", + "\n", + "\n", + "Image\n", + "\n", + "\n", + "Image\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Image->Detection\n", + "\n", + "\n", + "\n", + "\n", + "Image->SelectedDetection\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# View the final schema with selections\n", + "dj.Diagram(schema)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Key Concepts Recap\n", + "\n", + "| Concept | What It Does | Example |\n", + "|---------|--------------|--------|\n", + "| **Schema** | Groups related tables | `schema = dj.Schema('tutorial_blobs')` |\n", + "| **Manual Table** | Stores user-entered data | `Image`, `SelectedDetection` |\n", + "| **Lookup Table** | Stores reference/config data | `DetectionParams` |\n", + "| **Computed Table** | Derives data automatically | `Detection` |\n", + "| **Part Table** | Stores detailed results with master | `Detection.Blob` |\n", + "| **Foreign Key** (`->`) | Creates dependency | `-> Image` |\n", + "| **`populate()`** | Runs pending computations | `Detection.populate()` |\n", + "| **Restriction** (`&`) | Filters rows | `Detection & 'num_blobs < 300'` |\n", + "| **Join** (`*`) | Combines tables | `Image * Detection` |\n", + "\n", + "## Next Steps\n", + "\n", + "- [Schema Design](02-schema-design.ipynb) β€” Learn table types and relationships in depth\n", + "- [Queries](04-queries.ipynb) β€” Master DataJoint's query operators\n", + "- [Computation](05-computation.ipynb) β€” Build complex computational workflows" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:13.067779Z", + "iopub.status.busy": "2026-01-14T07:35:13.067628Z", + "iopub.status.idle": "2026-01-14T07:35:13.093161Z", + "shell.execute_reply": "2026-01-14T07:35:13.092776Z" + } + }, + "outputs": [], + "source": [ + "# Cleanup: drop the schema for re-running the tutorial\n", + "schema.drop(prompt=False)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/src/tutorials/examples/fractal-pipeline.ipynb b/src/tutorials/examples/fractal-pipeline.ipynb new file mode 100644 index 00000000..d3401a32 --- /dev/null +++ b/src/tutorials/examples/fractal-pipeline.ipynb @@ -0,0 +1,957 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "cell-intro", + "metadata": {}, + "source": [ + "# Fractal Image Pipeline\n", + "\n", + "This tutorial demonstrates **computed tables** by building an image processing pipeline for Julia fractals.\n", + "\n", + "You'll learn:\n", + "- **Manual tables**: Parameters you define (experimental configurations)\n", + "- **Lookup tables**: Fixed reference data (processing methods)\n", + "- **Computed tables**: Automatically generated results via `populate()`\n", + "- **Many-to-many pipelines**: Processing every combination of inputs Γ— methods" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "cell-setup", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:18.049168Z", + "iopub.status.busy": "2026-01-14T07:35:18.049044Z", + "iopub.status.idle": "2026-01-14T07:35:19.068019Z", + "shell.execute_reply": "2026-01-14T07:35:19.067569Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2026-01-14 01:35:19,058][INFO]: DataJoint 2.0.0a22 connected to root@127.0.0.1:3306\n" + ] + } + ], + "source": [ + "import datajoint as dj\n", + "import numpy as np\n", + "from matplotlib import pyplot as plt\n", + "\n", + "schema = dj.Schema('tutorial_fractal')" + ] + }, + { + "cell_type": "markdown", + "id": "cell-julia-intro", + "metadata": {}, + "source": [ + "## Julia Set Generator\n", + "\n", + "Julia sets are fractals generated by iterating $f(z) = z^2 + c$ for each point in the complex plane. Points that don't escape to infinity form intricate patterns." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "cell-julia-func", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:19.070052Z", + "iopub.status.busy": "2026-01-14T07:35:19.069755Z", + "iopub.status.idle": "2026-01-14T07:35:19.073440Z", + "shell.execute_reply": "2026-01-14T07:35:19.073152Z" + } + }, + "outputs": [], + "source": [ + "def julia(c, size=256, center=(0.0, 0.0), zoom=1.0, iters=256):\n", + " \"\"\"Generate a Julia set image.\"\"\"\n", + " x, y = np.meshgrid(\n", + " np.linspace(-1, 1, size) / zoom + center[0],\n", + " np.linspace(-1, 1, size) / zoom + center[1]\n", + " )\n", + " z = x + 1j * y\n", + " img = np.zeros(z.shape)\n", + " mask = np.ones(z.shape, dtype=bool)\n", + " for _ in range(iters):\n", + " z[mask] = z[mask] ** 2 + c\n", + " mask = np.abs(z) < 2\n", + " img += mask\n", + " return img" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "cell-julia-demo", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:19.074900Z", + "iopub.status.busy": "2026-01-14T07:35:19.074788Z", + "iopub.status.idle": "2026-01-14T07:35:19.201570Z", + "shell.execute_reply": "2026-01-14T07:35:19.201113Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Example fractal\n", + "plt.imshow(julia(-0.4 + 0.6j), cmap='magma')\n", + "plt.axis('off');" + ] + }, + { + "cell_type": "markdown", + "id": "cell-schema-intro", + "metadata": {}, + "source": [ + "## Pipeline Architecture\n", + "\n", + "We'll build a pipeline with four tables:\n", + "\n", + "- **JuliaSpec** (Manual): Parameters we define for fractal generation\n", + "- **JuliaImage** (Computed): Generated from specs\n", + "- **DenoiseMethod** (Lookup): Fixed set of denoising algorithms\n", + "- **Denoised** (Computed): Each image Γ— each method\n", + "\n", + "After defining all tables, we'll visualize the schema with `dj.Diagram(schema)`." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "cell-spec", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:19.203477Z", + "iopub.status.busy": "2026-01-14T07:35:19.203373Z", + "iopub.status.idle": "2026-01-14T07:35:19.238548Z", + "shell.execute_reply": "2026-01-14T07:35:19.238221Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class JuliaSpec(dj.Manual):\n", + " \"\"\"Parameters for generating Julia fractals.\"\"\"\n", + " definition = \"\"\"\n", + " spec_id : uint8\n", + " ---\n", + " c_real : float64 # Real part of c\n", + " c_imag : float64 # Imaginary part of c \n", + " noise_level = 50 : float64\n", + " \"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "cell-image", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:19.240499Z", + "iopub.status.busy": "2026-01-14T07:35:19.240327Z", + "iopub.status.idle": "2026-01-14T07:35:19.269184Z", + "shell.execute_reply": "2026-01-14T07:35:19.268822Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class JuliaImage(dj.Computed):\n", + " \"\"\"Generated fractal images with noise.\"\"\"\n", + " definition = \"\"\"\n", + " -> JuliaSpec\n", + " ---\n", + " image : # Generated fractal image\n", + " \"\"\"\n", + " \n", + " def make(self, key):\n", + " spec = (JuliaSpec & key).fetch1()\n", + " img = julia(spec['c_real'] + 1j * spec['c_imag'])\n", + " img += np.random.randn(*img.shape) * spec['noise_level']\n", + " self.insert1({**key, 'image': img.astype(np.float32)})" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "cell-method", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:19.271113Z", + "iopub.status.busy": "2026-01-14T07:35:19.270915Z", + "iopub.status.idle": "2026-01-14T07:35:19.638300Z", + "shell.execute_reply": "2026-01-14T07:35:19.637822Z" + } + }, + "outputs": [], + "source": [ + "from skimage import filters, restoration\n", + "from skimage.morphology import disk\n", + "\n", + "@schema\n", + "class DenoiseMethod(dj.Lookup):\n", + " \"\"\"Image denoising algorithms.\"\"\"\n", + " definition = \"\"\"\n", + " method_id : uint8\n", + " ---\n", + " method_name : varchar(20)\n", + " params : \n", + " \"\"\"\n", + " contents = [\n", + " [0, 'gaussian', {'sigma': 1.8}],\n", + " [1, 'median', {'radius': 3}],\n", + " [2, 'tv', {'weight': 20.0}],\n", + " ]" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "cell-denoised", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:19.640108Z", + "iopub.status.busy": "2026-01-14T07:35:19.639909Z", + "iopub.status.idle": "2026-01-14T07:35:19.665246Z", + "shell.execute_reply": "2026-01-14T07:35:19.664928Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class Denoised(dj.Computed):\n", + " \"\"\"Denoised images: each image Γ— each method.\"\"\"\n", + " definition = \"\"\"\n", + " -> JuliaImage\n", + " -> DenoiseMethod\n", + " ---\n", + " denoised : \n", + " \"\"\"\n", + " \n", + " def make(self, key):\n", + " img = (JuliaImage & key).fetch1('image')\n", + " method, params = (DenoiseMethod & key).fetch1('method_name', 'params')\n", + " \n", + " if method == 'gaussian':\n", + " result = filters.gaussian(img, **params)\n", + " elif method == 'median':\n", + " result = filters.median(img, disk(params['radius']))\n", + " elif method == 'tv':\n", + " result = restoration.denoise_tv_chambolle(img, **params)\n", + " else:\n", + " raise ValueError(f\"Unknown method: {method}\")\n", + " \n", + " self.insert1({**key, 'denoised': result.astype(np.float32)})" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "cell-diagram", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:19.666810Z", + "iopub.status.busy": "2026-01-14T07:35:19.666694Z", + "iopub.status.idle": "2026-01-14T07:35:20.683947Z", + "shell.execute_reply": "2026-01-14T07:35:20.683483Z" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "DenoiseMethod\n", + "\n", + "\n", + "DenoiseMethod\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Denoised\n", + "\n", + "\n", + "Denoised\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "DenoiseMethod->Denoised\n", + "\n", + "\n", + "\n", + "\n", + "JuliaImage\n", + "\n", + "\n", + "JuliaImage\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "JuliaImage->Denoised\n", + "\n", + "\n", + "\n", + "\n", + "JuliaSpec\n", + "\n", + "\n", + "JuliaSpec\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "JuliaSpec->JuliaImage\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dj.Diagram(schema)" + ] + }, + { + "cell_type": "markdown", + "id": "cell-populate-intro", + "metadata": {}, + "source": [ + "## Running the Pipeline\n", + "\n", + "1. Insert specs into Manual table\n", + "2. Call `populate()` on Computed tables" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "cell-insert-specs", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:20.686156Z", + "iopub.status.busy": "2026-01-14T07:35:20.685657Z", + "iopub.status.idle": "2026-01-14T07:35:20.699609Z", + "shell.execute_reply": "2026-01-14T07:35:20.699141Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

spec_id

\n", + " \n", + "
\n", + "

c_real

\n", + " Real part of c\n", + "
\n", + "

c_imag

\n", + " Imaginary part of c\n", + "
\n", + "

noise_level

\n", + " \n", + "
0-0.40.650.0
1-0.745430.1130150.0
2-0.10.65150.0
3-0.835-0.232150.0
\n", + " \n", + "

Total: 4

\n", + " " + ], + "text/plain": [ + "*spec_id c_real c_imag noise_level \n", + "+---------+ +----------+ +---------+ +------------+\n", + "0 -0.4 0.6 50.0 \n", + "1 -0.74543 0.11301 50.0 \n", + "2 -0.1 0.651 50.0 \n", + "3 -0.835 -0.2321 50.0 \n", + " (Total: 4)" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Define fractal parameters\n", + "JuliaSpec.insert([\n", + " {'spec_id': 0, 'c_real': -0.4, 'c_imag': 0.6},\n", + " {'spec_id': 1, 'c_real': -0.74543, 'c_imag': 0.11301},\n", + " {'spec_id': 2, 'c_real': -0.1, 'c_imag': 0.651},\n", + " {'spec_id': 3, 'c_real': -0.835, 'c_imag': -0.2321},\n", + "])\n", + "JuliaSpec()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "cell-populate-images", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:20.701125Z", + "iopub.status.busy": "2026-01-14T07:35:20.700993Z", + "iopub.status.idle": "2026-01-14T07:35:21.200042Z", + "shell.execute_reply": "2026-01-14T07:35:21.199593Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + "JuliaImage: 0%| | 0/4 [00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# View generated images\n", + "fig, axes = plt.subplots(1, 4, figsize=(12, 3))\n", + "for ax, row in zip(axes, JuliaImage()):\n", + " ax.imshow(row['image'], cmap='magma')\n", + " ax.set_title(f\"spec_id={row['spec_id']}\")\n", + " ax.axis('off')\n", + "plt.tight_layout()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "cell-populate-denoised", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:21.376531Z", + "iopub.status.busy": "2026-01-14T07:35:21.376377Z", + "iopub.status.idle": "2026-01-14T07:35:21.953332Z", + "shell.execute_reply": "2026-01-14T07:35:21.953044Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + "Denoised: 0%| | 0/12 [00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Compare denoising methods on one image\n", + "spec_id = 0\n", + "original = (JuliaImage & {'spec_id': spec_id}).fetch1('image')\n", + "\n", + "fig, axes = plt.subplots(1, 4, figsize=(14, 3.5))\n", + "axes[0].imshow(original, cmap='magma')\n", + "axes[0].set_title('Original (noisy)')\n", + "\n", + "for ax, method_id in zip(axes[1:], [0, 1, 2]):\n", + " result = (Denoised & {'spec_id': spec_id, 'method_id': method_id}).fetch1('denoised')\n", + " method_name = (DenoiseMethod & {'method_id': method_id}).fetch1('method_name')\n", + " ax.imshow(result, cmap='magma')\n", + " ax.set_title(method_name)\n", + "\n", + "for ax in axes:\n", + " ax.axis('off')\n", + "plt.tight_layout()" + ] + }, + { + "cell_type": "markdown", + "id": "cell-key-points", + "metadata": {}, + "source": [ + "## Key Points\n", + "\n", + "| Table Type | Populated By | Use For |\n", + "|------------|-------------|--------|\n", + "| **Manual** | `insert()` | Experimental parameters, user inputs |\n", + "| **Lookup** | `contents` attribute | Fixed reference data, method catalogs |\n", + "| **Computed** | `populate()` | Derived results, processed outputs |\n", + "\n", + "The pipeline automatically:\n", + "- Tracks dependencies (can't process an image that doesn't exist)\n", + "- Skips already-computed results (idempotent)\n", + "- Computes all combinations when multiple tables converge" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "cell-incremental", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:22.137697Z", + "iopub.status.busy": "2026-01-14T07:35:22.137554Z", + "iopub.status.idle": "2026-01-14T07:35:22.417515Z", + "shell.execute_reply": "2026-01-14T07:35:22.417250Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + "JuliaImage: 0%| | 0/1 [00:00 Room\n", + " date : date\n", + " ---\n", + " price : decimal(6, 2) # price per night\n", + " \"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "cell-guest", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:27.836768Z", + "iopub.status.busy": "2026-01-14T07:35:27.836638Z", + "iopub.status.idle": "2026-01-14T07:35:27.851832Z", + "shell.execute_reply": "2026-01-14T07:35:27.851545Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class Guest(dj.Manual):\n", + " definition = \"\"\"\n", + " # Hotel guests\n", + " guest_id : uint32 # auto-assigned guest ID\n", + " ---\n", + " guest_name : varchar(60)\n", + " index(guest_name)\n", + " \"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "cell-reservation", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:27.853530Z", + "iopub.status.busy": "2026-01-14T07:35:27.853387Z", + "iopub.status.idle": "2026-01-14T07:35:27.883679Z", + "shell.execute_reply": "2026-01-14T07:35:27.883375Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class Reservation(dj.Manual):\n", + " definition = \"\"\"\n", + " # Room reservations (one per room per night)\n", + " -> RoomAvailable\n", + " ---\n", + " -> Guest\n", + " credit_card : varchar(80) # encrypted card info\n", + " \"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "cell-checkin", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:27.885245Z", + "iopub.status.busy": "2026-01-14T07:35:27.885132Z", + "iopub.status.idle": "2026-01-14T07:35:27.907993Z", + "shell.execute_reply": "2026-01-14T07:35:27.907668Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class CheckIn(dj.Manual):\n", + " definition = \"\"\"\n", + " # Check-in records (requires reservation)\n", + " -> Reservation\n", + " \"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "cell-checkout", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:27.909529Z", + "iopub.status.busy": "2026-01-14T07:35:27.909413Z", + "iopub.status.idle": "2026-01-14T07:35:27.932377Z", + "shell.execute_reply": "2026-01-14T07:35:27.932066Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class CheckOut(dj.Manual):\n", + " definition = \"\"\"\n", + " # Check-out records (requires check-in)\n", + " -> CheckIn\n", + " \"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "cell-diagram", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:27.933876Z", + "iopub.status.busy": "2026-01-14T07:35:27.933751Z", + "iopub.status.idle": "2026-01-14T07:35:28.257361Z", + "shell.execute_reply": "2026-01-14T07:35:28.256981Z" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "Room\n", + "\n", + "\n", + "Room\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "RoomAvailable\n", + "\n", + "\n", + "RoomAvailable\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Room->RoomAvailable\n", + "\n", + "\n", + "\n", + "\n", + "CheckIn\n", + "\n", + "\n", + "CheckIn\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "CheckOut\n", + "\n", + "\n", + "CheckOut\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "CheckIn->CheckOut\n", + "\n", + "\n", + "\n", + "\n", + "Guest\n", + "\n", + "\n", + "Guest\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Reservation\n", + "\n", + "\n", + "Reservation\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Guest->Reservation\n", + "\n", + "\n", + "\n", + "\n", + "Reservation->CheckIn\n", + "\n", + "\n", + "\n", + "\n", + "RoomAvailable->Reservation\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dj.Diagram(schema)" + ] + }, + { + "cell_type": "markdown", + "id": "cell-workflow-md", + "metadata": {}, + "source": [ + "## How the Schema Enforces Rules\n", + "\n", + "| Business Rule | Schema Enforcement |\n", + "|---------------|--------------------|\n", + "| Room must exist | `Reservation -> RoomAvailable -> Room` |\n", + "| Room must be available on date | `Reservation -> RoomAvailable` |\n", + "| One reservation per room/night | `RoomAvailable` is primary key of `Reservation` |\n", + "| Must reserve before check-in | `CheckIn -> Reservation` |\n", + "| Must check-in before check-out | `CheckOut -> CheckIn` |\n", + "\n", + "The database **rejects invalid operations** β€” no application code needed." + ] + }, + { + "cell_type": "markdown", + "id": "cell-populate-md", + "metadata": {}, + "source": [ + "## Populate Room Availability\n", + "\n", + "Make rooms available for the next 30 days with random pricing:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "cell-populate", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:28.259112Z", + "iopub.status.busy": "2026-01-14T07:35:28.258974Z", + "iopub.status.idle": "2026-01-14T07:35:28.334318Z", + "shell.execute_reply": "2026-01-14T07:35:28.334024Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Created 600 room-night records\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " Room availability and pricing by date\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

room

\n", + " room number\n", + "
\n", + "

date

\n", + " \n", + "
\n", + "

price

\n", + " price per night\n", + "
12026-01-14134.00
12026-01-15145.00
12026-01-16164.00
12026-01-17180.00
12026-01-18204.00
12026-01-19137.00
12026-01-20174.00
12026-01-21120.00
12026-01-22122.00
12026-01-23197.00
12026-01-24245.00
12026-01-25230.00
\n", + "

...

\n", + "

Total: 30

\n", + " " + ], + "text/plain": [ + "*room *date price \n", + "+------+ +------------+ +--------+\n", + "1 2026-01-14 134.00 \n", + "1 2026-01-15 145.00 \n", + "1 2026-01-16 164.00 \n", + "1 2026-01-17 180.00 \n", + "1 2026-01-18 204.00 \n", + "1 2026-01-19 137.00 \n", + "1 2026-01-20 174.00 \n", + "1 2026-01-21 120.00 \n", + "1 2026-01-22 122.00 \n", + "1 2026-01-23 197.00 \n", + "1 2026-01-24 245.00 \n", + "1 2026-01-25 230.00 \n", + " ...\n", + " (Total: 30)" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "random.seed(42)\n", + "start_date = datetime.date.today()\n", + "days = 30\n", + "\n", + "for day in range(days):\n", + " date = start_date + datetime.timedelta(days=day)\n", + " # Weekend prices are higher\n", + " is_weekend = date.weekday() >= 5\n", + " base_price = 200 if is_weekend else 150\n", + " \n", + " RoomAvailable.insert(\n", + " {\n", + " 'room': room['room'],\n", + " 'date': date,\n", + " 'price': base_price + random.randint(-30, 50)\n", + " }\n", + " for room in Room.to_dicts()\n", + " )\n", + "\n", + "print(f\"Created {len(RoomAvailable())} room-night records\")\n", + "RoomAvailable() & {'room': 1}" + ] + }, + { + "cell_type": "markdown", + "id": "cell-helpers-md", + "metadata": {}, + "source": [ + "## Business Operations\n", + "\n", + "These functions wrap database operations and convert constraint violations into meaningful domain errors:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "cell-exceptions", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:28.335831Z", + "iopub.status.busy": "2026-01-14T07:35:28.335703Z", + "iopub.status.idle": "2026-01-14T07:35:28.337877Z", + "shell.execute_reply": "2026-01-14T07:35:28.337611Z" + } + }, + "outputs": [], + "source": [ + "# Domain-specific exceptions\n", + "class HotelError(Exception):\n", + " pass\n", + "\n", + "class RoomNotAvailable(HotelError):\n", + " pass\n", + "\n", + "class RoomAlreadyReserved(HotelError):\n", + " pass\n", + "\n", + "class NoReservation(HotelError):\n", + " pass\n", + "\n", + "class NotCheckedIn(HotelError):\n", + " pass\n", + "\n", + "class AlreadyProcessed(HotelError):\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "cell-reserve", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:28.339148Z", + "iopub.status.busy": "2026-01-14T07:35:28.339036Z", + "iopub.status.idle": "2026-01-14T07:35:28.341442Z", + "shell.execute_reply": "2026-01-14T07:35:28.341213Z" + } + }, + "outputs": [], + "source": [ + "def reserve_room(room, date, guest_name, credit_card):\n", + " \"\"\"\n", + " Make a reservation. Creates guest record if needed.\n", + " \n", + " Raises\n", + " ------\n", + " RoomNotAvailable\n", + " If room is not available on that date\n", + " RoomAlreadyReserved\n", + " If room is already reserved for that date\n", + " \"\"\"\n", + " # Find or create guest\n", + " guests = list((Guest & {'guest_name': guest_name}).keys())\n", + " if guests:\n", + " guest_key = guests[0]\n", + " else:\n", + " guest_key = {'guest_id': random.randint(1, 2**31)}\n", + " Guest.insert1({**guest_key, 'guest_name': guest_name})\n", + " \n", + " try:\n", + " Reservation.insert1({\n", + " 'room': room,\n", + " 'date': date,\n", + " **guest_key,\n", + " 'credit_card': credit_card\n", + " })\n", + " except dj.errors.DuplicateError:\n", + " raise RoomAlreadyReserved(\n", + " f\"Room {room} already reserved for {date}\") from None\n", + " except dj.errors.IntegrityError:\n", + " raise RoomNotAvailable(\n", + " f\"Room {room} not available on {date}\") from None" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "cell-checkin-fn", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:28.342614Z", + "iopub.status.busy": "2026-01-14T07:35:28.342516Z", + "iopub.status.idle": "2026-01-14T07:35:28.344558Z", + "shell.execute_reply": "2026-01-14T07:35:28.344290Z" + } + }, + "outputs": [], + "source": [ + "def check_in(room, date):\n", + " \"\"\"\n", + " Check in a guest. Requires existing reservation.\n", + " \n", + " Raises\n", + " ------\n", + " NoReservation\n", + " If no reservation exists for this room/date\n", + " AlreadyProcessed\n", + " If guest already checked in\n", + " \"\"\"\n", + " try:\n", + " CheckIn.insert1({'room': room, 'date': date})\n", + " except dj.errors.DuplicateError:\n", + " raise AlreadyProcessed(\n", + " f\"Room {room} already checked in for {date}\") from None\n", + " except dj.errors.IntegrityError:\n", + " raise NoReservation(\n", + " f\"No reservation for room {room} on {date}\") from None" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "cell-checkout-fn", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:28.345730Z", + "iopub.status.busy": "2026-01-14T07:35:28.345633Z", + "iopub.status.idle": "2026-01-14T07:35:28.347634Z", + "shell.execute_reply": "2026-01-14T07:35:28.347306Z" + } + }, + "outputs": [], + "source": [ + "def check_out(room, date):\n", + " \"\"\"\n", + " Check out a guest. Requires prior check-in.\n", + " \n", + " Raises\n", + " ------\n", + " NotCheckedIn\n", + " If guest hasn't checked in\n", + " AlreadyProcessed\n", + " If guest already checked out\n", + " \"\"\"\n", + " try:\n", + " CheckOut.insert1({'room': room, 'date': date})\n", + " except dj.errors.DuplicateError:\n", + " raise AlreadyProcessed(\n", + " f\"Room {room} already checked out for {date}\") from None\n", + " except dj.errors.IntegrityError:\n", + " raise NotCheckedIn(\n", + " f\"Room {room} not checked in for {date}\") from None" + ] + }, + { + "cell_type": "markdown", + "id": "cell-demo-md", + "metadata": {}, + "source": [ + "## Demo: Business Rule Enforcement\n", + "\n", + "Let's see the schema enforce our business rules:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "cell-demo-reserve", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:28.348893Z", + "iopub.status.busy": "2026-01-14T07:35:28.348778Z", + "iopub.status.idle": "2026-01-14T07:35:28.358301Z", + "shell.execute_reply": "2026-01-14T07:35:28.358034Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reserved room 1 for 2026-01-15\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " Room reservations (one per room per night)\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "
\n", + "

room

\n", + " room number\n", + "
\n", + "

date

\n", + " \n", + "
\n", + "

guest_id

\n", + " auto-assigned guest ID\n", + "
\n", + "

credit_card

\n", + " encrypted card info\n", + "
12026-01-1512825315834111-1111-1111-1111
\n", + " \n", + "

Total: 1

\n", + " " + ], + "text/plain": [ + "*room *date guest_id credit_card \n", + "+------+ +------------+ +------------+ +------------+\n", + "1 2026-01-15 1282531583 4111-1111-1111\n", + " (Total: 1)" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Successful reservation\n", + "tomorrow = start_date + datetime.timedelta(days=1)\n", + "reserve_room(1, tomorrow, 'Alice Smith', '4111-1111-1111-1111')\n", + "print(f\"Reserved room 1 for {tomorrow}\")\n", + "\n", + "Reservation()" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "cell-demo-double", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:28.359673Z", + "iopub.status.busy": "2026-01-14T07:35:28.359587Z", + "iopub.status.idle": "2026-01-14T07:35:28.363791Z", + "shell.execute_reply": "2026-01-14T07:35:28.363546Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Blocked: Room 1 already reserved for 2026-01-15\n" + ] + } + ], + "source": [ + "# Try to double-book the same room β€” fails!\n", + "try:\n", + " reserve_room(1, tomorrow, 'Bob Jones', '5555-5555-5555-5555')\n", + "except RoomAlreadyReserved as e:\n", + " print(f\"Blocked: {e}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "cell-demo-unavailable", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:28.364948Z", + "iopub.status.busy": "2026-01-14T07:35:28.364853Z", + "iopub.status.idle": "2026-01-14T07:35:28.368726Z", + "shell.execute_reply": "2026-01-14T07:35:28.368480Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Blocked: Room 1 not available on 2027-01-14\n" + ] + } + ], + "source": [ + "# Try to reserve unavailable date β€” fails!\n", + "far_future = start_date + datetime.timedelta(days=365)\n", + "try:\n", + " reserve_room(1, far_future, 'Carol White', '6666-6666-6666-6666')\n", + "except RoomNotAvailable as e:\n", + " print(f\"Blocked: {e}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "cell-demo-nores", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:28.370012Z", + "iopub.status.busy": "2026-01-14T07:35:28.369911Z", + "iopub.status.idle": "2026-01-14T07:35:28.372848Z", + "shell.execute_reply": "2026-01-14T07:35:28.372649Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Blocked: No reservation for room 2 on 2026-01-15\n" + ] + } + ], + "source": [ + "# Try to check in without reservation β€” fails!\n", + "try:\n", + " check_in(2, tomorrow) # Room 2 has no reservation\n", + "except NoReservation as e:\n", + " print(f\"Blocked: {e}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "cell-demo-checkin", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:28.374039Z", + "iopub.status.busy": "2026-01-14T07:35:28.373957Z", + "iopub.status.idle": "2026-01-14T07:35:28.379854Z", + "shell.execute_reply": "2026-01-14T07:35:28.379598Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Checked in room 1 for 2026-01-15\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " Check-in records (requires reservation)\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "
\n", + "

room

\n", + " room number\n", + "
\n", + "

date

\n", + " \n", + "
12026-01-15
\n", + " \n", + "

Total: 1

\n", + " " + ], + "text/plain": [ + "*room *date \n", + "+------+ +------------+\n", + "1 2026-01-15 \n", + " (Total: 1)" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Successful check-in (has reservation)\n", + "check_in(1, tomorrow)\n", + "print(f\"Checked in room 1 for {tomorrow}\")\n", + "\n", + "CheckIn()" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "cell-demo-nocheckin", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:28.381121Z", + "iopub.status.busy": "2026-01-14T07:35:28.381016Z", + "iopub.status.idle": "2026-01-14T07:35:28.386564Z", + "shell.execute_reply": "2026-01-14T07:35:28.386335Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Blocked: Room 3 not checked in for 2026-01-15\n" + ] + } + ], + "source": [ + "# Try to check out without checking in β€” fails!\n", + "# First make a reservation for room 3\n", + "reserve_room(3, tomorrow, 'David Brown', '7777-7777-7777-7777')\n", + "\n", + "try:\n", + " check_out(3, tomorrow) # Reserved but not checked in\n", + "except NotCheckedIn as e:\n", + " print(f\"Blocked: {e}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "cell-demo-checkout", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:28.387810Z", + "iopub.status.busy": "2026-01-14T07:35:28.387698Z", + "iopub.status.idle": "2026-01-14T07:35:28.393608Z", + "shell.execute_reply": "2026-01-14T07:35:28.393369Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Checked out room 1 for 2026-01-15\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " Check-out records (requires check-in)\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "
\n", + "

room

\n", + " room number\n", + "
\n", + "

date

\n", + " \n", + "
12026-01-15
\n", + " \n", + "

Total: 1

\n", + " " + ], + "text/plain": [ + "*room *date \n", + "+------+ +------------+\n", + "1 2026-01-15 \n", + " (Total: 1)" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Successful check-out (was checked in)\n", + "check_out(1, tomorrow)\n", + "print(f\"Checked out room 1 for {tomorrow}\")\n", + "\n", + "CheckOut()" + ] + }, + { + "cell_type": "markdown", + "id": "cell-queries-md", + "metadata": {}, + "source": [ + "## Useful Queries\n", + "\n", + "The workflow structure enables powerful queries:" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "cell-queries", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:28.394897Z", + "iopub.status.busy": "2026-01-14T07:35:28.394798Z", + "iopub.status.idle": "2026-01-14T07:35:28.401093Z", + "shell.execute_reply": "2026-01-14T07:35:28.400862Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Available rooms for 2026-01-15: 18\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " Room availability and pricing by date\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

room

\n", + " room number\n", + "
\n", + "

date

\n", + " \n", + "
\n", + "

price

\n", + " price per night\n", + "
22026-01-15189.00
42026-01-15148.00
52026-01-15177.00
62026-01-15195.00
72026-01-15155.00
82026-01-15120.00
92026-01-15140.00
102026-01-15174.00
112026-01-15163.00
122026-01-15155.00
132026-01-15139.00
142026-01-15147.00
\n", + "

...

\n", + "

Total: 18

\n", + " " + ], + "text/plain": [ + "*room *date price \n", + "+------+ +------------+ +--------+\n", + "2 2026-01-15 189.00 \n", + "4 2026-01-15 148.00 \n", + "5 2026-01-15 177.00 \n", + "6 2026-01-15 195.00 \n", + "7 2026-01-15 155.00 \n", + "8 2026-01-15 120.00 \n", + "9 2026-01-15 140.00 \n", + "10 2026-01-15 174.00 \n", + "11 2026-01-15 163.00 \n", + "12 2026-01-15 155.00 \n", + "13 2026-01-15 139.00 \n", + "14 2026-01-15 147.00 \n", + " ...\n", + " (Total: 18)" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Available rooms (not reserved) for tomorrow\n", + "available = (RoomAvailable & {'date': tomorrow}) - Reservation\n", + "print(f\"Available rooms for {tomorrow}: {len(available)}\")\n", + "available" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "cell-queries2", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:28.402378Z", + "iopub.status.busy": "2026-01-14T07:35:28.402287Z", + "iopub.status.idle": "2026-01-14T07:35:28.406860Z", + "shell.execute_reply": "2026-01-14T07:35:28.406593Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "
\n", + "

room

\n", + " room number\n", + "
\n", + "

date

\n", + " \n", + "
\n", + "

guest_name

\n", + " \n", + "
\n", + " \n", + "

Total: 0

\n", + " " + ], + "text/plain": [ + "*room *date guest_name \n", + "+------+ +------+ +------------+\n", + "\n", + " (Total: 0)" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Guests currently checked in (checked in but not out)\n", + "currently_in = (CheckIn - CheckOut) * Reservation * Guest\n", + "currently_in.proj('guest_name', 'room', 'date')" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "cell-queries3", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:28.408155Z", + "iopub.status.busy": "2026-01-14T07:35:28.408078Z", + "iopub.status.idle": "2026-01-14T07:35:28.412570Z", + "shell.execute_reply": "2026-01-14T07:35:28.412329Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "
\n", + "

room

\n", + " room number\n", + "
\n", + "

date

\n", + " \n", + "
\n", + "

guest_name

\n", + " \n", + "
32026-01-15David Brown
\n", + " \n", + "

Total: 1

\n", + " " + ], + "text/plain": [ + "*room *date guest_name \n", + "+------+ +------------+ +------------+\n", + "3 2026-01-15 David Brown \n", + " (Total: 1)" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Reservations without check-in (no-shows or upcoming)\n", + "not_checked_in = Reservation - CheckIn\n", + "(not_checked_in * Guest).proj('guest_name', 'room', 'date')" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "cell-queries4", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:28.413739Z", + "iopub.status.busy": "2026-01-14T07:35:28.413650Z", + "iopub.status.idle": "2026-01-14T07:35:28.419895Z", + "shell.execute_reply": "2026-01-14T07:35:28.419624Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "
\n", + "

room_type

\n", + " \n", + "
\n", + "

total_revenue

\n", + " calculated attribute\n", + "
\n", + "

reservations

\n", + " calculated attribute\n", + "
Deluxe318.002
\n", + " \n", + "

Total: 1

\n", + " " + ], + "text/plain": [ + "*room_type total_revenue reservations \n", + "+-----------+ +------------+ +------------+\n", + "Deluxe 318.00 2 \n", + " (Total: 1)" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Revenue by room type using aggr\n", + "dj.U('room_type').aggr(\n", + " Room * RoomAvailable * Reservation,\n", + " total_revenue='SUM(price)',\n", + " reservations='COUNT(*)'\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-summary-md", + "metadata": {}, + "source": [ + "## Key Concepts\n", + "\n", + "| Concept | How It's Used |\n", + "|---------|---------------|\n", + "| **Workflow Dependencies** | `CheckOut -> CheckIn -> Reservation -> RoomAvailable` |\n", + "| **Unique Constraints** | One reservation per room/night (primary key) |\n", + "| **Referential Integrity** | Can't reserve unavailable room, can't check in without reservation |\n", + "| **Error Translation** | Database exceptions β†’ domain-specific errors |\n", + "\n", + "The schema **is** the business logic. Application code just translates errors.\n", + "\n", + "## Next Steps\n", + "\n", + "- [University Database](university.ipynb) β€” Academic records with many-to-many relationships\n", + "- [Languages & Proficiency](languages.ipynb) β€” International standards and lookup tables\n", + "- [Data Entry](../basics/03-data-entry.ipynb) β€” Insert patterns and transactions" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "cell-cleanup", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:28.421351Z", + "iopub.status.busy": "2026-01-14T07:35:28.421252Z", + "iopub.status.idle": "2026-01-14T07:35:28.440319Z", + "shell.execute_reply": "2026-01-14T07:35:28.440021Z" + } + }, + "outputs": [], + "source": [ + "# Cleanup\n", + "schema.drop(prompt=False)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/src/tutorials/examples/languages.ipynb b/src/tutorials/examples/languages.ipynb new file mode 100644 index 00000000..6dfedfe7 --- /dev/null +++ b/src/tutorials/examples/languages.ipynb @@ -0,0 +1,2334 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "cell-intro", + "metadata": {}, + "source": [ + "# Languages and Proficiency\n", + "\n", + "This example demonstrates many-to-many relationships using an association table with international standards. You'll learn:\n", + "\n", + "- **Many-to-many relationships** β€” People speak multiple languages; languages have multiple speakers\n", + "- **Lookup tables** β€” Standardized reference data (ISO language codes, CEFR levels)\n", + "- **Association tables** β€” Linking entities with additional attributes\n", + "- **Complex queries** β€” Aggregations, filtering, and joins\n", + "\n", + "## International Standards\n", + "\n", + "This example uses two widely-adopted standards:\n", + "\n", + "- **ISO 639-1** β€” Two-letter language codes (`en`, `es`, `ja`)\n", + "- **CEFR** β€” Common European Framework of Reference for language proficiency (A1–C2)\n", + "\n", + "Using international standards ensures data consistency and enables integration with external systems." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "cell-setup", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:30.852180Z", + "iopub.status.busy": "2026-01-14T07:35:30.852074Z", + "iopub.status.idle": "2026-01-14T07:35:31.653785Z", + "shell.execute_reply": "2026-01-14T07:35:31.653477Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2026-01-14 01:35:31,642][INFO]: DataJoint 2.0.0a22 connected to root@127.0.0.1:3306\n" + ] + } + ], + "source": [ + "import datajoint as dj\n", + "import numpy as np\n", + "from faker import Faker\n", + "\n", + "dj.config['display.limit'] = 8\n", + "\n", + "# Clean start\n", + "schema = dj.Schema('tutorial_languages')\n", + "schema.drop(prompt=False)\n", + "schema = dj.Schema('tutorial_languages')" + ] + }, + { + "cell_type": "markdown", + "id": "cell-lookup-md", + "metadata": {}, + "source": [ + "## Lookup Tables\n", + "\n", + "Lookup tables store standardized reference data that rarely changes. The `contents` attribute pre-populates them when the schema is created." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "cell-language", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:31.655944Z", + "iopub.status.busy": "2026-01-14T07:35:31.655687Z", + "iopub.status.idle": "2026-01-14T07:35:31.685851Z", + "shell.execute_reply": "2026-01-14T07:35:31.685496Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class Language(dj.Lookup):\n", + " definition = \"\"\"\n", + " # ISO 639-1 language codes\n", + " lang_code : char(2) # two-letter code (en, es, ja)\n", + " ---\n", + " language : varchar(30) # full name\n", + " native_name : varchar(50) # name in native script\n", + " \"\"\"\n", + " contents = [\n", + " ('ar', 'Arabic', 'Ψ§Ω„ΨΉΨ±Ψ¨ΩŠΨ©'),\n", + " ('de', 'German', 'Deutsch'),\n", + " ('en', 'English', 'English'),\n", + " ('es', 'Spanish', 'EspaΓ±ol'),\n", + " ('fr', 'French', 'FranΓ§ais'),\n", + " ('hi', 'Hindi', 'ΰ€Ήΰ€Ώΰ€¨ΰ₯ΰ€¦ΰ₯€'),\n", + " ('ja', 'Japanese', 'ζ—₯本θͺž'),\n", + " ('ko', 'Korean', 'ν•œκ΅­μ–΄'),\n", + " ('pt', 'Portuguese', 'PortuguΓͺs'),\n", + " ('ru', 'Russian', 'Русский'),\n", + " ('zh', 'Chinese', 'δΈ­ζ–‡'),\n", + " ]" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "cell-cefr", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:31.687394Z", + "iopub.status.busy": "2026-01-14T07:35:31.687280Z", + "iopub.status.idle": "2026-01-14T07:35:31.712242Z", + "shell.execute_reply": "2026-01-14T07:35:31.711878Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class CEFRLevel(dj.Lookup):\n", + " definition = \"\"\"\n", + " # CEFR proficiency levels\n", + " cefr_level : char(2) # A1, A2, B1, B2, C1, C2\n", + " ---\n", + " level_name : varchar(20) # descriptive name\n", + " category : enum('Basic', 'Independent', 'Proficient')\n", + " description : varchar(100) # can-do summary\n", + " \"\"\"\n", + " contents = [\n", + " ('A1', 'Beginner', 'Basic',\n", + " 'Can use familiar everyday expressions'),\n", + " ('A2', 'Elementary', 'Basic',\n", + " 'Can communicate in simple routine tasks'),\n", + " ('B1', 'Intermediate', 'Independent',\n", + " 'Can deal with most travel situations'),\n", + " ('B2', 'Upper Intermediate', 'Independent',\n", + " 'Can interact with fluency and spontaneity'),\n", + " ('C1', 'Advanced', 'Proficient',\n", + " 'Can express ideas fluently for professional use'),\n", + " ('C2', 'Mastery', 'Proficient',\n", + " 'Can understand virtually everything'),\n", + " ]" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "cell-show-lookups", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:31.713997Z", + "iopub.status.busy": "2026-01-14T07:35:31.713888Z", + "iopub.status.idle": "2026-01-14T07:35:31.718475Z", + "shell.execute_reply": "2026-01-14T07:35:31.718204Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Languages:\n", + "*lang_code language native_name \n", + "+-----------+ +----------+ +------------+\n", + "ar Arabic Ψ§Ω„ΨΉΨ±Ψ¨ΩŠΨ© \n", + "de German Deutsch \n", + "en English English \n", + "es Spanish EspaΓ±ol \n", + "fr French FranΓ§ais \n", + "hi Hindi ΰ€Ήΰ€Ώΰ€¨ΰ₯ΰ€¦ΰ₯€ \n", + "ja Japanese ζ—₯本θͺž \n", + "ko Korean ν•œκ΅­μ–΄ \n", + " ...\n", + " (Total: 11)\n", + "\n", + "\n", + "CEFR Levels:\n", + "*cefr_level level_name category description \n", + "+------------+ +------------+ +------------+ +------------+\n", + "A1 Beginner Basic Can use famili\n", + "A2 Elementary Basic Can communicat\n", + "B1 Intermediate Independent Can deal with \n", + "B2 Upper Intermed Independent Can interact w\n", + "C1 Advanced Proficient Can express id\n", + "C2 Mastery Proficient Can understand\n", + " (Total: 6)\n", + "\n" + ] + } + ], + "source": [ + "print(\"Languages:\")\n", + "print(Language())\n", + "print(\"\\nCEFR Levels:\")\n", + "print(CEFRLevel())" + ] + }, + { + "cell_type": "markdown", + "id": "cell-entities-md", + "metadata": {}, + "source": [ + "## Entity and Association Tables\n", + "\n", + "- **Person** β€” The main entity\n", + "- **Proficiency** β€” Association table linking Person, Language, and CEFRLevel\n", + "\n", + "The association table's primary key includes both Person and Language, creating the many-to-many relationship." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "cell-person", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:31.719805Z", + "iopub.status.busy": "2026-01-14T07:35:31.719691Z", + "iopub.status.idle": "2026-01-14T07:35:31.733718Z", + "shell.execute_reply": "2026-01-14T07:35:31.733402Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class Person(dj.Manual):\n", + " definition = \"\"\"\n", + " # People with language skills\n", + " person_id : int32 # unique identifier\n", + " ---\n", + " name : varchar(60)\n", + " date_of_birth : date\n", + " \"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "cell-proficiency", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:31.735197Z", + "iopub.status.busy": "2026-01-14T07:35:31.735104Z", + "iopub.status.idle": "2026-01-14T07:35:31.763787Z", + "shell.execute_reply": "2026-01-14T07:35:31.763468Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class Proficiency(dj.Manual):\n", + " definition = \"\"\"\n", + " # Language proficiency (many-to-many: person <-> language)\n", + " -> Person\n", + " -> Language\n", + " ---\n", + " -> CEFRLevel\n", + " \"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "cell-diagram", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:31.765382Z", + "iopub.status.busy": "2026-01-14T07:35:31.765256Z", + "iopub.status.idle": "2026-01-14T07:35:32.109897Z", + "shell.execute_reply": "2026-01-14T07:35:32.109370Z" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "CEFRLevel\n", + "\n", + "\n", + "CEFRLevel\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Proficiency\n", + "\n", + "\n", + "Proficiency\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "CEFRLevel->Proficiency\n", + "\n", + "\n", + "\n", + "\n", + "Language\n", + "\n", + "\n", + "Language\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Language->Proficiency\n", + "\n", + "\n", + "\n", + "\n", + "Person\n", + "\n", + "\n", + "Person\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Person->Proficiency\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dj.Diagram(schema)" + ] + }, + { + "cell_type": "markdown", + "id": "cell-diagram-md", + "metadata": {}, + "source": [ + "**Reading the diagram:**\n", + "- **Gray tables** (Language, CEFRLevel) are Lookup tables\n", + "- **Green table** (Person) is Manual\n", + "- **Solid lines** indicate foreign keys in the primary key (many-to-many)\n", + "- **Dashed line** indicates foreign key in secondary attributes (reference)" + ] + }, + { + "cell_type": "markdown", + "id": "cell-populate-md", + "metadata": {}, + "source": [ + "## Populate Sample Data" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "cell-populate-person", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:32.111607Z", + "iopub.status.busy": "2026-01-14T07:35:32.111487Z", + "iopub.status.idle": "2026-01-14T07:35:32.174237Z", + "shell.execute_reply": "2026-01-14T07:35:32.173961Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Created 200 people\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " People with language skills\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

person_id

\n", + " unique identifier\n", + "
\n", + "

name

\n", + " \n", + "
\n", + "

date_of_birth

\n", + " \n", + "
0Allison Hill1966-11-12
1Megan Mcclain1959-08-23
2Allen Robinson1981-10-26
3Cristian Santos1983-12-01
4Kevin Pacheco1955-05-19
5Melissa Peterson1963-04-11
6Gabrielle Davis1960-02-29
7Lindsey Roman1993-09-17
\n", + "

...

\n", + "

Total: 200

\n", + " " + ], + "text/plain": [ + "*person_id name date_of_birth \n", + "+-----------+ +------------+ +------------+\n", + "0 Allison Hill 1966-11-12 \n", + "1 Megan Mcclain 1959-08-23 \n", + "2 Allen Robinson 1981-10-26 \n", + "3 Cristian Santo 1983-12-01 \n", + "4 Kevin Pacheco 1955-05-19 \n", + "5 Melissa Peters 1963-04-11 \n", + "6 Gabrielle Davi 1960-02-29 \n", + "7 Lindsey Roman 1993-09-17 \n", + " ...\n", + " (Total: 200)" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.random.seed(42)\n", + "fake = Faker()\n", + "fake.seed_instance(42)\n", + "\n", + "# Generate 200 people\n", + "n_people = 200\n", + "Person.insert(\n", + " {\n", + " 'person_id': i,\n", + " 'name': fake.name(),\n", + " 'date_of_birth': fake.date_of_birth(\n", + " minimum_age=18, maximum_age=70)\n", + " }\n", + " for i in range(n_people)\n", + ")\n", + "\n", + "print(f\"Created {len(Person())} people\")\n", + "Person()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "cell-populate-prof", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:32.175711Z", + "iopub.status.busy": "2026-01-14T07:35:32.175591Z", + "iopub.status.idle": "2026-01-14T07:35:32.386215Z", + "shell.execute_reply": "2026-01-14T07:35:32.385919Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Created 527 proficiency records\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " Language proficiency (many-to-many: person <-> language)\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

person_id

\n", + " unique identifier\n", + "
\n", + "

lang_code

\n", + " two-letter code (en, es, ja)\n", + "
\n", + "

cefr_level

\n", + " A1, A2, B1, B2, C1, C2\n", + "
0arA1
0deB2
0hiC2
0ruB2
3deB2
3ruA1
4hiB2
4ptC1
\n", + "

...

\n", + "

Total: 527

\n", + " " + ], + "text/plain": [ + "*person_id *lang_code cefr_level \n", + "+-----------+ +-----------+ +------------+\n", + "0 ar A1 \n", + "0 de B2 \n", + "0 hi C2 \n", + "0 ru B2 \n", + "3 de B2 \n", + "3 ru A1 \n", + "4 hi B2 \n", + "4 pt C1 \n", + " ...\n", + " (Total: 527)" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Assign random language proficiencies\n", + "lang_keys = list(Language.keys())\n", + "cefr_keys = list(CEFRLevel.keys())\n", + "\n", + "# More people at intermediate levels than extremes\n", + "cefr_weights = [0.08, 0.12, 0.20, 0.25, 0.20, 0.15]\n", + "avg_languages = 2.5\n", + "\n", + "for person_key in Person.keys():\n", + " n_langs = np.random.poisson(avg_languages)\n", + " if n_langs > 0:\n", + " selected_langs = np.random.choice(\n", + " len(lang_keys), min(n_langs, len(lang_keys)), replace=False)\n", + " Proficiency.insert(\n", + " {\n", + " **person_key,\n", + " **lang_keys[i],\n", + " **np.random.choice(cefr_keys, p=cefr_weights)\n", + " }\n", + " for i in selected_langs\n", + " )\n", + "\n", + "print(f\"Created {len(Proficiency())} proficiency records\")\n", + "Proficiency()" + ] + }, + { + "cell_type": "markdown", + "id": "cell-queries-md", + "metadata": {}, + "source": [ + "## Query Examples\n", + "\n", + "### Finding Speakers" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "cell-q1", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:32.387809Z", + "iopub.status.busy": "2026-01-14T07:35:32.387680Z", + "iopub.status.idle": "2026-01-14T07:35:32.395101Z", + "shell.execute_reply": "2026-01-14T07:35:32.394849Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Proficient English speakers: 18\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

person_id

\n", + " unique identifier\n", + "
\n", + "

name

\n", + " \n", + "
22Brian Burton
32Elizabeth Brown
33Angelica Tucker
37Zachary Santos
38Barbara Walker
42Timothy Duncan
53Whitney Peters
67Teresa Taylor
\n", + "

...

\n", + "

Total: 18

\n", + " " + ], + "text/plain": [ + "*person_id name \n", + "+-----------+ +------------+\n", + "22 Brian Burton \n", + "32 Elizabeth Brow\n", + "33 Angelica Tucke\n", + "37 Zachary Santos\n", + "38 Barbara Walker\n", + "42 Timothy Duncan\n", + "53 Whitney Peters\n", + "67 Teresa Taylor \n", + " ...\n", + " (Total: 18)" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Proficient English speakers (C1 or C2)\n", + "proficient_english = (\n", + " Person.proj('name') & \n", + " (Proficiency & {'lang_code': 'en'} & 'cefr_level >= \"C1\"')\n", + ")\n", + "print(f\"Proficient English speakers: {len(proficient_english)}\")\n", + "proficient_english" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "cell-q2", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:32.396360Z", + "iopub.status.busy": "2026-01-14T07:35:32.396246Z", + "iopub.status.idle": "2026-01-14T07:35:32.401877Z", + "shell.execute_reply": "2026-01-14T07:35:32.401623Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "English + Spanish speakers: 6\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

person_id

\n", + " unique identifier\n", + "
\n", + "

name

\n", + " \n", + "
38Barbara Walker
67Teresa Taylor
77Richard Henson
113Denise Jones
122Michael Powell
137Lindsay Martinez
\n", + " \n", + "

Total: 6

\n", + " " + ], + "text/plain": [ + "*person_id name \n", + "+-----------+ +------------+\n", + "38 Barbara Walker\n", + "67 Teresa Taylor \n", + "77 Richard Henson\n", + "113 Denise Jones \n", + "122 Michael Powell\n", + "137 Lindsay Martin\n", + " (Total: 6)" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# People who speak BOTH English AND Spanish\n", + "bilingual = (\n", + " Person.proj('name') & \n", + " (Proficiency & {'lang_code': 'en'}) & \n", + " (Proficiency & {'lang_code': 'es'})\n", + ")\n", + "print(f\"English + Spanish speakers: {len(bilingual)}\")\n", + "bilingual" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "cell-q3", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:32.403071Z", + "iopub.status.busy": "2026-01-14T07:35:32.402986Z", + "iopub.status.idle": "2026-01-14T07:35:32.408617Z", + "shell.execute_reply": "2026-01-14T07:35:32.408360Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "English or Spanish speakers: 79\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

person_id

\n", + " unique identifier\n", + "
\n", + "

name

\n", + " \n", + "
6Gabrielle Davis
11David Garcia
12Holly Wood
17Daniel Hahn
19Derek Wright
20Kevin Hurst
22Brian Burton
27Sherri Baker
\n", + "

...

\n", + "

Total: 79

\n", + " " + ], + "text/plain": [ + "*person_id name \n", + "+-----------+ +------------+\n", + "6 Gabrielle Davi\n", + "11 David Garcia \n", + "12 Holly Wood \n", + "17 Daniel Hahn \n", + "19 Derek Wright \n", + "20 Kevin Hurst \n", + "22 Brian Burton \n", + "27 Sherri Baker \n", + " ...\n", + " (Total: 79)" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# People who speak English OR Spanish\n", + "either = (\n", + " Person.proj('name') & \n", + " (Proficiency & 'lang_code in (\"en\", \"es\")')\n", + ")\n", + "print(f\"English or Spanish speakers: {len(either)}\")\n", + "either" + ] + }, + { + "cell_type": "markdown", + "id": "cell-agg-md", + "metadata": {}, + "source": [ + "### Aggregations" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "cell-q4", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:32.409831Z", + "iopub.status.busy": "2026-01-14T07:35:32.409749Z", + "iopub.status.idle": "2026-01-14T07:35:32.416864Z", + "shell.execute_reply": "2026-01-14T07:35:32.416622Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Polyglots (4+ languages): 56\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

person_id

\n", + " unique identifier\n", + "
\n", + "

name

\n", + " \n", + "
\n", + "

n_languages

\n", + " calculated attribute\n", + "
\n", + "

languages

\n", + " calculated attribute\n", + "
0Allison Hill4ar,de,hi,ru
6Gabrielle Davis5de,en,fr,hi,ru
8Valerie Gray4de,hi,ko,zh
9Lisa Hensley4ar,ja,pt,zh
11David Garcia4es,hi,ko,zh
12Holly Wood4de,en,pt,ru
14Nicholas Martin5fr,hi,ko,pt,zh
15Margaret Hawkins DDS4de,fr,ja,ru
\n", + "

...

\n", + "

Total: 56

\n", + " " + ], + "text/plain": [ + "*person_id name n_languages languages \n", + "+-----------+ +------------+ +------------+ +------------+\n", + "0 Allison Hill 4 ar,de,hi,ru \n", + "6 Gabrielle Davi 5 de,en,fr,hi,ru\n", + "8 Valerie Gray 4 de,hi,ko,zh \n", + "9 Lisa Hensley 4 ar,ja,pt,zh \n", + "11 David Garcia 4 es,hi,ko,zh \n", + "12 Holly Wood 4 de,en,pt,ru \n", + "14 Nicholas Marti 5 fr,hi,ko,pt,zh\n", + "15 Margaret Hawki 4 de,fr,ja,ru \n", + " ...\n", + " (Total: 56)" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# People who speak 4+ languages\n", + "polyglots = Person.aggr(\n", + " Proficiency,\n", + " 'name',\n", + " n_languages='COUNT(lang_code)',\n", + " languages='GROUP_CONCAT(lang_code)'\n", + ") & 'n_languages >= 4'\n", + "\n", + "print(f\"Polyglots (4+ languages): {len(polyglots)}\")\n", + "polyglots" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "cell-q5", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:32.418068Z", + "iopub.status.busy": "2026-01-14T07:35:32.417978Z", + "iopub.status.idle": "2026-01-14T07:35:32.423467Z", + "shell.execute_reply": "2026-01-14T07:35:32.423214Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

person_id

\n", + " unique identifier\n", + "
\n", + "

name

\n", + " \n", + "
\n", + "

n_languages

\n", + " calculated attribute\n", + "
58Bryan Zamora7
116Joshua Perry7
77Richard Henson7
20Kevin Hurst7
42Timothy Duncan7
\n", + " \n", + "

Total: 5

\n", + " " + ], + "text/plain": [ + "*person_id name n_languages \n", + "+-----------+ +------------+ +------------+\n", + "58 Bryan Zamora 7 \n", + "116 Joshua Perry 7 \n", + "77 Richard Henson 7 \n", + "20 Kevin Hurst 7 \n", + "42 Timothy Duncan 7 \n", + " (Total: 5)" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Top 5 polyglots\n", + "top_polyglots = Person.aggr(\n", + " Proficiency,\n", + " 'name',\n", + " n_languages='COUNT(lang_code)'\n", + ") & dj.Top(5, order_by='n_languages DESC')\n", + "\n", + "top_polyglots" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "cell-q6", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:32.424753Z", + "iopub.status.busy": "2026-01-14T07:35:32.424656Z", + "iopub.status.idle": "2026-01-14T07:35:32.429465Z", + "shell.execute_reply": "2026-01-14T07:35:32.429224Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

lang_code

\n", + " two-letter code (en, es, ja)\n", + "
\n", + "

language

\n", + " full name\n", + "
\n", + "

n_speakers

\n", + " calculated attribute\n", + "
arArabic41
deGerman55
enEnglish45
esSpanish40
frFrench49
hiHindi54
jaJapanese47
koKorean47
\n", + "

...

\n", + "

Total: 11

\n", + " " + ], + "text/plain": [ + "*lang_code language n_speakers \n", + "+-----------+ +----------+ +------------+\n", + "ar Arabic 41 \n", + "de German 55 \n", + "en English 45 \n", + "es Spanish 40 \n", + "fr French 49 \n", + "hi Hindi 54 \n", + "ja Japanese 47 \n", + "ko Korean 47 \n", + " ...\n", + " (Total: 11)" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Number of speakers per language\n", + "speakers_per_lang = Language.aggr(\n", + " Proficiency,\n", + " 'language',\n", + " n_speakers='COUNT(person_id)'\n", + ")\n", + "speakers_per_lang" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "cell-q7", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:32.430687Z", + "iopub.status.busy": "2026-01-14T07:35:32.430601Z", + "iopub.status.idle": "2026-01-14T07:35:32.435962Z", + "shell.execute_reply": "2026-01-14T07:35:32.435683Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

cefr_level

\n", + " A1, A2, B1, B2, C1, C2\n", + "
\n", + "

level_name

\n", + " descriptive name\n", + "
\n", + "

n_speakers

\n", + " calculated attribute\n", + "
A1Beginner1
A2Elementary5
B1Intermediate8
B2Upper Intermediate13
C1Advanced13
C2Mastery5
\n", + " \n", + "

Total: 6

\n", + " " + ], + "text/plain": [ + "*cefr_level level_name n_speakers \n", + "+------------+ +------------+ +------------+\n", + "A1 Beginner 1 \n", + "A2 Elementary 5 \n", + "B1 Intermediate 8 \n", + "B2 Upper Intermed 13 \n", + "C1 Advanced 13 \n", + "C2 Mastery 5 \n", + " (Total: 6)" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# CEFR level distribution for English\n", + "english_levels = CEFRLevel.aggr(\n", + " Proficiency & {'lang_code': 'en'},\n", + " 'level_name',\n", + " n_speakers='COUNT(person_id)'\n", + ")\n", + "english_levels" + ] + }, + { + "cell_type": "markdown", + "id": "cell-join-md", + "metadata": {}, + "source": [ + "### Joining Tables" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "cell-q8", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:32.437208Z", + "iopub.status.busy": "2026-01-14T07:35:32.437126Z", + "iopub.status.idle": "2026-01-14T07:35:32.442309Z", + "shell.execute_reply": "2026-01-14T07:35:32.442078Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

person_id

\n", + " unique identifier\n", + "
\n", + "

lang_code

\n", + " two-letter code (en, es, ja)\n", + "
\n", + "

name

\n", + " \n", + "
\n", + "

language

\n", + " full name\n", + "
\n", + "

level_name

\n", + " descriptive name\n", + "
\n", + "

category

\n", + " \n", + "
0arAllison HillArabicBeginnerBasic
0deAllison HillGermanUpper IntermediateIndependent
0hiAllison HillHindiMasteryProficient
0ruAllison HillRussianUpper IntermediateIndependent
\n", + " \n", + "

Total: 4

\n", + " " + ], + "text/plain": [ + "*person_id *lang_code name language level_name category \n", + "+-----------+ +-----------+ +------------+ +----------+ +------------+ +------------+\n", + "0 ar Allison Hill Arabic Beginner Basic \n", + "0 de Allison Hill German Upper Intermed Independent \n", + "0 hi Allison Hill Hindi Mastery Proficient \n", + "0 ru Allison Hill Russian Upper Intermed Independent \n", + " (Total: 4)" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Full profile: person + language + proficiency details\n", + "full_profile = (\n", + " Person * Proficiency * Language * CEFRLevel\n", + ").proj('name', 'language', 'level_name', 'category')\n", + "\n", + "# Show profile for person_id=0\n", + "full_profile & {'person_id': 0}" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "cell-q9", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:32.443425Z", + "iopub.status.busy": "2026-01-14T07:35:32.443348Z", + "iopub.status.idle": "2026-01-14T07:35:32.449734Z", + "shell.execute_reply": "2026-01-14T07:35:32.449506Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Advanced in 2+ languages: 49\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

person_id

\n", + " unique identifier\n", + "
\n", + "

name

\n", + " \n", + "
\n", + "

n_advanced

\n", + " calculated attribute\n", + "
6Gabrielle Davis2
7Lindsey Roman2
14Nicholas Martin3
19Derek Wright2
20Kevin Hurst3
25Melanie Herrera2
27Sherri Baker2
29Lisa Hernandez2
\n", + "

...

\n", + "

Total: 49

\n", + " " + ], + "text/plain": [ + "*person_id name n_advanced \n", + "+-----------+ +------------+ +------------+\n", + "6 Gabrielle Davi 2 \n", + "7 Lindsey Roman 2 \n", + "14 Nicholas Marti 3 \n", + "19 Derek Wright 2 \n", + "20 Kevin Hurst 3 \n", + "25 Melanie Herrer 2 \n", + "27 Sherri Baker 2 \n", + "29 Lisa Hernandez 2 \n", + " ...\n", + " (Total: 49)" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Find people with C1+ proficiency in multiple languages\n", + "advanced_polyglots = Person.aggr(\n", + " Proficiency & 'cefr_level >= \"C1\"',\n", + " 'name',\n", + " n_advanced='COUNT(*)'\n", + ") & 'n_advanced >= 2'\n", + "\n", + "print(f\"Advanced in 2+ languages: {len(advanced_polyglots)}\")\n", + "advanced_polyglots" + ] + }, + { + "cell_type": "markdown", + "id": "cell-summary-md", + "metadata": {}, + "source": [ + "## Key Concepts\n", + "\n", + "| Pattern | Implementation |\n", + "|---------|----------------|\n", + "| **Many-to-many** | `Proficiency` links `Person` and `Language` |\n", + "| **Lookup tables** | `Language` and `CEFRLevel` with `contents` |\n", + "| **Association data** | `cefr_level` stored in the association table |\n", + "| **Standards** | ISO 639-1 codes, CEFR levels |\n", + "\n", + "### Benefits of Lookup Tables\n", + "\n", + "1. **Data consistency** β€” Only valid codes can be used\n", + "2. **Rich metadata** β€” Full names, descriptions stored once\n", + "3. **Easy updates** β€” Change \"EspaΓ±ol\" to \"Spanish\" in one place\n", + "4. **Self-documenting** β€” `Language()` shows all valid options\n", + "\n", + "## Next Steps\n", + "\n", + "- [University Database](university.ipynb) β€” Academic records\n", + "- [Hotel Reservations](hotel-reservations.ipynb) β€” Workflow dependencies\n", + "- [Queries Tutorial](../basics/04-queries.ipynb) β€” Query operators in depth" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "cell-cleanup", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:32.450972Z", + "iopub.status.busy": "2026-01-14T07:35:32.450885Z", + "iopub.status.idle": "2026-01-14T07:35:32.469539Z", + "shell.execute_reply": "2026-01-14T07:35:32.469253Z" + } + }, + "outputs": [], + "source": [ + "# Cleanup\n", + "schema.drop(prompt=False)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/src/tutorials/examples/university.ipynb b/src/tutorials/examples/university.ipynb new file mode 100644 index 00000000..9cb74631 --- /dev/null +++ b/src/tutorials/examples/university.ipynb @@ -0,0 +1,6551 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "cell-intro", + "metadata": {}, + "source": [ + "# University Database\n", + "\n", + "This tutorial builds a complete university registration system to demonstrate:\n", + "\n", + "- **Schema design** with realistic relationships\n", + "- **Data population** using Faker for synthetic data\n", + "- **Rich query patterns** from simple to complex\n", + "\n", + "University databases are classic examples because everyone understands students, courses, enrollments, and grades. The domain naturally demonstrates:\n", + "\n", + "- One-to-many relationships (department β†’ courses)\n", + "- Many-to-many relationships (students ↔ courses via enrollments)\n", + "- Workflow dependencies (enrollment requires both student and section to exist)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "cell-setup", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:34.876825Z", + "iopub.status.busy": "2026-01-14T07:35:34.876724Z", + "iopub.status.idle": "2026-01-14T07:35:35.644065Z", + "shell.execute_reply": "2026-01-14T07:35:35.643762Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2026-01-14 01:35:35,636][INFO]: DataJoint 2.0.0a22 connected to root@127.0.0.1:3306\n" + ] + } + ], + "source": [ + "import datajoint as dj\n", + "import numpy as np\n", + "from datetime import date\n", + "\n", + "schema = dj.Schema('tutorial_university')" + ] + }, + { + "cell_type": "markdown", + "id": "cell-schema-intro", + "metadata": {}, + "source": [ + "## Schema Design\n", + "\n", + "Our university schema models:\n", + "\n", + "| Table | Purpose |\n", + "|-------|--------|\n", + "| `Student` | Student records with contact info |\n", + "| `Department` | Academic departments |\n", + "| `StudentMajor` | Student-declared majors |\n", + "| `Course` | Course catalog |\n", + "| `Term` | Academic terms (Spring/Summer/Fall) |\n", + "| `Section` | Course offerings in specific terms |\n", + "| `Enroll` | Student enrollments in sections |\n", + "| `LetterGrade` | Grade scale (lookup) |\n", + "| `Grade` | Assigned grades |" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "cell-student", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:35.646114Z", + "iopub.status.busy": "2026-01-14T07:35:35.645872Z", + "iopub.status.idle": "2026-01-14T07:35:35.669330Z", + "shell.execute_reply": "2026-01-14T07:35:35.669007Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class Student(dj.Manual):\n", + " definition = \"\"\"\n", + " student_id : uint32 # university-wide ID\n", + " ---\n", + " first_name : varchar(40)\n", + " last_name : varchar(40)\n", + " sex : enum('F', 'M', 'U')\n", + " date_of_birth : date\n", + " home_city : varchar(60)\n", + " home_state : char(2) # US state code\n", + " \"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "cell-dept", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:35.671010Z", + "iopub.status.busy": "2026-01-14T07:35:35.670897Z", + "iopub.status.idle": "2026-01-14T07:35:35.685070Z", + "shell.execute_reply": "2026-01-14T07:35:35.684737Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class Department(dj.Manual):\n", + " definition = \"\"\"\n", + " dept : varchar(6) # e.g. BIOL, CS, MATH\n", + " ---\n", + " dept_name : varchar(200)\n", + " \"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "cell-major", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:35.686733Z", + "iopub.status.busy": "2026-01-14T07:35:35.686620Z", + "iopub.status.idle": "2026-01-14T07:35:35.716039Z", + "shell.execute_reply": "2026-01-14T07:35:35.715692Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class StudentMajor(dj.Manual):\n", + " definition = \"\"\"\n", + " -> Student\n", + " ---\n", + " -> Department\n", + " declare_date : date\n", + " \"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "cell-course", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:35.717744Z", + "iopub.status.busy": "2026-01-14T07:35:35.717629Z", + "iopub.status.idle": "2026-01-14T07:35:35.733889Z", + "shell.execute_reply": "2026-01-14T07:35:35.733604Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class Course(dj.Manual):\n", + " definition = \"\"\"\n", + " -> Department\n", + " course : uint32 # course number, e.g. 1010\n", + " ---\n", + " course_name : varchar(200)\n", + " credits : decimal(3,1)\n", + " \"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "cell-term", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:35.735515Z", + "iopub.status.busy": "2026-01-14T07:35:35.735406Z", + "iopub.status.idle": "2026-01-14T07:35:35.751177Z", + "shell.execute_reply": "2026-01-14T07:35:35.750771Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2026-01-14 01:35:35,736][WARNING]: Native type 'year' is used in attribute 'term_year'. Consider using a core DataJoint type for better portability.\n" + ] + } + ], + "source": [ + "@schema\n", + "class Term(dj.Manual):\n", + " definition = \"\"\"\n", + " term_year : year\n", + " term : enum('Spring', 'Summer', 'Fall')\n", + " \"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "cell-section", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:35.752705Z", + "iopub.status.busy": "2026-01-14T07:35:35.752588Z", + "iopub.status.idle": "2026-01-14T07:35:35.786162Z", + "shell.execute_reply": "2026-01-14T07:35:35.785880Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class Section(dj.Manual):\n", + " definition = \"\"\"\n", + " -> Course\n", + " -> Term\n", + " section : char(1)\n", + " ---\n", + " auditorium : varchar(12)\n", + " \"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "cell-enroll", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:35.787635Z", + "iopub.status.busy": "2026-01-14T07:35:35.787541Z", + "iopub.status.idle": "2026-01-14T07:35:35.814829Z", + "shell.execute_reply": "2026-01-14T07:35:35.814525Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class Enroll(dj.Manual):\n", + " definition = \"\"\"\n", + " -> Student\n", + " -> Section\n", + " \"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "cell-lettergrade", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:35.816272Z", + "iopub.status.busy": "2026-01-14T07:35:35.816165Z", + "iopub.status.idle": "2026-01-14T07:35:35.836087Z", + "shell.execute_reply": "2026-01-14T07:35:35.835726Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class LetterGrade(dj.Lookup):\n", + " definition = \"\"\"\n", + " grade : char(2)\n", + " ---\n", + " points : decimal(3,2)\n", + " \"\"\"\n", + " contents = [\n", + " ['A', 4.00], ['A-', 3.67],\n", + " ['B+', 3.33], ['B', 3.00], ['B-', 2.67],\n", + " ['C+', 2.33], ['C', 2.00], ['C-', 1.67],\n", + " ['D+', 1.33], ['D', 1.00],\n", + " ['F', 0.00]\n", + " ]" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "cell-grade", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:35.837627Z", + "iopub.status.busy": "2026-01-14T07:35:35.837510Z", + "iopub.status.idle": "2026-01-14T07:35:35.866951Z", + "shell.execute_reply": "2026-01-14T07:35:35.866606Z" + } + }, + "outputs": [], + "source": [ + "@schema\n", + "class Grade(dj.Manual):\n", + " definition = \"\"\"\n", + " -> Enroll\n", + " ---\n", + " -> LetterGrade\n", + " \"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "cell-diagram", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:35.868558Z", + "iopub.status.busy": "2026-01-14T07:35:35.868437Z", + "iopub.status.idle": "2026-01-14T07:35:36.227828Z", + "shell.execute_reply": "2026-01-14T07:35:36.227435Z" + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "LetterGrade\n", + "\n", + "\n", + "LetterGrade\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Grade\n", + "\n", + "\n", + "Grade\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "LetterGrade->Grade\n", + "\n", + "\n", + "\n", + "\n", + "Course\n", + "\n", + "\n", + "Course\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Section\n", + "\n", + "\n", + "Section\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Course->Section\n", + "\n", + "\n", + "\n", + "\n", + "Department\n", + "\n", + "\n", + "Department\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Department->Course\n", + "\n", + "\n", + "\n", + "\n", + "StudentMajor\n", + "\n", + "\n", + "StudentMajor\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Department->StudentMajor\n", + "\n", + "\n", + "\n", + "\n", + "Enroll\n", + "\n", + "\n", + "Enroll\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Enroll->Grade\n", + "\n", + "\n", + "\n", + "\n", + "Section->Enroll\n", + "\n", + "\n", + "\n", + "\n", + "Student\n", + "\n", + "\n", + "Student\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Student->Enroll\n", + "\n", + "\n", + "\n", + "\n", + "Student->StudentMajor\n", + "\n", + "\n", + "\n", + "\n", + "Term\n", + "\n", + "\n", + "Term\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Term->Section\n", + "\n", + "\n", + "\n", + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dj.Diagram(schema)" + ] + }, + { + "cell_type": "markdown", + "id": "cell-populate-intro", + "metadata": {}, + "source": [ + "## Populate with Synthetic Data\n", + "\n", + "We use [Faker](https://faker.readthedocs.io/) to generate realistic student data." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "cell-faker-setup", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:36.229527Z", + "iopub.status.busy": "2026-01-14T07:35:36.229358Z", + "iopub.status.idle": "2026-01-14T07:35:36.281953Z", + "shell.execute_reply": "2026-01-14T07:35:36.281650Z" + } + }, + "outputs": [], + "source": [ + "import faker\n", + "import random\n", + "\n", + "fake = faker.Faker()\n", + "faker.Faker.seed(42)\n", + "random.seed(42)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "cell-populate-students", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:36.283692Z", + "iopub.status.busy": "2026-01-14T07:35:36.283555Z", + "iopub.status.idle": "2026-01-14T07:35:36.373290Z", + "shell.execute_reply": "2026-01-14T07:35:36.373003Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Inserted 500 students\n" + ] + } + ], + "source": [ + "def generate_students(n=500):\n", + " \"\"\"Generate n student records.\"\"\"\n", + " fake_name = {'F': fake.name_female, 'M': fake.name_male}\n", + " for student_id in range(1000, 1000 + n):\n", + " sex = random.choice(['F', 'M'])\n", + " name = fake_name[sex]().split()[:2]\n", + " yield {\n", + " 'student_id': student_id,\n", + " 'first_name': name[0],\n", + " 'last_name': name[-1],\n", + " 'sex': sex,\n", + " 'date_of_birth': fake.date_between(\n", + " start_date='-35y', end_date='-17y'),\n", + " 'home_city': fake.city(),\n", + " 'home_state': fake.state_abbr()\n", + " }\n", + "\n", + "Student.insert(generate_students(500))\n", + "print(f\"Inserted {len(Student())} students\")" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "cell-populate-depts", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:36.374651Z", + "iopub.status.busy": "2026-01-14T07:35:36.374541Z", + "iopub.status.idle": "2026-01-14T07:35:36.396565Z", + "shell.execute_reply": "2026-01-14T07:35:36.396309Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "378 students declared majors\n" + ] + } + ], + "source": [ + "# Departments\n", + "Department.insert([\n", + " {'dept': 'CS', 'dept_name': 'Computer Science'},\n", + " {'dept': 'BIOL', 'dept_name': 'Life Sciences'},\n", + " {'dept': 'PHYS', 'dept_name': 'Physics'},\n", + " {'dept': 'MATH', 'dept_name': 'Mathematics'},\n", + "])\n", + "\n", + "# Assign majors to ~75% of students\n", + "students = Student.keys()\n", + "depts = Department.keys()\n", + "StudentMajor.insert(\n", + " {\n", + " **s, **random.choice(depts),\n", + " 'declare_date': fake.date_between(start_date='-4y')\n", + " }\n", + " for s in students if random.random() < 0.75\n", + ")\n", + "print(f\"{len(StudentMajor())} students declared majors\")" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "cell-populate-courses", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:36.397918Z", + "iopub.status.busy": "2026-01-14T07:35:36.397799Z", + "iopub.status.idle": "2026-01-14T07:35:36.403088Z", + "shell.execute_reply": "2026-01-14T07:35:36.402828Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "15 courses in catalog\n" + ] + } + ], + "source": [ + "# Course catalog\n", + "Course.insert([\n", + " ['BIOL', 1010, 'Biology in the 21st Century', 3],\n", + " ['BIOL', 2020, 'Principles of Cell Biology', 3],\n", + " ['BIOL', 2325, 'Human Anatomy', 4],\n", + " ['BIOL', 2420, 'Human Physiology', 4],\n", + " ['PHYS', 2210, 'Physics for Scientists I', 4],\n", + " ['PHYS', 2220, 'Physics for Scientists II', 4],\n", + " ['PHYS', 2060, 'Quantum Mechanics', 3],\n", + " ['MATH', 1210, 'Calculus I', 4],\n", + " ['MATH', 1220, 'Calculus II', 4],\n", + " ['MATH', 2270, 'Linear Algebra', 4],\n", + " ['MATH', 2280, 'Differential Equations', 4],\n", + " ['CS', 1410, 'Intro to Object-Oriented Programming', 4],\n", + " ['CS', 2420, 'Data Structures & Algorithms', 4],\n", + " ['CS', 3500, 'Software Practice', 4],\n", + " ['CS', 3810, 'Computer Organization', 4],\n", + "])\n", + "print(f\"{len(Course())} courses in catalog\")" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "cell-populate-terms", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:36.404420Z", + "iopub.status.busy": "2026-01-14T07:35:36.404324Z", + "iopub.status.idle": "2026-01-14T07:35:36.709560Z", + "shell.execute_reply": "2026-01-14T07:35:36.709264Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "339 sections created\n" + ] + } + ], + "source": [ + "# Academic terms 2020-2024\n", + "Term.insert(\n", + " {'term_year': year, 'term': term}\n", + " for year in range(2020, 2025)\n", + " for term in ['Spring', 'Summer', 'Fall']\n", + ")\n", + "\n", + "# Create sections for each course-term with 1-3 sections\n", + "for course in Course.keys():\n", + " for term in Term.keys():\n", + " for sec in 'abc'[:random.randint(1, 3)]:\n", + " if random.random() < 0.7: # Not every course every term\n", + " Section.insert1({\n", + " **course, **term,\n", + " 'section': sec,\n", + " 'auditorium': f\"{random.choice('ABCDEF')}\"\n", + " f\"{random.randint(100, 400)}\"\n", + " }, skip_duplicates=True)\n", + "\n", + "print(f\"{len(Section())} sections created\")" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "cell-populate-enroll", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:36.710932Z", + "iopub.status.busy": "2026-01-14T07:35:36.710814Z", + "iopub.status.idle": "2026-01-14T07:35:45.399230Z", + "shell.execute_reply": "2026-01-14T07:35:45.398898Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "5787 enrollments\n" + ] + } + ], + "source": [ + "# Enroll students in courses\n", + "terms = Term.keys()\n", + "for student in Student.keys():\n", + " # Each student enrolls over 2-6 random terms\n", + " student_terms = random.sample(terms, k=random.randint(2, 6))\n", + " for term in student_terms:\n", + " # Take 2-4 courses per term\n", + " available = (Section & term).keys()\n", + " if available:\n", + " n_courses = min(random.randint(2, 4), len(available))\n", + " for section in random.sample(available, k=n_courses):\n", + " Enroll.insert1(\n", + " {**student, **section}, skip_duplicates=True)\n", + "\n", + "print(f\"{len(Enroll())} enrollments\")" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "cell-populate-grades", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:45.400773Z", + "iopub.status.busy": "2026-01-14T07:35:45.400652Z", + "iopub.status.idle": "2026-01-14T07:35:52.682278Z", + "shell.execute_reply": "2026-01-14T07:35:52.681891Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "5178 grades assigned\n" + ] + } + ], + "source": [ + "# Assign grades to ~90% of enrollments (some incomplete)\n", + "grades = LetterGrade.to_arrays('grade')\n", + "# Weight toward B/C range\n", + "weights = [5, 8, 10, 15, 12, 10, 15, 10, 5, 5, 5]\n", + "\n", + "for enroll in Enroll.keys():\n", + " if random.random() < 0.9:\n", + " Grade.insert1({**enroll, 'grade': random.choices(grades, weights=weights)[0]})\n", + "\n", + "print(f\"{len(Grade())} grades assigned\")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-query-intro", + "metadata": {}, + "source": [ + "## Querying Data\n", + "\n", + "DataJoint queries are composable expressions. Displaying a query shows a preview; use `fetch()` to retrieve data." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "cell-display-limit", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:52.683954Z", + "iopub.status.busy": "2026-01-14T07:35:52.683824Z", + "iopub.status.idle": "2026-01-14T07:35:52.685729Z", + "shell.execute_reply": "2026-01-14T07:35:52.685471Z" + } + }, + "outputs": [], + "source": [ + "dj.config['display.limit'] = 8 # Limit preview rows" + ] + }, + { + "cell_type": "markdown", + "id": "cell-restriction-intro", + "metadata": {}, + "source": [ + "### Restriction (`&` and `-`)\n", + "\n", + "Filter rows using `&` (keep matching) or `-` (remove matching)." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "cell-restriction-1", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:52.687124Z", + "iopub.status.busy": "2026-01-14T07:35:52.687005Z", + "iopub.status.idle": "2026-01-14T07:35:52.692610Z", + "shell.execute_reply": "2026-01-14T07:35:52.692371Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

student_id

\n", + " university-wide ID\n", + "
\n", + "

first_name

\n", + " \n", + "
\n", + "

last_name

\n", + " \n", + "
\n", + "

sex

\n", + " \n", + "
\n", + "

date_of_birth

\n", + " \n", + "
\n", + "

home_city

\n", + " \n", + "
\n", + "

home_state

\n", + " US state code\n", + "
1073KyleMartinezM2008-09-28West AmandastadCA
1092ChristinaWilsonF1995-01-30West MargaretCA
1157KellyFosterF1996-08-14JeffreyburghCA
1194NicholasBuckM2002-02-07HilltonCA
1203HeatherArmstrongF1999-06-13New NicoleCA
\n", + " \n", + "

Total: 5

\n", + " " + ], + "text/plain": [ + "*student_id first_name last_name sex date_of_birth home_city home_state \n", + "+------------+ +------------+ +-----------+ +-----+ +------------+ +------------+ +------------+\n", + "1073 Kyle Martinez M 2008-09-28 West Amandasta CA \n", + "1092 Christina Wilson F 1995-01-30 West Margaret CA \n", + "1157 Kelly Foster F 1996-08-14 Jeffreyburgh CA \n", + "1194 Nicholas Buck M 2002-02-07 Hillton CA \n", + "1203 Heather Armstrong F 1999-06-13 New Nicole CA \n", + " (Total: 5)" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Students from California\n", + "Student & {'home_state': 'CA'}" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "cell-restriction-2", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:52.693806Z", + "iopub.status.busy": "2026-01-14T07:35:52.693710Z", + "iopub.status.idle": "2026-01-14T07:35:52.698880Z", + "shell.execute_reply": "2026-01-14T07:35:52.698590Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

student_id

\n", + " university-wide ID\n", + "
\n", + "

first_name

\n", + " \n", + "
\n", + "

last_name

\n", + " \n", + "
\n", + "

sex

\n", + " \n", + "
\n", + "

date_of_birth

\n", + " \n", + "
\n", + "

home_city

\n", + " \n", + "
\n", + "

home_state

\n", + " US state code\n", + "
1000AllisonHillF1995-01-20Lake JoysideCO
1001AmandaDavisF1995-03-23New JamessideMT
1003TinaRogersF1992-09-14West MelanieviewAS
1004JuliaMartinezF2007-08-21New KellystadOK
1005AndreaStanleyF2004-12-13Port JessevilleMS
1006MadisonDiazF1997-09-12Lake JosephTX
1007LisaJacksonF2004-02-28South NoahSC
1009ChristineHahnF2006-10-23JasonfortMO
\n", + "

...

\n", + "

Total: 258

\n", + " " + ], + "text/plain": [ + "*student_id first_name last_name sex date_of_birth home_city home_state \n", + "+------------+ +------------+ +-----------+ +-----+ +------------+ +------------+ +------------+\n", + "1000 Allison Hill F 1995-01-20 Lake Joyside CO \n", + "1001 Amanda Davis F 1995-03-23 New Jamesside MT \n", + "1003 Tina Rogers F 1992-09-14 West Melanievi AS \n", + "1004 Julia Martinez F 2007-08-21 New Kellystad OK \n", + "1005 Andrea Stanley F 2004-12-13 Port Jessevill MS \n", + "1006 Madison Diaz F 1997-09-12 Lake Joseph TX \n", + "1007 Lisa Jackson F 2004-02-28 South Noah SC \n", + "1009 Christine Hahn F 2006-10-23 Jasonfort MO \n", + " ...\n", + " (Total: 258)" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Female students NOT from California\n", + "(Student & {'sex': 'F'}) - {'home_state': 'CA'}" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "cell-restriction-3", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:52.700243Z", + "iopub.status.busy": "2026-01-14T07:35:52.700133Z", + "iopub.status.idle": "2026-01-14T07:35:52.705497Z", + "shell.execute_reply": "2026-01-14T07:35:52.705237Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

student_id

\n", + " university-wide ID\n", + "
\n", + "

first_name

\n", + " \n", + "
\n", + "

last_name

\n", + " \n", + "
\n", + "

sex

\n", + " \n", + "
\n", + "

date_of_birth

\n", + " \n", + "
\n", + "

home_city

\n", + " \n", + "
\n", + "

home_state

\n", + " US state code\n", + "
1006MadisonDiazF1997-09-12Lake JosephTX
1014AshleyGrahamF1999-03-15TeresaburghNY
1073KyleMartinezM2008-09-28West AmandastadCA
1092ChristinaWilsonF1995-01-30West MargaretCA
1136BethFisherF1993-01-30South ShanestadNY
1149EmilyNguyenF2007-12-24North ErictonTX
1157KellyFosterF1996-08-14JeffreyburghCA
1163TiffanyStevensonF1991-10-10West CassidyNY
\n", + "

...

\n", + "

Total: 22

\n", + " " + ], + "text/plain": [ + "*student_id first_name last_name sex date_of_birth home_city home_state \n", + "+------------+ +------------+ +-----------+ +-----+ +------------+ +------------+ +------------+\n", + "1006 Madison Diaz F 1997-09-12 Lake Joseph TX \n", + "1014 Ashley Graham F 1999-03-15 Teresaburgh NY \n", + "1073 Kyle Martinez M 2008-09-28 West Amandasta CA \n", + "1092 Christina Wilson F 1995-01-30 West Margaret CA \n", + "1136 Beth Fisher F 1993-01-30 South Shanesta NY \n", + "1149 Emily Nguyen F 2007-12-24 North Ericton TX \n", + "1157 Kelly Foster F 1996-08-14 Jeffreyburgh CA \n", + "1163 Tiffany Stevenson F 1991-10-10 West Cassidy NY \n", + " ...\n", + " (Total: 22)" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# SQL-style string conditions\n", + "Student & 'home_state IN (\"CA\", \"TX\", \"NY\")'" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "cell-restriction-4", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:52.706814Z", + "iopub.status.busy": "2026-01-14T07:35:52.706728Z", + "iopub.status.idle": "2026-01-14T07:35:52.712211Z", + "shell.execute_reply": "2026-01-14T07:35:52.711902Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

student_id

\n", + " university-wide ID\n", + "
\n", + "

first_name

\n", + " \n", + "
\n", + "

last_name

\n", + " \n", + "
\n", + "

sex

\n", + " \n", + "
\n", + "

date_of_birth

\n", + " \n", + "
\n", + "

home_city

\n", + " \n", + "
\n", + "

home_state

\n", + " US state code\n", + "
1006MadisonDiazF1997-09-12Lake JosephTX
1073KyleMartinezM2008-09-28West AmandastadCA
1092ChristinaWilsonF1995-01-30West MargaretCA
1149EmilyNguyenF2007-12-24North ErictonTX
1157KellyFosterF1996-08-14JeffreyburghCA
1194NicholasBuckM2002-02-07HilltonCA
1203HeatherArmstrongF1999-06-13New NicoleCA
1267AngelaColeF1997-09-18North JosephTX
\n", + "

...

\n", + "

Total: 14

\n", + " " + ], + "text/plain": [ + "*student_id first_name last_name sex date_of_birth home_city home_state \n", + "+------------+ +------------+ +-----------+ +-----+ +------------+ +------------+ +------------+\n", + "1006 Madison Diaz F 1997-09-12 Lake Joseph TX \n", + "1073 Kyle Martinez M 2008-09-28 West Amandasta CA \n", + "1092 Christina Wilson F 1995-01-30 West Margaret CA \n", + "1149 Emily Nguyen F 2007-12-24 North Ericton TX \n", + "1157 Kelly Foster F 1996-08-14 Jeffreyburgh CA \n", + "1194 Nicholas Buck M 2002-02-07 Hillton CA \n", + "1203 Heather Armstrong F 1999-06-13 New Nicole CA \n", + "1267 Angela Cole F 1997-09-18 North Joseph TX \n", + " ...\n", + " (Total: 14)" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# OR conditions using a list\n", + "Student & [{'home_state': 'CA'}, {'home_state': 'TX'}]" + ] + }, + { + "cell_type": "markdown", + "id": "cell-subquery-intro", + "metadata": {}, + "source": [ + "### Subqueries in Restrictions\n", + "\n", + "Use another query as a restriction condition." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "cell-subquery-1", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:52.713712Z", + "iopub.status.busy": "2026-01-14T07:35:52.713598Z", + "iopub.status.idle": "2026-01-14T07:35:52.719747Z", + "shell.execute_reply": "2026-01-14T07:35:52.719493Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

student_id

\n", + " university-wide ID\n", + "
\n", + "

first_name

\n", + " \n", + "
\n", + "

last_name

\n", + " \n", + "
\n", + "

sex

\n", + " \n", + "
\n", + "

date_of_birth

\n", + " \n", + "
\n", + "

home_city

\n", + " \n", + "
\n", + "

home_state

\n", + " US state code\n", + "
1012LoriConnerF1998-08-20South PatrickmouthNC
1014AshleyGrahamF1999-03-15TeresaburghNY
1023DavidKennedyM1998-05-13North DonnastadNE
1024ScottBrownM2002-10-18North RichardmouthAS
1041KevinHernandezM1993-04-30MichaeltonMH
1048JessicaChandlerF1996-09-06South RachelboroughKS
1051EdwardMartinezM1998-08-09ByrdburghRI
1053JohnRamosM1994-11-18LeonburghTN
\n", + "

...

\n", + "

Total: 90

\n", + " " + ], + "text/plain": [ + "*student_id first_name last_name sex date_of_birth home_city home_state \n", + "+------------+ +------------+ +-----------+ +-----+ +------------+ +------------+ +------------+\n", + "1012 Lori Conner F 1998-08-20 South Patrickm NC \n", + "1014 Ashley Graham F 1999-03-15 Teresaburgh NY \n", + "1023 David Kennedy M 1998-05-13 North Donnasta NE \n", + "1024 Scott Brown M 2002-10-18 North Richardm AS \n", + "1041 Kevin Hernandez M 1993-04-30 Michaelton MH \n", + "1048 Jessica Chandler F 1996-09-06 South Rachelbo KS \n", + "1051 Edward Martinez M 1998-08-09 Byrdburgh RI \n", + "1053 John Ramos M 1994-11-18 Leonburgh TN \n", + " ...\n", + " (Total: 90)" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Students majoring in Computer Science\n", + "Student & (StudentMajor & {'dept': 'CS'})" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "cell-subquery-2", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:52.721038Z", + "iopub.status.busy": "2026-01-14T07:35:52.720929Z", + "iopub.status.idle": "2026-01-14T07:35:52.727899Z", + "shell.execute_reply": "2026-01-14T07:35:52.727633Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

student_id

\n", + " university-wide ID\n", + "
\n", + "

first_name

\n", + " \n", + "
\n", + "

last_name

\n", + " \n", + "
\n", + "

sex

\n", + " \n", + "
\n", + "

date_of_birth

\n", + " \n", + "
\n", + "

home_city

\n", + " \n", + "
\n", + "

home_state

\n", + " US state code\n", + "
1020JessicaHolmesF1993-03-19North MatthewOR
1022JoseRamirezM1999-10-10Lake SelenaOK
1040JuanPattersonM1991-03-18Lake RebeccasideAZ
1059StephanieSimmonsF2007-05-11MerrittfortNV
1061DonnaNelsonF1996-10-15East EdwardfurtUT
1096NicoleRuizF2002-10-06HowardshireNE
1124TonyaTaylorF2008-06-06CoffeysideMN
1141SamanthaRossF2004-03-02RonaldviewMN
\n", + "

...

\n", + "

Total: 37

\n", + " " + ], + "text/plain": [ + "*student_id first_name last_name sex date_of_birth home_city home_state \n", + "+------------+ +------------+ +-----------+ +-----+ +------------+ +------------+ +------------+\n", + "1020 Jessica Holmes F 1993-03-19 North Matthew OR \n", + "1022 Jose Ramirez M 1999-10-10 Lake Selena OK \n", + "1040 Juan Patterson M 1991-03-18 Lake Rebeccasi AZ \n", + "1059 Stephanie Simmons F 2007-05-11 Merrittfort NV \n", + "1061 Donna Nelson F 1996-10-15 East Edwardfur UT \n", + "1096 Nicole Ruiz F 2002-10-06 Howardshire NE \n", + "1124 Tonya Taylor F 2008-06-06 Coffeyside MN \n", + "1141 Samantha Ross F 2004-03-02 Ronaldview MN \n", + " ...\n", + " (Total: 37)" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Students who have NOT taken any Math courses\n", + "Student - (Enroll & {'dept': 'MATH'})" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "cell-subquery-3", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:52.729117Z", + "iopub.status.busy": "2026-01-14T07:35:52.729033Z", + "iopub.status.idle": "2026-01-14T07:35:52.744360Z", + "shell.execute_reply": "2026-01-14T07:35:52.744074Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

student_id

\n", + " university-wide ID\n", + "
\n", + "

first_name

\n", + " \n", + "
\n", + "

last_name

\n", + " \n", + "
\n", + "

sex

\n", + " \n", + "
\n", + "

date_of_birth

\n", + " \n", + "
\n", + "

home_city

\n", + " \n", + "
\n", + "

home_state

\n", + " US state code\n", + "
1000AllisonHillF1995-01-20Lake JoysideCO
1001AmandaDavisF1995-03-23New JamessideMT
1002KevinPachecoM1991-02-25Lake RobertoKY
1003TinaRogersF1992-09-14West MelanieviewAS
1004JuliaMartinezF2007-08-21New KellystadOK
1005AndreaStanleyF2004-12-13Port JessevilleMS
1006MadisonDiazF1997-09-12Lake JosephTX
1007LisaJacksonF2004-02-28South NoahSC
\n", + "

...

\n", + "

Total: 340

\n", + " " + ], + "text/plain": [ + "*student_id first_name last_name sex date_of_birth home_city home_state \n", + "+------------+ +------------+ +-----------+ +-----+ +------------+ +------------+ +------------+\n", + "1000 Allison Hill F 1995-01-20 Lake Joyside CO \n", + "1001 Amanda Davis F 1995-03-23 New Jamesside MT \n", + "1002 Kevin Pacheco M 1991-02-25 Lake Roberto KY \n", + "1003 Tina Rogers F 1992-09-14 West Melanievi AS \n", + "1004 Julia Martinez F 2007-08-21 New Kellystad OK \n", + "1005 Andrea Stanley F 2004-12-13 Port Jessevill MS \n", + "1006 Madison Diaz F 1997-09-12 Lake Joseph TX \n", + "1007 Lisa Jackson F 2004-02-28 South Noah SC \n", + " ...\n", + " (Total: 340)" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Students with ungraded enrollments (enrolled but no grade yet)\n", + "Student & (Enroll - Grade)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "cell-subquery-4", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:52.745622Z", + "iopub.status.busy": "2026-01-14T07:35:52.745528Z", + "iopub.status.idle": "2026-01-14T07:35:52.758232Z", + "shell.execute_reply": "2026-01-14T07:35:52.757933Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "
\n", + "

student_id

\n", + " university-wide ID\n", + "
\n", + "

first_name

\n", + " \n", + "
\n", + "

last_name

\n", + " \n", + "
\n", + "

sex

\n", + " \n", + "
\n", + "

date_of_birth

\n", + " \n", + "
\n", + "

home_city

\n", + " \n", + "
\n", + "

home_state

\n", + " US state code\n", + "
\n", + " \n", + "

Total: 0

\n", + " " + ], + "text/plain": [ + "*student_id first_name last_name sex date_of_birth home_city home_state \n", + "+------------+ +------------+ +-----------+ +-----+ +------------+ +-----------+ +------------+\n", + "\n", + " (Total: 0)" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# All-A students: have grades AND no non-A grades\n", + "all_a = (Student & Grade) - (Grade - {'grade': 'A'})\n", + "all_a" + ] + }, + { + "cell_type": "markdown", + "id": "cell-proj-intro", + "metadata": {}, + "source": [ + "### Projection (`.proj()`)\n", + "\n", + "Select, rename, or compute attributes." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "cell-proj-1", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:52.759535Z", + "iopub.status.busy": "2026-01-14T07:35:52.759451Z", + "iopub.status.idle": "2026-01-14T07:35:52.763896Z", + "shell.execute_reply": "2026-01-14T07:35:52.763706Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

student_id

\n", + " university-wide ID\n", + "
\n", + "

first_name

\n", + " \n", + "
\n", + "

last_name

\n", + " \n", + "
1000AllisonHill
1001AmandaDavis
1002KevinPacheco
1003TinaRogers
1004JuliaMartinez
1005AndreaStanley
1006MadisonDiaz
1007LisaJackson
\n", + "

...

\n", + "

Total: 500

\n", + " " + ], + "text/plain": [ + "*student_id first_name last_name \n", + "+------------+ +------------+ +-----------+\n", + "1000 Allison Hill \n", + "1001 Amanda Davis \n", + "1002 Kevin Pacheco \n", + "1003 Tina Rogers \n", + "1004 Julia Martinez \n", + "1005 Andrea Stanley \n", + "1006 Madison Diaz \n", + "1007 Lisa Jackson \n", + " ...\n", + " (Total: 500)" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Select specific attributes\n", + "Student.proj('first_name', 'last_name')" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "cell-proj-2", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:52.765142Z", + "iopub.status.busy": "2026-01-14T07:35:52.765057Z", + "iopub.status.idle": "2026-01-14T07:35:52.769246Z", + "shell.execute_reply": "2026-01-14T07:35:52.769012Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

student_id

\n", + " university-wide ID\n", + "
\n", + "

full_name

\n", + " calculated attribute\n", + "
1000Allison Hill
1001Amanda Davis
1002Kevin Pacheco
1003Tina Rogers
1004Julia Martinez
1005Andrea Stanley
1006Madison Diaz
1007Lisa Jackson
\n", + "

...

\n", + "

Total: 500

\n", + " " + ], + "text/plain": [ + "*student_id full_name \n", + "+------------+ +------------+\n", + "1000 Allison Hill \n", + "1001 Amanda Davis \n", + "1002 Kevin Pacheco \n", + "1003 Tina Rogers \n", + "1004 Julia Martinez\n", + "1005 Andrea Stanley\n", + "1006 Madison Diaz \n", + "1007 Lisa Jackson \n", + " ...\n", + " (Total: 500)" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Computed attribute: full name\n", + "Student.proj(full_name=\"CONCAT(first_name, ' ', last_name)\")" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "cell-proj-3", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:52.770406Z", + "iopub.status.busy": "2026-01-14T07:35:52.770313Z", + "iopub.status.idle": "2026-01-14T07:35:52.775032Z", + "shell.execute_reply": "2026-01-14T07:35:52.774774Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

student_id

\n", + " university-wide ID\n", + "
\n", + "

first_name

\n", + " \n", + "
\n", + "

last_name

\n", + " \n", + "
\n", + "

age

\n", + " calculated attribute\n", + "
1000AllisonHill30
1001AmandaDavis30
1002KevinPacheco34
1003TinaRogers33
1004JuliaMartinez18
1005AndreaStanley21
1006MadisonDiaz28
1007LisaJackson21
\n", + "

...

\n", + "

Total: 500

\n", + " " + ], + "text/plain": [ + "*student_id first_name last_name age \n", + "+------------+ +------------+ +-----------+ +-----+\n", + "1000 Allison Hill 30 \n", + "1001 Amanda Davis 30 \n", + "1002 Kevin Pacheco 34 \n", + "1003 Tina Rogers 33 \n", + "1004 Julia Martinez 18 \n", + "1005 Andrea Stanley 21 \n", + "1006 Madison Diaz 28 \n", + "1007 Lisa Jackson 21 \n", + " ...\n", + " (Total: 500)" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Calculate age in years\n", + "Student.proj('first_name', 'last_name', \n", + " age='TIMESTAMPDIFF(YEAR, date_of_birth, CURDATE())')" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "cell-proj-4", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:52.776248Z", + "iopub.status.busy": "2026-01-14T07:35:52.776172Z", + "iopub.status.idle": "2026-01-14T07:35:52.780691Z", + "shell.execute_reply": "2026-01-14T07:35:52.780449Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

student_id

\n", + " university-wide ID\n", + "
\n", + "

first_name

\n", + " \n", + "
\n", + "

last_name

\n", + " \n", + "
\n", + "

sex

\n", + " \n", + "
\n", + "

date_of_birth

\n", + " \n", + "
\n", + "

home_city

\n", + " \n", + "
\n", + "

home_state

\n", + " US state code\n", + "
\n", + "

age

\n", + " calculated attribute\n", + "
1000AllisonHillF1995-01-20Lake JoysideCO30
1001AmandaDavisF1995-03-23New JamessideMT30
1002KevinPachecoM1991-02-25Lake RobertoKY34
1003TinaRogersF1992-09-14West MelanieviewAS33
1004JuliaMartinezF2007-08-21New KellystadOK18
1005AndreaStanleyF2004-12-13Port JessevilleMS21
1006MadisonDiazF1997-09-12Lake JosephTX28
1007LisaJacksonF2004-02-28South NoahSC21
\n", + "

...

\n", + "

Total: 500

\n", + " " + ], + "text/plain": [ + "*student_id first_name last_name sex date_of_birth home_city home_state age \n", + "+------------+ +------------+ +-----------+ +-----+ +------------+ +------------+ +------------+ +-----+\n", + "1000 Allison Hill F 1995-01-20 Lake Joyside CO 30 \n", + "1001 Amanda Davis F 1995-03-23 New Jamesside MT 30 \n", + "1002 Kevin Pacheco M 1991-02-25 Lake Roberto KY 34 \n", + "1003 Tina Rogers F 1992-09-14 West Melanievi AS 33 \n", + "1004 Julia Martinez F 2007-08-21 New Kellystad OK 18 \n", + "1005 Andrea Stanley F 2004-12-13 Port Jessevill MS 21 \n", + "1006 Madison Diaz F 1997-09-12 Lake Joseph TX 28 \n", + "1007 Lisa Jackson F 2004-02-28 South Noah SC 21 \n", + " ...\n", + " (Total: 500)" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Keep all attributes plus computed ones with ...\n", + "Student.proj(..., age='TIMESTAMPDIFF(YEAR, date_of_birth, CURDATE())')" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "cell-proj-5", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:52.781853Z", + "iopub.status.busy": "2026-01-14T07:35:52.781761Z", + "iopub.status.idle": "2026-01-14T07:35:52.786247Z", + "shell.execute_reply": "2026-01-14T07:35:52.786014Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

student_id

\n", + " university-wide ID\n", + "
\n", + "

first_name

\n", + " \n", + "
\n", + "

last_name

\n", + " \n", + "
\n", + "

sex

\n", + " \n", + "
\n", + "

home_city

\n", + " \n", + "
\n", + "

home_state

\n", + " US state code\n", + "
1000AllisonHillFLake JoysideCO
1001AmandaDavisFNew JamessideMT
1002KevinPachecoMLake RobertoKY
1003TinaRogersFWest MelanieviewAS
1004JuliaMartinezFNew KellystadOK
1005AndreaStanleyFPort JessevilleMS
1006MadisonDiazFLake JosephTX
1007LisaJacksonFSouth NoahSC
\n", + "

...

\n", + "

Total: 500

\n", + " " + ], + "text/plain": [ + "*student_id first_name last_name sex home_city home_state \n", + "+------------+ +------------+ +-----------+ +-----+ +------------+ +------------+\n", + "1000 Allison Hill F Lake Joyside CO \n", + "1001 Amanda Davis F New Jamesside MT \n", + "1002 Kevin Pacheco M Lake Roberto KY \n", + "1003 Tina Rogers F West Melanievi AS \n", + "1004 Julia Martinez F New Kellystad OK \n", + "1005 Andrea Stanley F Port Jessevill MS \n", + "1006 Madison Diaz F Lake Joseph TX \n", + "1007 Lisa Jackson F South Noah SC \n", + " ...\n", + " (Total: 500)" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Exclude specific attributes with -\n", + "Student.proj(..., '-date_of_birth')" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "cell-proj-6", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:52.787544Z", + "iopub.status.busy": "2026-01-14T07:35:52.787444Z", + "iopub.status.idle": "2026-01-14T07:35:52.791940Z", + "shell.execute_reply": "2026-01-14T07:35:52.791723Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

student_id

\n", + " university-wide ID\n", + "
\n", + "

first_name

\n", + " \n", + "
\n", + "

family_name

\n", + " \n", + "
1000AllisonHill
1001AmandaDavis
1002KevinPacheco
1003TinaRogers
1004JuliaMartinez
1005AndreaStanley
1006MadisonDiaz
1007LisaJackson
\n", + "

...

\n", + "

Total: 500

\n", + " " + ], + "text/plain": [ + "*student_id first_name family_name \n", + "+------------+ +------------+ +------------+\n", + "1000 Allison Hill \n", + "1001 Amanda Davis \n", + "1002 Kevin Pacheco \n", + "1003 Tina Rogers \n", + "1004 Julia Martinez \n", + "1005 Andrea Stanley \n", + "1006 Madison Diaz \n", + "1007 Lisa Jackson \n", + " ...\n", + " (Total: 500)" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Rename attribute\n", + "Student.proj('first_name', family_name='last_name')" + ] + }, + { + "cell_type": "markdown", + "id": "cell-universal-intro", + "metadata": {}, + "source": [ + "### Universal Set (`dj.U()`)\n", + "\n", + "The universal set `dj.U()` extracts unique values of specified attributes." + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "cell-universal-1", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:52.793143Z", + "iopub.status.busy": "2026-01-14T07:35:52.793060Z", + "iopub.status.idle": "2026-01-14T07:35:52.797630Z", + "shell.execute_reply": "2026-01-14T07:35:52.797341Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "
\n", + "

first_name

\n", + " \n", + "
Aaron
Adam
Adriana
Alejandro
Alexander
Alexis
Allison
Amanda
\n", + "

...

\n", + "

Total: 246

\n", + " " + ], + "text/plain": [ + "*first_name \n", + "+------------+\n", + "Aaron \n", + "Adam \n", + "Adriana \n", + "Alejandro \n", + "Alexander \n", + "Alexis \n", + "Allison \n", + "Amanda \n", + " ...\n", + " (Total: 246)" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# All unique first names\n", + "dj.U('first_name') & Student" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "cell-universal-2", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:52.798761Z", + "iopub.status.busy": "2026-01-14T07:35:52.798674Z", + "iopub.status.idle": "2026-01-14T07:35:52.805444Z", + "shell.execute_reply": "2026-01-14T07:35:52.805187Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "
\n", + "

home_state

\n", + " US state code\n", + "
AK
AL
AR
AS
AZ
CA
CO
CT
\n", + "

...

\n", + "

Total: 59

\n", + " " + ], + "text/plain": [ + "*home_state \n", + "+------------+\n", + "AK \n", + "AL \n", + "AR \n", + "AS \n", + "AZ \n", + "CA \n", + "CO \n", + "CT \n", + " ...\n", + " (Total: 59)" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# All unique home states of enrolled students\n", + "dj.U('home_state') & (Student & Enroll)" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "cell-universal-3", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:52.806644Z", + "iopub.status.busy": "2026-01-14T07:35:52.806561Z", + "iopub.status.idle": "2026-01-14T07:35:52.813774Z", + "shell.execute_reply": "2026-01-14T07:35:52.813535Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "
\n", + "

birth_year

\n", + " calculated attribute\n", + "
1991
1992
1993
1994
1995
1996
1997
1998
\n", + "

...

\n", + "

Total: 18

\n", + " " + ], + "text/plain": [ + "*birth_year \n", + "+------------+\n", + "1991 \n", + "1992 \n", + "1993 \n", + "1994 \n", + "1995 \n", + "1996 \n", + "1997 \n", + "1998 \n", + " ...\n", + " (Total: 18)" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Birth years of students in CS courses\n", + "dj.U('birth_year') & (\n", + " Student.proj(birth_year='YEAR(date_of_birth)') & (Enroll & {'dept': 'CS'})\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-join-intro", + "metadata": {}, + "source": [ + "### Join (`*`)\n", + "\n", + "Combine tables on matching attributes." + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "cell-join-1", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:52.815016Z", + "iopub.status.busy": "2026-01-14T07:35:52.814924Z", + "iopub.status.idle": "2026-01-14T07:35:52.820396Z", + "shell.execute_reply": "2026-01-14T07:35:52.820123Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

student_id

\n", + " university-wide ID\n", + "
\n", + "

first_name

\n", + " \n", + "
\n", + "

last_name

\n", + " \n", + "
\n", + "

dept

\n", + " e.g. BIOL, CS, MATH\n", + "
\n", + "

declare_date

\n", + " \n", + "
1000AllisonHillPHYS2025-06-06
1001AmandaDavisPHYS2023-06-20
1002KevinPachecoPHYS2024-01-18
1003TinaRogersPHYS2023-03-13
1004JuliaMartinezBIOL2024-10-12
1005AndreaStanleyBIOL2024-06-18
1007LisaJacksonBIOL2023-03-01
1009ChristineHahnBIOL2025-09-28
\n", + "

...

\n", + "

Total: 378

\n", + " " + ], + "text/plain": [ + "*student_id first_name last_name dept declare_date \n", + "+------------+ +------------+ +-----------+ +------+ +------------+\n", + "1000 Allison Hill PHYS 2025-06-06 \n", + "1001 Amanda Davis PHYS 2023-06-20 \n", + "1002 Kevin Pacheco PHYS 2024-01-18 \n", + "1003 Tina Rogers PHYS 2023-03-13 \n", + "1004 Julia Martinez BIOL 2024-10-12 \n", + "1005 Andrea Stanley BIOL 2024-06-18 \n", + "1007 Lisa Jackson BIOL 2023-03-01 \n", + "1009 Christine Hahn BIOL 2025-09-28 \n", + " ...\n", + " (Total: 378)" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Students with their declared majors\n", + "Student.proj('first_name', 'last_name') * StudentMajor" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "cell-join-2", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:52.821609Z", + "iopub.status.busy": "2026-01-14T07:35:52.821523Z", + "iopub.status.idle": "2026-01-14T07:35:52.826740Z", + "shell.execute_reply": "2026-01-14T07:35:52.826442Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

dept

\n", + " e.g. BIOL, CS, MATH\n", + "
\n", + "

course

\n", + " course number, e.g. 1010\n", + "
\n", + "

course_name

\n", + " \n", + "
\n", + "

credits

\n", + " \n", + "
\n", + "

dept_name

\n", + " \n", + "
BIOL1010Biology in the 21st Century3.0Life Sciences
BIOL2020Principles of Cell Biology3.0Life Sciences
BIOL2325Human Anatomy4.0Life Sciences
BIOL2420Human Physiology4.0Life Sciences
CS1410Intro to Object-Oriented Programming4.0Computer Science
CS2420Data Structures & Algorithms4.0Computer Science
CS3500Software Practice4.0Computer Science
CS3810Computer Organization4.0Computer Science
\n", + "

...

\n", + "

Total: 15

\n", + " " + ], + "text/plain": [ + "*dept *course course_name credits dept_name \n", + "+------+ +--------+ +------------+ +---------+ +------------+\n", + "BIOL 1010 Biology in the 3.0 Life Sciences \n", + "BIOL 2020 Principles of 3.0 Life Sciences \n", + "BIOL 2325 Human Anatomy 4.0 Life Sciences \n", + "BIOL 2420 Human Physiolo 4.0 Life Sciences \n", + "CS 1410 Intro to Objec 4.0 Computer Scien\n", + "CS 2420 Data Structure 4.0 Computer Scien\n", + "CS 3500 Software Pract 4.0 Computer Scien\n", + "CS 3810 Computer Organ 4.0 Computer Scien\n", + " ...\n", + " (Total: 15)" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Courses with department names\n", + "Course * Department.proj('dept_name')" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "cell-join-3", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:52.828036Z", + "iopub.status.busy": "2026-01-14T07:35:52.827933Z", + "iopub.status.idle": "2026-01-14T07:35:52.833404Z", + "shell.execute_reply": "2026-01-14T07:35:52.833136Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

student_id

\n", + " university-wide ID\n", + "
\n", + "

first_name

\n", + " \n", + "
\n", + "

last_name

\n", + " \n", + "
\n", + "

dept

\n", + " e.g. BIOL, CS, MATH\n", + "
\n", + "

declare_date

\n", + " \n", + "
1000AllisonHillPHYS2025-06-06
1001AmandaDavisPHYS2023-06-20
1002KevinPachecoPHYS2024-01-18
1003TinaRogersPHYS2023-03-13
1004JuliaMartinezBIOL2024-10-12
1005AndreaStanleyBIOL2024-06-18
1006MadisonDiazNoneNone
1007LisaJacksonBIOL2023-03-01
\n", + "

...

\n", + "

Total: 500

\n", + " " + ], + "text/plain": [ + "*student_id first_name last_name dept declare_date \n", + "+------------+ +------------+ +-----------+ +------+ +------------+\n", + "1000 Allison Hill PHYS 2025-06-06 \n", + "1001 Amanda Davis PHYS 2023-06-20 \n", + "1002 Kevin Pacheco PHYS 2024-01-18 \n", + "1003 Tina Rogers PHYS 2023-03-13 \n", + "1004 Julia Martinez BIOL 2024-10-12 \n", + "1005 Andrea Stanley BIOL 2024-06-18 \n", + "1006 Madison Diaz None None \n", + "1007 Lisa Jackson BIOL 2023-03-01 \n", + " ...\n", + " (Total: 500)" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Left join: all students, including those without majors (NULL for unmatched)\n", + "Student.proj('first_name', 'last_name').join(StudentMajor, left=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "cell-join-4", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:52.834581Z", + "iopub.status.busy": "2026-01-14T07:35:52.834506Z", + "iopub.status.idle": "2026-01-14T07:35:52.865865Z", + "shell.execute_reply": "2026-01-14T07:35:52.865558Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

student_id

\n", + " university-wide ID\n", + "
\n", + "

dept

\n", + " e.g. BIOL, CS, MATH\n", + "
\n", + "

course

\n", + " course number, e.g. 1010\n", + "
\n", + "

term_year

\n", + " \n", + "
\n", + "

term

\n", + " \n", + "
\n", + "

section

\n", + " \n", + "
\n", + "

grade

\n", + " \n", + "
\n", + "

first_name

\n", + " \n", + "
\n", + "

last_name

\n", + " \n", + "
\n", + "

course_name

\n", + " \n", + "
\n", + "

credits

\n", + " \n", + "
1000BIOL10102022FallcDAllisonHillBiology in the 21st Century3.0
1000BIOL23252020FallaFAllisonHillHuman Anatomy4.0
1000CS14102020FallaFAllisonHillIntro to Object-Oriented Programming4.0
1000CS14102023SpringaBAllisonHillIntro to Object-Oriented Programming4.0
1000CS35002022FallcA-AllisonHillSoftware Practice4.0
1000MATH12102024SummeraD+AllisonHillCalculus I4.0
1000PHYS20602023SpringaC-AllisonHillQuantum Mechanics3.0
1000PHYS22102022FallbB+AllisonHillPhysics for Scientists I4.0
\n", + "

...

\n", + "

Total: 5178

\n", + " " + ], + "text/plain": [ + "*student_id *dept *course *term_year *term *section grade first_name last_name course_name credits \n", + "+------------+ +------+ +--------+ +-----------+ +--------+ +---------+ +-------+ +------------+ +-----------+ +------------+ +---------+\n", + "1000 BIOL 1010 2022 Fall c D Allison Hill Biology in the 3.0 \n", + "1000 BIOL 2325 2020 Fall a F Allison Hill Human Anatomy 4.0 \n", + "1000 CS 1410 2020 Fall a F Allison Hill Intro to Objec 4.0 \n", + "1000 CS 1410 2023 Spring a B Allison Hill Intro to Objec 4.0 \n", + "1000 CS 3500 2022 Fall c A- Allison Hill Software Pract 4.0 \n", + "1000 MATH 1210 2024 Summer a D+ Allison Hill Calculus I 4.0 \n", + "1000 PHYS 2060 2023 Spring a C- Allison Hill Quantum Mechan 3.0 \n", + "1000 PHYS 2210 2022 Fall b B+ Allison Hill Physics for Sc 4.0 \n", + " ...\n", + " (Total: 5178)" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Multi-table join: grades with student names and course info\n", + "(Student.proj('first_name', 'last_name') \n", + " * Grade \n", + " * Course.proj('course_name', 'credits'))" + ] + }, + { + "cell_type": "markdown", + "id": "cell-aggr-intro", + "metadata": {}, + "source": [ + "### Aggregation (`.aggr()`)\n", + "\n", + "Group rows and compute aggregate statistics." + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "cell-aggr-1", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:52.867514Z", + "iopub.status.busy": "2026-01-14T07:35:52.867385Z", + "iopub.status.idle": "2026-01-14T07:35:52.872449Z", + "shell.execute_reply": "2026-01-14T07:35:52.872187Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

dept

\n", + " e.g. BIOL, CS, MATH\n", + "
\n", + "

n_students

\n", + " calculated attribute\n", + "
BIOL79
CS90
MATH93
PHYS116
\n", + " \n", + "

Total: 4

\n", + " " + ], + "text/plain": [ + "*dept n_students \n", + "+------+ +------------+\n", + "BIOL 79 \n", + "CS 90 \n", + "MATH 93 \n", + "PHYS 116 \n", + " (Total: 4)" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Number of students per department\n", + "Department.aggr(StudentMajor, n_students='COUNT(*)')" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "cell-aggr-2", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:52.873695Z", + "iopub.status.busy": "2026-01-14T07:35:52.873609Z", + "iopub.status.idle": "2026-01-14T07:35:52.879444Z", + "shell.execute_reply": "2026-01-14T07:35:52.879190Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

dept

\n", + " e.g. BIOL, CS, MATH\n", + "
\n", + "

n_female

\n", + " calculated attribute\n", + "
\n", + "

n_male

\n", + " calculated attribute\n", + "
BIOL4336
CS4347
MATH5142
PHYS5660
\n", + " \n", + "

Total: 4

\n", + " " + ], + "text/plain": [ + "*dept n_female n_male \n", + "+------+ +----------+ +--------+\n", + "BIOL 43 36 \n", + "CS 43 47 \n", + "MATH 51 42 \n", + "PHYS 56 60 \n", + " (Total: 4)" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Breakdown by sex per department\n", + "Department.aggr(\n", + " StudentMajor * Student,\n", + " n_female='SUM(sex=\"F\")',\n", + " n_male='SUM(sex=\"M\")'\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "cell-aggr-3", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:52.880654Z", + "iopub.status.busy": "2026-01-14T07:35:52.880566Z", + "iopub.status.idle": "2026-01-14T07:35:52.889109Z", + "shell.execute_reply": "2026-01-14T07:35:52.888866Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

dept

\n", + " e.g. BIOL, CS, MATH\n", + "
\n", + "

course

\n", + " course number, e.g. 1010\n", + "
\n", + "

course_name

\n", + " \n", + "
\n", + "

credits

\n", + " \n", + "
\n", + "

n_enrolled

\n", + " calculated attribute\n", + "
BIOL1010Biology in the 21st Century3.0392
BIOL2020Principles of Cell Biology3.0393
BIOL2325Human Anatomy4.0420
BIOL2420Human Physiology4.0453
CS1410Intro to Object-Oriented Programming4.0349
CS2420Data Structures & Algorithms4.0332
CS3500Software Practice4.0342
CS3810Computer Organization4.0314
\n", + "

...

\n", + "

Total: 15

\n", + " " + ], + "text/plain": [ + "*dept *course course_name credits n_enrolled \n", + "+------+ +--------+ +------------+ +---------+ +------------+\n", + "BIOL 1010 Biology in the 3.0 392 \n", + "BIOL 2020 Principles of 3.0 393 \n", + "BIOL 2325 Human Anatomy 4.0 420 \n", + "BIOL 2420 Human Physiolo 4.0 453 \n", + "CS 1410 Intro to Objec 4.0 349 \n", + "CS 2420 Data Structure 4.0 332 \n", + "CS 3500 Software Pract 4.0 342 \n", + "CS 3810 Computer Organ 4.0 314 \n", + " ...\n", + " (Total: 15)" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Enrollment counts per course (with course name)\n", + "Course.aggr(Enroll, ..., n_enrolled='COUNT(*)')" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "cell-aggr-4", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:52.890373Z", + "iopub.status.busy": "2026-01-14T07:35:52.890287Z", + "iopub.status.idle": "2026-01-14T07:35:52.962407Z", + "shell.execute_reply": "2026-01-14T07:35:52.962094Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

dept

\n", + " e.g. BIOL, CS, MATH\n", + "
\n", + "

course

\n", + " course number, e.g. 1010\n", + "
\n", + "

course_name

\n", + " \n", + "
\n", + "

avg_gpa

\n", + " calculated attribute\n", + "
\n", + "

n_grades

\n", + " calculated attribute\n", + "
BIOL1010Biology in the 21st Century2.379347352
BIOL2020Principles of Cell Biology2.424579356
BIOL2325Human Anatomy2.307834374
BIOL2420Human Physiology2.334458397
CS1410Intro to Object-Oriented Programming2.497556311
CS2420Data Structures & Algorithms2.371473292
CS3500Software Practice2.343528309
CS3810Computer Organization2.360896279
\n", + "

...

\n", + "

Total: 15

\n", + " " + ], + "text/plain": [ + "*dept *course course_name avg_gpa n_grades \n", + "+------+ +--------+ +------------+ +----------+ +----------+\n", + "BIOL 1010 Biology in the 2.379347 352 \n", + "BIOL 2020 Principles of 2.424579 356 \n", + "BIOL 2325 Human Anatomy 2.307834 374 \n", + "BIOL 2420 Human Physiolo 2.334458 397 \n", + "CS 1410 Intro to Objec 2.497556 311 \n", + "CS 2420 Data Structure 2.371473 292 \n", + "CS 3500 Software Pract 2.343528 309 \n", + "CS 3810 Computer Organ 2.360896 279 \n", + " ...\n", + " (Total: 15)" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Average grade points per course\n", + "Course.aggr(\n", + " Grade * LetterGrade,\n", + " 'course_name',\n", + " avg_gpa='AVG(points)',\n", + " n_grades='COUNT(*)'\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-complex-intro", + "metadata": {}, + "source": [ + "### Complex Queries\n", + "\n", + "Combine operators to answer complex questions." + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "cell-complex-1", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:52.963890Z", + "iopub.status.busy": "2026-01-14T07:35:52.963768Z", + "iopub.status.idle": "2026-01-14T07:35:52.984125Z", + "shell.execute_reply": "2026-01-14T07:35:52.983671Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

student_id

\n", + " university-wide ID\n", + "
\n", + "

first_name

\n", + " \n", + "
\n", + "

last_name

\n", + " \n", + "
\n", + "

total_credits

\n", + " calculated attribute\n", + "
\n", + "

gpa

\n", + " calculated attribute\n", + "
1000AllisonHill30.01.7776667
1001AmandaDavis34.02.3732353
1002KevinPacheco31.02.1725806
1003TinaRogers38.02.4726316
1004JuliaMartinez31.02.2048387
1005AndreaStanley60.02.1508333
1006MadisonDiaz70.02.4342857
1007LisaJackson16.02.8325000
\n", + "

...

\n", + "

Total: 500

\n", + " " + ], + "text/plain": [ + "*student_id first_name last_name total_credits gpa \n", + "+------------+ +------------+ +-----------+ +------------+ +-----------+\n", + "1000 Allison Hill 30.0 1.7776667 \n", + "1001 Amanda Davis 34.0 2.3732353 \n", + "1002 Kevin Pacheco 31.0 2.1725806 \n", + "1003 Tina Rogers 38.0 2.4726316 \n", + "1004 Julia Martinez 31.0 2.2048387 \n", + "1005 Andrea Stanley 60.0 2.1508333 \n", + "1006 Madison Diaz 70.0 2.4342857 \n", + "1007 Lisa Jackson 16.0 2.8325000 \n", + " ...\n", + " (Total: 500)" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Student GPA: weighted average of grade points by credits\n", + "student_gpa = Student.aggr(\n", + " Grade * LetterGrade * Course,\n", + " 'first_name', 'last_name',\n", + " total_credits='SUM(credits)',\n", + " gpa='SUM(points * credits) / SUM(credits)'\n", + ")\n", + "student_gpa" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "cell-complex-2", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:52.985742Z", + "iopub.status.busy": "2026-01-14T07:35:52.985593Z", + "iopub.status.idle": "2026-01-14T07:35:53.019970Z", + "shell.execute_reply": "2026-01-14T07:35:53.019696Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

student_id

\n", + " university-wide ID\n", + "
\n", + "

first_name

\n", + " \n", + "
\n", + "

last_name

\n", + " \n", + "
\n", + "

total_credits

\n", + " calculated attribute\n", + "
\n", + "

gpa

\n", + " calculated attribute\n", + "
1093RebeccaLarson20.03.7340000
1222AndrewTaylor15.03.3326667
1318BrendaReyes40.03.2505000
1451AdamDavis14.03.2857143
1471JennaBryant16.03.2475000
\n", + " \n", + "

Total: 5

\n", + " " + ], + "text/plain": [ + "*student_id first_name last_name total_credits gpa \n", + "+------------+ +------------+ +-----------+ +------------+ +-----------+\n", + "1093 Rebecca Larson 20.0 3.7340000 \n", + "1222 Andrew Taylor 15.0 3.3326667 \n", + "1318 Brenda Reyes 40.0 3.2505000 \n", + "1451 Adam Davis 14.0 3.2857143 \n", + "1471 Jenna Bryant 16.0 3.2475000 \n", + " (Total: 5)" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Top 5 students by GPA (with at least 12 credits)\n", + "student_gpa & 'total_credits >= 12' & dj.Top(5, order_by='gpa DESC')" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "cell-complex-3", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:53.021313Z", + "iopub.status.busy": "2026-01-14T07:35:53.021194Z", + "iopub.status.idle": "2026-01-14T07:35:53.032963Z", + "shell.execute_reply": "2026-01-14T07:35:53.032662Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

student_id

\n", + " university-wide ID\n", + "
\n", + "

first_name

\n", + " \n", + "
\n", + "

last_name

\n", + " \n", + "
1000AllisonHill
1001AmandaDavis
1002KevinPacheco
1003TinaRogers
1004JuliaMartinez
1005AndreaStanley
1006MadisonDiaz
1007LisaJackson
\n", + "

...

\n", + "

Total: 377

\n", + " " + ], + "text/plain": [ + "*student_id first_name last_name \n", + "+------------+ +------------+ +-----------+\n", + "1000 Allison Hill \n", + "1001 Amanda Davis \n", + "1002 Kevin Pacheco \n", + "1003 Tina Rogers \n", + "1004 Julia Martinez \n", + "1005 Andrea Stanley \n", + "1006 Madison Diaz \n", + "1007 Lisa Jackson \n", + " ...\n", + " (Total: 377)" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Students who have taken courses in ALL departments\n", + "# (i.e., no department exists where they haven't enrolled)\n", + "all_depts = Student - (\n", + " Student.proj() * Department - Enroll.proj('student_id', 'dept')\n", + ")\n", + "all_depts.proj('first_name', 'last_name')" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "cell-complex-4", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:53.034340Z", + "iopub.status.busy": "2026-01-14T07:35:53.034229Z", + "iopub.status.idle": "2026-01-14T07:35:53.050340Z", + "shell.execute_reply": "2026-01-14T07:35:53.050077Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

dept

\n", + " e.g. BIOL, CS, MATH\n", + "
\n", + "

course

\n", + " course number, e.g. 1010\n", + "
\n", + "

course_name

\n", + " \n", + "
\n", + "

credits

\n", + " \n", + "
\n", + "

n

\n", + " calculated attribute\n", + "
\n", + "

max_n

\n", + " calculated attribute\n", + "
BIOL2420Human Physiology4.0453453
CS1410Intro to Object-Oriented Programming4.0349349
MATH1210Calculus I4.0425425
PHYS2220Physics for Scientists II4.0457457
\n", + " \n", + "

Total: 4

\n", + " " + ], + "text/plain": [ + "*dept *course course_name credits n max_n \n", + "+------+ +--------+ +------------+ +---------+ +-----+ +-------+\n", + "BIOL 2420 Human Physiolo 4.0 453 453 \n", + "CS 1410 Intro to Objec 4.0 349 349 \n", + "MATH 1210 Calculus I 4.0 425 425 \n", + "PHYS 2220 Physics for Sc 4.0 457 457 \n", + " (Total: 4)" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Most popular courses (by enrollment) per department\n", + "course_enrollment = Course.aggr(Enroll, ..., n='COUNT(*)')\n", + "\n", + "# For each department, find the max enrollment\n", + "max_per_dept = Department.aggr(course_enrollment, max_n='MAX(n)')\n", + "\n", + "# Join to find courses matching the max\n", + "course_enrollment * max_per_dept & 'n = max_n'" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "cell-complex-5", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:53.051728Z", + "iopub.status.busy": "2026-01-14T07:35:53.051631Z", + "iopub.status.idle": "2026-01-14T07:35:53.061171Z", + "shell.execute_reply": "2026-01-14T07:35:53.060867Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "

grade

\n", + " \n", + "
\n", + "

points

\n", + " \n", + "
\n", + "

count

\n", + " calculated attribute\n", + "
A4.00259
A-3.67400
B3.00521
B-2.67767
B+3.33586
C2.00553
C-1.67760
C+2.33566
\n", + "

...

\n", + "

Total: 11

\n", + " " + ], + "text/plain": [ + "*grade points count \n", + "+-------+ +--------+ +-------+\n", + "A 4.00 259 \n", + "A- 3.67 400 \n", + "B 3.00 521 \n", + "B- 2.67 767 \n", + "B+ 3.33 586 \n", + "C 2.00 553 \n", + "C- 1.67 760 \n", + "C+ 2.33 566 \n", + " ...\n", + " (Total: 11)" + ] + }, + "execution_count": 49, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Grade distribution: count of each grade across all courses\n", + "LetterGrade.aggr(Grade, ..., count='COUNT(*)') & 'count > 0'" + ] + }, + { + "cell_type": "markdown", + "id": "cell-fetch-intro", + "metadata": {}, + "source": [ + "### Fetching Results\n", + "\n", + "Use the fetch methods to retrieve data into Python:\n", + "- `to_dicts()` β€” list of dictionaries\n", + "- `to_arrays()` β€” numpy arrays\n", + "- `to_pandas()` β€” pandas DataFrame\n", + "- `fetch1()` β€” single row (query must return exactly one row)" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "cell-fetch-1", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:53.063004Z", + "iopub.status.busy": "2026-01-14T07:35:53.062683Z", + "iopub.status.idle": "2026-01-14T07:35:53.066921Z", + "shell.execute_reply": "2026-01-14T07:35:53.066690Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Type: ndarray, shape: (5,)\n" + ] + }, + { + "data": { + "text/plain": [ + "array([(1073, 'Kyle', 'Martinez', 'M', datetime.date(2008, 9, 28), 'West Amandastad', 'CA'),\n", + " (1092, 'Christina', 'Wilson', 'F', datetime.date(1995, 1, 30), 'West Margaret', 'CA'),\n", + " (1157, 'Kelly', 'Foster', 'F', datetime.date(1996, 8, 14), 'Jeffreyburgh', 'CA')],\n", + " dtype=[('student_id', '\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
first_namelast_nametotal_creditsgpa
student_id
1093RebeccaLarson20.03.7340000
1222AndrewTaylor15.03.3326667
1451AdamDavis14.03.2857143
1318BrendaReyes40.03.2505000
1471JennaBryant16.03.2475000
1212BenjaminBrown29.03.2175862
1452NathanielGarcia30.03.1440000
1424AlejandroDeleon14.03.0964286
1461MercedesDavis26.03.0773077
1311MatthewByrd20.03.0660000
\n", + "" + ], + "text/plain": [ + " first_name last_name total_credits gpa\n", + "student_id \n", + "1093 Rebecca Larson 20.0 3.7340000\n", + "1222 Andrew Taylor 15.0 3.3326667\n", + "1451 Adam Davis 14.0 3.2857143\n", + "1318 Brenda Reyes 40.0 3.2505000\n", + "1471 Jenna Bryant 16.0 3.2475000\n", + "1212 Benjamin Brown 29.0 3.2175862\n", + "1452 Nathaniel Garcia 30.0 3.1440000\n", + "1424 Alejandro Deleon 14.0 3.0964286\n", + "1461 Mercedes Davis 26.0 3.0773077\n", + "1311 Matthew Byrd 20.0 3.0660000" + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Fetch as pandas DataFrame\n", + "(student_gpa & 'total_credits >= 12').to_pandas().sort_values('gpa', ascending=False).head(10)" + ] + }, + { + "cell_type": "markdown", + "id": "cell-cleanup-intro", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "This tutorial demonstrated:\n", + "\n", + "| Operation | Syntax | Purpose |\n", + "|-----------|--------|--------|\n", + "| Restriction | `A & cond` | Keep matching rows |\n", + "| Anti-restriction | `A - cond` | Remove matching rows |\n", + "| Projection | `A.proj(...)` | Select/compute attributes |\n", + "| Join | `A * B` | Combine tables |\n", + "| Left join | `A.join(B, left=True)` | Keep all rows from A |\n", + "| Aggregation | `A.aggr(B, ...)` | Group and aggregate |\n", + "| Universal | `dj.U('attr') & A` | Unique values |\n", + "| Top | `A & dj.Top(n, order_by=...)` | Limit/order results |\n", + "| Fetch keys | `A.keys()` | Primary key dicts |\n", + "| Fetch arrays | `A.to_arrays(...)` | Numpy arrays |\n", + "| Fetch dicts | `A.to_dicts()` | List of dicts |\n", + "| Fetch pandas | `A.to_pandas()` | DataFrame |\n", + "| Fetch one | `A.fetch1()` | Single row dict |" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "id": "cell-cleanup", + "metadata": { + "execution": { + "iopub.execute_input": "2026-01-14T07:35:53.101375Z", + "iopub.status.busy": "2026-01-14T07:35:53.101289Z", + "iopub.status.idle": "2026-01-14T07:35:53.136849Z", + "shell.execute_reply": "2026-01-14T07:35:53.136539Z" + } + }, + "outputs": [], + "source": [ + "# Cleanup\n", + "schema.drop(prompt=False)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/src/tutorials/index.md b/src/tutorials/index.md new file mode 100644 index 00000000..a0b487ab --- /dev/null +++ b/src/tutorials/index.md @@ -0,0 +1,61 @@ +# Tutorials + +Learn DataJoint by building real pipelines. + +These tutorials guide you through building data pipelines step by step. Each tutorial +is a Jupyter notebook that you can run interactively. Start with the basics and +progress to domain-specific and advanced topics. + +## Basics + +Core concepts for getting started with DataJoint: + +1. [First Pipeline](basics/01-first-pipeline.ipynb) β€” Tables, queries, and the four core operations +2. [Schema Design](basics/02-schema-design.ipynb) β€” Primary keys, relationships, and table tiers +3. [Data Entry](basics/03-data-entry.ipynb) β€” Inserting and managing data +4. [Queries](basics/04-queries.ipynb) β€” Operators and fetching results +5. [Computation](basics/05-computation.ipynb) β€” Imported and Computed tables +6. [Object Storage](basics/06-object-storage.ipynb) β€” Blobs, attachments, and external stores + +## Examples + +Complete pipelines demonstrating DataJoint patterns: + +- [University Database](examples/university.ipynb) β€” Academic records with students, courses, and grades +- [Hotel Reservations](examples/hotel-reservations.ipynb) β€” Booking system with rooms, guests, and reservations +- [Languages & Proficiency](examples/languages.ipynb) β€” Language skills tracking with many-to-many relationships +- [Fractal Pipeline](examples/fractal-pipeline.ipynb) β€” Iterative computation and parameter sweeps +- [Blob Detection](examples/blob-detection.ipynb) β€” Image processing with automated computation + +## Domain Tutorials + +Real-world scientific pipelines: + +- [Calcium Imaging](domain/calcium-imaging/calcium-imaging.ipynb) β€” Import TIFF movies, segment cells, extract fluorescence traces +- [Electrophysiology](domain/electrophysiology/electrophysiology.ipynb) β€” Import recordings, detect spikes, extract waveforms +- [Allen CCF](domain/allen-ccf/allen-ccf.ipynb) β€” Brain atlas with hierarchical region ontology + +## Advanced Topics + +Extending DataJoint for specialized use cases: + +- [SQL Comparison](advanced/sql-comparison.ipynb) β€” DataJoint for SQL users +- [JSON Data Type](advanced/json-type.ipynb) β€” Semi-structured data in tables +- [Distributed Computing](advanced/distributed.ipynb) β€” Multi-process and cluster workflows +- [Custom Codecs](advanced/custom-codecs.ipynb) β€” Extending the type system + +## Running the Tutorials + +```bash +# Clone the repository +git clone https://github.com/datajoint/datajoint-docs.git +cd datajoint-docs + +# Start the tutorial environment +docker compose up -d + +# Launch Jupyter +jupyter lab src/tutorials/ +``` + +All tutorials use a local MySQL database that resets between sessions.