CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
RPCUnpackingModule.cc
Go to the documentation of this file.
1 #include "RPCUnpackingModule.h"
13 //#include "FWCore/Framework/interface/ESHandle.h"
17 
20 
28 
29 #include <sstream>
30 #include <bitset>
31 
32 using namespace edm;
33 using namespace std;
34 using namespace rpcrawtodigi;
35 
36 typedef uint64_t Word64;
37 
38 
40  : dataLabel_(pset.getParameter<edm::InputTag>("InputLabel")),
41  doSynchro_(pset.getParameter<bool>("doSynchro")),
42  eventCounter_(0),
43  theCabling(0)
44 {
45  produces<RPCDigiCollection>();
46  produces<RPCRawDataCounts>();
47  if (doSynchro_) produces<RPCRawSynchro::ProdItem>();
48  fedToken_=consumes<FEDRawDataCollection>(dataLabel_);
49 
50 }
51 
53 {
54  delete theCabling;
55 }
56 
58 {
59  if (theRecordWatcher.check(es)) {
60  LogTrace("") << "record has CHANGED!!, (re)initialise readout map!";
61  delete theCabling;
62  ESTransientHandle<RPCEMap> readoutMapping;
63  es.get<RPCEMapRcd>().get(readoutMapping);
64  theCabling = readoutMapping->convert();
66  LogTrace("") <<" READOUT MAP VERSION: " << theCabling->version() << endl;
67  }
68 }
69 
70 
72 {
74  eventCounter_++;
75  if (debug) LogDebug ("RPCUnpacker::produce") <<"Beginning To Unpack Event: "<<eventCounter_;
76 
77  Handle<FEDRawDataCollection> allFEDRawData;
78  ev.getByToken(fedToken_,allFEDRawData);
79 
80 
81  std::auto_ptr<RPCDigiCollection> producedRPCDigis(new RPCDigiCollection);
82  std::auto_ptr<RPCRawDataCounts> producedRawDataCounts(new RPCRawDataCounts);
83  std::auto_ptr<RPCRawSynchro::ProdItem> producedRawSynchoCounts;
84  if (doSynchro_) producedRawSynchoCounts.reset(new RPCRawSynchro::ProdItem);
85 
86  int status = 0;
87  for (int fedId= FEDNumbering::MINRPCFEDID; fedId<=FEDNumbering::MAXRPCFEDID; ++fedId){
88 
89  const FEDRawData & rawData = allFEDRawData->FEDData(fedId);
90  RPCRecordFormatter interpreter =
91  theCabling ? RPCRecordFormatter(fedId,&theReadoutMappingSearch) : RPCRecordFormatter(fedId,0);
92  int triggerBX =0;
93  int nWords = rawData.size()/sizeof(Word64);
94  if (nWords==0) continue;
95 
96  //
97  // check headers
98  //
99  const Word64* header = reinterpret_cast<const Word64* >(rawData.data()); header--;
100  bool moreHeaders = true;
101  while (moreHeaders) {
102  header++;
103  FEDHeader fedHeader( reinterpret_cast<const unsigned char*>(header));
104  if (!fedHeader.check()) {
105  producedRawDataCounts->addReadoutError(fedId, ReadoutError(ReadoutError::HeaderCheckFail));
106  if (debug) LogTrace("") <<" ** PROBLEM **, header.check() failed, break";
107  break;
108  }
109  if ( fedHeader.sourceID() != fedId) {
110  producedRawDataCounts->addReadoutError(fedId, ReadoutError(ReadoutError::InconsitentFedId));
111  if (debug) LogTrace ("") <<" ** PROBLEM **, fedHeader.sourceID() != fedId"
112  << "fedId = " << fedId<<" sourceID="<<fedHeader.sourceID();
113  }
114  triggerBX = fedHeader.bxID();
115  moreHeaders = fedHeader.moreHeaders();
116  if (debug) {
117  stringstream str;
118  str <<" header: "<< *reinterpret_cast<const bitset<64>*> (header) << endl;
119  str <<" header triggerType: " << fedHeader.triggerType()<<endl;
120  str <<" header lvl1ID: " << fedHeader.lvl1ID() << endl;
121  str <<" header bxID: " << fedHeader.bxID() << endl;
122  str <<" header sourceID: " << fedHeader.sourceID() << endl;
123  str <<" header version: " << fedHeader.version() << endl;
124  LogTrace("") << str.str();
125  }
126  }
127 
128  //
129  // check trailers
130  //
131  const Word64* trailer=reinterpret_cast<const Word64* >(rawData.data())+(nWords-1); trailer++;
132  bool moreTrailers = true;
133  while (moreTrailers) {
134  trailer--;
135  FEDTrailer fedTrailer(reinterpret_cast<const unsigned char*>(trailer));
136  if ( !fedTrailer.check()) {
137  producedRawDataCounts->addReadoutError(fedId, ReadoutError(ReadoutError::TrailerCheckFail));
138  if (debug) LogTrace("") <<" ** PROBLEM **, trailer.check() failed, break";
139  break;
140  }
141  if ( fedTrailer.lenght()!= nWords) {
142  producedRawDataCounts->addReadoutError(fedId, ReadoutError(ReadoutError::InconsistentDataSize));
143  if (debug) LogTrace("")<<" ** PROBLEM **, fedTrailer.lenght()!= nWords, break";
144  break;
145  }
146  moreTrailers = fedTrailer.moreTrailers();
147  if (debug) {
148  ostringstream str;
149  str <<" trailer: "<< *reinterpret_cast<const bitset<64>*> (trailer) << endl;
150  str <<" trailer lenght: "<<fedTrailer.lenght()<<endl;
151  str <<" trailer crc: "<<fedTrailer.crc()<<endl;
152  str <<" trailer evtStatus: "<<fedTrailer.evtStatus()<<endl;
153  str <<" trailer ttsBits: "<<fedTrailer.ttsBits()<<endl;
154  LogTrace("") << str.str();
155  }
156  }
157 
158  //
159  // data records
160  //
161  if (debug) {
162  ostringstream str;
163  for (const Word64* word = header+1; word != trailer; word++) {
164  str<<" data: "<<*reinterpret_cast<const bitset<64>*>(word) << endl;
165  }
166  LogTrace("") << str.str();
167  }
168 // if (triggerBX != 51) continue;
169 // if (triggerBX != 2316) continue;
170  EventRecords event(triggerBX);
171  for (const Word64* word = header+1; word != trailer; word++) {
172  for( int iRecord=1; iRecord<=4; iRecord++){
173  const DataRecord::Data* pRecord = reinterpret_cast<const DataRecord::Data* >(word+1)-iRecord;
174  DataRecord record(*pRecord);
175  event.add(record);
176  if (debug) {
177  std::ostringstream str;
178  str <<"record: "<<record.print()<<" hex: "<<hex<<*pRecord<<dec;
179  str <<" type:"<<record.type()<<DataRecord::print(record);
180  if (event.complete()) {
181  str<< " --> dccId: "<<fedId
182  << " rmb: " <<event.recordSLD().rmb()
183  << " lnk: "<<event.recordSLD().tbLinkInputNumber()
184  << " lb: "<<event.recordCD().lbInLink()
185  << " part: "<<event.recordCD().partitionNumber()
186  << " data: "<<event.recordCD().partitionData()
187  << " eod: "<<event.recordCD().eod();
188  }
189  LogTrace("") << str.str();
190  }
191  producedRawDataCounts->addDccRecord(fedId, record);
192  int statusTMP = 0;
193  if (event.complete() ) statusTMP=
194  interpreter.recordUnpack( event,
195  producedRPCDigis.get(), producedRawDataCounts.get(), producedRawSynchoCounts.get());
196  if (statusTMP != 0) status = statusTMP;
197  }
198  }
199  }
200  if (status && debug) LogTrace("")<<" RPCUnpackingModule - There was unpacking PROBLEM in this event"<<endl;
201  if (debug) LogTrace("") << DebugDigisPrintout()(producedRPCDigis.get()) << endl;
202  ev.put(producedRPCDigis);
203  ev.put(producedRawDataCounts);
204  if (doSynchro_) ev.put(producedRawSynchoCounts);
205 
206 }
#define LogDebug(id)
bool check()
Definition: FEDTrailer.cc:64
int version()
Version identifier of the FED data format.
Definition: FEDHeader.cc:32
RPCReadOutMappingWithFastSearch theReadoutMappingSearch
JetCorrectorParameters::Record record
Definition: classes.h:7
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:446
std::vector< std::pair< LinkBoardElectronicIndex, int > > ProdItem
Definition: RPCRawSynchro.h:9
std::string print(const Track &, edm::Verbosity=edm::Concise)
Track print utility.
Definition: print.cc:10
int evtStatus()
Event fragment status information.
Definition: FEDTrailer.cc:27
static MessageDrop * instance()
Definition: MessageDrop.cc:60
bool moreTrailers()
Definition: FEDTrailer.cc:37
bool ev
void init(const RPCReadOutMapping *arm)
takes ownership of map
size_t size() const
Lenght of the data buffer in bytes.
Definition: FEDRawData.h:47
RPCUnpackingModule(const edm::ParameterSet &pset)
Constructor.
int sourceID()
Identifier of the FED.
Definition: FEDHeader.cc:28
const std::string & version() const
version as string
bool moreHeaders()
Definition: FEDHeader.cc:36
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
Definition: Event.h:113
edm::InputTag dataLabel_
void produce(edm::Event &ev, const edm::EventSetup &es) override
uint64_t Word64
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)
virtual ~RPCUnpackingModule()
Destructor.
int ttsBits()
Current value of the Trigger Throttling System bitsAQ).
Definition: FEDTrailer.cc:32
bool check()
Check that the header is OK.
Definition: FEDHeader.cc:64
#define debug
Definition: HDRShower.cc:19
unsigned long long uint64_t
Definition: Time.h:15
int lenght()
The length of the event fragment counted in 64-bit words including header and trailer.
Definition: FEDTrailer.cc:17
void beginRun(const edm::Run &run, const edm::EventSetup &es) override
const T & get() const
Definition: EventSetup.h:55
int bxID()
The bunch crossing number.
Definition: FEDHeader.cc:24
bool check(const edm::EventSetup &iSetup)
Definition: ESWatcher.h:57
int recordUnpack(const rpcrawtodigi::EventRecords &event, RPCDigiCollection *prod, RPCRawDataCounts *counter, RPCRawSynchro::ProdItem *synchro)
edm::EDGetTokenT< FEDRawDataCollection > fedToken_
std::string print() const
Definition: DataRecord.h:38
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
Definition: FEDRawData.cc:28
int crc()
Cyclic Redundancy Code of the event fragment including header and trailer.
Definition: FEDTrailer.cc:22
DataRecordType type() const
Definition: DataRecord.cc:13
int lvl1ID()
Level-1 event number generated by the TTC system.
Definition: FEDHeader.cc:20
tuple status
Definition: ntuplemaker.py:245
int triggerType()
Event Trigger type identifier.
Definition: FEDHeader.cc:16
unsigned long eventCounter_
edm::ESWatcher< RPCEMapRcd > theRecordWatcher
Definition: Run.h:41