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

mitk::ParRecFileReader Class Reference
[IO Classes]

Reader to read files in Philips PAR/REC file format. More...

#include <mitkParRecFileReader.h>

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

List of all members.

Public Types

typedef ParRecFileReader Self
typedef FileReader Superclass
typedef itk::SmartPointer< SelfPointer
typedef itk::SmartPointer
< const Self
ConstPointer

Public Member Functions

virtual const char * GetClassName () const
virtual void SetFileName (const char *_arg)
 Specify the file to load.
virtual const char * GetFileName () const
 Get the specified the file to load.
virtual void SetFilePrefix (const char *_arg)
 Specify file prefix for the file(s) to load.
virtual const char * GetFilePrefix () const
 Get the specified file prefix for the file(s) to load.
virtual void SetFilePattern (const char *_arg)
 Specified file pattern for the file(s) to load. The sprintf format used to build filename from FilePrefix and number.
virtual const char * GetFilePattern () const
 Get the specified file pattern for the file(s) to load. The sprintf format used to build filename from FilePrefix and number.

Static Public Member Functions

static Pointer New ()
static bool CanReadFile (const std::string filename, const std::string filePrefix, const std::string filePattern)

Protected Member Functions

virtual void GenerateData ()
 A version of GenerateData() specific for image processing filters.
virtual void GenerateOutputInformation ()
 ParRecFileReader ()
 ~ParRecFileReader ()

Protected Attributes

itk::TimeStamp m_ReadHeaderTime
int m_StartFileIndex
std::string m_FileName
std::string m_RecFileName
std::string m_FilePrefix
std::string m_FilePattern

Detailed Description

Reader to read files in Philips PAR/REC file format.

Definition at line 31 of file mitkParRecFileReader.h.


Member Typedef Documentation

typedef itk::SmartPointer<const Self> mitk::ParRecFileReader::ConstPointer

Definition at line 34 of file mitkParRecFileReader.h.

typedef itk::SmartPointer<Self> mitk::ParRecFileReader::Pointer

Definition at line 34 of file mitkParRecFileReader.h.

Definition at line 34 of file mitkParRecFileReader.h.

Definition at line 34 of file mitkParRecFileReader.h.


Constructor & Destructor Documentation

mitk::ParRecFileReader::ParRecFileReader (  ) [protected]

Definition at line 274 of file mitkParRecFileReader.cpp.

mitk::ParRecFileReader::~ParRecFileReader (  ) [protected]

Definition at line 279 of file mitkParRecFileReader.cpp.

{
}

Member Function Documentation

bool mitk::ParRecFileReader::CanReadFile ( const std::string  filename,
const std::string  filePrefix,
const std::string  filePattern 
) [static]

Definition at line 241 of file mitkParRecFileReader.cpp.

{
  // First check the extension
  if(  filename == "" )
    {
      //MITK_INFO<<"No filename specified."<<std::endl;
    return false;
    }

  bool extensionFound = false;
  std::string::size_type PARPos = filename.rfind(".par");
  if ((PARPos != std::string::npos)
      && (PARPos == filename.length() - 4))
    {
    extensionFound = true;
    }

  PARPos = filename.rfind(".PAR");
  if ((PARPos != std::string::npos)
      && (PARPos == filename.length() - 4))
    {
    extensionFound = true;
    }

  if( !extensionFound )
    {
      //MITK_INFO<<"The filename extension is not recognized."<<std::endl;
    return false;
    }

  return true;
}
void mitk::ParRecFileReader::GenerateData (  ) [protected, virtual]

A version of GenerateData() specific for image processing filters.

This implementation will split the processing across multiple threads. The buffer is allocated by this method. Then the BeforeThreadedGenerateData() method is called (if provided). Then, a series of threads are spawned each calling ThreadedGenerateData(). After all the threads have completed processing, the AfterThreadedGenerateData() method is called (if provided). If an image processing filter cannot be threaded, the filter should provide an implementation of GenerateData(). That implementation is responsible for allocating the output buffer. If a filter an be threaded, it should NOT provide a GenerateData() method but should provide a ThreadedGenerateData() instead.

See also:
ThreadedGenerateData()

Reimplemented from mitk::ImageSource.

Definition at line 176 of file mitkParRecFileReader.cpp.

References QuadProgPP::t().

