Go to the documentation of this file.00001 #include "TrackingTools/TrackRefitter/interface/TrackTransformerForGlobalCosmicMuons.h"
00002
00003 #include "FWCore/Framework/interface/EventSetup.h"
00004 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00005 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00006
00007 #include "Geometry/Records/interface/GlobalTrackingGeometryRecord.h"
00008 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
00009
00010 #include "TrackingTools/Records/interface/TrackingComponentsRecord.h"
00011 #include "TrackingTools/TrackFitters/interface/TrajectoryFitter.h"
00012 #include "TrackingTools/PatternTools/interface/TrajectorySmoother.h"
00013
00014 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateOnSurface.h"
00015 #include "TrackingTools/TransientTrack/interface/TransientTrack.h"
00016 #include "TrackingTools/TransientTrackingRecHit/interface/TransientTrackingRecHitBuilder.h"
00017 #include "TrackingTools/Records/interface/TransientRecHitRecord.h"
00018 #include "TrackingTools/PatternTools/interface/Trajectory.h"
00019 #include "TrackingTools/GeomPropagators/interface/Propagator.h"
00020
00021 #include "DataFormats/TrackReco/interface/Track.h"
00022 #include "DataFormats/TrackReco/interface/TrackFwd.h"
00023 #include "DataFormats/DetId/interface/DetId.h"
00024
00025 #include "DataFormats/MuonDetId/interface/CSCDetId.h"
00026 #include "DataFormats/MuonDetId/interface/DTWireId.h"
00027 #include "DataFormats/MuonDetId/interface/RPCDetId.h"
00028 #include "DataFormats/MuonDetId/interface/MuonSubdetId.h"
00029
00030 #include "DataFormats/TrackerCommon/interface/TrackerTopology.h"
00031 #include "Geometry/Records/interface/IdealGeometryRecord.h"
00032
00033 using namespace std;
00034 using namespace edm;
00035
00037 TrackTransformerForGlobalCosmicMuons::TrackTransformerForGlobalCosmicMuons(const ParameterSet& parameterSet){
00038
00039 theTrackerRecHitBuilderName = parameterSet.getParameter<string>("TrackerRecHitBuilder");
00040 theMuonRecHitBuilderName = parameterSet.getParameter<string>("MuonRecHitBuilder");
00041
00042 theRPCInTheFit = parameterSet.getParameter<bool>("RefitRPCHits");
00043
00044 theCacheId_TC = theCacheId_GTG = theCacheId_MG = theCacheId_TRH = 0;
00045 theSkipStationDT = parameterSet.getParameter<int>("SkipStationDT");
00046 theSkipStationCSC = parameterSet.getParameter<int>("SkipStationCSC");
00047 theSkipWheelDT = parameterSet.getParameter<int>("SkipWheelDT");
00048 theTrackerSkipSystem = parameterSet.getParameter<int>("TrackerSkipSystem");
00049 theTrackerSkipSection = parameterSet.getParameter<int>("TrackerSkipSection");
00050 }
00051
00053 TrackTransformerForGlobalCosmicMuons::~TrackTransformerForGlobalCosmicMuons(){}
00054
00055
00056 void TrackTransformerForGlobalCosmicMuons::setServices(const EventSetup& setup){
00057
00058 const std::string metname = "Reco|TrackingTools|TrackTransformer";
00059
00060 setup.get<TrajectoryFitter::Record>().get("KFFitterForRefitInsideOut",theFitterIO);
00061 setup.get<TrajectoryFitter::Record>().get("KFSmootherForRefitInsideOut",theSmootherIO);
00062 setup.get<TrajectoryFitter::Record>().get("KFFitterForRefitOutsideIn",theFitterOI);
00063 setup.get<TrajectoryFitter::Record>().get("KFSmootherForRefitOutsideIn",theSmootherOI);
00064
00065 unsigned long long newCacheId_TC = setup.get<TrackingComponentsRecord>().cacheIdentifier();
00066
00067 if ( newCacheId_TC != theCacheId_TC ){
00068 LogTrace(metname) << "Tracking Component changed!";
00069 theCacheId_TC = newCacheId_TC;
00070 setup.get<TrackingComponentsRecord>().get("SmartPropagatorRK",thePropagatorIO);
00071 setup.get<TrackingComponentsRecord>().get("SmartPropagatorRKOpposite",thePropagatorOI);
00072
00073 }
00074
00075
00076 unsigned long long newCacheId_GTG = setup.get<GlobalTrackingGeometryRecord>().cacheIdentifier();
00077 if ( newCacheId_GTG != theCacheId_GTG ) {
00078 LogTrace(metname) << "GlobalTrackingGeometry changed!";
00079 theCacheId_GTG = newCacheId_GTG;
00080 setup.get<GlobalTrackingGeometryRecord>().get(theTrackingGeometry);
00081 }
00082
00083
00084 unsigned long long newCacheId_MG = setup.get<IdealMagneticFieldRecord>().cacheIdentifier();
00085 if ( newCacheId_MG != theCacheId_MG ) {
00086 LogTrace(metname) << "Magnetic Field changed!";
00087 theCacheId_MG = newCacheId_MG;
00088 setup.get<IdealMagneticFieldRecord>().get(theMGField);
00089 }
00090
00091
00092 unsigned long long newCacheId_TRH = setup.get<TransientRecHitRecord>().cacheIdentifier();
00093 if ( newCacheId_TRH != theCacheId_TRH ) {
00094 theCacheId_TRH = newCacheId_TRH;
00095 LogTrace(metname) << "TransientRecHitRecord changed!";
00096 setup.get<TransientRecHitRecord>().get(theTrackerRecHitBuilderName,theTrackerRecHitBuilder);
00097 setup.get<TransientRecHitRecord>().get(theMuonRecHitBuilderName,theMuonRecHitBuilder);
00098 }
00099
00100
00101 edm::ESHandle<TrackerTopology> tTopoHand;
00102 setup.get<IdealGeometryRecord>().get(tTopoHand);
00103 tTopo_=tTopoHand.product();
00104 }
00105
00106
00107 TransientTrackingRecHit::ConstRecHitContainer
00108 TrackTransformerForGlobalCosmicMuons::getTransientRecHits(const reco::TransientTrack& track) const {
00109
00110 TransientTrackingRecHit::ConstRecHitContainer tkHits;
00111 TransientTrackingRecHit::ConstRecHitContainer staHits;
00112
00113 for (trackingRecHit_iterator hit = track.recHitsBegin(); hit != track.recHitsEnd(); ++hit) {
00114 if((*hit)->isValid()) {
00115 if ( (*hit)->geographicalId().det() == DetId::Tracker && TrackerKeep((*hit)->geographicalId())) {
00116 tkHits.push_back(theTrackerRecHitBuilder->build(&**hit));
00117 } else if ( (*hit)->geographicalId().det() == DetId::Muon && MuonKeep((*hit)->geographicalId())){
00118 if( (*hit)->geographicalId().subdetId() == 3 && !theRPCInTheFit){
00119 LogTrace("Reco|TrackingTools|TrackTransformer") << "RPC Rec Hit discarged";
00120 continue;
00121 }
00122 staHits.push_back(theMuonRecHitBuilder->build(&**hit));
00123 }
00124 }
00125 }
00126
00127 if(staHits.empty()) return staHits;
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137 copy(staHits.begin(),staHits.end(),back_inserter(tkHits));
00138
00139 for(TransientTrackingRecHit::ConstRecHitContainer::const_iterator hit = tkHits.begin();
00140 hit !=tkHits.end(); ++hit){
00141
00142 DetId hitId = (*hit)->geographicalId();
00143 GlobalPoint glbpoint = trackingGeometry()->idToDet(hitId)->position();
00144
00145 if(hitId.det() == DetId::Tracker) {
00146 if (hitId.subdetId() == StripSubdetector::TIB )
00147 LogTrace("TrackFitters") << glbpoint << " I am TIB " << tTopo_->tibLayer(hitId);
00148 else if (hitId.subdetId() == StripSubdetector::TOB )
00149 LogTrace("TrackFitters") << glbpoint << " I am TOB " << tTopo_->tobLayer(hitId);
00150 else if (hitId.subdetId() == StripSubdetector::TEC )
00151 LogTrace("TrackFitters") << glbpoint << " I am TEC " << tTopo_->tecWheel(hitId);
00152 else if (hitId.subdetId() == StripSubdetector::TID )
00153 LogTrace("TrackFitters") << glbpoint << " I am TID " << tTopo_->tidWheel(hitId);
00154 else if (hitId.subdetId() == (int) PixelSubdetector::PixelBarrel )
00155 LogTrace("TrackFitters") << glbpoint << " I am PixBar " << tTopo_->pxbLayer(hitId);
00156 else if (hitId.subdetId() == (int) PixelSubdetector::PixelEndcap )
00157 LogTrace("TrackFitters") << glbpoint << " I am PixFwd " << tTopo_->pxfDisk(hitId);
00158 else
00159 LogTrace("TrackFitters") << " UNKNOWN TRACKER HIT TYPE ";
00160 } else if(hitId.det() == DetId::Muon) {
00161 if(hitId.subdetId() == MuonSubdetId::DT)
00162 LogTrace("TrackFitters") << glbpoint << " I am DT " << DTWireId(hitId);
00163 else if (hitId.subdetId() == MuonSubdetId::CSC )
00164 LogTrace("TrackFitters") << glbpoint << " I am CSC " << CSCDetId(hitId);
00165 else if (hitId.subdetId() == MuonSubdetId::RPC )
00166 LogTrace("TrackFitters") << glbpoint << " I am RPC " << RPCDetId(hitId);
00167 else
00168 LogTrace("TrackFitters") << " UNKNOWN MUON HIT TYPE ";
00169 } else
00170 LogTrace("TrackFitters") << " UNKNOWN HIT TYPE ";
00171 }
00172
00173 return tkHits;
00174 }
00175
00176
00178 ESHandle<TrajectoryFitter> TrackTransformerForGlobalCosmicMuons::fitter(bool up) const{
00179 if(up) return theFitterOI;
00180 else return theFitterIO;
00181 }
00182
00184 ESHandle<TrajectorySmoother> TrackTransformerForGlobalCosmicMuons::smoother(bool up) const{
00185 if(up) return theSmootherOI;
00186 else return theSmootherIO;
00187 }
00188
00189 ESHandle<Propagator> TrackTransformerForGlobalCosmicMuons::propagator(bool up) const{
00190 if(up) return thePropagatorIO;
00191 else return thePropagatorOI;
00192 }
00193
00194
00195
00197 vector<Trajectory> TrackTransformerForGlobalCosmicMuons::transform(const reco::Track& tr) const {
00198
00199 const std::string metname = "Reco|TrackingTools|TrackTransformer";
00200
00201 reco::TransientTrack track(tr,magneticField(),trackingGeometry());
00202
00203
00204 TransientTrackingRecHit::ConstRecHitContainer recHitsForReFit = getTransientRecHits(track);
00205
00206 if(recHitsForReFit.size() < 2) return vector<Trajectory>();
00207
00208 bool up = recHitsForReFit.back()->globalPosition().y()>0 ? true : false;
00209 LogTrace(metname) << "Up ? " << up;
00210
00211 PropagationDirection propagationDirection = up ? oppositeToMomentum : alongMomentum;
00212 TrajectoryStateOnSurface firstTSOS = up ? track.outermostMeasurementState() : track.innermostMeasurementState();
00213 unsigned int innerId = up ? track.track().outerDetId() : track.track().innerDetId();
00214
00215 LogTrace(metname) << "Prop Dir: " << propagationDirection << " FirstId " << innerId << " firstTSOS " << firstTSOS;
00216
00217 TrajectorySeed seed(PTrajectoryStateOnDet(),TrajectorySeed::recHitContainer(),propagationDirection);
00218
00219
00220 if(recHitsForReFit.front()->geographicalId() != DetId(innerId)){
00221 LogTrace(metname)<<"Propagation occurring"<<endl;
00222 firstTSOS = propagator(up)->propagate(firstTSOS, recHitsForReFit.front()->det()->surface());
00223 LogTrace(metname)<<"Final destination: " << recHitsForReFit.front()->det()->surface().position() << endl;
00224 if(!firstTSOS.isValid()){
00225 LogTrace(metname)<<"Propagation error!"<<endl;
00226 return vector<Trajectory>();
00227 }
00228 }
00229
00230
00231 vector<Trajectory> trajectories = fitter(up)->fit(seed,recHitsForReFit,firstTSOS);
00232
00233 if(trajectories.empty()){
00234 LogTrace(metname)<<"No Track refitted!"<<endl;
00235 return vector<Trajectory>();
00236 }
00237
00238 Trajectory trajectoryBW = trajectories.front();
00239
00240 vector<Trajectory> trajectoriesSM = smoother(up)->trajectories(trajectoryBW);
00241
00242 if(trajectoriesSM.empty()){
00243 LogTrace(metname)<<"No Track smoothed!"<<endl;
00244 return vector<Trajectory>();
00245 }
00246
00247 return trajectoriesSM;
00248
00249 }
00250
00251
00252
00253
00254 bool TrackTransformerForGlobalCosmicMuons::TrackerKeep(DetId id) const{
00255
00256 if (id.det() != DetId::Tracker ) return false;
00257 if (theTrackerSkipSystem < 0 ) return true;
00258 bool retVal = true;
00259
00260 int layer = -999;
00261
00262 if ( id.subdetId() == theTrackerSkipSystem)
00263 layer=tTopo_->layer(id);
00264
00265 if (theTrackerSkipSection > -998 && layer == theTrackerSkipSection) retVal = false;
00266
00267 return retVal;
00268 }
00269
00270
00271
00272 bool TrackTransformerForGlobalCosmicMuons::MuonKeep(DetId id) const {
00273
00274 if (id.det() != DetId::Muon) return false;
00275 if (theSkipStationDT < 0 && theSkipStationCSC < 0) return true;
00276
00277 int station = -999;
00278 int wheel = -999;
00279 bool isRPC = false;
00280 bool isDT = false;
00281 bool isCSC = false;
00282
00283 if ( id.subdetId() == MuonSubdetId::DT ) {
00284 DTChamberId did(id.rawId());
00285 station = did.station();
00286 wheel = did.wheel();
00287 isDT = true;
00288 } else if ( id.subdetId() == MuonSubdetId::CSC ) {
00289 CSCDetId did(id.rawId());
00290 station = did.station();
00291 isCSC = true;
00292 } else if ( id.subdetId() == MuonSubdetId::RPC ) {
00293 RPCDetId rpcid(id.rawId());
00294 station = rpcid.station();
00295 isRPC = true;
00296 }
00297
00298 if (isRPC && (station == theSkipStationCSC || station == theSkipStationDT)) return false;
00299 if (isDT && station == theSkipStationDT ) return false;
00300 if (isCSC && station == theSkipStationCSC ) return false;
00301
00302 if (isDT && theSkipWheelDT > -998 && wheel == theSkipWheelDT) return false;
00303
00304 return true;
00305 }