diff --git a/.github/workflows/preview.yml b/.github/workflows/preview.yml index 85e02cd2..f134f6e8 100644 --- a/.github/workflows/preview.yml +++ b/.github/workflows/preview.yml @@ -1,16 +1,21 @@ name: Preview -# Run manually (Actions -> Preview -> Run workflow) with a pull request -# number to publish, under `pr-preview/pr-/` on the `gh-pages` branch, a +# Runs automatically for pull requests from branches of this repository +# (opened, pushed to, reopened: deploy; closed: remove), and can be run +# manually (Actions -> Preview -> Run workflow) with a pull request number, +# e.g. for pull requests from forks. It publishes, under `pr-preview/pr-/` on the `gh-pages` branch, a # preview of only the decks (top-level *.html) that pull request adds or # changes, together with just the files they use (reveal.js, css/, pics/...), # with git-annex'ed content fetched from datasets.datalad.org. -# Run it with `remove` to delete that preview again. +# Run it manually with `remove` to delete a preview again. Pull requests +# which change no decks get no preview (and no failing check). # # The pull request's content is built with a read-only token; only the # resulting files are handed to the deploy job, which has write access. on: + pull_request: + types: [opened, synchronize, reopened, closed] workflow_dispatch: inputs: pr: @@ -27,15 +32,44 @@ on: default: deploy concurrency: - group: preview-${{ inputs.pr }} + group: preview-${{ github.event.pull_request.number || inputs.pr }} cancel-in-progress: false env: ANNEX_REMOTE_URL: https://datasets.datalad.org/centerforopenneuroscience/talks/.git jobs: + params: + # Pull requests from forks get a read-only token and cannot deploy + # (run the workflow manually for those). + if: github.event_name == 'workflow_dispatch' || github.event.pull_request.head.repo.full_name == github.repository + runs-on: ubuntu-latest + outputs: + pr: ${{ steps.p.outputs.pr }} + action: ${{ steps.p.outputs.action }} + steps: + - name: Work out pull request and action + id: p + env: + EVENT: ${{ github.event_name }} + EVENT_ACTION: ${{ github.event.action }} + EVENT_PR: ${{ github.event.pull_request.number }} + INPUT_PR: ${{ inputs.pr }} + INPUT_ACTION: ${{ inputs.action }} + run: | + if [[ "$EVENT" == pull_request ]]; then + PR=$EVENT_PR + if [[ "$EVENT_ACTION" == closed ]]; then ACTION=remove; else ACTION=deploy; fi + else + PR=$INPUT_PR + ACTION=$INPUT_ACTION + fi + echo "pr=$PR" >> "$GITHUB_OUTPUT" + echo "action=$ACTION" >> "$GITHUB_OUTPUT" + build-preview: - if: inputs.action == 'deploy' + needs: params + if: needs.params.outputs.action == 'deploy' runs-on: ubuntu-latest permissions: contents: read @@ -48,7 +82,7 @@ jobs: id: pr env: GH_TOKEN: ${{ github.token }} - PR_NUMBER: ${{ inputs.pr }} + PR_NUMBER: ${{ needs.params.outputs.pr }} run: | read -r STATE HEAD_SHA < <(gh api "repos/$GITHUB_REPOSITORY/pulls/$PR_NUMBER" --jq '.state + " " + .head.sha') if [[ "$STATE" != open ]]; then @@ -62,7 +96,7 @@ jobs: with: # the merge of the pull request into its base, so HEAD^1 is the # base; full history for git-annex - ref: refs/pull/${{ inputs.pr }}/merge + ref: refs/pull/${{ needs.params.outputs.pr }}/merge fetch-depth: 0 - name: Find changed decks @@ -72,18 +106,25 @@ jobs: DECKS=$(git diff --name-only --diff-filter=AMR HEAD^1 HEAD -- '*.html' \ | grep -E '^[A-Za-z0-9][A-Za-z0-9._+-]*\.html$' | tr '\n' ' ' || true) if [ -z "$DECKS" ]; then - echo "::error::Pull request #${{ inputs.pr }} changes no decks; nothing to preview." + if [[ "${{ github.event_name }}" == pull_request ]]; then + echo "::notice::Pull request #${{ needs.params.outputs.pr }} changes no decks; no preview." + echo "decks=" >> "$GITHUB_OUTPUT" + exit 0 + fi + echo "::error::Pull request #${{ needs.params.outputs.pr }} changes no decks; nothing to preview." exit 1 fi echo "Decks to preview: $DECKS" echo "decks=$DECKS" >> "$GITHUB_OUTPUT" - name: Get reveal.js + if: steps.decks.outputs.decks != '' # not `submodules: true`: 2022-nih-compcore has a relative URL that # only resolves on datasets.datalad.org run: git submodule update --init --depth 1 reveal.js reveal.js-mermaid-plugin - name: Set up git-annex + if: steps.decks.outputs.decks != '' run: | sudo apt-get update -qq sudo apt-get install -y -qq git-annex @@ -94,6 +135,7 @@ jobs: git annex init --quiet - name: Build site + if: steps.decks.outputs.decks != '' env: DECKS: ${{ steps.decks.outputs.decks }} run: | @@ -115,6 +157,7 @@ jobs: fi - name: Upload site + if: steps.decks.outputs.decks != '' uses: actions/upload-artifact@v7 with: name: preview-site @@ -124,9 +167,9 @@ jobs: retention-days: 1 deploy-preview: - needs: build-preview + needs: [params, build-preview] # also run for `remove`, where the build is skipped - if: ${{ !cancelled() && (inputs.action == 'remove' || needs.build-preview.result == 'success') }} + if: ${{ !cancelled() && (needs.params.outputs.action == 'remove' || (needs.build-preview.result == 'success' && needs.build-preview.outputs.decks != '')) }} runs-on: ubuntu-latest permissions: contents: write @@ -136,7 +179,7 @@ jobs: uses: actions/checkout@v7 - name: Download site - if: inputs.action == 'deploy' + if: needs.params.outputs.action == 'deploy' uses: actions/download-artifact@v8 with: name: preview-site @@ -148,16 +191,16 @@ jobs: with: source-dir: preview-site preview-branch: gh-pages - action: ${{ inputs.action }} - pr-number: ${{ inputs.pr }} - deploy-commit-message: Deploy preview for PR ${{ inputs.pr }} - remove-commit-message: Remove preview for PR ${{ inputs.pr }} + action: ${{ needs.params.outputs.action }} + pr-number: ${{ needs.params.outputs.pr }} + deploy-commit-message: Deploy preview for PR ${{ needs.params.outputs.pr }} + remove-commit-message: Remove preview for PR ${{ needs.params.outputs.pr }} # The action's own comment looks for the pull request in the # triggering event, which `workflow_dispatch` does not carry. comment: false - name: Compose preview comment - if: inputs.action == 'deploy' + if: needs.params.outputs.action == 'deploy' env: PREVIEW_URL: ${{ steps.preview.outputs.preview-url }} HEAD_SHA: ${{ needs.build-preview.outputs.head-sha }} @@ -178,18 +221,18 @@ jobs: } > "$RUNNER_TEMP/comment.md" - name: Comment preview link - if: inputs.action == 'deploy' + if: needs.params.outputs.action == 'deploy' uses: marocchino/sticky-pull-request-comment@v3 with: header: pr-preview - number: ${{ inputs.pr }} + number: ${{ needs.params.outputs.pr }} path: ${{ runner.temp }}/comment.md - name: Comment preview removal - if: inputs.action == 'remove' + if: needs.params.outputs.action == 'remove' uses: marocchino/sticky-pull-request-comment@v3 with: header: pr-preview - number: ${{ inputs.pr }} + number: ${{ needs.params.outputs.pr }} message: | Preview removed. diff --git a/.gitignore b/.gitignore index 9eb2f925..5578c1f6 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ node_modules/ .cache .pki talk-proposal-draft.pdf +.duct diff --git a/202404xx-NSF-POSE-BIDS.odp b/202404xx-NSF-POSE-BIDS.odp new file mode 120000 index 00000000..cf8293e3 --- /dev/null +++ b/202404xx-NSF-POSE-BIDS.odp @@ -0,0 +1 @@ +.git/annex/objects/wg/8g/MD5E-s30051553--3a1d79c45fd22c347dc21ebcaec311f2.odp/MD5E-s30051553--3a1d79c45fd22c347dc21ebcaec311f2.odp \ No newline at end of file diff --git a/202404xx-NSF-POSE-BIDS.pdf b/202404xx-NSF-POSE-BIDS.pdf new file mode 120000 index 00000000..608e85cb --- /dev/null +++ b/202404xx-NSF-POSE-BIDS.pdf @@ -0,0 +1 @@ +.git/annex/objects/jQ/X2/MD5E-s9129001--1c1996a62416a0c6f5c9f65915f9dc6b.pdf/MD5E-s9129001--1c1996a62416a0c6f5c9f65915f9dc6b.pdf \ No newline at end of file diff --git a/2025-sfn-poster-data-standards.jpg b/2025-sfn-poster-data-standards.jpg new file mode 120000 index 00000000..f23f4249 --- /dev/null +++ b/2025-sfn-poster-data-standards.jpg @@ -0,0 +1 @@ +.git/annex/objects/1Z/MW/MD5E-s907820--29e89f617a2a533d404cd4be46ba8d0f.jpg/MD5E-s907820--29e89f617a2a533d404cd4be46ba8d0f.jpg \ No newline at end of file diff --git a/2025-sfn-poster-data-standards.pdf b/2025-sfn-poster-data-standards.pdf new file mode 120000 index 00000000..26ce77c7 --- /dev/null +++ b/2025-sfn-poster-data-standards.pdf @@ -0,0 +1 @@ +.git/annex/objects/Fw/VQ/MD5E-s13199379--0899170119f80f795038e00b4b99938e.pdf/MD5E-s13199379--0899170119f80f795038e00b4b99938e.pdf \ No newline at end of file diff --git a/2026-dhmc-ieeg.html b/2026-dhmc-ieeg.html new file mode 100644 index 00000000..161638a5 --- /dev/null +++ b/2026-dhmc-ieeg.html @@ -0,0 +1,1269 @@ + + + + + + + + + Open Neuroscience Infrastructure for Intracranial EEG + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ +

Open Neuroscience Infrastructure
for Intracranial EEG

+

+ A toolbelt, not one solution — and an invitation to help bridge academia and the clinic +

+ + + + + Dartmouth/DH Human Intracranial Electrophysiology Consortium — October 9th, 2026
+ Live slides/Sources: + https://datasets.datalad.org/centerforopenneuroscience/talks/2026-dhmc-ieeg.html +
+
+ + + + + + + + + +
+
+ +
+ +
+ +
+

Acknowledgements