{
  mitk::Image::Pointer output = this->GetOutput();
  
  // Check to see if we can read the file given the name or prefix
  //
  if ( m_RecFileName == "" )
  {
    throw itk::ImageFileReaderException(__FILE__, __LINE__, "FileName for rec-file empty");
  }
  
  if( m_RecFileName != "")
  {
    FILE *f = fopen(m_RecFileName.c_str(), "r");
    if(f==NULL)
    {
      throw itk::ImageFileReaderException(__FILE__, __LINE__, "Could not open rec-file.");
    }

    int zstart, zmax;
    int tstart, tmax;

    zstart=output->GetRequestedRegion().GetIndex(2);
    tstart=output->GetRequestedRegion().GetIndex(3);

    zmax=zstart+output->GetRequestedRegion().GetSize(2);
    tmax=tstart+output->GetRequestedRegion().GetSize(3);

    int sliceSize=output->GetDimension(0)*output->GetDimension(1)*output->GetPixelType().GetBpe()/8;    
    void *data = malloc(sliceSize);

    bool ignore4Dtopogram=false;
    {
      int slicePlusTimeSize=output->GetDimension(0)*output->GetDimension(1)*output->GetDimension(3)*output->GetPixelType().GetBpe()/8;
    if(output->GetDimension(3)>1)
      ignore4Dtopogram=true;

      int z,t;
      for(t=tstart;t<tmax;++t)
        for(z=zstart;z<zmax;++z)
        {
          if(ignore4Dtopogram)
            fseek(f,slicePlusTimeSize*z+(sliceSize+1)*t,SEEK_SET);
          else
            fseek(f,slicePlusTimeSize*z+sliceSize*t,SEEK_SET);
          size_t ignored = fread(data, sliceSize, 1, f);
          ++ignored;
          output->SetSlice(data,z,t,0);
        }
    }
    //else
    //{
    //  for(;z<zmax;++z)
    //  {
    //    fseek(f,sliceSize*z,SEEK_SET);          
    //    fread(data, sliceSize, 1, f);
    //    output->SetSlice(data,z,0,0);
    //  }
    //}
    free(data);

    fclose(f);
  }
}
void mitk::ParRecFileReader::GenerateOutputInformation ( void   ) [protected, virtual]

Definition at line 26 of file mitkParRecFileReader.cpp.

References mitk::ImageSource::GetOutput(), m_FileName, m_FilePrefix, m_ReadHeaderTime, and m_RecFileName.

{
  mitk::Image::Pointer output = this->GetOutput();
  
  if ((output->IsInitialized()) && (this->GetMTime() <= m_ReadHeaderTime.GetMTime()))
    return;
  
  itkDebugMacro(<<"Reading PAR file for GenerateOutputInformation()" << m_FileName);
  
  // Check to see if we can read the file given the name or prefix
  //
  if ( m_FileName == "" && m_FilePrefix == "" )
  {
    throw itk::ImageFileReaderException(__FILE__, __LINE__, "One of FileName or FilePrefix must be non-empty");
  }
  
  m_RecFileName = "";
  if( m_FileName != "")
  {
    int extPos=m_FileName.find_last_of(".");
    if(extPos>=-1)
    {
      const char *ext=m_FileName.c_str()+extPos+1;
      if(stricmp(ext,"par")==0)
        m_RecFileName = m_FileName.substr(0,extPos);
      else
        m_RecFileName = m_FileName;
    }
    else
        m_RecFileName = m_FileName;

    m_RecFileName.append(".rec");

    bool headerRead = false;

    mitk::PixelType type;
    unsigned int dimension=0;
    unsigned int dimensions[4]={0,0,1,1};
    float sliceThickness=0.0;
    float sliceGap=0.0;
    float sliceSpacing=0.0;
    mitk::Vector3D thickness; thickness.Fill(1.0);
    mitk::Vector3D gap; gap.Fill(0.0);
    mitk::Vector3D spacing;
    
    FILE *f;
    f=fopen(m_FileName.c_str(), "r");
    if(f!=NULL)
    {
      while(!feof(f))
      {
        char s[300], *p;
        char* ignored = fgets(s,200,f);
        ++ignored;
        if(strstr(s,"Max. number of cardiac phases"))
        {
          p=strchr(s,':')+1;
          dimensions[3]=atoi(p);
          if(dimensions[3]>1)
            dimension=4;
        }
        else
        if(strstr(s,"Max. number of slices/locations"))
        {
          p=strchr(s,':')+1;
          dimensions[2]=atoi(p);
          if(dimension==0)
          {
            if(dimensions[2]>1)
              dimension=3;
            else
              dimension=2;
          }
        }
        else
        if(strstr(s,"Image pixel size"))
        {
          p=strchr(s,':')+1;
          int bpe=atoi(p);
          if(bpe==8)
            type=typeid(mitkIpUInt1_t);
          else
            type=typeid(mitkIpUInt2_t);
        }
        else
        if(strstr(s,"Recon resolution"))
        {
          p=s+strcspn(s,"0123456789");
          sscanf(p,"%u %u", dimensions, dimensions+1);
        }
        else
        if(strstr(s,"FOV (ap,fh,rl) [mm]"))
        {
          p=s+strcspn(s,"0123456789");
          sscanf(p,"%f %f %f", &thickness[0], &thickness[1], &thickness[2]);
        }
        else
        if(strstr(s,"Slice thickness [mm]"))
        {
          p=s+strcspn(s,"0123456789");
          sscanf(p,"%f", &sliceThickness);
        }
        else
        if(strstr(s,"Slice gap [mm]"))
        {
          p=s+strcspn(s,"-0123456789");
          sscanf(p,"%f", &sliceGap);
        }
      }
      fclose(f);

//C:\home\ivo\data\coronaries\ucsf-wholeheart-2.par
      sliceSpacing = sliceThickness+sliceGap;
      if((dimension>0) && (dimensions[0]>0) && (dimensions[1]>0) && (sliceThickness>0) && (sliceSpacing>0))
      {
        headerRead = true;
        if(fabs(thickness[0]/dimensions[2]-sliceSpacing)<0.0001)
          thickness[0]=thickness[1];
        else
        if(fabs(thickness[1]/dimensions[2]-sliceSpacing)<0.0001)
          thickness[1]=thickness[0];
        thickness[2]=sliceSpacing;

        thickness[0]/=dimensions[0];
        thickness[1]/=dimensions[1];
        spacing=thickness+gap;
      }
    }
    
    if( headerRead == false)
    {
      itk::ImageFileReaderException e(__FILE__, __LINE__);
      itk::OStringStream msg;
      msg << " Could not read file "
        << m_FileName.c_str();
      e.SetDescription(msg.str().c_str());
      throw e;
      return;
    }
    
    output->Initialize(type, dimension, dimensions);
    output->GetSlicedGeometry()->SetSpacing(spacing);

    //output->GetSlicedGeometry()->SetGeometry2D(mitk::Image::BuildStandardPlaneGeometry2D(output->GetSlicedGeometry(), dimensions).GetPointer(), 0);
    output->GetSlicedGeometry()->SetEvenlySpaced();
  }
  
  m_ReadHeaderTime.Modified();
}
virtual const char* mitk::ParRecFileReader::GetClassName (  ) const [virtual]
virtual const char* mitk::ParRecFileReader::GetFileName (  ) const [virtual]

