Public Types | Public Member Functions | Static Public Member Functions | Protected Member Functions | Protected Attributes

mitk::DicomDiffusionImageHeaderReader Class Reference

#include <mitkDicomDiffusionImageHeaderReader.h>

Inheritance diagram for mitk::DicomDiffusionImageHeaderReader:
Inheritance graph
[legend]

List of all members.

Public Types

enum  SupportedVendors {
  SV_SIEMENS, SV_SIEMENS_MOSAIC, SV_PHILIPS, SV_GE,
  SV_UNKNOWN_VENDOR
}
typedef
DicomDiffusionImageHeaderReader 
Self
typedef itk::Object Superclass
typedef itk::SmartPointer< SelfPointer
typedef itk::SmartPointer
< const Self
ConstPointer
typedef std::vector< std::string > FileNamesContainer
typedef short PixelValueType
typedef itk::OrientedImage
< PixelValueType, 2 > 
SliceType
typedef itk::OrientedImage
< PixelValueType, 3 > 
VolumeType
typedef itk::ImageSeriesReader
< VolumeType
VolumeReaderType
typedef itk::ImageFileReader
< SliceType
SliceReaderType
typedef itk::GDCMImageIO ImageIOType

Public Member Functions

virtual const char * GetClassName () const
void SetSeriesDicomFilenames (FileNamesContainer dicomFilenames)
void SetGdcmIO (ImageIOType::Pointer gdcmIO)
void SetVolumeReader (VolumeReaderType::Pointer volumeReader)
void SetOutputPointer (DiffusionImageHeaderInformation::Pointer output)
virtual void Update ()
DiffusionImageHeaderInformation::Pointer GetOutput ()
SupportedVendors GetVendorID ()

Static Public Member Functions

static Pointer New ()

Protected Member Functions

 DicomDiffusionImageHeaderReader ()
virtual ~DicomDiffusionImageHeaderReader ()
void ReadPublicTags ()
void ReadPublicTags2 ()
void TransformGradients ()

Protected Attributes

FileNamesContainer m_DicomFilenames
DiffusionImageHeaderInformation::Pointer m_Output
ImageIOType::Pointer m_GdcmIO
VolumeReaderType::Pointer m_VolumeReader
bool m_SliceOrderIS
bool m_SingleSeries
int m_nSlice
std::vector< float > m_sliceLocations

Detailed Description

Definition at line 34 of file mitkDicomDiffusionImageHeaderReader.h.


Member Typedef Documentation

Definition at line 49 of file mitkDicomDiffusionImageHeaderReader.h.

Definition at line 56 of file mitkDicomDiffusionImageHeaderReader.h.

Definition at line 51 of file mitkDicomDiffusionImageHeaderReader.h.

Definition at line 55 of file mitkDicomDiffusionImageHeaderReader.h.

Definition at line 52 of file mitkDicomDiffusionImageHeaderReader.h.

Definition at line 54 of file mitkDicomDiffusionImageHeaderReader.h.

Definition at line 53 of file mitkDicomDiffusionImageHeaderReader.h.


Member Enumeration Documentation

Enumerator:
SV_SIEMENS 
SV_SIEMENS_MOSAIC 
SV_PHILIPS 
SV_GE 
SV_UNKNOWN_VENDOR 

Definition at line 41 of file mitkDicomDiffusionImageHeaderReader.h.


Constructor & Destructor Documentation

mitk::DicomDiffusionImageHeaderReader::DicomDiffusionImageHeaderReader (  ) [protected]

Definition at line 49 of file mitkDicomDiffusionImageHeaderReader.cpp.

References m_SingleSeries, and m_SliceOrderIS.

{
  m_SliceOrderIS = true;
  m_SingleSeries = true;
}
mitk::DicomDiffusionImageHeaderReader::~DicomDiffusionImageHeaderReader (  ) [protected, virtual]

Definition at line 55 of file mitkDicomDiffusionImageHeaderReader.cpp.

{
}

Member Function Documentation

virtual const char* mitk::DicomDiffusionImageHeaderReader::GetClassName (  ) const [virtual]
mitk::DiffusionImageHeaderInformation::Pointer mitk::DicomDiffusionImageHeaderReader::GetOutput ( void   )

Definition at line 200 of file mitkDicomDiffusionImageHeaderReader.cpp.

{
  return m_Output;
}
mitk::DicomDiffusionImageHeaderReader::SupportedVendors mitk::DicomDiffusionImageHeaderReader::GetVendorID (  )

Definition at line 60 of file mitkDicomDiffusionImageHeaderReader.cpp.

