+/*
+ # ---------------------------------------------------------------------
+ #
+ # 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
//
BrukerDataSet::~BrukerDataSet(){}
-bool BrukerDataSet::LoadFile(std::string& fileToRead)
+bool BrukerDataSet::LoadFile(std::string fileToRead)
{
//std::cout <<
{
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)
{
{
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";
}
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;
data.DoubleValue.push_back(GetDoubleValueN(Substring,i));
if (DEBUG) std::cout<< data.DoubleValue[i-1]<<" ";
}
-
}
if (data.DataType=="string")
std::cout << std::endl << "-----------------[" <<(*it).first << "]" << std::endl;
std::string a = (*it).first;
PrintKey(a);
- }
+ }
}
std::vector< int > BrukerDataSet::GetLoopStructure() const
{
- return LoopStructure;
+ return LoopStructure;
}
/**
*/
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)
*/
/**
- @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;
//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)
//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]);
}
}
}
-bool BrukerDataSet::SetOuterObjectLoopStructure ()
+bool BrukerDataSet::SetOuterObjectLoopStructure (int dimension)
{
OuterObjectLoopStructure.clear();
/*
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);
ImageLoopStructure = TempIntVect4;
return true;
}
+