CMS 3D CMS Logo

HLTCSCOverlapFilter.cc
Go to the documentation of this file.
1 #include "HLTCSCOverlapFilter.h"
2 
6 
12 
15 
17  , m_input(iConfig.getParameter<edm::InputTag>("input"))
18  , m_minHits(iConfig.getParameter<unsigned int>("minHits"))
19  , m_xWindow(iConfig.getParameter<double>("xWindow"))
20  , m_yWindow(iConfig.getParameter<double>("yWindow"))
21  , m_ring1(iConfig.getParameter<bool>("ring1"))
22  , m_ring2(iConfig.getParameter<bool>("ring2"))
23  , m_fillHists(iConfig.getParameter<bool>("fillHists"))
24  , m_nhitsNoWindowCut(nullptr)
25  , m_xdiff(nullptr)
26  , m_ydiff(nullptr)
27  , m_pairsWithWindowCut(nullptr)
28 {
29  cscrechitsToken = consumes<CSCRecHit2DCollection>(m_input);
30  if (m_fillHists) {
32  m_nhitsNoWindowCut = tfile->make<TH1F>("nhitsNoWindowCut", "nhitsNoWindowCut", 16, -0.5, 15.5);
33  m_xdiff = tfile->make<TH1F>("xdiff", "xdiff", 200, 0., 10.);
34  m_ydiff = tfile->make<TH1F>("ydiff", "ydiff", 200, 0., 10.);
35  m_pairsWithWindowCut = tfile->make<TH1F>("pairsWithWindowCut", "pairsWithWindowCut", 226, -0.5, 225.5);
36  }
37 }
38 
40 
41 void
45  desc.add<edm::InputTag>("input",edm::InputTag("hltCsc2DRecHits"));
46  desc.add<unsigned int>("minHits",4);
47  desc.add<double>("xWindow",1000.);
48  desc.add<double>("yWindow",1000.);
49  desc.add<bool>("ring1",true);
50  desc.add<bool>("ring2",false);
51  desc.add<bool>("fillHists",false);
52  descriptions.add("hltCSCOverlapFilter",desc);
53 }
54 
57  iEvent.getByToken(cscrechitsToken, hits);
58 
59  edm::ESHandle<CSCGeometry> cscGeometry;
60  bool got_cscGeometry = false;
61 
62  std::map<int, std::vector<const CSCRecHit2D*> > chamber_tohit;
63 
64  for (auto const & hit : *hits) {
65  CSCDetId id(hit.geographicalId());
66  int chamber_id = CSCDetId(id.endcap(), id.station(), id.ring(), id.chamber(), 0).rawId();
67 
68  if ((m_ring1 && (id.ring() == 1 || id.ring() == 4)) ||
69  (m_ring2 && id.ring() == 2)) {
70  std::map<int, std::vector<const CSCRecHit2D*> >::const_iterator chamber_iter = chamber_tohit.find(chamber_id);
71  if (chamber_iter == chamber_tohit.end()) {
72  std::vector<const CSCRecHit2D*> newlist;
73  newlist.push_back(&hit);
74  }
75  chamber_tohit[chamber_id].push_back(&hit);
76  } // end if this ring is selected
77  } // end loop over hits
78 
79  bool keep = false;
80  unsigned int minHitsSquared = m_minHits * m_minHits;
81  for (std::map<int, std::vector<const CSCRecHit2D*> >::const_iterator chamber_iter = chamber_tohit.begin();
82  chamber_iter != chamber_tohit.end();
83  ++chamber_iter) {
84 
85  if (m_fillHists) {
86  m_nhitsNoWindowCut->Fill(chamber_iter->second.size());
87  }
88 
89  if (chamber_iter->second.size() >= m_minHits) {
90  CSCDetId chamber_id(chamber_iter->first);
91  int chamber = chamber_id.chamber();
92  int next = chamber + 1;
93 
94  // Some rings have 36 chambers, others have 18. This will still be valid when ME4/2 is added.
95  if (next == 37 && (std::abs(chamber_id.station()) == 1 || chamber_id.ring() == 2)) next = 1;
96  if (next == 19 && (std::abs(chamber_id.station()) != 1 && chamber_id.ring() == 1)) next = 1;
97 
98  int next_id = CSCDetId(chamber_id.endcap(), chamber_id.station(), chamber_id.ring(), next, 0).rawId();
99 
100  std::map<int, std::vector<const CSCRecHit2D*> >::const_iterator chamber_next = chamber_tohit.find(next_id);
101  if (chamber_next != chamber_tohit.end() && chamber_next->second.size() >= m_minHits) {
102  if (!got_cscGeometry) {
103  iSetup.get<MuonGeometryRecord>().get(cscGeometry);
104  got_cscGeometry = true;
105  }
106 
107  unsigned int pairs_in_window = 0;
108  for (auto hit1 = chamber_iter->second.begin(); hit1 != chamber_iter->second.end(); ++hit1) {
109  for (auto hit2 : chamber_next->second) {
110  GlobalPoint pos1 = cscGeometry->idToDet((*hit1)->geographicalId())->surface().toGlobal((*hit1)->localPosition());
111  GlobalPoint pos2 = cscGeometry->idToDet(hit2->geographicalId())->surface().toGlobal(hit2->localPosition());
112 
113  if (m_fillHists) {
114  m_xdiff->Fill(pos1.x() - pos2.x());
115  m_ydiff->Fill(pos1.y() - pos2.y());
116  }
117 
118  if (fabs(pos1.x() - pos2.x()) < m_xWindow && fabs(pos1.y() - pos2.y()) < m_yWindow) pairs_in_window++;
119 
120  if (pairs_in_window >= minHitsSquared) {
121  keep = true;
122  if (!m_fillHists) return true;
123  }
124  } // end loop over hits in chamber 2
125  } // end loop over hits in chamber 1
126 
127  if (m_fillHists) {
128  m_pairsWithWindowCut->Fill(pairs_in_window);
129  }
130 
131  } // end if chamber 2 has enough hits
132  } // end if chamber 1 has enough hits
133  } // end loop over chambers
134 
135  return keep;
136 }
137 
138 
139 // declare this class as a framework plugin
int chamber() const
Definition: CSCDetId.h:68
bool hltFilter(edm::Event &, const edm::EventSetup &, trigger::TriggerFilterObjectWithRefs &filterproduct) const override
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:517
const GeomDet * idToDet(DetId) const override
Definition: CSCGeometry.cc:114
edm::EDGetTokenT< CSCRecHit2DCollection > cscrechitsToken
GlobalPoint toGlobal(const Local2DPoint &lp) const
Conversion to the global R.F. from the R.F. of the GeomDet.
Definition: GeomDet.h:54
#define nullptr
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:50
T y() const
Definition: PV3DBase.h:63
T * make(const Args &...args) const
make new ROOT object
Definition: TFileService.h:64
int endcap() const
Definition: CSCDetId.h:93
const int keep
int iEvent
Definition: GenABIO.cc:224
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
ParameterDescriptionBase * add(U const &iLabel, T const &value)
int ring() const
Definition: CSCDetId.h:75
static void makeHLTFilterDescription(edm::ParameterSetDescription &desc)
Definition: HLTFilter.cc:29
void add(std::string const &label, ParameterSetDescription const &psetDescription)
HLT enums.
T get() const
Definition: EventSetup.h:71
int station() const
Definition: CSCDetId.h:86
T x() const
Definition: PV3DBase.h:62
~HLTCSCOverlapFilter() override
HLTCSCOverlapFilter(const edm::ParameterSet &)