CMS 3D CMS Logo

SegmentsTrackAssociator.cc
Go to the documentation of this file.
1 
2 
3 /*
4  * See header file for a description of this class.
5  *
6  * \author C. Botta, G. Mila - INFN Torino
7  */
8 
10 
21 
25 
31 
32 #include <vector>
33 
34 using namespace edm;
35 using namespace std;
36 
38  theDTSegmentLabel = iConfig.getUntrackedParameter<InputTag>("segmentsDt");
39  theCSCSegmentLabel = iConfig.getUntrackedParameter<InputTag>("segmentsCSC");
40  theSegmentContainerName = iConfig.getUntrackedParameter<InputTag>("SelectedSegments");
41 
42  numRecHit = 0;
43  numRecHitDT = 0;
44  numRecHitCSC = 0;
45  metname = "SegmentsTrackAssociator";
46 
47  dtSegmentsToken = iC.consumes<DTRecSegment4DCollection>(theDTSegmentLabel);
48  cscSegmentsToken = iC.consumes<CSCSegmentCollection>(theCSCSegmentLabel);
49 }
50 
52 
54  const EventSetup& iSetup,
55  const reco::Track& Track) {
56  // The segment collections
58  iEvent.getByToken(dtSegmentsToken, dtSegments);
60  iEvent.getByToken(cscSegmentsToken, cscSegments);
61  ESHandle<GlobalTrackingGeometry> theTrackingGeometry;
62  iSetup.get<GlobalTrackingGeometryRecord>().get(theTrackingGeometry);
63 
69 
70  //loop over recHit
71  for (auto const& recHit : Track.recHits()) {
72  if (!recHit->isValid())
73  continue;
74 
75  numRecHit++;
76 
77  //get the detector Id
78  DetId idRivHit = recHit->geographicalId();
79 
80  // DT recHits
81  if (idRivHit.det() == DetId::Muon && idRivHit.subdetId() == MuonSubdetId::DT) {
82  // get the RecHit Local Position
83  LocalPoint posTrackRecHit = recHit->localPosition();
84 
86  numRecHitDT++;
87 
88  // get the chamber Id
89  DTChamberId chamberId(idRivHit.rawId());
90  // get the segments of the chamber
91  range = dtSegments->get(chamberId);
92 
93  // loop over segments
94  for (segment = range.first; segment != range.second; segment++) {
95  DetId id = segment->geographicalId();
96  const GeomDet* det = theTrackingGeometry->idToDet(id);
97  vector<const TrackingRecHit*> segments2D = (&(*segment))->recHits();
98  // container for 4D segment recHits
99  vector<const TrackingRecHit*> dtRecHits;
100 
101  for (vector<const TrackingRecHit*>::const_iterator segm2D = segments2D.begin(); segm2D != segments2D.end();
102  segm2D++) {
103  vector<const TrackingRecHit*> rHits1D = (*segm2D)->recHits();
104  for (int hit = 0; hit < int(rHits1D.size()); hit++) {
105  dtRecHits.push_back(rHits1D[hit]);
106  }
107  }
108 
109  // loop over the recHit checking if there's the recHit of the track
110  for (unsigned int hit = 0; hit < dtRecHits.size(); hit++) {
111  DetId idRivHitSeg = (*dtRecHits[hit]).geographicalId();
112  LocalPoint posDTSegment = segment->localPosition();
113  LocalPoint posSegDTRecHit = (*dtRecHits[hit]).localPosition();
114 
115  double rDT = sqrt(pow((posSegDTRecHit.x() - posTrackRecHit.x()), 2) +
116  pow((posSegDTRecHit.y() - posTrackRecHit.y()), 2) +
117  pow((posSegDTRecHit.z() - posTrackRecHit.z()), 2));
118 
119  if (idRivHit == idRivHitSeg && rDT < 0.0001) {
120  if (selectedDtSegments.empty()) {
121  selectedDtSegments.push_back(MuonTransientTrackingRecHit::specificBuild(det, &*segment));
122  LogTrace(metname) << "First selected segment (from DT). Position : " << posDTSegment
123  << " Chamber : " << segment->chamberId();
124  } else {
125  int check = 0;
126  for (int segm = 0; segm < int(selectedDtSegments.size()); ++segm) {
127  double dist = sqrt(pow((((*(selectedDtSegments[segm])).localPosition()).x() - posDTSegment.x()), 2) +
128  pow((((*(selectedDtSegments[segm])).localPosition()).y() - posDTSegment.y()), 2) +
129  pow((((*(selectedDtSegments[segm])).localPosition()).z() - posDTSegment.z()), 2));
130  if (dist > 30)
131  check++;
132  }
133 
134  if (check == int(selectedDtSegments.size())) {
135  selectedDtSegments.push_back(MuonTransientTrackingRecHit::specificBuild(det, &*segment));
136  LogTrace(metname) << "New DT selected segment. Position : " << posDTSegment
137  << " Chamber : " << segment->chamberId();
138  }
139  }
140  } // check to tag the segment as "selected"
141 
142  } // loop over segment recHits
143 
144  } // loop over DT segments
145  }
146 
147  // CSC recHits
148  if (idRivHit.det() == DetId::Muon && idRivHit.subdetId() == MuonSubdetId::CSC) {
149  // get the RecHit Local Position
150  LocalPoint posTrackRecHit = recHit->localPosition();
151 
153  numRecHitCSC++;
154 
155  // get the chamber Id
156  CSCDetId tempchamberId(idRivHit.rawId());
157 
158  int ring = tempchamberId.ring();
159  int station = tempchamberId.station();
160  int endcap = tempchamberId.endcap();
161  int chamber = tempchamberId.chamber();
162  CSCDetId chamberId(endcap, station, ring, chamber, 0);
163 
164  // get the segments of the chamber
165  range = cscSegments->get(chamberId);
166  // loop over segments
167  for (segment2 = range.first; segment2 != range.second; segment2++) {
168  DetId id2 = segment2->geographicalId();
169  const GeomDet* det2 = theTrackingGeometry->idToDet(id2);
170 
171  // container for CSC segment recHits
172  vector<const TrackingRecHit*> cscRecHits = (&(*segment2))->recHits();
173 
174  // loop over the recHit checking if there's the recHit of the track
175  for (unsigned int hit = 0; hit < cscRecHits.size(); hit++) {
176  DetId idRivHitSeg = (*cscRecHits[hit]).geographicalId();
177  LocalPoint posSegCSCRecHit = (*cscRecHits[hit]).localPosition();
178  LocalPoint posCSCSegment = segment2->localPosition();
179 
180  double rCSC = sqrt(pow((posSegCSCRecHit.x() - posTrackRecHit.x()), 2) +
181  pow((posSegCSCRecHit.y() - posTrackRecHit.y()), 2) +
182  pow((posSegCSCRecHit.z() - posTrackRecHit.z()), 2));
183 
184  if (idRivHit == idRivHitSeg && rCSC < 0.0001) {
185  if (selectedCscSegments.empty()) {
186  selectedCscSegments.push_back(MuonTransientTrackingRecHit::specificBuild(det2, &*segment2));
187  LogTrace(metname) << "First selected segment (from CSC). Position: " << posCSCSegment;
188  } else {
189  int check = 0;
190  for (int n = 0; n < int(selectedCscSegments.size()); n++) {
191  double dist = sqrt(pow(((*(selectedCscSegments[n])).localPosition().x() - posCSCSegment.x()), 2) +
192  pow(((*(selectedCscSegments[n])).localPosition().y() - posCSCSegment.y()), 2) +
193  pow(((*(selectedCscSegments[n])).localPosition().z() - posCSCSegment.z()), 2));
194  if (dist > 30)
195  check++;
196  }
197  if (check == int(selectedCscSegments.size())) {
198  selectedCscSegments.push_back(MuonTransientTrackingRecHit::specificBuild(det2, &*segment2));
199  LogTrace(metname) << "New CSC segment selected. Position : " << posCSCSegment;
200  }
201  }
202 
203  } // check to tag the segment as "selected"
204 
205  } // loop over segment recHits
206 
207  } // loop over DT segments
208  }
209 
210  } // loop over track recHits
211 
212  LogTrace(metname) << "N recHit:" << numRecHit;
213  numRecHit = 0;
214  LogTrace(metname) << "N recHit DT:" << numRecHitDT;
215  numRecHitDT = 0;
216  LogTrace(metname) << "N recHit CSC:" << numRecHitCSC;
217  numRecHitCSC = 0;
218 
219  copy(selectedDtSegments.begin(), selectedDtSegments.end(), back_inserter(selectedSegments));
220  LogTrace(metname) << "N selected Dt segments:" << selectedDtSegments.size();
221  copy(selectedCscSegments.begin(), selectedCscSegments.end(), back_inserter(selectedSegments));
222  LogTrace(metname) << "N selected Csc segments:" << selectedCscSegments.size();
223  LogTrace(metname) << "N selected segments:" << selectedSegments.size();
224 
225  return selectedSegments;
226 }
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
T getUntrackedParameter(std::string const &, T const &) const
std::pair< const_iterator, const_iterator > range
iterator range
Definition: RangeMap.h:50
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:525
const std::string metname
virtual ~SegmentsTrackAssociator()
Destructor.
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
T y() const
Definition: PV3DBase.h:60
SegmentsTrackAssociator(const edm::ParameterSet &, edm::ConsumesCollector &iC)
Constructor.
C::const_iterator const_iterator
constant access iterator type
Definition: RangeMap.h:43
int iEvent
Definition: GenABIO.cc:224
T sqrt(T t)
Definition: SSEVec.h:19
T z() const
Definition: PV3DBase.h:61
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:48
auto recHits() const
Access to reconstructed hits on the track.
Definition: Track.h:85
MuonTransientTrackingRecHit::MuonRecHitContainer associate(const edm::Event &, const edm::EventSetup &, const reco::Track &)
Get the analysis.
#define LogTrace(id)
Definition: DetId.h:17
HLT enums.
T get() const
Definition: EventSetup.h:73
const GeomDet * idToDet(DetId) const override
static constexpr int DT
Definition: MuonSubdetId.h:11
static constexpr int CSC
Definition: MuonSubdetId.h:12
T x() const
Definition: PV3DBase.h:59
static MuonRecHitPointer specificBuild(const GeomDet *geom, const TrackingRecHit *rh)
std::vector< MuonRecHitPointer > MuonRecHitContainer
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:30
static void check(T const &p, std::string const &id, SelectedProducts const &iProducts)
constexpr Detector det() const
get the detector field from this detid
Definition: DetId.h:46