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
00074 enum recoDim { userdef=0, te, dti, average, cycle, slice, line3d, line, echo, epi, templtype, navigator, freq, channel, readout, repetition, n_recoDims};
00075 static const char* recoDimLabel[]={"userdef", "te","dti","average","cycle","slice","line3d","line","echo","epi","templtype","navigator","freq","channel","readout","repetition"};
00076 static const int n_recoIndexDims=templtype+1;
00077
00078
00080
00081
00090 enum templateType {no_template=0, phasecorr_template, fieldmap_template, grappa_template, n_templateTypes};
00091 static const char templateTypeChar[]={'N', 'P', 'F', 'G'};
00092
00094
00095
00102 enum navigatorType {no_navigator=0, epi_navigator, n_navigatorTypes};
00103 static const char navigatorTypeChar[]={'n', 'e'};
00104
00105
00107
00108
00113 struct kSpaceCoord {
00114
00115 kSpaceCoord() {reset2defaults();}
00116
00117
00118 bool operator == (const kSpaceCoord& ri) const;
00119 bool operator < (const kSpaceCoord& ri) const;
00120
00121
00122 static int string2index(const STD_string& str, recoDim dim);
00123 static STD_string index2string(int index, recoDim dim, int numof=0);
00124
00125 STD_string printcoord(const unsigned short* numof_cache) const;
00126
00127 bool parsecoord(const STD_string& str);
00128 void reset2defaults();
00129
00130 static STD_string print_header(const unsigned short* numof_cache);
00131
00132
00133 mutable unsigned int number;
00134 unsigned int reps;
00135 unsigned short adcSize;
00136 unsigned char channels;
00137 unsigned short preDiscard;
00138 unsigned short postDiscard;
00139 unsigned short concat;
00140 float oversampling;
00141 float relcenter;
00142
00143 short readoutIndex;
00144 short trajIndex;
00145 short weightIndex;
00146 short dtIndex;
00147
00148 unsigned short index[n_recoIndexDims];
00149
00150 unsigned char flags;
00151
00152
00153
00154 private:
00155 friend class JDXkSpaceCoords;
00156
00157 static void assign_parsepos(const STD_string& header);
00158
00159
00160 static int parsepos_number;
00161 static int parsepos_reps;
00162 static int parsepos_adcSize;
00163 static int parsepos_channels;
00164 static int parsepos_preDiscard;
00165 static int parsepos_postDiscard;
00166 static int parsepos_concat;
00167 static int parsepos_oversampling;
00168 static int parsepos_relcenter;
00169 static int parsepos_readoutIndex;
00170 static int parsepos_trajIndex;
00171 static int parsepos_weightIndex;
00172 static int parsepos_dtIndex;
00173 static int parsepos_index[n_recoIndexDims];
00174 static int parsepos_lastinchunk;
00175 static int parsepos_reflect;
00176 static int max_parsepos;
00177
00178 };
00179
00181
00182
00187 class JDXkSpaceCoords : public JcampDxClass {
00188
00189 enum JDXkSpaceCoords_state {coords_in_list, has_vec_cache, has_vec_alloc};
00190
00191 public:
00192 JDXkSpaceCoords();
00193 ~JDXkSpaceCoords() {clear();}
00194
00195 unsigned int size() const {create_vec_cache(); return vec_cache.size();}
00196
00197 const kSpaceCoord& operator [] (unsigned int i) const {create_vec_cache(); return *(vec_cache[i]);}
00198
00199 void clear();
00200
00201 JDXkSpaceCoords& append_coord(const kSpaceCoord& coord);
00202
00203 private:
00204 friend class RecoPars;
00205
00206 void create_vec_cache() const;
00207
00208
00209 bool parsevalstring (const STD_string& parstring);
00210 STD_string printvalstring() const;
00211 STD_ostream& print2stream(STD_ostream& os) const;
00212 const char* get_typeInfo() const {return "kSpaceCoords";}
00213 JcampDxClass* create_copy() const {return new JDXkSpaceCoords(*this);}
00214
00215 mutable STD_list<kSpaceCoord> coordlist;
00216
00217 mutable JDXkSpaceCoords_state state;
00218 mutable STD_vector<kSpaceCoord*> vec_cache;
00219 mutable unsigned short numof_cache[n_recoIndexDims];
00220 };
00221
00223
00228 struct RecoValList : public ValList<int> {
00229 RecoValList(const STD_string& object_label="unnamedRecoValList", unsigned int repetitions=1) : ValList<int>(object_label,repetitions) {}
00230 };
00231
00233
00238 class JDXrecoValList : public RecoValList, public JcampDxClass {
00239
00240 public:
00241 JDXrecoValList(const STD_string& ldrlabel="unnamedJDXrecoValList");
00242 JDXrecoValList(const JDXrecoValList& jdrvl) {JDXrecoValList::operator = (jdrvl);}
00243 JDXrecoValList& operator = (const JDXrecoValList& jdrvl);
00244
00245 JDXrecoValList& operator = (const RecoValList& rvl);
00246
00247
00248 bool parsevalstring (const STD_string& parstring);
00249 STD_string printvalstring() const;
00250 STD_ostream& print2stream(STD_ostream& os) const;
00251 const char* get_typeInfo() const {return "RecoValList";}
00252 JcampDxClass* create_copy() const {return new JDXrecoValList(*this);}
00253
00254 };
00255
00256
00258
00259
00260
00264 class RecoPars : public JcampDxBlock {
00265
00266 public:
00267
00271 RecoPars(const STD_string& label="unnamedRecoPars");
00272
00276 RecoPars(const RecoPars& sr);
00277
00281 RecoPars& operator = (const RecoPars& sr);
00282
00286 const Protocol& get_protocol() const {return prot;}
00287
00291 const JDXkSpaceCoords& get_kSpaceCoords() const {return kSpaceCoords;}
00292
00296 const STD_string& get_DataFormat() const {return DataFormat;}
00297
00301 bool is_LittleEndian() const {return LittleEndian;}
00302
00306 const STD_string& get_RawFile() const {return RawFile;}
00307
00311 unsigned int get_RawHeaderSize() const {return RawHeaderSize;}
00312
00316 const fvector& get_RelativeOffset() const {return RelativeOffset;}
00317
00321 const STD_string& get_ImageProc() const {return ImageProc;}
00322
00326 const dvector& get_DimValues(recoDim dim) const {return DimValues[dim];}
00327
00331 fvector get_ChannelScales() const {return ChannelScaling;}
00332
00336 double get_DwellTime(unsigned int i) const;
00337
00338
00344 int get_NumOfAdcChunks() const;
00345
00346
00350 RecoPars& set_DimValues(recoDim dim, const dvector& vals);
00351
00352
00356 int append_readout_shape(const fvector& shape, unsigned int dstsize);
00357
00361 int append_kspace_traj(const farray& kspace_traj);
00362
00366 int append_adc_weight_vec(const cvector& weightvec);
00367
00371 int append_dwell_time(double dt);
00372
00373
00377 void get_ReadoutShape(unsigned int i, fvector& shape, unsigned int& dstsize) const;
00378
00379
00383 unsigned int numof_kSpaceTraj() const;
00384
00388 const farray& get_kSpaceTraj(unsigned int i) const;
00389
00390
00394 const cvector& get_AdcWeightVector(unsigned int i) const;
00395
00396
00402 LONGEST_INT get_TotalNumOfSamples(bool discard=false) const;
00403
00407 unsigned int numof_adcs() const {return kSpaceOrdering.size();}
00408
00412 const kSpaceCoord& get_kSpaceCoord(unsigned int i) const;
00413
00417 RecoPars& set_Recipe(const STD_string& recipe) {Recipe=recipe; return *this;}
00418
00422 STD_string get_Recipe() const {return Recipe;}
00423
00429 RecoPars& set_PostProc3D(const STD_string& recipe) {PostProc3D=recipe; return *this;}
00430
00436 STD_string get_PostProc3D() const {return PostProc3D;}
00437
00442 RecoPars& set_PreProc3D(const STD_string& recipe) {PreProc3D=recipe; return *this;}
00443
00448 STD_string get_PreProc3D() const {return PreProc3D;}
00449
00453 RecoPars& set_CmdLineOpts(const STD_string& opts) {CmdLineOpts=opts; return *this;}
00454
00459 STD_string get_CmdLineOpts() const {return CmdLineOpts;}
00460
00461
00462 private:
00463 friend class SeqAcq;
00464 friend class SeqEpiDriverParavision;
00465 friend class SeqMethod;
00466
00467 void common_init();
00468
00469 void reset();
00470 void create_cache() const;
00471
00472 void append_all_members();
00473
00474 Protocol prot;
00475
00476 JDXstring DataFormat;
00477 JDXbool LittleEndian;
00478 JDXstring RawFile;
00479 JDXint RawHeaderSize;
00480 JDXtriple RelativeOffset;
00481 JDXstring ImageProc;
00482 JDXfloatArr ChannelScaling;
00483 JDXdoubleArr DwellTime;
00484 JDXfloatArr ReadoutShape[MAX_NUMOF_READOUT_SHAPES];
00485 JDXintArr ReadoutDstSize;
00486 JDXfloatArr kSpaceTraj[MAX_NUMOF_KSPACE_TRAJS];
00487 JDXcomplexArr AdcWeightVector[MAX_NUMOF_ADC_WEIGHTING_VECTORS];
00488 JDXdoubleArr DimValues[n_recoIndexDims];
00489 JDXstring Recipe;
00490 JDXstring PreProc3D;
00491 JDXstring PostProc3D;
00492 JDXstring CmdLineOpts;
00493
00494 JDXkSpaceCoords kSpaceCoords;
00495 JDXrecoValList kSpaceOrdering;
00496
00497 mutable STD_vector<int> kSpaceOrdering_cache;
00498 mutable bool cache_is_up2date;
00499
00500 };
00501
00502
00503
00506
00507
00508
00512 class CoilSensitivity : public JcampDxBlock {
00513
00514 public:
00515
00519 CoilSensitivity(const STD_string& label="unnamedCoilSensitivity");
00520
00524 CoilSensitivity(const CoilSensitivity& cs);
00525
00529 CoilSensitivity& operator = (const CoilSensitivity& cs);
00530
00531
00536 CoilSensitivity& set_sensitivity_map(const carray& sens_map, float FOVx, float FOVy, float FOVz);
00537
00542 STD_complex get_sensitivity_value(unsigned int channel, float x, float y, float z) const;
00543
00547 unsigned int get_numof_channels() const {return SensitivityMap.get_extent()[0];}
00548
00549
00550 private:
00551 void append_all_members();
00552
00553 JDXtriple FOV;
00554 JDXcomplexArr SensitivityMap;
00555 };
00556
00557
00559
00560
00561
00567 #endif