opentps.core.processing.planOptimization package
Subpackages
- opentps.core.processing.planOptimization.acceleration package
- Submodules
- opentps.core.processing.planOptimization.acceleration.backtracking module
- opentps.core.processing.planOptimization.acceleration.baseAccel module
- opentps.core.processing.planOptimization.acceleration.fistaAccel module
- opentps.core.processing.planOptimization.acceleration.linesearch module
- Module contents
- opentps.core.processing.planOptimization.objectives package
- Submodules
- opentps.core.processing.planOptimization.objectives.baseFunction module
- opentps.core.processing.planOptimization.objectives.doseFidelity module
- opentps.core.processing.planOptimization.objectives.energySequencing module
- opentps.core.processing.planOptimization.objectives.logBarrier module
- opentps.core.processing.planOptimization.objectives.norms module
- opentps.core.processing.planOptimization.objectives.projections module
- Module contents
- opentps.core.processing.planOptimization.solvers package
- Submodules
- opentps.core.processing.planOptimization.solvers.beamletFree module
- opentps.core.processing.planOptimization.solvers.bfgs module
- opentps.core.processing.planOptimization.solvers.fista module
- opentps.core.processing.planOptimization.solvers.gradientDescent module
- opentps.core.processing.planOptimization.solvers.localSearch module
- opentps.core.processing.planOptimization.solvers.lp module
- opentps.core.processing.planOptimization.solvers.mip module
- opentps.core.processing.planOptimization.solvers.solver module
- opentps.core.processing.planOptimization.solvers.sparcling module
- Module contents
Submodules
opentps.core.processing.planOptimization.optimizationWorkflows module
- optimizeIMPT(plan: RTPlan, planStructure: PlanDesign)
Optimizes an IMPT plan
- Parameters:
plan (RTPlan) – The plan to be optimized
planStructure (PlanDesign) – The plan design containing the optimization parameters
opentps.core.processing.planOptimization.planInitializer module
- class BeamInitializer
Bases:
object
This class is used to initialize a beam with spots and layers.
- Variables:
calibration (AbstractCTCalibration) – The CT calibration used to convert the CT image to RSP image.
spotSpacing (float) – The spacing between spots in mm.
layerSpacing (float) – The spacing between layers in mm.
targetMargin (float) – The margin around the target in mm.
beam (PlanIonBeam) – The beam to initialize.
- initializeBeam()
Initialize the beam with spots and layers.
opentps.core.processing.planOptimization.planOptimization module
- class ARCPTPlanOptimizer(method, plan, **kwargs)
Bases:
PlanOptimizer
This class is used to optimize an arc proton therapy plan (ARCPT). It inherits from PlanOptimizer.
- Variables:
method (str) – The optimization method. It can be one of the following: - ‘FISTA’ - ‘LS’ - ‘MIP’ - ‘SPArcling’
- class BoundConstraintsOptimizer(plan: RTPlan, method='Scipy-LBFGS', bounds=(0.02, 5), **kwargs)
Bases:
PlanOptimizer
This class is used to optimize a plan with bound constraints. It inherits from PlanOptimizer.
- Variables:
bounds (tuple (default: (0.02, 5))) – The bounds.
- formatBoundsForSolver(bounds=None)
Format the bounds for the solver with respect to the number of fractions.
- Parameters:
bounds (tuple (default: None)) – The bounds. If None, the bounds are set to self.bounds.
- Returns:
The formatted bounds.
- Return type:
list
- optimize(nIterations=None)
Optimize the plan.
- Parameters:
nIterations (tuple (default: None)) – The number of iterations for the first and second optimization. If None, the number of iterations is set to self.opti_params[‘maxit’] // 2 if first bound is 0, else it is set to self.opti_params[‘maxit’].
- Returns:
numpy.ndarray – The optimized weights.
numpy.ndarray – The total dose.
float – The cost.
- property xSquared
- class IMPTPlanOptimizer(method, plan: RTPlan, **kwargs)
Bases:
PlanOptimizer
This class is used to optimize an Intensity Modulated Proton Therapy (IMPT) plan. It inherits from PlanOptimizer. :ivar method: The optimization method. It can be one of the following:
‘Scipy-BFGS’
‘Scipy-LBFGS’
‘Gradient’
‘BFGS’
‘LBFGS’
‘FISTA’
‘LP’
- getConvergenceData()
Get the convergence data.
- Returns:
The convergence data.
- Return type:
dict
- class PlanOptimizer(plan: RTPlan, **kwargs)
Bases:
object
This class is used to optimize a plan.
- Variables:
plan (RTPlan) – The plan to optimize.
opti_params (dict) – The optimization parameters.
functions (list) – The list of functions to optimize.
solver (Solver (default: bfgs.ScipyOpt('L-BFGS-B'))) – The solver to use. By default, no bounds are set. Machine delivery constraints can (and should) be enforced by setting the bounds.
thresholdSpotRemoval (float) – The threshold weight below which spots are removed from the plan and beamlet matrix.
xSquared (bool) – If True, the weights are squared. True by default to avoid negative weights.
GPU_acceleration (bool (default : False)) – If True, the evaluation of the doseFidelity function is done with cupy (this attribute should only be modified with the “use_GPU_acceleration” function)
- computeDose()
- getConvergenceData(method)
Get the convergence data.
- Parameters:
method (str) – The optimization method.
- Returns:
The convergence data.
- Return type:
dict
- initializeFidObjectiveFunction()
Initialize the dose fidelity objective function.
- initializeWeights()
Initialize the weights.
- Returns:
x0 – The weights.
- Return type:
numpy.ndarray
- optimize()
Optimize the plan.
- Returns:
numpy.ndarray – The optimized weights.
numpy.ndarray – The total dose.
float – The cost.
- postProcess(result)
Post-process the optimization result. !! The spots and the according weight bellow the thresholdSpotRemoval are removed from the plan and beamlet matrix !! The optimized weights are saved in self.plan.spotMUs
- Parameters:
result (dict) – The optimization result.
- Returns:
numpy.ndarray – The total dose.
float – The value of the objective function.
- stop_GPU_accelration()
stop the use of GPU acceleration
- use_GPU_acceleration()
Enable the uses of the GPU via cupy and cupyx (both library need to be installed as well as CUDA).
- property xSquared
opentps.core.processing.planOptimization.planOptimizationConfig module
- class PlanOptimizationConfig(*args, **kwargs)
Bases:
AbstractApplicationConfig
This class is used to store the configuration of the plan optimization. Inherit from AbstractApplicationConfig.
Attribute
- imptSolverstr
The solver used for the IMPT optimization. Default is ‘Scipy-LBFGS’.
- imptMaxIterint
The maximum number of iterations for the IMPT optimization. Default is 100.
- property imptMaxIter: int
- property imptSolver: str
opentps.core.processing.planOptimization.planPreprocessing module
- class ExtendedBeam
Bases:
PlanIonBeam
Class to extend the PlanIonBeam class with a list of layers. Inherits from PlanIonBeam.
- Variables:
laverIndices (Sequence[int]) – The indices of the layers in the beam.
- classmethod fromBeam(beam: PlanIonBeam)
Creates a new ExtendedBeam from a PlanIonBeam.
- Parameters:
beam (PlanIonBeam) – The beam to copy.
- Returns:
The new beam.
- Return type:
- property layersIndices: Sequence[int]
- class ExtendedPlanIonLayer(nominalEnergy: float = 0.0)
Bases:
PlanIonLayer
Class to extend the PlanIonLayer class with a list of spots. Inherits from PlanIonLayer.
- Variables:
spots (Sequence[PlanIonSpot]) – The spots in the layer.
spotIndices (Sequence[int]) – The indices of the spots in the layer.
id (int) – The id of the layer.
beamID (int) – The id of the beam the layer belongs to.
- classmethod fromLayer(layer: PlanIonLayer)
Creates a new ExtendedPlanIonLayer from a PlanIonLayer.
- Parameters:
layer (PlanIonLayer) – The layer to copy.
- Returns:
The new layer.
- Return type:
- property spotIndices: Sequence[int]
- property spots: Sequence[PlanIonSpot]
opentps.core.processing.planOptimization.tools module
- class WeightStructure(plan: RTPlan)
Bases:
object
This class defines the weight structure object interface. This class is required to generate arc plans It is intended to define several structures and utilities such as list of weights/energies grouped by layer or by beam but also functions computing ELST, sparsity of the plan, etc.
- Variables:
plan (RTPlan) – The plan to be optimized
beamletMatrix (scipy.sparse.csc_matrix) – The beamlet matrix of the plan
x (numpy.ndarray) – The weights of the beamlets
nSpots (int) – The total number of spots in the plan
nBeams (int) – The total number of beams in the plan
nLayers (int) – The total number of layers in the plan
nSpotsInLayer (numpy.ndarray) – The number of spots in each layer
nSpotsInBeam (numpy.ndarray) – The number of spots in each beam
nLayersInBeam (numpy.ndarray) – The number of layers in each beam
energyLayers (list) – The energies of each layer
nSpotsGrouped (int) – The total number of spots in the plan after grouping
sparseMatrixGrouped (scipy.sparse.csc_matrix) – The beamlet matrix of the plan after grouping
xGrouped (numpy.ndarray) – The weights of the beamlets after grouping
spotsGrouped (list) – The list of spots after grouping
beamsGrouped (list) – The list of beams after grouping
layersGrouped (list) – The list of layers after grouping
spotNewID (list) – The list of new spot IDs after grouping
- computeELSparsity(x, nLayers)
return the percentage of active energy layers in the plan (non-null weight) input: - x: spot weights - nLayers: threshold on number of active layers in each beam
- Parameters:
x (numpy.ndarray) – The weights of the beamlets
nLayers (int) – The threshold on number of active layers in each beam
- Returns:
The percentage of active energy layers in the plan (non-null weight) = Sparsity
- Return type:
float
- computeIrradiationTime(x)
return the irradiation time of the plan (in seconds)
- Parameters:
x (numpy.ndarray) – The weights of the beamlets
- Returns:
float – The Energy layer switching time (ELST) in seconds
int – The number of upwards energy switching
int – The number of downwards energy switching
- computeNOfLayers()
return total number of energy layers in the plan
- Returns:
The total number of energy layers in the plan
- Return type:
int
- getBeamStructure(x)
transform 1d weight vector into list of layers vectors ordered by beam [[[b1e1],[b1e2],…],[[b2e1],[b2e2],…],…,[[bBe1],…,[bBeE]]]
- Parameters:
x (numpy.ndarray) – The weights of the beamlets
- Returns:
The list of layers vectors ordered by beam
- Return type:
list
- getEnergyStructure(x)
transform 1d weight vector into list of weights vectors ordered by energy layer and beam [b1e1,b1e2,…,b2e1,b2e2,…,bBeE]
- Parameters:
x (numpy.ndarray) – The weights of the beamlets
- Returns:
The list of weights vectors ordered by energy layer and beam
- Return type:
list
- getListOfActiveEnergies(x, regCalc=True)
return list of energies of the active layers (non-null weight) ! zero if layer is not active (len = nLayers)
- Parameters:
x (numpy.ndarray) – The weights of the beamlets
regCalc (bool (default=True)) – If True, the list of energies of the active layers is returned for regularized calculation
- Returns:
The list of energies of the active layers
- Return type:
list
- getListOfActiveLayersInBeams(x)
return list of number of active energy layers in each beam (len = nBeams)
- Parameters:
x (numpy.ndarray) – The weights of the beamlets
- Returns:
The list of number of active energy layers in each beam
- Return type:
list
- getMUPerBeam(x)
return list of MUs in each beam (len=nBeams)
- Parameters:
x (numpy.ndarray) – The weights of the beamlets
- Returns:
The list of MUs in each beam
- Return type:
list
- getMUPerLayer(x)
return list of MUs in each layer (len=nLayers)
- Parameters:
x (numpy.ndarray) – The weights of the beamlets
- Returns:
The list of MUs in each layer
- Return type:
list
- getSpotIndex()
return 3 lists of size=nSpots: *spotsBeams: beam index of each spot *spotsLayers: layer index of each spot *spotsEnergies: energy of each spot
- Returns:
list – The list of beam indices of each spot
list – The list of layer indices of each spot
list – The list of energies of each spot
- getWeightsStruct()
return 3 arrays and 1 list of arrays * nOfSpotsInLayer: array with number of spots in each layer (size=nLayers) * nOfSpotsInBeam: array with number of spots in each beam (size=nBeams) * nOfLayersInBeam: array with number of layers in each beam (size=nBeams) * energies: list of arrays with energies of each beam (len=nBeams)
- Returns:
numpy.ndarray – The number of spots in each layer
numpy.ndarray – The number of spots in each beam
numpy.ndarray – The number of layers in each beam
- groupSol()
group solution x (weights) into the object
- groupSpots(groupSpotsby=10)
Group spot by a given parameter. Allows to get a faster optimal solution to be used as a warm start for higher scale problem
- Parameters:
groupSpotsby (int (default=10)) – The number of spots to be grouped
- isActivated(el: PlanIonLayer) bool
return True if layer is activated (non-null weight)
- Parameters:
el (PlanIonLayer) – The layer to be checked
- Returns:
True if layer is activated (non-null weight)
- Return type:
bool
- loadSolution(x)
load solution x (weights) into the object
- ungroupSol()
ungroup solution x (weights) into the object
- evaluateClinical(dose, contours, clinDict)
Evaluate clinical constraints
- Parameters:
dose (numpy.ndarray) – The dose matrix
contours (list) – The list of contours
clinDict (dict) – The dictionary of clinical constraints
- getEnergyWeights(energyList)
return list of energy layer weights (len = nLayers); if upward energy switching or same energy: cost = 5.5 if downward energy switching: cost = 0.6 [FIX ME]: first layer ?
- Parameters:
energyList (list) – The list of energies of each layer
- Returns:
The list of energy layer weights
- Return type:
list