CMS 3D CMS Logo

List of all members | Public Member Functions
EMTFSubsystemCollector Class Reference

#include <EMTFSubsystemCollector.h>

Public Member Functions

void cluster_gem (const TriggerPrimitiveCollection &muon_primitives, TriggerPrimitiveCollection &clus_muon_primitives) const
 
void cluster_rpc (const TriggerPrimitiveCollection &muon_primitives, TriggerPrimitiveCollection &clus_muon_primitives) const
 
template<>
void extractPrimitives (CSCTag tag, const edm::Event &iEvent, const edm::EDGetToken &token, TriggerPrimitiveCollection &out) const
 
template<typename T >
void extractPrimitives (T tag, const edm::Event &iEvent, const edm::EDGetToken &token, TriggerPrimitiveCollection &out) const
 
template<>
void extractPrimitives (RPCTag tag, const edm::Event &iEvent, const edm::EDGetToken &token, TriggerPrimitiveCollection &out) const
 
template<>
void extractPrimitives (emtf::CPPFTag tag, const edm::Event &iEvent, const edm::EDGetToken &token, TriggerPrimitiveCollection &out) const
 
template<>
void extractPrimitives (GEMTag tag, const edm::Event &iEvent, const edm::EDGetToken &token, TriggerPrimitiveCollection &out) const
 
void make_copad_gem (const TriggerPrimitiveCollection &muon_primitives, TriggerPrimitiveCollection &copad_muon_primitives) const
 

Detailed Description

Definition at line 13 of file EMTFSubsystemCollector.h.

Member Function Documentation

void EMTFSubsystemCollector::cluster_gem ( const TriggerPrimitiveCollection muon_primitives,
TriggerPrimitiveCollection clus_muon_primitives 
) const

Definition at line 279 of file EMTFSubsystemCollector.cc.

References fileCollector::cmp, L1TMuon::TriggerPrimitive::kGEM, tier0::unique(), and x.

Referenced by extractPrimitives().

280  {
281  // Define operator to select GEM digis
282  struct {
284  bool operator()(const value_type& x) const { return (x.subsystem() == TriggerPrimitive::kGEM); }
285  } gem_digi_select;
286 
287  // Define operator to sort the GEM digis prior to clustering.
288  // Use rawId, bx and pad as the sorting id. GEM rawId fully specifies
289  // endcap, station, ring, layer, roll, chamber. Pad is used as
290  // the least significant sorting id.
291  struct {
293  bool operator()(const value_type& lhs, const value_type& rhs) const {
294  bool cmp = (std::make_pair(std::make_pair(lhs.rawId(), lhs.getGEMData().bx), lhs.getGEMData().pad) <
295  std::make_pair(std::make_pair(rhs.rawId(), rhs.getGEMData().bx), rhs.getGEMData().pad));
296  return cmp;
297  }
298  } gem_digi_less;
299 
300  struct {
302  bool operator()(const value_type& lhs, const value_type& rhs) const {
303  bool cmp = (std::make_pair(std::make_pair(lhs.rawId(), lhs.getGEMData().bx), lhs.getGEMData().pad) ==
304  std::make_pair(std::make_pair(rhs.rawId(), rhs.getGEMData().bx), rhs.getGEMData().pad));
305  return cmp;
306  }
307  } gem_digi_equal;
308 
309  // Define operators for the nearest-neighbor clustering algorithm.
310  // If two digis are next to each other (check pad_hi on the 'left', and
311  // pad_low on the 'right'), cluster them (increment pad_hi on the 'left')
312  struct {
314  bool operator()(const value_type& lhs, const value_type& rhs) const {
315  bool cmp = ((lhs.rawId() == rhs.rawId()) && (lhs.getGEMData().bx == rhs.getGEMData().bx) &&
316  (lhs.getGEMData().pad_hi + 1 == rhs.getGEMData().pad_low));
317  return cmp;
318  }
319  } gem_digi_adjacent;
320 
321  struct {
323  void operator()(value_type& lhs, value_type& rhs) { // pass by reference
324  lhs.accessGEMData().pad_hi += 1;
325  }
326  } gem_digi_cluster;
327 
328  // ___________________________________________________________________________
329  // Do clustering using C++ <algorithm> functions
330 
331  // 1. Select GEM digis
332  std::copy_if(
333  muon_primitives.begin(), muon_primitives.end(), std::back_inserter(clus_muon_primitives), gem_digi_select);
334 
335  // 2. Sort
336  std::stable_sort(clus_muon_primitives.begin(), clus_muon_primitives.end(), gem_digi_less);
337 
338  // 3. Remove duplicates
339  clus_muon_primitives.erase(std::unique(clus_muon_primitives.begin(), clus_muon_primitives.end(), gem_digi_equal),
340  clus_muon_primitives.end());
341 
342  // 4. Cluster adjacent digis
343  clus_muon_primitives.erase(
344  adjacent_cluster(clus_muon_primitives.begin(), clus_muon_primitives.end(), gem_digi_adjacent, gem_digi_cluster),
345  clus_muon_primitives.end());
346 }
def unique(seq, keepstr=True)
Definition: tier0.py:24
void EMTFSubsystemCollector::cluster_rpc ( const TriggerPrimitiveCollection muon_primitives,
TriggerPrimitiveCollection clus_muon_primitives 
) const

