CMS 3D CMS Logo

List of all members | Public Types | Public Member Functions | Private Member Functions | Private Attributes
GEMClusterProcessor Class Reference

#include <GEMClusterProcessor.h>

Public Types

enum  ClusterTypes { AllClusters = 1, SingleClusters = 2, CoincidenceClusters = 3 }
 

Public Member Functions

void clear ()
 
 GEMClusterProcessor (int region, unsigned station, unsigned chamber, const edm::ParameterSet &conf)
 
std::vector< GEMInternalClustergetClusters (int bx, int deltaBX=0, ClusterTypes option=AllClusters) const
 
std::vector< GEMInternalClustergetCoincidenceClusters (int bx) const
 
bool hasGE21Geometry16Partitions () const
 
std::vector< GEMCoPadDigireadoutCoPads () const
 
void run (const GEMPadDigiClusterCollection *)
 
void setESLookupTables (const CSCL1TPLookupTableME11ILT *conf)
 
void setESLookupTables (const CSCL1TPLookupTableME21ILT *conf)
 

Private Member Functions

void addCoincidenceClusters (const GEMPadDigiClusterCollection *)
 
void addSingleClusters (const GEMPadDigiClusterCollection *)
 
void doCoordinateConversion ()
 

Private Attributes

const int chamber_
 
std::vector< GEMInternalClusterclusters_
 
bool hasGE21Geometry16Partitions_
 
bool isEven_
 
const CSCL1TPLookupTableME11ILTlookupTableME11ILT_
 
const CSCL1TPLookupTableME21ILTlookupTableME21ILT_
 
unsigned int maxDeltaBX_
 
unsigned int maxDeltaPad_
 
unsigned int maxDeltaRoll_
 
const int region_
 
const int station_
 

Detailed Description

Author
Sven Dildick (Rice University)

Definition at line 19 of file GEMClusterProcessor.h.

Member Enumeration Documentation

◆ ClusterTypes

Constructor & Destructor Documentation

◆ GEMClusterProcessor()

GEMClusterProcessor::GEMClusterProcessor ( int  region,
unsigned  station,
unsigned  chamber,
const edm::ParameterSet conf 
)

Normal constructor.

Definition at line 7 of file GEMClusterProcessor.cc.

References chamber_, edm::ParameterSet::getParameter(), hasGE21Geometry16Partitions_, isEven_, maxDeltaBX_, maxDeltaPad_, maxDeltaRoll_, or, and station_.

9  isEven_ = chamber_ % 2 == 0;
10 
11  // These LogErrors are sanity checks and should not be printed
12  if (station_ == 3 or station_ == 4) {
13  edm::LogError("GEMClusterProcessor") << "Class constructed for a chamber in ME3 or ME4!";
14  };
15 
16  if (station_ == 1) {
17  const edm::ParameterSet copad(conf.getParameter<edm::ParameterSet>("copadParamGE11"));
18  maxDeltaPad_ = copad.getParameter<unsigned int>("maxDeltaPad");
19  maxDeltaRoll_ = copad.getParameter<unsigned int>("maxDeltaRoll");
20  maxDeltaBX_ = copad.getParameter<unsigned int>("maxDeltaBX");
21  }
22 
23  if (station_ == 2) {
24  // by default set to true
26 
27  const edm::ParameterSet copad(conf.getParameter<edm::ParameterSet>("copadParamGE21"));
28  maxDeltaPad_ = copad.getParameter<unsigned int>("maxDeltaPad");
29  maxDeltaRoll_ = copad.getParameter<unsigned int>("maxDeltaRoll");
30  maxDeltaBX_ = copad.getParameter<unsigned int>("maxDeltaBX");
31  }
32 }
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
Log< level::Error, false > LogError
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
Definition: Activities.doc:12

Member Function Documentation

◆ addCoincidenceClusters()

void GEMClusterProcessor::addCoincidenceClusters ( const GEMPadDigiClusterCollection in_clusters)
private

Definition at line 92 of file GEMClusterProcessor.cc.

References funct::abs(), relativeConstraints::chamber, chamber_, clusters_, GEMPadDigiCluster::GE21, hasGE21Geometry16Partitions_, GeomDetEnumerators::isME0(), phase1PixelTopology::layer, match(), maxDeltaBX_, maxDeltaPad_, maxDeltaRoll_, or, AlCaHLTBitMon_ParallelJobs::p, HLT_2022v12_cff::region, region_, relativeConstraints::ring, relativeConstraints::station, and station_.

Referenced by run().

