Skip to content

Commit

Permalink
V1.0.4.2 Bug fixes in vmat_scp_optimization.py and beams.py
Browse files Browse the repository at this point in the history
1. Resolving python rounding issue. Use ceil instead of round for step size change
2. Modified beams.py so that beam ids can take integer or string values
3. Minor updates in examples
  • Loading branch information
gourav3017 committed Jun 25, 2024
1 parent 1e7643d commit 1cb4311
Show file tree
Hide file tree
Showing 4 changed files with 5 additions and 49 deletions.
2 changes: 1 addition & 1 deletion examples/python_files/inf_matrix_sparsification.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ def inf_matrix_sparsification():
beams_full = pp.Beams(data, load_inf_matrix_full=True)
# load influence matrix based upon beams and structure set
inf_matrix_full = pp.InfluenceMatrix(ct=ct, structs=structs, beams=beams_full, is_full=True)
plan_full = pp.Plan(ct, structs, beams, inf_matrix_full, clinical_criteria)
plan_full = pp.Plan(ct=ct, structs=structs, beams=beams, inf_matrix=inf_matrix_full, clinical_criteria=clinical_criteria)
# use the full influence matrix to calculate the dose for the plan obtained by sparse matrix
dose_full_1d = plan_full.inf_matrix.A @ (sol_sparse['optimal_intensity'] * plan_full.get_num_of_fractions())

