Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
16 changes: 16 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
[submodule "src/mapping_robot"]
path = src/mapping_robot
url = https://github.com/imr-framework/mapping_robot/
branch = dev_ws_2026
[submodule "src/passive_shimming"]
path = src/passive_shimming
url = https://github.com/imr-framework/passive_shimming
branch = dev_ws_2026
[submodule "src/pyCoilGen"]
path = src/pyCoilGen
url = https://github.com/sairamgeethanath/pyCoilGen
branch = dev_ws_2026
[submodule "src/console"]
path = src/console
url = https://github.com/sairamgeethanath/console
branch = dev_ws_2026
53 changes: 53 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,56 @@ openmrd validate my_scanner/scanner.yaml

## Status
This is a **v0.1** proposal meant to bootstrap community discussion. PRs welcome!

<div align="center">
<img src="https://github.com/user-attachments/assets/d8a7c6e1-9337-4a7d-88c9-b72ed52cbec9" width="200">
</div>

**Building: Repositories list - please use the dev_ws_2026 branch for all submodules**
1. Magnet: design and simulation
2. Magnet: construction
3. [Field mapping robot](https://github.com/imr-framework/mapping_robot/)
4. [Passive shimming including 3D STL file generation](https://github.com/imr-framework/passive_shimming)
5. [Amplifiers: Gradient, RF TX and RF RX - 3rd party - Larry Wald/Martinos/MGH](https://tabletop.martinos.org/index.php?title=Main_Page)
6. [Planar gradient coil design using pycoilgen](https://github.com/sairamgeethanath/pyCoilGen) or [previous effort](https://github.com/imr-framework/planar_gradient_coil_design/tree/main)
7. RF coil: design and simulation
8. RF coil: construction
9. [Spectrometer - 3rd party - FLOCRA; part of console software download](https://github.com/vnegnev)
10. [Pulse sequence design using Pypulseq](https://github.com/imr-framework/pypulseq)
11. [Console software](https://github.com/sairamgeethanath/console)
12. Phantom
13. Scanner log and outputs


**Playing: Repositories list**
1. [Virtual Scanner Tabletop Games](https://github.com/imr-framework/vs-tabletop/tree/delta-diy)
2. [Virtual Scanner](https://github.com/imr-framework/virtual-scanner/)

## Our image currently looks like ....
<img src="https://github.com/user-attachments/assets/423c93c2-c405-448e-8fd6-d84fc44a69a9" width="200">





## Potential student projects

***Hardware**
1. Field mapping robot - Design covers, wiring and a user interface
2. Passive shims - explore new geometries and new optimization methods
3. RF coils - Bat head coil matching the anatomy of its head

***MR physics***
1. Pulse sequences - Robust RF frequency finder, refine calibration sequences - RF power, gradient
2. Image reconstruction - Multiple k-space filters

***Software***
1. Console - automate install and startup
2. Interface virtual scanner games with the console using the Pulseq format

***New experiments***
1. T1 mapping
2. T2 mapping

**Acknowledgement**:
1. Johns Hopkins Provost DELTA award, 2024
246 changes: 246 additions & 0 deletions contributing.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,246 @@
# Contributing to Delta DIY MRI

Welcome! 👋
Thank you for contributing to the Delta DIY MRI ecosystem.

This project spans multiple repositories and disciplines (hardware: magnet, gradients, RF; firmware and software:spectrometer, acquisition, reconstruction; mechanical designs of parts and phantoms, etc.), and this guide is designed to help **participants and mentors collaborate effectively** during the workshop and beyond.

👉 Start here: [Step-by-Step Workshop Contribution Guide](#step-by-step-workshop-contribution-guide)
---

## Table of Contents

- Getting Started
- Ways to Contribute
- Branching Strategy
- Development Workflow
- Pull Request Guidelines
- Code Review Process
- Workshop-Specific Guidelines
- After the Workshop
- Multi-Repository Coordination
- Commit Message Guidelines
- Code Style & Best Practices
- Getting Help

---

## Getting Started

1. Fork the repository (if external contributor)

2. Clone your fork
git clone <your-fork-url>
cd <repo-name>

3. Add upstream
git remote add upstream <original-repo-url>

4. Sync with upstream
git fetch upstream
git checkout dev
git merge upstream/dev

---

## Ways to Contribute

- Hardware design (coils, magnet, electronics)
- RF systems and tuning
- Gradient design and optimization
- Reconstruction algorithms
- Software tools and GUIs
- Documentation and tutorials
- Testing and validation

---

## Branching Strategy

| Branch Type | Purpose | Stability |
|------------|--------|----------|
| main | Production-ready code | High |
| dev | Active development | Medium |
| feature/* | New features | Low |
| workshop/* | Rapid experiments | Very Low |
| hotfix/* | Urgent fixes | High |

Core rules:
- No direct commits to main
- All changes via Pull Requests
- Branch from dev (unless hotfix)
- Keep PRs small and focused

Naming conventions:

Feature branches:
feature/<module>-<description>

Workshop branches:
workshop/day1-rf
workshop/team-recon

Hotfix branches:
hotfix/<issue-description>

---

## Development Workflow

1. git checkout dev
git pull origin dev

2. git checkout -b feature/<name>

3. git add .
git commit -m "feat: short description"

4. git push origin feature/<name>

5. Open Pull Request to dev

---

## Pull Request Guidelines

Each PR should include:
- Description of the change
- Problem being solved
- How it was tested
- Screenshots / plots if applicable

Checklist:
[ ] Code runs without errors
[ ] No broken dependencies
[ ] Documentation updated

---

## Code Review Process

- At least one mentor approval required - please refer to https://delta-diy-mri.github.io/ for the appropriate mentor
- Focus on correctness, clarity, reproducibility
- Discussion encouraged - please use GitHub discussions - https://github.com/delta-diy-mri/delta-diy-mri.github.io/discussions

---

## Workshop-Specific Guidelines

- Prioritize learning and speed of trying out implementations
- Use workshop branches for experiments
- Merge into dev daily
- Coordinate within teams

---

## After the Workshop

- Reduce workshop branches
- Enforce stricter reviews
- Add CI/testing
- Stabilize main

---

## Multi-Repository Coordination

- Use consistent branch names
- Reference related PRs:

Depends on: repo-name#123
Related to: repo-name#456

---

## Commit Message Guidelines

Format:
<type>: <short description>

Types:
- feat
- fix
- docs
- refactor
- test

---

## Code Style & Best Practices

- Keep code modular and readable
- Comment non-obvious logic
- Prefer clarity over cleverness
- Avoid breaking existing functionality

---

## Getting Help

- Open a draft PR early
- Ask a mentor
- Use GitHub Issues
- Discuss with your team

---

## Final Notes

This project enables hands-on MRI system building and interdisciplinary collaboration.

When in doubt: open a PR early and ask for feedback.

Happy building! 🧲



## Overview
This repo uses submodules. Contributions may involve:
- Main repo
- Submodules

## Workflow Summary
1. Fork repo
2. Clone with submodules
3. Create branch
4. Edit main or submodule
5. Commit, push
6. Open PR

---

# Step-by-Step Workshop Contribution Guide

## 1. Fork
Click Fork on GitHub - https://github.com/imr-framework/open-mri/

## 2. Clone
```bash
git clone --recurse-submodules <your-fork-url>
cd <repo-name>
git checkout dev_ws_2026
```

## 3. Branch
git checkout -b my-feature

## 4A. Edit Main Repo
git add .
git commit -m "change"

## 4B. Edit Submodule
cd submodule
git checkout -b change
git commit -m "update"
git push

## Update pointer
cd ..
git add submodule
git commit -m "update pointer"

## 5. Push
git push

## 6. PR
Open PR on GitHub
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ subsystems:
rf:
tx:
type: solenoid
f0_hz: 14900000.0
f0_hz: 11500000.0
q_factor: 100.0
impedance_ohm: 50.0
pmax_w: null
Expand All @@ -94,7 +94,7 @@ subsystems:
files: {}
rx:
type: solenoid
f0_hz: 14900000.0
f0_hz: 11500000.0
q_factor: 150.0
impedance_ohm: 50.0
pmax_w: null
Expand Down
1 change: 1 addition & 0 deletions src/console
Submodule console added at 109cc0
1 change: 1 addition & 0 deletions src/mapping_robot
Submodule mapping_robot added at 804227
Binary file modified src/openmrd/__pycache__/__init__.cpython-310.pyc
Binary file not shown.
Binary file modified src/openmrd/__pycache__/models.cpython-310.pyc
Binary file not shown.
Binary file not shown.
2 changes: 1 addition & 1 deletion src/openmrd/demo_openmri.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")))
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))

from src.openmrd.models import ScannerManifest, GradAxis, Gradients, RFChannel, RF, Magnet, Spectrometer, Console, Subsystems, Metadata
from src.openmrd.models import *

TEMPLATES = {
"halbach_lowfield": {
Expand Down
22 changes: 17 additions & 5 deletions src/openmrd/demo_openmri_Ctype.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
import argparse, os, sys, json, yaml
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")))
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
from src.openmrd.models import ReconstructionManifest, ScannerManifest, GradAxis, Gradients, RFChannel, RF, Magnet, Spectrometer, Console, Subsystems, Metadata
from src.openmrd.models import *

TEMPLATES = {
"c_type_permanent": {
Expand All @@ -30,10 +30,22 @@
"y":{"gmax_mTm":25,"slew_Tm_s":35,"resistance_ohm":2.5,"inductance_mH":5.2},
"z":{"gmax_mTm":20,"slew_Tm_s":30,"resistance_ohm":3.0,"inductance_mH":6.1}
}},
"rf": {"tx":{"type":"solenoid","f0_hz":14.9e6,"q_factor":100,"impedance_ohm":50},
"rx":{"type":"solenoid","f0_hz":14.9e6,"q_factor":150,"impedance_ohm":50}},
"rf": {"tx":{"type":"solenoid","f0_hz":11.5e6,"q_factor":100,"impedance_ohm":50},
"rx":{"type":"solenoid","f0_hz":11.5e6,"q_factor":150,"impedance_ohm":50},
"shielding":"copper"},
"recon_pipeline": {
"openmrd_version": "0.1",
"metadata": {"name":"C-Type-OpenMRD","organization":"DIY MRI","license":"MIT","contributors":["Researcher1", "Engineer1"],"created":"2025-08-27","description":"C-type permanent magnet design with N52 discs"},
"reconstruction_parameters": {"algorithm":"GRAPPA","acceleration_factor":2}
},
"spectrometer":{"model":"RedPitaya-122","sampling_rate_hz":122e6,"bit_depth":16,"max_tx_freq_hz":50e6},
"console":{"name":"mri4all","os":"Linux","api":"Python gRPC","pulseq_support":True,"latency_ms":3.0}
"console":{"name":"mri4all","os":"Linux","api":"Python gRPC","pulseq_support":True,"latency_ms":3.0},
"recon": {"name": "open-lf-recon","framework": "Python","backend": "PyTorch","device": "cuda","latency_ms": 12.5,
"batch_size": 2,"input_format": "kspace","output_format": "image","complex_data": true,"use_kspace_recon": true,
"use_classical_denoising": true,"use_motion_correction": false,"use_super_resolution": true,"use_dl_reconstruction": true,

"model_name": "3D-UNet-SRR","model_checkpoint": "models/srr_unet.pth","physics_informed": true,"coil_sensitivity_maps": true,"field_strength": 0.05
}
}
}
}
Expand Down Expand Up @@ -123,7 +135,7 @@ def main():
"""
# Initialize with default arguments
class Args:
package = "default_package"
package = "diy_mri_2026_package"
template = "c_type_permanent"
manifest = os.path.join(package, "scanner.yaml")
func = None
Expand Down
Loading