CMS 3D CMS Logo

List of all members | Public Types | Public Member Functions | Private Member Functions | Private Attributes
CSCSegAlgoSK Class Reference

#include <CSCSegAlgoSK.h>

Inheritance diagram for CSCSegAlgoSK:
CSCSegmentAlgorithm

Public Types

typedef std::deque< bool > BoolContainer
 
typedef std::vector< const CSCRecHit2D * > ChamberHitContainer
 
typedef std::vector< const CSCRecHit2D * >::const_iterator ChamberHitContainerCIt
 
typedef std::vector< int > LayerIndex
 Typedefs. More...
 

Public Member Functions

std::vector< CSCSegmentbuildSegments (const ChamberHitContainer &rechits)
 
 CSCSegAlgoSK (const edm::ParameterSet &ps)
 Constructor. More...
 
std::vector< CSCSegmentrun (const CSCChamber *aChamber, const ChamberHitContainer &rechits) override
 
 ~CSCSegAlgoSK () override
 Destructor. More...
 
- Public Member Functions inherited from CSCSegmentAlgorithm
 CSCSegmentAlgorithm (const edm::ParameterSet &)
 Constructor. More...
 
virtual std::vector< CSCSegmentrun (const CSCChamber *chamber, const std::vector< const CSCRecHit2D * > &rechits)=0
 
virtual ~CSCSegmentAlgorithm ()
 Destructor. More...
 

Private Member Functions

bool addHit (const CSCRecHit2D *hit, int layer)
 Utility functions. More...
 
bool areHitsCloseInGlobalPhi (const CSCRecHit2D *h1, const CSCRecHit2D *h2) const
 
bool areHitsCloseInLocalX (const CSCRecHit2D *h1, const CSCRecHit2D *h2) const
 Utility functions. More...
 
void compareProtoSegment (const CSCRecHit2D *h, int layer)
 
void dumpHits (const ChamberHitContainer &rechits) const
 
void dumpSegment (const CSCSegment &seg) const
 
void flagHitsAsUsed (const ChamberHitContainer &rechitsInChamber, BoolContainer &used) const
 
bool hasHitOnLayer (int layer) const
 
void increaseProtoSegment (const CSCRecHit2D *h, int layer)
 
bool isHitNearSegment (const CSCRecHit2D *h) const
 
bool isSegmentGood (const ChamberHitContainer &rechitsInChamber) const
 
float phiAtZ (float z) const
 
bool replaceHit (const CSCRecHit2D *h, int layer)
 
void tryAddingHitsToSegment (const ChamberHitContainer &rechitsInChamber, const BoolContainer &used, const LayerIndex &layerIndex, const ChamberHitContainerCIt i1, const ChamberHitContainerCIt i2)
 
void updateParameters (void)
 

Private Attributes

float chi2Max
 
bool debugInfo
 
float dPhiFineMax
 
float dPhiMax
 
float dRPhiFineMax
 
float dRPhiMax
 
int minLayersApart
 
const std::string myName
 
ChamberHitContainer proto_segment
 
CSCSegFitsfit_
 
const CSCChambertheChamber
 
float wideSeg
 
float windowScale
 

Detailed Description

This is the original algorithm for building endcap muon track segments out of the rechit's in a CSCChamber. cf. CSCSegmentizerTC.
'SK' = 'Sasha Khanov' = Speed King

A CSCSegment is a RecSegment4D, and is built from CSCRecHit2D objects, each of which is a RecHit2DLocalPos.

This class is used by the CSCSegmentAlgorithm.
Alternative algorithms can be used for the segment building by writing classes like this, and then selecting which one is actually used via the CSCSegmentBuilder.

Original (in FORTRAN): Alexa.nosp@m.ndre.nosp@m..Khan.nosp@m.ov@c.nosp@m.ern.c.nosp@m.h
Ported to C++ and improved: Rick..nosp@m.Wilk.nosp@m.inson.nosp@m.@cer.nosp@m.n.ch
Reimplemented in terms of layer index, and bug fix: Tim.C.nosp@m.ox@c.nosp@m.ern.c.nosp@m.h
Ported to CMSSW 2006-04-03: Matte.nosp@m.o.Sa.nosp@m.ni@ce.nosp@m.rn.c.nosp@m.h
Factored out segment fitter Tim.C.nosp@m.ox@c.nosp@m.ern.c.nosp@m.h Feb-2015

Definition at line 35 of file CSCSegAlgoSK.h.

Member Typedef Documentation

◆ BoolContainer

typedef std::deque<bool> CSCSegAlgoSK::BoolContainer

Definition at line 56 of file CSCSegAlgoSK.h.

◆ ChamberHitContainer

typedef std::vector<const CSCRecHit2D*> CSCSegAlgoSK::ChamberHitContainer

Definition at line 48 of file CSCSegAlgoSK.h.

◆ ChamberHitContainerCIt

typedef std::vector<const CSCRecHit2D*>::const_iterator CSCSegAlgoSK::ChamberHitContainerCIt

Definition at line 49 of file CSCSegAlgoSK.h.

◆ LayerIndex

typedef std::vector<int> CSCSegAlgoSK::LayerIndex

Typedefs.

Definition at line 47 of file CSCSegAlgoSK.h.

Constructor & Destructor Documentation

◆ CSCSegAlgoSK()

CSCSegAlgoSK::CSCSegAlgoSK ( const edm::ParameterSet ps)
explicit

Constructor.

Definition at line 19 of file CSCSegAlgoSK.cc.

