File indexing completed on 2025-08-03 08:20:45
0001 #include "fileEventiterator.h"
0002 #include "testEventiterator.h"
0003 #include "phenixTypes.h"
0004 #include "A_Event.h"
0005 #include "ogzBuffer.h"
0006 #include "ophBuffer.h"
0007 #include "ospBuffer.h"
0008 #include "EventTypes.h"
0009 #include "oEvent.h"
0010
0011 #include <cstdlib>
0012 #include <unistd.h>
0013 #include <cstdio>
0014
0015 #include <string>
0016 #include <vector>
0017
0018 #ifdef HAVE_GETOPT_H
0019 #include <getopt.h>
0020 #endif
0021
0022 #define DDEVENTITERATOR 1
0023 #define FILEEVENTITERATOR 2
0024 #define TESTEVENTITERATOR 3
0025 #define DDPOOL 4
0026 #define DFILE 5
0027 #define DNULL 6
0028
0029 #if defined(SunOS) || defined(Linux) || defined(OSF1)
0030 #include <cstring>
0031 #else
0032 #include <bstring.h>
0033 #endif
0034
0035
0036
0037 #include <sys/types.h>
0038 #include <sys/stat.h>
0039 #include <fcntl.h>
0040
0041 using namespace std;
0042
0043 #if defined(SunOS) || defined(Linux) || defined(OSF1)
0044 void sig_handler(int);
0045 #else
0046 void sig_handler(...);
0047 #endif
0048
0049
0050 void exitmsg()
0051 {
0052 COUT << "** usage: eventcombiner outputfile inputfile1 inputfile2 ..." << std::endl;
0053 COUT << " eventcombiner -h for more help" << std::endl;
0054 exit(0);
0055 }
0056
0057 void exithelp()
0058 {
0059 COUT << std::endl;
0060 COUT << " Syntax:"<< std::endl;
0061 COUT << std::endl;
0062 COUT << " eventcombiner [-v] [-i] [-n number] [-u] [-p] [-h] inputfile1 inputfile2 ..."<< std::endl;
0063 COUT << " e.g eventcombiner -v /export/rcfdata/dcm_data/built_evt/rc_3612.prdfz /export/rcfdata/dcm_data/rc/*3612*" << std::endl;
0064 COUT << " will combine all the *3612* (from one run number) together in the file. "<< std::endl;
0065 COUT << " Options:" << std::endl;
0066 COUT << " -v verbose, without that it does its work silently" << std::endl;
0067 COUT << " -i identify the events as they are processed, good for debugging" << std::endl;
0068 COUT << " -e <event number> start with event number (number in evt. header)" << std::endl;
0069 COUT << " -c <event number> start with nth event" << std::endl;
0070 COUT << " -n <number> stop after so many events" << std::endl;
0071 COUT << " -p read and write legacy PHENIX format data, default is sPHENIX "<< std::endl;
0072
0073 COUT << " -f force output file overwrite, normally you cannot overwrite an existing file (safety belt)"<< std::endl;
0074 COUT << " -x ignore event numbers (allow non-matching evt nrs to be combined, DANGEROUS)"<< std::endl;
0075 COUT << " -h this message" << std::endl;
0076 exit(0);
0077 }
0078
0079 void evtcountexitmsg()
0080 {
0081 COUT << "** cannot specify both -e and -c!" << std::endl;
0082 COUT << " type eventcombiner -h for more help" << std::endl;
0083 exit(0);
0084 }
0085
0086 oBuffer *ob;
0087 int fd;
0088 int file_open = 0;
0089
0090 int
0091 main(int argc, char *argv[])
0092 {
0093 int c;
0094 int status;
0095
0096 int eventnumber =0;
0097 int countnumber =0;
0098 int forceflag =0;
0099 int verbose = 0;
0100 int identify = 0;
0101 int maxevents = 0;
0102 int eventnr = 0;
0103 int ignoreeventnr = 0;
0104
0105 int legacyphenix = 0;
0106
0107 extern char *optarg;
0108 extern int optind;
0109
0110 PHDWORD *buffer;
0111
0112
0113 fd = 0;
0114 ob = 0;
0115
0116
0117 int buffer_size = 256*1024*64;
0118
0119
0120
0121 while ((c = getopt(argc, argv, "n:c:e:vipfhx")) != EOF)
0122 {
0123
0124 switch (c)
0125 {
0126
0127 case 'v':
0128 verbose = 1;
0129 break;
0130
0131 case 'i':
0132 identify = 1;
0133 break;
0134
0135 case 'f':
0136 forceflag = 1;
0137 break;
0138
0139
0140
0141
0142
0143 case 'p':
0144 legacyphenix = 1;
0145 break;
0146
0147 case 'x':
0148 ignoreeventnr = 1;
0149 break;
0150
0151 case 'e':
0152 if ( !sscanf(optarg, "%d", &eventnumber) ) exitmsg();
0153 break;
0154
0155 case 'c':
0156 if ( !sscanf(optarg, "%d", &countnumber) ) exitmsg();
0157 break;
0158
0159 case 'n':
0160 if ( !sscanf(optarg, "%d", &maxevents) ) exitmsg();
0161 break;
0162
0163 case 'h':
0164 exithelp();
0165 break;
0166
0167 default:
0168 break;
0169
0170 }
0171 }
0172
0173 if (argc < 3) exitmsg();
0174
0175 if ( eventnumber && countnumber) evtcountexitmsg();
0176
0177 vector<Eventiterator *> it;
0178 vector<Event *>evt;
0179
0180 int index;
0181
0182 string filename;
0183
0184 filename =argv[optind];
0185
0186
0187
0188 fd = open(filename.c_str(), O_RDONLY | O_LARGEFILE);
0189 if (fd > 0 )
0190 {
0191 if ( ! forceflag)
0192 {
0193 COUT << "file " << filename << " exists - I won't override it" << std::endl;
0194 COUT << " use -f to force" << std::endl;
0195 exit(1);
0196 }
0197 close (fd);
0198 }
0199 for ( index = optind+1; index < argc; index++ )
0200 {
0201 COUT << "reading from file " << argv[index] << std::endl;
0202 Eventiterator *itx = new fileEventiterator(argv[index], status);
0203 if (status)
0204 {
0205 COUT << "could not open " << argv[index] << std::endl;
0206 exit(1);
0207 }
0208 it.push_back(itx);
0209
0210 }
0211
0212 buffer = new PHDWORD [buffer_size];
0213
0214
0215 int go_on = 1;
0216
0217 unlink (filename.c_str());
0218
0219 fd = open(filename.c_str(),
0220 O_WRONLY | O_CREAT | O_EXCL | O_LARGEFILE ,
0221 S_IRWXU | S_IROTH | S_IRGRP );
0222
0223
0224 if ( fd < 0 )
0225 {
0226 COUT << "Could not open file: " << filename << std::endl;
0227 exit (1);
0228 }
0229 if (verbose) COUT << "Opened file: " << filename << std::endl;
0230
0231 if (legacyphenix)
0232 {
0233 ob = new ophBuffer (fd, buffer, buffer_size);
0234 }
0235 else
0236 {
0237 ob = new ospBuffer (fd, buffer, buffer_size);
0238 }
0239
0240 int count = 0;
0241
0242 while ( ( maxevents == 0 || eventnr < maxevents) && go_on)
0243 {
0244 int total_length = 0;
0245 int enr = 0;
0246
0247 vector<Eventiterator *>::iterator it_itr;
0248 Event *e = 0;
0249
0250 for (it_itr = it.begin(); it_itr != it.end(); ++it_itr)
0251 {
0252 e = (*it_itr)->getNextEvent();
0253 if ( !e )
0254 {
0255 go_on = 0;
0256 }
0257 else
0258 {
0259 total_length += e->getEvtLength();
0260 }
0261 evt.push_back(e);
0262 }
0263 if (! go_on ) break;
0264
0265 int *out = new int[total_length];
0266
0267 int nwout;
0268 int current = 0;
0269 int take_this = 1;
0270
0271 if ( eventnumber && e != 0 && e->getEvtSequence() < eventnumber) take_this = 0;
0272
0273 if ( countnumber && count+1 < countnumber) take_this = 0;
0274
0275 vector<Event *>::iterator evt_itr;
0276 for (evt_itr = evt.begin(); evt_itr != evt.end(); ++evt_itr)
0277 {
0278 if (evt_itr == evt.begin() )
0279 {
0280 enr = (*evt_itr)->getEvtSequence();
0281 (*evt_itr)->Copy ( out , total_length , &nwout);
0282 current = nwout;
0283 delete (*evt_itr);
0284 }
0285 else
0286 {
0287 if (take_this ==0 || (ignoreeventnr ==0 && (*evt_itr)->getEvtSequence() != enr ))
0288 {
0289 take_this = 0;
0290 }
0291 else
0292 {
0293 (*evt_itr)->Copy ( &out[current] , total_length-current , &nwout, "DATA");
0294 current += nwout;
0295 out[0] += nwout;
0296 delete (*evt_itr);
0297 }
0298 }
0299 }
0300
0301 if (take_this)
0302 {
0303 Event *E = new oncsEvent(out);
0304 if (identify) E->identify();
0305
0306 ob->addEvent(E);
0307 delete E;
0308 eventnr++;
0309 }
0310 count++;
0311 delete [] out;
0312 evt.clear();
0313
0314 }
0315 vector<Eventiterator *>::iterator it_itr;
0316 for (it_itr = it.begin(); it_itr != it.end(); ++it_itr)
0317 {
0318 delete ( (*it_itr) ) ;
0319 }
0320
0321 delete ob;
0322 close (fd);
0323 }