Skip to content

Commit eb556de

Browse files
sevdokimshahor02
authored andcommitted
Added check for valid geometry addresses
1 parent 564ca5c commit eb556de

File tree

6 files changed

+79
-54
lines changed

6 files changed

+79
-54
lines changed

Detectors/CPV/base/include/CPVBase/Geometry.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,8 @@ class Geometry
8888
static void absIdToRelPosInModule(unsigned short absId, float& x, float& z);
8989
static bool relToAbsNumbering(const short* relId, unsigned short& absId);
9090

91-
static void hwaddressToAbsId(short ccId, short dil, short gas, short pad, unsigned short& absId);
92-
static void absIdToHWaddress(unsigned short absId, short& ccId, short& dil, short& gas, short& pad);
91+
static bool hwaddressToAbsId(short ccId, short dil, short gas, short pad, unsigned short& absId);
92+
static bool absIdToHWaddress(unsigned short absId, short& ccId, short& dil, short& gas, short& pad);
9393

9494
static unsigned short getTotalNPads() { return kNCHANNELS; }
9595
static bool IsPadExists(unsigned short absId)

Detectors/CPV/base/src/Geometry.cxx

Lines changed: 37 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,10 @@ bool Geometry::absToRelNumbering(unsigned short absId, short* relid)
2828
// relid[0] = CPV Module number 1:fNModules
2929
// relid[1] = Column number inside a CPV module (Phi coordinate)
3030
// relid[2] = Row number inside a CPV module (Z coordinate)
31-
31+
if (absId >= kNCHANNELS) {
32+
LOG(DEBUG) << "Wrong absId = " << absId << " > kNCHANNELS=" << kNCHANNELS;
33+
return false;
34+
}
3235
const short nCPV = kNumberOfCPVPadsPhi * kNumberOfCPVPadsZ;
3336
relid[0] = absId / nCPV + 2;
3437
absId -= (relid[0] - 2) * nCPV;
@@ -102,52 +105,62 @@ bool Geometry::relToAbsNumbering(const short* relId, unsigned short& absId)
102105

103106
return true;
104107
}
105-
void Geometry::hwaddressToAbsId(short ccId, short dil, short gas, short pad, unsigned short& absId)
108+
bool Geometry::hwaddressToAbsId(short ccId, short dil, short gas, short pad, unsigned short& absId)
106109
{
110+
//check if hw address is valid
111+
bool isGoodHWAddress = true;
112+
if (pad < 0 || pad >= kNPAD) {
113+
LOG(DEBUG) << "Geometry::hwaddressToAbsId() : Wrong pad address: pad=" << pad << " >= kNPAD=" << kNPAD;
114+
isGoodHWAddress = false;
115+
}
116+
if (dil < 0 || dil >= kNDilogic) {
117+
LOG(DEBUG) << "Geometry::hwaddressToAbsId() : Wrong dil address: dil=" << dil << " >= kNDilogic=" << kNDilogic;
118+
isGoodHWAddress = false;
119+
}
120+
if (gas < 0 || gas >= kNGas) {
121+
LOG(DEBUG) << "Geometry::hwaddressToAbsId() : Wrong gasiplex address: gas=" << gas << " >= kNGas=" << kNGas;
122+
isGoodHWAddress = false;
123+
}
124+
//return false in no success case
125+
if (!isGoodHWAddress) {
126+
return false;
127+
}
107128

108129
short pZ = mPadToZ[pad];
109130
short pPhi = mPadToPhi[pad];
110131
short relid[3] = {short(ccId / 8 + 2), short((ccId % 8) * 16 + (dil / 2) * 8 + 7 - pPhi), short((dil % 2) * 30 + gas * 6 + pZ)};
111132

112-
relToAbsNumbering(relid, absId);
133+
return relToAbsNumbering(relid, absId);
113134
}
114135

