139 if (recoBeamSpotHandle.
isValid()) {
140 beamSpot = *recoBeamSpotHandle;
142 edm::LogError(
"UnusableBeamSpot") <<
"No beam spot available from EventSetup";
147 if ((beamVertexState.error().cxx() <= 0.) || (beamVertexState.error().cyy() <= 0.) ||
148 (beamVertexState.error().czz() <= 0.)) {
150 edm::LogError(
"UnusableBeamSpot") <<
"Beamspot with invalid errors " << beamVertexState.error().matrix();
161 std::vector<reco::TransientTrack> t_tks;
168 t_tks = (*theB).build(tks, beamSpot, *(trackTimesH.
product()), *(trackTimeResosH.
product()));
170 t_tks = (*theB).build(tks, beamSpot);
173 std::cout <<
"RecoVertex/PrimaryVertexProducer" 174 <<
"Found: " << t_tks.size() <<
" reconstructed tracks" 185 std::cout <<
" clustering returned " << clusters.size() <<
" clusters from " << seltks.size()
186 <<
" selected tracks" << std::endl;
191 auto result = std::make_unique<reco::VertexCollection>();
194 std::vector<TransientVertex>
pvs;
195 for (std::vector<std::vector<reco::TransientTrack> >::const_iterator iclus = clusters.begin();
196 iclus != clusters.end();
201 double meantime = 0.;
204 for (
const auto& tk : *iclus) {
205 const double time = tk.timeExt();
206 const double err = tk.dtErrorExt();
207 const double inverr = err > 0. ? 1.0 / err : 0.;
208 const double w = inverr * inverr;
210 sumwt2 += w * time *
time;
213 meantime = sumwt / sumw;
214 double sumsq = sumwt2 - sumwt * sumwt / sumw;
215 double chisq = iclus->size() > 1 ? sumsq / double(iclus->size() - 1) : sumsq /
double(iclus->size());
216 vartime = chisq / sumw;
220 if (
algorithm->useBeamConstraint && validBS && ((*iclus).size() > 1)) {
221 v =
algorithm->fitter->vertex(*iclus, beamSpot);
231 }
else if (!(
algorithm->useBeamConstraint) && ((*iclus).size() > 1)) {
252 std::cout <<
" cluster size = " << (*iclus).size() << std::endl;
254 std::cout <<
"Invalid fitted vertex, cluster size=" << (*iclus).size() << std::endl;
259 (!validBS || (*(
algorithm->vertexSelector))(
v, beamVertexState)))
264 std::cout <<
"PrimaryVertexProducerAlgorithm::vertices candidates =" << pvs.size() << std::endl;
267 if (clusters.size() > 2 && clusters.size() > 2 * pvs.size())
269 <<
"more than half of candidate vertices lost " << pvs.size() <<
' ' << clusters.size();
271 if (pvs.empty() && seltks.size() > 5)
273 <<
"no vertex found with " << seltks.size() <<
" tracks and " << clusters.size() <<
" vertex-candidates";
276 if (pvs.size() > 1) {
281 for (std::vector<TransientVertex>::const_iterator iv = pvs.begin(); iv != pvs.end(); iv++) {
288 if ((bse.cxx() <= 0.) || (bse.cyy() <= 0.) || (bse.czz() <= 0.)) {
295 std::cout <<
"RecoVertex/PrimaryVertexProducer: " 296 <<
"Beamspot with invalid errors " << bse.matrix() << std::endl;
297 std::cout <<
"Will put Vertex derived from dummy-fake BeamSpot into Event.\n";
302 std::cout <<
"RecoVertex/PrimaryVertexProducer: " 303 <<
" will put Vertex derived from BeamSpot into Event.\n";
310 for (reco::VertexCollection::const_iterator v = vColl.begin(); v != vColl.end(); ++
v) {
311 std::cout <<
"recvtx " << ivtx++ <<
"#trk " << std::setw(3) << v->
tracksSize() <<
" chi2 " << std::setw(4)
312 << v->
chi2() <<
" ndof " << std::setw(3) << v->
ndof() <<
" x " << std::setw(6) << v->
position().x()
313 <<
" dx " << std::setw(6) << v->
xError() <<
" y " << std::setw(6) << v->
position().y() <<
" dy " 314 << std::setw(6) << v->
yError() <<
" z " << std::setw(6) << v->
position().z() <<
" dz " << std::setw(6)
317 std::cout <<
" t " << std::setw(6) << v->
t() <<
" dt " << std::setw(6) << v->
tError();
GlobalError positionError() const
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
edm::EDGetTokenT< reco::BeamSpot > bsToken
virtual std::vector< std::vector< reco::TransientTrack > > clusterize(const std::vector< reco::TransientTrack > &tracks) const =0
std::vector< algo > algorithms
bool getByToken(EDGetToken token, Handle< PROD > &result) const
double zError() const
error on z
float totalChiSquared() const
edm::EDGetTokenT< reco::TrackCollection > trkToken
TrackClusterizerInZ * theTrackClusterizer
std::vector< Vertex > VertexCollection
collection of Vertex objects
const Point & position() const
position
edm::EDGetTokenT< edm::ValueMap< float > > trkTimesToken
const AlgebraicSymMatrix44 & matrix4D() const
std::vector< reco::TransientTrack > const & originalTracks() const
edm::EDGetTokenT< edm::ValueMap< float > > trkTimeResosToken
float degreesOfFreedom() const
GlobalPoint position() const
double chi2() const
chi-squares
TrackFilterForPVFindingBase * theTrackFilter
double xError() const
error on x
T const * product() const
virtual std::vector< reco::TransientTrack > select(const std::vector< reco::TransientTrack > &tracks) const =0
ROOT::Math::SMatrix< double, 3, 3, ROOT::Math::MatRepSym< double, 3 > > AlgebraicSymMatrix33
const Point & position() const
position
Covariance3DMatrix rotatedCovariance3D() const
double yError() const
error on y
double tError() const
error on t
size_t tracksSize() const
number of tracks
double t() const
t coordinate