Public Member Functions | Static Public Member Functions | Static Public Attributes | Protected Member Functions | Protected Attributes

mitk::DataNodeFactory Class Reference
[IO Classes]

Factory, which creates instances of mitk::DataNodes filled with data read from a given file. More...

#include <mitkDataNodeFactory.h>

Inheritance diagram for mitk::DataNodeFactory:
Inheritance graph
[legend]
Collaboration diagram for mitk::DataNodeFactory:
Collaboration graph
[legend]

List of all members.

Public Member Functions

 mitkClassMacro (DataNodeFactory, DataNodeSource)
virtual void SetFileName (const char *_arg)
virtual const char * GetFileName () const
virtual void SetFilePrefix (const char *_arg)
 Set prefix for multiple load.
virtual const char * GetFilePrefix () const
 Get prefix for multiple load.
virtual void SetFilePattern (const char *_arg)
 Set pattern for multiple load.
virtual const char * GetFilePattern () const
 Get pattern for multiple load.
void SetDefaultCommonProperties (mitk::DataNode::Pointer &node)
void SetImageSerie (bool serie)
virtual bool GetUseSeriesDetails ()
virtual void SetUseSeriesDetails (bool _arg)
void AddSeriesRestriction (const std::string &tag)

Static Public Member Functions

static Pointer New ()
static ColorProperty::Pointer DefaultColorForOrgan (const std::string &)

Static Public Attributes

static bool m_TextureInterpolationActive = false

Protected Member Functions

 DataNodeFactory ()
virtual ~DataNodeFactory ()
virtual void GenerateData ()
virtual void ResizeOutputs (const unsigned int &num)
virtual bool FileNameEndsWith (const std::string &name)
virtual bool FilePatternEndsWith (const std::string &name)
virtual std::string GetBaseFileName ()
virtual std::string GetBaseFilePrefix ()
virtual std::string GetDirectory ()
virtual void ReadFileSeriesTypeDCM ()
virtual void ReadFileSeriesTypeITKImageSeriesReader ()

Protected Attributes

bool m_Serie
bool m_UseSeriesDetails
std::vector< std::string > m_SeriesRestrictions
int m_OldProgress

Detailed Description

Factory, which creates instances of mitk::DataNodes filled with data read from a given file.

This class reads files, creates an appropriate mitk::BaseData and adds the BaseData to a mitk::DataNode. This filter may produce one or more outputs (i.e. mitk::DataNodes). The number of generated nodes can be retrieved by a call of GetNumberOfOutputs().

If you want to add a new file type, you have to register the factory of the file reader in the class mitk::BaseDataIOFactory.

Definition at line 37 of file mitkDataNodeFactory.h.


Constructor & Destructor Documentation

mitk::DataNodeFactory::DataNodeFactory (  ) [protected]

Constructor.

Definition at line 92 of file mitkDataNodeFactory.cpp.

References mitk::CoreObjectFactory::GetInstance(), m_OldProgress, and m_Serie.

: m_UseSeriesDetails(true)
{
  m_Serie = false;
  m_OldProgress = 0;
  this->Modified();
  //ensure that a CoreObjectFactory has been instantiated
  mitk::CoreObjectFactory::GetInstance();
}
mitk::DataNodeFactory::~DataNodeFactory (  ) [protected, virtual]

Virtual destructor.

Definition at line 102 of file mitkDataNodeFactory.cpp.

{}

Member Function Documentation

void mitk::DataNodeFactory::AddSeriesRestriction ( const std::string &  tag ) [inline]

Definition at line 77 of file mitkDataNodeFactory.h.

mitk::ColorProperty::Pointer mitk::DataNodeFactory::DefaultColorForOrgan ( const std::string &  organ ) [static]

Nice default colors for segmentations of some "normal" organs.

Definition at line 318 of file mitkDataNodeFactory.cpp.

References mitk::ColorProperty::New().

