CMS 3D CMS Logo

RecoTauProducer.cc
Go to the documentation of this file.
1 /*
2  * RecoTauProducer
3  *
4  * Interface between the various tau algorithms and the edm::Event. The
5  * RecoTauProducer takes as data input is a collection (view) of reco::PFJets,
6  * and Jet-PiZero assoications that give the reco::RecoTauPiZeros for those
7  * jets. The actual building of taus is done by the list of builders - each of
8  * which constructs a PFTau for each PFJet. The output collection may have
9  * multiple taus for each PFJet - these overlaps are to be resolved by the
10  * RecoTauCleaner module.
11  *
12  * Additionally, there are "modifier" plugins, which can do things like add the
13  * lead track significance, or electron rejection variables.
14  *
15  * Authors: Evan K. Friis (UC Davis),
16  * Christian Veelken (LLR)
17  *
18  */
19 
20 #include <algorithm>
21 #include <functional>
22 #include <memory>
23 
30 
34 
42 
44 
46 public:
49  typedef std::vector<std::unique_ptr<Builder>> BuilderList;
50  typedef std::vector<std::unique_ptr<Modifier>> ModifierList;
51 
52  explicit RecoTauProducer(const edm::ParameterSet& pset);
53  ~RecoTauProducer() override {}
54  void produce(edm::Event& evt, const edm::EventSetup& es) override;
55 
56  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
57 
58 private:
63 
64  double minJetPt_;
65  double maxJetAbsEta_;
66  //token definition
71 
74  // Optional selection on the output of the taus
75  std::unique_ptr<StringCutObjectSelector<reco::PFTau>> outputSelector_;
76  // Whether or not to add build a tau from a jet for which the builders
77  // return no taus. The tau will have no content, only the four vector of
78  // the orginal jet.
80 };
81 
83  jetSrc_ = pset.getParameter<edm::InputTag>("jetSrc");
84  jetRegionSrc_ = pset.getParameter<edm::InputTag>("jetRegionSrc");
85  chargedHadronSrc_ = pset.getParameter<edm::InputTag>("chargedHadronSrc");
86  piZeroSrc_ = pset.getParameter<edm::InputTag>("piZeroSrc");
87 
88  minJetPt_ = pset.getParameter<double>("minJetPt");
89  maxJetAbsEta_ = pset.getParameter<double>("maxJetAbsEta");
90  //consumes definition
91  jet_token = consumes<reco::JetView>(jetSrc_);
92  jetRegion_token = consumes<edm::AssociationMap<edm::OneToOne<reco::JetView, reco::JetView>>>(jetRegionSrc_);
93  chargedHadron_token = consumes<reco::PFJetChargedHadronAssociation>(chargedHadronSrc_);
94  piZero_token = consumes<reco::JetPiZeroAssociation>(piZeroSrc_);
95 
96  typedef std::vector<edm::ParameterSet> VPSet;
97  // Get each of our tau builders
98  const VPSet& builders = pset.getParameter<VPSet>("builders");
99  for (VPSet::const_iterator builderPSet = builders.begin(); builderPSet != builders.end(); ++builderPSet) {
100  // Get plugin name
101  const std::string& pluginType = builderPSet->getParameter<std::string>("plugin");
102  // Build the plugin
103  builders_.emplace_back(RecoTauBuilderPluginFactory::get()->create(pluginType, *builderPSet, consumesCollector()));
104  }
105 
106  const VPSet& modfiers = pset.getParameter<VPSet>("modifiers");
107  for (VPSet::const_iterator modfierPSet = modfiers.begin(); modfierPSet != modfiers.end(); ++modfierPSet) {
108  // Get plugin name
109  const std::string& pluginType = modfierPSet->getParameter<std::string>("plugin");
110  // Build the plugin
111  modifiers_.emplace_back(RecoTauModifierPluginFactory::get()->create(pluginType, *modfierPSet, consumesCollector()));
112  }
113 
114  // Check if we want to apply a final output selection
115  std::string selection = pset.getParameter<std::string>("outputSelection");
116  if (!selection.empty()) {
117  outputSelector_ = std::make_unique<StringCutObjectSelector<reco::PFTau>>(selection);
118  }
119  buildNullTaus_ = pset.getParameter<bool>("buildNullTaus");
120 
121  produces<reco::PFTauCollection>();
122 }
123 
125  // Get the jet input collection via a view of Candidates
127  evt.getByToken(jet_token, jetView);
128 
129  // Get the jet region producer
131  evt.getByToken(jetRegion_token, jetRegionHandle);
132 
133  // Get the charged hadron input collection
135  evt.getByToken(chargedHadron_token, chargedHadronAssoc);
136 
137  // Get the pizero input collection
139  evt.getByToken(piZero_token, piZeroAssoc);
140 
141  // Update all our builders and modifiers with the event info
142  for (auto& builder : builders_) {
143  builder->setup(evt, es);
144  }
145  for (auto& modifier : modifiers_) {
146  modifier->setup(evt, es);
147  }
148 
149  // Create output collection
150  auto output = std::make_unique<reco::PFTauCollection>();
151  output->reserve(jetView->size());
152 
153  // Loop over the jets and build the taus for each jet
154  for (size_t i_j = 0; i_j < jetView->size(); ++i_j) {
155  const auto& jetRef = jetView->refAt(i_j);
156  // Get the jet with extra constituents from an area around the jet
157  if (jetRef->pt() - minJetPt_ < 1e-5)
158  continue;
159  if (std::abs(jetRef->eta()) - maxJetAbsEta_ > -1e-5)
160  continue;
161  reco::JetBaseRef jetRegionRef = (*jetRegionHandle)[jetRef];
162  if (jetRegionRef.isNull()) {
163  throw cms::Exception("BadJetRegionRef") << "No jet region can be found for the current jet: " << jetRef.id();
164  }
165  // Remove all the jet constituents from the jet extras
166  std::vector<reco::CandidatePtr> jetCands = jetRef->daughterPtrVector();
167  std::vector<reco::CandidatePtr> allRegionalCands = jetRegionRef->daughterPtrVector();
168  // Sort both by ref key
169  std::sort(jetCands.begin(), jetCands.end());
170  std::sort(allRegionalCands.begin(), allRegionalCands.end());
171  // Get the regional junk candidates not in the jet.
172  std::vector<reco::CandidatePtr> uniqueRegionalCands;
173 
174  // This can actually be less than zero, if the jet has really crazy soft
175  // stuff really far away from the jet axis.
176  if (allRegionalCands.size() > jetCands.size()) {
177  uniqueRegionalCands.reserve(allRegionalCands.size() - jetCands.size());
178  }
179 
180  // Subtract the jet cands from the regional cands
181  std::set_difference(allRegionalCands.begin(),
182  allRegionalCands.end(),
183  jetCands.begin(),
184  jetCands.end(),
185  std::back_inserter(uniqueRegionalCands));
186 
187  // Get the charged hadrons associated with this jet
188  const std::vector<reco::PFRecoTauChargedHadron>& chargedHadrons = (*chargedHadronAssoc)[jetRef];
189 
190  // Get the pizeros associated with this jet
191  const std::vector<reco::RecoTauPiZero>& piZeros = (*piZeroAssoc)[jetRef];
192  // Loop over our builders and create the set of taus for this jet
193  unsigned int nTausBuilt = 0;
194  for (const auto& builder : builders_) {
195  // Get a ptr_vector of taus from the builder
197  (*builder)(jetRef, chargedHadrons, piZeros, uniqueRegionalCands));
198 
199  // Make sure all taus have their jetref set correctly
200  std::for_each(taus.begin(), taus.end(), [&](auto& arg) { arg.setjetRef(reco::JetBaseRef(jetRef)); });
201  // Copy without selection
202  if (!outputSelector_.get()) {
203  output->insert(output->end(), taus.begin(), taus.end());
204  nTausBuilt += taus.size();
205  } else {
206  // Copy only those that pass the selection.
207  for (auto const& tau : taus) {
208  if ((*outputSelector_)(tau)) {
209  nTausBuilt++;
210  output->push_back(tau);
211  }
212  }
213  }
214  }
215  // If we didn't build *any* taus for this jet, build a null tau if desired.
216  // The null PFTau has no content, but it's four vector is set to that of the
217  // jet.
218  if (!nTausBuilt && buildNullTaus_) {
219  reco::PFTau nullTau(std::numeric_limits<int>::quiet_NaN(), jetRef->p4());
220  nullTau.setjetRef(reco::JetBaseRef(jetRef));
221  output->push_back(nullTau);
222  }
223  }
224 
225  // Loop over the taus we have created and apply our modifiers to the taus
226  for (reco::PFTauCollection::iterator tau = output->begin(); tau != output->end(); ++tau) {
227  for (const auto& modifier : modifiers_) {
228  (*modifier)(*tau);
229  }
230  }
231 
232  for (auto& modifier : modifiers_) {
233  modifier->endEvent();
234  }
235 
236  evt.put(std::move(output));
237 }
238 
240  // combinatoricRecoTaus
242  desc.add<edm::InputTag>("piZeroSrc", edm::InputTag("ak4PFJetsRecoTauPiZeros"));
243 
244  edm::ParameterSetDescription desc_qualityCuts;
246 
247  {
248  edm::ParameterSetDescription vpsd_modifiers;
249  vpsd_modifiers.add<std::string>("name");
250  vpsd_modifiers.add<std::string>("plugin");
251  vpsd_modifiers.add<int>("verbosity", 0);
252 
253  vpsd_modifiers.add<edm::ParameterSetDescription>("qualityCuts", desc_qualityCuts);
254  vpsd_modifiers.addOptional<edm::InputTag>("ElectronPreIDProducer");
255  vpsd_modifiers.addOptional<std::string>("DataType");
256  vpsd_modifiers.addOptional<double>("maximumForElectrionPreIDOutput");
257  vpsd_modifiers.addOptional<double>("ElecPreIDLeadTkMatch_maxDR");
258  vpsd_modifiers.addOptional<double>("EcalStripSumE_minClusEnergy");
259  vpsd_modifiers.addOptional<double>("EcalStripSumE_deltaPhiOverQ_minValue");
260  vpsd_modifiers.addOptional<double>("EcalStripSumE_deltaPhiOverQ_maxValue");
261  vpsd_modifiers.addOptional<double>("EcalStripSumE_deltaEta");
262  vpsd_modifiers.addOptional<double>("dRaddNeutralHadron");
263  vpsd_modifiers.addOptional<double>("minGammaEt");
264  vpsd_modifiers.addOptional<double>("dRaddPhoton");
265  vpsd_modifiers.addOptional<double>("minNeutralHadronEt");
266  vpsd_modifiers.addOptional<edm::InputTag>("pfTauTagInfoSrc");
267 
268  desc.addVPSet("modifiers", vpsd_modifiers);
269  }
270 
271  desc.add<edm::InputTag>("jetRegionSrc", edm::InputTag("recoTauAK4PFJets08Region"));
272  desc.add<double>("maxJetAbsEta", 2.5);
273  desc.add<std::string>("outputSelection", "leadPFChargedHadrCand().isNonnull()");
274  desc.add<edm::InputTag>("chargedHadronSrc", edm::InputTag("ak4PFJetsRecoTauChargedHadrons"));
275  desc.add<double>("minJetPt", 14.0);
276  desc.add<edm::InputTag>("jetSrc", edm::InputTag("ak4PFJets"));
277 
278  {
279  edm::ParameterSetDescription desc_builders;
280  desc_builders.add<std::string>("name");
281  desc_builders.add<std::string>("plugin");
282  desc_builders.add<int>("verbosity", 0);
283 
284  desc_builders.add<edm::ParameterSetDescription>("qualityCuts", desc_qualityCuts);
285  {
286  edm::ParameterSetDescription desc_decayModes;
287  desc_decayModes.add<unsigned int>("nPiZeros", 0);
288  desc_decayModes.add<unsigned int>("maxPiZeros", 0);
289  desc_decayModes.add<unsigned int>("nCharged", 1);
290  desc_decayModes.add<unsigned int>("maxTracks", 6);
291  desc_builders.addVPSetOptional("decayModes", desc_decayModes);
292  }
293  desc_builders.add<double>("minAbsPhotonSumPt_insideSignalCone", 2.5);
294  desc_builders.add<double>("minRelPhotonSumPt_insideSignalCone", 0.1);
295  desc_builders.add<edm::InputTag>("pfCandSrc", edm::InputTag("particleFlow"));
296 
297  desc_builders.addOptional<std::string>("signalConeSize");
298  desc_builders.addOptional<double>("isolationConeSize");
299  desc_builders.addOptional<double>("minAbsPhotonSumPt_outsideSignalCone");
300  desc_builders.addOptional<double>("minRelPhotonSumPt_outsideSignalCone");
301  desc_builders.addOptional<std::string>("isoConeChargedHadrons");
302  desc_builders.addOptional<std::string>("isoConeNeutralHadrons");
303  desc_builders.addOptional<std::string>("isoConePiZeros");
304  desc_builders.addOptional<double>("leadObjectPt");
305  desc_builders.addOptional<std::string>("matchingCone");
306  desc_builders.addOptional<int>("maxSignalConeChargedHadrons");
307  desc_builders.addOptional<std::string>("signalConeChargedHadrons");
308  desc_builders.addOptional<std::string>("signalConeNeutralHadrons");
309  desc_builders.addOptional<std::string>("signalConePiZeros");
310  desc_builders.addOptional<bool>("usePFLeptons");
311 
312  std::vector<edm::ParameterSet> vpset_default;
313  {
314  edm::ParameterSet pset_default_builders;
315  pset_default_builders.addParameter<std::string>("name", "");
316  pset_default_builders.addParameter<std::string>("plugin", "");
317  pset_default_builders.addParameter<int>("verbosity", 0);
318  pset_default_builders.addParameter<double>("minAbsPhotonSumPt_insideSignalCone", 2.5);
319  pset_default_builders.addParameter<double>("minRelPhotonSumPt_insideSignalCone", 0.1);
320  pset_default_builders.addParameter<edm::InputTag>("pfCandSrc", edm::InputTag("particleFlow"));
321  vpset_default.push_back(pset_default_builders);
322  }
323  desc.addVPSet("builders", desc_builders, vpset_default);
324  }
325 
326  desc.add<bool>("buildNullTaus", false);
327  desc.add<int>("verbosity", 0);
328  descriptions.add("combinatoricRecoTaus", desc);
329 }
330 
ConfigurationDescriptions.h
edm::RefToBase::isNull
bool isNull() const
Checks for null.
Definition: RefToBase.h:295
RecoTauProducer::chargedHadron_token
edm::EDGetTokenT< reco::PFJetChargedHadronAssociation > chargedHadron_token
Definition: RecoTauProducer.cc:69
RecoTauProducer::jetSrc_
edm::InputTag jetSrc_
Definition: RecoTauProducer.cc:59
edm::ParameterSetDescription::add
ParameterDescriptionBase * add(U const &iLabel, T const &value)
Definition: ParameterSetDescription.h:95
RecoTauProducer::jetRegionSrc_
edm::InputTag jetRegionSrc_
Definition: RecoTauProducer.cc:60
RecoTauProducer::chargedHadronSrc_
edm::InputTag chargedHadronSrc_
Definition: RecoTauProducer.cc:61
RecoTauProducer::minJetPt_
double minJetPt_
Definition: RecoTauProducer.cc:64
RecoTauProducer::jetRegion_token
edm::EDGetTokenT< edm::AssociationMap< edm::OneToOne< reco::JetView, reco::JetView > > > jetRegion_token
Definition: RecoTauProducer.cc:68
metsig::tau
Definition: SignAlgoResolutions.h:49
RecoTauProducer::maxJetAbsEta_
double maxJetAbsEta_
Definition: RecoTauProducer.cc:65
convertSQLitetoXML_cfg.output
output
Definition: convertSQLitetoXML_cfg.py:72
edm::View::refAt
RefToBase< value_type > refAt(size_type i) const
edm::EDGetTokenT
Definition: EDGetToken.h:33
Tau3MuMonitor_cff.taus
taus
Definition: Tau3MuMonitor_cff.py:7
RecoTauProducer::produce
void produce(edm::Event &evt, const edm::EventSetup &es) override
Definition: RecoTauProducer.cc:124
RecoTauProducer::~RecoTauProducer
~RecoTauProducer() override
Definition: RecoTauProducer.cc:53
RecoTauProducer::RecoTauProducer
RecoTauProducer(const edm::ParameterSet &pset)
Definition: RecoTauProducer.cc:82
PFJetChargedHadronAssociation.h
HLT_FULL_cff.InputTag
InputTag
Definition: HLT_FULL_cff.py:89301
PFJetCollection.h
edm::ParameterSetDescription
Definition: ParameterSetDescription.h:52
JetPiZeroAssociation.h
HLT_FULL_cff.builders
builders
Definition: HLT_FULL_cff.py:32624
EDProducer.h
reco::tau::RecoTauBuilderPlugin
Definition: RecoTauBuilderPlugins.h:56
reco::PFTau
Definition: PFTau.h:36
RecoTauProducer::builders_
BuilderList builders_
Definition: RecoTauProducer.cc:72
beamerCreator.create
def create(alignables, pedeDump, additionalData, outputFile, config)
Definition: beamerCreator.py:44
Association.h
edm::Handle
Definition: AssociativeIterator.h:50
edm::ParameterSetDescription::addOptional
ParameterDescriptionBase * addOptional(U const &iLabel, T const &value)
Definition: ParameterSetDescription.h:105
RecoTauProducer
Definition: RecoTauProducer.cc:45
MakerMacros.h
RecoTauProducer::outputSelector_
std::unique_ptr< StringCutObjectSelector< reco::PFTau > > outputSelector_
Definition: RecoTauProducer.cc:75
DEFINE_FWK_MODULE
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
edm::ConfigurationDescriptions::add
void add(std::string const &label, ParameterSetDescription const &psetDescription)
Definition: ConfigurationDescriptions.cc:57
RecoTauProducer::modifiers_
ModifierList modifiers_
Definition: RecoTauProducer.cc:73
reco::tau::RecoTauBuilderPlugin::output_type
boost::ptr_vector< reco::PFTau > output_type
Definition: RecoTauBuilderPlugins.h:58
corrVsCorr.selection
selection
main part
Definition: corrVsCorr.py:100
edm::Event::getByToken
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:539
RecoTauCommonUtilities.h
JetCollection.h
ParameterSetDescription.h
RecoTauProducer::BuilderList
std::vector< std::unique_ptr< Builder > > BuilderList
Definition: RecoTauProducer.cc:49
edm::ConfigurationDescriptions
Definition: ConfigurationDescriptions.h:28
edm::View::size
size_type size() const
RecoTauQualityCuts.h
edm::ParameterSet
Definition: ParameterSet.h:47
Event.h
jetUpdater_cfi.sort
sort
Definition: jetUpdater_cfi.py:29
edm::ParameterSet::addParameter
void addParameter(std::string const &name, T const &value)
Definition: ParameterSet.h:135
reco::tau::RecoTauQualityCuts::fillDescriptions
static void fillDescriptions(edm::ParameterSetDescription &descriptions)
Declare all parameters read from python config file.
Definition: RecoTauQualityCuts.cc:346
edm::Event::put
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:133
edm::stream::EDProducer
Definition: EDProducer.h:36
edm::EventSetup
Definition: EventSetup.h:58
get
#define get
AlCaHLTBitMon_QueryRunRegistry.string
string string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
RecoTauProducer::Modifier
reco::tau::RecoTauModifierPlugin Modifier
Definition: RecoTauProducer.cc:48
RecoTauBuilderPlugins.h
submitPVResolutionJobs.desc
string desc
Definition: submitPVResolutionJobs.py:251
HistogramManager_cfi.VPSet
def VPSet(*args)
Definition: HistogramManager_cfi.py:404
eostools.move
def move(src, dest)
Definition: eostools.py:511
StringCutObjectSelector.h
reco::tau::RecoTauModifierPlugin
Definition: RecoTauBuilderPlugins.h:104
reco::PFTau::setjetRef
void setjetRef(const JetBaseRef &)
Definition: PFTau.cc:57
Exception
Definition: hltDiff.cc:245
PFTau.h
EventSetup.h
edm::RefToBase< Jet >
RecoTauProducer::fillDescriptions
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
Definition: RecoTauProducer.cc:239
RecoTauProducer::jet_token
edm::EDGetTokenT< reco::JetView > jet_token
Definition: RecoTauProducer.cc:67
PFRecoTauChargedHadron.h
funct::arg
A arg
Definition: Factorize.h:31
funct::abs
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
ParameterSet.h
RecoTauProducer::ModifierList
std::vector< std::unique_ptr< Modifier > > ModifierList
Definition: RecoTauProducer.cc:50
edm::Event
Definition: Event.h:73
edm::InputTag
Definition: InputTag.h:15
edm::ParameterSetDescription::addVPSetOptional
ParameterDescriptionBase * addVPSetOptional(U const &iLabel, ParameterSetDescription const &validator, std::vector< ParameterSet > const &defaults)
Definition: ParameterSetDescription.h:163
RecoTauProducer::buildNullTaus_
bool buildNullTaus_
Definition: RecoTauProducer.cc:79
RecoTauProducer::piZeroSrc_
edm::InputTag piZeroSrc_
Definition: RecoTauProducer.cc:62
muonDTDigis_cfi.pset
pset
Definition: muonDTDigis_cfi.py:27
MillePedeFileConverter_cfg.e
e
Definition: MillePedeFileConverter_cfg.py:37
RecoTauProducer::piZero_token
edm::EDGetTokenT< reco::JetPiZeroAssociation > piZero_token
Definition: RecoTauProducer.cc:70
RecoTauProducer::Builder
reco::tau::RecoTauBuilderPlugin Builder
Definition: RecoTauProducer.cc:47