CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_5/src/TrackingTools/TrackRefitter/src/TrackTransformerForGlobalCosmicMuons.cc

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");//layer, wheel, or disk depending on the system 
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   // Global Tracking Geometry
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   // Magfield Field
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   // Transient Rechit Builders
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   //Retrieve tracker topology from geometry
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   bool up = staHits.front()->globalPosition().y()>0 ? true : false;
00131 
00132   if(up){
00133     reverse(staHits.begin(),staHits.end());
00134     reverse(tkHits.begin(),tkHits.end());
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   // Build the transient Rechits
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 // Selection for Tracker Hits
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 // Selection for Muon hits
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 }