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::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 72 of file PFTau3ProngReco.cc.

Member Typedef Documentation

Definition at line 84 of file PFTau3ProngReco.cc.

Member Enumeration Documentation

Enumerator
useKalmanFit 
useTrackHelix 

Definition at line 74 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_, pfDeepCMVADiscriminatorsJetTags_cfi::discriminators, discriminators_, edm::ParameterSet::exists(), edm::ParameterSet::getParameter(), PFTau3ProngReco::DiscCutPair::inputTag_, muonDTDigis_cfi::pset, and AlCaHLTBitMon_QueryRunRegistry::string.

99  :
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))
104 {
106  std::vector<edm::ParameterSet> discriminators =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") ) newCut->cutFormula_ = new TFormula("selectionCut", pset.getParameter<std::string>("selectionCut").data());
112  else newCut->cut_ = pset.getParameter<double>("selectionCut");
113  discriminators_.push_back(newCut);
114  }
115  // Build a string cut if desired
116  if (iConfig.exists("cut")) cut_ = std::make_unique<StringCutObjectSelector<reco::PFTau>>(iConfig.getParameter<std::string>("cut"));
118  produces<edm::AssociationVector<PFTauRefProd, std::vector<reco::PFTau3ProngSummaryRef> > >();
119  produces<PFTau3ProngSummaryCollection>("PFTau3ProngSummary");
120 }
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 143 of file PFTau3ProngReco.cc.

References PdtPdgMini::a_1_plus, funct::abs(), reco::PFTau3ProngSummary::AddSolution(), Algorithm_, TransientTrackBuilder::build(), EnergyCorrector::c, egammaForCoreTracking_cff::cands, ALCARECOTkAlJpsiMuMu_cff::charge, cut_, edmIntegrityCheck::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(), edm::Ref< C, T, F >::key(), kpvFitter_, eostools::move(), ndfPVT_, tauImpactParameter::LorentzVectorParticle::p4(), p4, KinematicParticleFactoryFromTransientTrack::particle(), TriggerAnalyzer::passed, BPhysicsValidation_cfi::pdgid, common_cff::pdgId, PFTauTag_, PFTauTIPTag_, tauImpactParameter::PDGInfo::pi_mass(), impactParameterTagInfos_cfi::primaryVertex, edm::Event::put(), MetAnalyzer::pv(), trackingPlots::selectedTracks, pfDeepBoostedJetPreprocessParams_cfi::sv, metsig::tau, HiIsolationCommonParameters_cff::track, gather_cfg::Tracks, useKalmanFit, useTrackHelix, and PV3DBase< T, PVType, FrameType >::z().

