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;
296 return StatusCode::SUCCESS;
306 if (!data_file || data_file->IsZombie()){
308 return StatusCode::FAILURE;
316 TString CaloResponseMap_path = settings.GetValue(
"CaloResponseMap",
"");
318 if (CaloResponseMap_path.IsNull()){
319 ATH_MSG_ERROR(
"Cannot find the CaloResponseMap in the config file");
320 return StatusCode::FAILURE;
323 m_CALO_ResponseMap = std::unique_ptr<TH2>(
dynamic_cast<TH2*
>(data_file->Get( CaloResponseMap_path )));
330 TString TAResponseMap_path = settings.GetValue(
"TAResponseMap",
"");
332 if (TAResponseMap_path.IsNull()){
333 ATH_MSG_ERROR(
"Cannot find the TAResponseMap in the config file");
334 return StatusCode::FAILURE;
337 m_TA_ResponseMap = std::unique_ptr<TH2>(
dynamic_cast<TH2*
>(data_file->Get( TAResponseMap_path )));
344 TString UFOResponseMap_path = settings.GetValue(
"UFOResponseMap",
"");
346 if (UFOResponseMap_path.IsNull()){
347 ATH_MSG_ERROR(
"Cannot find the UFOResponseMap in the config file");
348 return StatusCode::FAILURE;
351 m_UFO_ResponseMap = std::unique_ptr<TH2>(
dynamic_cast<TH2*
>(data_file->Get( UFOResponseMap_path )));
358 for (
size_t iComp = 0; iComp < 999; ++iComp){
360 const TString
prefix = Form(
"JMSComponent.%zu.",iComp);
361 std::string Syst_Name = settings.GetValue(
prefix+
"Name",
"");
363 if (!Syst_Name.empty()){
389 for (
size_t iComp = 0; iComp < 999; ++iComp){
391 const TString
prefix = Form(
"JMRComponent.%zu.",iComp);
392 std::string Syst_Name = settings.GetValue(
prefix+
"Name",
"");
394 std::string to_find =
"MCTYPE";
398 if (!Syst_Name.empty()){
441 TString Calo_TA_weight_file_name = settings.GetValue(
"JetUncertainties_UncertaintyRootFile",
"");
444 if (Calo_TA_weight_file_path.IsNull()){
445 ATH_MSG_ERROR(
"Cannot find the file with the Calo and TA weights");
446 return StatusCode::FAILURE;
449 TString Calo_weight_hist_name = settings.GetValue(
"CombMassWeightCaloHist",
"");
450 if (Calo_weight_hist_name.IsNull()){
451 ATH_MSG_ERROR(
"Cannot find the histogram name that contains the Calo weights in the config file");
452 return StatusCode::FAILURE;
455 TString TA_weight_hist_name = settings.GetValue(
"CombMassWeightTAHist",
"");
456 if (TA_weight_hist_name.IsNull()){
457 ATH_MSG_ERROR(
"Cannot find the histogram name that contains the TA weights in the config file");
458 return StatusCode::FAILURE;
461 ATH_MSG_INFO(Form(
" Calo weights hist: \"%s\"",Calo_weight_hist_name.Data()));
462 ATH_MSG_INFO(Form(
" TA weights hist: \"%s\"",TA_weight_hist_name.Data()));
463 ATH_MSG_INFO(Form(
" Location: %s",Calo_TA_weight_file_path.Data()));
466 std::unique_ptr<TFile> Calo_TA_weight_file ( TFile::Open(Calo_TA_weight_file_path));
467 if (!Calo_TA_weight_file || Calo_TA_weight_file->IsZombie()){
468 ATH_MSG_FATAL(
"Could not open the first input file: " << Calo_TA_weight_file_path );
469 return StatusCode::FAILURE;
472 m_caloMassWeight = std::unique_ptr<TH3F>(
dynamic_cast<TH3F*
>(Calo_TA_weight_file->Get(Calo_weight_hist_name)));
473 m_TAMassWeight = std::unique_ptr<TH3F>(
dynamic_cast<TH3F*
>(Calo_TA_weight_file->Get(TA_weight_hist_name)));
479 Calo_TA_weight_file->Close();
483 return StatusCode::SUCCESS;
498 double dRmax_truthJet = 0.75;
503 for (
const auto *
const jet_truth : *jets_truth){
504 float dR_Test = jet_reco.
p4().DeltaR(jet_truth->p4());
505 if (dR_Test < dRmax_truthJet){
506 if (dR_Test < dRmin){
507 close_jet = jet_truth;
512 if (dRmin > 999){
return StatusCode::FAILURE;}
515 return StatusCode::SUCCESS;
527 ATH_MSG_ERROR(
"Unable to retrieve the FatjetTruthLabel from the jet. Please call the BoostedJetTaggers decorateTruthLabel() function before calling this function.");
528 return StatusCode::FAILURE;
542 jetTopology=
"no_match";
543 ATH_MSG_DEBUG(
"No truth jet match with this reco jet. The jet will not be smeared.");
548 ATH_MSG_VERBOSE(
"The topology of this jet correspond to a " << jetTopology <<
" large-R jet");
550 return StatusCode::SUCCESS;
577 return StatusCode::SUCCESS;
580 if (topologyAffected !=
"All" && !TString(topologyAffected).Contains(jetTopology)){
581 ATH_MSG_VERBOSE(
"The systematic does not affect to this jet topology");
582 return StatusCode::SUCCESS;
592 const TH2*
hist =
nullptr;
598 if (MassDef_of_syst == calo){
600 }
else if (MassDef_of_syst == ta){
610 const TH2*
hist =
nullptr;
611 const TH3F* hist3d =
nullptr;
615 if (uncertparam ==
"eLOGmOeAbsEta"){
621 if (MassDef_of_syst == calo){
622 if (uncertparam ==
"eLOGmOeAbsEta"){
627 }
else if (MassDef_of_syst == ta){
628 if (uncertparam ==
"eLOGmOeAbsEta"){
636 if (uncertparam ==
"eLOGmOeAbsEta"){
649 return StatusCode::SUCCESS;
659 ATH_MSG_VERBOSE(
"//---------------------------------------------------------------//");
660 ATH_MSG_VERBOSE(
"Reco Jet to Smear: pt = " << jet_reco.
pt() <<
", mass = " << jet_reco.
m() <<
", eta = " << jet_reco.
eta());
671 ATH_MSG_DEBUG(
"This jet exceeds the maximum pt that the tool allows jet_pt <" <<
m_MaxPt <<
" MeV)");
680 ATH_MSG_VERBOSE(
"No truth jet match with this reco jet. The jet will not be smeared.");
684 ATH_MSG_VERBOSE(
"Matched truth Jet: pt = " << jet_truth_matched.
pt() <<
", mass = " << jet_truth_matched.
m() <<
", eta = " << jet_truth_matched.
eta());
687 std::string jetTopology;
693 if (jetTopology ==
"no_match"){
699 double jet_mass_UFO = 0;
700 double jet_mass_CALO = 0;
701 double jet_mass_TA = 0;
702 double calo_mass_weight=1;
704 float JetTrackAssistedMassCalibrated_from_JetCalibTools;
720 jet_mass_CALO = jet_reco_CALO.mass();
721 jet_mass_TA = jet_reco_TA.mass();
722 jet_reco.
getAttribute<
float>(
"JetTrackAssistedMassCalibrated", JetTrackAssistedMassCalibrated_from_JetCalibTools);
725 jet_mass_CALO = jet_reco.
m();
726 calo_mass_weight = 1;
728 jet_mass_TA = jet_reco.
m();
729 jet_reco.
getAttribute<
float>(
"JetTrackAssistedMassCalibrated", JetTrackAssistedMassCalibrated_from_JetCalibTools);
730 calo_mass_weight = 0;
732 jet_mass_UFO = jet_reco.
m();
733 calo_mass_weight = 1;
738 double avg_response_UFO=1;
739 double avg_response_CALO=1;
740 double avg_response_TA=1;
744 if (avg_response_CALO == 0) avg_response_CALO=1;
749 if (avg_response_TA == 0) avg_response_TA = 1;
754 if (avg_response_UFO == 0) avg_response_UFO = 1;
759 double JMS(1), JMS_err(0), JMR(1), JMR_err(0);
763 double smeared_UFO_mass = jet_mass_UFO;
764 double smeared_CALO_mass = jet_mass_CALO;
765 double smeared_TA_mass = jet_mass_TA;
767 bool is_UFO_mass_smeared =
false;
768 bool is_CALO_mass_smeared =
false;
769 bool is_TA_mass_smeared =
false;
777 scale = JMS + JMS_err;
780 if (TMath::Abs(
scale-1) > 0.0001 || TMath::Abs(
resolution-1) > 0.0001){
781 is_CALO_mass_smeared =
true;
783 ATH_MSG_VERBOSE(
"Forward Folding CALO procedure will use scale=" <<
scale <<
", resolution=" <<
resolution <<
" and average respose=" << avg_response_CALO);
786 smeared_CALO_mass = jet_mass_CALO *
scale + (jet_mass_CALO - avg_response_CALO*jet_truth_matched.
m())*(
resolution-
scale);
797 scale = JMS + JMS_err;
800 if (TMath::Abs(
scale-1) > 0.0001 || TMath::Abs(
resolution-1) > 0.0001){
802 is_TA_mass_smeared =
true;
804 ATH_MSG_VERBOSE(
"Forward Folding TA procedure will use scale=" <<
scale <<
", resolution=" <<
resolution <<
" and average respose=" << avg_response_TA);
807 smeared_TA_mass = jet_mass_TA *
scale + (jet_mass_TA - avg_response_TA*jet_truth_matched.
m())*(
resolution-
scale);
818 scale = JMS + JMS_err;
821 if (TMath::Abs(
scale-1) > 0.0001 || TMath::Abs(
resolution-1) > 0.0001){
822 is_UFO_mass_smeared =
true;
824 ATH_MSG_VERBOSE(
"Forward Folding UFO procedure will use scale=" <<
scale <<
", resolution=" <<
resolution <<
" and average respose=" << avg_response_UFO);
827 smeared_UFO_mass = jet_mass_UFO *
scale + (jet_mass_UFO - avg_response_UFO*jet_truth_matched.
m())*(
resolution-
scale);
833 if (!is_CALO_mass_smeared && !is_TA_mass_smeared && !is_UFO_mass_smeared){
834 ATH_MSG_VERBOSE(
"This jet is not affected by the systematic. The jet won't be modified");
835 ATH_MSG_VERBOSE(
"//---------------------------------------------------------------//");
859 p4_aux =
xAOD::JetFourMom_t(jet_reco_CALO.pt(),jet_reco_CALO.eta(),jet_reco_CALO.phi(),smeared_CALO_mass);
860 jet_reco_CALO = p4_aux;
862 p4_aux =
xAOD::JetFourMom_t(jet_reco_TA.pt(),jet_reco_TA.eta(),jet_reco_TA.phi(),smeared_TA_mass);
863 jet_reco_TA = p4_aux;
880 caloFactor = 0; TAFactor = 1;
881 }
else if (TARes == 0){
882 caloFactor = 1; TAFactor = 0;
884 caloFactor = 1./(caloRes*caloRes);
885 TAFactor = 1./(TARes*TARes);
888 calo_mass_weight = caloFactor /(caloFactor + TAFactor);
892 }
else if (JetTrackAssistedMassCalibrated_from_JetCalibTools == 0){
893 calo_mass_weight = 1;
894 }
else if (jet_mass_CALO == 0){
895 calo_mass_weight = 0;
899 double smeared_mass = 0;
901 smeared_mass = smeared_UFO_mass;
904 smeared_mass = calo_mass_weight*smeared_CALO_mass + (1 - calo_mass_weight)*smeared_TA_mass;
914 ATH_MSG_VERBOSE(
"Smeared Reco Jet: pt = " << jet_reco.
pt() <<
", mass = " << jet_reco.
m() <<
", eta = " << jet_reco.
eta());
916 ATH_MSG_VERBOSE(
"//---------------------------------------------------------------//");
941 for (
size_t iJet = 0; iJet <
inputs.size(); ++iJet)
956 ATH_MSG_ERROR(
"Histogram pointer is null in FFJetSmearingTool::Read3DHistogram");
967 double xMax =
histo->GetXaxis()->GetBinLowEdge(
histo->GetNbinsX()+1);
968 double xMin =
histo->GetXaxis()->GetBinLowEdge(1);
969 double yMax =
histo->GetYaxis()->GetBinLowEdge(
histo->GetNbinsY()+1);
970 double yMin =
histo->GetYaxis()->GetBinLowEdge(1);
971 double zMax =
histo->GetZaxis()->GetBinLowEdge(
histo->GetNbinsZ()+1);
972 double zMin =
histo->GetZaxis()->GetBinLowEdge(1);
974 if (
x >= xMax) aux_x = xMax-1
e-6 ;
975 if (
x <= xMin) aux_x = xMin+1
e-6 ;
976 if (std::isnan(
y))
return 0;
977 if (
y >= yMax) aux_y = yMax-1
e-6 ;
978 if (
y <= yMin) aux_y = yMin+1
e-6 ;
979 if (
z >= zMax) aux_z = zMax-1
e-6 ;
980 if (
z <= zMin) aux_z = zMin+1
e-6 ;
992 ATH_MSG_ERROR(
"Histogram pointer is null in FFJetSmearingTool::Interpolate2D");
995 Int_t bin_x =
histo->GetXaxis()->FindFixBin(
x);
996 Int_t bin_y =
histo->GetYaxis()->FindFixBin(
y);
997 if (bin_x<1 || bin_x>
histo->GetNbinsX() || bin_y<1 || bin_y>
histo->GetNbinsY()){
1003 return interpolated_value;
1010 while ((
pos =
str.find(to_find,
pos)) != std::string::npos){
1011 str.replace(
pos, to_find.length(), to_replace);
1012 pos += to_replace.length();