1 |
ksung |
1.2 |
//--------
|
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 |
|
|
}
|