xmit_event_search.cc

Go to the documentation of this file.
00001 #ifndef XMIT_EVENT_SEARCH_CC
00002 #define XMIT_EVENT_SEARCH_CC
00003 
00004 #include "xmit_event_search.hh"
00005 
00006 const size_t xmit_event_search::XMIT_INDEX_EVENT_ID = 3;
00007 const size_t xmit_event_search::SLOW_INDEX_EVENT_ID = 2;
00008 
00009 xmit_event_search::xmit_event_search() : 
00010   decoder_base() 
00011 {
00012   _continue_mode=false;
00013   _target_id=PMT::INVALID_WORD;
00014   _fin.set_format(FORMAT::BINARY);
00015   _fin.set_mode(bin_io_handler::READ);
00016   _read_by_block=true;
00017   _index_event_id=0x0;
00018   _slow_readout=false;
00019   _algo = 0;
00020 
00021 }
00022 
00023 bool xmit_event_search::run() {
00024 
00025   if(_target_id==PMT::INVALID_WORD){
00026     Message::send(MSG::ERROR,__FUNCTION__,"Event ID not specified!");
00027     return false;
00028   }
00029 
00030   _index_event_id = _slow_readout ? SLOW_INDEX_EVENT_ID : XMIT_INDEX_EVENT_ID;
00031 
00032   if(_algo) delete _algo;
00033 
00034   _algo = (_slow_readout) ? (new algo_slow_readout_decoder) : (new algo_xmit_decoder);  
00035   
00036   _target_id = (0xf0000000 + ((_target_id & 0xfff) << 16) + 0x0000f000 + ((_target_id >> 12) & 0xfff));
00037   
00038   std::vector<PMT::word_t> word_array(4,0);
00039   PMT::word_t word=0x0;
00040   bool fire=false;
00041 
00042   _fin.set_verbosity(MSG::ERROR);
00043   _fin.open();
00044   
00045   if(!_fin.is_open()) return false;
00046   
00047   while(1){
00048 
00049     word = (_read_by_block) ? _fin.read_multi_word() : _fin.read_word();
00050     word = _fin.read_word();
00051 
00052     if(_fin.eof()) break;
00053 
00054     if(fire && new_event(word)){
00055 
00056       word_array.push_back(word);
00057 
00058       if(!_continue_mode) break;
00059 
00060       print_word(&word_array);
00061 
00062       fire=false;
00063       word_array.clear();
00064       word_array.reserve(_index_event_id+1);
00065       for(size_t i=0; i<=_index_event_id; i++)
00066     word_array.push_back(0x0);
00067     }
00068 
00069     if(!fire){
00070 
00071       for(size_t i=0; i<_index_event_id; i++)
00072     word_array[i]=word_array[i+1];
00073 
00074       word_array[_index_event_id] = word;
00075 
00076       if(new_event(word_array[0]) && word_array[_index_event_id]==_target_id){
00077     fire=true;
00078       }
00079     }else
00080       word_array.push_back(word);
00081   }
00082   
00083   if(!_continue_mode){
00084     print_word(&word_array);
00085   }
00086   
00087   _fin.close();
00088   return true;
00089 }
00090 
00091 void xmit_event_search::print_word(std::vector<PMT::word_t> *in_array){
00092 
00093   size_t ctr=0;
00094   std::string msg("");
00095 
00096   std::vector<PMT::word_t> word_array;
00097   word_array.reserve(in_array->size() * 2);
00098   for(std::vector<PMT::word_t>::const_iterator iter(in_array->begin());
00099       iter!=in_array->end();
00100       ++iter){
00101     word_array.push_back( (*iter) & 0xffff);
00102     word_array.push_back( (*iter) >> 16 );
00103   }
00104 
00105   for(std::vector<PMT::word_t>::const_iterator iter(word_array.begin());
00106       iter!=word_array.end();
00107       ++iter){
00108 
00109     PMT::PMT_WORD word_type=_algo->get_word_class((*iter));
00110     
00111     switch(word_type){
00112     case PMT::UNDEFINED_WORD:
00113     case PMT::CHANNEL_WORD:
00114       msg+=Form(" %04x ",(*iter));
00115       break;
00116     case PMT::EVENT_HEADER:
00117     case PMT::FEM_HEADER:
00118     case PMT::EVENT_LAST_WORD:
00119       msg+=" \033[93m";
00120       msg+=Form("%04x ",(*iter));
00121       msg+="\033[0m";
00122     break;
00123     case PMT::FEM_FIRST_WORD:
00124     case PMT::FEM_LAST_WORD:
00125       msg+=" \033[91m";
00126       msg+=Form("%04x ",(*iter));
00127       msg+="\033[0m";
00128       break;
00129     case PMT::CHANNEL_HEADER:
00130     case PMT::CHANNEL_LAST_WORD:
00131       msg+=" \033[95m";
00132       msg+=Form("%04x ",(*iter));
00133       msg+="\033[0m";
00134       break;
00135     }
00136     ctr+=1;
00137     if(ctr && ctr%8==0){
00138       std::cout<<msg.c_str()<<std::endl;
00139       msg="";
00140     }
00141   }
00142   if(msg.size()>0) std::cout<<msg.c_str()<<std::endl;
00143   std::cout<<" ... continue to next event ... " <<std::endl;
00144 }
00145 
00146 
00147 
00148 
00149 #endif

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