VintaSoft Imaging .NET SDK 15.1: Documentation for .NET developer
In This Topic
    DICOM: How to group DICOM files by patients, studies, series?
    In This Topic
    Here is C# code that demonstrates how to group DICOM files by patients, studies, series:
    /// <summary>
    /// Prints information about DICOM series to the console.
    /// </summary>
    /// <param name="dir">The directory path.</param>
    public static void PrintDicomSeriesInformation(string dir)
    {
        // create the DICOM series manager
        Vintasoft.Imaging.Metadata.DicomSeriesManager manager = new Vintasoft.Imaging.Metadata.DicomSeriesManager();
        manager.Images = new Vintasoft.Imaging.ImageCollection();
    
        // get names of DICOM files in file directory
        string[] dicomFilePaths = System.IO.Directory.GetFiles(dir, "*.dcm", System.IO.SearchOption.AllDirectories);
        // add DICOM files to the DICOM series manager
        foreach (string dicomFilePath in dicomFilePaths)
            manager.Images.Add(dicomFilePath);
    
    
        // get patient identifiers from DICOM files
        string[] patientIdentifiers = manager.GetPatientIdentifiers();
        // for each patient identifier
        foreach (string patientIdentifier in patientIdentifiers)
        {
            // get patient metadata
            Vintasoft.Imaging.Metadata.DicomPageMetadata patientMetadata = manager.GetPatientMetadata(patientIdentifier);
    
            // print patient information
            System.Console.WriteLine("Patient Name: {0}", GetValueAsString(patientMetadata, Vintasoft.Imaging.Codecs.ImageFiles.Dicom.DicomDataElementId.PatientName));
            System.Console.WriteLine("Patient Birth Date: {0}", GetValueAsString(patientMetadata, Vintasoft.Imaging.Codecs.ImageFiles.Dicom.DicomDataElementId.PatientBirthDate));
    
    
            // get studies identifiers for patient
            string[] studyIdentifiers = manager.GetStudyIdentifiers(patientIdentifier);
            // print the studies count for patient
            System.Console.WriteLine("Study Count: {0}", studyIdentifiers.Length);
            // for each study identifier
            foreach (string studyIdentifier in studyIdentifiers)
            {
                // get the study metadata
                Vintasoft.Imaging.Metadata.DicomPageMetadata studyMetadata = manager.GetStudyMetadata(studyIdentifier);
    
                // print study information
                System.Console.WriteLine("\tStudy Date: {0}", GetValueAsString(studyMetadata, Vintasoft.Imaging.Codecs.ImageFiles.Dicom.DicomDataElementId.StudyDate));
                System.Console.WriteLine("\tStudy Time: {0}", GetValueAsString(studyMetadata, Vintasoft.Imaging.Codecs.ImageFiles.Dicom.DicomDataElementId.StudyTime));
                System.Console.WriteLine("\tStudy Description: {0}", GetValueAsString(studyMetadata, Vintasoft.Imaging.Codecs.ImageFiles.Dicom.DicomDataElementId.StudyDescription));
                System.Console.WriteLine("\tModality: {0}", GetValueAsString(studyMetadata, Vintasoft.Imaging.Codecs.ImageFiles.Dicom.DicomDataElementId.Modality));
    
    
                // get series identifiers for the study
                string[] seriesIdentifiers = manager.GetSeriesIdentifiers(studyIdentifier);
                // print the series count for the study
                System.Console.WriteLine("\tSeries Count: {0}", seriesIdentifiers.Length);
                // for each series identifier
                foreach (string seriesIdentifier in seriesIdentifiers)
                {
                    // get series metadata
                    Vintasoft.Imaging.Metadata.DicomPageMetadata seriesMetadata = manager.GetSeriesMetadata(seriesIdentifier);
    
                    // print series information
                    System.Console.WriteLine("\t\tSeries Description: {0}", GetValueAsString(seriesMetadata, Vintasoft.Imaging.Codecs.ImageFiles.Dicom.DicomDataElementId.SeriesDescription));
                    System.Console.WriteLine("\t\tSeries Date: {0}", GetValueAsString(seriesMetadata, Vintasoft.Imaging.Codecs.ImageFiles.Dicom.DicomDataElementId.SeriesDate));
                    System.Console.WriteLine("\t\tSeries Time: {0}", GetValueAsString(seriesMetadata, Vintasoft.Imaging.Codecs.ImageFiles.Dicom.DicomDataElementId.SeriesTime));
    
                    // get images for the series
                    Vintasoft.Imaging.VintasoftImage[] images = manager.GetSeriesImages(seriesIdentifier);
    
                    // print the image count in the series
                    System.Console.WriteLine("\t\t\tImage Count: {0}", images.Length);
                }
            }
        }
    }
    
    /// <summary>
    /// Returns the DICOM metadata value as a string.
    /// </summary>
    /// <param name="pageMetadata">The DICOM page metadata.</param>
    /// <param name="id">The DICOM data element identifier.</param>
    /// <returns>
    /// The string with DICOM metadata value.
    /// </returns>
    private static string GetValueAsString(
        Vintasoft.Imaging.Metadata.DicomPageMetadata pageMetadata,
        Vintasoft.Imaging.Codecs.ImageFiles.Dicom.DicomDataElementId id)
    {
        // get metadata node
        Vintasoft.Imaging.Metadata.DicomDataElementMetadata node = pageMetadata.FindChildNode(id);
    
        // if metadata node exists
        if (node != null && node.Value != null)
        {
            if (node.Value is Vintasoft.Imaging.Codecs.ImageFiles.Dicom.DicomUid)
            {
                Vintasoft.Imaging.Codecs.ImageFiles.Dicom.DicomUid uid = (Vintasoft.Imaging.Codecs.ImageFiles.Dicom.DicomUid)node.Value;
    
                return uid.Value;
            }
            else if (node.Value is Vintasoft.Imaging.Codecs.ImageFiles.Dicom.DicomDateTime)
            {
                Vintasoft.Imaging.Codecs.ImageFiles.Dicom.DicomDateTime dateTime = (Vintasoft.Imaging.Codecs.ImageFiles.Dicom.DicomDateTime)node.Value;
    
                return dateTime.LocalDateTime.ToString();
            }
            else
            {
                return System.Convert.ToString(node.Value);
            }
        }
    
        return null;
    }
    
    


    The code above produces the following output:
    Patient Name: AGECANONIX
    Patient Birth Date:
    Study Count: 1
            Study Date: 01.12.2003 0:00:00
            Study Time: 12:00:00
            Study Description: Specials^1CoronaryCTA_with_spiral _CTA_pre
            Modality: CT
            Series Count: 1
                    Series Description: CorCTA w/c  1.0  B20f
                    Series Date: 01.12.2003 0:00:00
                    Series Time: 12:00:00
                            Image Count: 10
    Patient Name: CEREBRIX
    Patient Birth Date: 01.04.1935 0:00:00
    Study Count: 2
            Study Date: 20.07.2007 0:00:00
            Study Time: 08:13:35.9680000
            Study Description: Neuro^Crane
            Modality: MR
            Series Count: 1
                    Series Description: t1_mpr3D_ns_sag_gd
                    Series Date: 20.07.2007 0:00:00
                    Series Time: 08:59:10.3750000
                            Image Count: 15
            Study Date: 03.08.2007 0:00:00
            Study Time: 16:42:32.1090000
            Study Description: PET^PETCT_CTplusFET_LM_Brain (Adult)
            Modality: PT
            Series Count: 1
                    Series Description: dynamic recon 3x10min Volume (Corrected)
                    Series Date: 03.08.2007 0:00:00
                    Series Time: 16:53:56
                            Image Count: 10
    Patient Name: RATIB^OSMAN
    Patient Birth Date: 25.06.1955 0:00:00
    Study Count: 1
            Study Date: 30.09.2004 0:00:00
            Study Time: 11:56:15.5930000
            Study Description: Cardiac^1CTA_CORONARY_ARTERIES_lowHR_TESTBOLUS (Adult)
            Modality: CT
            Series Count: 1
                    Series Description: CorCTALow  2.0  B25f 0-95%
                    Series Date: 30.09.2004 0:00:00
                    Series Time: 14:28:38.4680000
                            Image Count: 25