Get the specified the file to load.

Either the FileName or FilePrefix plus FilePattern are used to read.

Implements mitk::FileReader.

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

Get the specified file pattern for the file(s) to load. The sprintf format used to build filename from FilePrefix and number.

You should specify either a FileName or FilePrefix. Use FilePrefix if the data is stored in multiple files.

Implements mitk::FileReader.

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

Get the specified file prefix for the file(s) to load.

You should specify either a FileName or FilePrefix. Use FilePrefix if the data is stored in multiple files.

Implements mitk::FileReader.

static Pointer mitk::ParRecFileReader::New (  ) [static]

Method for creation through the object factory.

Reimplemented from mitk::ImageSource.

virtual void mitk::ParRecFileReader::SetFileName ( const char *  aFileName ) [virtual]

Specify the file to load.

Either the FileName or FilePrefix plus FilePattern are used to read.

Implements mitk::FileReader.

virtual void mitk::ParRecFileReader::SetFilePattern ( const char *  aFilePattern ) [virtual]

Specified file pattern for the file(s) to load. The sprintf format used to build filename from FilePrefix and number.

You should specify either a FileName or FilePrefix. Use FilePrefix if the data is stored in multiple files.

Implements mitk::FileReader.

virtual void mitk::ParRecFileReader::SetFilePrefix ( const char *  aFilePrefix ) [virtual]

Specify file prefix for the file(s) to load.

You should specify either a FileName or FilePrefix. Use FilePrefix if the data is stored in multiple files.

Implements mitk::FileReader.


Member Data Documentation

std::string mitk::ParRecFileReader::m_FileName [protected]

Definition at line 65 of file mitkParRecFileReader.h.

Referenced by GenerateOutputInformation().

std::string mitk::ParRecFileReader::m_FilePattern [protected]

Definition at line 70 of file mitkParRecFileReader.h.

std::string mitk::ParRecFileReader::m_FilePrefix [protected]

Definition at line 68 of file mitkParRecFileReader.h.

Referenced by GenerateOutputInformation().

itk::TimeStamp mitk::ParRecFileReader::m_ReadHeaderTime [protected]

Definition at line 61 of file mitkParRecFileReader.h.

Referenced by GenerateOutputInformation().

std::string mitk::ParRecFileReader::m_RecFileName [protected]

Definition at line 66 of file mitkParRecFileReader.h.

Referenced by GenerateOutputInformation().

Definition at line 63 of file mitkParRecFileReader.h.


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