23#include <CLHEP/Random/RandomEngine.h>
24#include <CLHEP/Random/RandFlat.h>
25#include "GaudiKernel/EventContext.h"
35 const std::string& name,
36 const IInterface* parent)
37 : base_class (
type, name, parent)
55 return StatusCode::SUCCESS;
75 dqstatus.
setRODBCID (ctx.eventID().bunch_crossing_id());
82 if (rawChannelContainer !=
nullptr) {
83 if (tileDigitsContainer !=
nullptr) {
85 bool incomplete =
false;
87 incomplete |= (coll->size() < 48);
89 if (coll->size() > 0) {
90 int dsize = (*(coll->begin()))->NtimeSamples();
91 if (4 < dsize && dsize < 15) {
96 int frag = coll->identify();
97 int partition = (frag >> 8);
98 int drawer = (frag & 0x3F);
100 std::vector < uint32_t >
data = coll->getFragChipHeaderWords();
101 unsigned int dataSize = std::min(16u, (
unsigned int)
data.size());
102 for (
unsigned int dmu = 0; dmu < dataSize; ++dmu) {
103 if (
data[dmu] == 0xFFFFFFFF)
107 data = coll->getFragChipHeaderWordsHigh();
108 dataSize = std::min(16u, (
unsigned int)
data.size());
109 for (
unsigned int dmu = 0; dmu < dataSize; ++dmu) {
110 if (
data[dmu] == 0xFFFFFFFF)
123 ATH_MSG_DEBUG(
"RawChannelContainer didn't come from BS - don't check DQ flags");
128 int frag = coll->identify();
130 <<
" size=" << coll->size());
132 unsigned short existingDMUs = 0xFFFF;
135 existingDMUs = (frag == 0x30E || frag == 0x411) ? 0x3CFE : 0x3CFF;
138 unsigned short wrongBCID(0);
139 unsigned short fragBCID = coll->getFragBCID();
140 if (fragBCID & existingDMUs) {
142 int drawer = (frag & 0x3F);
147 if (badChannels->getChannelStatus(channel_id).isWrongBCID()) {
148 int dmu = channel / 3;
153 wrongBCID = 0xFFFF & existingDMUs;
157 wrongBCID |= (1U << dmu);
161 fragBCID &= ~wrongBCID;
164 dqstatus.
fillArrays(coll, tileDigitsContainer, 0, fragBCID);
165 dqstatus.
fillArrays(coll, tileDigitsContainer, 1, fragBCID);
168 ATH_MSG_DEBUG(
"all DQ elements are empty - don't check DQ flags");
174 }
else if (tileDigitsContainer !=
nullptr) {
176 bool incomplete =
false;
178 incomplete |= (coll->size() < 48);
180 if (coll->size() > 0) {
181 int dsize = (*(coll->begin()))->NtimeSamples();
182 if (4 < dsize && dsize < 15) {
183 isCalib |= coll->isCalibMode();
194 wrapper->
setSeed (this->name(), ctx);
195 CLHEP::HepRandomEngine* engine = wrapper->
getEngine (ctx);
198 const std::vector<std::vector<float>>& tripsProbs = badChannels->getTripsProbabilities();
201 const std::vector<float>& trips = tripsProbs.size() ? tripsProbs.at(partition - 1) : defaultTripsProbs;
202 dqstatus.
fillTrips(partition, trips, rndmVec, this->
msg());
207 return StatusCode::SUCCESS;
220 if (!tileBeamElemContainer) {
221 return StatusCode::SUCCESS;
224 uint32_t* cispar = dqstatus.
cispar();
227 int frag = coll->identify();
229 if (dqstatus.
trigType() == 0 && coll->getLvl1Type() != 0) {
242 if (beamItr != lastBeam) {
243 std::vector < uint32_t > digits = (*beamItr)->get_digits();
245 if (digits.size() > 0) {
246 uint32_t laserFlag = digits[0];
247 if (laserFlag & 0xFF00)
259 std::vector < uint32_t > digits = elem->get_digits();
263 if (digits.size() > 0) {
264 cispar[cha] = digits[0];
268 else if (cha == 15) {
269 int siz = 15 + digits.size();
272 for (
int i = 15; i < siz; ++i) {
273 cispar[i] = digits[i - 15];
276 switch (cispar[16]) {
279 int aux_ext = cispar[17];
280 cispar[17] = (aux_ext & 0x00ff);
281 cispar[18] = (aux_ext >> 8) & 0x00ff;
282 cispar[19] = (aux_ext >> 16) & 0x00ff;
283 cispar[20] = (aux_ext >> 24) & 0x00ff;
288 bool badpar = ((cispar[16] == cispar[17]) || (cispar[17] == cispar[18]));
289 int aux_ext = cispar[18];
290 cispar[18] = (aux_ext & 0x00ff) - 1;
291 cispar[19] = (aux_ext >> 8) & 0x00ff;
292 cispar[20] = (aux_ext >> 16) & 0x00ff;
294 if (badpar || (aux_ext>>24)!=0 || cispar[18]>5 || cispar[19]>15 || cispar[20]>63) {
295 ATH_MSG_WARNING(
"bad cispar[16,17,18]: " << cispar[16] <<
" " << cispar[17] <<
" " << aux_ext
296 <<
" drawer,tower,pmt: " << cispar[20] <<
" " << cispar[19] <<
" " << (
int)cispar[18]);
303 if (cispar[16] != cispar[17]) {
309 chargeCnv.i = cispar[17];
310 cispar[17] = chargeCnv.f;
330 if (beamItr != lastBeam) {
332 std::vector < uint32_t > digits = (*beamItr)->get_digits();
333 int cha = std::min(32, (
int) digits.size());
336 m_laspar[cha] = digits[cha];
357 if (board >= m_coincTrig.size()) {
358 m_coincTrig.resize(board + 1);
365 for (; beamItr != lastBeam; ++beamItr) {
368 std::vector < uint32_t > digits = (*beamItr)->get_digits();
369 uint32_t amplitude = (digits.size() > 0) ? digits[0] : 0;
374 for (
int ibit = 0; ibit < 32; ++ibit) {
375 m_coincTrig[board].trig[idx++] = (amplitude >> ibit) & 1;
377 }
else if (cha == 3) {
378 m_coincTrig[board].amp = amplitude;
390 return StatusCode::SUCCESS;
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
char data[hepevt_bytes_allocation_ATLAS]
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