92  {
93  // Build coincidences
94  for (auto det_range = in_clusters->begin(); det_range != in_clusters->end(); ++det_range) {
95  const GEMDetId& id = (*det_range).first;
96 
97  // coincidence pads are not built for ME0
98  if (id.isME0())
99  continue;
100 
101  // same chamber (no restriction on the roll number)
102  if (id.region() != region_ or id.station() != station_ or id.chamber() != chamber_)
103  continue;
104 
105  // all coincidences detIDs will have layer=1
106  if (id.layer() != 1)
107  continue;
108 
109  // find all corresponding ids with layer 2 and same roll that differs at most maxDeltaRoll_
110  for (unsigned int roll = id.roll() - maxDeltaRoll_; roll <= id.roll() + maxDeltaRoll_; ++roll) {
111  GEMDetId co_id(id.region(), id.ring(), id.station(), 2, id.chamber(), roll);
112 
113  auto co_clusters_range = in_clusters->get(co_id);
114 
115  // empty range = no possible coincidence pads
116  if (co_clusters_range.first == co_clusters_range.second)
117  continue;
118 
119  // now let's correlate the pads in two layers of this partition
120  const auto& pads_range = (*det_range).second;
121  for (auto p = pads_range.first; p != pads_range.second; ++p) {
122  // ignore 8-partition GE2/1 pads
123  if (id.isGE21() and p->nPartitions() == GEMPadDigiCluster::GE21) {
125  continue;
126  }
127 
128  // only consider valid pads
129  if (!p->isValid())
130  continue;
131 
132  for (auto co_p = co_clusters_range.first; co_p != co_clusters_range.second; ++co_p) {
133  // only consider valid clusters
134  if (!co_p->isValid())
135  continue;
136 
137  // check the match in BX
138  if ((unsigned)std::abs(p->bx() - co_p->bx()) > maxDeltaBX_)
139  continue;
140 
141  // get the corrected minimum and maximum of cluster 1
142  int cl1_min = p->pads().front() - maxDeltaPad_;
143  int cl1_max = p->pads().back() + maxDeltaPad_;
144 
145  // get the minimum and maximum of cluster 2
146  int cl2_min = co_p->pads().front();
147  int cl2_max = co_p->pads().back();
148 
149  // match condition
150  const bool condition1(cl1_min <= cl2_min and cl1_max >= cl2_min);
151  const bool condition2(cl1_min <= cl2_max and cl1_max >= cl2_max);
152  const bool match(condition1 or condition2);
153 
154  if (!match)
155  continue;
156 
157  // make a new coincidence
158  clusters_.emplace_back(id, *p, *co_p);
159  }
160  }
161  }
162  }
163 }
std::vector< GEMInternalCluster > clusters_
bool isME0(GeomDetEnumerators::SubDetector m)
constexpr std::array< uint8_t, layerIndexSize > layer
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
Definition: Activities.doc:12
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
Definition: Utils.h:10

◆ addSingleClusters()

void GEMClusterProcessor::addSingleClusters ( const GEMPadDigiClusterCollection in_clusters)
private

Definition at line 165 of file GEMClusterProcessor.cc.

References chamber_, clusters_, mps_fire::end, GEMPadDigiCluster::GE21, hasGE21Geometry16Partitions_, GeomDetEnumerators::isME0(), phase1PixelTopology::layer, or, AlCaHLTBitMon_ParallelJobs::p, submitPVResolutionJobs::q, HLT_2022v12_cff::region, region_, and station_.

Referenced by run().

165  {
166  // first get the coincidences
167  const std::vector<GEMInternalCluster>& coincidences = clusters_;
168 
169  // now start add single clusters
170  for (auto det_range = in_clusters->begin(); det_range != in_clusters->end(); ++det_range) {
171  const GEMDetId& id = (*det_range).first;
172 
173  // ignore ME0
174  if (id.isME0())
175  continue;
176 
177  // same chamber (no restriction on the roll number)
178  if (id.region() != region_ or id.station() != station_ or id.chamber() != chamber_)
179  continue;
180 
181  const auto& clusters_range = (*det_range).second;
182  for (auto p = clusters_range.first; p != clusters_range.second; ++p) {
183  // only consider valid clusters
184  if (!p->isValid())
185  continue;
186 
187  // ignore 8-partition GE2/1 pads
188  if (id.isGE21() and p->nPartitions() == GEMPadDigiCluster::GE21) {
190  continue;
191  }
192 
193  // ignore clusters already contained in a coincidence cluster
194  if (std::find_if(std::begin(coincidences), std::end(coincidences), [p](const GEMInternalCluster& q) {
195  return q.has_cluster(*p);
196  }) != std::end(coincidences))
197  continue;
198 
199  // put the single clusters into the collection
200  if (id.layer() == 1)
201  clusters_.emplace_back(id, *p, GEMPadDigiCluster());
202  else
203  clusters_.emplace_back(id, GEMPadDigiCluster(), *p);
204  }
205  }
206 }
std::vector< GEMInternalCluster > clusters_
bool isME0(GeomDetEnumerators::SubDetector m)
constexpr std::array< uint8_t, layerIndexSize > layer
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
Definition: Activities.doc:12

◆ clear()

void GEMClusterProcessor::clear ( void  )

Clear copad vector

Definition at line 34 of file GEMClusterProcessor.cc.

References clusters_.

Referenced by run().

34 { clusters_.clear(); }
std::vector< GEMInternalCluster > clusters_

◆ doCoordinateConversion()

void GEMClusterProcessor::doCoordinateConversion ( )
private

