CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
RPCDigiMerger.cc
Go to the documentation of this file.
2 
3 #include <memory>
4 
14 
16 
17 using namespace edm;
18 using namespace std;
19 
21  : bx_minTwinMux_(config.getParameter<int>("bxMinTwinMux")),
22  bx_maxTwinMux_(config.getParameter<int>("bxMaxTwinMux")),
23  bx_minOMTF_(config.getParameter<int>("bxMinOMTF")),
24  bx_maxOMTF_(config.getParameter<int>("bxMaxOMTF")),
25  bx_minCPPF_(config.getParameter<int>("bxMinCPPF")),
26  bx_maxCPPF_(config.getParameter<int>("bxMaxCPPF")) {
27  produces<RPCDigiCollection>();
28  simRPC_token_ = consumes<RPCDigiCollection>(config.getParameter<edm::InputTag>("inputTagSimRPCDigis"));
29  // protection against empty InputTag to allow for Data/MC compatibility
30  if (not config.getParameter<edm::InputTag>("inputTagTwinMuxDigis").label().empty()) {
31  twinMux_token_ = consumes<RPCDigiCollection>(config.getParameter<edm::InputTag>("inputTagTwinMuxDigis"));
32  }
33  if (not config.getParameter<edm::InputTag>("inputTagOMTFDigis").label().empty()) {
34  omtf_token_ = consumes<RPCDigiCollection>(config.getParameter<edm::InputTag>("inputTagOMTFDigis"));
35  }
36  if (not config.getParameter<edm::InputTag>("inputTagCPPFDigis").label().empty()) {
37  cppf_token_ = consumes<RPCDigiCollection>(config.getParameter<edm::InputTag>("inputTagCPPFDigis"));
38  }
39 }
40 
42 
45  desc.add<edm::InputTag>("inputTagSimRPCDigis", edm::InputTag("simMuonRPCDigis", ""));
46  desc.add<edm::InputTag>("inputTagTwinMuxDigis", edm::InputTag("", ""));
47  desc.add<edm::InputTag>("inputTagOMTFDigis", edm::InputTag("", ""));
48  desc.add<edm::InputTag>("inputTagCPPFDigis", edm::InputTag("", ""));
49  desc.add<edm::InputTag>("InputLabel", edm::InputTag(" "));
50  desc.add<int>("bxMinTwinMux", -2);
51  desc.add<int>("bxMaxTwinMux", 2);
52  desc.add<int>("bxMinOMTF", -3);
53  desc.add<int>("bxMaxOMTF", 4);
54  desc.add<int>("bxMinCPPF", -2);
55  desc.add<int>("bxMaxCPPF", 2);
56 
57  descs.add("rpcDigiMerger", desc);
58 }
59 
61 
63  // Get the digis
64  // new RPCDigiCollection
65  std::unique_ptr<RPCDigiCollection> rpc_digi_collection(new RPCDigiCollection());
66 
67  //Check if its Data
69  // loop over TwinMux digis
70  // protection against empty InputTag to allow for Data/MC compatibility
71  if (not twinMux_token_.isUninitialized()) {
72  Handle<RPCDigiCollection> TwinMux_digis;
73  event.getByToken(twinMux_token_, TwinMux_digis);
74  for (const auto&& rpcdgIt : (*TwinMux_digis)) {
75  // The layerId
76  const RPCDetId& rpcId = rpcdgIt.first;
77  // Get the iterators over the digis associated with this LayerId
78  const RPCDigiCollection::Range& range = rpcdgIt.second;
79  rpc_digi_collection->put(range, rpcId);
80  }
81  }
82  // loop over CPPF digis
83  // protection against empty InputTag to allow for Data/MC compatibility
84  if (not cppf_token_.isUninitialized()) {
85  Handle<RPCDigiCollection> CPPF_digis;
86  event.getByToken(cppf_token_, CPPF_digis);
87  for (const auto&& rpcdgIt : (*CPPF_digis)) {
88  // The layerId
89  const RPCDetId& rpcId = rpcdgIt.first;
90  // Get the iterators over the digis associated with this LayerId
91  const RPCDigiCollection::Range& range = rpcdgIt.second;
92  rpc_digi_collection->put(range, rpcId);
93  }
94  }
95  // loop over OMTF digis
96  // protection against empty InputTag to allow for Data/MC compatibility
97  if (not omtf_token_.isUninitialized()) {
98  Handle<RPCDigiCollection> OMTF_digis;
99  event.getByToken(omtf_token_, OMTF_digis);
100  for (const auto& rpcdgIt : (*OMTF_digis)) {
101  // The layerId
102  const RPCDetId& rpcId = rpcdgIt.first;
103  // Get the iterators over the digis associated with this LayerId
104  const RPCDigiCollection::Range& range = rpcdgIt.second;
105  // accepts only rings: RE-2_R3 ; RE-1_R3 ; RE+1_R3 ; RE+2_R3 ;
106  if (((rpcId.region() == -1 || rpcId.region() == 1) && (rpcId.ring() == 3) &&
107  (rpcId.station() == 1 || rpcId.station() == 2))) {
108  rpc_digi_collection->put(range, rpcId);
109  }
110  }
111  }
112  } else { //its MC
113  // SimRPCDigis collection
114  Handle<RPCDigiCollection> SimRPC_digis;
115  event.getByToken(simRPC_token_, SimRPC_digis);
116 
117  RPCDetId rpc_det_id;
118  std::vector<RPCDigi> local_rpc_digis;
119 
120  // loop over SimRPC digis
121  for (const auto& rpc_digi : (*SimRPC_digis)) {
122  // The layerId
123  const RPCDetId& rpcId = rpc_digi.first;
124  // Get the iterators over the digis associated with this LayerId
125  const RPCDigiCollection::Range& range = rpc_digi.second;
126 
127  if (rpcId != rpc_det_id) {
128  if (!local_rpc_digis.empty()) {
129  rpc_digi_collection->put(RPCDigiCollection::Range(local_rpc_digis.begin(), local_rpc_digis.end()),
130  rpc_det_id);
131  local_rpc_digis.clear();
132  }
133  rpc_det_id = rpcId;
134  }
135  for (std::vector<RPCDigi>::const_iterator id = range.first; id != range.second; id++) {
136  const RPCDigi& dit = (*id);
137  //Barrel
138  if (rpcId.region() == 0) {
139  //TwinMux
140  if (dit.bx() >= bx_minTwinMux_ && dit.bx() <= bx_maxTwinMux_) {
141  local_rpc_digis.push_back(dit);
142  }
143  }
144  //EndCap
145  if (rpcId.region() == -1 || rpcId.region() == 1) {
146  //OMTF
147  if (rpcId.ring() == 3 && (rpcId.station() == 1 || rpcId.station() == 2) && dit.bx() >= bx_minOMTF_ &&
148  dit.bx() <= bx_maxOMTF_) {
149  local_rpc_digis.push_back(dit);
150  }
151  //CPPF
152  if (((rpcId.ring() == 2) || (rpcId.ring() == 3 && (rpcId.station() == 3 || rpcId.station() == 4))) &&
153  (dit.bx() >= bx_minCPPF_ && dit.bx() <= bx_maxCPPF_)) {
154  local_rpc_digis.push_back(dit);
155  }
156  }
157  }
158  }
159  if (!local_rpc_digis.empty()) {
160  rpc_digi_collection->put(RPCDigiCollection::Range(local_rpc_digis.begin(), local_rpc_digis.end()), rpc_det_id);
161  }
162  }
163  // "put" into the event
164  event.put(std::move(rpc_digi_collection));
165 }
166 
RPCDigiMerger(edm::ParameterSet const &config)
int bx() const
Definition: RPCDigi.h:28
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
constexpr bool isUninitialized() const noexcept
Definition: EDGetToken.h:99
~RPCDigiMerger() override
const uint16_t range(const Frame &aFrame)
void beginRun(edm::Run const &run, edm::EventSetup const &setup) override
int ring() const
Definition: RPCDetId.h:59
MuonDigiCollection< RPCDetId, RPCDigi > RPCDigiCollection
static void fillDescriptions(edm::ConfigurationDescriptions &descs)
def move
Definition: eostools.py:511
ParameterDescriptionBase * add(U const &iLabel, T const &value)
std::pair< const_iterator, const_iterator > Range
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
void add(std::string const &label, ParameterSetDescription const &psetDescription)
std::string const & label() const
Definition: InputTag.h:36
tuple config
parse the configuration file
edm::EDGetTokenT< RPCDigiCollection > omtf_token_
Definition: RPCDigiMerger.h:36
edm::EDGetTokenT< RPCDigiCollection > twinMux_token_
Definition: RPCDigiMerger.h:35
edm::EDGetTokenT< RPCDigiCollection > simRPC_token_
Definition: RPCDigiMerger.h:38
void produce(edm::Event &event, edm::EventSetup const &setup) override
edm::EDGetTokenT< RPCDigiCollection > cppf_token_
Definition: RPCDigiMerger.h:37
Definition: Run.h:45
int region() const
Region id: 0 for Barrel, +/-1 For +/- Endcap.
Definition: RPCDetId.h:53
int station() const
Definition: RPCDetId.h:78