CMS 3D CMS Logo

List of all members | Classes | Public Types | Public Member Functions | Private Attributes
PFTau3ProngReco Class Reference
Inheritance diagram for PFTau3ProngReco:
edm::EDProducer edm::ProducerBase edm::EDConsumerBase edm::ProductRegistryHelper

Classes

struct  DiscCutPair
 

Public Types

enum  Alg { useKalmanFit = 0, useTrackHelix }
 
typedef std::vector< DiscCutPair * > DiscCutPairVec
 
- Public Types inherited from edm::EDProducer
typedef EDProducer ModuleType
 
- Public Types inherited from edm::ProducerBase
using ModuleToResolverIndicies = std::unordered_multimap< std::string, std::tuple< edm::TypeID const *, const char *, edm::ProductResolverIndex >>
 
typedef ProductRegistryHelper::TypeLabelList TypeLabelList
 
- Public Types inherited from edm::EDConsumerBase
typedef ProductLabels Labels
 

Public Member Functions

 PFTau3ProngReco (const edm::ParameterSet &iConfig)
 
void produce (edm::Event &, const edm::EventSetup &) override
 
 ~PFTau3ProngReco () override
 
- Public Member Functions inherited from edm::EDProducer
 EDProducer ()
 
SerialTaskQueueglobalLuminosityBlocksQueue ()
 
SerialTaskQueueglobalRunsQueue ()
 
ModuleDescription const & moduleDescription () const
 
 ~EDProducer () override
 
- Public Member Functions inherited from edm::ProducerBase
void callWhenNewProductsRegistered (std::function< void(BranchDescription const &)> const &func)
 
std::vector< edm::ProductResolverIndex > const & indiciesForPutProducts (BranchType iBranchType) const
 
 ProducerBase ()
 
std::vector< edm::ProductResolverIndex > const & putTokenIndexToProductResolverIndex () const
 
void registerProducts (ProducerBase *, ProductRegistry *, ModuleDescription const &)
 
std::function< void(BranchDescription const &)> registrationCallback () const
 used by the fwk to register list of products More...
 
void resolvePutIndicies (BranchType iBranchType, ModuleToResolverIndicies const &iIndicies, std::string const &moduleLabel)
 
 ~ProducerBase () noexcept(false) override
 
- Public Member Functions inherited from edm::EDConsumerBase
std::vector< ConsumesInfoconsumesInfo () const
 
void convertCurrentProcessAlias (std::string const &processName)
 Convert "@currentProcess" in InputTag process names to the actual current process name. More...
 
 EDConsumerBase ()
 
 EDConsumerBase (EDConsumerBase const &)=delete
 
 EDConsumerBase (EDConsumerBase &&)=default
 
ESProxyIndex const * esGetTokenIndices (edm::Transition iTrans) const
 
ProductResolverIndexAndSkipBit indexFrom (EDGetToken, BranchType, TypeID const &) const
 
void itemsMayGet (BranchType, std::vector< ProductResolverIndexAndSkipBit > &) const
 
void itemsToGet (BranchType, std::vector< ProductResolverIndexAndSkipBit > &) const
 
std::vector< ProductResolverIndexAndSkipBit > const & itemsToGetFrom (BranchType iType) const
 
void labelsForToken (EDGetToken iToken, Labels &oLabels) const
 
void modulesWhoseProductsAreConsumed (std::vector< ModuleDescription const * > &modules, ProductRegistry const &preg, std::map< std::string, ModuleDescription const * > const &labelsToDesc, std::string const &processName) const
 
EDConsumerBase const & operator= (EDConsumerBase const &)=delete
 
EDConsumerBaseoperator= (EDConsumerBase &&)=default
 
bool registeredToConsume (ProductResolverIndex, bool, BranchType) const
 
bool registeredToConsumeMany (TypeID const &, BranchType) const
 
ProductResolverIndexAndSkipBit uncheckedIndexFrom (EDGetToken) const
 
