![]() |
![]() |
Public Member Functions | |
InclusiveVertexFinder (const edm::ParameterSet ¶ms) | |
virtual void | produce (edm::Event &event, const edm::EventSetup &es) |
Private Member Functions | |
std::pair< std::vector < reco::TransientTrack > , GlobalPoint > | nearTracks (const reco::TransientTrack &seed, const std::vector< reco::TransientTrack > &tracks, const reco::Vertex &primaryVertex) const |
bool | trackFilter (const reco::TrackRef &track) const |
Private Attributes | |
edm::InputTag | beamSpotCollection |
std::auto_ptr < TracksClusteringFromDisplacedSeed > | clusterizer |
double | maxLIP |
unsigned int | maxNTracks |
unsigned int | minHits |
double | minPt |
edm::InputTag | primaryVertexCollection |
edm::InputTag | trackCollection |
double | vertexMinAngleCosine |
double | vertexMinDLen2DSig |
double | vertexMinDLenSig |
std::auto_ptr < VertexReconstructor > | vtxReco |
Definition at line 33 of file InclusiveVertexFinder.cc.
InclusiveVertexFinder::InclusiveVertexFinder | ( | const edm::ParameterSet & | params | ) |
Definition at line 59 of file InclusiveVertexFinder.cc.
: beamSpotCollection(params.getParameter<edm::InputTag>("beamSpot")), primaryVertexCollection(params.getParameter<edm::InputTag>("primaryVertices")), trackCollection(params.getParameter<edm::InputTag>("tracks")), minHits(params.getParameter<unsigned int>("minHits")), maxNTracks(params.getParameter<unsigned int>("maxNTracks")), maxLIP(params.getParameter<double>("maximumLongitudinalImpactParameter")), minPt(params.getParameter<double>("minPt")), //0.8 vertexMinAngleCosine(params.getParameter<double>("vertexMinAngleCosine")), //0.98 vertexMinDLen2DSig(params.getParameter<double>("vertexMinDLen2DSig")), //2.5 vertexMinDLenSig(params.getParameter<double>("vertexMinDLenSig")), //0.5 vtxReco(new ConfigurableVertexReconstructor(params.getParameter<edm::ParameterSet>("vertexReco"))), clusterizer(new TracksClusteringFromDisplacedSeed(params.getParameter<edm::ParameterSet>("clusterizer"))) { produces<reco::VertexCollection>(); //produces<reco::VertexCollection>("multi"); }
std::pair< std::vector< reco::TransientTrack >, GlobalPoint > TracksClusteringFromDisplacedSeed::nearTracks | ( | const reco::TransientTrack & | seed, |
const std::vector< reco::TransientTrack > & | tracks, | ||
const reco::Vertex & | primaryVertex | ||
) | const [private] |
Definition at line 18 of file TracksClusteringFromDisplacedSeed.cc.
References IPTools::absoluteImpactParameter3D(), TwoTrackMinimumDistance::calculate(), TrajectoryStateOnSurface::cartesianError(), TracksClusteringFromDisplacedSeed::clusterMaxDistance, TracksClusteringFromDisplacedSeed::clusterMaxSignificance, TracksClusteringFromDisplacedSeed::clusterMinAngleCosine, TracksClusteringFromDisplacedSeed::clusterScale, gather_cfg::cout, CommonMethods::cp(), TwoTrackMinimumDistance::crossingPoint(), VertexDistance3D::distance(), TwoTrackMinimumDistance::distance(), TrajectoryStateOnSurface::globalDirection(), reco::TransientTrack::impactPointState(), m, mag(), TwoTrackMinimumDistance::points(), reco::Vertex::position(), CartesianTrajectoryError::position(), query::result, Measurement1D::significance(), mathSSE::sqrt(), groupFilesInBlocks::tt, csvLumiCalc::unit, Vector3DBase< T, FrameTag >::unit(), w(), PV3DBase< T, PVType, FrameType >::x(), PV3DBase< T, PVType, FrameType >::y(), and PV3DBase< T, PVType, FrameType >::z().
{ VertexDistance3D distanceComputer; GlobalPoint pv(primaryVertex.position().x(),primaryVertex.position().y(),primaryVertex.position().z()); std::vector<reco::TransientTrack> result; TwoTrackMinimumDistance dist; GlobalPoint seedingPoint; float sumWeights=0; std::pair<bool,Measurement1D> ipSeed = IPTools::absoluteImpactParameter3D(seed,primaryVertex); float pvDistance = ipSeed.second.value(); // float densityFactor = 2./sqrt(20.*tracks.size()); // assuming all tracks being in 2 narrow jets of cone 0.3 float densityFactor = 2./sqrt(20.*80); // assuming 80 tracks being in 2 narrow jets of cone 0.3 for(std::vector<reco::TransientTrack>::const_iterator tt = tracks.begin();tt!=tracks.end(); ++tt ) { if(*tt==seed) continue; std::pair<bool,Measurement1D> ip = IPTools::absoluteImpactParameter3D(*tt,primaryVertex); if(dist.calculate(tt->impactPointState(),seed.impactPointState())) { GlobalPoint ttPoint = dist.points().first; GlobalError ttPointErr = tt->impactPointState().cartesianError().position(); GlobalPoint seedPosition = dist.points().second; GlobalError seedPositionErr = seed.impactPointState().cartesianError().position(); Measurement1D m = distanceComputer.distance(VertexState(seedPosition,seedPositionErr), VertexState(ttPoint, ttPointErr)); GlobalPoint cp(dist.crossingPoint()); float distanceFromPV = (dist.points().second-pv).mag(); float distance = dist.distance(); GlobalVector trackDir2D(tt->impactPointState().globalDirection().x(),tt->impactPointState().globalDirection().y(),0.); GlobalVector seedDir2D(seed.impactPointState().globalDirection().x(),seed.impactPointState().globalDirection().y(),0.); //SK:UNUSED// float dotprodTrackSeed2D = trackDir2D.unit().dot(seedDir2D.unit()); float dotprodTrack = (dist.points().first-pv).unit().dot(tt->impactPointState().globalDirection().unit()); float dotprodSeed = (dist.points().second-pv).unit().dot(seed.impactPointState().globalDirection().unit()); float w = distanceFromPV*distanceFromPV/(pvDistance*distance); bool selected = (m.significance() < clusterMaxSignificance && dotprodSeed > clusterMinAngleCosine && //Angles between PV-PCAonSeed vectors and seed directions dotprodTrack > clusterMinAngleCosine && //Angles between PV-PCAonTrack vectors and track directions // dotprodTrackSeed2D > clusterMinAngleCosine && //Angle between track and seed // distance*clusterScale*tracks.size() < (distanceFromPV+pvDistance)*(distanceFromPV+pvDistance)/pvDistance && // cut scaling with track density distance*clusterScale < densityFactor*distanceFromPV && // cut scaling with track density distance < clusterMaxDistance); // absolute distance cut #ifdef VTXDEBUG std::cout << tt->trackBaseRef().key() << " : " << (selected?"+":" ")<< " " << m.significance() << " < " << clusterMaxSignificance << " && " << dotprodSeed << " > " << clusterMinAngleCosine << " && " << dotprodTrack << " > " << clusterMinAngleCosine << " && " << dotprodTrackSeed2D << " > " << clusterMinAngleCosine << " && " << distance*clusterScale << " < " << densityFactor*distanceFromPV << " crossingtoPV: " << distanceFromPV << " dis*scal " << distance*clusterScale << " < " << densityFactor*distanceFromPV << " dist: " << distance << " < " << clusterMaxDistance << std::endl; // cut scaling with track density #endif if(selected) { result.push_back(*tt); seedingPoint = GlobalPoint(cp.x()*w+seedingPoint.x(),cp.y()*w+seedingPoint.y(),cp.z()*w+seedingPoint.z()); sumWeights+=w; } } } seedingPoint = GlobalPoint(seedingPoint.x()/sumWeights,seedingPoint.y()/sumWeights,seedingPoint.z()/sumWeights); return std::pair<std::vector<reco::TransientTrack>,GlobalPoint>(result,seedingPoint); }
void InclusiveVertexFinder::produce | ( | edm::Event & | event, |
const edm::EventSetup & | es | ||
) | [virtual] |
Implements edm::EDProducer.
Definition at line 89 of file InclusiveVertexFinder.cc.
References abs, SiPixelRawToDigiRegional_cfi::beamSpot, beamSpotCollection, clusterizer, gather_cfg::cout, dir, Vector3DBase< T, FrameTag >::dot(), Measurement1D::error(), edm::EventSetup::get(), i, TransientVertex::isValid(), j, maxLIP, maxNTracks, reco::Vertex::position(), primaryVertexCollection, dt_dqm_sourceclient_common_cff::reco, reco::TransientTrack::setBeamSpot(), Measurement1D::significance(), lumiQTWidget::t, trackCollection, trackFilter(), testEve_cfg::tracks, groupFilesInBlocks::tt, csvLumiCalc::unit, Vector3DBase< T, FrameTag >::unit(), Unknown, v, Measurement1D::value(), AdaptiveVertexFitter::vertex(), vertexMinAngleCosine, vertexMinDLen2DSig, vertexMinDLenSig, vtxReco, w(), reco::Vertex::xError(), reco::Vertex::yError(), and reco::Vertex::zError().
{ using namespace reco; double sigmacut = 3.0; double Tini = 256.; double ratio = 0.25; VertexDistance3D vdist; VertexDistanceXY vdist2d; MultiVertexFitter theMultiVertexFitter; AdaptiveVertexFitter theAdaptiveFitter( GeometricAnnealing(sigmacut, Tini, ratio), DefaultLinearizationPointFinder(), KalmanVertexUpdator<5>(), KalmanVertexTrackCompatibilityEstimator<5>(), KalmanVertexSmoother() ); edm::Handle<BeamSpot> beamSpot; event.getByLabel(beamSpotCollection, beamSpot); edm::Handle<VertexCollection> primaryVertices; event.getByLabel(primaryVertexCollection, primaryVertices); edm::Handle<TrackCollection> tracks; event.getByLabel(trackCollection, tracks); edm::ESHandle<TransientTrackBuilder> trackBuilder; es.get<TransientTrackRecord>().get("TransientTrackBuilder", trackBuilder); const reco::Vertex &pv = (*primaryVertices)[0]; std::vector<TransientTrack> tts; //Fill transient track vector for(TrackCollection::const_iterator track = tracks->begin(); track != tracks->end(); ++track) { TrackRef ref(tracks, track - tracks->begin()); if (!trackFilter(ref)) continue; if( std::abs(ref->dz(pv.position())) > maxLIP) continue; TransientTrack tt = trackBuilder->build(ref); tt.setBeamSpot(*beamSpot); tts.push_back(tt); } std::vector<TracksClusteringFromDisplacedSeed::Cluster> clusters = clusterizer->clusters(pv,tts); //Create BS object from PV to feed in the AVR BeamSpot::CovarianceMatrix cov; for(unsigned int i = 0; i < 7; i++) { for(unsigned int j = 0; j < 7; j++) { if (i < 3 && j < 3) cov(i, j) = pv.covariance(i, j); else cov(i, j) = 0.0; } } BeamSpot bs(pv.position(), 0.0, 0.0, 0.0, 0.0, cov, BeamSpot::Unknown); std::auto_ptr<VertexCollection> recoVertices(new VertexCollection); int i=0; #ifdef VTXDEBUG std::cout << "CLUSTERS " << clusters.size() << std::endl; #endif for(std::vector<TracksClusteringFromDisplacedSeed::Cluster>::iterator cluster = clusters.begin(); cluster != clusters.end(); ++cluster,++i) { if(cluster->tracks.size() == 0 || cluster->tracks.size() > maxNTracks ) continue; cluster->tracks.push_back(cluster->seedingTrack); //add the seed to the list of tracks to fit std::vector<TransientVertex> vertices; vertices = vtxReco->vertices(cluster->tracks, bs); // attempt with config given reconstructor TransientVertex singleFitVertex; singleFitVertex = theAdaptiveFitter.vertex(cluster->tracks,cluster->seedPoint); //attempt with direct fitting if(singleFitVertex.isValid()) vertices.push_back(singleFitVertex); for(std::vector<TransientVertex>::const_iterator v = vertices.begin(); v != vertices.end(); ++v) { // if(v->degreesOfFreedom() > 0.2) { Measurement1D dlen= vdist.distance(pv,*v); Measurement1D dlen2= vdist2d.distance(pv,*v); reco::Vertex vv(*v); #ifdef VTXDEBUG std::cout << "V chi2/n: " << v->normalisedChiSquared() << " ndof: " <<v->degreesOfFreedom() ; std::cout << " dlen: " << dlen.value() << " error: " << dlen.error() << " signif: " << dlen.significance(); std::cout << " dlen2: " << dlen2.value() << " error2: " << dlen2.error() << " signif2: " << dlen2.significance(); std::cout << " pos: " << vv.position() << " error: " <<vv.xError() << " " << vv.yError() << " " << vv.zError() << std::endl; #endif GlobalVector dir; std::vector<reco::TransientTrack> ts = v->originalTracks(); for(std::vector<reco::TransientTrack>::const_iterator i = ts.begin(); i != ts.end(); ++i) { reco::TrackRef t = i->trackBaseRef().castTo<reco::TrackRef>(); float w = v->trackWeight(*i); if (w > 0.5) dir+=i->impactPointState().globalDirection(); #ifdef VTXDEBUG std::cout << "\t[" << (*t).pt() << ": " << (*t).eta() << ", " << (*t).phi() << "], " << w << std::endl; #endif } GlobalPoint ppv(pv.position().x(),pv.position().y(),pv.position().z()); GlobalPoint sv((*v).position().x(),(*v).position().y(),(*v).position().z()); float vscal = dir.unit().dot((sv-ppv).unit()) ; // std::cout << "Vscal: " << vscal << std::endl; if(dlen.significance() > vertexMinDLenSig && vscal > vertexMinAngleCosine && v->normalisedChiSquared() < 10 && dlen2.significance() > vertexMinDLen2DSig) { recoVertices->push_back(*v); #ifdef VTXDEBUG std::cout << "ADDED" << std::endl; #endif } } } } #ifdef VTXDEBUG std::cout << "Final put " << recoVertices->size() << std::endl; #endif event.put(recoVertices); }
bool InclusiveVertexFinder::trackFilter | ( | const reco::TrackRef & | track | ) | const [private] |
Definition at line 78 of file InclusiveVertexFinder.cc.
References minHits, and minPt.
Referenced by produce().
Definition at line 43 of file InclusiveVertexFinder.cc.
Referenced by produce().
std::auto_ptr<TracksClusteringFromDisplacedSeed> InclusiveVertexFinder::clusterizer [private] |
Definition at line 55 of file InclusiveVertexFinder.cc.
Referenced by produce().
double InclusiveVertexFinder::maxLIP [private] |
Definition at line 48 of file InclusiveVertexFinder.cc.
Referenced by produce().
unsigned int InclusiveVertexFinder::maxNTracks [private] |
Definition at line 47 of file InclusiveVertexFinder.cc.
Referenced by produce().
unsigned int InclusiveVertexFinder::minHits [private] |
Definition at line 46 of file InclusiveVertexFinder.cc.
Referenced by trackFilter().
double InclusiveVertexFinder::minPt [private] |
Definition at line 49 of file InclusiveVertexFinder.cc.
Referenced by trackFilter().
Definition at line 44 of file InclusiveVertexFinder.cc.
Referenced by produce().
Definition at line 45 of file InclusiveVertexFinder.cc.
Referenced by produce().
double InclusiveVertexFinder::vertexMinAngleCosine [private] |
Definition at line 50 of file InclusiveVertexFinder.cc.
Referenced by produce().
double InclusiveVertexFinder::vertexMinDLen2DSig [private] |
Definition at line 51 of file InclusiveVertexFinder.cc.
Referenced by produce().
double InclusiveVertexFinder::vertexMinDLenSig [private] |
Definition at line 52 of file InclusiveVertexFinder.cc.
Referenced by produce().
std::auto_ptr<VertexReconstructor> InclusiveVertexFinder::vtxReco [private] |
Definition at line 54 of file InclusiveVertexFinder.cc.
Referenced by produce().