Definition at line 122 of file EMTFSubsystemCollector.cc.

References fileCollector::cmp, L1TMuon::TriggerPrimitive::kRPC, tier0::unique(), and x.

Referenced by extractPrimitives().

123  {
124  // Define operator to select RPC digis
125  struct {
127  bool operator()(const value_type& x) const { return (x.subsystem() == TriggerPrimitive::kRPC); }
128  } rpc_digi_select;
129 
130  // Define operator to sort the RPC digis prior to clustering.
131  // Use rawId, bx and strip as the sorting id. RPC rawId fully specifies
132  // sector, subsector, endcap, station, ring, layer, roll. Strip is used as
133  // the least significant sorting id.
134  struct {
136  bool operator()(const value_type& lhs, const value_type& rhs) const {
137  bool cmp = (std::make_pair(std::make_pair(lhs.rawId(), lhs.getRPCData().bx), lhs.getRPCData().strip) <
138  std::make_pair(std::make_pair(rhs.rawId(), rhs.getRPCData().bx), rhs.getRPCData().strip));
139  return cmp;
140  }
141  } rpc_digi_less;
142 
143  struct {
145  bool operator()(const value_type& lhs, const value_type& rhs) const {
146  bool cmp = (std::make_pair(std::make_pair(lhs.rawId(), lhs.getRPCData().bx), lhs.getRPCData().strip) ==
147  std::make_pair(std::make_pair(rhs.rawId(), rhs.getRPCData().bx), rhs.getRPCData().strip));
148  return cmp;
149  }
150  } rpc_digi_equal;
151 
152  // Define operators for the nearest-neighbor clustering algorithm.
153  // If two digis are next to each other (check strip_hi on the 'left', and
154  // strip_low on the 'right'), cluster them (increment strip_hi on the 'left')
155  struct {
157  bool operator()(const value_type& lhs, const value_type& rhs) const {
158  bool cmp = ((lhs.rawId() == rhs.rawId()) && (lhs.getRPCData().bx == rhs.getRPCData().bx) &&
159  (lhs.getRPCData().strip_hi + 1 == rhs.getRPCData().strip_low));
160  return cmp;
161  }
162  } rpc_digi_adjacent;
163 
164  struct {
166  void operator()(value_type& lhs, value_type& rhs) { // pass by reference
167  lhs.accessRPCData().strip_hi += 1;
168  }
169  } rpc_digi_cluster;
170 
171  // ___________________________________________________________________________
172  // Do clustering using C++ <algorithm> functions
173 
174  // 1. Select RPC digis
175  std::copy_if(
176  muon_primitives.begin(), muon_primitives.end(), std::back_inserter(clus_muon_primitives), rpc_digi_select);
177 
178  // 2. Sort
179  std::stable_sort(clus_muon_primitives.begin(), clus_muon_primitives.end(), rpc_digi_less);
180 
181  // 3. Remove duplicates
182  clus_muon_primitives.erase(std::unique(clus_muon_primitives.begin(), clus_muon_primitives.end(), rpc_digi_equal),
183  clus_muon_primitives.end());
184 
185  // 4. Cluster adjacent digis
186  clus_muon_primitives.erase(
187  adjacent_cluster(clus_muon_primitives.begin(), clus_muon_primitives.end(), rpc_digi_adjacent, rpc_digi_cluster),
188  clus_muon_primitives.end());
189 }
def unique(seq, keepstr=True)
Definition: tier0.py:24
template<>
void EMTFSubsystemCollector::extractPrimitives ( CSCTag  tag,
const edm::Event iEvent,
const edm::EDGetToken token,
TriggerPrimitiveCollection out 
) const