void updateLookup (BranchType iBranchType, ProductResolverIndexHelper const &, bool iPrefetchMayGet)
 
void updateLookup (eventsetup::ESRecordsToProxyIndices const &)
 
virtual ~EDConsumerBase () noexcept(false)
 

Private Attributes

int Algorithm_
 
std::unique_ptr< StringCutObjectSelector< reco::PFTau > > cut_
 
DiscCutPairVec discriminators_
 
KinematicParticleVertexFitter kpvFitter_
 
int ndfPVT_
 
edm::InputTag PFTauTag_
 
edm::InputTag PFTauTIPTag_
 

Additional Inherited Members

- Static Public Member Functions inherited from edm::EDProducer
static const std::string & baseType ()
 
static void fillDescriptions (ConfigurationDescriptions &descriptions)
 
static void prevalidate (ConfigurationDescriptions &descriptions)
 
static bool wantsGlobalLuminosityBlocks ()
 
static bool wantsGlobalRuns ()
 
static bool wantsStreamLuminosityBlocks ()
 
static bool wantsStreamRuns ()
 
- Protected Member Functions inherited from edm::ProducerBase
ProducesCollector producesCollector ()
 
- Protected Member Functions inherited from edm::EDConsumerBase
template<typename ProductType , BranchType B = InEvent>
EDGetTokenT< ProductType > consumes (edm::InputTag const &tag)
 
EDGetToken consumes (const TypeToGet &id, edm::InputTag const &tag)
 
template<BranchType B>
EDGetToken consumes (TypeToGet const &id, edm::InputTag const &tag)
 
ConsumesCollector consumesCollector ()
 Use a ConsumesCollector to gather consumes information from helper functions. More...
 
template<typename ProductType , BranchType B = InEvent>
void consumesMany ()
 
void consumesMany (const TypeToGet &id)
 
template<BranchType B>
void consumesMany (const TypeToGet &id)
 
template<typename ESProduct , typename ESRecord , Transition Tr = Transition::Event>
auto esConsumes ()
 
template<typename ESProduct , typename ESRecord , Transition Tr = Transition::Event>
auto esConsumes (ESInputTag const &tag)
 
template<typename ProductType , BranchType B = InEvent>
EDGetTokenT< ProductType > mayConsume (edm::InputTag const &tag)
 
EDGetToken mayConsume (const TypeToGet &id, edm::InputTag const &tag)
 
template<BranchType B>
EDGetToken mayConsume (const TypeToGet &id, edm::InputTag const &tag)
 

Detailed Description

Definition at line 71 of file PFTau3ProngReco.cc.

Member Typedef Documentation

Definition at line 83 of file PFTau3ProngReco.cc.

Member Enumeration Documentation

Enumerator
useKalmanFit 
useTrackHelix 

Definition at line 73 of file PFTau3ProngReco.cc.

Constructor & Destructor Documentation

PFTau3ProngReco::PFTau3ProngReco ( const edm::ParameterSet iConfig)
explicit

Definition at line 99 of file PFTau3ProngReco.cc.

References PFTau3ProngReco::DiscCutPair::cut_, cut_, PFTau3ProngReco::DiscCutPair::cutFormula_, PDWG_TauSkim_cff::discriminators, discriminators_, edm::ParameterSet::exists(), edm::ParameterSet::getParameter(), PFTau3ProngReco::DiscCutPair::inputTag_, muonDTDigis_cfi::pset, and AlCaHLTBitMon_QueryRunRegistry::string.

