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