Definition at line 208 of file GEMClusterProcessor.cc.

References clusters_, CSCL1TPLookupTableME11ILT::GEM_pad_CSC_es_ME1a_even(), CSCL1TPLookupTableME11ILT::GEM_pad_CSC_es_ME1a_odd(), CSCL1TPLookupTableME11ILT::GEM_pad_CSC_es_ME1b_even(), CSCL1TPLookupTableME11ILT::GEM_pad_CSC_es_ME1b_odd(), CSCL1TPLookupTableME21ILT::GEM_pad_CSC_es_ME21_even(), CSCL1TPLookupTableME21ILT::GEM_pad_CSC_es_ME21_odd(), CSCL1TPLookupTableME11ILT::GEM_pad_CSC_hs_ME1a_even(), CSCL1TPLookupTableME11ILT::GEM_pad_CSC_hs_ME1a_odd(), CSCL1TPLookupTableME11ILT::GEM_pad_CSC_hs_ME1b_even(), CSCL1TPLookupTableME11ILT::GEM_pad_CSC_hs_ME1b_odd(), CSCL1TPLookupTableME21ILT::GEM_pad_CSC_hs_ME21_even(), CSCL1TPLookupTableME21ILT::GEM_pad_CSC_hs_ME21_odd(), CSCL1TPLookupTableME11ILT::GEM_roll_L1_CSC_max_wg_ME11_even(), CSCL1TPLookupTableME11ILT::GEM_roll_L1_CSC_max_wg_ME11_odd(), CSCL1TPLookupTableME21ILT::GEM_roll_L1_CSC_max_wg_ME21_even(), CSCL1TPLookupTableME21ILT::GEM_roll_L1_CSC_max_wg_ME21_odd(), CSCL1TPLookupTableME11ILT::GEM_roll_L1_CSC_min_wg_ME11_even(), CSCL1TPLookupTableME11ILT::GEM_roll_L1_CSC_min_wg_ME11_odd(), CSCL1TPLookupTableME21ILT::GEM_roll_L1_CSC_min_wg_ME21_even(), CSCL1TPLookupTableME21ILT::GEM_roll_L1_CSC_min_wg_ME21_odd(), CSCL1TPLookupTableME11ILT::GEM_roll_L2_CSC_max_wg_ME11_even(), CSCL1TPLookupTableME11ILT::GEM_roll_L2_CSC_max_wg_ME11_odd(), CSCL1TPLookupTableME21ILT::GEM_roll_L2_CSC_max_wg_ME21_even(), CSCL1TPLookupTableME21ILT::GEM_roll_L2_CSC_max_wg_ME21_odd(), CSCL1TPLookupTableME11ILT::GEM_roll_L2_CSC_min_wg_ME11_even(), CSCL1TPLookupTableME11ILT::GEM_roll_L2_CSC_min_wg_ME11_odd(), CSCL1TPLookupTableME21ILT::GEM_roll_L2_CSC_min_wg_ME21_even(), CSCL1TPLookupTableME21ILT::GEM_roll_L2_CSC_min_wg_ME21_odd(), isEven_, lookupTableME11ILT_, lookupTableME21ILT_, and station_.

Referenced by run().