20  : CSCSegmentAlgorithm(ps), myName("CSCSegAlgoSK"), sfit_(nullptr) {
21  debugInfo = ps.getUntrackedParameter<bool>("verboseInfo");
22 
23  dRPhiMax = ps.getParameter<double>("dRPhiMax");
24  dPhiMax = ps.getParameter<double>("dPhiMax");
25  dRPhiFineMax = ps.getParameter<double>("dRPhiFineMax");
26  dPhiFineMax = ps.getParameter<double>("dPhiFineMax");
27  chi2Max = ps.getParameter<double>("chi2Max");
28  wideSeg = ps.getParameter<double>("wideSeg");
29  minLayersApart = ps.getParameter<int>("minLayersApart");
30 
31  LogDebug("CSC") << myName << " has algorithm cuts set to: \n"
32  << "--------------------------------------------------------------------\n"
33  << "dRPhiMax = " << dRPhiMax << '\n'
34  << "dPhiMax = " << dPhiMax << '\n'
35  << "dRPhiFineMax = " << dRPhiFineMax << '\n'
36  << "dPhiFineMax = " << dPhiFineMax << '\n'
37  << "chi2Max = " << chi2Max << '\n'
38  << "wideSeg = " << wideSeg << '\n'
39  << "minLayersApart = " << minLayersApart << std::endl;
40 }

References chi2Max, debugInfo, dPhiFineMax, dPhiMax, dRPhiFineMax, dRPhiMax, edm::ParameterSet::getParameter(), edm::ParameterSet::getUntrackedParameter(), LogDebug, minLayersApart, myName, and wideSeg.

◆ ~CSCSegAlgoSK()

CSCSegAlgoSK::~CSCSegAlgoSK ( )
inlineoverride

Destructor.

Definition at line 61 of file CSCSegAlgoSK.h.

61 {};

Member Function Documentation

◆ addHit()

bool CSCSegAlgoSK::addHit ( const CSCRecHit2D hit,
int  layer 
)
private

Utility functions.

Definition at line 358 of file CSCSegAlgoSK.cc.

358  {
359  // Return true if hit was added successfully
360  // (and then parameters are updated).
361  // Return false if there is already a hit on the same layer, or insert failed.
362 
363  ChamberHitContainer::const_iterator it;
364 
365  for (it = proto_segment.begin(); it != proto_segment.end(); it++)
366  if (((*it)->cscDetId().layer() == layer) && (aHit != (*it)))
367  return false;
368 
369  proto_segment.push_back(aHit);
370 
371  // make a fit
373  return true;
374 }

References proto_segment, and updateParameters().

Referenced by buildSegments(), increaseProtoSegment(), and replaceHit().

◆ areHitsCloseInGlobalPhi()

bool CSCSegAlgoSK::areHitsCloseInGlobalPhi ( const CSCRecHit2D h1,
const CSCRecHit2D h2 
) const
private

Definition at line 244 of file CSCSegAlgoSK.cc.

244  {
245  const CSCLayer* l1 = theChamber->layer(h1->cscDetId().layer());
246  GlobalPoint gp1 = l1->toGlobal(h1->localPosition());
247  const CSCLayer* l2 = theChamber->layer(h2->cscDetId().layer());
248  GlobalPoint gp2 = l2->toGlobal(h2->localPosition());
249 
250  float h1p = gp1.phi();
251  float h2p = gp2.phi();
252  float dphi12 = h1p - h2p;
253 
254  // Into range [-pi, pi) (phi() returns values in this range)
255  if (dphi12 < -M_PI)
256  dphi12 += 2. * M_PI;
257  if (dphi12 > M_PI)
258  dphi12 -= 2. * M_PI;
259  LogDebug("CSC") << " Hits at global phi= " << h1p << ", " << h2p << " have separation= " << dphi12;
260  return (fabs(dphi12) < (dPhiMax * windowScale)) ? true : false; // +v
261 }

References CSCRecHit2D::cscDetId(), dPhiMax, CSCDetId::layer(), CSCChamber::layer(), CSCRecHit2D::localPosition(), LogDebug, M_PI, PV3DBase< T, PVType, FrameType >::phi(), theChamber, GeomDet::toGlobal(), funct::true, and windowScale.

Referenced by buildSegments().

◆ areHitsCloseInLocalX()

bool CSCSegAlgoSK::areHitsCloseInLocalX ( const CSCRecHit2D h1,
const CSCRecHit2D h2 
) const
private

Utility functions.

Definition at line 237 of file CSCSegAlgoSK.cc.

237  {
238  float deltaX = (h1->localPosition() - h2->localPosition()).x();
239  LogDebug("CSC") << " Hits at local x= " << h1->localPosition().x() << ", " << h2->localPosition().x()
240  << " have separation= " << deltaX;
241  return (fabs(deltaX) < (dRPhiMax * windowScale)) ? true : false; // +v
242 }

References dRPhiMax, CSCRecHit2D::localPosition(), LogDebug, funct::true, windowScale, and x.

Referenced by buildSegments().

◆ buildSegments()

std::vector< CSCSegment > CSCSegAlgoSK::buildSegments ( const ChamberHitContainer rechits)

Build track segments in this chamber (this is where the actual segment-building algorithm hides.)

Definition at line 47 of file CSCSegAlgoSK.cc.

