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)
static constexpr int GEM
Definition: MuonSubdetId.h:15
MuonTransientTrackingRecHit::RecHitContainer MuonRecHitContainer
def copy(args, dbName)
virtual double chi2() const
Chi square of the fit for segments, else 0.
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)
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
static constexpr int ME0
Definition: MuonSubdetId.h:16
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
static constexpr int RPC
Definition: MuonSubdetId.h:14
AlgebraicSymMatrix parametersError() const override
MuonTransientTrackingRecHit::MuonRecHitPointer MuonRecHitPointer
std::vector< std::vector< double > > tmp
Definition: MVATrainer.cc:100
CLHEP::HepSymMatrix AlgebraicSymMatrix
DetId geographicalId() const
static constexpr int DT
Definition: MuonSubdetId.h:12
static constexpr int CSC
Definition: MuonSubdetId.h:13
T x() const
Definition: PV3DBase.h:62
AlignmentPositionError const * alignmentPositionError() const
Return pointer to alignment errors.
Definition: GeomDet.h:95