{
  static bool initialized = false;
  static std::map< std::string, std::string > s_ColorMap;

  if (!initialized)
  {
    // all lowercase here, please!

    s_ColorMap.insert( std::make_pair( "ankle",               "0xe38686") );
    s_ColorMap.insert( std::make_pair( "appendix",            "0xe38686") );
    s_ColorMap.insert( std::make_pair( "blood vessels",       "0xff3131") );
    s_ColorMap.insert( std::make_pair( "bronchial tree",      "0x3168ff") );
    s_ColorMap.insert( std::make_pair( "bone",                "0xd5d5d5") );
    s_ColorMap.insert( std::make_pair( "brain",               "0xff9cca") );
    s_ColorMap.insert( std::make_pair( "coccyx",              "0xe38686") );
    s_ColorMap.insert( std::make_pair( "colon",               "0xe38686") );
    s_ColorMap.insert( std::make_pair( "cyst",                "0xe38686") );
    s_ColorMap.insert( std::make_pair( "elbow",               "0xe38686") );
    s_ColorMap.insert( std::make_pair( "eye",                 "0xe38686") );
    s_ColorMap.insert( std::make_pair( "fallopian tube",      "0xe38686") );
    s_ColorMap.insert( std::make_pair( "fat",                 "0xff2bee") );
    s_ColorMap.insert( std::make_pair( "hand",                "0xe38686") );
    s_ColorMap.insert( std::make_pair( "gall bladder",        "0x567f18") );
    s_ColorMap.insert( std::make_pair( "heart",               "0xeb1d32") );
    s_ColorMap.insert( std::make_pair( "hip",                 "0xe38686") );
    s_ColorMap.insert( std::make_pair( "kidney",              "0xd33f00") );
    s_ColorMap.insert( std::make_pair( "knee",                "0xe38686") );
    s_ColorMap.insert( std::make_pair( "larynx",              "0xe38686") );
    s_ColorMap.insert( std::make_pair( "liver",               "0xffcc3d") );
    s_ColorMap.insert( std::make_pair( "lung",                "0x6bdcff") );
    s_ColorMap.insert( std::make_pair( "lymph node",          "0xff0000") );
    s_ColorMap.insert( std::make_pair( "muscle",              "0xff456a") );
    s_ColorMap.insert( std::make_pair( "nerve",               "0xffea4f") );
    s_ColorMap.insert( std::make_pair( "nose",                "0xe38686") );
    s_ColorMap.insert( std::make_pair( "oesophagus",          "0xe38686") );
    s_ColorMap.insert( std::make_pair( "ovaries",             "0xe38686") );
    s_ColorMap.insert( std::make_pair( "pancreas",            "0xf9ab3d") );
    s_ColorMap.insert( std::make_pair( "pelvis",              "0xe38686") );
    s_ColorMap.insert( std::make_pair( "penis",               "0xe38686") );
    s_ColorMap.insert( std::make_pair( "pharynx",             "0xe38686") );
    s_ColorMap.insert( std::make_pair( "prostate",            "0xe38686") );
    s_ColorMap.insert( std::make_pair( "rectum",              "0xe38686") );
    s_ColorMap.insert( std::make_pair( "sacrum",              "0xe38686") );
    s_ColorMap.insert( std::make_pair( "seminal vesicle",     "0xe38686") );
    s_ColorMap.insert( std::make_pair( "shoulder",            "0xe38686") );
    s_ColorMap.insert( std::make_pair( "spinal cord",         "0xf5f93d") );
    s_ColorMap.insert( std::make_pair( "spleen",              "0xf96c3d") );
    s_ColorMap.insert( std::make_pair( "stomach",             "0xf96c3d") );
    s_ColorMap.insert( std::make_pair( "teeth",               "0xfffcd8") );
    s_ColorMap.insert( std::make_pair( "testicles",           "0xe38686") );
    s_ColorMap.insert( std::make_pair( "thyroid",             "0xfff694") );
    s_ColorMap.insert( std::make_pair( "tongue",              "0xe38686") );
    s_ColorMap.insert( std::make_pair( "tumor",               "0x937011") );
    s_ColorMap.insert( std::make_pair( "urethra",             "0xf8ff32") );
    s_ColorMap.insert( std::make_pair( "urinary bladder",     "0xf8ff32") );
    s_ColorMap.insert( std::make_pair( "uterus",              "0xe38686") );
    s_ColorMap.insert( std::make_pair( "vagina",              "0xe38686") );
    s_ColorMap.insert( std::make_pair( "vertebra",            "0xe38686") );
    s_ColorMap.insert( std::make_pair( "wrist",               "0xe38686") );
    initialized = true;
  }

  std::string lowercaseOrgan(organ);
  for(unsigned int i = 0; i < organ.length(); i++)
  {
    lowercaseOrgan[i] = tolower(lowercaseOrgan[i]);
  }

  std::map< std::string, std::string >::iterator iter = s_ColorMap.find( lowercaseOrgan );
  if ( iter != s_ColorMap.end() )
  {
    std::string hexColor = iter->second;
    std::string hexRed   = std::string("0x") + hexColor.substr( 2, 2 );
    std::string hexGreen = std::string("0x") + hexColor.substr( 4, 2 );
    std::string hexBlue  = std::string("0x") + hexColor.substr( 6, 2 );

    long int red   = strtol( hexRed.c_str(), NULL, 16 );
    long int green = strtol( hexGreen.c_str(), NULL, 16 );
    long int blue  = strtol( hexBlue.c_str(), NULL, 16 );

    return ColorProperty::New( (float)red/ 255.0, (float)green/ 255.0, (float)blue/ 255.0 );
  }
  else
  {
    // a default color (green)
    return ColorProperty::New( 0.0, 1.0, 0.0 );
  }

}
bool mitk::DataNodeFactory::FileNameEndsWith ( const std::string &  name ) [protected, virtual]

