From 77a4469fa99d69891aec510652ed1154d58a6d8e Mon Sep 17 00:00:00 2001 From: Mathieu Scheltienne Date: Mon, 18 Nov 2024 13:54:00 +0100 Subject: [PATCH 01/10] improve landing page --- doc/index.rst | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/doc/index.rst b/doc/index.rst index 3c191d40..c3e24586 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -13,10 +13,11 @@ typically very noisy and contains various non-neural signals, such as heartbeat artifacts. `Independent Component Analysis (ICA) `_ is a common procedure to remove these artifacts. However, removing artifacts requires manual annotation of ICA components, which is subject to human error and very -laborious when operating on large datasets. The first few versions of -``mne-icalabel`` replicated the popular ICLabel model for Python (previously -only available in MATLAB's EEGLab). In future versions, the package aims to -develop more robust models that build upon the ICLabel model. +laborious when operating on large datasets. + +The first few versions of ``mne-icalabel`` replicated the popular ICLabel model for +Python (previously only available in MATLAB's EEGLab). In future versions, the package +aims to develop more robust models that build upon the ICLabel model. We encourage you to use the package for your research and also build on top with relevant Pull Requests (PR). See our examples for walk-throughs of how to @@ -25,15 +26,15 @@ use the package and see our ``mne-icalabel`` is licensed under the `BSD license`_. A full copy of the license can be found `on GitHub `_. +See our :ref:`changes/index:Changelog` for a full list of changes. Contents -------- .. toctree:: :maxdepth: 2 + :hidden: install api generated/examples/index - -See our :ref:`changes/index:Changelog` for a full list of changes. From 81171935fbabda88177f749b575f7c3d2b090731 Mon Sep 17 00:00:00 2001 From: Mathieu Scheltienne Date: Mon, 18 Nov 2024 13:54:23 +0100 Subject: [PATCH 02/10] improve make files --- doc/Makefile | 41 ++++++++++++++++++--------- doc/make.bat | 78 +++++++++++++++++++++++++++++++++------------------- 2 files changed, 77 insertions(+), 42 deletions(-) diff --git a/doc/Makefile b/doc/Makefile index d4bb2cbb..3165eea7 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -1,20 +1,35 @@ # Minimal makefile for Sphinx documentation -# -# You can set these variables from the command line, and also -# from the environment for the first two. -SPHINXOPTS ?= +SPHINXOPTS ?= -nWT --keep-going SPHINXBUILD ?= sphinx-build -SOURCEDIR = . -BUILDDIR = _build -# Put it first so that "make" without argument is like "make help". +.PHONY: help Makefile clean html html-noplot linkcheck linkcheck-grep view + +first_target: help + help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " html-noplot to make standalone HTML files without plotting" + @echo " clean to clean HTML files" + @echo " linkcheck to check all external links for integrity" + @echo " linkcheck-grep to grep the linkcheck result" + @echo " view to view the built HTML" + +html: + $(SPHINXBUILD) . _build/html -b html $(SPHINXOPTS) + +html-noplot: + $(SPHINXBUILD) . _build/html -b html $(SPHINXOPTS) -D plot_gallery=0 + +clean: + rm -rf _build generated + +linkcheck: + $(SPHINXBUILD) . _build/linkcheck -b linkcheck -D plot_gallery=0 -.PHONY: help Makefile +linkcheck-grep: + @! grep -h "^.*:.*: \[\(\(local\)\|\(broken\)\)\]" _build/linkcheck/output.txt -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) +view: + @python -c "import webbrowser; webbrowser.open_new_tab('file://$(PWD)/_build/html/index.html')" diff --git a/doc/make.bat b/doc/make.bat index 954237b9..dcd0a573 100644 --- a/doc/make.bat +++ b/doc/make.bat @@ -1,35 +1,55 @@ -@ECHO OFF +@echo off -pushd %~dp0 +REM Minimal makefile for Sphinx documentation -REM Command file for Sphinx documentation +REM Set default options and commands +set SPHINXOPTS=-nWT --keep-going +set SPHINXBUILD=sphinx-build -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set SOURCEDIR=. -set BUILDDIR=_build - -%SPHINXBUILD% >NUL 2>NUL -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.https://www.sphinx-doc.org/ - exit /b 1 -) - -if "%1" == "" goto help - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% -goto end +if "%1" == "html" goto html +if "%1" == "html-noplot" goto html-noplot +if "%1" == "clean" goto clean +if "%1" == "linkcheck" goto linkcheck +if "%1" == "linkcheck-grep" goto linkcheck-grep +if "%1" == "view" goto view +REM Define targets :help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +echo Please use `make ^` where ^ is one of +echo html to make standalone HTML files +echo html-noplot to make standalone HTML files without plotting +echo clean to clean HTML files +echo linkcheck to check all external links for integrity +echo linkcheck-grep to grep the linkcheck result +echo view to view the built HTML +goto :eof + +:html +%SPHINXBUILD% . _build\html -b html %SPHINXOPTS% +goto :eof + +:html-noplot +%SPHINXBUILD% . _build\html -b html %SPHINXOPTS% -D plot_gallery=0 +goto :eof + +:clean +rmdir /s /q _build generated +goto :eof + +:linkcheck +%SPHINXBUILD% . _build\linkcheck -b linkcheck -D plot_gallery=0 +goto :eof + +:linkcheck-grep +findstr /C:"[broken]" _build\linkcheck\output.txt > nul +if %errorlevel% equ 0 ( + echo Lines with [broken]: + findstr /C:"[broken]" _build\linkcheck\output.txt +) else ( + echo No lines with [broken] found. +) +goto :eof -:end -popd +:view +python -c "import webbrowser; webbrowser.open_new_tab(r'file:///%cd%\_build\html\index.html')" +goto :eof From d2ef75300d15034127f9559410b9dc1996dfad43 Mon Sep 17 00:00:00 2001 From: Mathieu Scheltienne Date: Mon, 18 Nov 2024 14:01:46 +0100 Subject: [PATCH 03/10] update titles --- .gitignore | 2 ++ doc/Makefile | 2 +- doc/api.rst | 12 ++++++------ doc/changes/0.2.rst | 2 +- doc/make.bat | 1 + 5 files changed, 11 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index edb02525..630e3235 100644 --- a/.gitignore +++ b/.gitignore @@ -74,6 +74,8 @@ instance/ # Sphinx documentation doc/_build/ +docc/generated/ +doc/sg_execution_times.rst # PyBuilder target/ diff --git a/doc/Makefile b/doc/Makefile index 3165eea7..a26b76be 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -23,7 +23,7 @@ html-noplot: $(SPHINXBUILD) . _build/html -b html $(SPHINXOPTS) -D plot_gallery=0 clean: - rm -rf _build generated + rm -rf _build generated sg_execution_times.rst linkcheck: $(SPHINXBUILD) . _build/linkcheck -b linkcheck -D plot_gallery=0 diff --git a/doc/api.rst b/doc/api.rst index 23204d8c..af3405f1 100644 --- a/doc/api.rst +++ b/doc/api.rst @@ -1,6 +1,5 @@ -### API -### +=== .. automodule:: mne_icalabel :no-members: @@ -11,7 +10,7 @@ for classes (``CamelCase`` names) and functions (``underscore_case`` names) of MNE-ICALabel. Most-used functions -=================== +------------------- .. currentmodule:: mne_icalabel @@ -21,7 +20,7 @@ Most-used functions label_components ICLabel -======= +------- This is the model originally available for `EEGLab `_. The model was ported from matconvnet using `pytorch `_ or @@ -56,7 +55,7 @@ the 3 features are concatenated for the final layer. run_iclabel Features -======== +-------- Contains functions to extract features from `~mne.preprocessing.ICA` instance and `~mne.io.Raw` or `~mne.Epochs` instances using MNE-Python. @@ -69,7 +68,8 @@ Contains functions to extract features from `~mne.preprocessing.ICA` instance an get_topomaps Annotating Components -===================== +--------------------- + To facilitate annotation of the ICA components, we provide an API that conforms to the derivative standard of BIDS for EEG data. diff --git a/doc/changes/0.2.rst b/doc/changes/0.2.rst index 65bf0af1..2b61864a 100644 --- a/doc/changes/0.2.rst +++ b/doc/changes/0.2.rst @@ -12,7 +12,7 @@ .. include:: ./authors.inc -Version 0.3 +Version 0.2 =========== - Add functions for annotating and labeling ICA components in BIDS format :func:`mne_icalabel.annotation.write_components_tsv`, :func:`mne_icalabel.annotation.mark_component` (:pr:`60` by `Adam Li`_) diff --git a/doc/make.bat b/doc/make.bat index dcd0a573..1d93d72f 100644 --- a/doc/make.bat +++ b/doc/make.bat @@ -34,6 +34,7 @@ goto :eof :clean rmdir /s /q _build generated +del sg_execution_times.rst goto :eof :linkcheck From df17b2d3d35615f50bb1d5a2b6dd8b659ee700ea Mon Sep 17 00:00:00 2001 From: Mathieu Scheltienne Date: Mon, 18 Nov 2024 14:40:00 +0100 Subject: [PATCH 04/10] update structure --- doc/_static/style.css | 166 +++++++++++++--------- doc/api.rst | 94 ------------ doc/api/iclabel.rst | 71 +++++++++ doc/api/index.rst | 68 +++++++++ doc/bibliography.rst | 12 -- doc/conf.py | 6 +- doc/index.rst | 2 +- doc/references.bib | 11 +- examples/00_iclabel.py | 4 +- mne_icalabel/iclabel/features.py | 2 +- mne_icalabel/iclabel/features.pyi | 2 +- mne_icalabel/iclabel/label_components.py | 2 +- mne_icalabel/iclabel/label_components.pyi | 2 +- 13 files changed, 253 insertions(+), 189 deletions(-) delete mode 100644 doc/api.rst create mode 100644 doc/api/iclabel.rst create mode 100644 doc/api/index.rst delete mode 100644 doc/bibliography.rst diff --git a/doc/_static/style.css b/doc/_static/style.css index b10216dd..70735d9c 100644 --- a/doc/_static/style.css +++ b/doc/_static/style.css @@ -7,41 +7,58 @@ --pst-font-family-monospace: 'Source Code Pro', var(--pst-font-family-monospace-system); /* colors that aren't responsive to light/dark mode */ --mne-color-discord: #5865F2; - --mne-color-primary: #007bff; - --mne-color-primary-highlight: #0063cc; /* font weight */ --mne-font-weight-semibold: 600; } html[data-theme="light"] { + /* pydata-sphinx-theme overrides */ + /* ↓↓↓ use default "info" colors for "primary" */ + --pst-color-primary: #276be9; + --pst-color-primary-bg: #dce7fc; + /* ↓↓↓ use default "primary" colors for "info" */ + --pst-color-info: var(--pst-teal-500); + --pst-color-info-bg: var(--pst-teal-200); + /* ↓↓↓ use "warning" colors for "secondary" */ + --pst-color-secondary: var(--pst-color-warning); + --pst-color-secondary-bg: var(--pst-color-warning-bg); + /* ↓↓↓ make sure new primary (link) color propogates to links on code */ + --pst-color-inline-code-links: var(--pst-color-link); + /* ↓↓↓ make sure new secondary (hover) color propogates to hovering on table rows */ + --pst-color-table-row-hover-bg: var(--pst-color-secondary-bg); /* topbar logo links */ --mne-color-github: #000; - --mne-color-discourse: #000; + --mne-color-discourse: #d0232b; --mne-color-mastodon: #2F0C7A; /* code block copy button */ --copybtn-opacity: 0.75; /* card header bg color */ --mne-color-card-header: rgba(0, 0, 0, 0.05); - /* section headings */ - --mne-color-heading: #003e80; - /* pydata-sphinx-theme overrides */ - --pst-color-primary: var(--mne-color-primary); - --pst-color-primary-highlight: var(--mne-color-primary-highlight); - --pst-color-info: var(--pst-color-primary); - --pst-color-border: #ccc; - --pst-color-background: #fff; - --pst-color-link: var(--pst-color-primary-highlight); /* sphinx-gallery overrides */ --sg-download-a-background-color: var(--pst-color-primary); --sg-download-a-background-image: unset; --sg-download-a-border-color: var(--pst-color-border); - --sg-download-a-color: #fff; + --sg-download-a-color: var(--sd-color-primary-text); --sg-download-a-hover-background-color: var(--pst-color-primary-highlight); --sg-download-a-hover-box-shadow-1: none; --sg-download-a-hover-box-shadow-2: none; } html[data-theme="dark"] { + /* pydata-sphinx-theme overrides */ + /* ↓↓↓ use default "info" colors for "primary" */ + --pst-color-primary: #79a3f2; + --pst-color-primary-bg: #06245d; + /* ↓↓↓ use default "primary" colors for "info" */ + --pst-color-info: var(--pst-teal-400); + --pst-color-info-bg: var(--pst-teal-800); + /* ↓↓↓ use "warning" colors for "secondary" */ + --pst-color-secondary: var(--pst-color-warning); + --pst-color-secondary-bg: var(--pst-color-warning-bg); + /* ↓↓↓ make sure new primary (link) color propogates to links on code */ + --pst-color-inline-code-links: var(--pst-color-link); + /* ↓↓↓ make sure new secondary (hover) color propogates to hovering on table rows */ + --pst-color-table-row-hover-bg: var(--pst-color-secondary-bg); /* topbar logo links */ --mne-color-github: rgb(240, 246, 252); /* from their logo SVG */ --mne-color-discourse: #FFF9AE; /* from their logo SVG */ @@ -50,27 +67,15 @@ html[data-theme="dark"] { --copybtn-opacity: 0.25; /* card header bg color */ --mne-color-card-header: rgba(255, 255, 255, 0.2); - /* section headings */ - --mne-color-heading: #b8cbe0; - /* pydata-sphinx-theme overrides */ - --pst-color-primary: var(--mne-color-primary); - --pst-color-primary-highlight: var(--mne-color-primary-highlight); - --pst-color-info: var(--pst-color-primary); - --pst-color-border: #333; - --pst-color-background: #000; - --pst-color-link: #66b0ff; /* sphinx-gallery overrides */ --sg-download-a-background-color: var(--pst-color-primary); --sg-download-a-background-image: unset; --sg-download-a-border-color: var(--pst-color-border); - --sg-download-a-color: #000; + --sg-download-a-color: var(--sd-color-primary-text); --sg-download-a-hover-background-color: var(--pst-color-primary-highlight); --sg-download-a-hover-box-shadow-1: none; --sg-download-a-hover-box-shadow-2: none; } -h1, h2, h3, h4, h5, h6 { - color: var(--mne-color-heading); -} /* ************************************************************ Sphinx fixes */ @@ -98,11 +103,6 @@ html[data-theme="dark"] img { filter: none; } -/* prev/next links */ -.prev-next-area a p.prev-next-title { - color: var(--pst-color-link); -} - /* make versionadded smaller and inline with param name */ /* don't do for deprecated / versionchanged; they have extra info (too long to fit) */ div.versionadded > p { @@ -127,11 +127,11 @@ a.sphx-glr-backref-instance:hover { } /* backreference links: make non-MNE func/meth calls resemble regular code */ a[class^="sphx-glr-backref-module"] { - color: rgb(var(--pst-color-text-base)); + color: var(--pst-color-text-base); } /* backreference links: make MNE calls bold and colorful */ a[class^="sphx-glr-backref-module-mne"] { - color: rgb(var(--pst-color-link)); + color: var(--pst-color-link); font-weight: var(--mne-font-weight-semibold); } /* suppress redundant note at top of every tutorial and signature at the end */ @@ -147,8 +147,15 @@ p.sphx-glr-signature { border-radius: 0.5rem; /* ↓↓↓↓↓↓↓ these two rules copied from sphinx-design */ box-shadow: 0 .125rem .25rem var(--sd-color-shadow) !important; + text-decoration: none; transition: color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out; } +.sphx-glr-download a.download code { + color: var(--sg-download-a-color); +} +.sphx-glr-download a.download::before { + color: var(--sg-download-a-color); +} /* Report embedding */ iframe.sg_report { width: 95%; @@ -175,20 +182,45 @@ iframe.sg_report { top: 0; } -/* TODO: Either pydata-sphinx-theme (for using Bootstrap) or sphinx-gallery (for adding table formatting) should fix this */ -.table-striped-columns>:not(caption)>tr>:nth-child(2n),.table-striped>tbody>tr:nth-of-type(odd)>* { - --bs-table-accent-bg: var(--bs-table-striped-bg); +/* ******************************************************** HTML repr tables */ + +/* make table responsive to pydata-sphinx-theme's light/dark mode */ +.table > :not(caption) > * > * { color: var(--pst-color-text-base); } -.table-hover>tbody>tr:hover>* { - --bs-table-accent-bg: var(--bs-table-hover-bg); - color: var(--pst-color-text-base); +.mne-repr-table tbody tr:hover { + background-color: var(--pst-color-table-row-hover-bg); } -.rendered_html table { - color: var(--pst-color-text-base); +.mne-repr-section-toggle > button > svg > path { + fill: var(--pst-color-text-base); } - - +/* make the expand/collapse button look nicer */ +.mne-repr-section-toggle > button { + padding: 20%; +} +/* make section header rows more distinct (and harmonize with pydata-sphinx-theme table +style in the process). Color copied from pydata-sphinx-theme; 2px copied from bootstrap. +*/ +.mne-repr-table th { + border-bottom: 2px solid var(--pst-color-primary); +} +/* harmonize the channel names buttons with the rest of the table */ +.mne-ch-names-btn { + font-size: inherit; + padding: 0.25rem; + min-width: 1.5rem; + font-weight: bold; +} +/* +.mne-ch-names-btn:hover { + background-color: var(--pst-color-); + text-decoration: underline; +} +.mne-ch-names-btn:focus-visible { + outline: 0.1875rem solid var(--pst-color-accent); + outline-offset: 0.1875rem; +} +*/ /* ***************************************************** sphinx-design fixes */ p.btn a { color: unset; @@ -221,16 +253,16 @@ aside.footnote:last-child { } /* ******************************************************* navbar icon links */ -#navbar-icon-links i.fa-square-github::before { +.navbar-icon-links svg.fa-square-github { color: var(--mne-color-github); } -#navbar-icon-links i.fa-discourse::before { +.navbar-icon-links svg.fa-discourse { color: var(--mne-color-discourse); } -#navbar-icon-links i.fa-discord::before { +.navbar-icon-links svg.fa-discord { color: var(--mne-color-discord); } -#navbar-icon-links i.fa-mastodon::before { +.navbar-icon-links svg.fa-mastodon { color: var(--mne-color-mastodon); } @@ -241,7 +273,6 @@ aside.footnote:last-child { } /* topbar nav active */ .bd-header.navbar-light#navbar-main .navbar-nav > li.active > .nav-link { - color: var(--pst-color-link); font-weight: var(--mne-font-weight-semibold); } /* topbar nav hover */ @@ -249,18 +280,6 @@ aside.footnote:last-child { .bd-header.navbar-light#navbar-main .navbar-nav li a.nav-link:hover { color: var(--pst-color-secondary); } -/* sidebar nav */ -nav.bd-links .active > a, -nav.bd-links .active:hover > a, -.toc-entry a.nav-link.active, -.toc-entry a.nav-link.active:hover { - color: var(--pst-color-link); -} -/* sidebar nav hover */ -nav.bd-links li > a:hover, -.toc-entry a.nav-link:hover { - color: var(--pst-color-secondary); -} /* *********************************************************** homepage logo */ img.logo { @@ -272,10 +291,13 @@ img.logo { ul.quicklinks a { font-weight: var(--mne-font-weight-semibold); color: var(--pst-color-text-base); + text-decoration: none; +} +ul.quicklinks a svg { + color: var(--pst-color-text-muted); } ul.quicklinks a:hover { text-decoration: none; - color: var(--pst-color-secondary); } h5.card-header { margin-top: 0px; @@ -286,7 +308,6 @@ h5.card-header::before { height: 0px; margin-top: 0px; } - /* ******************************************************* homepage carousel */ div.frontpage-gallery { overflow: hidden; @@ -295,7 +316,7 @@ div.frontpage-gallery { } div.frontpage-gallery a { text-decoration: none; - color: rgb(var(--pst-color-text-base)); + color: var(--pst-color-text-base); } div.frontpage-gallery img.card-img { transform: scale(1.8); @@ -320,7 +341,7 @@ div.frontpage-gallery:hover .fadeout { needed for dark mode. */ div.card { border: 1px solid var(--pst-color-border); - background-color: rgb(var(--pst-color-background)); + background-color: var(--pst-color-background); } .card-header { border-bottom-color: var(--pst-color-border); @@ -339,9 +360,8 @@ div#contributor-avatars div.card img { border-radius: unset; } div#contributor-avatars div.card img { - width: 3em; + width: 2.5em; } - .contributor-avatar { clip-path: circle(closest-side); } @@ -379,3 +399,17 @@ img.hidden { td.justify { text-align-last: justify; } + +/* Matplotlib HTML5 video embedding */ +div.sphx-glr-animation video { + max-width: 100%; + height: auto; +} + +/* fix sidebar scrollbars */ +.sidebar-primary-items__end { + margin-bottom: 0 !important; + margin-top: 0 !important; + margin-left: 0 !important; + margin-right: 0 !important; +} diff --git a/doc/api.rst b/doc/api.rst deleted file mode 100644 index af3405f1..00000000 --- a/doc/api.rst +++ /dev/null @@ -1,94 +0,0 @@ -API -=== - -.. automodule:: mne_icalabel - :no-members: - :no-inherited-members: - -This is the application programming interface (API) reference -for classes (``CamelCase`` names) and functions -(``underscore_case`` names) of MNE-ICALabel. - -Most-used functions -------------------- - -.. currentmodule:: mne_icalabel - -.. autosummary:: - :toctree: ./generated/api - - label_components - -ICLabel -------- - -This is the model originally available for `EEGLab `_. -The model was ported from matconvnet using `pytorch `_ or -`Microsoft onnxruntime `_. - -ICLabel is designed to classify ICs fitted with an extended infomax ICA -decomposition algorithm on EEG datasets referenced to a common average and -filtered between [1., 100.] Hz. It is possible to run ICLabel on datasets that -do not meet those specification, but the classification performance -might be negatively impacted. Moreover, the ICLabel paper did not study the -effects of these preprocessing steps. - -Architecture: - -.. image:: _static/ICLabel_DagNN_Architecture.png - :width: 400 - :alt: ICLabel Neural Network Architecture - :align: center - -The model has three inputs: image (topomap), psd, and autocorrelation features. -To encourage generalization, the image feature is rotated and negated, thus -quadrupling the feature. After 3 convolutional layer with a ReLu activation, -the 3 features are concatenated for the final layer. - -.. currentmodule:: mne_icalabel.iclabel - -.. autosummary:: - :toctree: ./generated/api - - iclabel_label_components - get_iclabel_features - run_iclabel - -Features --------- - -Contains functions to extract features from `~mne.preprocessing.ICA` instance and `~mne.io.Raw` or -`~mne.Epochs` instances using MNE-Python. - -.. currentmodule:: mne_icalabel.features - -.. autosummary:: - :toctree: ./generated/api - - get_topomaps - -Annotating Components ---------------------- - -To facilitate annotation of the ICA components, we provide an API that conforms to the -derivative standard of BIDS for EEG data. - -.. currentmodule:: mne_icalabel.annotation - -.. autosummary:: - :toctree: ./generated/api - - mark_component - write_components_tsv - -In addition, as of v0.3, we have introduced a beta-version of a GUI that -assists in annotated ICA components. This was heavily inspired by the annotation -process in ``ICLabel``. If you use this feature, please note that there may be -significant bugs still. Please report these in the GH issues tab. - -.. currentmodule:: mne_icalabel - -.. autosummary:: - :toctree: ./generated/api - - gui.label_ica_components diff --git a/doc/api/iclabel.rst b/doc/api/iclabel.rst new file mode 100644 index 00000000..cb0c8515 --- /dev/null +++ b/doc/api/iclabel.rst @@ -0,0 +1,71 @@ +:orphan: + +ICLabel +======= + +This is the model originally available for `EEGLab `_. +The model was ported from matconvnet using `pytorch `_ or +`Microsoft onnxruntime `_. + +ICLabel is designed to classify ICs fitted with an extended infomax ICA +decomposition algorithm on *EEG datasets* referenced to a common average and +filtered between (1, 100) Hz. It is possible to run ICLabel on datasets that +do not meet those specification, but the classification performance +might be negatively impacted. Moreover, the ICLabel paper did not study the +effects of these preprocessing steps. + +Architecture +------------ + +.. image:: ../_static/ICLabel_DagNN_Architecture.png + :width: 400 + :alt: ICLabel Neural Network Architecture + :align: center + +.. raw:: html + +

