Skip to content

Commit d7cec9e

Browse files
committed
added more sanity checks
1 parent 066c859 commit d7cec9e

File tree

5 files changed

+117
-59
lines changed

5 files changed

+117
-59
lines changed

DataFormats/GEMDigi/interface/AMC13Event.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,10 @@ namespace gem {
8282
void setCDFTrailer(uint64_t word) { cdft_ = word; }
8383
void setCDFTrailer(uint32_t EvtLength);
8484
uint64_t getCDFTrailer() const { return cdft_; }
85+
uint32_t fragmentLength() const { return CDFTrailer{cdft_}.evtLength; }
86+
uint16_t crc() const { return CDFTrailer{cdft_}.crcCDF; }
87+
uint8_t evtStatus() const { return CDFTrailer{cdft_}.evtStat; }
88+
uint8_t ttsBits() const { return CDFTrailer{cdft_}.tts; }
8589

8690
int bxId() const { return (int8_t)CDFHeader{cdfh_}.bxId; }
8791
uint32_t lv1Id() const { return CDFHeader{cdfh_}.lv1Id; }

EventFilter/GEMRawToDigi/interface/GEMRawToDigi.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,11 @@
99
class GEMRawToDigi {
1010
public:
1111
std::unique_ptr<gem::AMC13Event> convertWordToAMC13Event(const uint64_t* word);
12+
bool vfatError() const { return vfatError_; }
13+
bool amcError() const { return amcError_; }
1214

1315
private:
16+
bool vfatError_;
17+
bool amcError_;
1418
};
1519
#endif

EventFilter/GEMRawToDigi/plugins/GEMDigiToRawModule.cc

Lines changed: 33 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,9 @@ DEFINE_FWK_MODULE(GEMDigiToRawModule);
5252
using namespace gem;
5353

5454
GEMDigiToRawModule::GEMDigiToRawModule(const edm::ParameterSet& pset)
55-
: event_type_(pset.getParameter<int>("eventType")),
56-
digi_token(consumes<GEMDigiCollection>(pset.getParameter<edm::InputTag>("gemDigi"))),
57-
useDBEMap_(pset.getParameter<bool>("useDBEMap")) {
55+
: event_type_(pset.getParameter<int>("eventType")),
56+
digi_token(consumes<GEMDigiCollection>(pset.getParameter<edm::InputTag>("gemDigi"))),
57+
useDBEMap_(pset.getParameter<bool>("useDBEMap")) {
5858
produces<FEDRawDataCollection>();
5959
if (useDBEMap_) {
6060
gemEMapToken_ = esConsumes<GEMeMap, GEMeMapRcd, edm::Transition::BeginRun>();
@@ -100,9 +100,11 @@ void GEMDigiToRawModule::produce(edm::StreamID iID, edm::Event& iEvent, edm::Eve
100100
std::vector<std::unique_ptr<AMC13Event>> amc13Events;
101101
amc13Events.reserve(FEDNumbering::MAXGEMFEDID - FEDNumbering::MINGEMFEDID + 1);
102102

103-
uint32_t LV1_id = iEvent.id().event();
104-
uint16_t BX_id = iEvent.bunchCrossing();
105-
uint32_t OrN = iEvent.orbitNumber();
103+
int LV1_id = iEvent.id().event();
104+
int BX_id = iEvent.bunchCrossing();
105+
int OrN = iEvent.orbitNumber();
106+
LogDebug("GEMDigiToRawModule") << "Event bx:" << iEvent.bunchCrossing() << " lv1Id:" << iEvent.id().event()
107+
<< " orbitNumber:" << iEvent.orbitNumber();
106108

107109
// making map of bx GEMDigiCollection
108110
// each bx will be saved as new AMC13Event, so GEMDigiCollection needs to be split into bx
@@ -130,6 +132,7 @@ void GEMDigiToRawModule::produce(edm::StreamID iID, edm::Event& iEvent, edm::Eve
130132
for (uint8_t amcNum = 0; amcNum < GEMeMap::maxAMCs_; ++amcNum) {
131133
uint32_t amcSize = 0;
132134
std::unique_ptr<AMCdata> amcData = std::make_unique<AMCdata>();
135+
amcData->setAMCheader1(amcSize, BX_id, LV1_id, amcNum);
133136

134137
for (uint8_t gebId = 0; gebId < GEMeMap::maxGEBs_; ++gebId) {
135138
std::unique_ptr<GEBdata> gebData = std::make_unique<GEBdata>();
@@ -144,14 +147,14 @@ void GEMDigiToRawModule::produce(edm::StreamID iID, edm::Event& iEvent, edm::Eve
144147
GEMROMapping::vfatDC vfat_dc = gemROMap->vfatPos(vfat_ec);
145148
GEMDetId gemId = vfat_dc.detId;
146149
uint16_t vfatId = vfat_ec.vfatAdd;
147-
150+
148151
for (auto const& gemBx : gemBxMap) {
149-
int bc = BX_id + gemBx.first;
150-
151-
bool hasDigi = false;
152+
int bc = amcData->bx() + gemBx.first;
153+
154+
bool hasDigi = false;
152155
uint64_t lsData = 0; ///<channels from 1to64
153156
uint64_t msData = 0; ///<channels from 65to128
154-
157+
155158
GEMDigiCollection inBxGemDigis = gemBx.second;
156159
const GEMDigiCollection::Range& range = inBxGemDigis.get(gemId);
157160
for (GEMDigiCollection::const_iterator digiIt = range.first; digiIt != range.second; ++digiIt) {
@@ -173,46 +176,45 @@ void GEMDigiToRawModule::produce(edm::StreamID iID, edm::Event& iEvent, edm::Eve
173176
msData |= 1UL << (chMap.chNum - 64);
174177

175178
LogDebug("GEMDigiToRawModule")
176-
<< " fed: " << fedId << " amc:" << int(amcNum) << " geb:" << int(gebId)
177-
<< " vfat:" << vfat_dc.localPhi << ",type: " << vfat_dc.vfatType << " id:" << gemId
178-
<< " ch:" << chMap.chNum << " st:" << digi.strip() << " bx:" << digi.bx();
179+
<< " fed: " << fedId << " amc:" << int(amcNum) << " geb:" << int(gebId)
180+
<< " vfat:" << vfat_dc.localPhi << ",type: " << vfat_dc.vfatType << " id:" << gemId
181+
<< " ch:" << chMap.chNum << " st:" << digi.strip() << " bx:" << digi.bx();
179182
}
180183

181184
if (!hasDigi)
182185
continue;
183186
// only make vfat with hits
184187
amcSize += 3;
185188
auto vfatData = std::make_unique<VFATdata>(geb_dc.vfatVer, bc, 0, vfatId, lsData, msData);
189+
LogDebug("GEMDigiToRawModule")
190+
<< "VFAT bx:" << bc << " bx:" << int(vfatData->bc()) << " orbitNumber:" << iEvent.orbitNumber();
186191
gebData->addVFAT(*vfatData);
187192
}
188-
189-
} // end of vfats in GEB
193+
194+
} // end of vfats in GEB
190195

191196
if (!gebData->vFATs()->empty()) {
192197
amcSize += 2;
193198
gebData->setChamberHeader(gebData->vFATs()->size() * 3, gebId);
194199
gebData->setChamberTrailer(LV1_id, BX_id, gebData->vFATs()->size() * 3);
195200
amcData->addGEB(*gebData);
196-
}
197-
} // end of GEB loop
201+
}
202+
} // end of GEB loop
198203

199204
if (!amcData->gebs()->empty()) {
200205
amcSize += 5;
201206
amcData->setAMCheader1(amcSize, BX_id, LV1_id, amcNum);
202207
amcData->setAMCheader2(amcNum, OrN, 1);
203208
amcData->setGEMeventHeader(amcData->gebs()->size(), 0);
204-
LogDebug("GEMDigiToRawModule") << "davCnt: "<< int(amcData->davCnt());
209+
LogDebug("GEMDigiToRawModule") << "davCnt: " << int(amcData->davCnt());
205210
amc13Event->addAMCpayload(*amcData);
206211
// AMC header in AMC13Event
207-
uint8_t Blk_No = 0;
208-
uint8_t AMC_No = 0;
209-
uint16_t BoardID = 0;
210-
amc13Event->addAMCheader(amcSize, Blk_No, AMC_No, BoardID);
211-
amc13EvtLength += amcSize + 1; // AMC data size + AMC header size
212+
amc13Event->addAMCheader(amcSize, 0, amcNum, 0);
213+
amc13EvtLength += amcSize + 1; // AMC data size + AMC header size
212214
}
213215

214-
} // end of AMC loop
215-
216+
} // end of AMC loop
217+
216218
if (!amc13Event->getAMCpayloads()->empty()) {
217219
// CDFHeader
218220
amc13Event->setCDFHeader(event_type_, LV1_id, BX_id, fedId);
@@ -225,14 +227,13 @@ void GEMDigiToRawModule::produce(edm::StreamID iID, edm::Event& iEvent, edm::Eve
225227
LogDebug("GEMDigiToRawModule") << " EvtLength: " << int(EvtLength);
226228

227229
amc13Event->setCDFTrailer(EvtLength);
228-
LogDebug("GEMDigiToRawModule") << "getAMCpayloads: "<< amc13Event->getAMCpayloads()->size();
229-
LogDebug("GEMDigiToRawModule") << " nAMC: "<< int(amc13Event->nAMC())
230-
<< " LV1_id: "<< int(LV1_id)
231-
<< " BX_id: "<< int(BX_id);
232-
230+
LogDebug("GEMDigiToRawModule") << "getAMCpayloads: " << amc13Event->getAMCpayloads()->size();
231+
LogDebug("GEMDigiToRawModule") << " nAMC: " << int(amc13Event->nAMC()) << " LV1_id: " << int(LV1_id)
232+
<< " BX_id: " << int(BX_id);
233+
233234
amc13Events.emplace_back(std::move(amc13Event));
234235
} // finished making amc13Event data
235-
}// end of FED loop
236+
} // end of FED loop
236237

237238
// read out amc13Events into fedRawData
238239
for (const auto& amc13e : amc13Events) {

EventFilter/GEMRawToDigi/plugins/GEMRawToDigiModule.cc

Lines changed: 60 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include "DataFormats/Common/interface/Handle.h"
1111
#include "DataFormats/FEDRawData/interface/FEDNumbering.h"
1212
#include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
13+
#include "DataFormats/FEDRawData/interface/FEDTrailer.h"
1314
#include "DataFormats/GEMDigi/interface/AMC13Event.h"
1415
#include "DataFormats/GEMDigi/interface/GEMAMC13EventCollection.h"
1516
#include "DataFormats/GEMDigi/interface/GEMAMCdataCollection.h"
@@ -57,10 +58,10 @@ DEFINE_FWK_MODULE(GEMRawToDigiModule);
5758
using namespace gem;
5859

5960
GEMRawToDigiModule::GEMRawToDigiModule(const edm::ParameterSet& pset)
60-
: fed_token(consumes<FEDRawDataCollection>(pset.getParameter<edm::InputTag>("InputLabel"))),
61-
useDBEMap_(pset.getParameter<bool>("useDBEMap")),
62-
unPackStatusDigis_(pset.getParameter<bool>("unPackStatusDigis")),
63-
gemRawToDigi_(std::make_unique<GEMRawToDigi>()) {
61+
: fed_token(consumes<FEDRawDataCollection>(pset.getParameter<edm::InputTag>("InputLabel"))),
62+
useDBEMap_(pset.getParameter<bool>("useDBEMap")),
63+
unPackStatusDigis_(pset.getParameter<bool>("unPackStatusDigis")),
64+
gemRawToDigi_(std::make_unique<GEMRawToDigi>()) {
6465
produces<GEMDigiCollection>();
6566
if (unPackStatusDigis_) {
6667
produces<GEMVfatStatusDigiCollection>("vfatStatus");
@@ -118,28 +119,66 @@ void GEMRawToDigiModule::produce(edm::StreamID iID, edm::Event& iEvent, edm::Eve
118119

119120
if (nWords < 5)
120121
continue;
121-
122+
123+
// trailer checks
124+
FEDTrailer trailer(fedData.data() + fedData.size() - FEDTrailer::length);
125+
if (not trailer.check()) {
126+
edm::LogWarning("GEMRawToDigiModule") << " FED trailer check failed\n";
127+
}
128+
if (trailer.fragmentLength() * sizeof(uint64_t) != fedData.size()) {
129+
edm::LogWarning("GEMRawToDigiModule") << " FED fragment size mismatch: " << trailer.fragmentLength()
130+
<< " (fragment length) vs " << nWords << " (data size) words\n";
131+
}
132+
122133
const unsigned char* data = fedData.data();
123134
const uint64_t* word = reinterpret_cast<const uint64_t*>(data);
124135
auto amc13Event = gemRawToDigi_->convertWordToAMC13Event(word);
125136

126-
if (amc13Event == nullptr){
127-
LogDebug("GEMRawToDigiModule") << "amc13Event does not exists";
137+
if (amc13Event == nullptr) {
138+
LogDebug("GEMRawToDigiModule") << "amc13Event FAILED to unpack";
128139
continue;
129140
}
130-
LogDebug("GEMRawToDigiModule") << "Event bx:" << iEvent.bunchCrossing() << " lv1Id:" << iEvent.id().event() << " orbitNumber:" << iEvent.orbitNumber();
131-
LogDebug("GEMRawToDigiModule") << "AMC13 bx:" << amc13Event->bxId() << " lv1Id:" << int(amc13Event->lv1Id()) << " orbitNumber:" << amc13Event->orbitNumber();
132-
141+
if (gemRawToDigi_->amcError() || gemRawToDigi_->vfatError()) {
142+
edm::LogWarning("GEMRawToDigiModule")
143+
<< " amcError:" << gemRawToDigi_->amcError() << " vfatError:" << gemRawToDigi_->vfatError();
144+
}
145+
// compare trailers
146+
if (amc13Event->fragmentLength() != trailer.fragmentLength()) {
147+
edm::LogWarning("GEMRawToDigiModule") << " fragmentLength miss match";
148+
}
149+
if (amc13Event->crc() != trailer.crc()) {
150+
edm::LogWarning("GEMRawToDigiModule") << " crc miss match";
151+
}
152+
if (amc13Event->evtStatus() != trailer.evtStatus()) {
153+
edm::LogWarning("GEMRawToDigiModule") << " evtStatus miss match";
154+
}
155+
if (amc13Event->ttsBits() != trailer.ttsBits()) {
156+
edm::LogWarning("GEMRawToDigiModule") << " ttsBits miss match";
157+
}
158+
159+
LogDebug("GEMRawToDigiModule") << "Event bx:" << iEvent.bunchCrossing() << " lv1Id:" << iEvent.id().event()
160+
<< " orbitNumber:" << iEvent.orbitNumber();
161+
LogDebug("GEMRawToDigiModule") << "AMC13 bx:" << amc13Event->bxId() << " lv1Id:" << int(amc13Event->lv1Id())
162+
<< " orbitNumber:" << amc13Event->orbitNumber();
163+
133164
// Read AMC data
134165
for (auto amcData : *(amc13Event->getAMCpayloads())) {
135166
uint16_t amcBx = amcData.bx();
136167
uint8_t amcNum = amcData.amcNum();
137-
LogDebug("GEMRawToDigiModule") << "AMC bx:" << int(amcData.bx()) << " lv1Id:" << int(amcData.l1A()) << " orbitNumber:" << int(amcData.orbitNum());
168+
LogDebug("GEMRawToDigiModule") << "AMC no.:" << int(amcData.amcNum()) << " bx:" << int(amcData.bx())
169+
<< " lv1Id:" << int(amcData.l1A()) << " orbitNumber:" << int(amcData.orbitNum());
138170

139171
// Read GEB data
140172
for (auto gebData : *amcData.gebs()) {
141173
uint8_t gebId = gebData.inputID();
142174
GEMROMapping::chamEC geb_ec = {fedId, amcNum, gebId};
175+
176+
// check if Chamber exists.
177+
if (!gemROMap->isValidChamber(geb_ec)) {
178+
edm::LogWarning("GEMRawToDigiModule") << "InValid: amcNum " << int(amcNum) << " gebId " << int(gebId);
179+
continue;
180+
}
181+
143182
GEMROMapping::chamDC geb_dc = gemROMap->chamberPos(geb_ec);
144183
GEMDetId gemChId = geb_dc.detId;
145184
LogDebug("GEMRawToDigiModule") << "GEB bx:" << int(gebData.bcOH()) << " lv1Id:" << int(gebData.ecOH());
@@ -153,26 +192,27 @@ void GEMRawToDigiModule::produce(edm::StreamID iID, edm::Event& iEvent, edm::Eve
153192
// check if ChipID exists.
154193
if (!gemROMap->isValidChipID(vfat_ec)) {
155194
edm::LogWarning("GEMRawToDigiModule")
156-
<< "InValid: amcNum " << int(amcNum) << " gebId " << int(gebId) << " vfatId " << int(vfatId)
157-
<< " vfat Pos " << int(vfatData.position());
195+
<< "InValid: amcNum " << int(amcNum) << " gebId " << int(gebId) << " vfatId " << int(vfatId)
196+
<< " vfat Pos " << int(vfatData.position());
158197
continue;
159198
}
199+
160200
// check vfat data
161201
if (vfatData.quality()) {
162202
edm::LogWarning("GEMRawToDigiModule")
163-
<< "Quality " << int(vfatData.quality()) << " b1010 " << int(vfatData.b1010()) << " b1100 "
164-
<< int(vfatData.b1100()) << " b1110 " << int(vfatData.b1110());
203+
<< "Quality " << int(vfatData.quality()) << " b1010 " << int(vfatData.b1010()) << " b1100 "
204+
<< int(vfatData.b1100()) << " b1110 " << int(vfatData.b1110());
165205
if (vfatData.crc() != vfatData.checkCRC()) {
166206
edm::LogWarning("GEMRawToDigiModule")
167-
<< "DIFFERENT CRC :" << vfatData.crc() << " " << vfatData.checkCRC();
207+
<< "DIFFERENT CRC :" << vfatData.crc() << " " << vfatData.checkCRC();
168208
}
169209
}
170210

171211
GEMROMapping::vfatDC vfat_dc = gemROMap->vfatPos(vfat_ec);
172212

173213
vfatData.setPhi(vfat_dc.localPhi);
174214
GEMDetId gemId = vfat_dc.detId;
175-
int bx = vfatData.bc()-amcBx;
215+
int bx = vfatData.bc() - amcBx;
176216

177217
for (int chan = 0; chan < VFATdata::nChannels; ++chan) {
178218
uint8_t chan0xf = 0;
@@ -194,9 +234,9 @@ void GEMRawToDigiModule::produce(edm::StreamID iID, edm::Event& iEvent, edm::Eve
194234

195235
LogDebug("GEMRawToDigiModule") << "VFATbx:" << int(vfatData.bc()) << " lv1Id:" << int(vfatData.ec());
196236
LogDebug("GEMRawToDigiModule")
197-
<< " fed: " << fedId << " amc:" << int(amcNum) << " geb:" << int(gebId) << " vfat:" << vfat_dc.localPhi
198-
<< ",type: " << vfat_dc.vfatType << " id:" << gemId << " ch:" << chMap.chNum << " st:" << digi.strip()
199-
<< " bx:" << digi.bx();
237+
<< " fed: " << fedId << " amc:" << int(amcNum) << " geb:" << int(gebId) << " vfat:" << vfat_dc.localPhi
238+
<< ",type: " << vfat_dc.vfatType << " id:" << gemId << " ch:" << chMap.chNum << " st:" << digi.strip()
239+
<< " bx:" << digi.bx();
200240

201241
outGEMDigis.get()->insertDigi(gemId, digi);
202242

EventFilter/GEMRawToDigi/src/GEMRawToDigi.cc

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,16 @@
77
using namespace gem;
88

99
std::unique_ptr<AMC13Event> GEMRawToDigi::convertWordToAMC13Event(const uint64_t* word) {
10+
vfatError_ = false;
11+
amcError_ = false;
12+
1013
auto amc13Event = std::make_unique<AMC13Event>();
1114

1215
amc13Event->setCDFHeader(*word);
1316
amc13Event->setAMC13Header(*(++word));
1417

1518
// Readout out AMC headers
16-
LogDebug("GEMRawToDigi") << "nAMC: "<< int(amc13Event->nAMC());
19+
LogDebug("GEMRawToDigi") << "nAMC: " << int(amc13Event->nAMC());
1720
for (uint8_t i = 0; i < amc13Event->nAMC(); ++i)
1821
amc13Event->addAMCheader(*(++word));
1922

@@ -24,13 +27,13 @@ std::unique_ptr<AMC13Event> GEMRawToDigi::convertWordToAMC13Event(const uint64_t
2427
amcData.setAMCheader2(*(++word));
2528
amcData.setGEMeventHeader(*(++word));
2629

27-
LogDebug("GEMRawToDigi") << "davCnt: "<< int(amcData.davCnt());
30+
LogDebug("GEMRawToDigi") << "davCnt: " << int(amcData.davCnt());
2831
// Fill GEB
2932
for (uint8_t j = 0; j < amcData.davCnt(); ++j) {
3033
auto gebData = GEBdata();
3134
gebData.setChamberHeader(*(++word));
3235

33-
LogDebug("GEMRawToDigi") << "vfatWordCnt: "<< int(gebData.vfatWordCnt());
36+
LogDebug("GEMRawToDigi") << "vfatWordCnt: " << int(gebData.vfatWordCnt());
3437
// Fill vfat
3538
for (uint16_t k = 0; k < gebData.vfatWordCnt() / 3; k++) {
3639
auto vfatData = VFATdata();
@@ -42,16 +45,22 @@ std::unique_ptr<AMC13Event> GEMRawToDigi::convertWordToAMC13Event(const uint64_t
4245
} // end of vfat loop
4346

4447
gebData.setChamberTrailer(*(++word));
45-
if (gebData.vfatWordCnt() != gebData.vfatWordCntT())
46-
return nullptr;
48+
if (gebData.vfatWordCnt() != gebData.vfatWordCntT()) {
49+
vfatError_ = true;
50+
edm::LogWarning("GEMRawToDigi") << "VFAT word count miss match between header and trailer";
51+
}
4752
amcData.addGEB(gebData);
4853

4954
} // end of geb loop
5055

5156
amcData.setGEMeventTrailer(*(++word));
5257
amcData.setAMCTrailer(*(++word));
53-
if (amc13Event->getAMCsize(i) != amcData.dataLength())
54-
return nullptr;
58+
LogDebug("GEMRawToDigi") << "amcData.dataLength(): " << int(amcData.dataLength())
59+
<< " amc13Event->getAMCsize(i): " << int(amc13Event->getAMCsize(i));
60+
if (amc13Event->getAMCsize(i) != amcData.dataLength()) {
61+
amcError_ = true;
62+
edm::LogWarning("GEMRawToDigi") << "AMC size miss match";
63+
}
5564
amc13Event->addAMCpayload(amcData);
5665

5766
} // end of amc loop

0 commit comments

Comments
 (0)