87 LogWarning(
"PF_PU_AssoMapAlgos::GetInputCollections")
88 <<
"No Extra objects available in input file --> skipping reconstruction of displaced vertices !!" << endl;
109 std::pair<std::unique_ptr<TrackToVertexAssMap>, std::unique_ptr<VertexToTrackAssMap>>
116 int num_vertices =
vtxcollH->size();
118 vector<VertexRef> vtxColl_help;
122 for (
size_t idxTrack = 0; idxTrack < trkcollH->size(); ++idxTrack ) {
128 transtrk.
setES(iSetup);
135 int step = assocVtx.second;
146 track2vertex->insert( assocVtx.first, make_pair(trackref, quality) );
147 vertex2track->insert( trackref, make_pair(assocVtx.first, quality) );
164 std::unique_ptr<TrackToVertexAssMap>
174 std::unique_ptr<VertexToTrackAssMap>
184 unique_ptr<TrackToVertexAssMap>
204 for(
unsigned int trckcoll_ite=0; trckcoll_ite<trckcoll.size(); trckcoll_ite++){
206 trackref = trckcoll[trckcoll_ite].first;
207 int quality = trckcoll[trckcoll_ite].second;
209 if ( quality<=2 )
continue;
211 double man_pT = trackref->pt() - trackref->ptError();
212 if(man_pT>0.) ptsum+=man_pT*man_pT;
216 vertexptsumvector.push_back(make_pair(assomap_vertexref,ptsum));
220 while (!vertexptsumvector.empty()){
223 float highestpT = 0.;
224 int highestpT_index = 0;
226 for(
unsigned int vtxptsumvec_ite=0; vtxptsumvec_ite<vertexptsumvector.size(); vtxptsumvec_ite++){
228 if(vertexptsumvector[vtxptsumvec_ite].
second>highestpT){
230 vertexref_highestpT = vertexptsumvector[vtxptsumvec_ite].first;
231 highestpT = vertexptsumvector[vtxptsumvec_ite].second;
232 highestpT_index = vtxptsumvec_ite;
246 if(assomap_vertexref==vertexref_highestpT)
247 for(
unsigned int trckcoll_ite=0; trckcoll_ite<trckcoll.size(); trckcoll_ite++)
248 trackvertexassOutput->insert(assomap_vertexref,trckcoll[trckcoll_ite]);
252 vertexptsumvector.erase(vertexptsumvector.begin()+highestpT_index);
256 return trackvertexassOutput;
270 std::vector<reco::VertexRef>
275 output.reserve(vtxcollH->size());
276 auto const nVtx = vtxcollH->size();
277 for (
unsigned int i = 0;
i < nVtx; ++
i) output.emplace_back(vtxcollH,
i);
291 for(
unsigned int index_vtx=0; index_vtx<vtxcollV.size(); ++index_vtx){
293 VertexRef vertexref = vtxcollV.at(index_vtx);
295 if ( vertexref == toErase ){
296 vtxcollV.erase(vtxcollV.begin()+index_vtx);
313 double ztrack = trkref->vertex().z();
315 VertexRef foundVertexRef = vtxcollV.at(0);
320 for(
unsigned int index_vtx=0; index_vtx<vtxcollV.size(); ++index_vtx){
322 VertexRef vertexref = vtxcollV.at(index_vtx);
326 double z_distance = fabs(ztrack - vertexref->z());
328 double weightedDistance = z_distance-tWeight*
nTracks;
330 if(weightedDistance<dzmin) {
331 dzmin = weightedDistance;
332 foundVertexRef = vertexref;
337 return foundVertexRef;
349 VertexRef foundVertexRef = vtxcollV.at(0);
354 for(
unsigned int index_vtx=0; index_vtx<vtxcollV.size(); ++index_vtx){
356 VertexRef vertexref = vtxcollV.at(index_vtx);
364 distance = IpPair.second.value();
366 double weightedDistance = distance-tWeight*
nTracks;
368 if(weightedDistance<d3min) {
369 d3min = weightedDistance;
370 foundVertexRef = vertexref;
375 return foundVertexRef;
386 double bs_x = bsH->
x0();
387 double bs_y = bsH->
y0();
388 double bs_z = bsH->
z0();
390 double connVec_x = vtx_pos.x() - bs_x;
391 double connVec_y = vtx_pos.y() - bs_y;
392 double connVec_z = vtx_pos.z() - bs_z;
394 double connVec_r =
sqrt(connVec_x*connVec_x + connVec_y*connVec_y + connVec_z*connVec_z);
395 double connVec_theta = acos(connVec_z*1./connVec_r);
397 double connVec_eta = -1.*
log(
tan(connVec_theta*1./2.));
398 double connVec_phi = atan2(connVec_y,connVec_x);
400 return deltaR(vtx_mom.eta(),vtx_mom.phi(),connVec_eta,connVec_phi);
408 unique_ptr<ConversionCollection>
413 for (
unsigned int convcoll_idx=0; convcoll_idx<convCollH->size(); convcoll_idx++){
418 cleanedConvColl->push_back(*convref);
422 if( (convref->nTracks()==2) &&
423 (fabs(convref->pairInvariantMass())<=0.1) ){
425 cleanedConvColl->push_back(*convref);
431 return cleanedConvColl;
444 for(
unsigned int convcoll_ite=0; convcoll_ite<cleanedConvColl.size(); convcoll_ite++){
448 *gamma = cleanedConvColl.at(convcoll_ite);
474 Track photon(trackref->chi2(), trackref->ndof(), conv_pos, conv_mom, 0, trackref->covariance());
477 transpho.setBeamSpot(*bsH);
478 transpho.setES(iSetup);
488 unique_ptr<VertexCompositeCandidateCollection>
494 for (
unsigned int kscoll_idx=0; kscoll_idx<KshortsH->size(); kscoll_idx++){
499 cleanedKaonColl->push_back(*ksref);
507 GlobalError decayVertexError =
GlobalError(ksref->vertexCovariance(0,0), ksref->vertexCovariance(0,1), ksref->vertexCovariance(1,1), ksref->vertexCovariance(0,2), ksref->vertexCovariance(1,2), ksref->vertexCovariance(2,2));
510 ksref->momentum().y(),
511 ksref->momentum().z());
518 if ((ksref->vertex().rho()>=3.) &&
519 (ksref->vertexNormalizedChi2()<=3.) &&
520 (fabs(ksref->mass() -
kMass)<=0.01) &&
521 (kaon_significance>15.) &&
524 cleanedKaonColl->push_back(*ksref);
530 return cleanedKaonColl;
537 unique_ptr<VertexCompositeCandidateCollection>
543 for (
unsigned int lambdacoll_idx=0; lambdacoll_idx<LambdasH->size(); lambdacoll_idx++){
548 cleanedLambdaColl->push_back(*lambdaref);
556 GlobalError decayVertexError =
GlobalError(lambdaref->vertexCovariance(0,0), lambdaref->vertexCovariance(0,1), lambdaref->vertexCovariance(1,1), lambdaref->vertexCovariance(0,2), lambdaref->vertexCovariance(1,2), lambdaref->vertexCovariance(2,2));
559 lambdaref->momentum().y(),
560 lambdaref->momentum().z());
567 if ((lambdaref->vertex().rho()>=3.) &&
568 (lambdaref->vertexNormalizedChi2()<=3.) &&
569 (fabs(lambdaref->mass() -
lamMass)<=0.005) &&
570 (lambda_significance>15.) &&
573 cleanedLambdaColl->push_back(*lambdaref);
579 return cleanedLambdaColl;
591 for(VertexCompositeCandidateCollection::const_iterator iKS=cleanedKshort.begin(); iKS!=cleanedKshort.end(); iKS++){
598 if((trackref==dauTk1) || (trackref==dauTk2)){
608 for(VertexCompositeCandidateCollection::const_iterator iLambda=cleanedLambda.begin(); iLambda!=cleanedLambda.end(); iLambda++){
615 if((trackref==dauTk1) || (trackref==dauTk2)){
643 Track V0(trackref->chi2(), trackref->ndof(), dec_pos, dec_mom, 0, trackref->covariance());
646 transV0.setBeamSpot(*bsH);
647 transV0.setES(iSetup);
658 unique_ptr<PFDisplacedVertexCollection>
664 for (PFDisplacedVertexCollection::const_iterator niref=NuclIntH->begin(); niref!=NuclIntH->end(); niref++){
667 if( (niref->isFake()) || !(niref->isNucl()) )
continue;
670 cleanedNIColl->push_back(*niref);
680 niref->primaryMomentum().y(),
681 niref->primaryMomentum().z());
688 if ((niref->position().rho()>=3.) &&
689 (nuclint_significance>15.) &&
692 cleanedNIColl->push_back(*niref);
698 return cleanedNIColl;
710 for(PFDisplacedVertexCollection::const_iterator iDisplV=cleanedNI.begin(); iDisplV!=cleanedNI.end(); iDisplV++){
712 if(iDisplV->trackWeight(trackref)>1.e-5){
714 *displVtx = *iDisplV;
738 for(TrackCollection::const_iterator trkcoll_ite=refittedTracks.begin(); trkcoll_ite!=refittedTracks.end(); trkcoll_ite++){
746 if( VOAssociation->trackWeight(retrackbaseref) >= 1.e-5 ){
747 return VOAssociation;
752 transIncom.
setES(iSetup);
768 Track incom(trackref->chi2(), trackref->ndof(), ni_pos, ni_mom, 0, trackref->covariance());
771 transIncom.setBeamSpot(*bsH);
772 transIncom.setES(iSetup);
781 template<
typename TREF>
786 VertexRef bestvertexref = vtxcollV.at(0);
787 float bestweight = 0.;
790 for(
auto const& vertexref : vtxcollV){
793 float weight = vertexref->trackWeight(trackRef);
794 if(weight>bestweight){
796 bestvertexref = vertexref;
801 return bestvertexref;
818 if ( assocNum>0 )
goto finalStep;
824 if ( foundVertex->trackWeight(trackref) >= 1.e-5 ){
825 return make_pair( foundVertex, 0. );
840 return make_pair( foundVertex, 1. );
848 return make_pair( foundVertex, 1. );
858 return make_pair( foundVertex, 1. );
889 transtrk.
setES(iSetup);
899 foundVertex = vtxColl.at(0);
906 return make_pair( foundVertex, 2. );
925 if ( distance <=
tw_90 ) {
928 if ( distance <=
tw_70 ) {
931 if ( distance <=
tw_50 ) {
945 if ( distance <=
sec_70 ) {
948 if ( distance <=
sec_50 ) {
961 if ( assoc_ite == 1 ) {
964 if ( assoc_ite >= 2 ) {
967 if ( distance <=
fin_70 ) {
970 if ( distance <=
fin_50 ) {
const reco::Vertex & conversionVertex() const
returns the reco conversion vertex
edm::EDGetTokenT< reco::VertexCompositeCandidateCollection > LambdaCollectionToken_
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
reco::Vertex::Point convertPos(const GlobalPoint &p)
T getParameter(std::string const &) const
static std::unique_ptr< reco::VertexCompositeCandidateCollection > GetCleanedLambda(edm::Handle< reco::VertexCompositeCandidateCollection >, edm::Handle< reco::BeamSpot >, bool)
double z0() const
z coordinate
T getUntrackedParameter(std::string const &, T const &) const
std::vector< PFDisplacedVertex > PFDisplacedVertexCollection
collection of PFDisplacedVertex objects
std::vector< TrackQualityPair > TrackQualityPairVector
edm::ESHandle< MagneticField > bFieldH
edm::EDGetTokenT< reco::BeamSpot > token_BeamSpot_
const unsigned int nTracks(const reco::Vertex &sv)
std::vector< VertexCompositeCandidate > VertexCompositeCandidateCollection
collection of Candidate objects
static std::unique_ptr< reco::PFDisplacedVertexCollection > GetCleanedNI(edm::Handle< reco::PFDisplacedVertexCollection >, edm::Handle< reco::BeamSpot >, bool)
std::unique_ptr< TrackToVertexAssMap > SortAssociationMap(TrackToVertexAssMap *, edm::Handle< reco::TrackCollection >)
Covariance3DMatrix covariance3D() const
return only 3D position covariance matrix
const bool isTherePrimaryTracks() const
--—— Provide useful information --—— ///
const_iterator end() const
last iterator over the map (read only)
void setBeamSpot(const reco::BeamSpot &beamSpot)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
TrackBaseRef originalTrack(const Track &refTrack) const
static bool ComesFromNI(const reco::TrackRef, const reco::PFDisplacedVertexCollection &, reco::PFDisplacedVertex *)
static reco::VertexRef FindV0Vertex(const reco::TrackRef, const reco::VertexCompositeCandidate &, edm::ESHandle< MagneticField >, const edm::EventSetup &, edm::Handle< reco::BeamSpot >, const std::vector< reco::VertexRef > &, double)
static std::unique_ptr< reco::VertexCompositeCandidateCollection > GetCleanedKshort(edm::Handle< reco::VertexCompositeCandidateCollection >, edm::Handle< reco::BeamSpot >, bool)
int DefineQuality(int, int, double)
static reco::VertexRef TrackWeightAssociation(const TREF &, const std::vector< reco::VertexRef > &)
int input_MaxNumAssociations_
bool input_doReassociation_
reco::Vertex::Error convertError(const GlobalError &ge)
std::vector< Track > TrackCollection
collection of Tracks
GlobalErrorBase< double, ErrorMatrixTag > GlobalError
const bool isIncomingTrack(const reco::TrackBaseRef &originalTrack) const
Is primary or merged track.
std::vector< Vertex > VertexCollection
collection of Vertex objects
key_type key() const
Accessor for product key.
const std::vector< Track > & refittedTracks() const
Returns the container of refitted tracks.
std::unique_ptr< TrackToVertexAssMap > CreateTrackToVertexMap(edm::Handle< reco::TrackCollection >, const edm::EventSetup &)
std::unique_ptr< reco::PFDisplacedVertexCollection > cleanedNICollP
std::unique_ptr< reco::VertexCompositeCandidateCollection > cleanedLambdaCollP
const Point & position() const
position
std::pair< reco::VertexRef, int > VertexStepPair
std::vector< Conversion > ConversionCollection
collectin of Conversion objects
U second(std::pair< T, U > const &p)
VertexStepPair FindAssociation(const reco::TrackRef &, const std::vector< reco::VertexRef > &, edm::ESHandle< MagneticField >, const edm::EventSetup &, edm::Handle< reco::BeamSpot >, int)
Vector momentum() const final
spatial momentum vector
std::vector< VertexPtsumPair > VertexPtsumVector
Measurement1D distance(const GlobalPoint &vtx1Position, const GlobalError &vtx1PositionError, const GlobalPoint &vtx2Position, const GlobalError &vtx2PositionError) const override
static std::unique_ptr< reco::ConversionCollection > GetCleanedConversions(edm::Handle< reco::ConversionCollection >, edm::Handle< reco::BeamSpot >, bool)
const Point & vertex() const override
vertex position (overwritten by PF...)
PF_PU_AssoMapAlgos(const edm::ParameterSet &iConfig, edm::ConsumesCollector &&iC)
edm::Handle< reco::PFDisplacedVertexCollection > displVertexCollH
Tan< T >::type tan(const T &t)
virtual void GetInputCollections(edm::Event &, const edm::EventSetup &)
reco::TrackRef track() const override
reference to a track
std::pair< std::unique_ptr< TrackToVertexAssMap >, std::unique_ptr< VertexToTrackAssMap > > createMappings(edm::Handle< reco::TrackCollection > trkcollH, const edm::EventSetup &iSetup)
static bool ComesFromV0Decay(const reco::TrackRef, const reco::VertexCompositeCandidateCollection &, const reco::VertexCompositeCandidateCollection &, reco::VertexCompositeCandidate *)
edm::AssociationMap< edm::OneToManyWithQuality< reco::VertexCollection, reco::TrackCollection, int > > TrackToVertexAssMap
static reco::VertexRef FindConversionVertex(const reco::TrackRef, const reco::Conversion &, edm::ESHandle< MagneticField >, const edm::EventSetup &, edm::Handle< reco::BeamSpot >, const std::vector< reco::VertexRef > &, double)
static double dR(const math::XYZPoint &, const math::XYZVector &, edm::Handle< reco::BeamSpot >)
edm::EDGetTokenT< reco::PFDisplacedVertexCollection > NIVertexCollectionToken_
void setES(const edm::EventSetup &es)
edm::Handle< reco::VertexCollection > vtxcollH
bool ignoremissingpfcollection_
math::XYZTLorentzVectorF refittedPair4Momentum() const
Conversion track pair 4-momentum from the tracks refitted with vertex constraint. ...
static reco::VertexRef FindClosest3D(reco::TransientTrack, const std::vector< reco::VertexRef > &, double tWeight=0.)
std::vector< reco::VertexRef > CreateVertexVector(edm::Handle< reco::VertexCollection >)
int input_FinalAssociation_
std::unique_ptr< VertexToTrackAssMap > CreateVertexToTrackMap(edm::Handle< reco::TrackCollection >, const edm::EventSetup &)
edm::EDGetTokenT< reco::VertexCompositeCandidateCollection > KshortCollectionToken_
XYZVectorD XYZVector
spatial vector with cartesian internal representation
XYZPointD XYZPoint
point in space with cartesian internal representation
const math::XYZTLorentzVector primaryMomentum(std::string massHypo="PI", bool useRefitted=true, double mass=0.0) const
Momentum of primary or merged track calculated with a mass hypothesis.
edm::Ref< TrackCollection > TrackRef
persistent reference to a Track
edm::EDGetTokenT< reco::ConversionCollection > ConversionsCollectionToken_
edm::Handle< reco::VertexCompositeCandidateCollection > vertCompCandCollLambdaH
edm::EDGetTokenT< reco::VertexCollection > token_VertexCollection_
std::unique_ptr< reco::VertexCompositeCandidateCollection > cleanedKshortCollP
void EraseVertex(std::vector< reco::VertexRef > &, reco::VertexRef)
static bool ComesFromConversion(const reco::TrackRef, const reco::ConversionCollection &, reco::Conversion *)
double y0() const
y coordinate
const Point & position() const
position
edm::Handle< reco::BeamSpot > beamspotH
const_iterator begin() const
first iterator over the map (read only)
edm::Handle< reco::ConversionCollection > convCollH
const bool isThereMergedTracks() const
If a merged track was identified.
static reco::VertexRef FindClosestZ(const reco::TrackRef, const std::vector< reco::VertexRef > &, double tWeight=0.)
edm::AssociationMap< edm::OneToManyWithQuality< reco::TrackCollection, reco::VertexCollection, int > > VertexToTrackAssMap
edm::Handle< reco::VertexCompositeCandidateCollection > vertCompCandCollKshortH
static reco::VertexRef FindNIVertex(const reco::TrackRef, const reco::PFDisplacedVertex &, edm::ESHandle< MagneticField >, const edm::EventSetup &, edm::Handle< reco::BeamSpot >, const std::vector< reco::VertexRef > &, double)
double x0() const
x coordinate
std::unique_ptr< reco::ConversionCollection > cleanedConvCollP