Esempio n. 1
0
        /// <summary>
        /// Searches for the Series matching a given <see cref="Study"/>, in the local path specified by the user in the <see cref="Configuration"/>, and indexed by the DICOMDIR database.
        /// Implements a local C-FIND at SERIES level command of the DICOM standard.
        /// Implements
        /// </summary>
        /// <param name="configuration">Info on the path and hierarchy used to store the DICOM files.</param>
        public static List <Series> CFINDLocalSeries(Configuration configuration, Study study)
        {
            string dicomDirPath = Path.Combine(configuration.fileDestination, "DICOMDIR");

            // prepare to receive data
            var localSeriesResponses = new List <Series>();

            using (var fileStream = new FileStream(dicomDirPath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None))
            {
                var dicomDir = DicomDirectory.Open(fileStream);
                if (dicomDir != null)
                {
                    foreach (var patientRecord in dicomDir.RootDirectoryRecordCollection)
                    {
                        foreach (var studyRecord in patientRecord.LowerLevelDirectoryRecordCollection)
                        {
                            if (studyRecord.GetSingleValue <string>(DicomTag.StudyInstanceUID) ==
                                study.getStudyInstanceUID())
                            {
                                foreach (var seriesRecord in studyRecord.LowerLevelDirectoryRecordCollection)
                                {
                                    seriesRecord.Add(DicomTag.StudyInstanceUID,
                                                     studyRecord.GetSingleValue <string>(DicomTag.StudyInstanceUID));
                                    seriesRecord.Add(DicomTag.StudyDate,
                                                     studyRecord.GetSingleValue <string>(DicomTag.StudyDate));
                                    Series mySeries = new Series(seriesRecord, configuration.seriesTemplate);
                                    localSeriesResponses.Add(mySeries);
                                }
                            }
                        }
                    }
                }
            }
            return(localSeriesResponses);
        }
Esempio n. 2
0
        /// <summary>
        /// Searches for Studies in the local path, specified by the user in the <see cref="Configuration"/>,
        /// and indexed by the DICOMDIR database.
        /// Implements a local C-FIND at STUDY level command of the DICOM standard
        /// </summary>
        /// <param name="configuration">Info on the path and hierarchy used to store the DICOM files.</param>
        public static List <Study> CFINDLocalStudies(Configuration configuration)
        {
            string dicomDirPath = Path.Combine(configuration.fileDestination, "DICOMDIR");

            // prepare to receive data
            var localStudyResponses = new List <Study>();

            using (var fileStream = new FileStream(dicomDirPath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None))
            {
                var dicomDir = DicomDirectory.Open(fileStream);
                if (dicomDir != null)
                {
                    foreach (var patientRecord in dicomDir.RootDirectoryRecordCollection)
                    {
                        foreach (var studyRecord in patientRecord.LowerLevelDirectoryRecordCollection)
                        {
                            studyRecord.Add(DicomTag.PatientName, patientRecord.GetSingleValue <string>(DicomTag.PatientName));
                            studyRecord.Add(DicomTag.PatientID, patientRecord.GetSingleValue <string>(DicomTag.PatientID));
                            Study myStudy = new Study(studyRecord, configuration.studyTemplate);
                            localStudyResponses.Add(myStudy);
                        }
                    }
                }
            }
            return(localStudyResponses);
        }
Esempio n. 3
0
        private static void ReadMedia(string fileName)
        {
            var dicomDirectory = DicomDirectory.Open(fileName);

            foreach (var patientRecord in dicomDirectory.RootDirectoryRecordCollection)
            {
                Console.WriteLine(
                    "Patient: {0} ({1})",
                    patientRecord.GetSingleValue<string>(DicomTag.PatientName),
                    patientRecord.GetSingleValue<string>(DicomTag.PatientID));

                foreach (var studyRecord in patientRecord.LowerLevelDirectoryRecordCollection)
                {
                    Console.WriteLine("\tStudy: {0}", studyRecord.GetSingleValue<string>(DicomTag.StudyInstanceUID));

                    foreach (var seriesRecord in studyRecord.LowerLevelDirectoryRecordCollection)
                    {
                        Console.WriteLine("\t\tSeries: {0}", seriesRecord.GetSingleValue<string>(DicomTag.SeriesInstanceUID));

                        foreach (var imageRecord in seriesRecord.LowerLevelDirectoryRecordCollection)
                        {
                            Console.WriteLine(
                                "\t\t\tImage: {0} [{1}]",
                                imageRecord.GetSingleValue<string>(DicomTag.ReferencedSOPInstanceUIDInFile),
                                imageRecord.GetSingleValue<string>(DicomTag.ReferencedFileID));
                        }
                    }
                }
            }
        }