143  {
144  // Obtain Collections
145  edm::ESHandle<TransientTrackBuilder> transTrackBuilder;
146  iSetup.get<TransientTrackRecord>().get("TransientTrackBuilder",transTrackBuilder);
147 
149  iEvent.getByLabel(PFTauTag_,Tau);
150 
152  iEvent.getByLabel(PFTauTIPTag_,TIPAV);
153 
154  auto AVPFTau3PS = std::make_unique<edm::AssociationVector<PFTauRefProd, std::vector<reco::PFTau3ProngSummaryRef>>>(PFTauRefProd(Tau));
155  auto PFTau3PSCollection_out = std::make_unique<PFTau3ProngSummaryCollection>();
156  reco::PFTau3ProngSummaryRefProd PFTau3RefProd_out = iEvent.getRefBeforePut<reco::PFTau3ProngSummaryCollection>("PFTau3ProngSummary");
157 
158  // Load each discriminator
159  for(auto& disc : discriminators_) {iEvent.getByLabel(disc->inputTag_, disc->handle_);}
160 
161  // For each Tau Run Algorithim
162  if(Tau.isValid()){
163  for(reco::PFTauCollection::size_type iPFTau = 0; iPFTau < Tau->size(); iPFTau++) {
164  reco::PFTauRef tau(Tau, iPFTau);
165  reco::PFTau3ProngSummary PFTau3PS;
167  // Check if it passed all the discrimiantors
168  bool passed(true);
169  for(auto const& disc : discriminators_) {
170  // Check this discriminator passes
171  bool passedDisc = true;
172  if ( disc->cutFormula_ )passedDisc = (disc->cutFormula_->Eval((*disc->handle_)[tau]) > 0.5);
173  else passedDisc = ((*disc->handle_)[tau] > disc->cut_);
174  if ( !passedDisc ){passed = false; break;}
175  }
176  if (passed && cut_.get()){passed = (*cut_)(*tau);}
177  if (passed){
178  PDGInfo pdgInfo;
179  const reco::PFTauTransverseImpactParameterRef theTIP=TIPAV->value(tau.key());
180  const reco::VertexRef primaryVertex=theTIP->primaryVertex();
182  // Now compute the 3 prong Tau
183  bool SecondaryVtxOK(false);
185  if(theTIP->hasSecondaryVertex() && primaryVertex->ndof()>ndfPVT_){
186  const VertexRef secVtx=theTIP->secondaryVertex();
187  GlobalPoint sv(secVtx->position().x(),secVtx->position().y(),secVtx->position().z());
188  double vtxchi2(0), vtxndf(1);
190  vtxchi2=secVtx->chi2();
191  vtxndf=secVtx->ndof();
192  const std::vector<reco::Track>& selectedTracks=secVtx->refittedTracks();
193  std::vector<reco::TransientTrack> transTrkVect;
194  for(unsigned int i = 0; i!=selectedTracks.size();i++) transTrkVect.push_back(transTrackBuilder->build(selectedTracks[i]));
196  float piMassSigma(1.e-6), piChi(0.0), piNdf(0.0);
197  std::vector<RefCountedKinematicParticle> pions;
198  for(unsigned int i = 0; i<transTrkVect.size();i++) pions.push_back(kinFactory.particle(transTrkVect[i],pdgInfo.pi_mass(),piChi,piNdf,sv,piMassSigma));
199  RefCountedKinematicTree jpTree = kpvFitter_.fit(pions);
200  jpTree->movePointerToTheTop();
201  const KinematicParameters parameters = jpTree->currentParticle()->currentState().kinematicParameters();
202  AlgebraicSymMatrix77 cov=jpTree->currentParticle()->currentState().kinematicParametersError().matrix();
203  // get pions
204  double c(0);
205  std::vector<reco::Track> Tracks;
206  std::vector<LorentzVectorParticle> ReFitPions;
207  for(unsigned int i=0;i<transTrkVect.size();i++){
208  c+=transTrkVect[i].charge();
209  ReFitPions.push_back(ParticleBuilder::createLorentzVectorParticle(transTrkVect[i],*secVtx,true,true));
210  }
211  // now covert a1 into LorentzVectorParticle
212  TVectorT<double> a1_par(LorentzVectorParticle::NLorentzandVertexPar);
213  TMatrixTSym<double> a1_cov(LorentzVectorParticle::NLorentzandVertexPar);
214  for(int i = 0; i<LorentzVectorParticle::NLorentzandVertexPar; i++){
215  a1_par(i)=parameters(i);
216  for(int j = 0; j<LorentzVectorParticle::NLorentzandVertexPar; j++){
217  a1_cov(i,j)=cov(i,j);
218  }
219  }
220  a1=LorentzVectorParticle(a1_par,a1_cov,abs(PdtPdgMini::a_1_plus)*c,c,transTrackBuilder->field()->inInverseGeV(sv).z());
221  SecondaryVtxOK=true;
222  PFTau3PS=reco::PFTau3ProngSummary(theTIP,a1.p4(),vtxchi2,vtxndf);
223  }
224  else if(useTrackHelix==Algorithm_){
225  // use Track Helix
226  std::vector<TrackParticle> pions;
227  GlobalPoint pvpoint(primaryVertex->position().x(),primaryVertex->position().y(),primaryVertex->position().z());
228  const std::vector<edm::Ptr<reco::Candidate> > cands = tau->signalChargedHadrCands();
229  for (std::vector<edm::Ptr<reco::Candidate> >::const_iterator iter = cands.begin(); iter!=cands.end(); ++iter) {
230  const reco::Track* track = getTrack(**iter);
231  if (track != nullptr) {
232  reco::TransientTrack transTrk=transTrackBuilder->build(*track);
233  pions.push_back(ParticleBuilder::createTrackParticle(transTrk,pvpoint,true,true));
234  }
235 
236  }
237  TVector3 pv(secVtx->position().x(),secVtx->position().y(),secVtx->position().z());
238  Chi2VertexFitter chi2v(pions,pv);
239  SecondaryVtxOK=chi2v.fit();
240  double c(0); for(unsigned int i=0;i<pions.size();i++){c+=pions[i].charge();}
242  a1=chi2v.getMother(pdgid);
243  PFTau3PS =reco::PFTau3ProngSummary(theTIP,a1.p4(),vtxchi2,vtxndf);
244  }
245  }
246  if(SecondaryVtxOK){
247  // Tau Solver
248  TVector3 pv(primaryVertex->position().x(),primaryVertex->position().y(),primaryVertex->position().z());
249  TMatrixTSym<double> pvcov(LorentzVectorParticle::NVertex);
251  primaryVertex->fill(pvCov);
252  for(int i = 0; i<LorentzVectorParticle::NVertex; i++){
253  for(int j = 0; j<LorentzVectorParticle::NVertex; j++){
254  pvcov(i,j)=pvCov(i,j);
255  }
256  }
257  for(unsigned int i=0; i<PFTau3ProngSummary::nsolutions;i++){
258  TauA1NuConstrainedFitter TauA1NU(i,a1,pv,pvcov);
259  bool isFitOK=TauA1NU.fit();
260  if(isFitOK){
261  LorentzVectorParticle theTau=TauA1NU.getMother();
262  std::vector<LorentzVectorParticle> daughter=TauA1NU.getRefitDaughters();
263  std::vector<TLorentzVector> daughter_p4;
264  std::vector<int> daughter_charge,daughter_PDGID;
265  for(unsigned int d=0;d<daughter.size();d++){
266  daughter_p4.push_back(daughter[d].p4());
267  daughter_charge.push_back((int)daughter[d].charge());
268  daughter_PDGID.push_back(daughter[d].pdgId());
269  }
270  PFTau3PS.AddSolution(i,theTau.p4(),daughter_p4,daughter_charge,daughter_PDGID,(isFitOK),0.0,-999);
271  }
272  }
273  }
274  }
275  reco::PFTau3ProngSummaryRef PFTau3PSRef=reco::PFTau3ProngSummaryRef(PFTau3RefProd_out,PFTau3PSCollection_out->size());
276  PFTau3PSCollection_out->push_back(PFTau3PS);
277  AVPFTau3PS->setValue(iPFTau,PFTau3PSRef);
278  }
279  }
280  iEvent.put(std::move(PFTau3PSCollection_out),"PFTau3ProngSummary");
281  iEvent.put(std::move(AVPFTau3PS));
282 }
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:125
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:33
edm::RefProd< PFTauCollection > PFTauRefProd
references to PFTau collection
Definition: PFTauFwd.h:15
uint16_t size_type
ROOT::Math::SMatrix< double, 7, 7, ROOT::Math::MatRepSym< double, 7 > > AlgebraicSymMatrix77
Definition: Matrices.h:9
GlobalVector inInverseGeV(const GlobalPoint &gp) const
Field value ad specified global point, in 1/Gev.
Definition: MagneticField.h:41
double p4[4]
Definition: TauolaWrapper.h:92
T z() const
Definition: PV3DBase.h:64
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:74
RefCountedKinematicTree fit(const std::vector< RefCountedKinematicParticle > &particles) const
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:480
RefProd< PROD > getRefBeforePut()
Definition: Event.h:150
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)
T get() const
Definition: EventSetup.h:71
RefCountedKinematicParticle particle(const reco::TransientTrack &initialTrack, const ParticleMass &massGuess, float chiSquared, float degreesOfFr, float &m_sigma) const
edm::InputTag PFTauTag_
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().