Belle II Software  release-05-01-25
ROIpayload.cc
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2010 - Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Giulia Casarosa, Eugenio Paoloni *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 
11 #include <tracking/dataobjects/ROIpayload.h>
12 #include <arpa/inet.h>
13 #include <boost/crc.hpp>
14 #include <stdio.h>
15 #include <framework/logging/Logger.h>
16 
17 #define MAGIC_WORD (0xBE12DA7A)
18 
19 using namespace Belle2;
20 using boost::crc_optimal;
21 
23 {
24  init(HEADER_SIZE_WITH_LENGTH + 2 * rois + 1); // HEADER + 2*ROIS + CHECKSUM
25 };
26 
27 void ROIpayload::init(int length)
28 {
29  m_index = 0;
30  m_length = length;
31  if (length == 0)
32  m_rootdata = NULL;
33  else
34  m_rootdata = new int[length];
35  m_data32 = (uint32_t*)m_rootdata;
36  m_data64 = (ROIrawID::baseType*)(m_data32 + HEADER_SIZE_WITH_LENGTH);
37 }
38 
40 {
41  m_data32[OFFSET_MAGIC] = htonl(MAGIC_WORD);
42  m_data32[OFFSET_LENGTH] = htonl(length);
43  m_packetLengthByte = length + 2 * sizeof(uint32_t);
44 }
45 
47 {
48  unsigned int lengthInBytes =
49  sizeof(uint32_t) + // The header
50  sizeof(uint32_t) + // The trigger number
51  sizeof(uint32_t) + // Run Subrun Experiment Number
52  m_index * sizeof(uint64_t) + // The rois
53  sizeof(uint32_t); // The CRC
54 
55  m_data32[OFFSET_MAGIC] = htonl(MAGIC_WORD);
56  m_data32[OFFSET_LENGTH] = htonl(lengthInBytes);
57  m_packetLengthByte = lengthInBytes + 2 * sizeof(uint32_t); // The space for the magic word and payload length
58 }
59 
60 void ROIpayload::setHeader(bool Accepted, bool SendAll, bool SendROIs)
61 {
62  unsigned int h = 0xCAFE0000; // Magic
63  if (Accepted) h |= 0x8000;
64  if (SendAll) h |=
65  0x4000;
66  if (SendROIs) h |=
67  0x2000;
68  m_data32[OFFSET_HEADER] = htonl(h);
69 };
70 
71 void ROIpayload::setTriggerNumber(unsigned long int triggerNumber)
72 {
73  m_data32[OFFSET_TRIGNR] = htonl(triggerNumber);
74 };
75 
76 void ROIpayload::setRunSubrunExpNumber(int run , int subrun , int exp)
77 {
78  int rseNumber;
79  rseNumber = (exp & 0x3FF) << 22 | (run & 0x3FFF) << 8 | (subrun & 0xFF) ;
80  m_data32[OFFSET_RUNNR] = htonl(rseNumber);
81 };
82 
83 //void ROIpayload::addROIraw(ROIrawID roiraw)
84 void ROIpayload::addROIraw(unsigned long int roiraw)
85 {
86  if ((int*)(m_data64 + m_index) >= m_rootdata + m_length) {
87  B2ERROR("Adding too many ROIs to the ROIpayload." << std::endl <<
88  "Something really fishy is going on");
89  return;
90  }
91  m_data64[m_index++] = roiraw;
92 }
93 
95 {
96 
97  // assert((int*)(m_data64 + m_index) == m_rootdata + m_length - 1);
98 
99  // TODO Pointer comparison is bad
100  if ((int*)(m_data32 + m_index * 2 + HEADER_SIZE_WITH_LENGTH) >= m_rootdata + m_length) {
101  B2ERROR("No space left on the ROI payload to write the CRC." << std::endl);
102  return;
103  }
104 
105  crc_optimal<32, 0x04C11DB7, 0, 0, false, false> dhh_crc_32;
106 
107  dhh_crc_32.process_bytes((void*)(m_rootdata + OFFSET_HEADER),
108  HEADER_SIZE_WO_LENGTH * sizeof(uint32_t) + m_index * sizeof(uint64_t));
109 
110  m_data32[OFFSET_ROIS + m_index * 2] = htonl(dhh_crc_32.checksum()) ;
111 }
Belle2::ROIrawID::baseType
uint64_t baseType
base type
Definition: ROIrawID.h:38
Belle2::ROIpayload::init
void init(int length)
initializer
Definition: ROIpayload.cc:27
Belle2::ROIpayload::setHeader
void setHeader(bool Accepted, bool SendAll, bool SendROIs)
set header
Definition: ROIpayload.cc:60
Belle2::ROIpayload::m_length
int m_length
packet length
Definition: ROIpayload.h:63
Belle2::ROIpayload::ROIpayload
ROIpayload(int rois=0)
Default constructor.
Definition: ROIpayload.cc:22
Belle2::ROIpayload::m_index
int m_index
transient index
Definition: ROIpayload.h:68
Belle2::ROIpayload::setCRC
void setCRC()
set CRC
Definition: ROIpayload.cc:94
Belle2::ROIpayload::setPayloadLength
void setPayloadLength()
set payload length
Definition: ROIpayload.cc:46
Belle2::ROIpayload::m_data32
uint32_t * m_data32
transient value
Definition: ROIpayload.h:70
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::ROIpayload::m_rootdata
int * m_rootdata
pointer to data packet of m_length words
Definition: ROIpayload.h:65
Belle2::ROIpayload::m_packetLengthByte
int m_packetLengthByte
packet length in byte
Definition: ROIpayload.h:62
Belle2::ROIpayload::m_data64
ROIrawID::baseType * m_data64
transient value
Definition: ROIpayload.h:72
Belle2::ROIpayload::addROIraw
void addROIraw(unsigned long int roiraw)
add a ROIrawID
Definition: ROIpayload.cc:84
Belle2::ROIpayload::setRunSubrunExpNumber
void setRunSubrunExpNumber(int run, int subrun, int exp)
set run/ subrun/exp number
Definition: ROIpayload.cc:76
Belle2::ROIpayload::setTriggerNumber
void setTriggerNumber(unsigned long int triggerNumber)
set trigger number
Definition: ROIpayload.cc:71