47  {
48  LogDebug("CSC") << "*********************************************";
49  LogDebug("CSC") << "Start segment building in the new chamber: " << theChamber->specs()->chamberTypeName();
50  LogDebug("CSC") << "*********************************************";
51 
52  ChamberHitContainer rechits = urechits;
53  LayerIndex layerIndex(rechits.size());
54 
55  for (unsigned int i = 0; i < rechits.size(); i++) {
56  layerIndex[i] = rechits[i]->cscDetId().layer();
57  }
58 
59  double z1 = theChamber->layer(1)->position().z();
60  double z6 = theChamber->layer(6)->position().z();
61 
62  if (z1 > 0.) {
63  if (z1 > z6) {
64  reverse(layerIndex.begin(), layerIndex.end());
65  reverse(rechits.begin(), rechits.end());
66  }
67  } else if (z1 < 0.) {
68  if (z1 < z6) {
69  reverse(layerIndex.begin(), layerIndex.end());
70  reverse(rechits.begin(), rechits.end());
71  }
72  }
73 
74  // if (debugInfo) dumpHits(rechits);
75 
76  if (rechits.size() < 2) {
77  LogDebug("CSC") << myName << ": " << rechits.size() << " hit(s) in chamber is not enough to build a segment.\n";
78  return std::vector<CSCSegment>();
79  }
80 
81  // We have at least 2 hits. We intend to try all possible pairs of hits to start
82  // segment building. 'All possible' means each hit lies on different layers in the chamber.
83  // BUT... once a hit has been assigned to a segment, we don't consider
84  // it again.
85 
86  // Choose first hit (as close to IP as possible) h1 and
87  // second hit (as far from IP as possible) h2
88  // To do this we iterate over hits in the chamber by layer - pick two layers.
89  // @@ Require the two layers are at least 3 layers apart. May need tuning?
90  // Then we iterate over hits within each of these layers and pick h1 and h2 from these.
91  // If they are 'close enough' we build an empty segment.
92  // Then try adding hits to this segment.
93 
94  // Initialize flags that a given hit has been allocated to a segment
95  BoolContainer used(rechits.size(), false);
96 
97  // Define buffer for segments we build
98  std::vector<CSCSegment> segments;
99 
100  // This is going to point to fits to hits, and its content will be used to create a CSCSegment
101  sfit_ = nullptr;
102 
104  ChamberHitContainerCIt ie = rechits.end();
105 
106  // Possibly allow 2 passes, second widening scale factor for cuts
107  windowScale = 1.; // scale factor for cuts
108 
109  int npass = (wideSeg > 1.) ? 2 : 1;
110 
111  for (int ipass = 0; ipass < npass; ++ipass) {
112  for (ChamberHitContainerCIt i1 = ib; i1 != ie; ++i1) {
113  bool segok = false;
114  if (used[i1 - ib])
115  continue;
116 
117  int layer1 = layerIndex[i1 - ib]; //(*i1)->cscDetId().layer();
118  const CSCRecHit2D* h1 = *i1;
119 
120  for (ChamberHitContainerCIt i2 = ie - 1; i2 != i1; --i2) {
121  if (used[i2 - ib])
122  continue;
123 
124  int layer2 = layerIndex[i2 - ib]; //(*i2)->cscDetId().layer();
125 
126  if (abs(layer2 - layer1) < minLayersApart)
127  break;
128  const CSCRecHit2D* h2 = *i2;
129 
130  if (areHitsCloseInLocalX(h1, h2) && areHitsCloseInGlobalPhi(h1, h2)) {
131  proto_segment.clear();
132 
133  const CSCLayer* l1 = theChamber->layer(layer1);
134  GlobalPoint gp1 = l1->toGlobal(h1->localPosition());
135  const CSCLayer* l2 = theChamber->layer(layer2);
136  GlobalPoint gp2 = l2->toGlobal(h2->localPosition());
137  LogDebug("CSC") << "start new segment from hits "
138  << "h1: " << gp1 << " - h2: " << gp2 << "\n";
139 
140  //@@ TRY ADDING A HIT - AND FIT
141  if (!addHit(h1, layer1)) {
142  LogDebug("CSC") << " failed to add hit h1\n";
143  continue;
144  }
145 
146  if (!addHit(h2, layer2)) {
147  LogDebug("CSC") << " failed to add hit h2\n";
148  continue;
149  }
150 
151  // Can only add hits if already have a segment
152  if (sfit_)
153  tryAddingHitsToSegment(rechits, used, layerIndex, i1, i2);
154 
155  // Check no. of hits on segment, and if enough flag them as used
156  // and store the segment
157  segok = isSegmentGood(rechits);
158  if (segok) {
159  flagHitsAsUsed(rechits, used);
160  // Copy the proto_segment and its properties inside a CSCSegment.
161  // Then fill the segment vector..
162 
163  if (proto_segment.empty()) {
164  LogDebug("CSC") << "No segment has been found !!!\n";
165  } else {
166  // Create an actual CSCSegment - retrieve all info from the fit
169  delete sfit_;
170  sfit_ = nullptr;
171  LogDebug("CSC") << "Found a segment !!!\n";
172  if (debugInfo)
173  dumpSegment(temp);
174  segments.push_back(temp);
175  }
176  }
177  } // h1 & h2 close
178 
179  if (segok)
180  break;
181  } // i2
182  } // i1
183 
184  if (segments.size() > 1)
185  break; // only change window if no segments found
186 
187  // Increase cut windows by factor of wideSeg
189 
190  } // ipass
191 
192  // Give the segments to the CSCChamber
193  return segments;
194 }

