Back to home page

sPhenix code displayed by LXR

 
 

    


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   //  COUT << "  -u  write uncompressed data, default is compressed "<< std::endl;
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   //  int gzipcompress = 0;
0105   int legacyphenix = 0;
0106   
0107   extern char *optarg;
0108   extern int optind;
0109 
0110   PHDWORD  *buffer;
0111 
0112   // initialize the pointers to 0;
0113   fd = 0;
0114   ob = 0;
0115 
0116   //  COUT << "parsing input" << std::endl;
0117   int buffer_size = 256*1024*64;  // makes 32MB (specifies how many dwords, so *4)
0118 
0119 
0120 
0121   while ((c = getopt(argc, argv, "n:c:e:vipfhx")) != EOF)
0122     {
0123 
0124       switch (c) 
0125     {
0126 
0127     case 'v':   // verbose
0128       verbose = 1;
0129       break;
0130 
0131     case 'i':   // identify
0132       identify = 1;
0133       break;
0134 
0135     case 'f':   // force
0136       forceflag = 1;
0137       break;
0138 
0139     // case 'g':   // do not gzip-compress
0140     //   gzipcompress = 1;
0141     //   break;
0142 
0143     case 'p':   // do not gzip-compress
0144       legacyphenix = 1;
0145       break;
0146 
0147     case 'x':   // do not gzip-compress
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':   // number of events
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   // try if the output file exists
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() )  // event from 1st input file 
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 }