Expand Down
2 changes: 1 addition & 1 deletion examples/python_files/vmat_global_optimal.py
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,7 @@ def vmat_optimization():
"""
# plot dvh for the structures in the given list. Default dose_1d is in Gy and volume is in relative scale(%).
struct_names = ['PTV', 'ESOPHAGUS', 'HEART', 'CORD']
pp.Visualization.plot_dvh(my_plan, sol=sol, struct_names=struct_names, title=patient_id)
pp.Visualization.plot_dvh(my_plan, sol=sol, struct_names=struct_names, title=data.patient_id)

# plot 2d axial slice for the given solution and display the structures contours on the slice
pp.Visualization.plot_2d_slice(my_plan=my_plan, sol=sol, slice_num=60, struct_names=['PTV'])
Expand Down
48 changes: 2 additions & 46 deletions examples/python_files/vmat_tps_import.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,29 +17,20 @@
# 5. Comparing the PortPy plan against the TPS plan for validation and analysis
#

# In[1]:


import sys
sys.path.append('..')


# In[8]:


import portpy.photon as pp
import os
import matplotlib.pyplot as plt
import cvxpy as cp
import numpy as np
import pandas as pd


# ### 1) Creating a simple IMRT plan (Plan class, Optimization class)
#

# In[3]:


# specify the patient data location.
data_dir = r'../data'
# Use PortPy DataExplorer class to explore PortPy data
Expand All @@ -50,10 +41,6 @@
# # display the data of the patient in console or browser.
# data.display_patient_metadata()


# In[9]:


# Load ct and structure set for the above patient using CT and Structures class
ct = pp.CT(data)
structs = pp.Structures(data)
Expand Down Expand Up @@ -88,11 +75,6 @@
my_plan = pp.Plan(ct=ct, structs=structs, beams=beams, inf_matrix=inf_matrix, clinical_criteria=clinical_criteria, arcs=arcs)


# #### Optimize VMAT plan using sequential convex programming

# In[ ]:


# Initialize Optimization
vmat_opt = pp.VmatScpOptimization(my_plan=my_plan,
opt_params=vmat_opt_params)
Expand All @@ -117,35 +99,21 @@
# 3. Finally, in TPS, execute final dose calculation.
#

# In[4]:


my_plan = pp.load_plan(plan_name='my_plan_vmat.pkl', path=os.path.join(r'C:\temp', data.patient_id))
sol = pp.load_optimal_sol(sol_name='sol_vmat.pkl', path=os.path.join(r'C:\temp', data.patient_id))


# In[ ]:


# create dicom RT Plan file to be imported in TPS
out_rt_plan_file = r'C:\Temp\Lung_Patient_3\rt_plan_portpy_vmat.dcm' # change this file directory based upon your needs
in_rt_plan_file = r'C:\Temp\Lung_Patient_3\rt_plan_echo_vmat.dcm' # change this directory as per your
pp.write_rt_plan_vmat(my_plan=my_plan, in_rt_plan_file=in_rt_plan_file, out_rt_plan_file=out_rt_plan_file)


# In[7]:


# get the corresponding tcia collection/subject ID
data.get_tcia_metadata()


# ### 3) Exporting the finally calculated dose from the TPS system into PortPy
# After the final dose calculation in Eclipse, export the dose in DICOM RT-Dose format using the Eclipse Export module. Then, utilize the following lines of code to convert the exported dose into the PortPy format for visualization or evaluation purposes

# In[10]:


# Specify the location and name of the DICOM RT Dose file
dose_file_name = os.path.join(r'C:\temp', data.patient_id, 'rt_dose_portpy_vmat.dcm')
# Convert the DICOM dose into PortPy format
Expand All @@ -156,31 +124,19 @@
# ### 4) Comparing the PortPy VMAT plan against the TPS plan for validation and analysis
#
# Finally dose exported from TPS in RT-dose DICOM file can be compared against PortPy dose using full influence matrix
#

# In[12]:


beams_full = pp.Beams(data, beam_ids=beam_ids, load_inf_matrix_full=True)
# load influence matrix based upon beams and structure set
inf_matrix_full = pp.InfluenceMatrix(ct=ct, structs=structs, beams=beams_full, is_full=True)
dose_full_1d = inf_matrix_full.A @ (sol['optimal_intensity'] * my_plan.get_num_of_fractions()) # calculate dose using full matrix


# In[13]:


# Visualize the DVH discrepancy between eclipse dose and dose using full matrix in portpy
struct_names = ['PTV', 'ESOPHAGUS', 'HEART', 'CORD', 'LUNGS_NOT_GTV']
fig, ax = plt.subplots(figsize=(12, 8))
ax = pp.Visualization.plot_dvh(my_plan, dose_1d=dose_full_1d, struct_names=struct_names, style='solid', ax=ax, norm_flag=True)
ax = pp.Visualization.plot_dvh(my_plan, dose_1d=ecl_dose_1d, struct_names=struct_names, style='dotted', ax=ax, norm_flag=True)
ax.set_title('- PortPy VMAT(Using full matrix) .. Eclipse')
plt.show()


# In[ ]:


print('Done')


2 changes: 1 addition & 1 deletion examples/vmat_scp_tutorial.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
"source": [
"# <center>VMAT SCP Tutorial </center>\n",
"\n",
"Volumetric Modulated Arc Therapy (VMAT) has increasingly become the preferred treatment method for many disease sites, primarily due to its fast plan delivery and dose distribution comparable to that of IMRT. However, the optimization of numerous apertures and their corresponding monitor units results in challenging large-scale non-convex optimization problems. To address these challenges, researchers often resort to computationally efficient heuristic methods. Having a globally optimal solution as a benchmark can significantly aid in the development and validation of new VMAT algorithms (see [vmat_optimization.ipynb](https://github.com/PortPy-Project/PortPy/blob/master/examples/benchmark_algorithms/vmat_optimization.ipynb) notebook).\n",
"Volumetric Modulated Arc Therapy (VMAT) has increasingly become the preferred treatment method for many disease sites, primarily due to its fast plan delivery and dose distribution comparable to that of IMRT. However, the optimization of numerous apertures and their corresponding monitor units results in challenging large-scale non-convex optimization problems. To address these challenges, researchers often resort to computationally efficient heuristic methods. Having a globally optimal solution as a benchmark can significantly aid in the development and validation of new VMAT algorithms (see [vmat_global_optimal.ipynb](https://github.com/PortPy-Project/PortPy/blob/master/examples/vmat_global_optimal.ipynb) notebook).\n",
"\n",
"In this notebook, we introduce a VMAT optimization algorithm based on our recent publications ([Dursun et al 2021](https://iopscience.iop.org/article/10.1088/1361-6560/abee58/meta) and [Dursun et al 2023](https://iopscience.iop.org/article/10.1088/1361-6560/ace09e/meta)). This algorithm, called Sequential Convex Programming (SCP), solves a sequence of convex optimization problems that converge to the original non-convex VMAT problem. This technique should not be confused with hierarchical optimization (also known as prioritized optimization), which we utilized in our publication ([Dursun et al 2023](https://iopscience.iop.org/article/10.1088/1361-6560/ace09e/meta)) to automate the planning process. The SCP-VMAT algorithm with hierarchical optimization will be shared in a separate repository ([ECHO-VMAT](https://github.com/PortPy-Project/ECHO-VMAT)). The SCP technique can, in principle, be used in conjunction with any automation technique, including AI-based methods (see [vmat_scp_dose_prediction.ipynb](https://githubcom/PortPy-Project/PortPy/blob/master/examples/vmat_scp_dose_prediction.ipynb) notebook).\n",
"\n",
Expand Down

0 comments on commit 1cb4311

Please sign in to comment.