References funct::abs(), addHit(), areHitsCloseInGlobalPhi(), areHitsCloseInLocalX(), CSCChamberSpecs::chamberTypeName(), CSCSegFit::chi2(), CSCSegFit::covarianceMatrix(), debugInfo, dumpSegment(), flagHitsAsUsed(), CSCSegFit::hits(), mps_fire::i, testProducerWithPsetDescEmpty_cfi::i1, testProducerWithPsetDescEmpty_cfi::i2, cuy::ib, CSCSegFit::intercept(), isSegmentGood(), CSCChamber::layer(), CSCSegFit::localdir(), CSCRecHit2D::localPosition(), LogDebug, minLayersApart, myName, GeomDet::position(), proto_segment, HI_PhotonSkim_cff::rechits, groupFilesInBlocks::reverse, sfit_, CSCChamber::specs(), groupFilesInBlocks::temp, theChamber, GeomDet::toGlobal(), tryAddingHitsToSegment(), wideSeg, windowScale, and PV3DBase< T, PVType, FrameType >::z().

Referenced by run().

◆ compareProtoSegment()

void CSCSegAlgoSK::compareProtoSegment ( const CSCRecHit2D h,
int  layer 
)
private

Definition at line 407 of file CSCSegAlgoSK.cc.

407  {
408  // Copy the input CSCSegFit
409  CSCSegFit* oldfit = new CSCSegFit(*sfit_);
410 
411  // May create a new fit
412  bool ok = replaceHit(h, layer);
413 
414  if (ok) {
415  LogDebug("CSCSegment") << " hit in same layer as a hit on segment; try replacing old one..."
416  << " chi2 new: " << sfit_->chi2() << " old: " << oldfit->chi2() << "\n";
417  }
418 
419  if ((sfit_->chi2() < oldfit->chi2()) && ok) {
420  LogDebug("CSC") << " segment with replaced hit is better.\n";
421  delete oldfit; // new fit is better
422  } else {
423  // keep original fit
424  delete sfit_; // now the new fit
425  sfit_ = oldfit; // reset to the original input fit
426  }
427 }

References CSCSegFit::chi2(), LogDebug, convertSQLiteXML::ok, replaceHit(), and sfit_.

Referenced by tryAddingHitsToSegment().

◆ dumpHits()

void CSCSegAlgoSK::dumpHits ( const ChamberHitContainer rechits) const
private

Dump position and phi of each rechit in chamber after sort in z

Definition at line 313 of file CSCSegAlgoSK.cc.

313  {
314  // Dump positions of RecHit's in each CSCChamber
316  edm::LogInfo("CSCSegment") << "CSCChamber rechit dump.\n";
317  for (it = rechits.begin(); it != rechits.end(); it++) {
318  const CSCLayer* l1 = theChamber->layer((*it)->cscDetId().layer());
319  GlobalPoint gp1 = l1->toGlobal((*it)->localPosition());
320 
321  edm::LogInfo("CSCSegment") << "Global pos.: " << gp1 << ", phi: " << gp1.phi()
322  << ". Local position: " << (*it)->localPosition()
323  << ", phi: " << (*it)->localPosition().phi() << ". Layer: " << (*it)->cscDetId().layer()
324  << "\n";
325  }
326 }

References CSCChamber::layer(), PV3DBase< T, PVType, FrameType >::phi(), Geom::Phi< T1, Range >::phi(), HI_PhotonSkim_cff::rechits, theChamber, and GeomDet::toGlobal().

◆ dumpSegment()

void CSCSegAlgoSK::dumpSegment ( const CSCSegment seg) const
private

Definition at line 453 of file CSCSegAlgoSK.cc.

453  {
454  edm::LogVerbatim("CSCSegment") << "CSCSegment in " << theChamber->id() << "\nlocal position = " << seg.localPosition()
455  << "\nerror = " << seg.localPositionError()
456  << "\nlocal direction = " << seg.localDirection()
457  << "\nerror =" << seg.localDirectionError() << "\ncovariance matrix"
458  << seg.parametersError() << "chi2/ndf = " << seg.chi2() << "/"
459  << seg.degreesOfFreedom() << "\n#rechits = " << seg.specificRecHits().size()
460  << "\ntime = " << seg.time();
461 }

References CSCSegment::chi2(), CSCSegment::degreesOfFreedom(), CSCChamber::id(), CSCSegment::localDirection(), CSCSegment::localDirectionError(), CSCSegment::localPosition(), CSCSegment::localPositionError(), CSCSegment::parametersError(), CSCSegment::specificRecHits(), theChamber, and CSCSegment::time().

Referenced by buildSegments().

◆ flagHitsAsUsed()

void CSCSegAlgoSK::flagHitsAsUsed ( const ChamberHitContainer rechitsInChamber,
BoolContainer used 
) const
private

Flag hits on segment as used

Definition at line 345 of file CSCSegAlgoSK.cc.

345  {
346  // Flag hits on segment as used
347  ChamberHitContainerCIt ib = rechitsInChamber.begin();
349 
350  for (hi = proto_segment.begin(); hi != proto_segment.end(); ++hi) {
351  for (iu = ib; iu != rechitsInChamber.end(); ++iu) {
352  if (*hi == *iu)
353  used[iu - ib] = true;
354  }
355  }
356 }

References cuy::ib, and proto_segment.

Referenced by buildSegments().

◆ hasHitOnLayer()

bool CSCSegAlgoSK::hasHitOnLayer ( int  layer) const
private

Definition at line 383 of file CSCSegAlgoSK.cc.

383  {
384  // Is there is already a hit on this layer?
386 
387  for (it = proto_segment.begin(); it != proto_segment.end(); it++)
388  if ((*it)->cscDetId().layer() == layer)
389  return true;
390 
391  return false;
392 }

