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);
5758using namespace gem ;
5859
5960GEMRawToDigiModule::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
0 commit comments