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]<<" ";
315 if (data.DataType=="string")
317 data.StringValue.push_back(GetTextValueN(Substring,0));
318 if (DEBUG) std::cout<< "[" << data.StringValue[0]<<"] ";
321 if (DEBUG) std::cout<< std::endl << "---- " <<std::endl;
323 BrukerDataSet::BrukerHeaderMap[ Keyword ] = data;
324 data.DimensionNumberValue.clear();
325 data.IntValue.clear();
326 data.DoubleValue.clear();
327 data.StringValue.clear();
328 data.DataType.clear();
330 //std::cout<<std::endl;
336 void BrukerDataSet::PrintKey(std::string & KeyWord)
339 if(!BrukerDataSet::CheckExistKeyword(KeyWord))
341 std::cout<< "KeyWord = "<<KeyWord <<" doesn't exist !"<<std::endl;
345 std::cout<< "KeyWord = "<<KeyWord <<std::endl;
346 BrukerDataSet::BrukerHeaderMap[ KeyWord ].PrintSelf();
353 void BrukerDataSet::PrintSelf()
355 BrukMapType::iterator it;
356 for (it= BrukerHeaderMap.begin();
357 it != BrukerHeaderMap.end();
360 std::cout << std::endl << "-----------------[" <<(*it).first << "]" << std::endl;
361 std::string a = (*it).first;
367 bool BrukerDataSet::CheckExistKeyword(std::string &KeyWord)
369 BrukMapType::iterator element;
370 element = BrukerHeaderMap.find(KeyWord);
371 if (element != BrukerHeaderMap.end() )
376 bool BrukerDataSet::CheckExistKeyword(const char *KeyWord)
378 std::string temp(KeyWord);
379 BrukerDataSet::CheckExistKeyword(temp);
384 const BrukerFieldData& BrukerDataSet::GetFieldData(std::string & kw)
386 return BrukerHeaderMap[kw];
389 const BrukerFieldData& BrukerDataSet::GetFieldData(const char *kw)
391 std::string str_kw(kw);
392 return BrukerHeaderMap[str_kw];
396 bool BrukerDataSet::Getkspace(std::string &FileToRead)
398 std::string GO_raw_data_format("GO_raw_data_format");
399 if (!CheckExistKeyword(GO_raw_data_format))
403 FID.open(FileToRead.c_str(), std::ios::binary);
404 if (FID.rdstate()==std::ios::failbit)
406 FID.seekg (0, std::ios::end);
407 long length = FID.tellg();
408 FID.seekg (0, std::ios::beg);
412 if (GetTextValueN(GO_raw_data_format,1)=="GO_32BIT_SGN_INT")
413 NumberOfValues=length/4;
414 if (GetTextValueN(GO_raw_data_format,1)=="GO_16BIT_SGN_INT")
415 NumberOfValues=length/2;
416 if (GetTextValueN(GO_raw_data_format,1)=="GO_32BIT_FLOAT")
417 NumberOfValues=length/4;
420 buffer = new char[length];
422 FID.read (buffer,length);
424 //for (long i=0;i<NumberOfValues;i++) BrukerDataSet::WholeKspace.pushback(buffer[i]);
430 std::vector< int > BrukerDataSet::GetLoopStructure() const
432 return LoopStructure;
436 @fn bool BrukerDataSet::SetLoopStructure (const std::vector<int> & theValue )
437 * @brief this methods provide a way to inject a userdefined loop structure, be very aware that this method is not foolproof
441 bool BrukerDataSet::SetLoopStructure ( const std::vector<int> & theValue )
443 LoopStructure = theValue;
449 @fn bool BrukerDataSet::SetLoopStructureOld ( )
450 * @brief method to set the default Bruker loopstructure (not yet able to deal with EPI, SPIRAL or spectroscopic experiments
452 * @todo implement multicoil version
454 bool BrukerDataSet::SetLoopStructureOld ()
456 LoopStructure.clear();
458 \file brukerdataset.cpp
459 \fn bool BrukerDataSet::setGenericLoopStructure ( )
460 \brief sets the loop structure of a standard Bruker experiment
462 NR (Nbre de repetitions)
463 NILoop (Boucle eventuelle extra (Diffusion par exemple) si NI<>(NSLICES x NECHOES) cette boucle est a� NI/(NSLICES x NECHOES)
464 (Attention NILoop peut masquer plusieurs boucles imbriquees !!!!!)
465 ACQ_size[1..M] (Codage suivant les autres dimensions)
466 NSLICES (Nombre de tranches)
467 ACQ_phase_factor (Facteur turbo de la sequence)
468 ACQ_ns_list_size (Nombre d'echos)
469 ACQ_size[0] (Ligne acq reelle)
474 std::string NRStr("NR");
475 std::string NIStr("NI");
476 std::string ACQ_sizeStr("ACQ_size");
477 std::string ACQ_phase_factorStr("ACQ_phase_factor");
478 std::string ACQ_ns_listStr("ACQ_ns_list");
479 std::string ACQ_ns_list_sizeStr("ACQ_ns_list_size");
480 std::string NSLICESStr("NSLICES");
483 std::vector<int> TempIntVect;
486 if (! CheckExistKeyword(NRStr)) return false;
487 if (! CheckExistKeyword(NIStr)) return false;
488 if (! CheckExistKeyword(ACQ_sizeStr)) return false;
489 if (! CheckExistKeyword(ACQ_phase_factorStr))return false;
490 if (! CheckExistKeyword(ACQ_ns_list_sizeStr))return false;
491 if (! CheckExistKeyword(NSLICESStr)) return false;
493 TempIntVect.push_back(BrukerDataSet::BrukerHeaderMap[ (std::string) "ACQ_size" ].IntValue[0]);
494 TempIntVect.push_back(BrukerDataSet::BrukerHeaderMap[(std::string) "ACQ_ns_list_size"].IntValue[0]);
495 TempIntVect.push_back(BrukerDataSet::BrukerHeaderMap[(std::string) "ACQ_phase_factor"].IntValue[0]);
496 TempIntVect.push_back(BrukerDataSet::BrukerHeaderMap[(std::string) "NSLICES"].IntValue[0]);
497 if (1<=BrukerDataSet::BrukerHeaderMap[ (std::string) "ACQ_size" ].DimensionNumber ){
498 TempIntVect.push_back(BrukerDataSet::BrukerHeaderMap[ (std::string) "ACQ_size" ].IntValue[1]/BrukerDataSet::BrukerHeaderMap[(std::string) "ACQ_phase_factor"].IntValue[0]);
499 if (2<=BrukerDataSet::BrukerHeaderMap[ (std::string) "ACQ_size" ].DimensionNumber )
501 for(i=2;i<=BrukerDataSet::BrukerHeaderMap[ (std::string) "ACQ_size" ].DimensionNumber;i++)
503 TempIntVect.push_back(BrukerDataSet::BrukerHeaderMap[ (std::string) "ACQ_size" ].IntValue[i]);
507 // Ici, boucles additionnelles si elles existent regroupees en une seule
508 //temp=GetIntValueN(NIStr,1)/(GetIntValueN(NSLICESStr,1)*GetIntValueN(NECHOESStr,1));
509 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]);
511 TempIntVect.push_back(temp);
512 // fin des boucles cachees
514 TempIntVect.push_back(BrukerDataSet::BrukerHeaderMap[ (std::string) "NR" ].IntValue[0]);
516 LoopStructure=TempIntVect;
522 @fn bool BrukerDataSet::SetLoopStructure ( )
523 * @brief method to set the default Bruker loopstructure (not yet able to deal with EPI, SPIRAL or spectroscopic experiments
525 @todo implement multicoil version
527 bool BrukerDataSet::SetLoopStructure ()
529 if (! SetInnerObjectLoopStructure()) return false;
530 if (! SetOuterObjectLoopStructure()) return false;
531 std::vector<int> Inner=GetInnerObjectLoopStructure();
532 std::vector<int> Outer=GetOuterObjectLoopStructure();
533 std::vector<int> TmpVect;
535 TmpVect.insert(TmpVect.end(),Outer.begin(),Outer.end());
536 LoopStructure=TmpVect;
540 std::vector< std :: vector < int > > BrukerDataSet::GetBrukerObjectsLineList() const
542 return BrukerObjectsLineList;
546 bool BrukerDataSet::SetBrukerObjectsLineList ()
549 std::vector<int> Loop =GetLoopStructure();
550 int NumberOfLines, i,j;
554 while (i<Loop.size())
556 NumberOfLines=NumberOfLines*Loop[i];
560 std::vector<int> TempVect (Loop.size()-1,0);
561 std::vector<int> k (Loop.size()-1,0);
562 std::vector<std::vector<int> > TempLineList (NumberOfLines,TempVect);
564 for (i=0;i<NumberOfLines;i++){
565 for (j=1;j<=Loop.size()-1;j++) {
566 if (k[j-1] >= Loop[j]) {
571 for (j=1;j<=Loop.size()-1;j++)
572 TempLineList[i][j-1]=k[j-1];
575 BrukerObjectsLineList=TempLineList;
580 std::vector< std::vector < int > > BrukerDataSet::GetBrukerImageList() const
582 return BrukerImageList;
586 bool BrukerDataSet::SetBrukerImageList ()
588 if (LoopStructure.size()==0)
589 SetImageLoopStructure();
591 std::vector<int> Loop =GetImageLoopStructure();
592 int NumberOfLines, i,j;
596 while (i<Loop.size())
598 NumberOfLines=NumberOfLines*Loop[i];
602 std::vector<int> TempVect (Loop.size()-1,0);
603 std::vector<int> k (Loop.size()-1,0);
604 std::vector<std::vector<int> > TempLineList (NumberOfLines,TempVect);
606 for (i=0;i<NumberOfLines;i++){
607 for (j=1;j<=Loop.size()-1;j++) {
608 if (k[j-1] >= Loop[j]) {
613 for (j=1;j<=Loop.size()-1;j++)
614 TempLineList[i][j-1]=k[j-1];
617 BrukerImageList=TempLineList;
623 std::map<std::string, BrukerFieldData> BrukerDataSet::GetBrukerHeaderMap() const
625 return BrukerHeaderMap;
631 //std::map<std::string, BrukerFieldData> BrukerDataSet::GetBrukerHeaderMap() const
633 // return BrukerHeaderMap;
637 bool BrukerDataSet::SetInnerObjectLoopStructure()
642 * ACQ_size[1..M] (Codage suivant les autres dimensions)
643 NSLICES (Nombre de tranches)
644 ACQ_phase_factor (Facteur turbo de la sequence)
645 ACQ_ns_list_size (Nombre d'echos)
646 ACQ_size[0] (Ligne acq reelle)
651 std::vector<int> TempIntVect;
655 if (! CheckExistKeyword("ACQ_size")) return false;
656 if (! CheckExistKeyword("ACQ_phase_factor"))return false;
657 if (! CheckExistKeyword("ACQ_ns_list_size"))return false;
658 if (! CheckExistKeyword("NSLICES")) return false;
661 //std::cout<< "BrukerDataSet::BrukerHeaderMap[ (std::string) ACQ_size ].IntValue[0]" <<BrukerDataSet::BrukerHeaderMap[ (std::string) "ACQ_size" ].IntValue[0] << std::endl;
662 TempIntVect.push_back(BrukerDataSet::BrukerHeaderMap[ (std::string) "ACQ_size" ].IntValue[0]);
663 //std::cout<< "BrukerDataSet::BrukerHeaderMap[ (std::string) ACQ_size ].IntValue[0]" <<BrukerDataSet::BrukerHeaderMap[ (std::string) "ACQ_size" ].IntValue[0] << std::endl;
664 TempIntVect.push_back(BrukerDataSet::BrukerHeaderMap[(std::string) "ACQ_ns_list_size"].IntValue[0]);
665 //std::cout<<"BrukerDataSet::BrukerHeaderMap[(std::string) ACQ_ns_list_size].IntValue[0]" << BrukerDataSet::BrukerHeaderMap[(std::string) "ACQ_ns_list_size"].IntValue[0] << std::endl;
666 TempIntVect.push_back(BrukerDataSet::BrukerHeaderMap[(std::string) "ACQ_phase_factor"].IntValue[0]);
667 //std::cout<<"BrukerDataSet::BrukerHeaderMap[(std::string) ACQ_phase_factor].IntValue[0]" << BrukerDataSet::BrukerHeaderMap[(std::string) "ACQ_phase_factor"].IntValue[0]<< std::endl;
668 TempIntVect.push_back(BrukerDataSet::BrukerHeaderMap[(std::string) "NSLICES"].IntValue[0]);
669 //std::cout << "BrukerDataSet::BrukerHeaderMap[(std::string) NSLICES].IntValue[0]" << BrukerDataSet::BrukerHeaderMap[(std::string) "NSLICES"].IntValue[0] << std::endl;
670 if (1<=BrukerDataSet::BrukerHeaderMap[ (std::string) "ACQ_size" ].DimensionNumber )
672 TempIntVect.push_back(BrukerDataSet::BrukerHeaderMap[ (std::string) "ACQ_size" ].IntValue[1]/BrukerDataSet::BrukerHeaderMap[(std::string) "ACQ_phase_factor"].IntValue[0]);
673 //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"
674 //].IntValue[1]/BrukerDataSet::BrukerHeaderMap[(std::string) "ACQ_phase_factor"].IntValue[0] << std::endl;
675 if (2<=BrukerDataSet::BrukerHeaderMap[ (std::string) "ACQ_size" ].DimensionNumber )
677 for(i=2;i<=BrukerDataSet::BrukerHeaderMap[ (std::string) "ACQ_size" ].DimensionNumber;i++)
679 TempIntVect.push_back(BrukerDataSet::BrukerHeaderMap[ (std::string) "ACQ_size" ].IntValue[i]);
684 InnerObjectLoopStructure=TempIntVect;
689 std::vector< int > BrukerDataSet::GetInnerObjectLoopStructure() const
691 return InnerObjectLoopStructure;
694 std::vector< int > BrukerDataSet::GetOuterObjectLoopStructure() const
696 return OuterObjectLoopStructure;
700 bool BrukerDataSet::SetOuterObjectLoopStructure ()
702 OuterObjectLoopStructure.clear();
704 NR (Nbre de repetitions)
705 NILoop (Boucle eventuelle extra (Diffusion par exemple) si NI<>(NSLICES x NECHOES) cette boucle est a� NI/(NSLICES x NECHOES)
706 (Attention NILoop peut masquer plusieurs boucles imbriquees !!!!!)
709 std::vector<int> TempIntVect;
711 if (! CheckExistKeyword("NR")) return false;
712 if (! CheckExistKeyword("NI")) return false;
713 // Ici, boucles additionnelles si elles existent regroupees en une seule
714 //temp=GetIntValueN(NIStr,1)/(GetIntValueN(NSLICESStr,1)*GetIntValueN(NECHOESStr,1));
715 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]);
717 TempIntVect.push_back(temp);
718 // fin des boucles cachees
719 TempIntVect.push_back(BrukerDataSet::BrukerHeaderMap[ (std::string) "NR" ].IntValue[0]);
720 OuterObjectLoopStructure=TempIntVect;
725 std::vector< int > BrukerDataSet::GetImageLoopStructure() const
727 return ImageLoopStructure;
731 bool BrukerDataSet::SetImageLoopStructure ( )
733 ImageLoopStructure.clear();
734 std::vector<int> TempIntVect1=GetInnerObjectLoopStructure();
735 std::vector<int> TempIntVect2=GetOuterObjectLoopStructure();
736 std::vector<int> TempIntVect3(TempIntVect1.size(),1);
737 std::vector<int> TempIntVect4;
738 TempIntVect3[1]=TempIntVect1[1];
739 TempIntVect3[3]=TempIntVect1[3];
740 TempIntVect4=TempIntVect3;
741 TempIntVect4.insert(TempIntVect4.end(),TempIntVect2.begin(),TempIntVect2.end());
742 ImageLoopStructure = TempIntVect4;