References proto_segment.

Referenced by tryAddingHitsToSegment().

◆ increaseProtoSegment()

void CSCSegAlgoSK::increaseProtoSegment ( const CSCRecHit2D h,
int  layer 
)
private

Definition at line 429 of file CSCSegAlgoSK.cc.

429  {
430  // Copy input fit
431  CSCSegFit* oldfit = new CSCSegFit(*sfit_);
432 
433  // Creates a new fit
434  bool ok = addHit(h, layer);
435 
436  if (ok) {
437  LogDebug("CSCSegment") << " hit in new layer: added to segment, new chi2: " << sfit_->chi2() << "\n";
438  }
439 
440  // int ndf = 2*proto_segment.size() - 4;
441 
442  //@@ TEST ON ndof<=0 IS JUST TO ACCEPT nhits=2 CASE??
443  if (ok && ((sfit_->ndof() <= 0) || (sfit_->chi2() / sfit_->ndof() < chi2Max))) {
444  LogDebug("CSCSegment") << " segment with added hit is good.\n";
445  delete oldfit; // new fit is better
446  } else {
447  // reset to original fit
448  delete sfit_;
449  sfit_ = oldfit;
450  }
451 }

References addHit(), CSCSegFit::chi2(), chi2Max, LogDebug, CSCSegFit::ndof(), convertSQLiteXML::ok, and sfit_.

Referenced by tryAddingHitsToSegment().

◆ isHitNearSegment()

bool CSCSegAlgoSK::isHitNearSegment ( const CSCRecHit2D h) const
private

Definition at line 263 of file CSCSegAlgoSK.cc.

263  {
264  // Is hit near segment?
265  // Requires deltaphi and rxy*deltaphi within ranges specified
266  // in parameter set, where rxy=sqrt(x**2+y**2) of hit itself.
267  // Note that to make intuitive cuts on delta(phi) one must work in
268  // phi range (-pi, +pi] not [0, 2pi)
269 
270  const CSCLayer* l1 = theChamber->layer(h->cscDetId().layer());
271  GlobalPoint hp = l1->toGlobal(h->localPosition());
272 
273  float hphi = hp.phi(); // in (-pi, +pi]
274  if (hphi < 0.)
275  hphi += 2. * M_PI; // into range [0, 2pi)
276  float sphi = phiAtZ(hp.z()); // in [0, 2*pi)
277  float phidif = sphi - hphi;
278  if (phidif < 0.)
279  phidif += 2. * M_PI; // into range [0, 2pi)
280  if (phidif > M_PI)
281  phidif -= 2. * M_PI; // into range (-pi, pi]
282 
283  float dRPhi = fabs(phidif) * hp.perp();
284  LogDebug("CSC") << " is hit at phi_h= " << hphi << " near segment phi_seg= " << sphi << "? is " << dRPhi << "<"
285  << dRPhiFineMax * windowScale << " ? "
286  << " and is |" << phidif << "|<" << dPhiFineMax * windowScale << " ?";
287 
288  return ((dRPhi < dRPhiFineMax * windowScale) && (fabs(phidif) < dPhiFineMax * windowScale)) ? true : false; // +v
289 }

References dPhiFineMax, dRPhiFineMax, trackingPlots::hp, CSCChamber::layer(), LogDebug, M_PI, phiAtZ(), theChamber, GeomDet::toGlobal(), funct::true, and windowScale.

Referenced by tryAddingHitsToSegment().

◆ isSegmentGood()

bool CSCSegAlgoSK::isSegmentGood ( const ChamberHitContainer rechitsInChamber) const
private

Return true if segment is 'good'. In this algorithm, 'good' means has sufficient hits

Definition at line 328 of file CSCSegAlgoSK.cc.

328  {
329  // If the chamber has 20 hits or fewer, require at least 3 hits on segment
330  // If the chamber has >20 hits require at least 4 hits
331 
332  bool ok = false;
333 
334  unsigned int iadd = (rechitsInChamber.size() > 20) ? 1 : 0;
335 
336  if (windowScale > 1.)
337  iadd = 1;
338 
339  if (proto_segment.size() >= 3 + iadd)
340  ok = true;
341 
342  return ok;
343 }

References convertSQLiteXML::ok, proto_segment, and windowScale.

Referenced by buildSegments().

◆ phiAtZ()

float CSCSegAlgoSK::phiAtZ ( float  z) const
private

Definition at line 291 of file CSCSegAlgoSK.cc.

291  {
292  if (!sfit_) {
293  edm::LogVerbatim("CSCSegment") << "[CSCSegAlgoSK::phiAtZ] Segment fit undefined";
294  return 0.;
295  }
296 
297  // Returns a phi in [ 0, 2*pi )
298  const CSCLayer* l1 = theChamber->layer((*(proto_segment.begin()))->cscDetId().layer());
300  GlobalVector gv = l1->toGlobal(sfit_->localdir());
301 
302  LogTrace("CSCSegment") << "[CSCSegAlgoSK::phiAtZ] Global intercept = " << gp << ", direction = " << gv;
303 
304  float x = gp.x() + (gv.x() / gv.z()) * (z - gp.z());
305  float y = gp.y() + (gv.y() / gv.z()) * (z - gp.z());
306  float phi = atan2(y, x);
307  if (phi < 0.f)
308  phi += 2. * M_PI;
309 
310  return phi;
311 }

References f, runTauDisplay::gp, CSCSegFit::intercept(), CSCChamber::layer(), CSCSegFit::localdir(), LogTrace, M_PI, phi, proto_segment, sfit_, theChamber, GeomDet::toGlobal(), x, y, and z.

