Reader to read files in Philips PAR/REC file format. More...
#include <mitkParRecFileReader.h>
Public Types | |
typedef ParRecFileReader | Self |
typedef FileReader | Superclass |
typedef itk::SmartPointer< Self > | Pointer |
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 |
Reader to read files in Philips PAR/REC file format.
Definition at line 31 of file mitkParRecFileReader.h.
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.
mitk::ParRecFileReader::ParRecFileReader | ( | ) | [protected] |
Definition at line 274 of file mitkParRecFileReader.cpp.
: m_FileName(""), m_FilePrefix(""), m_FilePattern("") { }
mitk::ParRecFileReader::~ParRecFileReader | ( | ) | [protected] |
Definition at line 279 of file mitkParRecFileReader.cpp.
{ }
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.
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.
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().
int mitk::ParRecFileReader::m_StartFileIndex [protected] |
Definition at line 63 of file mitkParRecFileReader.h.