CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
CSCMotherboardME3141RPC.cc
Go to the documentation of this file.
8 #include "boost/container/flat_set.hpp"
9 
11 { 0,2.421},{ 1,2.415},{ 2,2.406},{ 3,2.397},{ 4,2.388},{ 5,2.379},{ 6,2.371},{ 7,2.362},
12 { 8,2.353},{ 9,2.345},{10,2.336},{11,2.328},{12,2.319},{13,2.311},{14,2.303},{15,2.295},
13 {16,2.287},{17,2.279},{18,2.271},{19,2.263},{20,2.255},{21,2.248},{22,2.240},{23,2.232},
14 {24,2.225},{25,2.217},{26,2.210},{27,2.203},{28,2.195},{29,2.188},{30,2.181},{31,2.174},
15 {32,2.169},{33,2.157},{34,2.151},{35,2.142},{36,2.134},{37,2.126},{38,2.118},{39,2.110},
16 {40,2.102},{41,2.094},{42,2.087},{43,2.079},{44,2.071},{45,2.064},{46,2.056},{47,2.049},
17 {48,2.041},{49,2.034},{50,2.027},{51,2.019},{52,2.012},{53,2.005},{54,1.998},{55,1.991},
18 {56,1.984},{57,1.977},{58,1.970},{59,1.964},{60,1.957},{61,1.950},{62,1.944},{63,1.937},
19 {64,1.932},{65,1.922},{66,1.917},{67,1.911},{68,1.905},{69,1.898},{70,1.892},{71,1.886},
20 {72,1.880},{73,1.874},{74,1.868},{75,1.861},{76,1.855},{77,1.850},{78,1.844},{79,1.838},
21 {80,1.832},{81,1.826},{82,1.820},{83,1.815},{84,1.809},{85,1.803},{86,1.798},{87,1.792},
22 {88,1.787},{89,1.781},{90,1.776},{91,1.770},{92,1.765},{93,1.759},{94,1.754},{95,1.749},
23 };
24 
26 { 0,2.447},{ 1,2.441},{ 2,2.432},{ 3,2.423},{ 4,2.414},{ 5,2.405},{ 6,2.396},{ 7,2.388},
27 { 8,2.379},{ 9,2.371},{10,2.362},{11,2.354},{12,2.345},{13,2.337},{14,2.329},{15,2.321},
28 {16,2.313},{17,2.305},{18,2.297},{19,2.289},{20,2.281},{21,2.273},{22,2.266},{23,2.258},
29 {24,2.251},{25,2.243},{26,2.236},{27,2.228},{28,2.221},{29,2.214},{30,2.207},{31,2.200},
30 {32,2.195},{33,2.183},{34,2.176},{35,2.168},{36,2.160},{37,2.152},{38,2.144},{39,2.136},
31 {40,2.128},{41,2.120},{42,2.112},{43,2.104},{44,2.097},{45,2.089},{46,2.082},{47,2.074},
32 {48,2.067},{49,2.059},{50,2.052},{51,2.045},{52,2.038},{53,2.031},{54,2.023},{55,2.016},
33 {56,2.009},{57,2.003},{58,1.996},{59,1.989},{60,1.982},{61,1.975},{62,1.969},{63,1.962},
34 {64,1.957},{65,1.948},{66,1.943},{67,1.936},{68,1.930},{69,1.924},{70,1.917},{71,1.911},
35 {72,1.905},{73,1.899},{74,1.893},{75,1.887},{76,1.881},{77,1.875},{78,1.869},{79,1.863},
36 {80,1.857},{81,1.851},{82,1.845},{83,1.840},{84,1.834},{85,1.828},{86,1.823},{87,1.817},
37 {88,1.811},{89,1.806},{90,1.800},{91,1.795},{92,1.790},{93,1.784},{94,1.779},{95,1.774},
38 };
39 
41 { 0,2.399},{ 1,2.394},{ 2,2.386},{ 3,2.378},{ 4,2.370},{ 5,2.362},{ 6,2.354},{ 7,2.346},
42 { 8,2.339},{ 9,2.331},{10,2.323},{11,2.316},{12,2.308},{13,2.301},{14,2.293},{15,2.286},
43 {16,2.279},{17,2.272},{18,2.264},{19,2.257},{20,2.250},{21,2.243},{22,2.236},{23,2.229},
44 {24,2.223},{25,2.216},{26,2.209},{27,2.202},{28,2.196},{29,2.189},{30,2.183},{31,2.176},
45 {32,2.172},{33,2.161},{34,2.157},{35,2.150},{36,2.144},{37,2.138},{38,2.132},{39,2.126},
46 {40,2.119},{41,2.113},{42,2.107},{43,2.101},{44,2.095},{45,2.089},{46,2.083},{47,2.078},
47 {48,2.072},{49,2.066},{50,2.060},{51,2.055},{52,2.049},{53,2.043},{54,2.038},{55,2.032},
48 {56,2.027},{57,2.021},{58,2.016},{59,2.010},{60,2.005},{61,1.999},{62,1.994},{63,1.989},
49 {64,1.985},{65,1.977},{66,1.973},{67,1.968},{68,1.963},{69,1.958},{70,1.953},{71,1.947},
50 {72,1.942},{73,1.937},{74,1.932},{75,1.928},{76,1.923},{77,1.918},{78,1.913},{79,1.908},
51 {80,1.903},{81,1.898},{82,1.894},{83,1.889},{84,1.884},{85,1.879},{86,1.875},{87,1.870},
52 {88,1.866},{89,1.861},{90,1.856},{91,1.852},{92,1.847},{93,1.843},{94,1.838},{95,1.834},
53 };
54 
56 { 0,2.423},{ 1,2.418},{ 2,2.410},{ 3,2.402},{ 4,2.394},{ 5,2.386},{ 6,2.378},{ 7,2.370},
57 { 8,2.362},{ 9,2.355},{10,2.347},{11,2.339},{12,2.332},{13,2.324},{14,2.317},{15,2.310},
58 {16,2.302},{17,2.295},{18,2.288},{19,2.281},{20,2.274},{21,2.267},{22,2.260},{23,2.253},
59 {24,2.246},{25,2.239},{26,2.233},{27,2.226},{28,2.219},{29,2.213},{30,2.206},{31,2.199},
60 {32,2.195},{33,2.185},{34,2.180},{35,2.174},{36,2.168},{37,2.161},{38,2.155},{39,2.149},
61 {40,2.143},{41,2.137},{42,2.131},{43,2.125},{44,2.119},{45,2.113},{46,2.107},{47,2.101},
62 {48,2.095},{49,2.089},{50,2.084},{51,2.078},{52,2.072},{53,2.067},{54,2.061},{55,2.055},
63 {56,2.050},{57,2.044},{58,2.039},{59,2.033},{60,2.028},{61,2.023},{62,2.017},{63,2.012},
64 {64,2.008},{65,2.000},{66,1.996},{67,1.991},{68,1.986},{69,1.981},{70,1.976},{71,1.971},
65 {72,1.966},{73,1.961},{74,1.956},{75,1.951},{76,1.946},{77,1.941},{78,1.936},{79,1.931},
66 {80,1.926},{81,1.921},{82,1.917},{83,1.912},{84,1.907},{85,1.902},{86,1.898},{87,1.893},
67 {88,1.889},{89,1.884},{90,1.879},{91,1.875},{92,1.870},{93,1.866},{94,1.861},{95,1.857},
68 };
69 
70 // LUT with bending angles of the RPC-CSC high efficiency patterns (98%)
71 // 1st index: pt value = {5,10,15,20,30,40}
72 // 2nd index: bending angle for odd numbered chambers
73 // 3rd index: bending angle for even numbered chambers
75  {3., 0.02203511, 0.00930056},
76  {5., 0.02203511, 0.00930056},
77  {7 , 0.0182579 , 0.00790009},
78  {10., 0.01066000, 0.00483286},
79  {15., 0.00722795, 0.00363230},
80  {20., 0.00562598, 0.00304878},
81  {30., 0.00416544, 0.00253782},
82  {40., 0.00342827, 0.00230833} };
83 
85  {3., 0.02203511, 0.00930056},
86  {5., 0.02203511, 0.00930056},
87  {7 , 0.0182579 , 0.00790009},
88  {10., 0.01066000, 0.00483286},
89  {15., 0.00722795, 0.00363230},
90  {20., 0.00562598, 0.00304878},
91  {30., 0.00416544, 0.00253782},
92  {40., 0.00342827, 0.00230833} };
93 
95  unsigned sector, unsigned subsector,
96  unsigned chamber,
97  const edm::ParameterSet& conf) :
98  CSCMotherboard(endcap, station, sector, subsector, chamber, conf)
99 {
100  const edm::ParameterSet commonParams(conf.getParameter<edm::ParameterSet>("commonParam"));
101  runME3141ILT_ = commonParams.getParameter<bool>("runME3141ILT");
102 
103  if (!isSLHC) edm::LogError("L1CSCTPEmulatorConfigError")
104  << "+++ Upgrade CSCMotherboardME3141RPC constructed while isSLHC is not set! +++\n";
105 
106  const edm::ParameterSet me3141tmbParams(conf.getParameter<edm::ParameterSet>("me3141tmbSLHCRPC"));
107 
108  // whether to not reuse CLCTs that were used by previous matching ALCTs
109  // in ALCT-to-CLCT algorithm
110  drop_used_clcts = me3141tmbParams.getParameter<bool>("tmbDropUsedClcts");
111 
112  match_earliest_clct_me3141_only = me3141tmbParams.getParameter<bool>("matchEarliestClctME3141Only");
113 
114  tmb_cross_bx_algo = me3141tmbParams.getParameter<unsigned int>("tmbCrossBxAlgorithm");
115 
116  // maximum lcts per BX in ME2
117  max_me3141_lcts = me3141tmbParams.getParameter<unsigned int>("maxME3141LCTs");
118 
120  for (unsigned int m=2; m<match_trig_window_size; m+=2)
121  {
122  pref[m-1] = pref[0] - m/2;
123  pref[m] = pref[0] + m/2;
124  }
125 
126  //----------------------------------------------------------------------------------------//
127 
128  // R P C - C S C I N T E G R A T E D L O C A L A L G O R I T H M
129 
130  //----------------------------------------------------------------------------------------//
131 
132  // debug
133  debug_luts_ = me3141tmbParams.getParameter<bool>("debugLUTs");
134  debug_rpc_matching_ = me3141tmbParams.getParameter<bool>("debugMatching");
135 
136  // deltas used to match to RPC digis
137  maxDeltaBXRPC_ = me3141tmbParams.getParameter<int>("maxDeltaBXRPC");
138  maxDeltaStripRPCOdd_ = me3141tmbParams.getParameter<int>("maxDeltaStripRPCOdd");
139  maxDeltaStripRPCEven_ = me3141tmbParams.getParameter<int>("maxDeltaStripRPCEven");
140  maxDeltaWg_ = me3141tmbParams.getParameter<int>("maxDeltaWg");
141 
142  // use "old" or "new" dataformat for integrated LCTs?
143  useOldLCTDataFormat_ = me3141tmbParams.getParameter<bool>("useOldLCTDataFormat");
144 
145  // drop low quality stubs if they don't have RPCs
146  dropLowQualityCLCTsNoRPCs_ = me3141tmbParams.getParameter<bool>("dropLowQualityCLCTsNoRPCs");
147 
148  // build LCT from CLCT and RPC
149  buildLCTfromALCTandRPC_ = me3141tmbParams.getParameter<bool>("buildLCTfromALCTandRPC");
150  buildLCTfromCLCTandRPC_ = me3141tmbParams.getParameter<bool>("buildLCTfromCLCTandRPC");
151  buildLCTfromLowQstubandRPC_ = me3141tmbParams.getParameter<bool>("buildLCTfromLowQstubandRPC");
152 
153  // promote ALCT-RPC pattern
154  promoteALCTRPCpattern_ = me3141tmbParams.getParameter<bool>("promoteALCTRPCpattern");
155 
156  // promote ALCT-CLCT-RPC quality
157  promoteALCTRPCquality_ = me3141tmbParams.getParameter<bool>("promoteALCTRPCquality");
158  promoteCLCTRPCquality_ = me3141tmbParams.getParameter<bool>("promoteCLCTRPCquality");
159 }
160 
162 {
163 }
164 
166 {
168 
169  for (int bx = 0; bx < MAX_LCT_BINS; bx++)
170  for (unsigned int mbx = 0; mbx < match_trig_window_size; mbx++)
171  for (int i=0;i<2;i++)
172  allLCTs[bx][mbx][i].clear();
173 
174  rpcRollToEtaLimits_.clear();
175  cscWgToRpcRoll_.clear();
176  rpcStripToCscHs_.clear();
177  cscHsToRpcStrip_.clear();
178  rpcDigis_.clear();
179 }
180 
181 void
183  const CSCComparatorDigiCollection* compdc,
184  const RPCDigiCollection* rpcDigis)
185 {
186  clear();
187 
188  if (!( alct and clct and runME3141ILT_))
189  {
190  if (infoV >= 0) edm::LogError("L1CSCTPEmulatorSetupError")
191  << "+++ run() called for non-existing ALCT/CLCT processor! +++ \n";
192  return;
193  }
194 
195  alctV = alct->run(wiredc); // run anodeLCT
196  clctV = clct->run(compdc); // run cathodeLCT
197 
198  bool rpcGeometryAvailable(false);
199  if (rpc_g != nullptr) {
200  if (infoV >= 0) edm::LogInfo("L1CSCTPEmulatorSetupInfo")
201  << "+++ run() called for RPC-CSC integrated trigger! +++ \n";
202  rpcGeometryAvailable = true;
203  }
204  const bool hasCorrectRPCGeometry((not rpcGeometryAvailable) or (rpcGeometryAvailable and not hasRE31andRE41()));
205 
206  // retrieve CSCChamber geometry
208  const CSCChamber* cscChamber(geo_manager->chamber(theEndcap, theStation, theSector, theSubsector, theTrigChamber));
209  const CSCDetId csc_id(cscChamber->id());
210 
211  // trigger geometry
212  const CSCLayer* keyLayer(cscChamber->layer(3));
213  const CSCLayerGeometry* keyLayerGeometry(keyLayer->geometry());
214  const int region((theEndcap == 1) ? 1: -1);
215  const bool isEven(csc_id.chamber()%2==0);
216  const int csc_trig_sect(CSCTriggerNumbering::triggerSectorFromLabels(csc_id));
217  const int csc_trig_id( CSCTriggerNumbering::triggerCscIdFromLabels(csc_id));
218  const int csc_trig_chid((3*(csc_trig_sect-1)+csc_trig_id)%18 +1);
219  const int rpc_trig_sect((csc_trig_chid-1)/3+1);
220  const int rpc_trig_subsect((csc_trig_chid-1)%3+1);
221  const RPCDetId rpc_id(region,1,theStation,rpc_trig_sect,1,rpc_trig_subsect,0);
222  const RPCChamber* rpcChamber(rpc_g->chamber(rpc_id));
223 
224  if (runME3141ILT_){
225 
226  // check for RE3/1-RE4/1 geometry
227  if (hasCorrectRPCGeometry) {
228  if (infoV >= 0) edm::LogInfo("L1CSCTPEmulatorSetupError")
229  << "+++ run() called for RPC-CSC integrated trigger without valid RPC geometry! +++ \n";
230  return;
231  }
232 
233  // LUT<roll,<etaMin,etaMax> >
235 
236  if (debug_luts_){
237  std::cout << "RPC det " <<rpc_id<<" CSC det "<< csc_id << std::endl;
238  if (rpcRollToEtaLimits_.size()) {
239  for(auto p : rpcRollToEtaLimits_) {
240  std::cout << "roll "<< p.first << " min eta " << (p.second).first << " max eta " << (p.second).second << std::endl;
241  }
242  }
243  }
244 
245  // loop on all wiregroups to create a LUT <WG,roll>
246  const int numberOfWG(keyLayerGeometry->numberOfWireGroups());
247  for (int i = 0; i< numberOfWG; ++i){
248  auto eta(theStation==3 ?
249  (isEven ? lut_wg_me31_eta_even[i][1] : lut_wg_me31_eta_odd[i][1]) :
250  (isEven ? lut_wg_me41_eta_even[i][1] : lut_wg_me41_eta_odd[i][1]));
252  }
253  if (debug_luts_){
254  for(auto p : cscWgToRpcRoll_) {
255  auto eta(theStation==3 ?
256  (isEven ? lut_wg_me31_eta_even[p.first][1] : lut_wg_me31_eta_odd[p.first][1]) :
257  (isEven ? lut_wg_me41_eta_even[p.first][1] : lut_wg_me41_eta_odd[p.first][1]));
258 
259  std::cout << "WG "<< p.first << " RPC roll " << p.second << " "
260  << rpcRollToEtaLimits_[p.second].first << " "
261  << rpcRollToEtaLimits_[p.second].second << " " << eta << std::endl;
262  }
263  }
264 
265  // pick any roll
266  auto randRoll(rpcChamber->roll(2));
267 
268  auto nStrips(keyLayerGeometry->numberOfStrips());
269  for (float i = 0; i< nStrips; i = i+0.5){
270  const LocalPoint lpCSC(keyLayerGeometry->topology()->localPosition(i));
271  const GlobalPoint gp(keyLayer->toGlobal(lpCSC));
272  const LocalPoint lpRPC(randRoll->toLocal(gp));
273  const int HS(i/0.5);
274  const bool edge(HS < 5 or HS > 155);
275  const float strip(edge ? -99 : randRoll->strip(lpRPC));
276  // HS are wrapped-around
277  cscHsToRpcStrip_[HS] = std::make_pair(std::floor(strip),std::ceil(strip));
278  }
279  if (debug_luts_){
280  std::cout << "detId " << csc_id << std::endl;
281  std::cout << "CSCHSToRPCStrip LUT in" << std::endl;
282  for(auto p : cscHsToRpcStrip_) {
283  std::cout << "CSC HS "<< p.first << " RPC Strip low " << (p.second).first << " RPC Strip high " << (p.second).second << std::endl;
284  }
285  }
286 
287  const int nRPCStrips(randRoll->nstrips());
288  for (int i = 0; i< nRPCStrips; ++i){
289  const LocalPoint lpRPC(randRoll->centreOfStrip(i));
290  const GlobalPoint gp(randRoll->toGlobal(lpRPC));
291  const LocalPoint lpCSC(keyLayer->toLocal(gp));
292  const float strip(keyLayerGeometry->strip(lpCSC));
293  // HS are wrapped-around
294  rpcStripToCscHs_[i] = (int) (strip - 0.25)/0.5;
295  }
296  if (debug_luts_){
297  std::cout << "detId " << csc_id << std::endl;
298  std::cout << "RPCStripToCSCHs LUT" << std::endl;
299  for(auto p : rpcStripToCscHs_) {
300  std::cout << "RPC Strip "<< p.first << " CSC HS: " << p.second << std::endl;
301  }
302  }
303  //select correct scenarios, even or odd
305 
306  rpcDigis_.clear();
307  retrieveRPCDigis(rpcDigis, rpc_id.rawId());
308  }
309 
310  const bool hasRPCDigis(rpcDigis_.size()!=0);
311 
312  int used_clct_mask[20];
313  for (int c=0;c<20;++c) used_clct_mask[c]=0;
314 
315  // ALCT centric matching
316  for (int bx_alct = 0; bx_alct < CSCAnodeLCTProcessor::MAX_ALCT_BINS; bx_alct++)
317  {
318  if (alct->bestALCT[bx_alct].isValid())
319  {
320  const int bx_clct_start(bx_alct - match_trig_window_size/2);
321  const int bx_clct_stop(bx_alct + match_trig_window_size/2);
322  if (debug_rpc_matching_){
323  std::cout << "========================================================================" << std::endl;
324  std::cout << "ALCT-CLCT matching in ME" << theStation << "/1 chamber: " << csc_id << std::endl;
325  std::cout << "------------------------------------------------------------------------" << std::endl;
326  std::cout << "+++ Best ALCT Details: ";
327  alct->bestALCT[bx_alct].print();
328  std::cout << "+++ Second ALCT Details: ";
329  alct->secondALCT[bx_alct].print();
330  std::cout << "------------------------------------------------------------------------" << std::endl;
331  std::cout << "RPC Chamber " << rpc_id << std::endl;
332  printRPCTriggerDigis(bx_clct_start, bx_clct_stop);
333 
334  std::cout << "------------------------------------------------------------------------" << std::endl;
335  std::cout << "Attempt ALCT-CLCT matching in ME" << theStation << "/1 in bx range: [" << bx_clct_start << "," << bx_clct_stop << "]" << std::endl;
336  }
337 
338  // low quality ALCT
339  const bool lowQualityALCT(alct->bestALCT[bx_alct].getQuality() == 0);
340 
341  // ALCT-to-CLCT
342  int nSuccesFulMatches = 0;
343  for (int bx_clct = bx_clct_start; bx_clct <= bx_clct_stop; bx_clct++) {
344  if (bx_clct < 0 or bx_clct >= CSCCathodeLCTProcessor::MAX_CLCT_BINS) continue;
345  if (drop_used_clcts and used_clct_mask[bx_clct]) continue;
346  if (clct->bestCLCT[bx_clct].isValid()) {
347 
348  // pick the digi that corresponds
349  auto matchingDigis(matchingRPCDigis(clct->bestCLCT[bx_clct], alct->bestALCT[bx_alct], rpcDigis_[bx_alct], false));
350 
351  // clct quality
352  const int quality(clct->bestCLCT[bx_clct].getQuality());
353  // low quality ALCT or CLCT
354  const bool lowQuality(quality<4 or lowQualityALCT);
355 
356  if (runME3141ILT_ and dropLowQualityCLCTsNoRPCs_ and lowQuality and hasRPCDigis){
357  int nFound(matchingDigis.size());
358  const bool clctInEdge(clct->bestCLCT[bx_clct].getKeyStrip() < 5 or clct->bestCLCT[bx_clct].getKeyStrip() > 155);
359  if (clctInEdge){
360  if (debug_rpc_matching_) std::cout << "\tInfo: low quality ALCT or CLCT in CSC chamber edge, don't care about RPC digis" << std::endl;
361  }
362  else {
363  if (nFound != 0){
364  if (debug_rpc_matching_) std::cout << "\tInfo: low quality ALCT or CLCT with " << nFound << " matching RPC trigger digis" << std::endl;
365  }
366  else {
367  if (debug_rpc_matching_) std::cout << "\tWarning: low quality ALCT or CLCT without matching RPC trigger digi" << std::endl;
368  continue;
369  }
370  }
371  }
372 
373  int mbx = bx_clct-bx_clct_start;
374  correlateLCTsRPC(alct->bestALCT[bx_alct], alct->secondALCT[bx_alct],
375  clct->bestCLCT[bx_clct], clct->secondCLCT[bx_clct],
376  allLCTs[bx_alct][mbx][0], allLCTs[bx_alct][mbx][1], matchingDigis);
377  ++nSuccesFulMatches;
378  if (debug_rpc_matching_) {
379  // if (infoV > 1) LogTrace("CSCMotherboard")
380  std::cout
381  << "Successful ALCT-CLCT match: bx_clct = " << bx_clct
382  << "; match window: [" << bx_clct_start << "; " << bx_clct_stop
383  << "]; bx_alct = " << bx_alct << std::endl;
384  std::cout << "+++ Best CLCT Details: ";
385  clct->bestCLCT[bx_clct].print();
386  std::cout << "+++ Second CLCT Details: ";
387  clct->secondCLCT[bx_clct].print();
388  }
389  if (allLCTs[bx_alct][mbx][0].isValid()) {
390  used_clct_mask[bx_clct] += 1;
392  }
393  }
394  }
395  // ALCT-RPC digi matching
396  int nSuccesFulRPCMatches = 0;
397  if (runME3141ILT_ and nSuccesFulMatches==0 and buildLCTfromALCTandRPC_){
398  if (debug_rpc_matching_) std::cout << "++No valid ALCT-CLCT matches in ME"<<theStation<<"1" << std::endl;
399  for (int bx_rpc = bx_clct_start; bx_rpc <= bx_clct_stop; bx_rpc++) {
400  if (lowQualityALCT and !buildLCTfromLowQstubandRPC_) continue; // build lct from low-Q ALCTs and rpc if para is set true
401  if (not hasRPCDigis) continue;
402 
403  // find the best matching copad - first one
404  auto digis(matchingRPCDigis(alct->bestALCT[bx_alct], rpcDigis_[bx_rpc], true));
405  if (debug_rpc_matching_) std::cout << "\t++Number of matching RPC Digis in BX " << bx_alct << " : "<< digis.size() << std::endl;
406  if (digis.size()==0) continue;
407 
408  correlateLCTsRPC(alct->bestALCT[bx_alct], alct->secondALCT[bx_alct],
409  digis.at(0).second, allLCTs[bx_alct][0][0], allLCTs[bx_alct][0][1]);
410  if (allLCTs[bx_alct][0][0].isValid()) {
411  ++nSuccesFulRPCMatches;
413  }
414  if (debug_rpc_matching_) {
415  std::cout << "Successful ALCT-RPC digi match in ME"<<theStation<<"1: bx_alct = " << bx_alct << std::endl << std::endl;
416  std::cout << "------------------------------------------------------------------------" << std::endl << std::endl;
417  }
418  }
419  }
420  }
421  else{
422  auto digis(rpcDigis_[bx_alct]);
423  if (runME3141ILT_ and digis.size() and buildLCTfromCLCTandRPC_) {
424  //const int bx_clct_start(bx_alct - match_trig_window_size/2);
425  //const int bx_clct_stop(bx_alct + match_trig_window_size/2);
426  // RPC-to-CLCT
427  int nSuccesFulMatches = 0;
428  // for (int bx_clct = bx_clct_start; bx_clct <= bx_clct_stop; bx_clct++)
429  // {
430  // if (bx_clct < 0 or bx_clct >= CSCCathodeLCTProcessor::MAX_CLCT_BINS) continue;
431  if (drop_used_clcts and used_clct_mask[bx_alct]) continue;
432  if (clct->bestCLCT[bx_alct].isValid())
433  {
434  if (debug_rpc_matching_){
435  std::cout << "========================================================================" << std::endl;
436  std::cout << "RPC-CLCT matching in ME" << theStation << "/1 chamber: " << cscChamber->id() << " in bx: "<<bx_alct<< std::endl;
437  std::cout << "------------------------------------------------------------------------" << std::endl;
438  }
439  const int quality(clct->bestCLCT[bx_alct].getQuality());
440  // we also use low-Q stubs for the time being
441  if (quality < 4 and !buildLCTfromLowQstubandRPC_) continue;
442 
443  ++nSuccesFulMatches;
444 
445  int mbx = std::abs(clct->bestCLCT[bx_alct].getBX()-bx_alct);
446  int bx_rpc = lct_central_bx;
447  correlateLCTsRPC(clct->bestCLCT[bx_alct], clct->secondCLCT[bx_alct], digis[0].second, RPCDetId(digis[0].first).roll(),
448  allLCTs[bx_rpc][mbx][0], allLCTs[bx_rpc][mbx][1]);
449  if (debug_rpc_matching_) {
450  // if (infoV > 1) LogTrace("CSCMotherboard")
451  std::cout << "Successful RPC-CLCT match in ME"<<theStation<<"/1: bx_alct = " << bx_alct
452  << std::endl;
453  std::cout << "+++ Best CLCT Details: ";
454  clct->bestCLCT[bx_alct].print();
455  std::cout << "+++ Second CLCT Details: ";
456  clct->secondCLCT[bx_alct].print();
457  }
458  if (allLCTs[bx_rpc][mbx][0].isValid()) {
459  used_clct_mask[bx_alct] += 1;
461  }
462  }
463  }
464  }
465  }
466 
467  // reduction of nLCTs per each BX
468  for (int bx = 0; bx < MAX_LCT_BINS; bx++)
469  {
470  // counting
471  unsigned int n=0;
472  for (unsigned int mbx = 0; mbx < match_trig_window_size; mbx++)
473  for (int i=0;i<2;i++)
474  {
475  int cbx = bx + mbx - match_trig_window_size/2;
476  if (allLCTs[bx][mbx][i].isValid())
477  {
478  ++n;
479  if (infoV > 0) LogDebug("CSCMotherboard")
480  << "LCT"<<i+1<<" "<<bx<<"/"<<cbx<<": "<<allLCTs[bx][mbx][i]<<std::endl;
481  }
482  }
483 
484  // some simple cross-bx sorting algorithms
485  if (tmb_cross_bx_algo == 1 and (n>2))
486  {
487  n=0;
488  for (unsigned int mbx = 0; mbx < match_trig_window_size; mbx++)
489  for (int i=0;i<2;i++)
490  {
491  if (allLCTs[bx][pref[mbx]][i].isValid())
492  {
493  n++;
494  if (n>2) allLCTs[bx][pref[mbx]][i].clear();
495  }
496  }
497 
498  n=0;
499  for (unsigned int mbx = 0; mbx < match_trig_window_size; mbx++)
500  for (int i=0;i<2;i++)
501  {
502  int cbx = bx + mbx - match_trig_window_size/2;
503  if (allLCTs[bx][mbx][i].isValid())
504  {
505  n++;
506  if (infoV > 0) LogDebug("CSCMotherboard")
507  << "LCT"<<i+1<<" "<<bx<<"/"<<cbx<<": "<<allLCTs[bx][mbx][i]<<std::cout;
508  }
509  }
510  if (infoV > 0 and n>0) LogDebug("CSCMotherboard")
511  <<"bx "<<bx<<" nnLCT:"<<n<<" "<<n<<std::endl;
512  } // x-bx sorting
513  }
514 
515  bool first = true;
516  unsigned int n=0;
517  for (auto p : readoutLCTs()) {
518  if (debug_rpc_matching_ and first){
519  std::cout << "========================================================================" << std::endl;
520  std::cout << "Counting the final LCTs" << std::endl;
521  std::cout << "========================================================================" << std::endl;
522  first = false;
523  std::cout << "tmb_cross_bx_algo: " << tmb_cross_bx_algo << std::endl;
524  }
525  n++;
527  std::cout << "LCT "<<n<<" " << p <<std::endl;
528  }
529 }
530 
531 // check that the RE31 and RE41 chambers are really there
533 {
534  // just pick two random chambers
535  auto aRE31(rpc_g->chamber(RPCDetId(1,1,3,2,1,1,0)));
536  auto aRE41(rpc_g->chamber(RPCDetId(-1,1,4,3,1,2,0)));
537  return aRE31 and aRE41;
538 }
539 
540 
541 std::map<int,std::pair<double,double> > CSCMotherboardME3141RPC::createRPCRollLUT(RPCDetId id)
542 {
543  std::map<int,std::pair<double,double> > result;
544 
545  auto chamber(rpc_g->chamber(id));
546  if (chamber==nullptr) return result;
547 
548  for(int i = 1; i<= chamber->nrolls(); ++i){
549  auto roll(chamber->roll(i));
550  if (roll==nullptr) continue;
551 
552  const float half_striplength(roll->specs()->specificTopology().stripLength()/2.);
553  const LocalPoint lp_top(0., half_striplength, 0.);
554  const LocalPoint lp_bottom(0., -half_striplength, 0.);
555  const GlobalPoint gp_top(roll->toGlobal(lp_top));
556  const GlobalPoint gp_bottom(roll->toGlobal(lp_bottom));
557  //result[i] = std::make_pair(floorf(gp_top.eta() * 100) / 100, ceilf(gp_bottom.eta() * 100) / 100);
558  result[i] = std::make_pair(std::abs(gp_top.eta()), std::abs(gp_bottom.eta()));
559  }
560  return result;
561 }
562 
563 
565 {
566  int result = -99;
567  for(auto p : rpcRollToEtaLimits_) {
568  const float minEta((p.second).first);
569  const float maxEta((p.second).second);
570  if (minEta <= eta and eta <= maxEta) {
571  result = p.first;
572  break;
573  }
574  }
575  return result;
576 }
577 
578 
580 {
581  auto chamber(rpc_g->chamber(RPCDetId(id)));
582  for (auto roll : chamber->rolls()) {
583  RPCDetId roll_id(roll->id());
584  auto digis_in_det = rpcDigis->get(roll_id);
585  for (auto digi = digis_in_det.first; digi != digis_in_det.second; ++digi) {
586  const int bx_shifted(lct_central_bx + digi->bx());
587  for (int bx = bx_shifted - maxDeltaBXRPC_;bx <= bx_shifted + maxDeltaBXRPC_; ++bx) {
588  rpcDigis_[bx].push_back(std::make_pair(roll_id(), *digi));
589  }
590  }
591  }
592 }
593 
594 
595 void CSCMotherboardME3141RPC::printRPCTriggerDigis(int bx_start, int bx_stop)
596 {
597  std::cout << "------------------------------------------------------------------------" << std::endl;
598  bool first = true;
599  for (int bx = bx_start; bx <= bx_stop; bx++) {
600  std::vector<std::pair<unsigned int, const RPCDigi> > in_strips = rpcDigis_[bx];
601  if (first) {
602  std::cout << "* RPC trigger digis: " << std::endl;
603  }
604  first = false;
605  std::cout << "N(digis) BX " << bx << " : " << in_strips.size() << std::endl;
606  if (rpcDigis_.size()!=0){
607  for (auto digi : in_strips){
608  auto roll_id(RPCDetId(digi.first));
609  std::cout << "\tdetId " << digi.first << " " << roll_id << ", digi = " << digi.second.strip() << ", BX = " << digi.second.bx() + 6 << std::endl;
610  }
611  }
612  else
613  break;
614  }
615 }
616 
617 
620 {
622 
623  const int lowStrip(cscHsToRpcStrip_[clct.getKeyStrip()].first);
624  const int highStrip(cscHsToRpcStrip_[clct.getKeyStrip()].second);
625  const bool debug(false);
626  if (debug) std::cout << "lowStrip " << lowStrip << " highStrip " << highStrip << " delta strip " << maxDeltaStripRPC_ <<std::endl;
627  for (auto p: digis){
628  auto strip((p.second).strip());
629  if (debug) std::cout << "strip " << strip << std::endl;
630  if (std::abs(lowStrip - strip) <= maxDeltaStripRPC_ or std::abs(strip - highStrip) <= maxDeltaStripRPC_){
631  if (debug) std::cout << "++Matches! " << std::endl;
632  result.push_back(p);
633  if (first) return result;
634  }
635  }
636  return result;
637 }
638 
639 
642 {
644 
645  int Wg = alct.getKeyWG();
646  std::vector<int> Rolls;
647  Rolls.push_back(cscWgToRpcRoll_[Wg]);
649  Rolls.push_back(cscWgToRpcRoll_[Wg-maxDeltaWg_]);
650  if ((unsigned int)(Wg+maxDeltaWg_)<cscWgToRpcRoll_.size() && cscWgToRpcRoll_[Wg] != cscWgToRpcRoll_[Wg+maxDeltaWg_])
651  Rolls.push_back(cscWgToRpcRoll_[Wg+maxDeltaWg_]);
652 
653  const bool debug(false);
654  if (debug) std::cout << "ALCT keyWG " << alct.getKeyWG() << std::endl;
655  for (auto alctRoll : Rolls)
656  {
657  if (debug) std::cout << " roll " << alctRoll << std::endl;
658  for (auto p: digis){
659  auto digiRoll(RPCDetId(p.first).roll());
660  if (debug) std::cout << "Candidate ALCT: " << digiRoll << std::endl;
661  if (alctRoll != digiRoll) continue;
662  if (debug) std::cout << "++Matches! " << std::endl;
663  result.push_back(p);
664  if (first) return result;
665  }
666  }
667  return result;
668 }
669 
670 
673 {
675 
676  // Fetch all (!) digis matching to ALCTs and CLCTs
677  auto digisClct(matchingRPCDigis(clct, digis, false));
678  auto digisAlct(matchingRPCDigis(alct, digis, false));
679 
680  const bool debug(false);
681  if (debug) std::cout << "-----------------------------------------------------------------------"<<std::endl;
682  // Check if the digis overlap
683  for (auto p : digisAlct){
684  if (debug) std::cout<< "Candidate RPC digis for ALCT: " << p.first << " " << p.second << std::endl;
685  for (auto q: digisClct){
686  if (debug) std::cout<< "++Candidate RPC digis for CLCT: " << q.first << " " << q.second << std::endl;
687  // look for exactly the same digis
688  if (p.first != q.first) continue;
689  // if (not RPCDigi(*(p.second))==*(q.second)) continue;
690  if (debug) std::cout << "++Matches! " << std::endl;
691  result.push_back(p);
692  if (first) return result;
693  }
694  }
695  if (debug) std::cout << "-----------------------------------------------------------------------"<<std::endl;
696  return result;
697 }
698 
699 unsigned int CSCMotherboardME3141RPC::findQualityRPC(const CSCALCTDigi& aLCT, const CSCCLCTDigi& cLCT, bool hasRPC)
700 {
701 
702  /*
703  Same LCT quality definition as standard LCTs
704  a4 and c4 takes RPCs into account!!!
705  */
706 
707  unsigned int quality = 0;
708 
709  if (!isTMB07) {
710  bool isDistrip = (cLCT.getStripType() == 0);
711 
712  if (aLCT.isValid() && !(cLCT.isValid())) { // no CLCT
713  if (aLCT.getAccelerator()) {quality = 1;}
714  else {quality = 3;}
715  }
716  else if (!(aLCT.isValid()) && cLCT.isValid()) { // no ALCT
717  if (isDistrip) {quality = 4;}
718  else {quality = 5;}
719  }
720  else if (aLCT.isValid() && cLCT.isValid()) { // both ALCT and CLCT
721  if (aLCT.getAccelerator()) {quality = 2;} // accelerator muon
722  else { // collision muon
723  // CLCT quality is, in fact, the number of layers hit, so subtract 3
724  // to get quality analogous to ALCT one.
725  int sumQual = aLCT.getQuality() + (cLCT.getQuality()-3);
726  if (sumQual < 1 || sumQual > 6) {
727  if (infoV >= 0) edm::LogWarning("L1CSCTPEmulatorWrongValues")
728  << "+++ findQuality: sumQual = " << sumQual << "+++ \n";
729  }
730  if (isDistrip) { // distrip pattern
731  if (sumQual == 2) {quality = 6;}
732  else if (sumQual == 3) {quality = 7;}
733  else if (sumQual == 4) {quality = 8;}
734  else if (sumQual == 5) {quality = 9;}
735  else if (sumQual == 6) {quality = 10;}
736  }
737  else { // halfstrip pattern
738  if (sumQual == 2) {quality = 11;}
739  else if (sumQual == 3) {quality = 12;}
740  else if (sumQual == 4) {quality = 13;}
741  else if (sumQual == 5) {quality = 14;}
742  else if (sumQual == 6) {quality = 15;}
743  }
744  }
745  }
746  }
747 #ifdef OLD
748  else {
749  // Temporary definition, used until July 2008.
750  // First if statement is fictitious, just to help the CSC TF emulator
751  // handle such cases (one needs to make sure they will be accounted for
752  // in the new quality definition.
753  if (!(aLCT.isValid()) || !(cLCT.isValid())) {
754  if (aLCT.isValid() && !(cLCT.isValid())) quality = 1; // no CLCT
755  else if (!(aLCT.isValid()) && cLCT.isValid()) quality = 2; // no ALCT
756  else quality = 0; // both absent; should never happen.
757  }
758  else {
759  // Sum of ALCT and CLCT quality bits. CLCT quality is, in fact, the
760  // number of layers hit, so subtract 3 to put it to the same footing as
761  // the ALCT quality.
762  int sumQual = aLCT.getQuality() + (cLCT.getQuality()-3);
763  if (sumQual < 1 || sumQual > 6) {
764  if (infoV >= 0) edm::LogWarning("L1CSCTPEmulatorWrongValues")
765  << "+++ findQuality: Unexpected sumQual = " << sumQual << "+++\n";
766  }
767 
768  // LCT quality is basically the sum of ALCT and CLCT qualities, but split
769  // in two groups depending on the CLCT pattern id (higher quality for
770  // straighter patterns).
771  int offset = 0;
772  if (cLCT.getPattern() <= 7) offset = 4;
773  else offset = 9;
774  quality = offset + sumQual;
775  }
776  }
777 #endif
778  else {
779  // 2008 definition.
780  if (!(aLCT.isValid()) || !(cLCT.isValid())) {
781  if (aLCT.isValid() && !(cLCT.isValid())) quality = 1; // no CLCT
782  else if (!(aLCT.isValid()) && cLCT.isValid()) quality = 2; // no ALCT
783  else quality = 0; // both absent; should never happen.
784  }
785  else {
786  const int pattern(cLCT.getPattern());
787  if (pattern == 1) quality = 3; // layer-trigger in CLCT
788  else {
789  // ALCT quality is the number of layers hit minus 3.
790  // CLCT quality is the number of layers hit.
791  int n_rpc = 0;
792  if (hasRPC) n_rpc = 1;
793  const bool a4((aLCT.getQuality() >= 1 and aLCT.getQuality() != 4) or
794  (aLCT.getQuality() == 4 and n_rpc >=1));
795  const bool c4((cLCT.getQuality() >= 4) or (cLCT.getQuality() >= 3 and n_rpc>=1));
796  // quality = 4; "reserved for low-quality muons in future"
797  if (!a4 && !c4) quality = 5; // marginal anode and cathode
798  else if ( a4 && !c4) quality = 6; // HQ anode, but marginal cathode
799  else if (!a4 && c4) quality = 7; // HQ cathode, but marginal anode
800  else if ( a4 && c4) {
801  if (aLCT.getAccelerator()) quality = 8; // HQ muon, but accel ALCT
802  else {
803  // quality = 9; "reserved for HQ muons with future patterns
804  // quality = 10; "reserved for HQ muons with future patterns
805  if (pattern == 2 || pattern == 3) quality = 11;
806  else if (pattern == 4 || pattern == 5) quality = 12;
807  else if (pattern == 6 || pattern == 7) quality = 13;
808  else if (pattern == 8 || pattern == 9) quality = 14;
809  else if (pattern == 10) quality = 15;
810  else {
811  if (infoV >= 0) edm::LogWarning("L1CSCTPEmulatorWrongValues")
812  << "+++ findQuality: Unexpected CLCT pattern id = "
813  << pattern << "+++\n";
814  }
815  }
816  }
817  }
818  }
819  }
820  return quality;
821 }
822 
823 
825  CSCCLCTDigi secondCLCT,
826  RPCDigi rpcDigi, int roll,
827  CSCCorrelatedLCTDigi& lct1,
828  CSCCorrelatedLCTDigi& lct2)
829 {
830  bool cathodeBestValid = bestCLCT.isValid();
831  bool cathodeSecondValid = secondCLCT.isValid();
832 
833  if (cathodeBestValid and !cathodeSecondValid) secondCLCT = bestCLCT;
834  if (!cathodeBestValid and cathodeSecondValid) bestCLCT = secondCLCT;
835 
836  if ((clct_trig_enable and bestCLCT.isValid()) or
837  (match_trig_enable and bestCLCT.isValid()))
838  {
839  lct1 = constructLCTsRPC(bestCLCT, rpcDigi, roll, useOldLCTDataFormat_);
840  lct1.setTrknmb(1);
841  }
842 
843  if ((clct_trig_enable and secondCLCT.isValid()) or
844  (match_trig_enable and secondCLCT.isValid() and secondCLCT != bestCLCT))
845  {
846  lct2 = constructLCTsRPC(secondCLCT, rpcDigi, roll, useOldLCTDataFormat_);
847  lct2.setTrknmb(2);
848  }
849 }
850 
851 
853  CSCALCTDigi secondALCT,
854  RPCDigi rpcDigi,
855  CSCCorrelatedLCTDigi& lct1,
856  CSCCorrelatedLCTDigi& lct2)
857 {
858  bool anodeBestValid = bestALCT.isValid();
859  bool anodeSecondValid = secondALCT.isValid();
860 
861  if (anodeBestValid and !anodeSecondValid) secondALCT = bestALCT;
862  if (!anodeBestValid and anodeSecondValid) bestALCT = secondALCT;
863 
864  if ((alct_trig_enable and bestALCT.isValid()) or
865  (match_trig_enable and bestALCT.isValid()))
866  {
867  lct1 = constructLCTsRPC(bestALCT, rpcDigi, useOldLCTDataFormat_);
868  lct1.setTrknmb(1);
869  }
870 
871  if ((alct_trig_enable and secondALCT.isValid()) or
872  (match_trig_enable and secondALCT.isValid() and secondALCT != bestALCT))
873  {
874  lct2 = constructLCTsRPC(secondALCT, rpcDigi, useOldLCTDataFormat_);
875  lct2.setTrknmb(2);
876  }
877 }
878 
879 
881  CSCCLCTDigi bestCLCT, CSCCLCTDigi secondCLCT,
883  const RPCDigisBX& digis)
884 {
885  bool anodeBestValid = bestALCT.isValid();
886  bool anodeSecondValid = secondALCT.isValid();
887  bool cathodeBestValid = bestCLCT.isValid();
888  bool cathodeSecondValid = secondCLCT.isValid();
889 
890  if (anodeBestValid and !anodeSecondValid) secondALCT = bestALCT;
891  if (!anodeBestValid and anodeSecondValid) bestALCT = secondALCT;
892  if (cathodeBestValid and !cathodeSecondValid) secondCLCT = bestCLCT;
893  if (!cathodeBestValid and cathodeSecondValid) bestCLCT = secondCLCT;
894 
895  // ALCT-CLCT matching conditions are defined by "trig_enable" configuration
896  // parameters.
897  if ((alct_trig_enable and bestALCT.isValid()) or
898  (clct_trig_enable and bestCLCT.isValid()) or
899  (match_trig_enable and bestALCT.isValid() and bestCLCT.isValid())){
900  lct1 = constructLCTsRPC(bestALCT, bestCLCT, digis);
901  lct1.setTrknmb(1);
902  }
903 
904  if (((secondALCT != bestALCT) or (secondCLCT != bestCLCT)) and
905  ((alct_trig_enable and secondALCT.isValid()) or
906  (clct_trig_enable and secondCLCT.isValid()) or
907  (match_trig_enable and secondALCT.isValid() and secondCLCT.isValid()))){
908  lct2 = constructLCTsRPC(secondALCT, secondCLCT, digis);
909  lct2.setTrknmb(2);
910  }
911 }
912 
914 {
915  // CLCT pattern number
916  unsigned int pattern = encodePattern(cLCT.getPattern(), cLCT.getStripType());
917 
918  // LCT quality number
919  unsigned int quality = findQualityRPC(aLCT, cLCT, digis.size()!=0);
920 
921  // Bunch crossing: get it from cathode LCT if anode LCT is not there.
922  int bx = aLCT.isValid() ? aLCT.getBX() : cLCT.getBX();
923  if (digis.size()!=0) bx = lct_central_bx + digis[0].second.bx(); // fix this!!!
924 
925  // construct correlated LCT; temporarily assign track number of 0.
926  int trknmb = 0;
927  CSCCorrelatedLCTDigi thisLCT(trknmb, 1, quality, aLCT.getKeyWG(),
928  cLCT.getKeyStrip(), pattern, cLCT.getBend(),
929  bx, 0, 0, 0, theTrigChamber);
930  return thisLCT;
931 }
932 
933 
935  const RPCDigi& rpc, int roll,
936  bool oldDataFormat)
937 {
938  if (oldDataFormat){
939  // CLCT pattern number - for the time being, do not include RPCs in the pattern
940  unsigned int pattern = encodePattern(clct.getPattern(), clct.getStripType());
941 
942  // LCT quality number - dummy quality
943  unsigned int quality = promoteCLCTRPCquality_ ? 14 : 11;
944 
945  // Bunch crossing: pick RPC bx
946  int bx = rpc.bx() + lct_central_bx;
947 
948  // pick a random WG in the roll range
949  int wg(4);
950 
951  // construct correlated LCT; temporarily assign track number of 0.
952  return CSCCorrelatedLCTDigi(0, 1, quality, wg, clct.getKeyStrip(), pattern, clct.getBend(), bx, 0, 0, 0, theTrigChamber);
953  }
954  else {
955  // CLCT pattern number - no pattern
956  unsigned int pattern = 0;//encodePatternRPC(clct.getPattern(), clct.getStripType());
957 
958  // LCT quality number - dummy quality
959  unsigned int quality = 5;//findQualityRPC(alct, rpc);
960 
961  // Bunch crossing: get it from cathode LCT if anode LCT is not there.
962  int bx = rpc.bx() + lct_central_bx;;
963 
964  // ALCT WG
965  int wg(0);
966 
967  // construct correlated LCT; temporarily assign track number of 0.
968  return CSCCorrelatedLCTDigi(0, 1, quality, wg, 0, pattern, 0, bx, 0, 0, 0, theTrigChamber);
969  }
970 }
971 
972 
974  const RPCDigi& rpc,
975  bool oldDataFormat)
976 {
977  if (oldDataFormat){
978  // CLCT pattern number - set it to a highest value
979  // hack to get LCTs in the CSCTF
980  unsigned int pattern = promoteALCTRPCpattern_ ? 10 : 0;
981 
982  // LCT quality number - set it to a very high value
983  // hack to get LCTs in the CSCTF
984  unsigned int quality = promoteALCTRPCquality_ ? 14 : 11;
985 
986  // Bunch crossing
987  int bx = rpc.bx() + lct_central_bx;
988 
989  // get keyStrip from LUT
990  int keyStrip = rpcStripToCscHs_[rpc.strip()];
991 
992  // get wiregroup from ALCT
993  int wg = alct.getKeyWG();
994 
995  // construct correlated LCT; temporarily assign track number of 0.
996  return CSCCorrelatedLCTDigi(0, 1, quality, wg, keyStrip, pattern, 0, bx, 0, 0, 0, theTrigChamber);
997  }
998  else {
999  // CLCT pattern number - no pattern
1000  unsigned int pattern = 0;
1001 
1002  // LCT quality number
1003  unsigned int quality = 1;
1004 
1005  // Bunch crossing
1006  int bx = rpc.bx() + lct_central_bx;
1007 
1008  // get keyStrip from LUT
1009  int keyStrip = rpcStripToCscHs_[rpc.strip()];
1010  // get wiregroup from ALCT
1011  int wg = alct.getKeyWG();
1012 
1013  // construct correlated LCT; temporarily assign track number of 0.
1014  return CSCCorrelatedLCTDigi(0, 1, quality, wg, keyStrip, pattern, 0, bx, 0, 0, 0, theTrigChamber);
1015  }
1016 }
1017 
1018 
1019 //readout LCTs
1020 std::vector<CSCCorrelatedLCTDigi> CSCMotherboardME3141RPC::readoutLCTs()
1021 {
1022  return getLCTs();
1023 }
1024 
1025 //getLCTs when we use different sort algorithm
1026 std::vector<CSCCorrelatedLCTDigi> CSCMotherboardME3141RPC::getLCTs()
1027 {
1028  std::vector<CSCCorrelatedLCTDigi> result;
1029  for (int bx = 0; bx < MAX_LCT_BINS; bx++) {
1030  std::vector<CSCCorrelatedLCTDigi> tmpV;
1031  if (tmb_cross_bx_algo == 3) {
1032  tmpV = sortLCTsByQuality(bx);
1033  result.insert(result.end(), tmpV.begin(), tmpV.end());
1034  }
1035  else {
1036  for (unsigned int mbx = 0; mbx < match_trig_window_size; mbx++) {
1037  for (int i=0;i<2;i++) {
1038  if (allLCTs[bx][mbx][i].isValid()) {
1039  result.push_back(allLCTs[bx][mbx][i]);
1040  }
1041  }
1042  }
1043  }
1044  }
1045  return result;
1046 }
1047 
1048 //sort LCTs by Quality in each BX
1049 std::vector<CSCCorrelatedLCTDigi> CSCMotherboardME3141RPC::sortLCTsByQuality(int bx)
1050 {
1051  std::vector<CSCCorrelatedLCTDigi> LCTs;
1052  LCTs.clear();
1053  for (unsigned int mbx = 0; mbx < match_trig_window_size; mbx++)
1054  for (int i=0;i<2;i++)
1055  if (allLCTs[bx][mbx][i].isValid())
1056  LCTs.push_back(allLCTs[bx][mbx][i]);
1057 
1058  // return sorted vector with 2 highest quality LCTs
1059  std::sort(LCTs.begin(), LCTs.end(), CSCMotherboard::sortByQuality);
1060  if (LCTs.size()> max_me3141_lcts) LCTs.erase(LCTs.begin()+max_me3141_lcts, LCTs.end());
1061  return LCTs;
1062 }
#define LogDebug(id)
int getQuality() const
return quality of a pattern (number of layers hit!)
Definition: CSCCLCTDigi.h:33
const unsigned theSector
T getParameter(std::string const &) const
int i
Definition: DBlmapReader.cc:9
static const double lut_wg_me41_eta_odd[96][2]
std::map< int, int > cscWgToRpcRoll_
CSCMotherboardME3141RPC(unsigned endcap, unsigned station, unsigned sector, unsigned subsector, unsigned chamber, const edm::ParameterSet &conf)
std::map< int, int > rpcStripToCscHs_
unsigned int clct_trig_enable
CSCChamber * chamber(unsigned endcap, unsigned station, unsigned sector, unsigned subsector, unsigned tcscid) const
Return the CSCChamber for a corresponding endcap/station/sector/subsector/trigger cscid...
std::vector< CSCCLCTDigi > clctV
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::EventIDconst &, edm::Timestampconst & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
Definition: Activities.doc:12
unsigned int match_trig_window_size
int bx() const
Definition: RPCDigi.h:29
const unsigned theTrigChamber
bool isValid() const
check ALCT validity (1 - valid ALCT)
Definition: CSCALCTDigi.h:30
const unsigned theEndcap
double maxEta
std::vector< CSCCorrelatedLCTDigi > readoutLCTs()
std::vector< CSCCorrelatedLCTDigi > sortLCTsByQuality(int bx)
int getStripType() const
return striptype
Definition: CSCCLCTDigi.h:39
tuple result
Definition: mps_fire.py:84
int getBend() const
return bend
Definition: CSCCLCTDigi.h:42
uint32_t rawId() const
get the raw id
Definition: DetId.h:43
U second(std::pair< T, U > const &p)
const RPCChamber * chamber(RPCDetId id) const
Definition: RPCGeometry.cc:71
void printRPCTriggerDigis(int minBX, int maxBx)
int strip() const
Definition: RPCDigi.h:28
const unsigned theStation
static CSCTriggerGeomManager * get()
std::map< int, std::pair< double, double > > createRPCRollLUT(RPCDetId id)
tuple quality
[pTError/pT]*max(1,normChi2) &lt;= ptErrorCut
std::map< int, std::pair< int, int > > cscHsToRpcStrip_
const unsigned theSubsector
int getBX() const
return BX
Definition: CSCCLCTDigi.h:51
static const double lut_wg_me41_eta_even[96][2]
unsigned int encodePattern(const int ptn, const int highPt)
static const double lut_pt_vs_dphi_rpccsc_me41[8][3]
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
bool isValid() const
check CLCT validity (1 - valid CLCT)
Definition: CSCCLCTDigi.h:30
unsigned int match_trig_enable
static const double lut_wg_me31_eta_odd[96][2]
static int triggerCscIdFromLabels(int station, int ring, int chamber)
static const double lut_pt_vs_dphi_rpccsc_me31[8][3]
int getBX() const
return BX - five low bits of BXN counter tagged by the ALCT
Definition: CSCALCTDigi.h:48
std::map< int, std::pair< double, double > > rpcRollToEtaLimits_
int getQuality() const
return quality of a pattern
Definition: CSCALCTDigi.h:33
#define debug
Definition: HDRShower.cc:19
CSCCorrelatedLCTDigi allLCTs[MAX_LCT_BINS][15][2]
int getAccelerator() const
Definition: CSCALCTDigi.h:37
static int triggerSectorFromLabels(int station, int ring, int chamber)
int getPattern() const
return pattern
Definition: CSCCLCTDigi.h:36
RPCDigisBX matchingRPCDigis(const CSCCLCTDigi &cLCT, const RPCDigisBX &digis=RPCDigisBX(), bool first=true)
unsigned int alct_trig_enable
std::vector< RPCDigiBX > RPCDigisBX
std::unique_ptr< CSCAnodeLCTProcessor > alct
void correlateLCTsRPC(CSCALCTDigi bestALCT, CSCALCTDigi secondALCT, CSCCLCTDigi bestCLCT, CSCCLCTDigi secondCLCT, CSCCorrelatedLCTDigi &lct1, CSCCorrelatedLCTDigi &lct2, const RPCDigisBX &digis=RPCDigisBX())
std::unique_ptr< CSCCathodeLCTProcessor > clct
std::vector< CSCALCTDigi > alctV
tuple cout
Definition: gather_cfg.py:145
int getKeyStrip() const
Definition: CSCCLCTDigi.h:65
std::vector< CSCCorrelatedLCTDigi > getLCTs()
void setTrknmb(const uint16_t number)
Set track number (1,2) after sorting LCTs.
void run(const CSCWireDigiCollection *wiredc, const CSCComparatorDigiCollection *compdc, const RPCDigiCollection *rpcDigis)
void retrieveRPCDigis(const RPCDigiCollection *digis, unsigned id)
unsigned int findQualityRPC(const CSCALCTDigi &aLCT, const CSCCLCTDigi &cLCT, bool hasRPC)
int getKeyWG() const
return key wire group
Definition: CSCALCTDigi.h:45
CSCCorrelatedLCTDigi constructLCTsRPC(const CSCALCTDigi &alct, const CSCCLCTDigi &clct, const RPCDigisBX &digis=RPCDigisBX())
static bool sortByQuality(const CSCCorrelatedLCTDigi &, const CSCCorrelatedLCTDigi &)
static const double lut_wg_me31_eta_even[96][2]