CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
MuonTransientTrackingRecHit.cc
Go to the documentation of this file.
1 
7 
12 
14 
15 #include <map>
16 
19 
20 
23 
25  GenericTransientTrackingRecHit(*other.det(), *(other.hit())) {}
26 
27 
29 
30  if (dynamic_cast<const RecSegment*>(hit()) )
31  return dynamic_cast<const RecSegment*>(hit())->localDirection();
32  else return LocalVector(0.,0.,0.);
33 
34 }
35 
37 
38  if (dynamic_cast<const RecSegment*>(hit()))
39  return dynamic_cast<const RecSegment*>(hit())->localDirectionError();
40  else return LocalError(0.,0.,0.);
41 
42 }
43 
45 {
46  return (det()->surface().toGlobal(localDirection()));
47 }
48 
50 {
52 }
53 
54 
56 
58 
60  if (lape.valid()) {
61 
62  // Just for speed up the code, the "else" branch can handle also the case of dim = 1.
63  if(err.num_row() == 1) err[0][0] += lape.xx();
64  else{
65  AlgebraicSymMatrix lapeMatrix(5,0);
66  lapeMatrix[3][3] = lape.xx();
67  lapeMatrix[3][4] = lape.xy();
68  lapeMatrix[4][4] = lape.yy();
69 
70  AlgebraicSymMatrix lapeMatrixProj = lapeMatrix.similarity(projectionMatrix());
71 
72  if(err.num_row() != lapeMatrixProj.num_row())
73  throw cms::Exception("MuonTransientTrackingRecHit::parametersError")
74  <<"Discrepancy between alignment error matrix and error matrix: APE "
75  << lapeMatrixProj.num_row()
76  << ", error matrix " << err.num_row()
77  << std::endl;
78 
79  err += lapeMatrixProj;
80  }
81  }
82  return err;
83 }
84 
86 {
87  if (dynamic_cast<const RecSegment*>(hit()))
88  return dynamic_cast<const RecSegment*>(hit())->chi2();
89  else return 0.;
90 }
91 
93 {
94  if (dynamic_cast<const RecSegment*>(hit()))
95  return dynamic_cast<const RecSegment*>(hit())->degreesOfFreedom();
96  else return 0;
97 }
98 
100  return (geographicalId().subdetId() == MuonSubdetId::DT);
101 }
102 
104  return (geographicalId().subdetId() == MuonSubdetId::CSC);
105 }
106 
108  return (geographicalId().subdetId() == MuonSubdetId::RPC);
109 }
110 
111 // FIXME, now it is "on-demand". I have to change it.
112 // FIXME check on mono hit!
114 
115  ConstRecHitContainer theSubTransientRecHits;
116 
117  // the sub rec hit of this TransientRecHit
118  std::vector<const TrackingRecHit*> ownRecHits = recHits();
119 
120  if(ownRecHits.size() == 0){
121  theSubTransientRecHits.push_back(TransientTrackingRecHit::RecHitPointer(clone()));
122  return theSubTransientRecHits;
123  }
124 
125  // the components of the geom det on which reside this rechit
126  std::vector<const GeomDet *> geomDets = det()->components();
127 
128  if(isDT() && dimension() == 2 && ownRecHits.front()->dimension() == 1
129  && (geomDets.size() == 3 || geomDets.size() == 2) ){ // it is a phi segment!!
130 
131  std::vector<const GeomDet *> subGeomDets;
132 
133  int sl = 1;
134  for(std::vector<const GeomDet *>::const_iterator geoDet = geomDets.begin();
135  geoDet != geomDets.end(); ++geoDet){
136  if(sl != 3){ // FIXME!! this maybe is not always true
137  std::vector<const GeomDet *> tmp = (*geoDet)->components();
138  std::copy(tmp.begin(),tmp.end(),back_inserter(subGeomDets));
139  }
140  ++sl;
141  }
142  geomDets.clear();
143  geomDets = subGeomDets;
144  }
145 
146  // Fill the GeomDet map
147  std::map<DetId,const GeomDet*> gemDetMap;
148 
149  for (std::vector<const GeomDet*>::const_iterator subDet = geomDets.begin();
150  subDet != geomDets.end(); ++subDet)
151  gemDetMap[ (*subDet)->geographicalId() ] = *subDet;
152 
153  std::map<DetId,const GeomDet*>::iterator gemDetMap_iter;
154 
155  // Loop in order to check the ids
156  for (std::vector<const TrackingRecHit*>::const_iterator rechit = ownRecHits.begin();
157  rechit != ownRecHits.end(); ++rechit){
158 
159  gemDetMap_iter = gemDetMap.find( (*rechit)->geographicalId() );
160 
161  if(gemDetMap_iter != gemDetMap.end() )
162  theSubTransientRecHits.push_back(TransientTrackingRecHit::RecHitPointer(new MuonTransientTrackingRecHit(gemDetMap_iter->second,
163  *rechit)) );
164  else if( (*rechit)->geographicalId() == det()->geographicalId() ) // Phi in DT is on Chamber
165  theSubTransientRecHits.push_back(TransientTrackingRecHit::RecHitPointer(new MuonTransientTrackingRecHit(det(),
166  *rechit)) );
167  }
168  return theSubTransientRecHits;
169 
170 }
171 
172 
175 
176 
177  if (isDT()){
178  if(dimension() > 1){ // MB4s have 2D, but formatted in 4D segments
179  std::vector<TrackingRecHit*> seg2D = recHits(); // 4D --> 2D
180  // load 1D hits (2D --> 1D)
181  for(std::vector<TrackingRecHit*>::iterator it = seg2D.begin(); it != seg2D.end(); ++it){
182  std::vector<TrackingRecHit*> hits1D = (*it)->recHits();
183  (*it)->setType(bad);
184  for(std::vector<TrackingRecHit*>::iterator it2 = hits1D.begin(); it2 != hits1D.end(); ++it2)
185  (*it2)->setType(bad);
186  }
187  }
188  }
189  else if(isCSC())
190  if(dimension() == 4){
191  std::vector<TrackingRecHit*> hits = recHits(); // load 2D hits (4D --> 1D)
192  for(std::vector<TrackingRecHit*>::iterator it = hits.begin(); it != hits.end(); ++it)
193  (*it)->setType(bad);
194  }
195 
196 
197 }
virtual int degreesOfFreedom() const
Degrees of freedom for segments, else 0.
bool valid() const
Definition: LocalError.h:21
static GlobalError transform(const LocalError &le, const Surface &surf)
bool isCSC() const
if this rec hit is a CSC rec hit
float xx() const
Definition: LocalError.h:24
Local3DVector LocalVector
Definition: LocalVector.h:12
MuonTransientTrackingRecHit::MuonRecHitPointer MuonRecHitPointer
virtual double chi2() const
Chi square of the fit for segments, else 0.
virtual MuonTransientTrackingRecHit * clone() const override
virtual const TrackingRecHit * hit() const
virtual GlobalVector globalDirection() const
Direction in 3D for segments, otherwise (0,0,0)
std::vector< ConstRecHitPointer > RecHitContainer
virtual AlgebraicMatrix projectionMatrix() const
virtual GlobalError globalDirectionError() const
Error on the global direction.
bool isRPC() const
if this rec hit is a RPC rec hit
bool isDT() const
if this rec hit is a DT rec hit
virtual std::vector< const TrackingRecHit * > recHits() const override
Access to component RecHits (if any)
virtual LocalVector localDirection() const
Direction in 3D for segments, otherwise (0,0,0)
float xy() const
Definition: LocalError.h:25
static const int CSC
Definition: MuonSubdetId.h:13
MuonTransientTrackingRecHit(const GeomDet *geom, const TrackingRecHit *rh)
Construct from a TrackingRecHit and its GeomDet.
float yy() const
Definition: LocalError.h:26
virtual AlgebraicSymMatrix parametersError() const
const GeomDet * det() const
void setType(Type ttype)
DetId geographicalId() const
The label of this GeomDet.
Definition: GeomDet.h:72
virtual std::vector< const GeomDet * > components() const =0
Returns direct components, if any.
std::shared_ptr< TrackingRecHit const > RecHitPointer
std::vector< ConstRecHitPointer > ConstRecHitContainer
LocalError const & localAlignmentError() const
Return local alligment error.
Definition: GeomDet.h:78
virtual LocalError localDirectionError() const
Error on the local direction.
virtual ConstRecHitContainer transientHits() const override
return the sub components of this transient rechit
std::vector< std::vector< double > > tmp
Definition: MVATrainer.cc:100
static const int RPC
Definition: MuonSubdetId.h:14
virtual AlgebraicSymMatrix parametersError() const override
CLHEP::HepSymMatrix AlgebraicSymMatrix
MuonTransientTrackingRecHit::MuonRecHitContainer MuonRecHitContainer
static const int DT
Definition: MuonSubdetId.h:12
DetId geographicalId() const
virtual const Surface * surface() const