]> Creatis software - creaBruker.git/blobdiff - lib/src1/brukerdataset.cpp
Feature #1767
[creaBruker.git] / lib / src1 / brukerdataset.cpp
index 3a6056b22f939078b224288ffa0772d3d5f411be..f4cdc7087cd48bc8da4ac2b28be61cfbde9342c2 100644 (file)
@@ -1,3 +1,30 @@
+/*
+       # ---------------------------------------------------------------------
+       #
+       # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image 
+       #                        pour la Santé)
+       # Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
+       # Previous Authors : Laurent Guigues, Jean-Pierre Roux
+       # CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
+       #
+       #  This software is governed by the CeCILL-B license under French law and 
+       #  abiding by the rules of distribution of free software. You can  use, 
+       #  modify and/ or redistribute the software under the terms of the CeCILL-B 
+       #  license as circulated by CEA, CNRS and INRIA at the following URL 
+       #  http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html 
+       #  or in the file LICENSE.txt.
+       #
+       #  As a counterpart to the access to the source code and  rights to copy,
+       #  modify and redistribute granted by the license, users are provided only
+       #  with a limited warranty  and the software's author,  the holder of the
+       #  economic rights,  and the successive licensors  have only  limited
+       #  liability. 
+       #
+       #  The fact that you are presently reading this means that you have had
+       #  knowledge of the CeCILL-B license and that you accept its terms.
+       # ------------------------------------------------------------------------
+*/
+       
 //
 // C++ Implementation: brukerdataset
 //
@@ -21,7 +48,7 @@ BrukerDataSet::BrukerDataSet(){}
 BrukerDataSet::~BrukerDataSet(){}
 
 