208  {
209  // loop on clusters
210  for (auto& cluster : clusters_) {
211  if (cluster.cl1().isValid()) {
212  // starting coordinates
213  const int layer1_first_pad = cluster.layer1_pad();
214  const int layer1_last_pad = layer1_first_pad + cluster.layer1_size() - 1;
215 
216  // calculate the 1/2-strip
217  int layer1_pad_to_first_hs = -1;
218  int layer1_pad_to_last_hs = -1;
219  int layer1_pad_to_first_hs_me1a = -1;
220  int layer1_pad_to_last_hs_me1a = -1;
221 
222  // ME1/1
223  if (station_ == 1) {
224  if (isEven_) {
225  // ME1/b
226  layer1_pad_to_first_hs = lookupTableME11ILT_->GEM_pad_CSC_hs_ME1b_even(layer1_first_pad);
227  layer1_pad_to_last_hs = lookupTableME11ILT_->GEM_pad_CSC_hs_ME1b_even(layer1_last_pad);
228  // ME1/a
229  layer1_pad_to_first_hs_me1a = lookupTableME11ILT_->GEM_pad_CSC_hs_ME1a_even(layer1_first_pad);
230  layer1_pad_to_last_hs_me1a = lookupTableME11ILT_->GEM_pad_CSC_hs_ME1a_even(layer1_last_pad);
231  } else {
232  // ME1/b
233  layer1_pad_to_first_hs = lookupTableME11ILT_->GEM_pad_CSC_hs_ME1b_odd(layer1_first_pad);
234  layer1_pad_to_last_hs = lookupTableME11ILT_->GEM_pad_CSC_hs_ME1b_odd(layer1_last_pad);
235  // ME1/a
236  layer1_pad_to_first_hs_me1a = lookupTableME11ILT_->GEM_pad_CSC_hs_ME1a_odd(layer1_first_pad);
237  layer1_pad_to_last_hs_me1a = lookupTableME11ILT_->GEM_pad_CSC_hs_ME1a_odd(layer1_last_pad);
238  }
239  }
240  // ME2/1
241  if (station_ == 2) {
242  if (isEven_) {
243  layer1_pad_to_first_hs = lookupTableME21ILT_->GEM_pad_CSC_hs_ME21_even(layer1_first_pad);
244  layer1_pad_to_last_hs = lookupTableME21ILT_->GEM_pad_CSC_hs_ME21_even(layer1_last_pad);
245  } else {
246  layer1_pad_to_first_hs = lookupTableME21ILT_->GEM_pad_CSC_hs_ME21_odd(layer1_first_pad);
247  layer1_pad_to_last_hs = lookupTableME21ILT_->GEM_pad_CSC_hs_ME21_odd(layer1_last_pad);
248  }
249  }
250  // middle 1/2-strip
251  int layer1_middle_hs = 0.5 * (layer1_pad_to_first_hs + layer1_pad_to_last_hs);
252  int layer1_middle_hs_me1a = 0.5 * (layer1_pad_to_first_hs_me1a + layer1_pad_to_last_hs_me1a);
253 
254  // set the values
255  cluster.set_layer1_first_hs(layer1_pad_to_first_hs);
256  cluster.set_layer1_last_hs(layer1_pad_to_last_hs);
257  cluster.set_layer1_middle_hs(layer1_middle_hs);
258 
259  if (station_ == 1) {
260  cluster.set_layer1_first_hs_me1a(layer1_pad_to_first_hs_me1a);
261  cluster.set_layer1_last_hs_me1a(layer1_pad_to_last_hs_me1a);
262  cluster.set_layer1_middle_hs_me1a(layer1_middle_hs_me1a);
263  }
264  // calculate the 1/8-strips
265  int layer1_pad_to_first_es = -1;
266  int layer1_pad_to_last_es = -1;
267 
268  int layer1_pad_to_first_es_me1a = -1;
269  int layer1_pad_to_last_es_me1a = -1;
270 
271  // ME1/1
272  if (station_ == 1) {
273  if (isEven_) {
274  // ME1/b
275  layer1_pad_to_first_es = lookupTableME11ILT_->GEM_pad_CSC_es_ME1b_even(layer1_first_pad);
276  layer1_pad_to_last_es = lookupTableME11ILT_->GEM_pad_CSC_es_ME1b_even(layer1_last_pad);
277  // ME1/a
278  layer1_pad_to_first_es_me1a = lookupTableME11ILT_->GEM_pad_CSC_es_ME1a_even(layer1_first_pad);
279  layer1_pad_to_last_es_me1a = lookupTableME11ILT_->GEM_pad_CSC_es_ME1a_even(layer1_last_pad);
280  } else {
281  // ME1/b
282  layer1_pad_to_first_es = lookupTableME11ILT_->GEM_pad_CSC_es_ME1b_odd(layer1_first_pad);
283  layer1_pad_to_last_es = lookupTableME11ILT_->GEM_pad_CSC_es_ME1b_odd(layer1_last_pad);
284  // ME1/a
285  layer1_pad_to_first_es_me1a = lookupTableME11ILT_->GEM_pad_CSC_es_ME1a_odd(layer1_first_pad);
286  layer1_pad_to_last_es_me1a = lookupTableME11ILT_->GEM_pad_CSC_es_ME1a_odd(layer1_last_pad);
287  }
288  }
289  // ME2/1
290  if (station_ == 2) {
291  if (isEven_) {
292  layer1_pad_to_first_es = lookupTableME21ILT_->GEM_pad_CSC_es_ME21_even(layer1_first_pad);
293  layer1_pad_to_last_es = lookupTableME21ILT_->GEM_pad_CSC_es_ME21_even(layer1_last_pad);
294  } else {
295  layer1_pad_to_first_es = lookupTableME21ILT_->GEM_pad_CSC_es_ME21_odd(layer1_first_pad);
296  layer1_pad_to_last_es = lookupTableME21ILT_->GEM_pad_CSC_es_ME21_odd(layer1_last_pad);
297  }
298  }
299  // middle 1/8-strip
300  int layer1_middle_es = 0.5 * (layer1_pad_to_first_es + layer1_pad_to_last_es);
301  int layer1_middle_es_me1a = 0.5 * (layer1_pad_to_first_es_me1a + layer1_pad_to_last_es_me1a);
302 
303  cluster.set_layer1_first_es(layer1_pad_to_first_es);
304  cluster.set_layer1_last_es(layer1_pad_to_last_es);
305  cluster.set_layer1_middle_es(layer1_middle_es);
306 
307  if (station_ == 1) {
308  cluster.set_layer1_first_es_me1a(layer1_pad_to_first_es_me1a);
309  cluster.set_layer1_last_es_me1a(layer1_pad_to_last_es_me1a);
310  cluster.set_layer1_middle_es_me1a(layer1_middle_es_me1a);
311  }
312 
313  // calculate the wiregroups
314  // need to subtract 1 to use the LUTs
315  const int roll = cluster.roll() - 1;
316 
317  int roll_l1_to_min_wg = -1;
318  int roll_l1_to_max_wg = -1;
319 
320  // ME1/1
321  if (station_ == 1) {
322  if (isEven_) {
323  roll_l1_to_min_wg = lookupTableME11ILT_->GEM_roll_L1_CSC_min_wg_ME11_even(roll);
324  roll_l1_to_max_wg = lookupTableME11ILT_->GEM_roll_L1_CSC_max_wg_ME11_even(roll);
325  } else {
326  roll_l1_to_min_wg = lookupTableME11ILT_->GEM_roll_L1_CSC_min_wg_ME11_odd(roll);
327  roll_l1_to_max_wg = lookupTableME11ILT_->GEM_roll_L1_CSC_max_wg_ME11_odd(roll);
328  }
329  }
330 
331  // ME2/1
332  if (station_ == 2) {
333  if (isEven_) {
334  roll_l1_to_min_wg = lookupTableME21ILT_->GEM_roll_L1_CSC_min_wg_ME21_even(roll);
335  roll_l1_to_max_wg = lookupTableME21ILT_->GEM_roll_L1_CSC_max_wg_ME21_even(roll);
336  } else {
337  roll_l1_to_min_wg = lookupTableME21ILT_->GEM_roll_L1_CSC_min_wg_ME21_odd(roll);
338  roll_l1_to_max_wg = lookupTableME21ILT_->GEM_roll_L1_CSC_max_wg_ME21_odd(roll);
339  }
340  }
341 
342  // set the values
343  cluster.set_layer1_min_wg(roll_l1_to_min_wg);
344  cluster.set_layer1_max_wg(roll_l1_to_max_wg);
345  }
346 
347  if (cluster.cl2().isValid()) {
348  // starting coordinates
349  const int layer2_first_pad = cluster.layer2_pad();
350  const int layer2_last_pad = layer2_first_pad + cluster.layer2_size() - 1;
351 
352  // calculate the 1/2-strip
353  int layer2_pad_to_first_hs = -1;
354  int layer2_pad_to_last_hs = -1;
355  int layer2_pad_to_first_hs_me1a = -1;
356  int layer2_pad_to_last_hs_me1a = -1;
357 
358  if (station_ == 1) {
359  if (isEven_) {
360  // ME1/b
361  layer2_pad_to_first_hs = lookupTableME11ILT_->GEM_pad_CSC_hs_ME1b_even(layer2_first_pad);
362  layer2_pad_to_last_hs = lookupTableME11ILT_->GEM_pad_CSC_hs_ME1b_even(layer2_last_pad);
363  // ME1/a
364  layer2_pad_to_first_hs_me1a = lookupTableME11ILT_->GEM_pad_CSC_hs_ME1a_even(layer2_first_pad);
365  layer2_pad_to_last_hs_me1a = lookupTableME11ILT_->GEM_pad_CSC_hs_ME1a_even(layer2_last_pad);
366  } else {
367  // ME1/b
368  layer2_pad_to_first_hs = lookupTableME11ILT_->GEM_pad_CSC_hs_ME1b_odd(layer2_first_pad);
369  layer2_pad_to_last_hs = lookupTableME11ILT_->GEM_pad_CSC_hs_ME1b_odd(layer2_last_pad);
370  // ME1/a
371  layer2_pad_to_first_hs_me1a = lookupTableME11ILT_->GEM_pad_CSC_hs_ME1a_odd(layer2_first_pad);
372  layer2_pad_to_last_hs_me1a = lookupTableME11ILT_->GEM_pad_CSC_hs_ME1a_odd(layer2_last_pad);
373  }
374  }
375  // ME2/1
376  if (station_ == 2) {
377  if (isEven_) {
378  layer2_pad_to_first_hs = lookupTableME21ILT_->GEM_pad_CSC_hs_ME21_even(layer2_first_pad);
379  layer2_pad_to_last_hs = lookupTableME21ILT_->GEM_pad_CSC_hs_ME21_even(layer2_last_pad);
380  } else {
381  layer2_pad_to_first_hs = lookupTableME21ILT_->GEM_pad_CSC_hs_ME21_odd(layer2_first_pad);
382  layer2_pad_to_last_hs = lookupTableME21ILT_->GEM_pad_CSC_hs_ME21_odd(layer2_last_pad);
383  }
384  }
385  // middle 1/2-strip
386  int layer2_middle_hs = 0.5 * (layer2_pad_to_first_hs + layer2_pad_to_last_hs);
387  int layer2_middle_hs_me1a = 0.5 * (layer2_pad_to_first_hs_me1a + layer2_pad_to_last_hs_me1a);
388 
389  // set the values
390  cluster.set_layer2_first_hs(layer2_pad_to_first_hs);
391  cluster.set_layer2_last_hs(layer2_pad_to_last_hs);
392  cluster.set_layer2_middle_hs(layer2_middle_hs);
393 
394  if (station_ == 1) {
395  cluster.set_layer2_first_hs_me1a(layer2_pad_to_first_hs_me1a);
396  cluster.set_layer2_last_hs_me1a(layer2_pad_to_last_hs_me1a);
397  cluster.set_layer2_middle_hs_me1a(layer2_middle_hs_me1a);
398  }
399  // calculate the 1/8-strips
400  int layer2_pad_to_first_es = -1;
401  int layer2_pad_to_last_es = -1;
402 
403  int layer2_pad_to_first_es_me1a = -1;
404  int layer2_pad_to_last_es_me1a = -1;
405 
406  if (station_ == 1) {
407  if (isEven_) {
408  // ME1/b
409  layer2_pad_to_first_es = lookupTableME11ILT_->GEM_pad_CSC_es_ME1b_even(layer2_first_pad);
410  layer2_pad_to_last_es = lookupTableME11ILT_->GEM_pad_CSC_es_ME1b_even(layer2_last_pad);
411  // ME1/a
412  layer2_pad_to_first_es_me1a = lookupTableME11ILT_->GEM_pad_CSC_es_ME1a_even(layer2_first_pad);
413  layer2_pad_to_last_es_me1a = lookupTableME11ILT_->GEM_pad_CSC_es_ME1a_even(layer2_last_pad);
414  } else {
415  // ME1/b
416  layer2_pad_to_first_es = lookupTableME11ILT_->GEM_pad_CSC_es_ME1b_odd(layer2_first_pad);
417  layer2_pad_to_last_es = lookupTableME11ILT_->GEM_pad_CSC_es_ME1b_odd(layer2_last_pad);
418  // ME1/a
419  layer2_pad_to_first_es_me1a = lookupTableME11ILT_->GEM_pad_CSC_es_ME1a_odd(layer2_first_pad);
420  layer2_pad_to_last_es_me1a = lookupTableME11ILT_->GEM_pad_CSC_es_ME1a_odd(layer2_last_pad);
421  }
422  }
423 
424  // ME2/1
425  if (station_ == 2) {
426  if (isEven_) {
427  layer2_pad_to_first_es = lookupTableME21ILT_->GEM_pad_CSC_es_ME21_even(layer2_first_pad);
428  layer2_pad_to_last_es = lookupTableME21ILT_->GEM_pad_CSC_es_ME21_even(layer2_last_pad);
429  } else {
430  layer2_pad_to_first_es = lookupTableME21ILT_->GEM_pad_CSC_es_ME21_odd(layer2_first_pad);
431  layer2_pad_to_last_es = lookupTableME21ILT_->GEM_pad_CSC_es_ME21_odd(layer2_last_pad);
432  }
433  }
434  // middle 1/8-strip
435  int layer2_middle_es = 0.5 * (layer2_pad_to_first_es + layer2_pad_to_last_es);
436  int layer2_middle_es_me1a = 0.5 * (layer2_pad_to_first_es_me1a + layer2_pad_to_last_es_me1a);
437 
438  cluster.set_layer2_first_es(layer2_pad_to_first_es);
439  cluster.set_layer2_last_es(layer2_pad_to_last_es);
440  cluster.set_layer2_middle_es(layer2_middle_es);
441 
442  if (station_ == 1) {
443  cluster.set_layer2_first_es_me1a(layer2_pad_to_first_es_me1a);
444  cluster.set_layer2_last_es_me1a(layer2_pad_to_last_es_me1a);
445  cluster.set_layer2_middle_es_me1a(layer2_middle_es_me1a);
446  }
447  }
448 
449  // calculate the wiregroups
450  // need to subtract 1 to use the LUTs
451  const int roll = cluster.roll() - 1;
452 
453  int roll_l2_to_min_wg = -1;
454  int roll_l2_to_max_wg = -1;
455 
456  // ME1/1
457  if (station_ == 1) {
458  if (isEven_) {
459  roll_l2_to_min_wg = lookupTableME11ILT_->GEM_roll_L2_CSC_min_wg_ME11_even(roll);
460  roll_l2_to_max_wg = lookupTableME11ILT_->GEM_roll_L2_CSC_max_wg_ME11_even(roll);
461  } else {
462  roll_l2_to_min_wg = lookupTableME11ILT_->GEM_roll_L2_CSC_min_wg_ME11_odd(roll);
463  roll_l2_to_max_wg = lookupTableME11ILT_->GEM_roll_L2_CSC_max_wg_ME11_odd(roll);
464  }
465  }
466 
467  // ME2/1
468  if (station_ == 2) {
469  if (isEven_) {
470  roll_l2_to_min_wg = lookupTableME21ILT_->GEM_roll_L2_CSC_min_wg_ME21_even(roll);
471  roll_l2_to_max_wg = lookupTableME21ILT_->GEM_roll_L2_CSC_max_wg_ME21_even(roll);
472  } else {
473  roll_l2_to_min_wg = lookupTableME21ILT_->GEM_roll_L2_CSC_min_wg_ME21_odd(roll);
474  roll_l2_to_max_wg = lookupTableME21ILT_->GEM_roll_L2_CSC_max_wg_ME21_odd(roll);
475  }
476  }
477 
478  // set the values
479  cluster.set_layer2_min_wg(roll_l2_to_min_wg);
480  cluster.set_layer2_max_wg(roll_l2_to_max_wg);
481  }
482 }
unsigned GEM_pad_CSC_es_ME1a_odd(unsigned pad) const
std::vector< GEMInternalCluster > clusters_
unsigned GEM_roll_L2_CSC_min_wg_ME11_odd(unsigned roll) const
unsigned GEM_pad_CSC_es_ME1b_even(unsigned pad) const
unsigned GEM_pad_CSC_hs_ME1b_even(unsigned pad) const
unsigned GEM_roll_L1_CSC_min_wg_ME21_even(unsigned roll) const
unsigned GEM_roll_L1_CSC_min_wg_ME11_odd(unsigned roll) const
unsigned GEM_pad_CSC_es_ME21_even(unsigned pad) const
unsigned GEM_roll_L1_CSC_max_wg_ME21_odd(unsigned roll) const
unsigned GEM_pad_CSC_es_ME21_odd(unsigned pad) const
unsigned GEM_roll_L2_CSC_max_wg_ME21_odd(unsigned roll) const
unsigned GEM_pad_CSC_es_ME1a_even(unsigned pad) const
unsigned GEM_pad_CSC_hs_ME1b_odd(unsigned pad) const
unsigned GEM_roll_L1_CSC_max_wg_ME21_even(unsigned roll) const
unsigned GEM_pad_CSC_hs_ME21_even(unsigned pad) const
unsigned GEM_roll_L2_CSC_max_wg_ME11_even(unsigned roll) const
unsigned GEM_roll_L2_CSC_max_wg_ME21_even(unsigned roll) const
unsigned GEM_roll_L2_CSC_min_wg_ME21_even(unsigned roll) const
unsigned GEM_pad_CSC_hs_ME1a_odd(unsigned pad) const
unsigned GEM_roll_L1_CSC_min_wg_ME11_even(unsigned roll) const
const CSCL1TPLookupTableME21ILT * lookupTableME21ILT_
unsigned GEM_roll_L1_CSC_min_wg_ME21_odd(unsigned roll) const
unsigned GEM_pad_CSC_es_ME1b_odd(unsigned pad) const
unsigned GEM_roll_L2_CSC_min_wg_ME21_odd(unsigned roll) const
unsigned GEM_pad_CSC_hs_ME21_odd(unsigned pad) const
unsigned GEM_pad_CSC_hs_ME1a_even(unsigned pad) const
unsigned GEM_roll_L1_CSC_max_wg_ME11_even(unsigned roll) const
unsigned GEM_roll_L1_CSC_max_wg_ME11_odd(unsigned roll) const
const CSCL1TPLookupTableME11ILT * lookupTableME11ILT_
unsigned GEM_roll_L2_CSC_max_wg_ME11_odd(unsigned roll) const
unsigned GEM_roll_L2_CSC_min_wg_ME11_even(unsigned roll) const