100  : PFTauTag_(iConfig.getParameter<edm::InputTag>("PFTauTag")),
101  PFTauTIPTag_(iConfig.getParameter<edm::InputTag>("PFTauTIPTag")),
102  Algorithm_(iConfig.getParameter<int>("Algorithm")),
103  ndfPVT_(iConfig.getUntrackedParameter("ndfPVT", (int)5)) {
105  std::vector<edm::ParameterSet> discriminators =
106  iConfig.getParameter<std::vector<edm::ParameterSet>>("discriminators");
107  // Build each of our cuts
108  for (auto const& pset : discriminators) {
109  DiscCutPair* newCut = new DiscCutPair();
110  newCut->inputTag_ = pset.getParameter<edm::InputTag>("discriminator");
111  if (pset.existsAs<std::string>("selectionCut"))
112  newCut->cutFormula_ = new TFormula("selectionCut", pset.getParameter<std::string>("selectionCut").data());
113  else
114  newCut->cut_ = pset.getParameter<double>("selectionCut");
115  discriminators_.push_back(newCut);
116  }
117  // Build a string cut if desired
118  if (iConfig.exists("cut"))
119  cut_ = std::make_unique<StringCutObjectSelector<reco::PFTau>>(iConfig.getParameter<std::string>("cut"));
121  produces<edm::AssociationVector<PFTauRefProd, std::vector<reco::PFTau3ProngSummaryRef>>>();
122  produces<PFTau3ProngSummaryCollection>("PFTau3ProngSummary");
123 }
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
std::unique_ptr< StringCutObjectSelector< reco::PFTau > > cut_
bool exists(std::string const &parameterName) const
checks if a parameter exists
edm::InputTag PFTauTIPTag_
DiscCutPairVec discriminators_
edm::InputTag PFTauTag_
PFTau3ProngReco::~PFTau3ProngReco ( )
override

Member Function Documentation

void PFTau3ProngReco::produce ( edm::Event iEvent,
const edm::EventSetup iSetup 
)
override

Definition at line 146 of file PFTau3ProngReco.cc.

References PdtPdgMini::a_1_plus, funct::abs(), reco::PFTau3ProngSummary::AddSolution(), Algorithm_, TransientTrackBuilder::build(), HltBtagPostValidation_cff::c, HLT_2018_cff::cands, ALCARECOTkAlJpsiMuMu_cff::charge, cut_, ztail::d, DEFINE_FWK_MODULE, TtSemiLepEvtBuilder_cfi::disc, discriminators_, MillePedeFileConverter_cfg::e, TransientTrackBuilder::field(), tauImpactParameter::TauA1NuConstrainedFitter::fit(), KinematicParticleVertexFitter::fit(), edm::EventSetup::get(), edm::Event::getByLabel(), tauImpactParameter::TauA1NuConstrainedFitter::getMother(), edm::Event::getRefBeforePut(), tauImpactParameter::TauA1NuConstrainedFitter::getRefitDaughters(), getTrack(), mps_fire::i, MagneticField::inInverseGeV(), edm::HandleBase::isValid(), dqmiolumiharvest::j, edm::Ref< C, T, F >::key(), kpvFitter_, eostools::move(), ndfPVT_, HLTMuonOfflineAnalyzer_cfi::NVertex, tauImpactParameter::LorentzVectorParticle::p4(), p4, KinematicParticleFactoryFromTransientTrack::particle(), TriggerAnalyzer::passed, EgammaValidation_cff::pdgid, EgammaValidation_cff::pdgId, PFTauTag_, PFTauTIPTag_, tauImpactParameter::PDGInfo::pi_mass(), BeamMonitor_cff::primaryVertex, edm::Event::put(), MetAnalyzer::pv(), TrackCollections2monitor_cff::selectedTracks, pfDeepBoostedJetPreprocessParams_cfi::sv, L1TRate_Offline_cfi::Tau, metsig::tau, HLT_2018_cff::track, gather_cfg::Tracks, useKalmanFit, useTrackHelix, and PV3DBase< T, PVType, FrameType >::z().

