39         , m_calibArea(
"CalibArea-08")
 
   58             return StatusCode::FAILURE;
 
   65             return StatusCode::FAILURE;
 
   70             return StatusCode::FAILURE;
 
   75             return StatusCode::FAILURE;
 
   87         if (settings.ReadFile( configFilePath.Data(),kEnvGlobal)){
 
   88             ATH_MSG_ERROR(
"Cannot read config file: " << configFilePath.Data());
 
   89             return StatusCode::FAILURE;
 
   92         ATH_MSG_INFO(
"================================================");
 
   97         m_release = settings.GetValue(
"UncertaintyRelease",
"UNKNOWN");
 
  103             ATH_MSG_ERROR(
"Cannot find the truth jet collection to use in config");
 
  104             return StatusCode::FAILURE;
 
  111             ATH_MSG_ERROR(
"Cannot find the TruthLabelAccessor to use in config");
 
  112             return StatusCode::FAILURE;
 
  119             ATH_MSG_ERROR(
"Cannot find the SupportedMCTypes to use in config");
 
  120             return StatusCode::FAILURE;
 
  127             ATH_MSG_ERROR(
"You are not running with a supported MC type");
 
  128             return StatusCode::FAILURE;
 
  134             ATH_MSG_ERROR(
"Cannot find the EtaRange parameter in the config file");
 
  135             return StatusCode::FAILURE;
 
  140         m_MaxMass = settings.GetValue(
"MaxMass",0);
 
  142             ATH_MSG_ERROR(
"Cannot find the MaxMass parameter in the config file");
 
  143             return StatusCode::FAILURE;
 
  148         m_MaxPt = settings.GetValue(
"MaxPt",0);
 
  150             ATH_MSG_ERROR(
"Cannot find the MaxPt parameter in the config file");
 
  151             return StatusCode::FAILURE;
 
  159             ATH_MSG_ERROR(
"Cannot find uncertainty histogram file in the config file");
 
  160             return StatusCode::FAILURE;
 
  171         if (
registry.registerSystematics(*
this) != StatusCode::SUCCESS){
 
  173             return StatusCode::FAILURE;
 
  180         return StatusCode::SUCCESS;
 
  192         return sys.find(systematic) != 
sys.end();
 
  212                 if ((*ci).basename().find(
"CALO_")!=std::string::npos){
 
  213                     filteredSysts.
insert(*ci);
 
  216             return filteredSysts;    
 
  222                 if ((*ci).basename().find(
"TA_") !=std::string::npos){
 
  223                     filteredSysts.
insert(*ci);
 
  226             return filteredSysts;    
 
  232                 if ((*ci).basename().find(
"COMB_")!=std::string::npos){
 
  233                     filteredSysts.
insert(*ci);
 
  236             return filteredSysts;    
 
  242                 if ((*ci).basename().find(
"JET_JMRUnc_")!=std::string::npos){
 
  243                     filteredSysts.
insert(*ci);
 
  246             return filteredSysts;    
 
  268                 filterForAffectingSystematics(
systematics, affectingSysts, filteredSysts) != StatusCode::SUCCESS ){
 
  270                 return StatusCode::FAILURE;
 
  277             if (filteredSysts.
size() > 1){
 
  278                 ATH_MSG_ERROR(
"No support for more than one JMS/JMR sys at a time: " << filteredSysts.
name());
 
  279                 return StatusCode::FAILURE;
 
  281             if (filteredSysts.
size() == 0) {
 
  283               return StatusCode::SUCCESS;
 
  300         return StatusCode::SUCCESS;
 
  310         if (!data_file || data_file->IsZombie()){
 
  312             return StatusCode::FAILURE;
 
  320             TString CaloResponseMap_path = settings.GetValue(
"CaloResponseMap",
"");
 
  322             if (CaloResponseMap_path.IsNull()){
 
  323                 ATH_MSG_ERROR(
"Cannot find the CaloResponseMap in the config file");
 
  324                 return StatusCode::FAILURE;
 
  327             m_CALO_ResponseMap  = std::unique_ptr<TH2>(
static_cast<TH2*
>(data_file->Get( CaloResponseMap_path )));
 
  334             TString TAResponseMap_path = settings.GetValue(
"TAResponseMap",
"");
 
  336             if (TAResponseMap_path.IsNull()){
 
  337                 ATH_MSG_ERROR(
"Cannot find the TAResponseMap in the config file");
 
  338                 return StatusCode::FAILURE;
 
  341             m_TA_ResponseMap  = std::unique_ptr<TH2>(
static_cast<TH2*
>(data_file->Get( TAResponseMap_path )));
 
  348             TString UFOResponseMap_path = settings.GetValue(
"UFOResponseMap",
"");
 
  350             if (UFOResponseMap_path.IsNull()){
 
  351                 ATH_MSG_ERROR(
"Cannot find the UFOResponseMap in the config file");
 
  352                 return StatusCode::FAILURE;
 
  355             m_UFO_ResponseMap  = std::unique_ptr<TH2>(
dynamic_cast<TH2*
>(data_file->Get( UFOResponseMap_path )));
 
  362         for (
size_t iComp = 0; iComp < 999; ++iComp){
 
  364             const TString 
prefix = Form(
"JMSComponent.%zu.",iComp);
 
  365             std::string Syst_Name = settings.GetValue(
prefix+
"Name",
"");
 
  367             if (!Syst_Name.empty()){
 
  393         for (
size_t iComp = 0; iComp < 999; ++iComp){
 
  395             const TString 
prefix = Form(
"JMRComponent.%zu.",iComp);
 
  396             std::string Syst_Name = settings.GetValue(
prefix+
"Name",
"");
 
  398             std::string to_find = 
"MCTYPE";
 
  402             if (!Syst_Name.empty()){
 
  445             TString Calo_TA_weight_file_name = settings.GetValue(
"JetUncertainties_UncertaintyRootFile",
"");
 
  448             if (Calo_TA_weight_file_path.IsNull()){
 
  449                 ATH_MSG_ERROR(
"Cannot find the file with the Calo and TA weights");
 
  450                 return StatusCode::FAILURE;
 
  453             TString Calo_weight_hist_name = settings.GetValue(
"CombMassWeightCaloHist",
"");
 
  454             if (Calo_weight_hist_name.IsNull()){
 
  455                 ATH_MSG_ERROR(
"Cannot find the histogram name that contains the Calo weights in the config file");
 
  456                 return StatusCode::FAILURE;
 
  459             TString TA_weight_hist_name = settings.GetValue(
"CombMassWeightTAHist",
"");
 
  460             if (TA_weight_hist_name.IsNull()){
 
  461                 ATH_MSG_ERROR(
"Cannot find the histogram name that contains the TA weights in the config file");
 
  462                 return StatusCode::FAILURE;
 
  465             ATH_MSG_INFO(Form(
"  Calo weights hist: \"%s\"",Calo_weight_hist_name.Data()));
 
  466             ATH_MSG_INFO(Form(
"  TA weights hist: \"%s\"",TA_weight_hist_name.Data()));
 
  467             ATH_MSG_INFO(Form(
"    Location: %s",Calo_TA_weight_file_path.Data()));
 
  470             std::unique_ptr<TFile> Calo_TA_weight_file ( TFile::Open(Calo_TA_weight_file_path));
 
  471             if (!Calo_TA_weight_file || Calo_TA_weight_file->IsZombie()){
 
  472                 ATH_MSG_FATAL( 
"Could not open the first input file: " << Calo_TA_weight_file_path );
 
  473                 return StatusCode::FAILURE;
 
  476             m_caloMassWeight = std::unique_ptr<TH3F>(
static_cast<TH3F*
>(Calo_TA_weight_file->Get(Calo_weight_hist_name)));
 
  477             m_TAMassWeight = std::unique_ptr<TH3F>(
static_cast<TH3F*
>(Calo_TA_weight_file->Get(TA_weight_hist_name)));
 
  483             Calo_TA_weight_file->Close();
 
  487         return StatusCode::SUCCESS;
 
  502         double dRmax_truthJet = 0.75;
 
  507         for (
const auto *
const jet_truth : *jets_truth){
 
  508             float dR_Test = jet_reco.
p4().DeltaR(jet_truth->p4());
 
  509             if (dR_Test < dRmax_truthJet){
 
  510                 if (dR_Test < dRmin){
 
  511                     close_jet = jet_truth;
 
  516         if (dRmin > 999){ 
return StatusCode::FAILURE;}
 
  519         return StatusCode::SUCCESS;
 
  531             ATH_MSG_ERROR(
"Unable to retrieve the FatjetTruthLabel from the jet.  Please call the BoostedJetTaggers decorateTruthLabel() function before calling this function.");
 
  532             return StatusCode::FAILURE;
 
  546             jetTopology=
"no_match";
 
  547             ATH_MSG_DEBUG(
"No truth jet match with this reco jet. The jet will not be smeared.");
 
  552         ATH_MSG_VERBOSE(
"The topology of this jet correspond to a " << jetTopology << 
" large-R jet");
 
  554         return StatusCode::SUCCESS;
 
  581             return StatusCode::SUCCESS;
 
  584         if (topologyAffected != 
"All" && !TString(topologyAffected).Contains(jetTopology)){
 
  585             ATH_MSG_VERBOSE(
"The systematic does not affect to this jet topology");
 
  586             return StatusCode::SUCCESS;
 
  596             const TH2* 
hist = 
nullptr; 
 
  602                 if (MassDef_of_syst == calo){
 
  604                 }
else if (MassDef_of_syst == ta){
 
  614             const TH2* 
hist = 
nullptr;
 
  615             const TH3F* hist3d = 
nullptr;
 
  619                 if (uncertparam == 
"eLOGmOeAbsEta"){
 
  625                 if (MassDef_of_syst == calo){
 
  626                     if (uncertparam == 
"eLOGmOeAbsEta"){
 
  631                 }
else if (MassDef_of_syst == ta){
 
  632                     if (uncertparam == 
"eLOGmOeAbsEta"){
 
  640             if (uncertparam == 
"eLOGmOeAbsEta"){
 
  653         return StatusCode::SUCCESS;
 
  663         ATH_MSG_VERBOSE(
"//---------------------------------------------------------------//");
 
  664         ATH_MSG_VERBOSE(
"Reco Jet to Smear: pt = " << jet_reco.
pt() << 
", mass = " << jet_reco.
m() << 
", eta = " << jet_reco.
eta());
 
  675             ATH_MSG_DEBUG(
"This jet exceeds the maximum pt that the tool allows jet_pt <" << 
m_MaxPt << 
" MeV)");
 
  678         if (jet_reco.
m() <= 0){
 
  688             ATH_MSG_VERBOSE(
"No truth jet match with this reco jet. The jet will not be smeared.");
 
  692         ATH_MSG_VERBOSE(
"Matched truth Jet: pt = " << jet_truth_matched.
pt() << 
", mass = " << jet_truth_matched.
m() << 
", eta = " << jet_truth_matched.
eta());
 
  695         std::string jetTopology;
 
  701         if (jetTopology == 
"no_match"){
 
  707         double jet_mass_UFO = 0;
 
  708         double jet_mass_CALO = 0;
 
  709         double jet_mass_TA = 0;
 
  710         double calo_mass_weight=1; 
 
  712         float JetTrackAssistedMassCalibrated_from_JetCalibTools;
 
  728             jet_mass_CALO = jet_reco_CALO.mass();
 
  729             jet_mass_TA = jet_reco_TA.mass();
 
  730             jet_reco.
getAttribute<
float>(
"JetTrackAssistedMassCalibrated", JetTrackAssistedMassCalibrated_from_JetCalibTools);
 
  733             jet_mass_CALO = jet_reco.
m();
 
  734             calo_mass_weight = 1;
 
  736             jet_mass_TA = jet_reco.
m();
 
  737             jet_reco.
getAttribute<
float>(
"JetTrackAssistedMassCalibrated", JetTrackAssistedMassCalibrated_from_JetCalibTools);
 
  738             calo_mass_weight = 0;
 
  740             jet_mass_UFO = jet_reco.
m();
 
  741             calo_mass_weight = 1;
 
  746         double avg_response_UFO=1;
 
  747         double avg_response_CALO=1;
 
  748         double avg_response_TA=1;
 
  752             if (avg_response_CALO == 0) avg_response_CALO=1; 
 
  757             if (avg_response_TA == 0) avg_response_TA = 1; 
 
  762             if (avg_response_UFO == 0) avg_response_UFO = 1; 
 
  767         double JMS(1), JMS_err(0), JMR(1), JMR_err(0);
 
  771         double smeared_UFO_mass = jet_mass_UFO;
 
  772         double smeared_CALO_mass = jet_mass_CALO;
 
  773         double smeared_TA_mass = jet_mass_TA;
 
  775         bool is_UFO_mass_smeared = 
false;
 
  776         bool is_CALO_mass_smeared = 
false;
 
  777         bool is_TA_mass_smeared = 
false;
 
  785             scale = JMS + JMS_err;
 
  788             if (TMath::Abs(
scale-1) > 0.0001 || TMath::Abs(
resolution-1)  > 0.0001){
 
  789                 is_CALO_mass_smeared = 
true;
 
  791                 ATH_MSG_VERBOSE(
"Forward Folding CALO procedure will use scale=" << 
scale << 
", resolution=" << 
resolution << 
" and average respose=" << avg_response_CALO);
 
  794                 smeared_CALO_mass = jet_mass_CALO * 
scale + (jet_mass_CALO - avg_response_CALO*jet_truth_matched.
m())*(
resolution-
scale); 
 
  805             scale = JMS + JMS_err;
 
  808             if (TMath::Abs(
scale-1) > 0.0001 || TMath::Abs(
resolution-1)  > 0.0001){
 
  810                 is_TA_mass_smeared = 
true;
 
  812                 ATH_MSG_VERBOSE(
"Forward Folding TA procedure will use scale=" << 
scale << 
", resolution=" << 
resolution << 
" and average respose=" << avg_response_TA);
 
  815                 smeared_TA_mass = jet_mass_TA * 
scale + (jet_mass_TA - avg_response_TA*jet_truth_matched.
m())*(
resolution-
scale); 
 
  826             scale = JMS + JMS_err;
 
  829             if (TMath::Abs(
scale-1) > 0.0001 || TMath::Abs(
resolution-1)  > 0.0001){
 
  830                 is_UFO_mass_smeared = 
true;
 
  832                 ATH_MSG_VERBOSE(
"Forward Folding UFO procedure will use scale=" << 
scale << 
", resolution=" << 
resolution << 
" and average respose=" << avg_response_UFO);
 
  835                 smeared_UFO_mass = jet_mass_UFO * 
scale + (jet_mass_UFO - avg_response_UFO*jet_truth_matched.
m())*(
resolution-
scale); 
 
  841         if (!is_CALO_mass_smeared && !is_TA_mass_smeared && !is_UFO_mass_smeared){
 
  842             ATH_MSG_VERBOSE(
"This jet is not affected by the systematic. The jet won't be modified");
 
  843             ATH_MSG_VERBOSE(
"//---------------------------------------------------------------//");
 
  866             jet_reco_CALO = 
xAOD::JetFourMom_t(jet_reco_CALO.pt(),jet_reco_CALO.eta(),jet_reco_CALO.phi(),smeared_CALO_mass);
 
  868             jet_reco_TA = 
xAOD::JetFourMom_t(jet_reco_TA.pt(),jet_reco_TA.eta(),jet_reco_TA.phi(),smeared_TA_mass);
 
  886                 caloFactor = 0; TAFactor = 1;
 
  887             }
else if (TARes == 0){ 
 
  888                 caloFactor = 1; TAFactor = 0;
 
  890                 caloFactor = 1./(caloRes*caloRes);
 
  891                 TAFactor   = 1./(TARes*TARes);
 
  894             calo_mass_weight = caloFactor /(caloFactor + TAFactor);
 
  898         }
else if (JetTrackAssistedMassCalibrated_from_JetCalibTools == 0){
 
  899             calo_mass_weight = 1;
 
  900         }
else if (jet_mass_CALO == 0){
 
  901             calo_mass_weight = 0;
 
  905         double smeared_mass = 0;
 
  907             smeared_mass = smeared_UFO_mass;
 
  910             smeared_mass = calo_mass_weight*smeared_CALO_mass + (1 - calo_mass_weight)*smeared_TA_mass;
 
  920         ATH_MSG_VERBOSE(
"Smeared Reco Jet: pt = " << jet_reco.
pt() << 
", mass = " << jet_reco.
m() << 
", eta = " << jet_reco.
eta()); 
 
  922         ATH_MSG_VERBOSE(
"//---------------------------------------------------------------//");
 
  947         for (
size_t iJet = 0; iJet < 
inputs.size(); ++iJet)
 
  962             ATH_MSG_ERROR(
"Histogram pointer is null in FFJetSmearingTool::Read3DHistogram");
 
  973         double xMax = 
histo->GetXaxis()->GetBinLowEdge(
histo->GetNbinsX()+1);
 
  974         double xMin = 
histo->GetXaxis()->GetBinLowEdge(1);
 
  975         double yMax = 
histo->GetYaxis()->GetBinLowEdge(
histo->GetNbinsY()+1);
 
  976         double yMin = 
histo->GetYaxis()->GetBinLowEdge(1);
 
  977         double zMax = 
histo->GetZaxis()->GetBinLowEdge(
histo->GetNbinsZ()+1);
 
  978         double zMin = 
histo->GetZaxis()->GetBinLowEdge(1);
 
  980         if (
x >= xMax) aux_x = xMax-1
e-6 ; 
 
  981         if (
x <= xMin) aux_x = xMin+1
e-6 ; 
 
  982         if (std::isnan(
y)) 
return 0; 
 
  983         if (
y >= yMax) aux_y = yMax-1
e-6 ; 
 
  984         if (
y <= yMin) aux_y = yMin+1
e-6 ; 
 
  985         if (
z >= zMax) aux_z = zMax-1
e-6 ; 
 
  986         if (
z <= zMin) aux_z = zMin+1
e-6 ; 
 
  998             ATH_MSG_ERROR(
"Histogram pointer is null in FFJetSmearingTool::Interpolate2D");
 
 1001         Int_t bin_x = 
histo->GetXaxis()->FindFixBin(
x);
 
 1002         Int_t bin_y = 
histo->GetYaxis()->FindFixBin(
y);
 
 1003         if (bin_x<1 || bin_x>
histo->GetNbinsX() || bin_y<1 || bin_y>
histo->GetNbinsY()){
 
 1009         return interpolated_value;
 
 1016         while ((
pos = 
str.find(to_find, 
pos)) != std::string::npos){
 
 1017             str.replace(
pos, to_find.length(), to_replace);
 
 1018             pos += to_replace.length();