12 maxBXCLCT_ = cscCLCT.getParameter<
int>(
"maxBX");
13 verboseCLCT_ = cscCLCT.getParameter<
int>(
"verbose");
14 minNHitsChamberCLCT_ = cscCLCT.getParameter<
int>(
"minNHitsChamber");
18 maxBXALCT_ = cscALCT.getParameter<
int>(
"maxBX");
19 verboseALCT_ = cscALCT.getParameter<
int>(
"verbose");
20 minNHitsChamberALCT_ = cscALCT.getParameter<
int>(
"minNHitsChamber");
24 maxBXLCT_ = cscLCT.getParameter<
int>(
"maxBX");
25 verboseLCT_ = cscLCT.getParameter<
int>(
"verbose");
26 minNHitsChamberLCT_ = cscLCT.getParameter<
int>(
"minNHitsChamber");
27 addGhostLCTs_ = cscLCT.getParameter<
bool>(
"addGhosts");
31 maxBXMPLCT_ = cscMPLCT.getParameter<
int>(
"maxBX");
32 verboseMPLCT_ = cscMPLCT.getParameter<
int>(
"verbose");
33 minNHitsChamberMPLCT_ = cscMPLCT.getParameter<
int>(
"minNHitsChamber");
39 clctInputTag_ = cscCLCT.getParameter<
edm::InputTag>(
"inputTag");
40 alctInputTag_ = cscALCT.getParameter<
edm::InputTag>(
"inputTag");
41 lctInputTag_ = cscLCT.getParameter<
edm::InputTag>(
"inputTag");
42 mplctInputTag_ = cscMPLCT.getParameter<
edm::InputTag>(
"inputTag");
54 gemDigiMatcher_->init(iEvent, iSetup);
55 cscDigiMatcher_->init(iEvent, iSetup);
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);
145 const auto& clcts_in_det = clcts.get(ch_id2);
147 for (
auto c = clcts_in_det.first;
c != clcts_in_det.second; ++
c) {
149 edm::LogInfo(
"CSCStubMatcher") <<
"clct " << ch_id2 <<
" " << *
c;
155 if (c->getBX() < minBXCLCT_ || c->getBX() > maxBXCLCT_)
159 chamber_to_clcts_all_[
id].push_back(*c);
164 for (
const auto&
p : comps) {
166 for (
const auto&
q :
p) {
168 edm::LogInfo(
"CSCStubMatcher") <<
"L" << layer <<
" " <<
q <<
" " <<
q.getHalfStrip() <<
" " << std::endl;
169 for (
const auto& clctComp : (*c).getHits()[layer - 1]) {
170 if (clctComp == 65535)
173 edm::LogInfo(
"CSCStubMatcher") <<
"\t" << clctComp <<
" ";
175 if (
q.getHalfStrip() == clctComp
or (isME1a and
q.getHalfStrip() + 128 == clctComp)) {
178 edm::LogInfo(
"CSCStubMatcher") <<
"\t\tnMatches " << nMatches << std::endl;
193 if (
std::find(chamber_to_clcts_[
id].
begin(), chamber_to_clcts_[
id].
end(), *c) == chamber_to_clcts_[
id].
end()) {
194 chamber_to_clcts_[
id].push_back(*c);
197 if (chamber_to_clcts_[
id].
size() > 2) {
198 edm::LogInfo(
"CSCStubMatcher") <<
"WARNING!!! too many CLCTs " << chamber_to_clcts_[
id].size() <<
" in " << ch_id;
199 for (
auto&
c : chamber_to_clcts_[
id])
206 const auto& anode_ids = cscDigiMatcher_->chamberIdsWire(0);
208 for (
const auto&
id : anode_ids) {
209 if (cscDigiMatcher_->nLayersWithWireInChamber(
id) >= minNHitsChamberALCT_)
214 const auto& digi_wgs = cscDigiMatcher_->wiregroupsInChamber(
id, 1);
216 cout <<
"alct: digi_wgs " << ch_id <<
" ";
217 copy(digi_wgs.begin(), digi_wgs.end(), ostream_iterator<int>(
cout,
" "));
226 const auto& alcts_in_det = alcts.get(ch_id2);
227 for (
auto a = alcts_in_det.first;
a != alcts_in_det.second; ++
a) {
232 edm::LogInfo(
"CSCStubMatcher") <<
"alct " << ch_id <<
" " << *
a;
235 if (a->getBX() < minBXALCT_ || a->getBX() > maxBXALCT_)
238 int wg = a->getKeyWG() + 1;
241 chamber_to_alcts_all_[
id].push_back(*a);
244 if (digi_wgs.find(wg) == digi_wgs.end()) {
251 if (
std::find(chamber_to_alcts_[
id].
begin(), chamber_to_alcts_[
id].
end(), *a) == chamber_to_alcts_[
id].
end()) {
252 chamber_to_alcts_[
id].push_back(*a);
255 if (chamber_to_alcts_[
id].
size() > 2) {
256 edm::LogInfo(
"CSCStubMatcher") <<
"WARNING!!! too many ALCTs " << chamber_to_alcts_[
id].size() <<
" in " << ch_id;
257 for (
auto&
a : chamber_to_alcts_[
id])
265 const auto& cathode_ids = chamberIdsAllCLCT(0);
266 const auto& anode_ids = chamberIdsAllALCT(0);
268 std::set<int> cathode_and_anode_ids;
269 std::set_union(cathode_ids.begin(),
273 std::inserter(cathode_and_anode_ids, cathode_and_anode_ids.end()));
275 for (
const auto&
id : cathode_and_anode_ids) {
286 const auto& lcts_in_det = lcts.get(ch_id2);
288 std::map<int, CSCCorrelatedLCTDigiContainer> bx_to_lcts;
292 for (
auto lct = lcts_in_det.first; lct != lcts_in_det.second; ++lct) {
295 lcts_tmp.push_back(*lct);
296 int bx = lct->getBX();
297 bx_to_lcts[
bx].push_back(*lct);
301 if (bx_to_lcts[bx].
size() == 2 and addGhostLCTs_) {
302 auto lct11 = bx_to_lcts[
bx][0];
303 auto lct22 = bx_to_lcts[
bx][1];
304 addGhostLCTs(lct11, lct22, lcts_tmp);
308 for (
const auto& lct : lcts_tmp) {
311 bool lct_clct_match(
false);
312 bool lct_alct_match(
false);
313 bool lct_gem1_match(
false);
314 bool lct_gem2_match(
false);
317 edm::LogInfo(
"CSCStubMatcher") << ch_id <<
" " << ch_id2;
319 edm::LogInfo(
"CSCStubMatcher") <<
"getCLCT " << lct.getCLCT() <<
"\ngetALCT " << lct.getALCT() <<
"\ngetGEM1 "
320 << lct.getGEM1() <<
"\ngetGEM2 " << lct.getGEM2();
323 for (
const auto&
p : clctsInChamber(
id)) {
324 if (
p == lct.getCLCT()) {
325 lct_clct_match =
true;
327 edm::LogInfo(
"CSCStubMatcher") <<
"\t...lct_clct_match";
333 for (
const auto&
p : alctsInChamber(
id)) {
334 if (
p == lct.getALCT()) {
335 lct_alct_match =
true;
337 edm::LogInfo(
"CSCStubMatcher") <<
"\t...lct_alct_match";
347 for (
const auto&
p : gemDigiMatcher_->padsInChamber(gemDetIdL1.rawId())) {
348 if (
p == lct.getGEM1()) {
349 lct_gem1_match =
true;
351 edm::LogInfo(
"CSCStubMatcher") <<
"\t...lct_gem1_match";
358 for (
const auto&
p : gemDigiMatcher_->padsInChamber(gemDetIdL2.rawId())) {
359 if (
p == lct.getGEM2()) {
360 lct_gem2_match =
true;
362 edm::LogInfo(
"CSCStubMatcher") <<
"\t...lct_gem2_match";
369 const bool alct_clct = lct_clct_match and lct_alct_match;
370 const bool alct_gem = lct_alct_match and lct_gem1_match and lct_gem2_match;
371 const bool clct_gem = lct_clct_match and lct_gem1_match and lct_gem2_match;
373 bool lct_tight_matched = alct_clct
or alct_gem
or clct_gem;
374 bool lct_loose_matched = lct_clct_match
or lct_alct_match;
375 bool lct_matched = lct_loose_matched
or lct_tight_matched;
380 if (
std::find(chamber_to_lcts_[
id].
begin(), chamber_to_lcts_[
id].
end(), lct) == chamber_to_lcts_[
id].
end()) {
381 chamber_to_lcts_[
id].emplace_back(lct);
391 const auto& lcts_ids = chamberIdsLCT(0);
394 for (
const auto&
id : lcts_ids) {
395 const auto& mplcts_in_det = mplcts.get(
id);
398 for (
auto lct = mplcts_in_det.first; lct != mplcts_in_det.second; ++lct) {
402 chamber_to_mplcts_all_[
id].emplace_back(*lct);
405 for (
const auto& sim_stub : lctsInChamber(
id)) {
406 if (sim_stub == *lct) {
407 if (
std::find(chamber_to_mplcts_[
id].
begin(), chamber_to_mplcts_[
id].
end(), *lct) ==
408 chamber_to_mplcts_[
id].
end()) {
409 chamber_to_mplcts_[
id].emplace_back(*lct);
418 return selectDetIds(chamber_to_clcts_all_, csc_type);
422 return selectDetIds(chamber_to_alcts_all_, csc_type);
426 return selectDetIds(chamber_to_lcts_all_, csc_type);
430 return selectDetIds(chamber_to_mplcts_all_, csc_type);
434 return selectDetIds(chamber_to_clcts_, csc_type);
438 return selectDetIds(chamber_to_alcts_, csc_type);
442 return selectDetIds(chamber_to_lcts_, csc_type);
446 return selectDetIds(chamber_to_mplcts_, csc_type);
450 if (chamber_to_clcts_all_.find(detid) == chamber_to_clcts_all_.end())
452 return chamber_to_clcts_all_.at(detid);
456 if (chamber_to_alcts_all_.find(detid) == chamber_to_alcts_all_.end())
458 return chamber_to_alcts_all_.at(detid);
462 if (chamber_to_lcts_all_.find(detid) == chamber_to_lcts_all_.end())
464 return chamber_to_lcts_all_.at(detid);
468 if (chamber_to_mplcts_all_.find(detid) == chamber_to_mplcts_all_.end())
470 return chamber_to_mplcts_all_.at(detid);
474 if (chamber_to_clcts_.find(detid) == chamber_to_clcts_.end())
476 return chamber_to_clcts_.at(detid);
480 if (chamber_to_alcts_.find(detid) == chamber_to_alcts_.end())
482 return chamber_to_alcts_.at(detid);
486 if (chamber_to_lcts_.find(detid) == chamber_to_lcts_.end())
488 return chamber_to_lcts_.at(detid);
492 if (chamber_to_mplcts_.find(detid) == chamber_to_mplcts_.end())
494 return chamber_to_mplcts_.at(detid);
499 const auto&
input(clctsInChamber(detid));
502 for (
unsigned int i = 0;
i <
input.size(); ++
i) {
504 if (quality > bestQ) {
516 const auto&
input(alctsInChamber(detid));
519 for (
unsigned int i = 0;
i <
input.size(); ++
i) {
521 if (quality > bestQ) {
533 const auto&
input(lctsInChamber(detid));
536 for (
unsigned int i = 0;
i <
input.size(); ++
i) {
538 if (quality > bestQ) {
550 const auto& chamber(cscGeometry_->chamber(
id));
551 return fabs(chamber->layer(layer)->centerOfStrip(20).z());
556 const auto& chamber_ids = chamberIdsCLCT();
557 for (
const auto&
id : chamber_ids) {
558 int nStubChamber = 0;
559 const auto& clcts = clctsInChamber(
id);
560 for (
const auto& clct : clcts) {
563 if (clct.getQuality() >= min_quality) {
567 if (nStubChamber > 0) {
576 const auto& chamber_ids = chamberIdsALCT();
577 for (
const auto&
id : chamber_ids) {
578 int nStubChamber = 0;
579 const auto& alcts = alctsInChamber(
id);
580 for (
const auto& alct : alcts) {
583 if (alct.getQuality() >= min_quality) {
587 if (nStubChamber > 0) {
596 const auto& chamber_ids = chamberIdsLCT();
597 for (
const auto&
id : chamber_ids) {
598 int nStubChamber = 0;
599 const auto& lcts = lctsInChamber(
id);
600 for (
const auto& lct : lcts) {
603 if (lct.getQuality() >= min_quality) {
607 if (nStubChamber > 0) {
616 const auto& chamber_ids = chamberIdsMPLCT();
617 for (
const auto&
id : chamber_ids) {
618 int nStubChamber = 0;
619 const auto& mplcts = mplctsInChamber(
id);
620 for (
const auto& mplct : mplcts) {
621 if (!mplct.isValid())
623 if (mplct.getQuality() >= min_quality) {
627 if (nStubChamber > 0) {
635 for (
const auto& stub : lctsInChamber(
id.rawId())) {
651 const auto& chamber = cscGeometry_->chamber(cscId);
654 float wire = layer_geo->middleWireOfGroup(lct.
getKeyWG() + 1);
655 const LocalPoint& csc_intersect = layer_geo->intersectionOfStripAndWire(fractional_strip, wire);
656 const GlobalPoint& csc_gp = cscGeometry_->idToDet(keyId)->surface().toGlobal(csc_intersect);
661 chamber_to_clcts_all_.clear();
662 chamber_to_alcts_all_.clear();
663 chamber_to_lcts_all_.clear();
664 chamber_to_mplcts_all_.clear();
666 chamber_to_clcts_.clear();
667 chamber_to_alcts_.clear();
668 chamber_to_lcts_.clear();
669 chamber_to_mplcts_.clear();
680 if (!(wg1 == wg2 || hs1 == hs2)) {
686 lcts_tmp.push_back(lct12);
692 lcts_tmp.push_back(lct21);
std::set< unsigned int > chamberIdsAllMPLCT(int csc_type=MuonHitHelper::CSC_ALL) const
std::set< unsigned int > chamberIdsLCT(int csc_type=MuonHitHelper::CSC_ALL) const
std::vector< CSCCLCTDigi > CSCCLCTDigiContainer
int nChambersWithMPLCT(int min_quality=0) const
const edm::EventSetup & c
void addGhostLCTs(const CSCCorrelatedLCTDigi &lct11, const CSCCorrelatedLCTDigi &lct22, CSCCorrelatedLCTDigiContainer &lctcontainer) const
float zpositionOfLayer(unsigned int detid, int layer) const
uint16_t *__restrict__ id
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
CSCALCTDigi bestAlctInChamber(unsigned int) const
bool getByToken(EDGetToken token, Handle< PROD > &result) const
CSCStubMatcher(edm::ParameterSet const &iPS, edm::ConsumesCollector &&iC)
uint32_t const *__restrict__ Quality * quality
void matchMPLCTsToSimTrack(const CSCCorrelatedLCTDigiCollection &)
const CSCCLCTDigiContainer & clctsInChamber(unsigned int) const
all matching from a particular crossed chamber
int nChambersWithALCT(int min_quality=0) const
GlobalPoint getGlobalPosition(unsigned int rawId, const CSCCorrelatedLCTDigi &lct) const
std::vector< CSCCorrelatedLCTDigi > CSCCorrelatedLCTDigiContainer
Log< level::Error, false > LogError
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
const CSCALCTDigiContainer & allALCTsInChamber(unsigned int) const
const CSCCorrelatedLCTDigiContainer & mplctsInChamber(unsigned int) const
int nChambersWithCLCT(int min_quality=0) const
How many CSC chambers with matching stubs of some minimal quality did this SimTrack hit...
constexpr std::array< uint8_t, layerIndexSize > layer
static std::string const input
bool getData(T &iHolder) const
std::vector< CSCALCTDigi > CSCALCTDigiContainer
bool lctInChamber(const CSCDetId &id, const CSCCorrelatedLCTDigi &lct) const
std::set< unsigned int > chamberIdsMPLCT(int csc_type=MuonHitHelper::CSC_ALL) const
const CSCALCTDigiContainer & alctsInChamber(unsigned int) const
std::set< unsigned int > chamberIdsALCT(int csc_type=MuonHitHelper::CSC_ALL) const
const CSCCorrelatedLCTDigiContainer & allLCTsInChamber(unsigned int) const
void matchLCTsToSimTrack(const CSCCorrelatedLCTDigiCollection &)
const CSCCorrelatedLCTDigiContainer & allMPLCTsInChamber(unsigned int) const
std::set< unsigned int > chamberIdsCLCT(int csc_type=MuonHitHelper::CSC_ALL) const
chamber detIds with matching stubs
std::set< unsigned int > chamberIdsAllCLCT(int csc_type=MuonHitHelper::CSC_ALL) const
crossed chamber detIds with not necessarily matching stubs
Log< level::Info, false > LogInfo
short int zendcap() const
void matchALCTsToSimTrack(const CSCALCTDigiCollection &)
void matchCLCTsToSimTrack(const CSCCLCTDigiCollection &)
std::set< unsigned int > chamberIdsAllLCT(int csc_type=MuonHitHelper::CSC_ALL) const
T getParameter(std::string const &) const
int nChambersWithLCT(int min_quality=0) const
CSCCLCTDigi bestClctInChamber(unsigned int) const
best matching from a particular crossed chamber
CSCCorrelatedLCTDigi bestLctInChamber(unsigned int) const
void match(const SimTrack &t, const SimVertex &v)
do the matching
const CSCCLCTDigiContainer & allCLCTsInChamber(unsigned int) const
all stubs (not necessarily matching) from a particular crossed chamber
tuple size
Write out results.
const CSCCorrelatedLCTDigiContainer & lctsInChamber(unsigned int) const
void init(const edm::Event &e, const edm::EventSetup &eventSetup)
initialize the event
std::set< unsigned int > chamberIdsAllALCT(int csc_type=MuonHitHelper::CSC_ALL) const