public static Tuple <bool, List <List <string> > > Optimize(List <List <double[, ]> > choppedContours, List <double[]> planes, ref ExternalPlanSetup plan, ref StructureSet ss, HNPlan hnPlan, ScriptContext context, List <List <Structure> > optimizedStructures, List <List <Structure> > matchingStructures, string contraName, int numIterations, List <Tuple <bool, double[], string> > features, Tuple <string, string, bool> beamParams) //return a list of strings which is the log of constraint updates during optimization. { //Only make parotid structures if that feature has been selected if (features[0].Item1 == true) { double priorityRatio = features[0].Item2[0]; Segmentation.MakeParotidStructures(choppedContours, planes, ref plan, ref ss, hnPlan, context, matchingStructures, contraName, priorityRatio); } else { //remove previously segmented structures if there foreach (Structure structure in ss.Structures.ToList()) { if (structure.Name.ToLower().Contains("cpg_subseg")) { ss.RemoveStructure(structure); } } } //Now run the first VMAT optimization. plan.SetCalculationModel(CalculationType.PhotonVMATOptimization, "PO_13623"); plan.SetCalculationModel(CalculationType.DVHEstimation, "DVH Estimation Algorithm [15.6.06]"); plan.SetCalculationModel(CalculationType.PhotonVolumeDose, "AAA_13623"); plan.OptimizationSetup.AddNormalTissueObjective(100, 3, 95, 50, 0.2); bool jawTracking = beamParams.Item3; //use jaw tracking if (jawTracking) { try { plan.OptimizationSetup.UseJawTracking = true; } catch { System.Windows.MessageBox.Show("Could not use jaw tracking. Proceeding without."); } } // plan.OptimizeVMAT(); plan.CalculateDose(); string treatmentCenter = beamParams.Item1; string treatmentArea = beamParams.Item2; string mlcId = ""; int areaNum = Int32.Parse(Regex.Match(treatmentArea, @"\d+").Value); if (treatmentCenter == "BC Cancer - Surrey") { switch (areaNum) { case 2: mlcId = ""; break; case 3: mlcId = ""; break; case 4: mlcId = ""; break; case 5: mlcId = ""; break; case 6: mlcId = ""; break; } } else if (treatmentCenter == "BC Cancer - Vancouver") { switch (areaNum) { case 1: mlcId = "1"; break; case 2: mlcId = "HHM0767"; break; case 3: mlcId = ""; break; case 4: mlcId = ""; break; case 5: mlcId = ""; break; case 6: mlcId = "HML0990"; break; case 7: mlcId = "MLC0987"; break; } } string mlcID = "HML0990"; int numCycles = 1; OptimizationOptionsVMAT oov; ; bool isPassed = false; List <List <string> > updateLog = new List <List <string> >(); for (int iter = 0; iter < numIterations; iter++) { //mlcID = plan.Beams.FirstOrDefault<Beam>().MLC.Id; oov = new OptimizationOptionsVMAT(numCycles, mlcID); plan.OptimizeVMAT(oov); plan.CalculateDose(); //Now need to perform a plan check and iteratively adjust constraints based on whether they passed or failed, and whether they passed with flying colours or failed miserably. //Going to find the percentage by which the constraint failed or passed, and adjust both the priority and dose constraint based on this. updateLog.Add(OptObjectivesEditing.UpdateConstraints(ref plan, ref ss, ref hnPlan, context, optimizedStructures, matchingStructures, numCycles)); if (features[0].Item1 == true) { Segmentation.MakeParotidStructures(choppedContours, planes, ref plan, ref ss, hnPlan, context, matchingStructures, contraName, features[0].Item2[0]); } } numCycles = 4; oov = new OptimizationOptionsVMAT(numCycles, mlcID); //Now for a maximum of 3 tries, perform 4-cycle vmat optimization followed by constraint updating until a plan is passed for (int i = 0; i < 3; i++) { plan.OptimizeVMAT(oov); plan.CalculateDose(); updateLog.Add(OptObjectivesEditing.UpdateConstraints(ref plan, ref ss, ref hnPlan, context, optimizedStructures, matchingStructures, numCycles)); if (features[0].Item1 == true) { Segmentation.MakeParotidStructures(choppedContours, planes, ref plan, ref ss, hnPlan, context, matchingStructures, contraName, features[0].Item2[0]); } isPassed = Check.EvaluatePlan(context, hnPlan, matchingStructures, optimizedStructures).Item1; if (isPassed) { break; } } return(Tuple.Create(isPassed, updateLog)); }