]> Creatis software - creaBruker.git/blobdiff - lib/src1/bruker2dicom.cxx
shorten up Series Description
[creaBruker.git] / lib / src1 / bruker2dicom.cxx
index 87997d991c067abd2b43f827606ab68f7cb569da..0473bb3ac3be310019cbbc36da201c6b931604c2 100644 (file)
@@ -1,18 +1,21 @@
 #include "bruker2dicom.h"
+#include <boost/filesystem/path.hpp>
+#include <boost/filesystem/operations.hpp>
 
 #ifndef PATH_MAX // If not defined yet : do it 
-       #define PATH_MAX 2048
+   #define PATH_MAX 2048
 #endif 
 
 
 
 bool Bruker2Dicom::Execute()
 {
-   // ----- Begin Processing -----
+   // ----- Check input values -----
 
    bool bigEndian = GDCM_NAME_SPACE::Util::IsCurrentProcessorBigEndian();
  
-   if ( ! GDCM_NAME_SPACE::DirList::IsDirectory(InputDirName) )
+   //if ( ! GDCM_NAME_SPACE::DirList::IsDirectory(InputDirName) )
+   if ( ! boost::filesystem::is_directory(InputDirName) )
    {
       std::cout << "KO : [" << InputDirName << "] is not a Directory." << std::endl;
       return 0;
@@ -34,7 +37,7 @@ bool Bruker2Dicom::Execute()
    GDCM_NAME_SPACE::DirList dirList(strDirNamein, false, true); // DON'T get recursively the list of files
    std::string strDirNameout(OutputDirName);   
 
-/*   
+/*
    if (listonly)
    {
       std::cout << "------------List of found files ------------" << std::endl;
@@ -55,6 +58,7 @@ bool Bruker2Dicom::Execute()
    bool canOpen;
    std::string outputFileName;
 
+
   // BrukerDataSet br_subject;
    std::string subject;
    subject = GDCM_NAME_SPACE::Util::GetPath(*(fileNames.begin()))+
@@ -77,45 +81,43 @@ bool Bruker2Dicom::Execute()
 
   // get info for 'Study Description'
   
-  /*
-         BrukerFieldData b_protocol_location=br_acqp.GetFieldData("ACQ_protocol_location");
-         acqp_protocol_location = b_protocol_location.GetStringValue()[0];
-         cleanString(acqp_protocol_location);
-*/
+
          BrukerFieldData b_name=br_subject.GetFieldData("SUBJECT_name_string");
          std::string subject_name = b_name.GetStringValue()[0];
-        strPatientName = subject_name;
+         strPatientName = subject_name;
          cleanString(subject_name);
-        
+
          BrukerFieldData b_entry=br_subject.GetFieldData("SUBJECT_entry");
          std::string subject_entry = b_entry.GetStringValue()[0];
          //cleanString(subject_entry);
-        subject_entry = subject_entry.substr(11, subject_entry.size()-11);
-        
+         subject_entry = subject_entry.substr(11, subject_entry.size()-11);
          BrukerFieldData b_position=br_subject.GetFieldData("SUBJECT_position");
          std::string subject_position = b_position.GetStringValue()[0];
          //cleanString(subject_position);
-        subject_position = subject_position.substr(9, subject_position.size()-9);
-                        
+         subject_position = subject_position.substr(9, subject_position.size()-9);
          BrukerFieldData b_date=br_subject.GetFieldData("SUBJECT_date");
          std::string subject_date = b_date.GetStringValue()[0];
-        strStudyTimeDate = subject_date;
+         strStudyTimeDate = subject_date;
          cleanString(subject_date);
-        
          BrukerFieldData b_study_name=br_subject.GetFieldData("SUBJECT_study_name");
          std::string subject_study_name = b_study_name.GetStringValue()[0];
-        subject_study_name = subject_study_name.substr(1, subject_study_name.size()-2);         
+         subject_study_name = subject_study_name.substr(1, subject_study_name.size()-2);
          cleanString(subject_date);
-        
-   strStudyDescr = subject_name + "-" + subject_study_name + "-" + subject_entry + "-" + subject_position + "-" + subject_date;
-                
+
+   // subject_name is already in 'Patient Name' 
+   strStudyDescr = /*subject_name + "." + */ subject_study_name + "." + subject_entry + "." + subject_position + "." + subject_date;
+
    char outputDirName[(unsigned int) PATH_MAX+2];
 
    strStudyUID =  GDCM_NAME_SPACE::Util::CreateUniqueUID();
-   
+   serieNumber = 0;
    // -----------------------------------------------------
    // Iterate to ALL the objets(files/directories) found in the input directory
    // (this is level ZERO)
+   // each Directory (name : 1, 2, 3, ...) will be a Dicom Serie
    // -----------------------------------------------------
            
    GDCM_NAME_SPACE::DirListType::iterator it;
@@ -124,7 +126,7 @@ bool Bruker2Dicom::Execute()
          it != fileNames.end();
        ++it)
    {
-      if ( GDCM_NAME_SPACE::DirList::IsDirectory(*it) )
+      if ( boost::filesystem::is_directory(*it) )
       { 
          if (verbose)
             std::cout << "[" << *it << "] is a directory" << std::endl;
@@ -160,23 +162,20 @@ bool Bruker2Dicom::Execute()
          nbSlices =  b_list_size.GetIntValue()[0];
 
          strSerieDescr = GDCM_NAME_SPACE::Util::GetName(*it)
-                         + "-" + acqp_protocol_location
-                         + "-" + acqp_scan_name
-                         + "-" + acqp_method.c_str();
+                       /*  + "." + acqp_protocol_location */ // always the same (in each acquisition)
+                         + "." + acqp_scan_name
+                         + "." + acqp_method.c_str();
 
          sprintf(outputDirName, "%s%c%s", OutputDirName.c_str(), 
                           GDCM_NAME_SPACE::GDCM_FILESEPARATOR,
                           strSerieDescr.c_str() );
-                         
+  
          std::cout << " ================================================================================\n"
-                  << " ========================= [" << GDCM_NAME_SPACE::Util::GetName(*it).c_str()
-                   << acqp_protocol_location.c_str()
-                   << acqp_scan_name.c_str()
-                   << acqp_method.c_str()
-                   << "]\n"
+                   << " === [" << GDCM_NAME_SPACE::Util::GetName(*it) << "] -> [" << strSerieDescr << "]\n"
                    << " ================================================================================"
                    << std::endl;
 
+
         if (verbose)
            printf ("outputDirName [%s]\n", outputDirName);   
 
@@ -212,10 +211,11 @@ void Bruker2Dicom::DealWithNiveau1(std::string level1Directory, std::string curr
         it != fileNames.end();
       ++it)
    {
-      if ( ! GDCM_NAME_SPACE::DirList::IsDirectory(*it) )
+      if ( boost::filesystem::is_regular(*it) ) 
+      //if ( ! boost::filesystem::is_directory(*it) )
       {
          if (verbose)
-            std::cout << "--- [" << *it << "] is a file" << std::endl;
+            std::cout << "--- [" << *it << "] is a file." << std::endl;
       }  
    }
 
@@ -226,7 +226,7 @@ void Bruker2Dicom::DealWithNiveau1(std::string level1Directory, std::string curr
         it != fileNames.end();
       ++it)
    {
-      if ( GDCM_NAME_SPACE::DirList::IsDirectory(*it) )
+      if ( boost::filesystem::is_directory(*it) )
       {
          // will be always "pdata" ...
          if (verbose)
@@ -322,9 +322,9 @@ void Bruker2Dicom::DealWithNiveau2(std::string level2Directory, std::string curr
         it != fileNames.end();
       ++it)
    {
-      if ( ! GDCM_NAME_SPACE::DirList::IsDirectory(*it) )
+      if ( ! boost::filesystem::is_directory(*it) )
       { 
-         std::cout << "--- --- [" << *it << "] is a file" << std::endl;
+         std::cout << "--- --- [" << *it << "] is a file.." << std::endl;
       }
       
    }
@@ -333,7 +333,7 @@ void Bruker2Dicom::DealWithNiveau2(std::string level2Directory, std::string curr
          it != fileNames.end();
        ++it)
    {
-      if ( GDCM_NAME_SPACE::DirList::IsDirectory(*it) )
+      if ( boost::filesystem::is_directory(*it) )
       { 
   
          if (verbose)
@@ -369,7 +369,7 @@ void Bruker2Dicom::DealWithNiveau2(std::string level2Directory, std::string curr
              str_isa_func_name = b_isa_func_name.GetStringValue()[0];
              cleanString(str_isa_func_name);
 
-             sprintf(outputDirName, "%s%c%s-%s", currentOutputDirName.c_str(), 
+             sprintf(outputDirName, "%s%c%s.%s", currentOutputDirName.c_str(), 
                                           GDCM_NAME_SPACE::GDCM_FILESEPARATOR,
                                           GDCM_NAME_SPACE::Util::GetName(*it).c_str(),
              str_isa_func_name.c_str());
@@ -423,7 +423,7 @@ void Bruker2Dicom::DealWithNiveau3(std::string level3Directory, std::string curr
    sprintf(char_d3proc,"%s%c%s", level3Directory.c_str(), GDCM_NAME_SPACE::GDCM_FILESEPARATOR,"d3proc" );     
    
    if (verbose)
-      std::cout << "--- => [" << char_d3proc << "]" << std::endl;
+      std::cout << "try d3proc: --- => [" << char_d3proc << "]" << std::endl;
    std::string str_d3proc(char_d3proc);       
    canOpen = br_d3proc.LoadFile(str_d3proc);
 
@@ -452,7 +452,7 @@ void Bruker2Dicom::DealWithNiveau3(std::string level3Directory, std::string curr
     //             GDCM_NAME_SPACE::GDCM_FILESEPARATOR +
     //             "d3proc";
    if (verbose)
-      std::cout << "--- => [" << char_reco << "]" << std::endl;
+      std::cout << "try reco --- => [" << char_reco << "]" << std::endl;
    std::string str_reco(char_reco);       
    canOpen = br_reco.LoadFile(str_reco);
 
@@ -514,7 +514,7 @@ void Bruker2Dicom::DealWithNiveau3(std::string level3Directory, std::string curr
       std::cout << "FOV (ds method) " << fovX << " " << fovY << std::endl;
 
    /// \TODO probabely a more sophisticated accessor will be necessary :
-   ///  (cf : non contiguous slices, overlapping, slice thickness, space between clices, etc)
+   ///  (cf : non contiguous slices, overlapping, slice thickness, space between slices, etc)
    BrukerFieldData bsliceDistance = br_method.GetFieldData("PVM_SPackArrSliceDistance");
    double sliceDistance = bsliceDistance.GetDoubleValue()[0];
 
@@ -555,7 +555,7 @@ void Bruker2Dicom::DealWithNiveau3(std::string level3Directory, std::string curr
       exit (0);
    }
    
-   unsigned char * buffer_2dseq = new unsigned char[NX*NY*pixelSize*nbSlices*nbInstants];   
+   unsigned char *buffer_2dseq = new unsigned char[NX*NY*pixelSize*nbSlices*nbInstants];   
    ///\ TODO : find a safer way to be sure to read everything!
    size_t lgr = fread(buffer_2dseq, 1, NX*NY*pixelSize*nbSlices*nbInstants, fp);
 
@@ -563,13 +563,14 @@ void Bruker2Dicom::DealWithNiveau3(std::string level3Directory, std::string curr
    // ---------------------------
    imageSet = CreateImageSet ( );
    
+   serieNumber++;
    strSerieUID =  GDCM_NAME_SPACE::Util::CreateUniqueUID();
    if (nbInstants==1) // creer un seul fichier .mhd  pour toutes les Slices! (images natives)
    {
        std::cout << "Single instant : do not split" << std::endl;
        if (mhd)
        {
-             sprintf(outputMhdFileName, "%s%cMhdData_Toutes_les_Slices.mhd", currentOutputMhdDirName,
+             sprintf(outputMhdFileName, "%s%cMhdData_All_the_Slices.mhd", currentOutputMhdDirName,
                                          GDCM_NAME_SPACE::GDCM_FILESEPARATOR);
              fp=fopen(outputMhdFileName, "w");
              if (!fp)
@@ -591,10 +592,10 @@ void Bruker2Dicom::DealWithNiveau3(std::string level3Directory, std::string curr
                fprintf(fp, "CenterOfRotation = 0 0 0\n" );
                fprintf(fp, "ElementNumberOfChannels = 1\n" );
                fprintf(fp, "ElementType = %s\n", mhdDataPixelType.c_str() );  
-               fprintf(fp, "ElementDataFile = %s\n", "../2dseq_toutes_les_Slices" );
+               fprintf(fp, "ElementDataFile = %s\n", "../2dseq_All_the_Slices" );
                fclose(fp);     
              }
-             sprintf(output2dseqSliceFileName, "%s%c2dseq_toutes_les_Slices", 
+             sprintf(output2dseqSliceFileName, "%s%c2dseq_All_the_Slices", 
                                        currentOutputDirName.c_str(), GDCM_NAME_SPACE::GDCM_FILESEPARATOR);
              fp=fopen(output2dseqSliceFileName, "wb");
              if (!fp)
@@ -606,11 +607,12 @@ void Bruker2Dicom::DealWithNiveau3(std::string level3Directory, std::string curr
                 fwrite( buffer_2dseq, NX*NY*pixelSize, nbSlices, fp);     
              }
              fclose(fp);
+             serieNumber ++;
              strSerieUID =  GDCM_NAME_SPACE::Util::CreateUniqueUID();
        }  // end if mhd
        if (dicom)
        {
-             sprintf(output2dseqSliceFileName, "%s%c2dseq_toutes_les_Slices.dcm", 
+             sprintf(output2dseqSliceFileName, "%s%c2dseq_All_the_Slices.dcm", 
                                        currentOutputDirName.c_str(), GDCM_NAME_SPACE::GDCM_FILESEPARATOR);
               
             /* ----------- Write Dicom Image  ---------------*/
@@ -625,9 +627,9 @@ void Bruker2Dicom::DealWithNiveau3(std::string level3Directory, std::string curr
                day,
                strStudyUID,
                strSerieUID,
-              strStudyDescr,
+               strStudyDescr,
                strSerieDescr,
-              strStudyTimeDate,
+               strStudyTimeDate,
                0,// index frame number
                GDCM_NAME_SPACE::UNMODIFIED_PIXELS_IMAGE
              );
@@ -639,13 +641,13 @@ void Bruker2Dicom::DealWithNiveau3(std::string level3Directory, std::string curr
           // Interleaved !
           // it's (slice1,slide2, ...)t1 ; (slice1,slide2, ...)t2 ; ...
 
-         unsigned char * pixelsForCurrentSlice = new unsigned char[NX*NY*pixelSize*nbInstants];
+         unsigned char *pixelsForCurrentSlice = new unsigned char[NX*NY*pixelSize*nbInstants];
 
          k = 0;
          for (sliceNb=0; sliceNb<nbSlices; sliceNb++)
          {
-           if (mhd)
-           {
+            if (mhd)
+            {
                sprintf(outputMhdFileName, "%s%cMhdData_%03d.mhd", currentOutputMhdDirName, 
                                         GDCM_NAME_SPACE::GDCM_FILESEPARATOR, k  );
                if (verbose)
@@ -696,11 +698,11 @@ void Bruker2Dicom::DealWithNiveau3(std::string level3Directory, std::string curr
                fclose(fp);
 // std::cout << "end writting[" << output2dseqSliceFileName << "]" << std::endl;
             }  // end if mhd
-           
-           if (dicom)
-           {
+   
+            if (dicom)
+            {
                // desperate try !
-              /* 
+             /* 
                sprintf(output2dseqSliceFileName, "%sdummy_buffer", 
                                                  currentOutputDirName.c_str(), GDCM_NAME_SPACE::GDCM_FILESEPARATOR);
                fp=fopen(output2dseqSliceFileName, "wb");
@@ -718,23 +720,23 @@ void Bruker2Dicom::DealWithNiveau3(std::string level3Directory, std::string curr
                             1, fp);
                }
                fclose(fp);
-              
+       
                fp=fopen(output2dseqSliceFileName, "rb");
                if (!fp)
                {     
                    std::cout << "Cannot open [" << output2dseqSliceFileName << "] for reading" << std::endl;
                    exit (0);
-               }              
+               }       
                fread( pixelsForCurrentSlice,
                             frameSize*nbInstants,
                             1, fp);
                fclose(fp);
               // end of desperate try !
-              */
+              */
 
                /* ----------- Write Dicom Image  ---------------*/
-              
-              int frameSize = NX*NY*pixelSize;
+       
+               int frameSize = NX*NY*pixelSize;
                for (instantNb=0; instantNb<nbInstants; instantNb++)
                {
                   memcpy(pixelsForCurrentSlice + frameSize*instantNb, buffer_2dseq +(nbSlices*instantNb + sliceNb)*frameSize, frameSize);
@@ -756,16 +758,16 @@ void Bruker2Dicom::DealWithNiveau3(std::string level3Directory, std::string curr
                   day,
                   strStudyUID,
                   strSerieUID,
-                 strStudyDescr,
+                  strStudyDescr,
                   strSerieDescr,
-                 strStudyTimeDate,
+                  strStudyTimeDate,
                   sliceNb*nbInstants,
                   GDCM_NAME_SPACE::UNMODIFIED_PIXELS_IMAGE
                );
                if (verbose)
                   std::cout << "--- Output DCM file [" << output2dseqSliceFileName << "]" << std::endl;      
 
-           } // en if dicom
+           } // en if dicom
 
         k++;
         }
@@ -789,7 +791,7 @@ void Bruker2Dicom::DealWithNiveau3(std::string level3Directory, std::string curr
 void Bruker2Dicom::dealWithCarto(GDCM_NAME_SPACE::DirListType &fileNames, int NX, int NY, int nbSlices, 
                                  double fovX, double fovY, double sliceDistance,
                                  char *copyFile, std::string &currentOutputDirName, 
-                                char *outputMhdFileName, char *output2dseqCartoName)
+                                 char *outputMhdFileName, char *output2dseqCartoName)
 {
    // -----------------------------------------------------
    //  deal with MatLab-generated Carto file.
@@ -806,10 +808,11 @@ void Bruker2Dicom::dealWithCarto(GDCM_NAME_SPACE::DirListType &fileNames, int NX
         it != fileNames.end();
       ++it)
    {
-      if ( ! GDCM_NAME_SPACE::DirList::IsDirectory(*it) )
+      if ( boost::filesystem::is_regular(*it) )
+      //if ( ! boost::filesystem::is_directory(*it) )
       {         
          if (verbose)
-            std::cout << "--- [" << *it << "] is a file" << std::endl;
+            std::cout << "--- [" << *it << "] is a file..." << std::endl;
 
          icode = 0;
 
@@ -834,7 +837,7 @@ void Bruker2Dicom::dealWithCarto(GDCM_NAME_SPACE::DirListType &fileNames, int NX
                          << NX*NY*sizeof(double)*nbSlices << std::endl;
                   std::string lastFileName = GDCM_NAME_SPACE::Util::GetName((*it).c_str());
                if (mhd)
-              {
+               {
                   // Copy the data file in the new directory
                   sprintf(copyFile, "cp %s %s%c%s", (*it).c_str() ,
                             currentOutputDirName.c_str(),GDCM_NAME_SPACE::GDCM_FILESEPARATOR, lastFileName.c_str()); 
@@ -870,17 +873,17 @@ void Bruker2Dicom::dealWithCarto(GDCM_NAME_SPACE::DirListType &fileNames, int NX
                      fclose(fp);
                   }
                   if (verbose)
-                    std::cout << "--- end write Carto MHD file [" << outputMhdFileName << "]" << std::endl;
+                     std::cout << "--- end write Carto MHD file [" << outputMhdFileName << "]" << std::endl;
                }  // end if mhd
 
             // ----------- Write Dicom Image  ---------------
 
                if (dicom)
-              {
+               {
                   sprintf(output2dseqCartoName, "%s%c%s%s",
                                        currentOutputDirName.c_str(),GDCM_NAME_SPACE::GDCM_FILESEPARATOR, lastFileName.c_str(), ".dcm" );
                   if (verbose)
-                    std::cout << "--- end create name output2dseqCartoName file [" << output2dseqCartoName << "]" << std::endl;
+                     std::cout << "--- end create name output2dseqCartoName file [" << output2dseqCartoName << "]" << std::endl;
 
                   strSerieUID =  GDCM_NAME_SPACE::Util::CreateUniqueUID(); //New SerieUID for each carto.
                   std::string strNewSerieDescr(strSerieDescr+ "_" +GDCM_NAME_SPACE::Util::GetName((*it).c_str()));
@@ -895,9 +898,9 @@ void Bruker2Dicom::dealWithCarto(GDCM_NAME_SPACE::DirListType &fileNames, int NX
                      day,
                      strStudyUID,
                      strSerieUID,
-                    strStudyDescr,
+                     strStudyDescr,
                      strNewSerieDescr,
-                    strStudyTimeDate,
+                     strStudyTimeDate,
                      0,
                      GDCM_NAME_SPACE::CREATED_IMAGE
                   );
@@ -905,10 +908,10 @@ void Bruker2Dicom::dealWithCarto(GDCM_NAME_SPACE::DirListType &fileNames, int NX
 
                delete [] buffer_carto;
                if (verbose) 
-                    std::cout << "--- End writing Carto DICOM file [" << output2dseqCartoName << "]" << std::endl;
+                  std::cout << "--- End writing Carto DICOM file [" << output2dseqCartoName << "]" << std::endl;
                break; // don't check for more ident on same file name!
 
-           }
+            }
             icode++;
          } 
       }
@@ -925,14 +928,14 @@ bool Bruker2Dicom::CreateDirectory(std::string OutputDirName)
    if (verbose)
       std::cout << "Check for output directory :[" << OutputDirName << "]."
                 <<std::endl;
-   if ( ! GDCM_NAME_SPACE::DirList::IsDirectory(OutputDirName) )    // dirout not found
+   if ( ! boost::filesystem::is_directory(OutputDirName) )    // dirout not found
    {
-      std::string strDirNameout(OutputDirName);          // to please gcc 4
+      std::string strDirNameout(OutputDirName);        // to please gcc 4
       systemCommand = "mkdir " + strDirNameout;        // create it!
       if (verbose)
          std::cout << systemCommand << std::endl;
       system (systemCommand.c_str());
-      if ( ! GDCM_NAME_SPACE::DirList::IsDirectory(OutputDirName) ) // be sure it worked
+      if ( ! boost::filesystem::is_directory(OutputDirName) ) // be sure it worked
       {
          if (verbose) 
             std::cout << "KO : not a dir : [" << OutputDirName << "] (creation failure ?)" << std::endl;
@@ -1101,7 +1104,6 @@ std::vector<BrukerImage> Bruker2Dicom::CreateImageSet ( )
    return imageSet;
 }
 
-
 // ===========================================================================================
 
 void Bruker2Dicom::MakeDicomImage(unsigned char *tabPixels, 
@@ -1117,7 +1119,7 @@ void Bruker2Dicom::MakeDicomImage(unsigned char *tabPixels,
               std::string &serieUID,
               std::string &studyDescr,
               std::string &serieDescr,
-             std::string &strStudyTimeDate,
+              std::string &strStudyTimeDate,
               int imgNum,
               GDCM_NAME_SPACE::ImageContentType contentType 
       )