CMS 3D CMS Logo

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 
59 
61  if (APE != nullptr) {
62  AlgebraicVector positions(2,0);
64 
65  if(err.num_row() == 1) {
66  positions[0] = 0.;
67  positions[1] = 0.;
68  directions[0] = 0.;
69  directions[1] = 0.;
71  err[0][0] += lape.cxx();
72  } else if (err.num_row() == 2) {
73  positions[0] = localPosition().x();
74  positions[1] = 0.;
75  directions[0] = 0.;
76  directions[1] = 0.;
78 
79  AlgebraicSymMatrix lapeMatrix(2,0);
80  lapeMatrix[1][1] = lape.cxx();
81  lapeMatrix[0][0] = lape.cphixphix();
82  lapeMatrix[0][1] = lape.cphixx();
83 
84  if(err.num_row() != lapeMatrix.num_row())
85  throw cms::Exception("MuonTransientTrackingRecHit::parametersError")
86  <<"Discrepancy between alignment error matrix and error matrix: APE "
87  << lapeMatrix.num_row()
88  << ", error matrix " << err.num_row()
89  << std::endl;
90 
91  err += lapeMatrix;
92  } else if (err.num_row() == 4) {
93  positions[0] = par[2];
94  positions[1] = par[3];
95  directions[0] = par[0];
96  directions[1] = par[1];
97 
99 
100  AlgebraicSymMatrix lapeMatrix(4,0);
101  lapeMatrix[2][2] = lape.cxx();
102  lapeMatrix[2][3] = lape.cyx();
103  lapeMatrix[3][3] = lape.cyy();
104  lapeMatrix[0][0] = lape.cphixphix();
105  lapeMatrix[0][1] = lape.cphiyphix();
106  lapeMatrix[1][1] = lape.cphiyphiy();
107 
108  lapeMatrix[0][2] = lape.cphixx();
109  lapeMatrix[0][3] = lape.cphixy();
110  lapeMatrix[1][3] = lape.cphiyy();
111  lapeMatrix[1][2] = lape.cphiyx();
112 
113  if(err.num_row() != lapeMatrix.num_row())
114  throw cms::Exception("MuonTransientTrackingRecHit::parametersError")
115  <<"Discrepancy between alignment error matrix and error matrix: APE "
116  << lapeMatrix.num_row()
117  << ", error matrix " << err.num_row()
118  << std::endl;
119 
120  err += lapeMatrix;
121  }
122  }
123  return err;
124 }
125 
127 {
128  if (dynamic_cast<const RecSegment*>(hit()))
129  return dynamic_cast<const RecSegment*>(hit())->chi2();
130  else return 0.;
131 }
132 
134 {
135  if (dynamic_cast<const RecSegment*>(hit()))
136  return dynamic_cast<const RecSegment*>(hit())->degreesOfFreedom();
137  else return 0;
138 }
139 
141  return (geographicalId().subdetId() == MuonSubdetId::DT);
142 }
143 
145  return (geographicalId().subdetId() == MuonSubdetId::CSC);
146 }
147 
149  return (geographicalId().subdetId() == MuonSubdetId::GEM);
150 }
151 
153  return (geographicalId().subdetId() == MuonSubdetId::ME0);
154 
155 }
156 
158  return (geographicalId().subdetId() == MuonSubdetId::RPC);
159 }
160 
161 // FIXME, now it is "on-demand". I have to change it.
162 // FIXME check on mono hit!
164 
165  ConstRecHitContainer theSubTransientRecHits;
166 
167  // the sub rec hit of this TransientRecHit
168  std::vector<const TrackingRecHit*> ownRecHits = recHits();
169 
170  if(ownRecHits.empty()){
171  theSubTransientRecHits.push_back(TransientTrackingRecHit::RecHitPointer(clone()));
172  return theSubTransientRecHits;
173  }
174 
175  // the components of the geom det on which reside this rechit
176  std::vector<const GeomDet *> geomDets = det()->components();
177 
178  if(isDT() && dimension() == 2 && ownRecHits.front()->dimension() == 1
179  && (geomDets.size() == 3 || geomDets.size() == 2) ){ // it is a phi segment!!
180 
181  std::vector<const GeomDet *> subGeomDets;
182 
183  int sl = 1;
184  for(std::vector<const GeomDet *>::const_iterator geoDet = geomDets.begin();
185  geoDet != geomDets.end(); ++geoDet){
186  if(sl != 3){ // FIXME!! this maybe is not always true
187  std::vector<const GeomDet *> tmp = (*geoDet)->components();
188  std::copy(tmp.begin(),tmp.end(),back_inserter(subGeomDets));
189  }
190  ++sl;
191  }
192  geomDets.clear();
193  geomDets = subGeomDets;
194  }
195 
196  // Fill the GeomDet map
197  std::map<DetId,const GeomDet*> gemDetMap;
198 
199  for (std::vector<const GeomDet*>::const_iterator subDet = geomDets.begin();
200  subDet != geomDets.end(); ++subDet)
201  gemDetMap[ (*subDet)->geographicalId() ] = *subDet;
202 
203  std::map<DetId,const GeomDet*>::iterator gemDetMap_iter;
204 
205  // Loop in order to check the ids
206  for (std::vector<const TrackingRecHit*>::const_iterator rechit = ownRecHits.begin();
207  rechit != ownRecHits.end(); ++rechit){
208 
209  gemDetMap_iter = gemDetMap.find( (*rechit)->geographicalId() );
210 
211  if(gemDetMap_iter != gemDetMap.end() )
212  theSubTransientRecHits.push_back(TransientTrackingRecHit::RecHitPointer(new MuonTransientTrackingRecHit(gemDetMap_iter->second,
213  *rechit)) );
214  else if( (*rechit)->geographicalId() == det()->geographicalId() ) // Phi in DT is on Chamber
215  theSubTransientRecHits.push_back(TransientTrackingRecHit::RecHitPointer(new MuonTransientTrackingRecHit(det(),
216  *rechit)) );
217  }
218  return theSubTransientRecHits;
219 
220 }
221 
222 
225 
226 
227  if (isDT()){
228  if(dimension() > 1){ // MB4s have 2D, but formatted in 4D segments
229  std::vector<TrackingRecHit*> seg2D = recHits(); // 4D --> 2D
230  // load 1D hits (2D --> 1D)
231  for(std::vector<TrackingRecHit*>::iterator it = seg2D.begin(); it != seg2D.end(); ++it){
232  std::vector<TrackingRecHit*> hits1D = (*it)->recHits();
233  (*it)->setType(bad);
234  for(std::vector<TrackingRecHit*>::iterator it2 = hits1D.begin(); it2 != hits1D.end(); ++it2)
235  (*it2)->setType(bad);
236  }
237  }
238  }
239  else if(isCSC())
240  if(dimension() == 4){
241  std::vector<TrackingRecHit*> hits = recHits(); // load 2D hits (4D --> 1D)
242  for(std::vector<TrackingRecHit*>::iterator it = hits.begin(); it != hits.end(); ++it)
243  (*it)->setType(bad);
244  }
245 
246 
247 }
virtual int degreesOfFreedom() const
Degrees of freedom for segments, else 0.
static GlobalError transform(const LocalError &le, const Surface &surf)
bool isCSC() const
if this rec hit is a CSC rec hit
Local3DVector LocalVector
Definition: LocalVector.h:12
static LocalErrorExtended transform46(const GlobalErrorExtended &ge, const AlgebraicVector &positions, const AlgebraicVector &directions)
MuonTransientTrackingRecHit::RecHitContainer MuonRecHitContainer
virtual double chi2() const
Chi square of the fit for segments, else 0.
static const int GEM
Definition: MuonSubdetId.h:15
virtual GlobalVector globalDirection() const
Direction in 3D for segments, otherwise (0,0,0)
ConstRecHitContainer transientHits() const override
return the sub components of this transient rechit
std::vector< ConstRecHitPointer > RecHitContainer
bool isGEM() const
if this rec hit is a GEM rec hit
virtual GlobalError globalDirectionError() const
Error on the global direction.
bool isRPC() const
if this rec hit is a RPC rec hit
AlgebraicVector parameters() const override
bool isDT() const
if this rec hit is a DT rec hit
const TrackingRecHit * hit() const override
const GlobalErrorExtended & globalError() const
virtual LocalVector localDirection() const
Direction in 3D for segments, otherwise (0,0,0)
static const int ME0
Definition: MuonSubdetId.h:16
static const int CSC
Definition: MuonSubdetId.h:13
MuonTransientTrackingRecHit(const GeomDet *geom, const TrackingRecHit *rh)
Construct from a TrackingRecHit and its GeomDet.
MuonTransientTrackingRecHit * clone() const override
std::shared_ptr< MuonTransientTrackingRecHit > MuonRecHitPointer
const GeomDet * det() const
void setType(Type ttype)
DetId geographicalId() const
The label of this GeomDet.
Definition: GeomDet.h:79
const Surface * surface() const final
std::vector< const TrackingRecHit * > recHits() const override
Access to component RecHits (if any)
std::shared_ptr< TrackingRecHit const > RecHitPointer
AlgebraicSymMatrix parametersError() const override
std::vector< ConstRecHitPointer > ConstRecHitContainer
virtual std::vector< const GeomDet * > components() const
Returns direct components, if any.
Definition: GeomDet.h:88
CLHEP::HepVector AlgebraicVector
virtual LocalError localDirectionError() const
Error on the local direction.
bool isME0() const
if this rec hit is a ME0 rec hit
AlgebraicSymMatrix parametersError() const override
MuonTransientTrackingRecHit::MuonRecHitPointer MuonRecHitPointer
std::vector< std::vector< double > > tmp
Definition: MVATrainer.cc:100
static const int RPC
Definition: MuonSubdetId.h:14
CLHEP::HepSymMatrix AlgebraicSymMatrix
static const int DT
Definition: MuonSubdetId.h:12
DetId geographicalId() const
T x() const
Definition: PV3DBase.h:62
AlignmentPositionError const * alignmentPositionError() const
Return pointer to alignment errors.
Definition: GeomDet.h:95