11 minBXCLCT_ =
cscCLCT.getParameter<
int>(
"minBX");
12 maxBXCLCT_ =
cscCLCT.getParameter<
int>(
"maxBX");
13 verboseCLCT_ =
cscCLCT.getParameter<
int>(
"verbose");
14 minNHitsChamberCLCT_ =
cscCLCT.getParameter<
int>(
"minNHitsChamber");
17 minBXALCT_ =
cscALCT.getParameter<
int>(
"minBX");
18 maxBXALCT_ =
cscALCT.getParameter<
int>(
"maxBX");
19 verboseALCT_ =
cscALCT.getParameter<
int>(
"verbose");
20 minNHitsChamberALCT_ =
cscALCT.getParameter<
int>(
"minNHitsChamber");
23 minBXLCT_ =
cscLCT.getParameter<
int>(
"minBX");
24 maxBXLCT_ =
cscLCT.getParameter<
int>(
"maxBX");
25 verboseLCT_ =
cscLCT.getParameter<
int>(
"verbose");
26 minNHitsChamberLCT_ =
cscLCT.getParameter<
int>(
"minNHitsChamber");
27 addGhostLCTs_ =
cscLCT.getParameter<
bool>(
"addGhosts");
30 minBXMPLCT_ =
cscMPLCT.getParameter<
int>(
"minBX");
31 maxBXMPLCT_ =
cscMPLCT.getParameter<
int>(
"maxBX");
32 verboseMPLCT_ =
cscMPLCT.getParameter<
int>(
"verbose");
33 minNHitsChamberMPLCT_ =
cscMPLCT.getParameter<
int>(
"minNHitsChamber");
54 gemDigiMatcher_->init(
iEvent, iSetup);
55 cscDigiMatcher_->init(
iEvent, iSetup);
57 iEvent.getByToken(clctToken_, clctsH_);
58 iEvent.getByToken(alctToken_, alctsH_);
59 iEvent.getByToken(lctToken_, lctsH_);
60 iEvent.getByToken(mplctToken_, mplctsH_);
62 cscGeometry_ = &iSetup.
getData(geomToken_);
69 gemDigiMatcher_->match(
t,
v);
70 cscDigiMatcher_->match(
t,
v);
80 if (!alctsH_.isValid()) {
81 edm::LogError(
"CSCStubMatcher") <<
"Cannot get ALCTs with label " << alctInputTag_.encode();
83 matchALCTsToSimTrack(alcts);
86 if (!clctsH_.isValid()) {
87 edm::LogError(
"CSCStubMatcher") <<
"Cannot get CLCTs with label " << clctInputTag_.encode();
89 matchCLCTsToSimTrack(clcts);
92 if (!lctsH_.isValid()) {
93 edm::LogError(
"CSCStubMatcher") <<
"Cannot get LCTs with label " << lctInputTag_.encode();
95 matchLCTsToSimTrack(lcts);
98 if (!mplctsH_.isValid()) {
99 edm::LogError(
"CSCStubMatcher") <<
"Cannot get MPLCTs with label " << mplctInputTag_.encode();
101 matchMPLCTsToSimTrack(mplcts);
106 const auto& cathode_ids = cscDigiMatcher_->chamberIdsStrip(0);
108 for (
const auto&
id : cathode_ids) {
111 edm::LogInfo(
"CSCStubMatcher") <<
"To check CSC chamber " << ch_id;
117 if (cscDigiMatcher_->nLayersWithStripInChamber(ch_id) < minNHitsChamberCLCT_)
121 std::vector<CSCComparatorDigiContainer> comps;
124 comps.push_back(cscDigiMatcher_->comparatorDigisInDetId(layerid));
129 edm::LogInfo(
"CSCStubMatcher") <<
"clct: comparators " << ch_id;
131 for (
const auto&
p : comps) {
133 for (
const auto&
q :
p) {
134 edm::LogInfo(
"CSCStubMatcher") <<
"L" <<
layer <<
" " <<
q <<
" " <<
q.getHalfStrip() <<
" ";
140 const bool isME1a(ch_id.
station() == 1 and ch_id.
ring() == 4);
144 auto id2 = ch_id2.rawId();
146 const auto& clcts_in_det = clcts.get(ch_id2);
148 for (
auto c = clcts_in_det.first;
c != clcts_in_det.second; ++
c) {
150 edm::LogInfo(
"CSCStubMatcher") <<
"clct " << ch_id2 <<
" " << *
c;
156 if (
c->getBX() < minBXCLCT_ ||
c->getBX() > maxBXCLCT_)
160 chamber_to_clcts_all_[
id2].push_back(*
c);
165 for (
const auto&
p : comps) {
167 for (
const auto&
q :
p) {
169 edm::LogInfo(
"CSCStubMatcher") <<
"L" <<
layer <<
" " <<
q <<
" " <<
q.getHalfStrip() <<
" " << std::endl;
170 for (
const auto& clctComp : (*c).getHits()[
layer - 1]) {
171 if (clctComp == 65535)
174 edm::LogInfo(
"CSCStubMatcher") <<
"\t" << clctComp <<
" ";
176 if (
q.getHalfStrip() == clctComp
or (isME1a and
q.getHalfStrip() + 128 == clctComp)) {
179 edm::LogInfo(
"CSCStubMatcher") <<
"\t\tnMatches " << nMatches << std::endl;
195 chamber_to_clcts_[
id2].push_back(*
c);
198 if (chamber_to_clcts_[
id2].
size() > 2) {
199 edm::LogInfo(
"CSCStubMatcher") <<
"WARNING!!! too many CLCTs " << chamber_to_clcts_[
id2].size() <<
" in " 201 for (
auto&
c : chamber_to_clcts_[
id2])
208 const auto& anode_ids = cscDigiMatcher_->chamberIdsWire(0);
210 for (
const auto&
id : anode_ids) {
211 if (cscDigiMatcher_->nLayersWithWireInChamber(
id) >= minNHitsChamberALCT_)
216 const auto& digi_wgs = cscDigiMatcher_->wiregroupsInChamber(
id, 1);
218 cout <<
"alct: digi_wgs " << ch_id <<
" ";
219 copy(digi_wgs.begin(), digi_wgs.end(), ostream_iterator<int>(
cout,
" "));
227 auto id2 = ch_id2.rawId();
229 const auto& alcts_in_det = alcts.get(ch_id2);
230 for (
auto a = alcts_in_det.first;
a != alcts_in_det.second; ++
a) {
235 edm::LogInfo(
"CSCStubMatcher") <<
"alct " << ch_id <<
" " << *
a;
238 if (
a->getBX() < minBXALCT_ ||
a->getBX() > maxBXALCT_)
241 int wg =
a->getKeyWG() + 1;
244 chamber_to_alcts_all_[
id2].push_back(*
a);
247 if (digi_wgs.find(wg) == digi_wgs.end()) {
255 chamber_to_alcts_[
id2].push_back(*
a);
258 if (chamber_to_alcts_[
id2].
size() > 2) {
259 edm::LogInfo(
"CSCStubMatcher") <<
"WARNING!!! too many ALCTs " << chamber_to_alcts_[
id2].size() <<
" in " 261 for (
auto&
a : chamber_to_alcts_[
id2])
269 const auto& cathode_ids = chamberIdsAllCLCT(0);
270 const auto& anode_ids = chamberIdsAllALCT(0);
272 std::set<int> cathode_and_anode_ids;
273 std::set_union(cathode_ids.begin(),
277 std::inserter(cathode_and_anode_ids, cathode_and_anode_ids.end()));
279 for (
const auto&
id : cathode_and_anode_ids) {
289 auto id2 = ch_id2.rawId();
291 const auto& lcts_in_det = lcts.get(ch_id2);
293 std::map<int, CSCCorrelatedLCTDigiContainer> bx_to_lcts;
297 for (
auto lct = lcts_in_det.first; lct != lcts_in_det.second; ++lct) {
300 lcts_tmp.push_back(*lct);
301 int bx = lct->getBX();
302 bx_to_lcts[
bx].push_back(*lct);
306 if (bx_to_lcts[
bx].
size() == 2 and addGhostLCTs_) {
307 auto lct11 = bx_to_lcts[
bx][0];
308 auto lct22 = bx_to_lcts[
bx][1];
309 addGhostLCTs(lct11, lct22, lcts_tmp);
313 for (
const auto& lct : lcts_tmp) {
316 bool lct_clct_match(
false);
317 bool lct_alct_match(
false);
318 bool lct_gem1_match(
false);
319 bool lct_gem2_match(
false);
322 edm::LogInfo(
"CSCStubMatcher") << ch_id <<
" " << ch_id2;
324 edm::LogInfo(
"CSCStubMatcher") <<
"getCLCT " << lct.getCLCT() <<
"\ngetALCT " << lct.getALCT() <<
"\ngetGEM1 " 325 << lct.getGEM1() <<
"\ngetGEM2 " << lct.getGEM2();
328 for (
const auto&
p : clctsInChamber(
id)) {
329 if (
p == lct.getCLCT()) {
330 lct_clct_match =
true;
332 edm::LogInfo(
"CSCStubMatcher") <<
"\t...lct_clct_match";
338 for (
const auto&
p : alctsInChamber(
id)) {
339 if (
p == lct.getALCT()) {
340 lct_alct_match =
true;
342 edm::LogInfo(
"CSCStubMatcher") <<
"\t...lct_alct_match";
352 for (
const auto&
p : gemDigiMatcher_->padsInChamber(gemDetIdL1.rawId())) {
353 if (
p == lct.getGEM1()) {
354 lct_gem1_match =
true;
356 edm::LogInfo(
"CSCStubMatcher") <<
"\t...lct_gem1_match";
363 for (
const auto&
p : gemDigiMatcher_->padsInChamber(gemDetIdL2.rawId())) {
364 if (
p == lct.getGEM2()) {
365 lct_gem2_match =
true;
367 edm::LogInfo(
"CSCStubMatcher") <<
"\t...lct_gem2_match";
374 const bool alct_clct = lct_clct_match and lct_alct_match;
375 const bool alct_gem = lct_alct_match and lct_gem1_match and lct_gem2_match;
376 const bool clct_gem = lct_clct_match and lct_gem1_match and lct_gem2_match;
378 bool lct_tight_matched = alct_clct
or alct_gem
or clct_gem;
379 bool lct_loose_matched = lct_clct_match
or lct_alct_match;
380 bool lct_matched = lct_loose_matched
or lct_tight_matched;
386 chamber_to_lcts_[
id2].emplace_back(lct);
396 const auto& lcts_ids = chamberIdsLCT(0);
399 for (
const auto&
id : lcts_ids) {
400 const auto& mplcts_in_det = mplcts.get(
id);
403 for (
auto lct = mplcts_in_det.first; lct != mplcts_in_det.second; ++lct) {
407 chamber_to_mplcts_all_[
id].emplace_back(*lct);
410 for (
const auto& sim_stub : lctsInChamber(
id)) {
411 if (sim_stub == *lct) {
412 if (
std::find(chamber_to_mplcts_[
id].begin(), chamber_to_mplcts_[
id].
end(), *lct) ==
413 chamber_to_mplcts_[
id].
end()) {
414 chamber_to_mplcts_[
id].emplace_back(*lct);
423 return selectDetIds(chamber_to_clcts_all_, csc_type);
427 return selectDetIds(chamber_to_alcts_all_, csc_type);
431 return selectDetIds(chamber_to_lcts_all_, csc_type);
435 return selectDetIds(chamber_to_mplcts_all_, csc_type);
439 return selectDetIds(chamber_to_clcts_, csc_type);
443 return selectDetIds(chamber_to_alcts_, csc_type);
447 return selectDetIds(chamber_to_lcts_, csc_type);
451 return selectDetIds(chamber_to_mplcts_, csc_type);
455 if (chamber_to_clcts_all_.find(detid) == chamber_to_clcts_all_.end())
457 return chamber_to_clcts_all_.at(detid);
461 if (chamber_to_alcts_all_.find(detid) == chamber_to_alcts_all_.end())
463 return chamber_to_alcts_all_.at(detid);
467 if (chamber_to_lcts_all_.find(detid) == chamber_to_lcts_all_.end())
469 return chamber_to_lcts_all_.at(detid);
473 if (chamber_to_mplcts_all_.find(detid) == chamber_to_mplcts_all_.end())
475 return chamber_to_mplcts_all_.at(detid);
479 if (chamber_to_clcts_.find(detid) == chamber_to_clcts_.end())
481 return chamber_to_clcts_.at(detid);
485 if (chamber_to_alcts_.find(detid) == chamber_to_alcts_.end())
487 return chamber_to_alcts_.at(detid);
491 if (chamber_to_lcts_.find(detid) == chamber_to_lcts_.end())
493 return chamber_to_lcts_.at(detid);
497 if (chamber_to_mplcts_.find(detid) == chamber_to_mplcts_.end())
499 return chamber_to_mplcts_.at(detid);
504 const auto&
input(clctsInChamber(detid));
507 for (
unsigned int i = 0;
i <
input.size(); ++
i) {
521 const auto&
input(alctsInChamber(detid));
524 for (
unsigned int i = 0;
i <
input.size(); ++
i) {
538 const auto&
input(lctsInChamber(detid));
541 for (
unsigned int i = 0;
i <
input.size(); ++
i) {
555 const auto&
chamber(cscGeometry_->chamber(
id));
556 return fabs(
chamber->layer(
layer)->centerOfStrip(20).z());
561 const auto& chamber_ids = chamberIdsCLCT();
562 for (
const auto&
id : chamber_ids) {
563 int nStubChamber = 0;
564 const auto& clcts = clctsInChamber(
id);
565 for (
const auto& clct : clcts) {
568 if (clct.getQuality() >= min_quality) {
572 if (nStubChamber > 0) {
581 const auto& chamber_ids = chamberIdsALCT();
582 for (
const auto&
id : chamber_ids) {
583 int nStubChamber = 0;
584 const auto& alcts = alctsInChamber(
id);
585 for (
const auto& alct : alcts) {
588 if (alct.getQuality() >= min_quality) {
592 if (nStubChamber > 0) {
601 const auto& chamber_ids = chamberIdsLCT();
602 for (
const auto&
id : chamber_ids) {
603 int nStubChamber = 0;
604 const auto& lcts = lctsInChamber(
id);
605 for (
const auto& lct : lcts) {
608 if (lct.getQuality() >= min_quality) {
612 if (nStubChamber > 0) {
621 const auto& chamber_ids = chamberIdsMPLCT();
622 for (
const auto&
id : chamber_ids) {
623 int nStubChamber = 0;
624 const auto& mplcts = mplctsInChamber(
id);
625 for (
const auto& mplct : mplcts) {
626 if (!mplct.isValid())
628 if (mplct.getQuality() >= min_quality) {
632 if (nStubChamber > 0) {
640 for (
const auto& stub : lctsInChamber(
id.rawId())) {
652 if (cscId.
station() == 1 and (cscId.
ring() == 4 || cscId.
ring() == 1)) {
662 const auto&
chamber = cscGeometry_->chamber(cscId);
665 float wire = layer_geo->middleWireOfGroup(lct.
getKeyWG() + 1);
666 const LocalPoint& csc_intersect = layer_geo->intersectionOfStripAndWire(fractional_strip, wire);
667 const GlobalPoint& csc_gp = cscGeometry_->idToDet(keyId)->surface().toGlobal(csc_intersect);
672 chamber_to_clcts_all_.clear();
673 chamber_to_alcts_all_.clear();
674 chamber_to_lcts_all_.clear();
675 chamber_to_mplcts_all_.clear();
677 chamber_to_clcts_.clear();
678 chamber_to_alcts_.clear();
679 chamber_to_lcts_.clear();
680 chamber_to_mplcts_.clear();
691 if (!(wg1 == wg2 || hs1 == hs2)) {
697 lcts_tmp.push_back(lct12);
703 lcts_tmp.push_back(lct21);
std::set< unsigned int > chamberIdsAllALCT(int csc_type=MuonHitHelper::CSC_ALL) const
std::vector< CSCCLCTDigi > CSCCLCTDigiContainer
T getParameter(std::string const &) const
const CSCCLCTDigiContainer & allCLCTsInChamber(unsigned int) const
all stubs (not necessarily matching) from a particular crossed chamber
int nChambersWithALCT(int min_quality=0) const
short int zendcap() const
bool lctInChamber(const CSCDetId &id, const CSCCorrelatedLCTDigi &lct) const
int nChambersWithLCT(int min_quality=0) const
std::set< unsigned int > chamberIdsMPLCT(int csc_type=MuonHitHelper::CSC_ALL) const
int nChambersWithCLCT(int min_quality=0) const
How many CSC chambers with matching stubs of some minimal quality did this SimTrack hit...
const CSCALCTDigiContainer & allALCTsInChamber(unsigned int) const
CSCStubMatcher(edm::ParameterSet const &iPS, edm::ConsumesCollector &&iC)
std::set< unsigned int > chamberIdsAllLCT(int csc_type=MuonHitHelper::CSC_ALL) const
std::set< unsigned int > chamberIdsALCT(int csc_type=MuonHitHelper::CSC_ALL) const
void matchMPLCTsToSimTrack(const CSCCorrelatedLCTDigiCollection &)
std::set< unsigned int > chamberIdsAllCLCT(int csc_type=MuonHitHelper::CSC_ALL) const
crossed chamber detIds with not necessarily matching stubs
GlobalPoint getGlobalPosition(unsigned int rawId, const CSCCorrelatedLCTDigi &lct) const
const CSCCorrelatedLCTDigiContainer & allMPLCTsInChamber(unsigned int) const
std::vector< CSCCorrelatedLCTDigi > CSCCorrelatedLCTDigiContainer
CSCCorrelatedLCTDigi bestLctInChamber(unsigned int) const
Log< level::Error, false > LogError
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
float zpositionOfLayer(unsigned int detid, int layer) const
constexpr std::array< uint8_t, layerIndexSize > layer
static std::string const input
int nChambersWithMPLCT(int min_quality=0) const
std::vector< CSCALCTDigi > CSCALCTDigiContainer
CSCCLCTDigi bestClctInChamber(unsigned int) const
best matching from a particular crossed chamber
std::set< unsigned int > chamberIdsLCT(int csc_type=MuonHitHelper::CSC_ALL) const
const CSCCLCTDigiContainer & clctsInChamber(unsigned int) const
all matching from a particular crossed chamber
void matchLCTsToSimTrack(const CSCCorrelatedLCTDigiCollection &)
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
const CSCALCTDigiContainer & alctsInChamber(unsigned int) const
bool getData(T &iHolder) const
const CSCCorrelatedLCTDigiContainer & mplctsInChamber(unsigned int) const
Log< level::Info, false > LogInfo
void matchALCTsToSimTrack(const CSCALCTDigiCollection &)
void matchCLCTsToSimTrack(const CSCCLCTDigiCollection &)
const CSCCorrelatedLCTDigiContainer & lctsInChamber(unsigned int) const
CSCALCTDigi bestAlctInChamber(unsigned int) const
std::set< unsigned int > chamberIdsAllMPLCT(int csc_type=MuonHitHelper::CSC_ALL) const
std::set< unsigned int > chamberIdsCLCT(int csc_type=MuonHitHelper::CSC_ALL) const
chamber detIds with matching stubs
void match(const SimTrack &t, const SimVertex &v)
do the matching
const CSCCorrelatedLCTDigiContainer & allLCTsInChamber(unsigned int) const
void init(const edm::Event &e, const edm::EventSetup &eventSetup)
initialize the event
void addGhostLCTs(const CSCCorrelatedLCTDigi &lct11, const CSCCorrelatedLCTDigi &lct22, CSCCorrelatedLCTDigiContainer &lctcontainer) const