CMS 3D CMS Logo

List of all members | Classes | Public Member Functions | Private Member Functions | Private Attributes
TIDLayer Class Referencefinal

#include <TIDLayer.h>

Inheritance diagram for TIDLayer:
RingedForwardLayer

Classes

struct  RingPar
 

Public Member Functions

const std::vector< const GeomDet * > & basicComponents () const override
 
const std::vector< const GeometricSearchDet * > & components () const override __attribute__((cold))
 
void groupedCompatibleDetsV (const TrajectoryStateOnSurface &tsos, const Propagator &prop, const MeasurementEstimator &est, std::vector< DetGroup > &result) const override __attribute__((hot))
 
TIDLayeroperator= (const TIDLayer &)=delete
 
SubDetector subDetector () const override
 
 TIDLayer (std::vector< const TIDRing *> &rings) __attribute__((cold))
 
 TIDLayer (const TIDLayer &)=delete
 
 ~TIDLayer () override __attribute__((cold))
 

Private Member Functions

BoundDiskcomputeDisk (const std::vector< const TIDRing *> &rings) const __attribute__((cold))
 
float computeWindowSize (const GeomDet *det, const TrajectoryStateOnSurface &tsos, const MeasurementEstimator &est) const __attribute__((hot))
 
void fillRingPars (int i) __attribute__((cold))
 
int findClosest (const GlobalPoint[3]) const __attribute__((hot))
 
int findNextIndex (const GlobalPoint[3], int) const __attribute__((hot))
 
bool overlapInR (const TrajectoryStateOnSurface &tsos, int i, double ymax) const __attribute__((hot))
 
std::array< int, 3 > ringIndicesByCrossingProximity (const TrajectoryStateOnSurface &startingState, const Propagator &prop) const
 

Private Attributes

RingPar ringPars [3]
 
std::vector< GeomDet const * > theBasicComps
 
std::atomic< std::vector< const GeometricSearchDet * > * > theComponents
 
const TIDRingtheComps [3]
 

Detailed Description

A concrete implementation for TID layer built out of TIDRings

Definition at line 14 of file TIDLayer.h.

Constructor & Destructor Documentation

◆ TIDLayer() [1/2]

TIDLayer::TIDLayer ( std::vector< const TIDRing *> &  rings)

Definition at line 104 of file TIDLayer.cc.

104  : RingedForwardLayer(true), theComponents{nullptr} {
105  //They should be already R-ordered. TO BE CHECKED!!
106  //sort( theRings.begin(), theRings.end(), DetLessR());
107 
108  if (rings.size() != 3)
109  throw DetLayerException("Number of rings in TID layer is not equal to 3 !!");
110  setSurface(computeDisk(rings));
111 
112  for (int i = 0; i != 3; ++i) {
113  theComps[i] = rings[i];
114  fillRingPars(i);
115  theBasicComps.insert(
116  theBasicComps.end(), (*rings[i]).basicComponents().begin(), (*rings[i]).basicComponents().end());
117  }
118 
119  LogDebug("TkDetLayers") << "==== DEBUG TIDLayer =====";
120  LogDebug("TkDetLayers") << "r,zed pos , thickness, innerR, outerR: " << this->position().perp() << " , "
121  << this->position().z() << " , " << this->specificSurface().bounds().thickness() << " , "
122  << this->specificSurface().innerRadius() << " , " << this->specificSurface().outerRadius();
123 }
Common base class.
ForwardDetLayer RingedForwardLayer
std::vector< GeomDet const * > theBasicComps
Definition: TIDLayer.h:60
const std::vector< const GeomDet * > & basicComponents() const override
Definition: TIDLayer.h:25
BoundDisk * computeDisk(const std::vector< const TIDRing *> &rings) const __attribute__((cold))
Definition: TIDLayer.cc:125
std::atomic< std::vector< const GeometricSearchDet * > * > theComponents
Definition: TIDLayer.h:61
void fillRingPars(int i) __attribute__((cold))
Definition: TIDLayer.cc:95
static int position[264][3]
Definition: ReadPGInfo.cc:289
const TIDRing * theComps[3]
Definition: TIDLayer.h:62
#define LogDebug(id)

◆ ~TIDLayer()

TIDLayer::~TIDLayer ( )
override

Definition at line 149 of file TIDLayer.cc.

References c, theComponents, and theComps.

