137 edm::LogPrint(
"PFRecoTauChHProducer") <<
"<PFRecoTauChargedHadronProducer::produce>:";
143 builder.setup(evt, es);
152 size_t nElements = jets->
size();
153 for (
size_t i = 0;
i < nElements; ++
i) {
158 std::unique_ptr<reco::PFJetChargedHadronAssociation> pfJetChargedHadronAssociations;
160 if (!pfJets.
empty()) {
161 pfJetChargedHadronAssociations = std::make_unique<reco::PFJetChargedHadronAssociation>(
reco::JetRefBaseProd(jets));
163 pfJetChargedHadronAssociations = std::make_unique<reco::PFJetChargedHadronAssociation>();
167 for (
const auto& pfJet : pfJets) {
177 for (
auto const& builder : builders_) {
181 edm::LogPrint(
"PFRecoTauChHProducer") <<
"result of builder = " << builder.name() <<
":";
184 uncleanedChargedHadrons.transfer(uncleanedChargedHadrons.end(),
result);
187 <<
"Exception caught in builder plugin " << builder.name() <<
", rethrowing" << std::endl;
196 std::vector<reco::PFRecoTauChargedHadron> cleanedChargedHadrons;
199 typedef std::pair<double, double> etaPhiPair;
200 std::list<etaPhiPair> tracksInCleanCollection;
201 std::set<reco::CandidatePtr> neutralPFCandsInCleanCollection;
203 while (!uncleanedChargedHadrons.empty()) {
205 std::unique_ptr<reco::PFRecoTauChargedHadron> nextChargedHadron(uncleanedChargedHadrons.pop_front().release());
207 edm::LogPrint(
"PFRecoTauChHProducer") <<
"processing nextChargedHadron:";
208 edm::LogPrint(
"PFRecoTauChHProducer") << (*nextChargedHadron);
216 if (nextChargedHadron->getChargedPFCandidate().isNonnull()) {
218 dynamic_cast<const reco::PFCandidate*
>(&*nextChargedHadron->getChargedPFCandidate());
223 track = chargedPFCand->
muonRef()->innerTrack().
get();
225 track = chargedPFCand->
muonRef()->globalTrack().
get();
227 track = chargedPFCand->
muonRef()->outerTrack().
get();
232 if (nextChargedHadron->getTrack().isNonnull() && !
track) {
233 track = nextChargedHadron->getTrack().get();
237 bool isTrack_overlap =
false;
239 double track_eta = track->
eta();
240 double track_phi = track->
phi();
241 for (std::list<etaPhiPair>::const_iterator trackInCleanCollection = tracksInCleanCollection.begin();
242 trackInCleanCollection != tracksInCleanCollection.end();
243 ++trackInCleanCollection) {
244 double dR =
deltaR(track_eta, track_phi, trackInCleanCollection->first, trackInCleanCollection->second);
246 isTrack_overlap =
true;
250 edm::LogPrint(
"PFRecoTauChHProducer") <<
"isTrack_overlap = " << isTrack_overlap;
256 bool isNeutralPFCand_overlap =
false;
258 for (std::set<reco::CandidatePtr>::const_iterator neutralPFCandInCleanCollection =
259 neutralPFCandsInCleanCollection.begin();
260 neutralPFCandInCleanCollection != neutralPFCandsInCleanCollection.end();
261 ++neutralPFCandInCleanCollection) {
262 if ((*neutralPFCandInCleanCollection) == nextChargedHadron->getChargedPFCandidate())
263 isNeutralPFCand_overlap =
true;
267 edm::LogPrint(
"PFRecoTauChHProducer") <<
"isNeutralPFCand_overlap = " << isNeutralPFCand_overlap;
269 if (isNeutralPFCand_overlap)
273 std::vector<reco::CandidatePtr> uniqueNeutralPFCands;
274 std::set_difference(nextChargedHadron->getNeutralPFCandidates().begin(),
275 nextChargedHadron->getNeutralPFCandidates().end(),
276 neutralPFCandsInCleanCollection.begin(),
277 neutralPFCandsInCleanCollection.end(),
278 std::back_inserter(uniqueNeutralPFCands));
280 if (uniqueNeutralPFCands.size() ==
281 nextChargedHadron->getNeutralPFCandidates()
284 tracksInCleanCollection.push_back(std::make_pair(track->
eta(), track->
phi()));
285 neutralPFCandsInCleanCollection.insert(nextChargedHadron->getNeutralPFCandidates().begin(),
286 nextChargedHadron->getNeutralPFCandidates().end());
288 edm::LogPrint(
"PFRecoTauChHProducer") <<
"--> adding nextChargedHadron to output collection.";
290 cleanedChargedHadrons.push_back(*nextChargedHadron);
292 nextChargedHadron->neutralPFCandidates_.clear();
293 for (
auto const& neutralPFCand : uniqueNeutralPFCands) {
294 nextChargedHadron->neutralPFCandidates_.push_back(neutralPFCand);
300 ChargedHadronList::iterator insertionPoint = std::lower_bound(
301 uncleanedChargedHadrons.begin(), uncleanedChargedHadrons.end(), *nextChargedHadron, *
predicate_);
303 edm::LogPrint(
"PFRecoTauChHProducer") <<
"--> removing non-unique neutral PFCandidates and reinserting " 304 "nextChargedHadron in uncleaned collection.";
306 uncleanedChargedHadrons.insert(insertionPoint,
std::move(nextChargedHadron));
311 print(cleanedChargedHadrons);
315 pfJetChargedHadronAssociations->setValue(pfJet.key(), cleanedChargedHadrons);
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
edm::EDGetTokenT< reco::JetView > Jets_token
bool isNonnull() const
Checks for non-null.
bool getByToken(EDGetToken token, Handle< PROD > &result) const
double phi() const
azimuthal angle of momentum vector
reco::TrackRef trackRef() const
RefToBase< value_type > refAt(size_type i) const
edm::RefToBaseProd< reco::Jet > JetRefBaseProd
void print(const T &chargedHadrons)
double eta() const
pseudorapidity of momentum vector
boost::ptr_vector< reco::PFRecoTauChargedHadron > ChargedHadronVector
Abs< T >::type abs(const T &t)
T const * get() const
Returns C++ pointer to the item.
reco::MuonRef muonRef() const
std::unique_ptr< ChargedHadronPredicate > predicate_
boost::ptr_list< reco::PFRecoTauChargedHadron > ChargedHadronList
Particle reconstructed by the particle flow algorithm.
reco::GsfTrackRef gsfTrackRef() const
void push_back(const RefToBase< T > &)
void setChargedHadronP4(reco::PFRecoTauChargedHadron &chargedHadron, double scaleFactor_neutralPFCands=1.0)
std::unique_ptr< StringCutObjectSelector< reco::PFRecoTauChargedHadron > > outputSelector_