00001 00014 #ifndef ALGO_SLOW_READOUT_DECODER_HH 00015 #define ALGO_SLOW_READOUT_DECODER_HH 00016 00017 #include "algo_base.hh" 00018 00026 class algo_slow_readout_decoder : public algo_base { 00027 00028 public: 00029 00030 enum PROCESS_FLAG{ 00031 READ_HEADER=0, 00032 READ_CHANNEL 00033 }; 00034 00035 public: 00036 00038 algo_slow_readout_decoder(); 00039 00041 virtual ~algo_slow_readout_decoder(){}; 00042 00044 void print_adcval(bool doit=true){_print_adcval=doit;}; 00045 00047 virtual bool process_word(const PMT::word_t word); 00048 00050 virtual inline PMT::PMT_WORD get_word_class(const PMT::word_t word) const { 00051 if ( (word & 0xf000) == 0xf000 ) 00052 return PMT::FEM_HEADER; 00053 else if( (word & 0xf000) == 0x4000 ) 00054 return PMT::FEM_FIRST_WORD; 00055 else if( (word & 0xf000) == 0x9000 ) 00056 return PMT::CHANNEL_HEADER; 00057 else if( (word & 0xf000) == 0xa000 ) 00058 return PMT::CHANNEL_WORD; 00059 else if( (word & 0xf000) == 0xb000 ) 00060 return PMT::CHANNEL_LAST_WORD; 00061 else if( (word & 0xf000) == 0xc000 ) 00062 return PMT::FEM_LAST_WORD; 00063 else 00064 return PMT::UNDEFINED_WORD; 00065 } 00066 00072 PMT::word_t round_diff(PMT::word_t ref_id, PMT::word_t subject_id, PMT::word_t diff) const; 00073 00075 virtual bool check_event_quality(); 00076 00080 const pmt_waveform* get_current_ch_data(){return &_ch_data;}; 00081 00083 virtual void reset(); 00084 00086 virtual bool is_event_empty(){ 00087 if(_event_data) return (_event_data->event_id()==PMT::INVALID_WORD); 00088 else return true; 00089 }; 00090 00091 protected: 00092 00094 virtual void init_ch_info(); 00095 00097 virtual void init_event_info(); 00098 00100 virtual bool process_header(const PMT::word_t word); 00101 00103 virtual bool decode_event_header(const PMT::word_t *event_header); 00104 00106 virtual bool process_ch_word(const PMT::word_t word, 00107 PMT::word_t &last_word); 00108 00110 virtual bool decode_ch_word(const PMT::word_t word, 00111 const PMT::PMT_WORD last_word_class); 00112 00114 void print_adc_values(); 00115 00117 void store_ch_data(); 00118 00120 void apply_beamgate_correction(); 00121 00122 // 00123 // Constants 00124 // 00125 // Comment out the following if you deal with an older format with 1 less header 00126 #define INCLUDE_EXTRA_HEADER 00127 #ifdef INCLUDE_EXTRA_HEADER 00128 static const size_t FEM_HEADER_COUNT=6; 00129 #else 00130 static const size_t FEM_HEADER_COUNT=5; 00131 #endif 00132 static const size_t CHANNEL_HEADER_COUNT=2; 00133 00134 // variables 00135 PMT::word_t _event_header_words[FEM_HEADER_COUNT]; 00136 pmt_waveform _ch_data; 00137 pmt_wf_collection *_event_data; 00138 PMT::DISCRIMINATOR _last_disc_id; 00139 PMT::ch_number_t _last_channel_number; 00140 00141 // 00142 // Run control variable 00143 // 00144 PROCESS_FLAG _process; 00145 bool _continue_to_next_event; 00146 bool _print_adcval; 00147 bool _beam_event; 00148 PMT::word_t _beam_ref_nwords; 00149 PMT::word_t _beam_ref_sample; 00150 PMT::word_t _beam_ref_frame; 00151 PMT::word_t _last_word; 00152 size_t _channel_header_count; 00153 size_t _event_header_count; 00154 00155 }; 00156 #endif 00157 // end of doxygen group
1.4.7