◆ getClusters()

std::vector< GEMInternalCluster > GEMClusterProcessor::getClusters ( int  bx,
int  deltaBX = 0,
ClusterTypes  option = AllClusters 
) const

Definition at line 60 of file GEMClusterProcessor.cc.

References funct::abs(), simKBmtfDigis_cfi::bx, haddnano::cl, clusters_, CoincidenceClusters, fileinputsource_cfi::option, convertSQLitetoXML_cfg::output, and SingleClusters.

60  {
61  std::vector<GEMInternalCluster> output;
62 
63  for (const auto& cl : clusters_) {
64  // valid single clusters with the right BX
65  if (std::abs(cl.bx() - bx) <= deltaBX and cl.isValid()) {
66  // ignore the coincidence clusters
67  if (option == SingleClusters and cl.isCoincidence())
68  continue;
69  // ignore the single clusters
70  if (option == CoincidenceClusters and !cl.isCoincidence())
71  continue;
72  output.push_back(cl);
73  }
74  }
75 
76  return output;
77 }
std::vector< GEMInternalCluster > clusters_
Abs< T >::type abs(const T &t)
Definition: Abs.h:22

◆ getCoincidenceClusters()

std::vector< GEMInternalCluster > GEMClusterProcessor::getCoincidenceClusters ( int  bx) const

