From f3980e4bed43253222df9029903441c6af71b68f Mon Sep 17 00:00:00 2001 From: jf514 Date: Thu, 31 Oct 2024 17:47:09 -0700 Subject: [PATCH] Synthetic data smoke test. (#75) * Model runs + draws in notebook, no data output * Configs etc - model not yet working. * Disable energy * Offset shape bugfix (#73) * fix offset shape when saving * update demo config * linter * fix demo.yaml * update configs * update config test --------- Co-authored-by: Charles Zhang * Smoke test (#74) * run stac experiment * Fixed yaml * Test fail with bad input. * Should fail. * Corrected input - test should pass. * Update demo.yaml - enable ik_only() * Revert update demo.yaml * IT'S WORKING * Offset shape bugfix (#73) * fix offset shape when saving * update demo config * linter * fix demo.yaml * update configs * update config test --------- Co-authored-by: Charles Zhang * Configs etc - model not yet working. * Offset shape bugfix (#73) * fix offset shape when saving * update demo config * linter * fix demo.yaml * update configs * update config test --------- Co-authored-by: Charles Zhang * Configs etc - model not yet working. * Fix weird merge. * Clean up synth_model config file. * Remove TIME_BINS (which was a merge accident.) * Fix smoke test. * Fix smoke test. * Clean up. * Fixed root optimization, but still some debug code. * Add root_kp_index * Forgot model yaml. * Reset rodent configs, enable synth config. * Add synth_data smoke test. * Missed data file. * Clean up. * Add root opt keypoint to model configs + clean up. * Clean up. * CR feedback. * Add synth data generation program. * Add comments. --------- Co-authored-by: Charles Zhang <33401293+charles-zhng@users.noreply.github.com> Co-authored-by: Charles Zhang --- .github/workflows/ci.yml | 4 +- Mat-to-Nwb-Synth-Data.ipynb | 594 ++++++++++++++++++ configs/model/fly_tethered.yaml | 2 - configs/model/fly_treadmill.yaml | 4 +- configs/model/mouse.yaml | 2 + configs/model/rodent.yaml | 2 + configs/model/synth_data.yaml | 58 ++ configs/stac/stac_fly_treadmill.yaml | 2 +- configs/stac/stac_synth_data.yaml | 12 + demos/create_synth_data.ipynb | 224 +++++++ models/synth_model.xml | 18 + stac_mjx/compute_stac.py | 3 +- stac_mjx/stac.py | 27 +- tests/configs/model/test_mouse.yaml | 2 + tests/configs/model/test_rodent.yaml | 2 + tests/configs/model/test_rodent_label3d.yaml | 3 +- .../model/test_rodent_less_kp_names.yaml | 2 + .../model/test_rodent_no_kp_names.yaml | 2 + tests/data/test_synth_1_frames.nwb | Bin 0 -> 201672 bytes 19 files changed, 949 insertions(+), 14 deletions(-) create mode 100644 Mat-to-Nwb-Synth-Data.ipynb create mode 100644 configs/model/synth_data.yaml create mode 100644 configs/stac/stac_synth_data.yaml create mode 100644 demos/create_synth_data.ipynb create mode 100644 models/synth_model.xml create mode 100644 tests/data/test_synth_1_frames.nwb diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8bdd026..d0a5bd9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -101,7 +101,7 @@ jobs: verbose: false token: ${{ secrets.CODECOV_TOKEN }} - # Test probably delete this + # Smoke test. Shows end to end run with out crashing. - name: Smoke Test shell: bash -l {0} - run: python run_stac.py \ No newline at end of file + run: python run_stac.py stac=stac_synth_data model=synth_data \ No newline at end of file diff --git a/Mat-to-Nwb-Synth-Data.ipynb b/Mat-to-Nwb-Synth-Data.ipynb new file mode 100644 index 0000000..f268184 --- /dev/null +++ b/Mat-to-Nwb-Synth-Data.ipynb @@ -0,0 +1,594 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "mJSWVDRbCkMD", + "outputId": "f60eafc3-84b5-4c37-e711-bf2378115d73" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: ndx-pose in /opt/conda/envs/stac-mjx-env/lib/python3.11/site-packages (0.1.1)\n", + "Requirement already satisfied: pynwb<3,>=1.5.0 in /opt/conda/envs/stac-mjx-env/lib/python3.11/site-packages (from ndx-pose) (2.8.2)\n", + "Requirement already satisfied: hdmf<4,>=2.5.6 in /opt/conda/envs/stac-mjx-env/lib/python3.11/site-packages (from ndx-pose) (3.14.5)\n", + "Requirement already satisfied: h5py>=2.10 in /opt/conda/envs/stac-mjx-env/lib/python3.11/site-packages (from hdmf<4,>=2.5.6->ndx-pose) (3.11.0)\n", + "Requirement already satisfied: jsonschema>=2.6.0 in /opt/conda/envs/stac-mjx-env/lib/python3.11/site-packages (from hdmf<4,>=2.5.6->ndx-pose) (4.23.0)\n", + "Requirement already satisfied: numpy>=1.18 in /opt/conda/envs/stac-mjx-env/lib/python3.11/site-packages (from hdmf<4,>=2.5.6->ndx-pose) (1.26.4)\n", + "Requirement already satisfied: pandas>=1.0.5 in /opt/conda/envs/stac-mjx-env/lib/python3.11/site-packages (from hdmf<4,>=2.5.6->ndx-pose) (2.2.3)\n", + "Requirement already satisfied: ruamel-yaml>=0.16 in /opt/conda/envs/stac-mjx-env/lib/python3.11/site-packages (from hdmf<4,>=2.5.6->ndx-pose) (0.18.6)\n", + "Requirement already satisfied: scipy>=1.4 in /opt/conda/envs/stac-mjx-env/lib/python3.11/site-packages (from hdmf<4,>=2.5.6->ndx-pose) (1.14.1)\n", + "Requirement already satisfied: python-dateutil>=2.7.3 in /opt/conda/envs/stac-mjx-env/lib/python3.11/site-packages (from pynwb<3,>=1.5.0->ndx-pose) (2.9.0)\n", + "Requirement already satisfied: attrs>=22.2.0 in /opt/conda/envs/stac-mjx-env/lib/python3.11/site-packages (from jsonschema>=2.6.0->hdmf<4,>=2.5.6->ndx-pose) (24.2.0)\n", + "Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /opt/conda/envs/stac-mjx-env/lib/python3.11/site-packages (from jsonschema>=2.6.0->hdmf<4,>=2.5.6->ndx-pose) (2024.10.1)\n", + "Requirement already satisfied: referencing>=0.28.4 in /opt/conda/envs/stac-mjx-env/lib/python3.11/site-packages (from jsonschema>=2.6.0->hdmf<4,>=2.5.6->ndx-pose) (0.35.1)\n", + "Requirement already satisfied: rpds-py>=0.7.1 in /opt/conda/envs/stac-mjx-env/lib/python3.11/site-packages (from jsonschema>=2.6.0->hdmf<4,>=2.5.6->ndx-pose) (0.20.0)\n", + "Requirement already satisfied: pytz>=2020.1 in /opt/conda/envs/stac-mjx-env/lib/python3.11/site-packages (from pandas>=1.0.5->hdmf<4,>=2.5.6->ndx-pose) (2024.1)\n", + "Requirement already satisfied: tzdata>=2022.7 in /opt/conda/envs/stac-mjx-env/lib/python3.11/site-packages (from pandas>=1.0.5->hdmf<4,>=2.5.6->ndx-pose) (2024.2)\n", + "Requirement already satisfied: six>=1.5 in /opt/conda/envs/stac-mjx-env/lib/python3.11/site-packages (from python-dateutil>=2.7.3->pynwb<3,>=1.5.0->ndx-pose) (1.16.0)\n", + "Requirement already satisfied: ruamel.yaml.clib>=0.2.7 in /opt/conda/envs/stac-mjx-env/lib/python3.11/site-packages (from ruamel-yaml>=0.16->hdmf<4,>=2.5.6->ndx-pose) (0.2.8)\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager, possibly rendering your system unusable.It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv. Use the --root-user-action option if you know what you are doing and want to suppress this warning.\u001b[0m\u001b[33m\n", + "\u001b[0m" + ] + } + ], + "source": [ + "!pip install ndx-pose" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "HG8_BB3JCHni", + "outputId": "90fcc09d-2d5e-4443-f0fb-9622fe8a5e57" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Downloading...\n", + "From (original): https://drive.google.com/uc?id=1nN9XWL2L-ZeSb5rqu38gC28EOVlYuaOq\n", + "From (redirected): https://drive.google.com/uc?id=1nN9XWL2L-ZeSb5rqu38gC28EOVlYuaOq&confirm=t&uuid=f6e015d8-9625-4b60-a583-959012baf7ac\n", + "To: /content/save_data_AVG.mat\n", + "100% 467M/467M [00:06<00:00, 75.4MB/s]\n" + ] + } + ], + "source": [ + "!gdown --fuzzy https://drive.google.com/file/d/1nN9XWL2L-ZeSb5rqu38gC28EOVlYuaOq/view?usp=drive_link" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "3HdLigI8Cf97", + "outputId": "0b11e244-ba33-417e-9c73-469827eb628c" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "dict_keys(['__header__', '__version__', '__globals__', 'pred', 'data', 'p_max', 'sampleID', 'metadata'])\n", + "(360000, 3, 23)\n", + "(360000, 23)\n" + ] + } + ], + "source": [ + "from scipy.io import loadmat\n", + "import datetime\n", + "import numpy as np\n", + "from pynwb import NWBFile, NWBHDF5IO\n", + "from ndx_pose import PoseEstimationSeries, PoseEstimation\n", + "\n", + "\n", + "mat = loadmat(\"save_data_AVG.mat\")\n", + "print(mat.keys())\n", + "print(mat[\"data\"].shape)\n", + "print(mat[\"p_max\"].shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "O7MtC-C3DFAX", + "outputId": "ccc1e9c2-1f3c-418d-f9c6-4fa1e7975e26" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "augment_brightness: [[array([[0]])]]\n", + "augment_hue: [[array([[0]])]]\n", + "com_exp: [[array([[(array(['/n/holylfs02/LABS/olveczky_lab/Everyone/dannce_rig/dannce_ephys/art/2020_12_21_1/20201221_163226_Label3D_dannce.mat'],\n", + " dtype='/dev/null || (apt update && apt install -y ffmpeg)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Model is hard coded version of synth_model.xml. TODO: Read from file.\n", + "\n", + "chaotic_pendulum = \"\"\"\n", + "\n", + " \n", + "\n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\"\"\"\n", + "\n", + "model = mujoco.MjModel.from_xml_string(chaotic_pendulum)\n", + "data = mujoco.MjData(model)\n", + "height = 480\n", + "width = 640\n", + "\n", + "with mujoco.Renderer(model, height, width) as renderer:\n", + " mujoco.mj_forward(model, data)\n", + " renderer.update_scene(data, camera=\"fixed\")\n", + "\n", + " media.show_image(renderer.render())" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "simulation: 1.74 μs/step (574458Hz)\n", + "rendering: 4.65e+03 μs/frame ( 215Hz)\n", + "\n", + "\n" + ] + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# setup\n", + "n_seconds = 6\n", + "framerate = 30 # Hz\n", + "n_frames = int(n_seconds * framerate)\n", + "frames = []\n", + "height = 240\n", + "width = 320\n", + "\n", + "# set initial state\n", + "mujoco.mj_resetData(model, data)\n", + "data.joint('root').qvel = 2\n", + "\n", + "# simulate and record frames\n", + "frame = 0\n", + "sim_time = 0\n", + "render_time = 0\n", + "n_steps = 0\n", + "with mujoco.Renderer(model, height, width) as renderer:\n", + " for i in range(n_frames):\n", + " while data.time * framerate < i:\n", + " tic = time.time()\n", + " mujoco.mj_step(model, data)\n", + " sim_time += time.time() - tic\n", + " n_steps += 1\n", + " tic = time.time()\n", + " renderer.update_scene(data, \"fixed\")\n", + " frame = renderer.render()\n", + " render_time += time.time() - tic\n", + " frames.append(frame)\n", + "\n", + "# print timing and play video\n", + "step_time = 1e6*sim_time/n_steps\n", + "step_fps = n_steps/sim_time\n", + "print(f'simulation: {step_time:5.3g} μs/step ({step_fps:5.0f}Hz)')\n", + "frame_time = 1e6*render_time/n_frames\n", + "frame_fps = n_frames/render_time\n", + "print(f'rendering: {frame_time:5.3g} μs/frame ({frame_fps:5.0f}Hz)')\n", + "print('\\n')\n", + "\n", + "# show video\n", + "media.show_video(frames, fps=framerate)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# TODO: Modify the code below for data generation. \n", + "\n", + "# PERTURBATION = 1e-7\n", + "# SIM_DURATION = 10.0 # seconds\n", + "\n", + "# # preallocate\n", + "# n_steps = int(SIM_DURATION / model.opt.timestep)\n", + "# sim_time = np.zeros(n_steps)\n", + "# x0 = np.zeros((n_steps, 3))\n", + "# x1 = np.zeros((n_steps, 3))\n", + "\n", + "# # prepare plotting axes\n", + "# _, ax = plt.subplots(2, 1, figsize=(8, 6), sharex=True)\n", + "\n", + "# # initialize\n", + "# mujoco.mj_resetData(model, data)\n", + "# data.qvel[0] = 10 # root joint velocity\n", + "# # perturb initial velocities\n", + "# #data.qvel[:] += PERTURBATION * np.random.randn(model.nv)\n", + "\n", + "# # simulate\n", + "# for i in range(n_steps):\n", + "# mujoco.mj_step(model, data)\n", + "# sim_time[i] = data.time\n", + "# #angle[i] = data.joint('root').qpos\n", + "# x0[i] = data.body('0').xpos\n", + "# #x1[i] = data.body('1').xpos\n", + "# #print(data.body('1').xpos[0])\n", + "\n", + "# # plot\n", + "# ax[0].plot(sim_time, x0[:,2])\n", + "# ax[1].plot(sim_time, x1[:,2])\n", + "\n", + "# # finalize plot\n", + "# ax[0].set_title('x0')\n", + "# ax[0].set_ylabel('m')\n", + "# ax[1].set_title('x1')\n", + "# ax[1].set_ylabel('m')\n", + "# ax[1].set_xlabel('time (s)')\n", + "# plt.tight_layout()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "stac-mjx-env", + "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.10" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/models/synth_model.xml b/models/synth_model.xml new file mode 100644 index 0000000..9585c88 --- /dev/null +++ b/models/synth_model.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/stac_mjx/compute_stac.py b/stac_mjx/compute_stac.py index 632cd98..24a2597 100644 --- a/stac_mjx/compute_stac.py +++ b/stac_mjx/compute_stac.py @@ -14,6 +14,7 @@ def root_optimization( mjx_model, mjx_data, kp_data: jp.ndarray, + root_kp_idx: int, lb: jp.ndarray, ub: jp.ndarray, site_idxs: jp.ndarray, @@ -50,7 +51,7 @@ def root_optimization( # necessarily exactly so. The value of 3*18 is chosen for the # rodent.xml, corresponding to the index of 'SpineL' keypoint. # For the mouse model this should be 3*5, corresponding 'Trunk' - root_kp_idx = 3 * 18 + # root_kp_idx = 3 * 18 # FLY_MODEL: # root_kp_idx = 0 q0.at[:3].set(kp_data[frame, :][root_kp_idx : root_kp_idx + 3]) diff --git a/stac_mjx/stac.py b/stac_mjx/stac.py index a03822f..96ec88b 100644 --- a/stac_mjx/stac.py +++ b/stac_mjx/stac.py @@ -80,15 +80,22 @@ def __init__(self, xml_path: str, cfg: DictConfig, kp_names: List[str]): self._mj_model.body(i).name for i in range(self._mj_model.nbody) ] - joint_names = [self._mj_model.joint(i).name for i in range(self._mj_model.njnt)] + if "ROOT_OPTIMIZATION_KEYPOINT" in self.cfg.model: + self._root_kp_idx = self._kp_names.index( + self.cfg.model.ROOT_OPTIMIZATION_KEYPOINT + ) + else: + self._root_kp_idx = -1 # Set up bounds and part_names based on joint ranges, taking into account the dimensionality of parameters + joint_names = [self._mj_model.joint(i).name for i in range(self._mj_model.njnt)] self._lb, self._ub, self._part_names = _align_joint_dims( self._mj_model.jnt_type, self._mj_model.jnt_range, joint_names ) self._indiv_parts = self.part_opt_setup() + # Generate boolean flags for keypoints included in trunk optimization. self._trunk_kps = jp.array( [n in self.cfg.model.TRUNK_OPTIMIZATION_KEYPOINTS for n in kp_names], ) @@ -113,7 +120,7 @@ def get_part_ids(parts: List) -> jp.ndarray: [any(part in name for part in parts) for name in self._part_names] ) - if self.cfg.model.INDIVIDUAL_PART_OPTIMIZATION is None: + if "INDIVIDUAL_PART_OPTIMIZATION" not in self.cfg.model: indiv_parts = [] else: indiv_parts = jp.array( @@ -224,11 +231,16 @@ def fit_offsets(self, kp_data): # Begin optimization steps # Skip root optimization if model is fixed (no free joint at root) - if self._mj_model.jnt_type[0] == mujoco.mjtJoint.mjJNT_FREE: + if self._root_kp_idx == -1: + print( + "ROOT_OPTIMIZATION_KEYPOINT not specified, skipping Root Optimization." + ) + elif self._mj_model.jnt_type[0] == mujoco.mjtJoint.mjJNT_FREE: mjx_data = compute_stac.root_optimization( mjx_model, mjx_data, kp_data, + self._root_kp_idx, self._lb, self._ub, self._body_site_idxs, @@ -339,15 +351,20 @@ def mjx_setup(kp_data, mj_model): ) # q_phase - root - if self._mj_model.jnt_type[0] == mujoco.mjtJoint.mjJNT_FREE: + if self._root_kp_idx == -1: + print( + "Missing or invalid ROOT_OPTIMIZATION_KEYPOINT, skipping root_optimization()" + ) + elif self._mj_model.jnt_type[0] == mujoco.mjtJoint.mjJNT_FREE: vmap_root_opt = jax.vmap( compute_stac.root_optimization, - in_axes=(0, 0, 0, None, None, None, None), + in_axes=(0, 0, 0, None, None, None, None, None), ) mjx_data = vmap_root_opt( mjx_model, mjx_data, batched_kp_data, + self._root_kp_idx, self._lb, self._ub, self._body_site_idxs, diff --git a/tests/configs/model/test_mouse.yaml b/tests/configs/model/test_mouse.yaml index 7091175..4c740c4 100644 --- a/tests/configs/model/test_mouse.yaml +++ b/tests/configs/model/test_mouse.yaml @@ -122,6 +122,8 @@ KEYPOINT_INITIAL_OFFSETS: Lisfranc_L: 0.0 0.0 0.0 MTP_R: 0.0 0.0 0.0 +ROOT_OPTIMIZATION_KEYPOINT: Trunk + TRUNK_OPTIMIZATION_KEYPOINTS: - "Trunk" - "HipL" diff --git a/tests/configs/model/test_rodent.yaml b/tests/configs/model/test_rodent.yaml index 3ec71e4..154583f 100644 --- a/tests/configs/model/test_rodent.yaml +++ b/tests/configs/model/test_rodent.yaml @@ -80,6 +80,8 @@ KEYPOINT_INITIAL_OFFSETS: WristL: 0. 0. 0.0 WristR: 0. 0. 0.0 +ROOT_OPTIMIZATION_KEYPOINT: SpineL + TRUNK_OPTIMIZATION_KEYPOINTS: - "Spine" - "Hip" diff --git a/tests/configs/model/test_rodent_label3d.yaml b/tests/configs/model/test_rodent_label3d.yaml index 66d9854..46d6af8 100644 --- a/tests/configs/model/test_rodent_label3d.yaml +++ b/tests/configs/model/test_rodent_label3d.yaml @@ -8,7 +8,6 @@ N_FRAMES_PER_CLIP: 360 # presumed to be derived from label3d: KP_NAMES_LABEL3D_PATH: "tests/data/rat23.mat" - # The model sites used to register the keypoints. KEYPOINT_MODEL_PAIRS: AnkleL: lower_leg_L @@ -61,6 +60,8 @@ KEYPOINT_INITIAL_OFFSETS: WristL: 0. 0. 0.0 WristR: 0. 0. 0.0 +ROOT_OPTIMIZATION_KEYPOINT: SpineL + TRUNK_OPTIMIZATION_KEYPOINTS: - "Spine" - "Hip" diff --git a/tests/configs/model/test_rodent_less_kp_names.yaml b/tests/configs/model/test_rodent_less_kp_names.yaml index 699d137..6cdf6ac 100644 --- a/tests/configs/model/test_rodent_less_kp_names.yaml +++ b/tests/configs/model/test_rodent_less_kp_names.yaml @@ -59,6 +59,8 @@ KEYPOINT_INITIAL_OFFSETS: WristL: 0. 0. 0.0 WristR: 0. 0. 0.0 +ROOT_OPTIMIZATION_KEYPOINT: SpineL + TRUNK_OPTIMIZATION_KEYPOINTS: - "Spine" - "Hip" diff --git a/tests/configs/model/test_rodent_no_kp_names.yaml b/tests/configs/model/test_rodent_no_kp_names.yaml index 1e64589..bab8a99 100644 --- a/tests/configs/model/test_rodent_no_kp_names.yaml +++ b/tests/configs/model/test_rodent_no_kp_names.yaml @@ -58,6 +58,8 @@ KEYPOINT_INITIAL_OFFSETS: WristL: 0. 0. 0.0 WristR: 0. 0. 0.0 +ROOT_OPTIMIZATION_KEYPOINT: SpineL + TRUNK_OPTIMIZATION_KEYPOINTS: - "Spine" - "Hip" diff --git a/tests/data/test_synth_1_frames.nwb b/tests/data/test_synth_1_frames.nwb new file mode 100644 index 0000000000000000000000000000000000000000..b7a820dd1b5ea628a6b5e1dbd89e582c4168d54d GIT binary patch literal 201672 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 literal 0 HcmV?d00001