00001
00002
00003
00004
00005
00006
00007
00008
00009 #include <stdio.h>
00010 #include <sys/time.h>
00011 #include <assert.h>
00012 #include <signal.h>
00013 #include <errno.h>
00014 #include <stdlib.h>
00015 #include <string.h>
00016
00017 #include "TMidasOnline.h"
00018 #include "TMidasEvent.h"
00019 #include "TMidasFile.h"
00020
00021 #ifdef HAVE_ROOT
00022 #include "XmlOdb.h"
00023 #endif
00024
00025 #include "VirtualOdb.h"
00026
00027 #include <vector>
00028
00029 VirtualOdb* gOdb = NULL;
00030
00031 int gEventCutoff = 0;
00032 bool gSaveOdb = false;
00033 bool gPrintBank = false;
00034
00035 void HandleMidasEvent(TMidasEvent& event)
00036 {
00037 int eventId = event.GetEventId();
00038 if (gPrintBank)
00039 event.Print("a");
00040 else
00041 event.Print();
00042 }
00043
00044 int ProcessMidasFile(const char*fname)
00045 {
00046 TMidasFile f;
00047 bool tryOpen = f.Open(fname);
00048
00049 if (!tryOpen)
00050 {
00051 printf("Cannot open input file \"%s\"\n",fname);
00052 return -1;
00053 }
00054
00055 int i=0;
00056 while (1)
00057 {
00058 TMidasEvent event;
00059 if (!f.Read(&event))
00060 break;
00061
00062 int eventId = event.GetEventId();
00063
00064
00065 if ((eventId & 0xFFFF) == 0x8000)
00066 {
00067
00068 event.Print();
00069
00070 if (gSaveOdb)
00071 {
00072 char fname[256];
00073
00074 char* ptr = event.GetData();
00075 int size = event.GetDataSize();
00076
00077 if (strncmp(ptr, "<?xml", 5) == 0)
00078 sprintf(fname,"odb%05d.xml", event.GetSerialNumber());
00079 else
00080 sprintf(fname,"odb%05d.odb", event.GetSerialNumber());
00081
00082 FILE* fp = fopen(fname,"w");
00083 if (!fp)
00084 {
00085 fprintf(stderr,"Error: Cannot write ODB to \'%s\', errno %d (%s)\n", fname, errno, strerror(errno));
00086 exit(1);
00087 }
00088
00089 fwrite(ptr, size, 1, fp);
00090 fclose(fp);
00091
00092 fprintf(stderr,"Wrote ODB to \'%s\'\n", fname);
00093 exit(0);
00094 }
00095
00096
00097
00098
00099 if (gOdb)
00100 delete gOdb;
00101 gOdb = NULL;
00102 #ifdef HAVE_ROOT
00103 gOdb = new XmlOdb(event.GetData(),event.GetDataSize());
00104 #endif
00105 }
00106 else if ((eventId & 0xFFFF) == 0x8001)
00107 {
00108
00109 event.Print();
00110 }
00111 else if ((eventId & 0xFFFF) == 0x8002)
00112 {
00113
00114 event.Print();
00115 printf("Log message: %s\n", event.GetData());
00116 }
00117 else
00118 {
00119 event.SetBankList();
00120
00121 HandleMidasEvent(event);
00122 }
00123
00124 if((i%500)==0)
00125 {
00126 printf("Processing event %d\n",i);
00127 }
00128
00129 i++;
00130 if ((gEventCutoff!=0)&&(i>=gEventCutoff))
00131 {
00132 printf("Reached event %d, exiting loop.\n", i);
00133 break;
00134 }
00135 }
00136
00137 f.Close();
00138
00139 return 0;
00140 }
00141
00142 #ifdef HAVE_MIDAS
00143
00144 void startRun(int transition,int run,int time)
00145 {
00146 printf("Begin run: %d\n", run);
00147 }
00148
00149 void endRun(int transition,int run,int time)
00150 {
00151 printf("End of run %d\n",run);
00152 }
00153
00154 int ProcessMidasOnline(const char* hostname, const char* exptname)
00155 {
00156 TMidasOnline *midas = TMidasOnline::instance();
00157
00158 int err = midas->connect(hostname, exptname, "rootana");
00159 if (err != 0)
00160 {
00161 fprintf(stderr,"Cannot connect to MIDAS, error %d\n", err);
00162 return -1;
00163 }
00164
00165 gOdb = midas;
00166
00167 midas->setTransitionHandlers(startRun,endRun,NULL,NULL);
00168 midas->registerTransitions();
00169
00170
00171
00172 int req = midas->eventRequest("SYSTEM",-1,-1,(1<<1), true);
00173
00174 int i=0;
00175 while (1)
00176 {
00177 char pevent[100*1024];
00178 int size = midas->receiveEvent(req, pevent, sizeof(pevent), true);
00179
00180 if (size == 0)
00181 {
00182 if (!midas->poll(1000))
00183 break;
00184 continue;
00185 }
00186
00187 if (size <= 0)
00188 break;
00189
00190 TMidasEvent event;
00191 memcpy(event.GetEventHeader(), pevent, sizeof(TMidas_EVENT_HEADER));
00192 event.SetData(size, pevent+sizeof(TMidas_EVENT_HEADER));
00193 event.SetBankList();
00194 HandleMidasEvent(event);
00195
00196 if ((i%500)==0)
00197 {
00198 printf("Processing event %d\n",i);
00199 }
00200
00201 i++;
00202 if ((gEventCutoff!=0) && (i>=gEventCutoff))
00203 {
00204 printf("Reached event %d, exiting loop.\n", i);
00205 break;
00206 }
00207 }
00208
00209
00210 midas->disconnect();
00211
00212 return 0;
00213 }
00214
00215 #endif
00216
00217 void help()
00218 {
00219 printf("\nUsage:\n");
00220 printf("\n./event_dump.exe [-h] [-Hhostname] [-Eexptname] [-p] [-O] [-eMaxEvents] [file1 file2 ...]\n");
00221 printf("\n");
00222 printf("\t-h: print this help message\n");
00223 printf("\t-Hhostname: connect to MIDAS experiment on given host\n");
00224 printf("\t-Eexptname: connect to this MIDAS experiment\n");
00225 printf("\t-O: save ODB from midas data file into odbNNNN.xml or .odb file\n");
00226 printf("\t-e: Number of events to read from input data files\n");
00227 printf("\t-p: Print bank contents\n");
00228 printf("\n");
00229 printf("Example1: print online events: ./event_dump.exe\n");
00230 printf("Example2: print events from file: ./event_dump.exe /data/alpha/current/run00500.mid.gz\n");
00231 exit(1);
00232 }
00233
00234
00235
00236 int main(int argc, char *argv[])
00237 {
00238 setbuf(stdout,NULL);
00239 setbuf(stderr,NULL);
00240
00241 signal(SIGILL, SIG_DFL);
00242 signal(SIGBUS, SIG_DFL);
00243 signal(SIGSEGV, SIG_DFL);
00244 signal(SIGPIPE, SIG_DFL);
00245
00246 std::vector<std::string> args;
00247 for (int i=0; i<argc; i++)
00248 {
00249 if (strcmp(argv[i],"-h")==0)
00250 help();
00251 args.push_back(argv[i]);
00252 }
00253
00254 const char* hostname = NULL;
00255 const char* exptname = NULL;
00256
00257 for (unsigned int i=1; i<args.size(); i++)
00258 {
00259 const char* arg = args[i].c_str();
00260
00261
00262 if (strncmp(arg,"-e",2)==0)
00263 gEventCutoff = atoi(arg+2);
00264 else if (strncmp(arg,"-H",2)==0)
00265 hostname = strdup(arg+2);
00266 else if (strncmp(arg,"-E",2)==0)
00267 exptname = strdup(arg+2);
00268 else if (strncmp(arg,"-O",2)==0)
00269 gSaveOdb = true;
00270 else if (strncmp(arg,"-p",2)==0)
00271 gPrintBank = true;
00272 else if (strcmp(arg,"-h")==0)
00273 help();
00274 else if (arg[0] == '-')
00275 help();
00276 }
00277
00278 bool flag = false;
00279
00280 for (unsigned int i=1; i<args.size(); i++)
00281 {
00282 const char* arg = args[i].c_str();
00283
00284 if (arg[0] != '-')
00285 {
00286 flag = true;
00287 ProcessMidasFile(arg);
00288 }
00289 }
00290
00291
00292
00293 if (flag)
00294 return 0;
00295
00296 #ifdef HAVE_MIDAS
00297 ProcessMidasOnline(hostname, exptname);
00298 #endif
00299
00300 return 0;
00301 }
00302
00303