Пример #1
0
        /// <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));
        }
Пример #2
0
        /// <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();
                        }
                    }
                }
            }
        }