]> Creatis software - creaImageIO.git/blob - src2/creaImageIOTreeDescriptor.cpp
6849b10bd6740f84cc36774381a551473c0c25ff
[creaImageIO.git] / src2 / creaImageIOTreeDescriptor.cpp
1 #include <creaImageIOTreeDescriptor.h>
2 #include <boost/algorithm/string/split.hpp>
3 #include <creaImageIOSystem.h>
4 #include <boost/filesystem.hpp>
5
6
7
8
9
10 namespace creaImageIO
11 {
12
13   namespace tree
14   {
15
16     //==================================================================
17     /// The attribute is hidden (not visible to user)
18     const unsigned int AttributeDescriptor::PRIVATE = 1;
19     /// The attribute enters in unique identifier constitution 
20     const unsigned int AttributeDescriptor::IDENTIFIER = 2;
21     const unsigned int AttributeDescriptor::LABEL = 4;
22     //==================================================================
23
24     //==================================================================
25     Descriptor::Descriptor()
26     {
27       CreateLevel0Descriptor();
28     }
29     //==================================================================
30
31    //==================================================================
32     Descriptor::~Descriptor()
33     {
34     }
35     //==================================================================
36
37     //==================================================================
38     void Descriptor::CreateLevel0Descriptor()
39     {
40       Add(LevelDescriptor("Root"));
41     }
42     //==================================================================
43     
44     //==================================================================
45     /// Creates the default descriptor
46     void Descriptor::CreateDefault()
47     {
48       // clears the existing one
49       Clear();
50       
51       // Creates the level 0 descriptor 
52       CreateLevel0Descriptor();
53       // Creates the attribute "Name"
54       Add(AttributeDescriptor("Name","Name",
55                               AttributeDescriptor::LABEL),0);
56       
57       // Patient level
58       Add(LevelDescriptor("Patient"));
59           Add(AttributeDescriptor("NumberOfChildren","#Series",0),1);   // Number of Series
60       Add(AttributeDescriptor(0x0010,0x0010,   // Patient name
61                               AttributeDescriptor::LABEL),1);
62       Add(AttributeDescriptor(0x0010,0x0040),1); // Patient sex
63       Add(AttributeDescriptor(0x0010,0x0030),1); // Patient birthday
64       Add(AttributeDescriptor(0x0010,0x0020,   // Patient ID
65                               AttributeDescriptor::IDENTIFIER),1);
66  
67       // Study-series level
68       Add(LevelDescriptor("Series"));
69           Add(AttributeDescriptor("NumberOfChildren","#Images",0),2);   // Number of images
70       Add(AttributeDescriptor(0x0008,0x0060,    // Modality
71                               AttributeDescriptor::LABEL),2);
72       Add(AttributeDescriptor(0x0008,0x1030),2); // Study Description
73       Add(AttributeDescriptor(0x0008,0x103E),2); // Description
74       Add(AttributeDescriptor(0x0008,0x0080),2); // Institution Name
75       Add(AttributeDescriptor(0x0008,0x0081),2); // Institution Adress
76           Add(AttributeDescriptor(0x0008,0x1010),2); // Station Name
77       Add(AttributeDescriptor(0x0008,0x1048),2); // Physician of Record
78       Add(AttributeDescriptor(0x0008,0x1050),2); // Performing Physician's Name
79       Add(AttributeDescriptor(0x0018,0x1030),2); // Protocol Name
80
81       Add(AttributeDescriptor(0x0020,0x0010),2); // Study ID
82       Add(AttributeDescriptor(0x0008,0x0020),2); // Study Date
83       Add(AttributeDescriptor(0x0008,0x0030),2); // Study Time
84       Add(AttributeDescriptor(0x0008,0x0050),2); // Study Accession Number
85       Add(AttributeDescriptor(0x0008,0x0005),2); // Specific character set
86       Add(AttributeDescriptor(0x0008,0x0021),2); // Series Date
87       Add(AttributeDescriptor(0x0008,0x0031),2); // Series time
88
89       Add(AttributeDescriptor(0x0020,0x000D   // Study Instance UID  
90                                                     ),2);//AttributeDescriptor::IDENTIFIER),2);
91       Add(AttributeDescriptor(0x0020,0x000E,   // Series Instance UID  
92                                                     AttributeDescriptor::IDENTIFIER),2);
93       // |
94       //                                                    AttributeDescriptor::LABEL),2);
95      
96
97       // Image level
98       Add(LevelDescriptor("Image"));
99
100       Add(AttributeDescriptor(0x0020,0x0013),3); // Image Number
101
102       Add(AttributeDescriptor(0x0028,0x0010),3); // Rows
103       Add(AttributeDescriptor(0x0028,0x0011),3); // Columns
104       Add(AttributeDescriptor(0x0028,0x0012),3); // Planes
105       Add(AttributeDescriptor(0x0028,0x0002),3); // Sample per pixels
106       Add(AttributeDescriptor(0x0028,0x0008),3); // Number of Frames 
107       Add(AttributeDescriptor(0x0028,0x0004),3); // Photometric Interpretation
108       Add(AttributeDescriptor(0x0028,0x0103),3); // Pixel Representation
109
110       Add(AttributeDescriptor(0x0020,0x0032),3); // Image Position Patient
111       Add(AttributeDescriptor(0x0020,0x0037),3); // Image Orientation Patient
112       Add(AttributeDescriptor(0x0020,0x1041),3); // Slice Location
113       Add(AttributeDescriptor(0x0028,0x0006),3); // Planar Configuration
114
115       Add(AttributeDescriptor(0x0028,0x0030),3); // Pixel Spacing
116       Add(AttributeDescriptor(0x0028,0x0100),3); // AlocatedBits
117       Add(AttributeDescriptor(0x0028,0x0101),3); // StoredBits
118
119       Add(AttributeDescriptor(0x0008,0x0008),3); // Image Type
120       Add(AttributeDescriptor(0x0008,0x0023),3); // Content Date
121       Add(AttributeDescriptor(0x0008,0x0033),3); // Content Time
122
123       Add(AttributeDescriptor(0x0020,0x4000),3); // Image Comments
124
125       Add(AttributeDescriptor(0x0004,0x1500,   // File Name
126                                                     AttributeDescriptor::LABEL),3);
127       Add(AttributeDescriptor(0x0028,0x1052),3); // Rescale Intercept
128       Add(AttributeDescriptor(0x0028,0x1053),3); // Rescale Slope
129
130       Add(AttributeDescriptor(0x0050,0x0004),3); // Calibration Image
131
132       Add(AttributeDescriptor(0x0020,0x0052   // Frame Reference UID
133                                                     ),3);
134       Add(AttributeDescriptor(0x0008,0x0016),3); // SOP Class UID
135       Add(AttributeDescriptor("FullFileName",  // Full file name
136                                                     "Full file name",
137                                                     AttributeDescriptor::IDENTIFIER),3); 
138                                                                   
139      
140     }
141
142         //////////////////////////////////////////////////////////////
143         // create a descriptor (name, attributes...) from a file)       //
144         // @param : file path                                                                           //
145         // return : -                                                                                           //
146         //////////////////////////////////////////////////////////////
147         void Descriptor::createDescriptorfromFile(std::string &i_name)
148         {
149                 Clear();
150                 
151                 // read file and put in buffer
152                 std::ifstream i_file(i_name.c_str());
153                 std::stringstream buffer;
154                 buffer << i_file.rdbuf();
155                 std::string line;
156                 bool bname;
157                 int ilevel = -1;
158
159                 
160                 while(std::getline(buffer, line))
161                 {
162                         if(line =="<level>")
163                         {       //increment levels.
164                                 ilevel++;
165                                 bname = true;
166                         }
167                         else if(bname)
168                         {
169                                 // For each level, a name to describe it
170                                 Add(LevelDescriptor(line));
171                                 bname = false;
172                         }
173                         else
174                         { 
175                                 // split line to find all tags
176                                 std::vector<std::string> descriptors;
177                                 std::string separator = " ";
178                                 std::string::size_type last_pos = line.find_first_not_of(separator);
179                                 //find first separator
180                                 std::string::size_type pos = line.find_first_of(separator, last_pos);
181                                 while(std::string::npos != pos || std::string::npos != last_pos)
182                                 {
183                                         descriptors.push_back(line.substr(last_pos, pos - last_pos));
184                                         last_pos = line.find_first_not_of(separator, pos);
185                                         pos = line.find_first_of(separator, last_pos);
186                                 }
187                                 
188                                 // By default, the last tag is at zero and not recorded but if take in count
189                                 unsigned int flag = 0;
190                                 if(descriptors.size() == 4)
191                                 {
192                                         std::stringstream val;
193                                         val << std::dec << descriptors[3];
194                                         val>> flag;
195                                 }
196
197                                 // if Dicom tag, use "group" and "element" descriptor
198                                 if(descriptors[0] == "D")
199                                 {       std::stringstream val, val2;
200                                         unsigned short group;
201                                         unsigned short element;
202                                         val <<   std::dec << descriptors[1] ;
203                                         val >> std::hex >> group;
204                                         val2 << std::dec <<  descriptors[2];
205                                         val2 >> std::hex >> element;
206                                         Add(AttributeDescriptor( group,element,flag), ilevel);
207                                 }
208                                 else // "O" means if user's own tag.
209                                 {       
210                                         Add(AttributeDescriptor( descriptors[1].c_str(),descriptors[2].c_str(),flag), ilevel);
211                                 }
212                         }
213                 }
214         }
215
216
217     //==================================================================
218
219     //==================================================================
220     /// Adds a LevelDescriptor at the end of the list
221     void Descriptor::Add(const LevelDescriptor& d)
222     {
223       mLevelDescriptorList.push_back(d);
224     }
225     //==================================================================
226     
227     //==================================================================  
228     /// Adds an AttributeDescriptor to level l
229     void Descriptor::Add(const AttributeDescriptor& d, int l)
230     {
231       mLevelDescriptorList[l].Add(d);
232       // TO DO : update DicomTagToName and NameToDicomTag map
233     }
234     //==================================================================
235
236     //==================================================================
237     /// Clears the Descriptor
238     void Descriptor::Clear()
239     {
240       mLevelDescriptorList.clear();
241     }
242     //==================================================================
243
244     //==================================================================
245     /// Builds the key to value map of all the attributes of the tree
246     void Descriptor::BuildAttributeMap( std::map<std::string,std::string>& map ) const
247     {
248       map.clear();
249       LevelDescriptorListType::const_iterator l;
250       for (l = GetLevelDescriptorList().begin();
251            l!= GetLevelDescriptorList().end();
252            ++l)
253         {
254           LevelDescriptor::AttributeDescriptorListType::const_iterator a;
255           for (a = l->GetAttributeDescriptorList().begin();
256                a!= l->GetAttributeDescriptorList().end();
257                ++a)
258             {
259               map[a->GetKey()]="";
260             }
261         }
262     }
263  
264   }
265 }