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>(
dynamic_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>(
dynamic_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>(
dynamic_cast<TH3F*
>(Calo_TA_weight_file->Get(Calo_weight_hist_name)));
477 m_TAMassWeight = std::unique_ptr<TH3F>(
dynamic_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(
"//---------------------------------------------------------------//");
867 p4_aux =
xAOD::JetFourMom_t(jet_reco_CALO.pt(),jet_reco_CALO.eta(),jet_reco_CALO.phi(),smeared_CALO_mass);
868 jet_reco_CALO = p4_aux;
870 p4_aux =
xAOD::JetFourMom_t(jet_reco_TA.pt(),jet_reco_TA.eta(),jet_reco_TA.phi(),smeared_TA_mass);
871 jet_reco_TA = p4_aux;
888 caloFactor = 0; TAFactor = 1;
889 }
else if (TARes == 0){
890 caloFactor = 1; TAFactor = 0;
892 caloFactor = 1./(caloRes*caloRes);
893 TAFactor = 1./(TARes*TARes);
896 calo_mass_weight = caloFactor /(caloFactor + TAFactor);
900 }
else if (JetTrackAssistedMassCalibrated_from_JetCalibTools == 0){
901 calo_mass_weight = 1;
902 }
else if (jet_mass_CALO == 0){
903 calo_mass_weight = 0;
907 double smeared_mass = 0;
909 smeared_mass = smeared_UFO_mass;
912 smeared_mass = calo_mass_weight*smeared_CALO_mass + (1 - calo_mass_weight)*smeared_TA_mass;
922 ATH_MSG_VERBOSE(
"Smeared Reco Jet: pt = " << jet_reco.
pt() <<
", mass = " << jet_reco.
m() <<
", eta = " << jet_reco.
eta());
924 ATH_MSG_VERBOSE(
"//---------------------------------------------------------------//");
949 for (
size_t iJet = 0; iJet <
inputs.size(); ++iJet)
964 ATH_MSG_ERROR(
"Histogram pointer is null in FFJetSmearingTool::Read3DHistogram");
975 double xMax =
histo->GetXaxis()->GetBinLowEdge(
histo->GetNbinsX()+1);
976 double xMin =
histo->GetXaxis()->GetBinLowEdge(1);
977 double yMax =
histo->GetYaxis()->GetBinLowEdge(
histo->GetNbinsY()+1);
978 double yMin =
histo->GetYaxis()->GetBinLowEdge(1);
979 double zMax =
histo->GetZaxis()->GetBinLowEdge(
histo->GetNbinsZ()+1);
980 double zMin =
histo->GetZaxis()->GetBinLowEdge(1);
982 if (
x >= xMax) aux_x = xMax-1
e-6 ;
983 if (
x <= xMin) aux_x = xMin+1
e-6 ;
984 if (std::isnan(
y))
return 0;
985 if (
y >= yMax) aux_y = yMax-1
e-6 ;
986 if (
y <= yMin) aux_y = yMin+1
e-6 ;
987 if (
z >= zMax) aux_z = zMax-1
e-6 ;
988 if (
z <= zMin) aux_z = zMin+1
e-6 ;
1000 ATH_MSG_ERROR(
"Histogram pointer is null in FFJetSmearingTool::Interpolate2D");
1003 Int_t bin_x =
histo->GetXaxis()->FindFixBin(
x);
1004 Int_t bin_y =
histo->GetYaxis()->FindFixBin(
y);
1005 if (bin_x<1 || bin_x>
histo->GetNbinsX() || bin_y<1 || bin_y>
histo->GetNbinsY()){
1011 return interpolated_value;
1018 while ((
pos =
str.find(to_find,
pos)) != std::string::npos){
1019 str.replace(
pos, to_find.length(), to_replace);
1020 pos += to_replace.length();