creaImageIOTreeDescriptor.cpp

Go to the documentation of this file.
00001 #include <creaImageIOTreeDescriptor.h>
00002 #include <boost/algorithm/string/split.hpp>
00003 #include <boost/algorithm/string/replace.hpp>
00004 #include <creaImageIOSystem.h>
00005 #include <boost/filesystem.hpp>
00006 
00007 
00008 #include <fstream>
00009 
00010 
00011 namespace creaImageIO
00012 {
00013 
00014   namespace tree
00015   {
00016 
00017     //==================================================================
00019     const unsigned int AttributeDescriptor::PRIVATE = 1;
00021     const unsigned int AttributeDescriptor::IDENTIFIER = 2;
00023     const unsigned int AttributeDescriptor::EDITABLE = 3;
00025     const unsigned int AttributeDescriptor::LABEL = 4;
00026     //==================================================================
00027 
00028     //==================================================================
00029     Descriptor::Descriptor()
00030     {
00031       CreateLevel0Descriptor();
00032     }
00033     //==================================================================
00034 
00035    //==================================================================
00036     Descriptor::~Descriptor()
00037     {
00038     }
00039     //==================================================================
00040 
00041     //==================================================================
00042     void Descriptor::CreateLevel0Descriptor()
00043     {
00044       Add(LevelDescriptor("Root"));
00045     }
00046     //==================================================================
00047     
00048     //==================================================================
00050     void Descriptor::CreateDefault()
00051     {
00052       // clears the existing one
00053       Clear();
00054       
00055       // Creates the level 0 descriptor 
00056       CreateLevel0Descriptor();
00057       // Creates the attribute "Name"
00058       Add(AttributeDescriptor("Name","Name",
00059                               AttributeDescriptor::LABEL),0);
00060       
00061       // Patient level
00062       Add(LevelDescriptor("Patient"));
00063       Add(AttributeDescriptor("NumberOfChildren","#Series",0),1);   // Number of Series
00064       Add(AttributeDescriptor(0x0010,0x0010,   // Patient name
00065                               AttributeDescriptor::LABEL),1);
00066       Add(AttributeDescriptor(0x0010,0x0040),1); // Patient sex
00067       Add(AttributeDescriptor(0x0010,0x0030),1); // Patient birthday
00068       Add(AttributeDescriptor(0x0010,0x0020,   // Patient ID
00069                               AttributeDescriptor::IDENTIFIER),1);
00070 
00071       // Study-series level
00072       Add(LevelDescriptor("Series"));
00073       Add(AttributeDescriptor("NumberOfChildren","#Images",0),2);   // Number of images
00074       Add(AttributeDescriptor(0x0008,0x0060,    // Modality
00075                               AttributeDescriptor::LABEL),2);
00076       Add(AttributeDescriptor(0x0008,0x1030),2); // Study Description
00077       Add(AttributeDescriptor(0x0008,0x103E),2); // Description
00078       Add(AttributeDescriptor(0x0008,0x0080),2); // Institution Name
00079       Add(AttributeDescriptor(0x0008,0x0081),2); // Institution Adress
00080       Add(AttributeDescriptor(0x0008,0x1010),2); // Station Name
00081       Add(AttributeDescriptor(0x0008,0x1048),2); // Physician of Record
00082       Add(AttributeDescriptor(0x0008,0x1050),2); // Performing Physician's Name
00083       Add(AttributeDescriptor(0x0018,0x1030),2); // Protocol Name
00084 
00085       Add(AttributeDescriptor(0x0020,0x0010),2); // Study ID
00086       Add(AttributeDescriptor(0x0008,0x0020),2); // Study Date
00087       Add(AttributeDescriptor(0x0008,0x0030),2); // Study Time
00088       Add(AttributeDescriptor(0x0008,0x0050),2); // Study Accession Number
00089       Add(AttributeDescriptor(0x0008,0x0005),2); // Specific character set
00090       Add(AttributeDescriptor(0x0008,0x0021),2); // Series Date
00091       Add(AttributeDescriptor(0x0008,0x0031),2); // Series time
00092 
00093       Add(AttributeDescriptor(0x0020,0x000D   // Study Instance UID  
00094                                                     ),2);//AttributeDescriptor::IDENTIFIER),2);
00095       Add(AttributeDescriptor(0x0020,0x000E,   // Series Instance UID  
00096                                 AttributeDescriptor::IDENTIFIER),2);
00097       // |
00098       //                        AttributeDescriptor::LABEL),2);
00099      
00100 
00101       // Image level
00102       Add(LevelDescriptor("Image"));
00103 
00104       Add(AttributeDescriptor(0x0020,0x0013),3); // Image Number
00105 
00106       Add(AttributeDescriptor(0x0028,0x0010),3); // Rows
00107       Add(AttributeDescriptor(0x0028,0x0011),3); // Columns
00108       Add(AttributeDescriptor(0x0028,0x0012),3); // Planes
00109       Add(AttributeDescriptor(0x0028,0x0002),3); // Sample per pixels
00110       Add(AttributeDescriptor(0x0028,0x0008),3); // Number of Frames 
00111       Add(AttributeDescriptor(0x0028,0x0004),3); // Photometric Interpretation
00112       Add(AttributeDescriptor(0x0028,0x0103),3); // Pixel Representation
00113 
00114       Add(AttributeDescriptor(0x0020,0x0032),3); // Image Position Patient
00115       Add(AttributeDescriptor(0x0020,0x0037),3); // Image Orientation Patient
00116       Add(AttributeDescriptor(0x0020,0x1041),3); // Slice Location
00117       Add(AttributeDescriptor(0x0028,0x0006),3); // Planar Configuration
00118 
00119       Add(AttributeDescriptor(0x0028,0x0030),3); // Pixel Spacing
00120       Add(AttributeDescriptor(0x0028,0x0100),3); // AlocatedBits
00121       Add(AttributeDescriptor(0x0028,0x0101),3); // StoredBits
00122 
00123       Add(AttributeDescriptor(0x0008,0x0008),3); // Image Type
00124       Add(AttributeDescriptor(0x0008,0x0023),3); // Content Date
00125       Add(AttributeDescriptor(0x0008,0x0033),3); // Content Time
00126 
00127       Add(AttributeDescriptor(0x0020,0x4000),3); // Image Comments
00128 
00129       Add(AttributeDescriptor(0x0004,0x1500,   // File Name
00130                                 AttributeDescriptor::LABEL),3);
00131       Add(AttributeDescriptor(0x0028,0x1052),3); // Rescale Intercept
00132       Add(AttributeDescriptor(0x0028,0x1053),3); // Rescale Slope
00133 
00134       Add(AttributeDescriptor(0x0050,0x0004),3); // Calibration Image
00135 
00136       Add(AttributeDescriptor(0x0020,0x0052   // Frame Reference UID
00137                                            ),3);
00138       Add(AttributeDescriptor(0x0008,0x0016),3); // SOP Class UID
00139       Add(AttributeDescriptor("FullFileName",  // Full file name
00140                                 "Full file name",
00141                                 AttributeDescriptor::IDENTIFIER),3); 
00142 
00143     }
00144 
00146         // create a descriptor (name, attributes...) from a file)       //
00147         // @param : file path                                           //
00148         // return : -                                                   //
00150         void Descriptor::createDescriptorfromFile(const std::string &i_name)
00151         {
00152                 Clear();
00153                 
00154                 // read file and put in buffer
00155                 std::ifstream i_file(i_name.c_str());
00156                 std::stringstream buffer;
00157                 buffer << i_file.rdbuf();
00158                 std::string line;
00159                 bool bname;
00160                 int ilevel = -1;
00161 
00162                 
00163                 while(std::getline(buffer, line))
00164                 {
00165                         if(line =="<level>")
00166                         {       //increment levels.
00167                                 ilevel++;
00168                                 bname = true;
00169                         }
00170                         else if(bname)
00171                         {
00172                                 // For each level, a name to describe it
00173                                 Add(LevelDescriptor(line));
00174                                 bname = false;
00175                         }
00176                         else if(line.empty()) // to avoid end line
00177                         {
00178                                 return;
00179                         }
00180                         else
00181                         { 
00182                                 // split line to find all tags
00183                                 std::vector<std::string> descriptors;
00184                                 std::string separator = " ";
00185                                 std::string::size_type last_pos = line.find_first_not_of(separator);
00186                                 //find first separator
00187                                 std::string::size_type pos = line.find_first_of(separator, last_pos);
00188                                 while(std::string::npos != pos || std::string::npos != last_pos)
00189                                 {
00190                                         descriptors.push_back(line.substr(last_pos, pos - last_pos));
00191                                         last_pos = line.find_first_not_of(separator, pos);
00192                                         pos = line.find_first_of(separator, last_pos);
00193                                 }
00194                                 
00195                                 // By default, the last tag is at zero and not recorded but if take in count
00196                                 unsigned int flag = 0;
00197                                 if(descriptors.size() == 4)
00198                                 {
00199                                         std::stringstream val;
00200                                         val << std::dec << descriptors[3];
00201                                         val>> flag;
00202                                 }
00203 
00204                                 // if Dicom tag, use "group" and "element" descriptor
00205                                 if(descriptors[0] == "D")
00206                                 {       std::stringstream val, val2;
00207                                         unsigned short group;
00208                                         unsigned short element;
00209                                         val <<   std::dec << descriptors[1] ;
00210                                         val >> std::hex >> group;
00211                                         val2 << std::dec <<  descriptors[2];
00212                                         val2 >> std::hex >> element;
00213                                         Add(AttributeDescriptor( group,element,flag), ilevel);
00214                                 }
00215 
00216                                 else if(descriptors[0].find("#") != -1)
00217                                 {
00218                                         // commented line continue to next line
00219                                 }
00220                                 else
00221                                 {       boost::algorithm::replace_all(descriptors[2],"_"," ");
00222                                         Add(AttributeDescriptor( descriptors[1].c_str(),descriptors[2].c_str(),flag), ilevel);
00223                                 }
00224                         }
00225                 }
00226         }
00227 
00228     //==================================================================
00229 
00230     //==================================================================
00232     void Descriptor::Add(const LevelDescriptor& d)
00233     {
00234       mLevelDescriptorList.push_back(d);
00235     }
00236     //==================================================================
00237     
00238     //==================================================================  
00240     void Descriptor::Add(const AttributeDescriptor& d, int l)
00241     {
00242       mLevelDescriptorList[l].Add(d);
00243       // TO DO : update DicomTagToName and NameToDicomTag map
00244     }
00245     //==================================================================
00246 
00247     //==================================================================
00249     void Descriptor::Clear()
00250     {
00251       mLevelDescriptorList.clear();
00252     }
00253 
00254     //==================================================================
00255 
00256     //==================================================================
00258     void Descriptor::BuildAttributeMap( std::map<std::string,std::string>& map ) const
00259     {
00260       map.clear();
00261       LevelDescriptorListType::const_iterator l;
00262       for (l = GetLevelDescriptorList().begin();
00263            l!= GetLevelDescriptorList().end();
00264            ++l)
00265         {
00266           LevelDescriptor::AttributeDescriptorListType::const_iterator a;
00267           for (a = l->GetAttributeDescriptorList().begin();
00268                a!= l->GetAttributeDescriptorList().end();
00269                ++a)
00270             {
00271               map[a->GetKey()]="";
00272             }
00273         }
00274     }
00275 
00276         
00277     //==================================================================
00278         // test if an attribute is present in DescriptionList
00279         // return level's name
00280         const std::string Descriptor::isExist(const std::string i_attr)
00281         {
00282                 std::string name = "";
00283                 LevelDescriptorListType::const_iterator l = GetLevelDescriptorList().begin();
00284                 for (;     l!= GetLevelDescriptorList().end(); ++l)
00285                 {
00286                         LevelDescriptor::AttributeDescriptorListType::const_iterator a = l->GetAttributeDescriptorList().begin();
00287                 for(;a!= l->GetAttributeDescriptorList().end(); ++a)
00288                         {
00289                                 if (a->GetKey() == i_attr)
00290                                 {
00291                                         name = l->GetName();
00292                                         break;
00293                                 }
00294                         }
00295                 }
00296                 return name.c_str();
00297         }
00298   }
00299 }