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
00045
00046 theNavigationType = par.getParameter<string>("NavigationType");
00047
00048
00049 ParameterSet filterPSet = par.getParameter<ParameterSet>("FilterParameters");
00050 filterPSet.addParameter<string>("NavigationType",theNavigationType);
00051 theFilter = new StandAloneMuonFilter(filterPSet,theService);
00052
00053
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
00067 theSeedPropagatorName = par.getParameter<string>("SeedPropagator");
00068
00069
00070 doBackwardFilter = par.getParameter<bool>("DoBackwardFilter");
00071
00072
00073 doRefit = par.getParameter<bool>("DoRefit");
00074
00075 if(doBackwardFilter){
00076
00077 ParameterSet bwFilterPSet = par.getParameter<ParameterSet>("BWFilterParameters");
00078
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
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
00115
00116 TrajectoryContainer trajectoryContainer;
00117
00118 PropagationDirection fwDirection = (theSeedPosition == recoMuon::in) ? alongMomentum : oppositeToMomentum;
00119 Trajectory trajectoryFW(seed,fwDirection);
00120
00121 DetLayerWithState inputFromSeed = propagateTheSeedTSOS(seed);
00122
00123
00124
00125
00126 filter()->refit(inputFromSeed.second,inputFromSeed.first,trajectoryFW);
00127
00128
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
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
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
00204 bwfilter()->refit(tsosAfterRefit,filter()->lastDetLayer(),trajectoryBW);
00205
00206
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
00220
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
00240
00241
00242 else if ( filter()->getTotalChamberUsed() >= 2 ) {
00243 LogTrace(metname)<< "Trajectory NOT saved. Second Attempt." << endl;
00244
00245
00246
00247
00248
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
00264 PTrajectoryStateOnDet pTSOD = seed.startingState();
00265
00266
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
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
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 }