Checks if the file name m_FileName ends with the given name. Currently, this check is done by a dumb search for name in the filename.

Parameters:
namethe extension of the file
Returns:
true, if the filename contains name.

Definition at line 191 of file mitkDataNodeFactory.cpp.

{
  if (m_FileName.size() < name.size()) return false;
  
  return m_FileName.substr(m_FileName.size() - name.size()) == name;
}
bool mitk::DataNodeFactory::FilePatternEndsWith ( const std::string &  name ) [protected, virtual]

Checks if the file pattern m_FilePattern ends with the given name. Currently, this check is done by a dumb search for name in the filename.

Parameters:
namethe extension of the file
Returns:
true, if the filepattern contains name.

Definition at line 198 of file mitkDataNodeFactory.cpp.

{
  return m_FilePattern.find( name ) != std::string::npos;
}
void mitk::DataNodeFactory::GenerateData (  ) [protected, virtual]

Determines of which file type a given file is and calls the appropriate reader function.

Definition at line 110 of file mitkDataNodeFactory.cpp.

References int(), mitk::DicomSeriesReader::IsDicom(), mitk::BaseDataIO::LoadBaseDataFromFile(), MITK_ERROR, and mitk::DataNode::New().

{
  // IF filename is something.pic, and something.pic does not exist, try to read something.pic.gz
  // if there are both, something.pic and something.pic.gz, only the requested file is read
  // not only for images, but for all formats
  std::ifstream exists(m_FileName.c_str());
  if (!exists)
  {
    std::string testfilename = m_FileName + ".gz";

    std::ifstream exists(testfilename.c_str());
    if (exists.good()) 
    {
      m_FileName += ".gz";
    }
    else
    {
      testfilename = m_FileName + ".GZ";
      std::ifstream exists(testfilename.c_str());
      if (exists.good()) 
      {
        m_FileName += ".GZ";
      }
      else
      {
        std::string message("File does not exist, or cannot be read. Filename = ");
        message += m_FileName;
        MITK_ERROR << message;
        itkExceptionMacro( << message );
      }
    }
  }

  // part for DICOM
//  const char *numbers = "0123456789.";
//  std::string::size_type first_non_number;
//  first_non_number = itksys::SystemTools::GetFilenameName(m_FileName).find_first_not_of ( numbers );

  if (DicomSeriesReader::IsDicom(this->m_FileName) /*|| first_non_number == std::string::npos*/)
  {
    this->ReadFileSeriesTypeDCM();
  }
  else
  {
    bool usedNewDTNF = false;

    // the mitkBaseDataIO class returns a pointer of a vector of BaseData objects
    std::vector<mitk::BaseData::Pointer> baseDataVector = mitk::BaseDataIO::LoadBaseDataFromFile( m_FileName, m_FilePrefix, m_FilePattern, m_Serie );

    if( !baseDataVector.empty() )
      this->ResizeOutputs((unsigned int)baseDataVector.size());

    for(int i=0; i<(int)baseDataVector.size(); i++)
    {
      mitk::BaseData::Pointer baseData = baseDataVector.at(i);

      if( baseData.IsNotNull() )
      {
        usedNewDTNF = true;
        mitk::DataNode::Pointer node = mitk::DataNode::New();
        node->SetData(baseData);
        this->SetDefaultCommonProperties( node );

        this->SetOutput(i, node);
      }
    }
    if(!usedNewDTNF && !( m_FileName != "" ) && !(m_Serie == false))
        ReadFileSeriesTypeITKImageSeriesReader();
  }
}
std::string mitk::DataNodeFactory::GetBaseFileName (  ) [protected, virtual]
Returns:
the plain filename, that is, without any directory.

Definition at line 203 of file mitkDataNodeFactory.cpp.

{
  return itksys::SystemTools::GetFilenameName( m_FileName );
}
std::string mitk::DataNodeFactory::GetBaseFilePrefix (  ) [protected, virtual]
Returns:
the plain file prefix, that is, without any directory.