Referenced by isHitNearSegment().

◆ replaceHit()

bool CSCSegAlgoSK::replaceHit ( const CSCRecHit2D h,
int  layer 
)
private

Definition at line 394 of file CSCSegAlgoSK.cc.

394  {
395  // replace a hit from a layer
396  ChamberHitContainer::iterator it;
397  for (it = proto_segment.begin(); it != proto_segment.end();) {
398  if ((*it)->cscDetId().layer() == layer)
399  it = proto_segment.erase(it);
400  else
401  ++it;
402  }
403 
404  return addHit(h, layer);
405 }

References addHit(), and proto_segment.

Referenced by compareProtoSegment().

◆ run()

std::vector< CSCSegment > CSCSegAlgoSK::run ( const CSCChamber aChamber,
const ChamberHitContainer rechits 
)
override

Here we must implement the algorithm

Definition at line 42 of file CSCSegAlgoSK.cc.

42  {
43  theChamber = aChamber;
44  return buildSegments(rechits);
45 }

References buildSegments(), HI_PhotonSkim_cff::rechits, and theChamber.

◆ tryAddingHitsToSegment()

void CSCSegAlgoSK::tryAddingHitsToSegment ( const ChamberHitContainer rechitsInChamber,
const BoolContainer used,
const LayerIndex layerIndex,
const ChamberHitContainerCIt  i1,
const ChamberHitContainerCIt  i2 
)
private

Try adding non-used hits to segment

Definition at line 196 of file CSCSegAlgoSK.cc.

200  {
201  // Iterate over the layers with hits in the chamber
202  // Skip the layers containing the segment endpoints
203  // Test each hit on the other layers to see if it is near the segment
204  // If it is, see whether there is already a hit on the segment from the same layer
205  // - if so, and there are more than 2 hits on the segment, copy the segment,
206  // replace the old hit with the new hit. If the new segment chi2 is better
207  // then replace the original segment with the new one (by swap)
208  // - if not, copy the segment, add the hit. If the new chi2/dof is still satisfactory
209  // then replace the original segment with the new one (by swap)
210 
212  ChamberHitContainerCIt ie = rechits.end();
213 
214  for (ChamberHitContainerCIt i = ib; i != ie; ++i) {
215  if (i == i1 || i == i2 || used[i - ib])
216  continue;
217 
218  int layer = layerIndex[i - ib];
219  const CSCRecHit2D* h = *i;
220  if (isHitNearSegment(h)) {
221  GlobalPoint gp1 = theChamber->layer(layer)->toGlobal(h->localPosition());
222  LogDebug("CSC") << " hit at global " << gp1 << " is near segment\n.";
223 
224  // Don't consider alternate hits on layers holding the two starting points
225  if (hasHitOnLayer(layer)) {
226  if (proto_segment.size() <= 2) {
227  LogDebug("CSC") << " " << proto_segment.size() << " hits on segment...skip hit on same layer.\n";
228  continue;
229  }
230  compareProtoSegment(h, layer);
231  } else
232  increaseProtoSegment(h, layer);
233  } // h & seg close
234  } // i
235 }

References compareProtoSegment(), hasHitOnLayer(), mps_fire::i, testProducerWithPsetDescEmpty_cfi::i1, testProducerWithPsetDescEmpty_cfi::i2, cuy::ib, increaseProtoSegment(), isHitNearSegment(), CSCChamber::layer(), LogDebug, proto_segment, HI_PhotonSkim_cff::rechits, theChamber, and GeomDet::toGlobal().

Referenced by buildSegments().

◆ updateParameters()

void CSCSegAlgoSK::updateParameters ( void  )
private

Definition at line 376 of file CSCSegAlgoSK.cc.

376  {
377  // Delete input CSCSegFit, create a new one and make the fit
378  delete sfit_;
380  sfit_->fit();
381 }

References CSCSegFit::fit(), proto_segment, sfit_, and theChamber.

Referenced by addHit().

Member Data Documentation

◆ chi2Max

float CSCSegAlgoSK::chi2Max
private

Definition at line 129 of file CSCSegAlgoSK.h.

Referenced by CSCSegAlgoSK(), and increaseProtoSegment().

◆ debugInfo

bool CSCSegAlgoSK::debugInfo
private

Definition at line 132 of file CSCSegAlgoSK.h.

Referenced by buildSegments(), and CSCSegAlgoSK().

◆ dPhiFineMax

float CSCSegAlgoSK::dPhiFineMax
private

Definition at line 128 of file CSCSegAlgoSK.h.

Referenced by CSCSegAlgoSK(), and isHitNearSegment().

◆ dPhiMax

float CSCSegAlgoSK::dPhiMax
private

Definition at line 126 of file CSCSegAlgoSK.h.

Referenced by areHitsCloseInGlobalPhi(), and CSCSegAlgoSK().

◆ dRPhiFineMax

float CSCSegAlgoSK::dRPhiFineMax
private

Definition at line 127 of file CSCSegAlgoSK.h.

Referenced by CSCSegAlgoSK(), and isHitNearSegment().

◆ dRPhiMax

float CSCSegAlgoSK::dRPhiMax
private

Definition at line 125 of file CSCSegAlgoSK.h.

Referenced by areHitsCloseInLocalX(), and CSCSegAlgoSK().

◆ minLayersApart

int CSCSegAlgoSK::minLayersApart
private

Definition at line 131 of file CSCSegAlgoSK.h.

Referenced by buildSegments(), and CSCSegAlgoSK().

