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
 
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)
 
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 ESProduct , Transition Tr = Transition::Event>
auto esConsumes (eventsetup::EventSetupRecordKey const &, 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 98 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.

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

Definition at line 121 of file PFTau3ProngReco.cc.

121  {
122 
123 }

Member Function Documentation

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

Definition at line 125 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(), 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, gather_cfg::Tracks, useKalmanFit, useTrackHelix, and PV3DBase< T, PVType, FrameType >::z().

125  {
126  // Obtain Collections
127  edm::ESHandle<TransientTrackBuilder> transTrackBuilder;
128  iSetup.get<TransientTrackRecord>().get("TransientTrackBuilder",transTrackBuilder);
129 
131  iEvent.getByLabel(PFTauTag_,Tau);
132 
134  iEvent.getByLabel(PFTauTIPTag_,TIPAV);
135 
136  auto AVPFTau3PS = std::make_unique<edm::AssociationVector<PFTauRefProd, std::vector<reco::PFTau3ProngSummaryRef>>>(PFTauRefProd(Tau));
137  auto PFTau3PSCollection_out = std::make_unique<PFTau3ProngSummaryCollection>();
138  reco::PFTau3ProngSummaryRefProd PFTau3RefProd_out = iEvent.getRefBeforePut<reco::PFTau3ProngSummaryCollection>("PFTau3ProngSummary");
139 
140  // Load each discriminator
141  for(auto& disc : discriminators_) {iEvent.getByLabel(disc->inputTag_, disc->handle_);}
142 
143  // For each Tau Run Algorithim
144  if(Tau.isValid()){
145  for(reco::PFTauCollection::size_type iPFTau = 0; iPFTau < Tau->size(); iPFTau++) {
146  reco::PFTauRef tau(Tau, iPFTau);
147  reco::PFTau3ProngSummary PFTau3PS;
149  // Check if it passed all the discrimiantors
150  bool passed(true);
151  for(auto const& disc : discriminators_) {
152  // Check this discriminator passes
153  bool passedDisc = true;
154  if ( disc->cutFormula_ )passedDisc = (disc->cutFormula_->Eval((*disc->handle_)[tau]) > 0.5);
155  else passedDisc = ((*disc->handle_)[tau] > disc->cut_);
156  if ( !passedDisc ){passed = false; break;}
157  }
158  if (passed && cut_.get()){passed = (*cut_)(*tau);}
159  if (passed){
160  PDGInfo pdgInfo;
161  const reco::PFTauTransverseImpactParameterRef theTIP=TIPAV->value(tau.key());
162  const reco::VertexRef primaryVertex=theTIP->primaryVertex();
164  // Now compute the 3 prong Tau
165  bool SecondaryVtxOK(false);
167  if(theTIP->hasSecondaryVertex() && primaryVertex->ndof()>ndfPVT_){
168  const VertexRef secVtx=theTIP->secondaryVertex();
169  GlobalPoint sv(secVtx->position().x(),secVtx->position().y(),secVtx->position().z());
170  double vtxchi2(0), vtxndf(1);
172  vtxchi2=secVtx->chi2();
173  vtxndf=secVtx->ndof();
174  const std::vector<reco::Track>& selectedTracks=secVtx->refittedTracks();
175  std::vector<reco::TransientTrack> transTrkVect;
176  for(unsigned int i = 0; i!=selectedTracks.size();i++) transTrkVect.push_back(transTrackBuilder->build(selectedTracks[i]));
178  float piMassSigma(1.e-6), piChi(0.0), piNdf(0.0);
179  std::vector<RefCountedKinematicParticle> pions;
180  for(unsigned int i = 0; i<transTrkVect.size();i++) pions.push_back(kinFactory.particle(transTrkVect[i],pdgInfo.pi_mass(),piChi,piNdf,sv,piMassSigma));
181  RefCountedKinematicTree jpTree = kpvFitter_.fit(pions);
182  jpTree->movePointerToTheTop();
183  const KinematicParameters parameters = jpTree->currentParticle()->currentState().kinematicParameters();
184  AlgebraicSymMatrix77 cov=jpTree->currentParticle()->currentState().kinematicParametersError().matrix();
185  // get pions
186  double c(0);
187  std::vector<reco::Track> Tracks;
188  std::vector<LorentzVectorParticle> ReFitPions;
189  for(unsigned int i=0;i<transTrkVect.size();i++){
190  c+=transTrkVect[i].charge();
191  ReFitPions.push_back(ParticleBuilder::createLorentzVectorParticle(transTrkVect[i],*secVtx,true,true));
192  }
193  // now covert a1 into LorentzVectorParticle
194  TVectorT<double> a1_par(LorentzVectorParticle::NLorentzandVertexPar);
195  TMatrixTSym<double> a1_cov(LorentzVectorParticle::NLorentzandVertexPar);
196  for(int i = 0; i<LorentzVectorParticle::NLorentzandVertexPar; i++){
197  a1_par(i)=parameters(i);
198  for(int j = 0; j<LorentzVectorParticle::NLorentzandVertexPar; j++){
199  a1_cov(i,j)=cov(i,j);
200  }
201  }
202  a1=LorentzVectorParticle(a1_par,a1_cov,abs(PdtPdgMini::a_1_plus)*c,c,transTrackBuilder->field()->inInverseGeV(sv).z());
203  SecondaryVtxOK=true;
204  PFTau3PS=reco::PFTau3ProngSummary(theTIP,a1.p4(),vtxchi2,vtxndf);
205  }
206  else if(useTrackHelix==Algorithm_){
207  // use Track Helix
208  std::vector<TrackParticle> pions;
209  GlobalPoint pvpoint(primaryVertex->position().x(),primaryVertex->position().y(),primaryVertex->position().z());
210  const std::vector<edm::Ptr<reco::PFCandidate> > cands = tau->signalPFChargedHadrCands();
211  for (std::vector<edm::Ptr<reco::PFCandidate> >::const_iterator iter = cands.begin(); iter!=cands.end(); ++iter) {
212  if(iter->get()->trackRef().isNonnull()){
213  reco::TransientTrack transTrk=transTrackBuilder->build(iter->get()->trackRef());
214  pions.push_back(ParticleBuilder::createTrackParticle(transTrk,pvpoint,true,true));
215  }
216  else if(iter->get()->gsfTrackRef().isNonnull()){
217  //reco::TransientTrack transTrk=transTrackBuilder->build(iter->get()->gsfTrackRef());
218  //pions.push_back(ParticleBuilder::CreateTrackParticle(transTrk,pvpoint,true,true));
219  }
220  }
221  TVector3 pv(secVtx->position().x(),secVtx->position().y(),secVtx->position().z());
222  Chi2VertexFitter chi2v(pions,pv);
223  SecondaryVtxOK=chi2v.fit();
224  double c(0); for(unsigned int i=0;i<pions.size();i++){c+=pions[i].charge();}
226  a1=chi2v.getMother(pdgid);
227  PFTau3PS =reco::PFTau3ProngSummary(theTIP,a1.p4(),vtxchi2,vtxndf);
228  }
229  }
230  if(SecondaryVtxOK){
231  // Tau Solver
232  TVector3 pv(primaryVertex->position().x(),primaryVertex->position().y(),primaryVertex->position().z());
233  TMatrixTSym<double> pvcov(LorentzVectorParticle::NVertex);
235  primaryVertex->fill(pvCov);
236  for(int i = 0; i<LorentzVectorParticle::NVertex; i++){
237  for(int j = 0; j<LorentzVectorParticle::NVertex; j++){
238  pvcov(i,j)=pvCov(i,j);
239  }
240  }
241  for(unsigned int i=0; i<PFTau3ProngSummary::nsolutions;i++){
242  TauA1NuConstrainedFitter TauA1NU(i,a1,pv,pvcov);
243  bool isFitOK=TauA1NU.fit();
244  if(isFitOK){
245  LorentzVectorParticle theTau=TauA1NU.getMother();
246  std::vector<LorentzVectorParticle> daughter=TauA1NU.getRefitDaughters();
247  std::vector<TLorentzVector> daughter_p4;
248  std::vector<int> daughter_charge,daughter_PDGID;
249  for(unsigned int d=0;d<daughter.size();d++){
250  daughter_p4.push_back(daughter[d].p4());
251  daughter_charge.push_back((int)daughter[d].charge());
252  daughter_PDGID.push_back(daughter[d].pdgId());
253  }
254  PFTau3PS.AddSolution(i,theTau.p4(),daughter_p4,daughter_charge,daughter_PDGID,(isFitOK),0.0,-999);
255  }
256  }
257  }
258  }
259  reco::PFTau3ProngSummaryRef PFTau3PSRef=reco::PFTau3ProngSummaryRef(PFTau3RefProd_out,PFTau3PSCollection_out->size());
260  PFTau3PSCollection_out->push_back(PFTau3PS);
261  AVPFTau3PS->setValue(iPFTau,PFTau3PSRef);
262  }
263  }
264  iEvent.put(std::move(PFTau3PSCollection_out),"PFTau3ProngSummary");
265  iEvent.put(std::move(AVPFTau3PS));
266 }
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:137
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:535
RefProd< PROD > getRefBeforePut()
Definition: Event.h:167
edm::Ref< PFTau3ProngSummaryCollection > PFTau3ProngSummaryRef
presistent reference to a PFTau3ProngSummary
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:68
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 91 of file PFTau3ProngReco.cc.

Referenced by produce().

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

Definition at line 93 of file PFTau3ProngReco.cc.

Referenced by PFTau3ProngReco(), and produce().

DiscCutPairVec PFTau3ProngReco::discriminators_
private

Definition at line 92 of file PFTau3ProngReco.cc.

Referenced by PFTau3ProngReco(), and produce().

KinematicParticleVertexFitter PFTau3ProngReco::kpvFitter_
private

Definition at line 95 of file PFTau3ProngReco.cc.

Referenced by produce().

int PFTau3ProngReco::ndfPVT_
private

Definition at line 94 of file PFTau3ProngReco.cc.

Referenced by produce().

edm::InputTag PFTau3ProngReco::PFTauTag_
private

Definition at line 89 of file PFTau3ProngReco.cc.

Referenced by produce().

edm::InputTag PFTau3ProngReco::PFTauTIPTag_
private

Definition at line 90 of file PFTau3ProngReco.cc.

Referenced by produce().