CMS 3D CMS Logo

StandAloneTrajectoryBuilder.cc

Go to the documentation of this file.
00001 
00010 #include "RecoMuon/StandAloneTrackFinder/interface/StandAloneTrajectoryBuilder.h"
00011 
00012 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00013 #include "DataFormats/TrajectorySeed/interface/TrajectorySeed.h"
00014 #include "DataFormats/TrajectoryState/interface/PTrajectoryStateOnDet.h"
00015 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateTransform.h"
00016 #include "DataFormats/TrajectorySeed/interface/PropagationDirection.h"
00017 
00018 #include "RecoMuon/StandAloneTrackFinder/interface/StandAloneMuonFilter.h"
00019 #include "RecoMuon/StandAloneTrackFinder/interface/StandAloneMuonBackwardFilter.h"
00020 #include "RecoMuon/StandAloneTrackFinder/interface/StandAloneMuonRefitter.h"
00021 
00022 #include "RecoMuon/TrackingTools/interface/MuonPatternRecoDumper.h"
00023 #include "RecoMuon/TrackingTools/interface/MuonServiceProxy.h"
00024 #include "RecoMuon/Navigation/interface/DirectMuonNavigation.h"
00025 
00026 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00027 
00028 #include "DataFormats/TrajectoryState/interface/PTrajectoryStateOnDet.h"
00029 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateTransform.h"
00030 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateOnSurface.h"
00031 #include "TrackingTools/TrajectoryState/interface/FreeTrajectoryState.h"
00032 #include "TrackingTools/DetLayers/interface/DetLayer.h"
00033 #include "Geometry/CommonDetUnit/interface/GeomDet.h"
00034 
00035 using namespace edm;
00036 using namespace std;
00037 
00038 StandAloneMuonTrajectoryBuilder::StandAloneMuonTrajectoryBuilder(const ParameterSet& par, 
00039                                                                  const MuonServiceProxy* service):theService(service){
00040   const std::string metname = "Muon|RecoMuon|StandAloneMuonTrajectoryBuilder";
00041   
00042   LogTrace(metname) << "constructor called" << endl;
00043 
00044   // The navigation type:
00045   // "Direct","Standard"
00046   theNavigationType = par.getParameter<string>("NavigationType");
00047   
00048   // The inward-outward fitter (starts from seed state)
00049   ParameterSet filterPSet = par.getParameter<ParameterSet>("FilterParameters");
00050   filterPSet.addParameter<string>("NavigationType",theNavigationType);
00051   theFilter = new StandAloneMuonFilter(filterPSet,theService);
00052 
00053   // Fit direction
00054   string seedPosition = par.getParameter<string>("SeedPosition");
00055   
00056   if (seedPosition == "in" ) theSeedPosition = recoMuon::in;
00057   else if (seedPosition == "out" ) theSeedPosition = recoMuon::out;
00058   else 
00059     throw cms::Exception("StandAloneMuonFilter constructor") 
00060       <<"Wrong seed position chosen in StandAloneMuonFilter::StandAloneMuonFilter ParameterSet"
00061       << "\n"
00062       << "Possible choices are:"
00063       << "\n"
00064       << "SeedPosition = in or SeedPosition = out";
00065   
00066   // Propagator for the seed extrapolation
00067   theSeedPropagatorName = par.getParameter<string>("SeedPropagator");
00068   
00069   // Disable/Enable the backward filter
00070   doBackwardFilter = par.getParameter<bool>("DoBackwardFilter");
00071   
00072   // Disable/Enable the refit of the trajectory
00073   doRefit = par.getParameter<bool>("DoRefit");
00074    
00075   if(doBackwardFilter){
00076     // The outward-inward fitter (starts from theFilter outermost state)
00077     ParameterSet bwFilterPSet = par.getParameter<ParameterSet>("BWFilterParameters");
00078     //  theBWFilter = new StandAloneMuonBackwardFilter(bwFilterPSet,theService); // FIXME
00079     bwFilterPSet.addParameter<string>("NavigationType",theNavigationType);
00080     theBWFilter = new StandAloneMuonFilter(bwFilterPSet,theService);
00081     
00082     theBWSeedType = bwFilterPSet.getParameter<string>("BWSeedType");
00083   }
00084 
00085   if(doRefit){
00086     // The outward-inward fitter (starts from theBWFilter innermost state)
00087     ParameterSet refitterPSet = par.getParameter<ParameterSet>("RefitterParameters");
00088     theRefitter = new StandAloneMuonRefitter(refitterPSet,theService);
00089   }
00090 } 
00091 
00092 void StandAloneMuonTrajectoryBuilder::setEvent(const edm::Event& event){
00093   theFilter->setEvent(event);
00094    if(doBackwardFilter) theBWFilter->setEvent(event);
00095 }
00096 
00097 StandAloneMuonTrajectoryBuilder::~StandAloneMuonTrajectoryBuilder(){
00098 
00099   LogTrace("Muon|RecoMuon|StandAloneMuonTrajectoryBuilder") 
00100     << "StandAloneMuonTrajectoryBuilder destructor called" << endl;
00101   
00102   if(theFilter) delete theFilter;
00103   if(doBackwardFilter && theBWFilter) delete theBWFilter;
00104   if(doRefit && theRefitter) delete theRefitter;
00105 }
00106 
00107 
00108 MuonTrajectoryBuilder::TrajectoryContainer 
00109 StandAloneMuonTrajectoryBuilder::trajectories(const TrajectorySeed& seed){ 
00110 
00111   const std::string metname = "Muon|RecoMuon|StandAloneMuonTrajectoryBuilder";
00112   MuonPatternRecoDumper debug;
00113 
00114   // the trajectory container. In principle starting from one seed we can
00115   // obtain more than one trajectory. TODO: this feature is not yet implemented!
00116   TrajectoryContainer trajectoryContainer;
00117 
00118   PropagationDirection fwDirection = (theSeedPosition == recoMuon::in) ? alongMomentum : oppositeToMomentum;  
00119   Trajectory trajectoryFW(seed,fwDirection);
00120 
00121   DetLayerWithState inputFromSeed = propagateTheSeedTSOS(seed); // it returns DetLayer-TSOS pair
00122   
00123   // refine the FTS given by the seed
00124 
00125   // the trajectory is filled in the refitter::refit
00126   filter()->refit(inputFromSeed.second,inputFromSeed.first,trajectoryFW);
00127 
00128   // Get the last TSOS
00129   TrajectoryStateOnSurface tsosAfterRefit = filter()->lastUpdatedTSOS();
00130 
00131   LogTrace(metname) << "StandAloneMuonTrajectoryBuilder filter output " << endl ;
00132   LogTrace(metname) << debug.dumpTSOS(tsosAfterRefit);
00133   
00134 
00135   if( filter()->layers().size() ) 
00136     LogTrace(metname) << debug.dumpLayer( filter()->lastDetLayer());
00137   else return trajectoryContainer; 
00138   
00139   LogTrace(metname) << "Number of DT/CSC/RPC chamber used (fw): " 
00140        << filter()->getDTChamberUsed() << "/"
00141        << filter()->getCSCChamberUsed() << "/"
00142        << filter()->getRPCChamberUsed() <<endl;
00143   LogTrace(metname) << "Momentum: " <<tsosAfterRefit.freeState()->momentum();
00144   
00145 
00146   if(!doBackwardFilter){ 
00147     LogTrace(metname) << "Only forward refit requested. Any backward refit will be performed!"<<endl;
00148     
00149     if (filter()->goodState()){
00150 
00151       // ***** Refit of fwd step *****
00152       if (doRefit && !trajectoryFW.empty()){
00153         pair<bool,Trajectory> refitResult = refitter()->refit(trajectoryFW);
00154         if (refitResult.first){
00155           trajectoryContainer.push_back(new Trajectory(refitResult.second));
00156           LogTrace(metname) << "StandAloneMuonTrajectoryBuilder refit output " << endl ;
00157           LogTrace(metname) << debug.dumpTSOS(refitResult.second.lastMeasurement().updatedState());
00158         }
00159         else
00160           trajectoryContainer.push_back(new Trajectory(trajectoryFW));
00161       }
00162       else
00163         trajectoryContainer.push_back(new Trajectory(trajectoryFW));
00164       
00165       LogTrace(metname)<< "Trajectory saved" << endl;
00166     }
00167     else LogTrace(metname)<< "Trajectory NOT saved. No enough number of tracking chamber used!" << endl;
00168     
00169     return trajectoryContainer;
00170   } 
00171 
00172 
00173   // ***** Backward filtering *****
00174   
00175   TrajectorySeed seedForBW;
00176 
00177   if(theBWSeedType == "noSeed"){
00178     TrajectorySeed seedVoid;
00179     seedForBW = seedVoid;
00180   }
00181   else if (theBWSeedType == "fromFWFit"){
00182     
00183     TrajectoryStateTransform tsTransform;
00184     
00185     PTrajectoryStateOnDet *seedTSOS =
00186       tsTransform.persistentState( tsosAfterRefit, trajectoryFW.lastMeasurement().recHit()->geographicalId().rawId());
00187     
00188     edm::OwnVector<TrackingRecHit> recHitsContainer;
00189     PropagationDirection seedDirection = (theSeedPosition == recoMuon::in) ?  oppositeToMomentum : alongMomentum;
00190     TrajectorySeed fwFit(*seedTSOS,recHitsContainer,seedDirection);
00191 
00192     seedForBW = fwFit;
00193   }
00194   else if (theBWSeedType == "fromGenerator"){
00195     seedForBW = seed;
00196   }
00197   else
00198     LogWarning(metname) << "Wrong seed type for the backward filter!";
00199 
00200   PropagationDirection bwDirection = (theSeedPosition == recoMuon::in) ?  oppositeToMomentum : alongMomentum;
00201   Trajectory trajectoryBW(seedForBW,bwDirection);
00202 
00203   // FIXME! under check!
00204   bwfilter()->refit(tsosAfterRefit,filter()->lastDetLayer(),trajectoryBW);
00205 
00206   // Get the last TSOS
00207   TrajectoryStateOnSurface tsosAfterBWRefit = bwfilter()->lastUpdatedTSOS();
00208 
00209   LogTrace(metname) << "StandAloneMuonTrajectoryBuilder BW filter output " << endl ;
00210   LogTrace(metname) << debug.dumpTSOS(tsosAfterBWRefit);
00211 
00212   LogTrace(metname) 
00213     << "Number of RecHits: " << trajectoryBW.foundHits() << "\n"
00214     << "Number of DT/CSC/RPC chamber used (bw): " 
00215     << bwfilter()->getDTChamberUsed() << "/"
00216     << bwfilter()->getCSCChamberUsed() << "/" 
00217     << bwfilter()->getRPCChamberUsed();
00218   
00219   // The trajectory is good if there are at least 2 chamber used in total and at
00220   // least 1 "tracking" (DT or CSC)
00221   if (bwfilter()->goodState()) {
00222     
00223     if (doRefit && !trajectoryBW.empty()){
00224       pair<bool,Trajectory> refitResult = refitter()->refit(trajectoryBW);
00225       if (refitResult.first){
00226         trajectoryContainer.push_back(new Trajectory(refitResult.second));
00227         LogTrace(metname) << "StandAloneMuonTrajectoryBuilder Refit output " << endl;
00228         LogTrace(metname) << debug.dumpTSOS(refitResult.second.lastMeasurement().updatedState());
00229       }
00230       else
00231         trajectoryContainer.push_back(new Trajectory(trajectoryBW));
00232     }
00233     else
00234       trajectoryContainer.push_back(new Trajectory(trajectoryBW));
00235     
00236     LogTrace(metname)<< "Trajectory saved" << endl;
00237     
00238   }
00239   //if the trajectory is not saved, but at least two chamber are used in the
00240   //forward filtering, try to build a new trajectory starting from the old
00241   //trajectory w/o the latest measurement and a looser chi2 cut
00242   else if ( filter()->getTotalChamberUsed() >= 2 ) {
00243     LogTrace(metname)<< "Trajectory NOT saved. Second Attempt." << endl;
00244     // FIXME:
00245     // a better choice could be: identify the poorest one, exclude it, redo
00246     // the fw and bw filtering. Or maybe redo only the bw without the excluded
00247     // measure. As first step I will port the ORCA algo, then I will move to the
00248     // above pattern.
00249     
00250   }
00251   else
00252     LogTrace(metname)<< "Trajectory NOT saved" << endl;
00253   return trajectoryContainer;
00254 }
00255 
00256 
00257 StandAloneMuonTrajectoryBuilder::DetLayerWithState
00258 StandAloneMuonTrajectoryBuilder::propagateTheSeedTSOS(const TrajectorySeed& seed){
00259 
00260   const std::string metname = "Muon|RecoMuon|StandAloneMuonTrajectoryBuilder";
00261   MuonPatternRecoDumper debug;
00262 
00263   // Get the Trajectory State on Det (persistent version of a TSOS) from the seed
00264   PTrajectoryStateOnDet pTSOD = seed.startingState();
00265   
00266   // Transform it in a TrajectoryStateOnSurface
00267   LogTrace(metname)<<"Transform PTrajectoryStateOnDet in a TrajectoryStateOnSurface"<<endl;
00268   TrajectoryStateTransform tsTransform;
00269 
00270   DetId seedDetId(pTSOD.detId());
00271 
00272   const GeomDet* gdet = theService->trackingGeometry()->idToDet( seedDetId );
00273 
00274   TrajectoryStateOnSurface initialState = tsTransform.transientState(pTSOD, &(gdet->surface()), 
00275                                                                      &*theService->magneticField());
00276 
00277   LogTrace(metname)<<"Seed's Pt: "<<initialState.freeState()->momentum().perp()<<endl;
00278 
00279   LogTrace(metname)<< "Seed's id: "<< endl ;
00280   LogTrace(metname) << debug.dumpMuonId(seedDetId);
00281   
00282   // Get the layer on which the seed relies
00283   const DetLayer *initialLayer = theService->detLayerGeometry()->idToLayer( seedDetId );
00284 
00285   LogTrace(metname)<< "Seed's detLayer: "<< endl ;
00286   LogTrace(metname) << debug.dumpLayer(initialLayer);
00287 
00288   LogTrace(metname)<< "TrajectoryStateOnSurface before propagation:" << endl;
00289   LogTrace(metname) << debug.dumpTSOS(initialState);
00290 
00291 
00292   PropagationDirection detLayerOrder = (theSeedPosition == recoMuon::in) ? oppositeToMomentum : alongMomentum;
00293 
00294   // ask for compatible layers
00295   vector<const DetLayer*> detLayers;
00296 
00297   if(theNavigationType == "Standard")
00298     detLayers = initialLayer->compatibleLayers( *initialState.freeState(),detLayerOrder); 
00299   else if (theNavigationType == "Direct"){
00300     DirectMuonNavigation navigation( &*theService->detLayerGeometry() );
00301     detLayers = navigation.compatibleLayers( *initialState.freeState(),detLayerOrder);
00302   }
00303   else
00304     edm::LogError(metname) << "No Properly Navigation Selected!!"<<endl;
00305 
00306  
00307   LogTrace(metname) << "There are "<< detLayers.size() <<" compatible layers"<<endl;
00308   
00309   DetLayerWithState result = DetLayerWithState(initialLayer,initialState);
00310 
00311   if(detLayers.size()){
00312 
00313     LogTrace(metname) << "Compatible layers:"<<endl;
00314     for( vector<const DetLayer*>::const_iterator layer = detLayers.begin(); 
00315          layer != detLayers.end(); layer++){
00316       LogTrace(metname) << debug.dumpMuonId((*layer)->basicComponents().front()->geographicalId());
00317       LogTrace(metname) << debug.dumpLayer(*layer);
00318     }
00319 
00320     const DetLayer* finalLayer = detLayers.back();
00321 
00322     if(theSeedPosition == recoMuon::in) LogTrace(metname) << "Most internal one:"<<endl;
00323     else LogTrace(metname) << "Most external one:"<<endl;
00324     
00325     LogTrace(metname) << debug.dumpLayer(finalLayer);
00326     
00327     const TrajectoryStateOnSurface propagatedState = 
00328       theService->propagator(theSeedPropagatorName)->propagate(initialState,
00329                                                                finalLayer->surface());
00330 
00331     if(propagatedState.isValid()){
00332       result = DetLayerWithState(finalLayer,propagatedState);
00333       
00334       LogTrace(metname) << "Trajectory State on Surface after the extrapolation"<<endl;
00335       LogTrace(metname) << debug.dumpTSOS(propagatedState);
00336       LogTrace(metname) << debug.dumpLayer(finalLayer);
00337     }
00338     else 
00339       LogTrace(metname)<< "Extrapolation failed. Keep the original seed state" <<endl;
00340   }
00341   else
00342     LogTrace(metname)<< "No compatible layers. Keep the original seed state" <<endl;
00343   
00344   return result;
00345 }

Generated on Tue Jun 9 17:44:31 2009 for CMSSW by  doxygen 1.5.4