CMS 3D CMS Logo

RPCPackingModule.cc
Go to the documentation of this file.
2 
5 
9 
12 
15 
18 
22 
23 #include <string>
24 #include <sstream>
25 
26 using namespace std;
27 using namespace edm;
28 using namespace rpcrawtodigi;
29 
30 typedef uint64_t Word64;
31 
33  dataLabel_ = consumes<RPCDigiCollection>(pset.getParameter<edm::InputTag>("InputLabel"));
34  theCabling = new RPCReadOutMapping("");
35  produces<FEDRawDataCollection>();
36 }
37 
38 RPCPackingModule::~RPCPackingModule() { delete theCabling; }
39 
42  ev.getByToken(dataLabel_, digiCollection);
43  LogDebug("") << DebugDigisPrintout()(digiCollection.product());
44 
45  if (recordWatcher_.check(es)) {
46  delete theCabling;
47  LogTrace("") << "record has CHANGED!!, initialise readout map!";
48  ESHandle<RPCEMap> readoutMapping;
49  es.get<RPCEMapRcd>().get(readoutMapping);
50  theCabling = readoutMapping->convert();
51  LogTrace("") << " READOUT MAP VERSION: " << theCabling->version() << endl;
52  }
53 
54  auto buffers = std::make_unique<FEDRawDataCollection>();
55 
56  // pair<int,int> rpcFEDS=FEDNumbering::getRPCFEDIds();
57  pair<int, int> rpcFEDS(790, 792);
58  for (int id = rpcFEDS.first; id <= rpcFEDS.second; ++id) {
59  RPCRecordFormatter formatter(id, theCabling);
60  unsigned int lvl1_ID = ev.id().event();
61  FEDRawData* rawData = RPCPackingModule::rawData(id, lvl1_ID, digiCollection.product(), formatter);
62  FEDRawData& fedRawData = buffers->FEDData(id);
63 
64  fedRawData = *rawData;
65  delete rawData;
66  }
67  ev.put(std::move(buffers));
68 }
69 
71  unsigned int lvl1_ID,
72  const RPCDigiCollection* digis,
73  const RPCRecordFormatter& formatter) const {
74  //
75  // get merged records
76  //
77  int trigger_BX = 200; // FIXME - set event by event but correct bx assigment in digi
78  vector<EventRecords> merged = RPCPackingModule::eventRecords(fedId, trigger_BX, digis, formatter);
79 
80  //
81  // create data words
82  //
83  vector<Word64> dataWords;
85  typedef vector<EventRecords>::const_iterator IR;
86  for (IR ir = merged.begin(), irEnd = merged.end(); ir != irEnd; ++ir) {
87  Word64 w = (((Word64(ir->recordBX().data()) << 16) | ir->recordSLD().data()) << 16 | ir->recordCD().data()) << 16 |
88  empty.data();
89  dataWords.push_back(w);
90  }
91 
92  //
93  // create raw data
94  //
95  int nHeaders = 1;
96  int nTrailers = 1;
97  int dataSize = (nHeaders + nTrailers + dataWords.size()) * sizeof(Word64);
98  FEDRawData* raw = new FEDRawData(dataSize);
99 
100  //
101  // add header
102  //
103  unsigned char* pHeader = raw->data();
104  int evt_ty = 3;
105  int source_ID = fedId;
106  FEDHeader::set(pHeader, evt_ty, lvl1_ID, trigger_BX, source_ID);
107 
108  //
109  // add datawords
110  //
111  for (unsigned int idata = 0; idata < dataWords.size(); idata++) {
112  Word64* word = reinterpret_cast<Word64*>(pHeader + (idata + 1) * sizeof(Word64));
113  *word = dataWords[idata];
114  }
115 
116  //
117  // add trailer
118  //
119  unsigned char* pTrailer = pHeader + raw->size() - sizeof(Word64);
120  int crc = 0;
121  int evt_stat = 15;
122  int tts = 0;
123  int datasize = raw->size() / sizeof(Word64);
124  FEDTrailer::set(pTrailer, datasize, crc, evt_stat, tts);
125 
126  return raw;
127 }
128 
129 vector<EventRecords> RPCPackingModule::eventRecords(int fedId,
130  int trigger_BX,
131  const RPCDigiCollection* digis,
132  const RPCRecordFormatter& formatter) {
133  typedef DigiContainerIterator<RPCDetId, RPCDigi> DigiRangeIterator;
134  vector<EventRecords> dataRecords;
135 
136  LogDebug("RPCRawDataPacker") << "Packing Fed id=" << fedId;
137  for (DigiRangeIterator it = digis->begin(); it != digis->end(); it++) {
138  RPCDetId rpcDetId = (*it).first;
139  uint32_t rawDetId = rpcDetId.rawId();
140  RPCDigiCollection::Range range = digis->get(rpcDetId);
141  for (vector<RPCDigi>::const_iterator id = range.first; id != range.second; id++) {
142  const RPCDigi& digi = (*id);
143  vector<EventRecords> rawFromDigi = formatter.recordPack(rawDetId, digi, trigger_BX);
144  dataRecords.insert(dataRecords.end(), rawFromDigi.begin(), rawFromDigi.end());
145  }
146  }
147 
148  //
149  // merge data words
150  //
151  LogTrace("RPCRawDataPacker") << " size of data: " << dataRecords.size();
152  vector<EventRecords> merged = EventRecords::mergeRecords(dataRecords);
153  LogTrace("") << " size of megred: " << merged.size();
154 
155  return merged;
156 }
#define LogDebug(id)
T getParameter(std::string const &) const
EventNumber_t event() const
Definition: EventID.h:40
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:131
uint64_t Word64
const double w
Definition: UKUtility.cc:23
~RPCPackingModule() override
dtor
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:525
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
static std::vector< rpcrawtodigi::EventRecords > eventRecords(int fedId, int trigger_BX, const RPCDigiCollection *, const RPCRecordFormatter &)
bool ev
size_t size() const
Lenght of the data buffer in bytes.
Definition: FEDRawData.h:45
FEDRawData * rawData(int fedId, unsigned int lvl1_ID, const RPCDigiCollection *, const RPCRecordFormatter &) const
uint64_t word
static void set(unsigned char *trailer, uint32_t lenght, uint16_t crc, uint8_t evt_stat, uint8_t tts, bool moreTrailers=false)
Set all fields in the trailer.
Definition: FEDTrailer.cc:31
const Data & data() const
Definition: DataRecord.h:31
uint64_t Word64
std::vector< rpcrawtodigi::EventRecords > recordPack(uint32_t rawDetId, const RPCDigi &digi, int trigger_BX) const
#define LogTrace(id)
T const * product() const
Definition: Handle.h:69
unsigned long long uint64_t
Definition: Time.h:13
RPCPackingModule(const edm::ParameterSet &)
ctor
void produce(edm::Event &, const edm::EventSetup &) override
get data, convert to raw event, attach again to Event
std::pair< const_iterator, const_iterator > Range
edm::EventID id() const
Definition: EventBase.h:59
HLT enums.
T get() const
Definition: EventSetup.h:73
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
Definition: FEDRawData.cc:24
RPCReadOutMapping const * convert() const
Definition: RPCEMap.h:64
static void set(unsigned char *header, uint8_t triggerType, uint32_t lvl1ID, uint16_t bxID, uint16_t sourceID, uint8_t version=0, bool moreHeaders=false)
Set all fields in the header.
Definition: FEDHeader.cc:25
def move(src, dest)
Definition: eostools.py:511