+ + + + + + + +
+ +
+ +
+ + + +
+
+
+ + +
+
+
+ + + +
+
+
+ + +
+
+
+ + +
+
+
+ + + +
+
+
+ + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + +
+ + +
+ + + + +
+
+ + + + + + + + + diff --git a/2026-dhmc-ieeg/NOTES.md b/2026-dhmc-ieeg/NOTES.md new file mode 100644 index 00000000..fa6ded27 --- /dev/null +++ b/2026-dhmc-ieeg/NOTES.md @@ -0,0 +1,110 @@ +--- +title: CON for iEEG @ DHMC group + +--- + +# CON for iEEG @ DHMC group + +## Prior pointers + +"intracranial electrophysiology meeting" + +> I hope all is well. Our Dartmouth/DH Human Intracranial + Electrophysiology Consortium would like to invite you to give a talk at + one of our monthly meetings. Our next meeting will take place via Zoom + from 1:00 to 2:00 PM on September 11, 2026. + +> Thank you for proposing the various topics and we would love to have Cody talk about NWB. Nonetheless, topics on data standards, data management, and reproducibility would be very helpful to our group. + +> @Krzysztof A. Bujarski, do we have any prior recordings of our past meetings? In terms of the audience, our human intracranial group primarily collects data from epilepsy patients (performing computer-based tasks) undergoing +> intracranial EEG investigation. Some of the PIs involved in this group include Kris Bujarski, Caroline Robertson, Wilder Doucette, Arjen Stolk, Tor Wager, and me. We all use various tools for analysis (python, R, and matlab +> packages) and preprocessing. I anticipate some questions on the best practices (and not too onerous) we can undertake as a group to standardize the outputs of individual analysis steps (preprocessing versus +> experiment-specific analyses) such that someone else who is not involved in the experiment/analysis can examine, understand, and replicate (or not) the results with little effort. + +> Thank you very much for agreeing to present at our group’s meeting. + October 9^th at 1 PM would be perfect if you could make it. As + Richard may have told you, we collect human intracranial EEG data for + research purposes. Right now it is macroelectrodes but soon it will + also be microelectrodes with larger storage and data handling needs. + We would be most interested in hearing about what you do and how you go + about handling data in general. We have not been saving our video + meetings but generally 10-15 people meet over Zoom and discuss a + research project or we have a conversation about a specific topic. + Happy to talk to you if you would like more context. + + + +Target ~40 minutes for talk, leave lots of time for questions/discussion + + +## Points + +- May be start the talk with mission statement of discovering from their questions/feedback on how they do research and where "our" products could help + - clarifications Qs are good, BIG - till Q&A + - Drive or thread with "Reasons" as "Why?" any particular thing should be adopted/used + - "many sizes fit all" -- not 1 solution, but a "toolbelt" and many ways to assemble without "buying in 100%" + - relate to maturity model plot, may be use it as the umbrella to thread under? + +- Focus on high-level concepts: + - BI **Archives** + - Mainly OpenNeuro/NEMAR, talk about your repronim work? mention future of EMBER & BBQS + - reasons AKA why good: "free backup", "open by design" [ref] + - **Standards** as enabler for tooling: + - Oliver's poster to bring them all together + - from single file format into datasets + - BIDS data structure and HED annotations within (and on NEMAR) + - point to AI tools to come up with annotations + - seek their input on how THEY do preprocessing + - NWB + - neurosift demos (will have to mostly be GIFs on DANDI data) + - accent: stream based, no need to download + - open-source + - Cody's plugins on LFP (event related) and spectrograms + - Example 1 (LFP only): https://openneuro.org/datasets/ds008610/versions/1.0.0/file-display/sub-01:ses-ieeg01:ieeg:sub-01_ses-ieeg01_task-FUS_acq-VPL_run-005_ieeg.nwb + - Not finding any others + - **RDM** Data Management (DataLad get, run/rerun, containers) + - **must** have reason(s) stated + - STAMPED principles (which we then keep coming back) + - Brief overview + pointer to BBQS talk + - Relate to FAIR they have likely heard about (Cody's slide/part of poster) + - Self-containment + Modularity: (Meta) BIDS-Study + - point to https://github.com/brain-bbqs/study-template + - demo OpenNeuroStudies and dandi-compute + - STAMPED examples + - Compute + - dandi-compute + - mechababs (enabler for BIDS datasets) and compute on Unity + - Visions for the future: + - mass preprocessed data to be reused with confidence: both of those for "mass compute" to fascilitate future "meta-studies" or "multi-verse" + - knowledge bases: from local (ORINOCOs) to EBRAIN KB, brainkb etc and relation to STAMPED + - + +- Map out the mind-tree of resources across projects + - ReproNim: reproducible practices + - webinar series talks + - reprotube copy with them + - point to ReproNim fellows program + - DANDI: + - NeuroData AI accepting applications + - EMBER [emphasize future, nothing available as of today]: + - Synchronization (they are the experts to share expertiese) + - Pozu: turnkey platform for pose estimation and behavioral annotations with integration into archives + +- Map/remind any particular solution in terms of STAMPED and FAIR + +### Messages + +- "MVC" points to modularity with models for modules/components +- Open Source might allow + - for local use whenever BRAIN archives use centrally + - to collaborate with colleagues who do not have your proprietary solution + - have issue reported & fixed +- "Cool stuff (visualization, turnkey apps) is possible only because of boring stuff (standards)" +- Bring up DICOM (Open Standard) standard as unifying factor for imaging and some physio + - problem: when proprietary fields are used. + - again not "all size fits all" but iterative improvements +- Bring up NWB as the unification of the wild-west in neurophysiology + - neuroconv image for conversions... + - They could become part of the larger DICOM ecosystem + - point to WG-32 requests + diff --git a/2026-dhmc-ieeg/neuroconv-formats-cloud.py b/2026-dhmc-ieeg/neuroconv-formats-cloud.py new file mode 100644 index 00000000..db70da15 --- /dev/null +++ b/2026-dhmc-ieeg/neuroconv-formats-cloud.py @@ -0,0 +1,48 @@ +# Generates pics/neuroconv-formats-cloud.svg (NeuroConv formats, colored by modality). +# Needs only Pillow; run from the repo root: python3 2026-dhmc-ieeg/neuroconv-formats-cloud.py +import math, random +from PIL import ImageFont +FONT='/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf' +W,H=1500,800 +cats={ # name: (color, center, words) + 'Extracellular ephys: recording':('#1f5fa8',(420,330),"AlphaOmega Axona Biocam Blackrock EDF Intan MaxOne MCSRaw MEArec Neuralynx NeuroScope OpenEphys Plexon Spike2 Spikegadgets SpikeGLX TDT WhiteMatter".split()), + 'Extracellular ephys: sorting':('#5b8fd1',(420,330),"Blackrock CellExplorer KiloSort Neuralynx NeuroScope Phy Plexon".split()), + 'Intracellular ephys':('#6a3d9a',(760,120),["ABF"]), + 'Optical: imaging':('#c8501a',(1050,250),"Bruker HDF5 Micro-Manager Miniscope Scanbox ScanImage Tiff Thor Inscopix".split()), + 'Optical: segmentation':('#e8963c',(1050,250),"Caiman CNMFE EXTRACT Suite2P".split()), + 'Natural behavior':('#2a8a4a',(1000,600),"Audio DeepLabCut FicTrac LightningPose SLEAP Videos Facemap Moseq".split()), + 'Behavioral events':('#8a7a1a',(560,650),"CSV Excel MedPC".split()), +} +soon={'Inscopix','Facemap','Moseq'} # greyed out on the NeuroConv listing +pad=8; placed=[]; out=[] +def fits(b): + x0,y0,x1,y1=b + if x0<10 or y0<10 or x1>W-10 or y1>H-85: return False + return all(x1+pad<=a or x0-pad>=c or y1+pad<=b2 or y0-pad>=d for a,b2,c,d in placed) +random.seed(4) +items=[] +for cat,(col,ctr,words) in cats.items(): + for w in words: items.append((cat,col,ctr,w)) +items.sort(key=lambda t:-len(t[3])) +for cat,col,ctr,w in items: + size=44 if len(w)<=5 else 38 if len(w)<=8 else 32 + f=ImageFont.truetype(FONT,size); tw=f.getlength(w); th=size*0.95 + ok=False; t=0 + while not ok and t<4000: + r=2.2*t**0.5*4; a=t*0.55; x=ctr[0]+r*math.cos(a)-tw/2; y=ctr[1]+r*math.sin(a)*0.6-th/2 + b=(x,y,x+tw,y+th); ok=fits(b); t+=1 + assert ok,w + placed.append(b) + op=0.35 if w in soon else 1 + out.append(f'{w}') +legend=[('Extracellular ephys: recording','#1f5fa8'),('spike sorting','#5b8fd1'),('Intracellular ephys','#6a3d9a'), + ('Optical: imaging','#c8501a'),('segmentation','#e8963c'),('Natural behavior','#2a8a4a'),('Behavioral events','#8a7a1a'),('faded: in progress','#bbbbbb')] +legsvg=[]; x=20; y=H-62 +for label,col in legend: + f=ImageFont.truetype(FONT,20); tw=f.getlength(label) + if x+tw+50>W-10: x=20; y+=30 + legsvg.append(f'{label}') + x+=tw+56 +svg=f''+''.join(out)+''.join(legsvg)+'' +open('/home/user/talks/pics/neuroconv-formats-cloud.svg','w').write(svg) +print(len(svg),'bytes',len(out),'words; legend width',x) diff --git a/README.md b/README.md index d2097f4b..46d8dbed 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,9 @@ to get access to the files stored on this remote (I didn't bother adding it as a ## Advice for creating presentations - ``clone`` the repository to your local computer and ``datalad get`` all subdatasets (``datalad get -n -r .``). -- For simple use cases such as viewing presentations it should suffice to open any raw ``.html`` in a browser of your choice. In this scenario, you *may* be able to generate a PDF from your slides by opening the presentation in a recent version of Chrome or Chromium, and append ``?print-pdf`` to the URL. Afterwards, you may be able to print to PDF from your browser. +- For simple use cases such as viewing presentations it should suffice to open any raw ``.html`` in a browser of your choice. In this scenario, you *may* be able to generate a PDF from your slides by opening the presentation in a recent version of Chrome or Chromium, and append ``?print-pdf`` to the URL. Afterwards, you may be able to print to PDF from your browser. + - **Gotcha:** the query string must come *before* the ``#`` fragment. reveal.js tests ``window.location.search``, so ``deck.html?print-pdf`` and ``deck.html?print-pdf#/4`` both work, but ``deck.html#/4?print-pdf`` **silently does nothing** -- the whole ``#/4?print-pdf`` is the hash, and ``search`` stays empty. Since normal navigation leaves a ``#/`` in the URL bar, appending ``?print-pdf`` to what you are looking at is exactly the case that fails. (``?view=print`` works too.) + - In the print dialog set **Margins: None** and **Background graphics: on**, and choose a landscape paper size. Chrome's dialog cannot adopt the deck's own page size, so slides end up letterboxed on A4/Letter with white bands -- fine for sharing, not pixel-perfect. ``tools/mkpdf.py`` below avoids this. - For more use cases and more reliable PDF exports, use [reveal.js's full setup](https://revealjs.com/installation/#full-setup). This requires a working installation of [Node.js](https://nodejs.org/): ```sh @@ -45,6 +47,12 @@ npm start docker run --rm -t --net=host -v `pwd`:/slides astefanutti/decktape http://localhost:8000/ slides.pdf -s 1024x768 ``` - More options, e.g., exports of individual slide screenshots, are in decktape's [documentation](https://github.com/astefanutti/decktape) +- If you have neither Docker nor a running npm server, ``tools/mkpdf.py`` exports any deck in this repo headlessly, straight from the ``.html`` file, needing only [uv](https://docs.astral.sh/uv/): +```sh +uv run --with playwright playwright install chromium # once +uv run --with playwright python tools/mkpdf.py +``` + It writes ``.pdf`` next to the deck (override with ``-o``). Page size is taken from the deck's own reveal ``width``/``height`` config, so 4:3 and 16:9 decks both come out right with no flags. Use ``--wait`` to give mermaid-heavy decks longer to render. **Do not commit the generated PDFs** -- they are derived artifacts; the live HTML is what gets shared. - The tool [directpoll](https://directpoll.com/) works fantastic for virtual talks. See [#34](https://github.com/datalad-handbook/course/issues/34) or the template talk for info on how to use it - We have made good experiences with live code demonstrations. The ``tools/cast_live`` script is used for this. It is highly advised to test whether this script works on your set-up beforehand! diff --git a/con-whoweare.phtml b/con-whoweare.phtml new file mode 100644 index 00000000..d6c2f5c8 --- /dev/null +++ b/con-whoweare.phtml @@ -0,0 +1,73 @@ + + + diff --git a/pics/2026-dhmc-ieeg-neuroconv-formats.svg b/pics/2026-dhmc-ieeg-neuroconv-formats.svg new file mode 120000 index 00000000..cb6cad43 --- /dev/null +++ b/pics/2026-dhmc-ieeg-neuroconv-formats.svg @@ -0,0 +1 @@ +../.git/annex/objects/f3/4M/MD5E-s505294--b55fe835499ad7488db9822e995e3c05.svg/MD5E-s505294--b55fe835499ad7488db9822e995e3c05.svg \ No newline at end of file diff --git a/pics/2026-dhmc-ieeg-nwb-convert-scale.svg b/pics/2026-dhmc-ieeg-nwb-convert-scale.svg new file mode 120000 index 00000000..75c813cc --- /dev/null +++ b/pics/2026-dhmc-ieeg-nwb-convert-scale.svg @@ -0,0 +1 @@ +../.git/annex/objects/WQ/0F/MD5E-s760693--8679c16e756682abdc9caf5ff5ce650a.svg/MD5E-s760693--8679c16e756682abdc9caf5ff5ce650a.svg \ No newline at end of file diff --git a/pics/2026-dhmc-ieeg-nwb-one-for-all.svg b/pics/2026-dhmc-ieeg-nwb-one-for-all.svg new file mode 120000 index 00000000..c408b07c --- /dev/null +++ b/pics/2026-dhmc-ieeg-nwb-one-for-all.svg @@ -0,0 +1 @@ +../.git/annex/objects/FV/gM/MD5E-s1447984--5454f5f5afabdca137a9e0034788ba54.svg/MD5E-s1447984--5454f5f5afabdca137a9e0034788ba54.svg \ No newline at end of file diff --git a/pics/2026-dhmc-ieeg-qrcode.png b/pics/2026-dhmc-ieeg-qrcode.png new file mode 120000 index 00000000..b67dbc9f --- /dev/null +++ b/pics/2026-dhmc-ieeg-qrcode.png @@ -0,0 +1 @@ +../.git/annex/objects/1Q/f4/MD5E-s969--f46f6a205a1cdd524f100df55a03fb04.png/MD5E-s969--f46f6a205a1cdd524f100df55a03fb04.png \ No newline at end of file diff --git a/pics/Makefile b/pics/Makefile index de1630bd..75725417 100644 --- a/pics/Makefile +++ b/pics/Makefile @@ -4,3 +4,14 @@ @inkscape --export-filename "$@" -d 150 "$<" git annex add "$@" git annex metadata --set derived-from="$<" "$@" + +# +# SVGTune +# +%_tuned: %.svgtune %.svg + @echo "Splitting SVG using $<" + @svgtune $< +# Touch it to adjust the timestamp so make does not think that we are +# out of date later on + @touch "$@" + diff --git a/pics/academic-clinician.svg b/pics/academic-clinician.svg new file mode 100644 index 00000000..54c65319 --- /dev/null +++ b/pics/academic-clinician.svg @@ -0,0 +1,16 @@ + + +academic-clinician + + +Academic ecosystem: interoperable by standards + +SOFTWAREFORMATSHARDWARE +AcademicsClinical researchersa thin line of correspondenceArrow = conversion · dashed = light, optional or in-progress · line weight ≈ how much it is used · names are links +NWB AppsNeurosiftArchivesDANDI,OpenNeuroBIDS AppsfMRIPrepPACSreceive,exportEphys rigsNeuropixels,Intan, …ResearchEEGBrainVision,BioSemi +PACS, viewersintegrated,EHRVendor appsone per vendorVendor tools… or noneDICOM.EEG.erd.TRC…MRI scannersused by both sidesClinicalEEGNihon Kohden,NatusiEEG,EMGMicromed, … +NWBBIDS + +DICOM WG-32 +BIDS BEP032 + diff --git a/pics/academic-clinician.svgtune b/pics/academic-clinician.svgtune new file mode 100644 index 00000000..44facd7a --- /dev/null +++ b/pics/academic-clinician.svgtune @@ -0,0 +1,28 @@ +# svgtune instructions for the build steps of slide 'academic-clinician' +# (generated by slides2svgtune: step names come from element ids 'name--...') +%file academic-clinician.svg + +layers style=display:none +layer label:re=^base$ style=display:inline +%save base + +layer label:re=^layers$ style=display:inline +%save layers + +layer label:re=^clinical$ style=display:inline +%save clinical + +layer label:re=^wg32$ style=display:inline +%save wg32 + +layer label:re=^standards$ style=display:inline +%save standards + +layer label:re=^academic$ style=display:inline +%save academic + +layer label:re=^bep032$ style=display:inline +%save bep032 + +layer label:re=^ecosystem$ style=display:inline +%save ecosystem diff --git a/pics/academic-clinician_tuned/academic.svg b/pics/academic-clinician_tuned/academic.svg new file mode 100644 index 00000000..00554427 --- /dev/null +++ b/pics/academic-clinician_tuned/academic.svg @@ -0,0 +1,16 @@ + + +academic-clinician + + + + +SOFTWAREFORMATSHARDWARE +AcademicsClinical researchersa thin line of correspondenceArrow = conversion · dashed = light, optional or in-progress · line weight ≈ how much it is used · names are links +NWB AppsNeurosiftArchivesDANDI,OpenNeuroBIDS AppsfMRIPrepPACSreceive,exportEphys rigsNeuropixels,Intan, …ResearchEEGBrainVision,BioSemi +PACS, viewersintegrated,EHRVendor appsone per vendorVendor tools… or noneDICOM.EEG.erd.TRC…MRI scannersused by both sidesClinicalEEGNihon Kohden,NatusiEEG,EMGMicromed, … +NWBBIDS + +DICOM WG-32 + + \ No newline at end of file diff --git a/pics/academic-clinician_tuned/base.svg b/pics/academic-clinician_tuned/base.svg new file mode 100644 index 00000000..abd82245 --- /dev/null +++ b/pics/academic-clinician_tuned/base.svg @@ -0,0 +1,16 @@ + + +academic-clinician + + + + + +AcademicsClinical researchersa thin line of correspondenceArrow = conversion · dashed = light, optional or in-progress · line weight ≈ how much it is used · names are links + + + + + + + \ No newline at end of file diff --git a/pics/academic-clinician_tuned/bep032.svg b/pics/academic-clinician_tuned/bep032.svg new file mode 100644 index 00000000..da38b291 --- /dev/null +++ b/pics/academic-clinician_tuned/bep032.svg @@ -0,0 +1,16 @@ + + +academic-clinician + + + + +SOFTWAREFORMATSHARDWARE +AcademicsClinical researchersa thin line of correspondenceArrow = conversion · dashed = light, optional or in-progress · line weight ≈ how much it is used · names are links +NWB AppsNeurosiftArchivesDANDI,OpenNeuroBIDS AppsfMRIPrepPACSreceive,exportEphys rigsNeuropixels,Intan, …ResearchEEGBrainVision,BioSemi +PACS, viewersintegrated,EHRVendor appsone per vendorVendor tools… or noneDICOM.EEG.erd.TRC…MRI scannersused by both sidesClinicalEEGNihon Kohden,NatusiEEG,EMGMicromed, … +NWBBIDS + +DICOM WG-32 +BIDS BEP032 + \ No newline at end of file diff --git a/pics/academic-clinician_tuned/clinical.svg b/pics/academic-clinician_tuned/clinical.svg new file mode 100644 index 00000000..ec9597aa --- /dev/null +++ b/pics/academic-clinician_tuned/clinical.svg @@ -0,0 +1,16 @@ + + +academic-clinician + + + + +SOFTWAREFORMATSHARDWARE +AcademicsClinical researchersa thin line of correspondenceArrow = conversion · dashed = light, optional or in-progress · line weight ≈ how much it is used · names are links + +PACS, viewersintegrated,EHRVendor appsone per vendorVendor tools… or noneDICOM.EEG.erd.TRC…MRI scannersused by both sidesClinicalEEGNihon Kohden,NatusiEEG,EMGMicromed, … + + + + + \ No newline at end of file diff --git a/pics/academic-clinician_tuned/ecosystem.svg b/pics/academic-clinician_tuned/ecosystem.svg new file mode 100644 index 00000000..46037152 --- /dev/null +++ b/pics/academic-clinician_tuned/ecosystem.svg @@ -0,0 +1,16 @@ + + +academic-clinician + + +Academic ecosystem: interoperable by standards + +SOFTWAREFORMATSHARDWARE +AcademicsClinical researchersa thin line of correspondenceArrow = conversion · dashed = light, optional or in-progress · line weight ≈ how much it is used · names are links +NWB AppsNeurosiftArchivesDANDI,OpenNeuroBIDS AppsfMRIPrepPACSreceive,exportEphys rigsNeuropixels,Intan, …ResearchEEGBrainVision,BioSemi +PACS, viewersintegrated,EHRVendor appsone per vendorVendor tools… or noneDICOM.EEG.erd.TRC…MRI scannersused by both sidesClinicalEEGNihon Kohden,NatusiEEG,EMGMicromed, … +NWBBIDS + +DICOM WG-32 +BIDS BEP032 + \ No newline at end of file diff --git a/pics/academic-clinician_tuned/layers.svg b/pics/academic-clinician_tuned/layers.svg new file mode 100644 index 00000000..379a1de7 --- /dev/null +++ b/pics/academic-clinician_tuned/layers.svg @@ -0,0 +1,16 @@ + + +academic-clinician + + + + +SOFTWAREFORMATSHARDWARE +AcademicsClinical researchersa thin line of correspondenceArrow = conversion · dashed = light, optional or in-progress · line weight ≈ how much it is used · names are links + + + + + + + \ No newline at end of file diff --git a/pics/academic-clinician_tuned/standards.svg b/pics/academic-clinician_tuned/standards.svg new file mode 100644 index 00000000..1faae5ef --- /dev/null +++ b/pics/academic-clinician_tuned/standards.svg @@ -0,0 +1,16 @@ + + +academic-clinician + + + + +SOFTWAREFORMATSHARDWARE +AcademicsClinical researchersa thin line of correspondenceArrow = conversion · dashed = light, optional or in-progress · line weight ≈ how much it is used · names are links + +PACS, viewersintegrated,EHRVendor appsone per vendorVendor tools… or noneDICOM.EEG.erd.TRC…MRI scannersused by both sidesClinicalEEGNihon Kohden,NatusiEEG,EMGMicromed, … +NWBBIDS + +DICOM WG-32 + + \ No newline at end of file diff --git a/pics/academic-clinician_tuned/wg32.svg b/pics/academic-clinician_tuned/wg32.svg new file mode 100644 index 00000000..9fe9453f --- /dev/null +++ b/pics/academic-clinician_tuned/wg32.svg @@ -0,0 +1,16 @@ + + +academic-clinician + + + + +SOFTWAREFORMATSHARDWARE +AcademicsClinical researchersa thin line of correspondenceArrow = conversion · dashed = light, optional or in-progress · line weight ≈ how much it is used · names are links + +PACS, viewersintegrated,EHRVendor appsone per vendorVendor tools… or noneDICOM.EEG.erd.TRC…MRI scannersused by both sidesClinicalEEGNihon Kohden,NatusiEEG,EMGMicromed, … + + +DICOM WG-32 + + \ No newline at end of file diff --git a/pics/academic-participants.svg b/pics/academic-participants.svg new file mode 100644 index 00000000..1981bca1 --- /dev/null +++ b/pics/academic-participants.svg @@ -0,0 +1,31 @@ + + +academic-participants + +sync ·LSLQR codes + +Data management across theacademic ecosystemgit ·git-annex ·DataLad ·GitHub ·Forgejo-aneksajo · … +SOFTWAREFORMATSHARDWAREPACSreceive,exportDICOMEphys rigsNeuropixels,Intan, …ClinicaliEEGNatus,NihonKohdenResearchEEGBrainVision,BioSemiMRI scannershared with clinicsArrow = conversion · dashed = light, optional or future · BEP = BIDS Extension Proposal · names are links +NWB AppsNeurosift +ArchivesDANDI,OpenNeuro,NEMAR +Pozupose, behavior→ archive +dandi-computepipelines onarchived data +BIDS AppsfMRIPrep +Computedatalad-container,BABS,mechababs +NWBNeuroConv + +BIDS ·BEP032 ·all BEPs +BIDS ·BEP032 ·BEP044 ·BEP047 ·all BEPsMKVStimuli &responsesMagewell,CurDes Birch +HED +Participants · every recording above starts with a person · their consent (Open Brain Consent) is the gate to every archive + + +iEEG-BIDSEEG-BIDS + +sourcedata/derivatives/ +nwb2bids +HeuDiConv + +linkedReproStim +STAMPED principles + diff --git a/pics/academic-participants.svgtune b/pics/academic-participants.svgtune new file mode 100644 index 00000000..6cf00fdc --- /dev/null +++ b/pics/academic-participants.svgtune @@ -0,0 +1,58 @@ +# svgtune instructions for the build steps of slide 'academic-participants' +# (generated by slides2svgtune: step names come from element ids 'name--...') +%file academic-participants.svg + +layers style=display:none +layer label:re=^base$ style=display:inline +%save base + +layer label:re=^participants$ style=display:inline +%save participants + +layer label:re=^nwb$ style=display:inline +%save nwb + +layer label:re=^nwb\-apps$ style=display:inline +%save nwb-apps + +layer label:re=^archives$ style=display:inline +%save archives + +layer label:re=^bids$ style=display:inline +layer label:re=^bids\~av$ style=display:inline +%save bids + +layer label:re=^heudiconv$ style=display:inline +%save heudiconv + +layer label:re=^nwb2bids$ style=display:inline +%save nwb2bids + +layer label:re=^dandi\-compute$ style=display:inline +%save dandi-compute + +layer label:re=^bids\~av$ style=display:none +layer label:re=^av$ style=display:inline +%save av + +layer label:re=^pozu$ style=display:inline +%save pozu + +layer label:re=^hed$ style=display:inline +%save hed + +layer label:re=^sync$ style=display:inline +%save sync + +layer label:re=^sync$ style=display:none +layer label:re=^bids\-apps$ style=display:inline +%save bids-apps + +layer label:re=^compute$ style=display:inline +%save compute + +layer label:re=^data\-management$ style=display:inline +%save data-management + +layer label:re=^stamped$ style=display:inline +%save stamped diff --git a/pics/academic-participants_tuned/archives.svg b/pics/academic-participants_tuned/archives.svg new file mode 100644 index 00000000..13621cab --- /dev/null +++ b/pics/academic-participants_tuned/archives.svg @@ -0,0 +1,31 @@ + + +academic-participants + + + + +SOFTWAREFORMATSHARDWAREPACSreceive,exportDICOMEphys rigsNeuropixels,Intan, …ClinicaliEEGNatus,NihonKohdenResearchEEGBrainVision,BioSemiMRI scannershared with clinicsArrow = conversion · dashed = light, optional or future · BEP = BIDS Extension Proposal · names are links +NWB AppsNeurosift +ArchivesDANDI,OpenNeuro,NEMAR + + + + +NWBNeuroConv + + + + +Participants · every recording above starts with a person · their consent (Open Brain Consent) is the gate to every archive + + + + + + + + + + + \ No newline at end of file diff --git a/pics/academic-participants_tuned/av.svg b/pics/academic-participants_tuned/av.svg new file mode 100644 index 00000000..fba48d38 --- /dev/null +++ b/pics/academic-participants_tuned/av.svg @@ -0,0 +1,31 @@ + + +academic-participants + + + + +SOFTWAREFORMATSHARDWAREPACSreceive,exportDICOMEphys rigsNeuropixels,Intan, …ClinicaliEEGNatus,NihonKohdenResearchEEGBrainVision,BioSemiMRI scannershared with clinicsArrow = conversion · dashed = light, optional or future · BEP = BIDS Extension Proposal · names are links +NWB AppsNeurosift +ArchivesDANDI,OpenNeuro,NEMAR + +dandi-computepipelines onarchived data + + +NWBNeuroConv + + +BIDS ·BEP032 ·BEP044 ·BEP047 ·all BEPsMKVStimuli &responsesMagewell,CurDes Birch + +Participants · every recording above starts with a person · their consent (Open Brain Consent) is the gate to every archive + + +iEEG-BIDSEEG-BIDS + + +nwb2bids +HeuDiConv + +linkedReproStim + + \ No newline at end of file diff --git a/pics/academic-participants_tuned/base.svg b/pics/academic-participants_tuned/base.svg new file mode 100644 index 00000000..9117def3 --- /dev/null +++ b/pics/academic-participants_tuned/base.svg @@ -0,0 +1,31 @@ + + +academic-participants + + + + +SOFTWAREFORMATSHARDWAREPACSreceive,exportDICOMEphys rigsNeuropixels,Intan, …ClinicaliEEGNatus,NihonKohdenResearchEEGBrainVision,BioSemiMRI scannershared with clinicsArrow = conversion · dashed = light, optional or future · BEP = BIDS Extension Proposal · names are links + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pics/academic-participants_tuned/bids-apps.svg b/pics/academic-participants_tuned/bids-apps.svg new file mode 100644 index 00000000..88786dd4 --- /dev/null +++ b/pics/academic-participants_tuned/bids-apps.svg @@ -0,0 +1,31 @@ + + +academic-participants + + + + +SOFTWAREFORMATSHARDWAREPACSreceive,exportDICOMEphys rigsNeuropixels,Intan, …ClinicaliEEGNatus,NihonKohdenResearchEEGBrainVision,BioSemiMRI scannershared with clinicsArrow = conversion · dashed = light, optional or future · BEP = BIDS Extension Proposal · names are links +NWB AppsNeurosift +ArchivesDANDI,OpenNeuro,NEMAR +Pozupose, behavior→ archive +dandi-computepipelines onarchived data +BIDS AppsfMRIPrep + +NWBNeuroConv + + +BIDS ·BEP032 ·BEP044 ·BEP047 ·all BEPsMKVStimuli &responsesMagewell,CurDes Birch +HED +Participants · every recording above starts with a person · their consent (Open Brain Consent) is the gate to every archive + + +iEEG-BIDSEEG-BIDS + + +nwb2bids +HeuDiConv + +linkedReproStim + + \ No newline at end of file diff --git a/pics/academic-participants_tuned/bids.svg b/pics/academic-participants_tuned/bids.svg new file mode 100644 index 00000000..8ba3ac26 --- /dev/null +++ b/pics/academic-participants_tuned/bids.svg @@ -0,0 +1,31 @@ + + +academic-participants + + + + +SOFTWAREFORMATSHARDWAREPACSreceive,exportDICOMEphys rigsNeuropixels,Intan, …ClinicaliEEGNatus,NihonKohdenResearchEEGBrainVision,BioSemiMRI scannershared with clinicsArrow = conversion · dashed = light, optional or future · BEP = BIDS Extension Proposal · names are links +NWB AppsNeurosift +ArchivesDANDI,OpenNeuro,NEMAR + + + + +NWBNeuroConv + +BIDS ·BEP032 ·all BEPs + + +Participants · every recording above starts with a person · their consent (Open Brain Consent) is the gate to every archive + + +iEEG-BIDSEEG-BIDS + + + + + + + + \ No newline at end of file diff --git a/pics/academic-participants_tuned/compute.svg b/pics/academic-participants_tuned/compute.svg new file mode 100644 index 00000000..398b782c --- /dev/null +++ b/pics/academic-participants_tuned/compute.svg @@ -0,0 +1,31 @@ + + +academic-participants + + + + +SOFTWAREFORMATSHARDWAREPACSreceive,exportDICOMEphys rigsNeuropixels,Intan, …ClinicaliEEGNatus,NihonKohdenResearchEEGBrainVision,BioSemiMRI scannershared with clinicsArrow = conversion · dashed = light, optional or future · BEP = BIDS Extension Proposal · names are links +NWB AppsNeurosift +ArchivesDANDI,OpenNeuro,NEMAR +Pozupose, behavior→ archive +dandi-computepipelines onarchived data +BIDS AppsfMRIPrep +Computedatalad-container,BABS,mechababs +NWBNeuroConv + + +BIDS ·BEP032 ·BEP044 ·BEP047 ·all BEPsMKVStimuli &responsesMagewell,CurDes Birch +HED +Participants · every recording above starts with a person · their consent (Open Brain Consent) is the gate to every archive + + +iEEG-BIDSEEG-BIDS + +sourcedata/derivatives/ +nwb2bids +HeuDiConv + +linkedReproStim + + \ No newline at end of file diff --git a/pics/academic-participants_tuned/dandi-compute.svg b/pics/academic-participants_tuned/dandi-compute.svg new file mode 100644 index 00000000..ab853a4f --- /dev/null +++ b/pics/academic-participants_tuned/dandi-compute.svg @@ -0,0 +1,31 @@ + + +academic-participants + + + + +SOFTWAREFORMATSHARDWAREPACSreceive,exportDICOMEphys rigsNeuropixels,Intan, …ClinicaliEEGNatus,NihonKohdenResearchEEGBrainVision,BioSemiMRI scannershared with clinicsArrow = conversion · dashed = light, optional or future · BEP = BIDS Extension Proposal · names are links +NWB AppsNeurosift +ArchivesDANDI,OpenNeuro,NEMAR + +dandi-computepipelines onarchived data + + +NWBNeuroConv + +BIDS ·BEP032 ·all BEPs + + +Participants · every recording above starts with a person · their consent (Open Brain Consent) is the gate to every archive + + +iEEG-BIDSEEG-BIDS + + +nwb2bids +HeuDiConv + + + + \ No newline at end of file diff --git a/pics/academic-participants_tuned/data-management.svg b/pics/academic-participants_tuned/data-management.svg new file mode 100644 index 00000000..81cd1be7 --- /dev/null +++ b/pics/academic-participants_tuned/data-management.svg @@ -0,0 +1,31 @@ + + +academic-participants + + + +Data management across theacademic ecosystemgit ·git-annex ·DataLad ·GitHub ·Forgejo-aneksajo · … +SOFTWAREFORMATSHARDWAREPACSreceive,exportDICOMEphys rigsNeuropixels,Intan, …ClinicaliEEGNatus,NihonKohdenResearchEEGBrainVision,BioSemiMRI scannershared with clinicsArrow = conversion · dashed = light, optional or future · BEP = BIDS Extension Proposal · names are links +NWB AppsNeurosift +ArchivesDANDI,OpenNeuro,NEMAR +Pozupose, behavior→ archive +dandi-computepipelines onarchived data +BIDS AppsfMRIPrep +Computedatalad-container,BABS,mechababs +NWBNeuroConv + + +BIDS ·BEP032 ·BEP044 ·BEP047 ·all BEPsMKVStimuli &responsesMagewell,CurDes Birch +HED +Participants · every recording above starts with a person · their consent (Open Brain Consent) is the gate to every archive + + +iEEG-BIDSEEG-BIDS + +sourcedata/derivatives/ +nwb2bids +HeuDiConv + +linkedReproStim + + \ No newline at end of file diff --git a/pics/academic-participants_tuned/hed.svg b/pics/academic-participants_tuned/hed.svg new file mode 100644 index 00000000..85bfe048 --- /dev/null +++ b/pics/academic-participants_tuned/hed.svg @@ -0,0 +1,31 @@ + + +academic-participants + + + + +SOFTWAREFORMATSHARDWAREPACSreceive,exportDICOMEphys rigsNeuropixels,Intan, …ClinicaliEEGNatus,NihonKohdenResearchEEGBrainVision,BioSemiMRI scannershared with clinicsArrow = conversion · dashed = light, optional or future · BEP = BIDS Extension Proposal · names are links +NWB AppsNeurosift +ArchivesDANDI,OpenNeuro,NEMAR +Pozupose, behavior→ archive +dandi-computepipelines onarchived data + + +NWBNeuroConv + + +BIDS ·BEP032 ·BEP044 ·BEP047 ·all BEPsMKVStimuli &responsesMagewell,CurDes Birch +HED +Participants · every recording above starts with a person · their consent (Open Brain Consent) is the gate to every archive + + +iEEG-BIDSEEG-BIDS + + +nwb2bids +HeuDiConv + +linkedReproStim + + \ No newline at end of file diff --git a/pics/academic-participants_tuned/heudiconv.svg b/pics/academic-participants_tuned/heudiconv.svg new file mode 100644 index 00000000..852238c9 --- /dev/null +++ b/pics/academic-participants_tuned/heudiconv.svg @@ -0,0 +1,31 @@ + + +academic-participants + + + + +SOFTWAREFORMATSHARDWAREPACSreceive,exportDICOMEphys rigsNeuropixels,Intan, …ClinicaliEEGNatus,NihonKohdenResearchEEGBrainVision,BioSemiMRI scannershared with clinicsArrow = conversion · dashed = light, optional or future · BEP = BIDS Extension Proposal · names are links +NWB AppsNeurosift +ArchivesDANDI,OpenNeuro,NEMAR + + + + +NWBNeuroConv + +BIDS ·BEP032 ·all BEPs + + +Participants · every recording above starts with a person · their consent (Open Brain Consent) is the gate to every archive + + +iEEG-BIDSEEG-BIDS + + + +HeuDiConv + + + + \ No newline at end of file diff --git a/pics/academic-participants_tuned/nwb-apps.svg b/pics/academic-participants_tuned/nwb-apps.svg new file mode 100644 index 00000000..c7f54c88 --- /dev/null +++ b/pics/academic-participants_tuned/nwb-apps.svg @@ -0,0 +1,31 @@ + + +academic-participants + + + + +SOFTWAREFORMATSHARDWAREPACSreceive,exportDICOMEphys rigsNeuropixels,Intan, …ClinicaliEEGNatus,NihonKohdenResearchEEGBrainVision,BioSemiMRI scannershared with clinicsArrow = conversion · dashed = light, optional or future · BEP = BIDS Extension Proposal · names are links +NWB AppsNeurosift + + + + + +NWBNeuroConv + + + + +Participants · every recording above starts with a person · their consent (Open Brain Consent) is the gate to every archive + + + + + + + + + + + \ No newline at end of file diff --git a/pics/academic-participants_tuned/nwb.svg b/pics/academic-participants_tuned/nwb.svg new file mode 100644 index 00000000..1bb8221f --- /dev/null +++ b/pics/academic-participants_tuned/nwb.svg @@ -0,0 +1,31 @@ + + +academic-participants + + + + +SOFTWAREFORMATSHARDWAREPACSreceive,exportDICOMEphys rigsNeuropixels,Intan, …ClinicaliEEGNatus,NihonKohdenResearchEEGBrainVision,BioSemiMRI scannershared with clinicsArrow = conversion · dashed = light, optional or future · BEP = BIDS Extension Proposal · names are links + + + + + + +NWBNeuroConv + + + + +Participants · every recording above starts with a person · their consent (Open Brain Consent) is the gate to every archive + + + + + + + + + + + \ No newline at end of file diff --git a/pics/academic-participants_tuned/nwb2bids.svg b/pics/academic-participants_tuned/nwb2bids.svg new file mode 100644 index 00000000..cf0887c5 --- /dev/null +++ b/pics/academic-participants_tuned/nwb2bids.svg @@ -0,0 +1,31 @@ + + +academic-participants + + + + +SOFTWAREFORMATSHARDWAREPACSreceive,exportDICOMEphys rigsNeuropixels,Intan, …ClinicaliEEGNatus,NihonKohdenResearchEEGBrainVision,BioSemiMRI scannershared with clinicsArrow = conversion · dashed = light, optional or future · BEP = BIDS Extension Proposal · names are links +NWB AppsNeurosift +ArchivesDANDI,OpenNeuro,NEMAR + + + + +NWBNeuroConv + +BIDS ·BEP032 ·all BEPs + + +Participants · every recording above starts with a person · their consent (Open Brain Consent) is the gate to every archive + + +iEEG-BIDSEEG-BIDS + + +nwb2bids +HeuDiConv + + + + \ No newline at end of file diff --git a/pics/academic-participants_tuned/participants.svg b/pics/academic-participants_tuned/participants.svg new file mode 100644 index 00000000..387071ad --- /dev/null +++ b/pics/academic-participants_tuned/participants.svg @@ -0,0 +1,31 @@ + + +academic-participants + + + + +SOFTWAREFORMATSHARDWAREPACSreceive,exportDICOMEphys rigsNeuropixels,Intan, …ClinicaliEEGNatus,NihonKohdenResearchEEGBrainVision,BioSemiMRI scannershared with clinicsArrow = conversion · dashed = light, optional or future · BEP = BIDS Extension Proposal · names are links + + + + + + + + + + + +Participants · every recording above starts with a person · their consent (Open Brain Consent) is the gate to every archive + + + + + + + + + + + \ No newline at end of file diff --git a/pics/academic-participants_tuned/pozu.svg b/pics/academic-participants_tuned/pozu.svg new file mode 100644 index 00000000..5dbbd116 --- /dev/null +++ b/pics/academic-participants_tuned/pozu.svg @@ -0,0 +1,31 @@ + + +academic-participants + + + + +SOFTWAREFORMATSHARDWAREPACSreceive,exportDICOMEphys rigsNeuropixels,Intan, …ClinicaliEEGNatus,NihonKohdenResearchEEGBrainVision,BioSemiMRI scannershared with clinicsArrow = conversion · dashed = light, optional or future · BEP = BIDS Extension Proposal · names are links +NWB AppsNeurosift +ArchivesDANDI,OpenNeuro,NEMAR +Pozupose, behavior→ archive +dandi-computepipelines onarchived data + + +NWBNeuroConv + + +BIDS ·BEP032 ·BEP044 ·BEP047 ·all BEPsMKVStimuli &responsesMagewell,CurDes Birch + +Participants · every recording above starts with a person · their consent (Open Brain Consent) is the gate to every archive + + +iEEG-BIDSEEG-BIDS + + +nwb2bids +HeuDiConv + +linkedReproStim + + \ No newline at end of file diff --git a/pics/academic-participants_tuned/stamped.svg b/pics/academic-participants_tuned/stamped.svg new file mode 100644 index 00000000..c293df7d --- /dev/null +++ b/pics/academic-participants_tuned/stamped.svg @@ -0,0 +1,31 @@ + + +academic-participants + + + +Data management across theacademic ecosystemgit ·git-annex ·DataLad ·GitHub ·Forgejo-aneksajo · … +SOFTWAREFORMATSHARDWAREPACSreceive,exportDICOMEphys rigsNeuropixels,Intan, …ClinicaliEEGNatus,NihonKohdenResearchEEGBrainVision,BioSemiMRI scannershared with clinicsArrow = conversion · dashed = light, optional or future · BEP = BIDS Extension Proposal · names are links +NWB AppsNeurosift +ArchivesDANDI,OpenNeuro,NEMAR +Pozupose, behavior→ archive +dandi-computepipelines onarchived data +BIDS AppsfMRIPrep +Computedatalad-container,BABS,mechababs +NWBNeuroConv + + +BIDS ·BEP032 ·BEP044 ·BEP047 ·all BEPsMKVStimuli &responsesMagewell,CurDes Birch +HED +Participants · every recording above starts with a person · their consent (Open Brain Consent) is the gate to every archive + + +iEEG-BIDSEEG-BIDS + +sourcedata/derivatives/ +nwb2bids +HeuDiConv + +linkedReproStim +STAMPED principles + \ No newline at end of file diff --git a/pics/academic-participants_tuned/sync.svg b/pics/academic-participants_tuned/sync.svg new file mode 100644 index 00000000..400a1672 --- /dev/null +++ b/pics/academic-participants_tuned/sync.svg @@ -0,0 +1,31 @@ + + +academic-participants + +sync ·LSLQR codes + + +SOFTWAREFORMATSHARDWAREPACSreceive,exportDICOMEphys rigsNeuropixels,Intan, …ClinicaliEEGNatus,NihonKohdenResearchEEGBrainVision,BioSemiMRI scannershared with clinicsArrow = conversion · dashed = light, optional or future · BEP = BIDS Extension Proposal · names are links +NWB AppsNeurosift +ArchivesDANDI,OpenNeuro,NEMAR +Pozupose, behavior→ archive +dandi-computepipelines onarchived data + + +NWBNeuroConv + + +BIDS ·BEP032 ·BEP044 ·BEP047 ·all BEPsMKVStimuli &responsesMagewell,CurDes Birch +HED +Participants · every recording above starts with a person · their consent (Open Brain Consent) is the gate to every archive + + +iEEG-BIDSEEG-BIDS + + +nwb2bids +HeuDiConv + +linkedReproStim + + \ No newline at end of file diff --git a/pics/borrowed/2025-sfn-poster-data-standards--archives.png b/pics/borrowed/2025-sfn-poster-data-standards--archives.png new file mode 120000 index 00000000..352bfa05 --- /dev/null +++ b/pics/borrowed/2025-sfn-poster-data-standards--archives.png @@ -0,0 +1 @@ +../../.git/annex/objects/63/1w/MD5E-s140997--1dfba006c787c3766bc5220fbf83f830.png/MD5E-s140997--1dfba006c787c3766bc5220fbf83f830.png \ No newline at end of file diff --git a/pics/borrowed/2025-sfn-poster-data-standards_preview.jpg b/pics/borrowed/2025-sfn-poster-data-standards_preview.jpg new file mode 120000 index 00000000..a9818426 --- /dev/null +++ b/pics/borrowed/2025-sfn-poster-data-standards_preview.jpg @@ -0,0 +1 @@ +../../.git/annex/objects/jp/MK/MD5E-s969039--b3ae7606c2d34a28cc02951aa591c0fe.jpg/MD5E-s969039--b3ae7606c2d34a28cc02951aa591c0fe.jpg \ No newline at end of file diff --git a/pics/borrowed/bids-bep032-preview-20261008.png b/pics/borrowed/bids-bep032-preview-20261008.png new file mode 120000 index 00000000..bb81d02b --- /dev/null +++ b/pics/borrowed/bids-bep032-preview-20261008.png @@ -0,0 +1 @@ +../../.git/annex/objects/Wg/k2/MD5E-s619911--9c0567dafcb7a5202d9472857361e21f.png/MD5E-s619911--9c0567dafcb7a5202d9472857361e21f.png \ No newline at end of file diff --git a/pics/borrowed/bids-dandisets-000003-20261008.png b/pics/borrowed/bids-dandisets-000003-20261008.png new file mode 120000 index 00000000..28029aea --- /dev/null +++ b/pics/borrowed/bids-dandisets-000003-20261008.png @@ -0,0 +1 @@ +../../.git/annex/objects/wW/j1/MD5E-s407241--1e23d5f1effa21a1d48b05cd202cd1d7.png/MD5E-s407241--1e23d5f1effa21a1d48b05cd202cd1d7.png \ No newline at end of file diff --git a/pics/borrowed/bids-dandisets-dashboard-20261008.png b/pics/borrowed/bids-dandisets-dashboard-20261008.png new file mode 120000 index 00000000..100fce9b --- /dev/null +++ b/pics/borrowed/bids-dandisets-dashboard-20261008.png @@ -0,0 +1 @@ +../../.git/annex/objects/QK/ww/MD5E-s250270--b46b11d180e8f43becb1b8bb29d7f472.png/MD5E-s250270--b46b11d180e8f43becb1b8bb29d7f472.png \ No newline at end of file diff --git a/pics/borrowed/bids-ieeg-20261008.png b/pics/borrowed/bids-ieeg-20261008.png new file mode 120000 index 00000000..4bd33ef6 --- /dev/null +++ b/pics/borrowed/bids-ieeg-20261008.png @@ -0,0 +1 @@ +../../.git/annex/objects/qz/GX/MD5E-s696553--0189d95dc1ff7194795d52f3ae56361d.png/MD5E-s696553--0189d95dc1ff7194795d52f3ae56361d.png \ No newline at end of file diff --git a/pics/borrowed/bids-ieeg-formats-20261008.png b/pics/borrowed/bids-ieeg-formats-20261008.png new file mode 120000 index 00000000..4becdb74 --- /dev/null +++ b/pics/borrowed/bids-ieeg-formats-20261008.png @@ -0,0 +1 @@ +../../.git/annex/objects/M3/Q2/MD5E-s772783--ac299136e4df3a7a49038628acab899c.png/MD5E-s772783--ac299136e4df3a7a49038628acab899c.png \ No newline at end of file diff --git a/pics/borrowed/brainkb-webshot-20261006.png b/pics/borrowed/brainkb-webshot-20261006.png new file mode 120000 index 00000000..8f7e03f8 --- /dev/null +++ b/pics/borrowed/brainkb-webshot-20261006.png @@ -0,0 +1 @@ +../../.git/annex/objects/GJ/79/MD5E-s174649--018af38eef904def7cd5d1f68eeaaf2e.png/MD5E-s174649--018af38eef904def7cd5d1f68eeaaf2e.png \ No newline at end of file diff --git a/pics/borrowed/dandiarchive-stats-webshote-20261008.png b/pics/borrowed/dandiarchive-stats-webshote-20261008.png new file mode 120000 index 00000000..eab3d97a --- /dev/null +++ b/pics/borrowed/dandiarchive-stats-webshote-20261008.png @@ -0,0 +1 @@ +../../.git/annex/objects/0f/Xx/MD5E-s148863--8d9f6c616fe99eaef8a54211fe7aa551.png/MD5E-s148863--8d9f6c616fe99eaef8a54211fe7aa551.png \ No newline at end of file diff --git a/pics/borrowed/dandiarchive-webshote-20261008.png b/pics/borrowed/dandiarchive-webshote-20261008.png new file mode 120000 index 00000000..60be008f --- /dev/null +++ b/pics/borrowed/dandiarchive-webshote-20261008.png @@ -0,0 +1 @@ +../../.git/annex/objects/gG/9X/MD5E-s294689--9542d55c15446a63709f2ebc9b5cb7a5.png/MD5E-s294689--9542d55c15446a63709f2ebc9b5cb7a5.png \ No newline at end of file diff --git a/pics/borrowed/dbic-QA-audiovideo-20261008.png b/pics/borrowed/dbic-QA-audiovideo-20261008.png new file mode 120000 index 00000000..1f091931 --- /dev/null +++ b/pics/borrowed/dbic-QA-audiovideo-20261008.png @@ -0,0 +1 @@ +../../.git/annex/objects/xV/0g/MD5E-s354055--7f4bff14a7b5ffc6e5c4b12f7931d5e5.png/MD5E-s354055--7f4bff14a7b5ffc6e5c4b12f7931d5e5.png \ No newline at end of file diff --git a/pics/borrowed/dicom-wg32-compression-rfc-20261008.png b/pics/borrowed/dicom-wg32-compression-rfc-20261008.png new file mode 120000 index 00000000..b0c9b69c --- /dev/null +++ b/pics/borrowed/dicom-wg32-compression-rfc-20261008.png @@ -0,0 +1 @@ +../../.git/annex/objects/2v/zx/MD5E-s357652--3fd51f16ac530ac3b93a69b36d58712e.png/MD5E-s357652--3fd51f16ac530ac3b93a69b36d58712e.png \ No newline at end of file diff --git a/pics/borrowed/ebrains-kg-webshot-20261006.png b/pics/borrowed/ebrains-kg-webshot-20261006.png new file mode 120000 index 00000000..fe1e76fd --- /dev/null +++ b/pics/borrowed/ebrains-kg-webshot-20261006.png @@ -0,0 +1 @@ +../../.git/annex/objects/Vg/k0/MD5E-s124066--e68c6fec137e54b162ad4936fec76bcb.png/MD5E-s124066--e68c6fec137e54b162ad4936fec76bcb.png \ No newline at end of file diff --git a/pics/borrowed/ember-archive-webshot-20261005.png b/pics/borrowed/ember-archive-webshot-20261005.png new file mode 120000 index 00000000..3e198965 --- /dev/null +++ b/pics/borrowed/ember-archive-webshot-20261005.png @@ -0,0 +1 @@ +../../.git/annex/objects/Kz/Zj/MD5E-s86726--7bf4a1648e389b73ece7b89cc02538d1.png/MD5E-s86726--7bf4a1648e389b73ece7b89cc02538d1.png \ No newline at end of file diff --git a/pics/borrowed/human+carrot.png b/pics/borrowed/human+carrot.png new file mode 120000 index 00000000..49b99981 --- /dev/null +++ b/pics/borrowed/human+carrot.png @@ -0,0 +1 @@ +../../.git/annex/objects/q8/jz/MD5E-s59022--2c5b2fa9eafe978a2789153c08e8fd1a.png/MD5E-s59022--2c5b2fa9eafe978a2789153c08e8fd1a.png \ No newline at end of file diff --git a/pics/borrowed/human+carrot_black.png b/pics/borrowed/human+carrot_black.png new file mode 120000 index 00000000..d9a181d0 --- /dev/null +++ b/pics/borrowed/human+carrot_black.png @@ -0,0 +1 @@ +../../.git/annex/objects/3q/7F/MD5E-s40867--82f5bf6470d482f48eb851d54a3996f8.png/MD5E-s40867--82f5bf6470d482f48eb851d54a3996f8.png \ No newline at end of file diff --git a/pics/borrowed/nemar-webshote-20261008.png b/pics/borrowed/nemar-webshote-20261008.png new file mode 120000 index 00000000..91485aea --- /dev/null +++ b/pics/borrowed/nemar-webshote-20261008.png @@ -0,0 +1 @@ +../../.git/annex/objects/Wk/Zq/MD5E-s2007009--fc930455f6f4cf7cc7f2b78ce7e3e87a.png/MD5E-s2007009--fc930455f6f4cf7cc7f2b78ce7e3e87a.png \ No newline at end of file diff --git a/pics/borrowed/neuro-sciops-fig.svg b/pics/borrowed/neuro-sciops-fig.svg new file mode 120000 index 00000000..7cd06360 --- /dev/null +++ b/pics/borrowed/neuro-sciops-fig.svg @@ -0,0 +1 @@ +../../.git/annex/objects/Q1/Mg/MD5E-s403001--bbdd0047190b7b7b5f3c7c744df729e5.svg/MD5E-s403001--bbdd0047190b7b7b5f3c7c744df729e5.svg \ No newline at end of file diff --git a/pics/borrowed/neuro-sciops.pdf b/pics/borrowed/neuro-sciops.pdf new file mode 120000 index 00000000..e9865461 --- /dev/null +++ b/pics/borrowed/neuro-sciops.pdf @@ -0,0 +1 @@ +../../.git/annex/objects/zF/Wg/MD5E-s154841--585dfce386f842891e334e476e25ca1b.pdf/MD5E-s154841--585dfce386f842891e334e476e25ca1b.pdf \ No newline at end of file diff --git a/pics/borrowed/notebooklm-stamped-glassbox-20261008-p3.png b/pics/borrowed/notebooklm-stamped-glassbox-20261008-p3.png new file mode 120000 index 00000000..58890ac5 --- /dev/null +++ b/pics/borrowed/notebooklm-stamped-glassbox-20261008-p3.png @@ -0,0 +1 @@ +../../.git/annex/objects/Xz/qF/MD5E-s1319551--88f79fc8886866c8dbce9fab5b78eff9.png/MD5E-s1319551--88f79fc8886866c8dbce9fab5b78eff9.png \ No newline at end of file diff --git a/pics/borrowed/notebooklm-stamped-glassbox-20261008.pdf b/pics/borrowed/notebooklm-stamped-glassbox-20261008.pdf new file mode 120000 index 00000000..16ef4fae --- /dev/null +++ b/pics/borrowed/notebooklm-stamped-glassbox-20261008.pdf @@ -0,0 +1 @@ +../../.git/annex/objects/j3/7z/MD5E-s12986397--7e38cc06fd58f461e2ae1253fe14aac6.pdf/MD5E-s12986397--7e38cc06fd58f461e2ae1253fe14aac6.pdf \ No newline at end of file diff --git a/pics/borrowed/openneuro-ieeg-webshote-20261008.png b/pics/borrowed/openneuro-ieeg-webshote-20261008.png new file mode 120000 index 00000000..f5bf2e5c --- /dev/null +++ b/pics/borrowed/openneuro-ieeg-webshote-20261008.png @@ -0,0 +1 @@ +../../.git/annex/objects/FZ/6f/MD5E-s1643792--0d3a6a721b82e5b59248a67cbc684c8d.png/MD5E-s1643792--0d3a6a721b82e5b59248a67cbc684c8d.png \ No newline at end of file diff --git a/pics/borrowed/reproflow.svg b/pics/borrowed/reproflow.svg new file mode 120000 index 00000000..2e34b508 --- /dev/null +++ b/pics/borrowed/reproflow.svg @@ -0,0 +1 @@ +../../.git/annex/objects/KZ/MQ/MD5E-s3433105--c355809da74e8b2888d8c9190fd17069.svg/MD5E-s3433105--c355809da74e8b2888d8c9190fd17069.svg \ No newline at end of file diff --git a/pics/borrowed/stamped-banner_ver-3.svg b/pics/borrowed/stamped-banner_ver-3.svg new file mode 120000 index 00000000..2982b761 --- /dev/null +++ b/pics/borrowed/stamped-banner_ver-3.svg @@ -0,0 +1 @@ +../../.git/annex/objects/2X/Pv/MD5E-s4193666--c78d882185e6a9c76f2f4017b964db85.svg/MD5E-s4193666--c78d882185e6a9c76f2f4017b964db85.svg \ No newline at end of file diff --git a/pics/con-whoweare/adina.jpg b/pics/con-whoweare/adina.jpg new file mode 120000 index 00000000..cb63899c --- /dev/null +++ b/pics/con-whoweare/adina.jpg @@ -0,0 +1 @@ +../../.git/annex/objects/W3/Qp/MD5E-s9383--99a193fa5173758936227f460f292c57.jpg/MD5E-s9383--99a193fa5173758936227f460f292c57.jpg \ No newline at end of file diff --git a/pics/con-whoweare/asmacdo.jpg b/pics/con-whoweare/asmacdo.jpg new file mode 120000 index 00000000..38154fbc --- /dev/null +++ b/pics/con-whoweare/asmacdo.jpg @@ -0,0 +1 @@ +../../.git/annex/objects/4v/FX/MD5E-s51842--43b00607a61fd0701f1d2289ed72dd27.jpg/MD5E-s51842--43b00607a61fd0701f1d2289ed72dd27.jpg \ No newline at end of file diff --git a/pics/con-whoweare/ben.jpg b/pics/con-whoweare/ben.jpg new file mode 120000 index 00000000..b8287b7f --- /dev/null +++ b/pics/con-whoweare/ben.jpg @@ -0,0 +1 @@ +../../.git/annex/objects/VF/P6/MD5E-s17003--f871f89a8508acb2724403626565de40.jpg/MD5E-s17003--f871f89a8508acb2724403626565de40.jpg \ No newline at end of file diff --git a/pics/con-whoweare/chang.jpg b/pics/con-whoweare/chang.jpg new file mode 120000 index 00000000..9686a150 --- /dev/null +++ b/pics/con-whoweare/chang.jpg @@ -0,0 +1 @@ +../../.git/annex/objects/kW/8q/MD5E-s26320--22d3e1284038d233bfc4a2f3df493d55.jpg/MD5E-s26320--22d3e1284038d233bfc4a2f3df493d55.jpg \ No newline at end of file diff --git a/pics/con-whoweare/chr.jpg b/pics/con-whoweare/chr.jpg new file mode 120000 index 00000000..d813b65d --- /dev/null +++ b/pics/con-whoweare/chr.jpg @@ -0,0 +1 @@ +../../.git/annex/objects/wk/qx/MD5E-s54606--dc847556144262b4cec625f598c71875.jpg/MD5E-s54606--dc847556144262b4cec625f598c71875.jpg \ No newline at end of file diff --git a/pics/con-whoweare/chris.jpg b/pics/con-whoweare/chris.jpg new file mode 120000 index 00000000..91ea2013 --- /dev/null +++ b/pics/con-whoweare/chris.jpg @@ -0,0 +1 @@ +../../.git/annex/objects/pF/Fm/MD5E-s11011--ac9299c4de358ca671ffe520e67cd783.jpg/MD5E-s11011--ac9299c4de358ca671ffe520e67cd783.jpg \ No newline at end of file diff --git a/pics/con-whoweare/cody.jpg b/pics/con-whoweare/cody.jpg new file mode 120000 index 00000000..059ae1ba --- /dev/null +++ b/pics/con-whoweare/cody.jpg @@ -0,0 +1 @@ +../../.git/annex/objects/VF/MG/MD5E-s7347--17d502d5b4a82975820cfdfb1b9da64a.jpg/MD5E-s7347--17d502d5b4a82975820cfdfb1b9da64a.jpg \ No newline at end of file diff --git a/pics/con-whoweare/franco.jpg b/pics/con-whoweare/franco.jpg new file mode 120000 index 00000000..5f9bbbaa --- /dev/null +++ b/pics/con-whoweare/franco.jpg @@ -0,0 +1 @@ +../../.git/annex/objects/Zq/56/MD5E-s70135--c0a4168637a372be62486370459d966f.jpg/MD5E-s70135--c0a4168637a372be62486370459d966f.jpg \ No newline at end of file diff --git a/pics/con-whoweare/gergana.jpg b/pics/con-whoweare/gergana.jpg new file mode 120000 index 00000000..6e89e4db --- /dev/null +++ b/pics/con-whoweare/gergana.jpg @@ -0,0 +1 @@ +../../.git/annex/objects/0z/FJ/MD5E-s8615--b5f854ff25b64a48f1c96e2e73224c82.jpg/MD5E-s8615--b5f854ff25b64a48f1c96e2e73224c82.jpg \ No newline at end of file diff --git a/pics/con-whoweare/ito.jpg b/pics/con-whoweare/ito.jpg new file mode 120000 index 00000000..9460e4a1 --- /dev/null +++ b/pics/con-whoweare/ito.jpg @@ -0,0 +1 @@ +../../.git/annex/objects/Wp/30/MD5E-s25196--810ef69d09e0fa097e2c0daa45a603d4.jpg/MD5E-s25196--810ef69d09e0fa097e2c0daa45a603d4.jpg \ No newline at end of file diff --git a/pics/con-whoweare/jason.jpg b/pics/con-whoweare/jason.jpg new file mode 120000 index 00000000..411267e2 --- /dev/null +++ b/pics/con-whoweare/jason.jpg @@ -0,0 +1 @@ +../../.git/annex/objects/f3/jv/MD5E-s13331--46563a279503c58c597a2582dae8a901.jpg/MD5E-s13331--46563a279503c58c597a2582dae8a901.jpg \ No newline at end of file diff --git a/pics/con-whoweare/jb.png b/pics/con-whoweare/jb.png new file mode 120000 index 00000000..37b36774 --- /dev/null +++ b/pics/con-whoweare/jb.png @@ -0,0 +1 @@ +../../.git/annex/objects/9j/Xv/MD5E-s88193--0b34903f516875d61b7776c52c3fb6b7.png/MD5E-s88193--0b34903f516875d61b7776c52c3fb6b7.png \ No newline at end of file diff --git a/pics/con-whoweare/jeremy.jpg b/pics/con-whoweare/jeremy.jpg new file mode 120000 index 00000000..6bf560d5 --- /dev/null +++ b/pics/con-whoweare/jeremy.jpg @@ -0,0 +1 @@ +../../.git/annex/objects/QZ/Xx/MD5E-s60895--1dd2505736ba4d3c4bd8629f57723596.jpg/MD5E-s60895--1dd2505736ba4d3c4bd8629f57723596.jpg \ No newline at end of file diff --git a/pics/con-whoweare/jim.jpg b/pics/con-whoweare/jim.jpg new file mode 120000 index 00000000..35dd05f0 --- /dev/null +++ b/pics/con-whoweare/jim.jpg @@ -0,0 +1 @@ +../../.git/annex/objects/qF/kf/MD5E-s37030--5d7ff0adb32cd2ba851e9c6ca09ebce7.jpg/MD5E-s37030--5d7ff0adb32cd2ba851e9c6ca09ebce7.jpg \ No newline at end of file diff --git a/pics/con-whoweare/joey.jpg b/pics/con-whoweare/joey.jpg new file mode 120000 index 00000000..df7eda63 --- /dev/null +++ b/pics/con-whoweare/joey.jpg @@ -0,0 +1 @@ +../../.git/annex/objects/7j/GP/MD5E-s12530--8cb6241bbcfe50a3d33567fea21fd812.jpg/MD5E-s12530--8cb6241bbcfe50a3d33567fea21fd812.jpg \ No newline at end of file diff --git a/pics/con-whoweare/johnlee.jpg b/pics/con-whoweare/johnlee.jpg new file mode 120000 index 00000000..f07e6c44 --- /dev/null +++ b/pics/con-whoweare/johnlee.jpg @@ -0,0 +1 @@ +../../.git/annex/objects/4m/wg/MD5E-s47517--e2e8fe455948544aa70a56a6b7881f3c.jpg/MD5E-s47517--e2e8fe455948544aa70a56a6b7881f3c.jpg \ No newline at end of file diff --git a/pics/con-whoweare/jwodder.jpg b/pics/con-whoweare/jwodder.jpg new file mode 120000 index 00000000..8e646e92 --- /dev/null +++ b/pics/con-whoweare/jwodder.jpg @@ -0,0 +1 @@ +../../.git/annex/objects/p1/v1/MD5E-s7969--a1140bd50fbcf36c733d9ddd83730627.jpg/MD5E-s7969--a1140bd50fbcf36c733d9ddd83730627.jpg \ No newline at end of file diff --git a/pics/con-whoweare/kennedy.jpg b/pics/con-whoweare/kennedy.jpg new file mode 120000 index 00000000..0ff221d0 --- /dev/null +++ b/pics/con-whoweare/kennedy.jpg @@ -0,0 +1 @@ +../../.git/annex/objects/f1/Pf/MD5E-s12594--f641ce739562bca9994d4fb7febf6d50.jpg/MD5E-s12594--f641ce739562bca9994d4fb7febf6d50.jpg \ No newline at end of file diff --git a/pics/con-whoweare/kyle.jpg b/pics/con-whoweare/kyle.jpg new file mode 120000 index 00000000..5ebdae7e --- /dev/null +++ b/pics/con-whoweare/kyle.jpg @@ -0,0 +1 @@ +../../.git/annex/objects/kw/wm/MD5E-s9594--cff7df4b1c0277f63d1141f1d16831fc.jpg/MD5E-s9594--cff7df4b1c0277f63d1141f1d16831fc.jpg \ No newline at end of file diff --git a/pics/con-whoweare/markiewicz.jpg b/pics/con-whoweare/markiewicz.jpg new file mode 120000 index 00000000..6a783258 --- /dev/null +++ b/pics/con-whoweare/markiewicz.jpg @@ -0,0 +1 @@ +../../.git/annex/objects/Q8/02/MD5E-s42248--bcc9f1dfdc56ec4ae56f01d919675ace.jpg/MD5E-s42248--bcc9f1dfdc56ec4ae56f01d919675ace.jpg \ No newline at end of file diff --git a/pics/con-whoweare/matteo.jpg b/pics/con-whoweare/matteo.jpg new file mode 120000 index 00000000..ca334083 --- /dev/null +++ b/pics/con-whoweare/matteo.jpg @@ -0,0 +1 @@ +../../.git/annex/objects/m3/9P/MD5E-s7739--4b97529c7113016f49a01a5455b201e0.jpg/MD5E-s7739--4b97529c7113016f49a01a5455b201e0.jpg \ No newline at end of file diff --git a/pics/con-whoweare/matthew.jpg b/pics/con-whoweare/matthew.jpg new file mode 120000 index 00000000..c183834f --- /dev/null +++ b/pics/con-whoweare/matthew.jpg @@ -0,0 +1 @@ +../../.git/annex/objects/5p/xG/MD5E-s14556--e1972374f7793c04a2f2f4c1b3337fd3.jpg/MD5E-s14556--e1972374f7793c04a2f2f4c1b3337fd3.jpg \ No newline at end of file diff --git a/pics/con-whoweare/michael.jpg b/pics/con-whoweare/michael.jpg new file mode 120000 index 00000000..b593639e --- /dev/null +++ b/pics/con-whoweare/michael.jpg @@ -0,0 +1 @@ +../../.git/annex/objects/W0/Zf/MD5E-s6682--f0b8e270ce246a1d661a6fc09e512981.jpg/MD5E-s6682--f0b8e270ce246a1d661a6fc09e512981.jpg \ No newline at end of file diff --git a/pics/con-whoweare/mvdm.jpg b/pics/con-whoweare/mvdm.jpg new file mode 120000 index 00000000..0f678e4f --- /dev/null +++ b/pics/con-whoweare/mvdm.jpg @@ -0,0 +1 @@ +../../.git/annex/objects/kg/wW/MD5E-s11989--bf2c7f14b99475da2c737330b6d4cbb4.jpg/MD5E-s11989--bf2c7f14b99475da2c737330b6d4cbb4.jpg \ No newline at end of file diff --git a/pics/con-whoweare/nick.jpg b/pics/con-whoweare/nick.jpg new file mode 120000 index 00000000..0389dad6 --- /dev/null +++ b/pics/con-whoweare/nick.jpg @@ -0,0 +1 @@ +../../.git/annex/objects/qv/6j/MD5E-s10384--60a69c9604f0225a27ad880587154b7a.jpg/MD5E-s10384--60a69c9604f0225a27ad880587154b7a.jpg \ No newline at end of file diff --git a/pics/con-whoweare/oli.jpg b/pics/con-whoweare/oli.jpg new file mode 120000 index 00000000..6fae1ff5 --- /dev/null +++ b/pics/con-whoweare/oli.jpg @@ -0,0 +1 @@ +../../.git/annex/objects/jX/XJ/MD5E-s16154--0a9af2046ce5909d789b63033216d5a3.jpg/MD5E-s16154--0a9af2046ce5909d789b63033216d5a3.jpg \ No newline at end of file diff --git a/pics/con-whoweare/sam.jpg b/pics/con-whoweare/sam.jpg new file mode 120000 index 00000000..d7f1c0ce --- /dev/null +++ b/pics/con-whoweare/sam.jpg @@ -0,0 +1 @@ +../../.git/annex/objects/60/W0/MD5E-s29184--89367cbcaaf786b7ab34809fc8016f10.jpg/MD5E-s29184--89367cbcaaf786b7ab34809fc8016f10.jpg \ No newline at end of file diff --git a/pics/con-whoweare/satra.jpg b/pics/con-whoweare/satra.jpg new file mode 120000 index 00000000..674cea4b --- /dev/null +++ b/pics/con-whoweare/satra.jpg @@ -0,0 +1 @@ +../../.git/annex/objects/Q0/wv/MD5E-s13129--4764a2664af43e256c7ce6dbfc8e5fe6.jpg/MD5E-s13129--4764a2664af43e256c7ce6dbfc8e5fe6.jpg \ No newline at end of file diff --git a/pics/con-whoweare/soichi.jpg b/pics/con-whoweare/soichi.jpg new file mode 120000 index 00000000..e7664c5a --- /dev/null +++ b/pics/con-whoweare/soichi.jpg @@ -0,0 +1 @@ +../../.git/annex/objects/6x/fW/MD5E-s6262--8598fedd0af070fc997fc293ec67a163.jpg/MD5E-s6262--8598fedd0af070fc997fc293ec67a163.jpg \ No newline at end of file diff --git a/pics/con-whoweare/tor.jpg b/pics/con-whoweare/tor.jpg new file mode 120000 index 00000000..7c3b092c --- /dev/null +++ b/pics/con-whoweare/tor.jpg @@ -0,0 +1 @@ +../../.git/annex/objects/xV/mQ/MD5E-s31398--394604688af6788721d969430fa3162b.jpg/MD5E-s31398--394604688af6788721d969430fa3162b.jpg \ No newline at end of file diff --git a/pics/con-whoweare/vadim.jpg b/pics/con-whoweare/vadim.jpg new file mode 120000 index 00000000..c69b5c1b --- /dev/null +++ b/pics/con-whoweare/vadim.jpg @@ -0,0 +1 @@ +../../.git/annex/objects/8v/P1/MD5E-s9008--9a5ff34ba5143292397fe9385125c6b8.jpg/MD5E-s9008--9a5ff34ba5143292397fe9385125c6b8.jpg \ No newline at end of file diff --git a/pics/con-whoweare/vanessa.png b/pics/con-whoweare/vanessa.png new file mode 120000 index 00000000..c3b9c1d1 --- /dev/null +++ b/pics/con-whoweare/vanessa.png @@ -0,0 +1 @@ +../../.git/annex/objects/4g/1K/MD5E-s3823--c901a434f9ba75f4ef2b2354016de679.png/MD5E-s3823--c901a434f9ba75f4ef2b2354016de679.png \ No newline at end of file diff --git a/pics/con-whoweare/yarik.jpg b/pics/con-whoweare/yarik.jpg new file mode 120000 index 00000000..66e3d393 --- /dev/null +++ b/pics/con-whoweare/yarik.jpg @@ -0,0 +1 @@ +../../.git/annex/objects/vF/69/MD5E-s30443--1632f111d947ff229d3ba53baf7b0e1f.jpg/MD5E-s30443--1632f111d947ff229d3ba53baf7b0e1f.jpg \ No newline at end of file diff --git a/pics/dandi-compute-figure.svg b/pics/dandi-compute-figure.svg new file mode 100644 index 00000000..231a2fca --- /dev/null +++ b/pics/dandi-compute-figure.svg @@ -0,0 +1,248 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Reproducible spike sorting on archived data +DANDI Compute takes an asset already in the archive, runs it through an established spike-sorting pipeline +on institutional compute, and returns the results as a new, versioned derivative Dandiset. +dandi-compute/code +aind-ephys-pipeline +dandisets/001697 +1 +INPUT +DANDI Archive +Hundreds of TB of raw extracellular +electrophysiology available to the public. +Neuropixels sessions +NWB assets +2 +ORCHESTRATION +DANDI Compute +Decides what job to run on selected assets, using +which parameters and other configurations. +Prepare +Queue +Submit +3 +COMPUTATION +Spike-sorting pipeline +The containerized AIND Ephys pipeline runs on +HPC at MIT. +Nextflow +SpikeInterface +4 +OUTPUT +Dandiset 001697 +Sorted units, metrics and QC figures are saved +under a self-describing path. +Derivative +Versioned +2 +Inside DANDI Compute +Four responsibilities, each deliberately small. The infrastructure never touches the science — it decides what to run, and makes sure the record of that decision survives. +1 +Prepare +Point at an asset. Pick a named set of pipeline +parameters and a compute profile, and write +out everything needed to run it. +Named parameter sets +Compute profiles +2 +Queue +Prepared jobs pile up on disk, one self- +contained bundle per asset. Nothing has run +yet, so anything can still be pruned or rebuilt. +One bundle per asset +Inspect before you spend +3 +Submit +The bundle is handed to an institutional cluster, +where the pipeline claims a different slice of +hardware for each of its steps. +MIT Engaging HPC +Per-step resources +4 +Publish +Results, logs and the exact code are packaged +as a versioned derivative and pushed back out +where anyone can fetch them. +Version-controlled +DANDI + GitHub +Because the parameter set and the compute profile are both named, referenced things rather than typed-in flags, two runs that claim to be the same run really are (and two runs that differ say so in their identity). +3 +Inside the spike-sorting pipeline +A dispatch step fans the session out into one independent job per probe, shank and segment; the heavy work happens in parallel; the results are gathered back together at the end. +STEP 1 +Job dispatch +Splits work into jobs. +STEPS 2–6 · RUN IN PARALLEL +one job per probe · shank · segment +2 +Preprocess +Filter and correct drift. +3 +GPU +Spike sort +Detect and assign spikes. +4 +Postprocess +Waveforms and metrics. +5 +Curate +Label units by quality. +6 +Visualize +QC plots and views. +STEP 7 +Collect results +STEP 8 +Package as NWB +Parallelizing steps 2–6 makes the run affordable: only the sorting step needs a GPU, and only for one probe. Pipeline after +. +Buccino et al., 2026 +4 +Inside Dandiset 001697 +The output is a path you can read. Every level of the directory answers one question about where a result came from — nothing about the run is implicit, and nothing has to be looked up elsewhere. +001697/ +the derivative meta-Dandiset +└ +derivatives/ +└ +dandiset-<source>/ +WHICH DATA +└ +sub-<subject>/ +└ +ses-<session>/ +└ +pipeline-<id>/ +WHICH PIPELINE +└ +version-<id>/ +└ +params-<hash>_config-<hash>_attempt-<n>/ +WHICH RUN — SETTINGS, MACHINE, ATTEMPT +Re-run with different parameters and you get a sibling directory, not an overwrite — the old result stays where it was. +Inside every run directory +code/ +The exact code that produced this, not just a reference to it. +logs/ +What the run actually did, step by step. +output/ +Sorted units, waveforms and quality metrics. +visualizations/ +QC figures, viewable straight from the browser. +dataset_ +description +Machine-readable provenance for the whole run. +Each run directory stands on its own — enough to check the result and reproduce it. + The derivative sits alongside the data it came from, so the result and its inputs stay connected. +Published back to the archive. +Data in the archive +DANDI Compute infrastructure +Pipeline it relies on +The derivative it produces + + diff --git a/pics/dandi-compute-figure.svgtune b/pics/dandi-compute-figure.svgtune new file mode 100644 index 00000000..d550acab --- /dev/null +++ b/pics/dandi-compute-figure.svgtune @@ -0,0 +1,18 @@ +# svgtune instructions extracting the panels of the DANDI Compute poster +# (pics/dandi-compute-figure.svg, 1680x2421) for the zoom-in slides. +# The poster has no layers, so panels are cut out by page box (user units). +%file dandi-compute-figure.svg + +# overview row + "Inside DANDI Compute" +%crop box=40,20,1600,1000 +%save orchestration + +%reset +# "Inside the spike-sorting pipeline" +%crop box=40,1058,1600,474 +%save pipeline + +%reset +# "Inside Dandiset 001697" + "Published back to the archive" +%crop box=40,1565,1600,745 +%save derivative diff --git a/pics/dandi-compute-figure_tuned/derivative.svg b/pics/dandi-compute-figure_tuned/derivative.svg new file mode 100644 index 00000000..a37c18a4 --- /dev/null +++ b/pics/dandi-compute-figure_tuned/derivative.svg @@ -0,0 +1,248 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Reproducible spike sorting on archived data +DANDI Compute takes an asset already in the archive, runs it through an established spike-sorting pipeline +on institutional compute, and returns the results as a new, versioned derivative Dandiset. +dandi-compute/code +aind-ephys-pipeline +dandisets/001697 +1 +INPUT +DANDI Archive +Hundreds of TB of raw extracellular +electrophysiology available to the public. +Neuropixels sessions +NWB assets +2 +ORCHESTRATION +DANDI Compute +Decides what job to run on selected assets, using +which parameters and other configurations. +Prepare +Queue +Submit +3 +COMPUTATION +Spike-sorting pipeline +The containerized AIND Ephys pipeline runs on +HPC at MIT. +Nextflow +SpikeInterface +4 +OUTPUT +Dandiset 001697 +Sorted units, metrics and QC figures are saved +under a self-describing path. +Derivative +Versioned +2 +Inside DANDI Compute +Four responsibilities, each deliberately small. The infrastructure never touches the science — it decides what to run, and makes sure the record of that decision survives. +1 +Prepare +Point at an asset. Pick a named set of pipeline +parameters and a compute profile, and write +out everything needed to run it. +Named parameter sets +Compute profiles +2 +Queue +Prepared jobs pile up on disk, one self- +contained bundle per asset. Nothing has run +yet, so anything can still be pruned or rebuilt. +One bundle per asset +Inspect before you spend +3 +Submit +The bundle is handed to an institutional cluster, +where the pipeline claims a different slice of +hardware for each of its steps. +MIT Engaging HPC +Per-step resources +4 +Publish +Results, logs and the exact code are packaged +as a versioned derivative and pushed back out +where anyone can fetch them. +Version-controlled +DANDI + GitHub +Because the parameter set and the compute profile are both named, referenced things rather than typed-in flags, two runs that claim to be the same run really are (and two runs that differ say so in their identity). +3 +Inside the spike-sorting pipeline +A dispatch step fans the session out into one independent job per probe, shank and segment; the heavy work happens in parallel; the results are gathered back together at the end. +STEP 1 +Job dispatch +Splits work into jobs. +STEPS 2–6 · RUN IN PARALLEL +one job per probe · shank · segment +2 +Preprocess +Filter and correct drift. +3 +GPU +Spike sort +Detect and assign spikes. +4 +Postprocess +Waveforms and metrics. +5 +Curate +Label units by quality. +6 +Visualize +QC plots and views. +STEP 7 +Collect results +STEP 8 +Package as NWB +Parallelizing steps 2–6 makes the run affordable: only the sorting step needs a GPU, and only for one probe. Pipeline after +. +Buccino et al., 2026 +4 +Inside Dandiset 001697 +The output is a path you can read. Every level of the directory answers one question about where a result came from — nothing about the run is implicit, and nothing has to be looked up elsewhere. +001697/ +the derivative meta-Dandiset +└ +derivatives/ +└ +dandiset-<source>/ +WHICH DATA +└ +sub-<subject>/ +└ +ses-<session>/ +└ +pipeline-<id>/ +WHICH PIPELINE +└ +version-<id>/ +└ +params-<hash>_config-<hash>_attempt-<n>/ +WHICH RUN — SETTINGS, MACHINE, ATTEMPT +Re-run with different parameters and you get a sibling directory, not an overwrite — the old result stays where it was. +Inside every run directory +code/ +The exact code that produced this, not just a reference to it. +logs/ +What the run actually did, step by step. +output/ +Sorted units, waveforms and quality metrics. +visualizations/ +QC figures, viewable straight from the browser. +dataset_ +description +Machine-readable provenance for the whole run. +Each run directory stands on its own — enough to check the result and reproduce it. + The derivative sits alongside the data it came from, so the result and its inputs stay connected. +Published back to the archive. +Data in the archive +DANDI Compute infrastructure +Pipeline it relies on +The derivative it produces + + \ No newline at end of file diff --git a/pics/dandi-compute-figure_tuned/orchestration.svg b/pics/dandi-compute-figure_tuned/orchestration.svg new file mode 100644 index 00000000..aafd80fe --- /dev/null +++ b/pics/dandi-compute-figure_tuned/orchestration.svg @@ -0,0 +1,248 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Reproducible spike sorting on archived data +DANDI Compute takes an asset already in the archive, runs it through an established spike-sorting pipeline +on institutional compute, and returns the results as a new, versioned derivative Dandiset. +dandi-compute/code +aind-ephys-pipeline +dandisets/001697 +1 +INPUT +DANDI Archive +Hundreds of TB of raw extracellular +electrophysiology available to the public. +Neuropixels sessions +NWB assets +2 +ORCHESTRATION +DANDI Compute +Decides what job to run on selected assets, using +which parameters and other configurations. +Prepare +Queue +Submit +3 +COMPUTATION +Spike-sorting pipeline +The containerized AIND Ephys pipeline runs on +HPC at MIT. +Nextflow +SpikeInterface +4 +OUTPUT +Dandiset 001697 +Sorted units, metrics and QC figures are saved +under a self-describing path. +Derivative +Versioned +2 +Inside DANDI Compute +Four responsibilities, each deliberately small. The infrastructure never touches the science — it decides what to run, and makes sure the record of that decision survives. +1 +Prepare +Point at an asset. Pick a named set of pipeline +parameters and a compute profile, and write +out everything needed to run it. +Named parameter sets +Compute profiles +2 +Queue +Prepared jobs pile up on disk, one self- +contained bundle per asset. Nothing has run +yet, so anything can still be pruned or rebuilt. +One bundle per asset +Inspect before you spend +3 +Submit +The bundle is handed to an institutional cluster, +where the pipeline claims a different slice of +hardware for each of its steps. +MIT Engaging HPC +Per-step resources +4 +Publish +Results, logs and the exact code are packaged +as a versioned derivative and pushed back out +where anyone can fetch them. +Version-controlled +DANDI + GitHub +Because the parameter set and the compute profile are both named, referenced things rather than typed-in flags, two runs that claim to be the same run really are (and two runs that differ say so in their identity). +3 +Inside the spike-sorting pipeline +A dispatch step fans the session out into one independent job per probe, shank and segment; the heavy work happens in parallel; the results are gathered back together at the end. +STEP 1 +Job dispatch +Splits work into jobs. +STEPS 2–6 · RUN IN PARALLEL +one job per probe · shank · segment +2 +Preprocess +Filter and correct drift. +3 +GPU +Spike sort +Detect and assign spikes. +4 +Postprocess +Waveforms and metrics. +5 +Curate +Label units by quality. +6 +Visualize +QC plots and views. +STEP 7 +Collect results +STEP 8 +Package as NWB +Parallelizing steps 2–6 makes the run affordable: only the sorting step needs a GPU, and only for one probe. Pipeline after +. +Buccino et al., 2026 +4 +Inside Dandiset 001697 +The output is a path you can read. Every level of the directory answers one question about where a result came from — nothing about the run is implicit, and nothing has to be looked up elsewhere. +001697/ +the derivative meta-Dandiset +└ +derivatives/ +└ +dandiset-<source>/ +WHICH DATA +└ +sub-<subject>/ +└ +ses-<session>/ +└ +pipeline-<id>/ +WHICH PIPELINE +└ +version-<id>/ +└ +params-<hash>_config-<hash>_attempt-<n>/ +WHICH RUN — SETTINGS, MACHINE, ATTEMPT +Re-run with different parameters and you get a sibling directory, not an overwrite — the old result stays where it was. +Inside every run directory +code/ +The exact code that produced this, not just a reference to it. +logs/ +What the run actually did, step by step. +output/ +Sorted units, waveforms and quality metrics. +visualizations/ +QC figures, viewable straight from the browser. +dataset_ +description +Machine-readable provenance for the whole run. +Each run directory stands on its own — enough to check the result and reproduce it. + The derivative sits alongside the data it came from, so the result and its inputs stay connected. +Published back to the archive. +Data in the archive +DANDI Compute infrastructure +Pipeline it relies on +The derivative it produces + + \ No newline at end of file diff --git a/pics/dandi-compute-figure_tuned/pipeline.svg b/pics/dandi-compute-figure_tuned/pipeline.svg new file mode 100644 index 00000000..ead12186 --- /dev/null +++ b/pics/dandi-compute-figure_tuned/pipeline.svg @@ -0,0 +1,248 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Reproducible spike sorting on archived data +DANDI Compute takes an asset already in the archive, runs it through an established spike-sorting pipeline +on institutional compute, and returns the results as a new, versioned derivative Dandiset. +dandi-compute/code +aind-ephys-pipeline +dandisets/001697 +1 +INPUT +DANDI Archive +Hundreds of TB of raw extracellular +electrophysiology available to the public. +Neuropixels sessions +NWB assets +2 +ORCHESTRATION +DANDI Compute +Decides what job to run on selected assets, using +which parameters and other configurations. +Prepare +Queue +Submit +3 +COMPUTATION +Spike-sorting pipeline +The containerized AIND Ephys pipeline runs on +HPC at MIT. +Nextflow +SpikeInterface +4 +OUTPUT +Dandiset 001697 +Sorted units, metrics and QC figures are saved +under a self-describing path. +Derivative +Versioned +2 +Inside DANDI Compute +Four responsibilities, each deliberately small. The infrastructure never touches the science — it decides what to run, and makes sure the record of that decision survives. +1 +Prepare +Point at an asset. Pick a named set of pipeline +parameters and a compute profile, and write +out everything needed to run it. +Named parameter sets +Compute profiles +2 +Queue +Prepared jobs pile up on disk, one self- +contained bundle per asset. Nothing has run +yet, so anything can still be pruned or rebuilt. +One bundle per asset +Inspect before you spend +3 +Submit +The bundle is handed to an institutional cluster, +where the pipeline claims a different slice of +hardware for each of its steps. +MIT Engaging HPC +Per-step resources +4 +Publish +Results, logs and the exact code are packaged +as a versioned derivative and pushed back out +where anyone can fetch them. +Version-controlled +DANDI + GitHub +Because the parameter set and the compute profile are both named, referenced things rather than typed-in flags, two runs that claim to be the same run really are (and two runs that differ say so in their identity). +3 +Inside the spike-sorting pipeline +A dispatch step fans the session out into one independent job per probe, shank and segment; the heavy work happens in parallel; the results are gathered back together at the end. +STEP 1 +Job dispatch +Splits work into jobs. +STEPS 2–6 · RUN IN PARALLEL +one job per probe · shank · segment +2 +Preprocess +Filter and correct drift. +3 +GPU +Spike sort +Detect and assign spikes. +4 +Postprocess +Waveforms and metrics. +5 +Curate +Label units by quality. +6 +Visualize +QC plots and views. +STEP 7 +Collect results +STEP 8 +Package as NWB +Parallelizing steps 2–6 makes the run affordable: only the sorting step needs a GPU, and only for one probe. Pipeline after +. +Buccino et al., 2026 +4 +Inside Dandiset 001697 +The output is a path you can read. Every level of the directory answers one question about where a result came from — nothing about the run is implicit, and nothing has to be looked up elsewhere. +001697/ +the derivative meta-Dandiset +└ +derivatives/ +└ +dandiset-<source>/ +WHICH DATA +└ +sub-<subject>/ +└ +ses-<session>/ +└ +pipeline-<id>/ +WHICH PIPELINE +└ +version-<id>/ +└ +params-<hash>_config-<hash>_attempt-<n>/ +WHICH RUN — SETTINGS, MACHINE, ATTEMPT +Re-run with different parameters and you get a sibling directory, not an overwrite — the old result stays where it was. +Inside every run directory +code/ +The exact code that produced this, not just a reference to it. +logs/ +What the run actually did, step by step. +output/ +Sorted units, waveforms and quality metrics. +visualizations/ +QC figures, viewable straight from the browser. +dataset_ +description +Machine-readable provenance for the whole run. +Each run directory stands on its own — enough to check the result and reproduce it. + The derivative sits alongside the data it came from, so the result and its inputs stay connected. +Published back to the archive. +Data in the archive +DANDI Compute infrastructure +Pipeline it relies on +The derivative it produces + + \ No newline at end of file diff --git a/pics/dandi-usage-by-region-20261008.svg b/pics/dandi-usage-by-region-20261008.svg new file mode 120000 index 00000000..5eadb1ff --- /dev/null +++ b/pics/dandi-usage-by-region-20261008.svg @@ -0,0 +1 @@ +../.git/annex/objects/f3/k7/MD5E-s572222--1141599622d58e4711237075991ea9ed.svg/MD5E-s572222--1141599622d58e4711237075991ea9ed.svg \ No newline at end of file diff --git a/pics/dandi-usage-per-quarter-20261008.png b/pics/dandi-usage-per-quarter-20261008.png new file mode 120000 index 00000000..d55f028f --- /dev/null +++ b/pics/dandi-usage-per-quarter-20261008.png @@ -0,0 +1 @@ +../.git/annex/objects/mm/Kk/MD5E-s56543--aef17a3fb09805202c36f2cccba257e9.png/MD5E-s56543--aef17a3fb09805202c36f2cccba257e9.png \ No newline at end of file diff --git a/pics/jeremy-magland.jpg b/pics/jeremy-magland.jpg new file mode 120000 index 00000000..b443b3a0 --- /dev/null +++ b/pics/jeremy-magland.jpg @@ -0,0 +1 @@ +../.git/annex/objects/fk/8k/MD5E-s1743--b758ed232cba2be35f296e4e678b3edd.jpg/MD5E-s1743--b758ed232cba2be35f296e4e678b3edd.jpg \ No newline at end of file diff --git a/pics/nemar-dataexplorer-20261006.png b/pics/nemar-dataexplorer-20261006.png new file mode 120000 index 00000000..fd7d3092 --- /dev/null +++ b/pics/nemar-dataexplorer-20261006.png @@ -0,0 +1 @@ +../.git/annex/objects/3M/Vz/MD5E-s196785--3a757350610503972cd83b1db44ff449.png/MD5E-s196785--3a757350610503972cd83b1db44ff449.png \ No newline at end of file diff --git a/pics/nemar-homepage-20261006.png b/pics/nemar-homepage-20261006.png new file mode 120000 index 00000000..336acc4a --- /dev/null +++ b/pics/nemar-homepage-20261006.png @@ -0,0 +1 @@ +../.git/annex/objects/6p/ZM/MD5E-s1196079--886968f48829d6a33c089ec98bd6f5e1.png/MD5E-s1196079--886968f48829d6a33c089ec98bd6f5e1.png \ No newline at end of file diff --git a/pics/neuroconv-formats-cloud.svg b/pics/neuroconv-formats-cloud.svg new file mode 100644 index 00000000..bf00867a --- /dev/null +++ b/pics/neuroconv-formats-cloud.svg @@ -0,0 +1 @@ +Micro-ManagerLightningPoseSpikegadgetsCellExplorerWhiteMatterAlphaOmegaNeuroScopeNeuroScopeDeepLabCutBlackrockNeuralynxOpenEphysBlackrockNeuralynxMiniscopeScanImageSpikeGLXKiloSortInscopixScanboxEXTRACTSuite2PFicTracFacemapBiocamMaxOneMCSRawMEArecPlexonSpike2PlexonBrukerCaimanVideosAxonaIntanCNMFEAudioSLEAPMoseqExcelMedPCHDF5TiffThorEDFTDTPhyABFCSVExtracellular ephys: recordingspike sortingIntracellular ephysOptical: imagingsegmentationNatural behaviorBehavioral eventsfaded: in progress \ No newline at end of file diff --git a/pics/neuroconv-logo.png b/pics/neuroconv-logo.png new file mode 120000 index 00000000..96ab9536 --- /dev/null +++ b/pics/neuroconv-logo.png @@ -0,0 +1 @@ +../.git/annex/objects/Fq/5V/MD5E-s459609--11783e72e3293a976c63d4e2707e8170.png/MD5E-s459609--11783e72e3293a976c63d4e2707e8170.png \ No newline at end of file diff --git a/pics/neurosift-event-related-lfp-40hz-20261007.png b/pics/neurosift-event-related-lfp-40hz-20261007.png new file mode 120000 index 00000000..cef98aa1 --- /dev/null +++ b/pics/neurosift-event-related-lfp-40hz-20261007.png @@ -0,0 +1 @@ +../.git/annex/objects/WQ/06/MD5E-s1441416--8437830815a1c6217df90b0a6fa33f05.png/MD5E-s1441416--8437830815a1c6217df90b0a6fa33f05.png \ No newline at end of file diff --git a/pics/neurosift-event-related-lfp-reward-20261007.png b/pics/neurosift-event-related-lfp-reward-20261007.png new file mode 120000 index 00000000..f747578d --- /dev/null +++ b/pics/neurosift-event-related-lfp-reward-20261007.png @@ -0,0 +1 @@ +../.git/annex/objects/vq/9w/MD5E-s1206136--e06b0ecac8506a47e75cc42fa1c63e1a.png/MD5E-s1206136--e06b0ecac8506a47e75cc42fa1c63e1a.png \ No newline at end of file diff --git a/pics/neurosift-event-related-motion-energy-20261007.png b/pics/neurosift-event-related-motion-energy-20261007.png new file mode 120000 index 00000000..323c8548 --- /dev/null +++ b/pics/neurosift-event-related-motion-energy-20261007.png @@ -0,0 +1 @@ +../.git/annex/objects/V8/6V/MD5E-s1454594--572ba6e15fe1c44aafec7c16dd3287ad.png/MD5E-s1454594--572ba6e15fe1c44aafec7c16dd3287ad.png \ No newline at end of file diff --git a/pics/neurosift-logo.png b/pics/neurosift-logo.png new file mode 120000 index 00000000..4d384c78 --- /dev/null +++ b/pics/neurosift-logo.png @@ -0,0 +1 @@ +../.git/annex/objects/G3/pX/MD5E-s9307--52b5260a5ffaacdb1f13a4dc3a04e2a2.png/MD5E-s9307--52b5260a5ffaacdb1f13a4dc3a04e2a2.png \ No newline at end of file diff --git a/pics/neurosift-spectrogram-lfp-20261008.webp b/pics/neurosift-spectrogram-lfp-20261008.webp new file mode 120000 index 00000000..5bfe5bd5 --- /dev/null +++ b/pics/neurosift-spectrogram-lfp-20261008.webp @@ -0,0 +1 @@ +../.git/annex/objects/0W/wZ/MD5E-s159858--9409e3250b1ca65e589cc05f6bb9d050.webp/MD5E-s159858--9409e3250b1ca65e589cc05f6bb9d050.webp \ No newline at end of file diff --git a/pics/neurosift-spectrogram-v-trace-20261008.webp b/pics/neurosift-spectrogram-v-trace-20261008.webp new file mode 120000 index 00000000..4cd3075c --- /dev/null +++ b/pics/neurosift-spectrogram-v-trace-20261008.webp @@ -0,0 +1 @@ +../.git/annex/objects/qK/xm/MD5E-s133944--09f47f20c4d5487003b144e25d015806.webp/MD5E-s133944--09f47f20c4d5487003b144e25d015806.webp \ No newline at end of file diff --git a/pics/nwb-guide-file-metadata-20261008.webp b/pics/nwb-guide-file-metadata-20261008.webp new file mode 120000 index 00000000..71ae368e --- /dev/null +++ b/pics/nwb-guide-file-metadata-20261008.webp @@ -0,0 +1 @@ +../.git/annex/objects/zJ/Vg/MD5E-s90096--4c53b68777258af1f5135a2ef07c4340.webp/MD5E-s90096--4c53b68777258af1f5135a2ef07c4340.webp \ No newline at end of file diff --git a/pics/nwb-guide-logo.png b/pics/nwb-guide-logo.png new file mode 120000 index 00000000..1e6ca1e1 --- /dev/null +++ b/pics/nwb-guide-logo.png @@ -0,0 +1 @@ +../.git/annex/objects/2f/3K/MD5E-s80805--c90fbdf995b20d8c8838b66c4cd32d49.png/MD5E-s80805--c90fbdf995b20d8c8838b66c4cd32d49.png \ No newline at end of file diff --git a/tools/build_preview.py b/tools/build_preview.py index cd07fb54..b012b514 100755 --- a/tools/build_preview.py +++ b/tools/build_preview.py @@ -4,7 +4,7 @@ Usage (from the repository root): tools/build_preview.py OUTDIR DECK.html [DECK.html ...] Starting from the decks, follows local references (src/href/data-src/ -data-background*/data-markdown attributes, markdown links and CSS url()) +data ()/data-background*/data-markdown attributes, markdown links and CSS url()) through HTML, CSS and Markdown files, and copies every referenced file into OUTDIR under its repository path. Files whose git-annex content is not present are fetched with `git annex get` first (when git-annex is @@ -31,9 +31,10 @@ # Each pattern captures (kind, quote, reference) REF_PATTERNS = [ - # HTML attributes, e.g. src="..", data-src='..', data-background-image=".." + # HTML attributes, e.g. src="..", data-src='..', , + # data-background-image=".." re.compile( - r"""\b(src|href|data-src|poster|data-markdown|data-background(?:-image|-video|-iframe)?)""" + r"""\b(src|href|data|data-src|poster|data-markdown|data-background(?:-image|-video|-iframe)?)""" r"""\s*=\s*(["'])(.+?)\2""", re.I, ), diff --git a/tools/mk_whoweare.py b/tools/mk_whoweare.py new file mode 100755 index 00000000..f57be265 --- /dev/null +++ b/tools/mk_whoweare.py @@ -0,0 +1,282 @@ +#!/usr/bin/env python3 +"""Generate an acknowledgements fragment with all the faces from the CON website. + +Reads content/pages/whoweare.html straight from the +con/centerforopenneuroscience.org repository, groups people by the

