algo_slow_readout_decoder.hh

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

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