33 #include <itksys/SystemTools.hxx>
83 "PAR_MaxNumberOfDiffusionValues";
86 "PAR_MaxNumberOfGradientOrients";
92 "PAR_NumberOfScanningSequences";
95 "PAR_ScanningSequenceImageTypeRescaleValues";
103 std::string fileExt(itksys::SystemTools::GetFilenameLastExtension(filename));
106 if(fileExt == std::string(
".gz"))
108 fileExt = itksys::SystemTools::GetFilenameLastExtension(
109 itksys::SystemTools::GetFilenameWithoutLastExtension(filename));
121 if(fileExt !=
".REC.gz"
124 && fileExt !=
".rec.gz"
126 && fileExt !=
".par")
141 if( fileExt.length() > 0
142 && filename.length() > fileExt.length() )
144 const std::string::size_type it = filename.find_last_of( fileExt );
145 std::string baseName( filename, 0, it-(fileExt.length()-1) );
156 std::string ImageFileName(filename);
159 if( (fileExt ==
".REC") || (fileExt ==
".REC.gz") )
162 ImageFileName +=
".PAR";
164 else if( (fileExt ==
".rec") || (fileExt ==
".rec.gz") )
167 ImageFileName +=
".par";
169 return( ImageFileName );
175 std::string ImageFileName(filename);
178 if(fileExt ==
".PAR")
181 ImageFileName +=
".REC";
183 else if(fileExt ==
".par")
186 ImageFileName +=
".rec";
188 return( ImageFileName );
195 int volumeIndex,
int slice,
int numSlices,
struct par_parameter parParam,
204 if( (sliceImageTypesIndex[index+i].second == imageType) &&
205 (sliceScanSequenceIndex[index+i].second == scanSequence) )
223 int actualSlices = parParam.
slice;
226 if(indexMatrix->size() !=
227 (PhilipsRECImageIO::SliceIndexType::size_type)parParam.
dim[2])
229 OStringStream message;
230 message <<
"indexMatrix->size(): "
231 << indexMatrix->size()
232 <<
" != parParam.dim[2]: "
241 OStringStream message;
242 message <<
"parParam.dim[2]: "
244 <<
" != (parParam.slice*parParam.image_blocks): "
251 if(imageTypesScanSequenceIndex.size() !=
254 OStringStream message;
255 message <<
"imageTypesScanSequenceIndex.size(): "
256 << imageTypesScanSequenceIndex.size()
257 <<
" != parParam.num_slice_repetitions "
271 for(
int i=0; i<parParam.
dim[2]; i++)
273 (*indexMatrix)[i] = i;
284 for(
int j=0; j<remainingVolumes; j++)
286 for(
int k=0; k<actualSlices; k++)
291 imageTypesScanSequenceIndex[i].first,
292 imageTypesScanSequenceIndex[i].second,j,k,actualSlices,parParam,
293 sliceImageTypesIndex,sliceScanSequenceIndex);
304 for(
int j=0; j<actualSlices; j++)
315 unsigned long numberOfPixels )
323 ((
char*)buffer, numberOfPixels );
327 ((
unsigned char*)buffer, numberOfPixels );
331 ((
short*)buffer, numberOfPixels );
335 ((
unsigned short*)buffer, numberOfPixels );
339 ((
int*)buffer, numberOfPixels );
343 ((
unsigned int*)buffer, numberOfPixels );
347 ((
long*)buffer, numberOfPixels );
351 ((
unsigned long*)buffer, numberOfPixels );
355 ((
float*)buffer, numberOfPixels );
359 ((
double*)buffer, numberOfPixels );
363 "Component Type Unknown",
374 ((
char *)buffer, numberOfPixels );
378 ((
unsigned char *)buffer, numberOfPixels );
382 ((
short *)buffer, numberOfPixels );
386 ((
unsigned short *)buffer, numberOfPixels );
390 ((
int *)buffer, numberOfPixels );
394 ((
unsigned int *)buffer, numberOfPixels );
398 ((
long *)buffer, numberOfPixels );
402 ((
unsigned long *)buffer, numberOfPixels );
406 ((
float *)buffer, numberOfPixels );
410 ((
double *)buffer, numberOfPixels );
414 "Component Type Unknown",
457 Math::CastWithRangeCheck< IndexValueType, size_t >( this->
m_SliceIndex->size() ) - 1;
459 if( (index < 0) || (index > maximumSliceNumber ) )
470 unsigned int numberOfPixels = 1;
471 for(dim=0; dim< dimensions; dim++ )
476 char *
const p =
static_cast<char *
>(buffer);
493 gzFile file_p = ::gzopen( ImageFileName.c_str(),
"rb" );
496 OStringStream message;
497 message <<
"Philips REC Data File can not be opened. "
498 <<
"The following files were attempted:" << std::endl
512 for(
IndexValueType slice=0; slice < numberOfPixelsInOneSlice; slice++)
517 OStringStream message;
518 message <<
"Philips REC Data File can not be read. "
519 <<
"The following files were attempted:" << std::endl
527 const z_off_t offset = Math::CastWithRangeCheck< z_off_t, SizeType >( realIndex * imageSliceSizeInBytes );
528 ::gzseek( file_p, offset, SEEK_SET );
529 ::gzread( file_p, p+(slice*imageSliceSizeInBytes),
530 Math::CastWithRangeCheck< unsigned int, SizeType >( imageSliceSizeInBytes) );
538 std::string filename(FileNameToRead);
542 if( filenameext != std::string(
".PAR")
543 && filenameext != std::string(
".REC")
544 && filenameext != std::string(
".REC.gz")
545 && filenameext != std::string(
".par")
546 && filenameext != std::string(
".rec")
547 && filenameext != std::string(
".rec.gz"))
562 philipsPAR->ReadPAR(HeaderFileName, &par);
590 philipsPAR->ReadPAR( HeaderFileName, &par);
599 "Problem reading PAR file",
609 if( !philipsPAR->GetDiffusionGradientOrientationAndBValues(HeaderFileName,
610 diffusionGradientOrientationVector, diffusionBvalueVector) )
613 "Problem reading diffusion gradients and b values from PAR file",
621 if( !philipsPAR->GetLabelTypesASL(HeaderFileName, labelTypesASLVector) )
624 "Problem reading ASL label types from PAR file",
631 scanningSequenceImageTypeRescaleVector =
633 scanningSequenceImageTypeRescaleVector->clear();
640 if( !philipsPAR->GetRECRescaleValues(HeaderFileName,imageTypeRescaleValuesVector,
644 "Problem reading recale values for each scanning sequence from PAR file",
648 (*scanningSequenceImageTypeRescaleVector)[scanIndex] =
649 imageTypeRescaleValuesVector;
656 philipsPAR->GetRECSliceIndexImageTypes(HeaderFileName);
658 philipsPAR->GetRECSliceIndexScanningSequence(HeaderFileName);
660 philipsPAR->GetImageTypesScanningSequence(HeaderFileName);
662 imageTypesScanSequencesIndexes,sliceImageTypesIndexes,
663 sliceScanSequencesIndexes);
669 unsigned int numberOfDimensions = 4;
691 OStringStream message;
692 message <<
"Unknown data type. par.bit must be 8 or 16. "
727 EncapsulateMetaData<std::string>(thisDic,
ITK_VoxelUnits,std::string(
"mm",4));
735 std::string(
typeid(
char).name()));
739 std::string(
typeid(
short).name()));
776 OrientAdapterType().ToDirectionCosines(coord_orient);
778 std::vector<double> dirx(numberOfDimensions,0),
779 diry(numberOfDimensions,0),dirz(numberOfDimensions,0),
780 dirBlock(numberOfDimensions,0);
781 dirBlock[numberOfDimensions-1] = 1;
797 #if defined(ITKIO_DEPRECATED_METADATA_ORIENTATION)
798 EncapsulateMetaData<SpatialOrientation::ValidCoordinateOrientationFlags>(
814 EncapsulateMetaData<std::string>(thisDic,
PAR_Version,std::string(
"V3",4));
817 EncapsulateMetaData<std::string>(thisDic,
PAR_Version,std::string(
"V4",4));
820 EncapsulateMetaData<std::string>(thisDic,
PAR_Version,
821 std::string(
"V4.1",6));
824 EncapsulateMetaData<std::string>(thisDic,
PAR_Version,
825 std::string(
"V4.2",6));
844 for(
unsigned int ttime_index=0; ttime_index<(
unsigned int)par.
cardiac_phases;
847 triggerTimes->SetElement(ttime_index,(
double)par.
trigger_times[ttime_index]);
850 EncapsulateMetaData<TriggerTimesContainerType::Pointer>(thisDic,
854 echoTimes->resize(par.
echoes);
856 for(
unsigned int echo_index=0; echo_index<(
unsigned int)par.
echoes;
859 echoTimes->SetElement(echo_index,(
double)par.
echo_times[echo_index]);
862 EncapsulateMetaData<EchoTimesContainerType::Pointer>(thisDic,
PAR_EchoTimes,
879 repTimes->resize(par.
mixes);
882 for(
unsigned int rep_index=0; rep_index<(
unsigned int)par.
mixes; rep_index++)
884 repTimes->SetElement(rep_index,(
double)par.
repetition_time[rep_index]);
887 EncapsulateMetaData<RepetitionTimesContainerType::Pointer>(thisDic,
894 tempAngulation[0] = (double)par.
angAP;
895 tempAngulation[1] = (
double)par.
angFH;
896 tempAngulation[2] = (double)par.
angRL;
900 tempOffcentre[0] = (double)par.
offAP;
901 tempOffcentre[1] = (
double)par.
offFH;
902 tempOffcentre[2] = (double)par.
offRL;
910 EncapsulateMetaData<PhaseEncodingVelocityType>(thisDic,
912 EncapsulateMetaData<int>(thisDic,
PAR_MTC,par.
mtc);
921 EncapsulateMetaData<GradientBvalueContainerType::Pointer>(thisDic,
925 EncapsulateMetaData<GradientDirectionContainerType::Pointer>(thisDic,
936 ScanningSequenceImageTypeRescaleValuesContainerTypePtr;
937 EncapsulateMetaData<ScanningSequenceImageTypeRescaleValuesContainerTypePtr>(
939 scanningSequenceImageTypeRescaleVector);
942 EncapsulateMetaData<LabelTypesASLContainerType::Pointer>(thisDic,