diff --git a/.github/workflows/pr-preview.yml b/.github/workflows/pr-preview.yml new file mode 100644 index 0000000..9cbfcd7 --- /dev/null +++ b/.github/workflows/pr-preview.yml @@ -0,0 +1,22 @@ +name: PR Preview + +on: + pull_request: + types: [opened, synchronize, reopened, closed] + +permissions: + contents: write + pull-requests: write + +jobs: + preview: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: rossjrw/pr-preview-action@v1.8.1 + with: + source-dir: . + preview-branch: gh-pages + umbrella-dir: pr-preview + action: auto diff --git a/index.html b/index.html new file mode 100644 index 0000000..1f0a180 --- /dev/null +++ b/index.html @@ -0,0 +1,326 @@ + + + + + + + DCEASY — Dynamic Contrast-Enhanced Analysis SYstem + + + + +
+
+

DCE Processing Tools

+

DCEASY

+

(Dynamic Contrast-Enhanced + Analysis SYstem)

+
+
+ +
+ +
+

+ DCEASY is a collection of open-source software maintained by the + PET/MRI Lab + for end-to-end Dynamic Contrast-Enhanced (DCE) MRI workflows — + from parametric mapping and pharmacokinetic modeling to arterial input function (AIF) detection. + Choose the tool that fits your step in the pipeline below. +

+
+ +
+

DCE Processing Overview

+ +

Run the whole pipeline at once

+
+
+ DCEPrep + Automated & Dockerized — preprocessing through quality control and analysis (steps 1–5) +
+
+ +

…or run it step by step

+
    +
  1. 1 Preprocessing → standard MRI tools (FSL, ANTs, etc.)
  2. +
  3. 2 Generate T1 maps → parametric_scripts
  4. +
  5. 3 Extract an AIF → AutoAIF (automatic) / AIFArtist (manual)
  6. +
  7. 4 Signal intensity to concentration, fit pharmacokinetic models (Ktrans, ve, vp …) → ROCKETSHIP + Gpufit
  8. +
  9. 5 Analyze & compare parametric maps → ROCKETSHIP
  10. +
+
+ +
+

Tools

+ +
+ + +
+
+

ROCKETSHIP

+ MATLAB +
+

+ A flexible, GUI-driven suite for full DCE-MRI analysis. Covers pre-contrast + T1 mapping, AIF selection and fitting, multi-model pharmacokinetic curve + fitting (Tofts, Extended Tofts, Patlak, Two-Compartment Exchange, FXR, …), + and results visualization. Supports NIFTI and DICOM inputs and optional + GPU acceleration. +

+
    +
  • Tofts, Extended Tofts, Patlak, 2CXM, FXR, tissue-uptake models
  • +
  • GUI-based workflow — no scripting required
  • +
  • Batch processing via parallel computing toolbox
  • +
  • Optional GPU acceleration (Gpufit)
  • +
  • Cited in BMC Medical Imaging
  • +
+ +
+ + +
+
+

AutoAIF

+ Python +
+

+ Preferred for AIF detection. A 3D U-Net deep-learning model (Keras/TensorFlow) + that automatically detects the arterial input function in brain DCE-MRI. + Pretrained weights are provided; the model handles multi-site data by + resampling inputs to a canonical resolution and outputs a vascular + function curve together with a 3D vascular mask. +

+
    +
  • Fully automatic — no manual ROI drawing required
  • +
  • Pretrained on multi-site brain DCE-MRI cohorts
  • +
  • Outputs vascular function curve + 3D mask (NIfTI)
  • +
  • Supports inference and fine-tuning on new datasets
  • +
  • Published in Magnetic Resonance in Medicine (2025)
  • +
+ +
+ + +
+
+

AIFArtist

+ Python +
+

+ A napari desktop application for manual arterial input function (AIF) + annotation on 4D MRI NIfTI data. Designed for high-volume multi-rater + review sessions: draw a 3D ROI, inspect the mean signal-intensity + curve over time, save a BIDS-style derivative, and jump straight to + the next case. +

