diff --git a/PhysicsTools/PatAlgos/python/recoLayer0/bTagging_cff.py b/PhysicsTools/PatAlgos/python/recoLayer0/bTagging_cff.py index 0291775995823..159a4040dec10 100644 --- a/PhysicsTools/PatAlgos/python/recoLayer0/bTagging_cff.py +++ b/PhysicsTools/PatAlgos/python/recoLayer0/bTagging_cff.py @@ -21,14 +21,10 @@ , 'pfInclusiveSecondaryVertexFinderTagInfosCA15' , 'pfInclusiveSecondaryVertexFinderNegativeTagInfos' , 'softPFMuonsTagInfos' - , 'softPFMuonsTagInfosAK8' - , 'softPFMuonsTagInfosCA15' , 'softPFElectronsTagInfos' - , 'softPFElectronsTagInfosAK8' - , 'softPFElectronsTagInfosCA15' - #C-Tagging tag infos + # C-Tagging tag infos , 'pfInclusiveSecondaryVertexFinderCvsLTagInfos' - # TopTagInfos (unrelated to b tagging) + # TopTagInfos (unrelated to b tagging) , 'caTopTagInfos' ] # extend for "internal use" in PAT/MINIAOD (renaming) @@ -130,9 +126,9 @@ , 'pfCombinedMVAV2BJetTags' : ['pfImpactParameterTagInfos', 'pfSecondaryVertexTagInfos', 'pfInclusiveSecondaryVertexFinderTagInfos', 'softPFMuonsTagInfos', 'softPFElectronsTagInfos'] , 'pfCombinedSecondaryVertexSoftLeptonBJetTags' : ['pfImpactParameterTagInfos', 'pfInclusiveSecondaryVertexFinderTagInfos', 'softPFMuonsTagInfos', 'softPFElectronsTagInfos'] , 'pfNegativeCombinedSecondaryVertexSoftLeptonBJetTags' : ['pfImpactParameterTagInfos', 'pfInclusiveSecondaryVertexFinderNegativeTagInfos', 'softPFMuonsTagInfos', 'softPFElectronsTagInfos'] - , 'pfBoostedDoubleSecondaryVertexAK8BJetTags' : ['pfImpactParameterTagInfosAK8', 'pfInclusiveSecondaryVertexFinderTagInfosAK8', 'softPFMuonsTagInfosAK8', 'softPFElectronsTagInfosAK8'] - , 'pfBoostedDoubleSecondaryVertexCA15BJetTags' : ['pfImpactParameterTagInfosCA15', 'pfInclusiveSecondaryVertexFinderTagInfosCA15', 'softPFMuonsTagInfosCA15', 'softPFElectronsTagInfosCA15'] - #C-Tagging - , 'pfCombinedCvsLJetTags' : ["pfImpactParameterTagInfos", "pfInclusiveSecondaryVertexFinderCvsLTagInfos", "softPFMuonsTagInfos", "softPFElectronsTagInfos"] - , 'pfCombinedCvsBJetTags' : ["pfImpactParameterTagInfos", "pfInclusiveSecondaryVertexFinderCvsLTagInfos", "softPFMuonsTagInfos", "softPFElectronsTagInfos"] + , 'pfBoostedDoubleSecondaryVertexAK8BJetTags' : ['pfImpactParameterTagInfosAK8', 'pfInclusiveSecondaryVertexFinderTagInfosAK8'] + , 'pfBoostedDoubleSecondaryVertexCA15BJetTags' : ['pfImpactParameterTagInfosCA15', 'pfInclusiveSecondaryVertexFinderTagInfosCA15'] + # C-Tagging + , 'pfCombinedCvsLJetTags' : ["pfImpactParameterTagInfos", "pfInclusiveSecondaryVertexFinderCvsLTagInfos", "softPFMuonsTagInfos", "softPFElectronsTagInfos"] + , 'pfCombinedCvsBJetTags' : ["pfImpactParameterTagInfos", "pfInclusiveSecondaryVertexFinderCvsLTagInfos", "softPFMuonsTagInfos", "softPFElectronsTagInfos"] } diff --git a/PhysicsTools/PatAlgos/python/tools/jetTools.py b/PhysicsTools/PatAlgos/python/tools/jetTools.py index d19a8eb2afa6b..61a4775a6c3bf 100644 --- a/PhysicsTools/PatAlgos/python/tools/jetTools.py +++ b/PhysicsTools/PatAlgos/python/tools/jetTools.py @@ -488,16 +488,8 @@ def toolCode(self, process): setattr(process, btagInfo+_labelName+postfix, btag.softMuonTagInfos.clone(jets = jetSource, primaryVertex=pvSource)) if btagInfo == 'softPFMuonsTagInfos': setattr(process, btagInfo+_labelName+postfix, btag.softPFMuonsTagInfos.clone(jets = jetSource, primaryVertex=pvSource, muons=muSource)) - if btagInfo == 'softPFMuonsTagInfosAK8': - setattr(process, btagInfo+_labelName+postfix, btag.softPFMuonsTagInfosAK8.clone(jets = jetSource, primaryVertex=pvSource, muons=muSource)) - if btagInfo == 'softPFMuonsTagInfosCA15': - setattr(process, btagInfo+_labelName+postfix, btag.softPFMuonsTagInfosCA15.clone(jets = jetSource, primaryVertex=pvSource, muons=muSource)) if btagInfo == 'softPFElectronsTagInfos': setattr(process, btagInfo+_labelName+postfix, btag.softPFElectronsTagInfos.clone(jets = jetSource, primaryVertex=pvSource, electrons=elSource)) - if btagInfo == 'softPFElectronsTagInfosAK8': - setattr(process, btagInfo+_labelName+postfix, btag.softPFElectronsTagInfosAK8.clone(jets = jetSource, primaryVertex=pvSource, electrons=elSource)) - if btagInfo == 'softPFElectronsTagInfosCA15': - setattr(process, btagInfo+_labelName+postfix, btag.softPFElectronsTagInfosCA15.clone(jets = jetSource, primaryVertex=pvSource, electrons=elSource)) acceptedTagInfos.append(btagInfo) elif hasattr(toptag, btagInfo) : acceptedTagInfos.append(btagInfo) diff --git a/RecoBTag/SecondaryVertex/BuildFile.xml b/RecoBTag/SecondaryVertex/BuildFile.xml index 66f245b372fed..ca3a97ed868ad 100644 --- a/RecoBTag/SecondaryVertex/BuildFile.xml +++ b/RecoBTag/SecondaryVertex/BuildFile.xml @@ -8,6 +8,7 @@ + diff --git a/RecoBTag/SecondaryVertex/interface/CandidateBoostedDoubleSecondaryVertexComputer.h b/RecoBTag/SecondaryVertex/interface/CandidateBoostedDoubleSecondaryVertexComputer.h index 22276c98c5fd8..e877e507a5e49 100644 --- a/RecoBTag/SecondaryVertex/interface/CandidateBoostedDoubleSecondaryVertexComputer.h +++ b/RecoBTag/SecondaryVertex/interface/CandidateBoostedDoubleSecondaryVertexComputer.h @@ -2,6 +2,7 @@ #define RecoBTag_SecondaryVertex_CandidateBoostedDoubleSecondaryVertexComputer_h #include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "FWCore/Framework/interface/ESHandle.h" #include "CommonTools/Utils/interface/TMVAEvaluator.h" #include "RecoBTau/JetTagComputer/interface/JetTagComputer.h" #include "DataFormats/JetReco/interface/JetCollection.h" @@ -9,6 +10,9 @@ #include "DataFormats/VertexReco/interface/VertexFwd.h" #include "DataFormats/Candidate/interface/VertexCompositePtrCandidate.h" #include "RecoBTag/SecondaryVertex/interface/TrackKinematics.h" +#include "RecoBTag/SecondaryVertex/interface/V0Filter.h" +#include "RecoBTag/SecondaryVertex/interface/TrackSelector.h" +#include "TrackingTools/TransientTrack/interface/TransientTrackBuilder.h" #include "fastjet/PseudoJet.hh" #include "fastjet/contrib/Njettiness.hh" @@ -18,6 +22,7 @@ class CandidateBoostedDoubleSecondaryVertexComputer : public JetTagComputer { public: CandidateBoostedDoubleSecondaryVertexComputer(const edm::ParameterSet & parameters); + void initialize(const JetTagComputerRecord &) override; float discriminator(const TagInfoHelper & tagInfos) const override; private: @@ -25,15 +30,25 @@ class CandidateBoostedDoubleSecondaryVertexComputer : public JetTagComputer { void setTracksPVBase(const reco::TrackRef & trackRef, const reco::VertexRef & vertexRef, float & PVweight) const; void setTracksPV(const reco::CandidatePtr & trackRef, const reco::VertexRef & vertexRef, float & PVweight) const; void vertexKinematics(const reco::VertexCompositePtrCandidate & vertex, reco::TrackKinematics & vertexKinematics) const; + void etaRelToTauAxis(const reco::VertexCompositePtrCandidate & vertex, fastjet::PseudoJet & tauAxis, std::vector & tau_trackEtaRel) const; - const double beta_ ; + const double beta_; const double R0_; // N-subjettiness calculator fastjet::contrib::Njettiness njettiness_; const double maxSVDeltaRToJet_; - + const bool useCondDB_; + const std::string gbrForestLabel_; const edm::FileInPath weightFile_; + const bool useGBRForest_; + const bool useAdaBoost_; + const bool maxDistToAxis_; + const bool maxDecayLen_; + reco::V0Filter trackPairV0Filter; + reco::TrackSelector trackSelector; + + edm::ESHandle trackBuilder; std::unique_ptr mvaID; }; diff --git a/RecoBTag/SecondaryVertex/python/candidateBoostedDoubleSecondaryVertexAK8Computer_cfi.py b/RecoBTag/SecondaryVertex/python/candidateBoostedDoubleSecondaryVertexAK8Computer_cfi.py index ef47d34c92e38..d4956374d5ede 100644 --- a/RecoBTag/SecondaryVertex/python/candidateBoostedDoubleSecondaryVertexAK8Computer_cfi.py +++ b/RecoBTag/SecondaryVertex/python/candidateBoostedDoubleSecondaryVertexAK8Computer_cfi.py @@ -1,8 +1,15 @@ import FWCore.ParameterSet.Config as cms +from RecoBTag.SecondaryVertex.trackSelection_cff import * + candidateBoostedDoubleSecondaryVertexAK8Computer = cms.ESProducer("CandidateBoostedDoubleSecondaryVertexESProducer", + trackSelectionBlock, beta = cms.double(1.0), R0 = cms.double(0.8), maxSVDeltaRToJet = cms.double(0.7), - weightFile = cms.FileInPath('RecoBTag/SecondaryVertex/data/BoostedDoubleSV_AK8_BDT.weights.xml.gz') + useCondDB = cms.bool(False), + weightFile = cms.FileInPath('RecoBTag/SecondaryVertex/data/BoostedDoubleSV_AK8_BDT_v2.weights.xml.gz'), + useGBRForest = cms.bool(True), + useAdaBoost = cms.bool(False), + trackPairV0Filter = cms.PSet(k0sMassWindow = cms.double(0.03)) ) diff --git a/RecoBTag/SecondaryVertex/python/candidateBoostedDoubleSecondaryVertexCA15Computer_cfi.py b/RecoBTag/SecondaryVertex/python/candidateBoostedDoubleSecondaryVertexCA15Computer_cfi.py index 9008fa0aaccc7..d91b153c9288d 100644 --- a/RecoBTag/SecondaryVertex/python/candidateBoostedDoubleSecondaryVertexCA15Computer_cfi.py +++ b/RecoBTag/SecondaryVertex/python/candidateBoostedDoubleSecondaryVertexCA15Computer_cfi.py @@ -1,8 +1,15 @@ import FWCore.ParameterSet.Config as cms +from RecoBTag.SecondaryVertex.trackSelection_cff import * + candidateBoostedDoubleSecondaryVertexCA15Computer = cms.ESProducer("CandidateBoostedDoubleSecondaryVertexESProducer", + trackSelectionBlock, beta = cms.double(1.0), R0 = cms.double(1.5), maxSVDeltaRToJet = cms.double(1.3), - weightFile = cms.FileInPath('RecoBTag/SecondaryVertex/data/BoostedDoubleSV_CA15_BDT.weights.xml.gz') + useCondDB = cms.bool(False), + weightFile = cms.FileInPath('RecoBTag/SecondaryVertex/data/BoostedDoubleSV_CA15_BDT_v2.weights.xml.gz'), + useGBRForest = cms.bool(True), + useAdaBoost = cms.bool(False), + trackPairV0Filter = cms.PSet(k0sMassWindow = cms.double(0.03)) ) diff --git a/RecoBTag/SecondaryVertex/python/pfBoostedDoubleSecondaryVertexAK8BJetTags_cfi.py b/RecoBTag/SecondaryVertex/python/pfBoostedDoubleSecondaryVertexAK8BJetTags_cfi.py index 5a98bcf736695..21cb9bbb8ae42 100644 --- a/RecoBTag/SecondaryVertex/python/pfBoostedDoubleSecondaryVertexAK8BJetTags_cfi.py +++ b/RecoBTag/SecondaryVertex/python/pfBoostedDoubleSecondaryVertexAK8BJetTags_cfi.py @@ -3,7 +3,5 @@ pfBoostedDoubleSecondaryVertexAK8BJetTags = cms.EDProducer("JetTagProducer", jetTagComputer = cms.string('candidateBoostedDoubleSecondaryVertexAK8Computer'), tagInfos = cms.VInputTag(cms.InputTag("pfImpactParameterTagInfosAK8"), - cms.InputTag("pfInclusiveSecondaryVertexFinderTagInfosAK8"), - cms.InputTag("softPFMuonsTagInfosAK8"), - cms.InputTag("softPFElectronsTagInfosAK8")) + cms.InputTag("pfInclusiveSecondaryVertexFinderTagInfosAK8")) ) diff --git a/RecoBTag/SecondaryVertex/python/pfBoostedDoubleSecondaryVertexCA15BJetTags_cfi.py b/RecoBTag/SecondaryVertex/python/pfBoostedDoubleSecondaryVertexCA15BJetTags_cfi.py index 40869cc1e55b9..85a93ac5443bf 100644 --- a/RecoBTag/SecondaryVertex/python/pfBoostedDoubleSecondaryVertexCA15BJetTags_cfi.py +++ b/RecoBTag/SecondaryVertex/python/pfBoostedDoubleSecondaryVertexCA15BJetTags_cfi.py @@ -3,7 +3,5 @@ pfBoostedDoubleSecondaryVertexCA15BJetTags = cms.EDProducer("JetTagProducer", jetTagComputer = cms.string('candidateBoostedDoubleSecondaryVertexCA15Computer'), tagInfos = cms.VInputTag(cms.InputTag("pfImpactParameterTagInfosCA15"), - cms.InputTag("pfInclusiveSecondaryVertexFinderTagInfosCA15"), - cms.InputTag("softPFMuonsTagInfosCA15"), - cms.InputTag("softPFElectronsTagInfosCA15")) + cms.InputTag("pfInclusiveSecondaryVertexFinderTagInfosCA15")) ) diff --git a/RecoBTag/SecondaryVertex/src/CandidateBoostedDoubleSecondaryVertexComputer.cc b/RecoBTag/SecondaryVertex/src/CandidateBoostedDoubleSecondaryVertexComputer.cc index 3544d1beedbaa..181a38e9926d6 100644 --- a/RecoBTag/SecondaryVertex/src/CandidateBoostedDoubleSecondaryVertexComputer.cc +++ b/RecoBTag/SecondaryVertex/src/CandidateBoostedDoubleSecondaryVertexComputer.cc @@ -1,11 +1,18 @@ #include "RecoBTag/SecondaryVertex/interface/CandidateBoostedDoubleSecondaryVertexComputer.h" #include "FWCore/MessageLogger/interface/MessageLogger.h" + +#include "CondFormats/DataRecord/interface/BTauGenericMVAJetTagComputerRcd.h" +#include "CondFormats/DataRecord/interface/GBRWrapperRcd.h" +#include "TrackingTools/Records/interface/TransientTrackRecord.h" +#include "RecoBTau/JetTagComputer/interface/JetTagComputerRecord.h" #include "DataFormats/BTauReco/interface/CandIPTagInfo.h" #include "DataFormats/BTauReco/interface/CandSecondaryVertexTagInfo.h" -#include "DataFormats/BTauReco/interface/CandSoftLeptonTagInfo.h" #include "DataFormats/ParticleFlowCandidate/interface/PFCandidate.h" #include "DataFormats/PatCandidates/interface/PackedCandidate.h" +#include "RecoVertex/VertexPrimitives/interface/ConvertToFromReco.h" +#include "RecoBTau/JetTagComputer/interface/JetTagComputer.h" +#include "TrackingTools/IPTools/interface/IPTools.h" CandidateBoostedDoubleSecondaryVertexComputer::CandidateBoostedDoubleSecondaryVertexComputer(const edm::ParameterSet & parameters) : @@ -13,39 +20,73 @@ CandidateBoostedDoubleSecondaryVertexComputer::CandidateBoostedDoubleSecondaryVe R0_(parameters.getParameter("R0")), njettiness_(fastjet::contrib::OnePass_KT_Axes(), fastjet::contrib::NormalizedMeasure(beta_,R0_)), maxSVDeltaRToJet_(parameters.getParameter("maxSVDeltaRToJet")), - weightFile_(parameters.getParameter("weightFile")) + useCondDB_(parameters.getParameter("useCondDB")), + gbrForestLabel_(parameters.existsAs("gbrForestLabel") ? parameters.getParameter("gbrForestLabel") : ""), + weightFile_(parameters.existsAs("weightFile") ? parameters.getParameter("weightFile") : edm::FileInPath()), + useGBRForest_(parameters.existsAs("useGBRForest") ? parameters.getParameter("useGBRForest") : false), + useAdaBoost_(parameters.existsAs("useAdaBoost") ? parameters.getParameter("useAdaBoost") : false), + maxDistToAxis_(parameters.getParameter("trackSelection").getParameter("maxDistToAxis")), + maxDecayLen_(parameters.getParameter("trackSelection").getParameter("maxDecayLen")), + trackPairV0Filter(parameters.getParameter("trackPairV0Filter")), + trackSelector(parameters.getParameter("trackSelection")) { uses(0, "ipTagInfos"); uses(1, "svTagInfos"); - uses(2, "muonTagInfos"); - uses(3, "elecTagInfos"); mvaID.reset(new TMVAEvaluator()); +} - // variable order needs to be the same as in the training - std::vector variables({"PFLepton_ptrel", "z_ratio1", "tau_dot", "SV_mass_0", "SV_vtx_EnergyRatio_0", - "SV_vtx_EnergyRatio_1","PFLepton_IP2D", "tau2/tau1", "nSL", "jetNTracksEtaRel"}); - std::vector spectators({"massGroomed", "flavour", "nbHadrons", "ptGroomed", "etaGroomed"}); +void CandidateBoostedDoubleSecondaryVertexComputer::initialize(const JetTagComputerRecord & record) +{ + // variable names and order need to be the same as in the training + std::vector variables({"z_ratio", + "trackSipdSig_3","trackSipdSig_2","trackSipdSig_1","trackSipdSig_0", + "trackSipdSig_1_0","trackSipdSig_0_0","trackSipdSig_1_1","trackSipdSig_0_1", + "trackSip2dSigAboveCharm_0","trackSip2dSigAboveBottom_0","trackSip2dSigAboveBottom_1", + "tau0_trackEtaRel_0","tau0_trackEtaRel_1","tau0_trackEtaRel_2", + "tau1_trackEtaRel_0","tau1_trackEtaRel_1","tau1_trackEtaRel_2", + "tau_vertexMass_0","tau_vertexEnergyRatio_0","tau_vertexDeltaR_0","tau_flightDistance2dSig_0", + "tau_vertexMass_1","tau_vertexEnergyRatio_1","tau_flightDistance2dSig_1", + "jetNTracks","nSV"}); + // book TMVA readers + std::vector spectators({"massPruned", "flavour", "nbHadrons", "ptPruned", "etaPruned"}); + + if (useCondDB_) + { + const GBRWrapperRcd & gbrWrapperRecord = record.getRecord(); - mvaID->initialize("Color:Silent:Error", "BDTG", weightFile_.fullPath(), variables, spectators,true,false); -} + edm::ESHandle gbrForestHandle; + gbrWrapperRecord.get(gbrForestLabel_.c_str(), gbrForestHandle); + mvaID->initializeGBRForest(gbrForestHandle.product(), variables, spectators, useAdaBoost_); + } + else + mvaID->initialize("Color:Silent:Error", "BDT", weightFile_.fullPath(), variables, spectators, useGBRForest_, useAdaBoost_); + + // get TransientTrackBuilder + const TransientTrackRecord & transientTrackRcd = record.getRecord(); + transientTrackRcd.get("TransientTrackBuilder", trackBuilder); +} float CandidateBoostedDoubleSecondaryVertexComputer::discriminator(const TagInfoHelper & tagInfo) const { // get TagInfos const reco::CandIPTagInfo & ipTagInfo = tagInfo.get(0); const reco::CandSecondaryVertexTagInfo & svTagInfo = tagInfo.get(1); - const reco::CandSoftLeptonTagInfo & muonTagInfo = tagInfo.get(2); - const reco::CandSoftLeptonTagInfo & elecTagInfo = tagInfo.get(3); // default discriminator value float value = -10.; // default variable values - float z_ratio = -1. , tau_dot = -1., SV_pt_0 = -1., SV_mass_0 = -1., SV_EnergyRatio_0 = -1., SV_EnergyRatio_1 = -1., tau21 = -1.; - int contSV = 0, vertexNTracks = 0; - int nSL = 0, nSM = 0, nSE = 0; + float z_ratio = -3.; + float trackSip3dSig_3 = -50., trackSip3dSig_2 = -50., trackSip3dSig_1 = -50., trackSip3dSig_0 = -50.; + float tau2_trackSip3dSig_0 = -50., tau1_trackSip3dSig_0 = -50., tau2_trackSip3dSig_1 = -50., tau1_trackSip3dSig_1 = -50.; + float trackSip2dSigAboveCharm_0 = -19., trackSip2dSigAboveBottom_0 = -19., trackSip2dSigAboveBottom_1 = -19.; + float tau1_trackEtaRel_0 = -1., tau1_trackEtaRel_1 = -1., tau1_trackEtaRel_2 = -1.; + float tau2_trackEtaRel_0 = -1., tau2_trackEtaRel_1 = -1., tau2_trackEtaRel_2 = -1.; + float tau1_vertexMass = -1., tau1_vertexEnergyRatio = -1., tau1_vertexDeltaR = -1., tau1_flightDistance2dSig = -1.; + float tau2_vertexMass = -1., tau2_vertexEnergyRatio = -1., tau2_vertexDeltaR = -1., tau2_flightDistance2dSig = -1.; + float jetNTracks = 0, nSV = 0, tau1_nSecondaryVertices = 0, tau2_nSecondaryVertices = 0; // get the jet reference const reco::JetBaseRef jet = svTagInfo.jet(); @@ -54,111 +95,490 @@ float CandidateBoostedDoubleSecondaryVertexComputer::discriminator(const TagInfo float tau2, tau1; // calculate N-subjettiness calcNsubjettiness(jet, tau1, tau2, currentAxes); - if (tau1 != 0.) tau21 = tau2/tau1; - const std::vector & selectedTracks( ipTagInfo.selectedTracks() ); - size_t trackSize = selectedTracks.size(); const reco::VertexRef & vertexRef = ipTagInfo.primaryVertex(); + GlobalPoint pv(0.,0.,0.); + if ( ipTagInfo.primaryVertex().isNonnull() ) + pv = GlobalPoint(vertexRef->x(),vertexRef->y(),vertexRef->z()); + + const std::vector & selectedTracks = ipTagInfo.selectedTracks(); + const std::vector & ipData = ipTagInfo.impactParameterData(); + size_t trackSize = selectedTracks.size(); + + reco::TrackKinematics allKinematics; + std::vector IP3Ds, IP3Ds_1, IP3Ds_2; + int contTrk=0; + // loop over tracks associated to the jet for (size_t itt=0; itt < trackSize; ++itt) { - const reco::Track & ptrack = *(reco::btag::toTrack(selectedTracks[itt])); const reco::CandidatePtr ptrackRef = selectedTracks[itt]; + const reco::Track * ptrackPtr = reco::btag::toTrack(ptrackRef); + const reco::Track & ptrack = *ptrackPtr; float track_PVweight = 0.; setTracksPV(ptrackRef, vertexRef, track_PVweight); - if (track_PVweight>0.) { allKinematics.add(ptrack, track_PVweight); } + if (track_PVweight>0.5) allKinematics.add(ptrack, track_PVweight); + + const reco::btag::TrackIPData &data = ipData[itt]; + if (trackSelector(ptrack, data, *jet, pv)) jetNTracks += 1.; + + // check if the track is from V0 + bool isfromV0 = false; + const reco::Track * trackPairV0Test[2]; + + trackPairV0Test[0] = ptrackPtr; + + for (size_t jtt=0; jtt < trackSize; ++jtt) + { + if (itt == jtt) continue; + + const reco::CandidatePtr pairTrackRef = selectedTracks[jtt]; + const reco::Track * pairTrackPtr = reco::btag::toTrack(pairTrackRef); + + trackPairV0Test[1] = pairTrackPtr; + + if (!trackPairV0Filter(trackPairV0Test, 2)) + { + isfromV0 = true; + break; + } + } + + reco::TransientTrack transientTrack = trackBuilder->build(ptrack); + GlobalVector direction(jet->px(), jet->py(), jet->pz()); + + if (currentAxes.size() > 1) + { + if (reco::deltaR2(ptrack,currentAxes[1]) < reco::deltaR2(ptrack,currentAxes[0])) + direction = GlobalVector(currentAxes[1].px(), currentAxes[1].py(), currentAxes[1].pz()); + else + direction = GlobalVector(currentAxes[0].px(), currentAxes[0].py(), currentAxes[0].pz()); + } + else if (currentAxes.size() > 0) + direction = GlobalVector(currentAxes[0].px(), currentAxes[0].py(), currentAxes[0].pz()); + + // decay distance and track distance wrt to the closest tau axis + float decayLengthTau=-1; + float distTauAxis=-1; + + TrajectoryStateOnSurface closest = IPTools::closestApproachToJet(transientTrack.impactPointState(), *vertexRef , direction, transientTrack.field()); + if (closest.isValid()) + decayLengthTau = (closest.globalPosition() - RecoVertex::convertPos(vertexRef->position())).mag(); + + distTauAxis = std::abs(IPTools::jetTrackDistance(transientTrack, direction, *vertexRef ).second.value()); + + float IP3Dsig = ipTagInfo.impactParameterData()[itt].ip3d.significance(); + + if( !isfromV0 && decayLengthTau 1) + { + if (reco::deltaR2(ptrack,currentAxes[0]) < reco::deltaR2(ptrack,currentAxes[1])) + IP3Ds_1.push_back( IP3Dsig<-50. ? -50. : IP3Dsig ); + else + IP3Ds_2.push_back( IP3Dsig<-50. ? -50. : IP3Dsig ); + } + else + IP3Ds_1.push_back( IP3Dsig<-50. ? -50. : IP3Dsig ); + } + } + + std::vector indices = ipTagInfo.sortedIndexes(reco::btag::IP2DSig); + bool charmThreshSet = false; + + reco::TrackKinematics kin; + for (size_t i=0; i 1.5 // charm cut + && !charmThreshSet ) + { + trackSip2dSigAboveCharm_0 = data.ip2d.significance(); + + charmThreshSet = true; + } + + if ( kin.vectorSum().M() > 5.2 ) // bottom cut + { + trackSip2dSigAboveBottom_0 = data.ip2d.significance(); + if ( (i+1)() ); + std::sort( IP3Ds_1.begin(),IP3Ds_1.end(),std::greater() ); + std::sort( IP3Ds_2.begin(),IP3Ds_2.end(),std::greater() ); + int num_1 = IP3Ds_1.size(); + int num_2 = IP3Ds_2.size(); + + switch(contTrk){ + case 0: + + trackSip3dSig_0 = dummyTrack; + trackSip3dSig_1 = dummyTrack; + trackSip3dSig_2 = dummyTrack; + trackSip3dSig_3 = dummyTrack; + + break; + + case 1: + + trackSip3dSig_0 = IP3Ds.at(0); + trackSip3dSig_1 = dummyTrack; + trackSip3dSig_2 = dummyTrack; + trackSip3dSig_3 = dummyTrack; + + break; + + case 2: + + trackSip3dSig_0 = IP3Ds.at(0); + trackSip3dSig_1 = IP3Ds.at(1); + trackSip3dSig_2 = dummyTrack; + trackSip3dSig_3 = dummyTrack; + + break; + + case 3: + + trackSip3dSig_0 = IP3Ds.at(0); + trackSip3dSig_1 = IP3Ds.at(1); + trackSip3dSig_2 = IP3Ds.at(2); + trackSip3dSig_3 = dummyTrack; + + break; + + default: + + trackSip3dSig_0 = IP3Ds.at(0); + trackSip3dSig_1 = IP3Ds.at(1); + trackSip3dSig_2 = IP3Ds.at(2); + trackSip3dSig_3 = IP3Ds.at(3); + + } + + switch(num_1){ + case 0: + + tau1_trackSip3dSig_0 = dummyTrack; + tau1_trackSip3dSig_1 = dummyTrack; + + break; + + case 1: + + tau1_trackSip3dSig_0 = IP3Ds_1.at(0); + tau1_trackSip3dSig_1 = dummyTrack; + + break; + + case 2: + + tau1_trackSip3dSig_0 = IP3Ds_1.at(0); + tau1_trackSip3dSig_1 = IP3Ds_1.at(1); + + break; + + case 3: + + tau1_trackSip3dSig_0 = IP3Ds_1.at(0); + tau1_trackSip3dSig_1 = IP3Ds_1.at(1); + + break; + + default: + + tau1_trackSip3dSig_0 = IP3Ds_1.at(0); + tau1_trackSip3dSig_1 = IP3Ds_1.at(1); + + } + + switch(num_2){ + case 0: + + tau2_trackSip3dSig_0 = dummyTrack; + tau2_trackSip3dSig_1 = dummyTrack; + + break; + + case 1: + tau2_trackSip3dSig_0 = IP3Ds_2.at(0); + tau2_trackSip3dSig_1 = dummyTrack; + + break; + + case 2: + tau2_trackSip3dSig_0 = IP3Ds_2.at(0); + tau2_trackSip3dSig_1 = IP3Ds_2.at(1); + + break; + + case 3: + tau2_trackSip3dSig_0 = IP3Ds_2.at(0); + tau2_trackSip3dSig_1 = IP3Ds_2.at(1); + break; + + default: + + tau2_trackSip3dSig_0 = IP3Ds_2.at(0); + tau2_trackSip3dSig_1 = IP3Ds_2.at(1); + } math::XYZVector jetDir = jet->momentum().Unit(); + reco::TrackKinematics tau1Kinematics; + reco::TrackKinematics tau2Kinematics; + std::vector tau1_trackEtaRels, tau2_trackEtaRels; - std::map VTXmass; + std::map VTXmap; for (size_t vtx = 0; vtx < svTagInfo.nVertices(); ++vtx) { - vertexNTracks += (svTagInfo.secondaryVertex(vtx)).numberOfSourceCandidatePtrs(); - GlobalVector flightDir = svTagInfo.flightDirection(vtx); - if (reco::deltaR2(flightDir, jetDir)<(maxSVDeltaRToJet_*maxSVDeltaRToJet_)) + reco::TrackKinematics vertexKinematic; + + // get the vertex kinematics + const reco::VertexCompositePtrCandidate vertex = svTagInfo.secondaryVertex(vtx); + vertexKinematics(vertex, vertexKinematic); + + if (currentAxes.size() > 1) { - ++contSV; - VTXmass[svTagInfo.secondaryVertex(vtx).p4().mass()]=vtx; + if (reco::deltaR2(svTagInfo.flightDirection(vtx),currentAxes[1]) < reco::deltaR2(svTagInfo.flightDirection(vtx),currentAxes[0])) + { + tau2Kinematics = tau2Kinematics + vertexKinematic; + if( tau2_flightDistance2dSig < 0 ) + { + tau2_flightDistance2dSig = svTagInfo.flightDistance(vtx,true).significance(); + tau2_vertexDeltaR = reco::deltaR(svTagInfo.flightDirection(vtx),currentAxes[1]); + } + etaRelToTauAxis(vertex, currentAxes[1], tau2_trackEtaRels); + tau2_nSecondaryVertices += 1.; + } + else + { + tau1Kinematics = tau1Kinematics + vertexKinematic; + if( tau1_flightDistance2dSig < 0 ) + { + tau1_flightDistance2dSig =svTagInfo.flightDistance(vtx,true).significance(); + tau1_vertexDeltaR = reco::deltaR(svTagInfo.flightDirection(vtx),currentAxes[0]); + } + etaRelToTauAxis(vertex, currentAxes[0], tau1_trackEtaRels); + tau1_nSecondaryVertices += 1.; + } + + } + else if (currentAxes.size() > 0) + { + tau1Kinematics = tau1Kinematics + vertexKinematic; + if( tau1_flightDistance2dSig < 0 ) + { + tau1_flightDistance2dSig =svTagInfo.flightDistance(vtx,true).significance(); + tau1_vertexDeltaR = reco::deltaR(svTagInfo.flightDirection(vtx),currentAxes[0]); + } + etaRelToTauAxis(vertex, currentAxes[1], tau1_trackEtaRels); + tau1_nSecondaryVertices += 1.; } + + GlobalVector flightDir = svTagInfo.flightDirection(vtx); + if (reco::deltaR2(flightDir, jetDir)<(maxSVDeltaRToJet_*maxSVDeltaRToJet_)) + VTXmap[svTagInfo.flightDistance(vtx).error()]=vtx; + } + nSV = VTXmap.size(); + + + math::XYZTLorentzVector allSum = allKinematics.weightedVectorSum() ; + if ( tau1_nSecondaryVertices > 0. ) + { + math::XYZTLorentzVector tau1_vertexSum = tau1Kinematics.weightedVectorSum(); + tau1_vertexEnergyRatio = tau1_vertexSum.E() / allSum.E(); + if ( tau1_vertexEnergyRatio > 50. ) tau1_vertexEnergyRatio = 50.; + + tau1_vertexMass = tau1_vertexSum.M(); + } + + if ( tau2_nSecondaryVertices > 0. ) + { + math::XYZTLorentzVector tau2_vertexSum = tau2Kinematics.weightedVectorSum(); + tau2_vertexEnergyRatio = tau2_vertexSum.E() / allSum.E(); + if ( tau2_vertexEnergyRatio > 50. ) tau2_vertexEnergyRatio = 50.; + + tau2_vertexMass= tau2_vertexSum.M(); + } + + + float dummyEtaRel = -1.; + + std::sort( tau1_trackEtaRels.begin(),tau1_trackEtaRels.end() ); + std::sort( tau2_trackEtaRels.begin(),tau2_trackEtaRels.end() ); + + switch(tau2_trackEtaRels.size()){ + case 0: + + tau2_trackEtaRel_0 = dummyEtaRel; + tau2_trackEtaRel_1 = dummyEtaRel; + tau2_trackEtaRel_2 = dummyEtaRel; + + break; + + case 1: + + tau2_trackEtaRel_0 = tau2_trackEtaRels.at(0); + tau2_trackEtaRel_1 = dummyEtaRel; + tau2_trackEtaRel_2 = dummyEtaRel; + + break; + + case 2: + + tau2_trackEtaRel_0 = tau2_trackEtaRels.at(0); + tau2_trackEtaRel_1 = tau2_trackEtaRels.at(1); + tau2_trackEtaRel_2 = dummyEtaRel; + + break; + + default: + + tau2_trackEtaRel_0 = tau2_trackEtaRels.at(0); + tau2_trackEtaRel_1 = tau2_trackEtaRels.at(1); + tau2_trackEtaRel_2 = tau2_trackEtaRels.at(2); + + } + + switch(tau1_trackEtaRels.size()){ + case 0: + + tau1_trackEtaRel_0 = dummyEtaRel; + tau1_trackEtaRel_1 = dummyEtaRel; + tau1_trackEtaRel_2 = dummyEtaRel; + + break; + + case 1: + + tau1_trackEtaRel_0 = tau1_trackEtaRels.at(0); + tau1_trackEtaRel_1 = dummyEtaRel; + tau1_trackEtaRel_2 = dummyEtaRel; + + break; + + case 2: + + tau1_trackEtaRel_0 = tau1_trackEtaRels.at(0); + tau1_trackEtaRel_1 = tau1_trackEtaRels.at(1); + tau1_trackEtaRel_2 = dummyEtaRel; + + break; + + default: + + tau1_trackEtaRel_0 = tau1_trackEtaRels.at(0); + tau1_trackEtaRel_1 = tau1_trackEtaRels.at(1); + tau1_trackEtaRel_2 = tau1_trackEtaRels.at(2); + } int cont=0; GlobalVector flightDir_0, flightDir_1; reco::Candidate::LorentzVector SV_p4_0 , SV_p4_1; - for ( std::map::reverse_iterator iVtx=VTXmass.rbegin(); iVtx!=VTXmass.rend(); ++iVtx) + + for ( std::map::iterator iVtx=VTXmap.begin(); iVtx!=VTXmap.end(); ++iVtx) { ++cont; const reco::VertexCompositePtrCandidate &vertex = svTagInfo.secondaryVertex(iVtx->second); - reco::TrackKinematics vtxKinematics; - vertexKinematics(vertex, vtxKinematics); - math::XYZTLorentzVector allSum = allKinematics.weightedVectorSum(); - math::XYZTLorentzVector vertexSum = vtxKinematics.weightedVectorSum(); if (cont==1) { - SV_mass_0 = vertex.p4().mass() ; - SV_EnergyRatio_0 = vertexSum.E() / allSum.E(); - SV_pt_0 = vertex.p4().pt(); flightDir_0 = svTagInfo.flightDirection(iVtx->second); SV_p4_0 = vertex.p4(); - if (reco::deltaR2(flightDir_0,currentAxes[1])second); SV_p4_1 = vertex.p4(); - z_ratio = reco::deltaR(flightDir_0,flightDir_1)*SV_pt_0/(SV_p4_0+SV_p4_1).mass(); + + z_ratio = reco::deltaR(flightDir_0,flightDir_1)*SV_p4_1.pt()/(SV_p4_1+SV_p4_0).mass(); + break; } } - nSM = muonTagInfo.leptons(); - nSE = elecTagInfo.leptons(); - nSL = nSM + nSE; + // when only one tau axis has SVs assigned, they are all assigned to the 1st tau axis + // in the special case below need to swap values + if( (tau1_vertexMass<0 && tau2_vertexMass>0) ) + { + float temp = tau1_trackEtaRel_0; + tau1_trackEtaRel_0= tau2_trackEtaRel_0; + tau2_trackEtaRel_0= temp; - float PFLepton_ptrel = -1., PFLepton_IP2D = -1.; + temp = tau1_trackEtaRel_1; + tau1_trackEtaRel_1= tau2_trackEtaRel_1; + tau2_trackEtaRel_1= temp; - // PFMuon information - for (size_t leptIdx = 0; leptIdx < muonTagInfo.leptons() ; ++leptIdx) - { - float PFMuon_ptrel = (muonTagInfo.properties(leptIdx).ptRel); - if (PFMuon_ptrel > PFLepton_ptrel ) - { - PFLepton_ptrel = PFMuon_ptrel; - PFLepton_IP2D = (muonTagInfo.properties(leptIdx).sip2d); - } - } + temp = tau1_trackEtaRel_2; + tau1_trackEtaRel_2= tau2_trackEtaRel_2; + tau2_trackEtaRel_2= temp; - // PFElectron information - for (size_t leptIdx = 0; leptIdx < elecTagInfo.leptons() ; ++leptIdx) - { - float PFElectron_ptrel = (elecTagInfo.properties(leptIdx).ptRel); - if (PFElectron_ptrel > PFLepton_ptrel ) - { - PFLepton_ptrel = PFElectron_ptrel; - PFLepton_IP2D = (elecTagInfo.properties(leptIdx).sip2d); - } + temp = tau1_flightDistance2dSig; + tau1_flightDistance2dSig= tau2_flightDistance2dSig; + tau2_flightDistance2dSig= temp; + + temp = tau1_vertexDeltaR; + tau1_vertexDeltaR= tau2_vertexDeltaR; + tau2_vertexDeltaR= temp; + + temp = tau1_vertexEnergyRatio; + tau1_vertexEnergyRatio= tau2_vertexEnergyRatio; + tau2_vertexEnergyRatio= temp; + + temp = tau1_vertexMass; + tau1_vertexMass= tau2_vertexMass; + tau2_vertexMass= temp; } + std::map inputs; - inputs["z_ratio1"] = z_ratio; - inputs["tau_dot"] = tau_dot; - inputs["SV_mass_0"] = SV_mass_0; - inputs["SV_vtx_EnergyRatio_0"] = SV_EnergyRatio_0; - inputs["SV_vtx_EnergyRatio_1"] = SV_EnergyRatio_1; - inputs["jetNTracksEtaRel"] = vertexNTracks; - inputs["PFLepton_ptrel"] = PFLepton_ptrel; - inputs["PFLepton_IP2D"] = PFLepton_IP2D; - inputs["nSL"] = nSL; - inputs["tau2/tau1"] = tau21; - + inputs["z_ratio"] = z_ratio; + inputs["trackSipdSig_3"] = trackSip3dSig_3; + inputs["trackSipdSig_2"] = trackSip3dSig_2; + inputs["trackSipdSig_1"] = trackSip3dSig_1; + inputs["trackSipdSig_0"] = trackSip3dSig_0; + inputs["trackSipdSig_1_0"] = tau2_trackSip3dSig_0; + inputs["trackSipdSig_0_0"] = tau1_trackSip3dSig_0; + inputs["trackSipdSig_1_1"] = tau2_trackSip3dSig_1; + inputs["trackSipdSig_0_1"] = tau1_trackSip3dSig_1; + inputs["trackSip2dSigAboveCharm_0"] = trackSip2dSigAboveCharm_0; + inputs["trackSip2dSigAboveBottom_0"] = trackSip2dSigAboveBottom_0; + inputs["trackSip2dSigAboveBottom_1"] = trackSip2dSigAboveBottom_1; + inputs["tau1_trackEtaRel_0"] = tau2_trackEtaRel_0; + inputs["tau1_trackEtaRel_1"] = tau2_trackEtaRel_1; + inputs["tau1_trackEtaRel_2"] = tau2_trackEtaRel_2; + inputs["tau0_trackEtaRel_0"] = tau1_trackEtaRel_0; + inputs["tau0_trackEtaRel_1"] = tau1_trackEtaRel_1; + inputs["tau0_trackEtaRel_2"] = tau1_trackEtaRel_2; + inputs["tau_vertexMass_0"] = tau1_vertexMass; + inputs["tau_vertexEnergyRatio_0"] = tau1_vertexEnergyRatio; + inputs["tau_vertexDeltaR_0"] = tau1_vertexDeltaR; + inputs["tau_flightDistance2dSig_0"] = tau1_flightDistance2dSig; + inputs["tau_vertexMass_1"] = tau2_vertexMass; + inputs["tau_vertexEnergyRatio_1"] = tau2_vertexEnergyRatio; + inputs["tau_flightDistance2dSig_1"] = tau2_flightDistance2dSig; + inputs["jetNTracks"] = jetNTracks; + inputs["nSV"] = nSV; + // evaluate the MVA value = mvaID->evaluate(inputs); @@ -241,3 +661,14 @@ void CandidateBoostedDoubleSecondaryVertexComputer::vertexKinematics(const reco: vtxKinematics.add(mytrack, 1.0); } } + + +void CandidateBoostedDoubleSecondaryVertexComputer::etaRelToTauAxis(const reco::VertexCompositePtrCandidate & vertex, + fastjet::PseudoJet & tauAxis, std::vector & tau_trackEtaRel) const +{ + math::XYZVector direction(tauAxis.px(), tauAxis.py(), tauAxis.pz()); + const std::vector & tracks = vertex.daughterPtrVector(); + + for(std::vector::const_iterator track = tracks.begin(); track != tracks.end(); ++track) + tau_trackEtaRel.push_back(std::abs(reco::btau::etaRel(direction.Unit(), (*track)->momentum()))); +} diff --git a/RecoBTag/SoftLepton/python/softLepton_cff.py b/RecoBTag/SoftLepton/python/softLepton_cff.py index a680466ad343d..77859d666477f 100644 --- a/RecoBTag/SoftLepton/python/softLepton_cff.py +++ b/RecoBTag/SoftLepton/python/softLepton_cff.py @@ -4,11 +4,7 @@ from RecoBTau.JetTagComputer.jetTagRecord_cfi import * from RecoBTag.SoftLepton.softMuonTagInfos_cfi import * from RecoBTag.SoftLepton.softPFElectronTagInfos_cfi import * -from RecoBTag.SoftLepton.softPFElectronTagInfosAK8_cfi import * -from RecoBTag.SoftLepton.softPFElectronTagInfosCA15_cfi import * from RecoBTag.SoftLepton.softPFMuonTagInfos_cfi import * -from RecoBTag.SoftLepton.softPFMuonTagInfosAK8_cfi import * -from RecoBTag.SoftLepton.softPFMuonTagInfosCA15_cfi import * from RecoBTag.SoftLepton.SoftLeptonByMVA_cff import * from RecoBTag.SoftLepton.SoftLeptonByPt_cff import * from RecoBTag.SoftLepton.SoftLeptonByIP3d_cff import * diff --git a/RecoBTag/SoftLepton/python/softPFElectronTagInfosAK8_cfi.py b/RecoBTag/SoftLepton/python/softPFElectronTagInfosAK8_cfi.py deleted file mode 100644 index 6e79c59064a19..0000000000000 --- a/RecoBTag/SoftLepton/python/softPFElectronTagInfosAK8_cfi.py +++ /dev/null @@ -1,8 +0,0 @@ -import FWCore.ParameterSet.Config as cms - -from RecoBTag.SoftLepton.softPFElectronTagInfos_cfi import * - -softPFElectronsTagInfosAK8 = softPFElectronsTagInfos.clone( - jets = cms.InputTag("ak8PFJetsCHS"), - DeltaRElectronJet=cms.double(0.8) -) diff --git a/RecoBTag/SoftLepton/python/softPFElectronTagInfosCA15_cfi.py b/RecoBTag/SoftLepton/python/softPFElectronTagInfosCA15_cfi.py deleted file mode 100644 index 9ecd224acec31..0000000000000 --- a/RecoBTag/SoftLepton/python/softPFElectronTagInfosCA15_cfi.py +++ /dev/null @@ -1,8 +0,0 @@ -import FWCore.ParameterSet.Config as cms - -from RecoBTag.SoftLepton.softPFElectronTagInfos_cfi import * - -softPFElectronsTagInfosCA15 = softPFElectronsTagInfos.clone( - jets = cms.InputTag("ca15PFJetsCHS"), - DeltaRElectronJet=cms.double(1.5) -) diff --git a/RecoBTag/SoftLepton/python/softPFMuonTagInfosAK8_cfi.py b/RecoBTag/SoftLepton/python/softPFMuonTagInfosAK8_cfi.py deleted file mode 100644 index 2d8f7d156790a..0000000000000 --- a/RecoBTag/SoftLepton/python/softPFMuonTagInfosAK8_cfi.py +++ /dev/null @@ -1,7 +0,0 @@ -import FWCore.ParameterSet.Config as cms - -from RecoBTag.SoftLepton.softPFMuonTagInfos_cfi import * - -softPFMuonsTagInfosAK8 = softPFMuonsTagInfos.clone( - jets = cms.InputTag("ak8PFJetsCHS") -) diff --git a/RecoBTag/SoftLepton/python/softPFMuonTagInfosCA15_cfi.py b/RecoBTag/SoftLepton/python/softPFMuonTagInfosCA15_cfi.py deleted file mode 100644 index 82c434f8ba2b2..0000000000000 --- a/RecoBTag/SoftLepton/python/softPFMuonTagInfosCA15_cfi.py +++ /dev/null @@ -1,7 +0,0 @@ -import FWCore.ParameterSet.Config as cms - -from RecoBTag.SoftLepton.softPFMuonTagInfos_cfi import * - -softPFMuonsTagInfosCA15 = softPFMuonsTagInfos.clone( - jets = cms.InputTag("ca15PFJetsCHS") -) diff --git a/RecoBTau/JetTagComputer/BuildFile.xml b/RecoBTau/JetTagComputer/BuildFile.xml index ec376d66938d2..ebb3b963bfa51 100644 --- a/RecoBTau/JetTagComputer/BuildFile.xml +++ b/RecoBTau/JetTagComputer/BuildFile.xml @@ -8,6 +8,7 @@ + diff --git a/RecoBTau/JetTagComputer/interface/JetTagComputerRecord.h b/RecoBTau/JetTagComputer/interface/JetTagComputerRecord.h index 9472ceba48444..eeb2e029f50f9 100644 --- a/RecoBTau/JetTagComputer/interface/JetTagComputerRecord.h +++ b/RecoBTau/JetTagComputer/interface/JetTagComputerRecord.h @@ -6,10 +6,11 @@ class BTauGenericMVAJetTagComputerRcd; class GBRWrapperRcd; +class TransientTrackRecord; class JetTagComputerRecord : public edm::eventsetup::DependentRecordImplementation< JetTagComputerRecord, - boost::mpl::vector > {}; + boost::mpl::vector > {}; #endif