X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmHeaderHelper.cxx;h=c6957de06f98114bf5b70d610feb55f90c76b7c2;hb=a18a9f20d96301e1c91be637415599e5fdc1ca43;hp=3b1547e6619dd997df2f35590c989d4f992680f0;hpb=0a6fbcbd58d5e186b183316d8d10d1f07ac0f6cb;p=gdcm.git diff --git a/src/gdcmHeaderHelper.cxx b/src/gdcmHeaderHelper.cxx index 3b1547e6..c6957de0 100644 --- a/src/gdcmHeaderHelper.cxx +++ b/src/gdcmHeaderHelper.cxx @@ -1,28 +1,17 @@ -// $Header: /cvs/public/gdcm/src/Attic/gdcmHeaderHelper.cxx,v 1.4 2003/09/17 17:46:35 malaterre Exp $ - -//This is needed when compiling in debug mode -#ifdef _MSC_VER -#pragma warning ( disable : 4800 ) -// 'identifier' : class 'type' needs to have dll-interface to be used by -// clients of class 'type2' -#pragma warning ( disable : 4251 ) -// 'identifier' : identifier was truncated to 'number' characters in the -// debug information -#pragma warning ( disable : 4786 ) -#endif //_MSC_VER +// $Header: /cvs/public/gdcm/src/Attic/gdcmHeaderHelper.cxx,v 1.11 2003/10/03 15:27:44 malaterre Exp $ #include "gdcmHeaderHelper.h" + #include "gdcmUtil.h" //for debug #include #include #include //for bzero -using namespace std; //directory manipulation (os indep). //cygwin ???? -> _WIN32 ?? #ifdef _MSC_VER #include -int GetDir(string dPath, list &filenames) +int GetDir(std::string dPath, std::list &filenames) { //For now dPath should have an ending "\" WIN32_FIND_DATA FileData; @@ -47,7 +36,7 @@ int GetDir(string dPath, list &filenames) #else #include -int GetDir(string dPath, list &filenames) +int GetDir(std::string dPath, std::list &filenames) { DIR *dir = opendir( dPath.c_str() ); struct dirent *entry; @@ -90,7 +79,7 @@ gdcmHeaderHelper::gdcmHeaderHelper(const char *InFilename, * */ int gdcmHeaderHelper::GetPixelSize() { - string PixelType = GetPixelType(); + std::string PixelType = GetPixelType(); if (PixelType == "8U" || PixelType == "8S") return 1; if (PixelType == "16U" || PixelType == "16S") @@ -100,6 +89,28 @@ int gdcmHeaderHelper::GetPixelSize() { dbg.Verbose(0, "gdcmHeader::GetPixelSize: Unknown pixel type"); return 0; } + +//---------------------------------------------------------------------------- +/** + * \ingroup gdcmHeaderHelper + * \brief gets the info from 0028,0004 : Photometric Interp + * \ else 1. + * @return 1 if Gray level, 3 if Color + */ +int gdcmHeaderHelper::GetNumberOfScalarComponents() { + std::string PhotometricInterpretation = + gdcmHeader::GetPubElValByNumber(0x0028,0x0004); + + +// The compiler will optimze, if it feels like ! + + //beware of trailing space at end of string + if (PhotometricInterpretation.find(GDCM_UNFOUND) < PhotometricInterpretation.length() || + PhotometricInterpretation.find("MONOCHROME1") < PhotometricInterpretation.length() || + PhotometricInterpretation.find("MONOCHROME2") < PhotometricInterpretation.length() ) return 1; + + return 3; +} //---------------------------------------------------------------------------- /** * \ingroup gdcmHeaderHelper @@ -114,26 +125,26 @@ int gdcmHeaderHelper::GetPixelSize() { * \warning 12 bit images appear as 16 bit. * @return */ -string gdcmHeaderHelper::GetPixelType() { - string BitsAlloc; +std::string gdcmHeaderHelper::GetPixelType() { + std::string BitsAlloc; BitsAlloc = GetElValByName("Bits Allocated"); - if (BitsAlloc == "gdcm::Unfound") { + if (BitsAlloc == GDCM_UNFOUND) { dbg.Verbose(0, "gdcmHeader::GetPixelType: unfound Bits Allocated"); - BitsAlloc = string("16"); + BitsAlloc = std::string("16"); } if (BitsAlloc == "12") - BitsAlloc = string("16"); + BitsAlloc = std::string("16"); - string Signed; + std::string Signed; Signed = GetElValByName("Pixel Representation"); - if (Signed == "gdcm::Unfound") { + if (Signed == GDCM_UNFOUND) { dbg.Verbose(0, "gdcmHeader::GetPixelType: unfound Pixel Representation"); - BitsAlloc = string("0"); + BitsAlloc = std::string("0"); } if (Signed == "0") - Signed = string("U"); + Signed = std::string("U"); else - Signed = string("S"); + Signed = std::string("S"); return( BitsAlloc + Signed); } @@ -146,9 +157,9 @@ string gdcmHeaderHelper::GetPixelType() { */ float gdcmHeaderHelper::GetXSpacing() { float xspacing, yspacing; - string StrSpacing = GetPubElValByNumber(0x0028,0x0030); + std::string StrSpacing = GetPubElValByNumber(0x0028,0x0030); - if (StrSpacing == "gdcm::Unfound") { + if (StrSpacing == GDCM_UNFOUND) { dbg.Verbose(0, "gdcmHeader::GetXSpacing: unfound Pixel Spacing (0028,0030)"); return 1.; } @@ -166,9 +177,9 @@ float gdcmHeaderHelper::GetXSpacing() { */ float gdcmHeaderHelper::GetYSpacing() { float xspacing, yspacing; - string StrSpacing = GetPubElValByNumber(0x0028,0x0030); + std::string StrSpacing = GetPubElValByNumber(0x0028,0x0030); - if (StrSpacing == "gdcm::Unfound") { + if (StrSpacing == GDCM_UNFOUND) { dbg.Verbose(0, "gdcmHeader::GetYSpacing: unfound Pixel Spacing (0028,0030)"); return 1.; } @@ -202,12 +213,12 @@ float gdcmHeaderHelper::GetZSpacing() { // Si le Spacing Between Slices est absent, // on suppose que les coupes sont jointives - string StrSpacingBSlices = GetPubElValByNumber(0x0018,0x0088); + std::string StrSpacingBSlices = GetPubElValByNumber(0x0018,0x0088); - if (StrSpacingBSlices == "gdcm::Unfound") { + if (StrSpacingBSlices == GDCM_UNFOUND) { dbg.Verbose(0, "gdcmHeader::GetZSpacing: unfound StrSpacingBSlices"); - string StrSliceThickness = GetPubElValByNumber(0x0018,0x0050); - if (StrSliceThickness == "gdcm::Unfound") + std::string StrSliceThickness = GetPubElValByNumber(0x0018,0x0050); + if (StrSliceThickness == GDCM_UNFOUND) return 1.; else // if no 'Spacing Between Slices' is found, @@ -241,12 +252,12 @@ float gdcmHeaderHelper::GetZSpacing() { */ float gdcmHeaderHelper::GetXOrigin() { float xImPos, yImPos, zImPos; - string StrImPos = GetPubElValByNumber(0x0020,0x0032); + std::string StrImPos = GetPubElValByNumber(0x0020,0x0032); - if (StrImPos == "gdcm::Unfound") { + if (StrImPos == GDCM_UNFOUND) { dbg.Verbose(0, "gdcmHeader::GetXImagePosition: unfound Image Position Patient (0020,0032)"); StrImPos = GetPubElValByNumber(0x0020,0x0030); // For ACR-NEMA images - if (StrImPos == "gdcm::Unfound") { + if (StrImPos == GDCM_UNFOUND) { dbg.Verbose(0, "gdcmHeader::GetXImagePosition: unfound Image Position (RET) (0020,0030)"); // How to tell the caller nothing was found ? return 0.; @@ -266,12 +277,12 @@ float gdcmHeaderHelper::GetXOrigin() { */ float gdcmHeaderHelper::GetYOrigin() { float xImPos, yImPos, zImPos; - string StrImPos = GetPubElValByNumber(0x0020,0x0032); + std::string StrImPos = GetPubElValByNumber(0x0020,0x0032); - if (StrImPos == "gdcm::Unfound") { + if (StrImPos == GDCM_UNFOUND) { dbg.Verbose(0, "gdcmHeader::GetYImagePosition: unfound Image Position Patient (0020,0032)"); StrImPos = GetPubElValByNumber(0x0020,0x0030); // For ACR-NEMA images - if (StrImPos == "gdcm::Unfound") { + if (StrImPos == GDCM_UNFOUND) { dbg.Verbose(0, "gdcmHeader::GetYImagePosition: unfound Image Position (RET) (0020,0030)"); // How to tell the caller nothing was found ? return 0.; @@ -293,8 +304,8 @@ float gdcmHeaderHelper::GetYOrigin() { */ float gdcmHeaderHelper::GetZOrigin() { float xImPos, yImPos, zImPos; - string StrImPos = GetPubElValByNumber(0x0020,0x0032); - if (StrImPos != "gdcm::Unfound") { + std::string StrImPos = GetPubElValByNumber(0x0020,0x0032); + if (StrImPos != GDCM_UNFOUND) { if( sscanf( StrImPos.c_str(), "%f\\%f\\%f", &xImPos, &yImPos, &zImPos) != 3) { dbg.Verbose(0, "gdcmHeader::GetZImagePosition: wrong Image Position Patient (0020,0032)"); return 0.; // bug in the element 0x0020,0x0032 @@ -303,7 +314,7 @@ float gdcmHeaderHelper::GetZOrigin() { } } StrImPos = GetPubElValByNumber(0x0020,0x0030); // For ACR-NEMA images - if (StrImPos != "gdcm::Unfound") { + if (StrImPos != GDCM_UNFOUND) { if( sscanf( StrImPos.c_str(), "%f\\%f\\%f", &xImPos, &yImPos, &zImPos) != 3) { dbg.Verbose(0, "gdcmHeader::GetZImagePosition: wrong Image Position (RET) (0020,0030)"); return 0.; // bug in the element 0x0020,0x0032 @@ -311,8 +322,8 @@ float gdcmHeaderHelper::GetZOrigin() { return zImPos; } } - string StrSliceLocation = GetPubElValByNumber(0x0020,0x1041);// for *very* old ACR-NEMA images - if (StrSliceLocation != "gdcm::Unfound") { + std::string StrSliceLocation = GetPubElValByNumber(0x0020,0x1041);// for *very* old ACR-NEMA images + if (StrSliceLocation != GDCM_UNFOUND) { if( sscanf( StrSliceLocation.c_str(), "%f", &zImPos) !=1) { dbg.Verbose(0, "gdcmHeader::GetZImagePosition: wrong Slice Location (0020,1041)"); return 0.; // bug in the element 0x0020,0x1041 @@ -321,8 +332,8 @@ float gdcmHeaderHelper::GetZOrigin() { } } dbg.Verbose(0, "gdcmHeader::GetZImagePosition: unfound Slice Location (0020,1041)"); - string StrLocation = GetPubElValByNumber(0x0020,0x0050); - if (StrLocation != "gdcm::Unfound") { + std::string StrLocation = GetPubElValByNumber(0x0020,0x0050); + if (StrLocation != GDCM_UNFOUND) { if( sscanf( StrLocation.c_str(), "%f", &zImPos) !=1) { dbg.Verbose(0, "gdcmHeader::GetZImagePosition: wrong Location (0020,0050)"); return 0.; // bug in the element 0x0020,0x0050 @@ -346,8 +357,8 @@ int gdcmHeaderHelper::GetImageNumber() { //binary conversion rules. This may be preferable to sscanf() since atoi() is a much smaller, // simpler and faster function. sscanf() can do all possible conversions whereas atoi() can //only do single decimal integer conversions. - string StrImNumber = GetPubElValByNumber(0x0020,0x0013); //0020 0013 IS REL Image Number - if (StrImNumber != "gdcm::Unfound") { + std::string StrImNumber = GetPubElValByNumber(0x0020,0x0013); //0020 0013 IS REL Image Number + if (StrImNumber != GDCM_UNFOUND) { return atoi( StrImNumber.c_str() ); } return 0; //Hopeless @@ -359,8 +370,8 @@ int gdcmHeaderHelper::GetImageNumber() { * @return ModalityType */ ModalityType gdcmHeaderHelper::GetModality(void) { - string StrModality = GetPubElValByNumber(0x0008,0x0060); //0008 0060 CS ID Modality - if (StrModality != "gdcm::Unfound") { + std::string StrModality = GetPubElValByNumber(0x0008,0x0060); //0008 0060 CS ID Modality + if (StrModality != GDCM_UNFOUND) { if ( StrModality.find("AU") < StrModality.length()) return AU; else if ( StrModality.find("AS") < StrModality.length()) return AS; else if ( StrModality.find("BI") < StrModality.length()) return BI; @@ -390,10 +401,10 @@ ModalityType gdcmHeaderHelper::GetModality(void) { else if ( StrModality.find("PT") < StrModality.length()) return PT; else if ( StrModality.find("RF") < StrModality.length()) return RF; else if ( StrModality.find("RG") < StrModality.length()) return RG; - else if ( StrModality.find("RTDOSE") < StrModality.length()) return RTDOSE; - else if ( StrModality.find("RTIMAGE") < StrModality.length()) return RTIMAGE; - else if ( StrModality.find("RTPLAN") < StrModality.length()) return RTPLAN; - else if ( StrModality.find("RTSTRUCT") < StrModality.length()) return RTSTRUCT; + else if ( StrModality.find("RTDOSE") < StrModality.length()) return RTDOSE; + else if ( StrModality.find("RTIMAGE") < StrModality.length()) return RTIMAGE; + else if ( StrModality.find("RTPLAN") < StrModality.length()) return RTPLAN; + else if ( StrModality.find("RTSTRUCT")< StrModality.length()) return RTSTRUCT; else if ( StrModality.find("SM") < StrModality.length()) return SM; else if ( StrModality.find("ST") < StrModality.length()) return ST; else if ( StrModality.find("TG") < StrModality.length()) return TG; @@ -413,24 +424,24 @@ ModalityType gdcmHeaderHelper::GetModality(void) { } //---------------------------------------------------------------------------- -string gdcmHeaderHelper::GetStudyUID() +std::string gdcmHeaderHelper::GetStudyUID() { - return GetPubElValByNumber(0x0020,0x000d); //!0020 000d UI REL Study Instance UID + return GetPubElValByNumber(0x0020,0x000d); //0020 000d UI REL Study Instance UID } //---------------------------------------------------------------------------- -string gdcmHeaderHelper::GetSeriesUID() +std::string gdcmHeaderHelper::GetSeriesUID() { - return GetPubElValByNumber(0x0020,0x000e); //!0020 000e UI REL Series Instance UID + return GetPubElValByNumber(0x0020,0x000e); //0020 000e UI REL Series Instance UID } //---------------------------------------------------------------------------- -string gdcmHeaderHelper::GetClassUID() +std::string gdcmHeaderHelper::GetClassUID() { - return GetPubElValByNumber(0x0008,0x0016); //!0008 0016 UI ID SOP Class UID + return GetPubElValByNumber(0x0008,0x0016); //0008 0016 UI ID SOP Class UID } //---------------------------------------------------------------------------- -string gdcmHeaderHelper::GetInstanceUID() +std::string gdcmHeaderHelper::GetInstanceUID() { - return GetPubElValByNumber(0x0008,0x0018); //!0008 0018 UI ID SOP Instance UID + return GetPubElValByNumber(0x0008,0x0018); //0008 0018 UI ID SOP Instance UID } @@ -444,7 +455,7 @@ string gdcmHeaderHelper::GetInstanceUID() gdcmSerieHeaderHelper::~gdcmSerieHeaderHelper() { //! \todo - for (list::iterator it = CoherentGdcmFileList.begin(); + for (std::list::iterator it = CoherentGdcmFileList.begin(); it != CoherentGdcmFileList.end(); it++) { delete *it; @@ -462,8 +473,8 @@ void gdcmHeaderHelper::GetImageOrientationPatient( float* iop ) { //iop is supposed to be float[6] iop[0] = iop[1] = iop[2] = iop[3] = iop[4] = iop[5] = 0; - string StrImOriPat = GetPubElValByNumber(0x0020,0x0037); // 0020 0037 DS REL Image Orientation (Patient) - if (StrImOriPat != "gdcm::Unfound") { + std::string StrImOriPat = GetPubElValByNumber(0x0020,0x0037); // 0020 0037 DS REL Image Orientation (Patient) + if (StrImOriPat != GDCM_UNFOUND) { if( sscanf( StrImOriPat.c_str(), "%f\\%f\\%f\\%f\\%f\\%f", &iop[0], &iop[1], &iop[2], &iop[3], &iop[4], &iop[5]) != 6) { dbg.Verbose(0, "gdcmHeader::GetImageOrientationPatient: wrong Image Orientation Patient (0020,0037)"); @@ -475,7 +486,7 @@ void gdcmHeaderHelper::GetImageOrientationPatient( float* iop ) { //For ACR-NEMA StrImOriPat = GetPubElValByNumber(0x0020,0x0035); //0020 0035 DS REL Image Orientation (RET) - if (StrImOriPat != "gdcm::Unfound") { + if (StrImOriPat != GDCM_UNFOUND) { if( sscanf( StrImOriPat.c_str(), "%f\\%f\\%f\\%f\\%f\\%f", &iop[0], &iop[1], &iop[2], &iop[3], &iop[4], &iop[5]) != 6) { dbg.Verbose(0, "gdcmHeader::GetImageOrientationPatient: wrong Image Orientation Patient (0020,0035)"); @@ -491,7 +502,7 @@ void gdcmHeaderHelper::GetImageOrientationPatient( float* iop ) { * \ingroup gdcmHeaderHelper * \brief add a gdcmFile to the list based on file name */ -void gdcmSerieHeaderHelper::AddFileName(string filename) +void gdcmSerieHeaderHelper::AddFileName(std::string filename) { gdcmHeaderHelper *GdcmFile = new gdcmHeaderHelper( filename.c_str() ); this->CoherentGdcmFileList.push_back( GdcmFile ); @@ -510,12 +521,12 @@ void gdcmSerieHeaderHelper::AddGdcmFile(gdcmHeaderHelper *file) * \ingroup gdcmHeaderHelper * \brief \todo */ -void gdcmSerieHeaderHelper::SetDirectory(string dir) +void gdcmSerieHeaderHelper::SetDirectory(std::string dir) { - list filenames_list; + std::list filenames_list; GetDir(dir, filenames_list); //OS specific - for(list::iterator it = filenames_list.begin(); it != + for(std::list::iterator it = filenames_list.begin(); it != filenames_list.end(); it++) { gdcmHeaderHelper *file = new gdcmHeaderHelper( it->c_str() ); @@ -525,7 +536,7 @@ void gdcmSerieHeaderHelper::SetDirectory(string dir) //---------------------------------------------------------------------------- //This could be implemented in a 'Strategy Pattern' approach //But as I don't know how to do it, I leave it this way -//BTW, this is also a Strategy, I don't know this is the best approcah :) +//BTW, this is also a Strategy, I don't know this is the best approach :) void gdcmSerieHeaderHelper::OrderGdcmFileList() { if( ImagePositionPatientOrdering() ) @@ -561,10 +572,10 @@ bool gdcmSerieHeaderHelper::ImagePositionPatientOrdering() float min, max; bool first = true; int n=0; - vector distlist; + std::vector distlist; //!\todo rewrite this for loop. - for (list::iterator it = CoherentGdcmFileList.begin(); + for (std::list::iterator it = CoherentGdcmFileList.begin(); it != CoherentGdcmFileList.end(); it++) { if(first) { @@ -623,7 +634,7 @@ bool gdcmSerieHeaderHelper::ImagePositionPatientOrdering() //Then I order the slices according to the value "dist". Finally, once //I've read in all the slices, I calculate the z-spacing as the difference //between the "dist" values for the first two slices. - vector CoherentGdcmFileVector(n); + std::vector CoherentGdcmFileVector(n); //CoherentGdcmFileVector.reserve( n ); CoherentGdcmFileVector.resize( n ); //assert( CoherentGdcmFileVector.capacity() >= n ); @@ -633,7 +644,7 @@ bool gdcmSerieHeaderHelper::ImagePositionPatientOrdering() n = 0; //VC++ don't understand what scope is !! it -> it2 - for (list::iterator it2 = CoherentGdcmFileList.begin(); + for (std::list::iterator it2 = CoherentGdcmFileList.begin(); it2 != CoherentGdcmFileList.end(); it2++, n++) { //2*n sort algo !! @@ -646,7 +657,7 @@ bool gdcmSerieHeaderHelper::ImagePositionPatientOrdering() CoherentGdcmFileList.clear(); //this doesn't delete list's element, node only //VC++ don't understand what scope is !! it -> it3 - for (vector::iterator it3 = CoherentGdcmFileVector.begin(); + for (std::vector::iterator it3 = CoherentGdcmFileVector.begin(); it3 != CoherentGdcmFileVector.end(); it3++) { CoherentGdcmFileList.push_back( *it3 ); @@ -666,7 +677,7 @@ bool gdcmSerieHeaderHelper::ImageNumberOrdering() int n = 0;//CoherentGdcmFileList.size(); //O(N) operation !! unsigned char *partition; - list::iterator it = CoherentGdcmFileList.begin(); + std::list::iterator it = CoherentGdcmFileList.begin(); min = max = (*it)->GetImageNumber(); for (; it != CoherentGdcmFileList.end(); it++, n++) @@ -681,10 +692,10 @@ bool gdcmSerieHeaderHelper::ImageNumberOrdering() partition = new unsigned char[n]; memset(partition, 0, n); - vector CoherentGdcmFileVector(n); + std::vector CoherentGdcmFileVector(n); //VC++ don't understand what scope is !! it -> it2 - for (list::iterator it2 = CoherentGdcmFileList.begin(); + for (std::list::iterator it2 = CoherentGdcmFileList.begin(); it2 != CoherentGdcmFileList.end(); it2++) { pos = (*it2)->GetImageNumber(); @@ -700,7 +711,7 @@ bool gdcmSerieHeaderHelper::ImageNumberOrdering() //VC++ don't understand what scope is !! it -> it3 CoherentGdcmFileList.clear(); //this doesn't delete list's element, node only - for (vector::iterator it3 = CoherentGdcmFileVector.begin(); + for (std::vector::iterator it3 = CoherentGdcmFileVector.begin(); it3 != CoherentGdcmFileVector.end(); it3++) { CoherentGdcmFileList.push_back( *it3 ); @@ -718,7 +729,7 @@ bool gdcmSerieHeaderHelper::FileNameOrdering() return true; } //---------------------------------------------------------------------------- -list &gdcmSerieHeaderHelper::GetGdcmFileList() +std::list &gdcmSerieHeaderHelper::GetGdcmFileList() { return CoherentGdcmFileList; }