-bool BrukerDataSet::LoadFile(std::string& fileToRead)
+bool BrukerDataSet::LoadFile(std::string fileToRead)
 {
 
 //std::cout <<
@@ -67,11 +94,42 @@ bool BrukerDataSet::BoolMatchBufferForText(std::string& file, const boost::regex
 {
   boost::cmatch what;
   if (regex_match(file.c_str(), what, RegExp)) 
-    return true;
+  return true;
   return false;
 }
 
+std::string BrukerDataSet::RemoveNewlines(std::string file)
+{
+    boost::regex regexNewline;
+  const char* pre_expression = "[[:cntrl:]]";
+   regexNewline.assign(pre_expression);
+
+  const char* pre_format = "";
+  std::ostringstream t(std::ios::out | std::ios::binary);
+      std::ostream_iterator<char, char> oi(t);
+  boost::regex_replace(oi, file.begin(), file.end(),
+      regexNewline, pre_format, boost::match_default | boost::format_all);
+      std::string s(t.str());
+      return s;
+ }
+std::string BrukerDataSet::RemoveSpaces(std::string file)
+{
+    boost::regex regexSpace;
+  const char* pre_expression = "[[:space:]]";
+   regexSpace.assign(pre_expression);
 
+  const char* pre_format = "";
+  std::ostringstream t(std::ios::out | std::ios::binary);
+      std::ostream_iterator<char, char> oi(t);
+  boost::regex_replace(oi, file.begin(), file.end(),
+      regexSpace, pre_format, boost::match_default | boost::format_all);
+      std::string s(t.str());
+      return s;
+ }
+
 
 std::string BrukerDataSet::MatchBufferForText(std::string& file,const boost::regex& RegExp)
 {
@@ -144,21 +202,37 @@ std::string BrukerDataSet::GetValuesPart(std::string& file)
 {
   std::string Result;
   Result=MatchBufferForText(file,BufferNValues);
-  if (Result !="") 
-    return Result;
+  if (Result !="")   
+  return RemoveNewlines(Result);
   return MatchBufferForText(file,Buffer1Value);
 }
 
 
 std::string BrukerDataSet::GetContentType(std::string& file)
 {
-  std::string ValuesPart, Result;
+  std::string ValuesPart;
+   boost::match_flag_type flags = boost::match_default; 
+   std::string::const_iterator start, end;
   ValuesPart=GetValuesPart(file);
-  if (BoolMatchBufferForText(ValuesPart,IntSeries)) 
-    return "int";
-  if (BoolMatchBufferForText(ValuesPart,FloatSeries)) 
-    return "float";
-  return "string";
+  start=ValuesPart.begin();
+  end=ValuesPart.end();
+  // boost regexp_match can not handle well what we want
+  // so instead of looking for a match we will seek proof of a non int serie
+  // i.e. check if we can find something else than than -0-9
+   boost::regex isNotIntSerie("[^ \\-0-9]");
+   boost::match_results<std::string::const_iterator> whatInt;
+   if (!regex_search(start,end, whatInt, isNotIntSerie,flags)) 
+     return "int";
+   
+   // if not int serie check if it's not a floats serie !!!
+   
+   boost::regex isNotFloatSerie("[^ \\-\\+\\.eE0-9]");
+   boost::match_results<std::string::const_iterator> whatFloat;
+   if (!regex_search(start,end, whatFloat, isNotFloatSerie,flags))
+     return "float";
+   
+     // if not a float serie neither, it's a string !!!
+  return "string"; 
 }
 
 
@@ -279,7 +353,7 @@ bool BrukerDataSet::FillMap()
     data.DataType=GetContentType(Substring);
     if (DEBUG) std::cout<<"data.DataType="<< data.DataType <<std::endl;
     data.NumberOfElements=GetKeywordNumberOfElements(Substring);
   if(data.DataType=="string") 
+ if(data.DataType=="string") 
       data.DimensionNumber=0;
     if(data.DataType=="string") 
       data.NumberOfElements=1;
@@ -310,7 +384,6 @@ bool BrukerDataSet::FillMap()
         data.DoubleValue.push_back(GetDoubleValueN(Substring,i));
         if (DEBUG) std::cout<< data.DoubleValue[i-1]<<" ";
       }
-
     }
 
     if (data.DataType=="string")
@@ -361,7 +434,7 @@ void BrukerDataSet::PrintSelf()
        std::cout << std::endl << "-----------------[" <<(*it).first << "]" << std::endl;
        std::string a =  (*it).first;
        PrintKey(a);
-    }   
+    } 
 }
 
 
