Belle II Software  release-05-01-25
DeSerializerPXD.cc
1 //+
2 // File : DeSerializerPXD.cc
3 // Description : Module to receive PXD Data from external socket and store it as RawPXD in Data Store.
4 // This is meant for lab use (standalone testing, debugging) without an event builder.
5 //
6 // Author : Bjoern Spruck / Klemens Lautenbach
7 // Date : 13 - Aug - 2013
8 //-
9 
10 #include <daq/rawdata/modules/DeSerializerPXD.h>
11 
12 
13 using namespace std;
14 using namespace Belle2;
15 
16 //-----------------------------------------------------------------
17 // Register the Module
18 //-----------------------------------------------------------------
19 REG_MODULE(DeSerializerPXD)
20 
21 //-----------------------------------------------------------------
22 // Implementation
23 //-----------------------------------------------------------------
24 
26 {
27  //Set module properties
28  setDescription("Receives PXD-Data from ONSEN (or a simulator) and stores it as RawPXD in Data Store");
29  //setPropertyFlags(c_Input | c_ParallelProcessingCertified);
30 
31  addParam("Ports", m_ports, "default port number");
32  addParam("Hosts", m_hosts, "default host names");
33  m_nEvents = 0;
34  m_compressionLevel = 0;
35  m_buffer = new int[MAXEVTSIZE];
36  // events_processed = 0;
37  //Parameter definition
38  B2DEBUG(0, "DeSerializerPXDModule: Constructor done.");
39 }
40 
41 
42 DeSerializerPXDModule::~DeSerializerPXDModule()
43 {
44  delete[] m_buffer;
45 }
46 
47 void DeSerializerPXDModule::initialize()
48 {
49  if (m_hosts.size() != m_ports.size()) {
50  B2ERROR("DeSerializerPXDModule: Parameter error. Hosts and Ports need the same number of entries!");
51  DeSerializerPXDModule::terminate();
52  return;
53  }
54 
55  // Open receiver sockets
56  for (int i = 0; i < (int)(m_hosts.size()); i++) {
57  m_recvs.push_back(new EvtSocketSend(m_hosts[i], m_ports[i]));
58  }
59 
60  // Initialize EvtMetaData
61  m_eventMetaDataPtr.registerInDataStore();
62 
63  // Initialize Array of RawCOPPER
64  rawpxdary.registerInDataStore();
65 
66  B2DEBUG(0, "DeSerializerPXDModule: initialized.");
67 }
68 
69 void DeSerializerPXDModule::beginRun()
70 {
71  B2DEBUG(0, "beginRun called.");
72 }
73 
74 void DeSerializerPXDModule::event()
75 {
76 
77  // Get a record from socket
78  int stat = 0;
79  for (auto& it : m_recvs) {
80  do {
81  stat = it->recv_pxd_buffer((char*)m_buffer);
82  if (stat <= 0) {
83  B2INFO("DeserializerPXD Socket failed: stat = " << stat);
84  DeSerializerPXDModule::endRun();
85  DeSerializerPXDModule::terminate();
86  return;
87  };
88  } while (stat == 0);
89 
90  // Put RawPXD in DataStore, stat=lenght_in_Bytes
91  rawpxdary.appendNew(m_buffer, stat);
92 
93  // What we do NOT check here (yet) is, if all Packets belong to the same event! TODO
94  }
95 
96 
97  // Create EventMetaData - warning, this is only o.k. if this module is the only one!
98  m_eventMetaDataPtr.create();
99  m_eventMetaDataPtr->setExperiment(1);
100  m_eventMetaDataPtr->setRun(1);
101  m_eventMetaDataPtr->setEvent(m_nEvents);
102 
103  m_nEvents++;
104 
105  return;
106 }
107 
108 void DeSerializerPXDModule::endRun()
109 {
110  //fill Run data
111 
112  B2DEBUG(0, "endRun done.");
113 }
114 
115 
116 void DeSerializerPXDModule::terminate()
117 {
118  B2INFO("terminate called");
119 }
120 
Belle2::EvtSocketSend
Definition: EvtSocket.h:26
REG_MODULE
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition: Module.h:652
Belle2::Module
Base class for Modules.
Definition: Module.h:74
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::DeSerializerPXDModule
A class definition of an input module for Sequential ROOT I/O.
Definition: DeSerializerPXD.h:33