2 // C++ Implementation: brukerdataset
7 // Author: <Denis Grenier>, (C) 2008
9 // Copyright: See COPYING file that comes with this distribution
16 #include "brukerdataset.h"
18 BrukerDataSet::BrukerDataSet(){}
21 BrukerDataSet::~BrukerDataSet(){}
24 bool BrukerDataSet::LoadFile(std::string& fileToRead)
28 //"------------- BrukerDataSet::LoadFile() Open : [" << fileToRead << "]" << std::endl;
31 FID.open(fileToRead.c_str(), std::ios::binary);
32 if (FID.rdstate()==std::ios::failbit) {
33 //std::cout << "BrukerDataSet::LoadFile() Cannot open : [" << fileToRead << "]" << std::endl;
37 FID.seekg (0, std::ios::end);
38 int length = FID.tellg();
39 FID.seekg (0, std::ios::beg);
41 buffer = new char [length];
42 FID.read (buffer,length);
44 BrukerDataSet::WholeHeader=buffer;
51 std::string BrukerDataSet::SearchBufferForText(std::string& file, const boost::regex& RegExp)
54 if (regex_search(file.c_str(), what, RegExp))
66 bool BrukerDataSet::BoolMatchBufferForText(std::string& file, const boost::regex& RegExp)
69 if (regex_match(file.c_str(), what, RegExp))
76 std::string BrukerDataSet::MatchBufferForText(std::string& file,const boost::regex& RegExp)
79 if (regex_match(file.c_str(), what, RegExp))
86 std::string BrukerDataSet::GetKeyword(std::string& file)
88 return MatchBufferForText( file,KeyWord);
93 int BrukerDataSet::GetDimensionnality(std::string& file)
96 std::string DimensionnalityBuffer=SearchBufferForText(file,Dimensionnality);
97 if (DimensionnalityBuffer=="")
99 boost::match_results<std::string::const_iterator> what;
100 boost::match_flag_type flags= boost::match_default;
101 std::string::const_iterator start,end;
102 start=DimensionnalityBuffer.begin();
103 end=DimensionnalityBuffer.end();
105 while (regex_search(start, end, what, UnsignedInteger))
108 start=what[0].second;
109 flags |= boost::match_prev_avail;
110 flags |= boost::match_not_bob;
117 int BrukerDataSet::GetIntValueOfDimN(std::string& file, int N)
120 std::string DimensionnalityBuffer=SearchBufferForText(file,Dimensionnality);
121 if (N < 1 || DimensionnalityBuffer=="")
123 //std::cout << DimensionnalityBuffer << std::endl;
124 boost::match_results<std::string::const_iterator> what;
125 boost::match_flag_type flags= boost::match_default;
126 std::string::const_iterator start,end;
127 start=DimensionnalityBuffer.begin();
128 end=DimensionnalityBuffer.end();
130 for (int i=1;i<=N;i++)
132 regex_search(start,end, what, UnsignedInteger);
134 start=what[0].second;
135 flags |= boost::match_prev_avail;
136 flags |= boost::match_not_bob;
138 return atoi(std::string(what[1].first,what[1].second).c_str());
143 std::string BrukerDataSet::GetValuesPart(std::string& file)
146 Result=MatchBufferForText(file,BufferNValues);
149 return MatchBufferForText(file,Buffer1Value);
153 std::string BrukerDataSet::GetContentType(std::string& file)
155 std::string ValuesPart, Result;
156 ValuesPart=GetValuesPart(file);
157 if (BoolMatchBufferForText(ValuesPart,IntSeries))
159 if (BoolMatchBufferForText(ValuesPart,FloatSeries))
166 int BrukerDataSet::GetIntValueN(std::string& file,int N)
168 std::string ValuesPart=GetValuesPart(file);
170 if (N < 1 || ValuesPart=="")
173 boost::match_results<std::string::const_iterator> what;
174 boost::match_flag_type flags= boost::match_default;
175 std::string::const_iterator start,end;
176 start=ValuesPart.begin();
177 end=ValuesPart.end();
179 while (iterator != N)
181 regex_search(start,end, what, SignedInteger);
183 start=what[0].second;
184 flags |= boost::match_prev_avail;
185 flags |= boost::match_not_bob;
187 return (atoi((std::string(what[1].first,what[1].second)).c_str()));
192 double BrukerDataSet::GetDoubleValueN(std::string& file, int N)
194 std::string ValuesPart=GetValuesPart(file);
196 if (N < 1 || ValuesPart=="")
198 boost::match_results<std::string::const_iterator> what;
199 boost::match_flag_type flags= boost::match_default;
200 std::string::const_iterator start,end;
201 start=ValuesPart.begin();
202 end=ValuesPart.end();
204 while (iterator != N)
206 regex_search(start,end, what, IntOrFloat);
208 start=what[0].second;
209 flags |= boost::match_prev_avail;
210 flags |= boost::match_not_bob;
212 return (atof((std::string(what[1].first,what[1].second)).c_str()));
217 std::string BrukerDataSet::GetTextValueN(std::string& file, int N)
219 return GetValuesPart(file);
224 int BrukerDataSet::GetKeywordNumberOfElements(std::string& file)
226 int NumberOfElements=1;
227 for (int i=1;i<=GetDimensionnality(file);i++)
228 NumberOfElements*=GetIntValueOfDimN(file, i);
229 return NumberOfElements;
236 @fn bool BrukerDataSet::FillMap()
237 @brief This method fills the Bruker headermap with everything contained in the acqp file
239 The map is made of BrukerFieldData containing the keywords:
240 Datatype (string, int, double)
241 DimensionNumber: The number of Dimensions of the keyword-> 0 scalar, 1-> 1D-vector, 2-> 2D-Matrix, 3->3D-Matrix, ...
242 DimensionNumberValue: Gives the size of each dimension
243 DoubleValue: return a vector of values if they are of type double
244 IntValue: return a vector of values if they are of type int
245 StringValue: return a string if the values where not identified as a serie of numbers
246 NumberOfElements: Number of elements corresponding to the keyword given
249 bool BrukerDataSet::FillMap()
252 std::string ValuesBuffer, Keyword,TempString, Substring;
255 int PositionDebut=WholeHeader.find("##");
256 int PositionFin=PositionDebut+2;
258 BrukerFieldData data;
259 if (PositionFin>=WholeHeader.length())
262 while(PositionDebut!=std::string::npos)
264 PositionFin=WholeHeader.find("##",PositionDebut+2);
265 if (-1 == PositionFin) break ;
266 Substring=WholeHeader.substr (PositionDebut,PositionFin-PositionDebut-1);
267 PosRel=Substring.find("$$",0);
268 if (-1 != PosRel) Substring=Substring.substr (0,PosRel-1);
271 if (DEBUG) std::cout<<"Substring=[" << Substring << "]" <<std::endl;
273 PositionDebut=PositionFin;
274 Keyword=GetKeyword(Substring);
275 if (DEBUG) std::cout<<"Keyword="<< Keyword <<std::endl;
276 data.DimensionNumber=GetDimensionnality(Substring);
277 if (DEBUG) std::cout<<"data.DimensionNumber="<< data.DimensionNumber <<std::endl;
279 data.DataType=GetContentType(Substring);
280 if (DEBUG) std::cout<<"data.DataType="<< data.DataType <<std::endl;
281 data.NumberOfElements=GetKeywordNumberOfElements(Substring);
282 if(data.DataType=="string")
283 data.DimensionNumber=0;
284 if(data.DataType=="string")
285 data.NumberOfElements=1;
286 if (DEBUG) std::cout<<"data.NumberOfElements="<< data.NumberOfElements <<std::endl;
289 while (i<=data.DimensionNumber)
291 data.DimensionNumberValue.push_back(GetIntValueOfDimN(Substring,i));
292 if (DEBUG) std::cout<<"data.DimensionNumberValue["<<i<<"]="<< data.DimensionNumberValue[i] <<std::endl;
296 if (DEBUG) std::cout<< "data= ";
298 for(i =1;i<=data.NumberOfElements;i++)
301 if (data.DataType=="int")
303 data.IntValue.push_back(GetIntValueN(Substring,i));
304 data.DoubleValue.push_back((double) GetIntValueN(Substring,i));
305 if (DEBUG) std::cout<< data.IntValue[i-1]<<" ";
308 if (data.DataType=="float")
310 data.DoubleValue.push_back(GetDoubleValueN(Substring,i));
311 if (DEBUG) std::cout<< data.DoubleValue[i-1]<<" ";
316 if (data.DataType=="string")
318 data.StringValue.push_back(GetTextValueN(Substring,0));
319 if (DEBUG) std::cout<< "[" << data.StringValue[0]<<"] ";
322 if (DEBUG) std::cout<< std::endl << "---- " <<std::endl;
324 BrukerDataSet::BrukerHeaderMap[ Keyword ] = data;
325 data.DimensionNumberValue.clear();
326 data.IntValue.clear();
327 data.DoubleValue.clear();
328 data.StringValue.clear();
329 data.DataType.clear();
331 //std::cout<<std::endl;
337 void BrukerDataSet::PrintKey(std::string & KeyWord)
340 if(!BrukerDataSet::CheckExistKeyword(KeyWord))
342 std::cout<< "KeyWord = "<<KeyWord <<" doesn't exist !"<<std::endl;
346 std::cout<< "KeyWord = "<<KeyWord <<std::endl;
347 BrukerDataSet::BrukerHeaderMap[ KeyWord ].PrintSelf();
354 void BrukerDataSet::PrintSelf()
356 BrukMapType::iterator it;
357 for (it= BrukerHeaderMap.begin();
358 it != BrukerHeaderMap.end();
361 std::cout << std::endl << "-----------------[" <<(*it).first << "]" << std::endl;
362 std::string a = (*it).first;
368 bool BrukerDataSet::CheckExistKeyword(std::string &KeyWord)
370 BrukMapType::iterator element;
371 element = BrukerHeaderMap.find(KeyWord);
372 if (element != BrukerHeaderMap.end() )
377 bool BrukerDataSet::CheckExistKeyword(const char *KeyWord)
379 std::string temp(KeyWord);
380 BrukerDataSet::CheckExistKeyword(temp);
385 const BrukerFieldData& BrukerDataSet::GetFieldData(std::string & kw)
387 return BrukerHeaderMap[kw];
390 const BrukerFieldData& BrukerDataSet::GetFieldData(const char *kw)
392 std::string str_kw(kw);
393 return BrukerHeaderMap[str_kw];
397 bool BrukerDataSet::Getkspace(std::string &FileToRead)
399 std::string GO_raw_data_format("GO_raw_data_format");
400 if (!CheckExistKeyword(GO_raw_data_format))
404 FID.open(FileToRead.c_str(), std::ios::binary);
405 if (FID.rdstate()==std::ios::failbit)
407 FID.seekg (0, std::ios::end);
408 long length = FID.tellg();
409 FID.seekg (0, std::ios::beg);
413 if (GetTextValueN(GO_raw_data_format,1)=="GO_32BIT_SGN_INT")
414 NumberOfValues=length/4;
415 if (GetTextValueN(GO_raw_data_format,1)=="GO_16BIT_SGN_INT")
416 NumberOfValues=length/2;
417 if (GetTextValueN(GO_raw_data_format,1)=="GO_32BIT_FLOAT")
418 NumberOfValues=length/4;
421 buffer = new char[length];
423 FID.read (buffer,length);
425 //for (long i=0;i<NumberOfValues;i++) BrukerDataSet::WholeKspace.pushback(buffer[i]);
431 std::vector< int > BrukerDataSet::GetLoopStructure() const
433 return LoopStructure;
437 @fn bool BrukerDataSet::SetLoopStructure (const std::vector<int> & theValue )
438 * @brief this methods provide a way to inject a userdefined loop structure, be very aware that this method is not foolproof
442 bool BrukerDataSet::SetLoopStructure ( const std::vector<int> & theValue )
444 LoopStructure = theValue;
450 @fn bool BrukerDataSet::SetLoopStructureOld ( )
451 * @brief method to set the default Bruker loopstructure (not yet able to deal with EPI, SPIRAL or spectroscopic experiments
453 @todo implement multicoil version
455 bool BrukerDataSet::SetLoopStructureOld ()
457 LoopStructure.clear();
459 \file brukerdataset.cpp
460 \fn bool BrukerDataSet::setGenericLoopStructure ( )
461 \brief sets the loop structure of a standard Bruker experiment
463 NR (Nbre de repetitions)
464 NILoop (Boucle eventuelle extra (Diffusion par exemple) si NI<>(NSLICES x NECHOES) cette boucle est a� NI/(NSLICES x NECHOES)
465 (Attention NILoop peut masquer plusieurs boucles imbriquees !!!!!)
466 ACQ_size[1..M] (Codage suivant les autres dimensions)
467 NSLICES (Nombre de tranches)
468 ACQ_phase_factor (Facteur turbo de la sequence)
469 ACQ_ns_list_size (Nombre d'echos)
470 ACQ_size[0] (Ligne acq reelle)
475 std::string NRStr("NR");
476 std::string NIStr("NI");
477 std::string ACQ_sizeStr("ACQ_size");
478 std::string ACQ_phase_factorStr("ACQ_phase_factor");
479 std::string ACQ_ns_listStr("ACQ_ns_list");
480 std::string ACQ_ns_list_sizeStr("ACQ_ns_list_size");
481 std::string NSLICESStr("NSLICES");
484 std::vector<int> TempIntVect;
487 if (! CheckExistKeyword(NRStr)) return false;
488 if (! CheckExistKeyword(NIStr)) return false;
489 if (! CheckExistKeyword(ACQ_sizeStr)) return false;
490 if (! CheckExistKeyword(ACQ_phase_factorStr))return false;
491 if (! CheckExistKeyword(ACQ_ns_list_sizeStr))return false;
492 if (! CheckExistKeyword(NSLICESStr)) return false;
494 TempIntVect.push_back(BrukerDataSet::BrukerHeaderMap[ (std::string) "ACQ_size" ].IntValue[0]);
495 TempIntVect.push_back(BrukerDataSet::BrukerHeaderMap[(std::string) "ACQ_ns_list_size"].IntValue[0]);
496 TempIntVect.push_back(BrukerDataSet::BrukerHeaderMap[(std::string) "ACQ_phase_factor"].IntValue[0]);
497 TempIntVect.push_back(BrukerDataSet::BrukerHeaderMap[(std::string) "NSLICES"].IntValue[0]);
498 if (1<=BrukerDataSet::BrukerHeaderMap[ (std::string) "ACQ_size" ].DimensionNumber ){
499 TempIntVect.push_back(BrukerDataSet::BrukerHeaderMap[ (std::string) "ACQ_size" ].IntValue[1]/BrukerDataSet::BrukerHeaderMap[(std::string) "ACQ_phase_factor"].IntValue[0]);
500 if (2<=BrukerDataSet::BrukerHeaderMap[ (std::string) "ACQ_size" ].DimensionNumber )
502 for(i=2;i<=BrukerDataSet::BrukerHeaderMap[ (std::string) "ACQ_size" ].DimensionNumber;i++)
504 TempIntVect.push_back(BrukerDataSet::BrukerHeaderMap[ (std::string) "ACQ_size" ].IntValue[i]);
508 // Ici, boucles additionnelles si elles existent regroupees en une seule
509 //temp=GetIntValueN(NIStr,1)/(GetIntValueN(NSLICESStr,1)*GetIntValueN(NECHOESStr,1));
510 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]);
512 TempIntVect.push_back(temp);
513 // fin des boucles cachees
515 TempIntVect.push_back(BrukerDataSet::BrukerHeaderMap[ (std::string) "NR" ].IntValue[0]);
517 LoopStructure=TempIntVect;
523 @fn bool BrukerDataSet::SetLoopStructure ( )
524 * @brief method to set the default Bruker loopstructure (not yet able to deal with EPI, SPIRAL or spectroscopic experiments
526 @todo implement multicoil version
528 bool BrukerDataSet::SetLoopStructure ()
530 if (! SetInnerObjectLoopStructure()) return false;
531 if (! SetOuterObjectLoopStructure()) return false;
532 std::vector<int> Inner=GetInnerObjectLoopStructure();
533 std::vector<int> Outer=GetOuterObjectLoopStructure();
534 std::vector<int> TmpVect;
536 TmpVect.insert(TmpVect.end(),Outer.begin(),Outer.end());
537 LoopStructure=TmpVect;
541 std::vector< std :: vector < int > > BrukerDataSet::GetBrukerObjectsLineList() const
543 return BrukerObjectsLineList;
547 bool BrukerDataSet::SetBrukerObjectsLineList ()
550 std::vector<int> Loop =GetLoopStructure();
551 int NumberOfLines, i,j;
555 while (i<Loop.size())
557 NumberOfLines=NumberOfLines*Loop[i];
561 std::vector<int> TempVect (Loop.size()-1,0);
562 std::vector<int> k (Loop.size()-1,0);
563 std::vector<std::vector<int> > TempLineList (NumberOfLines,TempVect);
565 for (i=0;i<NumberOfLines;i++){
566 for (j=1;j<=Loop.size()-1;j++) {
567 if (k[j-1] >= Loop[j]) {
572 for (j=1;j<=Loop.size()-1;j++)
573 TempLineList[i][j-1]=k[j-1];
576 BrukerObjectsLineList=TempLineList;
581 std::vector< std::vector < int > > BrukerDataSet::GetBrukerImageList() const
583 return BrukerImageList;
587 bool BrukerDataSet::SetBrukerImageList ()
589 if (LoopStructure.size()==0)
590 SetImageLoopStructure();
592 std::vector<int> Loop =GetImageLoopStructure();
593 int NumberOfLines, i,j;
597 while (i<Loop.size())
599 NumberOfLines=NumberOfLines*Loop[i];
603 std::vector<int> TempVect (Loop.size()-1,0);
604 std::vector<int> k (Loop.size()-1,0);
605 std::vector<std::vector<int> > TempLineList (NumberOfLines,TempVect);
607 for (i=0;i<NumberOfLines;i++){
608 for (j=1;j<=Loop.size()-1;j++) {
609 if (k[j-1] >= Loop[j]) {
614 for (j=1;j<=Loop.size()-1;j++)
615 TempLineList[i][j-1]=k[j-1];
618 BrukerImageList=TempLineList;
624 std::map<std::string, BrukerFieldData> BrukerDataSet::GetBrukerHeaderMap() const
626 return BrukerHeaderMap;
632 //std::map<std::string, BrukerFieldData> BrukerDataSet::GetBrukerHeaderMap() const
634 // return BrukerHeaderMap;
638 bool BrukerDataSet::SetInnerObjectLoopStructure()
641 ACQ_size[1..M] (Codage suivant les autres dimensions)
642 NSLICES (Nombre de tranches)
643 ACQ_phase_factor (Facteur turbo de la sequence)
644 ACQ_ns_list_size (Nombre d'echos)
645 ACQ_size[0] (Ligne acq reelle)
650 std::vector<int> TempIntVect;
654 if (! CheckExistKeyword("ACQ_size")) return false;
655 if (! CheckExistKeyword("ACQ_phase_factor"))return false;
656 if (! CheckExistKeyword("ACQ_ns_list_size"))return false;
657 if (! CheckExistKeyword("NSLICES")) return false;
660 //std::cout<< "BrukerDataSet::BrukerHeaderMap[ (std::string) ACQ_size ].IntValue[0]" <<BrukerDataSet::BrukerHeaderMap[ (std::string) "ACQ_size" ].IntValue[0] << std::endl;
661 TempIntVect.push_back(BrukerDataSet::BrukerHeaderMap[ (std::string) "ACQ_size" ].IntValue[0]);
662 //std::cout<< "BrukerDataSet::BrukerHeaderMap[ (std::string) ACQ_size ].IntValue[0]" <<BrukerDataSet::BrukerHeaderMap[ (std::string) "ACQ_size" ].IntValue[0] << std::endl;
663 TempIntVect.push_back(BrukerDataSet::BrukerHeaderMap[(std::string) "ACQ_ns_list_size"].IntValue[0]);
664 //std::cout<<"BrukerDataSet::BrukerHeaderMap[(std::string) ACQ_ns_list_size].IntValue[0]" << BrukerDataSet::BrukerHeaderMap[(std::string) "ACQ_ns_list_size"].IntValue[0] << std::endl;
665 TempIntVect.push_back(BrukerDataSet::BrukerHeaderMap[(std::string) "ACQ_phase_factor"].IntValue[0]);
666 //std::cout<<"BrukerDataSet::BrukerHeaderMap[(std::string) ACQ_phase_factor].IntValue[0]" << BrukerDataSet::BrukerHeaderMap[(std::string) "ACQ_phase_factor"].IntValue[0]<< std::endl;
667 TempIntVect.push_back(BrukerDataSet::BrukerHeaderMap[(std::string) "NSLICES"].IntValue[0]);
668 //std::cout << "BrukerDataSet::BrukerHeaderMap[(std::string) NSLICES].IntValue[0]" << BrukerDataSet::BrukerHeaderMap[(std::string) "NSLICES"].IntValue[0] << std::endl;
669 if (1<=BrukerDataSet::BrukerHeaderMap[ (std::string) "ACQ_size" ].DimensionNumber )
671 TempIntVect.push_back(BrukerDataSet::BrukerHeaderMap[ (std::string) "ACQ_size" ].IntValue[1]/BrukerDataSet::BrukerHeaderMap[(std::string) "ACQ_phase_factor"].IntValue[0]);
672 //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"
673 //].IntValue[1]/BrukerDataSet::BrukerHeaderMap[(std::string) "ACQ_phase_factor"].IntValue[0] << std::endl;
674 if (2<=BrukerDataSet::BrukerHeaderMap[ (std::string) "ACQ_size" ].DimensionNumber )
676 for(i=2;i<=BrukerDataSet::BrukerHeaderMap[ (std::string) "ACQ_size" ].DimensionNumber;i++)
678 TempIntVect.push_back(BrukerDataSet::BrukerHeaderMap[ (std::string) "ACQ_size" ].IntValue[i]);
683 InnerObjectLoopStructure=TempIntVect;
688 std::vector< int > BrukerDataSet::GetInnerObjectLoopStructure() const
690 return InnerObjectLoopStructure;
693 std::vector< int > BrukerDataSet::GetOuterObjectLoopStructure() const
695 return OuterObjectLoopStructure;
699 bool BrukerDataSet::SetOuterObjectLoopStructure ()
701 OuterObjectLoopStructure.clear();
703 NR (Nbre de repetitions)
704 NILoop (Boucle eventuelle extra (Diffusion par exemple) si NI<>(NSLICES x NECHOES) cette boucle est a� NI/(NSLICES x NECHOES)
705 (Attention NILoop peut masquer plusieurs boucles imbriquees !!!!!)
708 std::vector<int> TempIntVect;
710 if (! CheckExistKeyword("NR")) return false;
711 if (! CheckExistKeyword("NI")) return false;
712 // Ici, boucles additionnelles si elles existent regroupees en une seule
713 //temp=GetIntValueN(NIStr,1)/(GetIntValueN(NSLICESStr,1)*GetIntValueN(NECHOESStr,1));
714 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]);
716 TempIntVect.push_back(temp);
717 // fin des boucles cachees
718 TempIntVect.push_back(BrukerDataSet::BrukerHeaderMap[ (std::string) "NR" ].IntValue[0]);
719 OuterObjectLoopStructure=TempIntVect;
724 std::vector< int > BrukerDataSet::GetImageLoopStructure() const
726 return ImageLoopStructure;
730 bool BrukerDataSet::SetImageLoopStructure ( )
732 ImageLoopStructure.clear();
733 std::vector<int> TempIntVect1=GetInnerObjectLoopStructure();
734 std::vector<int> TempIntVect2=GetOuterObjectLoopStructure();
735 std::vector<int> TempIntVect3(TempIntVect1.size(),1);
736 std::vector<int> TempIntVect4;
737 TempIntVect3[1]=TempIntVect1[1];
738 TempIntVect3[3]=TempIntVect1[3];
739 TempIntVect4=TempIntVect3;
740 TempIntVect4.insert(TempIntVect4.end(),TempIntVect2.begin(),TempIntVect2.end());
741 ImageLoopStructure = TempIntVect4;