Definition at line 79 of file GEMClusterProcessor.cc.

References simKBmtfDigis_cfi::bx, haddnano::cl, clusters_, and convertSQLitetoXML_cfg::output.

79  {
80  std::vector<GEMInternalCluster> output;
81 
82  for (const auto& cl : clusters_) {
83  // valid coincidences with the right BX
84  if (cl.bx() == bx and cl.isCoincidence()) {
85  output.push_back(cl);
86  }
87  }
88 
89  return output;
90 }
std::vector< GEMInternalCluster > clusters_

◆ hasGE21Geometry16Partitions()

bool GEMClusterProcessor::hasGE21Geometry16Partitions ( ) const
inline

Definition at line 43 of file GEMClusterProcessor.h.

References hasGE21Geometry16Partitions_.

◆ readoutCoPads()

std::vector< GEMCoPadDigi > GEMClusterProcessor::readoutCoPads ( ) const

Returns vector of CoPads in the read-out time window, if any.

Definition at line 484 of file GEMClusterProcessor.cc.

References clusters_, and convertSQLitetoXML_cfg::output.

484  {
485  std::vector<GEMCoPadDigi> output;
486 
487  // loop on clusters
488  for (const auto& cluster : clusters_) {
489  // ignore single clusters
490  if (!cluster.isCoincidence())
491  continue;
492 
493  // construct coincidence pads out of the centers of the coincidence clusters
494  output.emplace_back(cluster.roll(), cluster.mid1(), cluster.mid2());
495  }
496 
497  return output;
498 }
std::vector< GEMInternalCluster > clusters_