+ +The model has three inputs: image (topomap), psd, and autocorrelation features. +To encourage generalization, the image feature is rotated and negated, thus +quadrupling the feature. After 3 convolutional layer with a ReLu activation, +the 3 features are concatenated for the final layer. + +API +--- + +.. currentmodule:: mne_icalabel.iclabel + +.. autosummary:: + :toctree: ../generated/api + + iclabel_label_components + get_iclabel_features + run_iclabel + +Cite +---- + +If you use ICLabel, please also cite the original +paper\ :footcite:p:`PionTonachini2019`. + +.. footbibliography:: + +.. dropdown:: BibTeX for ICLabel + :color: info + +.. code-block:: + + @article{PionTonachini2019, + title = {ICLabel: An automated electroencephalographic independent component classifier, dataset, and website}, + volume = {198}, + ISSN = {1053-8119}, + url = {http://dx.doi.org/10.1016/j.neuroimage.2019.05.026}, + DOI = {10.1016/j.neuroimage.2019.05.026}, + journal = {NeuroImage}, + publisher = {Elsevier BV}, + author = {Pion-Tonachini, Luca and Kreutz-Delgado, Ken and Makeig, Scott}, + year = {2019}, + month = sep, + pages = {181–197} + } diff --git a/doc/api/index.rst b/doc/api/index.rst new file mode 100644 index 00000000..2d5aac87 --- /dev/null +++ b/doc/api/index.rst @@ -0,0 +1,68 @@ +API +=== + +This is the application programming interface (API) reference +for classes (``CamelCase`` names) and functions +(``underscore_case`` names) of MNE-ICALabel. + +Most-used function +------------------ + +The most commonly used function is :func:`mne_icalabel.label_components` which takes an +mne instance (:class:`mne.io.Raw`, :class:`mne.Epochs`) and its ICA decomposition to +label the components using the specified method/model. + +.. currentmodule:: mne_icalabel + +.. autosummary:: + :toctree: ../generated/api + + label_components + +Models +------ + +.. card-carousel:: 2 + + .. card:: ICLabel + :link: iclabel.html + :link-type: url + +Features +-------- + +On top of the available models, ``mne-icalabel`` provides a set of functions to extract +features from `~mne.preprocessing.ICA` instance and `~mne.io.Raw` / `~mne.Epochs` +instances using MNE-Python. Those features can then be used to train new models. + +.. currentmodule:: mne_icalabel.features + +.. autosummary:: + :toctree: ../generated/api + + get_topomaps + +Annotating Components +--------------------- + +Finally, to facilitate annotation of the ICA components, we provide an API that conforms +to the derivative standard of BIDS for EEG data to write the annotations to a TSV file. + +.. currentmodule:: mne_icalabel.annotation + +.. autosummary:: + :toctree: ../generated/api + + mark_component + write_components_tsv + +In addition, as of version 0.3, we have introduced a beta-version of a GUI that +assists in annotated ICA components. This was heavily inspired by the annotation +process in ``ICLabel``. + +.. currentmodule:: mne_icalabel.gui + +.. autosummary:: + :toctree: ../generated/api + + label_ica_components diff --git a/doc/bibliography.rst b/doc/bibliography.rst deleted file mode 100644 index 4a310352..00000000 --- a/doc/bibliography.rst +++ /dev/null @@ -1,12 +0,0 @@ -:orphan: - -.. _general_bibliography: - -General bibliography -==================== - -The references below are arranged alphabetically by first author. - -.. bibliography:: ./references.bib - :all: - :list: enumerated diff --git a/doc/conf.py b/doc/conf.py index 96046e18..1905f31f 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -123,11 +123,7 @@ "version_match": switcher_version_match, }, } -# Custom sidebar templates, maps document names to template names. -html_sidebars = { - "index": ["search-field.html"], -} - +html_sidebars = {"**": []} html_context = { "pygment_light_style": "tango", "pygment_dark_style": "native", diff --git a/doc/index.rst b/doc/index.rst index c3e24586..b5711d36 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -36,5 +36,5 @@ Contents :hidden: install - api + api/index generated/examples/index diff --git a/doc/references.bib b/doc/references.bib index fedf349c..44c157f8 100644 --- a/doc/references.bib +++ b/doc/references.bib @@ -1,9 +1,10 @@ -@article{iclabel2019, - author = {Luca Pion-Tonachini and Ken Kreutz-Delgado and Scott Makeig}, - doi = {https://doi.org/10.1016/j.neuroimage.2019.05.026}, +@article{PionTonachini2019, + author = {Pion-Tonachini, Luca and Kreutz-Delgado, Ken and Makeig, Scott}, + doi = {10.1016/j.neuroimage.2019.05.026}, journal = {NeuroImage}, - pages = {181-197}, - title = {ICLabel: An automated electroencephalographic independent component classifier, dataset, and website}, + month = {September}, + pages = {181–197}, + title = {ICLabel: An automated electroencephalographic independent component classifier, dataset, and website}, volume = {198}, year = {2019} } diff --git a/examples/00_iclabel.py b/examples/00_iclabel.py index b7576f3a..4f9efa29 100644 --- a/examples/00_iclabel.py +++ b/examples/00_iclabel.py @@ -5,7 +5,7 @@ ============================================================== This tutorial covers automatically repairing signals using ICA with -the ICLabel model\ :footcite:`iclabel2019`, which originates in EEGLab. +the ICLabel model\ :footcite:`PionTonachini2019`, which originates in EEGLab. For conceptual background on ICA, see :ref:`this scikit-learn tutorial `. For a basic understanding of how to use ICA to remove artifacts, see `the @@ -212,7 +212,7 @@ # # The output of the ICLabel ``label_components`` function produces # predicted probability values for each of these classes in that order. -# See :footcite:`iclabel2019` for full details. +# See :footcite:`PionTonachini2019` for full details. ic_labels = label_components(filt_raw, ica, method="iclabel") diff --git a/mne_icalabel/iclabel/features.py b/mne_icalabel/iclabel/features.py index 7fbd9b0f..96004b95 100644 --- a/mne_icalabel/iclabel/features.py +++ b/mne_icalabel/iclabel/features.py @@ -37,7 +37,7 @@ def get_iclabel_features(inst: Union[BaseRaw, BaseEpochs], ica: ICA): autocorr : array of shape (1, 100, 1, n_components) The autocorrelations feature. Depending on the length of the raw data passed in, different methods of computing autocorrelation - will be used. See :footcite:t:`iclabel2019` for details. + will be used. See :footcite:t:`PionTonachini2019` for details. References ---------- diff --git a/mne_icalabel/iclabel/features.pyi b/mne_icalabel/iclabel/features.pyi index 117fee92..01b06b61 100644 --- a/mne_icalabel/iclabel/features.pyi +++ b/mne_icalabel/iclabel/features.pyi @@ -28,7 +28,7 @@ def get_iclabel_features(inst: BaseRaw | BaseEpochs, ica: ICA): autocorr : array of shape (1, 100, 1, n_components) The autocorrelations feature. Depending on the length of the raw data passed in, different methods of computing autocorrelation - will be used. See :footcite:t:`iclabel2019` for details. + will be used. See :footcite:t:`PionTonachini2019` for details. References ---------- diff --git a/mne_icalabel/iclabel/label_components.py b/mne_icalabel/iclabel/label_components.py index 6329d341..bf8e2797 100644 --- a/mne_icalabel/iclabel/label_components.py +++ b/mne_icalabel/iclabel/label_components.py @@ -32,7 +32,7 @@ def iclabel_label_components( - Autocorrelation, based on the ICA decomposition and the provided instance. - For more information, see :footcite:t:`iclabel2019`. + For more information, see :footcite:t:`PionTonachini2019`. Parameters ---------- diff --git a/mne_icalabel/iclabel/label_components.pyi b/mne_icalabel/iclabel/label_components.pyi index c44b2807..152524dd 100644 --- a/mne_icalabel/iclabel/label_components.pyi +++ b/mne_icalabel/iclabel/label_components.pyi @@ -28,7 +28,7 @@ def iclabel_label_components( - Autocorrelation, based on the ICA decomposition and the provided instance. - For more information, see :footcite:t:`iclabel2019`. + For more information, see :footcite:t:`PionTonachini2019`. Parameters ---------- From f561f1e72aa5ce0f47834aced2127e55d9d97d90 Mon Sep 17 00:00:00 2001 From: Mathieu Scheltienne Date: Mon, 18 Nov 2024 14:42:44 +0100 Subject: [PATCH 05/10] rm unused --- doc/_static/favicon.ico | Bin 7738 -> 0 bytes doc/_static/mne_helmet.png | Bin 27218 -> 0 bytes doc/_static/mne_logo_small.png | Bin 980 -> 0 bytes 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 doc/_static/favicon.ico delete mode 100644 doc/_static/mne_helmet.png delete mode 100644 doc/_static/mne_logo_small.png diff --git a/doc/_static/favicon.ico b/doc/_static/favicon.ico deleted file mode 100644 index b0a1b57a5574966eb13a3c8bfaf36f0337ed5367..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7738 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 AQUCw| diff --git a/doc/_static/mne_helmet.png b/doc/_static/mne_helmet.png deleted file mode 100644 index bb2124669ea5e251bf5370321e7e4e312a8ff28f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27218 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 Date: Mon, 18 Nov 2024 14:45:21 +0100 Subject: [PATCH 06/10] update readme --- README.md | 46 +++++++++++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 688fc74c..c16907e2 100644 --- a/README.md +++ b/README.md @@ -84,23 +84,39 @@ your question. # Citing -If you use the ``ICLabel`` model, please consider citing our paper: - - Li et al., (2022). MNE-ICALabel: Automatically annotating ICA components with ICLabel in Python. Journal of Open Source Software, 7(76), 4484, https://doi.org/10.21105/joss.04484 - -with the corresponding BibTex: +If you use the ``mne-icalabel``, please consider citing our paper: @article{Li2022, - doi = {10.21105/joss.04484}, - url = {https://doi.org/10.21105/joss.04484}, - year = {2022}, - publisher = {The Open Journal}, - volume = {7}, - number = {76}, - pages = {4484}, - author = {Adam Li and Jacob Feitelberg and Anand Prakash Saini and Richard Höchenberger and Mathieu Scheltienne}, - title = {MNE-ICALabel: Automatically annotating ICA components with ICLabel in Python}, - journal = {Journal of Open Source Software} + title = {MNE-ICALabel: Automatically annotating ICA components with ICLabel in Python}, + volume = {7}, + ISSN = {2475-9066}, + url = {http://dx.doi.org/10.21105/joss.04484}, + DOI = {10.21105/joss.04484}, + number = {76}, + journal = {Journal of Open Source Software}, + publisher = {The Open Journal}, + author = {Li, Adam and Feitelberg, Jacob and Saini, Anand Prakash and H\"{o}chenberger, Richard and Scheltienne, Mathieu}, + year = {2022}, + month = aug, + pages = {4484} + } + +And the paper associated to the model used: + +- **ICLabel** + + @article{PionTonachini2019, + title = {ICLabel: An automated electroencephalographic independent component classifier, dataset, and website}, + volume = {198}, + ISSN = {1053-8119}, + url = {http://dx.doi.org/10.1016/j.neuroimage.2019.05.026}, + DOI = {10.1016/j.neuroimage.2019.05.026}, + journal = {NeuroImage}, + publisher = {Elsevier BV}, + author = {Pion-Tonachini, Luca and Kreutz-Delgado, Ken and Makeig, Scott}, + year = {2019}, + month = sep, + pages = {181–197} } Future versions of the software are aimed at improved models and may have different papers associated with it. From a419b2f2d0835767ba196660d4f9fe76313b4795 Mon Sep 17 00:00:00 2001 From: Mathieu Scheltienne Date: Mon, 18 Nov 2024 14:51:29 +0100 Subject: [PATCH 07/10] improve --- doc/api/iclabel.rst | 3 --- doc/cite.rst | 46 +++++++++++++++++++++++++++++++++++++++++++++ doc/index.rst | 1 + doc/references.bib | 12 ++++++++++++ 4 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 doc/cite.rst diff --git a/doc/api/iclabel.rst b/doc/api/iclabel.rst index cb0c8515..76b2d2d9 100644 --- a/doc/api/iclabel.rst +++ b/doc/api/iclabel.rst @@ -51,9 +51,6 @@ paper\ :footcite:p:`PionTonachini2019`. .. footbibliography:: -.. dropdown:: BibTeX for ICLabel - :color: info - .. code-block:: @article{PionTonachini2019, diff --git a/doc/cite.rst b/doc/cite.rst new file mode 100644 index 00000000..950ed239 --- /dev/null +++ b/doc/cite.rst @@ -0,0 +1,46 @@ +Cite +==== + +If you use ``mne-icalabel``, please consider citing our paper\ :footcite:p:`Li2022`. + +.. footbibliography:: + +.. code-block:: + + @article{Li2022, + title = {MNE-ICALabel: Automatically annotating ICA components with ICLabel in Python}, + volume = {7}, + ISSN = {2475-9066}, + url = {http://dx.doi.org/10.21105/joss.04484}, + DOI = {10.21105/joss.04484}, + number = {76}, + journal = {Journal of Open Source Software}, + publisher = {The Open Journal}, + author = {Li, Adam and Feitelberg, Jacob and Saini, Anand Prakash and H\"{o}chenberger, Richard and Scheltienne, Mathieu}, + year = {2022}, + month = aug, + pages = {4484} + } + +And the paper of the associated model. + +ICLabel\ :footcite:p:`PionTonachini2019` +---------------------------------------- + +.. footbibliography:: + +.. code-block:: + + @article{PionTonachini2019, + title = {ICLabel: An automated electroencephalographic independent component classifier, dataset, and website}, + volume = {198}, + ISSN = {1053-8119}, + url = {http://dx.doi.org/10.1016/j.neuroimage.2019.05.026}, + DOI = {10.1016/j.neuroimage.2019.05.026}, + journal = {NeuroImage}, + publisher = {Elsevier BV}, + author = {Pion-Tonachini, Luca and Kreutz-Delgado, Ken and Makeig, Scott}, + year = {2019}, + month = sep, + pages = {181–197} + } diff --git a/doc/index.rst b/doc/index.rst index b5711d36..a98a14cc 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -38,3 +38,4 @@ Contents install api/index generated/examples/index + cite diff --git a/doc/references.bib b/doc/references.bib index 44c157f8..274e4506 100644 --- a/doc/references.bib +++ b/doc/references.bib @@ -1,3 +1,15 @@ +@article{Li2022, + author = {Li, Adam and Feitelberg, Jacob and Saini, Anand Prakash and H\"{o}chenberger, Richard and Scheltienne, Mathieu}, + doi = {10.21105/joss.04484}, + journal = {Journal of Open Source Software}, + month = {August}, + number = {76}, + pages = {4484}, + title = {MNE-ICALabel: Automatically annotating ICA components with ICLabel in Python}, + volume = {7}, + year = {2022} +} + @article{PionTonachini2019, author = {Pion-Tonachini, Luca and Kreutz-Delgado, Ken and Makeig, Scott}, doi = {10.1016/j.neuroimage.2019.05.026}, From e08f66673a46b00b3007b12bf1703a715375d4ea Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 18 Nov 2024 13:53:33 +0000 Subject: [PATCH 08/10] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- doc/_static/style.css | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/_static/style.css b/doc/_static/style.css index 70735d9c..c1b52f0a 100644 --- a/doc/_static/style.css +++ b/doc/_static/style.css @@ -23,9 +23,9 @@ html[data-theme="light"] { /* ↓↓↓ use "warning" colors for "secondary" */ --pst-color-secondary: var(--pst-color-warning); --pst-color-secondary-bg: var(--pst-color-warning-bg); - /* ↓↓↓ make sure new primary (link) color propogates to links on code */ + /* ↓↓↓ make sure new primary (link) color propagates to links on code */ --pst-color-inline-code-links: var(--pst-color-link); - /* ↓↓↓ make sure new secondary (hover) color propogates to hovering on table rows */ + /* ↓↓↓ make sure new secondary (hover) color propagates to hovering on table rows */ --pst-color-table-row-hover-bg: var(--pst-color-secondary-bg); /* topbar logo links */ --mne-color-github: #000; @@ -55,9 +55,9 @@ html[data-theme="dark"] { /* ↓↓↓ use "warning" colors for "secondary" */ --pst-color-secondary: var(--pst-color-warning); --pst-color-secondary-bg: var(--pst-color-warning-bg); - /* ↓↓↓ make sure new primary (link) color propogates to links on code */ + /* ↓↓↓ make sure new primary (link) color propagates to links on code */ --pst-color-inline-code-links: var(--pst-color-link); - /* ↓↓↓ make sure new secondary (hover) color propogates to hovering on table rows */ + /* ↓↓↓ make sure new secondary (hover) color propagates to hovering on table rows */ --pst-color-table-row-hover-bg: var(--pst-color-secondary-bg); /* topbar logo links */ --mne-color-github: rgb(240, 246, 252); /* from their logo SVG */ From 068df31d053a3e0f79b83156d4d5baa6fdf86a62 Mon Sep 17 00:00:00 2001 From: Mathieu Scheltienne Date: Mon, 18 Nov 2024 14:54:41 +0100 Subject: [PATCH 09/10] fix readme --- README.md | 58 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index c16907e2..8082223f 100644 --- a/README.md +++ b/README.md @@ -86,37 +86,41 @@ your question. If you use the ``mne-icalabel``, please consider citing our paper: - @article{Li2022, - title = {MNE-ICALabel: Automatically annotating ICA components with ICLabel in Python}, - volume = {7}, - ISSN = {2475-9066}, - url = {http://dx.doi.org/10.21105/joss.04484}, - DOI = {10.21105/joss.04484}, - number = {76}, - journal = {Journal of Open Source Software}, - publisher = {The Open Journal}, - author = {Li, Adam and Feitelberg, Jacob and Saini, Anand Prakash and H\"{o}chenberger, Richard and Scheltienne, Mathieu}, - year = {2022}, - month = aug, - pages = {4484} - } +``` +@article{Li2022, + title = {MNE-ICALabel: Automatically annotating ICA components with ICLabel in Python}, + volume = {7}, + ISSN = {2475-9066}, + url = {http://dx.doi.org/10.21105/joss.04484}, + DOI = {10.21105/joss.04484}, + number = {76}, + journal = {Journal of Open Source Software}, + publisher = {The Open Journal}, + author = {Li, Adam and Feitelberg, Jacob and Saini, Anand Prakash and H\"{o}chenberger, Richard and Scheltienne, Mathieu}, + year = {2022}, + month = aug, + pages = {4484} +} +``` And the paper associated to the model used: - **ICLabel** - @article{PionTonachini2019, - title = {ICLabel: An automated electroencephalographic independent component classifier, dataset, and website}, - volume = {198}, - ISSN = {1053-8119}, - url = {http://dx.doi.org/10.1016/j.neuroimage.2019.05.026}, - DOI = {10.1016/j.neuroimage.2019.05.026}, - journal = {NeuroImage}, - publisher = {Elsevier BV}, - author = {Pion-Tonachini, Luca and Kreutz-Delgado, Ken and Makeig, Scott}, - year = {2019}, - month = sep, - pages = {181–197} - } +``` +@article{PionTonachini2019, + title = {ICLabel: An automated electroencephalographic independent component classifier, dataset, and website}, + volume = {198}, + ISSN = {1053-8119}, + url = {http://dx.doi.org/10.1016/j.neuroimage.2019.05.026}, + DOI = {10.1016/j.neuroimage.2019.05.026}, + journal = {NeuroImage}, + publisher = {Elsevier BV}, + author = {Pion-Tonachini, Luca and Kreutz-Delgado, Ken and Makeig, Scott}, + year = {2019}, + month = sep, + pages = {181–197} +} +``` Future versions of the software are aimed at improved models and may have different papers associated with it. From b80d0255337783516cb29fdf6b5b3ded3707e5f3 Mon Sep 17 00:00:00 2001 From: Mathieu Scheltienne Date: Mon, 18 Nov 2024 15:06:11 +0100 Subject: [PATCH 10/10] better --- doc/api/index.rst | 2 +- mne_icalabel/iclabel/network/__init__.py | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/doc/api/index.rst b/doc/api/index.rst index 2d5aac87..843bf524 100644 --- a/doc/api/index.rst +++ b/doc/api/index.rst @@ -22,7 +22,7 @@ label the components using the specified method/model. Models ------ -.. card-carousel:: 2 +.. card-carousel:: 4 .. card:: ICLabel :link: iclabel.html diff --git a/mne_icalabel/iclabel/network/__init__.py b/mne_icalabel/iclabel/network/__init__.py index 421a4f03..661882e9 100644 --- a/mne_icalabel/iclabel/network/__init__.py +++ b/mne_icalabel/iclabel/network/__init__.py @@ -21,7 +21,8 @@ def run_iclabel( """Run the ICLabel network on the provided set of features. The features are un-formatted and are as-returned by - `~mne_icalabel.iclabel.get_iclabel_features`. + `~mne_icalabel.iclabel.get_iclabel_features`. For more information, + see :footcite:t:`PionTonachini2019`. Parameters ---------- @@ -41,6 +42,10 @@ def run_iclabel( The predicted numerical probability values for all labels in ICLabel output. Columns are ordered with ``'Brain'``, ``'Muscle'``, ``'Eye'``, ``'Heart'``, ``'Line Noise'``, ``'Channel Noise'``, and ``'Other'``. + + References + ---------- + .. footbibliography:: """ _check_option("backend", backend, (None, "torch", "onnx")) if backend is None: