Belle II Software  release-05-01-25
FlowMonitor.cc
1 #include "daq/slc/readout/FlowMonitor.h"
2 
3 #include <daq/slc/system/Time.h>
4 
5 #include <cstring>
6 
7 using namespace Belle2;
8 
9 bool FlowMonitor::open(RunInfoBuffer* info)
10 {
11  m_info = info;
12  if (m_info->isAvailable()) {
13  m_status.nodeid = m_info->getNodeId();
14  m_nbyte[0] = m_nbyte[1] = 0;
15  m_ioinfo[0].setLocalPort(m_info->getInputPort());
16  m_ioinfo[0].setLocalAddress(m_info->getInputAddress());
17  m_ip[0] = m_ioinfo[0].getLocalIP();
18  m_ioinfo[1].setLocalPort(m_info->getOutputPort());
19  m_ioinfo[1].setLocalAddress(m_info->getOutputAddress());
20  m_ip[1] = m_ioinfo[1].getLocalIP();
21  }
22  return true;
23 }
24 
25 bool FlowMonitor::close()
26 {
27  return true;
28 }
29 
30 ronode_status& FlowMonitor::monitor()
31 {
32  if (m_info->isAvailable()) {
33  m_ioinfo[0].setLocalAddress(m_info->getInputAddress());
34  m_ioinfo[0].setLocalPort(m_info->getInputPort());
35  m_ioinfo[1].setLocalAddress(m_info->getOutputAddress());
36  m_ioinfo[1].setLocalPort(m_info->getOutputPort());
37  IOInfo::checkTCP(m_ioinfo);
38  unsigned int ctime = Time().getSecond();
39  ronode_info info;
40  memcpy(&info, m_info->get(), sizeof(ronode_info));
41  memcpy(&(m_status.header), &(info.header), sizeof(event_header));
42  double length = ctime - m_status.ctime;
43  m_status.eflag = info.eflag;
44  m_status.state = info.state;
45  m_status.expno = info.expno;
46  m_status.runno = info.runno;
47  m_status.subno = info.subno;
48  m_status.reserved_i[0] = info.reserved[0];
49  m_status.reserved_i[1] = info.reserved[1];
50  m_status.reserved_f[0] = info.reserved_f[0];
51  m_status.reserved_f[1] = info.reserved_f[1];
52  m_status.reserved_f[2] = info.reserved_f[2];
53  m_status.reserved_f[3] = info.reserved_f[3];
54  m_status.ctime = ctime;
55 
56  double dcount;
57  double dnbyte;
58  m_status.evtrate_in = 0;
59  m_status.evtsize_in = 0;
60  m_status.flowrate_in = 0;
61  m_status.evtrate_out = 0;
62  m_status.evtsize_out = 0;
63  m_status.flowrate_out = 0;
64  if (m_ioinfo[0].getLocalPort() > 0) {
65  m_status.connection_in = m_ioinfo[0].getState() == 1;
66  m_status.nqueue_in = m_ioinfo[0].getRXQueue();
67  }
68  if (m_ioinfo[1].getLocalPort() > 0) {
69  m_status.connection_out = m_ioinfo[1].getState() == 1;
70  m_status.nqueue_out = m_ioinfo[1].getRXQueue();
71  }
72  if ((dcount = info.io[0].count - m_status.nevent_in) > 0) {
73  dnbyte = info.io[0].nbyte - m_nbyte[0];
74  m_status.evtrate_in = dcount / length / 1000.;
75  m_status.evtsize_in = dnbyte / dcount / 1000.;
76  m_status.flowrate_in = dnbyte / length / 1000000.;
77  m_status.nevent_in = info.io[0].count;
78  m_nbyte[0] = info.io[0].nbyte;
79  } else {
80  m_status.evtrate_in = 0;
81  m_status.evtsize_in = 0;
82  m_status.flowrate_in = 0;
83  }
84  if ((dcount = info.io[1].count - m_status.nevent_out) > 0) {
85  dnbyte = info.io[1].nbyte - m_nbyte[1];
86  m_status.evtrate_out = dcount / length / 1000.;
87  m_status.evtsize_out = dnbyte / dcount / 1000.;
88  m_status.flowrate_out = dnbyte / length / 1000000.;
89  m_status.nevent_out = info.io[1].count;
90  m_nbyte[1] = info.io[1].nbyte;
91  } else {
92  m_status.evtrate_out = 0;
93  m_status.evtsize_out = 0;
94  m_status.flowrate_out = 0;
95  }
96  }
97  return m_status;
98 }
Belle2::event_header
Definition: ronode_info.h:12
Belle2::ronode_status
Definition: ronode_status.h:16
Belle2::RunInfoBuffer
Definition: RunInfoBuffer.h:15
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::Time
Definition: Time.h:14
Belle2::ronode_info
Definition: ronode_info.h:23