◆ run()

void GEMClusterProcessor::run ( const GEMPadDigiClusterCollection in_clusters)

Runs the CoPad processor code.

Definition at line 40 of file GEMClusterProcessor.cc.

References addCoincidenceClusters(), addSingleClusters(), clear(), and doCoordinateConversion().

40  {
41  // Step 1: clear the GEMInternalCluster vector
42  clear();
43 
44  // check that the GEM cluster collection is a valid pointer
45  if (in_clusters == nullptr) {
46  edm::LogWarning("GEMClusterProcessor") << "Attempt to run without valid in_clusters pointer.";
47  return;
48  }
49 
50  // Step 2: put coincidence clusters in GEMInternalCluster vector
51  addCoincidenceClusters(in_clusters);
52 
53  // Step 3: put single clusters in GEMInternalCluster vector who are not part of any coincidence cluster
54  addSingleClusters(in_clusters);
55 
56  // Step 4: translate the cluster central pad numbers into 1/8-strip number for matching with CSC trigger primitives
58 }
void addSingleClusters(const GEMPadDigiClusterCollection *)
void addCoincidenceClusters(const GEMPadDigiClusterCollection *)
Log< level::Warning, false > LogWarning

◆ setESLookupTables() [1/2]

void GEMClusterProcessor::setESLookupTables ( const CSCL1TPLookupTableME11ILT conf)

