Console: Group DICOM files by patient, study, series.

Code samples for VintaSoft Imaging .NET SDK. Here you can request a code sample.

Moderator: Alex

Post Reply
Alex
Site Admin
Posts: 2393
Joined: Thu Jul 10, 2008 2:21 pm

Console: Group DICOM files by patient, study, series.

Post by Alex »

Here is C# code snippet that shows how to group DICOM files by patient, study, series:

Code: Select all

/// <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:

Code: Select all

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 
Post Reply