+
    +
  • Loads BIDS-compliant 4D desc-hmc_DCE.nii[.gz] files, directories, or manifest lists
  • +
  • Live ROI curve preview with per-label and normalized views
  • +
  • BIDS-style derivative outputs with rater ID embedded in filenames
  • +
  • Auto-resumes at first unreviewed case; prefetches next image
  • +
  • Flag-and-skip for poor AIFs or missing baselines
  • +
+ +
+ + +
+
+

parametric_scripts

+ MATLAB +
+

+ The ROCKETSHIP parametric mapping module, also usable as a + stand-alone tool. Generates T1, T2, T2*, and ADC maps from + multi-echo or inversion-recovery NIFTI series — a required + pre-processing step for accurate DCE pharmacokinetic modeling. +

+
    +
  • T1 (inversion recovery), T2, T2*, and ADC map generation
  • +
  • GUI-based interface (fitting_gui)
  • +
  • Batch processing and parallel fitting support
  • +
  • NIFTI and DICOM input support
  • +
+ +
+ + +
+
+

Gpufit

+ CUDA / C++ +
+

+ A GPU-accelerated Levenberg–Marquardt curve-fitting library with + Python and MATLAB wrappers. This PET/MRI Lab fork adds MRI-specific + pharmacokinetic models and updated compiler/CUDA support. Used by + ROCKETSHIP for fast voxel-wise model fitting. +

+
    +
  • Patlak, Tofts, Extended Tofts, Tissue Uptake, 2CXM, T1 FA Exponential
  • +
  • Full GPU (Gpufit) and CPU (Cpufit) parity for all MRI models
  • +
  • Pre-built binaries for Windows, Linux (CUDA 11.8–13.0), and macOS (CPU)
  • +
  • Python and MATLAB wrappers included
  • +
  • Based on Przybylski et al., Scientific Reports (2017)
  • +
+ +
+ + +
+
+

DCEPrep

+ Shell / Python +
+

+ An end-to-end preprocessing and analysis pipeline for brain DCE-MRI. + Wraps FSL, ANTs, FreeSurfer, ROCKETSHIP, and AutoAIF into a single + configurable shell script. Handles VFA-based T1 mapping, bias field + correction, z-axis normalization, head motion correction, AIF + selection, Ktrans fitting, and automated QC reporting. A Docker + image is provided for a consistent, reproducible environment. +

+
    +
  • BIDS-compliant input/output
  • +
  • VFA T1 mapping, bias field correction, z-axis normalization
  • +
  • Head motion correction via FSL mcflirt
  • +
  • AutoAIF integration for automatic AIF detection
  • +
  • Ktrans / vp mapping + per-case & population HTML QC reports
  • +
  • Docker image available for easy, reproducible deployment
  • +
+ +
+ +
+
+ +
+

Which tool do I need?

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TaskTool
Automated complete processing pipeline of BIDS DCE data (motion correction, alignment, artifact correction, create T1 maps, AIF detection, pharmacokinetic fitting, QC)DCEPrep
Automated preprocessing only of BIDS DCE data (motion correction, alignment, artifact correction)DCEPrep
Generate T1, T2, or ADC mapsparametric_scripts
AIF identification, automatically with deep learning (preferred)AutoAIF
AIF identification, manually draw and save an AIF ROI (multi-rater)AIFArtist
Scripted low level fast pharmacokinetic model fitting (useful to accelerate other DCE processing pipelines)Gpufit
DCE processing with GUIROCKETSHIP
Visualize and compare fit quality and parametric mapsROCKETSHIP (Module E)
+
+
+ +
+

Quick start

+
+
+

ROCKETSHIP

+
# Clone (includes submodules)
+git clone --recursive \
+  https://github.com/petmri/ROCKETSHIP.git
+
+# In MATLAB, add ROCKETSHIP to the path, then:
+run_parametric   % Step 1 — T1 maps
+run_dce          % Step 2 — DCE fitting
+
+
+

AutoAIF

+
# Clone and set up environment
+git clone https://github.com/petmri/AutoAIF.git
+cd AutoAIF
+python3 -m venv tf && source tf/bin/activate
+pip install -r requirements.txt
+
+# Run inference with pretrained weights
+python main_vif.py --mode inference \
+  --input_path /path/to/dce.nii.gz \
+  --model_weight_path /path/to/weight.h5 \
+  --save_output_path /path/to/output/
+
+
+