Esempio n. 4
0
        public void Open_MediaStorageSOPInstanceUID_ShouldBeConsistent()
        {
            var dir      = DicomDirectory.Open(TestData.Resolve("DICOMDIR"));
            var expected = dir.FileMetaInfo.GetSingleValue <DicomUID>(DicomTag.MediaStorageSOPInstanceUID).UID;
            var actual   = dir.MediaStorageSOPInstanceUID.UID;

            Assert.Equal(expected, actual);
        }
Esempio n. 5
0
        public void Open_DicomDirFile_Succeeds()
        {
            var dir = DicomDirectory.Open(TestData.Resolve("DICOMDIR"));

            var expected = DicomUID.MediaStorageDirectoryStorage.UID;
            var actual   = dir.FileMetaInfo.MediaStorageSOPClassUID.UID;

            Assert.Equal(expected, actual);
        }
Esempio n. 6
0
        static void Main(string[] args)
        {
            LogToDebugConsole("Performing Dicom directory dump:");

            try
            {
                var dicomDirectory = DicomDirectory.Open(PathToDicomDirectoryFile);

                LogToDebugConsole(dicomDirectory.WriteToString());

                LogToDebugConsole("Dicom directory dump operation was successful");
            }
            catch (Exception ex)
            {
                LogToDebugConsole($"Error occured during Dicom directory dump. Error:{ex.Message}");
            }
        }
Esempio n. 7
0
        static void Main(string[] args)
        {
            LogToDebugConsole("Creating Dicom directory...");

            try
            {
                //location where we will create the DICOMDIR file from the images
                var pathToOutputDicomDirectoryFile = Path.Combine(PathToDicomImages, "DICOMDIR");

                if (File.Exists(pathToOutputDicomDirectoryFile))
                {
                    LogToDebugConsole($"Dicom directory file already exists at '{pathToOutputDicomDirectoryFile}'. Deleting...");
                    File.Delete(pathToOutputDicomDirectoryFile);
                }

                var directoryInfoForDicomImagesFolder = new DirectoryInfo(PathToDicomImages);

                var dicomDir = new DicomDirectory();

                foreach (var file in directoryInfoForDicomImagesFolder.GetFiles("*.*", SearchOption.AllDirectories))
                {
                    var dicomFile = Dicom.DicomFile.Open(file.FullName);

                    dicomDir.AddFile(dicomFile, $@"000001\{file.Name}");
                }

                dicomDir.Save(pathToOutputDicomDirectoryFile);

                LogToDebugConsole($"Dicom directory creation was successful. DICOMDIR file created at '{pathToOutputDicomDirectoryFile}'");

                var dicomDirectory = DicomDirectory.Open(pathToOutputDicomDirectoryFile);

                LogToDebugConsole("Outputing the newly created DICOM directory information to console");

                LogToDebugConsole(dicomDirectory.WriteToString());
            }
            catch (Exception ex)
            {
                LogToDebugConsole($"Error occured during Dicom directory dump. Error:{ex.Message}");
            }
        }
Esempio n. 8
0
        static void Main(string[] args)
        {
            LogToDebugConsole("Performing Dicom directory dump:");

            try
            {
                var dicomDirectory = DicomDirectory.Open(PathToDicomDirectoryFile);

                var dicomDirectoryHelper = new OurDicomDirectoryHelper(LogToDebugConsole);

                dicomDirectoryHelper.ShowDicomDirectoryMetaInformation(dicomDirectory);

                foreach (var patientRecord in dicomDirectory.RootDirectoryRecordCollection)
                {
                    dicomDirectoryHelper.Display(patientRecord);

                    foreach (var studyRecord in patientRecord.LowerLevelDirectoryRecordCollection)
                    {
                        dicomDirectoryHelper.Display(studyRecord);

                        foreach (var seriesRecord in studyRecord.LowerLevelDirectoryRecordCollection)
                        {
                            dicomDirectoryHelper.Display(seriesRecord);

                            foreach (var imageRecord in seriesRecord.LowerLevelDirectoryRecordCollection)
                            {
                                dicomDirectoryHelper.Display(imageRecord);
                            }
                        }
                    }
                }


                LogToDebugConsole("Dicom directory dump operation was successful");
            }
            catch (Exception ex)
            {
                LogToDebugConsole($"Error occured during Dicom directory dump. Error:{ex.Message}");
            }
        }
