X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2Fsrc1%2Fbrukerdataset.cpp;h=f4cdc7087cd48bc8da4ac2b28be61cfbde9342c2;hb=e3ee3436dd081af55f71997e58f5727345a84bff;hp=3a6056b22f939078b224288ffa0772d3d5f411be;hpb=0194cf3ca5e4249a389cc809d3de6fae07249fa4;p=creaBruker.git diff --git a/lib/src1/brukerdataset.cpp b/lib/src1/brukerdataset.cpp index 3a6056b..f4cdc70 100644 --- a/lib/src1/brukerdataset.cpp +++ b/lib/src1/brukerdataset.cpp @@ -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 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 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 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 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 < BrukerDataSet::GetLoopStructure() const { - return LoopStructure; + return LoopStructure; } /** @@ -441,32 +514,33 @@ std::vector< int > BrukerDataSet::GetLoopStructure() const */ bool BrukerDataSet::SetLoopStructure ( const std::vector & 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 Inner=GetInnerObjectLoopStructure(); std::vector Outer=GetOuterObjectLoopStructure(); std::vector TmpVect; @@ -630,14 +704,16 @@ std::map BrukerDataSet::GetBrukerHeaderMap() const //std::map 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; } +