30 : isolator_(iConfig.exists(
"userIsolation") ? iConfig.getParameter<
edm::
ParameterSet>(
"userIsolation")
34 useUserData_(iConfig.exists(
"userData")) {
63 iConfig.
getParameter<std::vector<edm::InputTag>>(
"genParticleMatch"),
64 [
this](
edm::InputTag const&
tag) { return consumes<edm::Association<reco::GenParticleCollection>>(tag); });
75 iConfig.
getParameter<std::vector<edm::InputTag>>(
"tauJetCorrFactorsSource"),
76 [
this](
edm::InputTag const&
tag) { return mayConsume<edm::ValueMap<TauJetCorrFactors>>(tag); });
83 for (std::vector<std::string>::const_iterator it = names.begin(), ed = names.end(); it != ed; ++it) {
88 throw cms::Exception(
"Configuration") <<
"PATTauProducer: id addTauID is true, you must specify either:\n" 89 <<
"\tPSet tauIDSources = { \n" 90 <<
"\t\tInputTag <someName> = <someTag> // as many as you want \n " 94 tauIDSrcs_, [
this](
NameTag const& tag) {
return mayConsume<reco::PFTauDiscriminator>(tag.second); });
97 if (iConfig.
exists(
"isoDeposits")) {
99 if (depconf.
exists(
"tracker"))
101 if (depconf.
exists(
"ecal"))
103 if (depconf.
exists(
"hcal"))
105 if (depconf.
exists(
"pfAllParticles"))
108 if (depconf.
exists(
"pfChargedHadron"))
111 if (depconf.
exists(
"pfNeutralHadron"))
114 if (depconf.
exists(
"pfGamma"))
117 if (depconf.
exists(
"user")) {
118 std::vector<edm::InputTag> userdeps = depconf.
getParameter<std::vector<edm::InputTag>>(
"user");
119 std::vector<edm::InputTag>::const_iterator it = userdeps.begin(), ed = userdeps.end();
121 for (; it != ed; ++it, ++
key) {
128 return consumes<edm::ValueMap<IsoDeposit>>(label.second);
132 if (addEfficiencies_) {
146 produces<std::vector<Tau>>();
164 edm::LogWarning(
"DataSource") <<
"WARNING! No Tau collection found. This missing input will not block the job. " 165 "Instead, an empty tau collection is being be produced.";
166 auto patTaus = std::make_unique<std::vector<Tau>>();
180 for (
size_t j = 0, nd =
deposits.size();
j < nd; ++
j) {
185 std::vector<edm::Handle<edm::Association<reco::GenParticleCollection>>> genMatches(
genMatchTokens_.size());
197 std::vector<edm::ValueMap<TauJetCorrFactors>> tauJetCorrs;
202 tauJetCorrs.push_back(*tauJetCorr);
206 auto patTaus = std::make_unique<std::vector<Tau>>();
224 edm::LogWarning(
"Type Error") <<
"Embedding a PFTau-specific information into a pat::Tau which wasn't made " 225 "from a reco::PFTau is impossible.\n";
231 edm::LogWarning(
"Type Error") <<
"Embedding a PFTau-specific information into a pat::Tau which wasn't made " 232 "from a reco::PFTau is impossible.\n";
238 edm::LogWarning(
"Type Error") <<
"Embedding a PFTau-specific information into a pat::Tau which wasn't made " 239 "from a reco::PFTau is impossible.\n";
245 edm::LogWarning(
"Type Error") <<
"Embedding a PFTau-specific information into a pat::Tau which wasn't made " 246 "from a reco::PFTau is impossible.\n";
252 edm::LogWarning(
"Type Error") <<
"Embedding a PFTau-specific information into a pat::Tau which wasn't made " 253 "from a reco::PFTau is impossible.\n";
259 edm::LogWarning(
"Type Error") <<
"Embedding a PFTau-specific information into a pat::Tau which wasn't made " 260 "from a reco::PFTau is impossible.\n";
266 edm::LogWarning(
"Type Error") <<
"Embedding a PFTau-specific information into a pat::Tau which wasn't made " 267 "from a reco::PFTau is impossible.\n";
273 edm::LogWarning(
"Type Error") <<
"Embedding a PFTau-specific information into a pat::Tau which wasn't made " 274 "from a reco::PFTau is impossible.\n";
280 edm::LogWarning(
"Type Error") <<
"Embedding a PFTau-specific information into a pat::Tau which wasn't made " 281 "from a reco::PFTau is impossible.\n";
287 edm::LogWarning(
"Type Error") <<
"Embedding a PFTau-specific information into a pat::Tau which wasn't made " 288 "from a reco::PFTau is impossible.\n";
294 edm::LogWarning(
"Type Error") <<
"Embedding a PFTau-specific information into a pat::Tau which wasn't made " 295 "from a reco::PFTau is impossible.\n";
300 for (
unsigned int i = 0;
i < tauJetCorrs.size(); ++
i) {
306 std::vector<std::string>
levels = tauJetCorrs[0][tausRef].correctionLabels();
307 if (
std::find(levels.begin(), levels.end(),
"L2L3Residual") != levels.end()) {
308 aTau.
initializeJEC(tauJetCorrs[0][tausRef].jecLevel(
"L2L3Residual"));
309 }
else if (
std::find(levels.begin(), levels.end(),
"L3Absolute") != levels.end()) {
310 aTau.
initializeJEC(tauJetCorrs[0][tausRef].jecLevel(
"L3Absolute"));
312 aTau.
initializeJEC(tauJetCorrs[0][tausRef].jecLevel(
"Uncorrected"));
315 <<
"L2L3Residual and L3Absolute are not part of the correction applied jetCorrFactors \n" 316 <<
"of module " << tauJetCorrs[0][tausRef].jecSet() <<
" jets will remain" 325 for (
size_t i = 0,
n = genMatches.size();
i <
n; ++
i) {
345 auto const& tausDeref = *tausRef;
356 if (!missingDiscriminators.empty()) {
357 missingDiscriminators +=
", ";
366 <<
"PATTauProducer: unsupported datatype '" <<
typeid(tausDeref).
name() <<
"' for tauSource\n";
370 edm::LogWarning(
"DataSource") <<
"The following tau discriminators have not been found in the event:\n" 371 << missingDiscriminators <<
"\n" 372 <<
"They will not be embedded into the pat::Tau object.\n" 373 <<
"Note: this message will be printed only at first occurence.";
395 float ecalEnergy = 0;
396 float hcalEnergy = 0;
397 float sumPhiTimesEnergy = 0.;
398 float sumEtaTimesEnergy = 0.;
399 float sumEnergy = 0.;
400 float leadChargedCandPt = -99;
401 float leadChargedCandEtaAtEcalEntrance = -99;
402 const std::vector<reco::CandidatePtr>& signalCands = pfTauRef->signalCands();
403 for (
const auto& it : signalCands) {
405 if (icand !=
nullptr) {
410 sumEnergy += icand->
energy();
417 track = icand->
muonRef()->globalTrack().
get();
423 if (track->
pt() > leadChargedCandPt) {
425 leadChargedCandPt = track->
pt();
432 sumEnergy += it->energy();
434 if (track !=
nullptr) {
435 if (track->
pt() > leadChargedCandPt) {
436 leadChargedCandPt = track->
pt();
445 if (sumEnergy != 0.) {
452 float leadingTrackNormChi2 = 0;
453 float ecalEnergyLeadChargedHadrCand = -99.;
454 float hcalEnergyLeadChargedHadrCand = -99.;
455 float emFraction = -1.;
456 float myHCALenergy = 0.;
457 float myECALenergy = 0.;
461 if (pfCandPtr !=
nullptr) {
462 ecalEnergyLeadChargedHadrCand = pfCandPtr->
ecalEnergy();
463 hcalEnergyLeadChargedHadrCand = pfCandPtr->
hcalEnergy();
466 leadingTrackNormChi2 = trackRef->normalizedChi2();
467 for (
const auto& isoPFCand : pfTauRef->isolationPFCands()) {
468 myHCALenergy += isoPFCand->hcalEnergy();
469 myECALenergy += isoPFCand->ecalEnergy();
471 for (
const auto& signalPFCand : pfTauRef->signalPFCands()) {
472 myHCALenergy += signalPFCand->hcalEnergy();
473 myECALenergy += signalPFCand->ecalEnergy();
475 if (myHCALenergy + myECALenergy != 0.) {
476 emFraction = myECALenergy / (myHCALenergy + myECALenergy);
481 if (packedCandPtr !=
nullptr) {
484 if (track !=
nullptr) {
502 aTauPFEssential.
dxy_ = tauLifetimeInfo.
dxy();
507 aTauPFEssential.
ip3d_ = tauLifetimeInfo.
ip3d();
525 for (
size_t j = 0, nd =
deposits.size();
j < nd; ++
j) {
555 template <
typename TauCollectionType,
typename TauDiscrType>
560 return (*tauIdDiscr)[tauRef];
572 iDesc.
add<
bool>(
"embedIsolationTracks",
false)->setComment(
"embed external isolation tracks");
573 iDesc.
add<
bool>(
"embedLeadTrack",
false)->setComment(
"embed external leading track");
574 iDesc.
add<
bool>(
"embedLeadTracks",
false)->setComment(
"embed external signal tracks");
577 iDesc.
add<
bool>(
"addGenMatch",
true)->setComment(
"add MC matching");
578 iDesc.
add<
bool>(
"embedGenMatch",
false)->setComment(
"embed MC matched MC information");
579 std::vector<edm::InputTag> emptySourceVector;
583 ->
setComment(
"input with MC match information");
586 iDesc.
add<
bool>(
"addGenJetMatch",
true)->setComment(
"add MC jet matching");
587 iDesc.
add<
bool>(
"embedGenJetMatch",
false)->setComment(
"embed MC jet matched jet information");
593 iDesc.
add<
bool>(
"addTauID",
true)->setComment(
"add tau ID variables");
601 iDesc.
add<
bool>(
"skipMissingTauID",
false)
602 ->setComment(
"allow to skip a tau ID variable when not present in the event");
613 isoDepositsPSet.
addOptional<std::vector<edm::InputTag>>(
"user");
619 iDesc.
add(
"efficiencies", efficienciesPSet);
620 iDesc.
add<
bool>(
"addEfficiencies",
false);
629 iDesc.
add(
"userIsolation", isolationPSet);
bool enabled() const
'true' if this there is at least one efficiency configured
~PATTauProducer() override
T getParameter(std::string const &) const
double ecalEnergy() const
return corrected Ecal energy
void setComment(std::string const &value)
Assists in assimilating all pat::UserData into pat objects.
void newEvent(const edm::Event &event)
To be called for each new event, reads in the ValueMaps for efficiencies.
std::pair< std::string, edm::InputTag > NameTag
float etaAtEcalEntranceLeadChargedCand_
bool hasSecondaryVertex() const
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
ParameterDescriptionBase * addOptional(U const &iLabel, T const &value)
bool isNonnull() const
Checks for non-null.
void setIsolation(IsolationKeys key, float value)
bool existsAs(std::string const ¶meterName, bool trackiness=true) const
checks if a parameter exists as a given type
std::vector< edm::EDGetTokenT< edm::ValueMap< IsoDeposit > > > isoDepositTokens_
void embedIsolationPFCands()
method to store the isolation candidates internally
pat::helper::MultiIsolator::IsolationValuePairs isolatorTmpStorage_
double normalizedChi2() const
chi-squared divided by n.d.o.f. (or chi-squared * 1e6 if n.d.o.f. is zero)
void embedIsolationPFGammaCands()
method to store the isolation gamma candidates internally
bool addTauJetCorrFactors_
bool getByToken(EDGetToken token, Handle< PROD > &result) const
void setAllowAnything()
allow any parameter label/value pairs
T const * get() const
Returns C++ pointer to the item.
pat::helper::EfficiencyLoader efficiencyLoader_
void embedLeadTrack()
method to store the leading track internally
bool exists(std::string const ¶meterName) const
checks if a parameter exists
void embedSignalPFChargedHadrCands()
method to store the signal charged hadrons candidates internally
pat::helper::KinResolutionsLoader resolutionLoader_
ParameterDescriptionNode * addNode(ParameterDescriptionNode const &node)
float getTauIdDiscriminator(const edm::Handle< TauCollectionType > &, size_t, const edm::Handle< TauDiscrType > &)
void setDecayMode(int)
set decay mode
void setTauIDs(const std::vector< IdPair > &ids)
IsolationKeys
Enum defining isolation keys.
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
void setResolutions(pat::PATObject< T > &obj) const
Sets the efficiencies for this object, using the reference to the original objects.
const std::string names[nVars_]
const Point & dxy_PCA() const
const math::XYZPointF & positionAtECALEntrance() const
bool enabled() const
'true' if this there is at least one efficiency configured
void setIsoDeposit(IsolationKeys key, const IsoDeposit &dep)
Sets the IsoDeposit associated with some key; if it is already existent, it is overwritten.
bool embedIsolationPFChargedHadrCands_
static void fillDescription(edm::ParameterSetDescription &iDesc)
reco::TrackRef trackRef() const
std::vector< std::string > getParameterNamesForType(bool trackiness=true) const
bool enabled() const
True if it has a non null configuration.
void setComment(std::string const &value)
void embedSignalPFCands()
method to store the signal candidates internally
double ip3d_error() const
#define DEFINE_FWK_MODULE(type)
void beginEvent(const edm::Event &event, const edm::EventSetup &eventSetup)
double flightLengthSig() const
edm::EDGetTokenT< PFTauTIPAssociationByRef > tauTransverseImpactParameterToken_
pat::helper::MultiIsolator isolator_
const Vector & flightLength() const
edm::EDGetTokenT< edm::View< reco::BaseTau > > baseTauToken_
void newEvent(const edm::Event &event, const edm::EventSetup &setup)
To be called for each new event, reads in the EventSetup object.
bool embedIsolationPFNeutralHadrCands_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
double pt() const
track transverse momentum
double energy() const final
energy
pat::PATUserDataHelper< pat::Tau > userDataHelper_
virtual const reco::Track & pseudoTrack() const
genJetMatch
switch on/off embedding of matched genJet's
T const * get() const
Returns C++ pointer to the item.
bool embedSignalPFNeutralHadrCands_
std::vector< pat::tau::TauPFEssential > pfEssential_
void embedIsolationPFNeutralHadrCands()
method to store the isolation neutral hadrons candidates internally
bool embedIsolationPFCands_
ParameterDescriptionBase * add(U const &iLabel, T const &value)
void embedLeadPFChargedHadrCand()
method to store the leading charged hadron candidate internally
void embedIsolationPFChargedHadrCands()
method to store the isolation charged hadrons candidates internally
reco::MuonRef muonRef() const
bool isNonnull() const
Checks for non-null.
bool hasTrackDetails() const
Return true if a bestTrack can be extracted from this Candidate.
void setGenJet(const reco::GenJetRef &ref)
set the matched GenJet
void embedLeadPFNeutralCand()
method to store the leading neutral candidate internally
std::vector< std::pair< pat::IsolationKeys, float > > IsolationValuePairs
void addGenParticleRef(const reco::GenParticleRef &ref)
std::vector< edm::EDGetTokenT< edm::ValueMap< TauJetCorrFactors > > > tauJetCorrFactorsTokens_
auto vector_transform(std::vector< InputType > const &input, Function predicate) -> std::vector< typename std::remove_cv< typename std::remove_reference< decltype(predicate(input.front()))>::type >::type >
static void fillDescription(edm::ParameterSetDescription &iDesc)
Method for documentation and validation of PSet.
edm::InputTag tauTransverseImpactParameterSrc_
bool embedIsolationTracks_
bool embedLeadPFChargedHadrCand_
std::vector< edm::EDGetTokenT< edm::Association< reco::GenParticleCollection > > > genMatchTokens_
bool embedIsolationPFGammaCands_
void setEfficiencies(pat::PATObject< T > &obj, const R &originalRef) const
Sets the efficiencies for this object, using the reference to the original objects.
edm::EDGetTokenT< edm::Association< reco::GenJetCollection > > genJetMatchToken_
void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override
void initializeJEC(unsigned int level, const unsigned int set=0)
initialize the jet to a given JEC level during creation starting from Uncorrected ...
void embedSignalPFNeutralHadrCands()
method to store the signal neutral hadrons candidates internally
bool embedSignalPFGammaCands_
std::vector< std::pair< pat::IsolationKeys, edm::InputTag > > isoDepositLabels_
Particle reconstructed by the particle flow algorithm.
void addJECFactors(const TauJetCorrFactors &jec)
add more sets of energy correction factors
PATTauProducer(const edm::ParameterSet &iConfig)
bool embedLeadPFNeutralCand_
float leadingTrackNormChi2_
reco::GsfTrackRef gsfTrackRef() const
double hcalEnergy() const
return corrected Hcal energy
void embedSignalTracks()
method to store the signal tracks internally
bool isPFTau() const
Returns true if this pat::Tau was made from a reco::PFTau.
void embedSignalPFGammaCands()
method to store the signal gamma candidates internally
float ecalEnergyLeadChargedHadrCand_
bool embedSignalPFChargedHadrCands_
std::vector< edm::EDGetTokenT< reco::PFTauDiscriminator > > pfTauIDTokens_
void embedIsolationTracks()
method to store the isolation tracks internally
std::vector< NameTag > tauIDSrcs_
edm::EDGetTokenT< reco::PFTauCollection > pfTauToken_
float hcalEnergyLeadChargedHadrCand_
GreaterByPt< Tau > pTTauComparator_
void fill(const edm::View< T > &coll, int idx, IsolationValuePairs &isolations) const