Esempio n. 9
0
        public static IEnumerable <Series> ExtractSeriesFromDicomDir(string path, bool generateMissingThumbnails)
        {
            var result = new List <DicomSeries>();

            if (!DicomFile.HasValidHeader(path))
            {
                return(result);
            }

            try
            {
                var dicomDirectory = DicomDirectory.Open(path);

                foreach (var patientRecord in dicomDirectory.RootDirectoryRecordCollection)
                {
                    foreach (var studyRecord in patientRecord.LowerLevelDirectoryRecordCollection)
                    {
                        foreach (var seriesRecord in studyRecord.LowerLevelDirectoryRecordCollection)
                        {
                            var seriesRecordType = seriesRecord.GetSingleValueOrDefault(DicomTag.DirectoryRecordType, string.Empty);
                            if (seriesRecordType != "SERIES")
                            {
                                continue;
                            }
                            var series = new DicomSeries
                            {
                                SeriesInstanceUid = seriesRecord.GetSingleValueOrDefault(DicomTag.SeriesInstanceUID, ""),
                                Number            = seriesRecord.GetSingleValueOrDefault(DicomTag.SeriesNumber, ""),
                            };

                            DicomSequence iconImageSequence;

                            if (seriesRecord.TryGetSequence(DicomTag.IconImageSequence, out iconImageSequence))
                            {
                                var iconImage = iconImageSequence.FirstOrDefault();
                                if (iconImage != null)
                                {
                                    DicomImage image = new DicomImage(iconImage);
                                    series.Thumbnail = image.RenderImage().AsWriteableBitmap();
                                }
                            }
                            foreach (var imageRecord in seriesRecord.LowerLevelDirectoryRecordCollection)
                            {
                                var imageRecordType = imageRecord.GetSingleValueOrDefault(DicomTag.DirectoryRecordType, string.Empty);
                                if (imageRecordType != "IMAGE")
                                {
                                    continue;
                                }

                                var values       = imageRecord.GetValues <string>(DicomTag.ReferencedFileID);
                                var relativePath = string.Join(@"\", values);

                                series.SopClassUid     = imageRecord.GetSingleValueOrDefault(DicomTag.ReferencedSOPClassUIDInFile, "");
                                series.NumberOfImages += Math.Max(1, imageRecord.GetSingleValueOrDefault(DicomTag.NumberOfFrames, 1));
                                var absolutePath = Path.GetDirectoryName(path) + @"\\" + relativePath;
                                series.FileNames.Add(absolutePath);
                            }

                            if (generateMissingThumbnails && series.Thumbnail == null && series.FileNames.Count > 0)
                            {
                                GenerateThumbnail(series);
                            }
                            if (series.NumberOfImages > 0)
                            {
                                result.Add(series);
                            }
                        }
                    }
                }
            }
            catch (Exception e)
            {
                logger.LogWarning(e, $"Could not read DICOMDIR file '{e.Message}' {e.StackTrace}");
            }
            return(result);
        }
Esempio n. 10
0
    // Use this for initialization
    void Start()
    {
        Unzip("Genomics", false);
        Debug.Log("Loading DICOM DICT");
        var dict = new DicomDictionary();

        dict.Load(Application.dataPath + "/StreamingAssets/Dictionaries/DICOM Dictionary.xml", DicomDictionaryFormat.XML);
        DicomDictionary.Default = dict;
        annotationPath          = Path.Combine(Application.persistentDataPath, "annotations.json");
        if (File.Exists(annotationPath))
        {
            annotations = JsonUtility.FromJson <AnnotationCollection>(File.ReadAllText(annotationPath));
            Debug.Log("Loaded " + annotations.annotations.Count + " annotations");
        }
        var meshMarkerPath = Path.Combine(Application.persistentDataPath, "MeshMarkers");

        if (Directory.Exists(meshMarkerPath))
        {
            meshMarkers = Directory.GetFiles(meshMarkerPath, "*.*", SearchOption.AllDirectories);
        }
        var path = Unzip("DICOM");

        Unzip("Volumes", false);
        var offset = 0;

        directoryMap     = new Dictionary <GameObject, DicomDirectoryRecord>();
        rootDirectoryMap = new Dictionary <DicomDirectoryRecord, string>();
        openedItems      = new Dictionary <GameObject, bool>();
        var directories = Directory.GetDirectories(path);

        if (directories.Length == 0)
        {
            status.text = "ERROR: No directories found!";
            return;
        }
        status.text = "Loading...";
        foreach (var directory in Directory.GetDirectories(path))
        {
            var directoryName = Path.GetFileName(directory);
            Debug.Log("--DIRECTORY--" + directoryName);
            var dd = DicomDirectory.Open(Path.Combine(directory, "DICOMDIR"));
            rootDirectoryMap[dd.RootDirectoryRecord] = directory;
            var tex  = GetTexture2DForRecord(dd.RootDirectoryRecord);
            var quad = Instantiate(quadPrefab, filebrowser);
            quad.GetComponent <Renderer>().material.mainTexture = tex;
            quad.transform.localPosition += new Vector3(offset, 0, 0);
            quad.transform.Find("Canvas").Find("title").GetComponent <Text>().text = "Directory: " + directoryName;
            quad.name          = directory;
            directoryMap[quad] = dd.RootDirectoryRecord;
            openedItems[quad]  = false;
            quad.tag           = "directory";
            offset            += 1;
        }
        recognizer              = new GestureRecognizer();
        recognizer.TappedEvent += Recognizer_TappedEvent;
        recognizer.StartCapturingGestures();
        status.text = "";
        UpdateAnnotationsList();

        testQuad.SetActive(false);
#if UNITY_EDITOR
        testQuad.SetActive(true);
        testQuad.transform.position = new Vector3(0, 0, 2);
        var series        = GetSeriesById("1.3.12.2.1107.5.1.4.50714.30000016083120205201500011155");
        var seriesHandler = testQuad.GetComponent <OpenSeriesHandler>();
        seriesHandler.record = series;

        var modality   = GetDicomTag(series, DicomTag.Modality);
        var seriesDesc = GetDicomTag(series, DicomTag.SeriesDescription);
        testQuad.name = "Series: " + modality + "\n" + seriesDesc;
        Debug.Log(seriesDesc);
        directoryMap[testQuad]   = series;
        rootDirectoryMap[series] = rootDirectoryMap[directoryMap.ElementAt(1).Value];

        testQuad.GetComponent <TwoHandManipulatable>().enabled = true;
        testQuad.transform.Find("3D_toggle").gameObject.SetActive(true);
        testQuad.transform.Find("3D_toggle").GetComponent <InteractiveToggle>().SetSelection(true);
        seriesHandler.ButtonPush("3D");
        var slider = testQuad.transform.Find("zstack slider");
        slider.gameObject.SetActive(true);
        var sliderComponent = slider.GetComponent <SliderGestureControl>();
        var n_images        = series.LowerLevelDirectoryRecordCollection.Count();
        sliderComponent.SetSpan(0, n_images);
        sliderComponent.SetSliderValue(n_images / 2f);
        testQuad.GetComponent <Renderer>().material.mainTexture = GetTexture2DForRecord(series);

        var seriesId = series.Get <string>(DicomTag.SeriesInstanceUID, "no series id");
        foreach (var a in annotations.annotations)
        {
            if (a.series == seriesId)
            {
                var annotation = Instantiate(annotationPrefab, testQuad.transform);
                annotation.transform.localPosition = DeserializeVector(a.position, Vector3.zero);
                annotation.transform.localRotation = Quaternion.Euler(DeserializeVector(a.rotation, Vector3.zero));
                annotation.transform.localScale    = DeserializeVector(a.scale, Vector3.one);
            }
        }
        //WarmVolumeCache();
#endif
    }