Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
91 commits
Select commit Hold shift + click to select a range
4674989
Feat: integrate advanced stats automation and auto-pilot GUI
Mar 17, 2026
ac09d25
Refine plot mastering workflow and clean workspace
Mar 18, 2026
9675788
Harden advanced nonparametric ANOVA fallback and reporting
philippkrumm Mar 19, 2026
a9be076
new non parametric anovas and new plot aesthetics window. changes are…
Mar 20, 2026
fcbeed3
Refactor: 4-Punkt-Roadmap — Audit, Validation, Smoke-Test, Import-Cle…
philippkrumm Mar 20, 2026
7cb3dcc
Chore: Add project tooling and update .gitignore
philippkrumm Mar 20, 2026
bdba332
Remove redundant Advanced Tests menu entry
philippkrumm Mar 20, 2026
3dcc651
UI Overhaul: Refactoring UI principles applied
philippkrumm Mar 20, 2026
a7026bf
Feat: Clinical Models — ANCOVA, LMM, Logistic Regression
Mar 21, 2026
0f4eaa0
Validation: Numerical benchmark suite — 12/12 checks externally verified
Mar 21, 2026
2a20720
Feat: Effect size coverage — fix Wilcoxon r, add Welch Cohen's f, ful…
Mar 21, 2026
0165ca6
Chore: Update path references Source_Code/ → src/ and bump version to…
Mar 21, 2026
398c187
Feat: UI overhaul, validation suite, nonparametric ANOVAs, effect siz…
philippkrumm Mar 26, 2026
9f198a5
Merge: integrate remote src/ refactor with local UI + validation changes
philippkrumm Mar 26, 2026
502c9db
Chore: Add PyInstaller build config, icon converter, Windows version …
philippkrumm Mar 26, 2026
0f38a0d
Chore: spec — universal2 target for macOS, add signing/notarization g…
philippkrumm Mar 26, 2026
e198b89
new readme etc. new clinical tests and info points
philippkrumm Mar 31, 2026
1f27521
new excel file layout and sheets
Apr 1, 2026
e3455c2
new html export
philippkrumm Apr 1, 2026
5813e18
Plan: HTML export frontend design improvements
philippkrumm Apr 1, 2026
a69c44e
Fix decision tree in HTML export + peer-review features
Apr 1, 2026
f1c84e0
new html and UX design file
philippkrumm Apr 2, 2026
5de0671
Improve Help Hub UX, dialog styling, and macOS Qt startup handling; i…
Apr 2, 2026
b721a38
feat: enhance HTML reporting, plot designer, and headless test stability
Apr 2, 2026
9554443
refactor: extract advanced statistical testing pipeline and engines
Apr 2, 2026
b7687cc
refactor: split stats_functions into posthoc outlier and analysis cores
Apr 2, 2026
0a60883
refactor: modularize analyzer/tester and polish report plot designer
Apr 2, 2026
d100530
chore: git cleanup — remove temp files, generated output, expand .git…
philippkrumm Apr 7, 2026
9331f66
feat: add interaction and profile plots for factorial ANOVA designs
philippkrumm Apr 10, 2026
4c558ad
test: extend R validation suite — effect sizes, new test types, mixed…
Apr 11, 2026
4418488
feat: add transform & retest support to CorrelationModel (log10/sqrt/…
philippkrumm Apr 14, 2026
3f4ca86
feat: pass x_transform/y_transform from analysis_context to Correlati…
philippkrumm Apr 14, 2026
a378f57
feat: add correlation transform dropdowns to autopilot UI
philippkrumm Apr 14, 2026
4c39201
fix: guard corr_transform_widget visibility against early-return and …
philippkrumm Apr 14, 2026
fe40abd
feat: show transform & recheck nodes in correlation decision tree
philippkrumm Apr 14, 2026
a6d7e7b
test: integration tests for correlation transform & retest pipeline
philippkrumm Apr 14, 2026
dd1ac88
feat: report Box-Cox lambda and shift c for full transformation repro…
philippkrumm Apr 14, 2026
46fe2bb
feat: factorial ANOVA effects table, file-save dialogs, and UI polish
Apr 14, 2026
fdab74a
feat: remove Start multi-dataset analysis button and run_multi_datase…
philippkrumm Apr 16, 2026
e158765
feat: remove classic plot workflow (Plot Configurations panel, run_al…
philippkrumm Apr 16, 2026
e287a85
Alte analyse Wege gelöscht, plot designer umgebaut,
philippkrumm Apr 17, 2026
2b9199a
new way of bringin in data. not finished!!
philippkrumm May 7, 2026
c1b26ef
feat: raw data range selector dialog + QSS polish
philippkrumm May 8, 2026
601ce72
refactor: extract domain modules, fix data integrity bugs, add test s…
philippkrumm May 11, 2026
84189e5
test: gate Excel-output assertions on dispatcher state
philippkrumm May 12, 2026
97cb4c5
build: PyInstaller spec hardening + BUILD.md + generated icons
philippkrumm May 12, 2026
ef26921
fix: HTML report polish and build hardening for v2.0\n\n- p-value sci…
May 12, 2026
e77e12d
besserer decision tree
philippkrumm May 13, 2026
26b58ee
allgemeine verbesserungen, neue decsion trees, gro
May 25, 2026
5c3af39
chore: post-audit stable checkpoint before src restructure
May 25, 2026
21f0a2e
refactor: restructure src into logical sub-packages (core, analysis, …
May 25, 2026
3405668
chore: remove dead scripts and empty start.bat
May 25, 2026
b110bc0
deleted excel export, new audit, summary of the repo,
May 25, 2026
3d17c5e
fix: remove all pre-existing pyflakes warnings across 7 source files\…
May 25, 2026
4263227
Fix Pyrefly type errors in assumption checks, fix A1 Welch logic, res…
May 25, 2026
311a24e
Fix path resolutions, decision logic notes, and font typos
May 25, 2026
2e67a98
docs: overhaul guides, fix GitHub rendering, remove personal configs
May 26, 2026
ca2fe9e
refactor: simplify decision tree & flowchart labels to plain English …
May 30, 2026
f3f275e
refactor: stats engine, UI, docs & help content overhaul
May 30, 2026
1abaa7f
fix: align decision-tree test, drop dead tree code, add CI
May 31, 2026
92f90db
refactor(html_exporter): extract _FormattingMixin
Jun 1, 2026
40a0dcc
refactor(html_exporter): extract _AssetsMixin
Jun 1, 2026
b226be0
refactor(html_exporter): extract _StatRowsMixin
Jun 1, 2026
0af272e
refactor(html_exporter): extract _AssociationMixin
Jun 1, 2026
f345aa1
refactor(html_exporter): extract _ChartsMixin
Jun 1, 2026
365b36f
refactor(html_exporter): extract _SummariesMixin
Jun 1, 2026
d83da8f
fix(statisticaltester): forward df to advanced-ANOVA test functions
Jun 1, 2026
4cc3aed
refactor(html_exporter): drop duplicated inline report template
Jun 1, 2026
fa3e3fd
fix(analysis_core): read the correct "injected_df" context key
Jun 1, 2026
9d01c13
feat(plot-designer): Add grouped mode, estimation, forest, and beeswa…
Jun 2, 2026
68d9bf2
refactor(visualizer): Integrate Welch's tests into standard parametri…
Jun 2, 2026
0fe588e
fix(plot-designer): repair Phase-3 syntax crash + pairwise effect/CI …
Jun 3, 2026
ee09daa
feat(plot-designer): conditional show/hide controls by plot type
Jun 3, 2026
184d985
fix(nonparametric-anova): correct Freedman-Lane main-effect df + part…
Jun 3, 2026
e777ec5
feat(nonparametric-anova): add comparison-selection dialog to Freedma…
Jun 4, 2026
35ce951
feat(nonparametric-anova): add BL dialog post-hoc + fix Wilcoxon scip…
Jun 4, 2026
2093849
test(nonparametric-anova): persist FL/BL regression + dialog tests to…
Jun 4, 2026
91393e7
test(nonparametric-anova): add NaN/missing-data coverage to FL + BL t…
Jun 4, 2026
411f46c
test(nonparametric-anova): add error guards + catastrophic-NaN tests …
Jun 4, 2026
d64b16f
fix: NaN-safe BoxCox transformation + robustness fixes
Jun 10, 2026
23eec3f
fix(stats/posthoc): exact simultaneous CIs for Dunnett and Games-Howell
Jun 13, 2026
2755a34
refactor(core): decouple Welch-ANOVA post-hoc selection, enable dialo…
Jun 13, 2026
d4fdc98
feat(stats/firth): penalized profile-likelihood CI for Firth logistic
Jun 13, 2026
f324493
fix(stats/ancova): true estimated marginal means via balanced referen…
Jun 13, 2026
078ce87
fix(stats/transform): guard against Box-Cox lambda divergence, fall b…
Jun 13, 2026
403afee
fix(stats/nonpar): Bonett-Wright SE for Spearman CI, drop invalid MWU…
Jun 13, 2026
58e9fe4
style(ui/export): WCAG contrast, chart automargins, tree spacing, dia…
Jun 13, 2026
17cf55d
fix(core): use stdlib logging instead of IPython re-export
Jun 13, 2026
b418cc4
ci: run tests on pull_request and main only, not every feature push
Jun 13, 2026
b89cd5f
docs(howto): update post-hoc, Box-Cox and Firth sections to match beh…
Jun 13, 2026
fe2bd66
test(welch-posthoc): clean up report companions written during the test
Jun 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
name: tests

on:
push:
branches: [main]
pull_request:
branches: [main]

permissions:
contents: read

jobs:
pytest:
runs-on: ubuntu-latest
timeout-minutes: 20
env:
# conftest.py already forces this; set here too so CI logs are explicit.
QT_QPA_PLATFORM: offscreen
steps:
- uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.12"
cache: pip

- name: Install headless-Qt system libraries
run: |
sudo apt-get update
sudo apt-get install -y libegl1 libgl1 libxkbcommon0 libdbus-1-3

- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
pip install pytest

# Runs the tests/ suite (testpaths in pyproject.toml). The validation/
# suite is skipped in CI because several scripts shell out to R.
- name: Run unit tests
run: pytest
52 changes: 52 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
.DS_Store
__pycache__/
*.pyc
*.pyo
.venv/
.venv*_backup_*/

# Claude Code internal files
.claude/

# R output artifacts
Rplots.pdf

# Dead-code audit report (generated artifact)
tools/audit_report.md

# Generated report outputs (auto-generated by the application)
docs/test_report_preview.html

# Build artifacts
build/
dist/
*.egg-info/

# Test & coverage
.coverage
htmlcov/

# Logs & temp files
*.log
*.tmp
*.bak

# PyInstaller build log
build_log.txt

# Editor & personal tool configs (not relevant for end users or contributors)
.cursorrules
.vscode/
.continue/
pyrefly.toml

# AI assistant instruction files (personal workflow)
AGENTS.md
CLAUDE.md

# One-off dev scripts
refactor_imports.py

# Local example images / scratch assets
decision_tree_example.png

11 changes: 0 additions & 11 deletions .vscode/tasks.json

This file was deleted.

3,379 changes: 3,379 additions & 0 deletions 2026-05-08_Mono_Luciferase_Reporter_System_50uL_boxcox.html

Large diffs are not rendered by default.

229 changes: 229 additions & 0 deletions BUILD.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,229 @@
# BioMedStatX — Build & Release Guide

Step-by-step instructions for producing the Windows `.exe` and macOS `.app`
distributions and publishing them on the GitHub Releases page.

---

## Prerequisites (one-time setup)

### Common
* Python 3.10+ with all `requirements`-style deps installed (the venv used for
development is enough).
* `PyInstaller >= 6.0` (`pip install pyinstaller`).
* GitHub CLI (`gh`) for uploading releases (optional — can also use the
web UI). Portable Windows install:
```powershell
$asset = (Invoke-RestMethod 'https://api.github.com/repos/cli/cli/releases/latest' `
-Headers @{'User-Agent'='installer'}).assets |
Where-Object name -match 'windows_amd64\.zip$' | Select-Object -First 1
Invoke-WebRequest $asset.browser_download_url -OutFile $env:TEMP\gh.zip
Expand-Archive $env:TEMP\gh.zip "$env:LOCALAPPDATA\gh-cli" -Force
```
Add `%LOCALAPPDATA%\gh-cli\bin` to your user PATH, then `gh auth login`.

### Windows-specific
Nothing extra. The `.spec` already references
`tools/win_version_info.txt` and uses the `.ico` icon.

### macOS-specific
* **Python from python.org**, not Homebrew — required for `universal2`
wheels. Verify:
```bash
python3 -c "import platform; print(platform.python_implementation(), platform.processor())"
```
Reinstall scientific deps as `universal2` so the resulting `.app` runs on
both Intel and Apple Silicon:
```bash
pip install --upgrade --force-reinstall scipy numpy PyQt5 pingouin statsmodels
```
* **Apple Developer ID** (Apple Developer Program, $99/year). Without signing,
users have to right-click → Open the first time and dismiss a Gatekeeper
warning. Notarisation removes the warning entirely.
* `iconutil` (built-in on macOS) for high-quality `.icns` generation.

---

## Build steps

### 1. Generate the icons

The repo only ships `assets/Institutslogo.png`. Convert it once per platform:

```bash
python tools/convert_icon.py
```

Produces `assets/Institutslogo.ico` (Windows) and a basic
`assets/Institutslogo.icns` (macOS, single-resolution via Pillow).

**Better `.icns` on macOS** (Retina-quality, multi-resolution):

```bash
SRC=assets/Institutslogo.png
ICONSET=/tmp/biomed.iconset
mkdir -p "$ICONSET"
for size in 16 32 64 128 256 512; do
sips -z $size $size "$SRC" --out "$ICONSET/icon_${size}x${size}.png"
sips -z $((size*2)) $((size*2)) "$SRC" --out "$ICONSET/icon_${size}x${size}@2x.png"
done
iconutil -c icns "$ICONSET" -o assets/Institutslogo.icns
rm -rf "$ICONSET"
```

### 2. Clean any previous build

```powershell
# Windows
Remove-Item -Recurse -Force dist, build -ErrorAction SilentlyContinue
```
```bash
# macOS / Linux
rm -rf dist build
```

### 3. Run PyInstaller

**Windows with Anaconda Python** — `Library\bin` must be on PATH so PyInstaller
can resolve Anaconda-managed DLLs (`ffi-8.dll`, `libexpat.dll`, etc.).
Build from a clean venv at a short path (`C:\bmx_venv`) to avoid MAX_PATH issues:

```powershell
# One-time venv setup (only needed once per machine)
C:\Users\pkrumm\AppData\Local\anaconda3\python.exe -m venv C:\bmx_venv
C:\bmx_venv\Scripts\pip install -r requirements.txt pyinstaller

# Build
$env:PATH = "C:\Users\pkrumm\AppData\Local\anaconda3\Library\bin;C:\Users\pkrumm\AppData\Local\anaconda3\DLLs;$env:PATH"
C:\bmx_venv\Scripts\pyinstaller.exe BioMedStatX.spec --noconfirm
```

**macOS / Linux:**
```bash
pyinstaller BioMedStatX.spec --noconfirm
```

* Output (Windows): `dist/BioMedStatX/` — onefolder build, ~400 MB.
* Output (macOS): `dist/BioMedStatX.app/` — application bundle, ~100 MB.

Build time: 5–10 minutes depending on the machine. Watch `build_log.txt` if
you tee'd the output. Hidden imports for `pingouin`, `statsmodels`, `scipy`,
`sklearn`, `networkx` are handled automatically by `collect_all` in the spec.

### 4. Smoke test

Launch the resulting binary once and verify the main window comes up:

```powershell
# Windows
.\dist\BioMedStatX\BioMedStatX.exe
```
```bash
# macOS
open dist/BioMedStatX.app
```

If anything is missing at runtime, PyInstaller usually reports
`ModuleNotFoundError`. Add the offending module to `hiddenimports` in
`BioMedStatX.spec` and rebuild.

### 5. macOS: sign and notarise (release builds only)

```bash
codesign --deep --force --options runtime \
--entitlements assets/entitlements.plist \
--sign "Developer ID Application: Philipp Krumm (TEAMID)" \
dist/BioMedStatX.app

xcrun notarytool submit dist/BioMedStatX.app \
--apple-id "philipp-krumm123@outlook.de" \
--password "<app-specific-password>" \
--team-id "TEAMID" --wait

xcrun stapler staple dist/BioMedStatX.app
```

Without these steps the user sees a Gatekeeper warning. With them, the app
opens cleanly on any Mac. Replace `TEAMID` with your Apple Developer Team ID.

### 6. Package for distribution

Match the naming used in `v1.0.1` so users can compare versions easily.

```powershell
# Windows
Compress-Archive -Path dist\BioMedStatX\* `
-DestinationPath BioMedStatX_windows.zip -Force
```
```bash
# macOS — preserves symlinks + signature
ditto -c -k --sequesterRsrc --keepParent dist/BioMedStatX.app BioMedStatX_macOS.zip
```

The Excel template is shipped separately as
`BioMedStatX_Excel_Template.xlsx` (lives under `assets/templates/` or a path
you decide; not produced by PyInstaller).

---

## Publishing on GitHub

### Option A — `gh` CLI (recommended)

```bash
gh release create v2.0 \
BioMedStatX_windows.zip \
--title "BioMedStatX V2.0" \
--generate-notes \
--target feature/advanced-stats-automation
```

Add the macOS build later:

```bash
gh release upload v2.0 BioMedStatX_macOS.zip
```

(Drop the `--target` argument once the release branch is `main`.)

### Option B — Web UI

1. Browse to `https://github.com/philippkrumm/BioMedStatX/releases/new`.
2. **Choose a tag**: type `v2.0` and pick "Create new tag: v2.0 on publish".
3. **Target**: select the branch you want to tag (currently
`feature/advanced-stats-automation`).
4. **Generate release notes** (button) — fills the description from commit
history.
5. **Attach files**: drag `BioMedStatX_windows.zip` (and later
`BioMedStatX_macOS.zip` + the Excel template) into the assets area.
6. Publish.

---

## Versioning conventions

The Windows `.exe` version resource and the `.app` bundle version both live
in two files:

| File | Field |
|---|---|
| `tools/win_version_info.txt` | `filevers`, `prodvers`, `FileVersion`, `ProductVersion` |
| `BioMedStatX.spec` (`BUNDLE` block) | `CFBundleShortVersionString`, `CFBundleVersion` |

Bump **both** when cutting a new release. Keep them in sync with the Git tag
(`v2.0` → `2.0.0`).

---

## Troubleshooting

* **`ModuleNotFoundError` at runtime** → add to `hiddenimports` in the spec.
* **`Qt platform plugin "windows" could not be initialised`** → the `assets/`
directory wasn't copied into the bundle. Check the `datas=[...]` entry in
the spec.
* **macOS "App is damaged and can't be opened"** → bundle wasn't notarised
*or* the user downloaded the zip via a quarantined browser. Notarising +
stapling fixes this; manually clearing the attribute also works:
`xattr -dr com.apple.quarantine /Applications/BioMedStatX.app`.
* **Excel export missing** → `src/export_dispatcher.py` currently has the
Excel calls commented out (HTML-only mode). Uncomment to restore.
Loading
Loading