115-
void Geometry::absIdToHWaddress(unsigned short absId, short& ccId, short& dil, short& gas, short& pad)
136+
bool Geometry::absIdToHWaddress(unsigned short absId, short& ccId, short& dil, short& gas, short& pad)
116137
{
117138
// Convert absId to hw address
118139
// Arguments: ccId: 0 -- 7 - mod 2; 8...15 mod 3; 16...23 mod 4
119140
//dilogic: 0..3, gas=0..5, pad:0..47
120141

121142
short relid[3];
122-
absToRelNumbering(absId, relid);
143+
if (!absToRelNumbering(absId, relid)) {
144+
return false; //wrong absId passed
145+
}
123146

124147
ccId = (relid[0] - 2) * 8 + relid[1] / 16;
125148
dil = 2 * ((relid[1] % 16) / 8) + relid[2] / 30; // Dilogic# 0..3
126149
gas = (relid[2] % 30) / 6; // gasiplex# 0..4
127150
pad = mPadMap[relid[2] % 6][7 - relid[1] % 8]; // pad 0..47
128151

129-
if (pad < 0 || pad > kNPAD) {
130-
LOG(ERROR) << "Wrong pad address: pad=" << pad << " > kNPAD=" << kNPAD;
131-
pad = 0;
132-
dil = 0;
133-
gas = 0;
134-
ccId = 0;
135-
return;
152+
bool isAbsIdOk = true;
153+
if (pad < 0 || pad >= kNPAD) {
154+
LOG(DEBUG) << "Wrong pad address: pad=" << pad << " >= kNPAD=" << kNPAD;
155+
isAbsIdOk = false;
136156
}
137157
if (dil < 0 || dil >= kNDilogic) {
138-
LOG(ERROR) << "Wrong dil address: dil=" << dil << " > kNDilogic=" << kNDilogic;
139-
pad = 0;
140-
dil = 0;
141-
gas = 0;
142-
ccId = 0;
143-
return;
158+
LOG(DEBUG) << "Wrong dil address: dil=" << dil << " >= kNDilogic=" << kNDilogic;
159+
isAbsIdOk = false;
144160
}
145161
if (gas < 0 || gas >= kNGas) {
146-
LOG(ERROR) << "Wrong gasiplex address: gas=" << gas << " > kNGas=" << kNGas;
147-
pad = 0;
148-
dil = 0;
149-
gas = 0;
150-
ccId = 0;
151-
return;
162+
LOG(DEBUG) << "Wrong gasiplex address: gas=" << gas << " >= kNGas=" << kNGas;
163+
isAbsIdOk = false;
152164
}
165+
return isAbsIdOk;
153166
}

Detectors/CPV/reconstruction/include/CPVReconstruction/RawDecoder.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ class RawDecoder
104104
RawErrorType_t readChannels();
105105

106106
private:
107-
void addDigit(uint32_t padWord, short ddl, uint16_t bc);
107+
bool addDigit(uint32_t padWord, short ddl, uint16_t bc);
108108
void removeLastNDigits(int n);
109109

110110
RawReaderMemory& mRawReader; ///< underlying raw reader

Detectors/CPV/reconstruction/src/RawDecoder.cxx

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,15 @@ RawErrorType_t RawDecoder::readChannels()
8585
wordCountFromLastHeader++;
8686
for (int i = 0; i < 3; i++) {
8787
PadWord pw = {word.cpvPadWord(i)};
88-
if (pw.zero == 0) {
89-
addDigit(pw.mDataWord, word.ccId(), currentBC);
90-
nDigitsAddedFromLastHeader++;
88+
if (pw.zero == 0) { //cpv pad word, not control or empty
89+
if (addDigit(pw.mDataWord, word.ccId(), currentBC)) {
90+
nDigitsAddedFromLastHeader++;
91+
} else {
92+
LOG(DEBUG) << "RawDecoder::readChannels() : "
93+
<< "read pad word with non-valid pad address";
94+
unsigned int dil = pw.dil, gas = pw.gas, address = pw.address;
95+
mErrors.emplace_back(word.ccId(), dil, gas, address, kPadAddress);
96+
}
9197
}
9298
}
9399
} else { //this may be trailer
@@ -129,24 +135,28 @@ RawErrorType_t RawDecoder::readChannels()
129135
return kOK;
130136
}
131137

132-
void RawDecoder::addDigit(uint32_t w, short ccId, uint16_t bc)
138+
bool RawDecoder::addDigit(uint32_t w, short ccId, uint16_t bc)
133139
{
140+
//add digit
141+
PadWord pad = {w};
142+
unsigned short absId;
143+
if (!o2::cpv::Geometry::hwaddressToAbsId(ccId, pad.dil, pad.gas, pad.address, absId)) {
144+
return false;
145+
}
146+
134147
//new bc -> add bc reference
135148
if (mBCRecords.empty() || (mBCRecords.back().bc != bc)) {
136149
mBCRecords.push_back(BCRecord(bc, mDigits.size(), mDigits.size()));
137150
} else {
138151
mBCRecords.back().lastDigit++;
139152
}
140153

141-
//add digit
142-
PadWord pad = {w};
143-
unsigned short absId;
144-
o2::cpv::Geometry::hwaddressToAbsId(ccId, pad.dil, pad.gas, pad.address, absId);
145-
146154
AddressCharge ac = {0};
147155
ac.Address = absId;
148156
ac.Charge = pad.charge;
149157
mDigits.push_back(ac.mDataWord);
158+
159+
return true;
150160
}
151161

152162
void RawDecoder::removeLastNDigits(int n)

Detectors/CPV/workflow/include/CPVWorkflow/RawToDigitConverterSpec.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,9 @@ class RawToDigitConverterSpec : public framework::Task
6767
bool mIsPedestalData; ///< Do not subtract pedestals if true
6868
bool mIsUsingCcdbMgr; ///< Are we using CCDB manager?
6969
long mCurrentTimeStamp; ///< Current timestamp for CCDB querying
70-
std::unique_ptr<CalibParams> mCalibParams; ///< CPV calibration
71-
std::unique_ptr<Pedestals> mPedestals; ///< CPV pedestals
72-
std::unique_ptr<BadChannelMap> mBadMap; ///< BadMap
70+
CalibParams* mCalibParams; ///< CPV calibration
71+
Pedestals* mPedestals; ///< CPV pedestals
72+
BadChannelMap* mBadMap; ///< BadMap
7373
std::vector<Digit> mOutputDigits; ///< Container with output cells
7474
std::vector<TriggerRecord> mOutputTriggerRecords; ///< Container with output cells
7575
std::vector<RawDecoderError> mOutputHWErrors; ///< Errors occured in reading data

Detectors/CPV/workflow/src/RawToDigitConverterSpec.cxx

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,11 @@ void RawToDigitConverterSpec::init(framework::InitContext& ctx)
5151
//dummy calibration objects
5252
if (ccdbUrl.compare("localtest") == 0) { // test default calibration
5353
mIsUsingCcdbMgr = false;
54-
mCalibParams = std::make_unique<o2::cpv::CalibParams>(1);
55-
mBadMap = std::make_unique<o2::cpv::BadChannelMap>(1);
56-
mPedestals = std::make_unique<o2::cpv::Pedestals>(1);
54+
mCalibParams = new o2::cpv::CalibParams(1);
55+
mBadMap = new o2::cpv::BadChannelMap(1);
56+
mPedestals = new o2::cpv::Pedestals(1);
5757
LOG(INFO) << "No reading calibration from ccdb requested, using dummy calibration for testing";
58+
LOG(INFO) << "Task configuration is done.";
5859
return; //localtest = no reading ccdb
5960
}
6061

@@ -65,9 +66,10 @@ void RawToDigitConverterSpec::init(framework::InitContext& ctx)
6566
if (!mIsUsingCcdbMgr) {
6667
LOG(ERROR) << "Host " << ccdbUrl << " is not reachable!!!";
6768
LOG(ERROR) << "Using dummy calibration";
68-
mCalibParams = std::make_unique<o2::cpv::CalibParams>(1);
69-
mBadMap = std::make_unique<o2::cpv::BadChannelMap>(1);
70-
mPedestals = std::make_unique<o2::cpv::Pedestals>(1);
69+
mCalibParams = new o2::cpv::CalibParams(1);
70+
mBadMap = new o2::cpv::BadChannelMap(1);
71+
mPedestals = new o2::cpv::Pedestals(1);
72+
7173
} else {
7274
ccdbMgr.setCaching(true); //make local cache of remote objects
7375
ccdbMgr.setLocalObjectValidityChecking(true); //query objects from remote site only when local one is not valid
@@ -78,20 +80,20 @@ void RawToDigitConverterSpec::init(framework::InitContext& ctx)
7880
mCurrentTimeStamp = o2::ccdb::getCurrentTimestamp();
7981
ccdbMgr.setTimestamp(mCurrentTimeStamp);
8082

81-
mCalibParams.reset(ccdbMgr.get<o2::cpv::CalibParams>("CPV/Calib/Gains"));
83+
mCalibParams = ccdbMgr.get<o2::cpv::CalibParams>("CPV/Calib/Gains");
8284
if (!mCalibParams) {
83-
LOG(ERROR) << "Cannot get o2::cpv::CalibParams from CCDB. using dummy calibration!";
84-
mCalibParams = std::make_unique<o2::cpv::CalibParams>(1);
85+
LOG(ERROR) << "Cannot get o2::cpv::CalibParams from CCDB. Using dummy calibration!";
86+
mCalibParams = new o2::cpv::CalibParams(1);
8587
}
86-
mBadMap.reset(ccdbMgr.get<o2::cpv::BadChannelMap>("CPV/Calib/BadChannelMap"));
88+
mBadMap = ccdbMgr.get<o2::cpv::BadChannelMap>("CPV/Calib/BadChannelMap");
8789
if (!mBadMap) {
88-
LOG(ERROR) << "Cannot get o2::cpv::BadChannelMap from CCDB. using dummy calibration!";
89-
mBadMap = std::make_unique<o2::cpv::BadChannelMap>(1);
90+
LOG(ERROR) << "Cannot get o2::cpv::BadChannelMap from CCDB. Using dummy calibration!";
91+
mBadMap = new o2::cpv::BadChannelMap(1);
9092
}
91-
mPedestals.reset(ccdbMgr.get<o2::cpv::Pedestals>("CPV/Calib/Pedestals"));
93+
mPedestals = ccdbMgr.get<o2::cpv::Pedestals>("CPV/Calib/Pedestals");
9294
if (!mPedestals) {
93-
LOG(ERROR) << "Cannot get o2::cpv::Pedestals from CCDB. using dummy calibration!";
94-
mPedestals = std::make_unique<o2::cpv::Pedestals>(1);
95+
LOG(ERROR) << "Cannot get o2::cpv::Pedestals from CCDB. Using dummy calibration!";
96+
mPedestals = new o2::cpv::Pedestals(1);
9597
}
9698
LOG(INFO) << "Task configuration is done.";
9799
}

0 commit comments

Comments
 (0)