import math from tkinter import * from tkinter import messagebox # Add necessary folders to the system path: sys.path.append("C:\\temp\\raystation-scripts\\def_regions") sys.path.append("C:\\temp\\raystation-scripts\\functions") sys.path.append("C:\\temp\\raystation-scripts\\gui_classes") sys.path.append("C:\\temp\\raystation-scripts\\quality_control") sys.path.append("C:\\temp\\raystation-scripts\\rt_classes") sys.path.append("C:\\temp\\raystation-scripts\\settings") # Import local files: import patient_model_functions as PMF import roi as ROI import rois as ROIS # Load case data: try: case = get_current("Case") except SystemError: raise IOError("No case loaded.") # Load patient model, examination and structure set: pm = case.PatientModel examination = get_current("Examination") ss = PMF.get_structure_set(pm, examination) # Create the posterior half ROI: PMF.create_posterior_half(pm, examination, ss, ROIS.rectum, ROIS.dorso_rectum)
class Plan(object): def __init__(self, patient, case, mq_patient): self.patient = patient self.case = case self.mq_patient = mq_patient # Load patient model, examination and structure set: pm = case.PatientModel examination = get_current("Examination") ss = PMF.get_structure_set(pm, examination) # Determine if a target volume is present (raises error if not): if not PMF.has_defined_ctv_or_ptv(pm, examination): GUIF.handle_missing_ctv_or_ptv() # Check if the last CT has been set as primary, and display a warning if not. success = TS_C.TSCase(case).last_examination_used_test() if not success: GUIF.handle_primary_is_not_most_recent_ct() # Setup and run GUI: my_window = Tk() (region_code, fraction_dose, nr_fractions, initials, total_dose) = GUIF.collect_fractionation_choices(my_window) # Load list of region codes and corresponding region names and get the region name for our particular region code (raise error if a name is not retrieved): regions = REGIONS.RegionList( "C:\\temp\\raystation-scripts\\settings\\regions.tsv") region_text = regions.get_text(region_code) assert region_text != None # For SBRT brain or lung, if there are multiple targets, an extra form appear where # the user has to type region code of the other targets. # FIXME: Bruke funksjon for test fx? # FIXME: Vurder hvor denne koden bør ligge. target = None palliative_choices = None nr_targets = SSF.determine_nr_of_indexed_ptvs(ss) if nr_targets > 1: if region_code in RC.brain_codes + RC.lung_codes: if PF.is_stereotactic(nr_fractions, fraction_dose): region_codes = GUIF.multiple_beamset_form(ss, Toplevel()) GUIF.check_region_codes(region_code, region_codes) elif region_code in RC.palliative_codes: # For palliative cases with multiple targets: palliative_choices = GUIF.palliative_beamset_form( ss, Toplevel()) if palliative_choices[0] in [ 'sep_beamset_iso', 'sep_beamset_sep_iso' ]: region_codes = GUIF.multiple_beamset_form(ss, Toplevel()) GUIF.check_region_codes(region_code, region_codes) if SSF.has_roi_with_shape(ss, ROIS.ctv1.name): target = ROIS.ctv1.name elif SSF.has_roi_with_shape(ss, ROIS.ctv2.name): target = ROIS.ctv2.name elif SSF.has_roi_with_shape(ss, ROIS.ctv3.name): target = ROIS.ctv3.name elif SSF.has_roi_with_shape(ss, ROIS.ctv4.name): target = ROIS.ctv4.name elif palliative_choices[0] == 'sep_plan': target = palliative_choices[1] # Set up plan, making sure the plan name does not already exist. If the plan name exists, (1), (2), (3) etc is added behind the name. plan = CF.create_plan(case, examination, region_text) # Check that the number of fractions and fraction dose is among those expected for the given region code GUIF.check_input(ss, region_code, nr_fractions, fraction_dose) # Set planners initials plan.PlannedBy = initials # Set dose grid, 0.2x0.2x0.2 cm3 for stereotactic treatments and for prostate and 0.3x03x0.3 cm3 otherwise PF.set_dose_grid(plan, region_code, nr_fractions, fraction_dose) my_window = Toplevel() # Determine which technique and optimization choices which will appear in the form results = GUIF.determine_choices(region_code, nr_fractions, fraction_dose, my_window, []) # Chosen technique value, 'VMAT' or 'Conformal' technique = results[0] # Chosen technique name, 'VMAT' or '3D-CRT' technique_name = results[1] # Chosen optimization value opt = results[2] # Determine prescription target: if not target: roi_dict = SSF.create_roi_dict(ss) target = SSF.determine_target(ss, roi_dict, nr_fractions, fraction_dose) # Translate the couch in the longitudinal direction according to the target position if SSF.has_roi_with_shape(ss, ROIS.couch.name): PMF.translate_couch_long(pm, ss, examination, target) # Create 'Mask_PTV' for partial brain and stereotactic brain if region_code in RC.brain_codes and region_code not in RC.brain_whole_codes: if nr_targets > 1: targets = [ROIS.ptv1, ROIS.ptv2, ROIS.ptv3, ROIS.ptv4] for i in range(nr_targets): SSF.create_expanded_and_intersected_volume( pm, examination, ss, targets[i], ROIS.external, ROIS.mask_ptv.name + str(i + 1), 1600) patient.SetRoiVisibility(RoiName=ROIS.mask_ptv.name + str(i + 1), IsVisible=False) else: SSF.create_expanded_and_intersected_volume( pm, examination, ss, ROIS.ptv, ROIS.external, ROIS.mask_ptv.name, 1600) patient.SetRoiVisibility(RoiName=ROIS.mask_ptv.name, IsVisible=False) # Create 'Mask_PTV' for stereotactic lung if region_code in RC.lung_codes and PF.is_stereotactic( nr_fractions, fraction_dose): if nr_targets > 1: targets = [ROIS.ptv1, ROIS.ptv2, ROIS.ptv3] for i in range(nr_targets): created = SSF.create_roi_subtraction( pm, examination, ss, targets[i], ROIS.chestwall, ROIS.mask_ptv.name + str(i + 1), 0) if created: patient.SetRoiVisibility(RoiName=ROIS.mask_ptv.name + str(i + 1), IsVisible=False) else: created = SSF.create_roi_subtraction(pm, examination, ss, ROIS.ptv, ROIS.chestwall, ROIS.mask_ptv.name, 0) if created: patient.SetRoiVisibility(RoiName=ROIS.mask_ptv.name, IsVisible=False) # Determine name of the body contour ('External' or 'Body'): external = SSF.body_roi_name(ss) if not external: GUIF.handle_missing_external() # Determine the machine name from the size of the target volume, only one target is taken into consideration here. # For those situations where you have two targets and you want to have separate isocenters, then you what to evaluate the targets separately. if target in [ ROIS.ctv1.name, ROIS.ctv2.name, ROIS.ctv3.name, ROIS.ctv4.name ] and palliative_choices[0] in ['sep_beamset_sep_iso', 'sep_plan']: energy_name = SSF.determine_energy_single_target(ss, target) elif region_code in RC.breast_codes: energy_name = '6' else: # Determine the machine name from the size of the target volume: energy_name = SSF.determine_energy(ss, target) # Create the name of the beamset beam_set_name = BSF.label(region_code, fraction_dose, nr_fractions, technique) # Create primary beam set: beam_set = PF.create_beam_set(plan, beam_set_name, examination, technique, nr_fractions) # Add prescription: BSF.add_prescription(beam_set, nr_fractions, fraction_dose, target) # Determine the point which will be our isocenter: if nr_targets > 1: if palliative_choices and palliative_choices[0] in [ 'sep_beamset_iso', 'beamset' ]: # Consider all targets when determining isocenter: isocenter = SSF.determine_isocenter(examination, ss, region_code, technique_name, target, external, multiple_targets=True) else: # Set isocenter for PTV1: isocenter = SSF.determine_isocenter(examination, ss, region_code, technique_name, target, external) else: # Consider all targets when determining isocenter: isocenter = SSF.determine_isocenter(examination, ss, region_code, technique_name, target, external, multiple_targets=True) # Determine if this patient has any previous beams in Mosaiq (which impacts which beam number is to be used with this plan): beam_nr = 1 if self.mq_patient: beam_nr = self.mq_patient.next_available_field_number() # Setup beams or arcs nr_beams = BEAMS.setup_beams(ss, examination, beam_set, isocenter, region_code, fraction_dose, technique_name, energy_name, beam_index=beam_nr) # For SBRT brain or lung, if there are multiple targets, create beam sets for all targets # FIXME: Bruke funksjon for test fx? if nr_targets > 1: if region_code in RC.brain_codes + RC.lung_codes and region_code not in RC.brain_whole_codes: if PF.is_stereotactic(nr_fractions, fraction_dose): PF.create_additional_stereotactic_beamsets_prescriptions_and_beams( plan, examination, ss, region_codes, fraction_dose, nr_fractions, external, energy_name, nr_existing_beams=nr_beams) elif region_code in RC.palliative_codes: # Palliative cases with multiple targets: if palliative_choices[0] in [ 'sep_beamset_iso', 'sep_beamset_sep_iso' ]: if palliative_choices[0] == 'sep_beamset_iso': PF.create_additional_palliative_beamsets_prescriptions_and_beams( plan, examination, ss, region_codes, fraction_dose, nr_fractions, external, energy_name, nr_existing_beams=nr_beams, isocenter=isocenter) else: PF.create_additional_palliative_beamsets_prescriptions_and_beams( plan, examination, ss, region_codes, fraction_dose, nr_fractions, external, energy_name, nr_existing_beams=nr_beams) # If there is a 2Gy x 8 boost for breast patients if SSF.has_roi_with_shape( ss, ROIS.ctv_sb.name) and SSF.has_roi_with_shape( ss, ROIS.ptv_c.name) and region_code in RC.breast_codes: PF.create_breast_boost_beamset( ss, plan, examination, isocenter, region_code, ROIS.ctv_sb.name, background_dose=int(round(fraction_dose * nr_fractions))) # Make sure that the original beam set (not this boost beam set) is loaded in the GUI: infos = plan.QueryBeamSetInfo( Filter={'Name': '^' + beam_set_name + '$'}) plan.LoadBeamSet(BeamSetInfo=infos[0]) # Determines and sets up isodoses based on region code and fractionation CF.determine_isodoses(case, ss, region_code, nr_fractions, fraction_dose) # Determine site site = SF.site(pm, examination, ss, plan, nr_fractions, total_dose, region_code, target, technique_name) # Set up Clinical Goals: es = plan.TreatmentCourse.EvaluationSetup CG.setup_clinical_goals(ss, es, site, total_dose, nr_fractions, target) # Loads the plan, done after beam set is created, as this is the only way the CT-images appears in Plan Design and Plan Optimization when the plan is loaded CF.load_plan(case, plan) # Set up beams and optimization for breast patients if technique_name == 'VMAT' and region_code in RC.breast_reg_codes: # Use robust optimization for VMAT breast: OBJF.set_robustness_breast(plan, region_code) elif technique_name == '3D-CRT' and region_code in RC.breast_codes: if region_code in RC.breast_reg_codes: BSF.set_up_beams_and_optimization_for_regional_breast( plan, beam_set, ROIS.ptv_c.name, region_code) else: BSF.set_up_beams_and_optimization_for_tangential_breast( plan, beam_set, plan.PlanOptimizations[0], target.replace("C", "P") + "c") # If there is a 2Gy x 8 boost for breast patients if SSF.has_roi_with_shape( ss, ROIS.ctv_sb.name) and SSF.has_roi_with_shape( ss, ROIS.ptv_c.name): BSF.set_up_beams_and_optimization_for_tangential_breast( plan, plan.BeamSets[1], plan.PlanOptimizations[1], ROIS.ptv_sbc.name) # Set up treat and protect for stereotactic lung #if region_code in RC.lung_codes and PF.is_stereotactic(nr_fractions, fraction_dose): # BSF.set_up_treat_and_protect_for_stereotactic_lung(beam_set, target, 0.5) # Run first optimization on each beam set: for po in plan.PlanOptimizations: po.OptimizationParameters.DoseCalculation.ComputeFinalDose = True # Set 'Constrain leaf motion' to 0.3 for stereotactic patients if PF.is_stereotactic(nr_fractions, fraction_dose): acp = po.OptimizationParameters.TreatmentSetupSettings[ 0].SegmentConversion.ArcConversionProperties acp.UseMaxLeafTravelDistancePerDegree = True acp.MaxLeafTravelDistancePerDegree = 0.3 po.RunOptimization() # Start adaptive optimization if indicated if opt == 'oar': OBJF.adapt_optimization_oar(ss, plan, site.oar_objectives, region_code) if region_code in RC.breast_codes: if region_code in RC.breast_reg_codes: # Need to close leafs behind jaw for breast regional patients BSF.close_leaves_behind_jaw_for_regional_breast(beam_set) # Create 2.5 cm margin to air for breast patient planned with a 3D-CRT technique for robustness purpuses BSF.create_margin_air_for_3dcrt_breast(ss, beam_set, region_code) # Compute dose beam_set.ComputeDose(DoseAlgorithm='CCDose') # Auto scale to prescription for po in plan.PlanOptimizations: po.AutoScaleToPrescription = True # Load plan CF.load_plan(case, plan) # Save patient.Save()
def __init__(self, patient_db, patient, case): self.patient_db = patient_db self.patient = patient self.case = case #messagebox.showinfo("Error.","hei") pm = case.PatientModel examination = get_current("Examination") ss = PMF.get_structure_set(pm, examination) # Check if the last CT has been set as primary, and display a warning if not. #success = TS_C.TSCase(case).last_examination_used_test() #if not success: # GUIF.handle_primary_is_not_most_recent_ct() # Check if any ROIs exist, and if they have a contour in the current Structure Set. # If there is, ask to delete rois. if SSF.has_roi_with_contours(ss): delete = RB.RadioButton('Eksisterende ROIs oppdaget', 'Velg:', DC.delete) my_window = Tk() choice_d = [] delete_choice = GUIF.collect_delete_choice(delete, my_window, choice_d) for i in range(len(delete_choice)): # If the delete all rois choice was selected, delete rois. if delete_choice[i] == 'yes': PMF.delete_all_rois(pm) elif delete_choice[i] == 'some': PMF.delete_rois_except_manually_contoured(pm, ss) my_window = Toplevel() else: my_window = Tk() # Create initial radiobutton object, then recursively iterate it to collect all user choices: regions = RB.RadioButton('Behandlingsregion', 'Velg behandlingsregion:', DC.regions) choices = GUIF.collect_choices(regions, my_window, []) # Create site: site = DS.DefSite(patient_db, pm, examination, ss, choices, targets=[], oars=[]) # Choice 1: Which region is going to be treated? region = choices[0] if region == 'brain': import def_brain as DEF_BRAIN DEF_BRAIN.DefBrain(pm, examination, ss, choices, site) elif region == 'lung': import def_lung as DEF_LUNG DEF_LUNG.DefLung(pm, examination, ss, choices, site) elif region == 'breast': import def_breast as DEF_BREAST DEF_BREAST.DefBreast(pm, examination, ss, choices, site) elif region == 'bladder': import def_bladder as DEF_BLADDER DEF_BLADDER.DefBladder(pm, examination, ss, choices, site) elif region == 'prostate': import def_prostate as DEF_PROSTATE DEF_PROSTATE.DefProstate(pm, examination, ss, choices, site) elif region == 'rectum': import def_rectum as DEF_RECTUM DEF_RECTUM.DefRectum(pm, examination, ss, choices, site) elif region == 'other': import def_palliative as DEF_PALLIATIVE DEF_PALLIATIVE.DefPalliative(pm, examination, ss, choices, site) # Changes OrganType to "Other" for all ROIs in the given patient model which are of type "Undefined" or "Marker". PMF.exclude_rois_from_export(pm) PMF.set_all_undefined_to_organ_type_other(pm)
class Plan(object): def __init__(self, patient, case, mq_patient): self.patient = patient self.case = case self.mq_patient = mq_patient # Load patient model, examination and structure set: pm = case.PatientModel examination = get_current("Examination") ss = PMF.get_structure_set(pm, examination) # Determine if a target volume is present (raises error if not): if not PMF.has_defined_ctv_or_ptv(pm, examination): GUIF.handle_missing_ctv_or_ptv() # Check if the last CT has been set as primary, and display a warning if not: success = TS_C.TSCase(case).last_examination_used_test() if not success: GUIF.handle_primary_is_not_most_recent_ct() # Setup and run GUI: my_window = Tk() (region_code, fraction_dose, nr_fractions, initials, total_dose) = GUIF.collect_fractionation_choices(my_window) # Load list of region codes and corresponding region names, and get the region name for our particular region code (raise error if a name is not retrieved): regions = REGIONS.RegionList("C:\\temp\\raystation-scripts\\settings\\regions.tsv") region_text = regions.get_text(region_code) assert region_text != None # Establish the number of target volumes: nr_targets = SSF.determine_nr_of_indexed_ptvs(ss) # Create the prescription object: prescription = PRES.create_prescription(total_dose, nr_fractions, region_code) # Validate the prescription: valid = PRES.validate_prescription(prescription, region_code) if not valid: GUIF.handle_invalid_prescription(prescription, region_code, region_text) # For SBRT brain or lung, if there are multiple targets, display an extra form # where the user can specify the region code(s) of the other target(s). target, palliative_choices, region_codes = GUIF.collect_target_strategy_and_region_codes(ss, nr_targets, region_code, prescription) # Set up plan, making sure the plan name does not already exist. If the plan name exists, (1), (2), (3) etc is added behind the name: plan = CF.create_plan(case, examination, region_text) # Set planners initials: plan.PlannedBy = initials my_window = Toplevel() # Determine which technique and optimization choices which will appear in the form: results = GUIF.determine_choices(region_code, prescription, my_window, []) # Chosen technique value ('VMAT' or 'Conformal'): technique = results[0] # Chosen technique name ('VMAT' or '3D-CRT'): technique_name = results[1] # Chosen optimization value: opt = results[2] # Determine the prescription target volume: if not target: roi_dict = SSF.create_roi_dict(ss) target = SSF.determine_target(ss, roi_dict, prescription) # Create 'Mask_PTV' for partial brain and stereotactic brain: if region_code in RC.brain_codes and region_code not in RC.brain_whole_codes: PMF.create_mask_ptv_brain(patient, pm, examination, ss, nr_targets) # Create 'Mask_PTV' for stereotactic lung: if region_code in RC.lung_codes and prescription.is_stereotactic(): PMF.create_mask_ptv_lung(patient, pm, examination, ss, nr_targets) # Determine name of the body contour ('External' or 'Body'): external = SSF.body_roi_name(ss) if not external: GUIF.handle_missing_external() # Determine the energy quality from the size of the target volume (note that only one target is taken into consideration here). # For those situations where you have two targets and you want to have separate isocenters, then you what to evaluate the targets separately. if target in [ROIS.ctv1.name, ROIS.ctv2.name, ROIS.ctv3.name, ROIS.ctv4.name] and palliative_choices[0] in ['sep_beamset_sep_iso', 'sep_plan']: energy_name = SSF.determine_energy_single_target(ss, target) elif region_code in RC.breast_codes: energy_name = '6' else: # Determine the energy quality from the size of the target volume: energy_name = SSF.determine_energy(ss, target) # Create beamset name: beam_set_name = BSF.label(region_code, prescription, technique) # Create primary beam set: beam_set = PF.create_beam_set(plan, beam_set_name, examination, technique, prescription.nr_fractions) # Add prescription: BSF.add_prescription(beam_set, prescription, target) # Set beam set dose grid: BSF.set_dose_grid(beam_set, region_code, prescription) # Determine the point which will be our isocenter: if nr_targets > 1: if palliative_choices and palliative_choices[0] in ['sep_beamset_iso', 'beamset']: # Consider all targets when determining isocenter: isocenter = SSF.determine_isocenter(examination, ss, region_code, technique_name, target, external, multiple_targets = True) else: # Set isocenter for PTV1: isocenter = SSF.determine_isocenter(examination, ss, region_code, technique_name, target, external) else: # Consider all targets when determining isocenter: isocenter = SSF.determine_isocenter(examination, ss, region_code, technique_name, target, external, multiple_targets = True) # Determine if this patient has any previous beams in Mosaiq (which impacts which beam number is to be used with this plan): beam_nr = 1 if self.mq_patient: beam_nr = self.mq_patient.next_available_field_number() # Setup beams (or arcs): nr_beams = BEAMS.setup_beams(ss, examination, beam_set, isocenter, region_code, prescription.fraction_dose, technique_name, energy_name, beam_index=beam_nr) last_beam_index = beam_nr + nr_beams - 1 # For SBRT brain or lung, if there are multiple targets, create beam sets for all targets: if nr_targets > 1: if region_code in RC.brain_codes + RC.lung_codes and region_code not in RC.brain_whole_codes: if prescription.is_stereotactic(): PF.create_additional_stereotactic_beamsets_prescriptions_and_beams(plan, examination, ss, region_codes, prescription, external, energy_name, nr_existing_beams = last_beam_index) elif region_code in RC.palliative_codes: # Palliative cases with multiple targets: if palliative_choices[0] in ['sep_beamset_iso', 'sep_beamset_sep_iso']: if palliative_choices[0] == 'sep_beamset_iso': PF.create_additional_palliative_beamsets_prescriptions_and_beams(plan, examination, ss, region_codes, prescription, external, energy_name, nr_existing_beams = last_beam_index, isocenter = isocenter) else: PF.create_additional_palliative_beamsets_prescriptions_and_beams(plan, examination, ss, region_codes, prescription, external, energy_name, nr_existing_beams = last_beam_index) # Creates a 2 Gy x 8 boost beam set for breast patients, if indicated: if SSF.breast_boost_is_indicated(ss, region_code): PF.create_breast_boost_beamset(ss, plan, examination, isocenter, region_code, ROIS.ctv_sb.name, background_dose=int(round(prescription.total_dose))) # Make sure that the original beam set (not this boost beam set) is loaded in the GUI: infos = plan.QueryBeamSetInfo(Filter={'Name':'^'+beam_set_name+'$'}) plan.LoadBeamSet( BeamSetInfo=infos[0]) # Determines and sets up isodoses based on region code and fractionation: CF.determine_isodoses(case, ss, region_code, prescription) # Determine site: site = SF.site(pm, examination, ss, plan, prescription, region_code, target, technique_name) # Set up Clinical Goals: es = plan.TreatmentCourse.EvaluationSetup CG.setup_clinical_goals(ss, es, site, prescription, target) # Loads the plan (done after beam set is created, as this is the only way the CT-images appears in Plan Design and Plan Optimization when the plan is loaded): CF.load_plan(case, plan) # Set up beams and optimization for breast patients: if technique_name == 'VMAT' and region_code in RC.breast_reg_codes: # Use robust optimization for VMAT breast: OBJF.set_robustness_breast(plan, region_code) elif technique_name == '3D-CRT' and region_code in RC.breast_codes: if region_code in RC.breast_reg_codes: BSF.set_up_beams_and_optimization_for_regional_breast(plan, beam_set, ROIS.ptv_c.name, region_code) else: BSF.set_up_beams_and_optimization_for_tangential_breast(plan, beam_set, plan.PlanOptimizations[0], target.replace("C", "P")+"c") # Configures the 2 Gy x 8 boost for breast patients, if indicated: if SSF.breast_boost_is_indicated(ss, region_code): BSF.set_up_beams_and_optimization_for_tangential_breast(plan, plan.BeamSets[1], plan.PlanOptimizations[1], ROIS.ptv_sbc.name) # Set up treat and protect for stereotactic lung: #if region_code in RC.lung_codes and prescription.is_stereotactic(): # BSF.set_up_treat_and_protect_for_stereotactic_lung(beam_set, target, 0.5) # Run first optimization on each beam set: for plan_optimization in plan.PlanOptimizations: # Optimization parameters to be used on all cases (3D-CRT and VMAT): plan_optimization.OptimizationParameters.DoseCalculation.ComputeFinalDose = True # Configure optimization parameters for VMAT only: if "Arc" in plan_optimization.OptimizedBeamSets[0].DeliveryTechnique: optimization_parameters = OPT.optimization_parameters(region_code, prescription.fraction_dose) optimization_parameters.apply_to(plan_optimization) # Run the optimization (may crash if GPU for computation is not available): try: plan_optimization.RunOptimization() except: GUIF.handle_failed_dose_computation() # Start adaptive optimization if indicated: if opt == 'oar': try: OBJF.adapt_optimization_oar(ss, plan, site.oar_objectives, region_code) except: GUIF.handle_failed_dose_computation() if region_code in RC.breast_codes and technique_name != 'VMAT': # Modify leaves for the open fields in non-VMAT breast: if region_code in RC.breast_reg_codes: # Close leaves behind jaw for breast regional patients: BSF.close_leaves_behind_jaw_for_regional_breast(beam_set) # Create 2.5 cm margin to air for breast patient planned with a 3D-CRT technique (for robustness purpuses): BSF.create_margin_air_for_3dcrt_breast(ss, beam_set, region_code) # Compute dose: try: beam_set.ComputeDose(DoseAlgorithm = 'CCDose') except: GUIF.handle_failed_dose_computation() # Auto scale to prescription: for plan_optimization in plan.PlanOptimizations: plan_optimization.AutoScaleToPrescription = True # Load plan: CF.load_plan(case, plan) # Save: patient.Save()
def __init__(self, patient_db, patient, case): self.patient_db = patient_db self.patient = patient self.case = case # Load patient model, examination and structure set: pm = case.PatientModel examination = get_current("Examination") ss = PMF.get_structure_set(pm, examination) # Check if the last CT has been set as primary, and display a warning if not. # (This is activated in the plan script, but currently not here in the def script) #success = TS_C.TSCase(case).last_examination_used_test() #if not success: # GUIF.handle_primary_is_not_most_recent_ct() # Handle existing ROIs (if there are any): my_window = GUIF.handle_existing_rois(pm, ss) # Create initial radiobutton object, then recursively iterate it to collect all user choices: regions = RB.RadioButton('Behandlingsregion', 'Velg behandlingsregion:', DC.regions) choices = GUIF.collect_choices(regions, my_window, []) # Create site: site = DS.DefSite(patient_db, pm, examination, ss, choices, targets=[], oars=[]) # Choice 1: Which region is going to be treated? region = choices[0] # Execute the def script which corresponds to the user choice: if region == 'brain': import def_brain as DEF_BRAIN DEF_BRAIN.DefBrain(pm, examination, ss, choices, site) elif region == 'lung': import def_lung as DEF_LUNG DEF_LUNG.DefLung(pm, examination, ss, choices, site) elif region == 'breast': import def_breast as DEF_BREAST DEF_BREAST.DefBreast(pm, examination, ss, choices, site) elif region == 'bladder': import def_bladder as DEF_BLADDER DEF_BLADDER.DefBladder(pm, examination, ss, choices, site) elif region == 'prostate': import def_prostate as DEF_PROSTATE DEF_PROSTATE.DefProstate(pm, examination, ss, choices, site) elif region == 'rectum': import def_rectum as DEF_RECTUM DEF_RECTUM.DefRectum(pm, examination, ss, choices, site) elif region == 'other': import def_palliative as DEF_PALLIATIVE DEF_PALLIATIVE.DefPalliative(pm, examination, ss, choices, site) # Changes OrganType to "Other" for all ROIs in the given patient model which are of type "Undefined" or "Marker". PMF.exclude_rois_from_export(pm) PMF.set_all_undefined_to_organ_type_other(pm)