]> Creatis software - creaBruker.git/commitdiff
Deal with multi study directory
authorjean-pierre roux <jean-pierre.roux@creatis.insa-lyon.fr>
Thu, 22 Apr 2010 22:23:13 +0000 (22:23 +0000)
committerjean-pierre roux <jean-pierre.roux@creatis.insa-lyon.fr>
Thu, 22 Apr 2010 22:23:13 +0000 (22:23 +0000)
lib/src1/bruker2dicom.cxx
lib/src1/bruker2dicom.h

index 66d2c9e0576316d90c3c3fdeab6067f48c5ec448..05695f43927ab5da979b16a535df6c41b20dea40 100644 (file)
@@ -73,20 +73,19 @@ bool Bruker2Dicom::Execute()
    if  (subjectFound )  type = 1; // user passed a 'study
    else if  (acqpFound) type = 2; // user passed a 'serie' 
    else                 type = 3; // user passed a 'non study' directory; Hope it's a 'set of studies' directory!
-/* */
+ /* */
 
 
    // 1 : if subjectFound                       : user passed a Single Study Directory
    // 2 : if NOT subjectFound and acqpFound     : user passed a Serie Directory
    // 3 : if NOT subjectFound and NOT acqpFound : user passed a 'non Study Directory' (Hope it's a set of Single Study Directories)
    
-  // int type = CheckUserDirectory(InputDirName);
+   //int type = CheckUserDirectory(InputDirName);
  
    switch (type)
    {
       case 1: {   
-         bool canOpen;
-         canOpen =br_subject.LoadFile(subject);
+         bool canOpen = br_subject.LoadFile(subject);
          if (!canOpen)
          {
             std::cout << "Hopeless! 'subject' found / cannot be open" << std::endl;
@@ -100,27 +99,86 @@ bool Bruker2Dicom::Execute()
 
   // get info for 'Study Description'  
 
-          BrukerFieldData b_name=br_subject.GetFieldData("SUBJECT_name_string");
-          subject_name = b_name.GetStringValue()[0];
-          strPatientName = subject_name;
-          cleanString(subject_name);
-          DealWithSingleStudyDirectory (fileNames); 
-          break;
-       }
+         BrukerFieldData b_name=br_subject.GetFieldData("SUBJECT_name_string");
+         subject_name = b_name.GetStringValue()[0];
+         strPatientName = subject_name;
+         cleanString(subject_name);
+         DealWithSingleStudyDirectory (fileNames); 
+         break;
+      }
 
-       case 2: {    
+      case 2: {    
            subject_name = "defaultPatName";
           strPatientName = subject_name;
            DealWithSingleStudyDirectory (fileNames);
           break;
-       }
+      }
    
-       case 3: {  
+      case 3: {  
          std::cout << " user passed a 'non study' directory; Hope it's a 'set of studies' directory!, not yet dealt with" << std::endl;
-       }
+        DealWithMultiStudyDirectory (fileNames);
+        break;
+      }
    }
 }
 
+// ----------------------------------------------------------------------------------------------------------
+
+void Bruker2Dicom::DealWithMultiStudyDirectory (GDCM_NAME_SPACE::DirListType &dirNames)
+{
+   GDCM_NAME_SPACE::DirListType::iterator it;
+
+   for (it = dirNames.begin();
+         it != dirNames.end();
+       ++it)
+   {
+      if ( boost::filesystem::is_directory(*it) )
+      { 
+         if (verbose)
+            std::cout << "[" << *it << "] is a directory" << std::endl;
+
+         GDCM_NAME_SPACE::DirList dirList(*it, false, true); // DON'T get recursively the list of files
+         GDCM_NAME_SPACE::DirListType fileNames;
+         fileNames = dirList.GetFilenames();
+        
+         std::string path = GDCM_NAME_SPACE::Util::GetPath(*(fileNames.begin()));
+         std::string subject =  path +
+                                GDCM_NAME_SPACE::GDCM_FILESEPARATOR +
+                                "subject";
+         if (! boost::filesystem::is_regular(subject) )
+         {
+           std::cout << "no [" << subject << "] file found" << std::endl;
+           continue;
+         }
+                  
+         bool canOpen = br_subject.LoadFile(subject);
+         if (!canOpen)
+         {
+            std::cout << "Hopeless! 'subject' found / cannot be open" << std::endl;
+            throw ( BrukerHopelessException ("Hopeless! 'subject' found in root input directory / cannot be open"));
+         }
+         else
+         {
+            br_subject.FillMap();
+         }
+          
+         BrukerFieldData b_name=br_subject.GetFieldData("SUBJECT_name_string");
+         subject_name = b_name.GetStringValue()[0];
+         strPatientName = subject_name;
+         cleanString(subject_name);     
+         
+         DealWithSingleStudyDirectory(fileNames);   
+      }
+      else
+      {
+         if (verbose)
+            std::cout << "[" << *it << "] is NOT a directory; skipped!" << std::endl; 
+      }   
+   } 
+}
+
+// ----------------------------------------------------------------------------------------------------------
+
 void Bruker2Dicom::DealWithSingleStudyDirectory (GDCM_NAME_SPACE::DirListType &fileNames)
 {
      bool res;  
@@ -246,7 +304,7 @@ void Bruker2Dicom::DealWithSingleStudyDirectory (GDCM_NAME_SPACE::DirListType &f
                          + "." + acqp_scan_name
                          + "." + acqp_method.c_str();
 
-         sprintf(outputDirName, "%s%c%s", tempStringStudyDir.c_str(),                //OutputDirName.c_str(), 
+         sprintf(outputDirName, "%s%c%s", tempStringStudyDir.c_str(),      //OutputDirName.c_str(), 
                           GDCM_NAME_SPACE::GDCM_FILESEPARATOR,
                           strSerieDescr.c_str() );
   
@@ -900,6 +958,7 @@ void Bruker2Dicom::DealWithNiveau3(std::string &level3Directory, std::string &cu
                             1, fp);
                }
                fclose(fp);
+              
 // std::cout << "end writting[" << output2dseqSliceFileName << "]" << std::endl;
             }  // end if mhd
    
@@ -1233,11 +1292,8 @@ void Bruker2Dicom::cleanString(std::string &s)
    GDCM_NAME_SPACE::Util::ReplaceSpecChar(s, repChar);
 }
 
-
-
 // ===========================================================================================
 
-
 void Bruker2Dicom::getImhDataType(BrukerFieldData &bDPT, std::string &mhdDataPixelType, int &pixelSize)
 { 
    if(bDPT.GetDataType() == "string")
index 76290d66c3d9732ba8c86b207cbf275446ba6927..31460269e3a3c471d49e93eef4abca7a8cd693ce 100644 (file)
@@ -76,7 +76,7 @@ void cleanString(std::string &s);
 bool CreateDirectory(std::string &dirNameout);
 
 int CheckUserDirectory(std::string &userDirName);
-
+void DealWithMultiStudyDirectory(GDCM_NAME_SPACE::DirListType &fileNames);
 void DealWithSingleStudyDirectory(GDCM_NAME_SPACE::DirListType &fileNames);
 void DealWithNiveau1(std::string &level1Directory, std::string &currentOutputDirName);
 void DealWithNiveau2(std::string &level2Directory, std::string &currentOutputDirName);