private double GetNormFromScan(BeamScanModel scan) { if (scan.BeamScanType == BeamScanTypeEnum.DepthDose) { return(scan.BeamDataPoints.Max(x => x.DoseValue)); } else { return(scan.BeamDataPoints.FirstOrDefault(x => x.Position >= 0).DoseValue); } }
private void PlanSelected(PlanSetup plan) { BeamScans.Clear(); var shift = Convert.ToDouble(ConfigurationManager.AppSettings["PhantomThickness"]) / 2.0; foreach (var beam in plan.Beams) { var fieldX = (beam.ControlPoints.First().JawPositions.X2 - beam.ControlPoints.First().JawPositions.X1) / 10.0; var fieldY = (beam.ControlPoints.First().JawPositions.Y2 - beam.ControlPoints.First().JawPositions.Y1) / 10.0; var depths = new double[] { Convert.ToDouble(ConfigurationManager.AppSettings[beam.EnergyModeDisplayName]), 5, 10, 20, 30 }; foreach (var depth in depths) { // crossline profiles VVector start = new VVector((beam.ControlPoints.First().JawPositions.X1 - 50) * (1000.0 + depth * 10.0) / 1000.0, (depth - shift) * 10.0, 0.0); VVector end = new VVector((beam.ControlPoints.First().JawPositions.X2 + 50) * (1000.0 + depth * 10.0) / 1000.0, (depth - shift) * 10.0, 0.0); var profile = beam.Dose.GetDoseProfile(start, end, new double[Convert.ToInt32(end.x - start.x) + 1]); var beamscan = new BeamScanModel { Energy = beam.EnergyModeDisplayName, BeamScanType = BeamScanTypeEnum.CrosslineProfile, Depth = depth, FieldX = fieldX, FieldY = fieldY, DisplayTxt = $"Crossline {fieldX:F0}*{fieldY:0} - {depth:F1}" }; foreach (var point in profile) { beamscan.BeamDataPoints.Add(new BeamDataPointModel { Position = point.Position.x / 10.0, DoseValue = point.Value }); } BeamScans.Add(beamscan); // diagonal profiles var diag_pos = Math.Sqrt(Math.Pow(beam.ControlPoints.First().JawPositions.X1 - 50, 2) + Math.Pow(beam.ControlPoints.First().JawPositions.Y1 - 50, 2)) * (1000.0 + depth * 10.0) / 1000.0; VVector start_diag = new VVector(-1.0 * diag_pos, (depth - shift) * 10.0, -1.0 * diag_pos); VVector end_diag = new VVector(diag_pos, (depth - shift) * 10.0, diag_pos); var diagonal = beam.Dose.GetDoseProfile(start_diag, end_diag, new double[Convert.ToInt32(end_diag.x - start_diag.x) + 1]); var diagScan = new BeamScanModel { Energy = beam.EnergyModeDisplayName, BeamScanType = BeamScanTypeEnum.DiagonalProfile, Depth = depth, FieldX = fieldX, FieldY = fieldY, DisplayTxt = $"Diagonal {fieldX:F0}*{fieldY:F0} - {depth:F1}" }; foreach (var point in diagonal) { diagScan.BeamDataPoints.Add(new BeamDataPointModel { Position = point.Position.x < 0 ? -1.0 * Math.Sqrt(Math.Pow(point.Position.x, 2) + Math.Pow(point.Position.z, 2)) / 10.0 : Math.Sqrt(Math.Pow(point.Position.x, 2) + Math.Pow(point.Position.z, 2)) / 10.0, DoseValue = point.Value }); } BeamScans.Add(diagScan); } // pdds VVector start_dd = new VVector(0.0, -10.0 * shift, 0.0); //surface VVector end_dd = new VVector(0.0, -10 * shift + 300.0, 0.0); var pdd = beam.Dose.GetDoseProfile(start_dd, end_dd, new double[Convert.ToInt32(end_dd.y - start_dd.y) + 1]); var pdd_scan = new BeamScanModel { Energy = beam.EnergyModeDisplayName, BeamScanType = BeamScanTypeEnum.DepthDose, FieldX = fieldX, FieldY = fieldY, DisplayTxt = $"PDD {fieldX:F0}*{fieldY:F0}" }; foreach (var point in pdd) { pdd_scan.BeamDataPoints.Add(new BeamDataPointModel { Position = point.Position.y / 10.0 + shift, DoseValue = point.Value }); } BeamScans.Add(pdd_scan); } SetPlotModels(); }