CMS 3D CMS Logo

CSCTriggerPrimitivesBuilder.cc
Go to the documentation of this file.
1 #include <memory>
2 
8 
19 
21  // special configuration parameters for ME11 treatment
22  edm::ParameterSet commonParams = conf.getParameter<edm::ParameterSet>("commonParam");
23  runPhase2_ = commonParams.getParameter<bool>("runPhase2");
24  infoV = commonParams.getParameter<int>("verbosity");
25  disableME42_ = commonParams.getParameter<bool>("disableME42");
26 
27  checkBadChambers_ = conf.getParameter<bool>("checkBadChambers");
28  selectedChambers_ = conf.getParameter<std::vector<std::string>>("selectedChambers");
29 
30  runME11Up_ = commonParams.getParameter<bool>("runME11Up");
31  runME21Up_ = commonParams.getParameter<bool>("runME21Up");
32 
33  runME11ILT_ = commonParams.getParameter<bool>("runME11ILT");
34  runME21ILT_ = commonParams.getParameter<bool>("runME21ILT");
35 
36  // Initializing boards.
37  CSCBaseboard::Parameters baseparams(conf);
38  for (int endc = min_endcap; endc <= max_endcap; endc++) {
39  for (int stat = min_station; stat <= max_station; stat++) {
40  int numsubs = ((stat == 1) ? max_subsector : 1);
41  for (int sect = min_sector; sect <= max_sector; sect++) {
42  for (int subs = min_subsector; subs <= numsubs; subs++) {
43  for (int cham = min_chamber; cham <= max_chamber; cham++) {
44  if ((endc <= 0 || endc > MAX_ENDCAPS) || (stat <= 0 || stat > MAX_STATIONS) ||
45  (sect <= 0 || sect > MAX_SECTORS) || (subs <= 0 || subs > MAX_SUBSECTORS) ||
46  (cham <= 0 || cham > MAX_CHAMBERS)) {
47  edm::LogError("CSCTriggerPrimitivesBuilder|SetupError")
48  << "+++ trying to instantiate TMB of illegal CSC id ["
49  << " endcap = " << endc << " station = " << stat << " sector = " << sect << " subsector = " << subs
50  << " chamber = " << cham << "]; skipping it... +++\n";
51  continue;
52  }
54  // When the motherboard is instantiated, it instantiates ALCT
55  // and CLCT processors.
56 
57  const bool upgrade = runPhase2_ and ring == 1;
58  const bool upgradeGE11 = upgrade and stat == 1 and runME11Up_ and runME11ILT_;
59  const bool upgradeGE21 = upgrade and stat == 2 and runME21Up_ and runME21ILT_;
60 
61  // GE1/1-ME1/1 integrated local trigger or GE2/1-ME2/1 integrated local trigger
62  if (upgradeGE11 or upgradeGE21)
63  tmb_[endc - 1][stat - 1][sect - 1][subs - 1][cham - 1] =
64  std::make_unique<CSCGEMMotherboard>(endc, stat, sect, subs, cham, baseparams);
65  // default case
66  else
67  tmb_[endc - 1][stat - 1][sect - 1][subs - 1][cham - 1] =
68  std::make_unique<CSCMotherboard>(endc, stat, sect, subs, cham, baseparams);
69  }
70  }
71  // Init MPC
72  mpc_[endc - 1][stat - 1][sect - 1] = std::make_unique<CSCMuonPortCard>(endc, stat, sect, conf);
73  }
74  }
75  }
76 }
77 
78 //------------
79 // Destructor
80 //------------
82 
84  // Receives CSCDBL1TPParameters percolated down from ESProducer.
85 
86  for (int endc = min_endcap; endc <= max_endcap; endc++) {
87  for (int stat = min_station; stat <= max_station; stat++) {
88  int numsubs = ((stat == 1) ? max_subsector : 1);
89  for (int sect = min_sector; sect <= max_sector; sect++) {
90  for (int subs = min_subsector; subs <= numsubs; subs++) {
91  for (int cham = min_chamber; cham <= max_chamber; cham++) {
92  tmb_[endc - 1][stat - 1][sect - 1][subs - 1][cham - 1]->setConfigParameters(conf);
93  }
94  }
95  }
96  }
97  }
98 }
99 
101  // Receives CSCL1TPLookupTableCCLUT percolated down from ESProducer.
102  for (int endc = min_endcap; endc <= max_endcap; endc++) {
103  for (int stat = min_station; stat <= max_station; stat++) {
104  int numsubs = ((stat == 1) ? max_subsector : 1);
105  for (int sect = min_sector; sect <= max_sector; sect++) {
106  for (int subs = min_subsector; subs <= numsubs; subs++) {
107  for (int cham = min_chamber; cham <= max_chamber; cham++) {
108  tmb_[endc - 1][stat - 1][sect - 1][subs - 1][cham - 1]->setESLookupTables(conf);
109  }
110  }
111  }
112  }
113  }
114 }
115 
117  for (int endc = min_endcap; endc <= max_endcap; endc++) {
118  for (int stat = min_station; stat <= max_station; stat++) {
119  int numsubs = ((stat == 1) ? max_subsector : 1);
120  for (int sect = min_sector; sect <= max_sector; sect++) {
121  for (int subs = min_subsector; subs <= numsubs; subs++) {
122  for (int cham = min_chamber; cham <= max_chamber; cham++) {
123  if (tmb_[endc - 1][stat - 1][sect - 1][subs - 1][cham - 1]->id().isME11())
124  tmb_[endc - 1][stat - 1][sect - 1][subs - 1][cham - 1]->setESLookupTables(conf);
125  }
126  }
127  }
128  }
129  }
130 }
131 
133  for (int endc = min_endcap; endc <= max_endcap; endc++) {
134  for (int stat = min_station; stat <= max_station; stat++) {
135  int numsubs = ((stat == 1) ? max_subsector : 1);
136  for (int sect = min_sector; sect <= max_sector; sect++) {
137  for (int subs = min_subsector; subs <= numsubs; subs++) {
138  for (int cham = min_chamber; cham <= max_chamber; cham++) {
139  if (tmb_[endc - 1][stat - 1][sect - 1][subs - 1][cham - 1]->id().isME21())
140  tmb_[endc - 1][stat - 1][sect - 1][subs - 1][cham - 1]->setESLookupTables(conf);
141  }
142  }
143  }
144  }
145  }
146 }
147 
149  const CSCWireDigiCollection* wiredc,
150  const CSCComparatorDigiCollection* compdc,
151  const GEMPadDigiClusterCollection* gemClusters,
152  CSCALCTDigiCollection& oc_alct,
153  CSCCLCTDigiCollection& oc_clct,
154  CSCALCTPreTriggerDigiCollection& oc_alctpretrigger,
155  CSCCLCTPreTriggerDigiCollection& oc_pretrigger,
156  CSCCLCTPreTriggerCollection& oc_pretrig,
158  CSCCorrelatedLCTDigiCollection& oc_sorted_lct,
159  CSCShowerDigiCollection& oc_shower_anode,
160  CSCShowerDigiCollection& oc_shower_cathode,
161  CSCShowerDigiCollection& oc_shower,
162  GEMCoPadDigiCollection& oc_gemcopad) {
163  // CSC geometry.
164  for (int endc = min_endcap; endc <= max_endcap; endc++) {
165  for (int stat = min_station; stat <= max_station; stat++) {
166  int numsubs = ((stat == 1) ? max_subsector : 1);
167  for (int sect = min_sector; sect <= max_sector; sect++) {
168  for (int subs = min_subsector; subs <= numsubs; subs++) {
169  for (int cham = min_chamber; cham <= max_chamber; cham++) {
170  // extract the ring number
172 
173  // case when you want to ignore ME42
174  if (disableME42_ && stat == 4 && ring == 2)
175  continue;
176 
177  CSCMotherboard* tmb = tmb_[endc - 1][stat - 1][sect - 1][subs - 1][cham - 1].get();
178 
179  tmb->setCSCGeometry(csc_g);
180 
181  // actual chamber number =/= trigger chamber number
183 
184  // 0th layer means whole chamber.
185  CSCDetId detid(endc, stat, ring, chid, 0);
186 
187  // Run processors only if chamber exists in geometry.
188  if (tmb == nullptr || csc_g->chamber(detid) == nullptr)
189  continue;
190 
191  // Skip chambers marked as bad (usually includes most of ME4/2 chambers;
192  // also, there's no ME1/a-1/b separation, it's whole ME1/1)
193  if (checkBadChambers_ && badChambers->isInBadChamber(detid))
194  continue;
195 
196  //only process the selected chambers when selectedChambers is not empty
197  if (!selectedChambers_.empty()) {
198  if (std::find(selectedChambers_.begin(), selectedChambers_.end(), detid.chamberName()) ==
199  selectedChambers_.end()) {
200  continue;
201  }
202  }
203  const bool upgrade = runPhase2_ and ring == 1;
204  const bool upgradeGE11 = upgrade and stat == 1 and runME11Up_ and runME11ILT_;
205  const bool upgradeGE21 = upgrade and stat == 2 and runME21Up_ and runME21ILT_;
206 
207  // GE1/1-ME1/1 integrated local trigger or GE2/1-ME2/1 integrated local trigger
208  if (upgradeGE11 or upgradeGE21) {
209  // run the TMB
210  CSCGEMMotherboard* tmbGEM = static_cast<CSCGEMMotherboard*>(tmb);
211  tmbGEM->setGEMGeometry(gem_g);
212  tmbGEM->setCSCGeometry(csc_g);
213  tmbGEM->run(wiredc, compdc, gemClusters);
214 
215  // 0th layer means whole chamber.
216  GEMDetId gemId(detid.zendcap(), 1, stat, 0, chid, 0);
217  const std::vector<GEMCoPadDigi>& copads = tmbGEM->clusterProc()->readoutCoPads();
218  put(copads, oc_gemcopad, gemId, " GEM coincidence pad");
219  }
220  // default case: regular TMBs and OTMBs without GEMs
221  else {
222  // run the TMB
223  tmb->run(wiredc, compdc);
224  }
225 
226  // get the collections
227 
228  // trigger primitives
229  const std::vector<CSCALCTDigi>& alctV = tmb->alctProc->readoutALCTs();
230  const std::vector<CSCCLCTDigi>& clctV = tmb->clctProc->readoutCLCTs();
231  const std::vector<CSCCorrelatedLCTDigi>& lctV = tmb->readoutLCTs();
232 
233  // pre-triggers
234  const std::vector<int>& preTriggerBXs = tmb->clctProc->preTriggerBXs();
235  const std::vector<CSCCLCTPreTriggerDigi>& pretriggerV = tmb->clctProc->preTriggerDigis();
236  const std::vector<CSCALCTPreTriggerDigi>& alctpretriggerV = tmb->alctProc->preTriggerDigis();
237 
238  // showers
239  const std::vector<CSCShowerDigi>& shower = tmb->readoutShower();
240  const std::vector<CSCShowerDigi>& anodeShower = tmb->alctProc->readoutShower();
241  const std::vector<CSCShowerDigi>& cathodeShower = tmb->clctProc->readoutShower();
242 
243  put(alctV, oc_alct, detid, tmb->getCSCName() + " ALCT digi");
244  put(clctV, oc_clct, detid, tmb->getCSCName() + " CLCT digi");
245  put(lctV, oc_lct, detid, tmb->getCSCName() + " LCT digi");
246 
247  put(preTriggerBXs, oc_pretrig, detid, tmb->getCSCName() + " CLCT pre-trigger BX");
248  put(pretriggerV, oc_pretrigger, detid, tmb->getCSCName() + " CLCT pre-trigger digi");
249  put(alctpretriggerV, oc_alctpretrigger, detid, tmb->getCSCName() + " ALCT pre-trigger digi");
250 
251  put(shower, oc_shower, detid, tmb->getCSCName() + "TMB shower");
252  put(anodeShower, oc_shower_anode, detid, tmb->getCSCName() + "Anode shower");
253  put(cathodeShower, oc_shower_cathode, detid, tmb->getCSCName() + "Cathode shower");
254  //if (shower.isValid())
255  // oc_shower.insertDigi(detid, shower);
256  //if (anodeShower.isValid())
257  // oc_shower_anode.insertDigi(detid, anodeShower);
258  //if (cathodeShower.isValid())
259  // oc_shower_cathode.insertDigi(detid, cathodeShower);
260 
261  if (!(alctV.empty() && clctV.empty() && lctV.empty()) and infoV > 1) {
262  LogTrace("L1CSCTrigger") << "CSCTriggerPrimitivesBuilder got results in " << detid;
263  }
264  } // end loop on cham
265  } // end loop on subs
266  } // end loop on sect
267  } // end loop on stat
268  } // end loop on endc
269 
270  // run MPC simulation
271  // there are 2 x 4 x 6 MPC VME cards
272  for (int endc = min_endcap; endc <= max_endcap; endc++) {
273  for (int stat = min_station; stat <= max_station; stat++) {
274  for (int sect = min_sector; sect <= max_sector; sect++) {
275  auto mpc = mpc_[endc - 1][stat - 1][sect - 1].get();
276 
277  // load the LCTs relevant for this MPC
278  mpc->loadLCTs(oc_lct);
279 
280  // sort and select the LCTs (if applicable)
281  mpc->sortLCTs();
282 
283  // get sorted+selected LCTs
284  const auto& result = mpc->getLCTs();
285 
286  // now convert csctf::TrackStub back into CSCCorrelatedLCTDigi
287  // put MPC stubs into the event
288  for (const auto& lct : result) {
289  oc_sorted_lct.insertDigi(CSCDetId(lct.getDetId().rawId()), *(lct.getDigi()));
290  if (infoV > 1)
291  LogDebug("CSCTriggerPrimitivesBuilder")
292  << "MPC " << *(lct.getDigi()) << " found in ME" << ((lct.endcap() == 1) ? "+" : "-") << lct.station()
293  << "/" << CSCDetId(lct.getDetId().rawId()).ring() << "/" << CSCDetId(lct.getDetId().rawId()).chamber()
294  << " (sector " << lct.sector() << " trig id. " << lct.cscid() << ")"
295  << "\n";
296  }
297  }
298  }
299  }
300 }
void build(const CSCBadChambers *badChambers, const CSCWireDigiCollection *wiredc, const CSCComparatorDigiCollection *compdc, const GEMPadDigiClusterCollection *gemPadClusters, CSCALCTDigiCollection &oc_alct, CSCCLCTDigiCollection &oc_clct, CSCALCTPreTriggerDigiCollection &oc_alctpretrigger, CSCCLCTPreTriggerDigiCollection &oc_clctpretrigger, CSCCLCTPreTriggerCollection &oc_pretrig, CSCCorrelatedLCTDigiCollection &oc_lct, CSCCorrelatedLCTDigiCollection &oc_sorted_lct, CSCShowerDigiCollection &oc_shower_anode, CSCShowerDigiCollection &oc_shower_cathode, CSCShowerDigiCollection &oc_shower, GEMCoPadDigiCollection &oc_gemcopad)
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
virtual std::vector< CSCCorrelatedLCTDigi > readoutLCTs() const
std::unique_ptr< CSCMotherboard > tmb_[MAX_ENDCAPS][MAX_STATIONS][MAX_SECTORS][MAX_SUBSECTORS][MAX_CHAMBERS]
short int zendcap() const
Definition: CSCDetId.h:91
const CSCChamber * chamber(CSCDetId id) const
Return the chamber corresponding to given DetId.
Definition: CSCGeometry.cc:100
static int minEndcapId()
Definition: CSCDetId.h:234
static std::string chamberName(int endcap, int station, int ring, int chamber)
Definition: CSCDetId.cc:74
void setGEMGeometry(const GEMGeometry *g)
static int maxTriggerSectorId()
std::unique_ptr< CSCMuonPortCard > mpc_[MAX_ENDCAPS][MAX_STATIONS][MAX_SECTORS]
anodeShower
settings for anode showers (counting CSCWireDigi)
Definition: showerParams.py:71
std::unique_ptr< CSCCathodeLCTProcessor > clctProc
std::vector< std::string > selectedChambers_
Log< level::Error, false > LogError
static int maxStationId()
Definition: CSCDetId.h:237
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
static int minTriggerSectorId()
static int ringFromTriggerLabels(int station, int triggerCSCID)
#define LogTrace(id)
void setConfigParameters(const CSCDBL1TPParameters *conf)
CSCTriggerPrimitivesBuilder(const edm::ParameterSet &)
std::string getCSCName() const
Definition: CSCBaseboard.h:63
static int minStationId()
Definition: CSCDetId.h:236
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
static int maxEndcapId()
Definition: CSCDetId.h:235
void setESLookupTables(const CSCL1TPLookupTableCCLUT *conf)
void run(const CSCWireDigiCollection *wiredc, const CSCComparatorDigiCollection *compdc)
static int minTriggerSubSectorId()
void put(const T &, S &, const CSCDetId &, std::string comment)
bool isInBadChamber(IndexType ichamber) const
Is the chamber with index &#39;ichamber&#39; flagged as bad?
void run(const CSCWireDigiCollection *wiredc, const CSCComparatorDigiCollection *compdc, const GEMPadDigiClusterCollection *gemPads)
bool checkBadChambers_
a flag whether to skip chambers from the bad chambers map
std::unique_ptr< CSCAnodeLCTProcessor > alctProc
void setCSCGeometry(const CSCGeometry *g)
cathodeShower
settings for cathode showers (counting CSCComparatorDigi)
Definition: showerParams.py:38
std::vector< CSCShowerDigi > readoutShower() const
static int chamberFromTriggerLabels(int TriggerSector, int TriggerSubSector, int station, int TriggerCSCID)
static int maxTriggerSubSectorId()
std::shared_ptr< GEMClusterProcessor > clusterProc() const
#define LogDebug(id)
A container for a generic type of digis indexed by some index, implemented with a map<IndexType...