Definition at line 36 of file GEMClusterProcessor.cc.

References lookupTableME11ILT_.

36 { lookupTableME11ILT_ = conf; }
const CSCL1TPLookupTableME11ILT * lookupTableME11ILT_

◆ setESLookupTables() [2/2]

void GEMClusterProcessor::setESLookupTables ( const CSCL1TPLookupTableME21ILT conf)

Definition at line 38 of file GEMClusterProcessor.cc.

References lookupTableME21ILT_.

38 { lookupTableME21ILT_ = conf; }
const CSCL1TPLookupTableME21ILT * lookupTableME21ILT_

Member Data Documentation

◆ chamber_

const int GEMClusterProcessor::chamber_
private

◆ clusters_

std::vector<GEMInternalCluster> GEMClusterProcessor::clusters_
private

◆ hasGE21Geometry16Partitions_

bool GEMClusterProcessor::hasGE21Geometry16Partitions_
private

◆ isEven_

bool GEMClusterProcessor::isEven_
private

Definition at line 66 of file GEMClusterProcessor.h.

Referenced by doCoordinateConversion(), and GEMClusterProcessor().

◆ lookupTableME11ILT_

const CSCL1TPLookupTableME11ILT* GEMClusterProcessor::lookupTableME11ILT_
private

Definition at line 77 of file GEMClusterProcessor.h.

Referenced by doCoordinateConversion(), and setESLookupTables().

◆ lookupTableME21ILT_

const CSCL1TPLookupTableME21ILT* GEMClusterProcessor::lookupTableME21ILT_
private

Definition at line 78 of file GEMClusterProcessor.h.

Referenced by doCoordinateConversion(), and setESLookupTables().

◆ maxDeltaBX_

unsigned int GEMClusterProcessor::maxDeltaBX_
private

Definition at line 69 of file GEMClusterProcessor.h.

Referenced by addCoincidenceClusters(), and GEMClusterProcessor().

◆ maxDeltaPad_

unsigned int GEMClusterProcessor::maxDeltaPad_
private

Definition at line 68 of file GEMClusterProcessor.h.

Referenced by addCoincidenceClusters(), and GEMClusterProcessor().

◆ maxDeltaRoll_

unsigned int GEMClusterProcessor::maxDeltaRoll_
private

Definition at line 70 of file GEMClusterProcessor.h.

Referenced by addCoincidenceClusters(), and GEMClusterProcessor().

◆ region_

const int GEMClusterProcessor::region_
private

Chamber id (trigger-type labels).

Definition at line 63 of file GEMClusterProcessor.h.

Referenced by addCoincidenceClusters(), and addSingleClusters().

◆ station_

const int GEMClusterProcessor::station_
private