CMS 3D CMS Logo

MTDRingForwardDoubleLayer.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 MTDRingForwardDoubleLayer::MTDRingForwardDoubleLayer(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 {
30 
31  const std::string metname = "MTD|RecoMTD|RecoMTDDetLayers|MTDRingForwardDoubleLayer";
32 
33  theRings.insert(theRings.end(), backRings.begin(), backRings.end());
34  theComponents = std::vector <const GeometricSearchDet*>(theRings.begin(), theRings.end());
35 
36  // Cache chamber pointers (the basic components_)
37  // and find extension in R and Z
38  for (vector<const ForwardDetRing*>::const_iterator it=theRings.begin();
39  it!=theRings.end(); it++) {
40  vector<const GeomDet*> tmp2 = (*it)->basicComponents();
41  theBasicComponents.insert(theBasicComponents.end(),tmp2.begin(),tmp2.end());
42  }
43 
44  setSurface(computeSurface());
45 
46  LogTrace(metname) << "Constructing MTDRingForwardDoubleLayer: "
47  << basicComponents().size() << " Dets "
48  << theRings.size() << " Rings "
49  << " Z: " << specificSurface().position().z()
50  << " R1: " << specificSurface().innerRadius()
51  << " R2: " << specificSurface().outerRadius();
52 
53  selfTest();
54 }
55 
56 
58 {
59  const BoundDisk & frontDisk = theFrontLayer.specificSurface();
60  const BoundDisk & backDisk = theBackLayer.specificSurface();
61 
62  float rmin = min( frontDisk.innerRadius(), backDisk.innerRadius() );
63  float rmax = max( frontDisk.outerRadius(), backDisk.outerRadius() );
64  float zmin = frontDisk.position().z();
65  float halfThickness = frontDisk.bounds().thickness()/2.;
66  zmin = (zmin > 0) ? zmin-halfThickness : zmin+halfThickness;
67  float zmax = backDisk.position().z();
68  halfThickness = backDisk.bounds().thickness()/2.;
69  zmax = (zmax > 0) ? zmax+halfThickness : zmax-halfThickness;
70  float zPos = (zmax+zmin)/2.;
71  PositionType pos(0.,0.,zPos);
73 
74  return new BoundDisk( pos, rot,
75  new SimpleDiskBounds( rmin, rmax,
76  zmin-zPos, zmax-zPos));
77 }
78 
79 
81 {
82  return tsos.globalPosition().basicVector().dot(tsos.globalMomentum().basicVector()) > 0;
83 }
84 
85 
86 
87 std::pair<bool, TrajectoryStateOnSurface>
89  const MeasurementEstimator& est) const
90 {
91  // mostly copied from ForwardDetLayer, except propagates to closest surface,
92  // not to center
93  const std::string metname = "MTD|RecoMTD|RecoMTDDetLayers|MTDRingForwardDoubleLayer";
94 
95  bool insideOut = isInsideOut(startingState);
96  const MTDRingForwardLayer & closerLayer = (insideOut) ? theFrontLayer : theBackLayer;
97  LogTrace(metname)
98  << "MTDRingForwardDoubleLayer::compatible is assuming inside-out direction: "<< insideOut;
99 
100  TrajectoryStateOnSurface myState = prop.propagate( startingState, closerLayer.specificSurface());
101  if ( !myState.isValid()) return make_pair( false, myState);
102 
103  // take into account the thickness of the layer
104  float deltaR = surface().bounds().thickness()/2. *
105  fabs( tan( myState.localDirection().theta()));
106 
107  // 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  float zPos = (zmax()+zmin())/2.;
116  SimpleDiskBounds tmp( rmin()-deltaR, rmax()+deltaR,
117  zmin()-zPos, zmax()-zPos);
118 
119  return make_pair( tmp.inside(myState.localPosition()), myState);
120 }
121 
122 
123 vector<GeometricSearchDet::DetWithState>
125  const Propagator& prop,
126  const MeasurementEstimator& est) const {
127  vector<DetWithState> result;
128  const std::string metname = "MTD|RecoMTD|RecoMTDDetLayers|MTDRingForwardDoubleLayer";
129  pair<bool, TrajectoryStateOnSurface> compat =
130  compatible(startingState, prop, est);
131 
132  if (!compat.first) {
133 
134  LogTrace(metname) << " MTDRingForwardDoubleLayer::compatibleDets: not compatible"
135  << " (should not have been selected!)";
136  return result;
137  }
138 
139 
140  TrajectoryStateOnSurface& tsos = compat.second;
141 
142  // standard implementation of compatibleDets() for class which have
143  // groupedCompatibleDets implemented.
144  // This code should be moved in a common place intead of being
145  // copied many times.
146  vector<DetGroup> vectorGroups = groupedCompatibleDets(tsos,prop,est);
147  for(vector<DetGroup>::const_iterator itDG=vectorGroups.begin();
148  itDG!=vectorGroups.end();itDG++){
149  for(vector<DetGroupElement>::const_iterator itDGE=itDG->begin();
150  itDGE!=itDG->end();itDGE++){
151  result.push_back(DetWithState(itDGE->det(),itDGE->trajectoryState()));
152  }
153  }
154  return result;
155 }
156 
157 
158 vector<DetGroup>
160  const Propagator& prop,
161  const MeasurementEstimator& est) const {
162 
163  const std::string metname = "MTD|RecoMTD|RecoMTDDetLayers|MTDRingForwardDoubleLayer";
164  vector<GeometricSearchDet::DetWithState> detWithStates1, detWithStates2;
165 
166  LogTrace(metname) << "groupedCompatibleDets are currently given always in inside-out order";
167  // this should be fixed either in RecoMTD/MeasurementDet/MTDDetLayerMeasurements or
168  // RecoMTD/DetLayers/MTDRingForwardDoubleLayer
169 
170  detWithStates1 = theFrontLayer.compatibleDets(startingState, prop, est);
171  detWithStates2 = theBackLayer.compatibleDets(startingState, prop, est);
172 
173  vector<DetGroup> result;
174  if(!detWithStates1.empty()) result.push_back( DetGroup(detWithStates1) );
175  if(!detWithStates2.empty()) result.push_back( DetGroup(detWithStates2) );
176  LogTrace(metname) << "DoubleLayer Compatible dets: " << result.size();
177  return result;
178 }
179 
180 
182 {
183  const std::string metname = "MTD|RecoMTD|RecoMTDDetLayers|MTDRingForwardDoubleLayer";
184  // approximate
185  bool result = false;
186  double r = gp.perp();
187  const std::vector<const ForwardDetRing*>& backRings = theBackLayer.rings();
188  if(backRings.size() > 1)
189  {
190  const MTDDetRing * innerRing = dynamic_cast<const MTDDetRing *>(backRings[0]);
191  const MTDDetRing * outerRing = dynamic_cast<const MTDDetRing *>(backRings[1]);
192  assert(innerRing && outerRing);
193  float crackInner = innerRing->specificSurface().outerRadius();
194  float crackOuter = outerRing->specificSurface().innerRadius();
195  LogTrace(metname) << "In a crack:" << crackInner << " " << r << " " << crackOuter;
196  if(r > crackInner && r < crackOuter) return true;
197  }
198  // non-overlapping rings
199  return result;
200 }
201 
202 
204 {
205  const std::vector<const GeomDet*>& frontDets = theFrontLayer.basicComponents();
206  const std::vector<const GeomDet*>& backDets = theBackLayer.basicComponents();
207 
208  std::vector<const GeomDet*>::const_iterator frontItr = frontDets.begin(),
209  lastFront = frontDets.end(),
210  backItr = backDets.begin(),
211  lastBack = backDets.end();
212 
213  // test that each front z is less than each back z
214  for( ; frontItr != lastFront; ++frontItr)
215  {
216  float frontz = fabs( (**frontItr).surface().position().z() );
217  for( ; backItr != lastBack; ++backItr)
218  {
219  float backz = fabs( (**backItr).surface().position().z() );
220  assert(frontz < backz);
221  }
222  }
223 }
224 
225 
TkRotation< Scalar > RotationType
Definition: Definitions.h:29
float xx() const
Definition: LocalError.h:24
virtual const std::vector< const ForwardDetRing * > & rings() const
Return the vector of rings.
const std::vector< const GeomDet * > & basicComponents() const override
std::vector< DetWithState > compatibleDets(const TrajectoryStateOnSurface &startingState, const Propagator &prop, const MeasurementEstimator &est) const override
T perp() const
Definition: PV3DBase.h:72
MTDRingForwardDoubleLayer(const std::vector< const ForwardDetRing * > &frontRings, const std::vector< const ForwardDetRing * > &backRings)
Constructor, takes ownership of pointers.
std::vector< DetWithState > compatibleDets(const TrajectoryStateOnSurface &startingState, const Propagator &prop, const MeasurementEstimator &est) const override
const std::string metname
LocalVector localDirection() const
GlobalPoint globalPosition() const
BoundDisk * computeSurface() override
std::vector< const ForwardDetRing * > theRings
LocalError positionError() const
Geom::Theta< T > theta() const
Definition: PV3DBase.h:75
Point3DBase< Scalar, GlobalTag > PositionType
Definition: Definitions.h:30
const std::vector< const GeomDet * > & basicComponents() const override
bool isCrack(const GlobalPoint &gp) const
std::pair< bool, TrajectoryStateOnSurface > compatible(const TrajectoryStateOnSurface &, const Propagator &, const MeasurementEstimator &) const override
float yy() const
Definition: LocalError.h:26
T sqrt(T t)
Definition: SSEVec.h:18
std::vector< const GeomDet * > theBasicComponents
Tan< T >::type tan(const T &t)
Definition: Tan.h:22
T min(T a, T b)
Definition: MathUtil.h:58
const LocalTrajectoryError & localError() const
std::pair< const GeomDet *, TrajectoryStateOnSurface > DetWithState
#define LogTrace(id)
bool isInsideOut(const TrajectoryStateOnSurface &tsos) const
Disk BoundDisk
Definition: BoundDisk.h:62
TrajectoryStateOnSurface propagate(STA const &state, SUR const &surface) const
Definition: Propagator.h:53
std::vector< std::vector< double > > tmp
Definition: MVATrainer.cc:100
GlobalVector globalMomentum() const
bool inside(const Local3DPoint &p) const override
Determine if the point is inside the bounds.
std::vector< const GeometricSearchDet * > theComponents
std::vector< DetGroup > groupedCompatibleDets(const TrajectoryStateOnSurface &startingState, const Propagator &prop, const MeasurementEstimator &est) const override
const BasicVectorType & basicVector() const
Definition: PV3DBase.h:56
const BoundDisk & specificSurface() const
Return the ring surface as a BoundDisk.
T dot(const Basic3DVector &rh) const
Scalar product, or "dot" product, with a vector of same type.