A flexible artifact correction and evaluation toolbox to correct eeg data
Project description
FACETpy - EEG-Data Correction Framework
A Python toolbox for correcting EEG artifacts using Averaged Artifact Subtraction (AAS) and other advanced methods. Built on MNE-Python.
Explore FACETpy docs »
Report bug
·
Request feature
·
Documentation
Built on MNE-Python, FACETpy provides a modular pipeline architecture that lets researchers process, evaluate, and compare correction results with minimal code.
Key features
- Load EEG from EDF, GDF, and BIDS formats
- Artifact correction: AAS, PCA, Adaptive Noise Cancellation (ANC)
- Full evaluation suite: SNR, RMS, Median Artifact, FFT-based metrics
- Batch processing across subjects/sessions with
Pipeline.map() - Generate synthetic EEG for algorithm testing
- Rich progress display in the terminal
Supported artifacts
| Artifact | Origin | Correction methods |
|---|---|---|
| Gradient artifact (GA) | MRI scanner gradient switching during simultaneous EEG-fMRI | AAS, PCA |
| Ballistocardiogram (BCG) | Cardiac-induced electrode movements in the MRI magnetic field | AAS (after BCG detection), PCA |
| Cardioballistic / pulse artifact | Pulsatile skin/vessel movement under electrodes | BCG detector + AAS |
| Motion artifact | Head movement, cable pull, electrode shift | Preprocessing filters, PCA |
| Power-line noise (50/60 Hz) | Electrical mains interference | Notch filter (via MNE preprocessing) |
| Muscle (EMG) artifact | Jaw, neck muscle activity contaminating high-frequency EEG | High-frequency filtering, PCA |
| Amplifier saturation / drift | Slow DC drift or clipping from long recordings | Baseline correction, filtering |
For a detailed description of use cases (EEG-fMRI research, batch studies, benchmarking, clinical pipelines, and more) see the Use Cases & Supported Artifacts page in the documentation.
Quick start
Quick installation from PyPI (requires Python 3.11/3.12/3.13):
pip install facetpy
Strongly recommended for fast ANC performance:
python -m facet.build
For the Full Setup + Early Access to features (Repository, Examples, Contributing):
Unix (WSL/macOS/Linux) - bootstrap shortcut:
curl -fsSL https://raw.githubusercontent.com/H0mire/facetpy/main/scripts/bootstrap.sh | sh
cd facetpy
Preview
from facet import (
Pipeline, Loader, EDFExporter,
TriggerDetector, UpSample, DownSample, AASCorrection,
)
pipeline = Pipeline([
Loader(path="data.edf", preload=True),
TriggerDetector(regex=r"\b1\b"),
UpSample(factor=10),
AASCorrection(window_size=30),
DownSample(factor=10),
EDFExporter(path="corrected.edf", overwrite=True),
], name="Quickstart")
result = pipeline.run()
result.print_summary() # Done in 4.2s snr=18.3 rms_ratio=0.14
Installation
Requires Python 3.11, 3.12, or 3.13. For normal usage, Poetry is not required.
Normal usage (recommended): install from PyPI
pip install facetpy
The package name on PyPI is facetpy; import it in Python as facet.
Contributing setup (source + Poetry)
Poetry is required for contribution workflows (tests, linting, docs).
Unix (macOS/Linux) - bootstrap shortcut (installs poetry):
curl -fsSL https://raw.githubusercontent.com/H0mire/facetpy/main/scripts/bootstrap.sh | sh
cd facetpy
Unix (macOS/Linux) - existing clone (installs peotry):
./scripts/install.sh
Other platforms (including Windows) with Poetry installed:
git clone https://github.com/H0mire/facetpy.git
cd facetpy
poetry install --no-interaction
The Unix ./scripts/install.sh script:
- checks for Python 3.11/3.12/3.13
- checks whether Poetry is installed
- asks whether Poetry should be installed if missing
- runs
poetry install --no-interaction
The bootstrap script:
- clones FACETpy into
./facetpy - runs
./scripts/install.shinside that clone
Manual Poetry installation (contributors):
# 1 — verify Python
python --version
# 2 — install Poetry (pick one)
pipx install poetry
# or: pip install --user poetry
# 3 — install repository dependencies
poetry install --no-interaction
Optional contributor extras:
poetry install -E deeplearning # TensorFlow-based models
poetry install -E notebooks # Jupyter notebook support
poetry install -E gui # PyQt6 GUI components
poetry install -E docs # Sphinx documentation toolchain
poetry install -E all # everything above
Run contributor commands with poetry run ... (for example, poetry run pytest).
Build the C extension (strongly recommended for ANC)
The fast Adaptive Noise Cancellation (ANC) path is significantly faster with the compiled FastRANC C extension. Build it once after installing.
Without Poetry:
python -m facet.build
With Poetry:
poetry run build-fastranc
If the extension is not compiled, ANC uses a slower Python fallback and the rest of the toolbox still works.
Running the examples
All examples are in the examples/ folder and use the bundled
NiazyFMRI.edf dataset.
To run repository examples, clone the repository and install FACETpy in your active Python environment (no Poetry required):
git clone https://github.com/H0mire/facetpy.git
cd facetpy
pip install facetpy
Then run from the project root:
# Recommended order for new users:
python examples/quickstart.py # minimal pipeline
python examples/evaluation.py # metrics & comparison
python examples/advanced_workflows.py # conditional, parallel, factory
python examples/batch_processing.py # multiple files at once
python examples/inline_steps.py # custom steps & pipe operator
python examples/complete_pipeline_example.py # full clinical pipeline
python examples/eeg_generation_visualization_example.py # synthetic EEG
Testing
# Run the full test suite
poetry run pytest
# Only fast unit tests (skip slow integration tests)
poetry run pytest -m "not slow"
# A single test file
poetry run pytest tests/test_core_pipeline.py -v
# With coverage report
poetry run pytest --cov=facet --cov-report=html
Open the coverage report:
python -m webbrowser htmlcov/index.html
Documentation
# Install docs dependencies
poetry install -E docs
# Build HTML docs
poetry run sphinx-build -b html docs/source docs/build
Open docs locally:
python -m webbrowser docs/build/index.html
Full online documentation: https://facetpy.readthedocs.io/
For comprehensive build instructions, theme configuration, and contribution guidelines see docs/README.md.
For PyPI release steps, see RELEASING.md.
Contributing
Contributing uses the source/Poetry workflow. See installation guide above.
Use ./scripts/install.sh on Unix, otherwise run poetry install --no-interaction.
Follow docs/source/development/contributing.rst for the full setup and checks.
Project structure
src/facet/
├── core/ Pipeline, Processor, ProcessingContext, BatchResult
├── io/ Loader, BIDSLoader, EDFExporter, BIDSExporter
├── preprocessing/ Filters, Resample, TriggerDetector, Alignment, Transforms
├── correction/ AASCorrection, PCACorrection, ANCCorrection
├── evaluation/ SNRCalculator, RMSCalculator, MetricsReport, RawPlotter
├── misc/ EEGGenerator (synthetic data)
└── pipelines.py create_standard_pipeline() factory
examples/
├── quickstart.py minimal pipeline
├── evaluation.py metrics & comparison
├── advanced_workflows.py conditional, parallel, factory
├── batch_processing.py multiple files
├── inline_steps.py custom steps & pipe operator
├── complete_pipeline_example.py full clinical pipeline
└── eeg_generation_visualization_example.py synthetic EEG
VS Code Tasks
Tasks are defined in .vscode/tasks.json and can be run via Ctrl+Shift+P → Tasks: Run Task.
| Task | Shortcut | Description |
|---|---|---|
| Test: Run All | default test task | Full test suite with coverage report |
| Test: Run Current File | Run pytest on the file open in the editor | |
| Test: Unit Only | Only tests marked @pytest.mark.unit |
|
| Test: Integration Only | Only tests marked @pytest.mark.integration |
|
| Test: Skip Slow | All tests except those marked @pytest.mark.slow |
|
| Test: Show Coverage Report | Open htmlcov/index.html in the browser |
|
| Lint: Check (Ruff) | Check src/ and tests/ for lint errors |
|
| Lint: Fix (Ruff) | Auto-fix lint errors in place | |
| Format: Check (Ruff) | Verify formatting without changing files | |
| Format: Apply (Ruff) | Apply ruff formatting to src/ and tests/ |
|
| Build: FastRANC C Extension | Compile the FastRANC C extension | |
| Build: Install Dependencies | poetry install |
|
| Build: Install All Extras | poetry install -E all |
|
| Build: Update Dependencies | poetry update |
|
| Docs: Build HTML | Build Sphinx documentation | |
| Docs: Open in Browser | Open the built docs in the browser | |
| Docs: Build & Open | Build docs and open immediately | |
| Run: Current Python File | Execute the file open in the editor | |
| Review: Uncommitted Changes (Codex) | Codex AI review of all local changes | |
| Review: Against Branch (Codex) | Codex AI review against a selected base branch (prompts for branch) | |
| QA: Full Check (Lint + Format + Test) | Lint + format check + full test suite in sequence |
License
GPLv3 — see LICENSE for details.
Author: Janik Michael Mueller
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file facetpy-2.0.2.tar.gz.
File metadata
- Download URL: facetpy-2.0.2.tar.gz
- Upload date:
- Size: 164.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
87ab5634e5f1c0e42fc9e0a152d90c44adef09b528c7263ecc3a134c34b089f9
|
|
| MD5 |
714ec167342a582e2f834399519569bd
|
|
| BLAKE2b-256 |
e8e8beeeb7da24d5f88f9b15d66bb1b5fd86a8495f805da37206aa5e2ada3d3d
|
Provenance
The following attestation bundles were made for facetpy-2.0.2.tar.gz:
Publisher:
publish.yml on H0mire/FACETpy
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
facetpy-2.0.2.tar.gz -
Subject digest:
87ab5634e5f1c0e42fc9e0a152d90c44adef09b528c7263ecc3a134c34b089f9 - Sigstore transparency entry: 1018603028
- Sigstore integration time:
-
Permalink:
H0mire/FACETpy@cbfc7f4c478bb368d13d46c02c3fc38537d9f9f4 -
Branch / Tag:
refs/tags/v2.0.2 - Owner: https://github.com/H0mire
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@cbfc7f4c478bb368d13d46c02c3fc38537d9f9f4 -
Trigger Event:
push
-
Statement type:
File details
Details for the file facetpy-2.0.2-py3-none-any.whl.
File metadata
- Download URL: facetpy-2.0.2-py3-none-any.whl
- Upload date:
- Size: 191.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5bcca535c12a7830775c3c091338ec6be633e954141bcdaa57a4582ed3ae21f0
|
|
| MD5 |
f03b44b3c8a1864dc66e5a721f56a856
|
|
| BLAKE2b-256 |
d86093a5abbfb51e42891dfbae04754ad60be9f97b037b98a99231710b00442f
|
Provenance
The following attestation bundles were made for facetpy-2.0.2-py3-none-any.whl:
Publisher:
publish.yml on H0mire/FACETpy
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
facetpy-2.0.2-py3-none-any.whl -
Subject digest:
5bcca535c12a7830775c3c091338ec6be633e954141bcdaa57a4582ed3ae21f0 - Sigstore transparency entry: 1018603077
- Sigstore integration time:
-
Permalink:
H0mire/FACETpy@cbfc7f4c478bb368d13d46c02c3fc38537d9f9f4 -
Branch / Tag:
refs/tags/v2.0.2 - Owner: https://github.com/H0mire
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@cbfc7f4c478bb368d13d46c02c3fc38537d9f9f4 -
Trigger Event:
push
-
Statement type: