]> Creatis software - creaImageIO.git/blobdiff - src2/creaImageIOTreeDescriptor.cpp
*** empty log message ***
[creaImageIO.git] / src2 / creaImageIOTreeDescriptor.cpp
index fc4166f7d0b327046fa1ff8dfd2295e92b968c94..30c8b7aa8ba32fa15d9b81ba01d122bb23d7d485 100644 (file)
@@ -1,4 +1,11 @@
 #include <creaImageIOTreeDescriptor.h>
+#include <boost/algorithm/string/split.hpp>
+#include <boost/algorithm/string/replace.hpp>
+#include <creaImageIOSystem.h>
+#include <boost/filesystem.hpp>
+
+
+#include <fstream>
 
 
 namespace creaImageIO
@@ -9,9 +16,12 @@ namespace creaImageIO
 
     //==================================================================
     /// The attribute is hidden (not visible to user)
-    const unsigned int AttributeDescriptor::HIDDEN = 1;
-    /// The attribute enters in unique identifier constitution (KEY)
-    const unsigned int AttributeDescriptor::KEY = 2;
+    const unsigned int AttributeDescriptor::PRIVATE = 1;
+    /// The attribute enters in unique identifier constitution 
+    const unsigned int AttributeDescriptor::IDENTIFIER = 2;
+       /// The attribute can be edited
+       const unsigned int AttributeDescriptor::EDITABLE = 3;
+       /// the attribute describes the node
     const unsigned int AttributeDescriptor::LABEL = 4;
     //==================================================================
 
@@ -31,7 +41,7 @@ namespace creaImageIO
     //==================================================================
     void Descriptor::CreateLevel0Descriptor()
     {
-      GetLevelDescriptorList().push_back(LevelDescriptor("Root"));
+      Add(LevelDescriptor("Root"));
     }
     //==================================================================
     
@@ -40,90 +50,203 @@ namespace creaImageIO
     void Descriptor::CreateDefault()
     {
       // clears the existing one
-      GetLevelDescriptorList().clear();
+      Clear();
       
       // Creates the level 0 descriptor 
       CreateLevel0Descriptor();
       // Creates the attribute "Name"
-      GetAttributeDescriptorList(0).push_back(AttributeDescriptor("Name"));
+      Add(AttributeDescriptor("Name","Name",
+                             AttributeDescriptor::LABEL),0);
       
       // Patient level
-      GetLevelDescriptorList().push_back(LevelDescriptor("Patient"));
-      GetAttributeDescriptorList(1).push_back(AttributeDescriptor("0010|0010",   // Patient name
-                                                                  AttributeDescriptor::LABEL));
-      GetAttributeDescriptorList(1).push_back(AttributeDescriptor("0010|0040")); // Patient sex
-      GetAttributeDescriptorList(1).push_back(AttributeDescriptor("0010|0030")); // Patient birthday
-      GetAttributeDescriptorList(1).push_back(AttributeDescriptor("0010|0020",   // Patient ID
-                                                                 AttributeDescriptor::KEY));
+      Add(LevelDescriptor("Patient"));
+         Add(AttributeDescriptor("NumberOfChildren","#Series",0),1);   // Number of Series
+      Add(AttributeDescriptor(0x0010,0x0010,   // Patient name
+                             AttributeDescriptor::LABEL),1);
+      Add(AttributeDescriptor(0x0010,0x0040),1); // Patient sex
+      Add(AttributeDescriptor(0x0010,0x0030),1); // Patient birthday
+      Add(AttributeDescriptor(0x0010,0x0020,   // Patient ID
+                             AttributeDescriptor::IDENTIFIER),1);
  
       // Study-series level
-      GetLevelDescriptorList().push_back(LevelDescriptor("Series"));
-      GetAttributeDescriptorList(2).push_back(AttributeDescriptor("0008|0060",    // Modality
-                                                                 AttributeDescriptor::LABEL));
-      GetAttributeDescriptorList(2).push_back(AttributeDescriptor("0008|1030")); // Study Description
-      GetAttributeDescriptorList(2).push_back(AttributeDescriptor("0008|103E")); // Description
-      GetAttributeDescriptorList(2).push_back(AttributeDescriptor("0008|0080")); // Institution Name
-      GetAttributeDescriptorList(2).push_back(AttributeDescriptor("0008|0081")); // Institution Adress
-      GetAttributeDescriptorList(2).push_back(AttributeDescriptor("0008|1010")); // Station Name
-      GetAttributeDescriptorList(2).push_back(AttributeDescriptor("0008|1048")); // Physician of Record
-      GetAttributeDescriptorList(2).push_back(AttributeDescriptor("0008|1050")); // Performing Physician's Name
-      GetAttributeDescriptorList(2).push_back(AttributeDescriptor("0018|1030")); // Protocol Name
-
-      GetAttributeDescriptorList(2).push_back(AttributeDescriptor("0020|0010")); // Study ID
-      GetAttributeDescriptorList(2).push_back(AttributeDescriptor("0008|0020")); // Study Date
-      GetAttributeDescriptorList(2).push_back(AttributeDescriptor("0008|0030")); // Study Time
-      GetAttributeDescriptorList(2).push_back(AttributeDescriptor("0008|0050")); // Study Accession Number
-      GetAttributeDescriptorList(2).push_back(AttributeDescriptor("0008|0005")); // Specific character set
-      GetAttributeDescriptorList(2).push_back(AttributeDescriptor("0008|0021")); // Series Date
-      GetAttributeDescriptorList(2).push_back(AttributeDescriptor("0008|0031")); // Series time
-
-      GetAttributeDescriptorList(2).push_back(AttributeDescriptor("0020|000D",   // Study Instance UID  
-                                                                 AttributeDescriptor::KEY));
-      GetAttributeDescriptorList(2).push_back(AttributeDescriptor("0020|000E",   // Series Instance UID  
-                                                                 AttributeDescriptor::KEY | 
-                                                                 AttributeDescriptor::LABEL));
+      Add(LevelDescriptor("Series"));
+         Add(AttributeDescriptor("NumberOfChildren","#Images",0),2);   // Number of images
+      Add(AttributeDescriptor(0x0008,0x0060,    // Modality
+                             AttributeDescriptor::LABEL),2);
+      Add(AttributeDescriptor(0x0008,0x1030),2); // Study Description
+      Add(AttributeDescriptor(0x0008,0x103E),2); // Description
+      Add(AttributeDescriptor(0x0008,0x0080),2); // Institution Name
+      Add(AttributeDescriptor(0x0008,0x0081),2); // Institution Adress
+         Add(AttributeDescriptor(0x0008,0x1010),2); // Station Name
+      Add(AttributeDescriptor(0x0008,0x1048),2); // Physician of Record
+      Add(AttributeDescriptor(0x0008,0x1050),2); // Performing Physician's Name
+      Add(AttributeDescriptor(0x0018,0x1030),2); // Protocol Name
+
+      Add(AttributeDescriptor(0x0020,0x0010),2); // Study ID
+      Add(AttributeDescriptor(0x0008,0x0020),2); // Study Date
+      Add(AttributeDescriptor(0x0008,0x0030),2); // Study Time
+      Add(AttributeDescriptor(0x0008,0x0050),2); // Study Accession Number
+      Add(AttributeDescriptor(0x0008,0x0005),2); // Specific character set
+      Add(AttributeDescriptor(0x0008,0x0021),2); // Series Date
+      Add(AttributeDescriptor(0x0008,0x0031),2); // Series time
+
+      Add(AttributeDescriptor(0x0020,0x000D   // Study Instance UID  
+                                                   ),2);//AttributeDescriptor::IDENTIFIER),2);
+      Add(AttributeDescriptor(0x0020,0x000E,   // Series Instance UID  
+                                                   AttributeDescriptor::IDENTIFIER),2);
+      // |
+      //                                                   AttributeDescriptor::LABEL),2);
      
 
       // Image level
-      GetLevelDescriptorList().push_back(LevelDescriptor("Image"));
+      Add(LevelDescriptor("Image"));
 
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor("0020|0013")); // Image Number
+      Add(AttributeDescriptor(0x0020,0x0013),3); // Image Number
 
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor("0028|0010")); // Rows
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor("0028|0011")); // Columns
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor("0028|0012")); // Planes
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor("0028|0002")); // Sample per pixels
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor("0028|0008")); // Number of Frames 
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor("0028|0004")); // Photometric Interpretation
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor("0028|0103")); // Pixel Representation
+      Add(AttributeDescriptor(0x0028,0x0010),3); // Rows
+      Add(AttributeDescriptor(0x0028,0x0011),3); // Columns
+      Add(AttributeDescriptor(0x0028,0x0012),3); // Planes
+      Add(AttributeDescriptor(0x0028,0x0002),3); // Sample per pixels
+      Add(AttributeDescriptor(0x0028,0x0008),3); // Number of Frames 
+      Add(AttributeDescriptor(0x0028,0x0004),3); // Photometric Interpretation
+      Add(AttributeDescriptor(0x0028,0x0103),3); // Pixel Representation
 
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor("0020|0032")); // Image Position Patient
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor("0020|0037")); // Image Orientation Patient
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor("0020|1041")); // Slice Location
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor("0028|0006")); // Planar Configuration
+      Add(AttributeDescriptor(0x0020,0x0032),3); // Image Position Patient
+      Add(AttributeDescriptor(0x0020,0x0037),3); // Image Orientation Patient
+      Add(AttributeDescriptor(0x0020,0x1041),3); // Slice Location
+      Add(AttributeDescriptor(0x0028,0x0006),3); // Planar Configuration
 
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor("0028|0030")); // Pixel Spacing
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor("0028|0100")); // AlocatedBits
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor("0028|0101")); // StoredBits
+      Add(AttributeDescriptor(0x0028,0x0030),3); // Pixel Spacing
+      Add(AttributeDescriptor(0x0028,0x0100),3); // AlocatedBits
+      Add(AttributeDescriptor(0x0028,0x0101),3); // StoredBits
 
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor("0008|0008")); // Image Type
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor("0008|0023")); // Content Date
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor("0008|0033")); // Content Time
+      Add(AttributeDescriptor(0x0008,0x0008),3); // Image Type
+      Add(AttributeDescriptor(0x0008,0x0023),3); // Content Date
+      Add(AttributeDescriptor(0x0008,0x0033),3); // Content Time
 
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor("0020|4000")); // Image Comments
+      Add(AttributeDescriptor(0x0020,0x4000),3); // Image Comments
 
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor("0004|1500",   // File Name
-                                                                 AttributeDescriptor::LABEL));
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor("0004|1052")); // Rescale Intercept
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor("0004|1053")); // Rescale Slope
+      Add(AttributeDescriptor(0x0004,0x1500,   // File Name
+                                                   AttributeDescriptor::LABEL),3);
+      Add(AttributeDescriptor(0x0028,0x1052),3); // Rescale Intercept
+      Add(AttributeDescriptor(0x0028,0x1053),3); // Rescale Slope
 
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor("0050|0004")); // Calibration Image
+      Add(AttributeDescriptor(0x0050,0x0004),3); // Calibration Image
 
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor("0020|0052",   // Frame Reference UID
-                                                                 AttributeDescriptor::KEY));
-      GetAttributeDescriptorList(3).push_back(AttributeDescriptor("0008|0016")); // SOP Class UID
-      
+      Add(AttributeDescriptor(0x0020,0x0052   // Frame Reference UID
+                                                   ),3);
+      Add(AttributeDescriptor(0x0008,0x0016),3); // SOP Class UID
+      Add(AttributeDescriptor("FullFileName",  // Full file name
+                                                   "Full file name",
+                                                   AttributeDescriptor::IDENTIFIER),3); 
+                                                                 
      
+    }
+
+       //////////////////////////////////////////////////////////////
+       // create a descriptor (name, attributes...) from a file)       //
+       // @param : file path                                                                           //
+       // return : -                                                                                           //
+       //////////////////////////////////////////////////////////////
+       void Descriptor::createDescriptorfromFile(const std::string &i_name)
+       {
+               Clear();
+               
+               // read file and put in buffer
+               std::ifstream i_file(i_name.c_str());
+               std::stringstream buffer;
+               buffer << i_file.rdbuf();
+               std::string line;
+               bool bname;
+               int ilevel = -1;
+
+               
+               while(std::getline(buffer, line))
+               {
+                       if(line =="<level>")
+                       {       //increment levels.
+                               ilevel++;
+                               bname = true;
+                       }
+                       else if(bname)
+                       {
+                               // For each level, a name to describe it
+                               Add(LevelDescriptor(line));
+                               bname = false;
+                       }
+                       else
+                       { 
+                               // split line to find all tags
+                               std::vector<std::string> descriptors;
+                               std::string separator = " ";
+                               std::string::size_type last_pos = line.find_first_not_of(separator);
+                               //find first separator
+                               std::string::size_type pos = line.find_first_of(separator, last_pos);
+                               while(std::string::npos != pos || std::string::npos != last_pos)
+                               {
+                                       descriptors.push_back(line.substr(last_pos, pos - last_pos));
+                                       last_pos = line.find_first_not_of(separator, pos);
+                                       pos = line.find_first_of(separator, last_pos);
+                               }
+                               
+                               // By default, the last tag is at zero and not recorded but if take in count
+                               unsigned int flag = 0;
+                               if(descriptors.size() == 4)
+                               {
+                                       std::stringstream val;
+                                       val << std::dec << descriptors[3];
+                                       val>> flag;
+                               }
+
+                               // if Dicom tag, use "group" and "element" descriptor
+                               if(descriptors[0] == "D")
+                               {       std::stringstream val, val2;
+                                       unsigned short group;
+                                       unsigned short element;
+                                       val <<   std::dec << descriptors[1] ;
+                                       val >> std::hex >> group;
+                                       val2 << std::dec <<  descriptors[2];
+                                       val2 >> std::hex >> element;
+                                       Add(AttributeDescriptor( group,element,flag), ilevel);
+                               }
+
+                               else if(descriptors[0].find("#") != -1)
+                               {
+                                               // commented line continue to next line
+                               }
+                               else
+                               {       boost::algorithm::replace_all(descriptors[2],"_"," ");
+                                       Add(AttributeDescriptor( descriptors[1].c_str(),descriptors[2].c_str(),flag), ilevel);
+                               }
+                       }
+               }
+       }
+
+
+    //==================================================================
+
+    //==================================================================
+    /// Adds a LevelDescriptor at the end of the list
+    void Descriptor::Add(const LevelDescriptor& d)
+    {
+      mLevelDescriptorList.push_back(d);
+    }
+    //==================================================================
+    
+    //==================================================================  
+    /// Adds an AttributeDescriptor to level l
+    void Descriptor::Add(const AttributeDescriptor& d, int l)
+    {
+      mLevelDescriptorList[l].Add(d);
+      // TO DO : update DicomTagToName and NameToDicomTag map
+    }
+    //==================================================================
+
+    //==================================================================
+    /// Clears the Descriptor
+    void Descriptor::Clear()
+    {
+      mLevelDescriptorList.clear();
     }
     //==================================================================
 
@@ -142,11 +265,10 @@ namespace creaImageIO
               a!= l->GetAttributeDescriptorList().end();
               ++a)
            {
-             map[a->GetName()]="";
+             map[a->GetKey()]="";
            }
        }
     }
-    //==================================================================
  
   }
 }