Skip to content

Commit a199c9d

Browse files
committed
Merge branch 'dev' into pr/842
2 parents 0faff3d + 089ebe2 commit a199c9d

40 files changed

+1749
-549
lines changed

.gitattributes

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# Auto-detect text files and normalize (LF in repo).
2+
* text=auto
3+
4+
# Force files to be binary
5+
*.mat binary
6+
*.pdf binary
7+
*.mex* binary
8+
*.zip binary
9+
*.dll binary
10+
*.exe binary
11+
12+
# Ensure .m files are never marked as executable
13+
*.m -x

.github/before_install_linux.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@ mv matRad/optimization/optimizer/ipopt.m optimization/optimizer/ipopt.m.bak
77

88
octave --no-gui --eval "pkg install -forge dicom"
99
octave --no-gui --eval "pkg install -forge nan"
10-
octave --no-gui --eval "pkg install -forge image"
10+
octave --no-gui --eval "pkg install \"https://downloads.sourceforge.net/project/octave/Octave%20Forge%20Packages/Individual%20Package%20Releases/image-2.14.0.tar.gz\""

.github/workflows/coverage-report.yml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ jobs:
1515
runs-on: ubuntu-latest
1616

1717
steps:
18+
- name: Checkout Repository
19+
uses: actions/checkout@v4 # Checks-out repository under $GITHUB_WORKSPACE
20+
with:
21+
submodules: 'false'
1822

1923
- name: Download Coverage Artifact
2024
uses: actions/download-artifact@v4
@@ -30,10 +34,10 @@ jobs:
3034
format: coveralls
3135

3236
- name: Upload to Codecov
33-
uses: codecov/codecov-action@v4
37+
uses: codecov/codecov-action@v5
3438
with:
3539
token: ${{ secrets.CODECOV_TOKEN }}
36-
file: coverage/coverage.xml
40+
files: coverage/coverage.json,coverage/coverage.xml
3741
fail_ci_if_error: false
3842

3943
- name: Publish Coverage Report

.github/workflows/test-results.yml

Lines changed: 34 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,62 @@
11
name: Test Report
22

3-
permissions:
4-
checks: write
5-
pull-requests: write
6-
73
on:
8-
workflow_call:
4+
workflow_run:
5+
workflows: ["Tests"]
6+
types:
7+
- completed
98

109
jobs:
11-
test_report:
10+
test-report:
11+
if: github.event.workflow_run.conclusion == 'success' || github.event.workflow_run.conclusion == 'failure'
1212
runs-on: ubuntu-latest
13+
permissions:
14+
checks: write
15+
pull-requests: write
16+
1317

14-
steps:
15-
18+
steps:
1619
- name: Download Results for Matlab R2022b
1720
uses: actions/download-artifact@v4
1821
with:
22+
run-id: ${{ github.event.workflow_run.id }}
1923
name: test-results-matlab-R2022b
2024
path: test-results/matlab-R2022b
25+
github-token: ${{ secrets.GITHUB_TOKEN }}
2126

2227
- name: Download Results for Matlab Latest
2328
uses: actions/download-artifact@v4
2429
with:
30+
run-id: ${{ github.event.workflow_run.id }}
2531
name: test-results-matlab-latest
2632
path: test-results/matlab-latest
33+
github-token: ${{ secrets.GITHUB_TOKEN }}
2734

2835
- name: Download Results for Octave
2936
uses: actions/download-artifact@v4
3037
with:
38+
run-id: ${{ github.event.workflow_run.id }}
3139
name: test-results-octave
3240
path: test-results/octave
33-
41+
github-token: ${{ secrets.GITHUB_TOKEN }}
42+
43+
- name: Download Event File
44+
uses: actions/download-artifact@v4
45+
with:
46+
run-id: ${{ github.event.workflow_run.id }}
47+
name: event-file
48+
path: event-file
49+
github-token: ${{ secrets.GITHUB_TOKEN }}
50+
3451
- name: Publish Test Results
3552
uses: EnricoMi/publish-unit-test-result-action@v2
3653
with:
37-
files: |
38-
test-results/*/testresults.xml
39-
40-
- name: Publish Test Results on Codecov
41-
uses: codecov/test-results-action@v1
42-
with:
43-
token: ${{ secrets.CODECOV_TOKEN }}
44-
files: test-results/matlab-R2022b/testresults.xml,test-results/matlab-latest/testresults.xml,test-results/octave/testresults.xml
54+
commit: ${{ github.event.workflow_run.head_sha }}
55+
files: "test-results/**/testresults.xml"
56+
event_file: event-file/event.json
57+
event_name: ${{ github.event.workflow_run.event}}
58+
comment_mode: ${{ (github.event.workflow_run.event == 'pull_request' || github.event_name == 'pull_request') && 'always' || 'off' }}
59+
check_name: "Test Results"
60+
61+
4562

