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
00026 #include "DataFormats/SiStripDetId/interface/TIBDetId.h"
00027 #include "DataFormats/SiStripDetId/interface/TOBDetId.h"
00028 #include "DataFormats/SiStripDetId/interface/TIDDetId.h"
00029 #include "DataFormats/SiStripDetId/interface/TECDetId.h"
00030 #include "DataFormats/SiPixelDetId/interface/PXBDetId.h"
00031 #include "DataFormats/SiPixelDetId/interface/PXFDetId.h"
00032 #include "DataFormats/MuonDetId/interface/CSCDetId.h"
00033 #include "DataFormats/MuonDetId/interface/DTWireId.h"
00034 #include "DataFormats/MuonDetId/interface/RPCDetId.h"
00035 #include "DataFormats/MuonDetId/interface/MuonSubdetId.h"
00036
00037
00038 using namespace std;
00039 using namespace edm;
00040
00042 TrackTransformerForGlobalCosmicMuons::TrackTransformerForGlobalCosmicMuons(const ParameterSet& parameterSet){
00043
00044 theTrackerRecHitBuilderName = parameterSet.getParameter<string>("TrackerRecHitBuilder");
00045 theMuonRecHitBuilderName = parameterSet.getParameter<string>("MuonRecHitBuilder");
00046
00047 theRPCInTheFit = parameterSet.getParameter<bool>("RefitRPCHits");
00048
00049 theCacheId_TC = theCacheId_GTG = theCacheId_MG = theCacheId_TRH = 0;
00050 theSkipStationDT = parameterSet.getParameter<int>("SkipStationDT");
00051 theSkipStationCSC = parameterSet.getParameter<int>("SkipStationCSC");
00052 theSkipWheelDT = parameterSet.getParameter<int>("SkipWheelDT");
00053 theTrackerSkipSystem = parameterSet.getParameter<int>("TrackerSkipSystem");
00054 theTrackerSkipSection = parameterSet.getParameter<int>("TrackerSkipSection");
00055 }
00056
00058 TrackTransformerForGlobalCosmicMuons::~TrackTransformerForGlobalCosmicMuons(){}
00059
00060
00061 void TrackTransformerForGlobalCosmicMuons::setServices(const EventSetup& setup){
00062
00063 const std::string metname = "Reco|TrackingTools|TrackTransformer";
00064
00065 setup.get<TrajectoryFitter::Record>().get("KFFitterForRefitInsideOut",theFitterIO);
00066 setup.get<TrajectoryFitter::Record>().get("KFSmootherForRefitInsideOut",theSmootherIO);
00067 setup.get<TrajectoryFitter::Record>().get("KFFitterForRefitOutsideIn",theFitterOI);
00068 setup.get<TrajectoryFitter::Record>().get("KFSmootherForRefitOutsideIn",theSmootherOI);
00069
00070 unsigned long long newCacheId_TC = setup.get<TrackingComponentsRecord>().cacheIdentifier();
00071
00072 if ( newCacheId_TC != theCacheId_TC ){
00073 LogTrace(metname) << "Tracking Component changed!";
00074 theCacheId_TC = newCacheId_TC;
00075 setup.get<TrackingComponentsRecord>().get("SmartPropagatorRK",thePropagatorIO);
00076 setup.get<TrackingComponentsRecord>().get("SmartPropagatorRKOpposite",thePropagatorOI);
00077
00078 }
00079
00080
00081 unsigned long long newCacheId_GTG = setup.get<GlobalTrackingGeometryRecord>().cacheIdentifier();
00082 if ( newCacheId_GTG != theCacheId_GTG ) {
00083 LogTrace(metname) << "GlobalTrackingGeometry changed!";
00084 theCacheId_GTG = newCacheId_GTG;
00085 setup.get<GlobalTrackingGeometryRecord>().get(theTrackingGeometry);
00086 }
00087
00088
00089 unsigned long long newCacheId_MG = setup.get<IdealMagneticFieldRecord>().cacheIdentifier();
00090 if ( newCacheId_MG != theCacheId_MG ) {
00091 LogTrace(metname) << "Magnetic Field changed!";
00092 theCacheId_MG = newCacheId_MG;
00093 setup.get<IdealMagneticFieldRecord>().get(theMGField);
00094 }
00095
00096
00097 unsigned long long newCacheId_TRH = setup.get<TransientRecHitRecord>().cacheIdentifier();
00098 if ( newCacheId_TRH != theCacheId_TRH ) {
00099 theCacheId_TRH = newCacheId_TRH;
00100 LogTrace(metname) << "TransientRecHitRecord changed!";
00101 setup.get<TransientRecHitRecord>().get(theTrackerRecHitBuilderName,theTrackerRecHitBuilder);
00102 setup.get<TransientRecHitRecord>().get(theMuonRecHitBuilderName,theMuonRecHitBuilder);
00103 }
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 " << TIBDetId(hitId).layer();
00148 else if (hitId.subdetId() == StripSubdetector::TOB )
00149 LogTrace("TrackFitters") << glbpoint << " I am TOB " << TOBDetId(hitId).layer();
00150 else if (hitId.subdetId() == StripSubdetector::TEC )
00151 LogTrace("TrackFitters") << glbpoint << " I am TEC " << TECDetId(hitId).wheel();
00152 else if (hitId.subdetId() == StripSubdetector::TID )
00153 LogTrace("TrackFitters") << glbpoint << " I am TID " << TIDDetId(hitId).wheel();
00154 else if (hitId.subdetId() == StripSubdetector::TID )
00155 LogTrace("TrackFitters") << glbpoint << " I am TID " << TIDDetId(hitId).wheel();
00156 else if (hitId.subdetId() == (int) PixelSubdetector::PixelBarrel )
00157 LogTrace("TrackFitters") << glbpoint << " I am PixBar " << PXBDetId(hitId).layer();
00158 else if (hitId.subdetId() == (int) PixelSubdetector::PixelEndcap )
00159 LogTrace("TrackFitters") << glbpoint << " I am PixFwd " << PXFDetId(hitId).disk();
00160 else
00161 LogTrace("TrackFitters") << " UNKNOWN TRACKER HIT TYPE ";
00162 } else if(hitId.det() == DetId::Muon) {
00163 if(hitId.subdetId() == MuonSubdetId::DT)
00164 LogTrace("TrackFitters") << glbpoint << " I am DT " << DTWireId(hitId);
00165 else if (hitId.subdetId() == MuonSubdetId::CSC )
00166 LogTrace("TrackFitters") << glbpoint << " I am CSC " << CSCDetId(hitId);
00167 else if (hitId.subdetId() == MuonSubdetId::RPC )
00168 LogTrace("TrackFitters") << glbpoint << " I am RPC " << RPCDetId(hitId);
00169 else
00170 LogTrace("TrackFitters") << " UNKNOWN MUON HIT TYPE ";
00171 } else
00172 LogTrace("TrackFitters") << " UNKNOWN HIT TYPE ";
00173 }
00174
00175 return tkHits;
00176 }
00177
00178
00180 ESHandle<TrajectoryFitter> TrackTransformerForGlobalCosmicMuons::fitter(bool up) const{
00181 if(up) return theFitterOI;
00182 else return theFitterIO;
00183 }
00184
00186 ESHandle<TrajectorySmoother> TrackTransformerForGlobalCosmicMuons::smoother(bool up) const{
00187 if(up) return theSmootherOI;
00188 else return theSmootherIO;
00189 }
00190
00191 ESHandle<Propagator> TrackTransformerForGlobalCosmicMuons::propagator(bool up) const{
00192 if(up) return thePropagatorIO;
00193 else return thePropagatorOI;
00194 }
00195
00196
00197
00199 vector<Trajectory> TrackTransformerForGlobalCosmicMuons::transform(const reco::Track& tr) const {
00200
00201 const std::string metname = "Reco|TrackingTools|TrackTransformer";
00202
00203 reco::TransientTrack track(tr,magneticField(),trackingGeometry());
00204
00205
00206 TransientTrackingRecHit::ConstRecHitContainer recHitsForReFit = getTransientRecHits(track);
00207
00208 if(recHitsForReFit.size() < 2) return vector<Trajectory>();
00209
00210 bool up = recHitsForReFit.back()->globalPosition().y()>0 ? true : false;
00211 LogTrace(metname) << "Up ? " << up;
00212
00213 PropagationDirection propagationDirection = up ? oppositeToMomentum : alongMomentum;
00214 TrajectoryStateOnSurface firstTSOS = up ? track.outermostMeasurementState() : track.innermostMeasurementState();
00215 unsigned int innerId = up ? track.track().outerDetId() : track.track().innerDetId();
00216
00217 LogTrace(metname) << "Prop Dir: " << propagationDirection << " FirstId " << innerId << " firstTSOS " << firstTSOS;
00218
00219 TrajectorySeed seed(PTrajectoryStateOnDet(),TrajectorySeed::recHitContainer(),propagationDirection);
00220
00221
00222 if(recHitsForReFit.front()->geographicalId() != DetId(innerId)){
00223 LogTrace(metname)<<"Propagation occurring"<<endl;
00224 firstTSOS = propagator(up)->propagate(firstTSOS, recHitsForReFit.front()->det()->surface());
00225 LogTrace(metname)<<"Final destination: " << recHitsForReFit.front()->det()->surface().position() << endl;
00226 if(!firstTSOS.isValid()){
00227 LogTrace(metname)<<"Propagation error!"<<endl;
00228 return vector<Trajectory>();
00229 }
00230 }
00231
00232
00233 vector<Trajectory> trajectories = fitter(up)->fit(seed,recHitsForReFit,firstTSOS);
00234
00235 if(trajectories.empty()){
00236 LogTrace(metname)<<"No Track refitted!"<<endl;
00237 return vector<Trajectory>();
00238 }
00239
00240 Trajectory trajectoryBW = trajectories.front();
00241
00242 vector<Trajectory> trajectoriesSM = smoother(up)->trajectories(trajectoryBW);
00243
00244 if(trajectoriesSM.empty()){
00245 LogTrace(metname)<<"No Track smoothed!"<<endl;
00246 return vector<Trajectory>();
00247 }
00248
00249 return trajectoriesSM;
00250
00251 }
00252
00253
00254
00255
00256 bool TrackTransformerForGlobalCosmicMuons::TrackerKeep(DetId id) const{
00257
00258 bool retVal = true;
00259 if (id.det() != DetId::Tracker ) return false;
00260 if (theTrackerSkipSystem < 0 ) return true;
00261
00262
00263 int layer = -999;
00264 int disk = -999;
00265 int wheel = -999;
00266
00267 if ( id.subdetId() == theTrackerSkipSystem){
00268
00269 if (theTrackerSkipSystem == PixelSubdetector::PixelBarrel) {
00270 PXBDetId did(id.rawId());
00271 layer = did.layer();
00272 }
00273
00274 if (theTrackerSkipSystem == StripSubdetector::TIB) {
00275 TIBDetId did(id.rawId());
00276 layer = did.layer();
00277 }
00278
00279 if (theTrackerSkipSystem == StripSubdetector::TOB) {
00280 TOBDetId did(id.rawId());
00281 layer = did.layer();
00282 }
00283 if (theTrackerSkipSystem == PixelSubdetector::PixelEndcap) {
00284 PXFDetId did(id.rawId());
00285 disk = did.disk();
00286 }
00287 if (theTrackerSkipSystem == StripSubdetector::TID) {
00288 TIDDetId did(id.rawId());
00289 wheel = did.wheel();
00290 }
00291 if (theTrackerSkipSystem == StripSubdetector::TEC) {
00292 TECDetId did(id.rawId());
00293 wheel = did.wheel();
00294 }
00295 }
00296
00297 if (theTrackerSkipSection > -998 && layer == theTrackerSkipSection) retVal = false;
00298 if (theTrackerSkipSection > -998 && disk == theTrackerSkipSection) retVal = false;
00299 if (theTrackerSkipSection > -998 && wheel == theTrackerSkipSection) retVal = false;
00300
00301 return retVal;
00302 }
00303
00304
00305
00306 bool TrackTransformerForGlobalCosmicMuons::MuonKeep(DetId id) const {
00307
00308 if (id.det() != DetId::Muon) return false;
00309 if (theSkipStationDT < 0 && theSkipStationCSC < 0) return true;
00310
00311 int station = -999;
00312 int wheel = -999;
00313 bool isRPC = false;
00314 bool isDT = false;
00315 bool isCSC = false;
00316
00317 if ( id.subdetId() == MuonSubdetId::DT ) {
00318 DTChamberId did(id.rawId());
00319 station = did.station();
00320 wheel = did.wheel();
00321 isDT = true;
00322 } else if ( id.subdetId() == MuonSubdetId::CSC ) {
00323 CSCDetId did(id.rawId());
00324 station = did.station();
00325 isCSC = true;
00326 } else if ( id.subdetId() == MuonSubdetId::RPC ) {
00327 RPCDetId rpcid(id.rawId());
00328 station = rpcid.station();
00329 isRPC = true;
00330 }
00331
00332 if (isRPC && (station == theSkipStationCSC || station == theSkipStationDT)) return false;
00333 if (isDT && station == theSkipStationDT ) return false;
00334 if (isCSC && station == theSkipStationCSC ) return false;
00335
00336 if (isDT && theSkipWheelDT > -998 && wheel == theSkipWheelDT) return false;
00337
00338 return true;
00339 }