CMS 3D CMS Logo

HIBestVertexProducer.cc
Go to the documentation of this file.
2 
9 
11 
12 #include <algorithm>
13 #include <iostream>
14 using namespace std;
15 using namespace edm;
16 
17 /*****************************************************************************/
19  : theConfig(ps),
20  theBeamSpotTag(consumes<reco::BeamSpot>(ps.getParameter<edm::InputTag>("beamSpotLabel"))),
21  theMedianVertexCollection(
22  consumes<reco::VertexCollection>(ps.getParameter<edm::InputTag>("medianVertexCollection"))),
23  theAdaptiveVertexCollection(
24  consumes<reco::VertexCollection>(ps.getParameter<edm::InputTag>("adaptiveVertexCollection"))),
25  theUseFinalAdaptiveVertexCollection(ps.getParameter<bool>("useFinalAdaptiveVertexCollection")) {
28  consumes<reco::VertexCollection>(ps.getParameter<edm::InputTag>("finalAdaptiveVertexCollection"));
29  }
30  produces<reco::VertexCollection>();
31 }
32 
33 /*****************************************************************************/
35 
36 /*****************************************************************************/
39  desc.add<InputTag>("beamSpotLabel", edm::InputTag("offlineBeamSpot"));
40  desc.add<InputTag>("adaptiveVertexCollection", edm::InputTag("hiBestAdaptiveVertex"));
41  desc.add<InputTag>("medianVertexCollection", edm::InputTag("hiPixelMedianVertex"));
42  desc.add<bool>("useFinalAdaptiveVertexCollection", false);
43  desc.add<InputTag>("finalAdaptiveVertexCollection", edm::InputTag("hiBestOfflinePrimaryVertex"));
44 
45  descriptions.add("hiSelectedPixelVertex", desc);
46 }
47 
48 /*****************************************************************************/
50 
51 /*****************************************************************************/
53  // 1. use best adaptive vertex preferentially
54  // 2. use median vertex in case where adaptive algorithm failed
55  // 3. use beamspot if netither vertexing method succeeds
56 
57  // New vertex collection
58  auto newVertexCollection = std::make_unique<reco::VertexCollection>();
59 
60  //** Get precise adaptive vertex **/
62  ev.getByToken(theAdaptiveVertexCollection, vc1);
63  const reco::VertexCollection* vertices1 = vc1.product();
64 
65  if (vertices1->empty())
66  LogError("HeavyIonVertexing") << "adaptive vertex collection is empty!" << endl;
67 
68  //** Final vertex collection if needed **//
69  const double maxZError = 3.0; //any vtx with error > this number is considered no good
70  bool hasFinalVertex = false;
73  ev.getByToken(theFinalAdaptiveVertexCollection, vc0);
74  const reco::VertexCollection* vertices0 = vc0.product();
75  if (vertices0->empty())
76  LogInfo("HeavyIonVertexing") << "final adaptive vertex collection is empty!" << endl;
77 
78  //if using final vertex and has a good vertex, use it
79  if (vertices0->begin()->zError() < maxZError) {
80  hasFinalVertex = true;
81  auto const& vertex0 = vertices0->front();
82  newVertexCollection->push_back(vertex0);
83  LogInfo("HeavyIonVertexing") << "adaptive vertex:\n vz = (" << vertex0.x() << ", " << vertex0.y() << ", "
84  << vertex0.z() << ")"
85  << "\n error = (" << vertex0.xError() << ", " << vertex0.yError() << ", "
86  << vertex0.zError() << ")" << endl;
87  }
88  }
89 
90  //otherwise use the pixel track adaptive vertex if it is good
91  if (!hasFinalVertex) {
92  if (vertices1->begin()->zError() < maxZError) {
93  reco::VertexCollection::const_iterator vertex1 = vertices1->begin();
94  newVertexCollection->push_back(*vertex1);
95 
96  LogInfo("HeavyIonVertexing") << "adaptive vertex:\n vz = (" << vertex1->x() << ", " << vertex1->y() << ", "
97  << vertex1->z() << ")"
98  << "\n error = (" << vertex1->xError() << ", " << vertex1->yError() << ", "
99  << vertex1->zError() << ")" << endl;
100  } else {
101  //** Get fast median vertex **/
103  ev.getByToken(theMedianVertexCollection, vc2);
104  const reco::VertexCollection* vertices2 = vc2.product();
105 
106  //** Get beam spot position and error **/
108  edm::Handle<reco::BeamSpot> beamSpotHandle;
109  ev.getByToken(theBeamSpotTag, beamSpotHandle);
110 
111  if (beamSpotHandle.isValid())
112  beamSpot = *beamSpotHandle;
113  else
114  LogError("HeavyIonVertexing") << "no beamspot found " << endl;
115 
116  if (!vertices2->empty()) {
117  reco::VertexCollection::const_iterator vertex2 = vertices2->begin();
119  err(0, 0) = pow(beamSpot.BeamWidthX(), 2);
120  err(1, 1) = pow(beamSpot.BeamWidthY(), 2);
121  err(2, 2) = pow(vertex2->zError(), 2);
122  reco::Vertex newVertex(reco::Vertex::Point(beamSpot.x0(), beamSpot.y0(), vertex2->z()), err, 0, 1, 1);
123  newVertexCollection->push_back(newVertex);
124 
125  LogInfo("HeavyIonVertexing") << "median vertex + beamspot: \n position = (" << newVertex.x() << ", "
126  << newVertex.y() << ", " << newVertex.z() << ")"
127  << "\n error = (" << newVertex.xError() << ", " << newVertex.yError() << ", "
128  << newVertex.zError() << ")" << endl;
129 
130  } else {
132  err(0, 0) = pow(beamSpot.BeamWidthX(), 2);
133  err(1, 1) = pow(beamSpot.BeamWidthY(), 2);
134  err(2, 2) = pow(beamSpot.sigmaZ(), 2);
135  reco::Vertex newVertex(beamSpot.position(), err, 0, 0, 1);
136  newVertexCollection->push_back(newVertex);
137 
138  LogInfo("HeavyIonVertexing") << "beam spot: \n position = (" << newVertex.x() << ", " << newVertex.y() << ", "
139  << newVertex.z() << ")"
140  << "\n error = (" << newVertex.xError() << ", " << newVertex.yError() << ", "
141  << newVertex.zError() << ")" << endl;
142  }
143  }
144  }
145 
146  // put new vertex collection into event
147  ev.put(std::move(newVertexCollection));
148 }
ConfigurationDescriptions.h
HIBestVertexProducer.h
electrons_cff.bool
bool
Definition: electrons_cff.py:372
edm::ParameterSetDescription::add
ParameterDescriptionBase * add(U const &iLabel, T const &value)
Definition: ParameterSetDescription.h:95
pwdgSkimBPark_cfi.beamSpot
beamSpot
Definition: pwdgSkimBPark_cfi.py:5
MessageLogger.h
edm::Handle::product
T const * product() const
Definition: Handle.h:70
ESHandle.h
align::BeamSpot
Definition: StructureType.h:89
edm
HLT enums.
Definition: AlignableModifier.h:19
reco::Vertex::Error
math::Error< dimension >::type Error
covariance error matrix (3x3)
Definition: Vertex.h:44
reco::VertexCollection
std::vector< Vertex > VertexCollection
collection of Vertex objects
Definition: VertexFwd.h:9
edm::LogInfo
Definition: MessageLogger.h:254
edm::ParameterSetDescription
Definition: ParameterSetDescription.h:52
HIBestVertexProducer::beginJob
void beginJob()
Definition: HIBestVertexProducer.cc:49
reco
fixed size matrix
Definition: AlignmentAlgorithmBase.h:45
HIBestVertexProducer::theMedianVertexCollection
edm::EDGetTokenT< reco::VertexCollection > theMedianVertexCollection
Definition: HIBestVertexProducer.h:27
edm::Handle< reco::VertexCollection >
HIBestVertexProducer::HIBestVertexProducer
HIBestVertexProducer(const edm::ParameterSet &ps)
Definition: HIBestVertexProducer.cc:18
HIBestVertexProducer::theAdaptiveVertexCollection
edm::EDGetTokenT< reco::VertexCollection > theAdaptiveVertexCollection
Definition: HIBestVertexProducer.h:28
HIBestVertexProducer::theUseFinalAdaptiveVertexCollection
bool theUseFinalAdaptiveVertexCollection
Definition: HIBestVertexProducer.h:30
MakerMacros.h
edm::ConfigurationDescriptions::add
void add(std::string const &label, ParameterSetDescription const &psetDescription)
Definition: ConfigurationDescriptions.cc:57
reco::BeamSpot
Definition: BeamSpot.h:21
ParameterSetDescription.h
edm::ConfigurationDescriptions
Definition: ConfigurationDescriptions.h:28
HLT_2018_cff.InputTag
InputTag
Definition: HLT_2018_cff.py:79016
edm::ParameterSet
Definition: ParameterSet.h:36
HIBestVertexProducer::fillDescriptions
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
Definition: HIBestVertexProducer.cc:37
edm::LogError
Definition: MessageLogger.h:183
Event.h
runTheMatrix.err
err
Definition: runTheMatrix.py:288
HIBestVertexProducer::theBeamSpotTag
edm::EDGetTokenT< reco::BeamSpot > theBeamSpotTag
Definition: HIBestVertexProducer.h:26
edm::EventSetup
Definition: EventSetup.h:57
HIBestVertexProducer::produce
void produce(edm::Event &ev, const edm::EventSetup &es) override
Definition: HIBestVertexProducer.cc:52
edm::ParameterSet::getParameter
T getParameter(std::string const &) const
reco::Vertex::Point
math::XYZPoint Point
point in the space
Definition: Vertex.h:40
eostools.move
def move(src, dest)
Definition: eostools.py:511
std
Definition: JetResolutionObject.h:76
Frameworkfwd.h
ev
bool ev
Definition: Hydjet2Hadronizer.cc:95
HIBestVertexProducer::theFinalAdaptiveVertexCollection
edm::EDGetTokenT< reco::VertexCollection > theFinalAdaptiveVertexCollection
Definition: HIBestVertexProducer.h:29
funct::pow
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:30
HIBestVertexProducer::~HIBestVertexProducer
~HIBestVertexProducer() override
Definition: HIBestVertexProducer.cc:34
edm::HandleBase::isValid
bool isValid() const
Definition: HandleBase.h:70
edm::Event
Definition: Event.h:73
edm::InputTag
Definition: InputTag.h:15
reco::Vertex
Definition: Vertex.h:35