#include "gdcmHeaderHelper.h"
#include "gdcmDirList.h"
-#include "gdcmUtil.h" //for debug
+#include "gdcmDebug.h"
#include <math.h>
#include <algorithm>
+#include <vector>
//-----------------------------------------------------------------------------
-// gdcmHeaderHelper
-//-----------------------------------------------------------------------------
-// Constructor / Destructor
/**
- * \ingroup gdcmHeaderHelper
* \brief constructor
*/
gdcmHeaderHelper::gdcmHeaderHelper() : gdcmHeader( ) {
}
/**
- * \ingroup gdcmHeaderHelper
* \brief constructor
* @param InFilename Name of the file to deal with
* @param exception_on_error
//-----------------------------------------------------------------------------
// Public
/**
- * \ingroup gdcmHeaderHelper
* \brief Returns the size (in bytes) of a single pixel of data.
* @return The size in bytes of a single pixel of data.
*
dbg.Verbose(0, "gdcmHeader::GetXSpacing: unfound Pixel Spacing (0028,0030)");
return 1.;
}
- if( sscanf( StrSpacing.c_str(), "%f\\%f", &yspacing, &xspacing) != 2)
- return 0.;
+ int nbValues;
+ if( (nbValues = sscanf( StrSpacing.c_str(), "%f\\%f", &yspacing, &xspacing)) != 2) {
+ if (nbValues==1) // if single value is found, xspacing is defaulted to yspacing
+ return yspacing;
+ }
if (xspacing == 0.) {
dbg.Verbose(0, "gdcmHeader::GetYSpacing: gdcmData/CT-MONO2-8-abdo.dcm problem");
// seems to be a bug in the header ...
* @return Y dimension of a pixel
*/
float gdcmHeaderHelper::GetYSpacing() {
- float xspacing, yspacing;
+ float yspacing;
std::string StrSpacing = GetEntryByNumber(0x0028,0x0030);
if (StrSpacing == GDCM_UNFOUND) {
dbg.Verbose(0, "gdcmHeader::GetYSpacing: unfound Pixel Spacing (0028,0030)");
return 1.;
}
- if( sscanf( StrSpacing.c_str(), "%f\\%f", &yspacing, &xspacing) != 2)
- return 0.;
- if (xspacing == 0.) {
- dbg.Verbose(0, "gdcmHeader::GetYSpacing: gdcmData/CT-MONO2-8-abdo.dcm problem");
- // seems to be a bug in the header ...
- sscanf( StrSpacing.c_str(), "%f\\0\\%f", &yspacing, &xspacing);
- }
+ sscanf( StrSpacing.c_str(), "%f", &yspacing);
return yspacing;
}
}
/**
- *\ingroup gdcmHeaderHelper
*\brief gets the info from 0008,0018 : SOP Instance UID
*\todo ? : return the ACR-NEMA element value if DICOM one is not found
* @return SOP Instance UID
// as the Z coordinate,
// 0. for all the coordinates if nothing is found
-// TODO : find a way to inform the caller nothing was found
-// TODO : How to tell the caller a wrong number of values was found?
+// \todo find a way to inform the caller nothing was found
+// \todo How to tell the caller a wrong number of values was found?
//
// ---------------------------------------------------------------
//
/**
- * \ingroup gdcmHeaderHelper
* \brief gets the info from 0020,0032 : Image Position Patient
* else from 0020,0030 : Image Position (RET)
* else 0.
StrImPos = GetEntryByNumber(0x0020,0x0030); // For ACR-NEMA images
if (StrImPos == GDCM_UNFOUND) {
dbg.Verbose(0, "gdcmHeader::GetXImagePosition: unfound Image Position (RET) (0020,0030)");
- // How to tell the caller nothing was found ?
+ /// \todo How to tell the caller nothing was found ?
return 0.;
}
}
}
/**
- * \ingroup gdcmHeaderHelper
* \brief gets the info from 0020,0032 : Image Position Patient
* else from 0020,0030 : Image Position (RET)
* else 0.
StrImPos = GetEntryByNumber(0x0020,0x0030); // For ACR-NEMA images
if (StrImPos == GDCM_UNFOUND) {
dbg.Verbose(0, "gdcmHeader::GetYImagePosition: unfound Image Position (RET) (0020,0030)");
- // How to tell the caller nothing was found ?
+ /// \todo How to tell the caller nothing was found ?
return 0.;
}
}
}
/**
- * \ingroup gdcmHeaderHelper
* \brief gets the info from 0020,0032 : Image Position Patient
* \ else from 0020,0030 : Image Position (RET)
* \ else from 0020,1041 : Slice Location
}
/**
- * \ingroup gdcmHeaderHelper
* \brief gets the info from 0020,0013 : Image Number
* \ else 0.
* @return image number
*/
int gdcmHeaderHelper::GetImageNumber() {
- //The function i atoi() takes the address of an area of memory as parameter and converts
- //the string stored at that location to an integer using the external decimal to internal
- //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.
+ // The function i atoi() takes the address of an area of memory as
+ // parameter and converts the string stored at that location to an integer
+ // using the external decimal to internal 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.
std::string StrImNumber = GetEntryByNumber(0x0020,0x0013); //0020 0013 IS REL Image Number
if (StrImNumber != GDCM_UNFOUND) {
return atoi( StrImNumber.c_str() );
}
/**
- * \ingroup gdcmHeaderHelper
* \brief gets the info from 0008,0060 : Modality
* @return Modality Type
*/
ModalityType gdcmHeaderHelper::GetModality(void) {
- std::string StrModality = GetEntryByNumber(0x0008,0x0060); //0008 0060 CS ID Modality
+ // 0008 0060 CS ID Modality
+ std::string StrModality = GetEntryByNumber(0x0008,0x0060);
if (StrModality != GDCM_UNFOUND) {
if ( StrModality.find("AU") < StrModality.length()) return AU;
else if ( StrModality.find("AS") < StrModality.length()) return AS;
else
{
- //throw error return value ???
- // specified <> unknow in our database
+ /// \todo throw error return value ???
+ /// specified <> unknow in our database
return Unknow;
}
}
}
/**
- * \ingroup gdcmHeaderHelper
* \brief gets the info from 0020,0037 : Image Orientation Patient
* @param iop adress of the (6)float aray to receive values
* @return cosines of image orientation patient
//iop is supposed to be float[6]
iop[0] = iop[1] = iop[2] = iop[3] = iop[4] = iop[5] = 0;
- std::string StrImOriPat = GetEntryByNumber(0x0020,0x0037); // 0020 0037 DS REL Image Orientation (Patient)
+ // 0020 0037 DS REL Image Orientation (Patient)
+ std::string StrImOriPat = GetEntryByNumber(0x0020,0x0037);
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) {
}
//For ACR-NEMA
- StrImOriPat = GetEntryByNumber(0x0020,0x0035); //0020 0035 DS REL Image Orientation (RET)
+ // 0020 0035 DS REL Image Orientation (RET)
+ StrImOriPat = GetEntryByNumber(0x0020,0x0035);
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) {
-//-----------------------------------------------------------------------------
-// gdcmSerieHeaderHelper
//-----------------------------------------------------------------------------
// Constructor / Destructor
gdcmSerieHeaderHelper::~gdcmSerieHeaderHelper(){
- //! \todo
+ /// \todo
for (std::list<gdcmHeaderHelper*>::iterator it = CoherentGdcmFileList.begin();
it != CoherentGdcmFileList.end(); it++)
{
//-----------------------------------------------------------------------------
// Public
/**
- * \ingroup gdcmHeaderHelper
* \brief add a gdcmFile to the list based on file name
* @param filename Name of the file to deal with
*/
}
/**
- * \ingroup gdcmHeaderHelper
* \brief add a gdcmFile to the list
* @param file gdcmHeaderHelper to add
*/
}
/**
- * \ingroup gdcmHeaderHelper
* \brief Sets the Directory
* @param dir Name of the directory to deal with
*/
}
/**
- * \ingroup gdcmHeaderHelper
* \brief Sorts the File List
* \warning This could be implemented in a 'Strategy Pattern' approach
* But as I don't know how to do it, I leave it this way
}
/**
- * \ingroup gdcmHeaderHelper
* \brief Gets the *coherent* File List
* @return the *coherent* File List
*/