-static char rcsId[] = "$Id: evt.c,v 6.7 2000-05-22 08:20:48 hades Exp $";
+static char rcsId[] = "$Id: evt.c,v 6.8 2000-10-10 10:33:38 hades Exp $";
 
 #define _ANSI_C_SOURCE
 #include <stddef.h>
        EvtIdx_date,
        EvtIdx_time,
        EvtIdx_runNr,
-       EvtIdx_pad,
+       EvtIdx_expId,
        EvtIdx_data
 };
 
        Evt_setHdrValue(my, EvtIdx_runNr, runNr);
 }
 
+UInt4 Evt_expId(const void *my)
+{
+       return Evt_hdrValue(my, EvtIdx_expId);
+}
+
+void Evt_setExpId(void *my, UInt4 expId)
+{
+       Evt_setHdrValue(my, EvtIdx_expId, expId);
+}
+
+char *Evt_expId2charP(const void *my)
+{
+       static char buffer[3];
+       UInt4 expId;
+
+       expId = Evt_expId(my);
+
+       buffer[0] = (expId >> 8) & 0xff;
+       buffer[1] = expId & 0xff;
+       buffer[2] = '\0';
+
+       return buffer;
+}
+
+void Evt_setExpIdCharP(void *my, const char *expId)
+{
+       Evt_setExpId(my, (expId[0] << 8) | expId[1]);
+}
+
 char *Evt_date2charP(const void *my)
 {
        time_t tempo;
 
        sprintf(buf,
                        "size: %08x\tdecoding: %08x\tid: %08x\tseqNr: %08x\n"
-                       "date: %s\ttime: %s\trunNr: %d",
+                       "date: %s\ttime: %s\trunNr: %d\texpId: %x",
                        Evt_size(my), Evt_decoding(my), Evt_id(my), Evt_seqNr(my),
-                       Evt_date2charP(my), Evt_time2charP(my), Evt_runNr(my)
+                       Evt_date2charP(my), Evt_time2charP(my), Evt_runNr(my), Evt_expId(my)
                );
 
        return buf;
 }
 
-void *newEvt(UInt4 decoding, UInt4 id, UInt4 runNr)
+void *newEvt(UInt4 decoding, UInt4 id, UInt4 runNr, const char *expId)
 {
        void *my;
        static UInt4 seqNr = 0;
        Evt_setDecoding(my, decoding);
        Evt_setId(my, id);
        Evt_setRunNr(my, runNr);
+       Evt_setExpIdCharP(my, expId);
 
        Evt_setSeqNr(my, seqNr++);
 
 
-static char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/evtbuild.c,v 6.17 2000-05-22 16:26:06 hades Exp $";
+static char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/evtbuild.c,v 6.18 2000-10-10 10:33:38 hades Exp $";
+
+#define _POSIX_C_SOURCE 199309L
 
-#define _XOPEN_SOURCE
 #include <unistd.h>
 
 #include <errno.h>
        return my;
 }
 
