#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;
}
}
}
1.7.2