+tier they live under (Centroids, Collaborators, Affiliated Faculty, +Emeritus, ...), downloads their portraits, and writes a reusable HTML +fragment (con-whoweare.phtml by default) with one row of linked faces per +tier. Each face links back to that person's anchor on the live page. + +Usage (from the repository root): + + tools/mk_whoweare.py # regenerate fragment + pictures + tools/mk_whoweare.py --inject 2026-dhmc-ieeg.html + tools/mk_whoweare.py --no-images # fragment only, keep pictures + +--inject replaces whatever sits between + + + + +in the given deck(s), so decks stay openable as a single file (no build +step, no runtime include) while the fragment remains the single source to +regenerate from. + +Portraits are rendered through `object-fit: cover`, so non-square +originals are centre-cropped rather than squashed, and are downscaled on +the way in (--max-size, 0 to keep the originals). + +TODO: emit the logo tiers too, so the whole Acknowledgements slide is +generated rather than hand-maintained. Right now --inject overwrites +everything between the markers, so any logo row added to a deck by hand +is lost on the next run. Two separate pieces of work: + + * Collaborating projects / Partners. Both already live on the same + whoweare page, as inside + div#collaborating-projects and the Partners row -- links and titles + come for free. They are dropped today because tiers without + portraits are filtered out in main(). Needs: a second "logo tier" + renderer (no round crop, no name caption, height-based sizing), a + way to pick a handful rather than all ~40 projects (--projects + repronim,openneuro,dandi,datalad?), and the images pulled from + theme/static/img/3rd/ instead of .../team/. + + * Funders. NOT on the whoweare page at all -- there is no funders + section to scrape. Needs its own source: either a small table in + this script (logo, href, title, award number) or a funders page on + the website to parse once one exists. Award numbers matter here; + the logos alone are less useful than a link to the award. +""" + +import argparse +import html +import os +import shutil +import subprocess +import sys +import urllib.request +from html.parser import HTMLParser + +REPO = "con/centerforopenneuroscience.org" +SITE = "https://centerforopenneuroscience.org" +PAGE = "content/pages/whoweare.html" +# Pelican serves theme/static/img/... as /theme/img/... +STATIC_PREFIX = ("/theme/img/", "theme/static/img/") + + +def fetch(url): + req = urllib.request.Request(url, headers={"User-Agent": "mk_whoweare.py"}) + with urllib.request.urlopen(req) as r: + return r.read() + + +def slugify(name): + """Anchor id the website generates for a heading: 'Tor D. Wager' -> 'tor_d_wager_'.""" + kept = "".join(c if (c.isalnum() or c.isspace()) else "" for c in name.lower()) + return "_".join(kept.split()) + "_" + + +class Person: + def __init__(self, name, anchor): + self.name = name + self.anchor = anchor + self.image = None + self.position = "" + + +class WhoWeAreParser(HTMLParser): + """Linear scan:

