]> Creatis software - creaBruker.git/blobdiff - lib/src1/bruker2dicom.cxx
Fix 'AdjResult' dir troubles
[creaBruker.git] / lib / src1 / bruker2dicom.cxx
index 66d2c9e0576316d90c3c3fdeab6067f48c5ec448..961c8e7e9a2891622fe588db9b4780919e2816e8 100644 (file)
@@ -68,25 +68,24 @@ bool Bruker2Dicom::Execute()
        acqpFound= true;
     else
        acqpFound = false; // user passed a 'non study' directory; Hope it's a 'set of studies' directory!
-       
-   int type;    
+
+   int type;
    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: {  
-         std::cout << " user passed a 'non study' directory; Hope it's a 'set of studies' directory!, not yet dealt with" << std::endl;
-       }
+      }
+
+      case 3: {
+         std::cout << " user passed a 'non study' directory; Hope it's a *non recursive* 'set of studies' directory! (recursive 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;  
@@ -136,6 +194,8 @@ void Bruker2Dicom::DealWithSingleStudyDirectory (GDCM_NAME_SPACE::DirListType &f
 
     if (subjectFound)
     {
+    
+ std::cout << "===================================--===========nom dir [" << tempStringPatDir << "] subjectFound, studyName : " << subject_study_name<< std::endl;
        BrukerFieldData b_entry=br_subject.GetFieldData("SUBJECT_entry");
        subject_entry = b_entry.GetStringValue()[0];
        //cleanString(subject_entry);
@@ -158,6 +218,8 @@ void Bruker2Dicom::DealWithSingleStudyDirectory (GDCM_NAME_SPACE::DirListType &f
    }
    else  // Desperate trick when file 'subject' is missing
    {
+
+ std::cout << "==============================================nom dir [" << tempStringPatDir << "] subjectFound" << std::endl;
       subject_entry      = "HeadFirst";            // Why not?
       subject_position   = "Supine";               // Why not?
       strStudyTimeDate   = "06_06_06_6_June_1666"; // Why not?
@@ -190,6 +252,7 @@ void Bruker2Dicom::DealWithSingleStudyDirectory (GDCM_NAME_SPACE::DirListType &f
    // each Directory (name : 1, 2, 3, ...) will be a Dicom Serie
    // -----------------------------------------------------
  
+   /// \TODO better use directory iterator, from boost! // JPR
    GDCM_NAME_SPACE::DirListType::iterator it;
 
    for (it = fileNames.begin();
@@ -201,7 +264,8 @@ void Bruker2Dicom::DealWithSingleStudyDirectory (GDCM_NAME_SPACE::DirListType &f
          if (verbose)
             std::cout << "[" << *it << "] is a directory" << std::endl;
 
-        if((*it) == "AdjStatePerStudy")  // avoid trouble with new version 'AdjStatePerStudy' directory
+        //if((*it) == "AdjResult")  // avoid trouble with new version 'AdjResult' directory
+        if(GDCM_NAME_SPACE::Util::GetName(*it) == "AdjResult")
            continue;
 
          //BrukerDataSet br_acqp;
@@ -246,7 +310,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() );
   
@@ -330,7 +394,7 @@ void Bruker2Dicom::DealWithNiveau1(std::string &level1Directory, std::string &cu
          sprintf(outputDirName, "%s%c%s", currentOutputDirName.c_str(),
                                           GDCM_NAME_SPACE::GDCM_FILESEPARATOR,
                                           GDCM_NAME_SPACE::Util::GetName(*it).c_str());
-        std::string strOutputDirName(outputDirName);
+         std::string strOutputDirName(outputDirName);
          //br1.PrintSelf();
 
           std::string strMethod;
@@ -694,8 +758,8 @@ void Bruker2Dicom::DealWithNiveau3(std::string &level3Directory, std::string &cu
    {
       sprintf(currentOutputMhdDirName, "%s%c%s", currentOutputDirName.c_str(),
                                GDCM_NAME_SPACE::GDCM_FILESEPARATOR, "MhdFiles");
-      std::string strCurrentOutputMhdDirName(currentOutputMhdDirName);
 
+      std::string strCurrentOutputMhdDirName(currentOutputMhdDirName);
       res = CreateDirectory( strCurrentOutputMhdDirName );
       if (!res) {
          std::cout << "[" << currentOutputDirName << "] Directory creation failure " << std::endl;
@@ -786,7 +850,7 @@ void Bruker2Dicom::DealWithNiveau3(std::string &level3Directory, std::string &cu
                fprintf(fp, "DimSize = %d %d %d\n", NX, NY, nbSlices );
                fprintf(fp, "HeaderSize = %d\n", 0);
                //fprintf(fp, "ElementSpacing = %lf %lf %lf\n",fovX/NY, fovY/NY, sliceDistance );
-              fprintf(fp, "ElementSpacing = %lf %lf %lf\n", spatResolX, spatResolY, sliceDistance );
+               fprintf(fp, "ElementSpacing = %lf %lf %lf\n", spatResolX, spatResolY, sliceDistance );
                fprintf(fp, "Position = 0 0 %d\n", 0 );
                fprintf(fp, "Offset = 0 0 0\n" );
                fprintf(fp, "CenterOfRotation = 0 0 0\n" );
@@ -900,6 +964,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 +1298,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")