{
  // adapted from namic-sandbox
  // DicomToNrrdConverter.cxx

  m_GdcmIO = ImageIOType::New();
  m_GdcmIO->LoadPrivateTagsOn();
  m_GdcmIO->SetMaxSizeLoadEntry( 65536 );

  m_VolumeReader = VolumeReaderType::New();
  m_VolumeReader->SetImageIO( m_GdcmIO );
  m_VolumeReader->SetFileNames( m_DicomFilenames );

  try
  {
    m_VolumeReader->Update();
  }
  catch (itk::ExceptionObject &excp)
  {
    std::cerr << "Exception thrown while reading slice" << std::endl;
    std::cerr << excp << std::endl;
    return SV_UNKNOWN_VENDOR;
  }

  VolumeReaderType::DictionaryArrayRawPointer inputDict 
    = m_VolumeReader->GetMetaDataDictionaryArray();

  std::string vendor;
  itk::ExposeMetaData<std::string> ( *(*inputDict)[0], "0008|0070", vendor );
  // std::cout << vendor << std::endl;

  std::string ImageType;
  itk::ExposeMetaData<std::string> ( *(*inputDict)[0], "0008|0008", ImageType );
  //std::cout << ImageType << std::endl;

  if ( vendor.find("GE") != std::string::npos )
  {
    // for GE data
    return SV_GE;
  }
  else if( vendor.find("SIEMENS") != std::string::npos )
  {
    if ( ImageType.find("MOSAIC") != std::string::npos )
    {
      // for Siemens MOSAIC
      return SV_SIEMENS_MOSAIC;
    }
    else
    {
      // for Siemens SPLIT
      return SV_SIEMENS;
    }
  }
  else if( vendor.find("PHILIPS") != std::string::npos )
  {
    // for philips data
    return SV_PHILIPS;
  }
  else
  {
    // for unrecognized vendors
    return SV_UNKNOWN_VENDOR;
  }
}
static Pointer mitk::DicomDiffusionImageHeaderReader::New (  ) [static]
void mitk::DicomDiffusionImageHeaderReader::ReadPublicTags (  ) [protected]

Definition at line 205 of file mitkDicomDiffusionImageHeaderReader.cpp.

References InsertUnique().