AIFArtist

+
# Clone and install dependencies
+git clone https://github.com/petmri/AIFArtist.git
+cd AIFArtist
+pip install -r requirements.txt
+
+# Launch the annotation app
+python aif_artist.py /path/to/bids_dataset \
+  --rater AB
+
+
+
+ +
+

Contact & contributing

+

+ Questions? Open an issue on the relevant repository or contact the lab + maintainer at sabarnes@llu.edu. + Contributions via pull request are welcome on all repositories. +

+

+ View all repositories → +

+
+ +
+ + + + + diff --git a/styles.css b/styles.css new file mode 100644 index 0000000..e210362 --- /dev/null +++ b/styles.css @@ -0,0 +1,388 @@ +/* ===== Reset & base ===== */ +*, *::before, *::after { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +html { + font-size: 16px; + scroll-behavior: smooth; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; + color: #c0c0c0; + background: #151515; + line-height: 1.65; +} + +a { + color: #63c0f5; + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +/* ===== Header ===== */ +header { + background: linear-gradient(135deg, #090d14 0%, #0d1f3c 60%, #162d55 100%); + color: #fff; + padding: 3rem 1.5rem 2.5rem; + text-align: center; + border-bottom: 2px solid #252525; +} + +.header-inner { + max-width: 860px; + margin: 0 auto; +} + +header h1 { + font-size: clamp(2.4rem, 5vw, 4rem); + font-weight: 800; + letter-spacing: -0.02em; + margin-bottom: 0.5rem; + color: #fff; +} + +.tagline { + font-size: clamp(1rem, 2.5vw, 1.25rem); + opacity: 0.80; + max-width: 600px; + margin: 0 auto; +} + +/* ===== Main layout ===== */ +main { + max-width: 960px; + margin: 0 auto; + padding: 0 1.5rem 4rem; +} + +section { + margin-top: 3rem; +} + +section h2 { + font-size: 1.5rem; + font-weight: 700; + color: #e8e8e8; + margin-bottom: 1rem; + padding-bottom: 0.4rem; + border-bottom: 3px solid #63c0f5; + display: inline-block; +} + +/* ===== Intro ===== */ +.intro p { + font-size: 1.05rem; + max-width: 780px; +} + +/* ===== Pipeline: two paths ===== */ +.path-label { + font-size: 0.8rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.07em; + color: #63c0f5; + margin: 1.75rem 0 0.85rem; +} + +.path-label:first-of-type { + margin-top: 0.5rem; +} + +.end-to-end { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); + gap: 1rem; +} + +.e2e-tool { + background: #1e1e1e; + border: 1px solid #2a2a2a; + border-left: 3px solid #63c0f5; + border-radius: 8px; + padding: 0.85rem 1.1rem; + display: flex; + flex-direction: column; + gap: 0.3rem; +} + +.e2e-tool strong { + color: #e8e8e8; + font-size: 1.05rem; +} + +.e2e-tool span { + font-size: 0.88rem; + color: #999; +} + +/* ===== Pipeline steps ===== */ +.steps { + list-style: none; + display: flex; + flex-direction: column; + gap: 0.6rem; + padding-left: 0; +} + +.steps li { + display: flex; + align-items: center; + gap: 0.75rem; + font-size: 1rem; +} + +.step-num { + display: inline-flex; + align-items: center; + justify-content: center; + width: 2rem; + height: 2rem; + border-radius: 50%; + background: #63c0f5; + color: #151515; + font-weight: 700; + font-size: 0.9rem; + flex-shrink: 0; +} + +/* ===== Tool cards ===== */ +.cards { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); + gap: 1.5rem; +} + +.card { + background: #1e1e1e; + border-radius: 12px; + border: 1px solid #2a2a2a; + box-shadow: 0 2px 12px rgba(0,0,0,0.4); + display: flex; + flex-direction: column; + overflow: hidden; + transition: box-shadow 0.2s, border-color 0.2s; +} + +.card:hover { + box-shadow: 0 6px 24px rgba(0,0,0,0.6); + border-color: #63c0f5; +} + +.card-header { + padding: 1.1rem 1.25rem 0.9rem; + display: flex; + align-items: center; + justify-content: space-between; + color: #fff; +} + +.card-header h3 { + font-size: 1.2rem; + font-weight: 700; +} + +.card-header.rocketship { background: #0d1f3c; } +.card-header.aifartist { background: #0d2233; } +.card-header.autoaif { background: #0a2318; } +.card-header.parametric { background: #0e1b2e; } +.card-header.gpufit { background: #1c0d2e; } +.card-header.dceprep { background: #0e2b2b; } + +.badge { + font-size: 0.7rem; + font-weight: 600; + padding: 0.2rem 0.55rem; + border-radius: 999px; + text-transform: uppercase; + letter-spacing: 0.05em; +} + +.badge.matlab { background: #c0392b; color: #fff; } +.badge.python { background: #b7770d; color: #fff; } +.badge.cuda { background: #4a7c00; color: #fff; } +.badge.shell { background: #2c6e49; color: #fff; } + +.card-desc { + padding: 1rem 1.25rem 0.5rem; + font-size: 0.92rem; + flex: 1; + color: #b8b8b8; +} + +.card-highlights { + padding: 0.25rem 1.25rem 0.75rem 2.5rem; + font-size: 0.85rem; + color: #888; + display: flex; + flex-direction: column; + gap: 0.3rem; +} + +.card-highlights code { + font-size: 0.8rem; + background: #2a2a2a; + border-radius: 4px; + padding: 0.05em 0.3em; + color: #63c0f5; +} + +.card-links { + padding: 0.75rem 1.25rem 1.1rem; + display: flex; + flex-wrap: wrap; + gap: 0.5rem; + border-top: 1px solid #2a2a2a; +} + +/* ===== Buttons ===== */ +.btn { + display: inline-block; + padding: 0.4rem 0.9rem; + border-radius: 6px; + font-size: 0.85rem; + font-weight: 600; + transition: background 0.15s, color 0.15s; + text-decoration: none; +} + +.btn.primary { + background: #63c0f5; + color: #111; +} + +.btn.primary:hover { + background: #89d0f8; + text-decoration: none; +} + +.btn.secondary { + background: #2a2a2a; + color: #c0c0c0; +} + +.btn.secondary:hover { + background: #363636; + text-decoration: none; +} + +/* ===== Comparison table ===== */ +.table-wrap { + overflow-x: auto; +} + +table { + width: 100%; + border-collapse: collapse; + font-size: 0.95rem; + background: #1e1e1e; + border-radius: 10px; + overflow: hidden; + box-shadow: 0 2px 10px rgba(0,0,0,0.4); +} + +thead { + background: #0d1f3c; + color: #fff; +} + +th, td { + padding: 0.75rem 1.1rem; + text-align: left; +} + +td { + color: #b8b8b8; + border-bottom: 1px solid #2a2a2a; +} + +tbody tr:nth-child(even) { + background: #242424; +} + +tbody tr:hover { + background: #2c2c2c; +} + +/* ===== Quick start ===== */ +.qs-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); + gap: 1.25rem; +} + +.qs-block { + background: #1e1e1e; + border-radius: 10px; + overflow: hidden; + border: 1px solid #2a2a2a; + box-shadow: 0 2px 10px rgba(0,0,0,0.4); +} + +.qs-block h3 { + background: #0d1f3c; + color: #fff; + padding: 0.65rem 1rem; + font-size: 1rem; +} + +.qs-block pre { + margin: 0; + padding: 1rem; + overflow-x: auto; + font-size: 0.82rem; + background: #111111; + color: #cdd6f4; + line-height: 1.6; +} + +.qs-block code { + font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace; +} + +/* ===== Contact ===== */ +.contact p { + margin-bottom: 0.75rem; + font-size: 1rem; +} + +/* ===== Footer ===== */ +footer { + text-align: center; + padding: 1.5rem; + font-size: 0.85rem; + color: #555; + border-top: 1px solid #252525; + margin-top: 2rem; +} + +footer a { + color: #555; +} + +footer a:hover { + color: #63c0f5; +} + +/* ===== Responsive ===== */ +@media (max-width: 600px) { + .cards { + grid-template-columns: 1fr; + } + + .qs-grid { + grid-template-columns: 1fr; + } + + .steps li { + font-size: 0.95rem; + } +} +