-#if 0
-/* BUGBUG Tape handling needs complete new implementation */
-static FILE *openTape(const char *outPath)
-{
-       FILE *outFile;
-       int fd[2];
-       char path[_POSIX_PATH_MAX];
-
-       strcpy(path, "of=");
-       strcat(path, outPath);
-
-       if (0 > pipe(fd)) {
-               msglog(LOG_DEBUG, "%s, %d: %s\n", __FILE__, __LINE__, strerror(errno));
-               return NULL;
-       }
-       switch (fork()) {
-       case -1:
-               msglog(LOG_DEBUG, "%s, %d: %s\n", __FILE__, __LINE__, strerror(errno));
-               return NULL;
-               break;
-       case 0:
-               if (-1 == close(0)) {
-                       msglog(LOG_ERR, "%s, %d: %s\n", __FILE__, __LINE__, strerror(errno));
-                       exit(EXIT_FAILURE);
-               }
-               if (0 != dup(fd[0])) {
-                       msglog(LOG_ERR, "%s, %d: %s\n", __FILE__, __LINE__, strerror(errno));
-                       exit(EXIT_FAILURE);
-               }
-               if (-1 == close(fd[0])) {
-                       msglog(LOG_ERR, "%s, %d: %s\n", __FILE__, __LINE__, strerror(errno));
-                       exit(EXIT_FAILURE);
-               }
-               if (-1 == close(fd[1])) {
-                       msglog(LOG_ERR, "%s, %d: %s\n", __FILE__, __LINE__, strerror(errno));
-                       exit(EXIT_FAILURE);
-               }
-               if (-1 == execlp("dd", "dd", "ibs=1024k", "obs=8192", path, NULL)) {
-                       msglog(LOG_ERR, "%s, %d: %s\n", __FILE__, __LINE__, strerror(errno));
-                       exit(EXIT_FAILURE);
-               }
-               break;
-       default:
-               outFile = fdopen(fd[1], "wb");
-               if (-1 == close(fd[0])) {
-                       msglog(LOG_DEBUG, "%s, %d: %s\n", __FILE__, __LINE__, strerror(errno));
-                       return NULL;
-               }
-               break;
-       }
-       return outFile;
-}
-#endif
-
 static void usage(const char *progName)
 {
-       msglog(LOG_ERR, "Usage: %s -s nrOfSubEvts [...] [-r runNr]\n", progName);
-       msglog(LOG_ERR, "Usage: [-m nrOfMsgs]\n");
+       msglog(LOG_ERR, "Usage: %s [-x expId]\n", progName);
+       msglog(LOG_ERR, "Usage: [-m nrOfMsgs] [-r runNr]\n");
        msglog(LOG_ERR, "Usage: [-f slowCtrlFile ...] [-o outPath] [-d null|tape|file]\n");
        msglog(LOG_ERR, "Usage: [-a (agent)] [-p priority]\n");
        msglog_usage();
        int isStandalone;
        int nrOfMsgs;
        void *evt;
-       char *outPath;
+       char outPath[_POSIX_PATH_MAX] = "";
+       char fileName[_POSIX_PATH_MAX];
        char *outDev;
        int priority;
        FILE *outFile;
        AnsiTape *outTape;
        void *subEvt;
-       UInt4 nrOfSubEvts = 0;
+       UInt4 nrOfSubEvts;
+       time_t t;
        UInt4 runNr;
+       char expId[3] = "xx";
        char **slowCtrlFiles;
        int slowCtrlFileCnt;
        size_t queueSize;
        unsigned long *evtsComplete;
        unsigned long *bytesWritten;
 
+       t = time(NULL);
+
        msglog_setlevel(argv[0], "info");
        isStandalone = 1;
        nrOfMsgs = 0;
        slowCtrlFiles = NULL;
        slowCtrlFileCnt = 0;
-       outPath = "-";
        outDev = "null";
        priority = 0;
-       runNr = time(NULL);
+       runNr = t;
        queueSize = 1 * 1024 * 1024;
 
-       while ((i = getopt(argc, argv, "am:f:r:s:o:d:p:v:")) != -1) {
+       while ((i = getopt(argc, argv, "am:f:s:r:o:d:p:v:x:")) != -1) {
                switch (i) {
                case 'a':
                        isStandalone = 0;
                        runNr = atoi(optarg);
                        break;
                case 's':
-                       nrOfSubEvts = atoi(optarg);
+                       msglog(LOG_WARNING,
+                               "-s option obsolete, will be removed in a future version\n");
                        break;
                case 'o':
-                       outPath = optarg;
+                       strcpy(outPath, optarg);
                        break;
                case 'd':
                        outDev = optarg;
                                exit(EXIT_FAILURE);
                        }
                        break;
+               case 'x':
+                       expId[0] = tolower(optarg[0]);
+                       expId[1] = tolower(optarg[1]);
+                       expId[2] = '\0';
+                       break;
                default:
                        usage(argv[0]);
                        exit(EXIT_FAILURE);
                }
        }
 
-       if (nrOfSubEvts == 0) {
-               msglog(LOG_ERR, "missing nrOfSubEvts\n");
-               usage(argv[0]);
-               exit(EXIT_FAILURE);
-       }
-       if (nrOfMsgs == 0) {
-               msglog(LOG_NOTICE, "nrOfMsgs not set, assuming readout is local\n");
+       /* construct a default filename */
+       strcpy(fileName, expId);
+       strftime(fileName + strlen(fileName), 18, "%y%j%H%M%S.hld", localtime(&t));
+
+       /* construct the output path */
+       if (strcmp(outPath, "") == 0) {
+               strcpy(outPath, fileName);
+       } else {
+               struct stat bufS, *buf = &bufS;
+
+               stat(outPath, buf);
+               if (S_ISDIR(buf->st_mode)) {
+                       strcat(outPath, "/");
+                       strcat(outPath, fileName);
+               }
        }
+
        if (NULL == (worker = Worker_initBegin(argv[0], sigHandler, priority, isStandalone))) {
                msglog(LOG_ERR, "%s, %d: %s\n", __FILE__, __LINE__, strerror(errno));
                exit(EXIT_FAILURE);
        }
        if (strcmp(outDev, "null") == 0) {
                outFile = NULL;
+       } else if (strcmp(outDev, "stdout") == 0) {
+               outFile = stdout;
        } else if (strcmp(outDev, "file") == 0) {
-               if (strcmp(outPath, "-") == 0) {
-                       outFile = stdout;
-               } else {
-                       if (NULL == (outFile = fopen(outPath, "wb"))) {
-                               msglog(LOG_ERR, "%s, %d: %s\n", __FILE__, __LINE__, strerror(errno));
-                               exit(EXIT_FAILURE);
-                       }
+               if (NULL == (outFile = fopen(outPath, "wb"))) {
+                       msglog(LOG_ERR, "%s, %d: %s\n", __FILE__, __LINE__, strerror(errno));
+                       exit(EXIT_FAILURE);
                }
        } else if (strcmp(outDev, "tape") == 0) {
                if (NULL == (outTape = openAnsiTape(outPath))) {
                   readout task (daq_readout) is running on the same node and
                   communicates directly via shared memory
                 */
+               msglog(LOG_NOTICE, "nrOfMsgs not set, assuming readout is local\n");
+
                shmTrans = allocMem(sizeof(ShmTrans *));
                hadTuQueue = allocMem(sizeof(HadTuQueue *));
 
        bytesWritten = Worker_addStatistic(worker, "bytesWritten");
        Worker_initEnd(worker);
 
-       evt = newEvt(EvtDecoding_64bitAligned, EvtId_runStart, runNr);
+       evt = newEvt(EvtDecoding_64bitAligned, EvtId_runStart, runNr, expId);
        for (i = 0; i < slowCtrlFileCnt; i++) {
                evt = appendFile(evt, slowCtrlFiles[i]);
        }
        }
        deleteEvt(evt);
 
+       nrOfSubEvts = nrOfMsgs;
        currTrigNr = 0xffffffff;
        while (setjmp(terminateJmp) == 0) {
                int tryNext;
 
                i = 0;
                tryNext = 0;
-               evt = newEvt(EvtDecoding_64bitAligned, EvtId_data, runNr);
+               evt = newEvt(EvtDecoding_64bitAligned, EvtId_data, runNr, expId);
                currNrOfSubEvts = 0;
                while (i < nrOfMsgs) {
                        if (hadTuQueue[i] == NULL) {
        }
        Worker_dump(worker, 0);
 
-       evt = newEvt(EvtDecoding_64bitAligned, EvtId_runStop, runNr);
+       evt = newEvt(EvtDecoding_64bitAligned, EvtId_runStop, runNr, expId);
        for (i = 0; i < slowCtrlFileCnt; i++) {
                evt = appendFile(evt, slowCtrlFiles[i]);
        }
 
-static char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/showevt.c,v 6.3 2000-02-03 18:35:27 muench Stab $";
+static char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/hadaq/showevt.c,v 6.4 2000-10-10 10:33:38 hades Exp $";
 
 #define _ANSI_C_SOURCE
 #include <stddef.h>
 
        /* print the event header */
        printf(
-                       "size: 0x%08x  decoding: 0x%08x  id: 0x%08x  seqNr: 0x%08x\n"
-                         "date: %s  time: %s  runNr: 0x%08x\n",
-                  Evt_size(evt), Evt_decoding(evt), Evt_id(evt), Evt_seqNr(evt),
-                         Evt_date2charP(evt), Evt_time2charP(evt), Evt_runNr(evt)
+               "size: 0x%08x  decoding: 0x%08x  id:    0x%08x  seqNr:  0x%08x\n"
+               "date: %s  time:     %s    runNr: 0x%08x  expId:  %s\n",
+               Evt_size(evt), Evt_decoding(evt), Evt_id(evt), Evt_seqNr(evt),
+               Evt_date2charP(evt), Evt_time2charP(evt), Evt_runNr(evt),
+               Evt_expId2charP(evt)
                );
 
        i = 0;
        /* loop over all subevents */
        for (subEvt = Evt_data(evt); subEvt < Evt_end(evt); subEvt = Evt_next(evt, subEvt)) {
-               printf("size: 0x%08x  decoding: 0x%08x  id: 0x%08x  trigNr: 0x%08x\n",
+               printf("size: 0x%08x  decoding: 0x%08x  id:    0x%08x  trigNr: 0x%08x\n",
                           SubEvt_size(subEvt), SubEvt_decoding(subEvt), SubEvt_id(subEvt), SubEvt_trigNr(subEvt));
                if (SubEvt_decoding(subEvt) == SubEvtDecoding_32bitData) {
                        for (i = 0; i < SubEvt_dataSize(subEvt) / sizeof(UInt4); i++) {