CMS 3D CMS Logo

MuRingForwardDoubleLayer.cc
Go to the documentation of this file.
1 
12 
14 
15 #include <algorithm>
16 #include <iostream>
17 #include <vector>
18 
19 using namespace std;
20 
21 MuRingForwardDoubleLayer::MuRingForwardDoubleLayer(const vector<const ForwardDetRing*>& frontRings,
22  const vector<const ForwardDetRing*>& backRings)
24  theFrontLayer(frontRings),
25  theBackLayer(backRings),
26  theRings(frontRings), // add back later
27  theComponents(),
28  theBasicComponents() {
29  const std::string metname = "Muon|RecoMuon|RecoMuonDetLayers|MuRingForwardDoubleLayer";
30 
31  theRings.insert(theRings.end(), backRings.begin(), backRings.end());
32  theComponents = std::vector<const GeometricSearchDet*>(theRings.begin(), theRings.end());
33 
34  // Cache chamber pointers (the basic components_)
35  // and find extension in R and Z
36  for (vector<const ForwardDetRing*>::const_iterator it = theRings.begin(); it != theRings.end(); it++) {
37  vector<const GeomDet*> tmp2 = (*it)->basicComponents();
38  theBasicComponents.insert(theBasicComponents.end(), tmp2.begin(), tmp2.end());
39  }
40 
41  setSurface(computeSurface());
42 
43  LogTrace(metname) << "Constructing MuRingForwardDoubleLayer: " << basicComponents().size() << " Dets "
44  << theRings.size() << " Rings "
45  << " Z: " << specificSurface().position().z() << " R1: " << specificSurface().innerRadius()
46  << " R2: " << specificSurface().outerRadius();
47 
48  selfTest();
49 }
50 
52  const BoundDisk& frontDisk = theFrontLayer.specificSurface();
53  const BoundDisk& backDisk = theBackLayer.specificSurface();
54 
55  float rmin = min(frontDisk.innerRadius(), backDisk.innerRadius());
56  float rmax = max(frontDisk.outerRadius(), backDisk.outerRadius());
57  float zmin = frontDisk.position().z();
58  float halfThickness = frontDisk.bounds().thickness() / 2.;
59  zmin = (zmin > 0) ? zmin - halfThickness : zmin + halfThickness;
60  float zmax = backDisk.position().z();
61  halfThickness = backDisk.bounds().thickness() / 2.;
62  zmax = (zmax > 0) ? zmax + halfThickness : zmax - halfThickness;
63  float zPos = (zmax + zmin) / 2.;
64  PositionType pos(0., 0., zPos);
66 
67  return new BoundDisk(pos, rot, new SimpleDiskBounds(rmin, rmax, zmin - zPos, zmax - zPos));
68 }
69 
71  return tsos.globalPosition().basicVector().dot(tsos.globalMomentum().basicVector()) > 0;
72 }
73 
74 std::pair<bool, TrajectoryStateOnSurface> MuRingForwardDoubleLayer::compatible(
75  const TrajectoryStateOnSurface& startingState, const Propagator& prop, const MeasurementEstimator& est) const {
76  // mostly copied from ForwardDetLayer, except propagates to closest surface,
77  // not to center
78  const std::string metname = "Muon|RecoMuon|RecoMuonDetLayers|MuRingForwardDoubleLayer";
79 
80  bool insideOut = isInsideOut(startingState);
81  const MuRingForwardLayer& closerLayer = (insideOut) ? theFrontLayer : theBackLayer;
82  LogTrace("Muon|RecoMuon|RecoMuonDetLayers|MuRingForwardDoubleLayer")
83  << "MuRingForwardDoubleLayer::compatible is assuming inside-out direction: " << insideOut;
84 
85  //std::pair<bool, TrajectoryStateOnSurface> result
86  // = closerLayer.compatible(startingState, prop, est);
87  //if(!result.first)
88  // {
89  // result = furtherLayer.compatible(startingState, prop, est);
90  //}
91 
92  TrajectoryStateOnSurface myState = prop.propagate(startingState, closerLayer.specificSurface());
93  if (!myState.isValid())
94  return make_pair(false, myState);
95 
96  // take into account the thickness of the layer
97  float deltaR = surface().bounds().thickness() / 2. * fabs(tan(myState.localDirection().theta()));
98 
99  // take into account the error on the predicted state
100  const float nSigma = 3.;
101  if (myState.hasError()) {
102  LocalError err = myState.localError().positionError();
103  // ignore correlation for the moment...
104  deltaR += nSigma * sqrt(err.xx() + err.yy());
105  }
106 
107  float zPos = (zmax() + zmin()) / 2.;
108  SimpleDiskBounds tmp(rmin() - deltaR, rmax() + deltaR, zmin() - zPos, zmax() - zPos);
109 
110  return make_pair(tmp.inside(myState.localPosition()), myState);
111 }
112 
113 vector<GeometricSearchDet::DetWithState> MuRingForwardDoubleLayer::compatibleDets(
114  const TrajectoryStateOnSurface& startingState, const Propagator& prop, const MeasurementEstimator& est) const {
115  vector<DetWithState> result;
116  const std::string metname = "Muon|RecoMuon|RecoMuonDetLayers|MuRingForwardDoubleLayer";
117  pair<bool, TrajectoryStateOnSurface> compat = compatible(startingState, prop, est);
118 
119  if (!compat.first) {
120  LogTrace(metname) << " MuRingForwardDoubleLayer::compatibleDets: not compatible"
121  << " (should not have been selected!)";
122  return result;
123  }
124 
125  TrajectoryStateOnSurface& tsos = compat.second;
126 
127  // standard implementation of compatibleDets() for class which have
128  // groupedCompatibleDets implemented.
129  // This code should be moved in a common place intead of being
130  // copied many times.
131  vector<DetGroup> vectorGroups = groupedCompatibleDets(tsos, prop, est);
132  for (vector<DetGroup>::const_iterator itDG = vectorGroups.begin(); itDG != vectorGroups.end(); itDG++) {
133  for (vector<DetGroupElement>::const_iterator itDGE = itDG->begin(); itDGE != itDG->end(); itDGE++) {
134  result.push_back(DetWithState(itDGE->det(), itDGE->trajectoryState()));
135  }
136  }
137  return result;
138 }
139 
141  const Propagator& prop,
142  const MeasurementEstimator& est) const {
143  const std::string metname = "Muon|RecoMuon|RecoMuonDetLayers|MuRingForwardDoubleLayer";
144  vector<GeometricSearchDet::DetWithState> detWithStates1, detWithStates2;
145 
146  LogTrace(metname) << "groupedCompatibleDets are currently given always in inside-out order";
147  // this should be fixed either in RecoMuon/MeasurementDet/MuonDetLayerMeasurements or
148  // RecoMuon/DetLayers/MuRingForwardDoubleLayer
149  // and removed the reverse operation in StandAloneMuonFilter::findBestMeasurements
150 
151  detWithStates1 = theFrontLayer.compatibleDets(startingState, prop, est);
152  detWithStates2 = theBackLayer.compatibleDets(startingState, prop, est);
153 
154  vector<DetGroup> result;
155  if (!detWithStates1.empty())
156  result.push_back(DetGroup(detWithStates1));
157  if (!detWithStates2.empty())
158  result.push_back(DetGroup(detWithStates2));
159  LogTrace(metname) << "DoubleLayer Compatible dets: " << result.size();
160  return result;
161 }
162 
164  const std::string metname = "Muon|RecoMuon|RecoMuonDetLayers|MuRingForwardDoubleLayer";
165  // approximate
166  bool result = false;
167  double r = gp.perp();
168  const std::vector<const ForwardDetRing*>& backRings = theBackLayer.rings();
169  if (backRings.size() > 1) {
170  const MuDetRing* innerRing = dynamic_cast<const MuDetRing*>(backRings[0]);
171  const MuDetRing* outerRing = dynamic_cast<const MuDetRing*>(backRings[1]);
172  assert(innerRing && outerRing);
173  float crackInner = innerRing->specificSurface().outerRadius();
174  float crackOuter = outerRing->specificSurface().innerRadius();
175  LogTrace(metname) << "In a crack:" << crackInner << " " << r << " " << crackOuter;
176  if (r > crackInner && r < crackOuter)
177  return true;
178  }
179  // non-overlapping rings
180  //double phi = gp.phi().degrees();
181  return result;
182 }
183 
185  const std::vector<const GeomDet*>& frontDets = theFrontLayer.basicComponents();
186  const std::vector<const GeomDet*>& backDets = theBackLayer.basicComponents();
187 
188  std::vector<const GeomDet*>::const_iterator frontItr = frontDets.begin(), lastFront = frontDets.end(),
189  backItr = backDets.begin(), lastBack = backDets.end();
190 
191  // test that each front z is less than each back z
192  for (; frontItr != lastFront; ++frontItr) {
193  float frontz = fabs((**frontItr).surface().position().z());
194  for (; backItr != lastBack; ++backItr) {
195  float backz = fabs((**backItr).surface().position().z());
196  assert(frontz < backz);
197  }
198  }
199 }
TkRotation< Scalar > RotationType
Definition: Definitions.h:27
const LocalTrajectoryError & localError() const
const std::string metname
std::pair< bool, TrajectoryStateOnSurface > compatible(const TrajectoryStateOnSurface &, const Propagator &, const MeasurementEstimator &) const override
std::vector< const GeomDet * > theBasicComponents
bool isInsideOut(const TrajectoryStateOnSurface &tsos) const
const BoundDisk & specificSurface() const
Return the ring surface as a BoundDisk.
LocalError positionError() const
assert(be >=bs)
TrajectoryStateOnSurface propagate(STA const &state, SUR const &surface) const
Definition: Propagator.h:50
std::vector< const ForwardDetRing * > theRings
#define LogTrace(id)
Point3DBase< Scalar, GlobalTag > PositionType
Definition: Definitions.h:28
std::vector< DetGroup > groupedCompatibleDets(const TrajectoryStateOnSurface &startingState, const Propagator &prop, const MeasurementEstimator &est) const override
GlobalPoint globalPosition() const
std::pair< const GeomDet *, TrajectoryStateOnSurface > DetWithState
T sqrt(T t)
Definition: SSEVec.h:19
LocalVector localDirection() const
Tan< T >::type tan(const T &t)
Definition: Tan.h:22
const std::vector< const GeomDet * > & basicComponents() const override
const BasicVectorType & basicVector() const
Definition: PV3DBase.h:53
const std::vector< const GeomDet * > & basicComponents() const override
BoundDisk * computeSurface() override
MuRingForwardDoubleLayer(const std::vector< const ForwardDetRing *> &frontRings, const std::vector< const ForwardDetRing *> &backRings)
Constructor, takes ownership of pointers.
GlobalVector globalMomentum() const
Disk BoundDisk
Definition: BoundDisk.h:54
std::vector< const GeometricSearchDet * > theComponents
virtual const std::vector< const ForwardDetRing * > & rings() const
Return the vector of rings.
std::vector< DetWithState > compatibleDets(const TrajectoryStateOnSurface &startingState, const Propagator &prop, const MeasurementEstimator &est) const override
tmp
align.sh
Definition: createJobs.py:716
T dot(const Basic3DVector &rh) const
Scalar product, or "dot" product, with a vector of same type.
std::vector< DetWithState > compatibleDets(const TrajectoryStateOnSurface &startingState, const Propagator &prop, const MeasurementEstimator &est) const override
Geom::Theta< T > theta() const
Definition: PV3DBase.h:72
bool isCrack(const GlobalPoint &gp) const