1 #ifndef CommonTools_RecoAlgos_PrimaryVertexSorter_ 2 #define CommonTools_RecoAlgos_PrimaryVertexSorter_ 29 template <
class ParticlesCollection>
87 template <
class ParticlesCollection>
91 tokenCandidates_(consumes<ParticlesCollection>(iConfig.getParameter<
edm::InputTag>(
"particles"))),
105 using namespace reco;
108 produces< CandToVertex> (
"original");
109 produces< CandToVertexQuality> (
"original");
110 produces< VertexScore> (
"original");
113 produces< reco::VertexCollection> ();
114 produces< CandToVertex> ();
115 produces< CandToVertexQuality> ();
116 produces< VertexScore> ();
121 produces< PFCollection> (
"originalPileUp");
123 produces< PFCollection> (
"PileUp");
128 produces< PFCollection> (
"originalNoPileUp");
130 produces< PFCollection> (
"NoPileUp");
141 template <
class ParticlesCollection>
146 using namespace reco;
170 trackTimeTag = trackTimeTagHandle.
product();
171 trackTimeResoTag = trackTimeResoTagHandle.
product();
175 std::vector<int> pfToPVVector;
176 std::vector<PrimaryVertexAssignment::Quality> pfToPVQualityVector;
178 std::vector< std::vector<int> > pvToPFVector(vertices->size());
179 std::vector< std::vector<const reco::Candidate *> > pvToCandVector(vertices->size());
180 std::vector< std::vector<PrimaryVertexAssignment::Quality> > pvToPFQualityVector(vertices->size());
181 std::vector<float> vertexScoreOriginal(vertices->size());
182 std::vector<float> vertexScore(vertices->size());
184 for(
auto const &
pf : particles) {
185 std::pair<int,PrimaryVertexAssignment::Quality> vtxWithQuality =
runAlgo(*vertices,
pf,trackTimeTag,trackTimeResoTag,*jets,*builder);
186 pfToPVVector.push_back(vtxWithQuality.first);
187 pfToPVQualityVector.push_back(vtxWithQuality.second);
191 for(
size_t i = 0;
i < pfToPVVector.size();
i++)
193 auto pv = pfToPVVector[
i];
194 auto qual = pfToPVQualityVector[
i];
196 pvToPFVector[
pv].push_back(
i);
200 pvToCandVector[
pv].push_back( &particles[
i] );
201 pvToPFQualityVector[
pv].push_back(qual);
206 std::multimap<float,int> scores;
207 for(
unsigned int i=0;
i<vertices->size();
i++){
209 vertexScoreOriginal[
i]=
s;
210 scores.insert(std::pair<float,int>(-s,i));
216 for(
auto const &
idx : scores)
219 vertexScore[newIdx]=-
idx.first;
229 unique_ptr< CandToVertex> pfCandToOriginalVertexOutput(
new CandToVertex(vertices) );
230 unique_ptr< CandToVertexQuality> pfCandToOriginalVertexQualityOutput(
new CandToVertexQuality() );
234 cand2VertexFiller.
insert(particlesHandle,pfToPVVector.begin(),pfToPVVector.end());
235 cand2VertexQualityFiller.
insert(particlesHandle,pfToPVQualityVector.begin(),pfToPVQualityVector.end());
237 cand2VertexFiller.
fill();
238 cand2VertexQualityFiller.
fill();
239 iEvent.
put(
std::move(pfCandToOriginalVertexOutput) ,
"original");
240 iEvent.
put(
std::move(pfCandToOriginalVertexQualityOutput) ,
"original");
242 unique_ptr< VertexScore> vertexScoreOriginalOutput(
new VertexScore );
244 vertexScoreOriginalFiller.
insert(vertices,vertexScoreOriginal.begin(),vertexScoreOriginal.end());
245 vertexScoreOriginalFiller.
fill();
246 iEvent.
put(
std::move(vertexScoreOriginalOutput) ,
"original");
251 std::vector<int> pfToSortedPVVector;
253 for(
size_t i=0;
i<pfToPVVector.size();
i++) {
254 pfToSortedPVVector.push_back(
oldToNew[pfToPVVector[
i]]);
259 for(
size_t i=0;
i<vertices->size();
i++){
260 sortedVerticesOutput->push_back((*vertices)[
newToOld[
i]]);
263 unique_ptr< CandToVertex> pfCandToVertexOutput(
new CandToVertex(oh) );
268 cand2VertexFiller.
insert(particlesHandle,pfToSortedPVVector.begin(),pfToSortedPVVector.end());
269 cand2VertexQualityFiller.
insert(particlesHandle,pfToPVQualityVector.begin(),pfToPVQualityVector.end());
271 cand2VertexFiller.
fill();
272 cand2VertexQualityFiller.
fill();
276 unique_ptr< VertexScore> vertexScoreOutput(
new VertexScore );
278 vertexScoreFiller.
insert(oh,vertexScore.begin(),vertexScore.end());
279 vertexScoreFiller.
fill();
286 unique_ptr< PFCollection > pfCollectionNOPUOriginalOutput(
new PFCollection );
287 unique_ptr< PFCollection > pfCollectionNOPUOutput(
new PFCollection );
288 unique_ptr< PFCollection > pfCollectionPUOriginalOutput(
new PFCollection );
289 unique_ptr< PFCollection > pfCollectionPUOutput(
new PFCollection );
291 for(
size_t i=0;
i<particles.size();
i++) {
292 auto pv = pfToPVVector[
i];
293 auto qual = pfToPVQualityVector[
i];
298 pfCollectionNOPUOutput->push_back(particles[
i]);
302 pfCollectionPUOutput->push_back(particles[i]);
306 pfCollectionNOPUOriginalOutput->push_back(particles[i]);
310 pfCollectionPUOriginalOutput->push_back(particles[i]);
347 std::pair<int,PrimaryVertexAssignment::Quality>
355 std::pair<int,PrimaryVertexAssignment::Quality>
T getParameter(std::string const &) const
void doConsumesForTiming(const edm::ParameterSet &iConfig)
edm::Association< reco::VertexCollection > CandToVertex
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
PrimaryVertexSorting sortingAlgo_
void produce(edm::Event &, const edm::EventSetup &) override
bool getByToken(EDGetToken token, Handle< PROD > &result) const
bool produceOriginalMapping_
ParameterSet const & getParameterSet(ParameterSetID const &id)
bool produceSortedVertices_
void insert(const H &h, I begin, I end)
std::vector< Vertex > VertexCollection
collection of Vertex objects
edm::EDGetTokenT< PFCollection > tokenCandidates_
Candidates to be analyzed.
Container::value_type value_type
ParticlesCollection PFCollection
std::pair< int, PrimaryVertexAssignment::Quality > chargedHadronVertex(const reco::VertexCollection &vertices, const reco::TrackRef &trackRef, const reco::Track *track, float trackTime, float trackTimeResolution, const edm::View< reco::Candidate > &jets, const TransientTrackBuilder &builder) const
bool needsProductsForTiming()
edm::EDGetTokenT< edm::ValueMap< float > > tokenTrackTimeTag_
edm::ValueMap< float > VertexScore
T const * product() const
PrimaryVertexAssignment assignmentAlgo_
std::pair< int, PrimaryVertexAssignment::Quality > runAlgo(const reco::VertexCollection &vertices, const typename ParticlesCollection::value_type &pf, const edm::ValueMap< float > *trackTimeTag, const edm::ValueMap< float > *trackTimeResoTag, const edm::View< reco::Candidate > &jets, const TransientTrackBuilder &builder)
float score(const reco::Vertex &pv, const std::vector< const reco::Candidate * > &candidates, bool useMet) const
edm::ValueMap< int > CandToVertexQuality
Particle reconstructed by the particle flow algorithm.
edm::EDGetTokenT< edm::ValueMap< float > > tokenTrackTimeResoTag_
edm::EDGetTokenT< reco::VertexCollection > tokenVertices_
vertices
~PrimaryVertexSorter() override
PrimaryVertexSorter(const edm::ParameterSet &)
edm::EDGetTokenT< edm::View< reco::Candidate > > tokenJets_