Definition at line 10 of file EMTFSubsystemCollector.cc.

References relativeConstraints::chamber, and edm::Event::getByToken().

14  {
16  iEvent.getByToken(token, cscDigis);
17 
18  auto chamber = cscDigis->begin();
19  auto chend = cscDigis->end();
20  for (; chamber != chend; ++chamber) {
21  auto digi = (*chamber).second.first;
22  auto dend = (*chamber).second.second;
23  for (; digi != dend; ++digi) {
24  // emplace_back does the same thing as push_back: appends to the end of the vector
25  out.emplace_back((*chamber).first, *digi);
26  }
27  }
28  return;
29 }
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:525
template<typename T >
void EMTFSubsystemCollector::extractPrimitives ( T  tag,
const edm::Event iEvent,
const edm::EDGetToken token,
TriggerPrimitiveCollection out 
) const

Referenced by TrackFinder::process().

template<>
void EMTFSubsystemCollector::extractPrimitives ( RPCTag  tag,
const edm::Event iEvent,
const edm::EDGetToken token,
TriggerPrimitiveCollection out 
) const

Definition at line 33 of file EMTFSubsystemCollector.cc.

References relativeConstraints::chamber, cluster_rpc(), filterCSVwithJSON::copy, and edm::Event::getByToken().

36  {
38  iEvent.getByToken(token, rpcDigis);
39 
40  TriggerPrimitiveCollection muon_primitives;
41 
42  auto chamber = rpcDigis->begin();
43  auto chend = rpcDigis->end();
44  for (; chamber != chend; ++chamber) {
45  auto digi = (*chamber).second.first;
46  auto dend = (*chamber).second.second;
47  for (; digi != dend; ++digi) {
48  if ((*chamber).first.region() != 0) { // 0 is barrel
49  if ((*chamber).first.station() <= 2 && (*chamber).first.ring() == 3)
50  continue; // do not include RE1/3, RE2/3
51  if ((*chamber).first.station() >= 3 && (*chamber).first.ring() == 1)
52  continue; // do not include RE3/1, RE4/1
53 
54  muon_primitives.emplace_back((*chamber).first, *digi);
55  }
56  }
57  }
58 
59  // Cluster the RPC digis
60  TriggerPrimitiveCollection clus_muon_primitives;
61  cluster_rpc(muon_primitives, clus_muon_primitives);
62 
63  // Output
64  std::copy(clus_muon_primitives.begin(), clus_muon_primitives.end(), std::back_inserter(out));
65  return;
66 }
void cluster_rpc(const TriggerPrimitiveCollection &muon_primitives, TriggerPrimitiveCollection &clus_muon_primitives) const
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:525
L1TMuon::TriggerPrimitiveCollection TriggerPrimitiveCollection
Definition: Common.h:34
template<>
void EMTFSubsystemCollector::extractPrimitives ( emtf::CPPFTag  tag,
const edm::Event iEvent,
const edm::EDGetToken token,
TriggerPrimitiveCollection out 
) const

