diff --git a/.gitignore b/.gitignore index cbb578c..90eff93 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +lcov.info + .DS_Store snippets* # error data files @@ -7,7 +9,6 @@ snippets* *.p videos/* !videos/.dummy -*.mat outputs/ *.mp4 diff --git a/README.md b/README.md index dd29a28..40e8d45 100644 --- a/README.md +++ b/README.md @@ -3,25 +3,17 @@ Implementation of [STAC](https://ieeexplore.ieee.org/document/7030016) using [MJ ## Installation stac-mjx relies on many prerequisites, therefore we suggest installing in a new conda environment, using the provided `environment.yaml`: - -Create and activate the `stac-mjx-env` environment: +[Local installation before package is officially published] +1. Clone the repository `git clone https://github.com/talmolab/stac-mjx.git` and `cd` into it +2. Create and activate the `stac-mjx-env` environment: ``` conda env create -f environment.yaml conda activate stac-mjx-env ``` -## Usage -1. Update the .yaml files in `config/` with the proper information (details WIP). - -2. For new data, first run stac on just a small subset of the data with - - `python stac_mjx/main.py test.skip_transform=True` - - Note: this currently will fail w/o supplying a data file. - -3. Render the resulting data using `mujoco_viz()` from within `viz_usage.ipynb`. Currently, this uses headless rendering on CPU via `osmesa`, which requires its own setup. To set up (currently on supported on Linux), execute the following commands sequentially: - ``` +Our rendering functions support multiple backends: `egl`, `glfw`, and `osmesa`. We show `osmesa` setup as it supports headless rendering, which is common in remote/cluster setups. To set up (currently on supported on Linux), execute the following commands sequentially: + ```bash sudo apt-get install libglfw3 libglew2.0 libgl1-mesa-glx libosmesa6 conda install -c conda-forge glew conda install -c conda-forge mesalib @@ -29,15 +21,67 @@ conda activate stac-mjx-env conda install -c menpo glfw3 ``` Finally, set the following environment variables, and reactivate the conda environment: - ``` + ```bash conda env config vars set MUJOCO_GL=osmesa PYOPENGL_PLATFORM=osmesa conda deactivate && conda activate base ``` - To ensure all of the above changes are encapsulated in your Jupyter kernel, a create a new kernel with: - ``` + To ensure all of the above changes are encapsulated in your Jupyter kernel, create a new kernel with: + ```bash conda install ipykernel python -m ipykernel install --user --name stac-mjx-env --display-name "Python (stac-mjx-env)" ``` -4. After tuning parameters and confirming the small clip is processed well, run through the whole thing with - `python stac-mjx/main.py` \ No newline at end of file + +## Usage +1. Update the .yaml files in `config/` with the proper information (details WIP). + +2. Run stac-mjx with its basic api: `load_configs` for loading configs and `run_stac` for the keypoint registration. Below is an example script, found in `demos/use_api.ipynb`. + + ```python + from stac_mjx import main + from stac_mjx import utils + from pathlib import Path + + # Set base path to the parent directory of your config files + base_path = Path.cwd() + stac_config_path = base_path / "demos/demo_stac.yaml" + model_config_path = base_path / "configs/rodent.yaml" + + # Load configs + cfg = main.load_configs(stac_config_path, model_config_path) + + # Load data + data_path = base_path / cfg.paths.data_path + kp_data = utils.load_data(data_path, utils.params) + + # Run stac + fit_path, transform_path = main.run_stac(cfg, kp_data, base_path) + ``` + +3. Render the resulting data using `mujoco_viz()` (example notebook found in `demos/viz_usage.ipynb`): + ```python + import os + import mediapy as media + + from stac_mjx.viz import mujoco_viz + from stac_mjx import main + from stac_mjx import utils + + stac_config_path = "../configs/stac.yaml" + model_config_path = "../configs/rodent.yaml" + + cfg = main.load_configs(stac_config_path, model_config_path) + + xml_path = "../models/rodent.xml" + data_path = "../output.p" + n_frames=250 + save_path="../videos/direct_render.mp4" + + # Call mujoco_viz + frames = mujoco_viz(data_path, xml_path, n_frames, save_path, start_frame=0) + + # Show the video in the notebook (it is also saved to the save_path) + media.show_video(frames, fps=utils.params["RENDER_FPS"]) + ``` + +4. If the rendering is poor, it's likely that some hyperparameter tuning is necessary. (details WIP) \ No newline at end of file diff --git a/configs/rodent.yaml b/configs/rodent.yaml index 4388c02..fdc231d 100644 --- a/configs/rodent.yaml +++ b/configs/rodent.yaml @@ -1,5 +1,14 @@ # Frames per clip for transform. -N_FRAMES_PER_CLIP: 360 +N_FRAMES_PER_CLIP: 250 + +# Tolerance for the optimizations of the full model, limb, and root. +# TODO: Re-implement optimizer loops to use these tolerances +FTOL: 5.0e-03 +ROOT_FTOL: 1.0e-05 +LIMB_FTOL: 1.0e-06 + +# Number of alternating pose and offset optimization rounds. +N_ITERS: 6 KP_NAMES: - 'Snout' @@ -176,14 +185,6 @@ RENDER_FPS: 50 N_SAMPLE_FRAMES: 100 -# Tolerance for the optimizations of the full model, limb, and root. -FTOL: 1.0e-02 -ROOT_FTOL: 1.0e-05 -LIMB_FTOL: 1.0e-06 - -# Number of alternating pose and offset optimization rounds. -N_ITERS: 6 - # If you have reason to believe that the initial offsets are correct for particular keypoints, # you can regularize those sites using _SITES_TO_REGULARIZE. M_REG_COEF: 1 diff --git a/configs/stac.yaml b/configs/stac.yaml index 44f219b..fbc88da 100644 --- a/configs/stac.yaml +++ b/configs/stac.yaml @@ -1,19 +1,13 @@ paths: model_config: "rodent" - xml: "././models/rodent.xml" - fit_path: "fit_sq.p" - transform_path: "transform_sq.p" - data_path: "tests/data/test_mocap_1000_frames.nwb" - -n_fit_frames: 1000 - -sampler: "first" # first, every, or random -first_start: 0 # starting frame for "first" sampler + xml: "models/rodent.xml" + fit_path: "fit.p" + transform_path: "transform.p" + data_path: "tests/data/test_rodent_mocap_1000_frames.nwb" -# Should this be included? -test: - skip_fit: False - skip_transform: False +n_fit_frames: 1000 +skip_fit: False +skip_transform: True mujoco: solver: "newton" diff --git a/conftest.py b/conftest.py new file mode 100644 index 0000000..e69de29 diff --git a/demos/api_usage.ipynb b/demos/api_usage.ipynb new file mode 100644 index 0000000..1d4a714 --- /dev/null +++ b/demos/api_usage.ipynb @@ -0,0 +1,289 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2\n", + "\n", + "from stac_mjx import main\n", + "from stac_mjx import utils\n", + "from pathlib import Path\n", + "\n", + "base_path = Path.cwd().parent\n", + "stac_config_path = base_path / \"demos/demo_stac.yaml\"\n", + "model_config_path = base_path / \"configs/rodent.yaml\"\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Load configs" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "cfg = main.load_configs(stac_config_path, model_config_path)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Prepare your data" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "data_path = base_path / cfg.paths.data_path \n", + "kp_data = utils.load_data(data_path, utils.params)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Run stac" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Root Optimization:\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-08-14 16:46:13.305054: E external/xla/xla/service/slow_operation_alarm.cc:65] \n", + "********************************\n", + "[Compiling module jit_q_opt] Very slow compile? If you want to file a bug, run with envvar XLA_FLAGS=--xla_dump_to=/tmp/foo and attach the results.\n", + "********************************\n", + "2024-08-14 16:52:19.330870: E external/xla/xla/service/slow_operation_alarm.cc:133] The operation took 8m6.030889s\n", + "\n", + "********************************\n", + "[Compiling module jit_q_opt] Very slow compile? If you want to file a bug, run with envvar XLA_FLAGS=--xla_dump_to=/tmp/foo and attach the results.\n", + "********************************\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "q_opt 1 finished in 539.2077369689941 with an error of 0.0008246786310337484\n", + "Replace 1 finished in 48.59485483169556\n", + "starting q_opt 2\n", + "q_opt 1 finished in 0.009484052658081055 with an error of 0.0005692205741070211\n", + "Replace 2 finished in 0.0011491775512695312\n", + "Root optimization finished in 587.9132978916168\n", + "Calibration iteration: 1/6\n", + "Pose Optimization:\n", + "Pose Optimization done in 0.38585686683654785\n", + "Frame 1 done in 0.07697486877441406 with a final error of 0.00024204990768339485\n", + "Frame 2 done in 0.030105113983154297 with a final error of 0.00023233129468280822\n", + "Frame 3 done in 0.029673099517822266 with a final error of 0.00026723864721134305\n", + "Frame 4 done in 0.03253793716430664 with a final error of 0.00014514046779368073\n", + "Frame 5 done in 0.029859066009521484 with a final error of 0.00013594888150691986\n", + "Frame 6 done in 0.030384063720703125 with a final error of 0.00014681622269563377\n", + "Frame 7 done in 0.029237031936645508 with a final error of 0.00013630223111249506\n", + "Frame 8 done in 0.02897810935974121 with a final error of 0.0001617780071683228\n", + "Frame 9 done in 0.02902078628540039 with a final error of 0.00015235146565828472\n", + "Frame 10 done in 0.02877187728881836 with a final error of 0.00010603768168948591\n", + "Flattened array shape: (10,)\n", + "Mean: 0.0001725994807202369\n", + "Standard deviation: 5.1366248953854665e-05\n", + "starting offset optimization\n", + "Begining offset optimization:\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/charleszhang/miniforge3/envs/stac-mjx/lib/python3.11/site-packages/jaxopt/_src/optax_wrapper.py:120: DeprecationWarning: jax.tree_map is deprecated: use jax.tree.map (jax v0.4.25 or newer) or jax.tree_util.tree_map (any JAX version).\n", + " return jax.tree_map(update_fun, params, updates)\n", + "2024-08-14 16:56:02.064235: E external/xla/xla/service/slow_operation_alarm.cc:133] The operation took 2m28.067773s\n", + "\n", + "********************************\n", + "[Compiling module jit_m_opt] Very slow compile? If you want to file a bug, run with envvar XLA_FLAGS=--xla_dump_to=/tmp/foo and attach the results.\n", + "********************************\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Final error of 0.0008073332719504833\n", + "offset optimization finished in 172.75874519348145\n", + "Calibration iteration: 2/6\n", + "Pose Optimization:\n", + "Pose Optimization done in 0.2734508514404297\n", + "Frame 1 done in 0.029141902923583984 with a final error of 8.987872570287436e-05\n", + "Frame 2 done in 0.0265653133392334 with a final error of 4.986715066479519e-05\n", + "Frame 3 done in 0.026950836181640625 with a final error of 9.77044619503431e-05\n", + "Frame 4 done in 0.02613210678100586 with a final error of 7.726994954282418e-05\n", + "Frame 5 done in 0.026131868362426758 with a final error of 5.6343920732615516e-05\n", + "Frame 6 done in 0.027943134307861328 with a final error of 5.658056397805922e-05\n", + "Frame 7 done in 0.0270230770111084 with a final error of 5.7678131270222366e-05\n", + "Frame 8 done in 0.0287630558013916 with a final error of 0.00010599832603475079\n", + "Frame 9 done in 0.027332067489624023 with a final error of 6.931358075235039e-05\n", + "Frame 10 done in 0.026467084884643555 with a final error of 5.8056681154994294e-05\n", + "Flattened array shape: (10,)\n", + "Mean: 7.186914444901049e-05\n", + "Standard deviation: 1.8823760910890996e-05\n", + "starting offset optimization\n", + "Begining offset optimization:\n", + "Final error of 0.0006695317570120096\n", + "offset optimization finished in 0.02135920524597168\n", + "Calibration iteration: 3/6\n", + "Pose Optimization:\n", + "Pose Optimization done in 0.28418803215026855\n", + "Frame 1 done in 0.029089689254760742 with a final error of 0.00010028159886132926\n", + "Frame 2 done in 0.028522253036499023 with a final error of 3.633545929915272e-05\n", + "Frame 3 done in 0.0279998779296875 with a final error of 0.00011476904182927683\n", + "Frame 4 done in 0.02696704864501953 with a final error of 6.515115819638595e-05\n", + "Frame 5 done in 0.027758121490478516 with a final error of 7.780649320920929e-05\n", + "Frame 6 done in 0.026955842971801758 with a final error of 6.580089393537492e-05\n", + "Frame 7 done in 0.028282880783081055 with a final error of 6.20657010586001e-05\n", + "Frame 8 done in 0.030856847763061523 with a final error of 7.357270078500733e-05\n", + "Frame 9 done in 0.029393911361694336 with a final error of 7.18897717888467e-05\n", + "Frame 10 done in 0.027996063232421875 with a final error of 6.276715430431068e-05\n", + "Flattened array shape: (10,)\n", + "Mean: 7.30440006009303e-05\n", + "Standard deviation: 2.048309579549823e-05\n", + "starting offset optimization\n", + "Begining offset optimization:\n", + "Final error of 0.0007595376227982342\n", + "offset optimization finished in 0.02064371109008789\n", + "Calibration iteration: 4/6\n", + "Pose Optimization:\n", + "Pose Optimization done in 0.2738969326019287\n", + "Frame 1 done in 0.02815723419189453 with a final error of 0.00013377191498875618\n", + "Frame 2 done in 0.02645397186279297 with a final error of 9.011798829305917e-05\n", + "Frame 3 done in 0.026546001434326172 with a final error of 0.00013154782936908305\n", + "Frame 4 done in 0.02717900276184082 with a final error of 7.009183173067868e-05\n", + "Frame 5 done in 0.027029991149902344 with a final error of 6.085399218136445e-05\n", + "Frame 6 done in 0.026337146759033203 with a final error of 7.274281233549118e-05\n", + "Frame 7 done in 0.026965856552124023 with a final error of 6.065889829187654e-05\n", + "Frame 8 done in 0.027503013610839844 with a final error of 7.33159831725061e-05\n", + "Frame 9 done in 0.029268980026245117 with a final error of 6.610254786210135e-05\n", + "Frame 10 done in 0.028095006942749023 with a final error of 6.570856930920854e-05\n", + "Flattened array shape: (10,)\n", + "Mean: 8.249124221038073e-05\n", + "Standard deviation: 2.6310559405828826e-05\n", + "starting offset optimization\n", + "Begining offset optimization:\n", + "Final error of 0.0008740053744986653\n", + "offset optimization finished in 0.020475149154663086\n", + "Calibration iteration: 5/6\n", + "Pose Optimization:\n", + "Pose Optimization done in 0.272568941116333\n", + "Frame 1 done in 0.028367042541503906 with a final error of 0.0001322175085078925\n", + "Frame 2 done in 0.026757001876831055 with a final error of 9.111657709581777e-05\n", + "Frame 3 done in 0.02673935890197754 with a final error of 0.00013988942373543978\n", + "Frame 4 done in 0.02677464485168457 with a final error of 6.85249688103795e-05\n", + "Frame 5 done in 0.027225017547607422 with a final error of 6.056066558812745e-05\n", + "Frame 6 done in 0.02676701545715332 with a final error of 7.549954170826823e-05\n", + "Frame 7 done in 0.027379989624023438 with a final error of 6.263637624215335e-05\n", + "Frame 8 done in 0.027900218963623047 with a final error of 6.545853102579713e-05\n", + "Frame 9 done in 0.027193784713745117 with a final error of 6.416544783860445e-05\n", + "Frame 10 done in 0.027122020721435547 with a final error of 2.9703640393563546e-05\n", + "Flattened array shape: (10,)\n", + "Mean: 7.897727482486516e-05\n", + "Standard deviation: 3.201523577445187e-05\n", + "starting offset optimization\n", + "Begining offset optimization:\n", + "Final error of 0.0009584410581737757\n", + "offset optimization finished in 0.01951313018798828\n", + "Calibration iteration: 6/6\n", + "Pose Optimization:\n", + "Pose Optimization done in 0.27637791633605957\n", + "Frame 1 done in 0.028521060943603516 with a final error of 0.00012999535829294473\n", + "Frame 2 done in 0.027293920516967773 with a final error of 9.070735541172326e-05\n", + "Frame 3 done in 0.027040958404541016 with a final error of 0.00014615965483244509\n", + "Frame 4 done in 0.027213096618652344 with a final error of 6.852905062260106e-05\n", + "Frame 5 done in 0.027936935424804688 with a final error of 6.266144919209182e-05\n", + "Frame 6 done in 0.02707529067993164 with a final error of 0.0001065841133822687\n", + "Frame 7 done in 0.027622699737548828 with a final error of 0.00010019194451160729\n", + "Frame 8 done in 0.02858710289001465 with a final error of 6.0300244513200596e-05\n", + "Frame 9 done in 0.027743101119995117 with a final error of 4.94182895636186e-05\n", + "Frame 10 done in 0.026991844177246094 with a final error of 2.9128126698196866e-05\n", + "Flattened array shape: (10,)\n", + "Mean: 8.436755160801113e-05\n", + "Standard deviation: 3.5012046282645315e-05\n", + "starting offset optimization\n", + "Begining offset optimization:\n", + "Final error of 0.0009966982761397958\n", + "offset optimization finished in 0.019862890243530273\n", + "Final pose optimization\n", + "Pose Optimization:\n", + "Pose Optimization done in 0.2697470188140869\n", + "Frame 1 done in 0.027475833892822266 with a final error of 0.00012941902969032526\n", + "Frame 2 done in 0.0270841121673584 with a final error of 8.687625086167827e-05\n", + "Frame 3 done in 0.02656412124633789 with a final error of 0.0001504241517977789\n", + "Frame 4 done in 0.02660512924194336 with a final error of 6.946228677406907e-05\n", + "Frame 5 done in 0.026578903198242188 with a final error of 6.188618135638535e-05\n", + "Frame 6 done in 0.026880979537963867 with a final error of 0.00010818641021614894\n", + "Frame 7 done in 0.027228116989135742 with a final error of 0.00010072170698549598\n", + "Frame 8 done in 0.027671098709106445 with a final error of 5.895461072213948e-05\n", + "Frame 9 done in 0.026927947998046875 with a final error of 6.0852231399621814e-05\n", + "Frame 10 done in 0.026396989822387695 with a final error of 2.9008353521930985e-05\n", + "Flattened array shape: (10,)\n", + "Mean: 8.557912224205211e-05\n", + "Standard deviation: 3.494356496958062e-05\n" + ] + } + ], + "source": [ + "fit_path, transform_path = main.run_stac(cfg, kp_data, base_path=base_path)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "stac-mjx", + "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.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/demos/demo_stac.yaml b/demos/demo_stac.yaml new file mode 100644 index 0000000..fd98e32 --- /dev/null +++ b/demos/demo_stac.yaml @@ -0,0 +1,15 @@ +paths: + model_config: "rodent" + xml: "models/rodent.xml" + fit_path: "demo_fit.p" + transform_path: "demo_transform.p" + data_path: "tests/data/test_rodent_mocap_1000_frames.mat" + +n_fit_frames: 10 +skip_fit: False +skip_transform: True + +mujoco: + solver: "newton" + iterations: 1 + ls_iterations: 4 diff --git a/view_nwb.ipynb b/demos/view_nwb.ipynb similarity index 53% rename from view_nwb.ipynb rename to demos/view_nwb.ipynb index 59dc1df..444972a 100644 --- a/view_nwb.ipynb +++ b/demos/view_nwb.ipynb @@ -2,58 +2,58 @@ "cells": [ { "cell_type": "code", - "execution_count": 2, + "execution_count": 4, "metadata": {}, "outputs": [ { "ename": "ConstructError", - "evalue": "(root/processing/behavior/PoseEstimation GroupBuilder {'attributes': {'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimation', 'object_id': '4029d5b2-a38c-4b2c-99a4-27768be4e1b9'}, 'groups': {'part_00': root/processing/behavior/PoseEstimation/part_00 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': 'f815a62a-1b7e-41d0-b29f-3d02a1f6f4f5'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_00/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_00/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_00/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_00/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_01': root/processing/behavior/PoseEstimation/part_01 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '9a9aad53-84eb-4be4-950f-ff9b2cd7927a'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_01/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_01/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_01/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_01/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_02': root/processing/behavior/PoseEstimation/part_02 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '148f76a7-770f-4e60-8a38-59f554d90576'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_02/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_02/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_02/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_02/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_03': root/processing/behavior/PoseEstimation/part_03 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': 'aa07b5fe-21a3-4cc2-b74d-9cc0b2a4833d'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_03/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_03/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_03/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_03/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_04': root/processing/behavior/PoseEstimation/part_04 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': 'cb5e8aa0-eb66-4760-87a8-1f51ce42d6e7'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_04/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_04/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_04/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_04/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_05': root/processing/behavior/PoseEstimation/part_05 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '96740e48-60fc-46cb-996b-9db8e6c1cb97'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_05/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_05/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_05/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_05/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_06': root/processing/behavior/PoseEstimation/part_06 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '52ebaadc-1d8a-4616-a67c-1639c7f85012'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_06/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_06/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_06/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_06/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_07': root/processing/behavior/PoseEstimation/part_07 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': 'cae29a22-1171-4369-b6f4-b67f3967bee7'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_07/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_07/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_07/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_07/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_08': root/processing/behavior/PoseEstimation/part_08 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '4654b0f8-972a-4e04-8833-94c1087a7c0f'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_08/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_08/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_08/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_08/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_09': root/processing/behavior/PoseEstimation/part_09 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '356325ff-e426-45c0-87c0-69e5c0ba43ae'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_09/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_09/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_09/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_09/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_10': root/processing/behavior/PoseEstimation/part_10 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '057c7dd0-6912-4096-81b9-04c918d31f46'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_10/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_10/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_10/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_10/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_11': root/processing/behavior/PoseEstimation/part_11 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': 'c5bb4ad5-70a3-4953-bec1-97d447cf9754'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_11/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_11/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_11/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_11/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_12': root/processing/behavior/PoseEstimation/part_12 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '622055f6-aadc-4752-a991-4bb5d1ce8dd8'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_12/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_12/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_12/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_12/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_13': root/processing/behavior/PoseEstimation/part_13 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '25882dc1-bc46-4566-85dc-3f266896d949'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_13/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_13/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_13/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_13/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_14': root/processing/behavior/PoseEstimation/part_14 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '4317ceaa-be87-4647-959e-8653ff533d38'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_14/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_14/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_14/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_14/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_15': root/processing/behavior/PoseEstimation/part_15 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '0562511a-b303-42b4-90b9-5f777237f309'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_15/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_15/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_15/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_15/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_16': root/processing/behavior/PoseEstimation/part_16 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '5a7a435a-ebe2-4977-ba1b-32d296f5b167'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_16/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_16/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_16/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_16/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_17': root/processing/behavior/PoseEstimation/part_17 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '6684e37a-2c5b-4500-9d5c-777a35b17107'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_17/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_17/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_17/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_17/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_18': root/processing/behavior/PoseEstimation/part_18 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '30d32b21-7640-4ede-85ad-fc15f06bb163'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_18/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_18/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_18/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_18/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_19': root/processing/behavior/PoseEstimation/part_19 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '4585c79e-17cc-4e17-a901-73135e8ee34e'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_19/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_19/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_19/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_19/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_20': root/processing/behavior/PoseEstimation/part_20 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': 'af2a8136-731e-465a-8030-7ab13c71863e'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_20/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_20/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_20/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_20/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_21': root/processing/behavior/PoseEstimation/part_21 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '24ad01f3-2cc1-4438-a748-2fbd078c783d'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_21/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_21/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_21/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_21/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_22': root/processing/behavior/PoseEstimation/part_22 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '9df0c975-6822-4ce1-9ec2-890f177474f0'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_22/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_22/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_22/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_22/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}}, 'datasets': {'description': root/processing/behavior/PoseEstimation/description DatasetBuilder {'attributes': {}, 'data': ''}, 'edges': root/processing/behavior/PoseEstimation/edges DatasetBuilder {'attributes': {}, 'data': }, 'nodes': root/processing/behavior/PoseEstimation/nodes DatasetBuilder {'attributes': {}, 'data': }, 'source_software': root/processing/behavior/PoseEstimation/source_software DatasetBuilder {'attributes': {'version': ''}, 'data': 'DANNCE'}}, 'links': {}}, \"Could not construct PoseEstimation object due to: CustomClassGenerator.set_init..__init__: incorrect shape for 'edges' (got '(0,)', expected '[None, 2]')\")", + "evalue": "(root/processing/behavior/PoseEstimation GroupBuilder {'attributes': {'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimation', 'object_id': '1753578a-33da-496a-ad54-64c5ef163d97'}, 'groups': {'AnkleL': root/processing/behavior/PoseEstimation/AnkleL GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': 'dc86491d-4558-46d0-8a3c-ddb942818931'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/AnkleL/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/AnkleL/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/AnkleL/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/AnkleL/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'AnkleR': root/processing/behavior/PoseEstimation/AnkleR GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '805b5646-1ae4-4e2c-8928-68c809ed8973'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/AnkleR/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/AnkleR/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/AnkleR/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/AnkleR/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'EarL': root/processing/behavior/PoseEstimation/EarL GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '4de385f1-d040-4653-b3d9-c66545befbe8'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/EarL/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/EarL/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/EarL/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/EarL/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'EarR': root/processing/behavior/PoseEstimation/EarR GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '82538dcb-2c6c-4504-b505-e112d3bafae3'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/EarR/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/EarR/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/EarR/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/EarR/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'ElbowL': root/processing/behavior/PoseEstimation/ElbowL GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '305ca714-1968-48b7-969a-c9e6279f1956'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/ElbowL/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/ElbowL/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/ElbowL/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/ElbowL/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'ElbowR': root/processing/behavior/PoseEstimation/ElbowR GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '37ce7eb8-6fef-49de-ae3d-81ccd8e9a3c4'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/ElbowR/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/ElbowR/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/ElbowR/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/ElbowR/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'FootL': root/processing/behavior/PoseEstimation/FootL GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '7e6a1cad-5ab6-4b95-bf7c-0d05dd6a7386'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/FootL/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/FootL/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/FootL/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/FootL/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'FootR': root/processing/behavior/PoseEstimation/FootR GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '00d49648-a328-45b6-b3a9-127a89093180'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/FootR/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/FootR/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/FootR/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/FootR/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'HandL': root/processing/behavior/PoseEstimation/HandL GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '8a5caf80-66dc-4d67-a7c8-79e5b5a25c36'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/HandL/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/HandL/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/HandL/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/HandL/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'HandR': root/processing/behavior/PoseEstimation/HandR GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': 'a8b2b7b6-ce94-44b0-997c-e4b79291e8b4'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/HandR/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/HandR/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/HandR/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/HandR/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'HipL': root/processing/behavior/PoseEstimation/HipL GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': 'afededdf-5989-4b20-8e7c-38450616c8fc'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/HipL/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/HipL/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/HipL/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/HipL/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'HipR': root/processing/behavior/PoseEstimation/HipR GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': 'b3e8438e-aa5b-486f-9c4e-bca93e221603'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/HipR/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/HipR/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/HipR/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/HipR/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'KneeL': root/processing/behavior/PoseEstimation/KneeL GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '7d6291fa-c37e-429f-b357-77f7b2e8f08f'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/KneeL/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/KneeL/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/KneeL/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/KneeL/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'KneeR': root/processing/behavior/PoseEstimation/KneeR GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '78310945-4f2b-4ac0-837e-090300dfbd83'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/KneeR/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/KneeR/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/KneeR/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/KneeR/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'ShoulderL': root/processing/behavior/PoseEstimation/ShoulderL GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': 'b48b43e8-73b2-43a9-bdd8-d81c4fc3f8b2'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/ShoulderL/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/ShoulderL/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/ShoulderL/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/ShoulderL/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'ShoulderR': root/processing/behavior/PoseEstimation/ShoulderR GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '23ce4320-9fe4-40b1-be7a-359fa8699c77'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/ShoulderR/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/ShoulderR/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/ShoulderR/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/ShoulderR/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'Snout': root/processing/behavior/PoseEstimation/Snout GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': 'e2779204-6484-464e-bee3-74b72a38cdd9'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/Snout/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/Snout/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/Snout/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/Snout/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'SpineF': root/processing/behavior/PoseEstimation/SpineF GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '39c8aaa3-578b-49fe-abd9-c91474df9014'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/SpineF/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/SpineF/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/SpineF/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/SpineF/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'SpineL': root/processing/behavior/PoseEstimation/SpineL GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': 'ae5fb5c8-f080-4445-849f-ecee4ae6e792'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/SpineL/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/SpineL/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/SpineL/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/SpineL/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'SpineM': root/processing/behavior/PoseEstimation/SpineM GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '411d3e77-6d7a-4afd-a0b4-c52b176972fa'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/SpineM/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/SpineM/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/SpineM/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/SpineM/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'TailBase': root/processing/behavior/PoseEstimation/TailBase GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '24385f6d-72e1-4ee6-995c-bb843bbbd895'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/TailBase/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/TailBase/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/TailBase/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/TailBase/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'WristL': root/processing/behavior/PoseEstimation/WristL GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '48cae913-45b4-4ebb-b06d-d21de28c2689'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/WristL/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/WristL/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/WristL/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/WristL/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'WristR': root/processing/behavior/PoseEstimation/WristR GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '9c425937-841c-409e-a3be-9353b7ace2e7'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/WristR/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/WristR/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/WristR/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/WristR/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}}, 'datasets': {'description': root/processing/behavior/PoseEstimation/description DatasetBuilder {'attributes': {}, 'data': ''}, 'edges': root/processing/behavior/PoseEstimation/edges DatasetBuilder {'attributes': {}, 'data': }, 'nodes': root/processing/behavior/PoseEstimation/nodes DatasetBuilder {'attributes': {}, 'data': }, 'source_software': root/processing/behavior/PoseEstimation/source_software DatasetBuilder {'attributes': {'version': ''}, 'data': 'DANNCE'}}, 'links': {}}, \"Could not construct PoseEstimation object due to: CustomClassGenerator.set_init..__init__: incorrect shape for 'edges' (got '(0,)', expected '[None, 2]')\")", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", - "File \u001b[0;32m~/anaconda3/envs/stac-mjx-env/lib/python3.11/site-packages/hdmf/build/objectmapper.py:1262\u001b[0m, in \u001b[0;36mObjectMapper.construct\u001b[0;34m(self, **kwargs)\u001b[0m\n\u001b[1;32m 1261\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m-> 1262\u001b[0m obj \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__new_container__\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mcls\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbuilder\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msource\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mparent\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbuilder\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mattributes\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__spec\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mid_key\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1263\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1264\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m ex:\n", - "File \u001b[0;32m~/anaconda3/envs/stac-mjx-env/lib/python3.11/site-packages/hdmf/build/objectmapper.py:1275\u001b[0m, in \u001b[0;36mObjectMapper.__new_container__\u001b[0;34m(self, cls, container_source, parent, object_id, **kwargs)\u001b[0m\n\u001b[1;32m 1273\u001b[0m \u001b[38;5;66;03m# obj has been created and is in construction mode, indicating that the object is being constructed by\u001b[39;00m\n\u001b[1;32m 1274\u001b[0m \u001b[38;5;66;03m# the automatic construct process during read, rather than by the user\u001b[39;00m\n\u001b[0;32m-> 1275\u001b[0m \u001b[43mobj\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__init__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1276\u001b[0m obj\u001b[38;5;241m.\u001b[39m_in_construct_mode \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m \u001b[38;5;66;03m# reset to False to indicate that the construction of the object is complete\u001b[39;00m\n", - "File \u001b[0;32m~/anaconda3/envs/stac-mjx-env/lib/python3.11/site-packages/hdmf/utils.py:667\u001b[0m, in \u001b[0;36mdocval..dec..func_call\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 666\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mfunc_call\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[0;32m--> 667\u001b[0m pargs \u001b[38;5;241m=\u001b[39m \u001b[43m_check_args\u001b[49m\u001b[43m(\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 668\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m func(args[\u001b[38;5;241m0\u001b[39m], \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mpargs)\n", - "File \u001b[0;32m~/anaconda3/envs/stac-mjx-env/lib/python3.11/site-packages/hdmf/utils.py:660\u001b[0m, in \u001b[0;36mdocval..dec.._check_args\u001b[0;34m(args, kwargs)\u001b[0m\n\u001b[1;32m 659\u001b[0m msg \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m: \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m \u001b[38;5;241m%\u001b[39m (func\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__qualname__\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;241m.\u001b[39mjoin(parse_err))\n\u001b[0;32m--> 660\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m ExceptionType(msg)\n\u001b[1;32m 662\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m parsed[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124margs\u001b[39m\u001b[38;5;124m'\u001b[39m]\n", + "File \u001b[0;32m~/miniforge3/envs/stac-mjx/lib/python3.11/site-packages/hdmf/build/objectmapper.py:1345\u001b[0m, in \u001b[0;36mObjectMapper.construct\u001b[0;34m(self, **kwargs)\u001b[0m\n\u001b[1;32m 1344\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m-> 1345\u001b[0m obj \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__new_container__\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mcls\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbuilder\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msource\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mparent\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbuilder\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mattributes\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__spec\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mid_key\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1346\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1347\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m ex:\n", + "File \u001b[0;32m~/miniforge3/envs/stac-mjx/lib/python3.11/site-packages/hdmf/build/objectmapper.py:1358\u001b[0m, in \u001b[0;36mObjectMapper.__new_container__\u001b[0;34m(self, cls, container_source, parent, object_id, **kwargs)\u001b[0m\n\u001b[1;32m 1356\u001b[0m \u001b[38;5;66;03m# obj has been created and is in construction mode, indicating that the object is being constructed by\u001b[39;00m\n\u001b[1;32m 1357\u001b[0m \u001b[38;5;66;03m# the automatic construct process during read, rather than by the user\u001b[39;00m\n\u001b[0;32m-> 1358\u001b[0m \u001b[43mobj\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__init__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1359\u001b[0m obj\u001b[38;5;241m.\u001b[39m_in_construct_mode \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m \u001b[38;5;66;03m# reset to False to indicate that the construction of the object is complete\u001b[39;00m\n", + "File \u001b[0;32m~/miniforge3/envs/stac-mjx/lib/python3.11/site-packages/hdmf/utils.py:667\u001b[0m, in \u001b[0;36mdocval..dec..func_call\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 666\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mfunc_call\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[0;32m--> 667\u001b[0m pargs \u001b[38;5;241m=\u001b[39m \u001b[43m_check_args\u001b[49m\u001b[43m(\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 668\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m func(args[\u001b[38;5;241m0\u001b[39m], \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mpargs)\n", + "File \u001b[0;32m~/miniforge3/envs/stac-mjx/lib/python3.11/site-packages/hdmf/utils.py:660\u001b[0m, in \u001b[0;36mdocval..dec.._check_args\u001b[0;34m(args, kwargs)\u001b[0m\n\u001b[1;32m 659\u001b[0m msg \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m: \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m \u001b[38;5;241m%\u001b[39m (func\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__qualname__\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;241m.\u001b[39mjoin(parse_err))\n\u001b[0;32m--> 660\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m ExceptionType(msg)\n\u001b[1;32m 662\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m parsed[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124margs\u001b[39m\u001b[38;5;124m'\u001b[39m]\n", "\u001b[0;31mValueError\u001b[0m: CustomClassGenerator.set_init..__init__: incorrect shape for 'edges' (got '(0,)', expected '[None, 2]')", "\nThe above exception was the direct cause of the following exception:\n", "\u001b[0;31mConstructError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[2], line 10\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[38;5;66;03m# Open the NWB file\u001b[39;00m\n\u001b[1;32m 9\u001b[0m io \u001b[38;5;241m=\u001b[39m NWBHDF5IO(nwb_file_path, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mr\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m---> 10\u001b[0m nwbfile \u001b[38;5;241m=\u001b[39m \u001b[43mio\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mread\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 12\u001b[0m \u001b[38;5;66;03m# Display the NWB file interactively\u001b[39;00m\n\u001b[1;32m 13\u001b[0m nwb2widget(nwbfile)\n", - "File \u001b[0;32m~/anaconda3/envs/stac-mjx-env/lib/python3.11/site-packages/hdmf/utils.py:668\u001b[0m, in \u001b[0;36mdocval..dec..func_call\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 666\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mfunc_call\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 667\u001b[0m pargs \u001b[38;5;241m=\u001b[39m _check_args(args, kwargs)\n\u001b[0;32m--> 668\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[43margs\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mpargs\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/vast/jason/pynwb/src/pynwb/__init__.py:352\u001b[0m, in \u001b[0;36mNWBHDF5IO.read\u001b[0;34m(self, **kwargs)\u001b[0m\n\u001b[1;32m 349\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mNWB version \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m not supported. PyNWB supports NWB files version 2 and above.\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;241m%\u001b[39m\n\u001b[1;32m 350\u001b[0m \u001b[38;5;28mstr\u001b[39m(file_version_str))\n\u001b[1;32m 351\u001b[0m \u001b[38;5;66;03m# read the file\u001b[39;00m\n\u001b[0;32m--> 352\u001b[0m file \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mread\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 353\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m file\n", - "File \u001b[0;32m~/anaconda3/envs/stac-mjx-env/lib/python3.11/site-packages/hdmf/backends/hdf5/h5tools.py:500\u001b[0m, in \u001b[0;36mHDF5IO.read\u001b[0;34m(self, **kwargs)\u001b[0m\n\u001b[1;32m 497\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m UnsupportedOperation(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mCannot read from file \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m in mode \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m. Please use mode \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mr\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mr+\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, or \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124ma\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 498\u001b[0m \u001b[38;5;241m%\u001b[39m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msource, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__mode))\n\u001b[1;32m 499\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 500\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mread\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 501\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m UnsupportedOperation \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 502\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mstr\u001b[39m(e) \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mCannot build data. There are no values.\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;66;03m# pragma: no cover\u001b[39;00m\n", - "File \u001b[0;32m~/anaconda3/envs/stac-mjx-env/lib/python3.11/site-packages/hdmf/utils.py:668\u001b[0m, in \u001b[0;36mdocval..dec..func_call\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 666\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mfunc_call\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 667\u001b[0m pargs \u001b[38;5;241m=\u001b[39m _check_args(args, kwargs)\n\u001b[0;32m--> 668\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[43margs\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mpargs\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/anaconda3/envs/stac-mjx-env/lib/python3.11/site-packages/hdmf/backends/io.py:60\u001b[0m, in \u001b[0;36mHDMFIO.read\u001b[0;34m(self, **kwargs)\u001b[0m\n\u001b[1;32m 57\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mall\u001b[39m(\u001b[38;5;28mlen\u001b[39m(v) \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m v \u001b[38;5;129;01min\u001b[39;00m f_builder\u001b[38;5;241m.\u001b[39mvalues()):\n\u001b[1;32m 58\u001b[0m \u001b[38;5;66;03m# TODO also check that the keys are appropriate. print a better error message\u001b[39;00m\n\u001b[1;32m 59\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m UnsupportedOperation(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mCannot build data. There are no values.\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m---> 60\u001b[0m container \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__manager\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconstruct\u001b[49m\u001b[43m(\u001b[49m\u001b[43mf_builder\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 61\u001b[0m container\u001b[38;5;241m.\u001b[39mread_io \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\n\u001b[1;32m 62\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mherd_path \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", - "File \u001b[0;32m~/anaconda3/envs/stac-mjx-env/lib/python3.11/site-packages/hdmf/utils.py:668\u001b[0m, in \u001b[0;36mdocval..dec..func_call\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 666\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mfunc_call\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 667\u001b[0m pargs \u001b[38;5;241m=\u001b[39m _check_args(args, kwargs)\n\u001b[0;32m--> 668\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[43margs\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mpargs\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/anaconda3/envs/stac-mjx-env/lib/python3.11/site-packages/hdmf/build/manager.py:286\u001b[0m, in \u001b[0;36mBuildManager.construct\u001b[0;34m(self, **kwargs)\u001b[0m\n\u001b[1;32m 282\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__type_map\u001b[38;5;241m.\u001b[39mconstruct(builder, \u001b[38;5;28mself\u001b[39m, parent)\n\u001b[1;32m 283\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 284\u001b[0m \u001b[38;5;66;03m# we are at the top of the hierarchy,\u001b[39;00m\n\u001b[1;32m 285\u001b[0m \u001b[38;5;66;03m# so it must be time to resolve parents\u001b[39;00m\n\u001b[0;32m--> 286\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__type_map\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconstruct\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbuilder\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m 287\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__resolve_parents(result)\n\u001b[1;32m 288\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mprebuilt(result, builder)\n", - "File \u001b[0;32m~/anaconda3/envs/stac-mjx-env/lib/python3.11/site-packages/hdmf/utils.py:668\u001b[0m, in \u001b[0;36mdocval..dec..func_call\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 666\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mfunc_call\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 667\u001b[0m pargs \u001b[38;5;241m=\u001b[39m _check_args(args, kwargs)\n\u001b[0;32m--> 668\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[43margs\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mpargs\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/anaconda3/envs/stac-mjx-env/lib/python3.11/site-packages/hdmf/build/manager.py:814\u001b[0m, in \u001b[0;36mTypeMap.construct\u001b[0;34m(self, **kwargs)\u001b[0m\n\u001b[1;32m 812\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mNo ObjectMapper found for builder of type \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m \u001b[38;5;241m%\u001b[39m dt)\n\u001b[1;32m 813\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 814\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mobj_mapper\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconstruct\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbuilder\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbuild_manager\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mparent\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/anaconda3/envs/stac-mjx-env/lib/python3.11/site-packages/hdmf/utils.py:668\u001b[0m, in \u001b[0;36mdocval..dec..func_call\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 666\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mfunc_call\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 667\u001b[0m pargs \u001b[38;5;241m=\u001b[39m _check_args(args, kwargs)\n\u001b[0;32m--> 668\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[43margs\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mpargs\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/anaconda3/envs/stac-mjx-env/lib/python3.11/site-packages/hdmf/build/objectmapper.py:1232\u001b[0m, in \u001b[0;36mObjectMapper.construct\u001b[0;34m(self, **kwargs)\u001b[0m\n\u001b[1;32m 1230\u001b[0m \u001b[38;5;28mcls\u001b[39m \u001b[38;5;241m=\u001b[39m manager\u001b[38;5;241m.\u001b[39mget_cls(builder)\n\u001b[1;32m 1231\u001b[0m \u001b[38;5;66;03m# gather all subspecs\u001b[39;00m\n\u001b[0;32m-> 1232\u001b[0m subspecs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__get_subspec_values\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbuilder\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mspec\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmanager\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1233\u001b[0m \u001b[38;5;66;03m# get the constructor argument that each specification corresponds to\u001b[39;00m\n\u001b[1;32m 1234\u001b[0m const_args \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mdict\u001b[39m()\n", - "File \u001b[0;32m~/anaconda3/envs/stac-mjx-env/lib/python3.11/site-packages/hdmf/build/objectmapper.py:1161\u001b[0m, in \u001b[0;36mObjectMapper.__get_subspec_values\u001b[0;34m(self, builder, spec, manager)\u001b[0m\n\u001b[1;32m 1159\u001b[0m ret[subspec] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__flatten(sub_builder, subspec, manager)\n\u001b[1;32m 1160\u001b[0m \u001b[38;5;66;03m# now process groups and datasets\u001b[39;00m\n\u001b[0;32m-> 1161\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__get_sub_builders\u001b[49m\u001b[43m(\u001b[49m\u001b[43mgroups\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mspec\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgroups\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmanager\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mret\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1162\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__get_sub_builders(datasets, spec\u001b[38;5;241m.\u001b[39mdatasets, manager, ret)\n\u001b[1;32m 1163\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(spec, DatasetSpec):\n", - "File \u001b[0;32m~/anaconda3/envs/stac-mjx-env/lib/python3.11/site-packages/hdmf/build/objectmapper.py:1212\u001b[0m, in \u001b[0;36mObjectMapper.__get_sub_builders\u001b[0;34m(self, sub_builders, subspecs, manager, ret)\u001b[0m\n\u001b[1;32m 1209\u001b[0m \u001b[38;5;28;01mcontinue\u001b[39;00m\n\u001b[1;32m 1210\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m dt \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 1211\u001b[0m \u001b[38;5;66;03m# recurse\u001b[39;00m\n\u001b[0;32m-> 1212\u001b[0m ret\u001b[38;5;241m.\u001b[39mupdate(\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__get_subspec_values\u001b[49m\u001b[43m(\u001b[49m\u001b[43msub_builder\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msubspec\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmanager\u001b[49m\u001b[43m)\u001b[49m)\n\u001b[1;32m 1213\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 1214\u001b[0m ret[subspec] \u001b[38;5;241m=\u001b[39m manager\u001b[38;5;241m.\u001b[39mconstruct(sub_builder)\n", - "File \u001b[0;32m~/anaconda3/envs/stac-mjx-env/lib/python3.11/site-packages/hdmf/build/objectmapper.py:1161\u001b[0m, in \u001b[0;36mObjectMapper.__get_subspec_values\u001b[0;34m(self, builder, spec, manager)\u001b[0m\n\u001b[1;32m 1159\u001b[0m ret[subspec] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__flatten(sub_builder, subspec, manager)\n\u001b[1;32m 1160\u001b[0m \u001b[38;5;66;03m# now process groups and datasets\u001b[39;00m\n\u001b[0;32m-> 1161\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__get_sub_builders\u001b[49m\u001b[43m(\u001b[49m\u001b[43mgroups\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mspec\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgroups\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmanager\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mret\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1162\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__get_sub_builders(datasets, spec\u001b[38;5;241m.\u001b[39mdatasets, manager, ret)\n\u001b[1;32m 1163\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(spec, DatasetSpec):\n", - "File \u001b[0;32m~/anaconda3/envs/stac-mjx-env/lib/python3.11/site-packages/hdmf/build/objectmapper.py:1204\u001b[0m, in \u001b[0;36mObjectMapper.__get_sub_builders\u001b[0;34m(self, sub_builders, subspecs, manager, ret)\u001b[0m\n\u001b[1;32m 1202\u001b[0m sub_builder \u001b[38;5;241m=\u001b[39m builder_dt\u001b[38;5;241m.\u001b[39mget(dt)\n\u001b[1;32m 1203\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m sub_builder \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m-> 1204\u001b[0m sub_builder \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__flatten\u001b[49m\u001b[43m(\u001b[49m\u001b[43msub_builder\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msubspec\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmanager\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1205\u001b[0m ret[subspec] \u001b[38;5;241m=\u001b[39m sub_builder\n\u001b[1;32m 1206\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n", - "File \u001b[0;32m~/anaconda3/envs/stac-mjx-env/lib/python3.11/site-packages/hdmf/build/objectmapper.py:1217\u001b[0m, in \u001b[0;36mObjectMapper.__flatten\u001b[0;34m(self, sub_builder, subspec, manager)\u001b[0m\n\u001b[1;32m 1216\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__flatten\u001b[39m(\u001b[38;5;28mself\u001b[39m, sub_builder, subspec, manager):\n\u001b[0;32m-> 1217\u001b[0m tmp \u001b[38;5;241m=\u001b[39m \u001b[43m[\u001b[49m\u001b[43mmanager\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconstruct\u001b[49m\u001b[43m(\u001b[49m\u001b[43mb\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mb\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43msub_builder\u001b[49m\u001b[43m]\u001b[49m\n\u001b[1;32m 1218\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(tmp) \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m1\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m subspec\u001b[38;5;241m.\u001b[39mis_many():\n\u001b[1;32m 1219\u001b[0m tmp \u001b[38;5;241m=\u001b[39m tmp[\u001b[38;5;241m0\u001b[39m]\n", - "File \u001b[0;32m~/anaconda3/envs/stac-mjx-env/lib/python3.11/site-packages/hdmf/build/objectmapper.py:1217\u001b[0m, in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 1216\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__flatten\u001b[39m(\u001b[38;5;28mself\u001b[39m, sub_builder, subspec, manager):\n\u001b[0;32m-> 1217\u001b[0m tmp \u001b[38;5;241m=\u001b[39m [\u001b[43mmanager\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconstruct\u001b[49m\u001b[43m(\u001b[49m\u001b[43mb\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mfor\u001b[39;00m b \u001b[38;5;129;01min\u001b[39;00m sub_builder]\n\u001b[1;32m 1218\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(tmp) \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m1\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m subspec\u001b[38;5;241m.\u001b[39mis_many():\n\u001b[1;32m 1219\u001b[0m tmp \u001b[38;5;241m=\u001b[39m tmp[\u001b[38;5;241m0\u001b[39m]\n", - "File \u001b[0;32m~/anaconda3/envs/stac-mjx-env/lib/python3.11/site-packages/hdmf/utils.py:668\u001b[0m, in \u001b[0;36mdocval..dec..func_call\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 666\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mfunc_call\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 667\u001b[0m pargs \u001b[38;5;241m=\u001b[39m _check_args(args, kwargs)\n\u001b[0;32m--> 668\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[43margs\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mpargs\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/anaconda3/envs/stac-mjx-env/lib/python3.11/site-packages/hdmf/build/manager.py:282\u001b[0m, in \u001b[0;36mBuildManager.construct\u001b[0;34m(self, **kwargs)\u001b[0m\n\u001b[1;32m 280\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m parent_builder \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 281\u001b[0m parent \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_proxy_builder(parent_builder)\n\u001b[0;32m--> 282\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__type_map\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconstruct\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbuilder\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mparent\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 283\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 284\u001b[0m \u001b[38;5;66;03m# we are at the top of the hierarchy,\u001b[39;00m\n\u001b[1;32m 285\u001b[0m \u001b[38;5;66;03m# so it must be time to resolve parents\u001b[39;00m\n\u001b[1;32m 286\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__type_map\u001b[38;5;241m.\u001b[39mconstruct(builder, \u001b[38;5;28mself\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m)\n", - "File \u001b[0;32m~/anaconda3/envs/stac-mjx-env/lib/python3.11/site-packages/hdmf/utils.py:668\u001b[0m, in \u001b[0;36mdocval..dec..func_call\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 666\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mfunc_call\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 667\u001b[0m pargs \u001b[38;5;241m=\u001b[39m _check_args(args, kwargs)\n\u001b[0;32m--> 668\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[43margs\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mpargs\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/anaconda3/envs/stac-mjx-env/lib/python3.11/site-packages/hdmf/build/manager.py:814\u001b[0m, in \u001b[0;36mTypeMap.construct\u001b[0;34m(self, **kwargs)\u001b[0m\n\u001b[1;32m 812\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mNo ObjectMapper found for builder of type \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m \u001b[38;5;241m%\u001b[39m dt)\n\u001b[1;32m 813\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 814\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mobj_mapper\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconstruct\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbuilder\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbuild_manager\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mparent\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/anaconda3/envs/stac-mjx-env/lib/python3.11/site-packages/hdmf/utils.py:668\u001b[0m, in \u001b[0;36mdocval..dec..func_call\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 666\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mfunc_call\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 667\u001b[0m pargs \u001b[38;5;241m=\u001b[39m _check_args(args, kwargs)\n\u001b[0;32m--> 668\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[43margs\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mpargs\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/anaconda3/envs/stac-mjx-env/lib/python3.11/site-packages/hdmf/build/objectmapper.py:1232\u001b[0m, in \u001b[0;36mObjectMapper.construct\u001b[0;34m(self, **kwargs)\u001b[0m\n\u001b[1;32m 1230\u001b[0m \u001b[38;5;28mcls\u001b[39m \u001b[38;5;241m=\u001b[39m manager\u001b[38;5;241m.\u001b[39mget_cls(builder)\n\u001b[1;32m 1231\u001b[0m \u001b[38;5;66;03m# gather all subspecs\u001b[39;00m\n\u001b[0;32m-> 1232\u001b[0m subspecs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__get_subspec_values\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbuilder\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mspec\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmanager\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1233\u001b[0m \u001b[38;5;66;03m# get the constructor argument that each specification corresponds to\u001b[39;00m\n\u001b[1;32m 1234\u001b[0m const_args \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mdict\u001b[39m()\n", - "File \u001b[0;32m~/anaconda3/envs/stac-mjx-env/lib/python3.11/site-packages/hdmf/build/objectmapper.py:1161\u001b[0m, in \u001b[0;36mObjectMapper.__get_subspec_values\u001b[0;34m(self, builder, spec, manager)\u001b[0m\n\u001b[1;32m 1159\u001b[0m ret[subspec] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__flatten(sub_builder, subspec, manager)\n\u001b[1;32m 1160\u001b[0m \u001b[38;5;66;03m# now process groups and datasets\u001b[39;00m\n\u001b[0;32m-> 1161\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__get_sub_builders\u001b[49m\u001b[43m(\u001b[49m\u001b[43mgroups\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mspec\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgroups\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmanager\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mret\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1162\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__get_sub_builders(datasets, spec\u001b[38;5;241m.\u001b[39mdatasets, manager, ret)\n\u001b[1;32m 1163\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(spec, DatasetSpec):\n", - "File \u001b[0;32m~/anaconda3/envs/stac-mjx-env/lib/python3.11/site-packages/hdmf/build/objectmapper.py:1204\u001b[0m, in \u001b[0;36mObjectMapper.__get_sub_builders\u001b[0;34m(self, sub_builders, subspecs, manager, ret)\u001b[0m\n\u001b[1;32m 1202\u001b[0m sub_builder \u001b[38;5;241m=\u001b[39m builder_dt\u001b[38;5;241m.\u001b[39mget(dt)\n\u001b[1;32m 1203\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m sub_builder \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m-> 1204\u001b[0m sub_builder \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__flatten\u001b[49m\u001b[43m(\u001b[49m\u001b[43msub_builder\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msubspec\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmanager\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1205\u001b[0m ret[subspec] \u001b[38;5;241m=\u001b[39m sub_builder\n\u001b[1;32m 1206\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n", - "File \u001b[0;32m~/anaconda3/envs/stac-mjx-env/lib/python3.11/site-packages/hdmf/build/objectmapper.py:1217\u001b[0m, in \u001b[0;36mObjectMapper.__flatten\u001b[0;34m(self, sub_builder, subspec, manager)\u001b[0m\n\u001b[1;32m 1216\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__flatten\u001b[39m(\u001b[38;5;28mself\u001b[39m, sub_builder, subspec, manager):\n\u001b[0;32m-> 1217\u001b[0m tmp \u001b[38;5;241m=\u001b[39m \u001b[43m[\u001b[49m\u001b[43mmanager\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconstruct\u001b[49m\u001b[43m(\u001b[49m\u001b[43mb\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mb\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43msub_builder\u001b[49m\u001b[43m]\u001b[49m\n\u001b[1;32m 1218\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(tmp) \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m1\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m subspec\u001b[38;5;241m.\u001b[39mis_many():\n\u001b[1;32m 1219\u001b[0m tmp \u001b[38;5;241m=\u001b[39m tmp[\u001b[38;5;241m0\u001b[39m]\n", - "File \u001b[0;32m~/anaconda3/envs/stac-mjx-env/lib/python3.11/site-packages/hdmf/build/objectmapper.py:1217\u001b[0m, in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 1216\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__flatten\u001b[39m(\u001b[38;5;28mself\u001b[39m, sub_builder, subspec, manager):\n\u001b[0;32m-> 1217\u001b[0m tmp \u001b[38;5;241m=\u001b[39m [\u001b[43mmanager\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconstruct\u001b[49m\u001b[43m(\u001b[49m\u001b[43mb\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mfor\u001b[39;00m b \u001b[38;5;129;01min\u001b[39;00m sub_builder]\n\u001b[1;32m 1218\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(tmp) \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m1\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m subspec\u001b[38;5;241m.\u001b[39mis_many():\n\u001b[1;32m 1219\u001b[0m tmp \u001b[38;5;241m=\u001b[39m tmp[\u001b[38;5;241m0\u001b[39m]\n", - "File \u001b[0;32m~/anaconda3/envs/stac-mjx-env/lib/python3.11/site-packages/hdmf/utils.py:668\u001b[0m, in \u001b[0;36mdocval..dec..func_call\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 666\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mfunc_call\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 667\u001b[0m pargs \u001b[38;5;241m=\u001b[39m _check_args(args, kwargs)\n\u001b[0;32m--> 668\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[43margs\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mpargs\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/anaconda3/envs/stac-mjx-env/lib/python3.11/site-packages/hdmf/build/manager.py:282\u001b[0m, in \u001b[0;36mBuildManager.construct\u001b[0;34m(self, **kwargs)\u001b[0m\n\u001b[1;32m 280\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m parent_builder \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 281\u001b[0m parent \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_proxy_builder(parent_builder)\n\u001b[0;32m--> 282\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__type_map\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconstruct\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbuilder\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mparent\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 283\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 284\u001b[0m \u001b[38;5;66;03m# we are at the top of the hierarchy,\u001b[39;00m\n\u001b[1;32m 285\u001b[0m \u001b[38;5;66;03m# so it must be time to resolve parents\u001b[39;00m\n\u001b[1;32m 286\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__type_map\u001b[38;5;241m.\u001b[39mconstruct(builder, \u001b[38;5;28mself\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m)\n", - "File \u001b[0;32m~/anaconda3/envs/stac-mjx-env/lib/python3.11/site-packages/hdmf/utils.py:668\u001b[0m, in \u001b[0;36mdocval..dec..func_call\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 666\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mfunc_call\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 667\u001b[0m pargs \u001b[38;5;241m=\u001b[39m _check_args(args, kwargs)\n\u001b[0;32m--> 668\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[43margs\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mpargs\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/anaconda3/envs/stac-mjx-env/lib/python3.11/site-packages/hdmf/build/manager.py:814\u001b[0m, in \u001b[0;36mTypeMap.construct\u001b[0;34m(self, **kwargs)\u001b[0m\n\u001b[1;32m 812\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mNo ObjectMapper found for builder of type \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m \u001b[38;5;241m%\u001b[39m dt)\n\u001b[1;32m 813\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 814\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mobj_mapper\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconstruct\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbuilder\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbuild_manager\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mparent\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/anaconda3/envs/stac-mjx-env/lib/python3.11/site-packages/hdmf/utils.py:668\u001b[0m, in \u001b[0;36mdocval..dec..func_call\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 666\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mfunc_call\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 667\u001b[0m pargs \u001b[38;5;241m=\u001b[39m _check_args(args, kwargs)\n\u001b[0;32m--> 668\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[43margs\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mpargs\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/anaconda3/envs/stac-mjx-env/lib/python3.11/site-packages/hdmf/build/objectmapper.py:1266\u001b[0m, in \u001b[0;36mObjectMapper.construct\u001b[0;34m(self, **kwargs)\u001b[0m\n\u001b[1;32m 1264\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m ex:\n\u001b[1;32m 1265\u001b[0m msg \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mCould not construct \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m object due to: \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m \u001b[38;5;241m%\u001b[39m (\u001b[38;5;28mcls\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m, ex)\n\u001b[0;32m-> 1266\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m ConstructError(builder, msg) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mex\u001b[39;00m\n\u001b[1;32m 1267\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m obj\n", - "\u001b[0;31mConstructError\u001b[0m: (root/processing/behavior/PoseEstimation GroupBuilder {'attributes': {'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimation', 'object_id': '4029d5b2-a38c-4b2c-99a4-27768be4e1b9'}, 'groups': {'part_00': root/processing/behavior/PoseEstimation/part_00 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': 'f815a62a-1b7e-41d0-b29f-3d02a1f6f4f5'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_00/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_00/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_00/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_00/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_01': root/processing/behavior/PoseEstimation/part_01 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '9a9aad53-84eb-4be4-950f-ff9b2cd7927a'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_01/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_01/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_01/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_01/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_02': root/processing/behavior/PoseEstimation/part_02 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '148f76a7-770f-4e60-8a38-59f554d90576'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_02/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_02/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_02/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_02/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_03': root/processing/behavior/PoseEstimation/part_03 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': 'aa07b5fe-21a3-4cc2-b74d-9cc0b2a4833d'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_03/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_03/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_03/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_03/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_04': root/processing/behavior/PoseEstimation/part_04 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': 'cb5e8aa0-eb66-4760-87a8-1f51ce42d6e7'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_04/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_04/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_04/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_04/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_05': root/processing/behavior/PoseEstimation/part_05 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '96740e48-60fc-46cb-996b-9db8e6c1cb97'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_05/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_05/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_05/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_05/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_06': root/processing/behavior/PoseEstimation/part_06 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '52ebaadc-1d8a-4616-a67c-1639c7f85012'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_06/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_06/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_06/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_06/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_07': root/processing/behavior/PoseEstimation/part_07 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': 'cae29a22-1171-4369-b6f4-b67f3967bee7'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_07/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_07/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_07/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_07/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_08': root/processing/behavior/PoseEstimation/part_08 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '4654b0f8-972a-4e04-8833-94c1087a7c0f'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_08/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_08/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_08/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_08/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_09': root/processing/behavior/PoseEstimation/part_09 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '356325ff-e426-45c0-87c0-69e5c0ba43ae'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_09/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_09/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_09/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_09/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_10': root/processing/behavior/PoseEstimation/part_10 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '057c7dd0-6912-4096-81b9-04c918d31f46'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_10/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_10/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_10/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_10/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_11': root/processing/behavior/PoseEstimation/part_11 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': 'c5bb4ad5-70a3-4953-bec1-97d447cf9754'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_11/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_11/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_11/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_11/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_12': root/processing/behavior/PoseEstimation/part_12 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '622055f6-aadc-4752-a991-4bb5d1ce8dd8'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_12/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_12/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_12/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_12/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_13': root/processing/behavior/PoseEstimation/part_13 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '25882dc1-bc46-4566-85dc-3f266896d949'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_13/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_13/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_13/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_13/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_14': root/processing/behavior/PoseEstimation/part_14 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '4317ceaa-be87-4647-959e-8653ff533d38'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_14/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_14/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_14/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_14/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_15': root/processing/behavior/PoseEstimation/part_15 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '0562511a-b303-42b4-90b9-5f777237f309'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_15/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_15/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_15/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_15/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_16': root/processing/behavior/PoseEstimation/part_16 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '5a7a435a-ebe2-4977-ba1b-32d296f5b167'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_16/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_16/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_16/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_16/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_17': root/processing/behavior/PoseEstimation/part_17 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '6684e37a-2c5b-4500-9d5c-777a35b17107'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_17/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_17/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_17/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_17/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_18': root/processing/behavior/PoseEstimation/part_18 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '30d32b21-7640-4ede-85ad-fc15f06bb163'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_18/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_18/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_18/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_18/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_19': root/processing/behavior/PoseEstimation/part_19 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '4585c79e-17cc-4e17-a901-73135e8ee34e'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_19/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_19/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_19/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_19/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_20': root/processing/behavior/PoseEstimation/part_20 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': 'af2a8136-731e-465a-8030-7ab13c71863e'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_20/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_20/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_20/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_20/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_21': root/processing/behavior/PoseEstimation/part_21 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '24ad01f3-2cc1-4438-a748-2fbd078c783d'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_21/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_21/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_21/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_21/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'part_22': root/processing/behavior/PoseEstimation/part_22 GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '9df0c975-6822-4ce1-9ec2-890f177474f0'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/part_22/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/part_22/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/part_22/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/part_22/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}}, 'datasets': {'description': root/processing/behavior/PoseEstimation/description DatasetBuilder {'attributes': {}, 'data': ''}, 'edges': root/processing/behavior/PoseEstimation/edges DatasetBuilder {'attributes': {}, 'data': }, 'nodes': root/processing/behavior/PoseEstimation/nodes DatasetBuilder {'attributes': {}, 'data': }, 'source_software': root/processing/behavior/PoseEstimation/source_software DatasetBuilder {'attributes': {'version': ''}, 'data': 'DANNCE'}}, 'links': {}}, \"Could not construct PoseEstimation object due to: CustomClassGenerator.set_init..__init__: incorrect shape for 'edges' (got '(0,)', expected '[None, 2]')\")" + "Cell \u001b[0;32mIn[4], line 11\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[38;5;66;03m# Open the NWB file\u001b[39;00m\n\u001b[1;32m 10\u001b[0m io \u001b[38;5;241m=\u001b[39m NWBHDF5IO(nwb_file_path, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mr\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m---> 11\u001b[0m nwbfile \u001b[38;5;241m=\u001b[39m \u001b[43mio\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mread\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 13\u001b[0m \u001b[38;5;66;03m# Display the NWB file interactively\u001b[39;00m\n\u001b[1;32m 14\u001b[0m nwb2widget(nwbfile)\n", + "File \u001b[0;32m~/miniforge3/envs/stac-mjx/lib/python3.11/site-packages/hdmf/utils.py:668\u001b[0m, in \u001b[0;36mdocval..dec..func_call\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 666\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mfunc_call\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 667\u001b[0m pargs \u001b[38;5;241m=\u001b[39m _check_args(args, kwargs)\n\u001b[0;32m--> 668\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[43margs\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mpargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniforge3/envs/stac-mjx/lib/python3.11/site-packages/pynwb/__init__.py:352\u001b[0m, in \u001b[0;36mNWBHDF5IO.read\u001b[0;34m(self, **kwargs)\u001b[0m\n\u001b[1;32m 349\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mNWB version \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m not supported. PyNWB supports NWB files version 2 and above.\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;241m%\u001b[39m\n\u001b[1;32m 350\u001b[0m \u001b[38;5;28mstr\u001b[39m(file_version_str))\n\u001b[1;32m 351\u001b[0m \u001b[38;5;66;03m# read the file\u001b[39;00m\n\u001b[0;32m--> 352\u001b[0m file \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mread\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 353\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m file\n", + "File \u001b[0;32m~/miniforge3/envs/stac-mjx/lib/python3.11/site-packages/hdmf/backends/hdf5/h5tools.py:500\u001b[0m, in \u001b[0;36mHDF5IO.read\u001b[0;34m(self, **kwargs)\u001b[0m\n\u001b[1;32m 497\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m UnsupportedOperation(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mCannot read from file \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m in mode \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m. Please use mode \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mr\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mr+\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, or \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124ma\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 498\u001b[0m \u001b[38;5;241m%\u001b[39m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msource, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__mode))\n\u001b[1;32m 499\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 500\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mread\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 501\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m UnsupportedOperation \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 502\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mstr\u001b[39m(e) \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mCannot build data. There are no values.\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;66;03m# pragma: no cover\u001b[39;00m\n", + "File \u001b[0;32m~/miniforge3/envs/stac-mjx/lib/python3.11/site-packages/hdmf/utils.py:668\u001b[0m, in \u001b[0;36mdocval..dec..func_call\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 666\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mfunc_call\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 667\u001b[0m pargs \u001b[38;5;241m=\u001b[39m _check_args(args, kwargs)\n\u001b[0;32m--> 668\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[43margs\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mpargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniforge3/envs/stac-mjx/lib/python3.11/site-packages/hdmf/backends/io.py:60\u001b[0m, in \u001b[0;36mHDMFIO.read\u001b[0;34m(self, **kwargs)\u001b[0m\n\u001b[1;32m 57\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mall\u001b[39m(\u001b[38;5;28mlen\u001b[39m(v) \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m v \u001b[38;5;129;01min\u001b[39;00m f_builder\u001b[38;5;241m.\u001b[39mvalues()):\n\u001b[1;32m 58\u001b[0m \u001b[38;5;66;03m# TODO also check that the keys are appropriate. print a better error message\u001b[39;00m\n\u001b[1;32m 59\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m UnsupportedOperation(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mCannot build data. There are no values.\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m---> 60\u001b[0m container \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__manager\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconstruct\u001b[49m\u001b[43m(\u001b[49m\u001b[43mf_builder\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 61\u001b[0m container\u001b[38;5;241m.\u001b[39mread_io \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\n\u001b[1;32m 62\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mherd_path \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", + "File \u001b[0;32m~/miniforge3/envs/stac-mjx/lib/python3.11/site-packages/hdmf/utils.py:668\u001b[0m, in \u001b[0;36mdocval..dec..func_call\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 666\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mfunc_call\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 667\u001b[0m pargs \u001b[38;5;241m=\u001b[39m _check_args(args, kwargs)\n\u001b[0;32m--> 668\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[43margs\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mpargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniforge3/envs/stac-mjx/lib/python3.11/site-packages/hdmf/build/manager.py:286\u001b[0m, in \u001b[0;36mBuildManager.construct\u001b[0;34m(self, **kwargs)\u001b[0m\n\u001b[1;32m 282\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__type_map\u001b[38;5;241m.\u001b[39mconstruct(builder, \u001b[38;5;28mself\u001b[39m, parent)\n\u001b[1;32m 283\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 284\u001b[0m \u001b[38;5;66;03m# we are at the top of the hierarchy,\u001b[39;00m\n\u001b[1;32m 285\u001b[0m \u001b[38;5;66;03m# so it must be time to resolve parents\u001b[39;00m\n\u001b[0;32m--> 286\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__type_map\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconstruct\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbuilder\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m 287\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__resolve_parents(result)\n\u001b[1;32m 288\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mprebuilt(result, builder)\n", + "File \u001b[0;32m~/miniforge3/envs/stac-mjx/lib/python3.11/site-packages/hdmf/utils.py:668\u001b[0m, in \u001b[0;36mdocval..dec..func_call\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 666\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mfunc_call\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 667\u001b[0m pargs \u001b[38;5;241m=\u001b[39m _check_args(args, kwargs)\n\u001b[0;32m--> 668\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[43margs\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mpargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniforge3/envs/stac-mjx/lib/python3.11/site-packages/hdmf/build/manager.py:814\u001b[0m, in \u001b[0;36mTypeMap.construct\u001b[0;34m(self, **kwargs)\u001b[0m\n\u001b[1;32m 812\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mNo ObjectMapper found for builder of type \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m \u001b[38;5;241m%\u001b[39m dt)\n\u001b[1;32m 813\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 814\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mobj_mapper\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconstruct\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbuilder\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbuild_manager\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mparent\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniforge3/envs/stac-mjx/lib/python3.11/site-packages/hdmf/utils.py:668\u001b[0m, in \u001b[0;36mdocval..dec..func_call\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 666\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mfunc_call\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 667\u001b[0m pargs \u001b[38;5;241m=\u001b[39m _check_args(args, kwargs)\n\u001b[0;32m--> 668\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[43margs\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mpargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniforge3/envs/stac-mjx/lib/python3.11/site-packages/hdmf/build/objectmapper.py:1315\u001b[0m, in \u001b[0;36mObjectMapper.construct\u001b[0;34m(self, **kwargs)\u001b[0m\n\u001b[1;32m 1313\u001b[0m \u001b[38;5;28mcls\u001b[39m \u001b[38;5;241m=\u001b[39m manager\u001b[38;5;241m.\u001b[39mget_cls(builder)\n\u001b[1;32m 1314\u001b[0m \u001b[38;5;66;03m# gather all subspecs\u001b[39;00m\n\u001b[0;32m-> 1315\u001b[0m subspecs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__get_subspec_values\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbuilder\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mspec\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmanager\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1316\u001b[0m \u001b[38;5;66;03m# get the constructor argument that each specification corresponds to\u001b[39;00m\n\u001b[1;32m 1317\u001b[0m const_args \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mdict\u001b[39m()\n", + "File \u001b[0;32m~/miniforge3/envs/stac-mjx/lib/python3.11/site-packages/hdmf/build/objectmapper.py:1244\u001b[0m, in \u001b[0;36mObjectMapper.__get_subspec_values\u001b[0;34m(self, builder, spec, manager)\u001b[0m\n\u001b[1;32m 1242\u001b[0m ret[subspec] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__flatten(sub_builder, subspec, manager)\n\u001b[1;32m 1243\u001b[0m \u001b[38;5;66;03m# now process groups and datasets\u001b[39;00m\n\u001b[0;32m-> 1244\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__get_sub_builders\u001b[49m\u001b[43m(\u001b[49m\u001b[43mgroups\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mspec\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgroups\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmanager\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mret\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1245\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__get_sub_builders(datasets, spec\u001b[38;5;241m.\u001b[39mdatasets, manager, ret)\n\u001b[1;32m 1246\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(spec, DatasetSpec):\n", + "File \u001b[0;32m~/miniforge3/envs/stac-mjx/lib/python3.11/site-packages/hdmf/build/objectmapper.py:1295\u001b[0m, in \u001b[0;36mObjectMapper.__get_sub_builders\u001b[0;34m(self, sub_builders, subspecs, manager, ret)\u001b[0m\n\u001b[1;32m 1292\u001b[0m \u001b[38;5;28;01mcontinue\u001b[39;00m\n\u001b[1;32m 1293\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m dt \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 1294\u001b[0m \u001b[38;5;66;03m# recurse\u001b[39;00m\n\u001b[0;32m-> 1295\u001b[0m ret\u001b[38;5;241m.\u001b[39mupdate(\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__get_subspec_values\u001b[49m\u001b[43m(\u001b[49m\u001b[43msub_builder\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msubspec\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmanager\u001b[49m\u001b[43m)\u001b[49m)\n\u001b[1;32m 1296\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 1297\u001b[0m ret[subspec] \u001b[38;5;241m=\u001b[39m manager\u001b[38;5;241m.\u001b[39mconstruct(sub_builder)\n", + "File \u001b[0;32m~/miniforge3/envs/stac-mjx/lib/python3.11/site-packages/hdmf/build/objectmapper.py:1244\u001b[0m, in \u001b[0;36mObjectMapper.__get_subspec_values\u001b[0;34m(self, builder, spec, manager)\u001b[0m\n\u001b[1;32m 1242\u001b[0m ret[subspec] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__flatten(sub_builder, subspec, manager)\n\u001b[1;32m 1243\u001b[0m \u001b[38;5;66;03m# now process groups and datasets\u001b[39;00m\n\u001b[0;32m-> 1244\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__get_sub_builders\u001b[49m\u001b[43m(\u001b[49m\u001b[43mgroups\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mspec\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgroups\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmanager\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mret\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1245\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__get_sub_builders(datasets, spec\u001b[38;5;241m.\u001b[39mdatasets, manager, ret)\n\u001b[1;32m 1246\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(spec, DatasetSpec):\n", + "File \u001b[0;32m~/miniforge3/envs/stac-mjx/lib/python3.11/site-packages/hdmf/build/objectmapper.py:1287\u001b[0m, in \u001b[0;36mObjectMapper.__get_sub_builders\u001b[0;34m(self, sub_builders, subspecs, manager, ret)\u001b[0m\n\u001b[1;32m 1285\u001b[0m sub_builder \u001b[38;5;241m=\u001b[39m builder_dt\u001b[38;5;241m.\u001b[39mget(dt)\n\u001b[1;32m 1286\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m sub_builder \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m-> 1287\u001b[0m sub_builder \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__flatten\u001b[49m\u001b[43m(\u001b[49m\u001b[43msub_builder\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msubspec\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmanager\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1288\u001b[0m ret[subspec] \u001b[38;5;241m=\u001b[39m sub_builder\n\u001b[1;32m 1289\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n", + "File \u001b[0;32m~/miniforge3/envs/stac-mjx/lib/python3.11/site-packages/hdmf/build/objectmapper.py:1300\u001b[0m, in \u001b[0;36mObjectMapper.__flatten\u001b[0;34m(self, sub_builder, subspec, manager)\u001b[0m\n\u001b[1;32m 1299\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__flatten\u001b[39m(\u001b[38;5;28mself\u001b[39m, sub_builder, subspec, manager):\n\u001b[0;32m-> 1300\u001b[0m tmp \u001b[38;5;241m=\u001b[39m \u001b[43m[\u001b[49m\u001b[43mmanager\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconstruct\u001b[49m\u001b[43m(\u001b[49m\u001b[43mb\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mb\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43msub_builder\u001b[49m\u001b[43m]\u001b[49m\n\u001b[1;32m 1301\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(tmp) \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m1\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m subspec\u001b[38;5;241m.\u001b[39mis_many():\n\u001b[1;32m 1302\u001b[0m tmp \u001b[38;5;241m=\u001b[39m tmp[\u001b[38;5;241m0\u001b[39m]\n", + "File \u001b[0;32m~/miniforge3/envs/stac-mjx/lib/python3.11/site-packages/hdmf/build/objectmapper.py:1300\u001b[0m, in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 1299\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__flatten\u001b[39m(\u001b[38;5;28mself\u001b[39m, sub_builder, subspec, manager):\n\u001b[0;32m-> 1300\u001b[0m tmp \u001b[38;5;241m=\u001b[39m [\u001b[43mmanager\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconstruct\u001b[49m\u001b[43m(\u001b[49m\u001b[43mb\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mfor\u001b[39;00m b \u001b[38;5;129;01min\u001b[39;00m sub_builder]\n\u001b[1;32m 1301\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(tmp) \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m1\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m subspec\u001b[38;5;241m.\u001b[39mis_many():\n\u001b[1;32m 1302\u001b[0m tmp \u001b[38;5;241m=\u001b[39m tmp[\u001b[38;5;241m0\u001b[39m]\n", + "File \u001b[0;32m~/miniforge3/envs/stac-mjx/lib/python3.11/site-packages/hdmf/utils.py:668\u001b[0m, in \u001b[0;36mdocval..dec..func_call\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 666\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mfunc_call\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 667\u001b[0m pargs \u001b[38;5;241m=\u001b[39m _check_args(args, kwargs)\n\u001b[0;32m--> 668\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[43margs\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mpargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniforge3/envs/stac-mjx/lib/python3.11/site-packages/hdmf/build/manager.py:282\u001b[0m, in \u001b[0;36mBuildManager.construct\u001b[0;34m(self, **kwargs)\u001b[0m\n\u001b[1;32m 280\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m parent_builder \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 281\u001b[0m parent \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_proxy_builder(parent_builder)\n\u001b[0;32m--> 282\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__type_map\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconstruct\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbuilder\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mparent\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 283\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 284\u001b[0m \u001b[38;5;66;03m# we are at the top of the hierarchy,\u001b[39;00m\n\u001b[1;32m 285\u001b[0m \u001b[38;5;66;03m# so it must be time to resolve parents\u001b[39;00m\n\u001b[1;32m 286\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__type_map\u001b[38;5;241m.\u001b[39mconstruct(builder, \u001b[38;5;28mself\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m)\n", + "File \u001b[0;32m~/miniforge3/envs/stac-mjx/lib/python3.11/site-packages/hdmf/utils.py:668\u001b[0m, in \u001b[0;36mdocval..dec..func_call\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 666\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mfunc_call\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 667\u001b[0m pargs \u001b[38;5;241m=\u001b[39m _check_args(args, kwargs)\n\u001b[0;32m--> 668\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[43margs\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mpargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniforge3/envs/stac-mjx/lib/python3.11/site-packages/hdmf/build/manager.py:814\u001b[0m, in \u001b[0;36mTypeMap.construct\u001b[0;34m(self, **kwargs)\u001b[0m\n\u001b[1;32m 812\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mNo ObjectMapper found for builder of type \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m \u001b[38;5;241m%\u001b[39m dt)\n\u001b[1;32m 813\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 814\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mobj_mapper\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconstruct\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbuilder\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbuild_manager\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mparent\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniforge3/envs/stac-mjx/lib/python3.11/site-packages/hdmf/utils.py:668\u001b[0m, in \u001b[0;36mdocval..dec..func_call\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 666\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mfunc_call\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 667\u001b[0m pargs \u001b[38;5;241m=\u001b[39m _check_args(args, kwargs)\n\u001b[0;32m--> 668\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[43margs\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mpargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniforge3/envs/stac-mjx/lib/python3.11/site-packages/hdmf/build/objectmapper.py:1315\u001b[0m, in \u001b[0;36mObjectMapper.construct\u001b[0;34m(self, **kwargs)\u001b[0m\n\u001b[1;32m 1313\u001b[0m \u001b[38;5;28mcls\u001b[39m \u001b[38;5;241m=\u001b[39m manager\u001b[38;5;241m.\u001b[39mget_cls(builder)\n\u001b[1;32m 1314\u001b[0m \u001b[38;5;66;03m# gather all subspecs\u001b[39;00m\n\u001b[0;32m-> 1315\u001b[0m subspecs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__get_subspec_values\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbuilder\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mspec\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmanager\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1316\u001b[0m \u001b[38;5;66;03m# get the constructor argument that each specification corresponds to\u001b[39;00m\n\u001b[1;32m 1317\u001b[0m const_args \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mdict\u001b[39m()\n", + "File \u001b[0;32m~/miniforge3/envs/stac-mjx/lib/python3.11/site-packages/hdmf/build/objectmapper.py:1244\u001b[0m, in \u001b[0;36mObjectMapper.__get_subspec_values\u001b[0;34m(self, builder, spec, manager)\u001b[0m\n\u001b[1;32m 1242\u001b[0m ret[subspec] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__flatten(sub_builder, subspec, manager)\n\u001b[1;32m 1243\u001b[0m \u001b[38;5;66;03m# now process groups and datasets\u001b[39;00m\n\u001b[0;32m-> 1244\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__get_sub_builders\u001b[49m\u001b[43m(\u001b[49m\u001b[43mgroups\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mspec\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgroups\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmanager\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mret\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1245\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__get_sub_builders(datasets, spec\u001b[38;5;241m.\u001b[39mdatasets, manager, ret)\n\u001b[1;32m 1246\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(spec, DatasetSpec):\n", + "File \u001b[0;32m~/miniforge3/envs/stac-mjx/lib/python3.11/site-packages/hdmf/build/objectmapper.py:1287\u001b[0m, in \u001b[0;36mObjectMapper.__get_sub_builders\u001b[0;34m(self, sub_builders, subspecs, manager, ret)\u001b[0m\n\u001b[1;32m 1285\u001b[0m sub_builder \u001b[38;5;241m=\u001b[39m builder_dt\u001b[38;5;241m.\u001b[39mget(dt)\n\u001b[1;32m 1286\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m sub_builder \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m-> 1287\u001b[0m sub_builder \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__flatten\u001b[49m\u001b[43m(\u001b[49m\u001b[43msub_builder\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msubspec\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmanager\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1288\u001b[0m ret[subspec] \u001b[38;5;241m=\u001b[39m sub_builder\n\u001b[1;32m 1289\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n", + "File \u001b[0;32m~/miniforge3/envs/stac-mjx/lib/python3.11/site-packages/hdmf/build/objectmapper.py:1300\u001b[0m, in \u001b[0;36mObjectMapper.__flatten\u001b[0;34m(self, sub_builder, subspec, manager)\u001b[0m\n\u001b[1;32m 1299\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__flatten\u001b[39m(\u001b[38;5;28mself\u001b[39m, sub_builder, subspec, manager):\n\u001b[0;32m-> 1300\u001b[0m tmp \u001b[38;5;241m=\u001b[39m \u001b[43m[\u001b[49m\u001b[43mmanager\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconstruct\u001b[49m\u001b[43m(\u001b[49m\u001b[43mb\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mb\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43msub_builder\u001b[49m\u001b[43m]\u001b[49m\n\u001b[1;32m 1301\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(tmp) \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m1\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m subspec\u001b[38;5;241m.\u001b[39mis_many():\n\u001b[1;32m 1302\u001b[0m tmp \u001b[38;5;241m=\u001b[39m tmp[\u001b[38;5;241m0\u001b[39m]\n", + "File \u001b[0;32m~/miniforge3/envs/stac-mjx/lib/python3.11/site-packages/hdmf/build/objectmapper.py:1300\u001b[0m, in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 1299\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__flatten\u001b[39m(\u001b[38;5;28mself\u001b[39m, sub_builder, subspec, manager):\n\u001b[0;32m-> 1300\u001b[0m tmp \u001b[38;5;241m=\u001b[39m [\u001b[43mmanager\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconstruct\u001b[49m\u001b[43m(\u001b[49m\u001b[43mb\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mfor\u001b[39;00m b \u001b[38;5;129;01min\u001b[39;00m sub_builder]\n\u001b[1;32m 1301\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(tmp) \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m1\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m subspec\u001b[38;5;241m.\u001b[39mis_many():\n\u001b[1;32m 1302\u001b[0m tmp \u001b[38;5;241m=\u001b[39m tmp[\u001b[38;5;241m0\u001b[39m]\n", + "File \u001b[0;32m~/miniforge3/envs/stac-mjx/lib/python3.11/site-packages/hdmf/utils.py:668\u001b[0m, in \u001b[0;36mdocval..dec..func_call\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 666\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mfunc_call\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 667\u001b[0m pargs \u001b[38;5;241m=\u001b[39m _check_args(args, kwargs)\n\u001b[0;32m--> 668\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[43margs\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mpargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniforge3/envs/stac-mjx/lib/python3.11/site-packages/hdmf/build/manager.py:282\u001b[0m, in \u001b[0;36mBuildManager.construct\u001b[0;34m(self, **kwargs)\u001b[0m\n\u001b[1;32m 280\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m parent_builder \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 281\u001b[0m parent \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_proxy_builder(parent_builder)\n\u001b[0;32m--> 282\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__type_map\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconstruct\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbuilder\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mparent\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 283\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 284\u001b[0m \u001b[38;5;66;03m# we are at the top of the hierarchy,\u001b[39;00m\n\u001b[1;32m 285\u001b[0m \u001b[38;5;66;03m# so it must be time to resolve parents\u001b[39;00m\n\u001b[1;32m 286\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__type_map\u001b[38;5;241m.\u001b[39mconstruct(builder, \u001b[38;5;28mself\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m)\n", + "File \u001b[0;32m~/miniforge3/envs/stac-mjx/lib/python3.11/site-packages/hdmf/utils.py:668\u001b[0m, in \u001b[0;36mdocval..dec..func_call\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 666\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mfunc_call\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 667\u001b[0m pargs \u001b[38;5;241m=\u001b[39m _check_args(args, kwargs)\n\u001b[0;32m--> 668\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[43margs\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mpargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniforge3/envs/stac-mjx/lib/python3.11/site-packages/hdmf/build/manager.py:814\u001b[0m, in \u001b[0;36mTypeMap.construct\u001b[0;34m(self, **kwargs)\u001b[0m\n\u001b[1;32m 812\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mNo ObjectMapper found for builder of type \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m \u001b[38;5;241m%\u001b[39m dt)\n\u001b[1;32m 813\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 814\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mobj_mapper\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconstruct\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbuilder\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbuild_manager\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mparent\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniforge3/envs/stac-mjx/lib/python3.11/site-packages/hdmf/utils.py:668\u001b[0m, in \u001b[0;36mdocval..dec..func_call\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 666\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mfunc_call\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 667\u001b[0m pargs \u001b[38;5;241m=\u001b[39m _check_args(args, kwargs)\n\u001b[0;32m--> 668\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[43margs\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mpargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniforge3/envs/stac-mjx/lib/python3.11/site-packages/hdmf/build/objectmapper.py:1349\u001b[0m, in \u001b[0;36mObjectMapper.construct\u001b[0;34m(self, **kwargs)\u001b[0m\n\u001b[1;32m 1347\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m ex:\n\u001b[1;32m 1348\u001b[0m msg \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mCould not construct \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m object due to: \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m \u001b[38;5;241m%\u001b[39m (\u001b[38;5;28mcls\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m, ex)\n\u001b[0;32m-> 1349\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m ConstructError(builder, msg) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mex\u001b[39;00m\n\u001b[1;32m 1350\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m obj\n", + "\u001b[0;31mConstructError\u001b[0m: (root/processing/behavior/PoseEstimation GroupBuilder {'attributes': {'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimation', 'object_id': '1753578a-33da-496a-ad54-64c5ef163d97'}, 'groups': {'AnkleL': root/processing/behavior/PoseEstimation/AnkleL GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': 'dc86491d-4558-46d0-8a3c-ddb942818931'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/AnkleL/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/AnkleL/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/AnkleL/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/AnkleL/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'AnkleR': root/processing/behavior/PoseEstimation/AnkleR GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '805b5646-1ae4-4e2c-8928-68c809ed8973'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/AnkleR/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/AnkleR/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/AnkleR/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/AnkleR/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'EarL': root/processing/behavior/PoseEstimation/EarL GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '4de385f1-d040-4653-b3d9-c66545befbe8'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/EarL/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/EarL/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/EarL/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/EarL/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'EarR': root/processing/behavior/PoseEstimation/EarR GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '82538dcb-2c6c-4504-b505-e112d3bafae3'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/EarR/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/EarR/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/EarR/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/EarR/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'ElbowL': root/processing/behavior/PoseEstimation/ElbowL GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '305ca714-1968-48b7-969a-c9e6279f1956'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/ElbowL/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/ElbowL/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/ElbowL/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/ElbowL/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'ElbowR': root/processing/behavior/PoseEstimation/ElbowR GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '37ce7eb8-6fef-49de-ae3d-81ccd8e9a3c4'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/ElbowR/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/ElbowR/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/ElbowR/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/ElbowR/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'FootL': root/processing/behavior/PoseEstimation/FootL GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '7e6a1cad-5ab6-4b95-bf7c-0d05dd6a7386'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/FootL/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/FootL/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/FootL/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/FootL/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'FootR': root/processing/behavior/PoseEstimation/FootR GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '00d49648-a328-45b6-b3a9-127a89093180'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/FootR/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/FootR/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/FootR/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/FootR/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'HandL': root/processing/behavior/PoseEstimation/HandL GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '8a5caf80-66dc-4d67-a7c8-79e5b5a25c36'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/HandL/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/HandL/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/HandL/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/HandL/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'HandR': root/processing/behavior/PoseEstimation/HandR GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': 'a8b2b7b6-ce94-44b0-997c-e4b79291e8b4'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/HandR/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/HandR/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/HandR/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/HandR/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'HipL': root/processing/behavior/PoseEstimation/HipL GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': 'afededdf-5989-4b20-8e7c-38450616c8fc'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/HipL/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/HipL/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/HipL/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/HipL/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'HipR': root/processing/behavior/PoseEstimation/HipR GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': 'b3e8438e-aa5b-486f-9c4e-bca93e221603'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/HipR/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/HipR/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/HipR/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/HipR/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'KneeL': root/processing/behavior/PoseEstimation/KneeL GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '7d6291fa-c37e-429f-b357-77f7b2e8f08f'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/KneeL/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/KneeL/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/KneeL/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/KneeL/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'KneeR': root/processing/behavior/PoseEstimation/KneeR GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '78310945-4f2b-4ac0-837e-090300dfbd83'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/KneeR/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/KneeR/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/KneeR/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/KneeR/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'ShoulderL': root/processing/behavior/PoseEstimation/ShoulderL GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': 'b48b43e8-73b2-43a9-bdd8-d81c4fc3f8b2'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/ShoulderL/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/ShoulderL/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/ShoulderL/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/ShoulderL/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'ShoulderR': root/processing/behavior/PoseEstimation/ShoulderR GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '23ce4320-9fe4-40b1-be7a-359fa8699c77'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/ShoulderR/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/ShoulderR/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/ShoulderR/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/ShoulderR/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'Snout': root/processing/behavior/PoseEstimation/Snout GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': 'e2779204-6484-464e-bee3-74b72a38cdd9'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/Snout/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/Snout/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/Snout/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/Snout/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'SpineF': root/processing/behavior/PoseEstimation/SpineF GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '39c8aaa3-578b-49fe-abd9-c91474df9014'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/SpineF/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/SpineF/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/SpineF/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/SpineF/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'SpineL': root/processing/behavior/PoseEstimation/SpineL GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': 'ae5fb5c8-f080-4445-849f-ecee4ae6e792'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/SpineL/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/SpineL/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/SpineL/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/SpineL/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'SpineM': root/processing/behavior/PoseEstimation/SpineM GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '411d3e77-6d7a-4afd-a0b4-c52b176972fa'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/SpineM/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/SpineM/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/SpineM/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/SpineM/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'TailBase': root/processing/behavior/PoseEstimation/TailBase GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '24385f6d-72e1-4ee6-995c-bb843bbbd895'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/TailBase/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/TailBase/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/TailBase/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/TailBase/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'WristL': root/processing/behavior/PoseEstimation/WristL GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '48cae913-45b4-4ebb-b06d-d21de28c2689'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/WristL/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/WristL/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/WristL/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/WristL/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}, 'WristR': root/processing/behavior/PoseEstimation/WristR GroupBuilder {'attributes': {'comments': 'no comments', 'description': '', 'namespace': 'ndx-pose', 'neurodata_type': 'PoseEstimationSeries', 'object_id': '9c425937-841c-409e-a3be-9353b7ace2e7'}, 'groups': {}, 'datasets': {'confidence': root/processing/behavior/PoseEstimation/WristR/confidence DatasetBuilder {'attributes': {'definition': ''}, 'data': }, 'data': root/processing/behavior/PoseEstimation/WristR/data DatasetBuilder {'attributes': {'conversion': 1.0, 'offset': 0.0, 'resolution': -1.0, 'unit': 'pixels'}, 'data': }, 'reference_frame': root/processing/behavior/PoseEstimation/WristR/reference_frame DatasetBuilder {'attributes': {}, 'data': ''}, 'timestamps': root/processing/behavior/PoseEstimation/WristR/timestamps DatasetBuilder {'attributes': {'interval': 1, 'unit': 'seconds'}, 'data': }}, 'links': {}}}, 'datasets': {'description': root/processing/behavior/PoseEstimation/description DatasetBuilder {'attributes': {}, 'data': ''}, 'edges': root/processing/behavior/PoseEstimation/edges DatasetBuilder {'attributes': {}, 'data': }, 'nodes': root/processing/behavior/PoseEstimation/nodes DatasetBuilder {'attributes': {}, 'data': }, 'source_software': root/processing/behavior/PoseEstimation/source_software DatasetBuilder {'attributes': {'version': ''}, 'data': 'DANNCE'}}, 'links': {}}, \"Could not construct PoseEstimation object due to: CustomClassGenerator.set_init..__init__: incorrect shape for 'edges' (got '(0,)', expected '[None, 2]')\")" ] } ], @@ -61,9 +61,10 @@ "import pynwb\n", "from pynwb import NWBHDF5IO\n", "from nwbwidgets import nwb2widget\n", + "from pathlib import Path\n", "\n", "# Replace 'path_to_file.nwb' with the path to your NWB file\n", - "nwb_file_path = './save_data_AVG.nwb'\n", + "nwb_file_path = '../tests/data/test_rodent_mocap_1000_frames.nwb'\n", "\n", "# Open the NWB file\n", "io = NWBHDF5IO(nwb_file_path, 'r')\n", diff --git a/demos/viz_usage.ipynb b/demos/viz_usage.ipynb new file mode 100644 index 0000000..627c809 --- /dev/null +++ b/demos/viz_usage.ipynb @@ -0,0 +1,144 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Render stac outputs with mujoco" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "env: MUJOCO_GL=glfw\n", + "env: PYOPENGL_PLATFORM=glfw\n" + ] + } + ], + "source": [ + "# glfw is faster, but use osmesa if glfw not available\n", + "%env MUJOCO_GL=glfw\n", + "%env PYOPENGL_PLATFORM=glfw\n", + "\n", + "import os\n", + "import mediapy as media\n", + "\n", + "from stac_mjx.viz import mujoco_viz\n", + "from stac_mjx import main\n", + "from stac_mjx import utils\n", + "\n", + "# Disable jax's memory preallocation if you're running multiple notebooks using jax\n", + "# os.environ['XLA_PYTHON_CLIENT_PREALLOCATE'] = \"false\" \n", + "\n", + "stac_config_path = \"../configs/stac.yaml\"\n", + "model_config_path = \"../configs/rodent.yaml\"\n", + "\n", + "cfg = main.load_configs(stac_config_path, model_config_path)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/charleszhang/miniforge3/envs/stac-mjx/lib/python3.11/site-packages/imageio_ffmpeg/_utils.py:7: DeprecationWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html\n", + " from pkg_resources import resource_filename\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "rendering frame 0\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/charleszhang/miniforge3/envs/stac-mjx/lib/python3.11/subprocess.py:1885: RuntimeWarning: os.fork() was called. os.fork() is incompatible with multithreaded code, and JAX is multithreaded, so this will likely lead to a deadlock.\n", + " self.pid = _fork_exec(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "rendering frame 100\n", + "rendering frame 200\n" + ] + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# set args and initialize params\n", + "xml_path = \"./models/rodent.xml\"\n", + "data_path = \"./output.p\"\n", + "n_frames = 250\n", + "save_path=\"./videos/direct_render.mp4\"\n", + "\n", + "# Call mujoco_viz\n", + "frames = mujoco_viz(data_path, xml_path, n_frames, save_path, start_frame=0)\n", + "\n", + "# Show the video in the notebook (it is also saved to the save_path)\n", + "media.show_video(frames, fps=utils.params[\"RENDER_FPS\"])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "stac-mjx", + "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.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..5c58b07 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,21 @@ +matplotlib +ipykernel +mujoco +mujoco-mjx +brax +opencv-python +wandb +mediapy +dm_control +tqdm +numba +hydra-core +imageio +h5py +nwbwidgets +flax[all] +optax[all] >= 0.2.3 +--find-links https://storage.googleapis.com/jax-releases/jax_cuda_releases.html +jax[cuda12_pip] +imageio[pyav] +imageio[ffmpeg] diff --git a/run_rodent.py b/run_rodent.py new file mode 100644 index 0000000..abd0a1b --- /dev/null +++ b/run_rodent.py @@ -0,0 +1,54 @@ +import jax +from jax import numpy as jnp +from jax.lib import xla_bridge +import numpy as np + +import os +import logging +import hydra +from omegaconf import DictConfig, OmegaConf + +from stac_mjx import main +from stac_mjx import utils + + +@hydra.main(config_path="./configs", config_name="stac", version_base=None) +def hydra_entry(cfg: DictConfig): + # Initialize configs and convert to dictionaries + global_cfg = hydra.compose(config_name=cfg.paths.model_config) + logging.info(f"cfg: {OmegaConf.to_yaml(cfg)}") + logging.info(f"global_cfg: {OmegaConf.to_yaml(global_cfg)}") + utils.init_params(OmegaConf.to_container(global_cfg, resolve=True)) + + # XLA flags for Nvidia GPU + if xla_bridge.get_backend().platform == "gpu": + os.environ["XLA_FLAGS"] = ( + "--xla_gpu_enable_triton_softmax_fusion=true " + "--xla_gpu_triton_gemm_any=True " + ) + # Set N_GPUS + utils.params["N_GPUS"] = jax.local_device_count("gpu") + + # Set up mocap data + kp_names = utils.params["KP_NAMES"] + # argsort returns the indices that sort the array to match the order of marker sites + stac_keypoint_order = np.argsort(kp_names) + data_path = cfg.paths.data_path + + # Load kp_data, /1000 to scale data (from mm to meters) + kp_data = utils.loadmat(data_path)["pred"][:] / 1000 + + # Preparing DANNCE data by reordering and reshaping + # Resulting kp_data is of shape (n_frames, n_keypoints) + kp_data = jnp.array(kp_data[:, :, stac_keypoint_order]) + kp_data = jnp.transpose(kp_data, (0, 2, 1)) + kp_data = jnp.reshape(kp_data, (kp_data.shape[0], -1)) + + return main.run_stac(cfg, kp_data) + + +if __name__ == "__main__": + fit_path, transform_path = hydra_entry() + logging.info( + f"Run complete. \n fit path: {fit_path} \n transform path: {transform_path}" + ) diff --git a/stac_mjx/compute_stac.py b/stac_mjx/compute_stac.py index e4440fc..6411280 100644 --- a/stac_mjx/compute_stac.py +++ b/stac_mjx/compute_stac.py @@ -1,14 +1,14 @@ """Compute stac optimization on data.""" import jax -from jax import vmap import jax.numpy as jnp -import stac_base -import operations as op -import utils -from typing import List, Dict, Tuple, Text + +from typing import Tuple import time -import logging + +from stac_mjx import stac_base +from stac_mjx import utils +from stac_mjx import operations as op def root_optimization(mjx_model, mjx_data, kp_data, frame: int = 0): @@ -260,34 +260,3 @@ def f(mjx_data, kp_data, n_frame, parts): jnp.array(frame_time), jnp.array(frame_error), ) - - -def package_data(mjx_model, physics, q, x, walker_body_sites, kp_data, batched=False): - """Extract pose, offsets, data, and all parameters.""" - if batched: - # prepare batched data to be packaged - get_batch_offsets = vmap(op.get_site_pos) - offsets = get_batch_offsets(mjx_model).copy()[0] - x = x.reshape(-1, x.shape[-1]) - q = q.reshape(-1, q.shape[-1]) - else: - offsets = op.get_site_pos(mjx_model).copy() - - names_xpos = physics.named.data.xpos.axes.row.names - - print(f"shape of qpos: {q.shape}") - kp_data = kp_data.reshape(-1, kp_data.shape[-1]) - data = { - "qpos": q, - "xpos": x, - "walker_body_sites": walker_body_sites, - "offsets": offsets, - "names_qpos": utils.params["part_names"], - "names_xpos": names_xpos, - "kp_data": jnp.copy(kp_data), - } - - for k, v in utils.params.items(): - data[k] = v - - return data diff --git a/stac_mjx/controller.py b/stac_mjx/controller.py index c5c6bb3..dade750 100644 --- a/stac_mjx/controller.py +++ b/stac_mjx/controller.py @@ -3,23 +3,17 @@ from jax import vmap from jax import numpy as jnp -import mujoco from mujoco import mjx import numpy as np -from typing import Text - from dm_control import mjcf from dm_control.locomotion.walkers import rescale -import utils -from compute_stac import * -import operations as op - -import pickle -import logging -import os +from stac_mjx import utils as utils +from stac_mjx import compute_stac +from stac_mjx import operations as op +from typing import List from statistics import fmean, pstdev @@ -191,7 +185,6 @@ def fit(mj_model, kp_data): offsets = jnp.copy(op.get_site_pos(mjx_model)) offsets *= utils.params["SCALE_FACTOR"] - # print(mjx_model.site_pos, mjx_model.site_pos.shape) mjx_model = op.set_site_pos(mjx_model, offsets) # forward is used to calculate xpos and such @@ -206,12 +199,12 @@ def fit(mj_model, kp_data): utils.params["ub"] = ub # Begin optimization steps - mjx_data = root_optimization(mjx_model, mjx_data, kp_data) + mjx_data = compute_stac.root_optimization(mjx_model, mjx_data, kp_data) for n_iter in range(utils.params["N_ITERS"]): print(f"Calibration iteration: {n_iter + 1}/{utils.params['N_ITERS']}") - mjx_data, q, walker_body_sites, x, frame_time, frame_error = pose_optimization( - mjx_model, mjx_data, kp_data + mjx_data, q, walker_body_sites, x, frame_time, frame_error = ( + compute_stac.pose_optimization(mjx_model, mjx_data, kp_data) ) for i, (t, e) in enumerate(zip(frame_time, frame_error)): @@ -224,14 +217,14 @@ def fit(mj_model, kp_data): print(f"Standard deviation: {std}") print("starting offset optimization") - mjx_model, mjx_data = offset_optimization( + mjx_model, mjx_data = compute_stac.offset_optimization( mjx_model, mjx_data, kp_data, offsets, q ) # Optimize the pose for the whole sequence print("Final pose optimization") - mjx_data, q, walker_body_sites, x, frame_time, frame_error = pose_optimization( - mjx_model, mjx_data, kp_data + mjx_data, q, walker_body_sites, x, frame_time, frame_error = ( + compute_stac.pose_optimization(mjx_model, mjx_data, kp_data) ) for i, (t, e) in enumerate(zip(frame_time, frame_error)): @@ -289,8 +282,8 @@ def mjx_setup(kp_data, mj_model): mjx_model, mjx_data = vmap_mjx_setup(kp_data, mj_model) # Vmap optimize functions - vmap_root_opt = vmap(root_optimization) - vmap_pose_opt = vmap(pose_optimization) + vmap_root_opt = vmap(compute_stac.root_optimization) + vmap_pose_opt = vmap(compute_stac.pose_optimization) # q_phase mjx_data = vmap_root_opt(mjx_model, mjx_data, kp_data) @@ -305,3 +298,33 @@ def mjx_setup(kp_data, mj_model): print(f"Standard deviation: {std}") return mjx_model, q, x, walker_body_sites, kp_data + + +def package_data(mjx_model, physics, q, x, walker_body_sites, kp_data, batched=False): + """Extract pose, offsets, data, and all parameters.""" + if batched: + # prepare batched data to be packaged + get_batch_offsets = vmap(op.get_site_pos) + offsets = get_batch_offsets(mjx_model).copy()[0] + x = x.reshape(-1, x.shape[-1]) + q = q.reshape(-1, q.shape[-1]) + else: + offsets = op.get_site_pos(mjx_model).copy() + + names_xpos = physics.named.data.xpos.axes.row.names + + kp_data = kp_data.reshape(-1, kp_data.shape[-1]) + data = { + "qpos": q, + "xpos": x, + "walker_body_sites": walker_body_sites, + "offsets": offsets, + "names_qpos": utils.params["part_names"], + "names_xpos": names_xpos, + "kp_data": jnp.copy(kp_data), + } + + for k, v in utils.params.items(): + data[k] = v + + return data diff --git a/stac_mjx/main.py b/stac_mjx/main.py index 53ba84e..44de50a 100644 --- a/stac_mjx/main.py +++ b/stac_mjx/main.py @@ -1,43 +1,61 @@ -"""This module is the entry point for the stac-mjx algorithm.""" +"""User-level API to run stac.""" import mujoco import jax -from jax import numpy as jnp -from jax.lib import xla_bridge +from jax import numpy as jp from dm_control import mjcf -import numpy as np -import os import pickle import time -import argparse -import random import logging -import sys -import hydra -from hydra import initialize from omegaconf import DictConfig, OmegaConf -import utils -import controller as ctrl +from stac_mjx import utils +from stac_mjx import controller as ctrl +from pathlib import Path -def run_stac(cfg: DictConfig): - """Run the core of the stac-mjx algorithm.""" - # setting paths - fit_path = cfg.paths.fit_path - transform_path = cfg.paths.transform_path +def load_configs(stac_config_path: Path, model_config_path: Path) -> DictConfig: + """Initializes configs. - ratpath = cfg.paths.xml - data_path = cfg.paths.data_path + Args: + stac_config_path (str): path to stac yaml file + model_config_path (str): path to model yaml file - kp_data = utils.load_data(data_path, utils.params) + Returns: + DictConfig: stac.yaml config to use in run_stac() + """ + utils.init_params( + OmegaConf.to_container(OmegaConf.load(model_config_path), resolve=True) + ) + return OmegaConf.load(stac_config_path) + + +def run_stac( + cfg: DictConfig, kp_data: jp.ndarray, base_path: Path = Path.cwd() +) -> tuple[str, str]: + """Runs stac through fit and transform stages (optionally). + + Args: + cfg (DictConfig): stac config file (standard being stac.yaml) + kp_data (jp.Array): Keypoint data of shape (frame, X), + where X is a flattened array of keypoint coordinates + in the order specified by the model config file (KEYPOINT_MODEL_PAIRS) - # Load by file extension (Probably want to validate by schema - # in the future.) + + Returns: + tuple[str, str]: (fit_path, transform_path) + """ + start_time = time.time() + + # Gettings paths + fit_path = base_path / cfg.paths.fit_path + transform_path = base_path / cfg.paths.transform_path + + xml_path = base_path / cfg.paths.xml # Set up mjcf - root = mjcf.from_path(ratpath) + root = mjcf.from_path(xml_path) physics, mj_model = ctrl.create_body_sites(root) ctrl.part_opt_setup(physics) @@ -48,23 +66,17 @@ def run_stac(cfg: DictConfig): mj_model.opt.iterations = cfg.mujoco.iterations mj_model.opt.ls_iterations = cfg.mujoco.ls_iterations + + # Runs faster on GPU with this mj_model.opt.jacobian = 0 # dense # Run fit if not skipping - if cfg.test.skip_fit != 1: + if cfg.skip_fit != 1: logging.info(f"kp_data shape: {kp_data.shape}") - if cfg.sampler == "first": - logging.info("Sampling the first n frames") - fit_data = kp_data[: cfg.n_fit_frames] - elif cfg.sampler == "every": - logging.info("Sampling every x frames") - every = kp_data.shape[0] // cfg.n_fit_frames - fit_data = kp_data[::every] - elif cfg.sampler == "random": - logging.info("Sampling n random frames") - fit_data = jax.random.choice( - jax.random.PRNGKey(0), kp_data, (cfg.n_fit_frames,), replace=False - ) + logging.info(f"Sampling {cfg.n_fit_frames} random frames for fit") + fit_data = jax.random.choice( + jax.random.PRNGKey(0), kp_data, (cfg.n_fit_frames,), replace=False + ) logging.info(f"fit_data shape: {fit_data.shape}") mjx_model, q, x, walker_body_sites, clip_data = ctrl.fit(mj_model, fit_data) @@ -77,9 +89,9 @@ def run_stac(cfg: DictConfig): utils.save(fit_data, fit_path) # Stop here if skipping transform - if cfg.test.skip_transform == 1: + if cfg.skip_transform == 1: logging.info("skipping transform()") - return fit_path, "none" + return fit_path, None logging.info("Running transform()") with open(fit_path, "rb") as file: @@ -96,40 +108,9 @@ def run_stac(cfg: DictConfig): mjx_model, physics, q, x, walker_body_sites, kp_data, batched=True ) - logging.info(f"saving data to {transform_path}") + logging.info( + f"Saving data to {transform_path}. Finished in {time.time() - start_time} seconds" + ) utils.save(transform_data, transform_path) return fit_path, transform_path - - -@hydra.main(config_path="../configs", config_name="stac", version_base=None) -def hydra_entry(cfg: DictConfig): - """Prepare and run the stac-mjx algorith.""" - # Initialize configs and convert to dictionaries - global_cfg = hydra.compose(config_name="rodent") - logging.info(f"cfg: {OmegaConf.to_yaml(cfg)}") - logging.info(f"global_cfg: {OmegaConf.to_yaml(cfg)}") - utils.init_params(OmegaConf.to_container(global_cfg, resolve=True)) - - # Don't preallocate RAM? - os.environ["XLA_PYTHON_CLIENT_PREALLOCATE"] = "false" - - # XLA flags for Nvidia GPU - if xla_bridge.get_backend().platform == "gpu": - # Set num. gpus. Enable when support for multiple GPUs is implemented - # utils.params["N_GPUS"] = jax.local_device_count("gpu") - os.environ["XLA_FLAGS"] = ( - "--xla_gpu_enable_triton_softmax_fusion=true " - "--xla_gpu_triton_gemm_any=True " - # These may provide additional speed ups, but are currently disabled - # due to errors. - # "--xla_gpu_enable_highest_priority_async_stream=true " - # "--xla_gpu_enable_async_collectives=true " - # "--xla_gpu_enable_latency_hiding_scheduler=true " - ) - - return run_stac(cfg) - - -if __name__ == "__main__": - hydra_entry() diff --git a/stac_mjx/operations.py b/stac_mjx/operations.py index 348df29..e097ff1 100644 --- a/stac_mjx/operations.py +++ b/stac_mjx/operations.py @@ -5,7 +5,7 @@ from mujoco import mjx from mujoco.mjx._src import smooth import numpy as np -import utils +from stac_mjx import utils @jit diff --git a/stac_mjx/stac_base.py b/stac_mjx/stac_base.py index a796ceb..7ad5d5e 100644 --- a/stac_mjx/stac_base.py +++ b/stac_mjx/stac_base.py @@ -1,51 +1,50 @@ """Implementation of stac for animal motion capture in dm_control suite.""" -from typing import List, Dict, Text, Union, Tuple import jax -import jax.numpy as jnp +import jax.numpy as jp from jax import jit -from jaxopt import LBFGSB, LBFGS, ProjectedGradient +from jaxopt import ProjectedGradient from jaxopt.projection import projection_box from jaxopt import OptaxSolver import optax -import operations as op -import utils +from stac_mjx import operations as op +from stac_mjx import utils def huber(x, delta=5.0, max=10, max_slope=0.1): """Compute the Huber loss + sum.""" - x = jnp.where(jnp.abs(x) < delta, 0.5 * x**2, delta * (jnp.abs(x) - 0.5 * delta)) - x = jnp.where(x > max, (x - max) * max_slope + max, x) - return jnp.sum(x) + x = jp.where(jp.abs(x) < delta, 0.5 * x**2, delta * (jp.abs(x) - 0.5 * delta)) + x = jp.where(x > max, (x - max) * max_slope + max, x) + return jp.sum(x) def squared_error(x): """Compute the squared error + sum.""" - return jnp.sum(jnp.square(x)) + return jp.sum(jp.square(x)) def q_loss( - q: jnp.ndarray, + q: jp.ndarray, mjx_model, mjx_data, - kp_data: jnp.ndarray, - qs_to_opt: jnp.ndarray, - kps_to_opt: jnp.ndarray, - initial_q: jnp.ndarray, + kp_data: jp.ndarray, + qs_to_opt: jp.ndarray, + kps_to_opt: jp.ndarray, + initial_q: jp.ndarray, ) -> float: """Compute the marker loss for q_phase optimization. Args: - q (jnp.ndarray): Proposed qs + q (jp.ndarray): Proposed qs mjx_model (mjx.Model): Model object (stays constant) mjx_data (mjx.Data): Data object (modified to calculate new xpos) - kp_data (jnp.ndarray): Ground truth keypoint positions - qs_to_opt (jnp.ndarray): Boolean array; for each index in qpos, True = q and False = initial_q when calculating residual - kps_to_opt (jnp.ndarray): Boolean array; only return residuals for the True positions - initial_q (jnp.ndarray): Starting qs for reference + kp_data (jp.ndarray): Ground truth keypoint positions + qs_to_opt (jp.ndarray): Boolean array; for each index in qpos, True = q and False = initial_q when calculating residual + kps_to_opt (jp.ndarray): Boolean array; only return residuals for the True positions + initial_q (jp.ndarray): Starting qs for reference Returns: float: sum of squares scalar loss @@ -54,7 +53,7 @@ def q_loss( mjx_data = mjx_data.replace(qpos=op.make_qs(initial_q, qs_to_opt, q)) # Clip to bounds ourselves because of potential jaxopt bug - # mjx_data = mjx_data.replace(qpos=jnp.clip(op.make_qs(initial_q, qs_to_opt, q), utils.params['lb'], utils.params['ub'])) + # mjx_data = mjx_data.replace(qpos=jp.clip(op.make_qs(initial_q, qs_to_opt, q), utils.params['lb'], utils.params['ub'])) # Forward kinematics mjx_data = op.kinematics(mjx_model, mjx_data) @@ -75,11 +74,11 @@ def q_loss( def q_opt( mjx_model, mjx_data, - marker_ref_arr: jnp.ndarray, - qs_to_opt: jnp.ndarray, - kps_to_opt: jnp.ndarray, + marker_ref_arr: jp.ndarray, + qs_to_opt: jp.ndarray, + kps_to_opt: jp.ndarray, # maxiter: int, - q0: jnp.ndarray, + q0: jp.ndarray, ftol: float, ): """Update q_pose using estimated marker parameters.""" @@ -89,7 +88,7 @@ def q_opt( return mjx_data, q_solver.run( q0, - hyperparams_proj=jnp.array((lb, ub)), + hyperparams_proj=jp.array((lb, ub)), mjx_model=mjx_model, mjx_data=mjx_data, kp_data=marker_ref_arr.T, @@ -109,31 +108,30 @@ def q_opt( @jit def m_loss( - offsets: jnp.ndarray, + offsets: jp.ndarray, mjx_model, mjx_data, - kp_data: jnp.ndarray, - q: jnp.ndarray, - initial_offsets: jnp.ndarray, + kp_data: jp.ndarray, + q: jp.ndarray, + initial_offsets: jp.ndarray, is_regularized: bool = None, reg_coef: float = 0.0, -): +) -> jp.array: # fmt: off - # Black and pydoc conflict, so turn Black off for this doc string. - """Compute the marker loss for optimization. + """Compute the marker residual for optimization. Args: - offsets (jnp.ndarray): vector of offsets to inferred mocap sites - mjx_model (mjx.Model): MJX Model - mjx_data (mjx.Data): MJX Data - env (TYPE): env of current environment. - kp_data (jnp.ndarray): Mocap data in global coordinates - time_indices (List): time_indices used for offset estimation - sites (jnp.ndarray): sites of keypoints at frame_index - q (jnp.ndarray): qpos values for the frames in time_indices - initial_offsets (jnp.ndarray): Initial offset values for offset regularization - is_regularized (bool, optional): binary vector of offsets to regularize. - reg_coef (float, optional): L1 regularization coefficient during marker loss. + offsets (jp.ndarray): vector of offsets to inferred mocap sites + mjx_model (_type_): MJX Model + mjx_data (_type_): MJX Data + kp_data (jp.ndarray): Mocap data in global coordinates + q (jp.ndarray): proposed qpos values + initial_offsets (jp.ndarray): Initial offset values for offset regularization + is_regularized (bool, optional): binary vector of offsets to regularize.. Defaults to None. + reg_coef (float, optional): L1 regularization coefficient during marker loss.. Defaults to 0.0. + + Returns: + _type_: _description_ """ # fmt: on def f(carry, input): @@ -143,13 +141,12 @@ def f(carry, input): # Get the offset relative to the initial position, only for markers you wish to regularize reg_term = ( - reg_term - + (jnp.square(offsets - initial_offsets.flatten())) * is_regularized + reg_term + (jp.square(offsets - initial_offsets.flatten())) * is_regularized ) # Set qpos and offsets mjx_data = mjx_data.replace(qpos=qpos) - mjx_model = op.set_site_pos(mjx_model, jnp.reshape(offsets, (-1, 3))) + mjx_model = op.set_site_pos(mjx_model, jp.reshape(offsets, (-1, 3))) # Forward kinematics mjx_data = op.kinematics(mjx_model, mjx_data) @@ -157,7 +154,7 @@ def f(carry, input): markers = op.get_site_xpos(mjx_data).flatten() # Accumulate squared residual - residual = residual + jnp.square((kp - markers)) + residual = residual + jp.square((kp - markers)) return ( mjx_model, mjx_data, @@ -173,15 +170,15 @@ def f(carry, input): ( mjx_model, mjx_data, - jnp.zeros(69), - jnp.zeros(69), + jp.zeros(69), + jp.zeros(69), initial_offsets, is_regularized, ), (q, kp_data), ) ) - return jnp.sum(residual) + reg_coef * jnp.sum(reg_term) + return jp.sum(residual) + reg_coef * jp.sum(reg_term) @jit @@ -225,7 +222,7 @@ def m_opt( return res -# TODO: put these values in config +# TODO: put these values in config, move to just optax by implementing solver loop opt = optax.sgd(learning_rate=5e-4, momentum=0.9, nesterov=False) q_solver = ProjectedGradient(fun=q_loss, projection=projection_box, maxiter=250) diff --git a/stac_mjx/utils.py b/stac_mjx/utils.py index ab8a396..0b816fe 100755 --- a/stac_mjx/utils.py +++ b/stac_mjx/utils.py @@ -1,5 +1,6 @@ """Utility functions to load data from .mat .yaml and .h5 files.""" +import os import numpy as np from jax import numpy as jnp import yaml @@ -8,18 +9,21 @@ from typing import Text from pynwb import NWBHDF5IO from ndx_pose import PoseEstimationSeries, PoseEstimation +from pathlib import Path +from typing import Dict -def load_data(filename, params): +def load_data(file_path: Path, params: Dict, label3d_path=None): """Main mocap data file loader interface. Loads mocap file based on filetype, and returns the data flattened for immediate consumption by stac_mjx algorithm. Args: - filename: path to be loaded, which should have a supported + file_path: path to be loaded, which should have a supported file type suffix, either .mat or .nwb, and presumed to be organized as [num frames, num keypoints, xyz]. + params: Returns: Mocap data flattened into an np array of shape [#frames, keypointXYZ], @@ -31,12 +35,11 @@ def load_data(filename, params): Raises: ValueError if an unsupported filetype is encountered. """ - if filename.endswith(".mat"): - # Label3d file - kp_names_filename = params.get("KP_NAMES_LABEL3D_PATH", None) - data, kp_names = load_dannce(filename, names_filename=kp_names_filename) - elif filename.endswith(".nwb"): - data, kp_names = load_nwb(filename) + # using pathlib + if file_path.suffix == ".mat": + data, kp_names = load_dannce(str(file_path), names_filename=label3d_path) + elif file_path.suffix == ".nwb": + data, kp_names = load_nwb(file_path) else: raise ValueError( "Unsupported file extension. Please provide a .nwb or .mat file." @@ -44,6 +47,17 @@ def load_data(filename, params): kp_names = kp_names or params["KP_NAMES"] + if kp_names is None: + raise ValueError( + "Keypoint names not provided. Please provide an ordered list of keypoint names \ + corresponding to the keypoint data order." + ) + print(len(kp_names), data.shape[2]) + if len(kp_names) != data.shape[2]: + raise ValueError( + f"Number of keypoint names ({len(kp_names)}) is not the same as the number of keypoints in data ({data.shape[1]})" + ) + model_inds = np.array( [kp_names.index(src) for src, dst in params["KEYPOINT_MODEL_PAIRS"].items()] ) @@ -131,8 +145,8 @@ def _load_params(param_path): return params -def init_params(cfg): - """Assign params as a global variable.""" +def init_params(cfg: dict): + """Initialize parameters from config.""" global params params = cfg diff --git a/stac_mjx/viz.py b/stac_mjx/viz.py index 937caf9..31c5435 100644 --- a/stac_mjx/viz.py +++ b/stac_mjx/viz.py @@ -4,310 +4,18 @@ from dm_control.locomotion.walkers import rescale from dm_control.mujoco.wrapper.mjbindings import enums import mujoco -from jax import numpy as jnp import pickle import imageio import numpy as np -from typing import List, Dict, Text -import os -from dm_control.mujoco import wrapper -import cv2 -from scipy.ndimage import gaussian_filter -from scipy.spatial.transform import Rotation as R -import utils - -# Gotta do this before importing controller -utils.init_params("../params/params.yaml") -import controller as ctrl -import stac_base +from stac_mjx import utils +from stac_mjx import controller as ctrl # Standard image shape for dannce rig data # TODO: make this a param HEIGHT = 1200 WIDTH = 1920 -# Param for overlay_frame() -ALPHA_BASE_VALUE = 0.5 - - -def correct_optical_center( - params, frame: np.ndarray, cam_id: int, pad_val=0 -) -> np.ndarray: - """Correct the optical center of the frame. - - Args: - params (_type_): Matlab camera parameters - frame (np.ndarray): frame to correct - cam_id (int): camera id - pad_val (int, optional): Pad value. Defaults to 0. - - Returns: - np.ndarray: Corrected frame - """ - # Get the optical center - cx = params[cam_id].K[2, 0] - cy = params[cam_id].K[2, 1] - - # Compute the offset and pad the frame - crop_offset_x = int(-cx + (frame.shape[1] / 2)) - crop_offset_y = int(-cy + (frame.shape[0] / 2)) - padding = np.max(np.abs([crop_offset_x, crop_offset_y])) + 10 - padded_frame = np.pad( - frame, - ((padding, padding), (padding, padding), (0, 0)), - mode="constant", - constant_values=pad_val, - ) - crop_offset_x += padding - crop_offset_y += padding - - # Crop the frame - frame = padded_frame[ - crop_offset_y : crop_offset_y + frame.shape[0], - crop_offset_x : crop_offset_x + frame.shape[1], - ] - return frame - - -def overlay_frame( - rgb_frame: np.ndarray, - params: List, - recon_frame: np.ndarray, - seg_frame: np.ndarray, - camera: Text, -) -> np.ndarray: - """Overlay the reconstructed frame on top of the rgb frame. - - Args: - rgb_frame (np.ndarray): Frame from the rgb video. - params (List): Camera parameters. - recon_frame (np.ndarray): Reconstructed frame. - seg_frame (np.ndarray): Segmented frame. - camera (int): Camera name. - - Returns: - np.ndarray: Overlayed frame. - """ - # TODO: id 1 for camera 2; change to param later - cam_id = int(camera[-1]) - 1 - # Load and undistort the rgb frame - rgb_frame = cv2.undistort( - rgb_frame, - params[cam_id].K.T, - np.concatenate( - [params[cam_id].RDistort, params[cam_id].TDistort], axis=0 - ).T.squeeze(), - params[cam_id].K.T, - ) - - # Calculate the alpha mask using the segmented video - alpha = (seg_frame[:, :, 0] >= 0.0) * ALPHA_BASE_VALUE - alpha = gaussian_filter(alpha, 2) - alpha = gaussian_filter(alpha, 2) - alpha = gaussian_filter(alpha, 2) - frame = np.zeros_like(recon_frame) - - # Correct the segmented frame by cropping such that the optical center is at the center of the image - # (No longer needed for mujoco > 3.0.0) - # recon_frame = correct_optical_center(params, recon_frame, cam_id) - # seg_frame = correct_optical_center(params, seg_frame, cam_id, pad_val=-1) - - # Calculate the alpha mask using the segmented video - alpha = (seg_frame[:, :, 0] >= 0.0) * ALPHA_BASE_VALUE - alpha = gaussian_filter(alpha, 2) - alpha = gaussian_filter(alpha, 2) - alpha = gaussian_filter(alpha, 2) - frame = np.zeros_like(recon_frame) - - # Blend the two videos - for n_chan in range(recon_frame.shape[2]): - frame[:, :, n_chan] = ( - alpha * recon_frame[:, :, n_chan] + (1 - alpha) * rgb_frame[:, :, n_chan] - ) - return frame - - -def convert_camera(cam, idx): - """Convert a camera from Matlab convention to Mujoco convention.""" - # Matlab camera X faces the opposite direction of Mujoco X - rot = R.from_matrix(cam.r.T) - eul = rot.as_euler("zyx") - eul[2] += np.pi - modified_rot = R.from_euler("zyx", eul) - quat = modified_rot.as_quat() - - # Convert the quaternion convention from scipy.spatial.transform.Rotation to Mujoco. - quat = quat[np.array([3, 0, 1, 2])] - quat[0] *= -1 - # The y field of fiew is a function of the focal y and the image height. - fovy = 2 * np.arctan(HEIGHT / (2 * cam.K[1, 1])) / (2 * np.pi) * 360 - return { - "name": f"Camera{idx + 1}", - "pos": -cam.t @ cam.r.T / 1000, - "fovy": fovy, - "quat": quat, - } - - -def convert_camera_indiv(cam, id): - """Convert a camera from Matlab convention to Mujoco convention.""" - # Matlab camera X faces the opposite direction of Mujoco X - rot = R.from_matrix(cam["TDistort"]) - eul = rot.as_euler("zyx") - eul[2] += np.pi - modified_rot = R.from_euler("zyx", eul) - quat = modified_rot.as_quat() - - # Convert the quaternion convention from scipy.spatial.transform.Rotation to Mujoco. - quat = quat[np.array([3, 0, 1, 2])] - quat[0] *= -1 - # The y field of fiew is a function of the focal y and the image height. - fovy = 2 * np.arctan(HEIGHT / (2 * cam["K"][1, 1])) / (2 * np.pi) * 360 - return { - "name": f"Camera{id}", - "pos": -cam["t"] @ cam["TDistort"] / 1000, - "fovy": fovy, - "quat": quat, - } - - -def convert_cameras(params) -> List[Dict]: - """Convert cameras from Matlab convention to Mujoco convention. - - Args: - params: Camera parameters structure - - Returns: - List[Dict]: List of dicts containing kwargs for Mujoco camera addition through worldbody. - """ - camera_kwargs = [convert_camera(cam, idx) for idx, cam in enumerate(params)] - return camera_kwargs - - -def overlay_viz( - data_path, - calibration_path, - video_path, - model_xml, - n_frames, - save_path, - camera: Text = "close_profile", -): - """Overlay 3D mocap forward kinematics for the model on top the original video. - - Uses camera parameters from dannce mocap recording setup and aligns the video - of the recording with the rendering of the mujoco forward kinematics and - overlays them. - """ - scene_option = wrapper.MjvOption() - # scene_option.geomgroup[1] = 0 - scene_option.geomgroup[2] = 1 - # scene_option.geomgroup[3] = 0 - # scene_option.sitegroup[0] = 0 - # scene_option.sitegroup[1] = 0 - scene_option.sitegroup[2] = 1 - - scene_option.sitegroup[3] = 1 - scene_option.flags[enums.mjtVisFlag.mjVIS_TRANSPARENT] = True - scene_option.flags[enums.mjtVisFlag.mjVIS_LIGHT] = False - scene_option.flags[enums.mjtVisFlag.mjVIS_CONVEXHULL] = True - scene_option.flags[enums.mjtRndFlag.mjRND_SHADOW] = False - scene_option.flags[enums.mjtRndFlag.mjRND_REFLECTION] = False - scene_option.flags[enums.mjtRndFlag.mjRND_SKYBOX] = False - scene_option.flags[enums.mjtRndFlag.mjRND_FOG] = False - - # Load mjx_model and mjx_data and set marker sites - root = mjcf.from_path(model_xml) - rescale.rescale_subtree( - root, - utils.params["SCALE_FACTOR"], - utils.params["SCALE_FACTOR"], - ) - # Add cameras - cam_params = utils.loadmat(calibration_path)["params"] - # print(cam_params.keys()) - # print(cam_params) - # root.worldbody.add("camera", **convert_camera_indiv(cam_params, 2)) # Camera 2 - camera_kwargs = convert_cameras(cam_params) - for kwargs in camera_kwargs: - root.worldbody.add("camera", **kwargs) - - physics, mj_model = ctrl.create_body_sites(root) - physics, mj_model, keypoint_sites = ctrl.create_keypoint_sites(root) - physics.forward() - # Load data - with open(data_path, "rb") as file: - d = pickle.load(file) - qposes = np.array(d["qpos"]) - kp_data = np.array(d["kp_data"]) - - renderer = mujoco.Renderer(mj_model, height=1200, width=1920) - - kp_data = kp_data[: qposes.shape[0]] - - prev_time = physics.time() - reader = imageio.get_reader(video_path) - - frames = [] - with imageio.get_writer(save_path, fps=utils.params["RENDER_FPS"]) as video: - for i, (qpos, kps) in enumerate(zip(qposes, kp_data)): - if i % 100 == 0: - print(f"rendering frame {i}") - - # TODO: cut qposes and kp_data into the right shape beforehand - if i == n_frames: - break - # This only happens with the simulation fps and render fps don't match up - # commenting out for now since I'll need to implement time tracking outside of dmcontrol - if i > 0: - while (np.round(physics.time() - prev_time, decimals=5)) < utils.params[ - "TIME_BINS" - ]: - # mujoco.mj_forward(mj_model, mj_data) - physics.step() - # Set keypoints - physics, mj_model = ctrl.set_keypoint_sites(physics, keypoint_sites, kps) - # mj_data.qpos = qpos - # mujoco.mj_forward(mj_model, mj_data) - physics.data.qpos = qpos - physics.step() - - # SEGMENT or IDCOLOR? - # https://github.com/google-deepmind/mujoco/blob/725630c95ddebceb32b89c45cfc14a5eae7f8a8a/include/mujoco/mjvisualize.h#L149 - # scene_option.flags[enums.mjtRndFlag.mjRND_SEGMENT] = False - # renderer.update_scene(physics.data, camera=camera, scene_option=scene_option) - # reconArr = renderer.render() - - # # Get segmentation rendering - # scene_option.flags[enums.mjtRndFlag.mjRND_SEGMENT] = True - # renderer.update_scene(physics.data, camera=camera, scene_option=scene_option) - # segArr = renderer.render() - - reconArr = physics.render( - HEIGHT, - WIDTH, - camera_id=camera, - scene_option=scene_option, - ) - - segArr = physics.render( - HEIGHT, - WIDTH, - camera_id=camera, - scene_option=scene_option, - segmentation=True, - ) - - rgbArr = reader.get_data(i) - frame = overlay_frame(rgbArr, cam_params, reconArr, segArr, camera) - - video.append_data(frame) - frames.append(frame) - prev_time = np.round(physics.time(), decimals=2) - - return frames - def mujoco_viz(data_path, model_xml, n_frames, save_path, start_frame: int = 0): """Render forward kinematics from keypoint positions.""" @@ -384,105 +92,3 @@ def mujoco_viz(data_path, model_xml, n_frames, save_path, start_frame: int = 0): frames.append(pixels) return frames - - -# Render two rats in the same sim! This can be programmatically extended to any number of rats -# No keypoints or body site rendering unfortunately since they are explicitly named -def mujoco_pair_viz( - data_path1, - data_path2, - model_xml, - n_frames, - save_path, - start_frame1: int = 0, - start_frame2: int = 0, -): - """Render two models in the same simulation.""" - scene_option = mujoco.MjvOption() - # scene_option.geomgroup[1] = 0 - scene_option.geomgroup[2] = 1 - # scene_option.geomgroup[3] = 0 - # scene_option.sitegroup[0] = 0 - # scene_option.sitegroup[1] = 0 - scene_option.sitegroup[2] = 1 - - scene_option.sitegroup[3] = 1 - scene_option.flags[enums.mjtVisFlag.mjVIS_TRANSPARENT] = True - scene_option.flags[enums.mjtVisFlag.mjVIS_LIGHT] = False - scene_option.flags[enums.mjtVisFlag.mjVIS_CONVEXHULL] = True - scene_option.flags[enums.mjtRndFlag.mjRND_SHADOW] = False - scene_option.flags[enums.mjtRndFlag.mjRND_REFLECTION] = False - scene_option.flags[enums.mjtRndFlag.mjRND_SKYBOX] = False - scene_option.flags[enums.mjtRndFlag.mjRND_FOG] = False - - # Load mjx_model and mjx_data and set marker sites - # root = mjcf.from_path(model_xml) - # physics = mjcf.Physics.from_mjcf_model(root) - mj_model = mujoco.MjModel.from_xml_path(model_xml) - # physics, mj_model = ctrl.create_body_sites(root) - # physics, mj_model, keypoint_sites = ctrl.create_keypoint_sites(root) - - # rescale.rescale_subtree( - # root, - # utils.params["SCALE_FACTOR"], - # utils.params["SCALE_FACTOR"], - # ) - - # Starting xpos and xquat for mjdata - _UPRIGHT_POS = (0.0, 0.0, 0.94) - _UPRIGHT_QUAT = (0.859, 1.0, 1.0, 0.859) - - mj_data = mujoco.MjData(mj_model) - # mj_data.xpos = _UPRIGHT_POS - # mj_data.xquat = _UPRIGHT_QUAT - mujoco.mj_kinematics(mj_model, mj_data) - - # Load data - with open(data_path1, "rb") as file: - d1 = pickle.load(file) - qposes1 = np.array(d1["qpos"]) - kp_data1 = np.array(d1["kp_data"]) - - with open(data_path2, "rb") as file: - d2 = pickle.load(file) - qposes2 = np.array(d2["qpos"]) - kp_data2 = np.array(d2["kp_data"]) - - renderer = mujoco.Renderer(mj_model, height=HEIGHT, width=WIDTH) - - # Make sure there are enough frames to render - if qposes1.shape[0] < n_frames - 1: - raise Exception( - f"Trying to render {n_frames} frames when data['qpos'] only has {qposes1.shape[0]}" - ) - - # slice kp_data to match qposes length - kp_data1 = kp_data1[: qposes1.shape[0]] - kp_data2 = kp_data2[: qposes2.shape[0]] - # Slice arrays to be the range that is being rendered - kp_data1 = kp_data1[start_frame1 : start_frame1 + n_frames] - qposes1 = qposes1[start_frame1 : start_frame1 + n_frames] - - kp_data2 = kp_data2[start_frame2 : start_frame2 + n_frames] - qposes2 = qposes2[start_frame2 : start_frame2 + n_frames] - - frames = [] - # render while stepping using mujoco - with imageio.get_writer(save_path, fps=utils.params["RENDER_FPS"]) as video: - for i, (qpos1, qpos2) in enumerate(zip(qposes1, qposes2)): - if i % 100 == 0: - print(f"rendering frame {i}") - - # Set keypoints - # physics, mj_model = ctrl.set_keypoint_sites(physics, keypoint_sites, kps) - mj_data.qpos = np.append(qpos1, qpos2) - mujoco.mj_forward(mj_model, mj_data) - - renderer.update_scene( - mj_data, camera="close_profile", scene_option=scene_option - ) - pixels = renderer.render() - video.append_data(pixels) - frames.append(pixels) - - return frames diff --git a/test.ipynb b/test.ipynb deleted file mode 100644 index cd8f04c..0000000 --- a/test.ipynb +++ /dev/null @@ -1,258 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Key: __header__\n", - "73\n", - "Key: __version__\n", - "3\n", - "Key: __globals__\n", - "0\n", - "Key: pred\n", - "360000\n", - "Key: data\n", - "360000\n", - "Key: p_max\n", - "360000\n", - "Key: sampleID\n", - "1\n", - "Key: metadata\n", - "1\n" - ] - } - ], - "source": [ - "import scipy.io\n", - "import numpy as np\n", - "\n", - "# Path to your .mat file\n", - "mat_file_path = 'save_data_AVG.mat'\n", - "#mat_file_path = '../dannce/demo/markerless_mouse_1/COM/predict_results/com3d.mat'\n", - "\n", - "# Load the .mat file\n", - "mat_contents = scipy.io.loadmat(mat_file_path)\n", - "\n", - "# Display the contents\n", - "for key, value in mat_contents.items():\n", - " #if not key.startswith('__'):\n", - " print(f\"Key: {key}\")\n", - " print(len(value))\n" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "frames = mat_contents[\"pred\"][1:1000]\n", - "data = {}\n", - "data[\"pred\"] = frames\n", - "\n", - "scipy.io.savemat(\"test_pred_only.mat\", data)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "94\n", - "[[0]]\n", - "[[0]]\n", - "[[(array(['/n/holylfs02/LABS/olveczky_lab/Everyone/dannce_rig/dannce_ephys/art/2020_12_21_1/20201221_163226_Label3D_dannce.mat'],\n", - " dtype='" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# set args and initialize params\n", - "import numpy\n", - "rat_xml = \"models/rodent.xml\"\n", - "# \n", - "data_path = \"./fit_sq.p\"\n", - "n_frames=1000\n", - "save_path=\"videos/direct_render.mp4\"\n", - "\n", - "# Call mujoco_viz\n", - "frames = mujoco_viz(data_path, rat_xml, n_frames, save_path, start_frame=0)\n", - "\n", - "# Show the video in the notebook (it is also saved to the save_path)\n", - "media.show_video(frames, fps=utils.params[\"RENDER_FPS\"])" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "base", - "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.11.9" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -}