/// <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); }
/// <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); }
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)); } } } } }
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); }
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); }
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}"); } }
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}"); } }
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}"); } }
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); }
// 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 }