149  {
150  for (auto c : theComps)
151  delete c;
152 
153  delete theComponents.load();
154 }
std::atomic< std::vector< const GeometricSearchDet * > * > theComponents
Definition: TIDLayer.h:61
const TIDRing * theComps[3]
Definition: TIDLayer.h:62

◆ TIDLayer() [2/2]

TIDLayer::TIDLayer ( const TIDLayer )
delete

Member Function Documentation

◆ basicComponents()

const std::vector<const GeomDet*>& TIDLayer::basicComponents ( ) const
inlineoverride

Definition at line 25 of file TIDLayer.h.

References theBasicComps.

25 { return theBasicComps; }
std::vector< GeomDet const * > theBasicComps
Definition: TIDLayer.h:60

◆ components()

const std::vector< const GeometricSearchDet * > & TIDLayer::components ( ) const
override

Definition at line 79 of file TIDLayer.cc.

References c, and groupFilesInBlocks::temp.

79  {
80  if (not theComponents) {
81  auto temp = std::make_unique<std::vector<const GeometricSearchDet*>>();
82  temp->reserve(3);
83  for (auto c : theComps)
84  temp->push_back(c);
85  std::vector<const GeometricSearchDet*>* expected = nullptr;
86  if (theComponents.compare_exchange_strong(expected, temp.get())) {
87  //this thread set the value
88  temp.release();
89  }
90  }
91 
92  return *theComponents;
93 }
std::atomic< std::vector< const GeometricSearchDet * > * > theComponents
Definition: TIDLayer.h:61
const TIDRing * theComps[3]
Definition: TIDLayer.h:62

◆ computeDisk()

BoundDisk * TIDLayer::computeDisk ( const std::vector< const TIDRing *> &  rings) const
private

Definition at line 125 of file TIDLayer.cc.

References mps_fire::i, SiStripPI::max, SiStripPI::min, makeMuonMisalignmentScenario::rot, SiStripMonitorCluster_cfi::zmax, and SiStripMonitorCluster_cfi::zmin.

125  {
126  float theRmin = rings.front()->specificSurface().innerRadius();
127  float theRmax = rings.front()->specificSurface().outerRadius();
128  float theZmin = rings.front()->position().z() - rings.front()->surface().bounds().thickness() / 2;
129  float theZmax = rings.front()->position().z() + rings.front()->surface().bounds().thickness() / 2;
130 
131  for (vector<const TIDRing*>::const_iterator i = rings.begin(); i != rings.end(); i++) {
132  float rmin = (**i).specificSurface().innerRadius();
133  float rmax = (**i).specificSurface().outerRadius();
134  float zmin = (**i).position().z() - (**i).surface().bounds().thickness() / 2.;
135  float zmax = (**i).position().z() + (**i).surface().bounds().thickness() / 2.;
136  theRmin = min(theRmin, rmin);
137  theRmax = max(theRmax, rmax);
138  theZmin = min(theZmin, zmin);
139  theZmax = max(theZmax, zmax);
140  }
141 
142  float zPos = (theZmax + theZmin) / 2.;
143  PositionType pos(0., 0., zPos);
145 
146  return new BoundDisk(pos, rot, new SimpleDiskBounds(theRmin, theRmax, theZmin - zPos, theZmax - zPos));
147 }
TkRotation< Scalar > RotationType
Definition: Definitions.h:27
Point3DBase< Scalar, GlobalTag > PositionType
Definition: Definitions.h:28
Disk BoundDisk
Definition: BoundDisk.h:54

◆ computeWindowSize()

float TIDLayer::computeWindowSize ( const GeomDet det,
const TrajectoryStateOnSurface tsos,
const MeasurementEstimator est 
) const
private

Definition at line 260 of file TIDLayer.cc.

References particleFlowClusterHGC_cfi::maxDistance, MeasurementEstimator::maximalLocalDisplacement(), and GeomDet::surface().

Referenced by groupedCompatibleDetsV().

262  {
263  const Plane& startPlane = det->surface();
265  return maxDistance.y();
266 }
virtual Local2DVector maximalLocalDisplacement(const TrajectoryStateOnSurface &ts, const Plane &plane) const =0
Definition: Plane.h:16
const Plane & surface() const
The nominal surface of the GeomDet.
Definition: GeomDet.h:37

◆ fillRingPars()

void TIDLayer::fillRingPars ( int  i)
private

