7 #include "fwDicomIOFilter/sorter/TagValueSorter.hpp" 9 #include "fwDicomIOFilter/exceptions/FilterFailure.hpp" 10 #include "fwDicomIOFilter/registry/macros.hpp" 12 #include <dcmtk/config/osconfig.h> 13 #include <dcmtk/dcmdata/dcdeftag.h> 14 #include <dcmtk/dcmdata/dcfilefo.h> 15 #include <dcmtk/dcmdata/dcistrmb.h> 16 #include <dcmtk/dcmimgle/dcmimage.h> 17 #include <dcmtk/dcmnet/diutil.h> 28 "Sort instances using a tag value.";
35 m_tag = DCM_UndefinedTagKey;
68 const ::fwMedData::DicomSeries::sptr& series, const ::fwLog::Logger::sptr& logger)
71 if(
m_tag == DCM_UndefinedTagKey)
73 const std::string msg =
"Unable to split the series, the specified tag is not valid.";
74 throw ::fwDicomIOFilter::exceptions::FilterFailure(msg);
77 DicomSeriesContainerType result;
79 ::fwMedData::DicomSeries::DicomContainerType sortedDicom;
83 for(
const auto& item : series->getDicomContainer())
85 const ::fwMemory::BufferObject::sptr bufferObj = item.second;
86 const size_t buffSize = bufferObj->getSize();
88 char* buffer =
static_cast< char*
>( lock.
getBuffer() );
90 DcmInputBufferStream is;
91 is.setBuffer(buffer, offile_off_t(buffSize));
94 DcmFileFormat fileFormat;
95 fileFormat.transferInit();
96 if (!fileFormat.read(is).good())
98 FW_RAISE(
"Unable to read Dicom file '"<< bufferObj->getStreamInfo().fsFile.string() <<
"' "<<
99 "(slice: '" << item.first <<
"')");
102 fileFormat.loadAllDataIntoMemory();
103 fileFormat.transferEnd();
105 dataset = fileFormat.getDataset();
108 dataset->findAndGetSint32(
m_tag, index);
110 sortedDicom[size_t(index)] = bufferObj;
113 if(sortedDicom.size() != series->getDicomContainer().size())
115 const std::string msg =
"Unable to sort the series using the specified tag. The tag may be missing in " 116 "some instances or several instances may have the same tag value.";
117 throw ::fwDicomIOFilter::exceptions::FilterFailure(msg);
120 series->clearDicomContainer();
121 for(
const auto& item : sortedDicom)
123 series->addBinary(item.first, item.second);
126 result.push_back(series);
128 std::stringstream ss;
129 ss <<
"The instances have been sorted using the value of tag (" <<
130 std::hex << std::setfill(
'0') << std::setw(4) <<
m_tag.getGroup() <<
"," <<
131 std::hex << std::setfill(
'0') << std::setw(4) <<
m_tag.getElement() <<
").";
132 logger->information(ss.str());
virtual FWDICOMIOFILTER_API bool isConfigurationRequired() const override
Return true if a configuration is required.
fwDicomIOFilter contains filters used to pre-process images before reading.
base class for BufferObject Lock
virtual FWDICOMIOFILTER_API ~TagValueSorter()
Destructor.
Filter that uses a tag to sort the instances.
virtual FWDICOMIOFILTER_API std::string getDescription() const override
Return the description of the filter.
static const std::string s_FILTER_DESCRIPTION
Filter description.
FWDICOMIOFILTER_API TagValueSorter(::fwDicomIOFilter::IFilter::Key key)
Constructor.
virtual FWDICOMIOFILTER_API std::string getName() const override
Return the name of the filter.
LockBase< T >::BufferType getBuffer() const
Returns BufferObject's buffer pointer.
Key class used to restrict access to Filter construction. See http://www.drdobbs.com/184402053.
virtual FWDICOMIOFILTER_API DicomSeriesContainerType apply(const ::fwMedData::DicomSeries::sptr &series, const ::fwLog::Logger::sptr &logger) const override
Override.
static const std::string s_FILTER_NAME
Filter name.
DcmTagKey m_tag
Tag used to sort instances.
Base class for Dicom instance sorter.