17 #include "boost/bind.hpp"
41 namespace reco {
namespace tau {
47 double factor =
sqrt(vec.energy()*vec.energy()-mass*mass)/vec.P();
49 vec.px()*factor,vec.py()*factor,vec.pz()*factor,vec.energy());
95 vertexAssociator_(pset.getParameter<edm::
ParameterSet>(
"qualityCuts"), std::
move(iC)),
110 qcuts_pset.addParameter<
double>(
"maxTrackChi2", 1.e+9);
111 qcuts_pset.addParameter<
double>(
"maxTransverseImpactParameter", 1.e+9);
112 qcuts_pset.addParameter<
double>(
"maxDeltaZ", 1.e+9);
113 qcuts_pset.addParameter<
double>(
"minTrackVertexWeight", -1.);
114 qcuts_pset.addParameter<
unsigned>(
"minTrackPixelHits", 0);
115 qcuts_pset.addParameter<
unsigned>(
"minTrackHits", 0);
129 if ( combineStrips_ ) {
150 std::set<size_t>& candIdsCurrentStrip,
bool& isCandAdded)
const
153 edm::LogPrint(
"RecoTauPiZeroStripPlugin2") <<
"<RecoTauPiZeroStripPlugin2::addCandsToStrip>:" ;
155 size_t numCands = cands.size();
156 for (
size_t candId = 0; candId < numCands; ++candId ) {
157 if ( (!candFlags[candId]) && candIdsCurrentStrip.find(candId) == candIdsCurrentStrip.end() ) {
162 edm::LogPrint(
"RecoTauPiZeroStripPlugin2") <<
"--> adding PFCand #" << candId <<
" (" << cand.
id() <<
":" << cand.
key() <<
"): Et = " << cand->et() <<
", eta = " << cand->eta() <<
", phi = " << cand->phi() ;
167 candIdsCurrentStrip.insert(candId);
175 for ( std::set<size_t>::const_iterator candId = candIds.begin();
176 candId != candIds.end(); ++candId ) {
177 candFlags[*candId] =
true;
193 edm::LogPrint(
"RecoTauPiZeroStripPlugin2") <<
"<RecoTauPiZeroStripPlugin2::operator()>:" ;
209 for ( PFCandPtrs::iterator cand = candsVector.
begin();
210 cand != candsVector.
end(); ++cand ) {
212 edm::LogPrint(
"RecoTauPiZeroStripPlugin2") <<
"PFGamma #" << idx <<
" (" << cand->id() <<
":" << cand->key() <<
"): Et = " << (*cand)->
et() <<
", eta = " << (*cand)->eta() <<
", phi = " << (*cand)->phi() ;
216 edm::LogPrint(
"RecoTauPiZeroStripPlugin2") <<
"--> assigning seedCandId = " << seedCands.size() ;
219 edm::LogPrint(
"RecoTauPiZeroStripPlugin2") <<
"track: Pt = " << candTrack->
pt() <<
" eta = " << candTrack->
eta() <<
", phi = " << candTrack->
phi() <<
", charge = " << candTrack->
charge() ;
222 <<
" chi2 = " << candTrack->
normalizedChi2() <<
", dPt/Pt = " << (candTrack->
ptError()/candTrack->
pt()) <<
")" ;
224 edm::LogPrint(
"RecoTauPiZeroStripPlugin2") <<
"ECAL Et: calibrated = " << (*cand)->ecalEnergy()*
sin((*cand)->theta()) <<
","
225 <<
" raw = " << (*cand)->rawEcalEnergy()*
sin((*cand)->theta()) ;
226 edm::LogPrint(
"RecoTauPiZeroStripPlugin2") <<
"HCAL Et: calibrated = " << (*cand)->hcalEnergy()*
sin((*cand)->theta()) <<
","
227 <<
" raw = " << (*cand)->rawHcalEnergy()*
sin((*cand)->theta()) ;
229 seedCands.push_back(*cand);
232 edm::LogPrint(
"RecoTauPiZeroStripPlugin2") <<
"--> assigning addCandId = " << addCands.size() ;
234 addCands.push_back(*cand);
239 std::vector<bool> seedCandFlags(seedCands.size());
240 std::vector<bool> addCandFlags(addCands.size());
242 std::set<size_t> seedCandIdsCurrentStrip;
243 std::set<size_t> addCandIdsCurrentStrip;
246 while ( idxSeed < seedCands.size() ) {
249 seedCandIdsCurrentStrip.clear();
250 addCandIdsCurrentStrip.clear();
253 strip->addDaughter(seedCands[idxSeed]);
254 seedCandIdsCurrentStrip.insert(idxSeed);
257 int stripBuildIteration = 0;
262 addCandsToStrip(*strip, seedCands, seedCandFlags, seedCandIdsCurrentStrip, isCandAdded);
264 addCandsToStrip(*strip, addCands, addCandFlags, addCandIdsCurrentStrip, isCandAdded);
268 ++stripBuildIteration;
272 if (
verbosity_ >= 2 )
edm::LogPrint(
"RecoTauPiZeroStripPlugin2") <<
"Building strip: Et = " << strip->et() <<
", eta = " << strip->eta() <<
", phi = " << strip->phi() ;
275 if ( strip->daughterPtr(0).isNonnull() ) strip->setVertex(strip->daughterPtr(0)->vertex());
276 output.push_back(strip);
282 if (
verbosity_ >= 2 )
edm::LogPrint(
"RecoTauPiZeroStripPlugin2") <<
"Discarding strip: Et = " << strip->et() <<
", eta = " << strip->eta() <<
", phi = " << strip->phi() ;
286 while ( idxSeed < seedCands.size() && seedCandFlags[idxSeed] ) {
295 output.sort(output.begin(), output.end(),
303 for ( PiZeroVector::const_iterator
first = output.begin();
305 for ( PiZeroVector::const_iterator
second =
first+1;
314 std::auto_ptr<RecoTauPiZero> combinedStrips(
322 first->daughterPtrVector()) {
323 combinedStrips->addDaughter(gamma);
326 second->daughterPtrVector()) {
327 combinedStrips->addDaughter(gamma);
330 if ( combinedStrips->daughterPtr(0).isNonnull() )
331 combinedStrips->setVertex(combinedStrips->daughterPtr(0)->vertex());
333 stripCombinations.push_back(combinedStrips);
338 output.transfer(output.end(), stripCombinations);
341 return output.release();
double minGammaEtStripSeed_
RecoTauPiZeroStripPlugin2(const edm::ParameterSet &, edm::ConsumesCollector &&iC)
T getParameter(std::string const &) const
InputIterator takeNElements(const InputIterator &begin, const InputIterator &end, size_t N)
bool isNonnull() const
Checks for non-null.
virtual double et() const
transverse energy
double normalizedChi2() const
chi-squared divided by n.d.o.f. (or chi-squared * 1e6 if n.d.o.f. is zero)
void markCandsInStrip(std::vector< bool > &candFlags, const std::set< size_t > &candIds)
virtual ~RecoTauPiZeroStripPlugin2()
Coll filterCandRefs(const Coll &refcoll, bool invert=false) const
Filter a ref vector of PFCandidates.
double etaAssociationDistance_
Sin< T >::type sin(const T &t)
reco::VertexRef associatedVertex(const PFJet &jet) const
bool exists(std::string const ¶meterName) const
checks if a parameter exists
double phi() const
azimuthal angle of momentum vector
void setEvent(const edm::Event &evt)
Load the vertices from the event.
RecoTauVertexAssociator vertexAssociator_
bool isNonnull() const
Checks for non-null.
bool applyElecTrackQcuts_
Jets made from PFObjects.
virtual double eta() const
momentum pseudorapidity
virtual double pt() const
transverse momentum
bool updateStripAfterEachDaughter_
std::vector< PFCandidatePtr > pfCandidates(const PFJet &jet, int particleId, bool sort=true)
reco::TrackRef trackRef() const
U second(std::pair< T, U > const &p)
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
double eta() const
pseudorapidity of momentum vector
edm::RefToBase< reco::Track > TrackBaseRef
persistent reference to a Track, using views
void setPV(const reco::VertexRef &vtx) const
Update the primary vertex.
double pt() const
track transverse momentum
const_iterator end() const
last daughter const_iterator
std::vector< int > inputPdgIds_
double ptError() const
error on Pt (set to 1000 TeV if charge==0 for safety)
double phiAssociationDistance_
Container::value_type value_type
double dz() const
dz parameter (= dsz/cos(lambda)). This is the track z0 w.r.t (0,0,0) only if the refPoint is close to...
static const TrackGhostTrackState * getTrack(const BasicGhostTrackState *basic)
return_type operator()(const reco::PFJet &) const override
Build a collection of piZeros from objects in the input jet.
const edm::Event * evt() const
const HitPattern & hitPattern() const
Access the hit pattern, indicating in which Tracker layers the track has hits.
ParameterSet const & getParameterSet(std::string const &) const
tuple idx
DEBUGGING if hasattr(process,"trackMonIterativeTracking2012"): print "trackMonIterativeTracking2012 D...
ProductID id() const
Accessor for product ID.
math::XYZTLorentzVector LorentzVector
Lorentz vector.
double minGammaEtStripAdd_
int numberOfValidTrackerHits() const
std::auto_ptr< PiZeroVector > return_type
int maxStripBuildIterations_
double combinatoricStripMassHypo_
Particle reconstructed by the particle flow algorithm.
boost::ptr_vector< RecoTauPiZero > PiZeroVector
reco::GsfTrackRef gsfTrackRef() const
std::vector< reco::PFCandidatePtr > PFCandPtrs
void addDaughter(const CandidatePtr &)
add a daughter via a reference
int numberOfValidPixelHits() const
const_iterator begin() const
first daughter const_iterator
math::XYZPoint Point
point in the space
int charge() const
track electric charge
#define DEFINE_EDM_PLUGIN(factory, type, name)
void set(reco::Candidate &c) const
set up a candidate
virtual void beginEvent() override
Hook called at the beginning of the event.
double dxy() const
dxy parameter. (This is the transverse impact parameter w.r.t. to (0,0,0) ONLY if refPoint is close t...
virtual double phi() const
momentum azimuthal angle
RecoTauQualityCuts * qcuts_
void addCandsToStrip(RecoTauPiZero &, PFCandPtrs &, const std::vector< bool > &, std::set< size_t > &, bool &) const
AddFourMomenta p4Builder_