X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=common%2FclitkCommon.cxx;h=c71bd5078fbf5598e7982eb81287204c1c26c694;hb=08f7de414957e92b25ca5b299007e941b610d3a8;hp=4ccceb2761da9eb8b70b64f8074983442b3e04e1;hpb=058940b4508314ecc063b466f7da6f324a796826;p=clitk.git diff --git a/common/clitkCommon.cxx b/common/clitkCommon.cxx index 4ccceb2..c71bd50 100644 --- a/common/clitkCommon.cxx +++ b/common/clitkCommon.cxx @@ -1,54 +1,62 @@ -/*------------------------------------------------------------------------- - - Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de - l'Image). All rights reserved. See Doc/License.txt or - http://www.creatis.insa-lyon.fr/Public/Gdcm/License.html for details. - - This software is distributed WITHOUT ANY WARRANTY; without even - the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - PURPOSE. See the above copyright notices for more information. - --------------------------------------------------------------------------*/ +/*========================================================================= + Program: vv http://www.creatis.insa-lyon.fr/rio/vv + + Authors belong to: + - University of LYON http://www.universite-lyon.fr/ + - Léon Bérard cancer center http://www.centreleonberard.fr + - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the copyright notices for more information. + + It is distributed under dual licence + + - BSD See included LICENSE.txt file + - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html +===========================================================================**/ #ifndef CLITKCOMMON_CXX #define CLITKCOMMON_CXX -/** - ------------------------------------------------- - * @file clitkCommon.cxx - * @author David Sarrut - * @date 17 May 2006 07:59:06 - * - * @brief - * - * - -------------------------------------------------*/ +#include +#ifdef _WIN32 + #define _USE_MATH_DEFINES + #include + const double M_PI = std::acos(-1.0); +#endif + +// clitk include #include "clitkCommon.h" + +// std include #include #include #include +#include //------------------------------------------------------------------ // skip line which begin with a sharp '#' -void clitk::skipComment(std::istream & is) +void clitk::skipComment(std::istream & is) { char c; char line[1024]; if (is.eof()) return; - is >> c ; + is >> c ; while (is && (c == '#')) { - is.getline (line, 1024); - is >> c; - if (is.eof()) return; + is.getline (line, 1024); + is >> c; + if (is.eof()) return; } - is.unget(); + if (!(is.fail()) && c != '\n') + is.unget(); } //// //------------------------------------------------------------------ - + //------------------------------------------------------------------ // linear (rough) conversion from Hounsfield Unit to density -double clitk::HU2density(double HU) +double clitk::HU2density(double HU) { return (HU+1000.0)/1000.0; } //// @@ -56,34 +64,52 @@ double clitk::HU2density(double HU) //------------------------------------------------------------------ // Return filename extension -std::string clitk::GetExtension(const std::string& filename) +std::string clitk::GetExtension(const std::string& filename) { // This assumes that the final '.' in a file name is the delimiter // for the file's extension type - const std::string::size_type it = filename.find_last_of( "." ); + const std::string::size_type it = filename.find_last_of( "." ); // This determines the file's type by creating a new string // who's value is the extension of the input filename // eg. "myimage.gif" has an extension of "gif" - std::string fileExt( filename, it+1, filename.length() ); + std::string fileExt( filename, it+1, filename.length() ); return( fileExt ); } //// //------------------------------------------------------------------ + +//------------------------------------------------------------------ +// Return filename splitting in 1 or 2 parts : directory name (if exists) & filename +std::vector clitk::SplitFilename(const std::string& filename) +{ + std::vector dirname; + std::string path = itksys::SystemTools::GetFilenamePath(filename); + std::vector pathComponents; + itksys::SystemTools::SplitPath(filename.c_str(), pathComponents); + std::string fileName = pathComponents.back(); + if (path != "") + dirname.push_back(path); + dirname.push_back(fileName); + return( dirname ); +} //// +//------------------------------------------------------------------ + + //------------------------------------------------------------------ // Display progression void clitk::VerboseInProgress(const int nb, const int current, const int percentage) { static int previous = -1; const int rounded = (100*current)/nb; - if (previous==rounded) return; + if (previous==rounded) return; previous = rounded; std::ostringstream oss; oss << std::setw(4) << rounded << '%'; std::cout << oss.str() << std::flush; - for (int i=0; i +double clitk::PixelTypeDownCast(const double & x) +{ + return x; +} +//------------------------------------------------------------------ + +//------------------------------------------------------------------ +double clitk::rad2deg(const double anglerad) +{ return (anglerad/M_PI*180.0); } //------------------------------------------------------------------ //------------------------------------------------------------------ -double clitk::deg2rad(const double angledeg) { +double clitk::deg2rad(const double angledeg) +{ return (angledeg*(M_PI/180.0)); } //------------------------------------------------------------------ //------------------------------------------------------------------ -int clitk::GetTypeSizeFromString(const std::string & type) { +int clitk::GetTypeSizeFromString(const std::string & type) +{ #define RETURN_SIZEOF_PIXEL(TYPENAME, TYPE) \ if (type == #TYPENAME) return sizeof(TYPE); RETURN_SIZEOF_PIXEL(char, char); @@ -138,30 +176,39 @@ int clitk::GetTypeSizeFromString(const std::string & type) { //------------------------------------------------------------------ template<> -bool clitk::IsSameType(std::string t) { - if ((t==GetTypeAsString()) || (t == "schar")) return true; else return false; +bool clitk::IsSameType(std::string t) +{ + if ((t==GetTypeAsString()) || (t == "schar")) return true; + else return false; } template<> -bool clitk::IsSameType(std::string t) { - if ((t==GetTypeAsString()) || (t == "char")) return true; else return false; +bool clitk::IsSameType(std::string t) +{ + if ((t==GetTypeAsString()) || (t == "char")) return true; + else return false; } template<> -bool clitk::IsSameType(std::string t) { - if ((t==GetTypeAsString()) || (t == "uchar")) return true; else return false; +bool clitk::IsSameType(std::string t) +{ + if ((t==GetTypeAsString()) || (t == "uchar")) return true; + else return false; } template<> -bool clitk::IsSameType(std::string t) { - if ((t==GetTypeAsString()) || (t == "ushort")) return true; else return false; +bool clitk::IsSameType(std::string t) +{ + if ((t==GetTypeAsString()) || (t == "ushort")) return true; + else return false; } //------------------------------------------------------------------ //------------------------------------------------------------------ -void clitk::FindAndReplace(std::string & line, - const std::string & tofind, - const std::string & replacement) { +void clitk::FindAndReplace(std::string & line, + const std::string & tofind, + const std::string & replacement) +{ int pos = line.find(tofind); while (pos!= (int)std::string::npos) { line.replace(pos, tofind.size(), replacement); @@ -171,9 +218,10 @@ void clitk::FindAndReplace(std::string & line, //------------------------------------------------------------------ //------------------------------------------------------------------ -void clitk::FindAndReplace(std::string & line, - const std::vector & tofind, - const std::vector & toreplace) { +void clitk::FindAndReplace(std::string & line, + const std::vector & tofind, + const std::vector & toreplace) +{ for(unsigned int i=0; i & tofind, - const std::vector & toreplace, - std::ofstream & out) { +void clitk::FindAndReplace(std::ifstream & in, + const std::vector & tofind, + const std::vector & toreplace, + std::ofstream & out) +{ std::string line; if (tofind.size() != toreplace.size()) { std::cerr << "Error' tofind' is size=" << tofind.size() << std::endl; @@ -199,9 +248,10 @@ void clitk::FindAndReplace(std::ifstream & in, //------------------------------------------------------------------ //------------------------------------------------------------------ -double clitk::ComputeEuclideanDistanceFromPointToPlane(const itk::ContinuousIndex point, - const itk::ContinuousIndex pointInPlane, - const itk::ContinuousIndex normalPlane) { +double clitk::ComputeEuclideanDistanceFromPointToPlane(const itk::ContinuousIndex point, + const itk::ContinuousIndex pointInPlane, + const itk::ContinuousIndex normalPlane) +{ // http://mathworld.wolfram.com/Plane.html // http://mathworld.wolfram.com/Point-PlaneDistance.html double a = normalPlane[0]; @@ -219,40 +269,49 @@ double clitk::ComputeEuclideanDistanceFromPointToPlane(const itk::ContinuousInde double d = -a*x0 - b*y0 - c*z0; DD(d); double distance = (a*x + b*y + c*z + d) / norm; - + return distance; } //------------------------------------------------------------------ //-------------------------------------------------------------------- // Open a file for reading -void clitk::openFileForReading(std::ifstream & is, const std::string & filename) { - is.open(filename.c_str(), std::ios::in); +void clitk::openFileForReading(std::ifstream & is, const std::string & filename) +{ + is.open(filename.c_str(), std::ios::in | std::ios::binary); if ( is.fail() ) { - itkGenericExceptionMacro(<< "Could not open file (for reading): " << filename); + clitkExceptionMacro("Could not open file for reading: " + << filename << ". Error is : <" + << strerror(errno) << ">"); } } //-------------------------------------------------------------------- - + //-------------------------------------------------------------------- // Open a file for writing -void clitk::openFileForWriting(std::ofstream & os, const std::string & filename) { +void clitk::openFileForWriting(std::ofstream & os, const std::string & filename) +{ os.open(filename.c_str(), std::ios::out); if ( os.fail() ) { - itkGenericExceptionMacro(<< "Could not open file (for writing): " << filename); + clitkExceptionMacro("Could not open file for writing: " + << filename << ". Error is : <" + << strerror(errno) << ">"); } } //-------------------------------------------------------------------- //-------------------------------------------------------------------- -double clitk::cotan(double i) { return(1.0 / tan(i)); } -double clitk::invcotan(double x) { +double clitk::cotan(double i) +{ + return(1.0 / tan(i)); +} +double clitk::invcotan(double x) +{ // http://mathworld.wolfram.com/InverseCotangent.html double y; if (x<0) { y = -0.5*M_PI-atan(x); - } - else { + } else { y = 0.5*M_PI-atan(x); } return y; @@ -261,7 +320,8 @@ double clitk::invcotan(double x) { //-------------------------------------------------------------------- std::streambuf * clitk_stdcerr_backup; -void clitk::disableStdCerr() { +void clitk::disableStdCerr() +{ clitk_stdcerr_backup = std::cerr.rdbuf(); std::stringstream oss; std::cerr.rdbuf( oss.rdbuf() ); @@ -269,10 +329,43 @@ void clitk::disableStdCerr() { //-------------------------------------------------------------------- //-------------------------------------------------------------------- -void clitk::enableStdCerr() { +void clitk::enableStdCerr() +{ std::cerr.rdbuf(clitk_stdcerr_backup); } //-------------------------------------------------------------------- + +//-------------------------------------------------------------------- +void clitk::readDoubleFromFile(const std::string & filename, std::vector & list) +{ + std::ifstream is; + clitk::openFileForReading(is, filename); + list.clear(); + while (is) { + clitk::skipComment(is); + double d; + is >> d; + if (is) list.push_back(d); + } +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +void clitk::PrintMemoryUsed() +{ +#if defined(unix) || defined(__APPLE__) + rusage usage; + getrusage(RUSAGE_SELF, &usage); + DD(usage.ru_maxrss); /* maximum resident set size */ + // DD(usage.ru_ixrss); /* integral shared memory size */ + // DD(usage.ru_idrss); /* integral unshared data size */ + // DD(usage.ru_isrss); /* integral unshared stack size */ +#endif +} +//-------------------------------------------------------------------- + + #endif /* end #define CLITKCOMMON_CXX */