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(this);
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(new MuonTransientTrackingRecHit(gemDetMap_iter->second,
163  *rechit) );
164  else if( (*rechit)->geographicalId() == det()->geographicalId() ) // Phi in DT is on Chamber
165  theSubTransientRecHits.push_back(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 const TrackingRecHit * hit() const
virtual GlobalVector globalDirection() const
Direction in 3D for segments, otherwise (0,0,0)
virtual const GeomDet * det() const GCC11_FINAL
The GomeDet* can be zero for InvalidTransientRecHits and for TConstraintRecHit2Ds.
virtual AlgebraicSymMatrix parametersError() const
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
std::vector< ConstRecHitPointer > RecHitContainer
virtual ConstRecHitContainer transientHits() const
return the sub components of this transient rechit
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
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.
LocalError const & localAlignmentError() const
Return local alligment error.
Definition: GeomDet.h:78
std::vector< ConstRecHitPointer > ConstRecHitContainer
virtual LocalError localDirectionError() const
Error on the local direction.
std::vector< std::vector< double > > tmp
Definition: MVATrainer.cc:100
virtual std::vector< const TrackingRecHit * > recHits() const
Access to component RecHits (if any)
static const int RPC
Definition: MuonSubdetId.h:14
CLHEP::HepSymMatrix AlgebraicSymMatrix
MuonTransientTrackingRecHit::MuonRecHitContainer MuonRecHitContainer
static const int DT
Definition: MuonSubdetId.h:12
virtual const Surface * surface() const GCC11_FINAL
DetId geographicalId() const