Definition at line 208 of file mitkDataNodeFactory.cpp.

{
  return itksys::SystemTools::GetFilenameName( m_FilePrefix );
}
std::string mitk::DataNodeFactory::GetDirectory (  ) [protected, virtual]
Returns:
the directory of the file name m_FileName.

Definition at line 213 of file mitkDataNodeFactory.cpp.

{
  if ( m_FileName != "" )
    return itksys::SystemTools::GetFilenamePath( m_FileName );
  else if ( m_FilePrefix != "" )
    return itksys::SystemTools::GetFilenamePath( m_FilePrefix );
  else
    return std::string( "" );
}
virtual const char* mitk::DataNodeFactory::GetFileName (  ) const [virtual]
Returns:
the name of the file to be read from disk.

Implements mitk::FileReader.

virtual const char* mitk::DataNodeFactory::GetFilePattern (  ) const [virtual]

Get pattern for multiple load.

Implements mitk::FileReader.

virtual const char* mitk::DataNodeFactory::GetFilePrefix (  ) const [virtual]

Get prefix for multiple load.

Implements mitk::FileReader.

virtual bool mitk::DataNodeFactory::GetUseSeriesDetails (  ) [virtual]
mitk::DataNodeFactory::mitkClassMacro ( DataNodeFactory  ,
DataNodeSource   
)
static Pointer mitk::DataNodeFactory::New (  ) [static]
void mitk::DataNodeFactory::ReadFileSeriesTypeDCM (  ) [protected, virtual]

Definition at line 223 of file mitkDataNodeFactory.cpp.

References mitk::ProgressBar::AddStepsToDo(), mitk::ProgressBar::GetInstance(), mitk::DicomSeriesReader::GetSeries(), mitk::DicomSeriesReader::LoadDicomSeries(), MITK_ERROR, MITK_INFO, and mitk::ProgressBar::Progress().

{
  MITK_INFO << "loading image series with prefix " << m_FilePrefix << " and pattern " << m_FilePattern << " as DICOM..." << std::endl;
  const char* previousCLocale = setlocale(LC_NUMERIC, NULL);
  setlocale(LC_NUMERIC, "C");
  std::locale previousCppLocale( std::cin.getloc() );
  std::locale l( "C" );
  std::cin.imbue(l);

  DicomSeriesReader::UidFileNamesMap names_map = DicomSeriesReader::GetSeries(this->GetDirectory(), this->m_UseSeriesDetails, this->m_SeriesRestrictions);
  const unsigned int size = names_map.size();

  this->ResizeOutputs(size);
  ProgressBar::GetInstance()->AddStepsToDo(size);
  ProgressBar::GetInstance()->Progress();

  unsigned int i = 0u;
  const DicomSeriesReader::UidFileNamesMap::const_iterator n_end = names_map.end();

  for (DicomSeriesReader::UidFileNamesMap::const_iterator n_it = names_map.begin(); n_it != n_end; ++n_it)
  {
    const std::string &uid = n_it->first;
    DataNode::Pointer node = this->GetOutput(i);

    MITK_INFO << "Reading series #" << i << ": " << uid << std::endl;

    if (DicomSeriesReader::LoadDicomSeries(n_it->second, *node))
    {
      ++i;
      node->SetName(uid);
    }
    else
    {
      MITK_ERROR << "skipping series #" << i << " due to exception" << std::endl;
    }

    ProgressBar::GetInstance()->Progress();
  }

  setlocale(LC_NUMERIC, previousCLocale);
  std::cin.imbue(previousCppLocale);
}
void mitk::DataNodeFactory::ReadFileSeriesTypeITKImageSeriesReader (  ) [protected, virtual]

Definition at line 268 of file mitkDataNodeFactory.cpp.

References mitk::StringProperty::New(), and mitk::Image::New().

