00001 #include "RecoEgamma/EgammaPhotonProducers/interface/TrackProducerWithSCAssociation.h"
00002
00003 #include <memory>
00004
00005 #include "FWCore/Framework/interface/Frameworkfwd.h"
00006 #include "FWCore/Framework/interface/MakerMacros.h"
00007 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00008 #include "TrackingTools/GeomPropagators/interface/Propagator.h"
00009 #include "TrackingTools/PatternTools/interface/Trajectory.h"
00010 #include "TrackingTools/TrackFitters/interface/TrajectoryFitter.h"
00011 #include "TrackingTools/PatternTools/interface/TrajTrackAssociation.h"
00012 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateTransform.h"
00013 #include "TrackingTools/TransientTrackingRecHit/interface/TransientTrackingRecHitBuilder.h"
00014 #include "RecoTracker/TrackProducer/interface/TrackProducerBase.h"
00015 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
00016 #include "DataFormats/EgammaTrackReco/interface/TrackCandidateCaloClusterAssociation.h"
00017 #include "DataFormats/EgammaTrackReco/interface/TrackCaloClusterAssociation.h"
00018 #include "DataFormats/CaloRecHit/interface/CaloCluster.h"
00019
00020 TrackProducerWithSCAssociation::TrackProducerWithSCAssociation(const edm::ParameterSet& iConfig):
00021 TrackProducerBase<reco::Track>(iConfig.getParameter<bool>("TrajectoryInEvent")),
00022 theAlgo(iConfig)
00023 {
00024 setConf(iConfig);
00025 setSrc( iConfig.getParameter<edm::InputTag>( "src" ),
00026 iConfig.getParameter<edm::InputTag>( "beamSpot" ));
00027 setAlias( iConfig.getParameter<std::string>( "@module_label" ) );
00028
00029 if ( iConfig.exists("clusterRemovalInfo") ) {
00030 edm::InputTag tag = iConfig.getParameter<edm::InputTag>("clusterRemovalInfo");
00031 if (!(tag == edm::InputTag())) { setClusterRemovalInfo( tag ); }
00032 }
00033
00034
00035 myname_ = iConfig.getParameter<std::string>("ComponentName");
00036 conversionTrackCandidateProducer_ = iConfig.getParameter<std::string>("producer");
00037 trackCSuperClusterAssociationCollection_ = iConfig.getParameter<std::string>("trackCandidateSCAssociationCollection");
00038 trackSuperClusterAssociationCollection_ = iConfig.getParameter<std::string>("recoTrackSCAssociationCollection");
00039 myTrajectoryInEvent_ = iConfig.getParameter<bool>("TrajectoryInEvent");
00040
00041
00042
00043 produces<reco::TrackCollection>().setBranchAlias( alias_ + "Tracks" );
00044 produces<reco::TrackExtraCollection>().setBranchAlias( alias_ + "TrackExtras" );
00045 produces<TrackingRecHitCollection>().setBranchAlias( alias_ + "RecHits" );
00046 produces<std::vector<Trajectory> >() ;
00047 produces<TrajTrackAssociationCollection>();
00048
00049 produces< reco::TrackCaloClusterPtrAssociation > (trackSuperClusterAssociationCollection_ );
00050
00051 }
00052
00053
00054 void TrackProducerWithSCAssociation::produce(edm::Event& theEvent, const edm::EventSetup& setup)
00055 {
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065 std::auto_ptr<TrackingRecHitCollection> outputRHColl (new TrackingRecHitCollection);
00066 std::auto_ptr<reco::TrackCollection> outputTColl(new reco::TrackCollection);
00067 std::auto_ptr<reco::TrackExtraCollection> outputTEColl(new reco::TrackExtraCollection);
00068 std::auto_ptr<std::vector<Trajectory> > outputTrajectoryColl(new std::vector<Trajectory>);
00069
00070 std::auto_ptr<reco::TrackCaloClusterPtrAssociation> scTrkAssoc_p(new reco::TrackCaloClusterPtrAssociation);
00071
00072
00073
00074
00075 edm::ESHandle<TrackerGeometry> theG;
00076 edm::ESHandle<MagneticField> theMF;
00077 edm::ESHandle<TrajectoryFitter> theFitter;
00078 edm::ESHandle<Propagator> thePropagator;
00079 edm::ESHandle<TransientTrackingRecHitBuilder> theBuilder;
00080 edm::ESHandle<MeasurementTracker> theMeasTk;
00081 getFromES(setup,theG,theMF,theFitter,thePropagator,theMeasTk,theBuilder);
00082
00083
00084
00085
00086
00087 edm::Handle<TrackCandidateCollection> theTCCollection;
00089 validTrackCandidateSCAssociationInput_=true;
00090 edm::Handle<reco::TrackCandidateCaloClusterPtrAssociation> trkCandidateSCAssocHandle;
00091 theEvent.getByLabel(conversionTrackCandidateProducer_, trackCSuperClusterAssociationCollection_ , trkCandidateSCAssocHandle);
00092 if ( !trkCandidateSCAssocHandle.isValid() ) {
00093
00094 edm::LogError("TrackProducerWithSCAssociation") << "Error! Can't get the product "<<trackCSuperClusterAssociationCollection_.c_str() << " but keep running. Empty collection will be produced " << "\n";
00095 validTrackCandidateSCAssociationInput_=false;
00096 }
00097 reco::TrackCandidateCaloClusterPtrAssociation scTrkCandAssCollection = *(trkCandidateSCAssocHandle.product());
00098 if ( scTrkCandAssCollection.size() ==0 ) validTrackCandidateSCAssociationInput_=false;
00099
00100
00101 std::vector<int> tccLocations;
00102 AlgoProductCollection algoResults;
00103 reco::BeamSpot bs;
00104
00105
00106 getFromEvt(theEvent,theTCCollection,bs);
00107
00108 if (theTCCollection.failedToGet()){
00109 edm::LogError("TrackProducerWithSCAssociation") <<"TrackProducerWithSCAssociation could not get the TrackCandidateCollection.";}
00110 else{
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122 try{
00123 int cont = 0;
00124 int tcc=0;
00125
00126 for (TrackCandidateCollection::const_iterator i=theTCCollection->begin(); i!=theTCCollection->end();i++)
00127 {
00128
00129 const TrackCandidate * theTC = &(*i);
00130 PTrajectoryStateOnDet state = theTC->trajectoryStateOnDet();
00131 const TrackCandidate::range& recHitVec=theTC->recHits();
00132 const TrajectorySeed& seed = theTC->seed();
00133
00134
00135 TrajectoryStateTransform transformer;
00136
00137 DetId detId(state.detId());
00138 TrajectoryStateOnSurface theTSOS = transformer.transientState( state,
00139 &(theG.product()->idToDet(detId)->surface()),
00140 theMF.product());
00141
00142
00143
00144
00145
00146 TransientTrackingRecHit::RecHitContainer hits;
00147
00148 float ndof=0;
00149
00150 for (edm::OwnVector<TrackingRecHit>::const_iterator i=recHitVec.first;
00151 i!=recHitVec.second; i++){
00152 hits.push_back(theBuilder.product()->build(&(*i) ));
00153 }
00154
00155
00156
00157
00158 bool ok = theAlgo.buildTrack(theFitter.product(),thePropagator.product(),algoResults, hits, theTSOS, seed, ndof, bs, theTC->seedRef());
00159
00160 if(ok) {
00161 cont++;
00162 tccLocations.push_back(tcc);
00163 }
00164 tcc++;
00165 }
00166 edm::LogInfo("TrackProducerWithSCAssociation") << "Number of Tracks found: " << cont << "\n";
00167
00168
00169
00170 } catch (cms::Exception &e){ edm::LogInfo("TrackProducerWithSCAssociation") << "cms::Exception caught!!!" << "\n" << e << "\n";}
00171
00172
00173
00174 putInEvt(theEvent,thePropagator.product(),theMeasTk.product(),
00175 outputRHColl, outputTColl, outputTEColl, outputTrajectoryColl, algoResults);
00176
00177
00178 if ( validTrackCandidateSCAssociationInput_ ) {
00179 int itrack=0;
00180 std::vector<edm::Ptr<reco::CaloCluster> > caloPtrVec;
00181 for(AlgoProductCollection::iterator i=algoResults.begin(); i!=algoResults.end();i++){
00182 edm::Ref<TrackCandidateCollection> trackCRef(theTCCollection,tccLocations[itrack]);
00183 const edm::Ptr<reco::CaloCluster>& aClus = (*trkCandidateSCAssocHandle)[trackCRef];
00184 caloPtrVec.push_back( aClus );
00185 itrack++;
00186 }
00187
00188
00189 edm::ValueMap<reco::CaloClusterPtr>::Filler filler(*scTrkAssoc_p);
00190 filler.insert(rTracks_, caloPtrVec.begin(), caloPtrVec.end());
00191 filler.fill();
00192 }
00193
00194 theEvent.put(scTrkAssoc_p,trackSuperClusterAssociationCollection_ );
00195
00196 }
00197
00198 }
00199
00200 std::vector<reco::TransientTrack> TrackProducerWithSCAssociation::getTransient(edm::Event& theEvent, const edm::EventSetup& setup)
00201 {
00202 edm::LogInfo("TrackProducerWithSCAssociation") << "Analyzing event number: " << theEvent.id() << "\n";
00203
00204
00205
00206 std::vector<reco::TransientTrack> ttks;
00207
00208
00209
00210
00211 edm::ESHandle<TrackerGeometry> theG;
00212 edm::ESHandle<MagneticField> theMF;
00213 edm::ESHandle<TrajectoryFitter> theFitter;
00214 edm::ESHandle<Propagator> thePropagator;
00215 edm::ESHandle<TransientTrackingRecHitBuilder> theBuilder;
00216 edm::ESHandle<MeasurementTracker> theMeasTk;
00217 getFromES(setup,theG,theMF,theFitter,thePropagator,theMeasTk,theBuilder);
00218
00219
00220
00221
00222 AlgoProductCollection algoResults;
00223 reco::BeamSpot bs;
00224
00225 try{
00226 edm::Handle<TrackCandidateCollection> theTCCollection;
00227 getFromEvt(theEvent,theTCCollection,bs);
00228
00229
00230
00231
00232
00233 theAlgo.runWithCandidate(theG.product(), theMF.product(), *theTCCollection,
00234 theFitter.product(), thePropagator.product(), theBuilder.product(), bs, algoResults);
00235
00236 } catch (cms::Exception &e){ edm::LogInfo("TrackProducerWithSCAssociation") << "cms::Exception caught!!!" << "\n" << e << "\n";}
00237
00238
00239 for (AlgoProductCollection::iterator prod=algoResults.begin();prod!=algoResults.end(); prod++){
00240 ttks.push_back( reco::TransientTrack(*(((*prod).second).first),thePropagator.product()->magneticField() ));
00241 }
00242
00243
00244
00245 return ttks;
00246 }
00247
00248
00249
00250
00251 void TrackProducerWithSCAssociation::putInEvt(edm::Event& evt,
00252 const Propagator* thePropagator,
00253 const MeasurementTracker* theMeasTk,
00254 std::auto_ptr<TrackingRecHitCollection>& selHits,
00255 std::auto_ptr<reco::TrackCollection>& selTracks,
00256 std::auto_ptr<reco::TrackExtraCollection>& selTrackExtras,
00257 std::auto_ptr<std::vector<Trajectory> >& selTrajectories,
00258 AlgoProductCollection& algoResults)
00259 {
00260
00261 TrackingRecHitRefProd rHits = evt.getRefBeforePut<TrackingRecHitCollection>();
00262 reco::TrackExtraRefProd rTrackExtras = evt.getRefBeforePut<reco::TrackExtraCollection>();
00263
00264 edm::Ref<reco::TrackExtraCollection>::key_type idx = 0;
00265 edm::Ref<reco::TrackExtraCollection>::key_type hidx = 0;
00266 edm::Ref<reco::TrackCollection>::key_type iTkRef = 0;
00267 edm::Ref< std::vector<Trajectory> >::key_type iTjRef = 0;
00268 std::map<unsigned int, unsigned int> tjTkMap;
00269
00270 for(AlgoProductCollection::iterator i=algoResults.begin(); i!=algoResults.end();i++){
00271 Trajectory * theTraj = (*i).first;
00272 if(myTrajectoryInEvent_) {
00273 selTrajectories->push_back(*theTraj);
00274 iTjRef++;
00275 }
00276 const TrajectoryFitter::RecHitContainer& transHits = theTraj->recHits();
00277
00278 reco::Track * theTrack = (*i).second.first;
00279 PropagationDirection seedDir = (*i).second.second;
00280
00281
00282
00283 reco::Track t = * theTrack;
00284 selTracks->push_back( t );
00285 iTkRef++;
00286
00287
00288 if(trajectoryInEvent_) tjTkMap[iTjRef-1] = iTkRef-1;
00289
00290
00291
00292 TrajectoryStateOnSurface outertsos;
00293 TrajectoryStateOnSurface innertsos;
00294 unsigned int innerId, outerId;
00295
00296
00297
00298 if (theTraj->direction() == alongMomentum) {
00299 outertsos = theTraj->lastMeasurement().updatedState();
00300 innertsos = theTraj->firstMeasurement().updatedState();
00301 outerId = theTraj->lastMeasurement().recHit()->geographicalId().rawId();
00302 innerId = theTraj->firstMeasurement().recHit()->geographicalId().rawId();
00303 } else {
00304 outertsos = theTraj->firstMeasurement().updatedState();
00305 innertsos = theTraj->lastMeasurement().updatedState();
00306 outerId = theTraj->firstMeasurement().recHit()->geographicalId().rawId();
00307 innerId = theTraj->lastMeasurement().recHit()->geographicalId().rawId();
00308 }
00309
00310
00311 GlobalPoint v = outertsos.globalParameters().position();
00312 GlobalVector p = outertsos.globalParameters().momentum();
00313 math::XYZVector outmom( p.x(), p.y(), p.z() );
00314 math::XYZPoint outpos( v.x(), v.y(), v.z() );
00315 v = innertsos.globalParameters().position();
00316 p = innertsos.globalParameters().momentum();
00317 math::XYZVector inmom( p.x(), p.y(), p.z() );
00318 math::XYZPoint inpos( v.x(), v.y(), v.z() );
00319
00320 reco::TrackExtraRef teref= reco::TrackExtraRef ( rTrackExtras, idx ++ );
00321 reco::Track & track = selTracks->back();
00322 track.setExtra( teref );
00323
00324
00325 if (theSchool.isValid())
00326 {
00327 NavigationSetter setter( *theSchool );
00328 setSecondHitPattern(theTraj,track,thePropagator,theMeasTk);
00329 }
00330
00331
00332
00333 selTrackExtras->push_back( reco::TrackExtra (outpos, outmom, true, inpos, inmom, true,
00334 outertsos.curvilinearError(), outerId,
00335 innertsos.curvilinearError(), innerId,
00336 seedDir,theTraj->seedRef()));
00337
00338
00339 reco::TrackExtra & tx = selTrackExtras->back();
00340
00341
00342 size_t k = 0;
00343 if (theTraj->direction() == alongMomentum) {
00344 for( TrajectoryFitter::RecHitContainer::const_iterator j = transHits.begin();
00345 j != transHits.end(); j ++ ) {
00346 if ((**j).hit()!=0){
00347 TrackingRecHit * hit = (**j).hit()->clone();
00348 track.setHitPattern( * hit, k++ );
00349 selHits->push_back( hit );
00350 tx.add( TrackingRecHitRef( rHits, hidx ++ ) );
00351 }
00352 }
00353 }else{
00354 for( TrajectoryFitter::RecHitContainer::const_iterator j = transHits.end()-1;
00355 j != transHits.begin()-1; --j ) {
00356 if ((**j).hit()!=0){
00357 TrackingRecHit * hit = (**j).hit()->clone();
00358 track.setHitPattern( * hit, k++ );
00359 selHits->push_back( hit );
00360 tx.add( TrackingRecHitRef( rHits, hidx ++ ) );
00361 }
00362 }
00363 }
00364
00365
00366 delete theTrack;
00367 delete theTraj;
00368 }
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382 rTracks_ = evt.put( selTracks );
00383
00384
00385 evt.put( selTrackExtras );
00386 evt.put( selHits );
00387
00388 if(myTrajectoryInEvent_) {
00389 edm::OrphanHandle<std::vector<Trajectory> > rTrajs = evt.put(selTrajectories);
00390
00391
00392 std::auto_ptr<TrajTrackAssociationCollection> trajTrackMap( new TrajTrackAssociationCollection() );
00393 for ( std::map<unsigned int, unsigned int>::iterator i = tjTkMap.begin();
00394 i != tjTkMap.end(); i++ ) {
00395 edm::Ref<std::vector<Trajectory> > trajRef( rTrajs, (*i).first );
00396 edm::Ref<reco::TrackCollection> tkRef( rTracks_, (*i).second );
00397 trajTrackMap->insert( edm::Ref<std::vector<Trajectory> >( rTrajs, (*i).first ),
00398 edm::Ref<reco::TrackCollection>( rTracks_, (*i).second ) );
00399 }
00400 evt.put( trajTrackMap );
00401 }
00402
00403
00404
00405
00406
00407
00408 }