/// <summary> /// This splits a structure into two. It creates a margin around the target, /// so that it approximately crosses the mass center of the structure, and then /// uses boolean operators to create two new structures. Note: due to the nature /// of the segment model in Eclipse, the new structures do not always perfectly cover /// the whole volume of the original structure. /// </summary> /// <param name="s"></param> /// <param name="ss"></param> /// <returns></returns> bool SplitStructure(StructureSet ss, Structure target, Structure roi) { if (ss.CanAddStructure(roi.DicomType, roi.Id + "_spl1")) { Structure newStr1 = ss.AddStructure(roi.DicomType, roi.Id + "_spl1"); Structure newStr2 = ss.AddStructure(roi.DicomType, roi.Id + "_spl2"); VVector targetCenter = target.CenterPoint; VVector roiCenter = roi.CenterPoint; double dist = (targetCenter - roiCenter).Length; //figure out distance from target center to target surface System.Collections.BitArray buffer = new System.Collections.BitArray(100); SegmentProfile profile = target.GetSegmentProfile(targetCenter, roiCenter, buffer); double distToTargetSurface = 0; foreach (SegmentProfilePoint point in profile) { if (point.Value == false) { //first point outside structure distToTargetSurface = (point.Position - targetCenter).Length; break; } } //SegmentVolume seg = target.Margin(dist - distToTargetSurface); SegmentVolume seg = target.LargeMargin(dist - distToTargetSurface); newStr1.SegmentVolume = seg.And(roi); newStr2.SegmentVolume = roi.Sub(newStr1); return(true); } return(false); }
public static DoseValue CalculateMeanDose(PlanSetup plan, Structure structure) { Dose dose = plan.Dose; if (dose == null) { return(new DoseValue(Double.NaN, DoseValue.DoseUnit.Unknown)); } plan.DoseValuePresentation = DoseValuePresentation.Absolute; double sum = 0.0; int count = 0; double xres = 2.5; double yres = 2.5; double zres = 2.5; int xcount = (int)((dose.XRes * dose.XSize) / xres); System.Collections.BitArray segmentStride = new System.Collections.BitArray(xcount); double[] doseArray = new double[xcount]; DoseValue.DoseUnit doseUnit = dose.DoseMax3D.Unit; for (double z = 0; z < dose.ZSize * dose.ZRes; z += zres) { for (double y = 0; y < dose.YSize * dose.YRes; y += yres) { VVector start = dose.Origin + dose.YDirection * y + dose.ZDirection * z; VVector end = start + dose.XDirection * dose.XRes * dose.XSize; SegmentProfile segmentProfile = structure.GetSegmentProfile(start, end, segmentStride); DoseProfile doseProfile = null; for (int i = 0; i < segmentProfile.Count; i++) { if (segmentStride[i]) { if (doseProfile == null) { doseProfile = dose.GetDoseProfile(start, end, doseArray); } double doseValue = doseProfile[i].Value; if (!Double.IsNaN(doseValue)) { sum += doseProfile[i].Value; count++; } } } doseProfile = null; } } double mean = sum / ((double)count); return(new DoseValue(mean, doseUnit)); }