1 |
//--------
|
2 |
// Code copied from /UserCode/Mangano/WWAnalysis/Tools/src/VertexReProducer.cc
|
3 |
//--------
|
4 |
|
5 |
#include "MitEdm/Tools/interface/VertexReProducer.h"
|
6 |
#include "FWCore/Framework/interface/ESHandle.h"
|
7 |
#include "TrackingTools/TransientTrack/interface/TransientTrack.h"
|
8 |
#include "TrackingTools/TransientTrack/interface/TransientTrackBuilder.h"
|
9 |
#include "TrackingTools/Records/interface/TransientTrackRecord.h"
|
10 |
#include "FWCore/ParameterSet/interface/Registry.h"
|
11 |
#include "DataFormats/Provenance/interface/Provenance.h"
|
12 |
#include "FWCore/MessageLogger/interface/MessageLogger.h"
|
13 |
|
14 |
VertexReProducer::VertexReProducer(const edm::Handle<reco::VertexCollection> &handle, const edm::Event &iEvent)
|
15 |
{
|
16 |
const edm::Provenance *prov = handle.provenance();
|
17 |
if (prov == 0) throw cms::Exception("CorruptData") << "Vertex handle doesn't have provenance.";
|
18 |
edm::ParameterSetID psid = prov->psetID();
|
19 |
|
20 |
edm::pset::Registry *psregistry = edm::pset::Registry::instance();
|
21 |
edm::ParameterSet psetFromProvenance;
|
22 |
if (!psregistry->getMapped(psid, psetFromProvenance))
|
23 |
throw cms::Exception("CorruptData") << "Vertex handle parameter set ID id = " << psid;
|
24 |
|
25 |
if (prov->moduleName() != "PrimaryVertexProducer")
|
26 |
throw cms::Exception("Configuration") << "Vertices to re-produce don't come from a PrimaryVertexProducer, but from a " << prov->moduleName() <<".\n";
|
27 |
|
28 |
configure(psetFromProvenance);
|
29 |
|
30 |
// Now we also dig out the ProcessName used for the reco::Tracks and reco::Vertices
|
31 |
std::vector<edm::BranchID> parents = prov->parents();
|
32 |
bool foundTracks = false;
|
33 |
bool foundBeamSpot = false;
|
34 |
for (std::vector<edm::BranchID>::const_iterator it = parents.begin(), ed = parents.end(); it != ed; ++it) {
|
35 |
edm::Provenance parprov = iEvent.getProvenance(*it);
|
36 |
if (parprov.friendlyClassName() == "recoTracks") {
|
37 |
tracksTag_ = edm::InputTag(parprov.moduleLabel(), parprov.productInstanceName(), parprov.processName());
|
38 |
foundTracks = true;
|
39 |
} else if (parprov.friendlyClassName() == "recoBeamSpot") {
|
40 |
beamSpotTag_ = edm::InputTag(parprov.moduleLabel(), parprov.productInstanceName(), parprov.processName());
|
41 |
foundBeamSpot = true;
|
42 |
}
|
43 |
}
|
44 |
if (!foundTracks || !foundBeamSpot) {
|
45 |
edm::LogWarning("VertexReProducer_MissingParentage") <<
|
46 |
"Can't find parentage info for vertex collection inputs: " <<
|
47 |
(foundTracks ? "" : "tracks ") << (foundBeamSpot ? "" : "beamSpot") << "\n";
|
48 |
}
|
49 |
}
|
50 |
|
51 |
void
|
52 |
VertexReProducer::configure(const edm::ParameterSet &iConfig)
|
53 |
{
|
54 |
config_ = iConfig;
|
55 |
tracksTag_ = iConfig.getParameter<edm::InputTag>("TrackLabel");
|
56 |
beamSpotTag_ = iConfig.getParameter<edm::InputTag>("beamSpotLabel");
|
57 |
algo_.reset(new PrimaryVertexProducerAlgorithm(iConfig));
|
58 |
}
|
59 |
|
60 |
std::vector<TransientVertex>
|
61 |
VertexReProducer::makeVertices(const reco::TrackCollection &tracks,
|
62 |
const reco::BeamSpot &bs,
|
63 |
const edm::EventSetup &iSetup) const
|
64 |
{
|
65 |
edm::ESHandle<TransientTrackBuilder> theB;
|
66 |
iSetup.get<TransientTrackRecord>().get("TransientTrackBuilder",theB);
|
67 |
|
68 |
std::vector<reco::TransientTrack> t_tks; t_tks.reserve(tracks.size());
|
69 |
for (reco::TrackCollection::const_iterator it = tracks.begin(), ed = tracks.end(); it != ed; ++it) {
|
70 |
t_tks.push_back((*theB).build(*it));
|
71 |
t_tks.back().setBeamSpot(bs);
|
72 |
}
|
73 |
|
74 |
return algo_->vertices(t_tks, bs);
|
75 |
}
|