146  {
147  // Obtain Collections
148  edm::ESHandle<TransientTrackBuilder> transTrackBuilder;
149  iSetup.get<TransientTrackRecord>().get("TransientTrackBuilder", transTrackBuilder);
150 
152  iEvent.getByLabel(PFTauTag_, Tau);
153 
155  iEvent.getByLabel(PFTauTIPTag_, TIPAV);
156 
157  auto AVPFTau3PS = std::make_unique<edm::AssociationVector<PFTauRefProd, std::vector<reco::PFTau3ProngSummaryRef>>>(
158  PFTauRefProd(Tau));
159  auto PFTau3PSCollection_out = std::make_unique<PFTau3ProngSummaryCollection>();
160  reco::PFTau3ProngSummaryRefProd PFTau3RefProd_out =
161  iEvent.getRefBeforePut<reco::PFTau3ProngSummaryCollection>("PFTau3ProngSummary");
162 
163  // Load each discriminator
164  for (auto& disc : discriminators_) {
165  iEvent.getByLabel(disc->inputTag_, disc->handle_);
166  }
167 
168  // For each Tau Run Algorithim
169  if (Tau.isValid()) {
170  for (reco::PFTauCollection::size_type iPFTau = 0; iPFTau < Tau->size(); iPFTau++) {
171  reco::PFTauRef tau(Tau, iPFTau);
172  reco::PFTau3ProngSummary PFTau3PS;
174  // Check if it passed all the discrimiantors
175  bool passed(true);
176  for (auto const& disc : discriminators_) {
177  // Check this discriminator passes
178  bool passedDisc = true;
179  if (disc->cutFormula_)
180  passedDisc = (disc->cutFormula_->Eval((*disc->handle_)[tau]) > 0.5);
181  else
182  passedDisc = ((*disc->handle_)[tau] > disc->cut_);
183  if (!passedDisc) {
184  passed = false;
185  break;
186  }
187  }
188  if (passed && cut_.get()) {
189  passed = (*cut_)(*tau);
190  }
191  if (passed) {
192  PDGInfo pdgInfo;
193  const reco::PFTauTransverseImpactParameterRef theTIP = TIPAV->value(tau.key());
194  const reco::VertexRef primaryVertex = theTIP->primaryVertex();
196  // Now compute the 3 prong Tau
197  bool SecondaryVtxOK(false);
199  if (theTIP->hasSecondaryVertex() && primaryVertex->ndof() > ndfPVT_) {
200  const VertexRef secVtx = theTIP->secondaryVertex();
201  GlobalPoint sv(secVtx->position().x(), secVtx->position().y(), secVtx->position().z());
202  double vtxchi2(0), vtxndf(1);
203  if (useKalmanFit == Algorithm_) {
204  vtxchi2 = secVtx->chi2();
205  vtxndf = secVtx->ndof();
206  const std::vector<reco::Track>& selectedTracks = secVtx->refittedTracks();
207  std::vector<reco::TransientTrack> transTrkVect;
208  for (unsigned int i = 0; i != selectedTracks.size(); i++)
209  transTrkVect.push_back(transTrackBuilder->build(selectedTracks[i]));
211  float piMassSigma(1.e-6), piChi(0.0), piNdf(0.0);
212  std::vector<RefCountedKinematicParticle> pions;
213  for (unsigned int i = 0; i < transTrkVect.size(); i++)
214  pions.push_back(kinFactory.particle(transTrkVect[i], pdgInfo.pi_mass(), piChi, piNdf, sv, piMassSigma));
215  RefCountedKinematicTree jpTree = kpvFitter_.fit(pions);
216  jpTree->movePointerToTheTop();
217  const KinematicParameters parameters = jpTree->currentParticle()->currentState().kinematicParameters();
218  AlgebraicSymMatrix77 cov = jpTree->currentParticle()->currentState().kinematicParametersError().matrix();
219  // get pions
220  double c(0);
221  std::vector<reco::Track> Tracks;
222  std::vector<LorentzVectorParticle> ReFitPions;
223  for (unsigned int i = 0; i < transTrkVect.size(); i++) {
224  c += transTrkVect[i].charge();
225  ReFitPions.push_back(ParticleBuilder::createLorentzVectorParticle(transTrkVect[i], *secVtx, true, true));
226  }
227  // now covert a1 into LorentzVectorParticle
228  TVectorT<double> a1_par(LorentzVectorParticle::NLorentzandVertexPar);
229  TMatrixTSym<double> a1_cov(LorentzVectorParticle::NLorentzandVertexPar);
230  for (int i = 0; i < LorentzVectorParticle::NLorentzandVertexPar; i++) {
231  a1_par(i) = parameters(i);
232  for (int j = 0; j < LorentzVectorParticle::NLorentzandVertexPar; j++) {
233  a1_cov(i, j) = cov(i, j);
234  }
235  }
237  a1_par, a1_cov, abs(PdtPdgMini::a_1_plus) * c, c, transTrackBuilder->field()->inInverseGeV(sv).z());
238  SecondaryVtxOK = true;
239  PFTau3PS = reco::PFTau3ProngSummary(theTIP, a1.p4(), vtxchi2, vtxndf);
240  } else if (useTrackHelix == Algorithm_) {
241  // use Track Helix
242  std::vector<TrackParticle> pions;
243  GlobalPoint pvpoint(
244  primaryVertex->position().x(), primaryVertex->position().y(), primaryVertex->position().z());
245  const std::vector<edm::Ptr<reco::Candidate>> cands = tau->signalChargedHadrCands();
246  for (std::vector<edm::Ptr<reco::Candidate>>::const_iterator iter = cands.begin(); iter != cands.end();
247  ++iter) {
248  const reco::Track* track = getTrack(**iter);
249  if (track != nullptr) {
250  reco::TransientTrack transTrk = transTrackBuilder->build(*track);
251  pions.push_back(ParticleBuilder::createTrackParticle(transTrk, pvpoint, true, true));
252  }
253  }
254  TVector3 pv(secVtx->position().x(), secVtx->position().y(), secVtx->position().z());
255  Chi2VertexFitter chi2v(pions, pv);
256  SecondaryVtxOK = chi2v.fit();
257  double c(0);
258  for (unsigned int i = 0; i < pions.size(); i++) {
259  c += pions[i].charge();
260  }
261  int pdgid = abs(PdtPdgMini::a_1_plus) * c;
262  a1 = chi2v.getMother(pdgid);
263  PFTau3PS = reco::PFTau3ProngSummary(theTIP, a1.p4(), vtxchi2, vtxndf);
264  }
265  }
266  if (SecondaryVtxOK) {
267  // Tau Solver
268  TVector3 pv(primaryVertex->position().x(), primaryVertex->position().y(), primaryVertex->position().z());
269  TMatrixTSym<double> pvcov(LorentzVectorParticle::NVertex);
271  primaryVertex->fill(pvCov);
272  for (int i = 0; i < LorentzVectorParticle::NVertex; i++) {
273  for (int j = 0; j < LorentzVectorParticle::NVertex; j++) {
274  pvcov(i, j) = pvCov(i, j);
275  }
276  }
277  for (unsigned int i = 0; i < PFTau3ProngSummary::nsolutions; i++) {
278  TauA1NuConstrainedFitter TauA1NU(i, a1, pv, pvcov);
279  bool isFitOK = TauA1NU.fit();
280  if (isFitOK) {
281  LorentzVectorParticle theTau = TauA1NU.getMother();
282  std::vector<LorentzVectorParticle> daughter = TauA1NU.getRefitDaughters();
283  std::vector<TLorentzVector> daughter_p4;
284  std::vector<int> daughter_charge, daughter_PDGID;
285  for (unsigned int d = 0; d < daughter.size(); d++) {
286  daughter_p4.push_back(daughter[d].p4());
287  daughter_charge.push_back((int)daughter[d].charge());
288  daughter_PDGID.push_back(daughter[d].pdgId());
289  }
290  PFTau3PS.AddSolution(i, theTau.p4(), daughter_p4, daughter_charge, daughter_PDGID, (isFitOK), 0.0, -999);
291  }
292  }
293  }
294  }
295  reco::PFTau3ProngSummaryRef PFTau3PSRef =
296  reco::PFTau3ProngSummaryRef(PFTau3RefProd_out, PFTau3PSCollection_out->size());
297  PFTau3PSCollection_out->push_back(PFTau3PS);
298  AVPFTau3PS->setValue(iPFTau, PFTau3PSRef);
299  }
300  }
301  iEvent.put(std::move(PFTau3PSCollection_out), "PFTau3ProngSummary");
302  iEvent.put(std::move(AVPFTau3PS));
303 }
NVertex
parameters for fixed-width plots
std::vector< reco::PFTau3ProngSummary > PFTau3ProngSummaryCollection
collection of PFTau3ProngSummary objects
KinematicParticleVertexFitter kpvFitter_
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:131
std::unique_ptr< StringCutObjectSelector< reco::PFTau > > cut_
reco::TransientTrack build(const reco::Track *p) const
edm::InputTag PFTauTIPTag_
ErrorD< N >::type type
Definition: Error.h:32
edm::RefProd< PFTauCollection > PFTauRefProd
references to PFTau collection
Definition: PFTauFwd.h:15
uint16_t size_type
GlobalVector inInverseGeV(const GlobalPoint &gp) const
Field value ad specified global point, in 1/Gev.
Definition: MagneticField.h:36
double p4[4]
Definition: TauolaWrapper.h:92
T z() const
Definition: PV3DBase.h:61
const MagneticField * field() const
def pv(vc)
Definition: MetAnalyzer.py:7
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
static double pi_mass()
Definition: PDGInfo.h:13
DiscCutPairVec discriminators_
bool isValid() const
Definition: HandleBase.h:70
RefCountedKinematicTree fit(const std::vector< RefCountedKinematicParticle > &particles) const
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:488
d
Definition: ztail.py:151
RefProd< PROD > getRefBeforePut()
Definition: Event.h:156
edm::Ref< PFTau3ProngSummaryCollection > PFTau3ProngSummaryRef
presistent reference to a PFTau3ProngSummary
static const TrackGhostTrackState * getTrack(const BasicGhostTrackState *basic)
virtual bool AddSolution(unsigned int solution, const TLorentzVector &tau, const std::vector< TLorentzVector > &daughter_p4, const std::vector< int > &daughter_charge, const std::vector< int > &daughter_PDGID, bool has3ProngSolution, double solutionChi2, double thetaGJsig)
ROOT::Math::SMatrix< double, 7, 7, ROOT::Math::MatRepSym< double, 7 > > AlgebraicSymMatrix77
Definition: Matrices.h:9
T get() const
Definition: EventSetup.h:73
RefCountedKinematicParticle particle(const reco::TransientTrack &initialTrack, const ParticleMass &massGuess, float chiSquared, float degreesOfFr, float &m_sigma) const
edm::InputTag PFTauTag_
primaryVertex
hltOfflineBeamSpot for HLTMON
def move(src, dest)
Definition: eostools.py:511

Member Data Documentation

int PFTau3ProngReco::Algorithm_
private

Definition at line 92 of file PFTau3ProngReco.cc.

Referenced by produce().

std::unique_ptr<StringCutObjectSelector<reco::PFTau> > PFTau3ProngReco::cut_
private

Definition at line 94 of file PFTau3ProngReco.cc.

Referenced by PFTau3ProngReco(), and produce().

DiscCutPairVec PFTau3ProngReco::discriminators_
private

Definition at line 93 of file PFTau3ProngReco.cc.

Referenced by PFTau3ProngReco(), and produce().

KinematicParticleVertexFitter PFTau3ProngReco::kpvFitter_
private

Definition at line 96 of file PFTau3ProngReco.cc.

Referenced by produce().

int PFTau3ProngReco::ndfPVT_
private

Definition at line 95 of file PFTau3ProngReco.cc.

Referenced by produce().

edm::InputTag PFTau3ProngReco::PFTauTag_
private

Definition at line 90 of file PFTau3ProngReco.cc.

Referenced by produce().

edm::InputTag PFTau3ProngReco::PFTauTIPTag_
private

Definition at line 91 of file PFTau3ProngReco.cc.

Referenced by produce().