00001 #include <Decoder-TypeDef.hh>
00002 #include <Algorithm-TypeDef.hh>
00003 #include <vector>
00004 #include <TString.h>
00005 #include <cstdlib>
00006 void print_word(std::vector<PMT::word_t> *in_array);
00007
00008 int main(int argc, char** argv){
00009
00010
00011 if ( argc < 3)
00012 {
00013 std::cerr << std::endl
00014 << Form("Usage: %s [FLAG] [ARG]",argv[0]) << std::endl << std::endl
00015 << "Mandatory flags:" << std::endl
00016 << "-i [input file] ... specify input filename (full or relative path) here." << std::endl
00017 << "-n [event id] ... specify the target event id." << std::endl
00018 << std::endl
00019 << "Optional flags:" << std::endl
00020 << "-f [format] ... specify input file format. 0=binary (default), 1=ASCII." << std::endl
00021
00022 << "-c ... when specified, continues to EOF even after target event is found."<<std::endl
00023 << std::endl;
00024 exit(1);
00025 }
00026
00027
00028
00029 bool read_through=false;
00030 bool bin_format=true;
00031
00032 bin_io_handler fin;
00033 fin.set_mode(bin_io_handler::READ);
00034 fin.set_format(FORMAT::BINARY);
00035
00036 PMT::word_t target_id = PMT::INVALID_WORD;
00037
00038 char c;
00039 while ( (c=getopt(argc,argv,"i:f:n:c")) != -1 ) {
00040
00041 switch (c) {
00042 case 'i':
00043 fin.set_filename(optarg);
00044 Message::send(MSG::NORMAL,__FUNCTION__,Form("Input file: %s",optarg));
00045 break;
00046 case 'f':
00047 if(std::atoi(optarg)==0) {
00048 fin.set_format(FORMAT::BINARY);
00049 Message::send(MSG::NORMAL,__FUNCTION__,"Set format: BINARY");
00050 }else if(std::atoi(optarg)==1){
00051 fin.set_format(FORMAT::ASCII);
00052 Message::send(MSG::NORMAL,__FUNCTION__,"Set format: ASCII");
00053 }else{
00054 Message::send(MSG::ERROR,__FUNCTION__,
00055 Form("Invalid argument for -f: %s",optarg));
00056 exit(1);
00057 }
00058 break;
00059 case 'n':
00060 target_id=(PMT::word_t)(std::atoi(optarg));
00061 Message::send(MSG::NORMAL,__FUNCTION__,
00062 Form("Set target event ID: %d",target_id));
00063 break;
00064 case 'c':
00065 read_through=true;
00066 Message::send(MSG::NORMAL,__FUNCTION__,
00067 "Throughout mode set ... continue scanning till the EOF.");
00068 break;
00069 }
00070 }
00071
00072 if(target_id==PMT::INVALID_WORD){
00073 Message::send(MSG::ERROR,__FUNCTION__,"Event ID not specified!");
00074 exit(1);
00075 }
00076
00077 target_id = (0xf0000000 + ((target_id & 0xfff) << 16) + 0x0000f000 + ((target_id >> 12) & 0xfff));
00078
00079 const PMT::word_t key_header=0xffffffff;
00080
00081 std::vector<PMT::word_t> word_array(4,0);
00082 PMT::word_t word=0x0;
00083 bool fire=false;
00084 fin.open();
00085
00086 if(!fin.is_open()) exit(1);
00087
00088 while(1){
00089
00090 word = fin.read_word();
00091
00092 if(fin.eof()) break;
00093 if(fire && word==key_header) {
00094
00095 word_array.push_back(word);
00096
00097 if(!read_through) break;
00098
00099 print_word(&word_array);
00100
00101 fire=false;
00102 word_array.clear();
00103 word_array.reserve(4);
00104 word_array.push_back(0);
00105 word_array.push_back(0);
00106 word_array.push_back(0);
00107 word_array.push_back(0);
00108 }
00109
00110 if(!fire){
00111 word_array[0]=word_array[1];
00112 word_array[1]=word_array[2];
00113 word_array[2]=word_array[3];
00114 word_array[3]=word;
00115
00116 if(word_array[0]==key_header && word_array[3]==target_id){
00117 fire=true;
00118 }
00119 }else
00120 word_array.push_back(word);
00121 }
00122
00123 if(!read_through){
00124 print_word(&word_array);
00125 }
00126
00127 fin.close();
00128 }
00129
00130 void print_word(std::vector<PMT::word_t> *in_array){
00131
00132 algo_xmit_decoder algo;
00133 size_t ctr=0;
00134 std::string msg("");
00135
00136 std::vector<PMT::word_t> word_array;
00137 word_array.reserve(in_array->size() * 2);
00138 for(std::vector<PMT::word_t>::const_iterator iter(in_array->begin());
00139 iter!=in_array->end();
00140 ++iter){
00141 word_array.push_back( (*iter) & 0xffff);
00142 word_array.push_back( (*iter) >> 16 );
00143 }
00144
00145 for(std::vector<PMT::word_t>::const_iterator iter(word_array.begin());
00146 iter!=word_array.end();
00147 ++iter){
00148
00149 PMT::PMT_WORD word_type=algo.get_word_class((*iter));
00150
00151 switch(word_type){
00152 case PMT::UNDEFINED_WORD:
00153 case PMT::CHANNEL_WORD:
00154 msg+=Form(" %04x ",(*iter));
00155 break;
00156 case PMT::EVENT_FIRST_HEADER:
00157 case PMT::EVENT_HEADER:
00158 case PMT::EVENT_LAST_WORD:
00159 msg+=" \033[93m";
00160 msg+=Form("%04x ",(*iter));
00161 msg+="\033[0m";
00162 break;
00163 case PMT::FIRST_WORD:
00164 case PMT::FEM_LAST_WORD:
00165 msg+=" \033[91m";
00166 msg+=Form("%04x ",(*iter));
00167 msg+="\033[0m";
00168 break;
00169 case PMT::CHANNEL_HEADER:
00170 case PMT::CHANNEL_LAST_WORD:
00171 msg+=" \033[95m";
00172 msg+=Form("%04x ",(*iter));
00173 msg+="\033[0m";
00174 break;
00175 }
00176 ctr+=1;
00177 if(ctr && ctr%8==0){
00178 std::cout<<msg.c_str()<<std::endl;
00179 msg="";
00180 }
00181 }
00182 if(msg.size()>0) std::cout<<msg.c_str()<<std::endl;
00183 std::cout<<" ... continue to next event ... " <<std::endl;
00184 }
00185
00186