]> Creatis software - clitk.git/blobdiff - tools/clitkDicom2Image.cxx
Add instanceNumber sorting for clitkDicom2Image
[clitk.git] / tools / clitkDicom2Image.cxx
index 066aaf84d3b98b61d090a0f359d671084145e6a7..e705f85ca7e68fb6dd2a733cb67a3ea252f73d23 100644 (file)
@@ -60,7 +60,7 @@ int main(int argc, char * argv[])
   //Get GDCMSeriesFileNames order to sort filenames
   typedef itk::GDCMSeriesFileNames NamesGeneratorType;
   NamesGeneratorType::Pointer nameGenerator = NamesGeneratorType::New();
-  nameGenerator->SetUseSeriesDetails(true);
+  nameGenerator->SetUseSeriesDetails(false);
   std::string folderName=".";
   const size_t last_slash_idx = input_files[0].rfind('/');
   if (std::string::npos != last_slash_idx)
@@ -74,6 +74,7 @@ int main(int argc, char * argv[])
   std::map< std::string, std::vector<double> > theorigin;
   std::map< std::string, std::vector<double> > theorientation;
   std::map< std::string, std::vector<double> > sliceLocations;
+  std::map< std::string, std::vector<double> > instanceNumber;
   std::map< std::string, std::vector<std::string> > seriesFiles;
 #if GDCM_MAJOR_VERSION >= 2
   if (args_info.verbose_flag)
@@ -115,6 +116,10 @@ int main(int argc, char * argv[])
       sliceLocations[series_UID].push_back(theorigin[series_UID][2]);
     seriesFiles[series_UID].push_back(input_files[i]);
 
+    gdcm::Attribute<0x20,0x0013> instanceNumber_att;
+    instanceNumber_att.SetFromDataSet(ds);
+    instanceNumber[series_UID].push_back(instanceNumber_att.GetValue());
+
     gdcm::Attribute<0x28, 0x100> pixel_size;
     pixel_size.SetFromDataSet(ds);
     /* if (pixel_size.GetValue() != 16)
@@ -154,23 +159,31 @@ int main(int argc, char * argv[])
   while ( sn != series_UIDs.end() ) {
     std::vector<double> locs = sliceLocations[*sn];
     std::vector<double> origin = theorigin[*sn];
+    std::vector<double> instanceNumberSerie = instanceNumber[*sn];
     std::vector<std::string> files = seriesFiles[*sn];
-    std::vector<int> sliceIndex;
+    std::vector<int> sliceIndex(files.size());
     //clitk::GetSortedIndex(locs, sliceIndex);
     //Look for files into GDCMSeriesFileNames, because it sorts files correctly and take the order
     const std::vector<std::string> & temp = nameGenerator->GetFileNames(*sn);
     for(unsigned int i=0; i<files.size(); i++) {
       int j(0);
-      while (sliceIndex.size()==i && j<temp.size()) {
+      bool found(false);
+      while (!found && j<temp.size()) {
         const size_t last_slash_idx2 = temp[j].rfind('/');
         std::string tempFilename(temp[j]);
-        if (temp[j][0] == '.' && std::string::npos != last_slash_idx2)
-          tempFilename = temp[j].substr(last_slash_idx2+1, temp[j].size()-1);
-        if (tempFilename == files[i])
-          sliceIndex.push_back(j);
+        if (temp[j][0] == '.' && temp[j][1] == '/')
+          tempFilename = temp[j].substr(2, temp[j].size()-1);
+        if (tempFilename == files[i]) {
+          sliceIndex[j] = i;
+          found = true;
+        }
         ++j;
       }
     }
+    if (sliceIndex.size() == 0) { //ie. sn is not a serie present in files
+      sn++;
+      continue;
+    }
 
     if (args_info.verbose_flag) {
       std::cout << locs[sliceIndex[0]] << " -> "
@@ -216,8 +229,22 @@ int main(int argc, char * argv[])
     // Create ordered vector of filenames
     std::vector<std::string> sorted_files;
     sorted_files.resize(sliceIndex.size());
-    for(unsigned int i=0; i<sliceIndex.size(); i++)
-      sorted_files[i] = files[ sliceIndex[i] ];
+    if (!args_info.instanceNumber_flag) {
+      for(unsigned int i=0; i<sliceIndex.size(); i++)
+        sorted_files[i] = files[ sliceIndex[i] ];
+    } else {
+      std::vector<double>::iterator maxInstanceNumber = std::max_element(instanceNumberSerie.begin(), instanceNumberSerie.end());
+      std::vector<std::string> instanceNumberTemp(*maxInstanceNumber, "");
+      for(unsigned int i=0; i<instanceNumberSerie.size(); i++)
+        instanceNumberTemp[instanceNumberSerie[i]-1] = files[i];
+      unsigned int fillFiles(0);
+      for(unsigned int i=0; i<instanceNumberTemp.size(); i++) {
+          if (instanceNumberTemp[i] != "") {
+            sorted_files[fillFiles] = instanceNumberTemp[i];
+            ++fillFiles;
+          }
+       }
+    }
 
     //===========================================
     // Read write serie