00001 00014 #ifndef ALGO_FEM_DECODER_BASE_HH 00015 #define ALGO_FEM_DECODER_BASE_HH 00016 00017 #include "algo_base.hh" 00018 00034 class algo_fem_decoder_base : public algo_base { 00035 00036 public: 00037 00039 struct InfoFEM_t { 00040 00041 PMT::word_t module_address; 00042 PMT::word_t module_id; 00043 PMT::word_t event_id; 00044 PMT::word_t event_frame_id; 00045 PMT::word_t trigger_frame_id; 00046 PMT::word_t trigger_timeslice; 00047 PMT::word_t nwords; 00048 PMT::word_t checksum; 00049 bool quality; 00050 00051 void clear_event(){ 00052 00053 module_address = PMT::INVALID_WORD; 00054 module_id = PMT::INVALID_WORD; 00055 event_id = PMT::INVALID_WORD; 00056 event_frame_id = PMT::INVALID_WORD; 00057 trigger_frame_id = PMT::INVALID_WORD; 00058 trigger_timeslice = PMT::INVALID_WORD; 00059 nwords = 0; 00060 checksum = 0; 00061 quality = true; 00062 } 00063 00064 InfoFEM_t(){ clear_event(); } 00065 00066 }; 00067 00068 public: 00069 00071 algo_fem_decoder_base(); 00072 00074 virtual ~algo_fem_decoder_base(){}; 00075 00077 virtual bool process_word(const PMT::word_t word); 00078 00080 virtual inline PMT::PMT_WORD get_word_class(const PMT::word_t word) const { 00081 if ( (word & 0xf000) == 0xf000 ) 00082 return PMT::FEM_HEADER; 00083 else if( (word & 0xf000) == 0x4000 ) 00084 return PMT::FEM_FIRST_WORD; 00085 else if( (word & 0xf000) == 0x9000 ) 00086 return PMT::CHANNEL_HEADER; 00087 else if( (word & 0xf000) == 0xa000 ) 00088 return PMT::CHANNEL_WORD; 00089 else if( (word & 0xf000) == 0xb000 ) 00090 return PMT::CHANNEL_LAST_WORD; 00091 else if( (word & 0xf000) == 0xc000 ) 00092 return PMT::FEM_LAST_WORD; 00093 else 00094 return PMT::UNDEFINED_WORD; 00095 } 00096 00098 virtual bool check_event_quality(){return true;}; 00099 00101 virtual void reset(); 00102 00104 PMT::word_t round_diff(PMT::word_t ref_id, PMT::word_t subject_id, PMT::word_t diff) const; 00105 00107 virtual bool is_event_empty(){ return (_header_info.event_id == PMT::INVALID_WORD);}; 00108 00109 protected: 00110 00112 virtual bool store_event()=0; 00113 00115 virtual void clear_event(){_event_header_count=0; _header_info.clear_event();}; 00116 00118 virtual bool process_fem_header(const PMT::word_t word, PMT::word_t &last_word); 00119 00121 virtual bool decode_fem_header(const PMT::word_t *event_header); 00122 00127 virtual bool process_event_header(const PMT::word_t word, PMT::word_t &last_word)=0; 00128 00134 virtual bool process_ch_word(const PMT::word_t word, 00135 PMT::word_t &last_word) = 0; 00136 00141 virtual bool process_fem_last_word(const PMT::word_t word, 00142 PMT::word_t &last_word) = 0; 00143 00148 virtual bool process_event_last_word(const PMT::word_t word, 00149 PMT::word_t &last_word) = 0; 00150 00151 virtual bool add_huffman_adc(std::vector<UShort_t> &wf, size_t zero_count); 00152 00153 // 00154 // Constants 00155 // 00156 // Comment out the following if you deal with an older format with 1 less header 00157 #define INCLUDE_EXTRA_HEADER 00158 #ifdef INCLUDE_EXTRA_HEADER 00159 static const size_t FEM_HEADER_COUNT=6; 00160 #else 00161 static const size_t FEM_HEADER_COUNT=5; 00162 #endif 00163 00164 // variables 00165 PMT::word_t _event_header_words[FEM_HEADER_COUNT]; 00166 00167 // 00168 // Run control variable 00169 // 00170 PMT::word_t _last_word; 00171 size_t _event_header_count; 00172 00173 bool _search_for_next_event; 00174 InfoFEM_t _header_info; 00175 }; 00176 00177 #endif 00178 // end of doxygen group
1.4.7