Definition at line 95 of file TIDLayer.cc.

References funct::abs(), and mps_fire::i.

95  {
96  const BoundDisk& ringDisk = static_cast<const BoundDisk&>(theComps[i]->surface());
97  float ringMinZ = std::abs(ringDisk.position().z()) - ringDisk.bounds().thickness() / 2.;
98  float ringMaxZ = std::abs(ringDisk.position().z()) + ringDisk.bounds().thickness() / 2.;
99  ringPars[i].thetaRingMin = ringDisk.innerRadius() / ringMaxZ;
100  ringPars[i].thetaRingMax = ringDisk.outerRadius() / ringMinZ;
101  ringPars[i].theRingR = (ringDisk.innerRadius() + ringDisk.outerRadius()) / 2.;
102 }
float thetaRingMin
Definition: TIDLayer.h:64
const BoundSurface & surface() const override
The surface of the GeometricSearchDet.
Definition: TIDRing.h:19
float thetaRingMax
Definition: TIDLayer.h:64
RingPar ringPars[3]
Definition: TIDLayer.h:66
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
const TIDRing * theComps[3]
Definition: TIDLayer.h:62

◆ findClosest()

int TIDLayer::findClosest ( const GlobalPoint  ringCrossing[3]) const
private

Definition at line 268 of file TIDLayer.cc.

References funct::abs(), mps_fire::i, perp(), ringPars, and TIDLayer::RingPar::theRingR.

Referenced by ringIndicesByCrossingProximity().

268  {
269  int theBin = 0;
270  float initialR = ringPars[0].theRingR;
271  float rDiff = std::abs(ringCrossing[0].perp() - initialR);
272  for (int i = 1; i < 3; i++) {
273  float ringR = ringPars[i].theRingR;
274  float testDiff = std::abs(ringCrossing[i].perp() - ringR);
275  if (testDiff < rDiff) {
276  rDiff = testDiff;
277  theBin = i;
278  }
279  }
280  return theBin;
281 }
RingPar ringPars[3]
Definition: TIDLayer.h:66
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
T perp() const
Magnitude of transverse component.

◆ findNextIndex()

int TIDLayer::findNextIndex ( const GlobalPoint  ringCrossing[3],
int  closest 
) const
private

Definition at line 283 of file TIDLayer.cc.

References funct::abs(), pv::closest(), mps_fire::i, perp(), ringPars, and TIDLayer::RingPar::theRingR.

Referenced by ringIndicesByCrossingProximity().

283  {
284  int firstIndexToCheck = (closest != 0) ? 0 : 1;
285  float initialR = ringPars[firstIndexToCheck].theRingR;
286  float rDiff = std::abs(ringCrossing[firstIndexToCheck].perp() - initialR);
287  int theBin = firstIndexToCheck;
288  for (int i = firstIndexToCheck + 1; i < 3; i++) {
289  if (i != closest) {
290  float ringR = ringPars[i].theRingR;
291  float testDiff = std::abs(ringCrossing[i].perp() - ringR);
292  if (testDiff < rDiff) {
293  rDiff = testDiff;
294  theBin = i;
295  }
296  }
297  }
298  return theBin;
299 }
int closest(std::vector< int > const &vec, int value)
RingPar ringPars[3]
Definition: TIDLayer.h:66
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
T perp() const
Magnitude of transverse component.

◆ groupedCompatibleDetsV()

void TIDLayer::groupedCompatibleDetsV ( const TrajectoryStateOnSurface tsos,
const Propagator prop,
const MeasurementEstimator est,
std::vector< DetGroup > &  result 
) const
override

Definition at line 156 of file TIDLayer.cc.

References computeWindowSize(), TIDRing::groupedCompatibleDetsV(), mps_fire::i, overlapInR(), mps_fire::result, ringIndicesByCrossingProximity(), and theComps.