◆ myName

const std::string CSCSegAlgoSK::myName
private

Definition at line 122 of file CSCSegAlgoSK.h.

Referenced by buildSegments(), and CSCSegAlgoSK().

◆ proto_segment

ChamberHitContainer CSCSegAlgoSK::proto_segment
private

◆ sfit_

CSCSegFit* CSCSegAlgoSK::sfit_
private

◆ theChamber

const CSCChamber* CSCSegAlgoSK::theChamber
private

◆ wideSeg

float CSCSegAlgoSK::wideSeg
private

Definition at line 130 of file CSCSegAlgoSK.h.

Referenced by buildSegments(), and CSCSegAlgoSK().

◆ windowScale

float CSCSegAlgoSK::windowScale
private
CSCSegment::specificRecHits
const std::vector< CSCRecHit2D > & specificRecHits() const
Definition: CSCSegment.h:66
Vector3DBase
Definition: Vector3DBase.h:8
GeomDet::position
const Surface::PositionType & position() const
The position (origin of the R.F.)
Definition: GeomDet.h:43
CSCSegAlgoSK::sfit_
CSCSegFit * sfit_
Definition: CSCSegAlgoSK.h:134
DDAxes::y
testProducerWithPsetDescEmpty_cfi.i2
i2
Definition: testProducerWithPsetDescEmpty_cfi.py:46
mps_fire.i
i
Definition: mps_fire.py:428
CSCChamber::layer
const CSCLayer * layer(CSCDetId id) const
Return the layer corresponding to the given id.
Definition: CSCChamber.cc:30
CSCSegFit::hits
CSCSetOfHits hits(void) const
Definition: CSCSegFit.h:79
CSCSegFit::covarianceMatrix
AlgebraicSymMatrix covarianceMatrix(void)
Definition: CSCSegFit.cc:352
f
double f[11][100]
Definition: MuScleFitUtils.cc:78
CSCSegment::time
float time() const
Definition: CSCSegment.cc:144
testProducerWithPsetDescEmpty_cfi.i1
i1
Definition: testProducerWithPsetDescEmpty_cfi.py:45
CSCSegAlgoSK::addHit
bool addHit(const CSCRecHit2D *hit, int layer)
Utility functions.
Definition: CSCSegAlgoSK.cc:358
CSCSegAlgoSK::flagHitsAsUsed
void flagHitsAsUsed(const ChamberHitContainer &rechitsInChamber, BoolContainer &used) const
Definition: CSCSegAlgoSK.cc:345
CSCLayer
Definition: CSCLayer.h:24
CSCSegFit
Definition: CSCSegFit.h:30
CSCSegFit::localdir
LocalVector localdir() const
Definition: CSCSegFit.h:85
edm::ParameterSet::getUntrackedParameter
T getUntrackedParameter(std::string const &, T const &) const
DDAxes::x
edm::LogInfo
Log< level::Info, false > LogInfo
Definition: MessageLogger.h:125
CSCSegFit::fit
void fit(void)
Definition: CSCSegFit.cc:13
CSCSegAlgoSK::chi2Max
float chi2Max
Definition: CSCSegAlgoSK.h:129
convertSQLiteXML.ok
bool ok
Definition: convertSQLiteXML.py:98
groupFilesInBlocks.temp
list temp
Definition: groupFilesInBlocks.py:142
CSCRecHit2D::cscDetId
CSCDetId cscDetId() const
Definition: CSCRecHit2D.h:58
groupFilesInBlocks.reverse
reverse
Definition: groupFilesInBlocks.py:131
PV3DBase::z
T z() const
Definition: PV3DBase.h:61
CSCSegAlgoSK::ChamberHitContainer
std::vector< const CSCRecHit2D * > ChamberHitContainer
Definition: CSCSegAlgoSK.h:48
CSCSegAlgoSK::isHitNearSegment
bool isHitNearSegment(const CSCRecHit2D *h) const
Definition: CSCSegAlgoSK.cc:263
CSCSegAlgoSK::ChamberHitContainerCIt
std::vector< const CSCRecHit2D * >::const_iterator ChamberHitContainerCIt
Definition: CSCSegAlgoSK.h:49
CSCSegAlgoSK::dRPhiFineMax
float dRPhiFineMax
Definition: CSCSegAlgoSK.h:127
CSCSegFit::ndof
int ndof(void) const
Definition: CSCSegFit.h:83
trackingPlots.hp
hp
Definition: trackingPlots.py:1248
CSCSegment::degreesOfFreedom
int degreesOfFreedom() const override
Degrees of freedom of the segment fit.
Definition: CSCSegment.h:62
CSCSegAlgoSK::theChamber
const CSCChamber * theChamber
Definition: CSCSegAlgoSK.h:120
CSCDetId::layer
int layer() const
Definition: CSCDetId.h:56
DDAxes::z
CSCSegAlgoSK::debugInfo
bool debugInfo
Definition: CSCSegAlgoSK.h:132
CSCSegAlgoSK::dumpSegment
void dumpSegment(const CSCSegment &seg) const
Definition: CSCSegAlgoSK.cc:453
HI_PhotonSkim_cff.rechits
rechits
Definition: HI_PhotonSkim_cff.py:76
h
CSCSegAlgoSK::isSegmentGood
bool isSegmentGood(const ChamberHitContainer &rechitsInChamber) const
Definition: CSCSegAlgoSK.cc:328
Point3DBase< float, GlobalTag >
CSCSegAlgoSK::dRPhiMax
float dRPhiMax
Definition: CSCSegAlgoSK.h:125
CSCSegFit::chi2
double chi2(void) const
Definition: CSCSegFit.h:82
CSCSegment
Definition: CSCSegment.h:21
CSCSegAlgoSK::compareProtoSegment
void compareProtoSegment(const CSCRecHit2D *h, int layer)
Definition: CSCSegAlgoSK.cc:407
CSCSegAlgoSK::BoolContainer
std::deque< bool > BoolContainer
Definition: CSCSegAlgoSK.h:56
CSCSegAlgoSK::myName
const std::string myName
Definition: CSCSegAlgoSK.h:122
CSCSegAlgoSK::LayerIndex
std::vector< int > LayerIndex
Typedefs.
Definition: CSCSegAlgoSK.h:47
runTauDisplay.gp
gp
Definition: runTauDisplay.py:431
funct::true
true
Definition: Factorize.h:173
CSCSegAlgoSK::wideSeg
float wideSeg
Definition: CSCSegAlgoSK.h:130
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:223
Geom::Phi::phi
T1 phi() const
Definition: Phi.h:78
CSCRecHit2D
Definition: CSCRecHit2D.h:18
CSCRecHit2D::localPosition
LocalPoint localPosition() const override
Definition: CSCRecHit2D.h:56
CSCChamberSpecs::chamberTypeName
std::string chamberTypeName() const
Definition: CSCChamberSpecs.cc:156
CSCSegment::localDirection
LocalVector localDirection() const override
Local direction.
Definition: CSCSegment.h:42
CSCSegment::localDirectionError
LocalError localDirectionError() const override
Error on the local direction.
Definition: CSCSegment.cc:52
M_PI
#define M_PI
Definition: BXVectorInputProducer.cc:49
cuy.ib
ib
Definition: cuy.py:662
CSCChamber::specs
const CSCChamberSpecs * specs() const
Definition: CSCChamber.h:39
CSCSegAlgoSK::updateParameters
void updateParameters(void)
Definition: CSCSegAlgoSK.cc:376
CSCSegAlgoSK::areHitsCloseInGlobalPhi
bool areHitsCloseInGlobalPhi(const CSCRecHit2D *h1, const CSCRecHit2D *h2) const
Definition: CSCSegAlgoSK.cc:244
DDAxes::phi
CSCSegAlgoSK::tryAddingHitsToSegment
void tryAddingHitsToSegment(const ChamberHitContainer &rechitsInChamber, const BoolContainer &used, const LayerIndex &layerIndex, const ChamberHitContainerCIt i1, const ChamberHitContainerCIt i2)
Definition: CSCSegAlgoSK.cc:196
hi
Definition: EPCuts.h:4
CSCSegAlgoSK::replaceHit
bool replaceHit(const CSCRecHit2D *h, int layer)
Definition: CSCSegAlgoSK.cc:394
CSCSegAlgoSK::windowScale
float windowScale
Definition: CSCSegAlgoSK.h:124
CSCSegAlgoSK::buildSegments
std::vector< CSCSegment > buildSegments(const ChamberHitContainer &rechits)
Definition: CSCSegAlgoSK.cc:47
edm::LogVerbatim
Log< level::Info, true > LogVerbatim
Definition: MessageLogger.h:128
CSCSegAlgoSK::minLayersApart
int minLayersApart
Definition: CSCSegAlgoSK.h:131
CSCSegment::parametersError
AlgebraicSymMatrix parametersError() const override
Covariance matrix of parameters()
Definition: CSCSegment.h:49
CSCSegAlgoSK::dPhiFineMax
float dPhiFineMax
Definition: CSCSegAlgoSK.h:128
edm::ParameterSet::getParameter
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
CSCSegmentAlgorithm::CSCSegmentAlgorithm
CSCSegmentAlgorithm(const edm::ParameterSet &)
Constructor.
Definition: CSCSegmentAlgorithm.h:26
CSCSegment::chi2
double chi2() const override
Chi2 of the segment fit.
Definition: CSCSegment.h:58
CSCSegAlgoSK::increaseProtoSegment
void increaseProtoSegment(const CSCRecHit2D *h, int layer)
Definition: CSCSegAlgoSK.cc:429
funct::abs
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
LogTrace
#define LogTrace(id)
Definition: MessageLogger.h:224
CSCChamber::id
CSCDetId id() const
Get the (concrete) DetId.
Definition: CSCChamber.h:34
CSCSegAlgoSK::proto_segment
ChamberHitContainer proto_segment
Definition: CSCSegAlgoSK.h:121
CSCSegAlgoSK::areHitsCloseInLocalX
bool areHitsCloseInLocalX(const CSCRecHit2D *h1, const CSCRecHit2D *h2) const
Utility functions.
Definition: CSCSegAlgoSK.cc:237
CSCSegment::localPosition
LocalPoint localPosition() const override
Definition: CSCSegment.h:39
CSCSegAlgoSK::dPhiMax
float dPhiMax
Definition: CSCSegAlgoSK.h:126
CSCSegAlgoSK::phiAtZ
float phiAtZ(float z) const
Definition: CSCSegAlgoSK.cc:291
CSCSegAlgoSK::hasHitOnLayer
bool hasHitOnLayer(int layer) const
Definition: CSCSegAlgoSK.cc:383
PV3DBase::phi
Geom::Phi< T > phi() const
Definition: PV3DBase.h:66
CSCSegment::localPositionError
LocalError localPositionError() const override
Definition: CSCSegment.cc:48
CSCSegFit::intercept
LocalPoint intercept() const
Definition: CSCSegFit.h:84