CMS 3D CMS Logo

RPCTwinMuxDigiToRaw.cc
Go to the documentation of this file.
2 
3 #include <cstdint>
4 #include <cstring>
5 #include <memory>
6 
16 
25 
27  : es_tm_link_map_br_token_(esConsumes<RPCAMCLinkMap, RPCTwinMuxLinkMapRcd, edm::Transition::BeginRun>()),
29  es_lb_link_map_token_(esConsumes<RPCInverseLBLinkMap, RPCInverseLBLinkMapRcd>()),
30  bx_min_(config.getParameter<int>("bxMin")),
31  bx_max_(config.getParameter<int>("bxMax")),
32  ignore_eod_(config.getParameter<bool>("ignoreEOD")),
33  event_type_(config.getParameter<int>("eventType")),
34  ufov_(config.getParameter<unsigned int>("uFOV")) {
35  produces<FEDRawDataCollection>();
36  digi_token_ = consumes<RPCDigiCollection>(config.getParameter<edm::InputTag>("inputTag"));
37 }
38 
40 
43  desc.add<edm::InputTag>("inputTag", edm::InputTag("simMuonRPCDigis", ""));
44  desc.add<int>("bxMin", -2);
45  desc.add<int>("bxMax", 2);
46  desc.add<bool>("ignoreEOD", true);
47  desc.add<int>("eventType", 1);
48  desc.add<unsigned int>("uFOV", 1);
49  descs.add("RPCTwinMuxDigiToRaw", desc);
50 }
51 
55  fed_amcs_.clear();
56  for (auto const& tm_link : es_tm_link_map->getMap()) {
57  RPCAMCLink amc(tm_link.first);
58  amc.setAMCInput();
59  fed_amcs_[amc.getFED()].push_back(amc);
60  }
61  for (auto& fed_amcs : fed_amcs_) {
62  std::sort(fed_amcs.second.begin(), fed_amcs.second.end());
63  fed_amcs.second.erase(std::unique(fed_amcs.second.begin(), fed_amcs.second.end()), fed_amcs.second.end());
64  }
65  }
66 }
67 
69  // Get EventSetup Electronics Maps
72 
73  // Get Digi Collection
74  edm::Handle<RPCDigiCollection> digi_collection;
75  event.getByToken(digi_token_, digi_collection);
76 
77  // Create output
78  std::unique_ptr<FEDRawDataCollection> data_collection(new FEDRawDataCollection());
79 
80  std::map<RPCAMCLink, std::vector<std::pair<int, rpctwinmux::RPCRecord> > > amc_bx_tmrecord;
82  *es_tm_link_map_,
83  bx_min_,
84  bx_max_,
85  event.bunchCrossing(),
86  *digi_collection,
87  amc_bx_tmrecord,
88  ignore_eod_);
89 
90  std::map<int, FEDRawData> fed_data;
91  // Loop over the FEDs
92  for (std::pair<const int, std::vector<RPCAMCLink> > const& fed_amcs : fed_amcs_) {
93  FEDRawData& data = data_collection->FEDData(fed_amcs.first);
94  unsigned int size(0);
95 
96  // FED Header + BLOCK Header (1 word + 1 word)
97  data.resize((size + 2) * 8);
98  // FED Header
99  FEDHeader::set(data.data() + size * 8, event_type_, event.id().event(), event.bunchCrossing(), fed_amcs.first);
100  ++size;
101  // BLOCK Header
102  rpctwinmux::BlockHeader block_header(ufov_, fed_amcs.second.size(), event.eventAuxiliary().orbitNumber());
103  std::memcpy(data.data() + size * 8, &block_header.getRecord(), 8);
104  ++size;
105 
106  // BLOCK AMC Content - 1 word each
107  data.resize((size + fed_amcs.second.size()) * 8);
108  unsigned int block_content_size(0);
109  for (RPCAMCLink const& amc : fed_amcs.second) {
110  std::map<RPCAMCLink, std::vector<std::pair<int, rpctwinmux::RPCRecord> > >::const_iterator bx_tmrecord(
111  amc_bx_tmrecord.find(amc));
112  unsigned int block_amc_size(3 + 2 * (bx_tmrecord == amc_bx_tmrecord.end() ? 0 : bx_tmrecord->second.size()));
113  block_content_size += block_amc_size;
114  rpctwinmux::BlockAMCContent amc_content(
115  true, true, true, true, true, true, true, block_amc_size, 0, amc.getAMCNumber(), 0);
116  std::memcpy(data.data() + size * 8, &amc_content.getRecord(), 8);
117  ++size;
118  }
119 
120  // AMC Payload - 2 words header, 1 word trailer, 2 words per RPCRecord
121  data.resize((size + block_content_size) * 8);
122  for (RPCAMCLink const& amc : fed_amcs.second) {
123  // TwinMux Header
124  std::map<RPCAMCLink, std::vector<std::pair<int, rpctwinmux::RPCRecord> > >::const_iterator bx_tmrecord(
125  amc_bx_tmrecord.find(amc));
126  unsigned int block_amc_size(3 + 2 * (bx_tmrecord == amc_bx_tmrecord.end() ? 0 : bx_tmrecord->second.size()));
127 
128  rpctwinmux::TwinMuxHeader tm_header(amc.getAMCNumber(),
129  event.id().event(),
130  event.bunchCrossing(),
131  block_amc_size,
132  event.eventAuxiliary().orbitNumber(),
133  0);
134  tm_header.setRPCBXWindow(bx_min_, bx_min_);
135  std::memcpy(data.data() + size * 8, tm_header.getRecord(), 16);
136  size += 2;
137 
138  if (bx_tmrecord != amc_bx_tmrecord.end()) {
139  for (std::vector<std::pair<int, rpctwinmux::RPCRecord> >::const_iterator tmrecord = bx_tmrecord->second.begin();
140  tmrecord != bx_tmrecord->second.end();
141  ++tmrecord) {
142  std::memcpy(data.data() + size * 8, tmrecord->second.getRecord(), 16);
143  size += 2;
144  }
145  }
146 
147  rpctwinmux::TwinMuxTrailer tm_trailer(0x0, event.id().event(), 3 + 2 * block_amc_size);
148  std::memcpy(data.data() + size * 8, &tm_trailer.getRecord(), 8);
149  ++size;
150  // CRC32 not calculated (for now)
151  }
152 
153  // BLOCK Trailer + FED Trailer (1 word + 1 word)
154  data.resize((size + 2) * 8);
155  // BLOCK Trailer
156  rpctwinmux::BlockTrailer block_trailer(0x0, 0, event.id().event(), event.bunchCrossing());
157  std::memcpy(data.data() + size * 8, &block_trailer.getRecord(), 8);
158  ++size;
159  // CRC32 not calculated (for now)
160 
161  // FED Trailer
162  ++size;
163  FEDTrailer::set(data.data() + (size - 1) * 8, size, 0x0, 0, 0);
164  std::uint16_t crc(evf::compute_crc(data.data(), size * 8));
165  FEDTrailer::set(data.data() + (size - 1) * 8, size, crc, 0, 0);
166  }
167 
168  event.put(std::move(data_collection));
169 }
170 
ConfigurationDescriptions.h
RPCTwinMuxDigiToRaw::es_tm_link_map_br_token_
edm::ESGetToken< RPCAMCLinkMap, RPCTwinMuxLinkMapRcd > es_tm_link_map_br_token_
Definition: RPCTwinMuxDigiToRaw.h:41
RPCTwinMuxDigiToRaw::bx_min_
int bx_min_
Definition: RPCTwinMuxDigiToRaw.h:44
edm::ESWatcher::check
bool check(const edm::EventSetup &iSetup)
Definition: ESWatcher.h:57
RPCInverseAMCLinkMap
Definition: RPCInverseAMCLinkMap.h:9
Handle.h
electrons_cff.bool
bool
Definition: electrons_cff.py:366
MessageLogger.h
rpctwinmux::TwinMuxTrailer
Definition: RPCTwinMuxRecord.h:250
rpctwinmux::TwinMuxHeader
Definition: RPCTwinMuxRecord.h:170
RPCTwinMuxDigiToRaw::bx_max_
int bx_max_
Definition: RPCTwinMuxDigiToRaw.h:44
RPCTwinMuxDigiToRaw::fed_amcs_
std::map< int, std::vector< RPCAMCLink > > fed_amcs_
Definition: RPCTwinMuxDigiToRaw.h:50
edm::Run
Definition: Run.h:45
edm
HLT enums.
Definition: AlignableModifier.h:19
RPCInverseLBLinkMap
Definition: RPCInverseLBLinkMap.h:11
HLT_FULL_cff.InputTag
InputTag
Definition: HLT_FULL_cff.py:89301
edm::ParameterSetDescription
Definition: ParameterSetDescription.h:52
RPCAMCLinkMap
Definition: RPCAMCLinkMap.h:11
RPCTwinMuxDigiToRaw::ignore_eod_
bool ignore_eod_
Definition: RPCTwinMuxDigiToRaw.h:45
RPCTwinMuxDigiToRaw::produce
void produce(edm::Event &event, edm::EventSetup const &setup) override
Definition: RPCTwinMuxDigiToRaw.cc:68
FEDRawData.h
edm::Handle< RPCDigiCollection >
singleTopDQM_cfi.setup
setup
Definition: singleTopDQM_cfi.py:37
RPCTwinMuxPacker.h
RPCTwinMuxDigiToRaw::digi_token_
edm::EDGetTokenT< RPCDigiCollection > digi_token_
Definition: RPCTwinMuxDigiToRaw.h:40
FEDRawData
Definition: FEDRawData.h:19
RPCTwinMuxDigiToRaw::es_tm_link_map_watcher_
edm::ESWatcher< RPCTwinMuxLinkMapRcd > es_tm_link_map_watcher_
Definition: RPCTwinMuxDigiToRaw.h:49
RPCTwinMuxRecord.h
RPCTwinMuxDigiToRaw::es_lb_link_map_token_
edm::ESGetToken< RPCInverseLBLinkMap, RPCInverseLBLinkMapRcd > es_lb_link_map_token_
Definition: RPCTwinMuxDigiToRaw.h:43
config
Definition: config.py:1
MakerMacros.h
DEFINE_FWK_MODULE
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
edm::ConfigurationDescriptions::add
void add(std::string const &label, ParameterSetDescription const &psetDescription)
Definition: ConfigurationDescriptions.cc:57
RPCTwinMuxDigiToRaw::event_type_
int event_type_
Definition: RPCTwinMuxDigiToRaw.h:46
RPCTwinMuxPacker::getRPCTwinMuxRecords
static void getRPCTwinMuxRecords(RPCInverseLBLinkMap const &lb_map, RPCInverseAMCLinkMap const &amc_map, int min_bx, int max_bx, unsigned int bcn, RPCDigiCollection const &digis, std::map< RPCAMCLink, std::vector< std::pair< int, rpctwinmux::RPCRecord > > > &amc_bx_tmrecord, bool ignore_eod=false)
Definition: RPCTwinMuxPacker.cc:6
edm::ESHandle< RPCAMCLinkMap >
EcalFEDMonitor_cfi.FEDRawDataCollection
FEDRawDataCollection
Definition: EcalFEDMonitor_cfi.py:6
ParameterSetDescription.h
RPCTwinMuxDigiToRaw::beginRun
void beginRun(edm::Run const &run, edm::EventSetup const &setup) override
Definition: RPCTwinMuxDigiToRaw.cc:52
evf::compute_crc
unsigned short compute_crc(unsigned char *buffer, unsigned int bufSize)
Definition: CRC16.h:46
edm::ConfigurationDescriptions
Definition: ConfigurationDescriptions.h:28
rpctwinmux::TwinMuxHeader::setRPCBXWindow
void setRPCBXWindow(int bx_min=10, int bx_max=5)
RPCTwinMuxDigiToRaw
Definition: RPCTwinMuxDigiToRaw.h:29
RPCTwinMuxDigiToRaw::~RPCTwinMuxDigiToRaw
~RPCTwinMuxDigiToRaw() override
Definition: RPCTwinMuxDigiToRaw.cc:39
edm::ParameterSet
Definition: ParameterSet.h:47
edm::Transition
Transition
Definition: Transition.h:12
Event.h
jetUpdater_cfi.sort
sort
Definition: jetUpdater_cfi.py:29
createfilelist.int
int
Definition: createfilelist.py:10
FEDRawDataCollection.h
trackerHitRTTI::vector
Definition: trackerHitRTTI.h:21
RPCInverseLBLinkMapRcd
Definition: RPCInverseLBLinkMapRcd.h:9
rpctwinmux::BlockTrailer
Definition: RPCTwinMuxRecord.h:69
edm::EventSetup
Definition: EventSetup.h:58
FEDTrailer::set
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
RPCTwinMuxDigiToRaw::es_tm_link_map_token_
edm::ESGetToken< RPCInverseAMCLinkMap, RPCInverseTwinMuxLinkMapRcd > es_tm_link_map_token_
Definition: RPCTwinMuxDigiToRaw.h:42
InputTag.h
RPCTwinMuxDigiToRaw::RPCTwinMuxDigiToRaw
RPCTwinMuxDigiToRaw(edm::ParameterSet const &config)
Definition: RPCTwinMuxDigiToRaw.cc:26
submitPVResolutionJobs.desc
string desc
Definition: submitPVResolutionJobs.py:251
eostools.move
def move(src, dest)
Definition: eostools.py:511
writedatasetfile.run
run
Definition: writedatasetfile.py:27
tier0.unique
def unique(seq, keepstr=True)
Definition: tier0.py:24
FEDHeader::set
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
RPCInverseTwinMuxLinkMapRcd
Definition: RPCInverseTwinMuxLinkMapRcd.h:9
RPCTwinMuxDigiToRaw.h
EventSetup.h
RPCDigiCollection.h
amc
Definition: AMCSpec.h:8
data
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:79
rpctwinmux::BlockAMCContent
Definition: RPCTwinMuxRecord.h:104
RPCAMCLinkMap::getMap
map_type & getMap()
Definition: RPCAMCLinkMap.h:27
amc
double amc
Definition: hdecay.h:20
ParameterSet.h
event
Definition: event.py:1
RPCTwinMuxDigiToRaw::ufov_
unsigned int ufov_
Definition: RPCTwinMuxDigiToRaw.h:47
DeDxTools::esConsumes
ESGetTokenH3DDVariant esConsumes(std::string const &Reccord, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
edm::Event
Definition: Event.h:73
RPCTwinMuxLinkMapRcd
Definition: RPCTwinMuxLinkMapRcd.h:6
FEDHeader.h
edm::InputTag
Definition: InputTag.h:15
RPCTwinMuxDigiToRaw::fillDescriptions
static void fillDescriptions(edm::ConfigurationDescriptions &descs)
Definition: RPCTwinMuxDigiToRaw.cc:41
rpctwinmux::BlockHeader
Definition: RPCTwinMuxRecord.h:38
CRC16.h
findQualityFiles.size
size
Write out results.
Definition: findQualityFiles.py:443
FEDTrailer.h