510 float detectorEta =
jet.getAttribute<
float>(
"DetectorEta");
511 double absdetectorEta = fabs(detectorEta);
515 jetStartP4 =
jet.jetP4();
519 float mass_corr = jetStartP4.mass();
520 double pT_corr = jetStartP4.pt();
522 TLorentzVector caloCalibJet;
529 ATH_MSG_FATAL(
"Please check that the mass correction eta binning is properly set in your config file");
530 return StatusCode::FAILURE;
534 ATH_MSG_FATAL(
"Please check that the mass correction 3D histogram is provided");
535 return StatusCode::FAILURE;
547 ) && jetStartP4.mass() != 0 ) {
554 ATH_MSG_FATAL(
"There was a problem determining the eta bin to use for the mass correction");
555 return StatusCode::FAILURE;
560 double massFactor = 1;
570 if (jetStartP4.mass() / jetStartP4.e() > 0)
581 if (jetStartP4.mass() / jetStartP4.Et() > 0)
592 if (jetStartP4.mass() / jetStartP4.pt() > 0)
603 if (jetStartP4.mass() / jetStartP4.Et() > 0)
614 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.");
615 return StatusCode::FAILURE;
619 mass_corr = jetStartP4.mass() / massFactor;
620 if (mass_corr > jetStartP4.e()) {
621 mass_corr = jetStartP4.mass();
624 if(!
m_pTfixed) pT_corr = std::sqrt(jetStartP4.e()*jetStartP4.e()-mass_corr*mass_corr)/std::cosh( jetStartP4.eta() );
627 caloCalibJet.SetPtEtaPhiM(pT_corr, jetStartP4.eta(), jetStartP4.phi(), mass_corr);
630 calibP4.SetPxPyPzE( caloCalibJet.Px(), caloCalibJet.Py(), caloCalibJet.Pz(), caloCalibJet.E() );
634 jet.setJetP4( calibP4 );
640 double E_corr = jetStartP4.e();
647 ATH_MSG_FATAL(
"Please check that the mass correction eta binning is properly set in your config file");
653 ATH_MSG_FATAL(
"Please check that the track assisted mass correction 3D histogram is provided");
654 return StatusCode::FAILURE;
658 std::string TrackSumMassStr =
"TrackSumMass";
659 if(
m_jetAlgo==
"AntiKt4EMTopo" ||
m_jetAlgo==
"AntiKt4LCTopo") TrackSumMassStr =
"DFCommonJets_TrackSumMass";
660 std::string TrackSumPtStr =
"TrackSumPt";
661 if(
m_jetAlgo==
"AntiKt4EMTopo" ||
m_jetAlgo==
"AntiKt4LCTopo") TrackSumPtStr =
"DFCommonJets_TrackSumPt";
662 if( !
jet.getAttribute<
float>(TrackSumMassStr,trackSumMass) ) {
665 [[maybe_unused]]
static const bool warnedOnce = [&] {
666 ATH_MSG_WARNING(
"Failed to retrieve TrackSumMass! Track Assisted Mass Correction will NOT be applied");
669 return StatusCode::SUCCESS;
671 ATH_MSG_FATAL(
"Failed to retrieve TrackSumMass! Mass Combination can NOT be performed. Aborting.");
672 return StatusCode::FAILURE;
676 if( !
jet.getAttribute<
float>(TrackSumPtStr,trackSumPt) ) {
679 [[maybe_unused]]
static const bool warnedOnce = [&] {
680 ATH_MSG_WARNING(
"Failed to retrieve TrackSumPt! Track Assisted Mass Correction will NOT be applied");
683 return StatusCode::SUCCESS;
685 ATH_MSG_FATAL(
"Failed to retrieve TrackSumPt! Mass Combination can NOT be performed. Aborting.");
686 return StatusCode::FAILURE;
689 pT_corr = jetStartP4.pt();
691 if(trackSumPt==0)
mTA = 0;
692 else{
mTA = (jetStartP4.pt()/trackSumPt)*trackSumMass;}
693 if(mTA<0 || mTA > jetStartP4.e())
mTA = 0;
698 ) && jetStartP4.mass() != 0 ) {
705 ATH_MSG_FATAL(
"There was a problem determining the eta bin to use for the track assisted mass correction");
706 return StatusCode::FAILURE;
710 double mTAFactor = 1;
723 if (
mTA / jetStartP4.e() > 0)
734 if (
mTA / jetStartP4.Et() > 0)
745 if (
mTA / jetStartP4.pt() > 0)
756 if (
mTA / jetStartP4.Et() > 0)
767 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.");
768 return StatusCode::FAILURE;
773 if(mTAFactor!=0) mass_corr =
mTA/mTAFactor;
775 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. ");
776 return StatusCode::FAILURE;
779 if(!
m_pTfixed) pT_corr = std::sqrt(jetStartP4.e()*jetStartP4.e()-mass_corr*mass_corr)/std::cosh( jetStartP4.eta() );
780 else{E_corr = std::sqrt(jetStartP4.P()*jetStartP4.P()+mass_corr*mass_corr);}
785 if(!
m_pTfixed) pT_corr = jetStartP4.e()/std::cosh( jetStartP4.eta() );
786 else{E_corr = jetStartP4.P();}
789 TLorentzVector TACalibJet;
792 TACalibJet.SetPtEtaPhiM(pT_corr, jetStartP4.eta(), jetStartP4.phi(), mass_corr);
794 TACalibJet_pTfixed.SetPxPyPzE( jetStartP4.Px(), jetStartP4.Py(), jetStartP4.Pz(), E_corr );}
797 jet.setAttribute<
float>(
"JetTrackAssistedMassUnCalibrated",
mTA);
798 jet.setAttribute<
float>(
"JetTrackAssistedMassCalibrated",mass_corr);
799 if(!
m_pTfixed)
jet.setAttribute<
float>(
"JetpTCorrByCalibratedTAMass",pT_corr);
800 else{
jet.setAttribute<
float>(
"JetECorrByCalibratedTAMass",E_corr);}
808 calibP4_calo.SetCoordinates( caloCalibJet.Pt(), jetStartP4.eta(), jetStartP4.phi(), caloCalibJet.M() );
814 calibP4_ta.SetCoordinates( TACalibJet.Pt(), jetStartP4.eta(), jetStartP4.phi(), TACalibJet.M() );
816 calibP4_ta.SetPxPyPzE( TACalibJet_pTfixed.Px(), TACalibJet_pTfixed.Py(), TACalibJet_pTfixed.Pz(), TACalibJet_pTfixed.E() );}
824 float Mass_comb = 0.;
835 calibP4Insitu_calo=jetInsituP4_calo;
837 ATH_MSG_FATAL(
"Cannot retrieve JetInsituScaleMomentumCalo jets" );
838 return StatusCode::FAILURE;
840 TLorentzVector TLVCaloInsituCalib;
841 TLVCaloInsituCalib.SetPtEtaPhiM(calibP4Insitu_calo.pt(), calibP4Insitu_calo.eta(), calibP4Insitu_calo.phi(), calibP4Insitu_calo.mass());
842 mass_calo = TLVCaloInsituCalib.M();
843 pT_calo = TLVCaloInsituCalib.Pt();
844 E_calo = TLVCaloInsituCalib.E();
845 Et_calo = TLVCaloInsituCalib.Et();
850 calibP4Insitu_ta=jetInsituP4_ta;
852 ATH_MSG_FATAL(
"Cannot retrieve JetInsituScaleMomentumTA jets" );
853 return StatusCode::FAILURE;
855 TLorentzVector TLVTAInsituCalib;
856 TLVTAInsituCalib.SetPtEtaPhiM(calibP4Insitu_ta.pt(), calibP4Insitu_ta.eta(), calibP4Insitu_ta.phi(), calibP4Insitu_ta.mass());
857 mass_ta = TLVTAInsituCalib.M();
859 mass_calo = caloCalibJet.M();
860 pT_calo = caloCalibJet.Pt();
861 E_calo = caloCalibJet.E();
862 Et_calo = caloCalibJet.Et();
867 if( (mass_calo==0) || (mass_ta==0) ) {
868 Mass_comb = mass_ta+mass_calo;
876 ATH_MSG_FATAL(
"Please check that the mass combination eta binning is properly set in your config file");
877 return StatusCode::FAILURE;
880 ATH_MSG_FATAL(
"Please check that the mass combination eta binning is properly set in your config file");
881 return StatusCode::FAILURE;
886 ATH_MSG_FATAL(
"Please check that the mass resolution 3D histogram is provided");
887 return StatusCode::FAILURE;
891 ATH_MSG_FATAL(
"Please check that the track assisted mass resolution 3D histogram is provided");
892 return StatusCode::FAILURE;
904 ATH_MSG_FATAL(
"There was a problem determining the eta bin to use for the mass combination");
905 return StatusCode::FAILURE;
996 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.");
997 return StatusCode::FAILURE;
1003 ATH_MSG_ERROR(
"Encountered division by zero when calculating mass combination weight using correlated weights");
1004 return StatusCode::FAILURE;
1006 const double Weight = ( relTA*relTA -
rho *relCalo*relTA ) / ( relCalo*relCalo + relTA*relTA - 2 *
rho* relCalo * relTA );
1009 if(relCalo == 0 && relTA == 0)
1011 else if(relCalo == 0)
1012 Mass_comb = mass_ta;
1014 Mass_comb = mass_calo;
1016 Mass_comb = ( mass_calo * Weight ) + ( mass_ta * ( 1 - Weight) );
1018 if(Mass_comb>jetStartP4.e()) Mass_comb = mass_calo;
1019 else if(!
m_pTfixed) pT_calo = std::sqrt(jetStartP4.e()*jetStartP4.e()-mass_calo*mass_calo)/std::cosh( jetStartP4.eta() );
1023 TLorentzVector TLVjet;
1024 TLVjet.SetPtEtaPhiM( pT_calo, jetStartP4.eta(), jetStartP4.phi(), Mass_comb );
1025 calibP4.SetPxPyPzE( TLVjet.Px(), TLVjet.Py(), TLVjet.Pz(), TLVjet.E() );
1029 jet.setJetP4( calibP4 );
1033 return StatusCode::SUCCESS;