#include <mitkSiemensDicomDiffusionImageHeaderReader.h>
Public Types | |
typedef SiemensDicomDiffusionImageHeaderReader | Self |
typedef DicomDiffusionImageHeaderReader | Superclass |
typedef itk::SmartPointer< Self > | Pointer |
typedef itk::SmartPointer < const Self > | ConstPointer |
Public Member Functions | |
virtual const char * | GetClassName () const |
int | ExtractSiemensDiffusionInformation (std::string tagString, std::string nameString, std::vector< double > &valueArray, int startPos=0) |
int | ExtractSiemensDiffusionGradientInformation (std::string tagString, std::string nameString, std::vector< double > &valueArray) |
virtual void | Update () |
Static Public Member Functions | |
static Pointer | New () |
Protected Member Functions | |
SiemensDicomDiffusionImageHeaderReader () | |
virtual | ~SiemensDicomDiffusionImageHeaderReader () |
Definition at line 26 of file mitkSiemensDicomDiffusionImageHeaderReader.h.
typedef itk::SmartPointer<const Self> mitk::SiemensDicomDiffusionImageHeaderReader::ConstPointer |
Reimplemented from mitk::DicomDiffusionImageHeaderReader.
Definition at line 30 of file mitkSiemensDicomDiffusionImageHeaderReader.h.
typedef itk::SmartPointer<Self> mitk::SiemensDicomDiffusionImageHeaderReader::Pointer |
Reimplemented from mitk::DicomDiffusionImageHeaderReader.
Definition at line 30 of file mitkSiemensDicomDiffusionImageHeaderReader.h.
Reimplemented from mitk::DicomDiffusionImageHeaderReader.
Definition at line 30 of file mitkSiemensDicomDiffusionImageHeaderReader.h.
Reimplemented from mitk::DicomDiffusionImageHeaderReader.
Definition at line 30 of file mitkSiemensDicomDiffusionImageHeaderReader.h.
mitk::SiemensDicomDiffusionImageHeaderReader::SiemensDicomDiffusionImageHeaderReader | ( | ) | [protected] |
Definition at line 35 of file mitkSiemensDicomDiffusionImageHeaderReader.cpp.
{ }
mitk::SiemensDicomDiffusionImageHeaderReader::~SiemensDicomDiffusionImageHeaderReader | ( | ) | [protected, virtual] |
Definition at line 39 of file mitkSiemensDicomDiffusionImageHeaderReader.cpp.
{ }
int mitk::SiemensDicomDiffusionImageHeaderReader::ExtractSiemensDiffusionGradientInformation | ( | std::string | tagString, |
std::string | nameString, | ||
std::vector< double > & | valueArray | ||
) |
Definition at line 74 of file mitkSiemensDicomDiffusionImageHeaderReader.cpp.
{ int nItems = 0; std::string::size_type pos = -1; while(nItems != 3) { nItems = ExtractSiemensDiffusionInformation( tagString, nameString, valueArray, pos+1 ); pos = tagString.find( nameString, pos+1 ); if ( pos == std::string::npos ) { break; } } return nItems; }
int mitk::SiemensDicomDiffusionImageHeaderReader::ExtractSiemensDiffusionInformation | ( | std::string | tagString, |
std::string | nameString, | ||
std::vector< double > & | valueArray, | ||
int | startPos = 0 |
||
) |
Definition at line 43 of file mitkSiemensDicomDiffusionImageHeaderReader.cpp.
{ std::string::size_type atPosition = tagString.find( nameString, startPos ); if ( atPosition == std::string::npos) { return 0; } else { std::string infoAsString = tagString.substr( atPosition, tagString.size()-atPosition+1 ); const char * infoAsCharPtr = infoAsString.c_str(); int vm = *(infoAsCharPtr+64); std::string vr = infoAsString.substr( 68, 4 ); //int syngodt = *(infoAsCharPtr+72); //int nItems = *(infoAsCharPtr+76); //int localDummy = *(infoAsCharPtr+80); int offset = 84; for (int k = 0; k < vm; k++) { int itemLength = *(infoAsCharPtr+offset+4); int strideSize = static_cast<int> (ceil(static_cast<double>(itemLength)/4) * 4); std::string valueString = infoAsString.substr( offset+16, itemLength ); valueArray.push_back( atof(valueString.c_str()) ); offset += 16+strideSize; } return vm; } }
virtual const char* mitk::SiemensDicomDiffusionImageHeaderReader::GetClassName | ( | ) | const [virtual] |
Reimplemented from mitk::DicomDiffusionImageHeaderReader.
static Pointer mitk::SiemensDicomDiffusionImageHeaderReader::New | ( | ) | [static] |
Reimplemented from mitk::DicomDiffusionImageHeaderReader.
Referenced by mitk::DicomDiffusionImageHeaderReader::Update().
void mitk::SiemensDicomDiffusionImageHeaderReader::Update | ( | ) | [virtual] |
Reimplemented from mitk::DicomDiffusionImageHeaderReader.
Definition at line 91 of file mitkSiemensDicomDiffusionImageHeaderReader.cpp.
References MITK_ERROR, MITK_INFO, SiemensDictBValue(), SiemensDictDiffusionDirection(), SiemensDictDiffusionMatrix(), and SiemensDictShadowInfo().
{ // check if there are filenames if(m_DicomFilenames.size()) { // adapted from slicer // DicomToNrrdConverter.cxx VolumeReaderType::DictionaryArrayRawPointer inputDict = m_VolumeReader->GetMetaDataDictionaryArray(); #ifndef DGDCM2 // relevant Siemens private tags gdcm::DictEntry SiemensDictBValue( 0x0019, 0x100c, "IS", "1", "B Value of diffusion weighting" ); gdcm::DictEntry SiemensDictDiffusionDirection( 0x0019, 0x100e, "FD", "3", "Diffusion Gradient Direction" ); gdcm::DictEntry SiemensDictDiffusionMatrix( 0x0019, 0x1027, "FD", "6", "Diffusion Matrix" ); gdcm::DictEntry SiemensDictShadowInfo( 0x0029, 0x1010, "OB", "1", "Siemens DWI Info" ); //if(gdcm::Global::GetDicts()->GetDefaultPubDict()->GetEntry(SiemensMosiacParameters.GetKey()) == 0) // gdcm::Global::GetDicts()->GetDefaultPubDict()->AddEntry(SiemensMosiacParameters); //if(gdcm::Global::GetDicts()->GetDefaultPubDict()->GetEntry(SiemensDictNMosiac.GetKey()) == 0) // gdcm::Global::GetDicts()->GetDefaultPubDict()->AddEntry(SiemensDictNMosiac); // if(gdcm::Global::GetDicts()->GetDefaultPubDict()->GetEntry(SiemensDictBValue.GetName())==0) gdcm::Global::GetDicts()->GetDefaultPubDict()->AddEntry(SiemensDictBValue); if(gdcm::Global::GetDicts()->GetDefaultPubDict()->GetEntry(SiemensDictDiffusionDirection.GetName()) == 0) gdcm::Global::GetDicts()->GetDefaultPubDict()->AddEntry(SiemensDictDiffusionDirection); if(gdcm::Global::GetDicts()->GetDefaultPubDict()->GetEntry(SiemensDictDiffusionMatrix.GetName()) == 0) gdcm::Global::GetDicts()->GetDefaultPubDict()->AddEntry(SiemensDictDiffusionMatrix); if(gdcm::Global::GetDicts()->GetDefaultPubDict()->GetEntry(SiemensDictShadowInfo.GetName()) == 0) gdcm::Global::GetDicts()->GetDefaultPubDict()->AddEntry(SiemensDictShadowInfo); #else // gdcm::DictEntry SiemensDictBValue( "0019,100c", "B Value of diffusion weighting", gdcm::VR::IS, gdcm::VM::VM1 ); // gdcm::DictEntry SiemensDictDiffusionDirection( "0019,100e", "Diffusion Gradient Direction", gdcm::VR::FD, gdcm::VM::VM3 ); // gdcm::DictEntry SiemensDictDiffusionMatrix( "0019,1027", "Diffusion Matrix", gdcm::VR::FD, gdcm::VM::VM6 ); // gdcm::DictEntry SiemensDictShadowInfo( "0029,1010", "Siemens DWI Info", gdcm::VR::OB, gdcm::VM::VM1 ); // //if(gdcm::Global::GetInstance().GetDicts().GetPublicDict().GetDictEntry(gdcm::Tag(0x0019,0x100c)) == 0) // gdcm::Global::GetInstance().GetDicts().GetPublicDict().AddDictEntry(gdcm::Tag(0x0019,0x100c),SiemensDictBValue); // if(gdcm::Global::GetDicts()->GetDefaultPubDict()->GetEntry(SiemensDictDiffusionDirection.GetName()) == 0) // gdcm::Global::GetDicts()->GetDefaultPubDict()->AddEntry(SiemensDictDiffusionDirection); // if(gdcm::Global::GetDicts()->GetDefaultPubDict()->GetEntry(SiemensDictDiffusionMatrix.GetName()) == 0) // gdcm::Global::GetDicts()->GetDefaultPubDict()->AddEntry(SiemensDictDiffusionMatrix); // if(gdcm::Global::GetDicts()->GetDefaultPubDict()->GetEntry(SiemensDictShadowInfo.GetName()) == 0) // gdcm::Global::GetDicts()->GetDefaultPubDict()->AddEntry(SiemensDictShadowInfo); #endif ReadPublicTags(); //int mMosaic; // number of raws in each mosaic block; //int nMosaic; // number of columns in each mosaic block float x0, y0, z0; float x1, y1, z1; std::string tag; tag.clear(); itk::ExposeMetaData<std::string> ( *(*inputDict)[0], "0020|0032", tag ); sscanf( tag.c_str(), "%f\\%f\\%f", &x0, &y0, &z0 ); //MITK_INFO << "Slice 0: " << tag << std::endl; tag.clear(); // assume volume interleaving, i.e. the second dicom file stores // the second slice in the same volume as the first dicom file if((*inputDict).size() > 1) { itk::ExposeMetaData<std::string> ( *(*inputDict)[1], "0020|0032", tag ); sscanf( tag.c_str(), "%f\\%f\\%f", &x1, &y1, &z1 ); //MITK_INFO << "Slice 1: " << tag << std::endl; x1 -= x0; y1 -= y0; z1 -= z0; x0 = x1*this->m_Output->xSlice + y1*this->m_Output->ySlice + z1*this->m_Output->zSlice; if (x0 < 0) { m_SliceOrderIS = false; } } ReadPublicTags2(); int nStride = 1; //MITK_INFO << orthoSliceSpacing << std::endl; this->m_Output->nSliceInVolume = m_sliceLocations.size(); //nVolume = nSlice/this->m_Output->nSliceInVolume; //MITK_INFO << "Number of Slices: " << m_nSlice << std::endl; //MITK_INFO << "Number of Volume: " << nVolume << std::endl; //MITK_INFO << "Number of Slices in each volume: " << this->m_Output->nSliceInVolume << std::endl; nStride = this->m_Output->nSliceInVolume; MITK_INFO << m_DicomFilenames[0] << std::endl; MITK_INFO << "Dims " << this->m_Output->nRows << "x" << this->m_Output->nCols << "x" << this->m_Output->nSliceInVolume << " " << std::endl; for (int k = 0; k < m_nSlice; k += nStride ) { #ifndef DGDCM2 gdcm::File *header0 = new gdcm::File; gdcm::BinEntry* binEntry; header0->SetMaxSizeLoadEntry(65536); header0->SetFileName( m_DicomFilenames[k] ); header0->SetLoadMode( gdcm::LD_ALL ); header0->Load(); // copy information stored in 0029,1010 into a string for parsing gdcm::DocEntry* docEntry = header0->GetFirstEntry(); while(docEntry) { if ( docEntry->GetKey() == "0029|1010" ) { binEntry = dynamic_cast<gdcm::BinEntry*> ( docEntry ); int binLength = binEntry->GetFullLength(); tag.resize( binLength ); uint8_t * tagString = binEntry->GetBinArea(); for (int n = 0; n < binLength; n++) { tag[n] = *(tagString+n); } break; } docEntry = header0->GetNextEntry(); } #else gdcm::ImageReader reader; reader.SetFileName( m_DicomFilenames[k].c_str() ); if( !reader.Read() ) { itkExceptionMacro(<< "Cannot read requested file"); } const gdcm::File &f = reader.GetFile(); const gdcm::DataSet &ds = f.GetDataSet(); // gdcm::DataSet ds = header0->GetDataSet(); gdcm::DataSet::ConstIterator it = ds.Begin(); // Copy of the header->content // copy information stored in 0029,1010 into a string for parsing for(; it != ds.End(); ++it) { const gdcm::DataElement &ref = *it; if (ref.GetTag() == gdcm::Tag(0x0029,0x1010)) { tag = std::string(ref.GetByteValue()->GetPointer(),ref.GetByteValue()->GetLength()); } } #endif // parse B_value from 0029,1010 tag std::vector<double> valueArray(0); vnl_vector_fixed<double, 3> vect3d; int nItems = ExtractSiemensDiffusionInformation(tag, "B_value", valueArray); if (nItems != 1 || valueArray[0] == 0) // did not find enough information { tag.clear(); MITK_INFO << "Reading diffusion info from 0019|100c and 0019|100e tags" << std::endl; bool success = false; #ifndef DGDCM2 success = itk::ExposeMetaData<std::string> ( *(*inputDict)[0], "0019|100c", tag ); this->m_Output->bValue = atof( tag.c_str() ); #else for(it = ds.Begin(); it != ds.End(); ++it) { const gdcm::DataElement &ref = *it; if (ref.GetTag() == gdcm::Tag(0x0019,0x100c)) { tag = std::string(ref.GetByteValue()->GetPointer(),ref.GetByteValue()->GetLength()); this->m_Output->bValue = atof( tag.c_str() ); success = true; } } #endif tag.clear(); if(success) { if(this->m_Output->bValue == 0) { MITK_INFO << "BV: 0 (Baseline image)"; continue; } #ifndef DGDCM2 success = itk::ExposeMetaData<std::string> ( *(*inputDict)[k], "0019|100e", tag); #else success = false; for(it = ds.Begin(); it != ds.End(); ++it) { const gdcm::DataElement &ref = *it; if (ref.GetTag() == gdcm::Tag(0x0019,0x100e)) { tag = std::string(ref.GetByteValue()->GetPointer(),ref.GetByteValue()->GetLength()); success = true; } } #endif if(success) { memcpy( &vect3d[0], tag.c_str()+0, 8 ); memcpy( &vect3d[1], tag.c_str()+8, 8 ); memcpy( &vect3d[2], tag.c_str()+16, 8 ); vect3d.normalize(); this->m_Output->DiffusionVector = vect3d; TransformGradients(); MITK_INFO << "BV: " << this->m_Output->bValue; MITK_INFO << " GD: " << this->m_Output->DiffusionVector; continue; } } } else { MITK_INFO << "Reading diffusion info from 0029,1010 tag" << std::endl; this->m_Output->bValue = valueArray[0]; if(this->m_Output->bValue == 0) { MITK_INFO << "BV: 0 (Baseline image)"; continue; } valueArray.resize(0); nItems = ExtractSiemensDiffusionGradientInformation(tag, "DiffusionGradientDirection", valueArray); if (nItems == 3) { vect3d[0] = valueArray[0]; vect3d[1] = valueArray[1]; vect3d[2] = valueArray[2]; vect3d.normalize(); this->m_Output->DiffusionVector = vect3d; TransformGradients(); MITK_INFO << "BV: " << this->m_Output->bValue; MITK_INFO << " GD: " << this->m_Output->DiffusionVector; continue; } } MITK_ERROR << "No diffusion info found, forcing to BASELINE image." << std::endl; this->m_Output->bValue = 0.0; vect3d.fill( 0.0 ); this->m_Output->DiffusionVector = vect3d; } } }