opens a tier,

opens a person, the next and + .position
belong to that person.""" + + def __init__(self): + super().__init__(convert_charrefs=True) + self.tiers = [] # [(tier name, [Person, ...]), ...] + self._collect = None # 'tier' | 'name' | 'position' + self._buf = [] + self._person = None + + def handle_starttag(self, tag, attrs): + a = dict(attrs) + if tag == "h2": + self._collect, self._buf = "tier", [] + elif tag == "h3": + self._collect, self._buf = "name", [] + self._person = Person(None, a.get("id")) + elif tag == "img" and self._person is not None and self._person.image is None: + self._person.image = a.get("src") + elif tag == "div" and "position" in a.get("class", "").split(): + self._collect, self._buf = "position", [] + + def handle_data(self, data): + if self._collect: + self._buf.append(data) + + def handle_endtag(self, tag): + if self._collect is None: + return + text = html.unescape(" ".join("".join(self._buf).split())) + if tag == "h2" and self._collect == "tier": + self.tiers.append((text, [])) + self._person = None + elif tag == "h3" and self._collect == "name": + self._person.name = text + self._person.anchor = self._person.anchor or slugify(text) + if not self.tiers: # people before any

, shouldn't happen + self.tiers.append(("", [])) + self.tiers[-1][1].append(self._person) + elif tag == "div" and self._collect == "position": + if self._person is not None: + self._person.position = text + else: + return + self._collect, self._buf = None, [] + + +def shrink(path, max_size): + """Downscale in place -- these are displayed at ~64px, originals run to ~1MB.""" + if not max_size or not shutil.which("convert"): + return + tmp = path + ".tmp" + os.path.splitext(path)[1] + subprocess.run( + ["convert", path, "-colorspace", "RGB", "-filter", "Lanczos", + "-resize", f"{max_size}x{max_size}>", "-colorspace", "sRGB", + "-quality", "88", "-strip", tmp], + check=True, + ) + # re-encoding an already-small portrait can grow it -- keep whichever is smaller + if os.path.getsize(tmp) < os.path.getsize(path): + os.replace(tmp, path) + else: + os.remove(tmp) + + +def download_portraits(people, picsdir, ref, max_size): + """Repo first; fall back to the live site when the blob is a git-annex pointer.""" + os.makedirs(picsdir, exist_ok=True) + if max_size and not shutil.which("convert"): + print("WARNING: ImageMagick `convert` not found -- keeping originals", file=sys.stderr) + for p in people: + if not p.image: + continue + name = os.path.basename(p.image) + dest = os.path.join(picsdir, name) + repo_path = p.image.replace(*STATIC_PREFIX, 1) if p.image.startswith(STATIC_PREFIX[0]) else p.image.lstrip("/") + data = fetch(f"https://raw.githubusercontent.com/{REPO}/{ref}/{repo_path}") + if len(data) < 512 and b"annex" in data: # git-annex pointer file, not the image + data = fetch(SITE + p.image) + where = "site" + else: + where = "repo" + with open(dest, "wb") as f: + f.write(data) + shrink(dest, max_size) + print(f" {name:<20} {len(data):>8} -> {os.path.getsize(dest):>7} B ({where})", file=sys.stderr) + + +STYLE = """ +""" + + +def render(tiers, picsdir, ref): + out = [ + f"", + STYLE.rstrip(), + '
', + ] + for tier, people in tiers: + out.append(f'
{html.escape(tier)}') + out.append('
') + for p in people: + title = f"{p.name} — {p.position}" if p.position else p.name + img = os.path.join(picsdir, os.path.basename(p.image)) + out.append( + f' ' + f'{html.escape(p.name, quote=True)}' + f"{html.escape(p.name)}" + ) + out.append("
") + out.append("
") + out.append("
") + return "\n".join(out) + "\n" + + +BEGIN, END = "", "" + + +def inject(deck, fragment): + with open(deck) as f: + s = f.read() + try: + head, rest = s.split(BEGIN, 1) + _, tail = rest.split(END, 1) + except ValueError: + sys.exit(f"{deck}: no {BEGIN} ... {END} markers to fill in") + with open(deck, "w") as f: + f.write(f"{head}{BEGIN}\n{fragment}{END}{tail}") + print(f"injected into {deck}", file=sys.stderr) + + +def check_anchors(tiers): + live = fetch(SITE + "/whoweare").decode("utf-8", "replace") + missing = [p.name for _, people in tiers for p in people if f'id="{p.anchor}"' not in live] + if missing: + print(f"WARNING: anchors not found on the live page: {', '.join(missing)}", file=sys.stderr) + + +def main(): + ap = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) + ap.add_argument("--ref", default="master", help="git ref of the website repo (default: master)") + ap.add_argument("--outfile", default="con-whoweare.phtml") + ap.add_argument("--picsdir", default="pics/con-whoweare") + ap.add_argument("--inject", nargs="*", default=[], metavar="DECK.html") + ap.add_argument("--no-images", action="store_true", help="only regenerate the fragment") + ap.add_argument("--max-size", type=int, default=512, metavar="PX", + help="downscale portraits to fit PX (0 keeps the originals; default: 512)") + ap.add_argument("--no-check-anchors", action="store_true") + args = ap.parse_args() + + src = fetch(f"https://raw.githubusercontent.com/{REPO}/{args.ref}/{PAGE}").decode("utf-8") + parser = WhoWeAreParser() + parser.feed(src) + # tiers without portraits are the logo sections (Collaborating projects, Partners) + tiers = [(t, ps) for t, ps in parser.tiers if any(p.image for p in ps)] + for tier, people in tiers: + print(f"{tier}: {len(people)}", file=sys.stderr) + + if not args.no_check_anchors: + check_anchors(tiers) + if not args.no_images: + download_portraits([p for _, ps in tiers for p in ps], args.picsdir, args.ref, args.max_size) + + fragment = render(tiers, args.picsdir, args.ref) + with open(args.outfile, "w") as f: + f.write(fragment) + print(f"wrote {args.outfile}", file=sys.stderr) + for deck in args.inject: + inject(deck, fragment) + + +if __name__ == "__main__": + main() diff --git a/tools/mkpdf.py b/tools/mkpdf.py new file mode 100755 index 00000000..8dc14db8 --- /dev/null +++ b/tools/mkpdf.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python3 +"""Export any reveal.js deck in this repo to PDF, headlessly. + +A scriptable alternative to the two routes in ../README.md (manual +``?print-pdf`` in Chrome; decktape via Docker). Needs only ``uv``: + + uv run --with playwright playwright install chromium # once + uv run --with playwright python tools/mkpdf.py .html + +Writes ``.pdf`` next to the deck unless ``-o`` says otherwise. +Page size follows the deck's own ``width``/``height`` Reveal config via +reveal's print stylesheet, so nothing is hardcoded and it works for every +deck in this repo regardless of canvas size (1400x1050 or 1920x1080). + +Derived PDFs are not committed -- generate on demand. +""" + +import argparse +import asyncio +import pathlib +import sys + +from playwright.async_api import async_playwright + + +async def export(deck: pathlib.Path, out: pathlib.Path, wait_ms: int) -> None: + url = deck.resolve().as_uri() + "?print-pdf" + async with async_playwright() as p: + browser = await p.chromium.launch() + page = await browser.new_page() + problems: list[str] = [] + page.on("pageerror", lambda e: problems.append(f"pageerror: {e}")) + await page.goto(url, wait_until="networkidle") + # reveal lays out print-pdf asynchronously; mermaid/highlight need a beat + await page.wait_for_timeout(wait_ms) + pages = await page.evaluate( + "document.querySelectorAll('.reveal .slides section.pdf-page, " + ".reveal .pdf-page').length" + ) + await page.pdf( + path=str(out), + print_background=True, + prefer_css_page_size=True, + margin={"top": "0", "right": "0", "bottom": "0", "left": "0"}, + ) + await browser.close() + if problems: + print("\n".join(problems), file=sys.stderr) + print(f"{out} ({out.stat().st_size / 1e6:.1f} MB, {pages} pdf-pages laid out)") + + +def main() -> None: + ap = argparse.ArgumentParser(description=__doc__) + ap.add_argument("deck", type=pathlib.Path, help="path to the .html deck") + ap.add_argument("-o", "--output", type=pathlib.Path, default=None) + ap.add_argument( + "--wait", + type=int, + default=4000, + help="ms to wait after load for mermaid/highlight/lazy images (default 4000)", + ) + args = ap.parse_args() + if not args.deck.is_file(): + sys.exit(f"no such deck: {args.deck}") + out = args.output or args.deck.with_suffix(".pdf") + asyncio.run(export(args.deck, out, args.wait)) + + +if __name__ == "__main__": + main()