CMS 3D CMS Logo

StandAloneMuonFilter.cc
Go to the documentation of this file.
1 
11 
13 
14 // FIXME: remove this
16 
23 
25 
27 
29 
33 
36 
37 #include <vector>
38 
39 using namespace edm;
40 using namespace std;
41 
45 :theService(service),
46  theOverlappingChambersFlag(true)
47 {
48  // Fit direction
49  string fitDirectionName = par.getParameter<string>("FitDirection");
50 
51  if (fitDirectionName == "insideOut" ) theFitDirection = insideOut;
52  else if (fitDirectionName == "outsideIn" ) theFitDirection = outsideIn;
53  else
54  throw cms::Exception("StandAloneMuonFilter constructor")
55  <<"Wrong fit direction chosen in StandAloneMuonFilter::StandAloneMuonFilter ParameterSet"
56  << "\n"
57  << "Possible choices are:"
58  << "\n"
59  << "FitDirection = insideOut or FitDirection = outsideIn";
60 
61  // The max allowed chi2 to accept a rechit in the fit
62  theMaxChi2 = par.getParameter<double>("MaxChi2");
63 
64  // The errors of the trajectory state are multiplied by nSigma
65  // to define acceptance of BoundPlane and maximalLocalDisplacement
66  theNSigma = par.getParameter<double>("NumberOfSigma"); // default = 3.
67 
68  // The navigation type:
69  // "Direct","Standard"
70  theNavigationType = par.getParameter<string>("NavigationType");
71 
72  // The estimator: makes the decision wheter a measure is good or not
73  // it isn't used by the updator which does the real fit. In fact, in principle,
74  // a looser request onto the measure set can be requested
75  // (w.r.t. the request on the accept/reject measure in the fit)
77 
78  thePropagatorName = par.getParameter<string>("Propagator");
79 
81 
82  // Muon trajectory updator parameters
83  ParameterSet muonUpdatorPSet = par.getParameter<ParameterSet>("MuonTrajectoryUpdatorParameters");
84 
85  // the updator needs the fit direction
86  theMuonUpdator = new MuonTrajectoryUpdator(muonUpdatorPSet,
87  fitDirection() );
88 
89  // Measurement Extractor: enable the measure for each muon sub detector
90  bool enableDTMeasurement = par.getParameter<bool>("EnableDTMeasurement");
91  bool enableCSCMeasurement = par.getParameter<bool>("EnableCSCMeasurement");
92  bool enableRPCMeasurement = par.getParameter<bool>("EnableRPCMeasurement");
93  bool enableGEMMeasurement = par.getParameter<bool>("EnableGEMMeasurement");
94  bool enableME0Measurement = par.getParameter<bool>("EnableME0Measurement");
95 
97  par.getParameter<InputTag>("CSCRecSegmentLabel"),
98  par.getParameter<InputTag>("RPCRecSegmentLabel"),
99  par.getParameter<InputTag>("GEMRecSegmentLabel"),
100  par.getParameter<InputTag>("ME0RecSegmentLabel"),
101  iC,
102  enableDTMeasurement,
103  enableCSCMeasurement,
104  enableRPCMeasurement,
105  enableGEMMeasurement,
106  enableME0Measurement);
107 
108  theRPCLoneliness = (!(enableDTMeasurement && enableCSCMeasurement)) ? enableRPCMeasurement : false;
109 }
110 
112 
113  LogTrace("Muon|RecoMuon|StandAloneMuonFilter")
114  <<"StandAloneMuonFilter destructor called"<<endl;
115 
116  delete theEstimator;
117  delete theMuonUpdator;
120 }
121 
123  return &*theService->propagator(thePropagatorName);
124 }
125 
128  if( fitDirection() == 0 ) return alongMomentum;
129  else if ( fitDirection() == 1 ) return oppositeToMomentum;
130  else return anyDirection;
131 }
132 
133 
137 
139 
141 
142  theDetLayers.clear();
143 }
144 
147 }
148 
149 
151 
153  else if(layer->subDetector()==GeomDetEnumerators::CSC) cscChambers++;
155  else if(layer->subDetector()==GeomDetEnumerators::GEM) gemChambers++;
156  else if(layer->subDetector()==GeomDetEnumerators::ME0) me0Chambers++;
157  else
158  LogError("Muon|RecoMuon|StandAloneMuonFilter")
159  << "Unrecognized module type in incrementChamberCounters";
160  // FIXME:
161  // << layer->module() << " " <<layer->Part() << endl;
162 
163  totalChambers++;
164 }
165 
167 
173  else
174  LogError("Muon|RecoMuon|StandAloneMuonFilter")
175  << "Unrecognized module type in incrementCompatibleChamberCounters";
176 
178 }
179 
180 
181 vector<const DetLayer*> StandAloneMuonFilter::compatibleLayers(const DetLayer *initialLayer,
182  const FreeTrajectoryState& fts,
183  PropagationDirection propDir){
184  vector<const DetLayer*> detLayers;
185 
186  if(theNavigationType == "Standard"){
187  // ask for compatible layers
188  detLayers = theService->muonNavigationSchool()->compatibleLayers(*initialLayer,fts,propDir);
189  // I have to fit by hand the first layer until the seedTSOS is defined on the first rechit layer
190  // In fact the first layer is not returned by initialLayer->compatibleLayers.
191  detLayers.insert(detLayers.begin(),initialLayer);
192  }
193  else if (theNavigationType == "Direct"){
194  DirectMuonNavigation navigation(theService->detLayerGeometry());
195  detLayers = navigation.compatibleLayers(fts,propDir);
196  }
197  else
198  edm::LogError("Muon|RecoMuon|StandAloneMuonFilter") << "No Properly Navigation Selected!!"<<endl;
199 
200  return detLayers;
201 }
202 
203 
205  const DetLayer* initialLayer, Trajectory &trajectory){
206 
207  const std::string metname = "Muon|RecoMuon|StandAloneMuonFilter";
208 
209  // reset the refitter each seed refinement
210  reset();
211 
213 
214  LogTrace(metname) << "Starting the refit"<<endl;
215 
216  // this is the most outward TSOS (updated or predicted) onto a DetLayer
218 
219  double eta0 = initialTSOS.freeTrajectoryState()->momentum().eta();
220  vector<const DetLayer*> detLayers = compatibleLayers(initialLayer,*initialTSOS.freeTrajectoryState(),
222 
223  LogTrace(metname)<<"compatible layers found: "<<detLayers.size()<<endl;
224 
225  vector<const DetLayer*>::const_iterator layer;
226 
227  // the layers are ordered in agreement with the fit/propagation direction
228  for ( layer = detLayers.begin(); layer!= detLayers.end(); ++layer ) {
229 
230  // bool firstTime = true;
231 
232  LogTrace(metname) << debug.dumpLayer(*layer);
233 
234  LogTrace(metname) << "search Trajectory Measurement from: " << lastTSOS.globalPosition();
235 
236  // pick the best measurement from each group
237  std::vector<TrajectoryMeasurement> bestMeasurements = findBestMeasurements(*layer, lastTSOS);
238 
239  // RB: Different ways can be choosen if no bestMeasurement is available:
240  // 1- check on lastTSOS-initialTSOS eta difference
241  // 2- check on lastTSOS-lastButOneUpdatedTSOS eta difference
242  // After this choice:
243  // A- extract the measurements compatible with the initialTSOS (seed)
244  // B- extract the measurements compatible with the lastButOneUpdatedTSOS
245  // In ORCA the choice was 1A. Here I will try 1B and if it fail I'll try 1A
246  // another possibility could be 2B and then 1A.
247 
248  // if no measurement found and the current TSOS has an eta very different
249  // wrt the initial one (i.e. seed), then try to find the measurements
250  // according to the lastButOne FTS. (1B)
251  double lastdEta = fabs(lastTSOS.freeTrajectoryState()->momentum().eta() - eta0);
252  if( bestMeasurements.empty() && lastdEta > 0.1) {
253  LogTrace(metname) << "No measurement and big eta variation wrt seed" << endl
254  << "trying with lastButOneUpdatedTSOS";
255  bestMeasurements = findBestMeasurements(*layer, theLastButOneUpdatedTSOS);
256  }
257 
258  //if no measurement found and the current FTS has an eta very different
259  //wrt the initial one (i.e. seed), then try to find the measurements
260  //according to the initial FTS. (1A)
261  if( bestMeasurements.empty() && lastdEta > 0.1) {
262  LogTrace(metname) << "No measurement and big eta variation wrt seed" << endl
263  << "tryng with seed TSOS";
264  bestMeasurements = findBestMeasurements(*layer, initialTSOS);
265  }
266 
267  // FIXME: uncomment this line!!
268  // if(!bestMeasurement && firstTime) break;
269 
270  if(!bestMeasurements.empty()) {
272  bool added = false;
273  for(std::vector<TrajectoryMeasurement>::const_iterator tmItr = bestMeasurements.begin();
274  tmItr != bestMeasurements.end(); ++tmItr){
275  added |= update(*layer, &(*tmItr), trajectory);
276  lastTSOS = theLastUpdatedTSOS;
277  }
278  if(added) {
279  incrementChamberCounters(*layer);
280  theDetLayers.push_back(*layer);
281  }
282  }
283  // SL in case no valid mesurement is found, still I want to use the predicted
284  // state for the following measurement serches. I take the first in the
285  // container. FIXME!!! I want to carefully check this!!!!!
286  else{
287  LogTrace(metname)<<"No best measurement found"<<endl;
288  // if (!theMeasurementCache.empty()){
289  // LogTrace(metname)<<"but the #of measurement is "<<theMeasurementCache.size()<<endl;
290  // lastTSOS = theMeasurementCache.front().predictedState();
291  // }
292  }
293  } // loop over layers
294 }
295 
296 
297 std::vector<TrajectoryMeasurement>
299  const TrajectoryStateOnSurface& tsos){
300 
301  const std::string metname = "Muon|RecoMuon|StandAloneMuonFilter";
302 
303  std::vector<TrajectoryMeasurement> result;
304  std::vector<TrajectoryMeasurement> measurements;
305 
306  if(theOverlappingChambersFlag && layer->hasGroups()){
307 
308  std::vector<TrajectoryMeasurementGroup> measurementGroups =
310 
311  if(theFitDirection == outsideIn){
312  LogTrace(metname) << "Reversing the order of groupedMeasurements as the direction of the fit is outside-in";
313  reverse(measurementGroups.begin(),measurementGroups.end());
314  // this should be fixed either in RecoMuon/MeasurementDet/MuonDetLayerMeasurements or
315  // RecoMuon/DetLayers/MuRingForwardDoubleLayer
316  }
317 
318 
319  for(std::vector<TrajectoryMeasurementGroup>::const_iterator tmGroupItr = measurementGroups.begin();
320  tmGroupItr != measurementGroups.end(); ++tmGroupItr){
321 
322  measurements = tmGroupItr->measurements();
323  LogTrace(metname) << "Number of Trajectory Measurement: " << measurements.size();
324 
325  const TrajectoryMeasurement* bestMeasurement
327 
328  if(bestMeasurement) result.push_back(*bestMeasurement);
329  }
330  }
331  else{
332  measurements = theMeasurementExtractor->measurements(layer, tsos, *propagator(), *estimator());
333  LogTrace(metname) << "Number of Trajectory Measurement: " << measurements.size();
334  const TrajectoryMeasurement* bestMeasurement
335  = bestMeasurementFinder()->findBestMeasurement(measurements,
336  propagator());
337  if(bestMeasurement) result.push_back(*bestMeasurement);
338  }
339  return result;
340 }
341 
342 
343 
344 
346  const TrajectoryMeasurement * meas,
347  Trajectory & trajectory)
348 {
349  const std::string metname = "Muon|RecoMuon|StandAloneMuonFilter";
351 
352  LogTrace(metname)<<"best measurement found" << "\n"
353  <<"updating the trajectory..."<<endl;
354  pair<bool,TrajectoryStateOnSurface> result = updator()->update(meas,
355  trajectory,
356  propagator());
357  LogTrace(metname)<<"trajectory updated: "<<result.first<<endl;
358  LogTrace(metname) << debug.dumpTSOS(result.second);
359 
360  if(result.first){
362  theLastUpdatedTSOS = result.second;
363  }
364 
365  if(result.second.isValid())
366  theLastCompatibleTSOS = result.second;
367 
368  return result.first;
369 }
370 
371 
373 
374  Trajectory::DataContainer const & oldMeas = oldTraj.measurements();
375  defTraj.reserve(oldMeas.size());
376 
377  for (Trajectory::DataContainer::const_iterator itm = oldMeas.begin(); itm != oldMeas.end(); itm++) {
378  if( !(*itm).recHit()->isValid() )
379  defTraj.push( *itm, (*itm).estimate() );
380  else {
381  MuonTransientTrackingRecHit::MuonRecHitPointer invRhPtr = MuonTransientTrackingRecHit::specificBuild( (*itm).recHit()->det(), (*itm).recHit()->hit() );
382  invRhPtr->invalidateHit();
383  TrajectoryMeasurement invRhMeas( (*itm).forwardPredictedState(), (*itm).updatedState(), invRhPtr, (*itm).estimate(), (*itm).layer() );
384  defTraj.push( std::move(invRhMeas), (*itm).estimate() );
385  }
386 
387  } // end for
388 }
T getParameter(std::string const &) const
MeasurementEstimator * estimator() const
access at the estimator
NavigationDirection fitDirection() const
Return the fit direction.
double theMaxChi2
The max allowed chi2 to accept a rechit in the fit.
MuonTrajectoryUpdator * theMuonUpdator
the muon updator (it doesn&#39;t inhert from an updator, but it has one!)
void createDefaultTrajectory(const Trajectory &, Trajectory &)
std::string dumpLayer(const DetLayer *layer) const
const std::string metname
void incrementCompatibleChamberCounters(const DetLayer *layer)
void makeFirstTime()
reset the theFirstTSOSFlag
virtual SubDetector subDetector() const =0
The type of detector (PixelBarrel, PixelEndcap, TIB, TOB, TID, TEC, CSC, DT, RPCBarrel, RPCEndcap)
GlobalPoint globalPosition() const
PropagationDirection
TrajectoryStateOnSurface theLastCompatibleTSOS
the trajectory state on the last compatible surface
void reserve(unsigned int n)
Definition: Trajectory.h:150
bool theRPCLoneliness
True if there are only the RPC measurements.
void refit(const TrajectoryStateOnSurface &initialState, const DetLayer *, Trajectory &trajectory)
Perform the inner-outward fitting.
std::vector< TrajectoryMeasurementGroup > groupedMeasurements(const DetLayer *layer, const TrajectoryStateOnSurface &startingState, const Propagator &prop, const MeasurementEstimator &est, const edm::Event &iEvent)
std::string thePropagatorName
the propagator name
std::vector< const DetLayer * > compatibleLayers(const FreeTrajectoryState &fts, PropagationDirection timeDirection) const
DataContainer const & measurements() const
Definition: Trajectory.h:196
std::string dumpTSOS(const TrajectoryStateOnSurface &tsos) const
MuonDetLayerMeasurements * theMeasurementExtractor
The Measurement extractor.
std::vector< TrajectoryMeasurement > DataContainer
Definition: Trajectory.h:44
std::shared_ptr< MuonTransientTrackingRecHit > MuonRecHitPointer
void incrementChamberCounters(const DetLayer *layer)
Increment the DT,CSC,RPC counters.
FreeTrajectoryState const * freeTrajectoryState(bool withErrors=true) const
virtual void setEvent(const edm::Event &event)
Pass the Event to the algo at each event.
MeasurementContainer measurements(const DetLayer *layer, const GeomDet *det, const TrajectoryStateOnSurface &stateOnDet, const MeasurementEstimator &est, const edm::Event &iEvent)
GlobalVector momentum() const
#define LogTrace(id)
const Propagator * propagator() const
access at the propagator
StandAloneMuonFilter(const edm::ParameterSet &par, const MuonServiceProxy *service, edm::ConsumesCollector &iC)
Constructor.
PropagationDirection propagationDirection() const
Return the propagation direction.
#define debug
Definition: HDRShower.cc:19
MuonTrajectoryUpdator * updator() const
access at the muon updator
bool update(const DetLayer *layer, const TrajectoryMeasurement *meas, Trajectory &trajectory)
std::vector< const DetLayer * > theDetLayers
the det layer used in the reconstruction
NavigationDirection theFitDirection
the propagation direction
std::vector< const DetLayer * > compatibleLayers(const DetLayer *initialLayer, const FreeTrajectoryState &fts, PropagationDirection propDir)
Set the rigth Navigation.
MeasurementEstimator * theEstimator
The Estimator.
TrajectoryStateOnSurface theLastButOneUpdatedTSOS
the trajectory state on the last but one available surface
T eta() const
Definition: PV3DBase.h:76
void setEvent(const edm::Event &)
set event
HLT enums.
TrajectoryStateOnSurface theLastUpdatedTSOS
the trajectory state on the last available surface
TrajectoryMeasurement * findBestMeasurement(std::vector< TrajectoryMeasurement > &measC, const Propagator *propagator)
return the Tm with the best chi2: no cut applied.
MuonBestMeasurementFinder * bestMeasurementFinder() const
Access to the best measurement finder.
virtual ~StandAloneMuonFilter()
Destructor.
virtual std::pair< bool, TrajectoryStateOnSurface > update(const TrajectoryMeasurement *measurement, Trajectory &trajectory, const Propagator *propagator)
update the Trajectory with the TrajectoryMeasurement
std::vector< TrajectoryMeasurement > findBestMeasurements(const DetLayer *layer, const TrajectoryStateOnSurface &tsos)
static MuonRecHitPointer specificBuild(const GeomDet *geom, const TrackingRecHit *rh)
void push(const TrajectoryMeasurement &tm)
Definition: Trajectory.cc:50
def move(src, dest)
Definition: eostools.py:511
Definition: event.py:1
MuonBestMeasurementFinder * theBestMeasurementFinder
The best measurement finder: search for the best measurement among the TMs available.
const MuonServiceProxy * theService