.github/workflows/tests.yml

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,19 @@ jobs:
3838
with:
3939
submodules: 'true'
4040
- uses: ./.github/actions/test-octave
41-
42-
test-report:
43-
name: Collect Test Results
44-
needs: [test-matlab-stable, test-matlab-latest, test-octave-6]
45-
uses: ./.github/workflows/test-results.yml
46-
secrets: inherit
4741

4842
coverage-report:
4943
name: Collect Coverage Report
5044
needs: [test-matlab-stable]
5145
uses: ./.github/workflows/coverage-report.yml
52-
secrets: inherit
46+
secrets: inherit
47+
48+
event_file:
49+
name: Event File
50+
runs-on: ubuntu-latest
51+
steps:
52+
- name: Upload
53+
uses: actions/upload-artifact@v4
54+
with:
55+
name: event-file
56+
path: ${{ github.event_path }}

AUTHORS.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
List of all matRad developers that contributed code (alphabetical)
1+
List of all matRad developers that contributed code (alphabetical)
22

33
* Nelly Abbani
44
* Nabe Al-Hasnawi
@@ -26,6 +26,7 @@
2626
* Navid Khaledi
2727
* Thomas Klinge
2828
* Jeremias Kunz
29+
* Mariia Lapaeva
2930
* Paul Anton Meder
3031
* Henning Mescher
3132
* Lucas-Raphael Müller

