diff --git a/Modules/DICOMReader/Resources/configurations/3D/imageposition.xml b/Modules/DICOMReader/Resources/configurations/3D/imageposition.xml
index 783873bdf7..dcaf911507 100644
--- a/Modules/DICOMReader/Resources/configurations/3D/imageposition.xml
+++ b/Modules/DICOMReader/Resources/configurations/3D/imageposition.xml
@@ -1,23 +1,22 @@
-
diff --git a/Modules/DICOMReader/Resources/configurations/3D/imageposition.xml b/Modules/DICOMReader/Resources/configurations/3D/imageposition_byacquisition.xml
similarity index 100%
copy from Modules/DICOMReader/Resources/configurations/3D/imageposition.xml
copy to Modules/DICOMReader/Resources/configurations/3D/imageposition_byacquisition.xml
diff --git a/Modules/DICOMReader/files.cmake b/Modules/DICOMReader/files.cmake
index 84de604b4f..7504a63615 100644
--- a/Modules/DICOMReader/files.cmake
+++ b/Modules/DICOMReader/files.cmake
@@ -1,53 +1,54 @@
set(H_FILES
mitkDICOMFileReader.h
mitkDICOMImageFrameInfo.h
mitkDICOMImageBlockDescriptor.h
mitkDICOMGDCMImageFrameInfo.h
mitkDICOMITKSeriesGDCMReader.h
mitkDICOMDatasetSorter.h
mitkDICOMEnums.h
mitkDICOMTagBasedSorter.h
mitkDICOMSortCriterion.h
mitkDICOMSortByTag.h
mitkEquiDistantBlocksSorter.h
mitkNormalDirectionConsistencySorter.h
mitkSortByImagePositionPatient.h
mitkClassicDICOMSeriesReader.h
mitkThreeDnTDICOMSeriesReader.h
mitkDICOMTag.h
mitkDICOMReaderConfigurator.h
mitkDICOMFileReaderSelector.h
)
set(CPP_FILES
mitkDICOMFileReader.cpp
mitkDICOMImageBlockDescriptor.cpp
mitkDICOMITKSeriesGDCMReader.cpp
mitkDICOMDatasetSorter.cpp
mitkDICOMTagBasedSorter.cpp
mitkDICOMGDCMImageFrameInfo.cpp
mitkDICOMImageFrameInfo.cpp
mitkDICOMSortCriterion.cpp
mitkDICOMSortByTag.cpp
mitkITKDICOMSeriesReaderHelper.cpp
mitkEquiDistantBlocksSorter.cpp
mitkNormalDirectionConsistencySorter.cpp
mitkSortByImagePositionPatient.cpp
mitkGantryTiltInformation.cpp
mitkClassicDICOMSeriesReader.cpp
mitkThreeDnTDICOMSeriesReader.cpp
mitkDICOMTag.cpp
mitkDICOMEnums.cpp
mitkDICOMReaderConfigurator.cpp
mitkDICOMFileReaderSelector.cpp
)
set(RESOURCE_FILES
configurations/3D/classicreader.xml
configurations/3D/imageposition.xml
+ configurations/3D/imageposition_byacquisition.xml
configurations/3D/instancenumber.xml
configurations/3D/slicelocation.xml
configurations/3D/imagetime.xml
configurations/3DnT/classicreader.xml
)
diff --git a/Modules/DICOMReader/mitkDICOMFileReaderSelector.cpp b/Modules/DICOMReader/mitkDICOMFileReaderSelector.cpp
index 100003b88b..8cf0eb5a0b 100644
--- a/Modules/DICOMReader/mitkDICOMFileReaderSelector.cpp
+++ b/Modules/DICOMReader/mitkDICOMFileReaderSelector.cpp
@@ -1,233 +1,232 @@
/*===================================================================
The Medical Imaging Interaction Toolkit (MITK)
Copyright (c) German Cancer Research Center,
Division of Medical and Biological Informatics.
All rights reserved.
This software is distributed WITHOUT ANY WARRANTY; without
even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE.
See LICENSE.txt or http://www.mitk.org for details.
===================================================================*/
#include "mitkDICOMFileReaderSelector.h"
#include "mitkDICOMReaderConfigurator.h"
#include "mitkModuleContext.h"
#include
#include
#include
#include
mitk::DICOMFileReaderSelector
::DICOMFileReaderSelector()
{
}
mitk::DICOMFileReaderSelector
::~DICOMFileReaderSelector()
{
}
std::list
mitk::DICOMFileReaderSelector
::GetAllConfiguredReaders() const
{
return m_Readers;
}
void
mitk::DICOMFileReaderSelector
::AddConfigsFromResources(const std::string& path)
{
std::vector configs = GetModuleContext()->GetModule()->FindResources(path, "*.xml", false);
for (std::vector::iterator iter = configs.begin();
iter != configs.end();
++iter)
{
ModuleResource& resource = *iter;
if (resource.IsValid())
{
ModuleResourceStream stream(resource);
// read all into string s
std::string s;
stream.seekg(0, std::ios::end);
s.reserve(stream.tellg());
stream.seekg(0, std::ios::beg);
s.assign((std::istreambuf_iterator(stream)),
std::istreambuf_iterator());
- //MITK_INFO << "------------ One resource with content\n" << s << "\n------- end -------";
this->AddConfig(s);
}
}
}
void
mitk::DICOMFileReaderSelector
::AddConfigFromResource(ModuleResource& resource)
{
if (resource.IsValid())
{
ModuleResourceStream stream(resource);
// read all into string s
std::string s;
stream.seekg(0, std::ios::end);
s.reserve(stream.tellg());
stream.seekg(0, std::ios::beg);
s.assign((std::istreambuf_iterator(stream)),
std::istreambuf_iterator());
- //MITK_INFO << "------------ One resource with content\n" << s << "\n------- end -------";
this->AddConfig(s);
}
}
void
mitk::DICOMFileReaderSelector
::AddConfigFromResource(const std::string& resourcename)
{
ModuleResource r = GetModuleContext()->GetModule()->GetResource(resourcename);
this->AddConfigFromResource(r);
}
void
mitk::DICOMFileReaderSelector
::LoadBuiltIn3DConfigs()
{
//this->AddConfigsFromResources("configurations/3D");
// in this order of preference...
this->AddConfigFromResource("configurations/3D/instancenumber.xml");
this->AddConfigFromResource("configurations/3D/imageposition.xml");
+ this->AddConfigFromResource("configurations/3D/imageposition_byacquisition.xml");
this->AddConfigFromResource("configurations/3D/slicelocation.xml");
this->AddConfigFromResource("configurations/3D/imagetime.xml");
}
void
mitk::DICOMFileReaderSelector
::LoadBuiltIn3DnTConfigs()
{
this->AddConfigsFromResources("configurations/3DnT");
}
void
mitk::DICOMFileReaderSelector
::AddConfig(const std::string& xmlDescription)
{
DICOMReaderConfigurator::Pointer configurator = DICOMReaderConfigurator::New();
DICOMFileReader::Pointer reader = configurator->CreateFromUTF8ConfigString(xmlDescription);
if (reader.IsNotNull())
{
m_Readers.push_back( reader );
m_PossibleConfigurations.push_back(xmlDescription);
}
else
{
std::stringstream ss;
ss << "Could not parse reader configuration. Ignoring it.";
throw std::invalid_argument( ss.str() );
}
}
void
mitk::DICOMFileReaderSelector
::AddConfigFile(const std::string& filename)
{
std::ifstream file(filename.c_str());
std::string s;
file.seekg(0, std::ios::end);
s.reserve(file.tellg());
file.seekg(0, std::ios::beg);
s.assign((std::istreambuf_iterator(file)),
std::istreambuf_iterator());
this->AddConfig(s);
}
void
mitk::DICOMFileReaderSelector
::SetInputFiles(StringList filenames)
{
m_InputFilenames = filenames;
}
const mitk::StringList&
mitk::DICOMFileReaderSelector
::GetInputFiles() const
{
return m_InputFilenames;
}
mitk::DICOMFileReader::Pointer
mitk::DICOMFileReaderSelector
::GetFirstReaderWithMinimumNumberOfOutputImages()
{
ReaderList workingCandidates;
// let all readers analyze the file set
unsigned int readerIndex(0);
for (ReaderList::iterator rIter = m_Readers.begin();
rIter != m_Readers.end();
++readerIndex, ++rIter)
{
(*rIter)->SetInputFiles( m_InputFilenames );
try
{
(*rIter)->AnalyzeInputFiles();
workingCandidates.push_back( *rIter );
MITK_INFO << "Reader " << readerIndex << " (" << (*rIter)->GetConfigurationLabel() << ") suggests " << (*rIter)->GetNumberOfOutputs() << " 3D blocks";
if ((*rIter)->GetNumberOfOutputs() == 1)
{
MITK_DEBUG << "Early out with reader #" << readerIndex << " (" << (*rIter)->GetConfigurationLabel() << "), less than 1 block is not possible";
return *rIter;
}
}
catch (std::exception& e)
{
MITK_ERROR << "Reader " << readerIndex << " (" << (*rIter)->GetConfigurationLabel() << ") threw exception during file analysis, ignoring this reader. Exception: " << e.what();
}
catch (...)
{
MITK_ERROR << "Reader " << readerIndex << " (" << (*rIter)->GetConfigurationLabel() << ") threw unknown exception during file analysis, ignoring this reader.";
}
}
DICOMFileReader::Pointer bestReader;
unsigned int minimumNumberOfOutputs = std::numeric_limits::max();
readerIndex = 0;
unsigned int bestReaderIndex(0);
// select the reader with the minimum number of mitk::Images as output
for (ReaderList::iterator rIter = workingCandidates.begin();
rIter != workingCandidates.end();
++readerIndex, ++rIter)
{
if ( (*rIter)->GetNumberOfOutputs() < minimumNumberOfOutputs )
{
minimumNumberOfOutputs = (*rIter)->GetNumberOfOutputs();
bestReader = *rIter;
bestReaderIndex = readerIndex;
}
}
MITK_DEBUG << "Decided for reader #" << bestReaderIndex << " (" << bestReader->GetConfigurationLabel() << ")";
MITK_DEBUG << m_PossibleConfigurations[bestReaderIndex];
return bestReader;
}