13 # pragma warning (disable : 4996) 17 #include <vtkXMLDataElement.h> 28 const std::string
DATA =
"data";
29 const std::string
ITEM =
"item";
31 const std::string
NAME =
"name";
32 const std::string
ID =
"id";
34 const std::string
LINK =
"link";
37 static std::string
GetName(std::string fileName,std::string suffix)
39 fileName = QFileInfo(QString::fromStdString(fileName)).fileName().toStdString();
40 return fileName.substr(0,fileName.length() -suffix.length()-9);
43 static std::string
GetDate(std::string fileName,std::string suffix)
45 fileName = QFileInfo(QString::fromStdString(fileName)).fileName().toStdString();
46 fileName = fileName.substr(fileName.length() - suffix.length()-8,8);
47 fileName.insert(6,
"-");
48 fileName.insert(4,
"-");
54 : m_Collection(nullptr),
55 m_SubCollection(nullptr),
56 m_DataItemCollection(nullptr),
57 m_ColIgnore(false), m_ItemIgnore(false)
72 QDir fileName = QFileInfo(xmlFileName.c_str()).absoluteDir();
73 m_BaseDir = fileName.path().toStdString() + QDir::separator().toLatin1();
74 this->SetFileName(xmlFileName.c_str());
76 if (m_Collection.IsNotNull())
77 m_Collection->SetXMLFile(xmlFileName);
83 m_SelectedDataItemIds.insert( m_SelectedDataItemIds.end(), dataElemetIds.begin(), dataElemetIds.end() );
88 m_SelectedSubColIds.insert( m_SelectedSubColIds.end(), subColIds.begin(), subColIds.end() );
93 m_SelectedDataItemNames = itemNames;
98 m_SelectedDataItemIds.clear();
103 m_SelectedSubColIds.clear();
108 m_DataItemCollection =
nullptr;
109 m_SubCollection =
nullptr;
110 m_Collection =
nullptr;
119 if (fileList.size() <= 0)
123 collection->SetName(
GetName(fileList.at(0).at(0),suffixes.at(0)));
125 for (
unsigned int k=0;
k < fileList.at(0).size(); ++
k)
128 for (
unsigned int i=0; i< suffixes.size(); ++i)
130 auto image = IOUtil::Load<Image>(fileList.at(i).at(
k));
131 subCollection->AddData(
image.GetPointer(),seriesNames.at(i), fileList.at(i).at(
k));
133 std::string sDate =
GetDate(fileList.at(0).at(
k),suffixes.at(0));
134 collection->AddData(subCollection.GetPointer(),sDate,
"--");
141 std::string name(elementName);
146 std::string colName = ReadXMLStringAttribut(
NAME, atts);
147 m_Collection->SetName(colName);
152 m_ItemIgnore =
false;
154 std::string subColName = ReadXMLStringAttribut(
NAME, atts);
155 std::string subColId = ReadXMLStringAttribut(
ID, atts);
157 if (m_SelectedSubColIds.size() > 0 && std::find(m_SelectedSubColIds.begin(), m_SelectedSubColIds.end(), subColId) == m_SelectedSubColIds.end() )
165 m_SubCollection->Init(subColName);
167 else if (name ==
DATA)
172 std::string dataId = ReadXMLStringAttribut(
ID, atts);
173 if (m_SelectedDataItemIds.size() > 0 && std::find(m_SelectedDataItemIds.begin(), m_SelectedDataItemIds.end(), dataId) == m_SelectedDataItemIds.end() )
178 m_ItemIgnore =
false;
179 std::string dataName = ReadXMLStringAttribut(
NAME, atts);
182 m_DataItemCollection->Init(dataName);
184 else if (name ==
ITEM)
186 if (m_ColIgnore || m_ItemIgnore)
190 std::string relativeItemLink = ReadXMLStringAttribut(
LINK, atts);
191 std::string itemLink = m_BaseDir + relativeItemLink;
192 std::string itemName = ReadXMLStringAttribut(
NAME, atts);
195 if (m_SelectedDataItemNames.size() != 0 && std::find(m_SelectedDataItemNames.begin(), m_SelectedDataItemNames.end(), itemName) == m_SelectedDataItemNames.end() )
199 auto image = IOUtil::Load<Image>(itemLink);
200 if (
image.IsNotNull())
201 m_DataItemCollection->AddData(
image.GetPointer(),itemName,relativeItemLink);
203 MITK_ERROR <<
"File could not be loaded: " << itemLink <<
". Wihtin Sub-Collection " << m_SubCollection->GetName() <<
", within " << m_DataItemCollection->GetName() ;
206 MITK_WARN<<
"Malformed description ? -- unknown tag: " << name;
211 std::string name(elementName);
214 if (m_SubCollection.IsNull())
216 if (m_ColIgnore || m_SubCollection->Size() == 0)
219 m_Collection->AddData(m_SubCollection.GetPointer(),m_SubCollection->GetName());
224 if (m_DataItemCollection.IsNull())
226 if (m_DataItemCollection->Size() == 0)
229 m_SubCollection->AddData(m_DataItemCollection.GetPointer(),m_DataItemCollection->GetName());
234 std::string mitk::CollectionReader::ReadXMLStringAttribut(std::string name,
const char** atts)
238 const char** attsIter = atts;
242 if (name == *attsIter)
251 return std::string();
254 bool mitk::CollectionReader::ReadXMLBooleanAttribut(std::string name,
const char** atts)
256 std::string s = ReadXMLStringAttribut(name, atts);
257 std::transform(s.begin(), s.end(), s.begin(), ::toupper);
265 int mitk::CollectionReader::ReadXMLIntegerAttribut(std::string name,
const char** atts)
267 std::string s = ReadXMLStringAttribut(name, atts);
268 return atoi(s.c_str());
276 QString qFolder = QString::fromStdString(folder);
277 if (!QFileInfo(qFolder).isDir())
283 for (
unsigned int i=0; i< suffixes.size(); ++i)
285 std::vector<std::string> list;
286 fileList.push_back(list);
295 parseDir.setFilter(QDir::Files);
296 parseDir.setPath(qFolder);
297 QStringList filterMorph;
298 filterMorph <<
"*" + QString::fromStdString( suffixes.at(0) );
299 parseDir.setNameFilters( filterMorph );
301 QFileInfoList qFileList = parseDir.entryInfoList();
304 for (
int i = 0; i < qFileList.size(); ++i)
306 std::string baseFileName = qFileList.at(i).absoluteFilePath().toStdString();
307 fileList.at(0).push_back( baseFileName );
310 for (
unsigned int suffNo=1; suffNo < suffixes.size(); ++suffNo)
312 std::string derivedFileName = baseFileName.substr(0,baseFileName.length() -suffixes.at(0).length()) + suffixes.at(suffNo);
315 if (QFileInfo(QString::fromStdString(derivedFileName)).isFile())
316 fileList.at(suffNo).push_back(derivedFileName);
318 fileList.at(suffNo).push_back(
"");
324 int numberOfFiles=-1;
325 for (
unsigned int i=0; i< suffixes.size(); ++i)
328 parseDir.setFilter(QDir::Files);
329 parseDir.setPath(qFolder);
330 QStringList filterMorph;
331 filterMorph <<
"*" + QString::fromStdString( suffixes.at(i) );
332 parseDir.setNameFilters( filterMorph );
334 QFileInfoList qFileList = parseDir.entryInfoList();
335 if (numberOfFiles == -1)
336 numberOfFiles = qFileList.size();
338 if (numberOfFiles != qFileList.size() )
340 MITK_ERROR <<
"Series contain different number of images. Loading aborting.";
345 for (
int fileNo=0; fileNo<qFileList.size(); ++fileNo)
347 fileList.at(i).push_back(qFileList.at(fileNo).absoluteFilePath().toStdString());
356 std::vector<int> indexRemoval;
359 int modalities = list.size();
360 int timeSteps = list.at(0).size();
361 MITK_INFO <<
"Modalities " << modalities;
365 for (
int listIndex = 0 ; listIndex < timeSteps; listIndex++)
367 for (
int modalityIndex = 0 ; modalityIndex < modalities; modalityIndex++)
369 if (list.at(modalityIndex).at(listIndex) ==
"")
371 MITK_INFO <<
"Marked Index " << listIndex <<
" for removal.";
372 indexRemoval.push_back(listIndex);
379 for (
int listIndex = indexRemoval.size()-1 ; listIndex >= 0; --listIndex)
381 for (
int i = 0 ; i < modalities; i++)
383 list.at(i).erase(list.at(i).begin()+indexRemoval.at(listIndex)) ;
386 MITK_INFO <<
"Time Steps after sanitizing: " << list.at(0).size();
DataCollection::Pointer LoadCollection(const std::string &xmlFileName)
Build up a mitk::DataCollection from a XML resource.
void ClearDataElementIds()
void SetDataItemNames(std::vector< std::string > itemNames)
const std::string COLLECTION
static FileListType GenerateFileLists(std::string folder, std::vector< std::string > suffixes, bool allowGaps=false)
GenerateFileLists Returns a collection of lists with valid files names in a folder.
static FileListType SanitizeFileList(FileListType list)
SanitizeFileList Removes all entries that are lacking at least one modality.
const std::string SUBCOLLECTION
~CollectionReader() override
std::vector< std::vector< std::string > > FileListType
void StartElement(const char *elementName, const char **atts) override
Derived from XMLReader.
mitk::Image::Pointer image
void AddSubColIds(std::vector< std::string > subColIds)
void EndElement(const char *elementName) override
Derived from XMLReader.
void AddDataElementIds(std::vector< std::string > dataElemetIds)
static std::string GetDate(std::string fileName, std::string suffix)
const std::string FILEPATH
static std::string GetName(std::string fileName, std::string suffix)
static DataCollection::Pointer FolderToCollection(std::string folder, std::vector< std::string > suffixes, std::vector< std::string > seriesNames, bool allowGaps)
Build up a mitk::DataCollection from a folder providing suffixes to group the files.
itk::SmartPointer< Self > Pointer