/// <summary> /// Read the structure set from a DICOM dataset. /// </summary> /// <param name="ds"></param> /// <returns></returns> public static RadiotherapyStruct Read(DicomDataset ds) { var patient = DicomPatient.Read(ds); var study = DicomStudy.Read(ds); var series = DicomRTSeries.Read(ds); var equipment = DicomEquipment.Read(ds); var structureSet = DicomRTStructureSet.Read(ds); // DicomRTStructureSetROI.RoiNumber is the primary key. We try and locate the first observation and roiContour data for eaach // RoiNumber encountered. var structures = DicomRTStructureSetROI.Read(ds); var contoursData = DicomRTContour.Read(ds); var observations = DicomRTObservation.Read(ds); var allContours = new List <RadiotherapyContour>(); foreach (var s in structures) { var roiContours = contoursData.FirstOrDefault(c => c.ReferencedRoiNumber == s.Key); var roiObservation = observations.FirstOrDefault(o => o.ReferencedRoiNumber == s.Key); // we insist both must exist if (roiContours != null && roiObservation != null) { allContours.Add(new RadiotherapyContour(roiContours, s.Value, roiObservation)); } } return(new RadiotherapyStruct(structureSet, patient, equipment, study, series, allContours)); }
/// <summary> /// Serialize the structure set to a DICOM dataset. /// </summary> /// <param name="ds"></param> /// <param name="s"></param> public static void Write(DicomDataset ds, RadiotherapyStruct s) { DicomPatient.Write(ds, s.Patient); DicomStudy.Write(ds, s.Study); DicomRTSeries.Write(ds, s.RTSeries); DicomEquipment.Write(ds, s.Equipment); DicomRTStructureSet.Write(ds, s.StructureSet); // For each ROI, gather the contours, observations and roi details into seperate arrays and serialize var rois = s.Contours.Select(c => c.StructureSetRoi); var contours = s.Contours.Select(c => c.DicomRtContour); var observations = s.Contours.Select(c => c.DicomRtObservation); DicomRTStructureSetROI.Write(ds, rois); DicomRTContour.Write(ds, contours); DicomRTObservation.Write(ds, observations); }
public RadiotherapyContour(DicomRTContour dicomRtContour, DicomRTStructureSetROI structure, DicomRTObservation dicomRtObservation) { DicomRtContour = dicomRtContour; StructureSetRoi = structure; DicomRtObservation = dicomRtObservation; }
public void LoadAndSaveMedicalVolumeTest() { var directory = TestData.GetFullImagesPath("sample_dicom"); var acceptanceTests = new StrictGeometricAcceptanceTest(string.Empty, string.Empty); var medicalVolume = MedIO.LoadAllDicomSeriesInFolderAsync(directory, acceptanceTests).Result.First().Volume; Directory.CreateDirectory(_tempFolder); Console.WriteLine($"Directory created {_tempFolder}"); Volume3D <byte>[] contourVolumes = new Volume3D <byte> [medicalVolume.Struct.Contours.Count]; for (int i = 0; i < medicalVolume.Struct.Contours.Count; i++) { contourVolumes[i] = new Volume3D <byte>( medicalVolume.Volume.DimX, medicalVolume.Volume.DimY, medicalVolume.Volume.DimZ, medicalVolume.Volume.SpacingX, medicalVolume.Volume.SpacingY, medicalVolume.Volume.SpacingZ, medicalVolume.Volume.Origin, medicalVolume.Volume.Direction); contourVolumes[i].Fill(medicalVolume.Struct.Contours[i].Contours, (byte)1); } // Calculate contours based on masks var rtContours = new List <RadiotherapyContour>(); for (int i = 0; i < medicalVolume.Struct.Contours.Count; i++) { var contour = medicalVolume.Struct.Contours[i]; var contourForAllSlices = GetContoursForAllSlices(contourVolumes[i]); var rtcontour = new DicomRTContour( contour.DicomRtContour.ReferencedRoiNumber, contour.DicomRtContour.RGBColor, contourForAllSlices); DicomRTStructureSetROI rtROIstructure = new DicomRTStructureSetROI( contour.StructureSetRoi.RoiNumber, contour.StructureSetRoi.RoiName, string.Empty, ERoiGenerationAlgorithm.Semiautomatic); DicomRTObservation observation = new DicomRTObservation( contour.DicomRtObservation.ReferencedRoiNumber, new DicomPersonNameConverter("Left^Richard^^Dr"), ROIInterpretedType.EXTERNAL); rtContours.Add(new RadiotherapyContour(rtcontour, rtROIstructure, observation)); } var rtStructureSet = new RadiotherapyStruct( medicalVolume.Struct.StructureSet, medicalVolume.Struct.Patient, medicalVolume.Struct.Equipment, medicalVolume.Struct.Study, medicalVolume.Struct.RTSeries, rtContours); MedIO.SaveMedicalVolumeAsync(_tempFolder, new MedicalVolume( medicalVolume.Volume, medicalVolume.Identifiers, medicalVolume.FilePaths, rtStructureSet)).Wait(); var medicalVolume2 = MedIO.LoadAllDicomSeriesInFolderAsync(_tempFolder, acceptanceTests).Result.First().Volume; foreach (var radiotherapyContour in medicalVolume2.Struct.Contours.Where(x => x.DicomRtContour.DicomRtContourItems.First().GeometricType == "CLOSED_PLANAR")) { var savedContour = medicalVolume2.Struct.Contours.First(x => x.StructureSetRoi.RoiName == radiotherapyContour.StructureSetRoi.RoiName); foreach (var contour in radiotherapyContour.Contours) { Assert.AreEqual(radiotherapyContour.DicomRtObservation.ROIInterpretedType, ROIInterpretedType.EXTERNAL); for (int i = 0; i < contour.Value.Count; i++) { if (!contour.Value[i].Equals(savedContour.Contours.ContoursForSlice(contour.Key)[i])) { Console.WriteLine(radiotherapyContour.StructureSetRoi.RoiName); Assert.Fail(); } } } } }