{
  VolumeReaderType::DictionaryArrayRawPointer inputDict 
    = m_VolumeReader->GetMetaDataDictionaryArray();

  // load in all public tags
  m_nSlice = inputDict->size();   
  std::string tag;

  tag.clear();
  itk::ExposeMetaData<std::string> ( *(*inputDict)[0], "0008|103e", tag );
  this->m_Output->seriesDescription = tag.c_str();

  tag.clear();
  itk::ExposeMetaData<std::string> ( *(*inputDict)[0], "0020|0011", tag );
  this->m_Output->seriesNumber = atoi(tag.c_str());

  tag.clear();
  itk::ExposeMetaData<std::string> ( *(*inputDict)[0], "0010|0010", tag );
  this->m_Output->patientName = tag.c_str();

  tag.clear();
  itk::ExposeMetaData<std::string> ( *(*inputDict)[0], "0028|0010", tag );
  this->m_Output->nRows = atoi( tag.c_str() );

  tag.clear();
  itk::ExposeMetaData<std::string> ( *(*inputDict)[0], "0028|0011", tag );
  this->m_Output->nCols = atoi( tag.c_str() );

  tag.clear();
  itk::ExposeMetaData<std::string> ( *(*inputDict)[0], "0028|0030", tag );
  sscanf( tag.c_str(), "%f\\%f", &this->m_Output->xRes, &this->m_Output->yRes );

  tag.clear();
  itk::ExposeMetaData<std::string> ( *(*inputDict)[0], "0020|0032", tag );
  sscanf( tag.c_str(), "%f\\%f\\%f", &this->m_Output->xOrigin, &this->m_Output->yOrigin, &this->m_Output->zOrigin );

  tag.clear();
  itk::ExposeMetaData<std::string> ( *(*inputDict)[0], "0018|0050", tag );
  this->m_Output->sliceThickness = atof( tag.c_str() );

  tag.clear();
  itk::ExposeMetaData<std::string> ( *(*inputDict)[0], "0018|0088", tag );
  this->m_Output->sliceSpacing = atof( tag.c_str() );

  // figure out how many slices are there in a volume, each unique
  // SliceLocation represent one slice 
  for (int k = 0; k < m_nSlice; k++)
  {
    tag.clear();
    itk::ExposeMetaData<std::string> ( *(*inputDict)[k], "0020|1041",  tag);
    float sliceLocation = atof( tag.c_str() );
    InsertUnique( m_sliceLocations, sliceLocation );
  }    

  // check ImageOrientationPatient and figure out slice direction in
  // L-P-I (right-handed) system.
  // In Dicom, the coordinate frame is L-P by default. Look at
  // http://medical.nema.org/dicom/2007/07_03pu.pdf ,  page 301
  tag.clear();
  itk::ExposeMetaData<std::string> ( *(*inputDict)[0], "0020|0037", tag );
  float xRow, yRow, zRow, xCol, yCol, zCol, xSlice, ySlice, zSlice /*, orthoSliceSpacing*/;
  sscanf( tag.c_str(), "%f\\%f\\%f\\%f\\%f\\%f", &xRow, &yRow, &zRow, &xCol, &yCol, &zCol );
  //std::cout << "ImageOrientationPatient (0020:0037): ";
  //std::cout << xRow << ", " << yRow << ", " << zRow << "; ";
  //std::cout << xCol << ", " << yCol << ", " << zCol << "\n";

  // In Dicom, the measurement frame is L-P by default. Look at
  // http://medical.nema.org/dicom/2007/07_03pu.pdf ,  page 301, in
  // order to make this compatible with Slicer's RAS frame, we
  // multiply the direction cosines by the negatives of the resolution
  // (resolution is required by nrrd format). Direction cosine is not
  // affacted since the resulting frame is still a right-handed frame.
  xRow = -xRow;
  yRow = -yRow;

  xCol = -xCol;
  yCol = -yCol;

  // Cross product, this gives I-axis direction
  xSlice = (yRow*zCol-zRow*yCol)*this->m_Output->sliceSpacing;
  ySlice = (zRow*xCol-xRow*zCol)*this->m_Output->sliceSpacing;
  zSlice = (xRow*yCol-yRow*xCol)*this->m_Output->sliceSpacing;

  xRow *= this->m_Output->xRes;
  yRow *= this->m_Output->xRes;
  zRow *= this->m_Output->xRes;

  xCol *= this->m_Output->yRes;
  yCol *= this->m_Output->yRes;
  zCol *= this->m_Output->yRes;

  this->m_Output->xRow = xRow;
  this->m_Output->yRow = yRow;
  this->m_Output->zRow = zRow;
  this->m_Output->xCol = xCol;
  this->m_Output->yCol = yCol;
  this->m_Output->zCol = zCol;
  this->m_Output->xSlice = xSlice;
  this->m_Output->ySlice = ySlice;
  this->m_Output->zSlice = zSlice;

}
void mitk::DicomDiffusionImageHeaderReader::ReadPublicTags2 (  ) [protected]

Definition at line 314 of file mitkDicomDiffusionImageHeaderReader.cpp.

{

  if (!m_SliceOrderIS)
  {
    this->m_Output->xSlice = -this->m_Output->xSlice;
    this->m_Output->ySlice = -this->m_Output->ySlice;
    this->m_Output->zSlice = -this->m_Output->zSlice;
  }

  //std::cout << "Row: " << this->m_Output->xRow << ", " << this->m_Output->yRow << ", " << this->m_Output->zRow << std::endl;
  //std::cout << "Col: " << this->m_Output->xCol << ", " << this->m_Output->yCol << ", " << this->m_Output->zCol << std::endl;
  //std::cout << "Sli: " << this->m_Output->xSlice << ", " << this->m_Output->ySlice << ", " << this->m_Output->zSlice << std::endl;

  //orthoSliceSpacing = fabs(zSlice);

  //int nVolume;

  //float maxBvalue = 0;
  //int nBaseline = 0;

}
void mitk::DicomDiffusionImageHeaderReader::SetGdcmIO ( ImageIOType::Pointer  gdcmIO ) [inline]

Definition at line 62 of file mitkDicomDiffusionImageHeaderReader.h.

    { this->m_GdcmIO = gdcmIO; }
void mitk::DicomDiffusionImageHeaderReader::SetOutputPointer ( DiffusionImageHeaderInformation::Pointer  output ) [inline]

Definition at line 68 of file mitkDicomDiffusionImageHeaderReader.h.

    { this->m_Output = output; }
void mitk::DicomDiffusionImageHeaderReader::SetSeriesDicomFilenames ( FileNamesContainer  dicomFilenames ) [inline]

Definition at line 59 of file mitkDicomDiffusionImageHeaderReader.h.

    { this->m_DicomFilenames = dicomFilenames; }
void mitk::DicomDiffusionImageHeaderReader::SetVolumeReader ( VolumeReaderType::Pointer  volumeReader ) [inline]