Definition at line 70 of file EMTFSubsystemCollector.cc.

References edm::Event::getByToken().

74  {
76  iEvent.getByToken(token, cppfDigis);
77 
78  // Output
79  for (auto digi : *cppfDigis) {
80  out.emplace_back(digi.rpcId(), digi);
81  }
82 
83  return;
84 }
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:525
template<>
void EMTFSubsystemCollector::extractPrimitives ( GEMTag  tag,
const edm::Event iEvent,
const edm::EDGetToken token,
TriggerPrimitiveCollection out 
) const

Definition at line 88 of file EMTFSubsystemCollector.cc.

References relativeConstraints::chamber, cluster_gem(), filterCSVwithJSON::copy, edm::Event::getByToken(), and make_copad_gem().

92  {
94  iEvent.getByToken(token, gemDigis);
95 
96  TriggerPrimitiveCollection muon_primitives;
97 
98  auto chamber = gemDigis->begin();
99  auto chend = gemDigis->end();
100  for (; chamber != chend; ++chamber) {
101  auto digi = (*chamber).second.first;
102  auto dend = (*chamber).second.second;
103  for (; digi != dend; ++digi) {
104  muon_primitives.emplace_back((*chamber).first, *digi);
105  }
106  }
107 
108  // Cluster the GEM digis.
109  TriggerPrimitiveCollection copad_muon_primitives;
110  make_copad_gem(muon_primitives, copad_muon_primitives);
111 
112  TriggerPrimitiveCollection clus_muon_primitives;
113  cluster_gem(copad_muon_primitives, clus_muon_primitives);
114 
115  // Output
116  std::copy(clus_muon_primitives.begin(), clus_muon_primitives.end(), std::back_inserter(out));
117  return;
118 }
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:525
void make_copad_gem(const TriggerPrimitiveCollection &muon_primitives, TriggerPrimitiveCollection &copad_muon_primitives) const
L1TMuon::TriggerPrimitiveCollection TriggerPrimitiveCollection
Definition: Common.h:34
void cluster_gem(const TriggerPrimitiveCollection &muon_primitives, TriggerPrimitiveCollection &clus_muon_primitives) const
void EMTFSubsystemCollector::make_copad_gem ( const TriggerPrimitiveCollection muon_primitives,
TriggerPrimitiveCollection copad_muon_primitives 
) const

Definition at line 193 of file EMTFSubsystemCollector.cc.

References funct::abs(), L1TMuon::TriggerPrimitive::GEMData::bx, relativeConstraints::chamber, L1TMuon::TriggerPrimitive::detId(), newFWLiteAna::found, L1TMuon::TriggerPrimitive::getGEMData(), L1TMuon::TriggerPrimitive::kGEM, GEMDetId::layer(), cscTriggerPrimitiveDigis_cfi::maxDeltaBX, AlCaHLTBitMon_ParallelJobs::p, L1TMuon::TriggerPrimitive::GEMData::pad, DetId::rawId(), HLT_2018_cff::region, relativeConstraints::ring, relativeConstraints::station, and L1TMuon::TriggerPrimitive::subsystem().

Referenced by extractPrimitives().

