00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef RECO_H
00019 #define RECO_H
00020
00021 #include <tjutils/tjvallist.h>
00022
00023 #include <odinpara/protocol.h>
00024
00025
00031
00032 #define MAX_NUMOF_READOUT_SHAPES 10
00033 #define MAX_NUMOF_KSPACE_TRAJS 10
00034 #define MAX_NUMOF_ADC_WEIGHTING_VECTORS 10
00035
00036 #define PROTOCOL_BLOCK_LABEL "Protocol"
00037
00044 enum recoFlags {
00045 recoLastInChunkBit =1,
00046 recoReflectBit =2,
00047 recoEpiNavPolarityBit =4,
00048 recoAllBits =255
00049 };
00050
00051
00053
00072 enum recoDim { userdef=0, te, average, cycle, slice, line3d, line, echo, templtype, navigator, freq, channel, readout, repetition, n_recoDims};
00073 static const char* recoDimLabel[]={"userdef", "te","average","cycle","slice","line3d","line","echo","templtype","navigator","freq","channel","readout","repetition"};
00074 static const int n_recoIndexDims=templtype+1;
00075
00076
00078
00079
00088 enum templateType {no_template=0, phasecorr_template, fieldmap_template, grappa_template, n_templateTypes};
00089 static const char templateTypeChar[]={'N', 'P', 'F', 'G'};
00090
00092
00093
00100 enum navigatorType {no_navigator=0, epi_navigator, n_navigatorTypes};
00101 static const char navigatorTypeChar[]={'n', 'e'};
00102
00103
00105
00106
00111 struct kSpaceCoord {
00112
00113 kSpaceCoord() {reset2defaults();}
00114
00115
00116 bool operator == (const kSpaceCoord& ri) const;
00117 bool operator < (const kSpaceCoord& ri) const;
00118
00119
00120 static int string2index(const STD_string& str, recoDim dim);
00121 static STD_string index2string(int index, recoDim dim, int numof=0);
00122
00123 STD_string printcoord(const unsigned short* numof_cache) const;
00124
00125 bool parsecoord(const STD_string& str);
00126 void reset2defaults();
00127
00128 static STD_string print_header(const unsigned short* numof_cache);
00129
00130
00131 mutable int number;
00132 int reps;
00133 short adcSize;
00134 unsigned char channels;
00135 short preDiscard;
00136 short postDiscard;
00137 short concat;
00138 float oversampling;
00139
00140 short readoutIndex;
00141 short trajIndex;
00142 short weightIndex;
00143 short dtIndex;
00144
00145 short index[n_recoIndexDims];
00146
00147 unsigned char flags;
00148
00149
00150
00151 private:
00152 friend class JDXkSpaceCoords;
00153
00154 static void assign_parsepos(const STD_string& header);
00155
00156
00157 static int parsepos_number;
00158 static int parsepos_reps;
00159 static int parsepos_adcSize;
00160 static int parsepos_channels;
00161 static int parsepos_preDiscard;
00162 static int parsepos_postDiscard;
00163 static int parsepos_concat;
00164 static int parsepos_oversampling;
00165 static int parsepos_readoutIndex;
00166 static int parsepos_trajIndex;
00167 static int parsepos_weightIndex;
00168 static int parsepos_dtIndex;
00169 static int parsepos_index[n_recoIndexDims];
00170 static int parsepos_lastinchunk;
00171 static int parsepos_reflect;
00172 static int max_parsepos;
00173
00174 };
00175
00177
00178
00183 class JDXkSpaceCoords : public JcampDxClass {
00184
00185 enum JDXkSpaceCoords_state {coords_in_list, has_vec_cache, has_vec_alloc};
00186
00187 public:
00188 JDXkSpaceCoords();
00189 ~JDXkSpaceCoords() {clear();}
00190
00191 unsigned int size() const {create_vec_cache(); return vec_cache.size();}
00192
00193 const kSpaceCoord& operator [] (unsigned int i) const {create_vec_cache(); return *(vec_cache[i]);}
00194
00195 void clear();
00196
00197 JDXkSpaceCoords& append_coord(const kSpaceCoord& coord);
00198
00199 private:
00200 friend class RecoPars;
00201
00202 void create_vec_cache() const;
00203
00204
00205 bool parsevalstring (const STD_string& parstring);
00206 STD_string printvalstring() const;
00207 STD_ostream& print2stream(STD_ostream& os) const;
00208 const char* get_typeInfo() const {return "kSpaceCoords";}
00209 JcampDxClass* create_copy() const {return new JDXkSpaceCoords(*this);}
00210
00211 mutable STD_list<kSpaceCoord> coordlist;
00212
00213 mutable JDXkSpaceCoords_state state;
00214 mutable STD_vector<kSpaceCoord*> vec_cache;
00215 mutable unsigned short numof_cache[n_recoIndexDims];
00216 };
00217
00219
00224 struct RecoValList : public ValList<int> {
00225 RecoValList(const STD_string& object_label="unnamedRecoValList", unsigned int repetitions=1) : ValList<int>(object_label,repetitions) {}
00226 };
00227
00229
00234 class JDXrecoValList : public RecoValList, public JcampDxClass {
00235
00236 public:
00237 JDXrecoValList(const STD_string& ldrlabel="unnamedJDXrecoValList");
00238 JDXrecoValList(const JDXrecoValList& jdrvl) {JDXrecoValList::operator = (jdrvl);}
00239 JDXrecoValList& operator = (const JDXrecoValList& jdrvl);
00240
00241 JDXrecoValList& operator = (const RecoValList& rvl);
00242
00243
00244 bool parsevalstring (const STD_string& parstring);
00245 STD_string printvalstring() const;
00246 STD_ostream& print2stream(STD_ostream& os) const;
00247 const char* get_typeInfo() const {return "RecoValList";}
00248 JcampDxClass* create_copy() const {return new JDXrecoValList(*this);}
00249
00250 };
00251
00252
00254
00255
00256
00260 class RecoPars : public JcampDxBlock {
00261
00262 public:
00263
00267 RecoPars(const STD_string& label="unnamedRecoPars");
00268
00272 RecoPars(const RecoPars& sr);
00273
00277 RecoPars& operator = (const RecoPars& sr);
00278
00282 const Protocol& get_protocol() const {return prot;}
00283
00287 const JDXkSpaceCoords& get_kSpaceCoords() const {return kSpaceCoords;}
00288
00292 const STD_string& get_DataFormat() const {return DataFormat;}
00293
00297 bool is_LittleEndian() const {return LittleEndian;}
00298
00302 const STD_string& get_RawFile() const {return RawFile;}
00303
00307 unsigned int get_RawHeaderSize() const {return RawHeaderSize;}
00308
00312 const fvector& get_RelativeOffset() const {return RelativeOffset;}
00313
00317 const STD_string& get_ImageProc() const {return ImageProc;}
00318
00322 const dvector& get_DimValues(recoDim dim) const {return DimValues[dim];}
00323
00327 fvector get_ChannelScales() const {return ChannelScaling;}
00328
00332 double get_DwellTime(unsigned int i) const;
00333
00334
00340 int get_NumOfAdcChunks() const;
00341
00342
00346 RecoPars& set_DimValues(recoDim dim, const dvector& vals);
00347
00348
00352 int append_readout_shape(const fvector& shape, unsigned int dstsize);
00353
00357 int append_kspace_traj(const farray& kspace_traj);
00358
00362 int append_adc_weight_vec(const cvector& weightvec);
00363
00367 int append_dwell_time(double dt);
00368
00369
00373 void get_ReadoutShape(unsigned int i, fvector& shape, unsigned int& dstsize) const;
00374
00375
00379 unsigned int numof_kSpaceTraj() const;
00380
00384 const farray& get_kSpaceTraj(unsigned int i) const;
00385
00386
00390 const cvector& get_AdcWeightVector(unsigned int i) const;
00391
00392
00398 LONGEST_INT get_TotalNumOfSamples(bool discard=false) const;
00399
00403 unsigned int numof_adcs() const {return kSpaceOrdering.size();}
00404
00408 const kSpaceCoord& get_kSpaceCoord(unsigned int i) const;
00409
00413 RecoPars& set_Recipe(const STD_string& recipe) {Recipe=recipe; return *this;}
00414
00418 STD_string get_Recipe() const {return Recipe;}
00419
00425 RecoPars& set_PostProc3D(const STD_string& recipe) {PostProc3D=recipe; return *this;}
00426
00432 STD_string get_PostProc3D() const {return PostProc3D;}
00433
00438 RecoPars& set_PreProc3D(const STD_string& recipe) {PreProc3D=recipe; return *this;}
00439
00444 STD_string get_PreProc3D() const {return PreProc3D;}
00445
00449 RecoPars& set_CmdLineOpts(const STD_string& opts) {CmdLineOpts=opts; return *this;}
00450
00455 STD_string get_CmdLineOpts() const {return CmdLineOpts;}
00456
00457
00458 private:
00459 friend class SeqAcq;
00460 friend class SeqEpiDriverParavision;
00461 friend class SeqMethod;
00462
00463 void common_init();
00464
00465 void reset();
00466 void create_cache() const;
00467
00468 void append_all_members();
00469
00470 Protocol prot;
00471
00472 JDXstring DataFormat;
00473 JDXbool LittleEndian;
00474 JDXstring RawFile;
00475 JDXint RawHeaderSize;
00476 JDXtriple RelativeOffset;
00477 JDXstring ImageProc;
00478 JDXfloatArr ChannelScaling;
00479 JDXdoubleArr DwellTime;
00480 JDXfloatArr ReadoutShape[MAX_NUMOF_READOUT_SHAPES];
00481 JDXintArr ReadoutDstSize;
00482 JDXfloatArr kSpaceTraj[MAX_NUMOF_KSPACE_TRAJS];
00483 JDXcomplexArr AdcWeightVector[MAX_NUMOF_ADC_WEIGHTING_VECTORS];
00484 JDXdoubleArr DimValues[n_recoIndexDims];
00485 JDXstring Recipe;
00486 JDXstring PreProc3D;
00487 JDXstring PostProc3D;
00488 JDXstring CmdLineOpts;
00489
00490 JDXkSpaceCoords kSpaceCoords;
00491 JDXrecoValList kSpaceOrdering;
00492
00493 mutable STD_vector<int> kSpaceOrdering_cache;
00494 mutable bool cache_is_up2date;
00495
00496 };
00497
00498
00499
00502
00503
00504
00508 class CoilSensitivity : public JcampDxBlock {
00509
00510 public:
00511
00515 CoilSensitivity(const STD_string& label="unnamedCoilSensitivity");
00516
00520 CoilSensitivity(const CoilSensitivity& cs);
00521
00525 CoilSensitivity& operator = (const CoilSensitivity& cs);
00526
00527
00532 CoilSensitivity& set_sensitivity_map(const carray& sens_map, float FOVx, float FOVy, float FOVz);
00533
00538 STD_complex get_sensitivity_value(unsigned int channel, float x, float y, float z) const;
00539
00543 unsigned int get_numof_channels() const {return SensitivityMap.get_extent()[0];}
00544
00545
00546 private:
00547 void append_all_members();
00548
00549 JDXtriple FOV;
00550 JDXcomplexArr SensitivityMap;
00551 };
00552
00553
00555
00556
00557
00563 #endif