CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
DynamicTruncation.cc
Go to the documentation of this file.
1 
32 
41 
42 
43 #define MAX_THR 1e7
44 
45 using namespace edm;
46 using namespace std;
47 using namespace reco;
48 
50  DTThr(0), CSCThr(0), useAPE(false)
51 {
52  theEvent = &event;
53  theSetup = &theService.eventSetup();
54  propagator = theService.propagator("SmartPropagator");
55  propagatorCompatibleDet = theService.propagator("SteppingHelixPropagatorAny");
56  theG = theService.trackingGeometry();
57  theService.eventSetup().get<TransientRecHitRecord>().get("MuonRecHitBuilder",theMuonRecHitBuilder);
58  theService.eventSetup().get<TrackingComponentsRecord>().get("KFUpdator",updatorHandle);
59  theService.eventSetup().get<MuonGeometryRecord>().get(cscGeom);
60  theService.eventSetup().get<MuonRecoGeometryRecord>().get(navMuon);
61  theService.eventSetup().get<IdealMagneticFieldRecord>().get(magfield);
62  navigation = new DirectMuonNavigation(theService.detLayerGeometry());
63 }
64 
65 
66 
68  if (navigation) delete navigation;
69 }
70 
71 
72 
74  result.clear();
75 
76  // Fill the map with the APE chamber by chamber (DT)
77  // IT ALSO WORKS IF APE IS 0
78  edm::ESHandle<AlignmentErrors> dtAlignmentErrors;
79  theSetup->get<DTAlignmentErrorRcd>().get( dtAlignmentErrors );
80  for ( std::vector<AlignTransformError>::const_iterator it = dtAlignmentErrors->m_alignError.begin();
81  it != dtAlignmentErrors->m_alignError.end(); it++ ) {
82  CLHEP::HepSymMatrix error = (*it).matrix();
83  GlobalError glbErr(error[0][0], error[1][0], error[1][1], error[2][0], error[2][1], error[2][2]);
84  DTChamberId DTid((*it).rawId());
85  dtApeMap.insert( pair<DTChamberId, GlobalError> (DTid, glbErr) );
86  }
87 
88  // Fill the map with the APE chamber by chamber (CSC)
89  // IT ALSO WORKS IF APE IS 0
90  edm::ESHandle<AlignmentErrors> cscAlignmentErrors;
91  theSetup->get<CSCAlignmentErrorRcd>().get( cscAlignmentErrors );
92  for ( std::vector<AlignTransformError>::const_iterator it = cscAlignmentErrors->m_alignError.begin();
93  it != cscAlignmentErrors->m_alignError.end(); it++ ) {
94  CLHEP::HepSymMatrix error = (*it).matrix();
95  GlobalError glbErr(error[0][0], error[1][0], error[1][1], error[2][0], error[2][1], error[2][2]);
96  CSCDetId CSCid((*it).rawId());
97  cscApeMap.insert( pair<CSCDetId, GlobalError> (CSCid, glbErr) );
98  }
99 
100  // Put the tracker hits in the final vector and get the last tracker valid measure
101  std::vector<TrajectoryMeasurement> muonMeasurements = traj.measurements();
102  TrajectoryMeasurement lastTKm = muonMeasurements.front();
103  for (std::vector<TrajectoryMeasurement>::const_iterator imT = muonMeasurements.begin(); imT != muonMeasurements.end(); imT++ ) {
104  if ( !(*imT).recHit()->isValid() ) continue;
105  const TransientTrackingRecHit* hit = &(*(*imT).recHit());
106  if (hit->geographicalId().det() == DetId::Tracker) {
107  result.push_back((*imT).recHit());
108  if (!(*imT).forwardPredictedState().isValid()) continue;
109  if ((*imT).forwardPredictedState().globalPosition().mag()
110  > lastTKm.forwardPredictedState().globalPosition().mag()) lastTKm = *imT;
111  }
112  }
113 
114  // get the last (forward) predicted state for the tracker
116 
117  // update the state with the last tracker measure
118  update(currentState, lastTKm.recHit());
119 
120  // use the navigation to get the list of compatible dets
121  map<int, std::vector<DetId> > detMap;
122  compatibleDets(currentState, detMap);
123 
124  // selects the muon hits for the final refit
125  filteringAlgo(detMap);
126 
127  return result;
128 }
129 
130 
131 
132 void DynamicTruncation::setThr(int bThr, int eThr, int useAPE_) {
133  if (useAPE_ == 1) useAPE = true;
134  else useAPE = false;
135  if (bThr <= MAX_THR && bThr >= 0) DTThr = bThr; // DT thr
136  else DTThr = MAX_THR;
137  if (eThr <= MAX_THR && eThr >= 0) CSCThr = eThr; // CSC thr
138  else CSCThr = MAX_THR;
139 }
140 
141 
142 
143 double DynamicTruncation::getBest(std::vector<CSCSegment>& segs, TrajectoryStateOnSurface& tsos, CSCSegment& bestCSCSeg) {
144  unsigned int i = 0;
145  double val = MAX_THR;
146  std::vector<CSCSegment>::size_type sz = segs.size();
147  for (i=0; i<sz; i++) {
148  LocalError apeLoc; //default constructor is all zeroes, OK
149  if (useAPE) apeLoc = ErrorFrameTransformer().transform(cscApeMap.find(segs[i].cscDetId())->second, theG->idToDet(segs[i].cscDetId())->surface());
150  StateSegmentMatcher estim(&tsos, &segs[i], &apeLoc);
151  double tmp = estim.value();
152  if (tmp < val) {
153  bestCSCSeg = segs[i];
154  val = tmp;
155  }
156  }
157  return val;
158 }
159 
160 
161 
162 double DynamicTruncation::getBest(std::vector<DTRecSegment4D>& segs, TrajectoryStateOnSurface& tsos, DTRecSegment4D& bestDTSeg) {
163  unsigned int i = 0;
164  double val = MAX_THR;
166  for (i=0; i<sz; i++) {
167  LocalError apeLoc; //default constructor is all zeroes, OK
168  if (useAPE) apeLoc = ErrorFrameTransformer().transform(dtApeMap.find(segs[i].chamberId())->second, theG->idToDet(segs[i].chamberId())->surface());
169  StateSegmentMatcher estim(&tsos, &segs[i], &apeLoc);
170  double tmp = estim.value();
171  if (tmp < val) {
172  bestDTSeg = segs[i];
173  val = tmp;
174  }
175  }
176  return val;
177 }
178 
179 
180 
181 void DynamicTruncation::compatibleDets(TrajectoryStateOnSurface& tsos, map<int, std::vector<DetId> >& detMap) {
182  // SteppingHelixPropagator prop(magfield.product(), anyDirection);
183  // MuonPatternRecoDumper dumper;
184  MeasurementEstimator *theEstimator = new Chi2MeasurementEstimator(100, 3);
185  std::vector<const DetLayer *> navLayers;
187  for ( unsigned int ilayer=0; ilayer<navLayers.size(); ilayer++ ) {
188  // Skip RPC layers
189  if (navLayers[ilayer]->subDetector() == GeomDetEnumerators::RPCEndcap
190  || navLayers[ilayer]->subDetector() == GeomDetEnumerators::RPCBarrel) continue;
191  std::vector<DetLayer::DetWithState> comps = navLayers[ilayer]->compatibleDets(currentState,
192  *propagatorCompatibleDet, *theEstimator);
193  // cout << comps.size() << " compatible Dets with " << navLayers[ilayer]->subDetector() << " Layer " << ilayer << " "
194  // << dumper.dumpLayer(navLayers[ilayer]) << " " << endl;
195  if (comps.size() > 0) {
196  for ( unsigned int icomp=0; icomp<comps.size(); icomp++ ) {
197  DetId id(comps[icomp].first->geographicalId().rawId());
198  detMap[ilayer].push_back(id);
199  }
200  }
201  }
202  if (theEstimator) delete theEstimator;
203 }
204 
205 
206 
207 void DynamicTruncation::filteringAlgo(map<int, std::vector<DetId> >& detMap) {
209  for (unsigned int iDet = 0; iDet < detMap.size(); ++iDet) {
210  double bestLayerValue = MAX_THR;
211  bool isDTorCSC = false;
212  ConstRecHitContainer layerRH, layerSEG;
213  std::vector<DetId> chamber = detMap[iDet];
214  for (unsigned int j = 0; j < chamber.size(); ++j) {
215  DetId id = chamber[j];
216 
217  if (id.det() == DetId::Muon && id.subdetId() == MuonSubdetId::DT) {
218  isDTorCSC = true;
219 
220  DTChamberId DTid(id);
221 
222  std::vector<DTRecSegment4D> allDTsegs;
223  std::map<int, std::vector<DTRecSegment4D> >::const_iterator dtIter = getSegs.getDTlist().find(DTid.station());
224  if (dtIter != getSegs.getDTlist().end()){
225  allDTsegs = dtIter->second;
226  }
227  std::vector<DTRecSegment4D>::size_type sz = allDTsegs.size();
228  for (unsigned int iSeg=0; iSeg<sz; ++iSeg) {
229 
230  // Propagate the state to the current chamber
231  TrajectoryStateOnSurface tsosdt = propagator->propagate(currentState,
232  theG->idToDet(allDTsegs[iSeg].chamberId())->surface());
233  if (!tsosdt.isValid()) continue;
234 
235  std::vector<DTRecSegment4D> DTsegs;
236  DTsegs.push_back(allDTsegs[iSeg]);
237 
238  DTRecSegment4D bestDTSeg;
239  double bestChamberValue = getBest(DTsegs, tsosdt, bestDTSeg);
240  if (bestChamberValue < bestLayerValue) bestLayerValue = bestChamberValue;
241 
242  // Check if the best estimator value is below the THR and then get the RH componing the segment
243  if (bestChamberValue >= DTThr || bestChamberValue > bestLayerValue) continue;
244  layerRH.clear(); layerSEG.clear();
245  layerSEG.push_back(theMuonRecHitBuilder->build(&bestDTSeg));
246  std::vector<DTRecHit1D> DTrh = getSegs.getDTRHmap(bestDTSeg);
247  for (std::vector<DTRecHit1D>::iterator it = DTrh.begin(); it != DTrh.end(); it++) {
248  layerRH.push_back(theMuonRecHitBuilder->build(&*it));
249  }
250  }
251  }
252  if (id.det() == DetId::Muon && id.subdetId() == MuonSubdetId::CSC) {
253  isDTorCSC = true;
254  CSCDetId CSCid(id);
255 
256  std::vector<CSCSegment> allCSCsegs;
257  std::map<int, std::vector<CSCSegment> >::const_iterator cscIter = getSegs.getCSClist().find(CSCid.station());
258  if (cscIter != getSegs.getCSClist().end()){
259  allCSCsegs = cscIter->second;
260  }
261 
262  std::vector<CSCSegment>::size_type sz = allCSCsegs.size();
263  for (unsigned int iSeg=0; iSeg<sz; ++iSeg) {
264 
265  // Propagate the state to the current chamber
266  TrajectoryStateOnSurface tsoscsc = propagator->propagate(currentState,
267  theG->idToDet(allCSCsegs[iSeg].cscDetId())->surface());
268  if (!tsoscsc.isValid()) continue;
269 
270  std::vector<CSCSegment> CSCsegs;
271  CSCsegs.push_back(allCSCsegs[iSeg]);
272 
273  CSCSegment bestCSCSeg;
274  double bestChamberValue = getBest(CSCsegs, tsoscsc, bestCSCSeg);
275  if (bestChamberValue < bestLayerValue) bestLayerValue = bestChamberValue;
276 
277  // Check if the best estimator value is below the THR and then get the RH componing the segment
278  if (bestChamberValue >= CSCThr || bestChamberValue > bestLayerValue) continue;
279  layerRH.clear(); layerSEG.clear();
280  layerSEG.push_back(theMuonRecHitBuilder->build(&bestCSCSeg));
281  std::vector<CSCRecHit2D> CSCrh = getSegs.getCSCRHmap(bestCSCSeg);
282  for (std::vector<CSCRecHit2D>::iterator it = CSCrh.begin(); it != CSCrh.end(); ++it) {
283  layerRH.push_back(theMuonRecHitBuilder->build(&*it));
284  }
285  }
286  }
287  }
288 
289  if (isDTorCSC) {
290  if (bestLayerValue < MAX_THR) estimators.push_back(bestLayerValue);
291  else estimators.push_back(-1);
292  }
293 
294  // For segment based fits
295  if (layerSEG.size() > 0) {
296  result.push_back(layerSEG.front());
297  DetId id_ = layerSEG.front()->geographicalId();
298  if (id_.subdetId() == MuonSubdetId::DT) {
299  DTChamberId MuonChId(id_);
300  TrajectoryStateOnSurface temp = propagator->propagate(currentState, theG->idToDet(MuonChId)->surface());
301  if (temp.isValid())
302  currentState = updatorHandle->update(temp, *layerSEG.front());
303  }
304  if (id_.subdetId() == MuonSubdetId::CSC) {
305  CSCDetId MuonChId(id_);
306  TrajectoryStateOnSurface temp = propagator->propagate(currentState, theG->idToDet(MuonChId)->surface());
307  if (temp.isValid())
308  currentState = updatorHandle->update(temp, *layerSEG.front());
309  }
310  }
311 
312 
313 
314 
315  /*
316  // For hit based fits
317  if (layerRH.size() > 0) {
318  for (ConstRecHitContainer::iterator it = layerRH.begin(); it != layerRH.end(); ++it) result.push_back((*it));
319 
320  // sort the vector
321  layerRH = sort(layerRH);
322 
323  // update the currentState using all rh
324  DetId id = layerRH.front()->geographicalId();
325  if (id.subdetId() == MuonSubdetId::DT) updateWithDThits(layerRH);
326  else updateWithCSChits(layerRH);
327  }
328  */
329 
330  layerSEG.clear();
331  layerRH.clear();
332  }
333 }
334 
335 
336 
338  TrajectoryStateOnSurface temp = updatorHandle->update(tsos, *rechit);
339  if (temp.isValid()) currentState = updatorHandle->update(tsos, *rechit);
340 }
341 
342 
343 
345  for (ConstRecHitContainer::const_iterator it = recHits.begin(); it != recHits.end(); ++it) {
346  DTLayerId layid((*it)->det()->geographicalId());
347  TrajectoryStateOnSurface temp = propagator->propagate(currentState, theG->idToDet(layid)->surface());
348  if (temp.isValid()) currentState = updatorHandle->update(temp, **it);
349  }
350 }
351 
352 
353 
355  for (ConstRecHitContainer::const_iterator it = recHits.begin(); it != recHits.end(); ++it) {
356  const CSCLayer* cscChamber = cscGeom->layer((*it)->det()->geographicalId());
357  CSCDetId layid = cscChamber->geographicalId();
358  TrajectoryStateOnSurface temp = propagator->propagate(currentState, theG->idToDet(layid)->surface());
359  if (temp.isValid()) currentState = updatorHandle->update(temp, **it);
360  }
361 }
362 
363 
364 
366  unsigned int i=0;
367  unsigned int j=0;
368  ConstRecHitContainer::size_type n = recHits.size();
369  for(i=1; i<n; ++i)
370  for(j=n-1; j>=i; --j)
371  {
372  if(recHits[j-1]->globalPosition().mag() > recHits[j]->globalPosition().mag())
373  {
374  swap (recHits[j-1],recHits[j]);
375  }
376  }
377  return recHits;
378 }
379 
void swap(ora::Record &rh, ora::Record &lh)
Definition: Record.h:70
DirectMuonNavigation * navigation
static GlobalError transform(const LocalError &le, const Surface &surf)
int i
Definition: DBlmapReader.cc:9
void compatibleDets(TrajectoryStateOnSurface &, std::map< int, std::vector< DetId > > &)
ConstRecHitPointer const & recHit() const
TrajectoryStateOnSurface currentState
edm::ESHandle< Propagator > propagatorCompatibleDet
std::vector< double > estimators
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
GlobalPoint globalPosition() const
uint16_t size_type
dictionary map
Definition: Association.py:205
std::vector< const DetLayer * > compatibleLayers(const FreeTrajectoryState &fts, PropagationDirection timeDirection) const
U second(std::pair< T, U > const &p)
std::vector< CSCRecHit2D > getCSCRHmap(const CSCSegment &)
DataContainer const & measurements() const
Definition: Trajectory.h:215
void filteringAlgo(std::map< int, std::vector< DetId > > &)
static const int CSC
Definition: MuonSubdetId.h:15
T mag() const
Definition: PV3DBase.h:67
edm::ESHandle< MuonDetLayerGeometry > navMuon
const std::map< int, std::vector< CSCSegment > > & getCSClist() const
ConstRecHitContainer result
FreeTrajectoryState * freeState(bool withErrors=true) const
const edm::EventSetup * theSetup
TransientTrackingRecHit::ConstRecHitContainer ConstRecHitContainer
double getBest(std::vector< CSCSegment > &, TrajectoryStateOnSurface &, CSCSegment &)
int j
Definition: DBlmapReader.cc:9
DetId geographicalId() const
The label of this GeomDet.
Definition: GeomDet.h:72
edm::ESHandle< TrajectoryStateUpdator > updatorHandle
TransientTrackingRecHit::ConstRecHitContainer filter(const Trajectory &)
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
bool first
Definition: L1TdeRCT.cc:94
int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:39
const edm::Event * theEvent
edm::ESHandle< TransientTrackingRecHitBuilder > theMuonRecHitBuilder
#define MAX_THR
TrajectoryStateOnSurface const & forwardPredictedState() const
Access to forward predicted state (from fitter or builder)
std::vector< ConstRecHitPointer > ConstRecHitContainer
Definition: DetId.h:20
void setThr(int, int, int)
std::map< DTChamberId, GlobalError > dtApeMap
DynamicTruncation(const edm::Event &, const MuonServiceProxy &)
const T & get() const
Definition: EventSetup.h:55
void update(TrajectoryStateOnSurface &, ConstRecHitPointer)
ConstRecHitContainer sort(ConstRecHitContainer &)
edm::ESHandle< Propagator > propagator
std::vector< std::vector< double > > tmp
Definition: MVATrainer.cc:100
const std::map< int, std::vector< DTRecSegment4D > > & getDTlist() const
void updateWithDThits(ConstRecHitContainer &)
void updateWithCSChits(ConstRecHitContainer &)
int station() const
Definition: CSCDetId.h:88
static const int DT
Definition: MuonSubdetId.h:14
DetId geographicalId() const
std::vector< DTRecHit1D > getDTRHmap(const DTRecSegment4D &)
int station() const
Return the station number.
Definition: DTChamberId.h:53
Detector det() const
get the detector field from this detid
Definition: DetId.h:37
edm::ESHandle< MagneticField > magfield
std::map< CSCDetId, GlobalError > cscApeMap
edm::ESHandle< GlobalTrackingGeometry > theG
edm::ESHandle< CSCGeometry > cscGeom