CMS 3D CMS Logo

ForwardDetLayer.cc
Go to the documentation of this file.
6 
7 using namespace std;
8 
10 
11 //--- Extension of the interface
13 
14 bool ForwardDetLayer::contains(const Local3DPoint& p) const { return surface().bounds().inside(p); }
15 
16 void ForwardDetLayer::initialize() { setSurface(computeSurface()); }
17 
19  LogDebug("DetLayers") << "ForwaLayer::computeSurface callded";
20  vector<const GeomDet*> comps = basicComponents();
21 
22  vector<const GeomDet*>::const_iterator ifirst = comps.begin();
23  vector<const GeomDet*>::const_iterator ilast = comps.end();
24 
25  // Find extension in R
26  float theRmin = components().front()->position().perp();
27  float theRmax = theRmin;
28  float theZmin = components().back()->position().z();
29  float theZmax = theZmin;
30  for (vector<const GeomDet*>::const_iterator deti = ifirst; deti != ilast; deti++) {
31  vector<GlobalPoint> corners = BoundingBox().corners(dynamic_cast<const Plane&>((**deti).surface()));
32  for (vector<GlobalPoint>::const_iterator ic = corners.begin(); ic != corners.end(); ic++) {
33  float r = ic->perp();
34  LogDebug("DetLayers") << "corner.perp(): " << r;
35  float z = ic->z();
36  theRmin = min(theRmin, r);
37  theRmax = max(theRmax, r);
38  theZmin = min(theZmin, z);
39  theZmax = max(theZmax, z);
40  }
41 
42  // in addition to the corners we have to check the middle of the
43  // det +/- length/2
44  // , since the min (max) radius for typical fw dets is reached there
45 
46  float rdet = (**deti).position().perp();
47  float len = (**deti).surface().bounds().length();
48  float width = (**deti).surface().bounds().width();
49 
50  GlobalVector xAxis = (**deti).toGlobal(LocalVector(1, 0, 0));
51  GlobalVector yAxis = (**deti).toGlobal(LocalVector(0, 1, 0));
52  GlobalVector perpDir = GlobalVector((**deti).position() - GlobalPoint(0, 0, (**deti).position().z()));
53 
54  double xAxisCos = xAxis.unit().dot(perpDir.unit());
55  double yAxisCos = yAxis.unit().dot(perpDir.unit());
56 
57  LogDebug("DetLayers") << "in ForwardDetLayer::computeSurface(),xAxisCos,yAxisCos: " << xAxisCos << " , "
58  << yAxisCos;
59  LogDebug("DetLayers") << "det pos.perp,length,width: " << rdet << " , " << len << " , " << width;
60 
61  if (fabs(xAxisCos) > fabs(yAxisCos)) {
62  theRmin = min(theRmin, rdet - width / 2.F);
63  theRmax = max(theRmax, rdet + width / 2.F);
64  } else {
65  theRmin = min(theRmin, rdet - len / 2.F);
66  theRmax = max(theRmax, rdet + len / 2.F);
67  }
68  }
69 
70  LogDebug("DetLayers") << "creating SimpleDiskBounds with r range" << theRmin << " " << theRmax << " and z range "
71  << theZmin << " " << theZmax;
72 
73  // By default the forward layers are positioned around the z axis of the
74  // global frame, and the axes of their local frame coincide with
75  // those of the global grame (z along the disk axis)
76  float zPos = (theZmax + theZmin) / 2.;
77  PositionType pos(0., 0., zPos);
79 
80  return new BoundDisk(pos, rot, new SimpleDiskBounds(theRmin, theRmax, theZmin - zPos, theZmax - zPos));
81 }
82 
83 pair<bool, TrajectoryStateOnSurface> ForwardDetLayer::compatible(const TrajectoryStateOnSurface& ts,
84  const Propagator& prop,
85  const MeasurementEstimator&) const {
86  if
87  UNLIKELY(theDisk == nullptr)
88  edm::LogError("DetLayers") << "ERROR: BarrelDetLayer::compatible() is used before the layer surface is initialized";
89  // throw an exception? which one?
90 
91  TrajectoryStateOnSurface myState = prop.propagate(ts, specificSurface());
92  if
93  UNLIKELY(!myState.isValid()) return make_pair(false, myState);
94 
95  // check z; (are we sure?????)
96  // auto z = myState.localPosition().z();
97  // if ( z<bounds().minZ | z>bounds().maxZ) return make_pair( false, myState);
98 
99  // check r
100  auto r2 = myState.localPosition().perp2();
101  if ((r2 > rmin() * rmin()) & (r2 < rmax() * rmax()))
102  return make_pair(true, myState);
103 
104  // take into account the thickness of the layer
105  float deltaR = 0.5f * bounds().thickness() * myState.localDirection().perp() / std::abs(myState.localDirection().z());
106 
107  // and take into account the error on the predicted state
108  const float nSigma = 3.;
109  if (myState.hasError()) {
110  LocalError err = myState.localError().positionError();
111  // ignore correlation for the moment...
112  deltaR += nSigma * sqrt(err.xx() + err.yy());
113  }
114 
115  // check r again;
116  auto ri2 = std::max(rmin() - deltaR, 0.f);
117  ri2 *= ri2;
118  auto ro2 = rmax() + deltaR;
119  ro2 *= ro2;
120  return make_pair((r2 > ri2) & (r2 < ro2), myState);
121 }
#define LogDebug(id)
~ForwardDetLayer() override
float xx() const
Definition: LocalError.h:22
virtual BoundDisk * computeSurface()
Local3DVector LocalVector
Definition: LocalVector.h:12
T perp() const
Definition: PV3DBase.h:69
LocalVector localDirection() const
void setSurface(BoundDisk *cp)
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
PreciseFloatType< T, U >::Type dot(const Vector3DBase< U, FrameTag > &v) const
Definition: Vector3DBase.h:99
T perp2() const
Definition: PV3DBase.h:68
LocalError positionError() const
float yy() const
Definition: LocalError.h:24
virtual void initialize()
T sqrt(T t)
Definition: SSEVec.h:19
T z() const
Definition: PV3DBase.h:61
bool contains(const Local3DPoint &p) const
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
double f[11][100]
T min(T a, T b)
Definition: MathUtil.h:58
const LocalTrajectoryError & localError() const
Vector3DBase unit() const
Definition: Vector3DBase.h:54
Disk BoundDisk
Definition: BoundDisk.h:54
TrajectoryStateOnSurface propagate(STA const &state, SUR const &surface) const
Definition: Propagator.h:50
static std::vector< GlobalPoint > corners(const Plane &)
Definition: BoundingBox.cc:20
std::pair< bool, TrajectoryStateOnSurface > compatible(const TrajectoryStateOnSurface &, const Propagator &, const MeasurementEstimator &) const override
#define UNLIKELY(x)
Definition: Likely.h:21
static uInt32 F(BLOWFISH_CTX *ctx, uInt32 x)
Definition: blowfish.cc:163
Global3DVector GlobalVector
Definition: GlobalVector.h:10