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
1.4.7