{
  typedef itk::Image<int, 3> ImageType;
  typedef itk::ImageSeriesReader< ImageType > ReaderType;
  typedef itk::NumericSeriesFileNames NameGenerator;

  if ( ! this->GenerateFileList() )
  {
    itkWarningMacro( "Sorry, file list could not be generated!" );
    return ;
  }
  if ( m_MatchedFileNames.size() == 0 )
  {
    itkWarningMacro( "Sorry, no files matched the given filename ("<< m_FileName <<")!" );
    return ;
  }

  //
  // Finally, initialize the ITK-reader and load the files!
  //
  ReaderType::Pointer reader = ReaderType::New();
  reader->SetFileNames( m_MatchedFileNames );
  try
  {
    reader->Update();
    ResizeOutputs( reader->GetNumberOfOutputs() );
    for ( unsigned int i = 0; i < reader->GetNumberOfOutputs(); ++i )
    {
      //Initialize mitk image from itk
      mitk::Image::Pointer image = mitk::Image::New();
      image->InitializeByItk( reader->GetOutput( i ) );
      image->SetVolume( reader->GetOutput( i )->GetBufferPointer() );

      //add the mitk image to the node
      mitk::DataNode::Pointer node = this->GetOutput( i );
      node->SetData( image );

      mitk::StringProperty::Pointer nameProp = mitk::StringProperty::New( m_FileName );
      node->SetProperty( "name", nameProp );
    }
  }
  catch ( const std::exception & e )
  {
    itkWarningMacro( << e.what() );
    return ;
  }
}
void mitk::DataNodeFactory::ResizeOutputs ( const unsigned int &  num ) [protected, virtual]

Resizes the number of outputs of the factory. The outputs are initialized by empty DataNodes

Parameters:
numthe new number of outputs

Definition at line 181 of file mitkDataNodeFactory.cpp.

{
  unsigned int prevNum = this->GetNumberOfOutputs();
  this->SetNumberOfOutputs( num );
  for ( unsigned int i = prevNum; i < num; ++i )
  {
    this->SetNthOutput( i, this->MakeOutput( i ).GetPointer() );
  }
}
void mitk::DataNodeFactory::SetDefaultCommonProperties ( mitk::DataNode::Pointer node )

Definition at line 409 of file mitkDataNodeFactory.cpp.

References mitk::StringProperty::New(), and mitk::StringProperty::PATH.

{
  // path
  mitk::StringProperty::Pointer pathProp = mitk::StringProperty::New( itksys::SystemTools::GetFilenamePath( m_FileName ) );
  node->SetProperty( StringProperty::PATH, pathProp );


  // name already defined?
  mitk::StringProperty::Pointer nameProp = dynamic_cast<mitk::StringProperty*>(node->GetProperty("name"));
  if(nameProp.IsNull() || (strcmp(nameProp->GetValue(),"No Name!")==0))
  {
    // name already defined in BaseData
    mitk::StringProperty::Pointer baseDataNameProp = dynamic_cast<mitk::StringProperty*>(node->GetData()->GetProperty("name").GetPointer() );
    if(baseDataNameProp.IsNull() || (strcmp(baseDataNameProp->GetValue(),"No Name!")==0))
    {
      // name neither defined in node, nor in BaseData -> name = filename
      if (FileNameEndsWith( ".gz" ))
        m_FileName = m_FileName.substr( 0, m_FileName.length()-3 );

      nameProp = mitk::StringProperty::New( itksys::SystemTools::GetFilenameWithoutLastExtension( m_FileName ) );

      node->SetProperty( "name", nameProp );
    }
    else
    {
      // name defined in BaseData!
      nameProp = mitk::StringProperty::New( baseDataNameProp->GetValue() );
      node->SetProperty( "name", nameProp );
    }
  }
  
  // visibility
  if(!node->GetProperty("visible"))
    node->SetVisibility(true);
}
virtual void mitk::DataNodeFactory::SetFileName ( const char *  _arg ) [virtual]

Sets the filename of the file to read.

Parameters:
FileNamethe name of the file to read.

Implements mitk::FileReader.

virtual void mitk::DataNodeFactory::SetFilePattern ( const char *  _arg ) [virtual]

Set pattern for multiple load.

Implements mitk::FileReader.

virtual void mitk::DataNodeFactory::SetFilePrefix ( const char *  _arg ) [virtual]

Set prefix for multiple load.

Implements mitk::FileReader.

void mitk::DataNodeFactory::SetImageSerie ( bool  serie )

if true -> loaded image is part of a serie

Definition at line 105 of file mitkDataNodeFactory.cpp.

{
  m_Serie = serie;
}
virtual void mitk::DataNodeFactory::SetUseSeriesDetails ( bool  _arg ) [virtual]

Member Data Documentation

Definition at line 159 of file mitkDataNodeFactory.h.

Referenced by DataNodeFactory().

Definition at line 94 of file mitkDataNodeFactory.h.

Referenced by DataNodeFactory().

std::vector<std::string> mitk::DataNodeFactory::m_SeriesRestrictions [protected]

Definition at line 158 of file mitkDataNodeFactory.h.

Definition at line 80 of file mitkDataNodeFactory.h.

Referenced by mitk::ImageMapperGL2D::SetDefaultProperties().

Definition at line 157 of file mitkDataNodeFactory.h.


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines