CMS 3D CMS Logo

RPCUnpackingModule.cc
Go to the documentation of this file.
1 #include "RPCUnpackingModule.h"
13 //#include "FWCore/Framework/interface/ESHandle.h"
17 
22 
30 
31 #include <sstream>
32 #include <bitset>
33 
34 using namespace edm;
35 using namespace std;
36 using namespace rpcrawtodigi;
37 
38 typedef uint64_t Word64;
39 
40 
42  : dataLabel_(pset.getParameter<edm::InputTag>("InputLabel")),
43  doSynchro_(pset.getParameter<bool>("doSynchro")),
44  eventCounter_(0),
45  theCabling(nullptr)
46 {
47  produces<RPCDigiCollection>();
48  produces<RPCRawDataCounts>();
49  if (doSynchro_) produces<RPCRawSynchro::ProdItem>();
50  fedToken_=consumes<FEDRawDataCollection>(dataLabel_);
51 
52 }
53 
55 {
56  delete theCabling;
57 }
58 
61  desc.add<edm::InputTag>("InputLabel",edm::InputTag("rawDataCollector"));
62  desc.add<bool>("doSynchro",true);
63  descriptions.add("rpcUnpackingModule",desc);
64 }
65 
66 
68 {
69  if (theRecordWatcher.check(es)) {
70  LogTrace("") << "record has CHANGED!!, (re)initialise readout map!";
71  delete theCabling;
72  ESTransientHandle<RPCEMap> readoutMapping;
73  es.get<RPCEMapRcd>().get(readoutMapping);
74  theCabling = readoutMapping->convert();
76  LogTrace("") <<" READOUT MAP VERSION: " << theCabling->version() << endl;
77  }
78 }
79 
80 
82 {
84  eventCounter_++;
85  if (debug) LogDebug ("RPCUnpacker::produce") <<"Beginning To Unpack Event: "<<eventCounter_;
86 
87  Handle<FEDRawDataCollection> allFEDRawData;
88  ev.getByToken(fedToken_,allFEDRawData);
89 
90 
91  auto producedRPCDigis = std::make_unique<RPCDigiCollection>();
92  auto producedRawDataCounts = std::make_unique<RPCRawDataCounts>();
93  std::unique_ptr<RPCRawSynchro::ProdItem> producedRawSynchoCounts;
94  if (doSynchro_) producedRawSynchoCounts = std::make_unique<RPCRawSynchro::ProdItem>();
95 
96  int status = 0;
98 
99  const FEDRawData & rawData = allFEDRawData->FEDData(fedId);
100  RPCRecordFormatter interpreter =
101  theCabling ? RPCRecordFormatter(fedId,&theReadoutMappingSearch) : RPCRecordFormatter(fedId,nullptr);
102  int triggerBX =0;
103  unsigned int nWords = rawData.size()/sizeof(Word64);
104  if (nWords==0) continue;
105 
106  //
107  // check headers
108  //
109  const Word64* header = reinterpret_cast<const Word64* >(rawData.data()); header--;
110  bool moreHeaders = true;
111  while (moreHeaders) {
112  header++;
113  FEDHeader fedHeader( reinterpret_cast<const unsigned char*>(header));
114  if (!fedHeader.check()) {
115  producedRawDataCounts->addReadoutError(fedId, ReadoutError(ReadoutError::HeaderCheckFail));
116  if (debug) LogTrace("") <<" ** PROBLEM **, header.check() failed, break";
117  break;
118  }
119  if ( fedHeader.sourceID() != fedId) {
120  producedRawDataCounts->addReadoutError(fedId, ReadoutError(ReadoutError::InconsitentFedId));
121  if (debug) LogTrace ("") <<" ** PROBLEM **, fedHeader.sourceID() != fedId"
122  << "fedId = " << fedId<<" sourceID="<<fedHeader.sourceID();
123  }
124  triggerBX = fedHeader.bxID();
125  moreHeaders = fedHeader.moreHeaders();
126  if (debug) {
127  stringstream str;
128  str <<" header: "<< *reinterpret_cast<const bitset<64>*> (header) << endl;
129  str <<" header triggerType: " << fedHeader.triggerType()<<endl;
130  str <<" header lvl1ID: " << fedHeader.lvl1ID() << endl;
131  str <<" header bxID: " << fedHeader.bxID() << endl;
132  str <<" header sourceID: " << fedHeader.sourceID() << endl;
133  str <<" header version: " << fedHeader.version() << endl;
134  LogTrace("") << str.str();
135  }
136  }
137 
138  //
139  // check trailers
140  //
141  const Word64* trailer=reinterpret_cast<const Word64* >(rawData.data())+(nWords-1); trailer++;
142  bool moreTrailers = true;
143  while (moreTrailers) {
144  trailer--;
145  FEDTrailer fedTrailer(reinterpret_cast<const unsigned char*>(trailer));
146  if ( !fedTrailer.check()) {
147  producedRawDataCounts->addReadoutError(fedId, ReadoutError(ReadoutError::TrailerCheckFail));
148  if (debug) LogTrace("") <<" ** PROBLEM **, trailer.check() failed, break";
149  break;
150  }
151  if ( fedTrailer.fragmentLength()!= nWords) {
152  producedRawDataCounts->addReadoutError(fedId, ReadoutError(ReadoutError::InconsistentDataSize));
153  if (debug) LogTrace("")<<" ** PROBLEM **, fedTrailer.fragmentLength()!= nWords, break";
154  break;
155  }
156  moreTrailers = fedTrailer.moreTrailers();
157  if (debug) {
158  ostringstream str;
159  str <<" trailer: "<< *reinterpret_cast<const bitset<64>*> (trailer) << endl;
160  str <<" trailer lenght: "<<fedTrailer.fragmentLength()<<endl;
161  str <<" trailer crc: "<<fedTrailer.crc()<<endl;
162  str <<" trailer evtStatus: "<<fedTrailer.evtStatus()<<endl;
163  str <<" trailer ttsBits: "<<fedTrailer.ttsBits()<<endl;
164  LogTrace("") << str.str();
165  }
166  }
167 
168  //
169  // data records
170  //
171  if (debug) {
172  ostringstream str;
173  for (const Word64* word = header+1; word != trailer; word++) {
174  str<<" data: "<<*reinterpret_cast<const bitset<64>*>(word) << endl;
175  }
176  LogTrace("") << str.str();
177  }
178 // if (triggerBX != 51) continue;
179 // if (triggerBX != 2316) continue;
180  EventRecords event(triggerBX);
181  for (const Word64* word = header+1; word != trailer; word++) {
182  for( int iRecord=1; iRecord<=4; iRecord++){
183  const DataRecord::Data* pRecord = reinterpret_cast<const DataRecord::Data* >(word+1)-iRecord;
184  DataRecord record(*pRecord);
185  event.add(record);
186  if (debug) {
187  std::ostringstream str;
188  str <<"record: "<<record.print()<<" hex: "<<hex<<*pRecord<<dec;
189  str <<" type:"<<record.type()<<DataRecord::print(record);
190  if (event.complete()) {
191  str<< " --> dccId: "<<fedId
192  << " rmb: " <<event.recordSLD().rmb()
193  << " lnk: "<<event.recordSLD().tbLinkInputNumber()
194  << " lb: "<<event.recordCD().lbInLink()
195  << " part: "<<event.recordCD().partitionNumber()
196  << " data: "<<event.recordCD().partitionData()
197  << " eod: "<<event.recordCD().eod();
198  }
199  LogTrace("") << str.str();
200  }
201  producedRawDataCounts->addDccRecord(fedId, record);
202  int statusTMP = 0;
203  if (event.complete() ) statusTMP=
204  interpreter.recordUnpack( event,
205  producedRPCDigis.get(), producedRawDataCounts.get(), producedRawSynchoCounts.get());
206  if (statusTMP != 0) status = statusTMP;
207  }
208  }
209  }
210  if (status && debug) LogTrace("")<<" RPCUnpackingModule - There was unpacking PROBLEM in this event"<<endl;
211  if (debug) LogTrace("") << DebugDigisPrintout()(producedRPCDigis.get()) << endl;
212  ev.put(std::move(producedRPCDigis));
213  ev.put(std::move(producedRawDataCounts));
214  if (doSynchro_) ev.put(std::move(producedRawSynchoCounts));
215 
216 }
#define LogDebug(id)
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:137
RPCReadOutMappingWithFastSearch theReadoutMappingSearch
uint8_t triggerType() const
Event Trigger type identifier.
Definition: FEDHeader.cc:17
JetCorrectorParameters::Record record
Definition: classes.h:7
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:579
bool moreHeaders() const
Definition: FEDHeader.cc:42
bool check() const
Check that the header is OK.
Definition: FEDHeader.cc:72
static MessageDrop * instance()
Definition: MessageDrop.cc:60
uint16_t sourceID() const
Identifier of the FED.
Definition: FEDHeader.cc:32
uint16_t crc() const
Cyclic Redundancy Code of the event fragment including header and trailer.
Definition: FEDTrailer.cc:22
bool check() const
Check that the trailer is OK.
Definition: FEDTrailer.cc:83
bool ev
bool moreTrailers() const
Definition: FEDTrailer.cc:37
uint8_t version() const
Version identifier of the FED data format.
Definition: FEDHeader.cc:37
void init(const RPCReadOutMapping *arm)
takes ownership of map
S & print(S &os, JobReport::InputFile const &f)
Definition: JobReport.cc:65
#define nullptr
size_t size() const
Lenght of the data buffer in bytes.
Definition: FEDRawData.h:47
uint32_t fragmentLength() const
The length of the event fragment counted in 64-bit words including header and trailer.
Definition: FEDTrailer.cc:17
RPCUnpackingModule(const edm::ParameterSet &pset)
Constructor.
const FEDRawData & FEDData(int fedid) const
retrieve data for fed
const std::string & version() const
version as string
edm::InputTag dataLabel_
void produce(edm::Event &ev, const edm::EventSetup &es) override
uint64_t Word64
ParameterDescriptionBase * add(U const &iLabel, T const &value)
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
const RPCReadOutMapping * theCabling
#define LogTrace(id)
~RPCUnpackingModule() override
Destructor.
#define debug
Definition: HDRShower.cc:19
uint8_t ttsBits() const
Current value of the Trigger Throttling System bits.
Definition: FEDTrailer.cc:32
unsigned long long uint64_t
Definition: Time.h:15
void beginRun(const edm::Run &run, const edm::EventSetup &es) override
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
uint8_t evtStatus() const
Event fragment status information.
Definition: FEDTrailer.cc:27
void add(std::string const &label, ParameterSetDescription const &psetDescription)
bool check(const edm::EventSetup &iSetup)
Definition: ESWatcher.h:57
int recordUnpack(const rpcrawtodigi::EventRecords &event, RPCDigiCollection *prod, RPCRawDataCounts *counter, RPCRawSynchro::ProdItem *synchro)
uint16_t bxID() const
The bunch crossing number.
Definition: FEDHeader.cc:27
edm::EDGetTokenT< FEDRawDataCollection > fedToken_
std::string print() const
Definition: DataRecord.h:38
HLT enums.
T get() const
Definition: EventSetup.h:62
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
Definition: FEDRawData.cc:28
uint32_t lvl1ID() const
Level-1 event number generated by the TTC system.
Definition: FEDHeader.cc:22
RPCReadOutMapping const * convert() const
Definition: RPCEMap.h:67
#define str(s)
DataRecordType type() const
Definition: DataRecord.cc:13
unsigned long eventCounter_
def move(src, dest)
Definition: eostools.py:511
edm::ESWatcher< RPCEMapRcd > theRecordWatcher
Definition: Run.h:44