diff --git a/RecoBTag/ImpactParameter/python/impactParameter_cff.py b/RecoBTag/ImpactParameter/python/impactParameter_cff.py index 4d877344a4dd1..5f6a056d5cd9d 100644 --- a/RecoBTag/ImpactParameter/python/impactParameter_cff.py +++ b/RecoBTag/ImpactParameter/python/impactParameter_cff.py @@ -8,13 +8,13 @@ # MVA from RecoBTag.ImpactParameter.impactParameterMVAComputer_cfi import * from RecoBTag.ImpactParameter.impactParameterMVABJetTags_cfi import * -#B Jet Prob +# Jet BProb from RecoBTag.ImpactParameter.jetBProbabilityComputer_cfi import * from RecoBTag.ImpactParameter.jetBProbabilityBJetTags_cfi import * -#Jet Prob +# Jet Prob from RecoBTag.ImpactParameter.jetProbabilityComputer_cfi import * from RecoBTag.ImpactParameter.jetProbabilityBJetTags_cfi import * -# HighEff +# High Eff from RecoBTag.ImpactParameter.trackCounting3D2ndComputer_cfi import * from RecoBTag.ImpactParameter.trackCountingHighEffBJetTags_cfi import * # High Purity @@ -23,8 +23,26 @@ # Negative Tags -from RecoBTag.ImpactParameter.negativeTrackCountingHighEffJetTags_cfi import * -from RecoBTag.ImpactParameter.negativeTrackCountingHighPurJetTags_cfi import * +# Jet BProb +from RecoBTag.ImpactParameter.negativeOnlyJetBProbabilityComputer_cfi import * +from RecoBTag.ImpactParameter.negativeOnlyJetBProbabilityJetTags_cfi import * +# Jet Prob +from RecoBTag.ImpactParameter.negativeOnlyJetProbabilityComputer_cfi import * +from RecoBTag.ImpactParameter.negativeOnlyJetProbabilityJetTags_cfi import * +# High Eff from RecoBTag.ImpactParameter.negativeTrackCounting3D2ndComputer_cfi import * +from RecoBTag.ImpactParameter.negativeTrackCountingHighEffJetTags_cfi import * +# High Purity from RecoBTag.ImpactParameter.negativeTrackCounting3D3rdComputer_cfi import * +from RecoBTag.ImpactParameter.negativeTrackCountingHighPurJetTags_cfi import * + +# Positive Tags + +# Jet BProb +from RecoBTag.ImpactParameter.positiveOnlyJetBProbabilityComputer_cfi import * +from RecoBTag.ImpactParameter.positiveOnlyJetBProbabilityJetTags_cfi import * +# Jet Prob +from RecoBTag.ImpactParameter.positiveOnlyJetProbabilityComputer_cfi import * +from RecoBTag.ImpactParameter.positiveOnlyJetProbabilityJetTags_cfi import * + diff --git a/RecoBTag/ImpactParameter/python/negativeOnlyJetBProbabilityComputer_cfi.py b/RecoBTag/ImpactParameter/python/negativeOnlyJetBProbabilityComputer_cfi.py index fec55ee092e81..384c59200f40d 100644 --- a/RecoBTag/ImpactParameter/python/negativeOnlyJetBProbabilityComputer_cfi.py +++ b/RecoBTag/ImpactParameter/python/negativeOnlyJetBProbabilityComputer_cfi.py @@ -1,7 +1,10 @@ import FWCore.ParameterSet.Config as cms +from RecoBTag.ImpactParameter.variableJTA_cfi import * + # jetBProbability btag computer negativeOnlyJetBProbability = cms.ESProducer("JetBProbabilityESProducer", + variableJTAPars, impactParameterType = cms.int32(0), ## 0 = 3D, 1 = 2D deltaR = cms.double(-1.0), ## use cut from JTA @@ -13,7 +16,8 @@ numberOfBTracks = cms.uint32(4), maximumDecayLength = cms.double(5.0), - trackQualityClass = cms.string("any") + trackQualityClass = cms.string("any"), + useVariableJTA = cms.bool(False) ) diff --git a/RecoBTag/ImpactParameter/python/negativeOnlyJetProbabilityComputer_cfi.py b/RecoBTag/ImpactParameter/python/negativeOnlyJetProbabilityComputer_cfi.py index 7b19094c8d598..3d450e862e2a2 100644 --- a/RecoBTag/ImpactParameter/python/negativeOnlyJetProbabilityComputer_cfi.py +++ b/RecoBTag/ImpactParameter/python/negativeOnlyJetProbabilityComputer_cfi.py @@ -1,7 +1,10 @@ import FWCore.ParameterSet.Config as cms +from RecoBTag.ImpactParameter.variableJTA_cfi import * + # negativeOnlyJetProbability btag computer negativeOnlyJetProbability = cms.ESProducer("JetProbabilityESProducer", + variableJTAPars, impactParameterType = cms.int32(0), ## 0 = 3D, 1 = 2D deltaR = cms.double(0.3), @@ -10,7 +13,8 @@ minimumProbability = cms.double(0.005), maximumDecayLength = cms.double(5.0), - trackQualityClass = cms.string("any") + trackQualityClass = cms.string("any"), + useVariableJTA = cms.bool(False) ) diff --git a/RecoBTag/ImpactParameter/python/positiveOnlyJetBProbabilityComputer_cfi.py b/RecoBTag/ImpactParameter/python/positiveOnlyJetBProbabilityComputer_cfi.py index 1cee0201944d2..38fa7f3f463e6 100644 --- a/RecoBTag/ImpactParameter/python/positiveOnlyJetBProbabilityComputer_cfi.py +++ b/RecoBTag/ImpactParameter/python/positiveOnlyJetBProbabilityComputer_cfi.py @@ -1,7 +1,10 @@ import FWCore.ParameterSet.Config as cms +from RecoBTag.ImpactParameter.variableJTA_cfi import * + # jetBProbability btag computer positiveOnlyJetBProbability = cms.ESProducer("JetBProbabilityESProducer", + variableJTAPars, impactParameterType = cms.int32(0), ## 0 = 3D, 1 = 2D deltaR = cms.double(-1.0), ## use cut from JTA diff --git a/RecoBTag/ImpactParameter/python/positiveOnlyJetProbabilityComputer_cfi.py b/RecoBTag/ImpactParameter/python/positiveOnlyJetProbabilityComputer_cfi.py index 53e50b4b931ab..5e131c0e353de 100644 --- a/RecoBTag/ImpactParameter/python/positiveOnlyJetProbabilityComputer_cfi.py +++ b/RecoBTag/ImpactParameter/python/positiveOnlyJetProbabilityComputer_cfi.py @@ -1,7 +1,10 @@ import FWCore.ParameterSet.Config as cms +from RecoBTag.ImpactParameter.variableJTA_cfi import * + # positiveOnlyJetProbability btag computer positiveOnlyJetProbability = cms.ESProducer("JetProbabilityESProducer", + variableJTAPars, impactParameterType = cms.int32(0), ## 0 = 3D, 1 = 2D deltaR = cms.double(0.3), diff --git a/RecoBTag/SecondaryVertex/interface/SimpleSecondaryVertexComputer.h b/RecoBTag/SecondaryVertex/interface/SimpleSecondaryVertexComputer.h index 8c273cb3ad40b..895ec45ea6d72 100644 --- a/RecoBTag/SecondaryVertex/interface/SimpleSecondaryVertexComputer.h +++ b/RecoBTag/SecondaryVertex/interface/SimpleSecondaryVertexComputer.h @@ -16,17 +16,22 @@ class SimpleSecondaryVertexComputer : public JetTagComputer { public: SimpleSecondaryVertexComputer(const edm::ParameterSet ¶meters) : - use2d(!parameters.getParameter("use3d")), + use2d(!parameters.getParameter("use3d")), useSig(parameters.getParameter("useSignificance")), - unBoost(parameters.getParameter("unBoost")), - minTracks(parameters.getParameter("minTracks")) - { uses("svTagInfos"); } + unBoost(parameters.getParameter("unBoost")), + minTracks(parameters.getParameter("minTracks")), + minVertices_(1) + { + uses("svTagInfos"); + minVertices_ = parameters.existsAs("minVertices") ? parameters.getParameter("minVertices") : 1 ; + } float discriminator(const TagInfoHelper &tagInfos) const { const reco::SecondaryVertexTagInfo &info = tagInfos.get(); - unsigned int idx = 0; + if(info.nVertices() < minVertices_) return -1; + unsigned int idx = 0; while(idx < info.nVertices()) { if (info.nVertexTracks(idx) >= minTracks) break; @@ -63,6 +68,7 @@ class SimpleSecondaryVertexComputer : public JetTagComputer { bool useSig; bool unBoost; unsigned int minTracks; + unsigned int minVertices_; }; #endif // RecoBTag_SecondaryVertex_SimpleSecondaryVertexComputer_h diff --git a/RecoBTag/SecondaryVertex/plugins/BVertexFilter.cc b/RecoBTag/SecondaryVertex/plugins/BVertexFilter.cc index d8a3b7a4857a1..5510e57a4134d 100644 --- a/RecoBTag/SecondaryVertex/plugins/BVertexFilter.cc +++ b/RecoBTag/SecondaryVertex/plugins/BVertexFilter.cc @@ -2,7 +2,7 @@ // // Package: BVertexFilter // Class: BVertexFilter -// +// /**\class BVertexFilter BVertexFilter.cc DPGAnalysis/BVertexFilter/src/BVertexFilter.cc Description: @@ -58,9 +58,9 @@ BVertexFilter::BVertexFilter(const edm::ParameterSet& params): minVertices(params.getParameter("minVertices")) { - token_primaryVertex = consumes(params.getParameter("primaryVertices")); - token_secondaryVertex = consumes(params.getParameter("secondaryVertices")); - produces(); + token_primaryVertex = consumes(params.getParameter("primaryVertices")); + token_secondaryVertex = consumes(params.getParameter("secondaryVertices")); + produces(); } @@ -72,30 +72,35 @@ BVertexFilter::~BVertexFilter() bool BVertexFilter::filter(edm::Event& iEvent, const edm::EventSetup& iSetup) { - int count = 0; - edm::Handle pvHandle; + int count = 0; + edm::Handle pvHandle; iEvent.getByToken(token_primaryVertex, pvHandle); - edm::Handle svHandle; + edm::Handle svHandle; iEvent.getByToken(token_secondaryVertex, svHandle); - const reco::Vertex & primary = (*pvHandle.product())[0]; - const reco::VertexCollection & vertices = *svHandle.product(); + std::auto_ptr recoVertices(new reco::VertexCollection); - if(! primary.isFake()) - { - for(reco::VertexCollection::const_iterator it=vertices.begin() ; it!=vertices.end() ; ++it) - { - GlobalVector axis(0,0,0); - if(useVertexKinematicAsJetAxis) axis = GlobalVector(it->p4().X(),it->p4().Y(),it->p4().Z()); - if(svFilter(primary,reco::SecondaryVertex(primary,*it,axis,true),axis)) { - count++; - recoVertices->push_back(*it); - } + if(pvHandle->size()!=0) { + const reco::Vertex & primary = (*pvHandle.product())[0]; + const reco::VertexCollection & vertices = *svHandle.product(); + + + if(! primary.isFake()) + { + for(reco::VertexCollection::const_iterator it=vertices.begin() ; it!=vertices.end() ; ++it) + { + GlobalVector axis(0,0,0); + if(useVertexKinematicAsJetAxis) axis = GlobalVector(it->p4().X(),it->p4().Y(),it->p4().Z()); + if(svFilter(primary,reco::SecondaryVertex(primary,*it,axis,true),axis)) { + count++; + recoVertices->push_back(*it); + } + } } } - iEvent.put(recoVertices); + iEvent.put(recoVertices); - return(count >= minVertices); + return(count >= minVertices); } diff --git a/RecoBTag/SecondaryVertex/plugins/BtoCharmDecayVertexMerger.cc b/RecoBTag/SecondaryVertex/plugins/BtoCharmDecayVertexMerger.cc new file mode 100644 index 0000000000000..a37c554e379b0 --- /dev/null +++ b/RecoBTag/SecondaryVertex/plugins/BtoCharmDecayVertexMerger.cc @@ -0,0 +1,242 @@ +// this code is partially taken from BCandidateProducer of L. Wehrli + +// first revised prototype version for CMSSW 29.Aug.2012 + +#include "FWCore/Framework/interface/EDProducer.h" +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/Framework/interface/MakerMacros.h" +#include "FWCore/Utilities/interface/InputTag.h" +#include "FWCore/ParameterSet/interface/ParameterSet.h" + +#include "DataFormats/Common/interface/Handle.h" +#include "DataFormats/TrackReco/interface/Track.h" +#include "DataFormats/TrackReco/interface/TrackFwd.h" +#include "DataFormats/VertexReco/interface/Vertex.h" +#include "DataFormats/VertexReco/interface/VertexFwd.h" +#include "RecoVertex/VertexTools/interface/VertexDistance3D.h" +#include "RecoBTag/SecondaryVertex/interface/SecondaryVertex.h" + +#include "DataFormats/GeometryVector/interface/VectorUtil.h" + +#include + +class BtoCharmDecayVertexMerger : public edm::EDProducer { + public: + BtoCharmDecayVertexMerger(const edm::ParameterSet ¶ms); + + virtual void produce(edm::Event &event, const edm::EventSetup &es); + + private: + edm::EDGetTokenT token_primaryVertex; + edm::EDGetTokenT token_secondaryVertex; + reco::Vertex pv; + // double maxFraction; + // double minSignificance; + + double minDRForUnique, vecSumIMCUTForUnique, minCosPAtomerge, maxPtreltomerge; + + // a vertex proxy for sorting using stl + struct vertexProxy{ + reco::Vertex vert; + double invm; + size_t ntracks; + }; + + // comparison operator for vertexProxy, used in sorting + friend bool operator<(vertexProxy v1, vertexProxy v2){ + if(v1.ntracks>2 && v2.ntracks<3) return true; + if(v1.ntracks<3 && v2.ntracks>2) return false; + return (v1.invm>v2.invm); + } + + void resolveBtoDchain(std::vector& coll, unsigned int i, unsigned int k); + GlobalVector flightDirection(reco::Vertex &pv, reco::Vertex &sv); +}; + + + +BtoCharmDecayVertexMerger::BtoCharmDecayVertexMerger(const edm::ParameterSet ¶ms) : + token_primaryVertex(consumes(params.getParameter("primaryVertices"))), + token_secondaryVertex(consumes(params.getParameter("secondaryVertices"))), + minDRForUnique(params.getUntrackedParameter("minDRUnique",0.4)), + vecSumIMCUTForUnique(params.getUntrackedParameter("minvecSumIMifsmallDRUnique",5.5)), + minCosPAtomerge(params.getUntrackedParameter("minCosPAtomerge",0.99)), + maxPtreltomerge(params.getUntrackedParameter("maxPtreltomerge",7777.0)) + // maxFraction(params.getParameter("maxFraction")), + // minSignificance(params.getParameter("minSignificance")) +{ + produces(); +} +//----------------------- +void BtoCharmDecayVertexMerger::produce(edm::Event &iEvent, const edm::EventSetup &iSetup){ + + using namespace reco; + // PV + edm::Handle PVcoll; + iEvent.getByToken(token_primaryVertex, PVcoll); + + if(PVcoll->size()!=0) { + + const reco::VertexCollection pvc = *( PVcoll.product()); + pv = pvc[0]; + + // get the IVF collection + edm::Handle secondaryVertices; + iEvent.getByToken(token_secondaryVertex, secondaryVertices); + + + + //loop over vertices, fill into own collection for sorting + std::vector vertexProxyColl; + for(std::vector::const_iterator sv = secondaryVertices->begin(); + sv != secondaryVertices->end(); ++sv) { + vertexProxy vtx = {*sv,(*sv).p4().M(),(*sv).tracksSize()}; + vertexProxyColl.push_back( vtx ); + } + + // sort the vertices by mass and track multiplicity + sort( vertexProxyColl.begin(), vertexProxyColl.end()); + + + // loop forward over all vertices + for(unsigned int iVtx=0; iVtx < vertexProxyColl.size(); iVtx++){ + + // nested loop backwards (in order to start from light masses) + // check all vertices against each other for B->D chain + for(unsigned int kVtx=vertexProxyColl.size()-1; kVtx>iVtx; kVtx--){ + // remove D vertices from the collection and add the tracks to the original one + resolveBtoDchain(vertexProxyColl, iVtx, kVtx); + } + } + + // now create new vertex collection and add to event + VertexCollection *bvertices = new VertexCollection(); + for(std::vector::iterator it=vertexProxyColl.begin(); it!=vertexProxyColl.end(); it++) bvertices->push_back((*it).vert); + std::auto_ptr bvertColl(bvertices); + iEvent.put(bvertColl); + } + else{ + std::auto_ptr bvertCollEmpty(new VertexCollection); + iEvent.put(bvertCollEmpty); + } +} + + +//------------------------------------ +void BtoCharmDecayVertexMerger::resolveBtoDchain(std::vector& coll, unsigned int i, unsigned int k){ + using namespace reco; + + GlobalVector momentum1 = GlobalVector(coll[i].vert.p4().X(), coll[i].vert.p4().Y(), coll[i].vert.p4().Z()); + GlobalVector momentum2 = GlobalVector(coll[k].vert.p4().X(), coll[k].vert.p4().Y(), coll[k].vert.p4().Z()); + + reco::SecondaryVertex sv1(pv, coll[i].vert, momentum1 , true); + reco::SecondaryVertex sv2(pv, coll[k].vert, momentum2 , true); + + + // find out which one is near and far + reco::SecondaryVertex svNear = sv1; + reco::SecondaryVertex svFar = sv2; + GlobalVector momentumNear = momentum1; + GlobalVector momentumFar = momentum2; + + // swap if it is the other way around + if(sv1.dist3d().value() >= sv2.dist3d().value()){ + svNear = sv2; + svFar = sv1; + momentumNear = momentum2; + momentumFar = momentum1; + } + GlobalVector nearToFar = flightDirection( svNear, svFar); + GlobalVector pvToNear = flightDirection( pv, svNear); + + double cosPA = nearToFar.dot(momentumFar) / momentumFar.mag()/ nearToFar.mag(); + double cosa = pvToNear. dot(momentumFar) / pvToNear.mag() / momentumFar.mag(); + double ptrel = sqrt(1.0 - cosa*cosa)* momentumFar.mag(); + + double vertexDeltaR = Geom::deltaR(flightDirection(pv, sv1), flightDirection(pv, sv2) ); + + // create a set of all tracks from both vertices, avoid double counting by using a std::set<> + std::set trackrefs; + // first vertex + for(reco::Vertex::trackRef_iterator ti = sv1.tracks_begin(); ti!=sv1.tracks_end(); ti++){ + if(sv1.trackWeight(*ti)>0.5){ + reco::TrackRef t = ti->castTo(); + trackrefs.insert(t); + } + } + // second vertex + for(reco::Vertex::trackRef_iterator ti = sv2.tracks_begin(); ti!=sv2.tracks_end(); ti++){ + if(sv2.trackWeight(*ti)>0.5){ + reco::TrackRef t = ti->castTo(); + trackrefs.insert(t); + } + } + + // now calculate one LorentzVector from the track momenta + ROOT::Math::LorentzVector > mother; + for(std::set::const_iterator it = trackrefs.begin(); it!= trackrefs.end(); it++){ + ROOT::Math::LorentzVector > temp ( (*it)->px(),(*it)->py(),(*it)->pz(), 0.13957 ); + mother += temp; + } + + + // check if criteria for merging are fulfilled + if(vertexDeltaRminCosPAtomerge && fabs(ptrel) tracks_; + std::vector refittedTracks_; + std::vector weights_; + for(reco::Vertex::trackRef_iterator it = coll[i].vert.tracks_begin(); it!=coll[i].vert.tracks_end(); it++) { + tracks_.push_back( *it); + refittedTracks_.push_back( coll[i].vert.refittedTrack(*it)); + weights_.push_back( coll[i].vert.trackWeight(*it) ); + } + // delete tracks and add all tracks back, and check in which vertex the weight is larger + coll[i].vert.removeTracks(); + std::vector::iterator it2 = refittedTracks_.begin(); + std::vector::iterator it3 = weights_.begin(); + for(reco::Vertex::trackRef_iterator it = tracks_.begin(); it!=tracks_.end(); it++, it2++, it3++){ + float weight = *it3; + float weight2= sv2.trackWeight(*it); + Track refittedTrackWithLargerWeight = *it2; + if( weight2 >weight) { + weight = weight2; + refittedTrackWithLargerWeight = sv2.refittedTrack(*it); + } + coll[i].vert.add(*it , refittedTrackWithLargerWeight , weight); + } + } + + // remove the second vertex from the collection + coll.erase( coll.begin() + k ); + } + +} +//------------- + + +GlobalVector +BtoCharmDecayVertexMerger::flightDirection(reco::Vertex &pv, reco::Vertex &sv){ + GlobalVector res(sv.position().X() - pv.position().X(), + sv.position().Y() - pv.position().Y(), + sv.position().Z() - pv.position().Z()); + return res; +} + + + +DEFINE_FWK_MODULE(BtoCharmDecayVertexMerger); diff --git a/RecoBTag/SecondaryVertex/plugins/BuildFile.xml b/RecoBTag/SecondaryVertex/plugins/BuildFile.xml index 87d1fdb3283fc..204bb6a6ab551 100644 --- a/RecoBTag/SecondaryVertex/plugins/BuildFile.xml +++ b/RecoBTag/SecondaryVertex/plugins/BuildFile.xml @@ -8,7 +8,7 @@ - + diff --git a/RecoBTag/SecondaryVertex/python/bToCharmDecayVertexMerger_cfi.py b/RecoBTag/SecondaryVertex/python/bToCharmDecayVertexMerger_cfi.py new file mode 100644 index 0000000000000..1191bb350e600 --- /dev/null +++ b/RecoBTag/SecondaryVertex/python/bToCharmDecayVertexMerger_cfi.py @@ -0,0 +1,10 @@ +import FWCore.ParameterSet.Config as cms + +bToCharmDecayVertexMerged = cms.EDProducer("BtoCharmDecayVertexMerger", + primaryVertices = cms.InputTag("offlinePrimaryVertices"), + secondaryVertices = cms.InputTag("inclusiveMergedVerticesFiltered"), + minDRUnique = cms.untracked.double(0.4), + minvecSumIMifsmallDRUnique = cms.untracked.double(5.5), + minCosPAtomerge = cms.untracked.double(0.99), + maxPtreltomerge = cms.untracked.double(7777.0) +) diff --git a/RecoBTag/SecondaryVertex/python/combinedInclusiveSecondaryVertexPositiveBJetTags_cfi.py b/RecoBTag/SecondaryVertex/python/combinedInclusiveSecondaryVertexPositiveBJetTags_cfi.py new file mode 100644 index 0000000000000..6a12bbe60241c --- /dev/null +++ b/RecoBTag/SecondaryVertex/python/combinedInclusiveSecondaryVertexPositiveBJetTags_cfi.py @@ -0,0 +1,7 @@ +import FWCore.ParameterSet.Config as cms + +combinedInclusiveSecondaryVertexPositiveBJetTags = cms.EDProducer("JetTagProducer", + jetTagComputer = cms.string('combinedSecondaryVertexPositive'), + tagInfos = cms.VInputTag(cms.InputTag("impactParameterTagInfos"), + cms.InputTag("inclusiveSecondaryVertexFinderTagInfos")) +) diff --git a/RecoBTag/SecondaryVertex/python/combinedSecondaryVertexBJetTags_cfi.py b/RecoBTag/SecondaryVertex/python/combinedSecondaryVertexBJetTags_cfi.py index d5c5c3409d2c1..4b7e540156a9c 100644 --- a/RecoBTag/SecondaryVertex/python/combinedSecondaryVertexBJetTags_cfi.py +++ b/RecoBTag/SecondaryVertex/python/combinedSecondaryVertexBJetTags_cfi.py @@ -5,3 +5,9 @@ tagInfos = cms.VInputTag(cms.InputTag("impactParameterTagInfos"), cms.InputTag("secondaryVertexTagInfos")) ) + +combinedSecondaryVertexV1BJetTags = cms.EDProducer("JetTagProducer", + jetTagComputer = cms.string('combinedSecondaryVertexV1'), + tagInfos = cms.VInputTag(cms.InputTag("impactParameterTagInfos"), + cms.InputTag("secondaryVertexTagInfos")) +) diff --git a/RecoBTag/SecondaryVertex/python/combinedSecondaryVertexES_cfi.py b/RecoBTag/SecondaryVertex/python/combinedSecondaryVertexES_cfi.py index a054d06a45557..df13d07edb6e4 100644 --- a/RecoBTag/SecondaryVertex/python/combinedSecondaryVertexES_cfi.py +++ b/RecoBTag/SecondaryVertex/python/combinedSecondaryVertexES_cfi.py @@ -11,3 +11,13 @@ 'CombinedSVNoVertex'), categoryVariableName = cms.string('vertexCategory') ) + +combinedSecondaryVertexV1 = cms.ESProducer("CombinedSecondaryVertexESProducer", + combinedSecondaryVertexCommon, + useCategories = cms.bool(True), + calibrationRecords = cms.vstring( + 'CombinedSVRetrainRecoVertex', + 'CombinedSVRetrainPseudoVertex', + 'CombinedSVRetrainNoVertex'), + categoryVariableName = cms.string('vertexCategory') +) diff --git a/RecoBTag/SecondaryVertex/python/combinedSecondaryVertexNegativeBJetTags_cfi.py b/RecoBTag/SecondaryVertex/python/combinedSecondaryVertexNegativeBJetTags_cfi.py index 9eb306a16aa56..ec2c7c5583fb4 100644 --- a/RecoBTag/SecondaryVertex/python/combinedSecondaryVertexNegativeBJetTags_cfi.py +++ b/RecoBTag/SecondaryVertex/python/combinedSecondaryVertexNegativeBJetTags_cfi.py @@ -5,3 +5,9 @@ tagInfos = cms.VInputTag(cms.InputTag("impactParameterTagInfos"), cms.InputTag("secondaryVertexNegativeTagInfos")) ) + +combinedSecondaryVertexV1NegativeBJetTags = cms.EDProducer("JetTagProducer", + jetTagComputer = cms.string('combinedSecondaryVertexV1Negative'), + tagInfos = cms.VInputTag(cms.InputTag("impactParameterTagInfos"), + cms.InputTag("secondaryVertexNegativeTagInfos")) +) diff --git a/RecoBTag/SecondaryVertex/python/combinedSecondaryVertexNegativeES_cfi.py b/RecoBTag/SecondaryVertex/python/combinedSecondaryVertexNegativeES_cfi.py index 612e3c5cb2e49..afd9bb995be29 100644 --- a/RecoBTag/SecondaryVertex/python/combinedSecondaryVertexNegativeES_cfi.py +++ b/RecoBTag/SecondaryVertex/python/combinedSecondaryVertexNegativeES_cfi.py @@ -9,3 +9,11 @@ combinedSecondaryVertexNegative.trackPseudoSelection.sip3dSigMax = 0 combinedSecondaryVertexNegative.trackPseudoSelection.sip2dSigMin = -99999.9 combinedSecondaryVertexNegative.trackPseudoSelection.sip2dSigMax = -2.0 + +combinedSecondaryVertexV1Negative = RecoBTag.SecondaryVertex.combinedSecondaryVertexES_cfi.combinedSecondaryVertexV1.clone() +combinedSecondaryVertexV1Negative.vertexFlip = True +combinedSecondaryVertexV1Negative.trackFlip = True +combinedSecondaryVertexV1Negative.trackSelection.sip3dSigMax = 0 +combinedSecondaryVertexV1Negative.trackPseudoSelection.sip3dSigMax = 0 +combinedSecondaryVertexV1Negative.trackPseudoSelection.sip2dSigMin = -99999.9 +combinedSecondaryVertexV1Negative.trackPseudoSelection.sip2dSigMax = -2.0 diff --git a/RecoBTag/SecondaryVertex/python/combinedSecondaryVertexPositiveBJetTags_cfi.py b/RecoBTag/SecondaryVertex/python/combinedSecondaryVertexPositiveBJetTags_cfi.py index b8e6ae3bc5c46..d70e2db33bc95 100644 --- a/RecoBTag/SecondaryVertex/python/combinedSecondaryVertexPositiveBJetTags_cfi.py +++ b/RecoBTag/SecondaryVertex/python/combinedSecondaryVertexPositiveBJetTags_cfi.py @@ -5,3 +5,9 @@ tagInfos = cms.VInputTag(cms.InputTag("impactParameterTagInfos"), cms.InputTag("secondaryVertexTagInfos")) ) + +combinedSecondaryVertexV1PositiveBJetTags = cms.EDProducer("JetTagProducer", + jetTagComputer = cms.string('combinedSecondaryVertexV1Positive'), + tagInfos = cms.VInputTag(cms.InputTag("impactParameterTagInfos"), + cms.InputTag("secondaryVertexTagInfos")) +) diff --git a/RecoBTag/SecondaryVertex/python/combinedSecondaryVertexPositiveES_cfi.py b/RecoBTag/SecondaryVertex/python/combinedSecondaryVertexPositiveES_cfi.py index ad84e24f21d9c..eb67038277d55 100644 --- a/RecoBTag/SecondaryVertex/python/combinedSecondaryVertexPositiveES_cfi.py +++ b/RecoBTag/SecondaryVertex/python/combinedSecondaryVertexPositiveES_cfi.py @@ -5,3 +5,7 @@ combinedSecondaryVertexPositive = RecoBTag.SecondaryVertex.combinedSecondaryVertexES_cfi.combinedSecondaryVertex.clone() combinedSecondaryVertexPositive.trackSelection.sip3dSigMin = 0 combinedSecondaryVertexPositive.trackPseudoSelection.sip3dSigMin = 0 + +combinedSecondaryVertexV1Positive = RecoBTag.SecondaryVertex.combinedSecondaryVertexES_cfi.combinedSecondaryVertexV1.clone() +combinedSecondaryVertexV1Positive.trackSelection.sip3dSigMin = 0 +combinedSecondaryVertexV1Positive.trackPseudoSelection.sip3dSigMin = 0 diff --git a/RecoBTag/SecondaryVertex/python/doubleSecondaryVertexHighEffBJetTags_cfi.py b/RecoBTag/SecondaryVertex/python/doubleSecondaryVertexHighEffBJetTags_cfi.py new file mode 100644 index 0000000000000..64edfa1a62665 --- /dev/null +++ b/RecoBTag/SecondaryVertex/python/doubleSecondaryVertexHighEffBJetTags_cfi.py @@ -0,0 +1,6 @@ +import FWCore.ParameterSet.Config as cms + +doubleSecondaryVertexHighEffBJetTags = cms.EDProducer("JetTagProducer", + jetTagComputer = cms.string('doubleVertex2Trk'), + tagInfos = cms.VInputTag(cms.InputTag("inclusiveSecondaryVertexFinderFilteredTagInfos")) +) diff --git a/RecoBTag/SecondaryVertex/python/doubleVertex2TrkES_cfi.py b/RecoBTag/SecondaryVertex/python/doubleVertex2TrkES_cfi.py new file mode 100644 index 0000000000000..63a68786229b2 --- /dev/null +++ b/RecoBTag/SecondaryVertex/python/doubleVertex2TrkES_cfi.py @@ -0,0 +1,9 @@ +import FWCore.ParameterSet.Config as cms + +doubleVertex2Trk = cms.ESProducer("SimpleSecondaryVertexESProducer", + use3d = cms.bool(True), + unBoost = cms.bool(False), + useSignificance = cms.bool(True), + minTracks = cms.uint32(2), + minVertices = cms.uint32(2) +) diff --git a/RecoBTag/SecondaryVertex/python/inclusiveSecondaryVertexFinderTagInfos_cfi.py b/RecoBTag/SecondaryVertex/python/inclusiveSecondaryVertexFinderTagInfos_cfi.py index 23c16da8be4e6..3662ada5a917a 100644 --- a/RecoBTag/SecondaryVertex/python/inclusiveSecondaryVertexFinderTagInfos_cfi.py +++ b/RecoBTag/SecondaryVertex/python/inclusiveSecondaryVertexFinderTagInfos_cfi.py @@ -11,3 +11,15 @@ inclusiveSecondaryVertexFinderTagInfos.vertexCuts.fracPV = 0.79 ## 4 out of 5 is discarded inclusiveSecondaryVertexFinderTagInfos.vertexCuts.distSig2dMin = 2.0 + + +# filtered IVF as used in some analyses + +inclusiveSecondaryVertexFinderFilteredTagInfos = secondaryVertexTagInfos.clone() + +inclusiveSecondaryVertexFinderFilteredTagInfos.extSVCollection = cms.InputTag('bToCharmDecayVertexMerged') +inclusiveSecondaryVertexFinderFilteredTagInfos.extSVDeltaRToJet = cms.double(0.5) +inclusiveSecondaryVertexFinderFilteredTagInfos.useExternalSV = cms.bool(True) +inclusiveSecondaryVertexFinderFilteredTagInfos.vertexCuts.fracPV = 0.79 ## 4 out of 5 is discarded +inclusiveSecondaryVertexFinderFilteredTagInfos.vertexCuts.distSig2dMin = 2.0 + diff --git a/RecoBTag/SecondaryVertex/python/secondaryVertex_cff.py b/RecoBTag/SecondaryVertex/python/secondaryVertex_cff.py index 8eb2a46c9e0c2..4d24bc1c7b6fe 100644 --- a/RecoBTag/SecondaryVertex/python/secondaryVertex_cff.py +++ b/RecoBTag/SecondaryVertex/python/secondaryVertex_cff.py @@ -15,16 +15,32 @@ from RecoBTag.SecondaryVertex.ghostTrackES_cfi import * from RecoBTag.SecondaryVertex.ghostTrackBJetTags_cfi import * -#IVF +# IVF from RecoBTag.SecondaryVertex.inclusiveSecondaryVertexFinderTagInfos_cfi import * from RecoBTag.SecondaryVertex.combinedInclusiveSecondaryVertexBJetTags_cfi import * #from RecoBTag.SecondaryVertex.combinedIVFES_cfi import * #not yet using dedicated training, share CSV ones +from RecoBTag.SecondaryVertex.bVertexFilter_cfi import * +inclusiveMergedVerticesFiltered = bVertexFilter.clone() +inclusiveMergedVerticesFiltered.vertexFilter.multiplicityMin = 2 +inclusiveMergedVerticesFiltered.secondaryVertices = cms.InputTag("inclusiveMergedVertices") -#negative taggers +from RecoBTag.SecondaryVertex.bToCharmDecayVertexMerger_cfi import * +from RecoBTag.SecondaryVertex.simpleInclusiveSecondaryVertexBJetTags_cfi import * +from RecoBTag.SecondaryVertex.doubleVertex2TrkES_cfi import * +from RecoBTag.SecondaryVertex.doubleSecondaryVertexHighEffBJetTags_cfi import * + +# Negative taggers from RecoBTag.SecondaryVertex.secondaryVertexNegativeTagInfos_cfi import * from RecoBTag.SecondaryVertex.simpleSecondaryVertexNegativeHighEffBJetTags_cfi import * from RecoBTag.SecondaryVertex.simpleSecondaryVertexNegativeHighPurBJetTags_cfi import * +from RecoBTag.SecondaryVertex.combinedSecondaryVertexNegativeES_cfi import * +from RecoBTag.SecondaryVertex.combinedSecondaryVertexNegativeBJetTags_cfi import * + +# Positive taggers +from RecoBTag.SecondaryVertex.combinedSecondaryVertexPositiveES_cfi import * +from RecoBTag.SecondaryVertex.combinedSecondaryVertexPositiveBJetTags_cfi import * +from RecoBTag.SecondaryVertex.combinedInclusiveSecondaryVertexPositiveBJetTags_cfi import * -# backwards compatibility +# Backwards compatibility simpleSecondaryVertexBJetTags = simpleSecondaryVertexHighEffBJetTags.clone() diff --git a/RecoBTag/SecondaryVertex/python/simpleInclusiveSecondaryVertexBJetTags_cfi.py b/RecoBTag/SecondaryVertex/python/simpleInclusiveSecondaryVertexBJetTags_cfi.py new file mode 100644 index 0000000000000..51047e94036a5 --- /dev/null +++ b/RecoBTag/SecondaryVertex/python/simpleInclusiveSecondaryVertexBJetTags_cfi.py @@ -0,0 +1,12 @@ +import FWCore.ParameterSet.Config as cms + + +simpleInclusiveSecondaryVertexHighEffBJetTags = cms.EDProducer("JetTagProducer", + jetTagComputer = cms.string('simpleSecondaryVertex2Trk'), + tagInfos = cms.VInputTag(cms.InputTag("inclusiveSecondaryVertexFinderFilteredTagInfos")) +) + +simpleInclusiveSecondaryVertexHighPurBJetTags = cms.EDProducer("JetTagProducer", + jetTagComputer = cms.string('simpleSecondaryVertex3Trk'), + tagInfos = cms.VInputTag(cms.InputTag("inclusiveSecondaryVertexFinderFilteredTagInfos")) +) diff --git a/RecoBTag/SoftLepton/interface/GenericSelectorByValueMap.h b/RecoBTag/SoftLepton/interface/GenericSelectorByValueMap.h index 8804d5611a9a0..2ad9bc79b9ea5 100644 --- a/RecoBTag/SoftLepton/interface/GenericSelectorByValueMap.h +++ b/RecoBTag/SoftLepton/interface/GenericSelectorByValueMap.h @@ -11,6 +11,8 @@ #include "FWCore/Framework/interface/EventSetup.h" #include "FWCore/ParameterSet/interface/ParameterSet.h" #include "FWCore/Utilities/interface/InputTag.h" +#include "DataFormats/Common/interface/ValueMap.h" +#include "DataFormats/Common/interface/View.h" namespace edm { @@ -44,8 +46,8 @@ class GenericSelectorByValueMap : public edm::EDProducer { void produce(edm::Event & event, edm::EventSetup const & setup); - edm::InputTag m_electrons; - edm::InputTag m_selection; + edm::EDGetTokenT > token_electrons; + edm::EDGetTokenT > token_selection; cut_type m_cut; }; @@ -58,8 +60,6 @@ class GenericSelectorByValueMap : public edm::EDProducer { #include #include "DataFormats/Common/interface/Handle.h" -#include "DataFormats/Common/interface/ValueMap.h" -#include "DataFormats/Common/interface/View.h" #include "DataFormats/Common/interface/Ptr.h" #include "DataFormats/Common/interface/PtrVector.h" #include "DataFormats/Common/interface/RefToBaseVector.h" @@ -70,8 +70,8 @@ namespace edm { template GenericSelectorByValueMap::GenericSelectorByValueMap(edm::ParameterSet const & config) : - m_electrons(config.getParameter("input")), - m_selection(config.getParameter("selection")), + token_electrons(consumes >(config.getParameter("input"))), + token_selection(consumes >(config.getParameter("selection"))), m_cut(config.getParameter("cut")) { // register the product @@ -87,18 +87,18 @@ void GenericSelectorByValueMap::produce(edm::Event & event, const edm::Eve // read the collection of GsfElectrons from the Event edm::Handle > h_electrons; - event.getByLabel(m_electrons, h_electrons); + event.getByToken(token_electrons, h_electrons); edm::View const & electrons = * h_electrons; // read the selection map from the Event edm::Handle > h_selection; - event.getByLabel(m_selection, h_selection); + event.getByToken(token_selection, h_selection); edm::ValueMap const & selectionMap = * h_selection; - + for (unsigned int i = 0; i < electrons.size(); ++i) { edm::RefToBase ptr = electrons.refAt(i); if (selectionMap[ptr] > m_cut) - candidates->push_back(ptr); + candidates->push_back(ptr); } // put the product in the event diff --git a/RecoBTag/SoftLepton/plugins/SoftLepton.cc b/RecoBTag/SoftLepton/plugins/SoftLepton.cc index f1e9f33162fe2..b4790dcd4190b 100644 --- a/RecoBTag/SoftLepton/plugins/SoftLepton.cc +++ b/RecoBTag/SoftLepton/plugins/SoftLepton.cc @@ -2,7 +2,7 @@ // // Package: SoftLepton // Class: SoftLepton -// +// /**\class SoftLepton SoftLepton.cc RecoBTag/SoftLepton/src/SoftLepton.cc Description: CMSSW EDProducer for soft lepton b tagging. @@ -19,43 +19,15 @@ #include #include -#include "FWCore/Framework/interface/Frameworkfwd.h" -#include "FWCore/Framework/interface/EDProducer.h" -#include "FWCore/Framework/interface/Event.h" -#include "FWCore/Framework/interface/MakerMacros.h" -#include "FWCore/Framework/interface/EventSetup.h" -#include "FWCore/Framework/interface/ESHandle.h" -#include "FWCore/ParameterSet/interface/ParameterSet.h" -#include "FWCore/Utilities/interface/EDMException.h" -#include "DataFormats/Provenance/interface/ProductID.h" -#include "DataFormats/Common/interface/RefToBase.h" -#include "DataFormats/Common/interface/ValueMap.h" +#include "FWCore/Utilities/interface/InputTag.h" // ROOT::Math vectors (aka math::XYZVector) #include "DataFormats/Math/interface/LorentzVector.h" -#include "DataFormats/Math/interface/Vector3D.h" #include "Math/GenVector/PxPyPzM4D.h" #include "Math/GenVector/VectorUtil.h" #include "Math/GenVector/Boost.h" -#include "DataFormats/GeometryVector/interface/GlobalVector.h" -#include "DataFormats/VertexReco/interface/Vertex.h" -#include "DataFormats/VertexReco/interface/VertexFwd.h" #include "DataFormats/BeamSpot/interface/BeamSpot.h" -#include "DataFormats/TrackReco/interface/Track.h" -#include "DataFormats/MuonReco/interface/Muon.h" -#include "DataFormats/MuonReco/interface/MuonFwd.h" -#include "DataFormats/MuonReco/interface/MuonSelectors.h" -#include "DataFormats/EgammaCandidates/interface/Electron.h" -#include "DataFormats/EgammaCandidates/interface/ElectronFwd.h" -#include "DataFormats/EgammaCandidates/interface/GsfElectron.h" -#include "DataFormats/EgammaCandidates/interface/GsfElectronFwd.h" -#include "DataFormats/GsfTrackReco/interface/GsfTrack.h" -#include "DataFormats/ParticleFlowCandidate/interface/PFCandidate.h" -#include "DataFormats/ParticleFlowCandidate/interface/PFCandidateFwd.h" -#include "DataFormats/JetReco/interface/Jet.h" -#include "DataFormats/JetReco/interface/JetTracksAssociation.h" -#include "DataFormats/BTauReco/interface/SoftLeptonTagInfo.h" #include "TrackingTools/TransientTrack/interface/TransientTrack.h" #include "TrackingTools/TransientTrack/interface/TransientTrackBuilder.h" @@ -85,22 +57,31 @@ typedef edm::View MuonView; const reco::Vertex SoftLepton::s_nominalBeamSpot( reco::Vertex::Point( 0, 0, 0 ), reco::Vertex::Error( ROOT::Math::SVector( 0.0015 * 0.0015, // 0.0, 0.0 - 0.0, 0.0015 * 0.0015, // 0.0 + 0.0, 0.0015 * 0.0015, // 0.0 0.0, 0.0, 15. * 15. ) ), 1, 1, 0 ); // ------------ c'tor -------------------------------------------------------------------- SoftLepton::SoftLepton(const edm::ParameterSet & iConfig) : - m_jets( iConfig.getParameter( "jets" ) ), - m_primaryVertex( iConfig.getParameter( "primaryVertex" ) ), - m_leptons( iConfig.getParameter( "leptons" ) ), - m_leptonCands( iConfig.exists("leptonCands") ? iConfig.getParameter( "leptonCands" ) : edm::InputTag() ), - m_leptonId( iConfig.exists("leptonId") ? iConfig.getParameter( "leptonId" ) : edm::InputTag() ), + m_jets( iConfig.getParameter( "jets" ) ), + token_jtas( mayConsume( iConfig.getParameter( "jets" ) ) ), + token_jets( mayConsume >( iConfig.getParameter( "jets" ) ) ), + token_primaryVertex( consumes( iConfig.getParameter( "primaryVertex" ) ) ), + m_leptons( iConfig.getParameter( "leptons" ) ), + token_gsfElectrons( mayConsume( iConfig.getParameter( "leptons" ) ) ), + token_electrons( mayConsume( iConfig.getParameter( "leptons" ) ) ), + token_pfElectrons( mayConsume( iConfig.getParameter( "leptons" ) ) ), + token_muons( mayConsume( iConfig.getParameter( "leptons" ) ) ), + token_tracks( mayConsume >( iConfig.getParameter( "leptons" ) ) ), + m_leptonCands( iConfig.exists("leptonCands") ? iConfig.getParameter( "leptonCands" ) : edm::InputTag() ), + token_leptonCands( mayConsume >( iConfig.exists("leptonCands") ? iConfig.getParameter( "leptonCands" ) : edm::InputTag() ) ), + m_leptonId( iConfig.exists("leptonId") ? iConfig.getParameter( "leptonId" ) : edm::InputTag() ), + token_leptonId( mayConsume >( iConfig.exists("leptonId") ? iConfig.getParameter( "leptonId" ) : edm::InputTag() ) ), m_transientTrackBuilder( 0 ), - m_refineJetAxis( iConfig.getParameter( "refineJetAxis" ) ), - m_deltaRCut( iConfig.getParameter( "leptonDeltaRCut" ) ), - m_chi2Cut( iConfig.getParameter( "leptonChi2Cut" ) ), - m_muonSelection( (muon::SelectionType) iConfig.getParameter( "muonSelection" ) ) + m_refineJetAxis( iConfig.getParameter( "refineJetAxis" ) ), + m_deltaRCut( iConfig.getParameter( "leptonDeltaRCut" ) ), + m_chi2Cut( iConfig.getParameter( "leptonChi2Cut" ) ), + m_muonSelection( (muon::SelectionType) iConfig.getParameter( "muonSelection" ) ) { produces(); } @@ -127,7 +108,7 @@ SoftLepton::produce(edm::Event & event, const edm::EventSetup & setup) { do { { // look for a JetTracksAssociationCollection edm::Handle h_jtas; - event.getByLabel(m_jets, h_jtas); + event.getByToken(token_jtas, h_jtas); if (h_jtas.isValid()) { unsigned int size = h_jtas->size(); jets.resize(size); @@ -141,7 +122,7 @@ SoftLepton::produce(edm::Event & event, const edm::EventSetup & setup) { } { // else... // look for a View edm::Handle > h_jets; - event.getByLabel(m_jets, h_jets); + event.getByToken(token_jets, h_jets); if (h_jets.isValid()) { unsigned int size = h_jets->size(); jets.resize(size); @@ -153,11 +134,11 @@ SoftLepton::produce(edm::Event & event, const edm::EventSetup & setup) { } { // else... throw edm::Exception(edm::errors::NotFound) << "Object " << m_jets << " of type among (\"reco::JetTracksAssociationCollection\", \"edm::View\") not found"; } } while (false); - + // input primary vetex reco::Vertex vertex; Handle h_primaryVertex; - event.getByLabel(m_primaryVertex, h_primaryVertex); + event.getByToken(token_primaryVertex, h_primaryVertex); if (h_primaryVertex.isValid() and not h_primaryVertex->empty()) vertex = h_primaryVertex->front(); else @@ -167,10 +148,10 @@ SoftLepton::produce(edm::Event & event, const edm::EventSetup & setup) { // input leptons (can be of different types) Leptons leptons; - Handle< ValueMap > h_leptonCands; + Handle > h_leptonCands; bool haveLeptonCands = !(m_leptonCands == edm::InputTag()); if (haveLeptonCands) - event.getByLabel(m_leptonCands, h_leptonCands); + event.getByToken(token_leptonCands, h_leptonCands); // try to access the input collection as a collection of GsfElectrons, Muons or Tracks @@ -178,7 +159,7 @@ SoftLepton::produce(edm::Event & event, const edm::EventSetup & setup) { do { { // look for View Handle h_electrons; - event.getByLabel(m_leptons, h_electrons); + event.getByToken(token_gsfElectrons, h_electrons); if (h_electrons.isValid()) { leptonId = SoftLeptonProperties::quality::egammaElectronId; @@ -194,7 +175,7 @@ SoftLepton::produce(edm::Event & event, const edm::EventSetup & setup) { // look for View // FIXME: is this obsolete? Handle h_electrons; - event.getByLabel(m_leptons, h_electrons); + event.getByToken(token_electrons, h_electrons); if (h_electrons.isValid()) { leptonId = SoftLeptonProperties::quality::egammaElectronId; for (ElectronView::const_iterator electron = h_electrons->begin(); electron != h_electrons->end(); ++electron) { @@ -208,7 +189,7 @@ SoftLepton::produce(edm::Event & event, const edm::EventSetup & setup) { // look for PFElectrons // FIXME: is this obsolete? Handle h_electrons; - event.getByLabel(m_leptons, h_electrons); + event.getByToken(token_pfElectrons, h_electrons); if (h_electrons.isValid()) { leptonId = SoftLeptonProperties::quality::egammaElectronId; for (reco::PFCandidateCollection::const_iterator electron = h_electrons->begin(); electron != h_electrons->end(); ++electron) { @@ -228,7 +209,7 @@ SoftLepton::produce(edm::Event & event, const edm::EventSetup & setup) { } { // else // look for View Handle h_muons; - event.getByLabel(m_leptons, h_muons); + event.getByToken(token_muons, h_muons); if (h_muons.isValid()) { for (MuonView::const_iterator muon = h_muons->begin(); muon != h_muons->end(); ++muon) { // FIXME -> turn this selection into a muonCands input? @@ -250,9 +231,9 @@ SoftLepton::produce(edm::Event & event, const edm::EventSetup & setup) { break; } } { // else - // look for edm::View + // look for edm::View Handle > h_tracks; - event.getByLabel(m_leptons, h_tracks); + event.getByToken(token_tracks, h_tracks); if (h_tracks.isValid()) { for (unsigned int i = 0; i < h_tracks->size(); i++) { LeptonIds &id = leptons[h_tracks->refAt(i)]; @@ -266,8 +247,8 @@ SoftLepton::produce(edm::Event & event, const edm::EventSetup & setup) { } } while (false); if (!(m_leptonId == edm::InputTag())) { - Handle< ValueMap > h_leptonId; - event.getByLabel(m_leptonId, h_leptonId); + Handle > h_leptonId; + event.getByToken(token_leptonId, h_leptonId); for (Leptons::iterator lepton = leptons.begin(); lepton != leptons.end(); ++lepton) lepton->second[leptonId] = (*h_leptonId)[lepton->first]; @@ -313,7 +294,7 @@ reco::SoftLeptonTagInfo SoftLepton::tag ( properties.etaRel = relativeEta( lepton_momentum, axis ); properties.ratio = lepton_momentum.R() / axis.R(); properties.ratioRel = lepton_momentum.Dot(axis) / axis.Mag2(); - + for(LeptonIds::const_iterator iter = lepton->second.begin(); iter != lepton->second.end(); ++iter) properties.setQuality(static_cast(iter->first), iter->second); @@ -375,7 +356,7 @@ GlobalVector SoftLepton::refineJetAxis ( if (sum_pT > 1.) // avoid the case of only the lepton-track with small rounding errors axis = math::RhoEtaPhiVector( axis.rho(), axis.eta() + sum_eta_by_pT / sum_pT, axis.phi() + sum_phi_by_pT / sum_pT); - + } else if (m_refineJetAxis == AXIS_CHARGED_SUM or m_refineJetAxis == AXIS_CHARGED_SUM_NOLEPTON) { math::XYZVector sum; @@ -397,13 +378,13 @@ GlobalVector SoftLepton::refineJetAxis ( } else if(m_refineJetAxis == AXIS_CALORIMETRIC_NOLEPTON) { axis -= exclude->momentum(); } - + return GlobalVector(axis.x(), axis.y(), axis.z()); } double SoftLepton::relativeEta(const math::XYZVector& vector, const math::XYZVector& axis) { double mag = vector.r() * axis.r(); - double dot = vector.Dot(axis); + double dot = vector.Dot(axis); return -log((mag - dot)/(mag + dot)) / 2; } @@ -415,4 +396,4 @@ double SoftLepton::boostedPPar(const math::XYZVector& vector, const math::XYZVec ROOT::Math::LorentzVector > jet( axis.r(), 0., 0., jet_mass ); ROOT::Math::BoostX boost( -jet.Beta() ); return boost(lepton).x(); -} +} diff --git a/RecoBTag/SoftLepton/plugins/SoftLepton.h b/RecoBTag/SoftLepton/plugins/SoftLepton.h index ce69a482ef478..0803849fb69e2 100644 --- a/RecoBTag/SoftLepton/plugins/SoftLepton.h +++ b/RecoBTag/SoftLepton/plugins/SoftLepton.h @@ -5,7 +5,7 @@ // // Package: SoftLepton // Class: SoftLepton -// +// /**\class SoftLepton SoftLepton.h RecoBTag/SoftLepton/plugin/SoftLepton.h Description: CMSSW EDProducer wrapper for sot lepton b tagging. @@ -24,20 +24,27 @@ // user include files #include "FWCore/Framework/interface/Frameworkfwd.h" +#include "FWCore/Framework/interface/Event.h" #include "FWCore/Framework/interface/EDProducer.h" -#include "FWCore/Utilities/interface/InputTag.h" #include "FWCore/ParameterSet/interface/ParameterSet.h" #include "DataFormats/Common/interface/RefToBase.h" #include "DataFormats/Math/interface/Vector3D.h" #include "DataFormats/GeometryVector/interface/GlobalVector.h" #include "DataFormats/JetReco/interface/Jet.h" +#include "DataFormats/JetReco/interface/JetTracksAssociation.h" +#include "DataFormats/VertexReco/interface/VertexFwd.h" #include "DataFormats/VertexReco/interface/Vertex.h" -#include "DataFormats/TrackReco/interface/TrackFwd.h" +#include "DataFormats/Common/interface/ValueMap.h" +#include "DataFormats/EgammaCandidates/interface/GsfElectron.h" +#include "DataFormats/EgammaCandidates/interface/Electron.h" +#include "DataFormats/ParticleFlowCandidate/interface/PFCandidateFwd.h" +#include "DataFormats/ParticleFlowCandidate/interface/PFCandidate.h" #include "DataFormats/TrackReco/interface/Track.h" #include "DataFormats/MuonReco/interface/Muon.h" #include "DataFormats/MuonReco/interface/MuonSelectors.h" #include "DataFormats/BTauReco/interface/SoftLeptonTagInfo.h" + class TransientTrackBuilder; class SoftLepton : public edm::EDProducer { @@ -82,16 +89,25 @@ class SoftLepton : public edm::EDProducer { const math::XYZVector& vector, const math::XYZVector& axis ); - + private: virtual void produce(edm::Event & event, const edm::EventSetup & setup); - // configuration - const edm::InputTag m_jets; - const edm::InputTag m_primaryVertex; - const edm::InputTag m_leptons; - const edm::InputTag m_leptonCands; - const edm::InputTag m_leptonId; + // configuration + const edm::InputTag m_jets; + const edm::EDGetTokenT token_jtas; + const edm::EDGetTokenT > token_jets; + const edm::EDGetTokenT token_primaryVertex; + const edm::InputTag m_leptons; + const edm::EDGetTokenT > token_gsfElectrons; + const edm::EDGetTokenT > token_electrons; + const edm::EDGetTokenT token_pfElectrons; + const edm::EDGetTokenT > token_muons; + const edm::EDGetTokenT > token_tracks; + const edm::InputTag m_leptonCands; + const edm::EDGetTokenT > token_leptonCands; + const edm::InputTag m_leptonId; + const edm::EDGetTokenT > token_leptonId; // service used to make transient tracks from tracks const TransientTrackBuilder * m_transientTrackBuilder; @@ -100,7 +116,7 @@ class SoftLepton : public edm::EDProducer { unsigned int m_refineJetAxis; double m_deltaRCut; double m_chi2Cut; - + // specific for reco::Muons muon::SelectionType m_muonSelection; diff --git a/RecoBTag/SoftLepton/python/muonSelection.py b/RecoBTag/SoftLepton/python/muonSelection.py new file mode 100644 index 0000000000000..61642a4485b58 --- /dev/null +++ b/RecoBTag/SoftLepton/python/muonSelection.py @@ -0,0 +1,17 @@ +import FWCore.ParameterSet.Config as cms + +All = cms.uint32(0) # dummy options - always true +AllGlobalMuons = cms.uint32(1) # checks isGlobalMuon flag +AllStandAloneMuons = cms.uint32(2) # checks isStandAloneMuon flag +AllTrackerMuons = cms.uint32(3) # checks isTrackerMuon flag +TrackerMuonArbitrated = cms.uint32(4) # resolve ambiguity of sharing segments +AllArbitrated = cms.uint32(5) # all muons with the tracker muon arbitrated +GlobalMuonPromptTight = cms.uint32(6) # global muons with tighter fit requirements +TMLastStationLoose = cms.uint32(7) # penetration depth loose selector +TMLastStationTight = cms.uint32(8) # penetration depth tight selector +TM2DCompatibilityLoose = cms.uint32(9) # likelihood based loose selector +TM2DCompatibilityTight = cms.uint32(10) # likelihood based tight selector +TMOneStationLoose = cms.uint32(11) # require one well matched segment +TMOneStationTight = cms.uint32(12) # require one well matched segment +TMLastStationOptimizedLowPtLoose = cms.uint32(13) # combination of TMLastStation and TMOneStation +TMLastStationOptimizedLowPtTight = cms.uint32(14) # combination of TMLastStation and TMOneStation diff --git a/RecoBTag/SoftLepton/python/softLepton_cff.py b/RecoBTag/SoftLepton/python/softLepton_cff.py index 93c65dd41bba3..436b3e3e69701 100644 --- a/RecoBTag/SoftLepton/python/softLepton_cff.py +++ b/RecoBTag/SoftLepton/python/softLepton_cff.py @@ -1,6 +1,7 @@ import FWCore.ParameterSet.Config as cms from TrackingTools.TransientTrack.TransientTrackBuilder_cfi import * from RecoBTau.JetTagComputer.jetTagRecord_cfi import * +from RecoBTag.SoftLepton.softMuonTagInfos_cfi import * from RecoBTag.SoftLepton.softPFElectronTagInfos_cfi import * from RecoBTag.SoftLepton.softPFMuonTagInfos_cfi import * from RecoBTag.SoftLepton.SoftLeptonByMLP_cfi import * diff --git a/RecoBTag/SoftLepton/python/softMuonTagInfos_cfi.py b/RecoBTag/SoftLepton/python/softMuonTagInfos_cfi.py new file mode 100644 index 0000000000000..b5a59de0e5c80 --- /dev/null +++ b/RecoBTag/SoftLepton/python/softMuonTagInfos_cfi.py @@ -0,0 +1,18 @@ +import FWCore.ParameterSet.Config as cms +import RecoBTag.SoftLepton.muonSelection + +# SoftLeptonTagInfo producer for tagging caloJets with global muons +softMuonTagInfos = cms.EDProducer("SoftLepton", + primaryVertex = cms.InputTag("offlinePrimaryVertices"), + jets = cms.InputTag("ak5CaloJets"), + leptons = cms.InputTag("muons"), + leptonCands = cms.InputTag(""), # optional + leptonId = cms.InputTag(""), # optional + + refineJetAxis = cms.uint32(0), # use calorimetric jet direction by default + + leptonDeltaRCut = cms.double(0.4), # lepton distance from jet axis + leptonChi2Cut = cms.double(9999.0), # no cut on lepton's track's chi2/ndof + + muonSelection = RecoBTag.SoftLepton.muonSelection.AllGlobalMuons +) diff --git a/RecoBTag/SoftLepton/test/testLeptonAssociator.cc b/RecoBTag/SoftLepton/test/testLeptonAssociator.cc index ea99e238ef7ec..2b970ebf862a3 100644 --- a/RecoBTag/SoftLepton/test/testLeptonAssociator.cc +++ b/RecoBTag/SoftLepton/test/testLeptonAssociator.cc @@ -39,13 +39,13 @@ class testLeptonAssociator : public edm::EDAnalyzer { virtual void analyze(const edm::Event& iEvent, const edm::EventSetup& setup); private: - edm::InputTag m_recoTracks; - edm::InputTag m_standAloneMuons; - edm::InputTag m_globalMuons; - edm::InputTag m_muons; - edm::InputTag m_trackingTruth; - unsigned int m_flavour; - double m_ptcut; + edm::EDGetTokenT > token_recoTracks; + edm::EDGetTokenT > token_standAloneMuons; + edm::EDGetTokenT > token_globalMuons; + edm::EDGetTokenT token_muons; + edm::EDGetTokenT token_trackingTruth; + unsigned int m_flavour; + double m_ptcut; const TrackAssociatorBase* m_associatorByHits; const TrackAssociatorBase* m_associatorByChi2; @@ -64,21 +64,21 @@ std::ostream& operator<< (std::ostream& out, edm::RefToBase ref) { std::ostream& operator<< (std::ostream& out, reco::MuonRef ref) { if (ref->isGlobalMuon()) { - out << " {" << std::setw(2) << ref->track()->found() << "+" << std::setw(2) << ref->standAloneMuon()->found() << "} " + out << " {" << std::setw(2) << ref->track()->found() << "+" << std::setw(2) << ref->standAloneMuon()->found() << "} " << " [" << std::setw(4) << ref.key() << "]" << " " << " pT: " << std::setw(6) << std::setprecision(3) << ref->globalTrack()->pt() << " eta: " << std::setw(6) << std::setprecision(3) << ref->globalTrack()->eta() << " phi: " << std::setw(6) << std::setprecision(3) << ref->globalTrack()->phi(); } else if (ref->isTrackerMuon()) { - out << " {" << std::setw(2) << ref->track()->found() << " } " + out << " {" << std::setw(2) << ref->track()->found() << " } " << " [" << std::setw(4) << ref.key() << "]" << " " << " pT: " << std::setw(6) << std::setprecision(3) << ref->innerTrack()->pt() << " eta: " << std::setw(6) << std::setprecision(3) << ref->innerTrack()->eta() << " phi: " << std::setw(6) << std::setprecision(3) << ref->innerTrack()->phi(); } else if (ref->isStandAloneMuon()) { - out << " { " << std::setw(2) << ref->standAloneMuon()->found() << "} " + out << " { " << std::setw(2) << ref->standAloneMuon()->found() << "} " << " [" << std::setw(4) << ref.key() << "]" << " " << " pT: " << std::setw(6) << std::setprecision(3) << ref->outerTrack()->pt() @@ -92,13 +92,13 @@ std::ostream& operator<< (std::ostream& out, reco::MuonRef ref) { std::ostream& operator<< (std::ostream& out, TrackingParticleRef ref) { out << " [" << std::setw(4) << ref.key() << "]" - << " type:" << std::setw(6) << ref->pdgId() - << " pT: " << std::setw(6) << std::setprecision(3) << ref->pt() + << " type:" << std::setw(6) << ref->pdgId() + << " pT: " << std::setw(6) << std::setprecision(3) << ref->pt() << " eta: " << std::setw(6) << std::setprecision(3) << ref->eta() << " phi: " << std::setw(6) << std::setprecision(3) << ref->phi(); return out; } - + void printAssociations(const char* label, TrackingParticleRef tp, const reco::SimToRecoCollection& byhits, const reco::SimToRecoCollection& bychi2) { reco::SimToRecoCollection::result_type found_byhits; if (byhits.find(tp) != byhits.end()) found_byhits = byhits[tp]; @@ -118,7 +118,7 @@ void printAssociations(const char* label, TrackingParticleRef tp, const reco::Si found.insert( std::make_pair(ref, Quality()) ); found[ref].get<1>() = - it->second; // why is chi2 negative ? } - + for (std::map, Quality>::const_iterator it = found.begin(); it != found.end(); ++it) { std::cout << " " << std::setw(7) << std::left << label << std::right << it->first; if (it->second.get<0>()) std::cout << " [" << std::setw(6) << std::setprecision(3) << it->second.get<0>() << "]"; else std::cout << " "; @@ -146,7 +146,7 @@ void printAssociations(const char* label, edm::RefToBase tp, const found.insert( std::make_pair(ref, Quality()) ); found[ref].get<1>() = - it->second; // why is chi2 negative ? } - + for (std::map::const_iterator it = found.begin(); it != found.end(); ++it) { std::cout << " " << std::setw(7) << std::left << label << std::right << it->first; if (it->second.get<0>()) std::cout << " [" << std::setw(6) << std::setprecision(3) << it->second.get<0>() << "]"; else std::cout << " "; @@ -158,7 +158,7 @@ void printAssociations(const char* label, edm::RefToBase tp, const void printAssociations(const char* label, reco::TrackRef tp, const reco::RecoToSimCollection& byhits, const reco::RecoToSimCollection& bychi2) { printAssociations(label, edm::RefToBase(tp), byhits, bychi2); } - + template std::ostream& operator<< (std::ostream& out, const std::pair, double> & assoc) { @@ -167,13 +167,13 @@ std::ostream& operator<< (std::ostream& out, const std::pair, double } testLeptonAssociator::testLeptonAssociator(edm::ParameterSet const& iConfig) { - m_recoTracks = iConfig.getParameter( "tracks" ); - m_standAloneMuons = iConfig.getParameter( "standAloneMuonTracks" ); - m_globalMuons = iConfig.getParameter( "globalMuonTracks" ); - m_muons = iConfig.getParameter( "muons" ); - m_trackingTruth = iConfig.getParameter( "trackingTruth" ); - m_flavour = iConfig.getParameter( "leptonFlavour" ); - m_ptcut = iConfig.getParameter( "minPt" ); + token_recoTracks = consumes >(iConfig.getParameter( "tracks" )); + token_standAloneMuons = consumes >(iConfig.getParameter( "standAloneMuonTracks" )); + token_globalMuons = consumes >(iConfig.getParameter( "globalMuonTracks" )); + token_muons = consumes(iConfig.getParameter( "muons" )); + token_trackingTruth = consumes(iConfig.getParameter( "trackingTruth" )); + m_flavour = iConfig.getParameter( "leptonFlavour" ); + m_ptcut = iConfig.getParameter( "minPt" ); } testLeptonAssociator::~testLeptonAssociator() { @@ -190,25 +190,25 @@ void testLeptonAssociator::beginRun(const edm::EventSetup & setup) { } void testLeptonAssociator::analyze(const edm::Event& iEvent, const edm::EventSetup& setup) { - + edm::Handle > recoTrackHandle; - iEvent.getByLabel(m_recoTracks, recoTrackHandle); - const edm::View & recoTrackCollection = *(recoTrackHandle.product()); - + iEvent.getByToken(token_recoTracks, recoTrackHandle); + const edm::View & recoTrackCollection = *(recoTrackHandle.product()); + edm::Handle > standAloneMuonHandle; - iEvent.getByLabel(m_standAloneMuons, standAloneMuonHandle); - const edm::View& standAloneMuonCollection = *(standAloneMuonHandle.product()); - + iEvent.getByToken(token_standAloneMuons, standAloneMuonHandle); + const edm::View& standAloneMuonCollection = *(standAloneMuonHandle.product()); + edm::Handle > globalMuonTrackHandle; - iEvent.getByLabel(m_globalMuons, globalMuonTrackHandle); - //const edm::View& globalMuonTrackCollection = *(globalMuonTrackHandle.product()); - + iEvent.getByToken(token_globalMuons, globalMuonTrackHandle); + //const edm::View& globalMuonTrackCollection = *(globalMuonTrackHandle.product()); + edm::Handle globalMuonHandle; - iEvent.getByLabel(m_muons, globalMuonHandle); - const reco::MuonCollection& globalMuonCollection = *(globalMuonHandle.product()); - + iEvent.getByToken(token_muons, globalMuonHandle); + const reco::MuonCollection& globalMuonCollection = *(globalMuonHandle.product()); + edm::Handle trackingParticleHandle ; - iEvent.getByLabel(m_trackingTruth, trackingParticleHandle); + iEvent.getByToken(token_trackingTruth, trackingParticleHandle); const TrackingParticleCollection& trackingParticleCollection = *(trackingParticleHandle.product()); std::cout << std::fixed; @@ -239,7 +239,7 @@ void testLeptonAssociator::analyze(const edm::Event& iEvent, const edm::EventSet for (TrackingParticleCollection::size_type i = 0; i < trackingParticleCollection.size(); ++i) { TrackingParticleRef tp (trackingParticleHandle, i); - if ((std::abs(tp->pdgId()) != (int)m_flavour) or (tp->pt() < m_ptcut)) + if ((std::abs(tp->pdgId()) != (int)m_flavour) or (tp->pt() < m_ptcut)) continue; std::cout << "--> TrackingParticle" << tp << std::endl; printAssociations("Track", tp, byhits_tracks, bychi2_tracks); @@ -247,7 +247,7 @@ void testLeptonAssociator::analyze(const edm::Event& iEvent, const edm::EventSet printAssociations("Global", tp, byhits_globaltrack, bychi2_globaltrack); } } - + // look for tracking particles associated to the (tracker part of the) reconstructed global muons reco::RecoToSimCollection byhits_globalfake = m_associatorByHits->associateRecoToSim (recoTrackHandle, trackingParticleHandle, &iEvent, &setup ); reco::RecoToSimCollection bychi2_globalfake = m_associatorByChi2->associateRecoToSim (recoTrackHandle, trackingParticleHandle, &iEvent, &setup ); @@ -256,7 +256,7 @@ void testLeptonAssociator::analyze(const edm::Event& iEvent, const edm::EventSet std::cout << "<-- Global " << lepton << std::endl; printAssociations("TrackingParticle", lepton->track(), byhits_globalfake, bychi2_globalfake); } - + // look for tracking particles associated to the reconstructed standAlone muons reco::RecoToSimCollection byhits_standalonefake = m_associatorByHits->associateRecoToSim (standAloneMuonHandle, trackingParticleHandle, &iEvent, &setup ); reco::RecoToSimCollection bychi2_standalonefake = m_associatorByChi2->associateRecoToSim (standAloneMuonHandle, trackingParticleHandle, &iEvent, &setup ); diff --git a/RecoBTag/SoftLepton/test/testMuonAssociator.cc b/RecoBTag/SoftLepton/test/testMuonAssociator.cc index a978fea435688..db4c67b518786 100644 --- a/RecoBTag/SoftLepton/test/testMuonAssociator.cc +++ b/RecoBTag/SoftLepton/test/testMuonAssociator.cc @@ -36,13 +36,13 @@ class testMuonAssociator : public edm::EDAnalyzer { virtual void analyze(const edm::Event& event, const edm::EventSetup& setup); private: - edm::InputTag m_recoTracks; - edm::InputTag m_standAloneMuons; - edm::InputTag m_globalMuons; - edm::InputTag m_muons; - edm::InputTag m_trackingTruth; - unsigned int m_flavour; - double m_ptcut; + edm::EDGetTokenT > token_recoTracks; + edm::EDGetTokenT > token_standAloneMuons; + edm::EDGetTokenT > token_globalMuons; + edm::EDGetTokenT token_muons; + edm::EDGetTokenT token_trackingTruth; + unsigned int m_flavour; + double m_ptcut; const TrackAssociatorBase* m_associatorByHits; const TrackAssociatorBase* m_associatorByChi2; @@ -64,21 +64,21 @@ std::ostream& operator<< (std::ostream& out, edm::RefToBase ref) { std::ostream& operator<< (std::ostream& out, reco::MuonRef ref) { out << std::fixed; if (ref->isGlobalMuon()) { - out << " {" << std::setw(2) << ref->innerTrack()->found() << "+" << std::setw(2) << ref->outerTrack()->found() << "} " + out << " {" << std::setw(2) << ref->innerTrack()->found() << "+" << std::setw(2) << ref->outerTrack()->found() << "} " << " [" << std::setw(4) << ref.key() << "]" << " " << " pT: " << std::setw(6) << std::setprecision(3) << ref->globalTrack()->pt() << " eta: " << std::setw(6) << std::setprecision(3) << ref->globalTrack()->eta() << " phi: " << std::setw(6) << std::setprecision(3) << ref->globalTrack()->phi(); } else if (ref->isTrackerMuon()) { - out << " {" << std::setw(2) << ref->innerTrack()->found() << " } " + out << " {" << std::setw(2) << ref->innerTrack()->found() << " } " << " [" << std::setw(4) << ref.key() << "]" << " " << " pT: " << std::setw(6) << std::setprecision(3) << ref->innerTrack()->pt() << " eta: " << std::setw(6) << std::setprecision(3) << ref->innerTrack()->eta() << " phi: " << std::setw(6) << std::setprecision(3) << ref->innerTrack()->phi(); } else if (ref->isStandAloneMuon()) { - out << " { " << std::setw(2) << ref->outerTrack()->found() << "} " + out << " { " << std::setw(2) << ref->outerTrack()->found() << "} " << " [" << std::setw(4) << ref.key() << "]" << " " << " pT: " << std::setw(6) << std::setprecision(3) << ref->outerTrack()->pt() @@ -93,8 +93,8 @@ std::ostream& operator<< (std::ostream& out, reco::MuonRef ref) { std::ostream& operator<< (std::ostream& out, TrackingParticleRef ref) { out << std::fixed; out << " [" << std::setw(4) << ref.key() << "]" - << " type:" << std::setw(6) << ref->pdgId() - << " pT: " << std::setw(6) << std::setprecision(3) << ref->pt() + << " type:" << std::setw(6) << ref->pdgId() + << " pT: " << std::setw(6) << std::setprecision(3) << ref->pt() << " eta: " << std::setw(6) << std::setprecision(3) << ref->eta() << " phi: " << std::setw(6) << std::setprecision(3) << ref->phi(); return out; @@ -111,10 +111,10 @@ class Associations { public: typedef std::map map_type; typedef std::vector > association_type; - + template Associations(const std::string & label, const Key & candidate, const Associator & byHits, const Associator & byChi2, const Associator & byPosition) : - m_map(), + m_map(), m_label(label) { if (byHits.find(candidate) != byHits.end()) @@ -157,27 +157,27 @@ class Associations { std::stringstream buffer; for (typename map_type::const_iterator it = m_map.begin(); it != m_map.end(); ++it) { buffer << " " << std::setw(7) << std::left << m_label << std::right << it->first; - if (it->second.byHits) - buffer << " [" << std::setw(6) << std::setprecision(3) << it->second.byHits << "]"; - else + if (it->second.byHits) + buffer << " [" << std::setw(6) << std::setprecision(3) << it->second.byHits << "]"; + else buffer << " "; - if (it->second.byChi2) - buffer << " [" << std::setw(6) << std::setprecision(3) << it->second.byChi2 << "]"; - else + if (it->second.byChi2) + buffer << " [" << std::setw(6) << std::setprecision(3) << it->second.byChi2 << "]"; + else buffer << " "; - if (it->second.byPosition) - buffer << " [" << std::setw(6) << std::setprecision(3) << it->second.byPosition << "]"; - else + if (it->second.byPosition) + buffer << " [" << std::setw(6) << std::setprecision(3) << it->second.byPosition << "]"; + else buffer << " "; buffer << std::endl; } out << buffer.str(); } - + private: map_type m_map; std::string m_label; - + }; template @@ -193,13 +193,13 @@ std::ostream & operator<< (std::ostream& out, const std::pair, doubl } testMuonAssociator::testMuonAssociator(edm::ParameterSet const& iConfig) { - m_recoTracks = iConfig.getParameter( "tracks" ); - m_standAloneMuons = iConfig.getParameter( "standAloneMuonTracks" ); - m_globalMuons = iConfig.getParameter( "globalMuonTracks" ); - m_muons = iConfig.getParameter( "muons" ); - m_trackingTruth = iConfig.getParameter( "trackingTruth" ); - m_flavour = iConfig.getParameter( "leptonFlavour" ); - m_ptcut = iConfig.getParameter( "minPt" ); + token_recoTracks = consumes >(iConfig.getParameter( "tracks" )); + token_standAloneMuons = consumes >(iConfig.getParameter( "standAloneMuonTracks" )); + token_globalMuons = consumes >(iConfig.getParameter( "globalMuonTracks" )); + token_muons = consumes(iConfig.getParameter( "muons" )); + token_trackingTruth = consumes(iConfig.getParameter( "trackingTruth" )); + m_flavour = iConfig.getParameter( "leptonFlavour" ); + m_ptcut = iConfig.getParameter( "minPt" ); } testMuonAssociator::~testMuonAssociator() { @@ -218,26 +218,26 @@ void testMuonAssociator::analyze(const edm::Event& event, const edm::EventSetup& edm::ESHandle associatorByPosHandle; setup.get().get("TrackAssociatorByPosition", associatorByPosHandle); m_associatorByPos = associatorByPosHandle.product(); - - // access Event collections + + // access Event collections edm::Handle > recoTrackHandle; - event.getByLabel(m_recoTracks, recoTrackHandle); - const edm::View & recoTrackCollection = *(recoTrackHandle.product()); - + event.getByToken(token_recoTracks, recoTrackHandle); + const edm::View & recoTrackCollection = *(recoTrackHandle.product()); + edm::Handle > standAloneMuonHandle; - event.getByLabel(m_standAloneMuons, standAloneMuonHandle); - const edm::View& standAloneMuonCollection = *(standAloneMuonHandle.product()); - + event.getByToken(token_standAloneMuons, standAloneMuonHandle); + const edm::View& standAloneMuonCollection = *(standAloneMuonHandle.product()); + edm::Handle > globalMuonTrackHandle; - event.getByLabel(m_globalMuons, globalMuonTrackHandle); - const edm::View& globalMuonTrackCollection = *(globalMuonTrackHandle.product()); - + event.getByToken(token_globalMuons, globalMuonTrackHandle); + const edm::View& globalMuonTrackCollection = *(globalMuonTrackHandle.product()); + edm::Handle muonHandle; - event.getByLabel(m_muons, muonHandle); - const reco::MuonCollection& muonCollection = *(muonHandle.product()); - + event.getByToken(token_muons, muonHandle); + const reco::MuonCollection& muonCollection = *(muonHandle.product()); + edm::Handle trackingParticleHandle ; - event.getByLabel(m_trackingTruth, trackingParticleHandle); + event.getByToken(token_trackingTruth, trackingParticleHandle); const TrackingParticleCollection& trackingParticleCollection = *(trackingParticleHandle.product()); std::cout << std::fixed; @@ -301,7 +301,7 @@ void testMuonAssociator::analyze(const edm::Event& event, const edm::EventSetup& for (TrackingParticleCollection::size_type i = 0; i < trackingParticleCollection.size(); ++i) { TrackingParticleRef tp (trackingParticleHandle, i); - if ((std::abs(tp->pdgId()) != (int)m_flavour) or (tp->pt() < m_ptcut)) + if ((std::abs(tp->pdgId()) != (int)m_flavour) or (tp->pt() < m_ptcut)) continue; std::cout << "--> TrackingParticle" << tp << std::endl; std::cout << Associations >("Track", tp, byhits_tracks, bychi2_tracks, bypos_tracks); @@ -309,7 +309,7 @@ void testMuonAssociator::analyze(const edm::Event& event, const edm::EventSetup& std::cout << Associations >("Global", tp, byhits_globaltrack, bychi2_globaltrack, bypos_globaltrack); } } - + // look for tracking particles associated to the (tracker part of the) reconstructed global muons reco::RecoToSimCollection byhits_muon; reco::RecoToSimCollection bychi2_muon; @@ -330,7 +330,7 @@ void testMuonAssociator::analyze(const edm::Event& event, const edm::EventSetup& std::cout << "<-- Muon " << muon << std::endl; std::cout << Associations("TrackingParticle", edm::RefToBase(muon->track()), byhits_muon, bychi2_muon, bypos_muon); } - + // look for tracking particles associated to the reconstructed Global muons reco::RecoToSimCollection byhits_global; reco::RecoToSimCollection bychi2_global; diff --git a/RecoBTau/JetTagComputer/python/combinedMVABJetTags_cfi.py b/RecoBTau/JetTagComputer/python/combinedMVABJetTags_cfi.py index 22a51ebe903cf..31a04220a3f0a 100644 --- a/RecoBTau/JetTagComputer/python/combinedMVABJetTags_cfi.py +++ b/RecoBTau/JetTagComputer/python/combinedMVABJetTags_cfi.py @@ -5,7 +5,17 @@ tagInfos = cms.VInputTag( cms.InputTag("impactParameterTagInfos"), cms.InputTag("secondaryVertexTagInfos"), - cms.InputTag("softMuonTagInfos"), - cms.InputTag("softElectronTagInfos") + cms.InputTag("softPFMuonsTagInfos"), + cms.InputTag("softPFElectronsTagInfos") + ) +) + +combinedSecondaryVertexSoftPFLeptonV1BJetTags = cms.EDProducer("JetTagProducer", + jetTagComputer = cms.string('combinedSecondaryVertexSoftPFLeptonV1'), + tagInfos = cms.VInputTag( + cms.InputTag("impactParameterTagInfos"), + cms.InputTag("secondaryVertexTagInfos"), + cms.InputTag("softPFMuonsTagInfos"), + cms.InputTag("softPFElectronsTagInfos") ) ) diff --git a/RecoBTau/JetTagComputer/python/combinedMVAES_cfi.py b/RecoBTau/JetTagComputer/python/combinedMVAES_cfi.py index 4a5c31d33c092..d4743bcc9028b 100644 --- a/RecoBTau/JetTagComputer/python/combinedMVAES_cfi.py +++ b/RecoBTau/JetTagComputer/python/combinedMVAES_cfi.py @@ -17,12 +17,39 @@ cms.PSet( discriminator = cms.bool(True), variables = cms.bool(False), - jetTagComputer = cms.string('softMuon') + jetTagComputer = cms.string('softPFMuon') ), cms.PSet( discriminator = cms.bool(True), variables = cms.bool(False), - jetTagComputer = cms.string('softElectron') + jetTagComputer = cms.string('softPFElectron') + ) + ) +) + +combinedSecondaryVertexSoftPFLeptonV1 = cms.ESProducer("CombinedMVAJetTagESProducer", + useCategories = cms.bool(False), + calibrationRecord = cms.string('CombinedCSVSL'), + jetTagComputers = cms.VPSet( + cms.PSet( + discriminator = cms.bool(True), + variables = cms.bool(False), + jetTagComputer = cms.string('jetProbability') + ), + cms.PSet( + discriminator = cms.bool(True), + variables = cms.bool(False), + jetTagComputer = cms.string('combinedSecondaryVertexV1') + ), + cms.PSet( + discriminator = cms.bool(True), + variables = cms.bool(False), + jetTagComputer = cms.string('softPFMuon') + ), + cms.PSet( + discriminator = cms.bool(True), + variables = cms.bool(False), + jetTagComputer = cms.string('softPFElectron') ) ) ) diff --git a/RecoBTau/JetTagComputer/python/combinedMVA_cff.py b/RecoBTau/JetTagComputer/python/combinedMVA_cff.py index 72fcf7905bf11..ab5c19437ac8e 100644 --- a/RecoBTau/JetTagComputer/python/combinedMVA_cff.py +++ b/RecoBTau/JetTagComputer/python/combinedMVA_cff.py @@ -2,3 +2,7 @@ from RecoBTau.JetTagComputer.combinedMVAES_cfi import * from RecoBTau.JetTagComputer.combinedMVABJetTags_cfi import * +from RecoBTau.JetTagComputer.negativeCombinedMVAES_cfi import * +from RecoBTau.JetTagComputer.negativeCombinedMVABJetTags_cfi import * +from RecoBTau.JetTagComputer.positiveCombinedMVAES_cfi import * +from RecoBTau.JetTagComputer.positiveCombinedMVABJetTags_cfi import * diff --git a/RecoBTau/JetTagComputer/python/negativeCombinedMVABJetTags_cfi.py b/RecoBTau/JetTagComputer/python/negativeCombinedMVABJetTags_cfi.py index 19df82d32c854..136c47969a122 100644 --- a/RecoBTau/JetTagComputer/python/negativeCombinedMVABJetTags_cfi.py +++ b/RecoBTau/JetTagComputer/python/negativeCombinedMVABJetTags_cfi.py @@ -4,8 +4,18 @@ jetTagComputer = cms.string('negativeCombinedMVA'), tagInfos = cms.VInputTag( cms.InputTag("impactParameterTagInfos"), - cms.InputTag("secondaryVertexTagInfos"), - cms.InputTag("softMuonTagInfos"), - cms.InputTag("softElectronTagInfos") + cms.InputTag("secondaryVertexNegativeTagInfos"), + cms.InputTag("softPFMuonsTagInfos"), + cms.InputTag("softPFElectronsTagInfos") + ) +) + +negativeCombinedSecondaryVertexSoftPFLeptonV1BJetTags = cms.EDProducer("JetTagProducer", + jetTagComputer = cms.string('negativeCombinedSecondaryVertexSoftPFLeptonV1'), + tagInfos = cms.VInputTag( + cms.InputTag("impactParameterTagInfos"), + cms.InputTag("secondaryVertexNegativeTagInfos"), + cms.InputTag("softPFMuonsTagInfos"), + cms.InputTag("softPFElectronsTagInfos") ) ) diff --git a/RecoBTau/JetTagComputer/python/negativeCombinedMVAES_cfi.py b/RecoBTau/JetTagComputer/python/negativeCombinedMVAES_cfi.py index 30c55b58bef36..6853c4d293cf0 100644 --- a/RecoBTau/JetTagComputer/python/negativeCombinedMVAES_cfi.py +++ b/RecoBTau/JetTagComputer/python/negativeCombinedMVAES_cfi.py @@ -7,7 +7,7 @@ cms.PSet( discriminator = cms.bool(True), variables = cms.bool(False), - jetTagComputer = cms.string('negativeOnlyJetProbabilityJetTags') + jetTagComputer = cms.string('negativeOnlyJetProbability') ), cms.PSet( discriminator = cms.bool(True), @@ -17,12 +17,39 @@ cms.PSet( discriminator = cms.bool(True), variables = cms.bool(False), - jetTagComputer = cms.string('negativeSoftMuon') + jetTagComputer = cms.string('negativeSoftPFMuon') ), cms.PSet( discriminator = cms.bool(True), variables = cms.bool(False), - jetTagComputer = cms.string('negativeSoftElectron') + jetTagComputer = cms.string('negativeSoftPFElectron') + ) + ) +) + +negativeCombinedSecondaryVertexSoftPFLeptonV1 = cms.ESProducer("CombinedMVAJetTagESProducer", + useCategories = cms.bool(False), + calibrationRecord = cms.string('CombinedCSVSL'), + jetTagComputers = cms.VPSet( + cms.PSet( + discriminator = cms.bool(True), + variables = cms.bool(False), + jetTagComputer = cms.string('negativeOnlyJetProbability') + ), + cms.PSet( + discriminator = cms.bool(True), + variables = cms.bool(False), + jetTagComputer = cms.string('combinedSecondaryVertexV1Negative') + ), + cms.PSet( + discriminator = cms.bool(True), + variables = cms.bool(False), + jetTagComputer = cms.string('negativeSoftPFMuon') + ), + cms.PSet( + discriminator = cms.bool(True), + variables = cms.bool(False), + jetTagComputer = cms.string('negativeSoftPFElectron') ) ) ) diff --git a/RecoBTau/JetTagComputer/python/negativeCombinedMVA_cff.py b/RecoBTau/JetTagComputer/python/negativeCombinedMVA_cff.py deleted file mode 100644 index 33b9fea3547d6..0000000000000 --- a/RecoBTau/JetTagComputer/python/negativeCombinedMVA_cff.py +++ /dev/null @@ -1,4 +0,0 @@ -import FWCore.ParameterSet.Config as cms - -from RecoBTau.JetTagComputer.negativeCombinedMVAES_cfi import * -from RecoBTau.JetTagComputer.negativeCombinedMVABJetTags_cfi import * diff --git a/RecoBTau/JetTagComputer/python/positiveCombinedMVABJetTags_cfi.py b/RecoBTau/JetTagComputer/python/positiveCombinedMVABJetTags_cfi.py index 99815ce264801..6bfe8083027fb 100644 --- a/RecoBTau/JetTagComputer/python/positiveCombinedMVABJetTags_cfi.py +++ b/RecoBTau/JetTagComputer/python/positiveCombinedMVABJetTags_cfi.py @@ -5,7 +5,17 @@ tagInfos = cms.VInputTag( cms.InputTag("impactParameterTagInfos"), cms.InputTag("secondaryVertexTagInfos"), - cms.InputTag("softMuonTagInfos"), - cms.InputTag("softElectronTagInfos") + cms.InputTag("softPFMuonsTagInfos"), + cms.InputTag("softPFElectronsTagInfos") + ) +) + +positiveCombinedSecondaryVertexSoftPFLeptonV1BJetTags = cms.EDProducer("JetTagProducer", + jetTagComputer = cms.string('positiveCombinedSecondaryVertexSoftPFLeptonV1'), + tagInfos = cms.VInputTag( + cms.InputTag("impactParameterTagInfos"), + cms.InputTag("secondaryVertexTagInfos"), + cms.InputTag("softPFMuonsTagInfos"), + cms.InputTag("softPFElectronsTagInfos") ) ) diff --git a/RecoBTau/JetTagComputer/python/positiveCombinedMVAES_cfi.py b/RecoBTau/JetTagComputer/python/positiveCombinedMVAES_cfi.py index 5417d438e383e..18b181b6f0a10 100644 --- a/RecoBTau/JetTagComputer/python/positiveCombinedMVAES_cfi.py +++ b/RecoBTau/JetTagComputer/python/positiveCombinedMVAES_cfi.py @@ -7,7 +7,7 @@ cms.PSet( discriminator = cms.bool(True), variables = cms.bool(False), - jetTagComputer = cms.string('positiveOnlyJetProbabilityJetTags') + jetTagComputer = cms.string('positiveOnlyJetProbability') ), cms.PSet( discriminator = cms.bool(True), @@ -17,12 +17,39 @@ cms.PSet( discriminator = cms.bool(True), variables = cms.bool(False), - jetTagComputer = cms.string('positiveSoftMuon') + jetTagComputer = cms.string('positiveSoftPFMuon') ), cms.PSet( discriminator = cms.bool(True), variables = cms.bool(False), - jetTagComputer = cms.string('positiveSoftElectron') + jetTagComputer = cms.string('positiveSoftPFElectron') + ) + ) +) + +positiveCombinedSecondaryVertexSoftPFLeptonV1 = cms.ESProducer("CombinedMVAJetTagESProducer", + useCategories = cms.bool(False), + calibrationRecord = cms.string('CombinedCSVSL'), + jetTagComputers = cms.VPSet( + cms.PSet( + discriminator = cms.bool(True), + variables = cms.bool(False), + jetTagComputer = cms.string('positiveOnlyJetProbability') + ), + cms.PSet( + discriminator = cms.bool(True), + variables = cms.bool(False), + jetTagComputer = cms.string('combinedSecondaryVertexV1Positive') + ), + cms.PSet( + discriminator = cms.bool(True), + variables = cms.bool(False), + jetTagComputer = cms.string('positiveSoftPFMuon') + ), + cms.PSet( + discriminator = cms.bool(True), + variables = cms.bool(False), + jetTagComputer = cms.string('positiveSoftPFElectron') ) ) ) diff --git a/RecoBTau/JetTagComputer/python/positiveCombinedMVA_cff.py b/RecoBTau/JetTagComputer/python/positiveCombinedMVA_cff.py deleted file mode 100644 index 8734469434732..0000000000000 --- a/RecoBTau/JetTagComputer/python/positiveCombinedMVA_cff.py +++ /dev/null @@ -1,4 +0,0 @@ -import FWCore.ParameterSet.Config as cms - -from RecoBTau.JetTagComputer.positiveCombinedMVAES_cfi import * -from RecoBTau.JetTagComputer.positiveCombinedMVABJetTags_cfi import *