194  {
195  // Use the inner layer (layer 1) hit coordinates as output, and the outer
196  // layer (layer 2) as coincidence
197  // Copied from: L1Trigger/CSCTriggerPrimitives/src/GEMCoPadProcessor.cc
198 
199  const unsigned int maxDeltaBX = 1;
200  const unsigned int maxDeltaPadGE11 = 2;
201  const unsigned int maxDeltaPadGE21 = 2;
202 
203  std::map<int, TriggerPrimitiveCollection> in_pads_layer1, in_pads_layer2;
204 
205  TriggerPrimitiveCollection::const_iterator tp_it = muon_primitives.begin();
206  TriggerPrimitiveCollection::const_iterator tp_end = muon_primitives.end();
207 
208  for (; tp_it != tp_end; ++tp_it) {
209  const TriggerPrimitive& muon_primitive = *tp_it;
210 
211  // Split by layer
212  if (muon_primitive.subsystem() == TriggerPrimitive::kGEM) {
213  const GEMDetId& tp_detId = muon_primitive.detId<GEMDetId>();
214  assert(tp_detId.layer() == 1 || tp_detId.layer() == 2);
215  if (tp_detId.layer() == 1) {
216  in_pads_layer1[tp_detId.rawId()].push_back(muon_primitive);
217  } else {
218  in_pads_layer2[tp_detId.rawId()].push_back(muon_primitive);
219  }
220 
221  // Modified copad logic
222  bool modified_copad_logic = false;
223  if (modified_copad_logic) {
224  if (tp_detId.layer() == 1) {
225  auto id = tp_detId;
226  const GEMDetId co_detId(id.region(), id.ring(), id.station(), 2, id.chamber(), id.roll());
227  const GEMPadDigi co_digi(muon_primitive.getGEMData().pad, muon_primitive.getGEMData().bx);
228  const TriggerPrimitive co_muon_primitive(co_detId, co_digi);
229  in_pads_layer2[co_detId.rawId()].push_back(co_muon_primitive);
230  } else {
231  auto id = tp_detId;
232  const GEMDetId co_detId(id.region(), id.ring(), id.station(), 1, id.chamber(), id.roll());
233  const GEMPadDigi co_digi(muon_primitive.getGEMData().pad, muon_primitive.getGEMData().bx);
234  const TriggerPrimitive co_muon_primitive(co_detId, co_digi);
235  in_pads_layer1[co_detId.rawId()].push_back(co_muon_primitive);
236  }
237  }
238  }
239  }
240 
241  std::map<int, TriggerPrimitiveCollection>::iterator map_tp_it = in_pads_layer1.begin();
242  std::map<int, TriggerPrimitiveCollection>::iterator map_tp_end = in_pads_layer1.end();
243 
244  for (; map_tp_it != map_tp_end; ++map_tp_it) {
245  const GEMDetId& id = map_tp_it->first;
246  const TriggerPrimitiveCollection& pads = map_tp_it->second;
247  assert(id.layer() == 1);
248 
249  // find the corresponding id with layer=2 and same roll number
250  const GEMDetId co_id(id.region(), id.ring(), id.station(), 2, id.chamber(), id.roll());
251 
252  // empty range = no possible coincidence pads
253  auto found = in_pads_layer2.find(co_id);
254  if (found == in_pads_layer2.end())
255  continue;
256 
257  // now let's correlate the pads in two layers of this partition
258  const TriggerPrimitiveCollection& co_pads = found->second;
259  for (TriggerPrimitiveCollection::const_iterator p = pads.begin(); p != pads.end(); ++p) {
260  for (TriggerPrimitiveCollection::const_iterator co_p = co_pads.begin(); co_p != co_pads.end(); ++co_p) {
261  unsigned int deltaPad = std::abs(p->getGEMData().pad - co_p->getGEMData().pad);
262  unsigned int deltaBX = std::abs(p->getGEMData().bx - co_p->getGEMData().bx);
263 
264  // check the match in pad
265  if ((id.station() == 1 && deltaPad > maxDeltaPadGE11) || (id.station() == 2 && deltaPad > maxDeltaPadGE21))
266  continue;
267 
268  // check the match in BX
269  if (deltaBX > maxDeltaBX)
270  continue;
271 
272  // make a new coincidence pad digi
273  copad_muon_primitives.push_back(*p);
274  }
275  }
276  }
277 }
const subsystem_type subsystem() const
const GEMData getGEMData() const
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
int layer() const
Definition: GEMDetId.h:184
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
L1TMuon::TriggerPrimitiveCollection TriggerPrimitiveCollection
Definition: Common.h:34