159  {
160  std::array<int, 3> const& ringIndices = ringIndicesByCrossingProximity(startingState, prop);
161  if (ringIndices[0] == -1) {
162  edm::LogError("TkDetLayers") << "TkRingedForwardLayer::groupedCompatibleDets : error in CrossingProximity";
163  return;
164  }
165 
166  std::array<vector<DetGroup>, 3> groupsAtRingLevel;
167  //order is ring3,ring1,ring2 i.e. 2 0 1
168  // 0 1 2
169  static constexpr int ringOrder[3]{1, 2, 0};
170  auto index = [&ringIndices](int i) { return ringOrder[ringIndices[i]]; };
171 
172  auto& closestResult = groupsAtRingLevel[index(0)];
173  theComps[ringIndices[0]]->groupedCompatibleDetsV(startingState, prop, est, closestResult);
174  if (closestResult.empty()) {
175  theComps[ringIndices[1]]->groupedCompatibleDetsV(startingState, prop, est, result);
176  return;
177  }
178 
179  DetGroupElement closestGel(closestResult.front().front());
180  float rWindow = computeWindowSize(closestGel.det(), closestGel.trajectoryState(), est);
181 
182  if (!overlapInR(closestGel.trajectoryState(), ringIndices[1], rWindow)) {
183  result.swap(closestResult);
184  return;
185  }
186 
187  auto& nextResult = groupsAtRingLevel[index(1)];
188  theComps[ringIndices[1]]->groupedCompatibleDetsV(startingState, prop, est, nextResult);
189  if (nextResult.empty()) {
190  result.swap(closestResult);
191  return;
192  }
193 
194  if (!overlapInR(closestGel.trajectoryState(), ringIndices[2], rWindow)) {
195  //then merge 2 levels & return
196  orderAndMergeLevels(closestGel.trajectoryState(), prop, groupsAtRingLevel, result);
197  return;
198  }
199 
200  auto& nextNextResult = groupsAtRingLevel[index(2)];
201  theComps[ringIndices[2]]->groupedCompatibleDetsV(startingState, prop, est, nextNextResult);
202  if (nextNextResult.empty()) {
203  // then merge 2 levels and return
204  orderAndMergeLevels(closestGel.trajectoryState(), prop, groupsAtRingLevel, result); //
205  return;
206  }
207 
208  // merge 3 level and return merged
209  orderAndMergeLevels(closestGel.trajectoryState(), prop, groupsAtRingLevel, result);
210 }
Log< level::Error, false > LogError
bool overlapInR(const TrajectoryStateOnSurface &tsos, int i, double ymax) const __attribute__((hot))
Definition: TIDLayer.cc:301
float computeWindowSize(const GeomDet *det, const TrajectoryStateOnSurface &tsos, const MeasurementEstimator &est) const __attribute__((hot))
Definition: TIDLayer.cc:260
std::array< int, 3 > ringIndicesByCrossingProximity(const TrajectoryStateOnSurface &startingState, const Propagator &prop) const
Definition: TIDLayer.cc:212
const TIDRing * theComps[3]
Definition: TIDLayer.h:62
void groupedCompatibleDetsV(const TrajectoryStateOnSurface &tsos, const Propagator &prop, const MeasurementEstimator &est, std::vector< DetGroup > &result) const override __attribute__((hot))
Definition: TIDRing.cc:67

◆ operator=()

TIDLayer& TIDLayer::operator= ( const TIDLayer )
delete

◆ overlapInR()

bool TIDLayer::overlapInR ( const TrajectoryStateOnSurface tsos,
int  i,
double  ymax 
) const
private

Definition at line 301 of file TIDLayer.cc.

References funct::abs(), f, TrajectoryStateOnSurface::globalPosition(), SiStripPI::max, PV3DBase< T, PVType, FrameType >::perp(), ringPars, TIDLayer::RingPar::thetaRingMax, TIDLayer::RingPar::thetaRingMin, L1TOccupancyClient_cfi::ymax, and PV3DBase< T, PVType, FrameType >::z().

Referenced by groupedCompatibleDetsV().

301  {
302  // assume "fixed theta window", i.e. margin in local y = r is changing linearly with z
303  float tsRadius = tsos.globalPosition().perp();
304  float thetamin = (max(0., tsRadius - ymax)) / (std::abs(tsos.globalPosition().z()) + 10.f); // add 10 cm contingency
305  float thetamax = (tsRadius + ymax) / (std::abs(tsos.globalPosition().z()) - 10.f);
306 
307  // do the theta regions overlap ?
308 
309  return !(thetamin > ringPars[index].thetaRingMax || ringPars[index].thetaRingMin > thetamax);
310 }
T perp() const
Definition: PV3DBase.h:69
T z() const
Definition: PV3DBase.h:61
float thetaRingMin
Definition: TIDLayer.h:64
float thetaRingMax
Definition: TIDLayer.h:64
GlobalPoint globalPosition() const
RingPar ringPars[3]
Definition: TIDLayer.h:66
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
double f[11][100]

