Belle II Software development
file2sockr.cc
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * *
5 * See git log for contributors and copyright holders. *
6 * This file is licensed under LGPL-3.0, see LICENSE.md. *
7 **************************************************************************/
8#include <string>
9#include <vector>
10
11#include <stdio.h>
12#include <stdlib.h>
13#include <unistd.h>
14#include <sys/time.h>
15
16#include "framework/pcore/SeqFile.h"
17#include "daq/dataflow/REvtSocket.h"
18
19#include <TRandom.h>
20
21#define EVENTINTERVAL 5000
22
23using namespace Belle2;
24using namespace std;
25
26int main(int argc, char** argv)
27{
28 if (argc < 3) {
29 printf("file2sock : filename port poisson_freq file_interval\n");
30 exit(-1);
31 }
32
33 // Poisson random number generate
34 TRandom rand;
35
36 string filename(argv[1]);
37 int port = atoi(argv[2]);
38 int pfreq = atoi(argv[3]);
39
40 double minterval = 0.0;
41 if (pfreq != 0)
42 minterval = 1.0E6 / (double)pfreq;
43
44 vector<string> filelist;
45 // Check file
46 if ((int)filename.rfind(".list") != -1) {
47 FILE* fd = fopen(filename.c_str(), "r");
48 if (fd == NULL) {
49 fprintf(stderr, "file2sockr: cannot open %s\n", filename.c_str());
50 exit(-1);
51 }
52 for (;;) {
53 char listfile[1024];
54 int is = fscanf(fd, "%1023s", listfile);
55 if (is <= 0) break;
56 filelist.push_back(string(listfile));
57 }
58 } else {
59 filelist.push_back(filename);
60 printf("File %s is put ln the list\n", filename.c_str());
61 }
62 printf("# of input files = %d\n", (int)filelist.size());
63 for (int i = 0; i < (int)filelist.size(); i++) {
64 printf("file = %s\n", filelist[i].c_str());
65 }
66
67 int fileptr = 0;
68
69 // Open EventSocket
70 REvtSocketSend* sock = new REvtSocketSend(port);
71
72 // Event Buffer
73 char* evbuf = new char[MAXEVTSIZE];
74
75 // Open 1st file
76 SeqFile* file = new SeqFile(filelist[fileptr++].c_str(), "r");
77 if (file->status() <= 0) {
78 perror("file open");
79 exit(-1);
80 }
81 // Skip the first record (StreamerInfo)
82 int is = file->read(evbuf, MAXEVTSIZE);
83 if (is <= 0) {
84 printf("Error in reading file : %d\n", is);
85 exit(-1);
86 }
87
88 // Event / time counter
89 int nevent = 0;
90 struct timeval tnow;
91 struct timeval tprev;
92 gettimeofday(&tnow, NULL);
93 gettimeofday(&tprev, NULL);
94
95 double datasize = 0.0;
96 printf("Start event loop\n");
97 // Loop for event records
98 for (;;) {
99 int isN = file->read(evbuf, MAXEVTSIZE);
100 if (isN < 0) {
101 printf("Error in reading file : %d\n", isN);
102 break;
103 } else if (isN > MAXEVTSIZE) {
104 printf("Event size too large : %d\n", isN);
105 continue;
106 } else if (isN == 0) {
107 delete file;
108 if (fileptr == (int)filelist.size()) {
109 printf("End of file list reached. Exitting\n");
110 break;
111 }
112 file = new SeqFile(filelist[fileptr++].c_str(), "r");
113 if (file->status() <= 0) {
114 perror("file open");
115 exit(-1);
116 }
117 // Skip the first record (StreamerInfo)
118 int isNow = file->read(evbuf, MAXEVTSIZE);
119 if (isNow <= 0) {
120 printf("Error in reading file : %d\n", isNow);
121 exit(-1);
122 }
123 // Read next record (Event)
124 isNow = file->read(evbuf, MAXEVTSIZE);
125 if (isNow < 0) {
126 printf("Error in reading file : %d\n", isNow);
127 exit(-1);
128 }
129 // Wait for 5 sec so that processing of previous file is completed.
130 sleep(10);
131 }
132
133 // Put the message to Socket
134 EvtMessage* msg = new EvtMessage(evbuf); // Ptr copy, no overhead
135
136 if (msg->type() == MSG_TERMINATE) {
137 printf("EoF found. Exitting.....\n");
138 sock->send(msg);
139 delete msg;
140 return -1;
141 } else if (msg->type() == MSG_STREAMERINFO) {
142 printf("StreamerInfo. Skipped....\n");
143 continue;
144 } else {
145 int isNow = sock->send(msg);
146 delete msg;
147 if (isNow <= 0) {
148 printf("Cannot send event. Exitting\n");
149 return -1;
150 }
151 // return msg->size();
152 }
153 if (minterval != 0)
154 usleep(rand.Poisson(minterval));
155
156 nevent++;
157 datasize += (double)isN;
158
159 if (nevent % EVENTINTERVAL == 0) {
160 gettimeofday(&tnow, NULL);
161 double delta = (double)((tnow.tv_sec - tprev.tv_sec) * 1000000 +
162 (tnow.tv_usec - tprev.tv_usec));
163 double rate = ((double)EVENTINTERVAL) / delta * 1.0E6;
164 double flow = datasize / delta;
165 printf("Event = %8d; Ave. rate = %7.2f Hz, flow = %7.2f MB/s\n",
166 nevent, rate, flow);
167 tprev = tnow;
168 datasize = 0.0;
169 }
170 }
171}
172
173
Class to manage streamed object.
Definition EvtMessage.h:59
ERecordType type() const
Get record type.
A class to manage I/O for a chain of blocked files.
Definition SeqFile.h:22
Abstract base class for different kinds of events.
STL namespace.