/// <summary> /// Business logic for the script. /// </summary> public void Execute(ScriptContext context) { Context = context; Plan = GetPlan(Context); if (Plan == null) { return; } // Define EUD and TCP/NTCP parameters for each structure in the plan. Here we use the corresponding value from the resources (except for 'body'). // This is a patient and plan specific part. Dictionary <string, EUDparameters> parameters = new Dictionary <string, EUDparameters>(); parameters.Add("body", new EUDparameters(2.0, 1.0, 25.0, 10.0)); parameters.Add("cord", ParameterLibrary["Spinal cord"]); parameters.Add("heart", ParameterLibrary["Heart"]); parameters.Add("left lung", ParameterLibrary["Lung"]); parameters.Add("right lung", ParameterLibrary["Lung"]); parameters.Add("PTV (breast tis)", ParameterLibrary["Breast"]); // Get structures defined in the plan. var structures = Plan.StructureSet.Structures; // Container for calculation results. Dictionary <string, CalculationResult> dvhData = new Dictionary <string, CalculationResult>(); // Calculate NTCP for normal tissue structures and TCP for target structures. foreach (var st in structures) { DVHData dataItem = Plan.GetDVHCumulativeData(st, Common.Model.Types.DoseValuePresentation.Absolute, Common.Model.Types.VolumePresentation.Relative, BinWidth); EUDparameters pr = parameters[st.Id]; CalculationResult res = CalculateEUDandProbability(dataItem, pr.gamma50, pr.a, pr.D50, pr.AlphaToBeta); dvhData.Add(st.Id, res); } ReportResults(dvhData); return; }
public void Execute(ScriptContext context /*, System.Windows.Window window*/) { Patient patient = context.Patient; if (patient == null) { throw new ApplicationException("Please load a patient."); } // Get active structureset StructureSet ss = context.StructureSet; if (ss == null) { throw new ApplicationException("Please load a structure set."); } // Check that unique body structure, PTV and Rectum structures exist Structure body = ss.Structures.Where(o => o.Id == "BODY").FirstOrDefault(); Structure ptv = ss.Structures.Where(o => o.Id == "PTV").FirstOrDefault(); Structure rectum = ss.Structures.Where(o => o.Id == "Rectum1").FirstOrDefault(); if (body == null || ptv == null || rectum == null) { throw new ApplicationException(string.Format("Cannot find required structures (BODY, PTV, Rectum) from Structureset '{0}'", ss.Id)); } // Enable modifications patient.BeginModifications(); // Get or create course with Id 'Superplan' const string courseId = "Superplan"; Course course = patient.Courses.Where(o => o.Id == courseId).SingleOrDefault(); if (course == null) { course = patient.AddCourse(); course.Id = courseId; } // Create a new plan ExternalPlanSetup plan = course.AddExternalPlanSetup(ss); int fractions = 20; double prescribedPercentage = 1.0; DoseValue fractiondose = new DoseValue(2.50, DoseValue.DoseUnit.Gy); // TODO: if needed change to cGy to match your system configuration plan.UniqueFractionation.SetPrescription(fractions, fractiondose, prescribedPercentage); // Add fields const int nfields = 5; ExternalBeamMachineParameters parameters = new ExternalBeamMachineParameters("Varian 23EX", "6X", 600, "STATIC", null); // TODO: change machine id to yours VVector isocenter = ptv.CenterPoint; for (int n = 0; n < nfields; n++) { // add a 10 cm x 10 cm field Beam beam = plan.AddStaticBeam(parameters, new VRect <double>(-50, -50, 50, 50), 0, Math.Round(360.0 / nfields * n, 0), 0, isocenter); } // end of first part. MessageBox.Show("Plan created, open course SuperPlan, Choose Plan1 to view results.", "Varian Developer"); // Set optimization constraints OptimizationSetup optimizationSetup = plan.OptimizationSetup; optimizationSetup.AddPointObjective(ptv, OptimizationObjectiveOperator.Lower, new DoseValue(49.50, DoseValue.DoseUnit.Gy), 100, 100.0); optimizationSetup.AddPointObjective(ptv, OptimizationObjectiveOperator.Upper, new DoseValue(52.00, DoseValue.DoseUnit.Gy), 0, 100.0); optimizationSetup.AddPointObjective(rectum, OptimizationObjectiveOperator.Upper, new DoseValue(20.00, DoseValue.DoseUnit.Gy), 40.0, 100.0); MessageBox.Show("Plan '" + plan.Id + "' in course '" + course.Id + "' for patient '" + patient.Id + "' has been created"); // optimize for 30 iterations if (!plan.Optimize(30).Success) { MessageBox.Show("Optimization failed", "Varian Developer", MessageBoxButton.OK, MessageBoxImage.Error); return; } // run LMC if (!plan.CalculateLeafMotions().Success) { MessageBox.Show("LMC failed", "Varian Developer", MessageBoxButton.OK, MessageBoxImage.Error); return; } // calculate final dose CalculationResult doseCalc = plan.CalculateDose(); if (!doseCalc.Success) { MessageBox.Show("Dose calculation failed, logs shown next.", "Varian Developer", MessageBoxButton.OK, MessageBoxImage.Error); // write calculate logs to a file and show them to the user. string filename = writeCalculationLogs(plan); // 'Start' generated TXT file to launch Notepad window System.Diagnostics.Process.Start(filename); // Sleep for a few seconds to let Excel window start System.Threading.Thread.Sleep(TimeSpan.FromSeconds(3)); return; } MessageBox.Show("Done"); }