◆ ringIndicesByCrossingProximity()

std::array< int, 3 > TIDLayer::ringIndicesByCrossingProximity ( const TrajectoryStateOnSurface startingState,
const Propagator prop 
) const
private

Definition at line 212 of file TIDLayer.cc.

References findClosest(), findNextIndex(), TrajectoryStateOnSurface::globalMomentum(), TrajectoryStateOnSurface::globalPosition(), mps_fire::i, dqmdumpme::indices, Propagator::propagationDirection(), rho, TIDRing::surface(), theComps, and TrajectoryStateOnSurface::transverseCurvature().

Referenced by groupedCompatibleDetsV().

213  {
214  typedef HelixForwardPlaneCrossing Crossing;
216 
217  HelixPlaneCrossing::PositionType startPos(startingState.globalPosition());
218  HelixPlaneCrossing::DirectionType startDir(startingState.globalMomentum());
220  float rho(startingState.transverseCurvature());
221 
222  // calculate the crossings with the ring surfaces
223  // rings are assumed to be sorted in R !
224 
225  Crossing myXing(startPos, startDir, rho, propDir);
226 
227  GlobalPoint ringCrossings[3];
228  // vector<GlobalVector> ringXDirections;
229 
230  for (int i = 0; i < 3; i++) {
231  const BoundDisk& theRing = static_cast<const BoundDisk&>(theComps[i]->surface());
232  pair<bool, double> pathlen = myXing.pathLength(theRing);
233  if (pathlen.first) {
234  ringCrossings[i] = GlobalPoint(myXing.position(pathlen.second));
235  // ringXDirections.push_back( GlobalVector( myXing.direction(pathlen.second )));
236  } else {
237  // TO FIX.... perhaps there is something smarter to do
238  //throw DetLayerException("trajectory doesn't cross TID rings");
239  ringCrossings[i] = GlobalPoint(0., 0., 0.);
240  // ringXDirections.push_back( GlobalVector( 0.,0.,0.));
241  }
242  }
243 
244  int closestIndex = findClosest(ringCrossings);
245  int nextIndex = findNextIndex(ringCrossings, closestIndex);
246  if (closestIndex < 0 || nextIndex < 0)
247  return std::array<int, 3>{{-1, -1, -1}};
248  int nextNextIndex = -1;
249  for (int i = 0; i < 3; i++) {
250  if (i != closestIndex && i != nextIndex) {
251  nextNextIndex = i;
252  break;
253  }
254  }
255 
256  std::array<int, 3> indices{{closestIndex, nextIndex, nextNextIndex}};
257  return indices;
258 }
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
virtual PropagationDirection propagationDirection() const final
Definition: Propagator.h:139
PropagationDirection
const BoundSurface & surface() const override
The surface of the GeometricSearchDet.
Definition: TIDRing.h:19
GlobalPoint globalPosition() const
GlobalVector globalMomentum() const
Vector2DBase< float, LocalTag > Local2DVector
const TIDRing * theComps[3]
Definition: TIDLayer.h:62
int findClosest(const GlobalPoint[3]) const __attribute__((hot))
Definition: TIDLayer.cc:268
int findNextIndex(const GlobalPoint[3], int) const __attribute__((hot))
Definition: TIDLayer.cc:283

◆ subDetector()

SubDetector TIDLayer::subDetector ( ) const
inlineoverride

Member Data Documentation

◆ ringPars

RingPar TIDLayer::ringPars[3]
private

Definition at line 66 of file TIDLayer.h.

Referenced by findClosest(), findNextIndex(), and overlapInR().

◆ theBasicComps

std::vector<GeomDet const*> TIDLayer::theBasicComps
private

Definition at line 60 of file TIDLayer.h.

Referenced by basicComponents().

◆ theComponents

std::atomic<std::vector<const GeometricSearchDet*>*> TIDLayer::theComponents
mutableprivate

Definition at line 61 of file TIDLayer.h.

Referenced by ~TIDLayer().

◆ theComps

const TIDRing* TIDLayer::theComps[3]
private

Definition at line 62 of file TIDLayer.h.

Referenced by groupedCompatibleDetsV(), ringIndicesByCrossingProximity(), and ~TIDLayer().