CITATION.cff

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ authors:
6161
given-names: "Thomas"
6262
- family-names: "Kunz"
6363
given-names: "Jeremias"
64+
- family-names: "Lapaeva"
65+
given-names: "Mariia"
6466
- family-names: "Mairani"
6567
given-names: "Andrea"
6668
- family-names: "Meder"

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
[![Current Release](https://img.shields.io/github/v/release/e0404/matRad)](https://github.com/e0404/matRad/releases)
22
[![Downloads](https://img.shields.io/github/downloads/e0404/matRad/total)](https://github.com/e0404/matRad/releases)
33
[![Contributors](https://img.shields.io/github/contributors/e0404/matRad)](https://github.com/e0404/matRad/graphs/contributors)
4+
![Citations](https://img.shields.io/endpoint?url=https%3A%2F%2Fapi.juleskreuer.eu%2Fcitation-badge.php%3Fshield%26doi%3D10.1002%2Fmp.12251&style=flat&color=blue)
45

56
[![GitHub Build Status](https://github.com/e0404/matRad/actions/workflows/tests.yml/badge.svg)](https://github.com/e0404/matRad/actions/workflows/tests.yml)
67
[![codecov](https://codecov.io/gh/e0404/matRad/graph/badge.svg?token=xQhUQLu4FK)](https://codecov.io/gh/e0404/matRad)

examples/matRad_example10_4DphotonRobust.m

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@
192192
stf = matRad_generateStf(ct,cst,pln);
193193

194194
%% Dose Calculation
195-
dij = matRad_calcPhotonDose(ct,stf,pln,cst);
195+
dij = matRad_calcDoseInfluence(ct,cst,stf,pln);
196196

197197
%% Inverse Optimization for IMPT based on RBE-weighted dose
198198
% The goal of the fluence optimization is to find a set of bixel/spot
@@ -241,30 +241,38 @@
241241
maxDose = max([max(resultGUI.([pln.propOpt.quantityOpt])(:,:,slice)) max(resultGUIrobust.([pln.propOpt.quantityOpt])(:,:,slice))])+1e-4;
242242
doseIsoLevels = linspace(0.1 * maxDose,maxDose,10);
243243
figure,
244-
subplot(121),matRad_plotSliceWrapper(gca,ct,cst,1,resultGUI.([pln.propOpt.quantityOpt '_' 'beam1']) ,plane,slice,[],[],colorcube,[],[0 maxDose],doseIsoLevels);title('conventional plan - beam1')
245-
subplot(122),matRad_plotSliceWrapper(gca,ct,cst,1,resultGUI.([pln.propOpt.quantityOpt]) ,plane,slice,[],[],colorcube,[],[0 maxDose],doseIsoLevels);title('conventional plan')
244+
subplot(121),matRad_plotSlice(ct, 'axesHandle', gca, 'cst', cst, 'cubeIdx', 1, 'dose', resultGUI.([pln.propOpt.quantityOpt '_' 'beam1']) ,'plane', plane, 'slice', slice, 'contourColorMap', colorcube, 'doseWindow', [0 maxDose], 'doseIsoLevels', doseIsoLevels);title('conventional plan - beam1')
245+
subplot(122),matRad_plotSlice(ct, 'axesHandle', gca, 'cst', cst, 'cubeIdx', 1, 'dose', resultGUI.([pln.propOpt.quantityOpt]) ,'plane', plane, 'slice', slice, 'contourColorMap', colorcube, 'doseWindow', [0 maxDose], 'doseIsoLevels', doseIsoLevels);title('conventional plan')
246+
%subplot(121),matRad_plotSliceWrapper(gca,ct,cst,1,resultGUI.([pln.propOpt.quantityOpt '_' 'beam1']) ,plane,slice,[],[],colorcube,[],[0 maxDose],doseIsoLevels);title('conventional plan - beam1')
247+
%subplot(122),matRad_plotSliceWrapper(gca,ct,cst,1,resultGUI.([pln.propOpt.quantityOpt]) ,plane,slice,[],[],colorcube,[],[0 maxDose],doseIsoLevels);title('conventional plan')
246248

247249
figure
248-
subplot(121),matRad_plotSliceWrapper(gca,ct,cst,1,resultGUIrobust.([pln.propOpt.quantityOpt '_' 'beam1']),plane,slice,[],[],colorcube,[],[0 maxDose],doseIsoLevels);title('robust plan - beam1')
249-
subplot(122),matRad_plotSliceWrapper(gca,ct,cst,1,resultGUIrobust.([pln.propOpt.quantityOpt]),plane,slice,[],[],colorcube,[],[0 maxDose],doseIsoLevels);title('robust plan')
250+
subplot(121),matRad_plotSlice(ct, 'axesHandle', gca, 'cst', cst, 'cubeIdx', 1, 'dose', resultGUIrobust.([pln.propOpt.quantityOpt '_' 'beam1']) ,'plane', plane, 'slice', slice, 'contourColorMap', colorcube, 'doseWindow', [0 maxDose], 'doseIsoLevels', doseIsoLevels);title('robust plan - beam1')
251+
subplot(122),matRad_plotSlice(ct, 'axesHandle', gca, 'cst', cst, 'cubeIdx', 1, 'dose', resultGUIrobust.([pln.propOpt.quantityOpt]) ,'plane', plane, 'slice', slice, 'contourColorMap', colorcube, 'doseWindow', [0 maxDose], 'doseIsoLevels', doseIsoLevels);title('robust plan')
252+
%subplot(121),matRad_plotSliceWrapper(gca,ct,cst,1,resultGUIrobust.([pln.propOpt.quantityOpt '_' 'beam1']),plane,slice,[],[],colorcube,[],[0 maxDose],doseIsoLevels);title('robust plan - beam1')
253+
%subplot(122),matRad_plotSliceWrapper(gca,ct,cst,1,resultGUIrobust.([pln.propOpt.quantityOpt]),plane,slice,[],[],colorcube,[],[0 maxDose],doseIsoLevels);title('robust plan')
250254

251255

252256
figure
253-
subplot(131),matRad_plotSliceWrapper(gca,ct,cst,1,resultGUIrobust4D.([pln.propOpt.quantityOpt]),plane,slice,[],[],colorcube,[],[0 maxDose],doseIsoLevels);title('robust plan')
254-
subplot(132),matRad_plotSliceWrapper(gca,ct,cst,1,resultGUIrobust4D.('accPhysicalDose'),plane,slice,[],[],colorcube,[],[0 maxDose],doseIsoLevels);title('robust plan dose accumulation')
257+
subplot(131),matRad_plotSlice(ct, 'axesHandle', gca, 'cst', cst, 'cubeIdx', 1, 'dose', resultGUIrobust4D.([pln.propOpt.quantityOpt]) ,'plane', plane, 'slice', slice, 'contourColorMap', colorcube, 'doseWindow', [0 maxDose], 'doseIsoLevels', doseIsoLevels);title('robust plan')
258+
subplot(132),matRad_plotSlice(ct, 'axesHandle', gca, 'cst', cst, 'cubeIdx', 1, 'dose', resultGUIrobust4D.('accPhysicalDose') ,'plane', plane, 'slice', slice, 'contourColorMap', colorcube, 'doseWindow', [0 maxDose], 'doseIsoLevels', doseIsoLevels);title('robust plan dose accumulation')
259+
%subplot(131),matRad_plotSliceWrapper(gca,ct,cst,1,resultGUIrobust4D.([pln.propOpt.quantityOpt]),plane,slice,[],[],colorcube,[],[0 maxDose],doseIsoLevels);title('robust plan')
260+
%subplot(132),matRad_plotSliceWrapper(gca,ct,cst,1,resultGUIrobust4D.('accPhysicalDose'),plane,slice,[],[],colorcube,[],[0 maxDose],doseIsoLevels);title('robust plan dose accumulation')
255261

256262
% create an interactive plot to slide through individual scnearios
257263
f = figure; title('individual scenarios');
258264
numScen = 1;
259265
maxDose = max(max(resultGUIrobust.([pln.propOpt.quantityOpt '_scen' num2str(round(numScen))])(:,:,slice)))+0.2;
260266
doseIsoLevels = linspace(0.1 * maxDose,maxDose,10);
261-
matRad_plotSliceWrapper(gca,ct,cst,1,resultGUIrobust.([pln.propOpt.quantityOpt '_scen' num2str(round(numScen))]),plane,slice,[],[],colorcube,[],[0 maxDose],doseIsoLevels);
267+
matRad_plotSlice(ct, 'axesHandle', gca, 'cst', cst, 'cubeIdx', 1, 'dose', resultGUIrobust.([pln.propOpt.quantityOpt '_scen' num2str(round(numScen))]) ,'plane', plane, 'slice', slice, 'contourColorMap', colorcube, 'doseWindow', [0 maxDose], 'doseIsoLevels', doseIsoLevels);
268+
%matRad_plotSliceWrapper(gca,ct,cst,1,resultGUIrobust.([pln.propOpt.quantityOpt '_scen' num2str(round(numScen))]),plane,slice,[],[],colorcube,[],[0 maxDose],doseIsoLevels);
262269

263270
[env,envver] = matRad_getEnvironment();
264271
if strcmp(env,'MATLAB') || str2double(envver(1)) >= 5
265272
b = uicontrol('Parent',f,'Style','slider','Position',[50,5,419,23],...
266273
'value',numScen, 'min',1, 'max',pln.multScen.totNumScen,'SliderStep', [1/(pln.multScen.totNumScen-1) , 1/(pln.multScen.totNumScen-1)]);
267-
set(b,'Callback',@(es,ed) matRad_plotSliceWrapper(gca,ct,cst,round(get(es,'Value')),resultGUIrobust.([pln.propOpt.quantityOpt '_scen' num2str(round(get(es,'Value')))]),plane,slice,[],[],colorcube,[],[0 maxDose],doseIsoLevels));
274+
set(b,'Callback',@(es,ed) matRad_plotSlice(ct, 'axesHandle', gca, 'cst', cst, 'cubeIdx', round(get(es,'Value')), 'dose', resultGUIrobust.([pln.propOpt.quantityOpt '_scen' num2str(round(get(es,'Value')))]) ,'plane', plane, 'slice', slice, 'contourColorMap', colorcube, 'doseWindow', [0 maxDose], 'doseIsoLevels', doseIsoLevels));
275+
%matRad_plotSliceWrapper(gca,ct,cst,round(get(es,'Value')),resultGUIrobust.([pln.propOpt.quantityOpt '_scen' num2str(round(get(es,'Value')))]),plane,slice,[],[],colorcube,[],[0 maxDose],doseIsoLevels));
268276
end
269277

270278
%% Indicator calculation and show DVH and QI
@@ -282,10 +290,12 @@
282290
[cstStatRob, resultGUISampRob, metaRob] = matRad_samplingAnalysis(ct,cst,plnSampRob,caSampRob, mSampDoseRob, resultGUInomScen);
283291

284292
figure,title('std dose cube based on sampling - conventional')
285-
matRad_plotSliceWrapper(gca,ct,cst,1,resultGUISamp.stdCube,plane,slice,[],[],colorcube,[],[0 max(resultGUISamp.stdCube(:))]);
293+
matRad_plotSlice(ct, 'axesHandle', gca, 'cst', cst, 'cubeIdx', 1, 'dose', resultGUISamp.stdCube ,'plane', plane, 'slice', slice, 'contourColorMap', colorcube, 'doseWindow', [0 max(resultGUISamp.stdCube(:))]);
294+
%matRad_plotSliceWrapper(gca,ct,cst,1,resultGUISamp.stdCube,plane,slice,[],[],colorcube,[],[0 max(resultGUISamp.stdCube(:))]);
286295

287296
figure,title('std dose cube based on sampling - robust')
288-
matRad_plotSliceWrapper(gca,ct,cst,1,resultGUISampRob.stdCube,plane,slice,[],[],colorcube,[],[0 max(resultGUISampRob.stdCube(:))]);
297+
matRad_plotSlice(ct, 'axesHandle', gca, 'cst', cst, 'cubeIdx', 1, 'dose', resultGUISampRob.stdCube ,'plane', plane, 'slice', slice, 'contourColorMap', colorcube, 'doseWindow', [0 max(resultGUISampRob.stdCube(:))]);
298+
%matRad_plotSliceWrapper(gca,ct,cst,1,resultGUISampRob.stdCube,plane,slice,[],[],colorcube,[],[0 max(resultGUISampRob.stdCube(:))]);
289299

290300

291301

0 commit comments

Comments
 (0)