#include <mitkFileSeriesReader.h>


Public Types | |
| typedef FileSeriesReader | Self |
| typedef FileReader | Superclass |
| typedef itk::SmartPointer< Self > | Pointer |
| typedef itk::SmartPointer < const Self > | ConstPointer |
| typedef std::vector< std::string > | MatchedFileNames |
Public Member Functions | |
| virtual const char * | GetClassName () const |
| virtual MatchedFileNames | GetMatchedFileNames () |
Protected Member Functions | |
| FileSeriesReader () | |
| virtual | ~FileSeriesReader () |
| virtual bool | GenerateFileList () |
Protected Attributes | |
| std::string | m_FileName |
| std::string | m_FilePrefix |
| std::string | m_FilePattern |
| MatchedFileNames | m_MatchedFileNames |
Provides a function which generates a list of files from a given prefix and pattern. Subclasses may use this function to load a series of files.
Definition at line 35 of file mitkFileSeriesReader.h.
| typedef itk::SmartPointer<const Self> mitk::FileSeriesReader::ConstPointer |
Reimplemented in mitk::PicVolumeTimeSeriesReader, mitk::StlVolumeTimeSeriesReader, and mitk::VtkVolumeTimeSeriesReader.
Definition at line 38 of file mitkFileSeriesReader.h.
| typedef std::vector< std::string > mitk::FileSeriesReader::MatchedFileNames |
Definition at line 38 of file mitkFileSeriesReader.h.
| typedef itk::SmartPointer<Self> mitk::FileSeriesReader::Pointer |
Reimplemented in mitk::PicVolumeTimeSeriesReader, mitk::StlVolumeTimeSeriesReader, and mitk::VtkVolumeTimeSeriesReader.
Definition at line 38 of file mitkFileSeriesReader.h.
Reimplemented in mitk::PicVolumeTimeSeriesReader, mitk::StlVolumeTimeSeriesReader, and mitk::VtkVolumeTimeSeriesReader.
Definition at line 38 of file mitkFileSeriesReader.h.
Reimplemented in mitk::PicVolumeTimeSeriesReader, mitk::StlVolumeTimeSeriesReader, and mitk::VtkVolumeTimeSeriesReader.
Definition at line 38 of file mitkFileSeriesReader.h.
| mitk::FileSeriesReader::FileSeriesReader | ( | ) | [protected] |
Definition at line 251 of file mitkFileSeriesReader.cpp.
: m_FileName( "" ), m_FilePrefix( "" ), m_FilePattern( "" ) {}
| mitk::FileSeriesReader::~FileSeriesReader | ( | ) | [protected, virtual] |
Definition at line 255 of file mitkFileSeriesReader.cpp.
{
}
| bool mitk::FileSeriesReader::GenerateFileList | ( | ) | [protected, virtual] |
Definition at line 27 of file mitkFileSeriesReader.cpp.
References m_FileName, m_MatchedFileNames, and MITK_INFO.
Referenced by mitk::VtkVolumeTimeSeriesReader::GenerateData(), mitk::StlVolumeTimeSeriesReader::GenerateData(), and mitk::PicVolumeTimeSeriesReader::GenerateOutputInformation().
{
typedef std::vector<std::string> StringContainer;
typedef std::map<unsigned int, std::string> SortedStringContainer;
if ( m_FileName == "" )
{
throw itk::ImageFileReaderException( __FILE__, __LINE__, "FileName must be non-empty" );
}
//MITK_INFO << "FileName: "<< m_FileName <<", FilePrefix: "<< m_FilePrefix << ", FilePattern: "<< m_FilePattern << std::endl;
// determine begin and end idexes of the last digit sequence in the
// filename from the sample file name
// Therefore, walk backwards from the end of the filename until
// a number is found. The string in front of the number is the prefix,
// the string after the number is the extension.
std::string basename, path;
path = itksys::SystemTools::GetFilenamePath( m_FileName );
basename = itksys::SystemTools::GetFilenameName( m_FileName );
unsigned int digitBegin = 0;
unsigned int digitEnd = 0;
bool digitFound = false;
for ( unsigned int i = basename.length() - 1; ; --i )
{
char character = basename[ i ];
if ( character >= '0' && character <= '9' )
{
if (!digitFound)
{
digitEnd = i;
digitBegin = i;
digitFound = true;
}
else
digitBegin = i;
}
else
{
//end of digit series found, jump out of loop!
if (digitFound)
break;
}
if ( i == 0 )
break;
}
//
// if there is no digit in the filename, then we have a problem
// no matching filenames can be identified!
//
if ( !digitFound )
{
itkWarningMacro("Filename contains no digit!");
return false;
}
//
// determine prefix and extension start and length
//
unsigned int prefixBegin = 0;
unsigned int prefixLength = digitBegin;
unsigned int extensionBegin = digitEnd + 1;
unsigned int extensionLength = (digitEnd == basename.length() -1 ? 0 : basename.length() - 1 - digitEnd);
unsigned int numberLength = digitEnd - digitBegin + 1;
//
// extract prefix and extension
//
std::string prefix = "";
if (prefixLength != 0)
prefix = basename.substr( prefixBegin, prefixLength );
std::string extension = "";
if (extensionLength != 0)
extension = basename.substr( extensionBegin, extensionLength );
//
// print debug information
//
/*
MITK_INFO << "digitBegin : " << digitBegin << std::endl;
MITK_INFO << "digitEnd : " << digitEnd << std::endl;
MITK_INFO << "number of digits: " << numberLength << std::endl;
MITK_INFO << "prefixBegin : " << prefixBegin << std::endl;
MITK_INFO << "prefixLength : " << prefixLength << std::endl;
MITK_INFO << "prefix : " << prefix << std::endl;
MITK_INFO << "extensionBegin : " << extensionBegin << std::endl;
MITK_INFO << "extensionLength : " << extensionLength << std::endl;
MITK_INFO << "extension : " << extension << std::endl;
*/
if( (prefixLength + extensionLength + numberLength) != basename.length() )
{
throw itk::ImageFileReaderException( __FILE__, __LINE__, "prefixLength + extensionLength + numberLength != basenameLength" );
}
//
// Load Directory
//
std::string directory = itksys::SystemTools::GetFilenamePath( m_FileName );
itksys::Directory itkDir;
if ( !itkDir.Load ( directory.c_str() ) )
{
itkWarningMacro ( << "Directory " << directory << " cannot be read!" );
return false;
}
//
// Get a list of all files in the directory
//
StringContainer unmatchedFiles;
//unsigned long i;
for ( unsigned long i = 0; i < itkDir.GetNumberOfFiles(); i++ )
{
// Only read files
std::string filename = directory + "/" + itkDir.GetFile( i );
if ( itksys::SystemTools::FileIsDirectory( filename.c_str() ) )
continue;
// store the filenames without path
unmatchedFiles.push_back( itkDir.GetFile( i ) );
}
//
// Match the file list against the file prefix and extension,
// the result should be only the files that should be read
//
StringContainer matchedFiles;
for ( StringContainer::iterator it = unmatchedFiles.begin() ; it != unmatchedFiles.end() ; ++it )
{
bool prefixMatch = false;
bool extensionMatch = false;
// check if the file prefix matches the current file
if ( prefixLength != 0 )
prefixMatch = ( it->find(prefix) == prefixBegin ); // check if prefix is found
else
prefixMatch = ( ( (*it)[0] >='0' ) && ( (*it)[0] <='9' ) ); //check if filename begins with digit
// check if the file extension matches the current file
if ( extensionLength != 0 )
extensionMatch = ( it->find(extension) == it->length() - extensionLength ); // check if prefix is found
else
extensionMatch = ( ( (*it)[it->length()-1] >='0' ) && ( (*it)[it->length()-1] <='9' ) ); //check if filename ends with digit
if ( prefixMatch && extensionMatch )
{
matchedFiles.push_back( *it );
}
}
if ( matchedFiles.size() == 0 )
{
itkWarningMacro( << "Sorry, none of the files matched the prefix!" );
return false;
}
//
// parse the file names from back to front for digits
// and convert them to a number. Store the filename and number
// in a SortedStringContainer
//
SortedStringContainer sortedFiles;
for ( StringContainer::iterator it = matchedFiles.begin() ; it != matchedFiles.end() ; ++it )
{
// parse the filename starting from pos digitBegin until we reach a non-digit
// or the end of filename
std::string number = "";
std::string currentFilename(*it);
for ( unsigned int i = digitBegin ; i < currentFilename.length() ; ++i)
{
char character = currentFilename[ i ];
//do we have a digit?
if ( character >= '0' && character <= '9' )
number += character;
else
break; //end of digit series found, jump out of loop!
}
if ( number.length() == 0 )
{
// The file is not numbered, this is an error!
// Nevertheless, we try the next files.
itkWarningMacro( << "The filename " << *it << "does not contain a valid digit sequence but matches prefix and extension. Skipping file!" );
}
else
{
if ( ( number.length() + prefix.length() + extension.length() ) != it->length() )
{
itkWarningMacro("The file "<< *it <<" matches prefix and extension, but the string in beteen is not a single digit-sequence. Skipping file!");
}
else
{
// convert the number string into an integer and
// insert the filname (including directory) into the SortedStringContainer
unsigned int num = atoi( number.c_str() );
sortedFiles.insert( std::make_pair( num, directory + "/" + *it ) );
}
}
}
if ( sortedFiles.size() == 0 )
{
itkWarningMacro( << "Sorry, no numbered files found, I can't load anything..." );
return false;
}
//
// Convert the sorted string container in a plain sorted vector of strings;
//
m_MatchedFileNames.clear();
m_MatchedFileNames.resize( sortedFiles.size() );
unsigned long index = 0;
for ( SortedStringContainer::iterator it = sortedFiles.begin() ; it != sortedFiles.end() ; ++it, ++index )
{
m_MatchedFileNames[ index ] = it->second ;
MITK_INFO << "Added " << it->second << " to the set of matched files!" << std::endl;
}
return true;
}
| virtual const char* mitk::FileSeriesReader::GetClassName | ( | ) | const [virtual] |
Reimplemented in mitk::PicVolumeTimeSeriesReader, mitk::StlVolumeTimeSeriesReader, and mitk::VtkVolumeTimeSeriesReader.
| mitk::FileSeriesReader::MatchedFileNames mitk::FileSeriesReader::GetMatchedFileNames | ( | ) | [virtual] |
Definition at line 246 of file mitkFileSeriesReader.cpp.
{
return m_MatchedFileNames;
}
std::string mitk::FileSeriesReader::m_FileName [protected] |
Definition at line 52 of file mitkFileSeriesReader.h.
Referenced by GenerateFileList(), and mitk::PicVolumeTimeSeriesReader::GenerateOutputInformation().
std::string mitk::FileSeriesReader::m_FilePattern [protected] |
Definition at line 56 of file mitkFileSeriesReader.h.
Referenced by mitk::VtkVolumeTimeSeriesReader::GenerateData(), and mitk::StlVolumeTimeSeriesReader::GenerateData().
std::string mitk::FileSeriesReader::m_FilePrefix [protected] |
Definition at line 54 of file mitkFileSeriesReader.h.
Referenced by mitk::VtkVolumeTimeSeriesReader::GenerateData(), and mitk::StlVolumeTimeSeriesReader::GenerateData().
Definition at line 58 of file mitkFileSeriesReader.h.
Referenced by mitk::VtkVolumeTimeSeriesReader::GenerateData(), mitk::StlVolumeTimeSeriesReader::GenerateData(), GenerateFileList(), and mitk::PicVolumeTimeSeriesReader::GenerateOutputInformation().
1.7.2