algo_fem_decoder_base.hh

Go to the documentation of this file.
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 

Generated on Mon Apr 7 15:35:12 2014 for MyProject by  doxygen 1.4.7