CMS 3D CMS Logo

VertexFromTrackProducer.cc
Go to the documentation of this file.
10 
12  : trackToken(consumes<edm::View<reco::Track> >(conf.getParameter<edm::InputTag>("trackLabel"))),
13  candidateToken(consumes<edm::View<reco::RecoCandidate> >(conf.getParameter<edm::InputTag>("trackLabel"))),
14  triggerFilterElectronsSrc(consumes<trigger::TriggerFilterObjectWithRefs>(
15  conf.getParameter<edm::InputTag>("triggerFilterElectronsSrc"))),
17  consumes<trigger::TriggerFilterObjectWithRefs>(conf.getParameter<edm::InputTag>("triggerFilterMuonsSrc"))),
18  vertexLabel(consumes<edm::View<reco::Vertex> >(conf.getParameter<edm::InputTag>("vertexLabel"))),
19  beamSpotLabel(consumes<reco::BeamSpot>(conf.getParameter<edm::InputTag>("beamSpotLabel"))),
20  fIsRecoCandidate(conf.getParameter<bool>("isRecoCandidate")),
21  fUseBeamSpot(conf.getParameter<bool>("useBeamSpot")),
22  fUseVertex(conf.getParameter<bool>("useVertex")),
23  fUseTriggerFilterElectrons(conf.getParameter<bool>("useTriggerFilterElectrons")),
24  fUseTriggerFilterMuons(conf.getParameter<bool>("useTriggerFilterMuons")),
25  fVerbose(conf.getUntrackedParameter<bool>("verbose", false)) {
26  edm::LogInfo("PVDebugInfo") << "Initializing VertexFromTrackProducer"
27  << "\n";
28 
29  produces<reco::VertexCollection>();
30 }
31 
34  const edm::EventSetup& iSetup) const {
35  using namespace edm;
36 
37  std::unique_ptr<reco::VertexCollection> result(new reco::VertexCollection);
39 
40  math::XYZPoint vertexPoint;
41  bool vertexAvailable = false;
42 
43  // get the BeamSpot
44  edm::Handle<reco::BeamSpot> recoBeamSpotHandle;
45  iEvent.getByToken(beamSpotLabel, recoBeamSpotHandle);
46  if (recoBeamSpotHandle.isValid()) {
47  const reco::BeamSpot& beamSpot = *recoBeamSpotHandle;
48  vertexPoint = beamSpot.position();
49  } else {
50  edm::LogError("UnusableBeamSpot") << "No beam spot found in Event";
51  }
52 
53  if (fUseVertex) {
54  // get the Vertex
55  edm::Handle<edm::View<reco::Vertex> > recoVertexHandle;
56  iEvent.getByToken(vertexLabel, recoVertexHandle);
57  if ((recoVertexHandle.isValid()) && (!recoVertexHandle->empty())) {
58  reco::Vertex vertex = recoVertexHandle->at(0);
59  vertexPoint = vertex.position();
60  vertexAvailable = true;
61  } else {
62  edm::LogInfo("UnusableVertex") << "No vertex found in Event, beam spot used instaed"
63  << "\n";
64  }
65  }
66 
67  const reco::Track* track = nullptr;
68  if (fIsRecoCandidate) {
70  iEvent.getByToken(candidateToken, candidateHandle);
71  if ((candidateHandle.isValid()) && (!candidateHandle->empty())) {
72  double maxpt = 0.;
73  unsigned i_maxpt = 0;
74  for (unsigned i = 0; i < candidateHandle->size(); ++i) {
75  double pt = candidateHandle->ptrAt(i)->pt();
76  if (pt > maxpt) {
77  i_maxpt = i;
78  maxpt = pt;
79  }
80  }
81  track = dynamic_cast<const reco::Track*>(candidateHandle->ptrAt(i_maxpt)->bestTrack());
82  }
83  } else if (fUseTriggerFilterElectrons) {
85  iEvent.getByToken(triggerFilterElectronsSrc, triggerfilter);
86  std::vector<reco::ElectronRef> recocandidates;
87  triggerfilter->getObjects(trigger::TriggerElectron, recocandidates);
88  if ((!recocandidates.empty())) {
89  double maxpt = 0.;
90  unsigned i_maxpt = 0;
91  for (unsigned i = 0; i < recocandidates.size(); ++i) {
92  double pt = recocandidates.at(i)->pt();
93  if (pt > maxpt) {
94  i_maxpt = i;
95  maxpt = pt;
96  }
97  track = dynamic_cast<const reco::Track*>(recocandidates.at(i_maxpt)->bestTrack());
98  }
99  }
100  } else if (fUseTriggerFilterMuons) {
102  iEvent.getByToken(triggerFilterMuonsSrc, triggerfilter);
103  std::vector<reco::RecoChargedCandidateRef> recocandidates;
104  triggerfilter->getObjects(trigger::TriggerMuon, recocandidates);
105  if ((!recocandidates.empty())) {
106  double maxpt = 0.;
107  unsigned i_maxpt = 0;
108  for (unsigned i = 0; i < recocandidates.size(); ++i) {
109  double pt = recocandidates.at(i)->pt();
110  if (pt > maxpt) {
111  i_maxpt = i;
112  maxpt = pt;
113  }
114  track = dynamic_cast<const reco::Track*>(recocandidates.at(i_maxpt)->bestTrack());
115  }
116  }
117  } else {
119  iEvent.getByToken(trackToken, trackHandle);
120  if ((trackHandle.isValid()) && (!trackHandle->empty())) {
121  double maxpt = 0.;
122  unsigned i_maxpt = 0;
123  for (unsigned i = 0; i < trackHandle->size(); ++i) {
124  double pt = trackHandle->ptrAt(i)->pt();
125  if (pt > maxpt) {
126  i_maxpt = i;
127  maxpt = pt;
128  }
129  }
130  track = dynamic_cast<const reco::Track*>(&*trackHandle->ptrAt(i_maxpt));
131  }
132  }
133 
134  if (track) {
135  if (fUseBeamSpot || (fUseVertex && vertexAvailable)) {
136  vertexPoint.SetZ(vertexPoint.z() + track->dz(vertexPoint));
137  } else {
138  vertexPoint.SetZ(track->vz());
139  }
140  }
141  math::Error<3>::type noErrors;
142  reco::Vertex v(vertexPoint, noErrors);
143  vColl.push_back(v);
144 
145  // provide beamspot or primary vertex if no candidate found
146  //if(vColl.size()==0)
147  //{
148  // math::Error<3>::type noErrors;
149  // reco::Vertex v(vertexPoint, noErrors);
150  // vColl.push_back(v);
151  //}
152 
153  if (fVerbose) {
154  int ivtx = 0;
155  edm::LogInfo("PVDebugInfo") << "Vertices by VertexFromTrackProducer: \n";
156  for (reco::VertexCollection::const_iterator v = vColl.begin(); v != vColl.end(); ++v) {
157  edm::LogInfo("PVDebugInfo") << "\t"
158  << "recvtx " << ivtx++ << " x " << std::setw(6) << v->position().x() << " dx "
159  << std::setw(6) << v->xError() << " y " << std::setw(6) << v->position().y() << " dy "
160  << std::setw(6) << v->yError() << " z " << std::setw(6) << v->position().z() << " dz "
161  << std::setw(6) << v->zError() << " \n ";
162  }
163  }
164 
165  *result = vColl;
166  iEvent.put(std::move(result));
167 }
168 
171 
172  desc.add<bool>("isRecoCandidate", false)
173  ->setComment(
174  "If isRecoCandidate=True \"trackLabel\" is used and assumed to be collection of candidates.\nOtherwise it is "
175  "assumed that \"trackLabel\" is collection of tracks and is used when useTriggerFilterElectrons=False and "
176  "useTriggerFilterMuons=False");
177  desc.add<edm::InputTag>("trackLabel", edm::InputTag("hltL3MuonCandidates"))
178  ->setComment("Collection of tracks or candidates");
179  desc.add<bool>("useTriggerFilterElectrons", false)
180  ->setComment("Use leading electron passing \"triggerFilterElectronsSrc\" filter to determine z vertex position");
181  desc.add<edm::InputTag>("triggerFilterElectronsSrc",
182  edm::InputTag("hltEle20CaloIdVTCaloIsoTTrkIdTTrkIsoL1JetTrackIsoFilter"))
183  ->setComment("Name of electron filter");
184  desc.add<bool>("useTriggerFilterMuons", true)
185  ->setComment("Use leading muon passing \"triggerFilterMuonsSrc\" filter to determine z vertex position");
186  desc.add<edm::InputTag>("triggerFilterMuonsSrc", edm::InputTag("hltSingleMuIsoL3IsoFiltered15"))
187  ->setComment("Name of muon filter");
188  desc.add<bool>("useBeamSpot", true)->setComment("Use beam spot for x/y vertex position");
189  desc.add<edm::InputTag>("beamSpotLabel", edm::InputTag("hltOnlineBeamSpot"))->setComment("Beamspot collection");
190  desc.add<bool>("useVertex", true)
191  ->setComment("Use vertex for x/y vertex position (beam spot is used when PV does not exit)");
192  desc.add<edm::InputTag>("vertexLabel", edm::InputTag("hltPixelVertices"))->setComment("Vertex collection");
193 
194  desc.addUntracked<bool>("verbose", false)->setComment("Switch on/off verbosity");
195  descriptions.setComment(
196  "This module produces vertex with z-coordinate determined with the highest-Pt lepton track and x/y-coordinates "
197  "taken from BeamSpot/Vertex");
198  descriptions.add("hltVertexFromTrackProducer", desc);
199 }
200 
void getObjects(Vids &ids, VRphoton &refs) const
various physics-level getters:
std::vector< Vertex > VertexCollection
collection of Vertex objects
Definition: VertexFwd.h:9
ErrorD< N >::type type
Definition: Error.h:32
Log< level::Error, false > LogError
const edm::EDGetTokenT< reco::BeamSpot > beamSpotLabel
const edm::EDGetTokenT< edm::View< reco::RecoCandidate > > candidateToken
const edm::EDGetTokenT< trigger::TriggerFilterObjectWithRefs > triggerFilterElectronsSrc
int iEvent
Definition: GenABIO.cc:224
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
Log< level::Info, false > LogInfo
void setComment(std::string const &value)
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
void add(std::string const &label, ParameterSetDescription const &psetDescription)
bool isValid() const
Definition: HandleBase.h:70
const edm::EDGetTokenT< edm::View< reco::Track > > trackToken
fixed size matrix
HLT enums.
const edm::EDGetTokenT< trigger::TriggerFilterObjectWithRefs > triggerFilterMuonsSrc
VertexFromTrackProducer(const edm::ParameterSet &)
def move(src, dest)
Definition: eostools.py:511
void produce(edm::StreamID, edm::Event &, const edm::EventSetup &) const override
const edm::EDGetTokenT< edm::View< reco::Vertex > > vertexLabel
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)