/
DAFTrackProducer.cc
133 lines (105 loc) · 5.66 KB
/
DAFTrackProducer.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include <memory>
#include "FWCore/Framework/interface/Frameworkfwd.h"
#include "FWCore/Framework/interface/MakerMacros.h"
#include "FWCore/MessageLogger/interface/MessageLogger.h"
#include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
#include "RecoTracker/Record/interface/MultiRecHitRecord.h"
#include "RecoTracker/SiTrackerMRHTools/interface/MultiRecHitCollector.h"
#include "RecoTracker/SiTrackerMRHTools/interface/SiTrackerMultiRecHitUpdator.h"
#include "RecoTracker/TrackProducer/plugins/DAFTrackProducer.h"
#include "TrackingTools/GeomPropagators/interface/Propagator.h"
#include "TrackingTools/PatternTools/interface/Trajectory.h"
#include "TrackingTools/PatternTools/interface/TrajAnnealing.h"
#include "TrackingTools/PatternTools/interface/TrajTrackAssociation.h"
#include "TrackingTools/Records/interface/TrackingComponentsRecord.h"
DAFTrackProducer::DAFTrackProducer(const edm::ParameterSet& iConfig):
KfTrackProducerBase(iConfig.getParameter<bool>("TrajectoryInEvent"),false),
theAlgo(iConfig)
{
setConf(iConfig);
setSrc( consumes<TrackCandidateCollection>(iConfig.getParameter<edm::InputTag>( "src" )),
consumes<reco::BeamSpot>(iConfig.getParameter<edm::InputTag>( "beamSpot" )),
consumes<MeasurementTrackerEvent>(iConfig.getParameter<edm::InputTag>( "MeasurementTrackerEvent") ));
src_ = consumes<TrajectoryCollection>(iConfig.getParameter<edm::InputTag>( "src" ));
setAlias( iConfig.getParameter<std::string>( "@module_label" ) );
//register your products
produces<reco::TrackCollection>().setBranchAlias( alias_ + "Tracks" );
produces<reco::TrackExtraCollection>().setBranchAlias( alias_ + "TrackExtras" );
produces<TrackingRecHitCollection>().setBranchAlias( alias_ + "RecHits" );
produces<std::vector<Trajectory> >();
produces<TrajTrackAssociationCollection>();
produces<TrajAnnealingCollection>().setBranchAlias( alias_ + "TrajectoryAnnealing" );
TrajAnnSaving_ = iConfig.getParameter<bool>("TrajAnnealingSaving");
}
void DAFTrackProducer::produce(edm::Event& theEvent, const edm::EventSetup& setup)
{
edm::LogInfo("DAFTrackProducer") << "Analyzing event number: " << theEvent.id() << "\n";
//empty output collections
std::auto_ptr<TrackingRecHitCollection> outputRHColl (new TrackingRecHitCollection);
std::auto_ptr<reco::TrackCollection> outputTColl(new reco::TrackCollection);
std::auto_ptr<reco::TrackExtraCollection> outputTEColl(new reco::TrackExtraCollection);
std::auto_ptr<std::vector<Trajectory> > outputTrajectoryColl(new std::vector<Trajectory>);
std::auto_ptr<TrajAnnealingCollection> outputTrajAnnColl(new TrajAnnealingCollection);
//declare and get stuff to be retrieved from ES
edm::ESHandle<TrackerGeometry> theG;
edm::ESHandle<MagneticField> theMF;
edm::ESHandle<TrajectoryFitter> theFitter;
edm::ESHandle<Propagator> thePropagator;
edm::ESHandle<MeasurementTracker> theMeasTk;
edm::ESHandle<TransientTrackingRecHitBuilder> theBuilder;
getFromES(setup,theG,theMF,theFitter,thePropagator,theMeasTk,theBuilder);
//get additional es_modules needed by the DAF
edm::ESHandle<MultiRecHitCollector> measurementCollectorHandle;
std::string measurementCollectorName = getConf().getParameter<std::string>("MeasurementCollector");
setup.get<MultiRecHitRecord>().get(measurementCollectorName, measurementCollectorHandle);
edm::ESHandle<SiTrackerMultiRecHitUpdator> updatorHandle;
std::string updatorName = getConf().getParameter<std::string>("UpdatorName");
setup.get<MultiRecHitRecord>().get(updatorName, updatorHandle);
//get MeasurementTrackerEvent
edm::Handle<MeasurementTrackerEvent> mte;
theEvent.getByToken(mteSrc_, mte);
//declare and get TrackColection
AlgoProductCollection algoResults;
reco::BeamSpot bs;
TrajAnnealingCollection trajannResults;
try{
edm::Handle<std::vector<Trajectory> > theTrajectoryCollection;
getFromEvt(theEvent,theTrajectoryCollection,bs);
//obsolete?
//measurementCollectorHandle->updateEvent(theEvent);
//run the algorithm
LogDebug("DAFTrackProducer") << "run the DAF algorithm" << "\n";
theAlgo.runWithCandidate(theG.product(), theMF.product(), *theTrajectoryCollection, &*mte,
theFitter.product(), theBuilder.product(),
measurementCollectorHandle.product(), updatorHandle.product(), bs,
algoResults, trajannResults, TrajAnnSaving_);
} catch (cms::Exception &e){
edm::LogInfo("DAFTrackProducer") << "cms::Exception caught!!!" << "\n" << e << "\n";
throw;
}
//put everything in the event
putInEvt(theEvent, thePropagator.product(),theMeasTk.product(),
outputRHColl, outputTColl, outputTEColl,
outputTrajectoryColl, algoResults, theBuilder.product());
putInEvtTrajAnn(theEvent, trajannResults, outputTrajAnnColl);
LogDebug("DAFTrackProducer") << "end the DAF algorithm." << "\n";
}
void DAFTrackProducer::getFromEvt(edm::Event& theEvent,edm::Handle<TrajectoryCollection>& theTrajectoryCollection, reco::BeamSpot& bs)
{
//get the TrajectoryCollection from the event
//WARNING: src has always to be redefined in cfg file
theEvent.getByToken(src_,theTrajectoryCollection );
//get the BeamSpot
edm::Handle<reco::BeamSpot> recoBeamSpotHandle;
theEvent.getByToken(bsSrc_,recoBeamSpotHandle);
bs = *recoBeamSpotHandle;
}
void DAFTrackProducer::putInEvtTrajAnn(edm::Event& theEvent, TrajAnnealingCollection & trajannResults,
std::auto_ptr<TrajAnnealingCollection>& outputTrajAnnColl){
const int size = trajannResults.size();
outputTrajAnnColl->reserve(size);
for(unsigned int i = 0; i < trajannResults.size() ; i++){
outputTrajAnnColl->push_back(trajannResults[i]);
}
theEvent.put( outputTrajAnnColl );
}