Definition at line 65 of file mitkDicomDiffusionImageHeaderReader.h.

    { this->m_VolumeReader = volumeReader; }
void mitk::DicomDiffusionImageHeaderReader::TransformGradients (  ) [protected]

Definition at line 337 of file mitkDicomDiffusionImageHeaderReader.cpp.

{
  // transform gradient directions into RAS frame 
    if ( !m_SliceOrderIS )
    {
      this->m_Output->DiffusionVector[2] = -this->m_Output->DiffusionVector[2];  // I -> S
    }
}
void mitk::DicomDiffusionImageHeaderReader::Update (  ) [virtual]

Reimplemented in mitk::GEDicomDiffusionImageHeaderReader, mitk::PhilipsDicomDiffusionImageHeaderReader, mitk::SiemensDicomDiffusionImageHeaderReader, and mitk::SiemensMosaicDicomDiffusionImageHeaderReader.

Definition at line 126 of file mitkDicomDiffusionImageHeaderReader.cpp.

References mitk::PhilipsDicomDiffusionImageHeaderReader::New(), mitk::SiemensMosaicDicomDiffusionImageHeaderReader::New(), mitk::SiemensDicomDiffusionImageHeaderReader::New(), mitk::GEDicomDiffusionImageHeaderReader::New(), and mitk::DiffusionImageHeaderInformation::New().

{

  // check if there are filenames
  if(m_DicomFilenames.size())
  {

    m_Output = mitk::DiffusionImageHeaderInformation::New();
    m_Output->m_DicomFilenames = m_DicomFilenames;

    // create correct reader
    switch(GetVendorID())
    {
    case(SV_GE):
      {
        GEDicomDiffusionImageHeaderReader::Pointer reader
          = GEDicomDiffusionImageHeaderReader::New();
        reader->SetSeriesDicomFilenames(this->m_DicomFilenames);
        reader->SetGdcmIO(this->m_GdcmIO);
        reader->SetVolumeReader(this->m_VolumeReader);
        reader->SetOutputPointer(this->m_Output);
        reader->Update();
        this->m_Output = reader->GetOutput();
        break;
      }
    case(SV_SIEMENS):
      {
        SiemensDicomDiffusionImageHeaderReader::Pointer reader
          = SiemensDicomDiffusionImageHeaderReader::New();
        reader->SetSeriesDicomFilenames(this->m_DicomFilenames);
        reader->SetGdcmIO(this->m_GdcmIO);
        reader->SetVolumeReader(this->m_VolumeReader);
        reader->SetOutputPointer(this->m_Output);
        reader->Update();
        this->m_Output = reader->GetOutput();
        break;
      }
    case(SV_SIEMENS_MOSAIC):
      {

        SiemensMosaicDicomDiffusionImageHeaderReader::Pointer reader
          = SiemensMosaicDicomDiffusionImageHeaderReader::New();
        reader->SetSeriesDicomFilenames(this->m_DicomFilenames);
        reader->SetGdcmIO(this->m_GdcmIO);
        reader->SetVolumeReader(this->m_VolumeReader);
        reader->SetOutputPointer(this->m_Output);
        reader->Update();
        this->m_Output = reader->GetOutput();
        break;
      }
    case(SV_PHILIPS):
      {

        PhilipsDicomDiffusionImageHeaderReader::Pointer reader
          = PhilipsDicomDiffusionImageHeaderReader::New();
        reader->SetSeriesDicomFilenames(this->m_DicomFilenames);
        reader->SetGdcmIO(this->m_GdcmIO);
        reader->SetVolumeReader(this->m_VolumeReader);
        reader->SetOutputPointer(this->m_Output);
        reader->Update();
        this->m_Output = reader->GetOutput();
        break;
      }
    case(SV_UNKNOWN_VENDOR):
      {
        std::cerr << "diffusion header reader: unknown vendor" << std::endl;
        break;
      }
    }
  }
}

Member Data Documentation

Definition at line 96 of file mitkDicomDiffusionImageHeaderReader.h.

ImageIOType::Pointer mitk::DicomDiffusionImageHeaderReader::m_GdcmIO [protected]

Definition at line 99 of file mitkDicomDiffusionImageHeaderReader.h.

Definition at line 104 of file mitkDicomDiffusionImageHeaderReader.h.

Definition at line 97 of file mitkDicomDiffusionImageHeaderReader.h.

Definition at line 105 of file mitkDicomDiffusionImageHeaderReader.h.

VolumeReaderType::Pointer mitk::DicomDiffusionImageHeaderReader::m_VolumeReader [protected]

Definition at line 100 of file mitkDicomDiffusionImageHeaderReader.h.


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines