11 #include <tracking/modules/pxdDataReduction/ROIPayloadAssemblerModule.h>
12 #include <vxd/dataobjects/VxdID.h>
14 #include <hlt/softwaretrigger/core/FinalTriggerDecisionCalculator.h>
15 #include <mdst/dataobjects/SoftwareTriggerResult.h>
16 #include <vxd/geometry/GeoCache.h>
17 #include <vxd/geometry/SensorInfoBase.h>
35 setDescription(
"This module assembles payload for the ROI in the correct format to be sent to the ONSEN");
36 setPropertyFlags(c_ParallelProcessingCertified);
38 addParam(
"ROIListName", m_ROIListName,
"name of the list of ROIs", std::string(
""));
39 addParam(
"ROIpayloadName", m_ROIpayloadName,
"name of the payload of ROIs", std::string(
""));
40 addParam(
"SendAllDownscaler", mSendAllDS,
41 "Send all Data (no selection) downscaler; Workaround for missing ONSEN functionality, 0 never set, 1 alway set, 2 set in every second...",
43 addParam(
"SendROIsDownscaler", mSendROIsDS,
44 "Send ROIs downscaler; Workaround for missing ONSEN functionality, 0 never set, 1 alway set, 2 set in every second...", 3u);
45 addParam(
"CutNrROIs", mCutNrROIs,
46 "If Nr of ROIs per DHHID reach this, send out only one full sensor ROI", 32u);
47 addParam(
"AcceptAll", mAcceptAll,
"Accept all, Ignore HLT decision",
false);
48 addParam(
"NoRejectFlag", mNoRejectFlag,
"Never reject, just send no ROI",
true);
51 void ROIPayloadAssemblerModule::initialize()
53 m_eventMetaData.isRequired();
54 m_ROIList.isOptional(m_ROIListName);
56 m_roiPayloads.registerInDataStore(
68 void ROIPayloadAssemblerModule::event()
71 unsigned int evtNr = m_eventMetaData->getEvent();
72 unsigned int countROIs = 0;
77 if (!result.isValid()) {
79 B2INFO(
"SoftwareTriggerResult object not available but needed to generate the ROI payload.");
82 accepted = SoftwareTrigger::FinalTriggerDecisionCalculator::getFinalTriggerDecision(*result);
86 map<VxdID, set<ROIrawID, ROIrawID>> mapOrderedROIraw;
91 B2DEBUG(1,
" number of ROIs in the list = " << m_ROIList.getEntries());
93 for (
auto& iROI : m_ROIList) {
96 int layer = (iROI.getSensorID()).getLayerNumber() - 1;
97 int ladder = (iROI.getSensorID()).getLadderNumber();
98 int sensor = (iROI.getSensorID()).getSensorNumber() - 1;
100 roiraw.setSystemFlag(0);
101 roiraw.setDHHID(((layer) << 5) | ((ladder) << 1) | (sensor));
103 roiraw.setMinVid(iROI.getMinVid());
104 roiraw.setMaxVid(iROI.getMaxVid());
105 roiraw.setMinUid(iROI.getMinUid());
106 roiraw.setMaxUid(iROI.getMaxUid());
109 mapOrderedROIraw[iROI.getSensorID()].insert(roiraw);
112 B2DEBUG(1,
" number of original ROIs = " << m_ROIList.getEntries());
118 for (
auto& it : mapOrderedROIraw) {
119 if (it.second.size() < mCutNrROIs) countROIs += it.second.size();
124 if (m_roiPayloads.isValid()) {
125 B2FATAL(
"ROIpayload already in datastore, this must not be the case when calling the ROIPayloadAssemblerModule.");
130 m_roiPayloads.assign(payload);
133 payload->setHeader(accepted || mNoRejectFlag,
134 mSendAllDS ? (evtNr % mSendAllDS) == 0 : 0, mSendROIsDS ? (evtNr % mSendROIsDS) == 0 : 0);
135 payload->setTriggerNumber(evtNr);
138 payload->setRunSubrunExpNumber(m_eventMetaData->getRun(), m_eventMetaData->getSubrun(), m_eventMetaData->getExperiment());
140 unsigned int addROI = 0;
145 for (
auto& it : mapOrderedROIraw) {
147 if (it.second.size() > 0) {
148 if (it.second.size() < mCutNrROIs) {
149 for (
auto& itSet : it.second) {
150 payload->addROIraw(itSet.getBigEndian());
155 B2INFO(
"Nr ROI on DHHID " << it.second.begin()->getDHHID() << endl <<
156 " exceeds limit CutNrROIs, thus full sensor ROI is created.");
158 const int nPixelsU = aSensorInfo.
getUCells();
159 const int nPixelsV = aSensorInfo.
getVCells();
161 roiraw.setSystemFlag(0);
162 roiraw.setDHHID(it.second.begin()->getDHHID());
165 roiraw.setMaxVid(nPixelsV - 1);
167 roiraw.setMaxUid(nPixelsU - 1);
175 payload->setPayloadLength();
178 B2DEBUG(1,
" number of ROIs in payload = " << addROI);