X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src2%2FcreaImageIOTreeDescriptor.cpp;h=30c8b7aa8ba32fa15d9b81ba01d122bb23d7d485;hb=6685b940296e57d4e3803765b986a6fe18d9be41;hp=03cfa41289ee328d6f590e0cafb3e12d75c469f7;hpb=f08880c40f6304be640c7f8702bbbe96f8d50b40;p=creaImageIO.git diff --git a/src2/creaImageIOTreeDescriptor.cpp b/src2/creaImageIOTreeDescriptor.cpp index 03cfa41..30c8b7a 100644 --- a/src2/creaImageIOTreeDescriptor.cpp +++ b/src2/creaImageIOTreeDescriptor.cpp @@ -1,4 +1,11 @@ #include +#include +#include +#include +#include + + +#include namespace creaImageIO @@ -12,6 +19,9 @@ namespace creaImageIO 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,95 +50,203 @@ namespace creaImageIO void Descriptor::CreateDefault() { // clears the existing one - GetLevelDescriptorList().clear(); + Clear(); // Creates the level 0 descriptor CreateLevel0Descriptor(); // Creates the attribute "Name" - GetLevelDescriptor(0).Add(AttributeDescriptor("Name","Name", - AttributeDescriptor::LABEL)); + Add(AttributeDescriptor("Name","Name", + AttributeDescriptor::LABEL),0); // Patient level - GetLevelDescriptorList().push_back(LevelDescriptor("Patient")); - GetLevelDescriptor(1).Add(AttributeDescriptor(0x0010,0x0010, // Patient name - AttributeDescriptor::LABEL)); - GetLevelDescriptor(1).Add(AttributeDescriptor(0x0010,0x0040)); // Patient sex - GetLevelDescriptor(1).Add(AttributeDescriptor(0x0010,0x0030)); // Patient birthday - GetLevelDescriptor(1).Add(AttributeDescriptor(0x0010,0x0020, // Patient ID - AttributeDescriptor::IDENTIFIER)); + 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")); - GetLevelDescriptor(2).Add(AttributeDescriptor(0x0008,0x0060, // Modality - AttributeDescriptor::LABEL)); - GetLevelDescriptor(2).Add(AttributeDescriptor(0x0008,0x1030)); // Study Description - GetLevelDescriptor(2).Add(AttributeDescriptor(0x0008,0x103E)); // Description - GetLevelDescriptor(2).Add(AttributeDescriptor(0x0008,0x0080)); // Institution Name - GetLevelDescriptor(2).Add(AttributeDescriptor(0x0008,0x0081)); // Institution Adress - GetLevelDescriptor(2).Add(AttributeDescriptor(0x0008,0x1010)); // Station Name - GetLevelDescriptor(2).Add(AttributeDescriptor(0x0008,0x1048)); // Physician of Record - GetLevelDescriptor(2).Add(AttributeDescriptor(0x0008,0x1050)); // Performing Physician's Name - GetLevelDescriptor(2).Add(AttributeDescriptor(0x0018,0x1030)); // Protocol Name - - GetLevelDescriptor(2).Add(AttributeDescriptor(0x0020,0x0010)); // Study ID - GetLevelDescriptor(2).Add(AttributeDescriptor(0x0008,0x0020)); // Study Date - GetLevelDescriptor(2).Add(AttributeDescriptor(0x0008,0x0030)); // Study Time - GetLevelDescriptor(2).Add(AttributeDescriptor(0x0008,0x0050)); // Study Accession Number - GetLevelDescriptor(2).Add(AttributeDescriptor(0x0008,0x0005)); // Specific character set - GetLevelDescriptor(2).Add(AttributeDescriptor(0x0008,0x0021)); // Series Date - GetLevelDescriptor(2).Add(AttributeDescriptor(0x0008,0x0031)); // Series time - - GetLevelDescriptor(2).Add(AttributeDescriptor(0x0020,0x000D // Study Instance UID - ));//AttributeDescriptor::IDENTIFIER)); - GetLevelDescriptor(2).Add(AttributeDescriptor(0x0020,0x000E, // Series Instance UID - AttributeDescriptor::IDENTIFIER)); + 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)); + // AttributeDescriptor::LABEL),2); // Image level - GetLevelDescriptorList().push_back(LevelDescriptor("Image")); + Add(LevelDescriptor("Image")); - GetLevelDescriptor(3).Add(AttributeDescriptor(0x0020,0x0013)); // Image Number + Add(AttributeDescriptor(0x0020,0x0013),3); // Image Number - GetLevelDescriptor(3).Add(AttributeDescriptor(0x0028,0x0010)); // Rows - GetLevelDescriptor(3).Add(AttributeDescriptor(0x0028,0x0011)); // Columns - GetLevelDescriptor(3).Add(AttributeDescriptor(0x0028,0x0012)); // Planes - GetLevelDescriptor(3).Add(AttributeDescriptor(0x0028,0x0002)); // Sample per pixels - GetLevelDescriptor(3).Add(AttributeDescriptor(0x0028,0x0008)); // Number of Frames - GetLevelDescriptor(3).Add(AttributeDescriptor(0x0028,0x0004)); // Photometric Interpretation - GetLevelDescriptor(3).Add(AttributeDescriptor(0x0028,0x0103)); // 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 - GetLevelDescriptor(3).Add(AttributeDescriptor(0x0020,0x0032)); // Image Position Patient - GetLevelDescriptor(3).Add(AttributeDescriptor(0x0020,0x0037)); // Image Orientation Patient - GetLevelDescriptor(3).Add(AttributeDescriptor(0x0020,0x1041)); // Slice Location - GetLevelDescriptor(3).Add(AttributeDescriptor(0x0028,0x0006)); // 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 - GetLevelDescriptor(3).Add(AttributeDescriptor(0x0028,0x0030)); // Pixel Spacing - GetLevelDescriptor(3).Add(AttributeDescriptor(0x0028,0x0100)); // AlocatedBits - GetLevelDescriptor(3).Add(AttributeDescriptor(0x0028,0x0101)); // StoredBits + Add(AttributeDescriptor(0x0028,0x0030),3); // Pixel Spacing + Add(AttributeDescriptor(0x0028,0x0100),3); // AlocatedBits + Add(AttributeDescriptor(0x0028,0x0101),3); // StoredBits - GetLevelDescriptor(3).Add(AttributeDescriptor(0x0008,0x0008)); // Image Type - GetLevelDescriptor(3).Add(AttributeDescriptor(0x0008,0x0023)); // Content Date - GetLevelDescriptor(3).Add(AttributeDescriptor(0x0008,0x0033)); // Content Time + Add(AttributeDescriptor(0x0008,0x0008),3); // Image Type + Add(AttributeDescriptor(0x0008,0x0023),3); // Content Date + Add(AttributeDescriptor(0x0008,0x0033),3); // Content Time - GetLevelDescriptor(3).Add(AttributeDescriptor(0x0020,0x4000)); // Image Comments + Add(AttributeDescriptor(0x0020,0x4000),3); // Image Comments - GetLevelDescriptor(3).Add(AttributeDescriptor(0x0004,0x1500, // File Name - AttributeDescriptor::LABEL)); - GetLevelDescriptor(3).Add(AttributeDescriptor(0x0028,0x1052)); // Rescale Intercept - GetLevelDescriptor(3).Add(AttributeDescriptor(0x0028,0x1053)); // 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 - GetLevelDescriptor(3).Add(AttributeDescriptor(0x0050,0x0004)); // Calibration Image + Add(AttributeDescriptor(0x0050,0x0004),3); // Calibration Image - GetLevelDescriptor(3).Add(AttributeDescriptor(0x0020,0x0052 // Frame Reference UID - )); - GetLevelDescriptor(3).Add(AttributeDescriptor(0x0008,0x0016)); // SOP Class UID - GetLevelDescriptor(3).Add(AttributeDescriptor("FullFileName", // Full file name + 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)); + 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 =="") + { //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 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(); } //================================================================== @@ -151,7 +269,6 @@ namespace creaImageIO } } } - //================================================================== } }