diff --git a/PhysicsAnalysis/TopPhys/xAOD/TopSystematicObjectMaker/CMakeLists.txt b/PhysicsAnalysis/TopPhys/xAOD/TopSystematicObjectMaker/CMakeLists.txt index bc8164ef7478d11c13c01e04046c0341b1e6c7b4..0d0f87c3ab1acdc134469c795756013b484b45f1 100644 --- a/PhysicsAnalysis/TopPhys/xAOD/TopSystematicObjectMaker/CMakeLists.txt +++ b/PhysicsAnalysis/TopPhys/xAOD/TopSystematicObjectMaker/CMakeLists.txt @@ -9,7 +9,7 @@ atlas_add_library( TopSystematicObjectMaker PUBLIC_HEADERS TopSystematicObjectMaker LINK_LIBRARIES AsgTools PATInterfaces EgammaAnalysisInterfacesLib FTagAnalysisInterfacesLib JetAnalysisInterfacesLib MuonAnalysisInterfacesLib - IsolationSelectionLib IsolationCorrectionsLib JetCalibToolsLib + IsolationSelectionLib IsolationCorrectionsLib JetCalibToolsLib ParticleJetToolsLib JetCPInterfaces JetInterface METInterface xAODEgamma xAODJet xAODTracking TopJetSubstructure MuonMomentumCorrectionsLib TauAnalysisToolsLib PRIVATE_LINK_LIBRARIES AthContainers xAODBTagging xAODBase xAODCore xAODEventInfo diff --git a/PhysicsAnalysis/TopPhys/xAOD/TopSystematicObjectMaker/Root/JetObjectCollectionMaker.cxx b/PhysicsAnalysis/TopPhys/xAOD/TopSystematicObjectMaker/Root/JetObjectCollectionMaker.cxx index bc2380ea454d25a95a24ffdc09ede30047542639..c2463554f53d6db2c4ceb2d5cefffe96a627ced7 100644 --- a/PhysicsAnalysis/TopPhys/xAOD/TopSystematicObjectMaker/Root/JetObjectCollectionMaker.cxx +++ b/PhysicsAnalysis/TopPhys/xAOD/TopSystematicObjectMaker/Root/JetObjectCollectionMaker.cxx @@ -381,88 +381,86 @@ namespace top { ///-- Shallow copy of the xAOD --/// std::pair< xAOD::JetContainer*, xAOD::ShallowAuxContainer* > shallow_xaod_copy = xAOD::shallowCopyContainer(*xaod); + ///-- Apply calibration --/// + ///-- Calibrate jet container --/// + top::check(m_jetCalibrationTool->applyCalibration(*(shallow_xaod_copy.first)), "Failed to applyCalibration"); + ///-- Loop over the xAOD Container --/// -// for (const auto jet : *(shallow_xaod_copy.first)) { -// if (!isLargeR) { ///-- small-R jets used in most analyses --/// -// ///-- Calibrate jet --/// -// -// top::check(m_jetCalibrationTool->applyCalibration(*jet), "Failed to applyCalibration"); -// -// // only multiply by JSF and bJSF if one of them != 1.0 (used by top mass analysis) -// float JSF = m_config->JSF(); -// float bJSF = m_config->bJSF(); -// -// if (JSF != 1.0 || bJSF != 1.0) { -// int truthflav = -1; -// if (jet->isAvailable<int>("PartonTruthLabelID")) { -// jet->getAttribute("PartonTruthLabelID", truthflav); -// } -// -// xAOD::JetFourMom_t jet_p4 = jet->jetP4() * JSF; -// if (truthflav == 5) jet_p4 = jet_p4 * bJSF; -// -// jet->setJetP4(jet_p4); -// } -// // end application JSF/bJSF -// -// -// top::check(decorateBJets(*jet), "Failed to decorate if b-jet"); -// } -// -// if (isLargeR && m_jetSubstructure.get() != nullptr) { -// m_jetSubstructure->correctJet(*jet); -// } -// -// if (isLargeR) { -// ///-- Calibrate jet --/// -// -// float tau3 = jet->getAttribute<float>("Tau3_wta"); -// float tau2 = jet->getAttribute<float>("Tau2_wta"); -// float tau1 = jet->getAttribute<float>("Tau1_wta"); -// float ECF1 = jet->getAttribute<float>("ECF1"); -// float ECF2 = jet->getAttribute<float>("ECF2"); -// float ECF3 = jet->getAttribute<float>("ECF3"); -// -// jet->auxdecor<float>("Tau32_wta") = fabs(tau2) > 1.e-6 ? (tau3 / tau2) : -999; // 999 to match -// // JetSubStructureMomentTools/NSubjettinessRatiosTool -// jet->auxdecor<float>("Tau21_wta") = fabs(tau1) > 1.e-6 ? (tau2 / tau1) : -999; // 999 to match -// // JetSubStructureMomentTools/NSubjettinessRatiosTool -// // Same definition as in JetSubStructureMomentTools/Root/EnergyCorrelatorRatiosTool.cxx -// jet->auxdecor<float>("D2") = (ECF2 > 1e-8) ? (ECF3*ECF1*ECF1*ECF1) / (ECF2*ECF2*ECF2) : -999; -// jet->auxdecor<float>("C2") = (ECF2 > 1e-8) ? (ECF3*ECF1) / (ECF2*ECF2) : -999; -// jet->auxdecor<float>("E3") = (ECF1 > 1e-8) ? ECF3 / (ECF1*ECF1*ECF1) : -999; -// -// -// top::check(m_jetCalibrationToolLargeR->applyCalibration(*jet), "Failed to applyCalibration"); -// -// ///-- for TA mass or calo mass, the calibrated mass or pt needs special treatment --/// -// const std::string calibChoice = m_config->largeRJESJMSConfig(); -// if (m_config->isMC()) { -// ///-- Truth labeling required by the large-R jet uncertainties --/// -//// top::check(m_jetTruthLabelingTool->modifyJet(*jet), "Failed to do truth labeling for large-R jet"); -// if (calibChoice == "TAMass") { -// xAOD::JetFourMom_t jet_calib_p4; -// jet->getAttribute<xAOD::JetFourMom_t>("JetJMSScaleMomentumTA", jet_calib_p4); -// jet->setJetP4(jet_calib_p4); -// } -// } else { //For data, there's only one config file so special method is required for TA mass and Calos mass -// if (calibChoice == "CaloMass") { -// xAOD::JetFourMom_t jetInsituP4_calo; -// jet->getAttribute<xAOD::JetFourMom_t>("JetInsituScaleMomentumCalo", jetInsituP4_calo); -// jet->setJetP4(jetInsituP4_calo); -// } else if (calibChoice == "TAMass") { -// xAOD::JetFourMom_t jetInsituP4_ta; -// jet->getAttribute<xAOD::JetFourMom_t>("JetInsituScaleMomentumTA", jetInsituP4_ta); -// jet->setJetP4(jetInsituP4_ta); -// } -// } -// } -// -// ///-- Update JVT --/// -// if (!isLargeR) { -// jet->auxdecor<float>("AnalysisTop_JVT") = m_jetUpdateJvtTool->updateJvt(*jet); -// } -// } + for (const auto jet : *(shallow_xaod_copy.first)) { + if (!isLargeR) { ///-- small-R jets used in most analyses --/// + // only multiply by JSF and bJSF if one of them != 1.0 (used by top mass analysis) + float JSF = m_config->JSF(); + float bJSF = m_config->bJSF(); + + if (JSF != 1.0 || bJSF != 1.0) { + int truthflav = -1; + if (jet->isAvailable<int>("PartonTruthLabelID")) { + jet->getAttribute("PartonTruthLabelID", truthflav); + } + + xAOD::JetFourMom_t jet_p4 = jet->jetP4() * JSF; + if (truthflav == 5) jet_p4 = jet_p4 * bJSF; + + jet->setJetP4(jet_p4); + } + // end application JSF/bJSF + + + top::check(decorateBJets(*jet), "Failed to decorate if b-jet"); + } + + if (isLargeR && m_jetSubstructure.get() != nullptr) { + m_jetSubstructure->correctJet(*jet); + } + + if (isLargeR) { + ///-- Calibrate jet --/// + + float tau3 = jet->getAttribute<float>("Tau3_wta"); + float tau2 = jet->getAttribute<float>("Tau2_wta"); + float tau1 = jet->getAttribute<float>("Tau1_wta"); + float ECF1 = jet->getAttribute<float>("ECF1"); + float ECF2 = jet->getAttribute<float>("ECF2"); + float ECF3 = jet->getAttribute<float>("ECF3"); + + jet->auxdecor<float>("Tau32_wta") = fabs(tau2) > 1.e-6 ? (tau3 / tau2) : -999; // 999 to match + // JetSubStructureMomentTools/NSubjettinessRatiosTool + jet->auxdecor<float>("Tau21_wta") = fabs(tau1) > 1.e-6 ? (tau2 / tau1) : -999; // 999 to match + // JetSubStructureMomentTools/NSubjettinessRatiosTool + // Same definition as in JetSubStructureMomentTools/Root/EnergyCorrelatorRatiosTool.cxx + jet->auxdecor<float>("D2") = (ECF2 > 1e-8) ? (ECF3*ECF1*ECF1*ECF1) / (ECF2*ECF2*ECF2) : -999; + jet->auxdecor<float>("C2") = (ECF2 > 1e-8) ? (ECF3*ECF1) / (ECF2*ECF2) : -999; + jet->auxdecor<float>("E3") = (ECF1 > 1e-8) ? ECF3 / (ECF1*ECF1*ECF1) : -999; + + + ///-- for TA mass or calo mass, the calibrated mass or pt needs special treatment --/// + const std::string calibChoice = m_config->largeRJESJMSConfig(); + if (m_config->isMC()) { + ///-- Truth labeling required by the large-R jet uncertainties --/// + top::check(m_jetTruthLabelingTool->modifyJet(*jet), "Failed to do truth labeling for large-R jet"); + if (calibChoice == "TAMass") { + xAOD::JetFourMom_t jet_calib_p4; + jet->getAttribute<xAOD::JetFourMom_t>("JetJMSScaleMomentumTA", jet_calib_p4); + jet->setJetP4(jet_calib_p4); + } + } else { //For data, there's only one config file so special method is required for TA mass and Calos mass + if (calibChoice == "CaloMass") { + xAOD::JetFourMom_t jetInsituP4_calo; + jet->getAttribute<xAOD::JetFourMom_t>("JetInsituScaleMomentumCalo", jetInsituP4_calo); + jet->setJetP4(jetInsituP4_calo); + } else if (calibChoice == "TAMass") { + xAOD::JetFourMom_t jetInsituP4_ta; + jet->getAttribute<xAOD::JetFourMom_t>("JetInsituScaleMomentumTA", jetInsituP4_ta); + jet->setJetP4(jetInsituP4_ta); + } + } + } + + ///-- Update JVT --/// + if (!isLargeR) { + jet->auxdecor<float>("AnalysisTop_JVT") = m_jetUpdateJvtTool->updateJvt(*jet); + } + } // Check if the derivation we are running on contains // MET_Track (once), if so apply the fJVT decoration diff --git a/PhysicsAnalysis/TopPhys/xAOD/TopSystematicObjectMaker/TopSystematicObjectMaker/JetObjectCollectionMaker.h b/PhysicsAnalysis/TopPhys/xAOD/TopSystematicObjectMaker/TopSystematicObjectMaker/JetObjectCollectionMaker.h index 55ce24c27f7a5db2a57955ec5b901696c6301b14..686540e520bb1c00ce8a4525f51e326b1db38fb2 100644 --- a/PhysicsAnalysis/TopPhys/xAOD/TopSystematicObjectMaker/TopSystematicObjectMaker/JetObjectCollectionMaker.h +++ b/PhysicsAnalysis/TopPhys/xAOD/TopSystematicObjectMaker/TopSystematicObjectMaker/JetObjectCollectionMaker.h @@ -48,7 +48,7 @@ #include "FTagAnalysisInterfaces/IBTaggingSelectionTool.h" #include "JetAnalysisInterfaces/IJetSelectorTool.h" -//#include "ParticleJetTools/JetTruthLabelingTool.h" +#include "ParticleJetTools/JetTruthLabelingTool.h" // Forward declaration(s): namespace top { @@ -161,7 +161,7 @@ namespace top { StatusCode tagNominalLargeRJets(); ///-- Large R jet truth labeling --/// -// std::unique_ptr<JetTruthLabelingTool> m_jetTruthLabelingTool; + std::unique_ptr<JetTruthLabelingTool> m_jetTruthLabelingTool; // DL1 decoration std::unordered_map<std::string, ToolHandle<IBTaggingSelectionTool> > m_btagSelToolsDL1Decor;