00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef SYSTEM_H
00019 #define SYSTEM_H
00020
00021 #include <tjutils/tjhandler.h>
00022
00023 #include <odinpara/jdxblock.h>
00024 #include <odinpara/jdxnumbers.h>
00025 #include <odinpara/jdxarrays.h>
00026 #include <odinpara/odinpara.h>
00027
00028
00029
00030 #define _DEFAULT_B0_ 3000 // 3 Tesla
00031 #define _DEFAULT_MAX_SYSTEM_GRADIENT_ 0.04
00032 #define _DEFAULT_MAX_SYSTEM_SLEWRATE_ 0.2
00033
00034
00039 enum odinPlatform {standalone=0, paravision, numaris_4, epic, numof_platforms};
00040
00046 enum objCategory {unknownObj=0,delayObj,pulsObj,gradObj,loopObj,acqObj,freqObj,syncObj,endObj};
00047
00049
00054 class Nuclei {
00055
00056 public:
00057 Nuclei();
00058
00062 double get_gamma(const STD_string& nucName) const;
00063
00067 double get_nuc_freq(const STD_string& nucName,float B0) const;
00068
00069
00073 JDXenum get_nuc_enum() const;
00074
00075 private:
00076 typedef STD_pair<STD_string, double> Nucleus;
00077 typedef STD_list<Nucleus> NucList;
00078
00079 NucList nuclist;
00080 };
00081
00083
00091 class System : public JcampDxBlock {
00092
00093 public:
00094
00098 System(const STD_string& object_label="unnamedSystem");
00099
00103 System(const System& s) {System::operator = (s);}
00104
00108 System& operator = (const System& s);
00109
00113 odinPlatform get_platform() const;
00114
00118 STD_string get_platform_str() const {return platformstr;}
00119
00123 STD_string get_transmit_coil_name() const {return transmit_coil_name;}
00124
00128 System& set_transmit_coil_name(const STD_string& tcname);
00129
00133 STD_string get_main_nucleus() const {return main_nucleus;}
00134
00138 System& set_main_nucleus(const STD_string& nucname);
00139
00143 float get_max_grad() const {return max_grad;}
00144
00148 float get_max_slew_rate() const {return max_slew_rate;}
00149
00153 float get_grad_switch_time(float graddiff) const;
00154
00158 float get_inter_grad_delay() const {return inter_grad_delay;}
00159
00163 System& set_scandir(const STD_string& dir);
00164
00168 STD_string get_scandir() const;
00169
00170
00174 float get_grad_shift_delay() const {return grad_shift;}
00175
00179 double get_B0() const {return B0;}
00180
00185 System& set_B0_from_freq(double freq, const STD_string& nucName="");
00186
00190 double get_gamma(const STD_string& nucName="") const;
00191
00195 System& set_reference_gain(float refgain);
00196
00200 float get_reference_gain() const {return reference_gain;}
00201
00205 double get_nuc_freq(const STD_string& nucName="") const;
00206
00207
00211 JDXenum get_nuc_enum() const;
00212
00216 double get_min_duration(objCategory c) const {return min_duration[c];}
00217
00221 double get_min_grad_rastertime() const {return min_grad_rastertime;}
00222
00226 double get_rastertime(objCategory cat) const;
00227
00231 double get_rasteredtime(objCategory cat, double time) const;
00232
00236 int get_max_rf_samples() const {return max_rf_samples;}
00237
00241 int get_max_grad_samples() const {return max_grad_samples;}
00242
00246 System& set_data_type(const STD_string& type) {datatype=type; return *this;}
00247
00251 STD_string get_data_type() const {return datatype;}
00252
00253
00259 bool allowed_grad_freq(double freq, double& low, double& upp) const;
00260
00261
00262 private:
00263 friend class SeqMethod;
00264 friend class SeqIdea;
00265 friend class SeqParavision;
00266 friend class SeqStandAlone;
00267 friend class SeqEpic;
00268
00269
00270 int load(const STD_string &filename);
00271
00272
00273
00274
00275 int append_all_members();
00276
00277 Nuclei nuc;
00278
00279 JDXstring platformstr;
00280 JDXenum main_nucleus;
00281 JDXdouble max_grad;
00282 JDXdouble max_slew_rate;
00283 JDXdouble grad_shift;
00284 JDXdouble inter_grad_delay;
00285 JDXdouble B0;
00286 JDXdouble reference_gain;
00287 JDXstring transmit_coil_name;
00288
00289 JDXdouble delay_rastertime;
00290 JDXdouble rf_rastertime;
00291 JDXdouble grad_rastertime;
00292 JDXdouble min_grad_rastertime;
00293 JDXdouble acq_rastertime;
00294
00295 JDXint max_rf_samples;
00296 JDXint max_grad_samples;
00297 JDXstring datatype;
00298
00299 JDXdoubleArr grad_reson_center;
00300 JDXdoubleArr grad_reson_width;
00301
00302
00303 STD_string scandir;
00304
00305 dvector min_duration;
00306
00307 };
00308
00309
00311
00317 class SystemInterface : public StaticHandler<SystemInterface> {
00318 public:
00319
00320 SystemInterface() {}
00321
00322 System& operator * () {return *get_sysinfo_ptr();}
00323 const System& operator * () const {return *get_const_sysinfo_ptr();}
00324
00325 System* operator -> () {return get_sysinfo_ptr();}
00326 const System* operator -> () const {return get_const_sysinfo_ptr();}
00327
00328
00329 static void init_static();
00330 static void destroy_static();
00331
00332 static void set_current_pf(odinPlatform pf);
00333
00334 static odinPlatform get_current_pf() {
00335 if(current_pf) return odinPlatform(current_pf->operator int ());
00336
00337 return odinPlatform(0);
00338 }
00339
00340
00341 private:
00342
00343 friend class SeqIdea;
00344 friend class SeqParavision;
00345 friend class SeqStandAlone;
00346 friend class SeqEpic;
00347
00348
00349
00350 static System* get_sysinfo_ptr();
00351 static const System* get_const_sysinfo_ptr();
00352
00353
00354 static SingletonHandler<JDXint,false> current_pf;
00355
00356
00357 static SingletonHandler<System,false>* systemInfo_platform;
00358 };
00359
00360
00361
00362 #endif