38 if ( !
m_config ) {
ATH_MSG_FATAL(
"Config file not specified. Aborting.");
return StatusCode::FAILURE; }
47 if (
m_jetAlgo.EqualTo(
"") ) {
ATH_MSG_FATAL(
"No jet algorithm specified. Aborting.");
return StatusCode::FAILURE; }
66 JMSFile =
m_config->GetValue(
"MassCalibrationFile",
"empty");
67 if ( JMSFile.EqualTo(
"empty") ) {
69 return StatusCode::FAILURE;
73 JMSFile.Insert(0,
"JetCalibTools/");
77 std::unique_ptr<TFile> inputFile(TFile::Open(fileName));
80 return StatusCode::FAILURE;
87 TList *keys = inputFile->GetListOfKeys();
90 while ( TKey *iterobj = (TKey*)ikeys() ) {
91 TString histoName = iterobj->GetName();
103 ATH_MSG_FATAL(
"Vector of mass correction histograms may be empty. Please check your mass calibration file: " << JMSFile);
104 return StatusCode::FAILURE;
108 ATH_MSG_FATAL(
"3D mass correction histogram may be missing. Please check your mass calibration file: " << JMSFile);
109 return StatusCode::FAILURE;
111 else ATH_MSG_DEBUG(
"JMS Tool has been initialized with binning and eta fit factors from: " << fileName);
117 TString JMS_TrackAssisted_File(
m_config->GetValue(
"TrackAssistedMassCalibrationFile",
"empty"));
118 if ( JMS_TrackAssisted_File.EqualTo(
"empty") ) {
119 ATH_MSG_FATAL(
"NO Track Assisted Mass Factors File specified. Aborting.");
120 return StatusCode::FAILURE;
123 JMS_TrackAssisted_File.Remove(0,33);
124 JMS_TrackAssisted_File.Insert(0,
"JetCalibTools/");
128 std::unique_ptr<TFile> inputFile_trkAssisted(TFile::Open(file_trkAssisted_Name));
129 if (!inputFile_trkAssisted){
130 ATH_MSG_FATAL(
"Cannot open Track Assisted Mass factors file" << fileName);
131 return StatusCode::FAILURE;
135 inputFile_trkAssisted->cd();
136 TList *keys_trkAssisted = inputFile_trkAssisted->GetListOfKeys();
138 TIter ikeys_trkAssisted(keys_trkAssisted);
139 while ( TKey *iterobj = (TKey*)ikeys_trkAssisted() ) {
140 TString histoName = iterobj->GetName();
152 ATH_MSG_FATAL(
"Vector of track assisted mass correction histograms may be empty. Please check your track assisted mass calibration file: " << JMSFile);
153 return StatusCode::FAILURE;
157 ATH_MSG_FATAL(
"3D track assisted mass correction histogram may be missing. Please check your mass calibration file: " << JMSFile);
158 return StatusCode::FAILURE;
160 else ATH_MSG_DEBUG(
"JMS Tool has been initialized with binning and eta fit factors from: " << file_trkAssisted_Name);
167 TString Combination_File(
m_config->GetValue(
"CombinationFile",
"empty"));
168 if ( Combination_File.EqualTo(
"empty") ) {
170 return StatusCode::FAILURE;
173 Combination_File.Remove(0,33);
174 Combination_File.Insert(0,
"JetCalibTools/");
178 std::unique_ptr<TFile> inputFile_combination(TFile::Open(file_combination_Name));
179 if (!inputFile_combination){
180 ATH_MSG_FATAL(
"Cannot open Mass Combination file " << file_combination_Name);
181 return StatusCode::FAILURE;
188 TString combObj =
"";
195 return StatusCode::FAILURE;
199 inputFile_combination->cd();
200 TList *keys_combination = inputFile_combination->GetListOfKeys();
202 TIter ikeys_combination(keys_combination);
203 while ( TKey *iterobj = (TKey*)ikeys_combination() ) {
204 TString histoName = iterobj->GetName();
205 if ( histoName.Contains(
"CaloMass") && histoName.Contains(combObj.Data()) )
212 if ( histoName.Contains(
"TAMass") && histoName.Contains(combObj.Data()) )
219 if ( histoName.Contains(
"Correlation") && histoName.Contains(combObj.Data()) )
233 ATH_MSG_FATAL(
"Vector of mass combination histograms with calo factors may be empty. Please check your mass combination file: " << JMSFile);
234 return StatusCode::FAILURE;
237 ATH_MSG_FATAL(
"Vector of mass combination histograms with trk-assisted factors may be empty. Please check your mass combination file: " << JMSFile);
238 return StatusCode::FAILURE;
245 ATH_MSG_FATAL(
"Mass combination 3D histogram with calo factors was not filled. Please check your mass combination file: " << JMSFile);
246 return StatusCode::FAILURE;
250 ATH_MSG_FATAL(
"Mass combination 3D histogram with trk-assisted factors was not filled. Please check your mass combination file: " << JMSFile);
251 return StatusCode::FAILURE;
256 ATH_MSG_DEBUG(
"JMS Tool has been initialized with mass combination weights from: " << file_combination_Name);
265 TString binParamString =
m_config->GetValue(
"JMSBinningParam",
"");
266 if (binParamString ==
"")
269 ATH_MSG_DEBUG(
"JMS Tool will use the implied pt_mass_eta binning strategy");
274 if (!binParamString.CompareTo(
"pt_mass_eta",TString::kIgnoreCase))
276 else if (!binParamString.CompareTo(
"e_LOGmOe_eta",TString::kIgnoreCase))
278 else if (!binParamString.CompareTo(
"e_LOGmOet_eta",TString::kIgnoreCase))
280 else if (!binParamString.CompareTo(
"e_LOGmOpt_eta",TString::kIgnoreCase))
282 else if (!binParamString.CompareTo(
"et_LOGmOet_eta",TString::kIgnoreCase))
287 ATH_MSG_FATAL(
"JMSBinningParam was specified, but input was not understood: " << binParamString);
288 return StatusCode::FAILURE;
290 ATH_MSG_DEBUG(
"JMS Tool will use the " << binParamString <<
" binning strategy");
295 return StatusCode::SUCCESS;
508 float detectorEta =
jet.getAttribute<
float>(
"DetectorEta");
509 double absdetectorEta = fabs(detectorEta);
513 jetStartP4 =
jet.jetP4();
517 float mass_corr = jetStartP4.mass();
518 double pT_corr = jetStartP4.pt();
520 TLorentzVector caloCalibJet;
527 ATH_MSG_FATAL(
"Please check that the mass correction eta binning is properly set in your config file");
528 return StatusCode::FAILURE;
532 ATH_MSG_FATAL(
"Please check that the mass correction 3D histogram is provided");
533 return StatusCode::FAILURE;
545 ) && jetStartP4.mass() != 0 ) {
552 ATH_MSG_FATAL(
"There was a problem determining the eta bin to use for the mass correction");
553 return StatusCode::FAILURE;
558 double massFactor = 1;
568 if (jetStartP4.mass() / jetStartP4.e() > 0)
571 massFactor =
getMassCorr3D( jetStartP4.e()/
m_GeV, std::log(jetStartP4.mass() / jetStartP4.e()), absdetectorEta);
573 massFactor =
getMassCorr( jetStartP4.e()/
m_GeV, std::log(jetStartP4.mass() / jetStartP4.e()), etabin);
579 if (jetStartP4.mass() / jetStartP4.Et() > 0)
582 massFactor =
getMassCorr3D( jetStartP4.e()/
m_GeV, std::log(jetStartP4.mass() / jetStartP4.Et()), absdetectorEta);
584 massFactor =
getMassCorr( jetStartP4.e()/
m_GeV, std::log(jetStartP4.mass() / jetStartP4.Et()), etabin);
590 if (jetStartP4.mass() / jetStartP4.pt() > 0)
593 massFactor =
getMassCorr3D( jetStartP4.e()/
m_GeV, std::log(jetStartP4.mass() / jetStartP4.pt()), absdetectorEta);
595 massFactor =
getMassCorr( jetStartP4.e()/
m_GeV, std::log(jetStartP4.mass() / jetStartP4.pt()), etabin);
601 if (jetStartP4.mass() / jetStartP4.Et() > 0)
604 massFactor =
getMassCorr3D( jetStartP4.Et()/
m_GeV, std::log(jetStartP4.mass() / jetStartP4.Et()), absdetectorEta);
606 massFactor =
getMassCorr( jetStartP4.Et()/
m_GeV, std::log(jetStartP4.mass() / jetStartP4.Et()), etabin);
612 ATH_MSG_FATAL(
"This should never be reached - if it happens, it's because a new BinningParam enum option was added, but how to handle it for the calo mass was not. Please contact the tool developer(s) to fix this.");
613 return StatusCode::FAILURE;
616 if (massFactor == 0.){
620 mass_corr = jetStartP4.mass() / massFactor;
621 if (mass_corr > jetStartP4.e()) {
622 mass_corr = jetStartP4.mass();
625 if(!
m_pTfixed) pT_corr = std::sqrt(jetStartP4.e()*jetStartP4.e()-mass_corr*mass_corr)/std::cosh( jetStartP4.eta() );
628 caloCalibJet.SetPtEtaPhiM(pT_corr, jetStartP4.eta(), jetStartP4.phi(), mass_corr);
631 calibP4.SetPxPyPzE( caloCalibJet.Px(), caloCalibJet.Py(), caloCalibJet.Pz(), caloCalibJet.E() );
635 jet.setJetP4( calibP4 );
641 double E_corr = jetStartP4.e();
648 ATH_MSG_FATAL(
"Please check that the mass correction eta binning is properly set in your config file");
654 ATH_MSG_FATAL(
"Please check that the track assisted mass correction 3D histogram is provided");
655 return StatusCode::FAILURE;
659 std::string TrackSumMassStr =
"TrackSumMass";
660 if(
m_jetAlgo==
"AntiKt4EMTopo" ||
m_jetAlgo==
"AntiKt4LCTopo") TrackSumMassStr =
"DFCommonJets_TrackSumMass";
661 std::string TrackSumPtStr =
"TrackSumPt";
662 if(
m_jetAlgo==
"AntiKt4EMTopo" ||
m_jetAlgo==
"AntiKt4LCTopo") TrackSumPtStr =
"DFCommonJets_TrackSumPt";
663 if( !
jet.getAttribute<
float>(TrackSumMassStr,trackSumMass) ) {
666 [[maybe_unused]]
static const bool warnedOnce = [&] {
667 ATH_MSG_WARNING(
"Failed to retrieve TrackSumMass! Track Assisted Mass Correction will NOT be applied");
670 return StatusCode::SUCCESS;
672 ATH_MSG_FATAL(
"Failed to retrieve TrackSumMass! Mass Combination can NOT be performed. Aborting.");
673 return StatusCode::FAILURE;
677 if( !
jet.getAttribute<
float>(TrackSumPtStr,trackSumPt) ) {
680 [[maybe_unused]]
static const bool warnedOnce = [&] {
681 ATH_MSG_WARNING(
"Failed to retrieve TrackSumPt! Track Assisted Mass Correction will NOT be applied");
684 return StatusCode::SUCCESS;
686 ATH_MSG_FATAL(
"Failed to retrieve TrackSumPt! Mass Combination can NOT be performed. Aborting.");
687 return StatusCode::FAILURE;
690 pT_corr = jetStartP4.pt();
692 if(trackSumPt==0)
mTA = 0;
693 else{
mTA = (jetStartP4.pt()/trackSumPt)*trackSumMass;}
699 ) && jetStartP4.mass() != 0 ) {
706 ATH_MSG_FATAL(
"There was a problem determining the eta bin to use for the track assisted mass correction");
707 return StatusCode::FAILURE;
711 double mTAFactor = 1;
724 if (
mTA / jetStartP4.e() > 0)
735 if (
mTA / jetStartP4.Et() > 0)
746 if (
mTA / jetStartP4.pt() > 0)
757 if (
mTA / jetStartP4.Et() > 0)
768 ATH_MSG_FATAL(
"This should never be reached - if it happens, it's because a new BinningParam enum option was added, but how to handle it for the TA mass was not. Please contact the tool developer(s) to fix this.");
769 return StatusCode::FAILURE;
774 if(mTAFactor!=0) mass_corr =
mTA/mTAFactor;
776 ATH_MSG_FATAL(
"The calibration histogram may have a bad filling bin that is causing mTAFactor to be zero. This value should be different from zero in order to take the ratio. Please contact the tool developer to fix this since the calibration histogram may be corrupted. ");
777 return StatusCode::FAILURE;
780 if(!
m_pTfixed) pT_corr = std::sqrt(jetStartP4.e()*jetStartP4.e()-mass_corr*mass_corr)/std::cosh( jetStartP4.eta() );
781 else{E_corr = std::sqrt(jetStartP4.P()*jetStartP4.P()+mass_corr*mass_corr);}
786 if(!
m_pTfixed) pT_corr = jetStartP4.e()/std::cosh( jetStartP4.eta() );
787 else{E_corr = jetStartP4.P();}
790 TLorentzVector TACalibJet;
793 TACalibJet.SetPtEtaPhiM(pT_corr, jetStartP4.eta(), jetStartP4.phi(), mass_corr);
795 TACalibJet_pTfixed.SetPxPyPzE( jetStartP4.Px(), jetStartP4.Py(), jetStartP4.Pz(), E_corr );}
798 jet.setAttribute<
float>(
"JetTrackAssistedMassUnCalibrated",
mTA);
799 jet.setAttribute<
float>(
"JetTrackAssistedMassCalibrated",mass_corr);
800 if(!
m_pTfixed)
jet.setAttribute<
float>(
"JetpTCorrByCalibratedTAMass",pT_corr);
801 else{
jet.setAttribute<
float>(
"JetECorrByCalibratedTAMass",E_corr);}
809 calibP4_calo.SetCoordinates( caloCalibJet.Pt(), jetStartP4.eta(), jetStartP4.phi(), caloCalibJet.M() );
815 calibP4_ta.SetCoordinates( TACalibJet.Pt(), jetStartP4.eta(), jetStartP4.phi(), TACalibJet.M() );
817 calibP4_ta.SetPxPyPzE( TACalibJet_pTfixed.Px(), TACalibJet_pTfixed.Py(), TACalibJet_pTfixed.Pz(), TACalibJet_pTfixed.E() );}
825 float Mass_comb = 0.;
836 calibP4Insitu_calo=jetInsituP4_calo;
838 ATH_MSG_FATAL(
"Cannot retrieve JetInsituScaleMomentumCalo jets" );
839 return StatusCode::FAILURE;
841 TLorentzVector TLVCaloInsituCalib;
842 TLVCaloInsituCalib.SetPtEtaPhiM(calibP4Insitu_calo.pt(), calibP4Insitu_calo.eta(), calibP4Insitu_calo.phi(), calibP4Insitu_calo.mass());
843 mass_calo = TLVCaloInsituCalib.M();
844 pT_calo = TLVCaloInsituCalib.Pt();
845 E_calo = TLVCaloInsituCalib.E();
846 Et_calo = TLVCaloInsituCalib.Et();
851 calibP4Insitu_ta=jetInsituP4_ta;
853 ATH_MSG_FATAL(
"Cannot retrieve JetInsituScaleMomentumTA jets" );
854 return StatusCode::FAILURE;
856 TLorentzVector TLVTAInsituCalib;
857 TLVTAInsituCalib.SetPtEtaPhiM(calibP4Insitu_ta.pt(), calibP4Insitu_ta.eta(), calibP4Insitu_ta.phi(), calibP4Insitu_ta.mass());
858 mass_ta = TLVTAInsituCalib.M();
860 mass_calo = caloCalibJet.M();
861 pT_calo = caloCalibJet.Pt();
862 E_calo = caloCalibJet.E();
863 Et_calo = caloCalibJet.Et();
868 if( (mass_calo==0) || (mass_ta==0) ) {
869 Mass_comb = mass_ta+mass_calo;
877 ATH_MSG_FATAL(
"Please check that the mass combination eta binning is properly set in your config file");
878 return StatusCode::FAILURE;
881 ATH_MSG_FATAL(
"Please check that the mass combination eta binning is properly set in your config file");
882 return StatusCode::FAILURE;
887 ATH_MSG_FATAL(
"Please check that the mass resolution 3D histogram is provided");
888 return StatusCode::FAILURE;
892 ATH_MSG_FATAL(
"Please check that the track assisted mass resolution 3D histogram is provided");
893 return StatusCode::FAILURE;
905 ATH_MSG_FATAL(
"There was a problem determining the eta bin to use for the mass combination");
906 return StatusCode::FAILURE;
922 rho =
getRho3D( pT_calo/
m_GeV, mass_calo/pT_calo, absdetectorEta );
929 rho =
getRho( pT_calo/
m_GeV, mass_calo/pT_calo, etabin );
935 relCalo = mass_calo/E_calo > 0 ?
getRelCalo3D( E_calo/
m_GeV, std::log(mass_calo/E_calo), absdetectorEta ) : 0;
936 relTA = mass_ta/E_calo > 0 ?
getRelTA3D( E_calo/
m_GeV, std::log(mass_ta/E_calo), absdetectorEta ) : 0;
938 rho = mass_calo/E_calo > 0 ?
getRho3D( E_calo/
m_GeV, std::log(mass_calo/E_calo), absdetectorEta ) : 0;
942 relCalo = mass_calo/E_calo > 0 ?
getRelCalo( E_calo/
m_GeV, std::log(mass_calo/E_calo), etabin ) : 0;
943 relTA = mass_ta/E_calo > 0 ?
getRelTA( E_calo/
m_GeV, std::log(mass_ta/E_calo), etabin ) : 0;
945 rho = mass_calo/E_calo > 0 ?
getRho( E_calo/
m_GeV, std::log(mass_calo/E_calo), etabin ) : 0;
951 relCalo = mass_calo/Et_calo > 0 ?
getRelCalo3D( E_calo/
m_GeV, std::log(mass_calo/Et_calo), absdetectorEta ) : 0;
952 relTA = mass_ta/Et_calo > 0 ?
getRelTA3D( E_calo/
m_GeV, std::log(mass_ta/Et_calo), absdetectorEta ) : 0;
954 rho = mass_calo/Et_calo > 0 ?
getRho3D( E_calo/
m_GeV, std::log(mass_calo/Et_calo), absdetectorEta ) : 0;
958 relCalo = mass_calo/Et_calo > 0 ?
getRelCalo( E_calo/
m_GeV, std::log(mass_calo/Et_calo), etabin ) : 0;
959 relTA = mass_ta/Et_calo > 0 ?
getRelTA( E_calo/
m_GeV, std::log(mass_ta/Et_calo), etabin ) : 0;
961 rho = mass_calo/Et_calo > 0 ?
getRho( E_calo/
m_GeV, std::log(mass_calo/Et_calo), etabin ) : 0;
967 relCalo = mass_calo/pT_calo > 0 ?
getRelCalo3D( E_calo/
m_GeV, std::log(mass_calo/pT_calo), absdetectorEta ) : 0;
968 relTA = mass_ta/pT_calo > 0 ?
getRelTA3D( E_calo/
m_GeV, std::log(mass_ta/pT_calo), absdetectorEta ) : 0;
970 rho = mass_calo/pT_calo > 0 ?
getRho3D( E_calo/
m_GeV, std::log(mass_calo/pT_calo), absdetectorEta ) : 0;
974 relCalo = mass_calo/pT_calo > 0 ?
getRelCalo( E_calo/
m_GeV, std::log(mass_calo/pT_calo), etabin ) : 0;
975 relTA = mass_ta/pT_calo > 0 ?
getRelTA( E_calo/
m_GeV, std::log(mass_ta/pT_calo), etabin ) : 0;
977 rho = mass_calo/pT_calo > 0 ?
getRho( E_calo/
m_GeV, std::log(mass_calo/pT_calo), etabin ) : 0;
983 relCalo = mass_calo/Et_calo > 0 ?
getRelCalo3D( Et_calo/
m_GeV, std::log(mass_calo/Et_calo), absdetectorEta ) : 0;
984 relTA = mass_ta/Et_calo > 0 ?
getRelTA3D( Et_calo/
m_GeV, std::log(mass_ta/Et_calo), absdetectorEta ) : 0;
986 rho = mass_calo/Et_calo > 0 ?
getRho3D( Et_calo/
m_GeV, std::log(mass_calo/Et_calo), absdetectorEta ) : 0;
990 relCalo = mass_calo/Et_calo > 0 ?
getRelCalo( Et_calo/
m_GeV, std::log(mass_calo/Et_calo), etabin ) : 0;
991 relTA = mass_ta/Et_calo > 0 ?
getRelTA( Et_calo/
m_GeV, std::log(mass_ta/Et_calo), etabin ) : 0;
993 rho = mass_calo/Et_calo > 0 ?
getRho( Et_calo/
m_GeV, std::log(mass_calo/Et_calo), etabin ) : 0;
997 ATH_MSG_FATAL(
"This should never be reached - if it happens, it's because a new BinningParam enum option was added, but how to handle it for the TA mass was not. Please contact the tool developer(s) to fix this.");
998 return StatusCode::FAILURE;
1003 if(relCalo*relCalo + relTA*relTA - 2 * rho* relCalo * relTA == 0.){
1004 ATH_MSG_ERROR(
"Encountered division by zero when calculating mass combination weight using correlated weights");
1005 return StatusCode::FAILURE;
1008 const double Weight = ( relTA*relTA - rho *relCalo*relTA ) / ( relCalo*relCalo + relTA*relTA - 2 * rho* relCalo * relTA );
1011 if(relCalo == 0 && relTA == 0)
1013 else if(relCalo == 0)
1014 Mass_comb = mass_ta;
1016 Mass_comb = mass_calo;
1018 Mass_comb = ( mass_calo * Weight ) + ( mass_ta * ( 1 - Weight) );
1020 if(Mass_comb>jetStartP4.e()) Mass_comb = mass_calo;
1021 else if(!
m_pTfixed) pT_calo = std::sqrt(jetStartP4.e()*jetStartP4.e()-mass_calo*mass_calo)/std::cosh( jetStartP4.eta() );
1025 TLorentzVector TLVjet;
1026 TLVjet.SetPtEtaPhiM( pT_calo, jetStartP4.eta(), jetStartP4.phi(), Mass_comb );
1027 calibP4.SetPxPyPzE( TLVjet.Px(), TLVjet.Py(), TLVjet.Pz(), TLVjet.E() );
1031 jet.setJetP4( calibP4 );
1035 return StatusCode::SUCCESS;