CMS 3D CMS Logo

GEMSegmentAlgorithm.cc
Go to the documentation of this file.
1 
8 #include "GEMSegmentAlgorithm.h"
9 #include "MuonSegFit.h"
10 
16 
17 #include <algorithm>
18 #include <cmath>
19 #include <iostream>
20 #include <string>
21 
22 /* Constructor
23  *
24  */
26  : GEMSegmentAlgorithmBase(ps), myName("GEMSegmentAlgorithm") {
27  debug = ps.getUntrackedParameter<bool>("GEMDebug");
28  minHitsPerSegment = ps.getParameter<unsigned int>("minHitsPerSegment");
29  preClustering = ps.getParameter<bool>("preClustering");
30  dXclusBoxMax = ps.getParameter<double>("dXclusBoxMax");
31  dYclusBoxMax = ps.getParameter<double>("dYclusBoxMax");
32  preClustering_useChaining = ps.getParameter<bool>("preClusteringUseChaining");
33  dPhiChainBoxMax = ps.getParameter<double>("dPhiChainBoxMax");
34  dEtaChainBoxMax = ps.getParameter<double>("dEtaChainBoxMax");
35  maxRecHitsInCluster = ps.getParameter<int>("maxRecHitsInCluster");
36  clusterOnlySameBXRecHits = ps.getParameter<bool>("clusterOnlySameBXRecHits");
37 
38  // maybe to be used in the future ???
39  // Pruning = ps.getParameter<bool>("Pruning");
40  // BrutePruning = ps.getParameter<bool>("BrutePruning");
41  // maxRecHitsInCluster is the maximal number of hits in a precluster that is being processed
42  // This cut is intended to remove messy events. Currently nothing is returned if there are
43  // more that maxRecHitsInCluster hits. It could be useful to return an estimate of the
44  // cluster position, which is available.
45  // maxRecHitsInCluster = ps.getParameter<int>("maxRecHitsInCluster");
46  // onlyBestSegment = ps.getParameter<bool>("onlyBestSegment");
47 
48  // CSC uses pruning to remove clearly bad hits, using as much info from the rechits as possible: charge, position, timing, ...
49  // In fits with bad chi^2 they look for the worst hit (hit with abnormally large residual)
50  // if worst hit was found, refit without worst hit and select if considerably better than original fit.
51 }
52 
53 /* Destructor
54  *
55  */
57 
58 std::vector<GEMSegment> GEMSegmentAlgorithm::run(const GEMEnsemble& ensemble, const EnsembleHitContainer& rechits) {
59  // pre-cluster rechits and loop over all sub clusters separately
60  std::vector<GEMSegment> segments_temp;
61  std::vector<GEMSegment> segments;
62  ProtoSegments rechits_clusters; // this is a collection of groups of rechits
63 
64  if (preClustering) {
65  // run a pre-clusterer on the given rechits to split obviously separated segment seeds:
67  // it uses X,Y,Z information; there are no configurable parameters used;
68  // the X, Y, Z "cuts" are just (much) wider than reasonable high pt segments
69  edm::LogVerbatim("GEMSegmentAlgorithm") << "[GEMSegmentAlgorithm::run] preClustering :: use Chaining";
70  rechits_clusters = this->chainHits(ensemble, rechits);
71  } else {
72  // it uses X,Y information + configurable parameters
73  edm::LogVerbatim("GEMSegmentAlgorithm") << "[GEMSegmentAlgorithm::run] Clustering";
74  rechits_clusters = this->clusterHits(ensemble, rechits);
75  }
76  // loop over the found clusters:
77  edm::LogVerbatim("GEMSegmentAlgorithm") << "[GEMSegmentAlgorithm::run] Loop over clusters and build segments";
78  for (auto sub_rechits = rechits_clusters.begin(); sub_rechits != rechits_clusters.end(); ++sub_rechits) {
79  // clear the buffer for the subset of segments:
80  segments_temp.clear();
81  // build the subset of segments:
82  this->buildSegments(ensemble, (*sub_rechits), segments_temp);
83  // add the found subset of segments to the collection of all segments in this chamber:
84  segments.insert(segments.end(), segments_temp.begin(), segments_temp.end());
85  }
86 
87  return segments;
88  } else {
89  this->buildSegments(ensemble, rechits, segments);
90  return segments;
91  }
92 }
93 
94 // ********************************************************************;
97  // think how to implement BX requirement here
98 
99  ProtoSegments rechits_clusters; // this is a collection of groups of rechits
100 
101  float dXclus_box = 0.0;
102  float dYclus_box = 0.0;
103 
105  seeds.reserve(rechits.size());
106 
107  std::vector<float> running_meanX;
108  running_meanX.reserve(rechits.size());
109  std::vector<float> running_meanY;
110  running_meanY.reserve(rechits.size());
111 
112  std::vector<float> seed_minX;
113  seed_minX.reserve(rechits.size());
114  std::vector<float> seed_maxX;
115  seed_maxX.reserve(rechits.size());
116  std::vector<float> seed_minY;
117  seed_minY.reserve(rechits.size());
118  std::vector<float> seed_maxY;
119  seed_maxY.reserve(rechits.size());
120 
121  // split rechits into subvectors and return vector of vectors:
122  // Loop over rechits
123  // Create one seed per hit
124  for (unsigned int i = 0; i < rechits.size(); ++i) {
125  seeds.push_back(EnsembleHitContainer(1, rechits[i]));
126 
127  GEMDetId rhID = rechits[i]->gemId();
128  const GEMEtaPartition* rhEP = (ensemble.second.find(rhID.rawId()))->second;
129  if (!rhEP)
130  throw cms::Exception("GEMEtaPartition not found")
131  << "Corresponding GEMEtaPartition to GEMDetId: " << rhID << " not found in the GEMEnsemble";
132  const GEMSuperChamber* rhCH = ensemble.first;
133  LocalPoint rhLP_inEtaPartFrame = rechits[i]->localPosition();
134  GlobalPoint rhGP_inCMSFrame = rhEP->toGlobal(rhLP_inEtaPartFrame);
135  LocalPoint rhLP_inChamberFrame = rhCH->toLocal(rhGP_inCMSFrame);
136 
137  running_meanX.push_back(rhLP_inChamberFrame.x());
138  running_meanY.push_back(rhLP_inChamberFrame.y());
139 
140  // set min/max X and Y for box containing the hits in the precluster:
141  seed_minX.push_back(rhLP_inChamberFrame.x());
142  seed_maxX.push_back(rhLP_inChamberFrame.x());
143  seed_minY.push_back(rhLP_inChamberFrame.y());
144  seed_maxY.push_back(rhLP_inChamberFrame.y());
145  }
146 
147  // merge clusters that are too close
148  // measure distance between final "running mean"
149  for (size_t NNN = 0; NNN < seeds.size(); ++NNN) {
150  for (size_t MMM = NNN + 1; MMM < seeds.size(); ++MMM) {
151  if (running_meanX[MMM] == running_max || running_meanX[NNN] == running_max) {
152  LogDebug("GEMSegmentAlgorithm") << "[GEMSegmentAlgorithm::clusterHits]: ALARM! Skipping used seeds, this "
153  "should not happen - inform developers!";
154  continue; //skip seeds that have been used
155  }
156 
157  // calculate cut criteria for simple running mean distance cut:
158  //dXclus = fabs(running_meanX[NNN] - running_meanX[MMM]);
159  //dYclus = fabs(running_meanY[NNN] - running_meanY[MMM]);
160  // calculate minmal distance between precluster boxes containing the hits:
161  if (running_meanX[NNN] > running_meanX[MMM])
162  dXclus_box = seed_minX[NNN] - seed_maxX[MMM];
163  else
164  dXclus_box = seed_minX[MMM] - seed_maxX[NNN];
165  if (running_meanY[NNN] > running_meanY[MMM])
166  dYclus_box = seed_minY[NNN] - seed_maxY[MMM];
167  else
168  dYclus_box = seed_minY[MMM] - seed_maxY[NNN];
169 
170  if (dXclus_box < dXclusBoxMax && dYclus_box < dYclusBoxMax) {
171  // merge clusters!
172  // merge by adding seed NNN to seed MMM and erasing seed NNN
173 
174  // calculate running mean for the merged seed:
175  if (seeds[NNN].size() + seeds[MMM].size() != 0) {
176  running_meanX[MMM] = (running_meanX[NNN] * seeds[NNN].size() + running_meanX[MMM] * seeds[MMM].size()) /
177  (seeds[NNN].size() + seeds[MMM].size());
178  running_meanY[MMM] = (running_meanY[NNN] * seeds[NNN].size() + running_meanY[MMM] * seeds[MMM].size()) /
179  (seeds[NNN].size() + seeds[MMM].size());
180  }
181 
182  // update min/max X and Y for box containing the hits in the merged cluster:
183  if (seed_minX[NNN] < seed_minX[MMM])
184  seed_minX[MMM] = seed_minX[NNN];
185  if (seed_maxX[NNN] > seed_maxX[MMM])
186  seed_maxX[MMM] = seed_maxX[NNN];
187  if (seed_minY[NNN] < seed_minY[MMM])
188  seed_minY[MMM] = seed_minY[NNN];
189  if (seed_maxY[NNN] > seed_maxY[MMM])
190  seed_maxY[MMM] = seed_maxY[NNN];
191 
192  // add seed NNN to MMM (lower to larger number)
193  seeds[MMM].insert(seeds[MMM].end(), seeds[NNN].begin(), seeds[NNN].end());
194 
195  // mark seed NNN as used (at the moment just set running mean to 999999.)
196  running_meanX[NNN] = running_max;
197  running_meanY[NNN] = running_max;
198  // we have merged a seed (NNN) to the highter seed (MMM) - need to contimue to
199  // next seed (NNN+1)
200  break;
201  }
202  }
203  }
204 
205  // hand over the final seeds to the output
206  // would be more elegant if we could do the above step with
207  // erasing the merged ones, rather than the
208  for (size_t NNN = 0; NNN < seeds.size(); ++NNN) {
209  if (running_meanX[NNN] == running_max)
210  continue; //skip seeds that have been marked as used up in merging
211  rechits_clusters.push_back(seeds[NNN]);
212  }
213 
214  return rechits_clusters;
215 }
216 
218  const EnsembleHitContainer& rechits) {
219  ProtoSegments rechits_chains;
221  seeds.reserve(rechits.size());
222  std::vector<bool> usedCluster(rechits.size(), false);
223 
224  // split rechits into subvectors and return vector of vectors:
225  // Loop over rechits
226  // Create one seed per hit
227  for (unsigned int i = 0; i < rechits.size(); ++i)
228  seeds.push_back(EnsembleHitContainer(1, rechits[i]));
229 
230  // merge chains that are too close ("touch" each other)
231  for (size_t NNN = 0; NNN < seeds.size(); ++NNN) {
232  for (size_t MMM = NNN + 1; MMM < seeds.size(); ++MMM) {
233  if (usedCluster[MMM] || usedCluster[NNN]) {
234  continue;
235  }
236  // all is in the way we define "good";
237  // try not to "cluster" the hits but to "chain" them;
238  // it does the clustering but also does a better job
239  // for inclined tracks (not clustering them together;
240  // crossed tracks would be still clustered together)
241  // 22.12.09: In fact it is not much more different
242  // than the "clustering", we just introduce another
243  // variable in the game - Z. And it makes sense
244  // to re-introduce Y (or actually wire group mumber)
245  // in a similar way as for the strip number - see
246  // the code below.
247  bool goodToMerge = isGoodToMerge(ensemble, seeds[NNN], seeds[MMM]);
248  if (goodToMerge) {
249  // merge chains!
250  // merge by adding seed NNN to seed MMM and erasing seed NNN
251 
252  // add seed NNN to MMM (lower to larger number)
253  seeds[MMM].insert(seeds[MMM].end(), seeds[NNN].begin(), seeds[NNN].end());
254 
255  // mark seed NNN as used
256  usedCluster[NNN] = true;
257  // we have merged a seed (NNN) to the highter seed (MMM) - need to contimue to
258  // next seed (NNN+1)
259  break;
260  }
261  }
262  }
263 
264  // hand over the final seeds to the output
265  // would be more elegant if we could do the above step with
266  // erasing the merged ones, rather than the
267  for (size_t NNN = 0; NNN < seeds.size(); ++NNN) {
268  if (usedCluster[NNN])
269  continue; //skip seeds that have been marked as used up in merging
270  rechits_chains.push_back(seeds[NNN]);
271  }
272 
273  //***************************************************************
274 
275  return rechits_chains;
276 }
277 
279  const EnsembleHitContainer& newChain,
280  const EnsembleHitContainer& oldChain) {
281  bool phiRequirementOK = false; // once it is true in the loop, it is ok to merge
282  bool etaRequirementOK = false; // once it is true in the loop, it is ok to merge
283  bool bxRequirementOK = false; // once it is true in the loop, it is ok to merge
284 
285  for (size_t iRH_new = 0; iRH_new < newChain.size(); ++iRH_new) {
286  int layer_new = (newChain[iRH_new]->gemId().station() - 1) * 2 + newChain[iRH_new]->gemId().layer();
287 
288  const GEMEtaPartition* rhEP = (ensemble.second.find(newChain[iRH_new]->gemId().rawId()))->second;
289  GlobalPoint pos_new = rhEP->toGlobal(newChain[iRH_new]->localPosition());
290 
291  for (size_t iRH_old = 0; iRH_old < oldChain.size(); ++iRH_old) {
292  int layer_old = (oldChain[iRH_old]->gemId().station() - 1) * 2 + oldChain[iRH_old]->gemId().layer();
293  // Layers - hits on the same layer should not be allowed ==> if abs(layer_new - layer_old) > 0 is ok. if = 0 is false
294  if (layer_new == layer_old)
295  return false;
296 
297  const GEMEtaPartition* oldrhEP = (ensemble.second.find(oldChain[iRH_old]->gemId().rawId()))->second;
298  GlobalPoint pos_old = oldrhEP->toGlobal(oldChain[iRH_old]->localPosition());
299 
300  // Eta & Phi- to be chained, two hits need also to be "close" in phi and eta
301  if (phiRequirementOK == false)
302  phiRequirementOK = std::abs(reco::deltaPhi(float(pos_new.phi()), float(pos_old.phi()))) < dPhiChainBoxMax;
303  if (etaRequirementOK == false)
304  etaRequirementOK = std::abs(pos_new.eta() - pos_old.eta()) < dEtaChainBoxMax;
305  // and they should have a time difference compatible with the hypothesis
306  // that the rechits originate from the same particle, but were detected in different layers
307  if (bxRequirementOK == false) {
309  bxRequirementOK = true;
310  } else {
311  if (newChain[iRH_new]->BunchX() == oldChain[iRH_old]->BunchX())
312  bxRequirementOK = true;
313  }
314  }
315 
316  if (phiRequirementOK && etaRequirementOK && bxRequirementOK)
317  return true;
318  }
319  }
320  return false;
321 }
322 
325  std::vector<GEMSegment>& gemsegs) {
326  if (rechits.size() < minHitsPerSegment)
327  return;
328 
330  proto_segment.clear();
331 
332  // select hits from the ensemble and sort it
333  const GEMSuperChamber* suCh = ensemble.first;
334  for (auto rh = rechits.begin(); rh != rechits.end(); rh++) {
335  proto_segment.push_back(*rh);
336 
337  // for segFit - using local point in chamber frame
338  const GEMEtaPartition* thePartition = (ensemble.second.find((*rh)->gemId()))->second;
339  GlobalPoint gp = thePartition->toGlobal((*rh)->localPosition());
340  const LocalPoint lp = suCh->toLocal(gp);
341 
342  GEMRecHit* newRH = (*rh)->clone();
343  newRH->setPosition(lp);
344  MuonSegFit::MuonRecHitPtr trkRecHit(newRH);
345  muonRecHits.push_back(trkRecHit);
346  }
347 
348 #ifdef EDM_ML_DEBUG // have lines below only compiled when in debug mode
349  edm::LogVerbatim("GEMSegmentAlgorithm")
350  << "[GEMSegmentAlgorithm::buildSegments] will now try to fit a GEMSegment from collection of " << rechits.size()
351  << " GEM RecHits";
352  for (auto rh = rechits.begin(); rh != rechits.end(); ++rh) {
353  auto gemid = (*rh)->gemId();
354  auto rhLP = (*rh)->localPosition();
355  edm::LogVerbatim("GEMSegmentAlgorithm")
356  << "[RecHit :: Loc x = " << std::showpos << std::setw(9) << rhLP.x() << " Loc y = " << std::showpos
357  << std::setw(9) << rhLP.y() << " BX = " << std::showpos << (*rh)->BunchX() << " -- " << gemid.rawId() << " = "
358  << gemid << " ]";
359  }
360 #endif
361 
362  // The actual fit on all hits of the vector of the selected Tracking RecHits:
363  sfit_ = std::make_unique<MuonSegFit>(muonRecHits);
364  bool goodfit = sfit_->fit();
365  edm::LogVerbatim("GEMSegmentAlgorithm")
366  << "[GEMSegmentAlgorithm::buildSegments] GEMSegment fit done :: fit is good = " << goodfit;
367 
368  // quit function if fit was not OK
369  if (!goodfit) {
370  for (auto rh : muonRecHits)
371  rh.reset();
372  return;
373  }
374  // obtain all information necessary to make the segment:
375  LocalPoint protoIntercept = sfit_->intercept();
376  LocalVector protoDirection = sfit_->localdir();
377  AlgebraicSymMatrix protoErrors = sfit_->covarianceMatrix();
378  double protoChi2 = sfit_->chi2();
379 
380  // Calculate the bunch crossing of the GEM Segment
381  float bx = 0.0;
382  for (auto rh = rechits.begin(); rh != rechits.end(); ++rh) {
383  bx += (*rh)->BunchX();
384  }
385  if (!rechits.empty())
386  bx = bx * 1.0 / (rechits.size());
387 
388  // Calculate the central value and uncertainty of the segment time
389  // if we want to study impact of 2-3ns time resolution on GEM Segment
390  // (if there will be TDCs in readout and not just BX determination)
391  // then implement tof() method for rechits and use this here
392  /*`
393  float averageTime=0.;
394  for (auto rh=rechits.begin(); rh!=rechits.end(); ++rh){
395  GEMEtaPartition thePartition = ensemble.second.find((*rh)->gemId));
396  GlobalPoint pos = (thePartition->toGlobal((*rh)->localPosition());
397  float tof = pos.mag() * 0.01 / 0.2997925 + 25.0*(*rh)->BunchX();
398  averageTime += pos;
399  }
400  if(rechits.size() != 0) averageTime=averageTime/(rechits.size());
401  float timeUncrt=0.;
402  for (auto rh=rechits.begin(); rh!=rechits.end(); ++rh){
403  GEMEtaPartition thePartition = ensemble.second.find((*rh)->gemId));
404  GlobalPoint pos = (thePartition->toGlobal((*rh)->localPosition());
405  float tof = pos.mag() * 0.01 / 0.2997925 + 25.0*(*rh)->BunchX();
406  timeUncrt += pow(tof-averageTime,2);
407  }
408  if(rechits.size() != 0) timeUncrt=timeUncrt/(rechits.size());
409  timeUncrt = sqrt(timeUncrt);
410  */
411 
412  // save all information inside GEMCSCSegment
413  edm::LogVerbatim("GEMSegmentAlgorithm")
414  << "[GEMSegmentAlgorithm::buildSegments] will now wrap fit info in GEMSegment dataformat";
415  GEMSegment tmp(proto_segment, protoIntercept, protoDirection, protoErrors, protoChi2, bx);
416  // GEMSegment tmp(proto_segment, protoIntercept, protoDirection, protoErrors, protoChi2, averageTime, timeUncrt);
417 
418  edm::LogVerbatim("GEMSegmentAlgorithm")
419  << "[GEMSegmentAlgorithm::buildSegments] GEMSegment made in " << tmp.gemDetId();
420  edm::LogVerbatim("GEMSegmentAlgorithm") << "[GEMSegmentAlgorithm::buildSegments] " << tmp;
421 
422  for (auto rh : muonRecHits)
423  rh.reset();
424  gemsegs.push_back(tmp);
425 }
Vector3DBase< float, LocalTag >
mps_fire.i
i
Definition: mps_fire.py:355
MessageLogger.h
GEMSegmentAlgorithm::clusterHits
ProtoSegments clusterHits(const GEMEnsemble &ensemble, const EnsembleHitContainer &rechits)
Utility functions.
Definition: GEMSegmentAlgorithm.cc:95
GEMSuperChamber
Definition: GEMSuperChamber.h:19
GEMSegmentAlgorithm::proto_segment
EnsembleHitContainer proto_segment
Definition: GEMSegmentAlgorithm.h:74
PV3DBase::x
T x() const
Definition: PV3DBase.h:59
reco::deltaPhi
constexpr double deltaPhi(double phi1, double phi2)
Definition: deltaPhi.h:26
GEMSegmentAlgorithm::sfit_
std::unique_ptr< MuonSegFit > sfit_
Definition: GEMSegmentAlgorithm.h:78
GEMSegmentAlgorithm::preClustering
bool preClustering
Definition: GEMSegmentAlgorithm.h:65
GEMSegmentAlgorithm::buildSegments
void buildSegments(const GEMEnsemble &ensemble, const EnsembleHitContainer &rechits, std::vector< GEMSegment > &gemsegs)
Definition: GEMSegmentAlgorithm.cc:323
MuonSegFit::MuonRecHitContainer
std::vector< MuonRecHitPtr > MuonRecHitContainer
Definition: MuonSegFit.h:39
GEMSegmentAlgorithm.h
GEMEtaPartition
Definition: GEMEtaPartition.h:12
l1GtPatternGenerator_cfi.bx
bx
Definition: l1GtPatternGenerator_cfi.py:18
GEMSegmentAlgorithm::dPhiChainBoxMax
double dPhiChainBoxMax
Definition: GEMSegmentAlgorithm.h:69
ChiSquaredProbability.h
edm::second
U second(std::pair< T, U > const &p)
Definition: ParameterSet.cc:215
GEMSegmentAlgorithm::EnsembleHitContainer
std::vector< const GEMRecHit * > EnsembleHitContainer
Typedefs.
Definition: GEMSegmentAlgorithm.h:28
edm::ParameterSet::getUntrackedParameter
T getUntrackedParameter(std::string const &, T const &) const
createJobs.tmp
tmp
align.sh
Definition: createJobs.py:716
GEMRecHit::clone
GEMRecHit * clone() const override
Definition: GEMRecHit.cc:58
GEMSegmentAlgorithm::dEtaChainBoxMax
double dEtaChainBoxMax
Definition: GEMSegmentAlgorithm.h:70
end
#define end
Definition: vmac.h:39
GEMSegmentAlgorithm::clusterOnlySameBXRecHits
bool clusterOnlySameBXRecHits
Definition: GEMSegmentAlgorithm.h:72
GEMSegmentAlgorithm::ProtoSegments
std::vector< EnsembleHitContainer > ProtoSegments
Definition: GEMSegmentAlgorithm.h:29
GEMSegmentAlgorithm::isGoodToMerge
bool isGoodToMerge(const GEMEnsemble &ensemble, const EnsembleHitContainer &newChain, const EnsembleHitContainer &oldChain)
Definition: GEMSegmentAlgorithm.cc:278
GEMSegmentAlgorithm::chainHits
ProtoSegments chainHits(const GEMEnsemble &ensemble, const EnsembleHitContainer &rechits)
Definition: GEMSegmentAlgorithm.cc:217
GEMSegmentAlgorithmBase::GEMEnsemble
std::pair< const GEMSuperChamber *, std::map< uint32_t, const GEMEtaPartition * > > GEMEnsemble
Definition: GEMSegmentAlgorithmBase.h:25
Point3DBase< float, LocalTag >
GeomDet::toLocal
LocalPoint toLocal(const GlobalPoint &gp) const
Conversion to the R.F. of the GeomDet.
Definition: GeomDet.h:58
InitialStep_cff.seeds
seeds
Definition: InitialStep_cff.py:232
GEMSegmentAlgorithm::dXclusBoxMax
double dXclusBoxMax
Definition: GEMSegmentAlgorithm.h:66
runTauDisplay.gp
gp
Definition: runTauDisplay.py:431
GEMSegmentAlgorithm::running_max
static constexpr float running_max
Definition: GEMSegmentAlgorithm.h:77
GeomDet::toGlobal
GlobalPoint toGlobal(const Local2DPoint &lp) const
Conversion to the global R.F. from the R.F. of the GeomDet.
Definition: GeomDet.h:49
LogDebug
#define LogDebug(id)
Definition: MessageLogger.h:670
edm::ParameterSet
Definition: ParameterSet.h:36
MuonSegFit::MuonRecHitPtr
std::shared_ptr< TrackingRecHit > MuonRecHitPtr
Definition: MuonSegFit.h:38
GEMDetId
Definition: GEMDetId.h:17
TrackInfoProducer_cfi.rechits
rechits
Definition: TrackInfoProducer_cfi.py:9
PV3DBase::eta
T eta() const
Definition: PV3DBase.h:73
PV3DBase::y
T y() const
Definition: PV3DBase.h:60
GEMSegmentAlgorithm::minHitsPerSegment
unsigned int minHitsPerSegment
Definition: GEMSegmentAlgorithm.h:64
GEMSegmentAlgorithm::GEMSegmentAlgorithm
GEMSegmentAlgorithm(const edm::ParameterSet &ps)
Constructor.
Definition: GEMSegmentAlgorithm.cc:25
edm::LogVerbatim
Definition: MessageLogger.h:297
AlgebraicSymMatrix
CLHEP::HepSymMatrix AlgebraicSymMatrix
Definition: AlgebraicObjects.h:15
GEMSegment
Definition: GEMSegment.h:19
GEMSegmentAlgorithm::debug
bool debug
Definition: GEMSegmentAlgorithm.h:63
GEMSegmentAlgorithmBase
Definition: GEMSegmentAlgorithmBase.h:23
GEMSegmentAlgorithm::dYclusBoxMax
double dYclusBoxMax
Definition: GEMSegmentAlgorithm.h:67
edm::ParameterSet::getParameter
T getParameter(std::string const &) const
GEMSegmentAlgorithm::preClustering_useChaining
bool preClustering_useChaining
Definition: GEMSegmentAlgorithm.h:68
GEMSegmentAlgorithm::~GEMSegmentAlgorithm
~GEMSegmentAlgorithm() override
Destructor.
Definition: GEMSegmentAlgorithm.cc:56
DetId::rawId
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
Exception
Definition: hltDiff.cc:246
GEMRecHit
Definition: GEMRecHit.h:14
funct::abs
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
ParameterSet.h
GEMRecHit::setPosition
void setPosition(LocalPoint pos)
Set local position.
Definition: GEMRecHit.h:53
GEMSegmentAlgorithm::run
std::vector< GEMSegment > run(const GEMEnsemble &ensemble, const EnsembleHitContainer &rechits) override
Definition: GEMSegmentAlgorithm.cc:58
GlobalPoint.h
begin
#define begin
Definition: vmac.h:32
MuonSegFit.h
PV3DBase::phi
Geom::Phi< T > phi() const
Definition: PV3DBase.h:66
deltaPhi.h
findQualityFiles.size
size
Write out results.
Definition: findQualityFiles.py:443
GEMSegmentAlgorithm::maxRecHitsInCluster
int maxRecHitsInCluster
Definition: GEMSegmentAlgorithm.h:71