23#include <CLHEP/Random/RandomEngine.h>
24#include <CLHEP/Random/RandFlat.h>
25#include "GaudiKernel/EventContext.h"
36 const std::string& name,
37 const IInterface* parent)
38 : base_class (
type, name, parent)
56 return StatusCode::SUCCESS;
76 dqstatus.
setRODBCID (ctx.eventID().bunch_crossing_id());
83 if (rawChannelContainer !=
nullptr) {
84 if (tileDigitsContainer !=
nullptr) {
86 bool incomplete =
false;
88 incomplete |= (coll->size() < 48);
90 if (coll->size() > 0) {
91 int dsize = (*(coll->begin()))->NtimeSamples();
92 if (4 < dsize && dsize < 15) {
97 int frag = coll->identify();
98 int partition = (frag >> 8);
99 int drawer = (frag & 0x3F);
101 std::vector < uint32_t > data = coll->getFragChipHeaderWords();
102 unsigned int dataSize = std::min(16u, (
unsigned int) data.size());
103 for (
unsigned int dmu = 0; dmu < dataSize; ++dmu) {
104 if (data[dmu] == 0xFFFFFFFF)
108 data = coll->getFragChipHeaderWordsHigh();
109 dataSize = std::min(16u, (
unsigned int) data.size());
110 for (
unsigned int dmu = 0; dmu < dataSize; ++dmu) {
111 if (data[dmu] == 0xFFFFFFFF)
124 ATH_MSG_DEBUG(
"RawChannelContainer didn't come from BS - don't check DQ flags");
129 int frag = coll->identify();
131 <<
" size=" << coll->size());
133 unsigned short existingDMUs = 0xFFFF;
136 existingDMUs = (frag == 0x30E || frag == 0x411) ? 0x3CFE : 0x3CFF;
139 unsigned short wrongBCID(0);
140 unsigned short fragBCID = coll->getFragBCID();
141 if (fragBCID & existingDMUs) {
143 int drawer = (frag & 0x3F);
148 if (badChannels->getChannelStatus(channel_id).isWrongBCID()) {
149 int dmu = channel / 3;
154 wrongBCID = 0xFFFF & existingDMUs;
158 wrongBCID |= (1U << dmu);
162 fragBCID &= ~wrongBCID;
165 dqstatus.
fillArrays(coll, tileDigitsContainer, 0, fragBCID);
166 dqstatus.
fillArrays(coll, tileDigitsContainer, 1, fragBCID);
169 ATH_MSG_DEBUG(
"all DQ elements are empty - don't check DQ flags");
175 }
else if (tileDigitsContainer !=
nullptr) {
177 bool incomplete =
false;
179 incomplete |= (coll->size() < 48);
181 if (coll->size() > 0) {
182 int dsize = (*(coll->begin()))->NtimeSamples();
183 if (4 < dsize && dsize < 15) {
184 isCalib |= coll->isCalibMode();
195 wrapper->
setSeed (this->name(), ctx);
196 CLHEP::HepRandomEngine* engine = wrapper->
getEngine (ctx);
199 const std::vector<std::vector<float>>& tripsProbs = badChannels->getTripsProbabilities();
202 const std::vector<float>& trips = tripsProbs.size() ? tripsProbs.at(partition - 1) : defaultTripsProbs;
203 dqstatus.
fillTrips(partition, trips, rndmVec, this->
msg());
208 return StatusCode::SUCCESS;
221 if (!tileBeamElemContainer) {
222 return StatusCode::SUCCESS;
225 uint32_t* cispar = dqstatus.
cispar();
228 int frag = coll->identify();
230 if (dqstatus.
trigType() == 0 && coll->getLvl1Type() != 0) {
243 if (beamItr != lastBeam) {
244 std::vector < uint32_t > digits = (*beamItr)->get_digits();
246 if (digits.size() > 0) {
247 uint32_t laserFlag = digits[0];
248 if (laserFlag & 0xFF00)
260 std::vector < uint32_t > digits = elem->get_digits();
264 if (digits.size() > 0) {
265 cispar[cha] = digits[0];
269 else if (cha == 15) {
270 int siz = 15 + digits.size();
273 for (
int i = 15; i < siz; ++i) {
274 cispar[i] = digits[i - 15];
277 switch (cispar[16]) {
280 int aux_ext = cispar[17];
281 cispar[17] = (aux_ext & 0x00ff);
282 cispar[18] = (aux_ext >> 8) & 0x00ff;
283 cispar[19] = (aux_ext >> 16) & 0x00ff;
284 cispar[20] = (aux_ext >> 24) & 0x00ff;
289 bool badpar = ((cispar[16] == cispar[17]) || (cispar[17] == cispar[18]));
290 int aux_ext = cispar[18];
291 cispar[18] = (aux_ext & 0x00ff) - 1;
292 cispar[19] = (aux_ext >> 8) & 0x00ff;
293 cispar[20] = (aux_ext >> 16) & 0x00ff;
295 if (badpar || (aux_ext>>24)!=0 || cispar[18]>5 || cispar[19]>15 || cispar[20]>63) {
296 ATH_MSG_WARNING(
"bad cispar[16,17,18]: " << cispar[16] <<
" " << cispar[17] <<
" " << aux_ext
297 <<
" drawer,tower,pmt: " << cispar[20] <<
" " << cispar[19] <<
" " << (
int)cispar[18]);
304 if (cispar[16] != cispar[17]) {
305 const float charge = std::bit_cast<float>(cispar[17]);
306 cispar[17] =
static_cast<uint32_t
>(
charge);
326 if (beamItr != lastBeam) {
328 std::vector < uint32_t > digits = (*beamItr)->get_digits();
329 int cha = std::min(32, (
int) digits.size());
332 m_laspar[cha] = digits[cha];
353 if (board >= m_coincTrig.size()) {
354 m_coincTrig.resize(board + 1);
361 for (; beamItr != lastBeam; ++beamItr) {
364 std::vector < uint32_t > digits = (*beamItr)->get_digits();
365 uint32_t amplitude = (digits.size() > 0) ? digits[0] : 0;
370 for (
int ibit = 0; ibit < 32; ++ibit) {
371 m_coincTrig[board].trig[idx++] = (amplitude >> ibit) & 1;
373 }
else if (cha == 3) {
374 m_coincTrig[board].amp = amplitude;
386 return StatusCode::SUCCESS;
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
double charge(const T &p)
Information produced by TileDQstatusAlg (used to be done by TileBeamInfoProvider).
A wrapper class for event-slot-local random engines.
void setSeed(const std::string &algName, const EventContext &ctx)
Set the random seed using a string (e.g.
CLHEP::HepRandomEngine * getEngine(const EventContext &ctx) const
Retrieve the random engine corresponding to the provided EventContext.
DataModel_detail::const_iterator< DataVector > const_iterator
Standard const_iterator.
static const unsigned int MAX_ROS
Number of ROSs.
static const unsigned int MAX_DRAWER
Number of drawers in ROS 1-4.
static const unsigned int MAX_CHAN
Number of channels in drawer.
Class that holds Data Quality fragment information and provides functions to extract the data quality...
void fillArrays(const TileRawChannelCollection *coll, const TileDigitsContainer *digitsCnt, int gain, unsigned short fragBCID)
parses DQ fragments and fill error arrays for event
bool nonZeroCounter() const
returns True if there are any errors in event
void setCalibMode(uint32_t calibMode)
void setFilled(bool filled)
sets flag that DQ status instance has been filled for this event
void setBiGain(bool biGain)
sets flag of gain mode of run
int trigType() const
Trigger type.
void fillTrips(unsigned int partition, const std::vector< float > &trips, double *rndmVec, MsgStream &msg)
void setRODBCID(uint32_t BCID)
sets the ROD BCID stored and used in DQStatus
void setIncompleteDigits(bool incomplete)
void setTrigType(int trigType)
void setEmptyEvent(int partition, int drawer, int dmu, int gain, int isEmpty)
sets flag that DMU sent an empty event (0xFFFFFFFF)
const uint32_t * cispar() const
CIS parameters.
bool isBiGain() const
returns gain mode of run
void setAllGood()
mark all channels/ADC's as DQ good