@@ -430,7 +503,7 @@ bool BrukerDataSet::Getkspace(std::string &FileToRead)
 
 std::vector< int > BrukerDataSet::GetLoopStructure() const
 {
-       return LoopStructure;
+   return LoopStructure;
 }
 
 /**
@@ -441,32 +514,33 @@ std::vector< int > BrukerDataSet::GetLoopStructure() const
  */
 bool BrukerDataSet::SetLoopStructure ( const std::vector<int> & theValue )
 {
-       LoopStructure = theValue;
+   LoopStructure = theValue;
+   return true;
 }
 
 
 /**
-    @fn bool BrukerDataSet::SetLoopStructureOld ( )
+   @fn bool BrukerDataSet::SetLoopStructureOld ( )
  * @brief method to set the default Bruker loopstructure (not yet able to deal with EPI, SPIRAL or spectroscopic experiments 
  * @return bool
      @todo  implement multicoil version
* @todo  implement multicoil version
  */
 bool BrukerDataSet::SetLoopStructureOld ()
 {
-       LoopStructure.clear();
+   LoopStructure.clear();
 /*
 \file brukerdataset.cpp
 \fn bool BrukerDataSet::setGenericLoopStructure ( )
 \brief sets the loop structure of a standard Bruker experiment
 
-NR                                                             (Nbre de repetitions)
-       NILoop                                                  (Boucle eventuelle extra (Diffusion par exemple) si NI<>(NSLICES x NECHOES) cette boucle est a� NI/(NSLICES x NECHOES)
-                                                               (Attention NILoop peut masquer plusieurs boucles imbriquees !!!!!)
-               ACQ_size[1..M]                                  (Codage suivant les autres dimensions)
-                       NSLICES                                 (Nombre de tranches)
-                               ACQ_phase_factor                (Facteur turbo de la sequence)
-                                       ACQ_ns_list_size        (Nombre d'echos)
-                                               ACQ_size[0]     (Ligne acq reelle)
+NR                               (Nbre de repetitions)
+   NILoop                        (Boucle eventuelle extra (Diffusion par exemple) si NI<>(NSLICES x NECHOES) cette boucle est a� NI/(NSLICES x NECHOES)
+                                 (Attention NILoop peut masquer plusieurs boucles imbriquees !!!!!)
+      ACQ_size[1..M]             (Codage suivant les autres dimensions)
+         NSLICES                 (Nombre de tranches)
+            ACQ_phase_factor     (Facteur turbo de la sequence)
+               ACQ_ns_list_size  (Nombre d'echos)
+                  ACQ_size[0]    (Ligne acq reelle)
 
 */
 
@@ -519,15 +593,15 @@ NR                                                                (Nbre de repetitions)
 
 
 /**
-    @fn bool BrukerDataSet::SetLoopStructure ( )
+   @fn bool BrukerDataSet::SetLoopStructure ( )
  * @brief method to set the default Bruker loopstructure (not yet able to deal with EPI, SPIRAL or spectroscopic experiments 
  * @return bool
-       @todo  implement multicoil version
+   @todo  implement multicoil version
  */
-bool BrukerDataSet::SetLoopStructure ()
+bool BrukerDataSet::SetLoopStructure (int dimension)
 {
-   if (! SetInnerObjectLoopStructure()) return false;
-   if (! SetOuterObjectLoopStructure()) return false;
+   if (! SetInnerObjectLoopStructure(dimension)) return false;
+   if (! SetOuterObjectLoopStructure(dimension)) return false;
    std::vector<int> Inner=GetInnerObjectLoopStructure();
    std::vector<int> Outer=GetOuterObjectLoopStructure();
    std::vector<int> TmpVect;
@@ -630,14 +704,16 @@ std::map<std::string, BrukerFieldData> BrukerDataSet::GetBrukerHeaderMap() const
 
 //std::map<std::string, BrukerFieldData> BrukerDataSet::GetBrukerHeaderMap() const
 //{
-//     return BrukerHeaderMap;
+//   return BrukerHeaderMap;
 //}
 
 
-bool BrukerDataSet::SetInnerObjectLoopStructure()
-{      
+bool BrukerDataSet::SetInnerObjectLoopStructure(int dimension)
+{
 /*
-       ACQ_size[1..M]                                  (Codage suivant les autres dimensions)
+ *
+ *
+ *     ACQ_size[1..M]                                  (Codage suivant les autres dimensions)
                NSLICES                                 (Nombre de tranches)
                        ACQ_phase_factor                (Facteur turbo de la sequence)
                                ACQ_ns_list_size        (Nombre d'echos)
@@ -663,17 +739,21 @@ bool BrukerDataSet::SetInnerObjectLoopStructure()
 //std::cout<<"BrukerDataSet::BrukerHeaderMap[(std::string)  ACQ_ns_list_size].IntValue[0]" << BrukerDataSet::BrukerHeaderMap[(std::string)  "ACQ_ns_list_size"].IntValue[0] << std::endl;
    TempIntVect.push_back(BrukerDataSet::BrukerHeaderMap[(std::string)  "ACQ_phase_factor"].IntValue[0]);
 //std::cout<<"BrukerDataSet::BrukerHeaderMap[(std::string)  ACQ_phase_factor].IntValue[0]" <<  BrukerDataSet::BrukerHeaderMap[(std::string)  "ACQ_phase_factor"].IntValue[0]<< std::endl;
+   if(dimension > 1)
    TempIntVect.push_back(BrukerDataSet::BrukerHeaderMap[(std::string)  "NSLICES"].IntValue[0]);
 //std::cout << "BrukerDataSet::BrukerHeaderMap[(std::string)  NSLICES].IntValue[0]" << BrukerDataSet::BrukerHeaderMap[(std::string)  "NSLICES"].IntValue[0] << std::endl;
    if (1<=BrukerDataSet::BrukerHeaderMap[ (std::string)  "ACQ_size" ].DimensionNumber )
    {
-      TempIntVect.push_back(BrukerDataSet::BrukerHeaderMap[ (std::string)  "ACQ_size" ].IntValue[1]/BrukerDataSet::BrukerHeaderMap[(std::string)  "ACQ_phase_factor"].IntValue[0]);
+          if(dimension == 1)
+                  TempIntVect.push_back(BrukerDataSet::BrukerHeaderMap[ (std::string)  "ACQ_size" ].IntValue[0]/BrukerDataSet::BrukerHeaderMap[(std::string)  "ACQ_phase_factor"].IntValue[0]);
+          else
+                       TempIntVect.push_back(BrukerDataSet::BrukerHeaderMap[ (std::string)  "ACQ_size" ].IntValue[1]/BrukerDataSet::BrukerHeaderMap[(std::string)  "ACQ_phase_factor"].IntValue[0]);
 //std::cout << "BrukerDataSet::BrukerHeaderMap[ (std::string)  ACQ_size ].IntValue[1]/BrukerDataSet::BrukerHeaderMap[(std::string)  ACQ_phase_factor].IntValue[0]" << BrukerDataSet::BrukerHeaderMap[ (std::string)  "ACQ_size"
 //].IntValue[1]/BrukerDataSet::BrukerHeaderMap[(std::string)  "ACQ_phase_factor"].IntValue[0] << std::endl;
       if (2<=BrukerDataSet::BrukerHeaderMap[ (std::string)  "ACQ_size" ].DimensionNumber )
       {
          for(i=2;i<=BrukerDataSet::BrukerHeaderMap[ (std::string)  "ACQ_size" ].DimensionNumber;i++) 
-        {
+         {
             TempIntVect.push_back(BrukerDataSet::BrukerHeaderMap[ (std::string)  "ACQ_size" ].IntValue[i]);
          }
       }
@@ -695,7 +775,7 @@ std::vector< int > BrukerDataSet::GetOuterObjectLoopStructure() const
 }
 
 
-bool BrukerDataSet::SetOuterObjectLoopStructure ()
+bool BrukerDataSet::SetOuterObjectLoopStructure (int dimension)
 {
    OuterObjectLoopStructure.clear();
    /*
@@ -710,6 +790,9 @@ bool BrukerDataSet::SetOuterObjectLoopStructure ()
    if (! CheckExistKeyword("NI"))  return false;
 // Ici, boucles additionnelles si elles existent regroupees en une seule
 //temp=GetIntValueN(NIStr,1)/(GetIntValueN(NSLICESStr,1)*GetIntValueN(NECHOESStr,1));
+   if(dimension ==1)
+          temp=BrukerDataSet::BrukerHeaderMap[ (std::string)  "NI" ].IntValue[0]/(BrukerDataSet::BrukerHeaderMap[ (std::string)  "ACQ_ns_list_size" ].IntValue[0]);
+   else
    temp=BrukerDataSet::BrukerHeaderMap[ (std::string)  "NI" ].IntValue[0]/(BrukerDataSet::BrukerHeaderMap[ (std::string)  "NSLICES" ].IntValue[0]*BrukerDataSet::BrukerHeaderMap[ (std::string)  "ACQ_ns_list_size" ].IntValue[0]);
    if (1 < temp) 
       TempIntVect.push_back(temp);
@@ -740,3 +823,4 @@ bool BrukerDataSet::SetImageLoopStructure ( )
    ImageLoopStructure = TempIntVect4;
    return true;
 }
+