diff --git a/Modules/DICOMReader/files.cmake b/Modules/DICOMReader/files.cmake index d1cf83b313..691c000235 100644 --- a/Modules/DICOMReader/files.cmake +++ b/Modules/DICOMReader/files.cmake @@ -1,37 +1,38 @@ file(GLOB_RECURSE H_FILES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/include/*") set(CPP_FILES mitkDICOMFileReader.cpp mitkDICOMGDCMTagScanner.cpp mitkDICOMImageBlockDescriptor.cpp mitkDICOMITKSeriesGDCMReader.cpp mitkDICOMDatasetSorter.cpp mitkDICOMTagBasedSorter.cpp mitkDICOMGDCMImageFrameInfo.cpp mitkDICOMImageFrameInfo.cpp mitkDICOMSortCriterion.cpp mitkDICOMSortByTag.cpp mitkITKDICOMSeriesReaderHelper.cpp mitkEquiDistantBlocksSorter.cpp mitkNormalDirectionConsistencySorter.cpp mitkSortByImagePositionPatient.cpp mitkGantryTiltInformation.cpp mitkClassicDICOMSeriesReader.cpp mitkThreeDnTDICOMSeriesReader.cpp mitkDICOMTag.cpp + mitkDICOMTagHelper.cpp mitkDICOMTagCache.cpp mitkDICOMEnums.cpp mitkDICOMReaderConfigurator.cpp mitkDICOMFileReaderSelector.cpp ) set(RESOURCE_FILES configurations/3D/classicreader.xml configurations/3D/imageposition.xml configurations/3D/imageposition_byacquisition.xml configurations/3D/instancenumber.xml configurations/3D/instancenumber_soft.xml configurations/3D/slicelocation.xml configurations/3DnT/classicreader.xml ) diff --git a/Modules/DICOMReader/include/mitkDICOMTagHelper.h b/Modules/DICOMReader/include/mitkDICOMTagHelper.h new file mode 100644 index 0000000000..1cec7e742a --- /dev/null +++ b/Modules/DICOMReader/include/mitkDICOMTagHelper.h @@ -0,0 +1,41 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological Informatics. +All rights reserved. + +This software is distributed WITHOUT ANY WARRANTY; without +even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. + +See LICENSE.txt or http://www.mitk.org for details. + +===================================================================*/ + +#ifndef mitkDICOMTagHelper_h +#define mitkDICOMTagHelper_h + +#include + +#include + +#include "MitkDICOMReaderExports.h" + +namespace mitk +{ + + typedef std::unordered_map DICOMTagMapType; + + /** Returns the list of tags that are by default of interest and should + * be extracted when loading DICOM data. This can for instance be used + * to with DICOMFileReader::SetAdditionalTagsOfInterest().*/ + DICOMTagMapType MITKDICOMREADER_EXPORT GetDefaultDICOMTagsOfInterest(); + + /** returns the correct property name for a given DICOMTag instance. */ + std::string MITKDICOMREADER_EXPORT GeneratPropertyNameForDICOMTag(const mitk::DICOMTag& tag); + +} + +#endif diff --git a/Modules/DICOMReader/src/mitkDICOMTagHelper.cpp b/Modules/DICOMReader/src/mitkDICOMTagHelper.cpp new file mode 100644 index 0000000000..b2df34e283 --- /dev/null +++ b/Modules/DICOMReader/src/mitkDICOMTagHelper.cpp @@ -0,0 +1,197 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological Informatics. +All rights reserved. + +This software is distributed WITHOUT ANY WARRANTY +{ +} + without +even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. + +See LICENSE.txt or http://www.mitk.org for details. + +===================================================================*/ + +#include "mitkDICOMTagHelper.h" + +mitk::DICOMTagMapType::value_type MakeEntry(mitk::DICOMTag& tag) +{ + return std::make_pair(GeneratPropertyNameForDICOMTag(tag).c_str(), tag); +} + +mitk::DICOMTagMapType +mitk::GetDefaultDICOMTagsOfInterest() +{ + DICOMTagMapType result; + //These tags are copied from DICOMSeriesReader. The old naming style (deprecated) + //is keept for backwards compatibility until it is removed. + //Below we have also already added the properties with the new naming style + // Patient module + result.insert(std::make_pair("dicom.patient.PatientsName", DICOMTag(0x0010, 0x0010))); + result.insert(std::make_pair("dicom.patient.PatientID", DICOMTag(0x0010, 0x0020))); + result.insert(std::make_pair("dicom.patient.PatientsBirthDate", DICOMTag(0x0010, 0x0030))); + result.insert(std::make_pair("dicom.patient.PatientsSex", DICOMTag(0x0010, 0x0040))); + result.insert(std::make_pair("dicom.patient.PatientsBirthTime", DICOMTag(0x0010, 0x0032))); + result.insert(std::make_pair("dicom.patient.OtherPatientIDs", DICOMTag(0x0010, 0x1000))); + result.insert(std::make_pair("dicom.patient.OtherPatientNames", DICOMTag(0x0010, 0x1001))); + result.insert(std::make_pair("dicom.patient.EthnicGroup", DICOMTag(0x0010, 0x2160))); + result.insert(std::make_pair("dicom.patient.PatientComments", DICOMTag(0x0010, 0x4000))); + result.insert(std::make_pair("dicom.patient.PatientIdentityRemoved", DICOMTag(0x0012, 0x0062))); + result.insert(std::make_pair("dicom.patient.DeIdentificationMethod", DICOMTag(0x0012, 0x0063))); + + // General Study module + result.insert(std::make_pair("dicom.study.StudyInstanceUID", DICOMTag(0x0020, 0x000d))); + result.insert(std::make_pair("dicom.study.StudyDate", DICOMTag(0x0008, 0x0020))); + result.insert(std::make_pair("dicom.study.StudyTime", DICOMTag(0x0008, 0x0030))); + result.insert(std::make_pair("dicom.study.ReferringPhysiciansName", DICOMTag(0x0008, 0x0090))); + result.insert(std::make_pair("dicom.study.StudyID", DICOMTag(0x0020, 0x0010))); + result.insert(std::make_pair("dicom.study.AccessionNumber", DICOMTag(0x0008, 0x0050))); + result.insert(std::make_pair("dicom.study.StudyDescription", DICOMTag(0x0008, 0x1030))); + result.insert(std::make_pair("dicom.study.PhysiciansOfRecord", DICOMTag(0x0008, 0x1048))); + result.insert(std::make_pair("dicom.study.NameOfPhysicianReadingStudy", DICOMTag(0x0008, 0x1060))); + + // General Series module + result.insert(std::make_pair("dicom.series.Modality", DICOMTag(0x0008, 0x0060))); + result.insert(std::make_pair("dicom.series.SeriesInstanceUID", DICOMTag(0x0020, 0x000e))); + result.insert(std::make_pair("dicom.series.SeriesNumber", DICOMTag(0x0020, 0x0011))); + result.insert(std::make_pair("dicom.series.Laterality", DICOMTag(0x0020, 0x0060))); + result.insert(std::make_pair("dicom.series.SeriesDate", DICOMTag(0x0008, 0x0021))); + result.insert(std::make_pair("dicom.series.SeriesTime", DICOMTag(0x0008, 0x0031))); + result.insert(std::make_pair("dicom.series.PerformingPhysiciansName", DICOMTag(0x0008, 0x1050))); + result.insert(std::make_pair("dicom.series.ProtocolName", DICOMTag(0x0018, 0x1030))); + result.insert(std::make_pair("dicom.series.SeriesDescription", DICOMTag(0x0008, 0x103e))); + result.insert(std::make_pair("dicom.series.OperatorsName", DICOMTag(0x0008, 0x1070))); + result.insert(std::make_pair("dicom.series.BodyPartExamined", DICOMTag(0x0018, 0x0015))); + result.insert(std::make_pair("dicom.series.PatientPosition", DICOMTag(0x0018, 0x5100))); + result.insert(std::make_pair("dicom.series.SmallestPixelValueInSeries", DICOMTag(0x0028, 0x0108))); + result.insert(std::make_pair("dicom.series.LargestPixelValueInSeries", DICOMTag(0x0028, 0x0109))); + + // VOI LUT module + result.insert(std::make_pair("dicom.voilut.WindowCenter", DICOMTag(0x0028, 0x1050))); + result.insert(std::make_pair("dicom.voilut.WindowWidth", DICOMTag(0x0028, 0x1051))); + result.insert(std::make_pair("dicom.voilut.WindowCenterAndWidthExplanation", DICOMTag(0x0028, 0x1055))); + + // Image Pixel module + result.insert(std::make_pair("dicom.pixel.PhotometricInterpretation", DICOMTag(0x0028, 0x0004))); + result.insert(std::make_pair("dicom.pixel.Rows", DICOMTag(0x0028, 0x0010))); + result.insert(std::make_pair("dicom.pixel.Columns", DICOMTag(0x0028, 0x0011))); + + // Image Plane module + result.insert(std::make_pair("dicom.PixelSpacing", DICOMTag(0x0028, 0x0030))); + result.insert(std::make_pair("dicom.ImagerPixelSpacing", DICOMTag(0x0018, 0x1164))); + + //additional for RT + result.insert(std::make_pair("dicom.RescaleIntercept", DICOMTag(0x0028, 0x1052))); + result.insert(std::make_pair("dicom.RescaleSlope", DICOMTag(0x0028, 0x1053))); + result.insert(std::make_pair("dicom.ManufacturerModelName", DICOMTag(0x0008, 0x1090))); + result.insert(std::make_pair("dicom.ManufacturerName", DICOMTag(0x0008, 0x0070))); + result.insert(std::make_pair("dicom.InstitutionName", DICOMTag(0x0008, 0x0080))); + result.insert(std::make_pair("dicom.StationName", DICOMTag(0x0008, 0x1010))); + result.insert(std::make_pair("dicom.DoseGridScaling", DICOMTag(0x3004, 0x000e))); + + + // Patient module + /*dicom.patient.PatientsName*/ result.insert(MakeEntry(DICOMTag(0x0010, 0x0010))); + /*dicom.patient.PatientID*/ result.insert(MakeEntry(DICOMTag(0x0010, 0x0020))); + /*dicom.patient.PatientsBirthDate*/ result.insert(MakeEntry(DICOMTag(0x0010, 0x0030))); + /*dicom.patient.PatientsSex*/ result.insert(MakeEntry(DICOMTag(0x0010, 0x0040))); + /*dicom.patient.PatientsBirthTime*/ result.insert(MakeEntry(DICOMTag(0x0010, 0x0032))); + /*dicom.patient.OtherPatientIDs*/ result.insert(MakeEntry(DICOMTag(0x0010, 0x1000))); + /*dicom.patient.OtherPatientNames*/ result.insert(MakeEntry(DICOMTag(0x0010, 0x1001))); + /*dicom.patient.EthnicGroup*/ result.insert(MakeEntry(DICOMTag(0x0010, 0x2160))); + /*dicom.patient.PatientComments*/ result.insert(MakeEntry(DICOMTag(0x0010, 0x4000))); + /*dicom.patient.PatientIdentityRemoved*/ result.insert(MakeEntry(DICOMTag(0x0012, 0x0062))); + /*dicom.patient.DeIdentificationMethod*/ result.insert(MakeEntry(DICOMTag(0x0012, 0x0063))); + + // General Study module + /*dicom.study.StudyInstanceUID*/ result.insert(MakeEntry(DICOMTag(0x0020, 0x000d))); + /*dicom.study.StudyDate*/ result.insert(MakeEntry(DICOMTag(0x0008, 0x0020))); + /*dicom.study.StudyTime*/ result.insert(MakeEntry(DICOMTag(0x0008, 0x0030))); + /*dicom.study.ReferringPhysiciansName*/ result.insert(MakeEntry(DICOMTag(0x0008, 0x0090))); + /*dicom.study.StudyID*/ result.insert(MakeEntry(DICOMTag(0x0020, 0x0010))); + /*dicom.study.AccessionNumber*/ result.insert(MakeEntry(DICOMTag(0x0008, 0x0050))); + /*dicom.study.StudyDescription*/ result.insert(MakeEntry(DICOMTag(0x0008, 0x1030))); + /*dicom.study.PhysiciansOfRecord*/ result.insert(MakeEntry(DICOMTag(0x0008, 0x1048))); + /*dicom.study.NameOfPhysicianReadingStudy*/ result.insert(MakeEntry(DICOMTag(0x0008, 0x1060))); + + // General Series module + /*dicom.series.Modality*/ result.insert(MakeEntry(DICOMTag(0x0008, 0x0060))); + /*dicom.series.SeriesInstanceUID*/ result.insert(MakeEntry(DICOMTag(0x0020, 0x000e))); + /*dicom.series.SeriesNumber*/ result.insert(MakeEntry(DICOMTag(0x0020, 0x0011))); + /*dicom.series.Laterality*/ result.insert(MakeEntry(DICOMTag(0x0020, 0x0060))); + /*dicom.series.SeriesDate*/ result.insert(MakeEntry(DICOMTag(0x0008, 0x0021))); + /*dicom.series.SeriesTime*/ result.insert(MakeEntry(DICOMTag(0x0008, 0x0031))); + /*dicom.series.PerformingPhysiciansName*/ result.insert(MakeEntry(DICOMTag(0x0008, 0x1050))); + /*dicom.series.ProtocolName*/ result.insert(MakeEntry(DICOMTag(0x0018, 0x1030))); + /*dicom.series.SeriesDescription*/ result.insert(MakeEntry(DICOMTag(0x0008, 0x103e))); + /*dicom.series.OperatorsName*/ result.insert(MakeEntry(DICOMTag(0x0008, 0x1070))); + /*dicom.series.BodyPartExamined*/ result.insert(MakeEntry(DICOMTag(0x0018, 0x0015))); + /*dicom.series.PatientPosition*/ result.insert(MakeEntry(DICOMTag(0x0018, 0x5100))); + /*dicom.series.SmallestPixelValueInSeries*/ result.insert(MakeEntry(DICOMTag(0x0028, 0x0108))); + /*dicom.series.LargestPixelValueInSeries*/ result.insert(MakeEntry(DICOMTag(0x0028, 0x0109))); + + // VOI LUT module + /*dicom.voilut.WindowCenter*/ result.insert(MakeEntry(DICOMTag(0x0028, 0x1050))); + /*dicom.voilut.WindowWidth*/ result.insert(MakeEntry(DICOMTag(0x0028, 0x1051))); + /*dicom.voilut.WindowCenterAndWidthExplanation*/ result.insert(MakeEntry(DICOMTag(0x0028, 0x1055))); + + // Image Pixel module + /*dicom.pixel.PhotometricInterpretation*/ result.insert(MakeEntry(DICOMTag(0x0028, 0x0004))); + /*dicom.pixel.Rows*/ result.insert(MakeEntry(DICOMTag(0x0028, 0x0010))); + /*dicom.pixel.Columns*/ result.insert(MakeEntry(DICOMTag(0x0028, 0x0011))); + + // Image Plane module + /*dicom.PixelSpacing*/ result.insert(MakeEntry(DICOMTag(0x0028, 0x0030))); + /*dicom.ImagerPixelSpacing*/ result.insert(MakeEntry(DICOMTag(0x0018, 0x1164))); + + //additional for RT + /*dicom.RescaleIntercept*/ result.insert(MakeEntry(DICOMTag(0x0028, 0x1052))); + /*dicom.RescaleSlope*/ result.insert(MakeEntry(DICOMTag(0x0028, 0x1053))); + /*dicom.ManufacturerModelName*/ result.insert(MakeEntry(DICOMTag(0x0008, 0x1090))); + /*dicom.ManufacturerName*/ result.insert(MakeEntry(DICOMTag(0x0008, 0x0070))); + /*dicom.InstitutionName*/ result.insert(MakeEntry(DICOMTag(0x0008, 0x0080))); + /*dicom.StationName*/ result.insert(MakeEntry(DICOMTag(0x0008, 0x1010))); + /*dicom.DoseGridScaling*/ result.insert(MakeEntry(DICOMTag(0x3004, 0x000e))); + + //Additions for PET + result.insert(MakeEntry(DICOMTag(0x0018, 0x0031))); //dicom.pet.Tracer + result.insert(MakeEntry(DICOMTag(0x0018, 0x1072))); //dicom.pet.RadiopharmaceuticalStartTime + result.insert(MakeEntry(DICOMTag(0x0018, 0x1074))); //dicom.pet.RadionuclideTotalDose + result.insert(MakeEntry(DICOMTag(0x0018, 0x1075))); //dicom.pet.RadionuclideHalfLife + result.insert(MakeEntry(DICOMTag(0x0010, 0x1030))); //dicom.patient.PatientWeight + result.insert(MakeEntry(DICOMTag(0x0010, 0x1020))); //dicom.patient.PatientSize + result.insert(MakeEntry(DICOMTag(0x0054, 0x1001))); //dicom.pet.RadioactivityUnits + result.insert(MakeEntry(DICOMTag(0x0054, 0x1102))); //dicom.pet.DecayCorrection + result.insert(MakeEntry(DICOMTag(0x0054, 0x1321))); //dicom.pet.DecayFactor + result.insert(MakeEntry(DICOMTag(0x0054, 0x1300))); //dicom.pet.FrameReferenceTime + + //Other interesting acquisition correlated information + result.insert(MakeEntry(DICOMTag(0x0008, 0x0022))); //dicom.acuisition date + result.insert(MakeEntry(DICOMTag(0x0008, 0x0032))); //dicom.acuisition time + result.insert(MakeEntry(DICOMTag(0x0008, 0x002a))); //dicom.acuisition datetime + result.insert(MakeEntry(DICOMTag(0x0008, 0x0080))); //dicom.Modality + result.insert(MakeEntry(DICOMTag(0x0018, 0x002a))); //dicom.Sequence Name + result.insert(MakeEntry(DICOMTag(0x0018, 0x0020))); //dicom.Scanning Sequence + result.insert(MakeEntry(DICOMTag(0x0018, 0x0021))); //dicom.Sequence Variant + result.insert(MakeEntry(DICOMTag(0x0018, 0x0080))); //dicom.TR + result.insert(MakeEntry(DICOMTag(0x0018, 0x0081))); //dicom.TE + result.insert(MakeEntry(DICOMTag(0x0018, 0x1310))); //dicom.Acquisition Matrix + result.insert(MakeEntry(DICOMTag(0x0018, 0x0087))); //dicom.Magnetic Field Strength + + return result; +}; + +std::string +mitk::GeneratPropertyNameForDICOMTag(const mitk::DICOMTag& tag) +{ + std::ostringstream nameStream; + nameStream << "DICOM." << tag.GetGroup() << "." << tag.GetElement(); + + return nameStream.str(); +}; +