Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
mitkDicomSeriesReader.h
Go to the documentation of this file.
1 /*============================================================================
2 
3 The Medical Imaging Interaction Toolkit (MITK)
4 
5 Copyright (c) German Cancer Research Center (DKFZ)
6 All rights reserved.
7 
8 Use of this source code is governed by a 3-clause BSD license that can be
9 found in the LICENSE file.
10 
11 ============================================================================*/
12 
13 #ifndef mitkDicomSeriesReader_h
14 #define mitkDicomSeriesReader_h
15 
16 #include "mitkConfig.h"
17 #include "mitkDataNode.h"
18 
19 #include <itkGDCMImageIO.h>
20 
21 #include <itkCommand.h>
22 #include <itkImageSeriesReader.h>
23 
24 #ifdef NOMINMAX
25 #define DEF_NOMINMAX
26 #undef NOMINMAX
27 #endif
28 
29 #include <gdcmConfigure.h>
30 
31 #ifdef DEF_NOMINMAX
32 #ifndef NOMINMAX
33 #define NOMINMAX
34 #endif
35 #undef DEF_NOMINMAX
36 #endif
37 
38 #include <gdcmDataSet.h>
39 #include <gdcmScanner.h>
40 
41 namespace mitk
42 {
344  class Image;
345 
347  {
348  public:
352  typedef std::vector<std::string> StringContainer;
353 
357  typedef void (*UpdateCallBackMethod)(float);
358 
369  typedef enum {
376 
382  typedef enum {
387 
396  {
397  public:
399  StringContainer GetFilenames() const;
400 
402  std::string GetImageBlockUID() const;
403 
405  std::string GetSeriesInstanceUID() const;
406 
408  std::string GetModality() const;
409 
411  std::string GetSOPClassUIDAsString() const;
412 
414  std::string GetSOPClassUID() const;
415 
417  ReaderImplementationLevel GetReaderImplementationLevel() const;
418 
420  bool HasGantryTiltCorrected() const;
421 
423  bool PixelSpacingRelatesToPatient() const;
425  bool PixelSpacingRelatesToDetector() const;
427  bool PixelSpacingIsUnknown() const;
428 
430  PixelSpacingInterpretation GetPixelSpacingType() const;
431 
433  bool HasMultipleTimePoints() const;
434 
436  bool IsMultiFrameImage() const;
437 
440 
441  private:
442  friend class DicomSeriesReader;
443 
444  ImageBlockDescriptor(const StringContainer &files);
445 
446  void AddFile(const std::string &file);
447  void AddFiles(const StringContainer &files);
448 
449  void SetImageBlockUID(const std::string &uid);
450 
451  void SetSeriesInstanceUID(const std::string &uid);
452 
453  void SetModality(const std::string &modality);
454 
455  void SetNumberOfFrames(const std::string &);
456 
457  void SetSOPClassUID(const std::string &mediaStorageSOPClassUID);
458 
459  void SetHasGantryTiltCorrected(bool);
460 
461  void SetPixelSpacingInformation(const std::string &pixelSpacing, const std::string &imagerPixelSpacing);
462 
463  void SetHasMultipleTimePoints(bool);
464 
465  void GetDesiredMITKImagePixelSpacing(ScalarType &spacingX, ScalarType &spacingY) const;
466 
467  StringContainer m_Filenames;
468  std::string m_ImageBlockUID;
469  std::string m_SeriesInstanceUID;
470  std::string m_Modality;
471  std::string m_SOPClassUID;
472  bool m_HasGantryTiltCorrected;
473  std::string m_PixelSpacing;
474  std::string m_ImagerPixelSpacing;
475  bool m_HasMultipleTimePoints;
476  bool m_IsMultiFrameImage;
477  };
478 
479  typedef std::map<std::string, ImageBlockDescriptor> FileNamesGrouping;
480 
487  static std::string GetConfigurationString();
488 
492  static bool IsDicom(const std::string &filename);
493 
499  static FileNamesGrouping GetSeries(const std::string &dir,
500  bool groupImagesWithGantryTilt,
501  const StringContainer &restrictions = StringContainer());
502 
511  static StringContainer GetSeries(const std::string &dir,
512  const std::string &series_uid,
513  bool groupImagesWithGantryTilt,
514  const StringContainer &restrictions = StringContainer());
515 
540  static FileNamesGrouping GetSeries(const StringContainer &files,
541  bool sortTo3DPlust,
542  bool groupImagesWithGantryTilt,
543  const StringContainer &restrictions = StringContainer());
544 
550  static FileNamesGrouping GetSeries(const StringContainer &files,
551  bool groupImagesWithGantryTilt,
552  const StringContainer &restrictions = StringContainer());
553 
562  static DataNode::Pointer LoadDicomSeries(const StringContainer &filenames,
563  bool sort = true,
564  bool load4D = true,
565  bool correctGantryTilt = true,
566  UpdateCallBackMethod callback = nullptr,
567  itk::SmartPointer<Image> preLoadedImageBlock = nullptr);
568 
575  static bool LoadDicomSeries(const StringContainer &filenames,
576  DataNode &node,
577  bool sort = true,
578  bool load4D = true,
579  bool correctGantryTilt = true,
580  UpdateCallBackMethod callback = nullptr,
581  itk::SmartPointer<Image> preLoadedImageBlock = nullptr);
582 
583  protected:
596  {
597  public:
599 
603  StringContainer GetBlockFilenames();
604 
608  StringContainer GetUnsortedFilenames();
609 
613  bool ContainsGantryTilt();
614 
618  void AddFileToSortedBlock(const std::string &filename);
619 
623  void AddFileToUnsortedBlock(const std::string &filename);
624  void AddFilesToUnsortedBlock(const StringContainer &filenames);
625 
630  void FlagGantryTilt();
631 
635  void UndoPrematureGrouping();
636 
637  protected:
638  StringContainer m_GroupedFiles;
639  StringContainer m_UnsortedFiles;
640 
642  };
643 
656  {
657  public:
658  // two types to avoid any rounding errors
659  typedef itk::Point<double, 3> Point3Dd;
660  typedef itk::Vector<double, 3> Vector3Dd;
661 
666 
683  GantryTiltInformation(const Point3D &origin1,
684  const Point3D &origin2,
685  const Vector3D &right,
686  const Vector3D &up,
687  unsigned int numberOfSlicesApart);
688 
694  bool IsSheared() const;
695 
705  bool IsRegularGantryTilt() const;
706 
710  double GetMatrixCoefficientForCorrectionInWorldCoordinates() const;
711 
715  double GetRealZSpacing() const;
716 
722  double GetTiltCorrectedAdditionalSize() const;
723 
727  double GetTiltAngleInDegrees() const;
728 
729  protected:
733  Point3D projectPointOnLine(Point3Dd p, Point3Dd lineOrigin, Vector3Dd lineDirection);
734 
735  double m_ShiftUp;
736  double m_ShiftRight;
739  unsigned int m_NumberOfSlicesApart;
740  };
741 
745  typedef std::pair<StringContainer, StringContainer> TwoStringContainers;
746 
750  typedef std::map<std::string, std::string> TagToPropertyMapType;
751 
768  const StringContainer &files, bool groupsOfSimilarImages, const gdcm::Scanner::MappingType &tagValueMappings_);
769 
773  static std::string ConstCharStarToString(const char *s);
774 
778  static bool DICOMStringToSpacing(const std::string &s, ScalarType &spacingX, ScalarType &spacingY);
779 
788  static Point3D DICOMStringToPoint3D(const std::string &s, bool &successful);
789 
798  static void DICOMStringToOrientationVectors(const std::string &s, Vector3D &right, Vector3D &up, bool &successful);
799 
800  template <typename ImageType>
801  static typename ImageType::Pointer
802  // TODO this is NOT inplace!
804 
824  static StringContainer SortSeriesSlices(const StringContainer &unsortedFilenames);
825 
826  public:
830  static bool IsPhilips3DDicom(const std::string &filename);
831 
832  static std::string ReaderImplementationLevelToString(const ReaderImplementationLevel &enumValue);
833  static std::string PixelSpacingInterpretationToString(const PixelSpacingInterpretation &enumValue);
834 
835  protected:
839  static bool ReadPhilips3DDicom(const std::string &filename, itk::SmartPointer<Image> output_image);
840 
844  static std::string CreateMoreUniqueSeriesIdentifier(gdcm::Scanner::TagToValue &tagValueMap);
845 
849  static std::string CreateSeriesIdentifierPart(gdcm::Scanner::TagToValue &tagValueMap, const gdcm::Tag &tag);
850 
854  static std::string IDifyTagValue(const std::string &value);
855 
856  typedef itk::GDCMImageIO DcmIoType;
857 
861  class CallbackCommand : public itk::Command
862  {
863  public:
864  CallbackCommand(UpdateCallBackMethod callback) : m_Callback(callback) {}
865  void Execute(const itk::Object *caller, const itk::EventObject &) override
866  {
867  (*this->m_Callback)(static_cast<const itk::ProcessObject *>(caller)->GetProgress());
868  }
869 
870  void Execute(itk::Object *caller, const itk::EventObject &) override
871  {
872  (*this->m_Callback)(static_cast<itk::ProcessObject *>(caller)->GetProgress());
873  }
874 
875  protected:
877  };
878 
879  static void FixSpacingInformation(Image *image, const ImageBlockDescriptor &imageBlockDescriptor);
880 
884  static void ScanForSliceInformation(const StringContainer &filenames, gdcm::Scanner &scanner);
885 
889  static void LoadDicom(const StringContainer &filenames,
890  DataNode &node,
891  bool sort,
892  bool check_4d,
893  bool correctTilt,
894  UpdateCallBackMethod callback,
895  itk::SmartPointer<Image> preLoadedImageBlock);
896 
902  template <typename PixelType>
903  static itk::SmartPointer<Image> LoadDICOMByITK(const StringContainer &,
904  bool correctTilt,
905  const GantryTiltInformation &tiltInfo,
906  DcmIoType::Pointer &io,
907  CallbackCommand *command,
908  itk::SmartPointer<Image> preLoadedImageBlock);
909 
910  static itk::SmartPointer<Image> MultiplexLoadDICOMByITK(const StringContainer &,
911  bool correctTilt,
912  const GantryTiltInformation &tiltInfo,
913  DcmIoType::Pointer &io,
914  CallbackCommand *command,
915  itk::SmartPointer<Image> preLoadedImageBlock);
916 
917  static itk::SmartPointer<Image> MultiplexLoadDICOMByITKScalar(const StringContainer &,
918  bool correctTilt,
919  const GantryTiltInformation &tiltInfo,
920  DcmIoType::Pointer &io,
921  CallbackCommand *command,
922  itk::SmartPointer<Image> preLoadedImageBlock);
923 
924  static itk::SmartPointer<Image> MultiplexLoadDICOMByITKRGBPixel(const StringContainer &,
925  bool correctTilt,
926  const GantryTiltInformation &tiltInfo,
927  DcmIoType::Pointer &io,
928  CallbackCommand *command,
929  itk::SmartPointer<Image> preLoadedImageBlock);
930 
931  template <typename PixelType>
932  static itk::SmartPointer<Image> LoadDICOMByITK4D(std::list<StringContainer> &imageBlocks,
933  ImageBlockDescriptor imageBlockDescriptor,
934  bool correctTilt,
935  const GantryTiltInformation &tiltInfo,
936  DcmIoType::Pointer &io,
937  CallbackCommand *command,
938  itk::SmartPointer<Image> preLoadedImageBlock);
939 
940  static itk::SmartPointer<Image> MultiplexLoadDICOMByITK4D(std::list<StringContainer> &imageBlocks,
941  ImageBlockDescriptor imageBlockDescriptor,
942  bool correctTilt,
943  const GantryTiltInformation &tiltInfo,
944  DcmIoType::Pointer &io,
945  CallbackCommand *command,
946  itk::SmartPointer<Image> preLoadedImageBlock);
947 
948  static itk::SmartPointer<Image> MultiplexLoadDICOMByITK4DScalar(std::list<StringContainer> &imageBlocks,
949  ImageBlockDescriptor imageBlockDescriptor,
950  bool correctTilt,
951  const GantryTiltInformation &tiltInfo,
952  DcmIoType::Pointer &io,
953  CallbackCommand *command,
954  itk::SmartPointer<Image> preLoadedImageBlock);
955 
956  static itk::SmartPointer<Image> MultiplexLoadDICOMByITK4DRGBPixel(std::list<StringContainer> &imageBlocks,
957  ImageBlockDescriptor imageBlockDescriptor,
958  bool correctTilt,
959  const GantryTiltInformation &tiltInfo,
960  DcmIoType::Pointer &io,
961  CallbackCommand *command,
962  itk::SmartPointer<Image> preLoadedImageBlock);
963 
978  static std::list<StringContainer> SortIntoBlocksFor3DplusT(const StringContainer &presortedFilenames,
979  const gdcm::Scanner::MappingType &tagValueMappings_,
980  bool sort,
981  bool &canLoadAs4D);
982 
989  static bool GdcmSortFunction(const gdcm::DataSet &ds1, const gdcm::DataSet &ds2);
990 
996  static void CopyMetaDataToImageProperties(StringContainer filenames,
997  const gdcm::Scanner::MappingType &tagValueMappings_,
998  DcmIoType *io,
999  const ImageBlockDescriptor &blockInfo,
1000  Image *image);
1001  static void CopyMetaDataToImageProperties(std::list<StringContainer> imageBlock,
1002  const gdcm::Scanner::MappingType &tagValueMappings_,
1003  DcmIoType *io,
1004  const ImageBlockDescriptor &blockInfo,
1005  Image *image);
1006 
1015  static const TagToPropertyMapType &GetDICOMTagsToMITKPropertyMap();
1016  };
1017 }
1018 
1019 #endif /* mitkDicomSeriesReader_h */
PixelSpacingInterpretation
How the mitk::Image spacing should be interpreted.
std::map< std::string, std::string > TagToPropertyMapType
Maps DICOM tags to MITK properties.
static itk::SmartPointer< Image > LoadDICOMByITK4D(std::list< StringContainer > &imageBlocks, ImageBlockDescriptor imageBlockDescriptor, bool correctTilt, const GantryTiltInformation &tiltInfo, DcmIoType::Pointer &io, CallbackCommand *command, itk::SmartPointer< Image > preLoadedImageBlock)
static itk::SmartPointer< Image > MultiplexLoadDICOMByITK4DScalar(std::list< StringContainer > &imageBlocks, ImageBlockDescriptor imageBlockDescriptor, bool correctTilt, const GantryTiltInformation &tiltInfo, DcmIoType::Pointer &io, CallbackCommand *command, itk::SmartPointer< Image > preLoadedImageBlock)
static bool DICOMStringToSpacing(const std::string &s, ScalarType &spacingX, ScalarType &spacingY)
Safely convert a string into pixel spacing x and y.
PixelSpacingInterpretation GetPixelSpacingType() const
How the mitk::Image spacing can meaningfully be interpreted.
Return type of GetSeries, describes a logical group of files.
static Point3D DICOMStringToPoint3D(const std::string &s, bool &successful)
Convert DICOM string describing a point to Point3D.
static void ScanForSliceInformation(const StringContainer &filenames, gdcm::Scanner &scanner)
Scan for slice image information.
bool PixelSpacingRelatesToPatient() const
Whether or not mitk::Image spacing relates to the patient.
itk::Image< unsigned char, 3 > ImageType
double ScalarType
void Execute(const itk::Object *caller, const itk::EventObject &) override
static void FixSpacingInformation(Image *image, const ImageBlockDescriptor &imageBlockDescriptor)
std::pair< StringContainer, StringContainer > TwoStringContainers
for internal sorting.
static std::string GetConfigurationString()
Provide combination of preprocessor defines that was active during compilation.
std::vector< std::string > StringContainer
Lists of filenames.
static bool ReadPhilips3DDicom(const std::string &filename, itk::SmartPointer< Image > output_image)
Read a Philips3D ultrasound DICOM file and put into an mitk::Image.
static ImageType::Pointer InPlaceFixUpTiltedGeometry(ImageType *input, const GantryTiltInformation &tiltInfo)
static DataNode::Pointer LoadDicomSeries(const StringContainer &filenames, bool sort=true, bool load4D=true, bool correctGantryTilt=true, UpdateCallBackMethod callback=nullptr, itk::SmartPointer< Image > preLoadedImageBlock=nullptr)
DataCollection - Class to facilitate loading/accessing structured data.
std::string GetSOPClassUIDAsString() const
SOP Class UID as readable string (Computed Tomography Image Storage, Secondary Capture Image Storage...
static itk::SmartPointer< Image > MultiplexLoadDICOMByITKRGBPixel(const StringContainer &, bool correctTilt, const GantryTiltInformation &tiltInfo, DcmIoType::Pointer &io, CallbackCommand *command, itk::SmartPointer< Image > preLoadedImageBlock)
void(* UpdateCallBackMethod)(float)
Interface for the progress callback.
StringContainer GetFilenames() const
List of files in this group.
static std::string CreateSeriesIdentifierPart(gdcm::Scanner::TagToValue &tagValueMap, const gdcm::Tag &tag)
Helper for CreateMoreUniqueSeriesIdentifier.
static std::string ReaderImplementationLevelToString(const ReaderImplementationLevel &enumValue)
static itk::SmartPointer< Image > MultiplexLoadDICOMByITK4DRGBPixel(std::list< StringContainer > &imageBlocks, ImageBlockDescriptor imageBlockDescriptor, bool correctTilt, const GantryTiltInformation &tiltInfo, DcmIoType::Pointer &io, CallbackCommand *command, itk::SmartPointer< Image > preLoadedImageBlock)
static std::string ConstCharStarToString(const char *s)
Safely convert const char* to std::string.
loader code is implemented but not accompanied by tests
std::string GetSeriesInstanceUID() const
The Series Instance UID.
static std::string PixelSpacingInterpretationToString(const PixelSpacingInterpretation &enumValue)
bool PixelSpacingIsUnknown() const
Whether or not mitk::Image spacing is of unknown origin.
static std::string IDifyTagValue(const std::string &value)
Helper for CreateMoreUniqueSeriesIdentifier.
class ITK_EXPORT Image
static void LoadDicom(const StringContainer &filenames, DataNode &node, bool sort, bool check_4d, bool correctTilt, UpdateCallBackMethod callback, itk::SmartPointer< Image > preLoadedImageBlock)
Performs actual loading of a series and creates an image having the specified pixel type...
static itk::SmartPointer< Image > LoadDICOMByITK(const StringContainer &, bool correctTilt, const GantryTiltInformation &tiltInfo, DcmIoType::Pointer &io, CallbackCommand *command, itk::SmartPointer< Image > preLoadedImageBlock)
Feed files into itk::ImageSeriesReader and retrieve a 3D MITK image.
static std::list< StringContainer > SortIntoBlocksFor3DplusT(const StringContainer &presortedFilenames, const gdcm::Scanner::MappingType &tagValueMappings_, bool sort, bool &canLoadAs4D)
Sort files into time step blocks of a 3D+t image.
void Execute(itk::Object *caller, const itk::EventObject &) override
ReaderImplementationLevel GetReaderImplementationLevel() const
Confidence of the reader that this block can be read successfully.
static FileNamesGrouping GetSeries(const std::string &dir, bool groupImagesWithGantryTilt, const StringContainer &restrictions=StringContainer())
see other GetSeries().
static void DICOMStringToOrientationVectors(const std::string &s, Vector3D &right, Vector3D &up, bool &successful)
Convert DICOM string describing a point two Vector3D.
Image class for storing images.
Definition: mitkImage.h:72
Progress callback for DicomSeriesReader.
std::string GetModality() const
Series Modality (CT, MR, etc.)
mitk::Image::Pointer image
static bool IsPhilips3DDicom(const std::string &filename)
Checks if a specific file is a Philips3D ultrasound DICOM file.
static itk::SmartPointer< Image > MultiplexLoadDICOMByITKScalar(const StringContainer &, bool correctTilt, const GantryTiltInformation &tiltInfo, DcmIoType::Pointer &io, CallbackCommand *command, itk::SmartPointer< Image > preLoadedImageBlock)
static bool IsDicom(const std::string &filename)
Checks if a specific file contains DICOM data.
std::string GetSOPClassUID() const
SOP Class UID as DICOM UID.
std::string GetImageBlockUID() const
A unique ID describing this bloc (enhanced Series Instance UID).
Return type of DicomSeriesReader::AnalyzeFileForITKImageSeriesReaderSpacingAssumption.
static void CopyMetaDataToImageProperties(StringContainer filenames, const gdcm::Scanner::MappingType &tagValueMappings_, DcmIoType *io, const ImageBlockDescriptor &blockInfo, Image *image)
Copy information about files and DICOM tags from ITK&#39;s MetaDataDictionary and from the list of input ...
static itk::SmartPointer< Image > MultiplexLoadDICOMByITK4D(std::list< StringContainer > &imageBlocks, ImageBlockDescriptor imageBlockDescriptor, bool correctTilt, const GantryTiltInformation &tiltInfo, DcmIoType::Pointer &io, CallbackCommand *command, itk::SmartPointer< Image > preLoadedImageBlock)
bool PixelSpacingRelatesToDetector() const
Whether or not mitk::Image spacing relates to the detector surface.
CallbackCommand(UpdateCallBackMethod callback)
static const TagToPropertyMapType & GetDICOMTagsToMITKPropertyMap()
Map between DICOM tags and MITK properties.
std::map< std::string, ImageBlockDescriptor > FileNamesGrouping
bool IsMultiFrameImage() const
Multi-frame image(s) or not.
static std::string CreateMoreUniqueSeriesIdentifier(gdcm::Scanner::TagToValue &tagValueMap)
Construct a UID that takes into account sorting criteria from GetSeries().
static itk::SmartPointer< Image > MultiplexLoadDICOMByITK(const StringContainer &, bool correctTilt, const GantryTiltInformation &tiltInfo, DcmIoType::Pointer &io, CallbackCommand *command, itk::SmartPointer< Image > preLoadedImageBlock)
static StringContainer SortSeriesSlices(const StringContainer &unsortedFilenames)
Sort a set of file names in an order that is meaningful for loading them into an mitk::Image.
ReaderImplementationLevel
Describes how well the reader is tested for a certain file type.
static bool GdcmSortFunction(const gdcm::DataSet &ds1, const gdcm::DataSet &ds2)
Defines spatial sorting for sorting by GDCM 2.
Class for nodes of the DataTree.
Definition: mitkDataNode.h:57
bool HasGantryTiltCorrected() const
Whether or not the block contains a gantry tilt which will be "corrected" during loading.
static SliceGroupingAnalysisResult AnalyzeFileForITKImageSeriesReaderSpacingAssumption(const StringContainer &files, bool groupsOfSimilarImages, const gdcm::Scanner::MappingType &tagValueMappings_)
Ensure an equal z-spacing for a group of files.