1 /*=========================================================================
2 Program: vv http://www.creatis.insa-lyon.fr/rio/vv
5 - University of LYON http://www.universite-lyon.fr/
6 - Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr
7 - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr
9 This software is distributed WITHOUT ANY WARRANTY; without even
10 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11 PURPOSE. See the copyright notices for more information.
13 It is distributed under dual licence
15 - BSD See included LICENSE.txt file
16 - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17 ======================================================================-====*/
19 #ifndef CLITKCOMMON_CXX
20 #define CLITKCOMMON_CXX
23 #include "clitkCommon.h"
31 //------------------------------------------------------------------
32 // skip line which begin with a sharp '#'
33 void clitk::skipComment(std::istream & is)
39 while (is && (c == '#')) {
40 is.getline (line, 1024);
46 //------------------------------------------------------------------
48 //------------------------------------------------------------------
49 // linear (rough) conversion from Hounsfield Unit to density
50 double clitk::HU2density(double HU)
52 return (HU+1000.0)/1000.0;
54 //------------------------------------------------------------------
56 //------------------------------------------------------------------
57 // Return filename extension
58 std::string clitk::GetExtension(const std::string& filename)
60 // This assumes that the final '.' in a file name is the delimiter
61 // for the file's extension type
62 const std::string::size_type it = filename.find_last_of( "." );
63 // This determines the file's type by creating a new string
64 // who's value is the extension of the input filename
65 // eg. "myimage.gif" has an extension of "gif"
66 std::string fileExt( filename, it+1, filename.length() );
69 //------------------------------------------------------------------
71 //------------------------------------------------------------------
72 // Display progression
73 void clitk::VerboseInProgress(const int nb, const int current, const int percentage)
75 static int previous = -1;
76 const int rounded = (100*current)/nb;
77 if (previous==rounded) return;
80 std::ostringstream oss;
81 oss << std::setw(4) << rounded << '%';
83 std::cout << oss.str() << std::flush;
84 for (unsigned int i=0; i<oss.str().length(); ++i)
85 std::cout << "\b" << std::flush;
87 //------------------------------------------------------------------
89 //------------------------------------------------------------------
90 // Display progression
91 void clitk::VerboseInProgressInPercentage(const int nb, const int current, const int percentage)
93 VerboseInProgress(nb, current, percentage);
95 //------------------------------------------------------------------
97 //------------------------------------------------------------------
98 // Convert a pixel type to another (downcast)
100 float clitk::PixelTypeDownCast(const double & x)
104 //------------------------------------------------------------------
106 //------------------------------------------------------------------
107 double clitk::rad2deg(const double anglerad)
109 return (anglerad/M_PI*180.0);
111 //------------------------------------------------------------------
113 //------------------------------------------------------------------
114 double clitk::deg2rad(const double angledeg)
116 return (angledeg*(M_PI/180.0));
118 //------------------------------------------------------------------
120 //------------------------------------------------------------------
121 int clitk::GetTypeSizeFromString(const std::string & type)
123 #define RETURN_SIZEOF_PIXEL(TYPENAME, TYPE) \
124 if (type == #TYPENAME) return sizeof(TYPE);
125 RETURN_SIZEOF_PIXEL(char, char);
126 RETURN_SIZEOF_PIXEL(uchar, uchar);
127 RETURN_SIZEOF_PIXEL(unsigned char, uchar);
128 RETURN_SIZEOF_PIXEL(unsigned_char, uchar);
129 RETURN_SIZEOF_PIXEL(short, short);
130 RETURN_SIZEOF_PIXEL(ushort, ushort);
131 RETURN_SIZEOF_PIXEL(unsigned_short, ushort);
132 RETURN_SIZEOF_PIXEL(int, int);
133 RETURN_SIZEOF_PIXEL(uint, uint);
134 RETURN_SIZEOF_PIXEL(unsigned_int, uint);
135 RETURN_SIZEOF_PIXEL(float, float);
136 RETURN_SIZEOF_PIXEL(double, double);
139 //------------------------------------------------------------------
141 //------------------------------------------------------------------
143 bool clitk::IsSameType<signed char>(std::string t)
145 if ((t==GetTypeAsString<signed char>()) || (t == "schar")) return true;
150 bool clitk::IsSameType<char>(std::string t)
152 if ((t==GetTypeAsString<char>()) || (t == "char")) return true;
157 bool clitk::IsSameType<unsigned char>(std::string t)
159 if ((t==GetTypeAsString<unsigned char>()) || (t == "uchar")) return true;
164 bool clitk::IsSameType<unsigned short>(std::string t)
166 if ((t==GetTypeAsString<unsigned short>()) || (t == "ushort")) return true;
169 //------------------------------------------------------------------
171 //------------------------------------------------------------------
172 void clitk::FindAndReplace(std::string & line,
173 const std::string & tofind,
174 const std::string & replacement)
176 int pos = line.find(tofind);
177 while (pos!= (int)std::string::npos) {
178 line.replace(pos, tofind.size(), replacement);
179 pos = line.find(tofind, pos+tofind.size()+1);
182 //------------------------------------------------------------------
184 //------------------------------------------------------------------
185 void clitk::FindAndReplace(std::string & line,
186 const std::vector<std::string> & tofind,
187 const std::vector<std::string> & toreplace)
189 for(unsigned int i=0; i<tofind.size(); i++) {
190 FindAndReplace(line, tofind[i], toreplace[i]);
193 //------------------------------------------------------------------
195 //------------------------------------------------------------------
196 void clitk::FindAndReplace(std::ifstream & in,
197 const std::vector<std::string> & tofind,
198 const std::vector<std::string> & toreplace,
202 if (tofind.size() != toreplace.size()) {
203 std::cerr << "Error' tofind' is size=" << tofind.size() << std::endl;
204 std::cerr << "... while 'toreplace' is size=" << toreplace.size() << std::endl;
207 while (std::getline(in,line)) {
208 FindAndReplace(line, tofind, toreplace);
209 out << line << std::endl;
212 //------------------------------------------------------------------
214 //------------------------------------------------------------------
215 double clitk::ComputeEuclideanDistanceFromPointToPlane(const itk::ContinuousIndex<double, 3> point,
216 const itk::ContinuousIndex<double, 3> pointInPlane,
217 const itk::ContinuousIndex<double, 3> normalPlane)
219 // http://mathworld.wolfram.com/Plane.html
220 // http://mathworld.wolfram.com/Point-PlaneDistance.html
221 double a = normalPlane[0];
222 double b = normalPlane[1];
223 double c = normalPlane[2];
224 double x0 = pointInPlane[0];
225 double y0 = pointInPlane[1];
226 double z0 = pointInPlane[2];
231 double norm = sqrt(x0*x0 + y0*y0 + z0*z0);
233 double d = -a*x0 - b*y0 - c*z0;
235 double distance = (a*x + b*y + c*z + d) / norm;
239 //------------------------------------------------------------------
241 //--------------------------------------------------------------------
242 // Open a file for reading
243 void clitk::openFileForReading(std::ifstream & is, const std::string & filename)
245 is.open(filename.c_str(), std::ios::in);
247 clitkExceptionMacro("Could not open file for reading: "
248 << filename << ". Error is : <"
249 << strerror(errno) << ">");
252 //--------------------------------------------------------------------
254 //--------------------------------------------------------------------
255 // Open a file for writing
256 void clitk::openFileForWriting(std::ofstream & os, const std::string & filename)
258 os.open(filename.c_str(), std::ios::out);
260 clitkExceptionMacro("Could not open file for writing: "
261 << filename << ". Error is : <"
262 << strerror(errno) << ">");
265 //--------------------------------------------------------------------
267 //--------------------------------------------------------------------
268 double clitk::cotan(double i)
270 return(1.0 / tan(i));
272 double clitk::invcotan(double x)
274 // http://mathworld.wolfram.com/InverseCotangent.html
277 y = -0.5*M_PI-atan(x);
279 y = 0.5*M_PI-atan(x);
283 //--------------------------------------------------------------------
285 //--------------------------------------------------------------------
286 std::streambuf * clitk_stdcerr_backup;
287 void clitk::disableStdCerr()
289 clitk_stdcerr_backup = std::cerr.rdbuf();
290 std::stringstream oss;
291 std::cerr.rdbuf( oss.rdbuf() );
293 //--------------------------------------------------------------------
295 //--------------------------------------------------------------------
296 void clitk::enableStdCerr()
298 std::cerr.rdbuf(clitk_stdcerr_backup);
300 //--------------------------------------------------------------------
303 //--------------------------------------------------------------------
304 void clitk::readDoubleFromFile(const std::string & filename, std::vector<double> & list)
307 clitk::openFileForReading(is, filename);
310 clitk::skipComment(is);
313 if (is) list.push_back(d);
316 //--------------------------------------------------------------------
319 //--------------------------------------------------------------------
320 void clitk::PrintMemoryUsed()
322 #if defined(unix) || defined(__APPLE__)
324 getrusage(RUSAGE_SELF, &usage);
325 DD(usage.ru_maxrss); /* maximum resident set size */
326 // DD(usage.ru_ixrss); /* integral shared memory size */
327 // DD(usage.ru_idrss); /* integral unshared data size */
328 // DD(usage.ru_isrss); /* integral unshared stack size */
331 //--------------------------------------------------------------------
334 #endif /* end #define CLITKCOMMON_CXX */