00001
00017 #include "RecoMuon/GlobalTrackingTools/interface/DynamicTruncation.h"
00018 #include "DataFormats/MuonDetId/interface/RPCDetId.h"
00019 #include "TrackingTools/TrackFitters/interface/RecHitLessByDet.h"
00020 #include "RecoMuon/GlobalTrackingTools/interface/ChamberSegmentUtility.h"
00021 #include "TrackingTools/Records/interface/TransientRecHitRecord.h"
00022 #include "RecoMuon/DetLayers/interface/MuonDetLayerGeometry.h"
00023 #include "RecoMuon/Records/interface/MuonRecoGeometryRecord.h"
00024 #include "RecoMuon/Navigation/interface/MuonNavigationSchool.h"
00025 #include "TrackingTools/DetLayers/interface/NavigationSetter.h"
00026 #include "RecoMuon/Navigation/interface/MuonNavigationPrinter.h"
00027 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateTransform.h"
00028 #include "RecoTracker/Record/interface/NavigationSchoolRecord.h"
00029 #include "RecoMuon/GlobalTrackingTools/interface/MuonTkNavigationSchool.h"
00030 #include "RecoMuon/TrackingTools/interface/MuonPatternRecoDumper.h"
00031 #include "TrackingTools/KalmanUpdators/interface/Chi2MeasurementEstimator.h"
00032 #include "TrackPropagation/SteppingHelixPropagator/interface/SteppingHelixPropagator.h"
00033 #include "DataFormats/TrackingRecHit/interface/AlignmentPositionError.h"
00034 #include "DataFormats/GeometryCommonDetAlgo/interface/ErrorFrameTransformer.h"
00035
00036 #include "CondFormats/Alignment/interface/Alignments.h"
00037 #include "CondFormats/Alignment/interface/AlignTransform.h"
00038 #include "CondFormats/AlignmentRecord/interface/DTAlignmentRcd.h"
00039 #include "CondFormats/AlignmentRecord/interface/CSCAlignmentRcd.h"
00040 #include "CondFormats/Alignment/interface/AlignmentErrors.h"
00041 #include "CondFormats/Alignment/interface/AlignTransformError.h"
00042 #include "CondFormats/AlignmentRecord/interface/DTAlignmentErrorRcd.h"
00043 #include "CondFormats/AlignmentRecord/interface/CSCAlignmentErrorRcd.h"
00044
00045
00046 #define MAX_THR 1e7
00047
00048 using namespace edm;
00049 using namespace std;
00050 using namespace reco;
00051
00052 DynamicTruncation::DynamicTruncation(const edm::Event& event, const MuonServiceProxy& theService):
00053 DTThr(0), CSCThr(0)
00054 {
00055 theEvent = &event;
00056 theSetup = &theService.eventSetup();
00057 propagator = theService.propagator("SmartPropagator");
00058 propagatorCompatibleDet = theService.propagator("SteppingHelixPropagatorAny");
00059 theG = theService.trackingGeometry();
00060 theService.eventSetup().get<TransientRecHitRecord>().get("MuonRecHitBuilder",theMuonRecHitBuilder);
00061 theService.eventSetup().get<TrackingComponentsRecord>().get("KFUpdator",updatorHandle);
00062 theService.eventSetup().get<MuonGeometryRecord>().get(cscGeom);
00063 theService.eventSetup().get<MuonRecoGeometryRecord>().get(navMuon);
00064 theService.eventSetup().get<IdealMagneticFieldRecord>().get(magfield);
00065 navigation = new DirectMuonNavigation(theService.detLayerGeometry());
00066 }
00067
00068
00069
00070 DynamicTruncation::~DynamicTruncation() {
00071 if (navigation) delete navigation;
00072 }
00073
00074
00075
00076 TransientTrackingRecHit::ConstRecHitContainer DynamicTruncation::filter(const Trajectory& traj) {
00077 result.clear();
00078
00079
00080
00081 edm::ESHandle<AlignmentErrors> dtAlignmentErrors;
00082 theSetup->get<DTAlignmentErrorRcd>().get( dtAlignmentErrors );
00083 for ( std::vector<AlignTransformError>::const_iterator it = dtAlignmentErrors->m_alignError.begin();
00084 it != dtAlignmentErrors->m_alignError.end(); it++ ) {
00085 CLHEP::HepSymMatrix error = (*it).matrix();
00086 GlobalError glbErr(error[0][0], error[1][0], error[1][1], error[2][0], error[2][1], error[2][2]);
00087 DTChamberId DTid((*it).rawId());
00088 dtApeMap.insert( pair<DTChamberId, GlobalError> (DTid, glbErr) );
00089 }
00090
00091
00092
00093 edm::ESHandle<AlignmentErrors> cscAlignmentErrors;
00094 theSetup->get<CSCAlignmentErrorRcd>().get( cscAlignmentErrors );
00095 for ( std::vector<AlignTransformError>::const_iterator it = cscAlignmentErrors->m_alignError.begin();
00096 it != cscAlignmentErrors->m_alignError.end(); it++ ) {
00097 CLHEP::HepSymMatrix error = (*it).matrix();
00098 GlobalError glbErr(error[0][0], error[1][0], error[1][1], error[2][0], error[2][1], error[2][2]);
00099 CSCDetId CSCid((*it).rawId());
00100 cscApeMap.insert( pair<CSCDetId, GlobalError> (CSCid, glbErr) );
00101 }
00102
00103
00104 std::vector<TrajectoryMeasurement> muonMeasurements = traj.measurements();
00105 TrajectoryMeasurement lastTKm = muonMeasurements.front();
00106 for (std::vector<TrajectoryMeasurement>::const_iterator imT = muonMeasurements.begin(); imT != muonMeasurements.end(); imT++ ) {
00107 if ( !(*imT).recHit()->isValid() ) continue;
00108 const TransientTrackingRecHit* hit = &(*(*imT).recHit());
00109 if (hit->geographicalId().det() == DetId::Tracker) {
00110 result.push_back((*imT).recHit());
00111 if (!(*imT).forwardPredictedState().isValid()) continue;
00112 if ((*imT).forwardPredictedState().globalPosition().mag()
00113 > lastTKm.forwardPredictedState().globalPosition().mag()) lastTKm = *imT;
00114 }
00115 }
00116
00117
00118 currentState = lastTKm.forwardPredictedState();
00119
00120
00121 update(currentState, lastTKm.recHit());
00122
00123
00124 map<int, std::vector<DetId> > detMap;
00125 compatibleDets(currentState, detMap);
00126
00127
00128 filteringAlgo(detMap);
00129
00130 return result;
00131 }
00132
00133
00134
00135 void DynamicTruncation::setThr(int bThr, int eThr) {
00136 if (bThr <= MAX_THR && bThr >= 0) DTThr = bThr;
00137 else DTThr = MAX_THR;
00138 if (eThr <= MAX_THR && eThr >= 0) CSCThr = eThr;
00139 else CSCThr = MAX_THR;
00140 }
00141
00142
00143
00144 double DynamicTruncation::getBest(std::vector<CSCSegment>& segs, TrajectoryStateOnSurface& tsos, CSCSegment& bestCSCSeg) {
00145 unsigned int i = 0;
00146 double val = MAX_THR;
00147 std::vector<CSCSegment>::size_type sz = segs.size();
00148 for (i=0; i<sz; i++) {
00149 LocalError apeLoc;
00150 apeLoc = ErrorFrameTransformer().transform(cscApeMap.find(segs[i].cscDetId())->second, theG->idToDet(segs[i].cscDetId())->surface());
00151 StateSegmentMatcher estim(&tsos, &segs[i], &apeLoc);
00152 double tmp = estim.value();
00153 if (tmp < val) {
00154 bestCSCSeg = segs[i];
00155 val = tmp;
00156 }
00157 }
00158 return val;
00159 }
00160
00161
00162
00163 double DynamicTruncation::getBest(std::vector<DTRecSegment4D>& segs, TrajectoryStateOnSurface& tsos, DTRecSegment4D& bestDTSeg) {
00164 unsigned int i = 0;
00165 double val = MAX_THR;
00166 std::vector<DTRecSegment4D>::size_type sz = segs.size();
00167 for (i=0; i<sz; i++) {
00168 LocalError apeLoc;
00169 apeLoc = ErrorFrameTransformer().transform(dtApeMap.find(segs[i].chamberId())->second, theG->idToDet(segs[i].chamberId())->surface());
00170 StateSegmentMatcher estim(&tsos, &segs[i], &apeLoc);
00171 double tmp = estim.value();
00172 if (tmp < val) {
00173 bestDTSeg = segs[i];
00174 val = tmp;
00175 }
00176 }
00177 return val;
00178 }
00179
00180
00181
00182 void DynamicTruncation::compatibleDets(TrajectoryStateOnSurface& tsos, map<int, std::vector<DetId> >& detMap) {
00183
00184
00185 MeasurementEstimator *theEstimator = new Chi2MeasurementEstimator(100, 3);
00186 std::vector<const DetLayer *> navLayers;
00187 navLayers = navigation->compatibleLayers(*(currentState.freeState()), alongMomentum);
00188 for ( unsigned int ilayer=0; ilayer<navLayers.size(); ilayer++ ) {
00189
00190 if (navLayers[ilayer]->subDetector() == GeomDetEnumerators::RPCEndcap
00191 || navLayers[ilayer]->subDetector() == GeomDetEnumerators::RPCBarrel) continue;
00192 std::vector<DetLayer::DetWithState> comps = navLayers[ilayer]->compatibleDets(currentState,
00193 *propagatorCompatibleDet, *theEstimator);
00194
00195
00196 if (comps.size() > 0) {
00197 for ( unsigned int icomp=0; icomp<comps.size(); icomp++ ) {
00198 DetId id(comps[icomp].first->geographicalId().rawId());
00199 detMap[ilayer].push_back(id);
00200 }
00201 }
00202 }
00203 if (theEstimator) delete theEstimator;
00204 }
00205
00206
00207
00208 void DynamicTruncation::filteringAlgo(map<int, std::vector<DetId> >& detMap) {
00209 ChamberSegmentUtility getSegs(*theEvent, *theSetup);
00210 for (unsigned int iDet = 0; iDet < detMap.size(); ++iDet) {
00211 double bestLayerValue = MAX_THR;
00212 bool isDTorCSC = false;
00213 ConstRecHitContainer layerRH;
00214 std::vector<DetId> chamber = detMap[iDet];
00215 for (unsigned int j = 0; j < chamber.size(); ++j) {
00216 DetId id = chamber[j];
00217
00218 if (id.det() == DetId::Muon && id.subdetId() == MuonSubdetId::DT) {
00219 isDTorCSC = true;
00220
00221 DTChamberId DTid(id);
00222
00223 std::vector<DTRecSegment4D> allDTsegs;
00224 std::map<int, std::vector<DTRecSegment4D> >::const_iterator dtIter = getSegs.getDTlist().find(DTid.station());
00225 if (dtIter != getSegs.getDTlist().end()){
00226 allDTsegs = dtIter->second;
00227 }
00228 std::vector<DTRecSegment4D>::size_type sz = allDTsegs.size();
00229 for (unsigned int iSeg=0; iSeg<sz; ++iSeg) {
00230
00231
00232 TrajectoryStateOnSurface tsosdt = propagator->propagate(currentState,
00233 theG->idToDet(allDTsegs[iSeg].chamberId())->surface());
00234 if (!tsosdt.isValid()) continue;
00235
00236 std::vector<DTRecSegment4D> DTsegs;
00237 DTsegs.push_back(allDTsegs[iSeg]);
00238
00239 DTRecSegment4D bestDTSeg;
00240 double bestChamberValue = getBest(DTsegs, tsosdt, bestDTSeg);
00241 if (bestChamberValue < bestLayerValue) bestLayerValue = bestChamberValue;
00242
00243
00244 if (bestChamberValue >= DTThr || bestChamberValue > bestLayerValue) continue;
00245 layerRH.clear();
00246 std::vector<DTRecHit1D> DTrh = getSegs.getDTRHmap(bestDTSeg);
00247 for (std::vector<DTRecHit1D>::iterator it = DTrh.begin(); it != DTrh.end(); it++) {
00248 layerRH.push_back(theMuonRecHitBuilder->build(&*it));
00249 }
00250 }
00251 }
00252 if (id.det() == DetId::Muon && id.subdetId() == MuonSubdetId::CSC) {
00253 isDTorCSC = true;
00254 CSCDetId CSCid(id);
00255
00256 std::vector<CSCSegment> allCSCsegs;
00257 std::map<int, std::vector<CSCSegment> >::const_iterator cscIter = getSegs.getCSClist().find(CSCid.station());
00258 if (cscIter != getSegs.getCSClist().end()){
00259 allCSCsegs = cscIter->second;
00260 }
00261
00262 std::vector<CSCSegment>::size_type sz = allCSCsegs.size();
00263 for (unsigned int iSeg=0; iSeg<sz; ++iSeg) {
00264
00265
00266 TrajectoryStateOnSurface tsoscsc = propagator->propagate(currentState,
00267 theG->idToDet(allCSCsegs[iSeg].cscDetId())->surface());
00268 if (!tsoscsc.isValid()) continue;
00269
00270 std::vector<CSCSegment> CSCsegs;
00271 CSCsegs.push_back(allCSCsegs[iSeg]);
00272
00273 CSCSegment bestCSCSeg;
00274 double bestChamberValue = getBest(CSCsegs, tsoscsc, bestCSCSeg);
00275 if (bestChamberValue < bestLayerValue) bestLayerValue = bestChamberValue;
00276
00277
00278 if (bestChamberValue >= CSCThr || bestChamberValue > bestLayerValue) continue;
00279 layerRH.clear();
00280 std::vector<CSCRecHit2D> CSCrh = getSegs.getCSCRHmap(bestCSCSeg);
00281 for (std::vector<CSCRecHit2D>::iterator it = CSCrh.begin(); it != CSCrh.end(); ++it) {
00282 layerRH.push_back(theMuonRecHitBuilder->build(&*it));
00283 }
00284 }
00285 }
00286 }
00287
00288 if (isDTorCSC) {
00289 if (bestLayerValue < MAX_THR) estimators.push_back(bestLayerValue);
00290 else estimators.push_back(-1);
00291 }
00292
00293 if (layerRH.size() > 0) {
00294 for (ConstRecHitContainer::iterator it = layerRH.begin(); it != layerRH.end(); ++it) {
00295 result.push_back((*it));
00296 }
00297
00298
00299 layerRH = sort(layerRH);
00300
00301
00302 DetId id = layerRH.front()->geographicalId();
00303 if (id.subdetId() == MuonSubdetId::DT) updateWithDThits(layerRH);
00304 else updateWithCSChits(layerRH);
00305 }
00306 layerRH.clear();
00307 }
00308 }
00309
00310
00311
00312 void DynamicTruncation::update(TrajectoryStateOnSurface& tsos, ConstRecHitPointer rechit) {
00313 TrajectoryStateOnSurface temp = updatorHandle->update(tsos, *rechit);
00314 if (temp.isValid()) currentState = updatorHandle->update(tsos, *rechit);
00315 }
00316
00317
00318
00319 void DynamicTruncation::updateWithDThits(ConstRecHitContainer& recHits) {
00320 for (ConstRecHitContainer::const_iterator it = recHits.begin(); it != recHits.end(); ++it) {
00321 DTLayerId layid((*it)->det()->geographicalId());
00322 TrajectoryStateOnSurface temp = propagator->propagate(currentState, theG->idToDet(layid)->surface());
00323 if (temp.isValid()) currentState = updatorHandle->update(temp, **it);
00324 }
00325 }
00326
00327
00328
00329 void DynamicTruncation::updateWithCSChits(ConstRecHitContainer& recHits) {
00330 for (ConstRecHitContainer::const_iterator it = recHits.begin(); it != recHits.end(); ++it) {
00331 const CSCLayer* cscChamber = cscGeom->layer((*it)->det()->geographicalId());
00332 CSCDetId layid = cscChamber->geographicalId();
00333 TrajectoryStateOnSurface temp = propagator->propagate(currentState, theG->idToDet(layid)->surface());
00334 if (temp.isValid()) currentState = updatorHandle->update(temp, **it);
00335 }
00336 }
00337
00338
00339
00340 TransientTrackingRecHit::ConstRecHitContainer DynamicTruncation::sort(ConstRecHitContainer& recHits) {
00341 unsigned int i=0;
00342 unsigned int j=0;
00343 ConstRecHitContainer::size_type n = recHits.size();
00344 for(i=1; i<n; ++i)
00345 for(j=n-1; j>=i; --j)
00346 {
00347 if(recHits[j-1]->globalPosition().mag() > recHits[j]->globalPosition().mag())
00348 {
00349 swap (recHits[j-1],recHits[j]);
00350 }
00351 }
00352 return recHits;
00353 }
00354