]> Creatis software - clitk.git/blob - segmentation/clitkAnatomicalFeatureDatabase.cxx
Merge branch 'master' of git.creatis.insa-lyon.fr:clitk
[clitk.git] / segmentation / clitkAnatomicalFeatureDatabase.cxx
1 /*=========================================================================
2   Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
3
4   Authors belong to: 
5   - University of LYON              http://www.universite-lyon.fr/
6   - Léon Bérard cancer center       http://www.centreleonberard.fr
7   - CREATIS CNRS laboratory         http://www.creatis.insa-lyon.fr
8
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.
12
13   It is distributed under dual licence
14
15   - BSD        See included LICENSE.txt file
16   - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17   ===========================================================================**/
18
19 // clitk
20 #include "clitkAnatomicalFeatureDatabase.h"
21
22 // std
23 #include <iterator>
24 #include <sstream>
25 #include <cctype>
26 #include <functional>
27
28 //--------------------------------------------------------------------
29 clitk::AnatomicalFeatureDatabase::AnatomicalFeatureDatabase() 
30
31   SetFilename("default.afdb");
32   SetPath("./");
33 }
34 //--------------------------------------------------------------------
35
36
37 //--------------------------------------------------------------------
38 clitk::AnatomicalFeatureDatabase::Pointer clitk::AnatomicalFeatureDatabase::New(std::string filename) 
39
40   Pointer a = AnatomicalFeatureDatabase::New();
41   a->SetFilename(filename);
42   a->Load();
43   return a;
44 }
45 //--------------------------------------------------------------------
46
47
48 //--------------------------------------------------------------------
49 void clitk::AnatomicalFeatureDatabase::Write() 
50 {
51   // open file
52   std::ofstream os;
53   openFileForWriting(os, GetFilename());
54   MapTagType::const_iterator iter = m_MapOfTag.begin();
55   while (iter != m_MapOfTag.end()) {
56     os << iter->first << " " << iter->second << std::endl;
57     iter++;
58   }
59   os.close();
60 }
61 //--------------------------------------------------------------------
62
63
64 //--------------------------------------------------------------------
65 //http://stackoverflow.com/questions/216823/whats-the-best-way-to-trim-stdstring
66 // trim from start
67 static inline std::string &ltrim(std::string &s) {
68   s.erase(s.begin(), std::find_if(s.begin(), s.end(), std::not1(std::ptr_fun<int, int>(std::isspace))));
69   return s;
70 }
71 // trim from end
72 static inline std::string &rtrim(std::string &s) {
73   s.erase(std::find_if(s.rbegin(), s.rend(), std::not1(std::ptr_fun<int, int>(std::isspace))).base(), s.end());
74   return s;
75 }
76 // trim from both ends
77 static inline std::string &trim(std::string &s) {
78   return ltrim(rtrim(s));
79 }
80 //--------------------------------------------------------------------
81
82
83 //--------------------------------------------------------------------
84 void clitk::AnatomicalFeatureDatabase::Load() 
85 {
86   m_MapOfTag.clear();
87   // open file
88   std::ifstream is;
89   openFileForReading(is, GetFilename());
90   // load line by line string/string
91   while (!is.fail()) {
92     std::string tag;
93     is >> tag; 
94     if (tag != "") {
95       std::string value;
96       std::getline(is,value,'\n');
97       ltrim(value); // remove leading space
98       m_MapOfTag[tag] = value;
99     }
100   }
101   is.close();
102 }
103 //--------------------------------------------------------------------
104
105    
106 //--------------------------------------------------------------------
107 void clitk::AnatomicalFeatureDatabase::SetPoint3D(std::string tag, PointType3D & p)
108 {
109 #if ITK_VERSION_MAJOR > 3
110   std::ostringstream value;
111 #else
112   ::itk::OStringStream value;
113 #endif
114   value << p[0] << " " << p[1] << " " << p[2];
115   m_MapOfTag[tag] = value.str();
116 }
117 //--------------------------------------------------------------------
118
119
120 //--------------------------------------------------------------------
121 double clitk::AnatomicalFeatureDatabase::GetPoint3D(std::string tag, int dim)
122 {
123   PointType3D p;
124   GetPoint3D(tag, p);
125   return p[dim];
126 }
127 //--------------------------------------------------------------------
128
129
130 //--------------------------------------------------------------------
131 std::string clitk::AnatomicalFeatureDatabase::GetTagValue(std::string tag)
132 {
133   if (!TagExist(tag)) {
134     clitkExceptionMacro("Could not find the tag <" << tag << "> in the DB");
135     return "";
136   }
137   std::string s = m_MapOfTag[tag];
138   return s;
139 }
140 //--------------------------------------------------------------------
141
142
143 //--------------------------------------------------------------------
144 void clitk::AnatomicalFeatureDatabase::GetPoint3D(std::string tag, PointType3D & p)
145 {
146   if (!TagExist(tag)) {
147     clitkExceptionMacro("Could not find the tag <" << tag << "> of type Point3D in the DB");
148     return;
149   }
150
151   std::string s = m_MapOfTag[tag];
152     
153   // construct a stream from the string
154   std::stringstream strstr(s);
155
156   // use stream iterators to copy the stream to the vector as
157   // whitespace separated strings
158   std::istream_iterator<std::string> it(strstr);
159   std::istream_iterator<std::string> end;
160   std::vector<std::string> results(it, end);
161
162   // parse the string into 3 doubles
163   for(int i=0; i<3; i++) {
164
165     if (!clitk::fromString<double>(p[i], results[i].c_str())) {
166       clitkExceptionMacro("Error while reading Point3D, could not convert '" 
167                           << results[i].c_str() << "' into double.");
168     }
169   }
170 }
171 //--------------------------------------------------------------------
172
173
174 //--------------------------------------------------------------------
175 void clitk::AnatomicalFeatureDatabase::SetImageFilename(std::string tag, std::string f)
176 {
177   m_MapOfTag[tag] = f;
178 }
179 //--------------------------------------------------------------------
180
181
182 //--------------------------------------------------------------------
183 bool clitk::AnatomicalFeatureDatabase::TagExist(std::string tag)
184 {
185   return (m_MapOfTag.find(tag) != m_MapOfTag.end());
186 }
187 //--------------------------------------------------------------------
188
189
190 //-------------------------------------------------------------------- 
191 void clitk::AnatomicalFeatureDatabase::SetDouble(std::string tag, double value)
192 {
193   m_MapOfTag[tag] = clitk::toString(value);
194 }
195 //-------------------------------------------------------------------- 
196
197
198 //-------------------------------------------------------------------- 
199 double clitk::AnatomicalFeatureDatabase::GetDouble(std::string tag)
200 {
201   if (!TagExist(tag)) {
202     clitkExceptionMacro("Could not find the tag <" << tag << "> of type Double in the DB");
203     return -1;
204   }
205
206   double a;
207   if (!clitk::fromString<double>(a, m_MapOfTag[tag])) {
208     clitkExceptionMacro("Error while reading Double (tag='" << tag << "'), could not convert '" 
209                         << m_MapOfTag[tag] << "' into double.");
210   }
211   return a;  
212 }
213 //-------------------------------------------------------------------- 
214
215
216 //-------------------------------------------------------------------- 
217 void clitk::AnatomicalFeatureDatabase::RemoveTag(TagType tag)
218 {
219   if (TagExist(tag)) {
220     m_MapOfTag.erase(m_MapOfTag.find(tag));
221   }
222 }
223 //--------------------------------------------------------------------