00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include <stdio.h>
00014 #include <unistd.h>
00015 #include <getopt.h>
00016 #include <sys/types.h>
00017 #include <stdlib.h>
00018
00019 #include <rtsLog.h>
00020 #include <rtsSystems.h>
00021
00022
00023 #include <DAQ_READER/daqReader.h>
00024 #include <DAQ_READER/daq_dta.h>
00025
00026 void displayHelp()
00027 {
00028 LOG(ERR,"Usage: daqFileChopper filename <filterlist>");
00029 LOG(ERR," filterlist --> -trg xxx yyy zzz... // list of offline trigger bits");
00030 LOG(ERR," -dtrg xxx yyy zzz... // list of daq trigger bits");
00031 LOG(ERR," -eventnum xxx yyy... // list of event numbers");
00032 }
00033
00034
00035
00036
00037
00038 int FilterEvent(daqReader *rdr, int nargs, char *argv[])
00039 {
00040 int eventNumber = rdr->seq;
00041
00042 if(strcmp(argv[0], "-trg")==0) {
00043 unsigned int bits = rdr->daqbits;
00044 for(int i=0;i<32;i++) {
00045 if(bits & (1<<i)) {
00046 int trgSat = rdr->getOfflineId(i);
00047
00048 for(int j=1;j<nargs;j++) {
00049 if(trgSat == atoi(argv[j])) {
00050 return 1;
00051 }
00052 }
00053 }
00054 }
00055 }
00056 else if(strcmp(argv[0], "-dtrg")==0) {
00057 unsigned int bits = rdr->daqbits;
00058 for(int i=1;i<nargs;i++) {
00059 int trg = atoi(argv[i]);
00060 if(bits & (1<<trg)) return 1;
00061 }
00062 }
00063 else if(strcmp(argv[0], "-eventnum")==0) {
00064 for(int i=1;i<nargs;i++) {
00065 if(eventNumber == atoi(argv[i])) {
00066 return 1;
00067 }
00068 }
00069 }
00070 else {
00071 displayHelp();
00072 exit(0);
00073 }
00074 return 0;
00075 }
00076
00077 int main(int argc, char *argv[])
00078 {
00079 rtsLogOutput(RTS_LOG_STDERR) ;
00080 rtsLogLevel(WARN) ;
00081
00082 if(argc < 3) {
00083 displayHelp();
00084
00085 exit(0);
00086 }
00087
00088 int filterArgc = argc-2;
00089 char **filterArgv = &argv[2];
00090
00091 daqReader *evp;
00092 evp = new daqReader(argv[1]) ;
00093
00094 int good=0;
00095 int bad=0;
00096
00097 for(;;) {
00098 char *ret = evp->get(0,EVP_TYPE_ANY);
00099
00100 if(ret) {
00101 if(evp->status) {
00102 LOG(ERR,"evp status is non-null [0x08X, %d dec]",evp->status,evp->status) ;
00103 continue ;
00104 }
00105 good++;
00106 }
00107 else {
00108 switch(evp->status) {
00109 case EVP_STAT_OK:
00110 continue;
00111 case EVP_STAT_EOR:
00112 LOG(OPER, "Done after scanning %d events (%d bad)",good,bad);
00113 break;
00114 case EVP_STAT_EVT:
00115 bad++;
00116 LOG(WARN, "Problem getting event - skipping [good %d, bad %d]",good,bad);
00117 continue;
00118 case EVP_STAT_CRIT:
00119 LOG(CRIT,"evp->status CRITICAL (?)") ;
00120 return -1;
00121 }
00122 }
00123
00124 if(evp->status == EVP_STAT_EOR) {
00125 LOG(INFO,"Done after scanning %d events (%d bad)",good,bad) ;
00126 break;
00127 }
00128
00129 if(FilterEvent(evp, filterArgc, filterArgv) == 0) {
00130 continue;
00131 }
00132 LOG(INFO, "Keep event #%d (ptr=0x%x sz=%d)",evp->seq,evp->memmap->mem,evp->event_size);
00133
00134 write(STDOUT_FILENO, evp->memmap->mem, evp->event_size);
00135 }
00136
00137 delete evp ;
00138 return 0 ;
00139 }