Skip to content

Commit

Permalink
Merge pull request #24846 from guitargeek/PFProducer_emplace
Browse files Browse the repository at this point in the history
Avoid unneccessary copies in RecoParticleFlow__PFProducer with emplace
  • Loading branch information
cmsbuild committed Oct 15, 2018
2 parents 80ff701 + 034f525 commit 9b1f3a7
Show file tree
Hide file tree
Showing 5 changed files with 72 additions and 80 deletions.
32 changes: 14 additions & 18 deletions RecoParticleFlow/PFProducer/src/PFAlgo.cc
Expand Up @@ -1851,8 +1851,8 @@ void PFAlgo::processBlock( const reco::PFBlockRef& blockref,

// A temporary maps for ECAL satellite clusters
std::multimap<double,std::pair<unsigned,::math::XYZVector> > ecalSatellites;
std::pair<unsigned,::math::XYZVector> fakeSatellite = make_pair(iHcal,::math::XYZVector(0.,0.,0.));
ecalSatellites.insert( make_pair(-1., fakeSatellite) );
std::pair<unsigned,::math::XYZVector> fakeSatellite(iHcal,::math::XYZVector(0.,0.,0.));
ecalSatellites.emplace(-1., fakeSatellite);

std::multimap< unsigned, std::pair<double, unsigned> > associatedHOs;

Expand Down Expand Up @@ -2104,8 +2104,8 @@ void PFAlgo::processBlock( const reco::PFBlockRef& blockref,

if ( isPrimaryOrSecondary ) blowError = 1.;

std::pair<unsigned,bool> tkmuon = make_pair(iTrack,thisIsALooseMuon);
associatedTracks.insert( make_pair(-Dpt*blowError, tkmuon) );
std::pair<unsigned,bool> tkmuon(iTrack,thisIsALooseMuon);
associatedTracks.emplace(-Dpt*blowError, tkmuon);

// Also keep the total track momentum error for comparison with the calo energy
double Dp = trackRef->qoverpError()*trackMomentum*trackMomentum;
Expand Down Expand Up @@ -2167,21 +2167,18 @@ void PFAlgo::processBlock( const reco::PFBlockRef& blockref,
// PJ 1st-April-09 : To be done somewhere !!! (Had to comment it, but it is needed)
// currentChargedHadron.addElementInBlock( blockref, iEcal );

std::pair<unsigned,::math::XYZVector> satellite =
make_pair(iEcal,ecalEnergyCalibrated*photonDirection);
ecalSatellites.insert( make_pair(-1., satellite) );
std::pair<unsigned,::math::XYZVector> satellite(iEcal,ecalEnergyCalibrated*photonDirection);
ecalSatellites.emplace(-1., satellite);

} else { // Keep satellite clusters for later

std::pair<unsigned,::math::XYZVector> satellite =
make_pair(iEcal,ecalEnergyCalibrated*photonDirection);
ecalSatellites.insert( make_pair(dist, satellite) );
std::pair<unsigned,::math::XYZVector> satellite(iEcal,ecalEnergyCalibrated*photonDirection);
ecalSatellites.emplace(dist, satellite);

}

std::pair<double, unsigned> associatedEcal
= make_pair( distEcal, iEcal );
associatedEcals.insert( make_pair(iTrack, associatedEcal) );
std::pair<double, unsigned> associatedEcal( distEcal, iEcal );
associatedEcals.emplace(iTrack, associatedEcal);

} // End loop ecal associated to iTrack
} // end case: at least one ecal element associated to iTrack
Expand Down Expand Up @@ -2225,9 +2222,8 @@ void PFAlgo::processBlock( const reco::PFBlockRef& blockref,
totalHO += hoclusterref->energy();
active[iHO] = false;
// Keep track for later reference in the PFCandidate.
std::pair<double, unsigned> associatedHO
= make_pair( distHO, iHO );
associatedHOs.insert( make_pair(iTrack, associatedHO) );
std::pair<double, unsigned> associatedHO( distHO, iHO );
associatedHOs.emplace(iTrack, associatedHO);

} // End loop ho associated to iTrack
} // end case: at least one ho element associated to iTrack
Expand Down Expand Up @@ -2794,7 +2790,7 @@ void PFAlgo::processBlock( const reco::PFBlockRef& blockref,
// make only one merged photon if less than 2 ecal clusters
if ( ecalClusters.size()<=1 ) {
ecalClusters.clear();
ecalClusters.push_back(make_pair(maxiEcal, photonAtECAL));
ecalClusters.emplace_back(maxiEcal, photonAtECAL);
sumEcalClusters=sqrt(photonAtECAL.Mag2());
}
for(std::vector<std::pair<unsigned,::math::XYZVector> >::const_iterator pae = ecalClusters.begin(); pae != ecalClusters.end(); ++pae ) {
Expand All @@ -2815,7 +2811,7 @@ void PFAlgo::processBlock( const reco::PFBlockRef& blockref,
// make only one merged neutral hadron if less than 2 ecal clusters
if ( ecalClusters.size()<=1 ) {
ecalClusters.clear();
ecalClusters.push_back(make_pair(iHcal, hadronAtECAL));
ecalClusters.emplace_back(iHcal, hadronAtECAL);
sumEcalClusters=sqrt(hadronAtECAL.Mag2());
}
for(std::vector<std::pair<unsigned,::math::XYZVector> >::const_iterator pae = ecalClusters.begin(); pae != ecalClusters.end(); ++pae ) {
Expand Down
98 changes: 47 additions & 51 deletions RecoParticleFlow/PFProducer/src/PFEGammaAlgo.cc
Expand Up @@ -489,14 +489,14 @@ namespace {
bool addPFClusterToROSafe(const ClusterElement* cl,
PFEGammaAlgo::ProtoEGObject& RO) {
if( RO.ecalclusters.empty() ) {
RO.ecalclusters.push_back(std::make_pair(cl,true));
RO.ecalclusters.emplace_back(cl,true);
return true;
} else {
const PFLayer::Layer clayer = cl->clusterRef()->layer();
const PFLayer::Layer blayer =
RO.ecalclusters.back().first->clusterRef()->layer();
if( clayer == blayer ) {
RO.ecalclusters.push_back(std::make_pair(cl,true));
RO.ecalclusters.emplace_back(cl,true);
return true;
}
}
Expand Down Expand Up @@ -753,7 +753,7 @@ void PFEGammaAlgo::buildAndRefineEGObjects(const pfEGHelpers::HeavyObjectCache*
pfelement.clusterRef()->flags() & reco::CaloCluster::badHcalMarker) continue; // skip also dead area markers for now
const size_t itype = (size_t)pfelement.type();
if( itype >= _splayedblock.size() ) _splayedblock.resize(itype+1);
_splayedblock[itype].push_back(std::make_pair(&pfelement,true));
_splayedblock[itype].emplace_back(&pfelement,true);
}

// show the result of splaying the tree if it's really *really* needed
Expand Down Expand Up @@ -941,7 +941,7 @@ initializeProtoCands(std::list<PFEGammaAlgo::ProtoEGObject>& egobjs) {
// into the protocand
element.second = false;
fromGSF.parentBlock = _currentblock;
fromGSF.primaryGSFs.push_back(std::make_pair(elementAsGSF,true));
fromGSF.primaryGSFs.emplace_back(elementAsGSF,true);
// add the directly matched brem tangents
for( auto& brem : _splayedblock[PFBlockElement::BREM] ) {
float dist = _currentblock->dist(elementAsGSF->index(),
Expand All @@ -951,9 +951,9 @@ initializeProtoCands(std::list<PFEGammaAlgo::ProtoEGObject>& egobjs) {
if( dist == 0.001f ) {
const PFBremElement* eAsBrem =
docast(const PFBremElement*,brem.first);
fromGSF.brems.push_back(std::make_pair(eAsBrem,true));
fromGSF.localMap.push_back( ElementMap::value_type(eAsBrem,elementAsGSF) );
fromGSF.localMap.push_back( ElementMap::value_type(elementAsGSF,eAsBrem) );
fromGSF.brems.emplace_back(eAsBrem,true);
fromGSF.localMap.emplace_back(eAsBrem,elementAsGSF);
fromGSF.localMap.emplace_back(elementAsGSF,eAsBrem);
brem.second = false;
}
}
Expand Down Expand Up @@ -1104,7 +1104,7 @@ initializeProtoCands(std::list<PFEGammaAlgo::ProtoEGObject>& egobjs) {
safePFClusters.end() ) continue;

//add cluster
ecalclusters.push_back(std::make_pair(elemascluster,true));
ecalclusters.emplace_back(elemascluster,true);
//mark cluster as used
ecalitr->second = false;

Expand Down Expand Up @@ -1135,7 +1135,7 @@ initializeProtoCands(std::list<PFEGammaAlgo::ProtoEGObject>& egobjs) {
safePFClusters.end() ) continue;

//add cluster
ecalclusters.push_back(std::make_pair(elemascluster,true));
ecalclusters.emplace_back(elemascluster,true);
//mark cluster as used
hgcalitr->second = false;
} // loop over ecal elements
Expand Down Expand Up @@ -1166,7 +1166,7 @@ initializeProtoCands(std::list<PFEGammaAlgo::ProtoEGObject>& egobjs) {
ClusterMap::mapped_type& eslist) {
if( ecalclus->clusterRef()->layer() == PFLayer::ECAL_BARREL ) return 0;
edm::Ptr<reco::PFCluster> clusptr = refToPtr(ecalclus->clusterRef());
EEtoPSElement ecalkey = std::make_pair(clusptr.key(),clusptr);
EEtoPSElement ecalkey(clusptr.key(),clusptr);
auto assc_ps = std::equal_range(eetops_->cbegin(),
eetops_->cend(),
ecalkey,
Expand All @@ -1177,7 +1177,7 @@ initializeProtoCands(std::list<PFEGammaAlgo::ProtoEGObject>& egobjs) {
if( pscl->second == temp ) {
const ClusterElement* pstemp =
docast(const ClusterElement*,ps1.first);
eslist.push_back( PFClusterFlaggedElement(pstemp,true) );
eslist.emplace_back(pstemp,true);
}
}
}
Expand All @@ -1187,7 +1187,7 @@ initializeProtoCands(std::list<PFEGammaAlgo::ProtoEGObject>& egobjs) {
if( pscl->second == temp ) {
const ClusterElement* pstemp =
docast(const ClusterElement*,ps2.first);
eslist.push_back( PFClusterFlaggedElement(pstemp,true) );
eslist.emplace_back(pstemp,true);
}
}
}
Expand Down Expand Up @@ -1348,8 +1348,8 @@ initializeProtoCands(std::list<PFEGammaAlgo::ProtoEGObject>& egobjs) {
if( PFTrackAlgoTools::isGoodForEGMPrimary(trackref->algo()) && nexhits == 0 && fromprimaryvertex ) {
closestECAL.second = false;
} else { // otherwise associate the cluster and KF track
_recoveredlinks.push_back( ElementMap::value_type(closestECAL.first,kftrack.first) );
_recoveredlinks.push_back( ElementMap::value_type(kftrack.first,closestECAL.first) );
_recoveredlinks.emplace_back(closestECAL.first,kftrack.first);
_recoveredlinks.emplace_back(kftrack.first,closestECAL.first);
}


Expand Down Expand Up @@ -1480,14 +1480,14 @@ linkRefinableObjectGSFTracksToKFs(ProtoEGObject& RO) {
if( isPrimaryTrack(*elemaskf,*seedtk) &&
!elemaskf->trackType(convType) ) {
kft->second = false;
RO.primaryKFs.push_back(std::make_pair(elemaskf,true));
RO.localMap.push_back( ElementMap::value_type(seedtk,elemaskf) );
RO.localMap.push_back( ElementMap::value_type(elemaskf,seedtk) );
RO.primaryKFs.emplace_back(elemaskf,true);
RO.localMap.emplace_back(seedtk,elemaskf);
RO.localMap.emplace_back(elemaskf,seedtk);
} else if ( elemaskf->trackType(convType) ) {
kft->second = false;
RO.secondaryKFs.push_back(std::make_pair(elemaskf,true));
RO.localMap.push_back( ElementMap::value_type(seedtk,elemaskf) );
RO.localMap.push_back( ElementMap::value_type(elemaskf,seedtk) );
RO.secondaryKFs.emplace_back(elemaskf,true);
RO.localMap.emplace_back(seedtk,elemaskf);
RO.localMap.emplace_back(elemaskf,seedtk);
}
}// loop on closest KFs not closer to other GSFs
} // loop on GSF primaries on RO
Expand Down Expand Up @@ -1520,9 +1520,9 @@ linkRefinableObjectPrimaryKFsToSecondaryKFs(ProtoEGObject& RO) {
// associated secondary tracks
if( elemaskf->trackType(convType) ) {
kft->second = false;
RO.secondaryKFs.push_back(std::make_pair(elemaskf,true));
RO.localMap.push_back( ElementMap::value_type(primkf,elemaskf) );
RO.localMap.push_back( ElementMap::value_type(elemaskf,primkf) );
RO.secondaryKFs.emplace_back(elemaskf,true);
RO.localMap.emplace_back(primkf,elemaskf);
RO.localMap.emplace_back(elemaskf,primkf);
}
}// loop on closest KFs not closer to other KFs
} // loop on KF primaries on RO
Expand Down Expand Up @@ -1561,8 +1561,8 @@ linkRefinableObjectPrimaryGSFTrackToECAL(ProtoEGObject& RO) {
<< " at ECAL surface!" << std::endl
<< *elemascluster << std::endl;

RO.localMap.push_back(ElementMap::value_type(primgsf.first,temp.first));
RO.localMap.push_back(ElementMap::value_type(temp.first,primgsf.first));
RO.localMap.emplace_back(primgsf.first,temp.first);
RO.localMap.emplace_back(temp.first,primgsf.first);
}
// look outside the SC for the ecal cluster
for( auto ecal = ECALbegin; ecal != notmatched_blk; ++ecal ) {
Expand All @@ -1574,8 +1574,8 @@ linkRefinableObjectPrimaryGSFTrackToECAL(ProtoEGObject& RO) {
<< *elemascluster << std::endl;
if( addPFClusterToROSafe(elemascluster,RO) ) {
attachPSClusters(elemascluster,RO.ecal2ps[elemascluster]);
RO.localMap.push_back(ElementMap::value_type(primgsf.first,elemascluster));
RO.localMap.push_back(ElementMap::value_type(elemascluster,primgsf.first));
RO.localMap.emplace_back(primgsf.first,elemascluster);
RO.localMap.emplace_back(elemascluster,primgsf.first);
ecal->second = false;
}
}
Expand All @@ -1600,8 +1600,8 @@ linkRefinableObjectPrimaryGSFTrackToHCAL(ProtoEGObject& RO) {
<< "Found an HCAL cluster associated to GSF extrapolation"
<< std::endl;
RO.hcalClusters.push_back(temp);
RO.localMap.push_back( ElementMap::value_type(primgsf.first,temp.first) );
RO.localMap.push_back( ElementMap::value_type(temp.first,primgsf.first) );
RO.localMap.emplace_back(primgsf.first,temp.first);
RO.localMap.emplace_back(temp.first,primgsf.first);
hcal->second = false;
}
}
Expand Down Expand Up @@ -1643,10 +1643,8 @@ PFEGammaAlgo::linkKFTrackToECAL(const KFFlaggedElement& kfflagged,
<< "Found a cluster already in RO by KF extrapolation"
<< " at ECAL surface!" << std::endl
<< *elemascluster << std::endl;
RO.localMap.push_back(ElementMap::value_type(elemascluster,
kfflagged.first));
RO.localMap.push_back(ElementMap::value_type(kfflagged.first,
elemascluster));
RO.localMap.emplace_back(elemascluster,kfflagged.first);
RO.localMap.emplace_back(kfflagged.first,elemascluster);
}
//get the ECAL elements not used and not closer to another KF
auto notmatched_blk = std::partition(ECALbegin,ECALend,kfTrackToECALs);
Expand All @@ -1663,10 +1661,8 @@ PFEGammaAlgo::linkKFTrackToECAL(const KFFlaggedElement& kfflagged,
<< "Found a cluster not in RO by KF extrapolation"
<< " at ECAL surface!" << std::endl
<< *elemascluster << std::endl;
RO.localMap.push_back(ElementMap::value_type(elemascluster,
kfflagged.first));
RO.localMap.push_back( ElementMap::value_type(kfflagged.first,
elemascluster));
RO.localMap.emplace_back(elemascluster,kfflagged.first);
RO.localMap.emplace_back(kfflagged.first,elemascluster);
}
}
}
Expand Down Expand Up @@ -1704,8 +1700,8 @@ linkRefinableObjectBremTangentsToECAL(ProtoEGObject& RO) {
LOGDRESSED("PFEGammaAlgo::linkBremToECAL()")
<< "Found a cluster already in SC linked to brem extrapolation"
<< " at ECAL surface!" << std::endl;
RO.localMap.push_back( ElementMap::value_type(ecal->first,bremflagged.first) );
RO.localMap.push_back( ElementMap::value_type(bremflagged.first,ecal->first) );
RO.localMap.emplace_back(ecal->first,bremflagged.first);
RO.localMap.emplace_back(bremflagged.first,ecal->first);
}
}
// grab new clusters from the block (ensured to not be late brem)
Expand All @@ -1729,8 +1725,8 @@ linkRefinableObjectBremTangentsToECAL(ProtoEGObject& RO) {
if( addPFClusterToROSafe(elemasclus,RO) ) {
attachPSClusters(elemasclus,RO.ecal2ps[elemasclus]);

RO.localMap.push_back( ElementMap::value_type(ecal->first,bremflagged.first) );
RO.localMap.push_back( ElementMap::value_type(bremflagged.first,ecal->first) );
RO.localMap.emplace_back(ecal->first,bremflagged.first);
RO.localMap.emplace_back(bremflagged.first,ecal->first);
ecal->second = false;
LOGDRESSED("PFEGammaAlgo::linkBremToECAL()")
<< "Found a cluster not already associated by brem extrapolation"
Expand Down Expand Up @@ -1765,9 +1761,9 @@ linkRefinableObjectConvSecondaryKFsToSecondaryKFs(ProtoEGObject& RO) {
for( auto kf = KFbegin; kf != notmatched; ++kf ) {
const reco::PFBlockElementTrack* elemaskf =
docast(const reco::PFBlockElementTrack*,kf->first);
RO.secondaryKFs.push_back( std::make_pair(elemaskf,true) );
RO.localMap.push_back( ElementMap::value_type(secKFs[idx].first,kf->first) );
RO.localMap.push_back( ElementMap::value_type(kf->first,secKFs[idx].first) );
RO.secondaryKFs.emplace_back(elemaskf,true);
RO.localMap.emplace_back(secKFs[idx].first,kf->first);
RO.localMap.emplace_back(kf->first,secKFs[idx].first);
kf->second = false;
}
}
Expand All @@ -1789,9 +1785,9 @@ linkRefinableObjectECALToSingleLegConv(const pfEGHelpers::HeavyObjectCache* hoc,
for( auto kf = KFbegin; kf != notconvkf; ++kf ) {
const reco::PFBlockElementTrack* elemaskf =
docast(const reco::PFBlockElementTrack*,kf->first);
RO.secondaryKFs.push_back( std::make_pair(elemaskf,true) );
RO.localMap.push_back( ElementMap::value_type(ecal.first,elemaskf) );
RO.localMap.push_back( ElementMap::value_type(elemaskf,ecal.first) );
RO.secondaryKFs.emplace_back(elemaskf,true);
RO.localMap.emplace_back(ecal.first,elemaskf);
RO.localMap.emplace_back(elemaskf,ecal.first);
kf->second = false;
}
// go through non-conv-identified kfs and check MVA to add conversions
Expand All @@ -1802,12 +1798,12 @@ linkRefinableObjectECALToSingleLegConv(const pfEGHelpers::HeavyObjectCache* hoc,
if(mvaval > cfg_.mvaConvCut) {
const reco::PFBlockElementTrack* elemaskf =
docast(const reco::PFBlockElementTrack*,kf->first);
RO.secondaryKFs.push_back( std::make_pair(elemaskf,true) );
RO.localMap.push_back( ElementMap::value_type(ecal.first,elemaskf) );
RO.localMap.push_back( ElementMap::value_type(elemaskf,ecal.first) );
RO.secondaryKFs.emplace_back(elemaskf,true);
RO.localMap.emplace_back(ecal.first,elemaskf);
RO.localMap.emplace_back(elemaskf,ecal.first);
kf->second = false;

RO.singleLegConversionMvaMap.insert(std::make_pair(elemaskf, mvaval));
RO.singleLegConversionMvaMap.emplace(elemaskf, mvaval);
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions RecoParticleFlow/PFProducer/src/PFElectronAlgo.cc
Expand Up @@ -287,7 +287,7 @@ bool PFElectronAlgo::SetLinks(const reco::PFBlockRef& blockRef,
&& nexhits == 0 && trackIsFromPrimaryVertex) {
localactive[ecalKf_index] = false;
} else {
fifthStepKfTrack_.push_back(make_pair(ecalKf_index,trackIs[iEle]));
fifthStepKfTrack_.emplace_back(ecalKf_index,trackIs[iEle]);
}
}
}
Expand Down Expand Up @@ -721,7 +721,7 @@ bool PFElectronAlgo::SetLinks(const reco::PFBlockRef& blockRef,
<<", " << clusterRef->position().phi() << endl;

GsfElemIndex.push_back(ecalConvElems.begin()->second);
convGsfTrack_.push_back(make_pair(ecalConvElems.begin()->second,gsfIs[iConv]));
convGsfTrack_.emplace_back(ecalConvElems.begin()->second,gsfIs[iConv]);
localactive[ecalConvElems.begin()->second] = false;

}
Expand Down

0 comments on commit 9b1f3a7

Please sign in to comment.