650 const std::vector<size_t> &muon_indices,
651 const std::vector<size_t> &jet_indices) {
653 auto resultAuxContainer =
654 std::make_unique<xAOD::KLFitterResultAuxContainer>();
655 auto resultContainer = std::make_unique<xAOD::KLFitterResultContainer>();
656 resultContainer->setStore(resultAuxContainer.get());
659 const int nperm =
m_myFitter->Permutations()->NPermutations();
660 for (
int iperm = 0; iperm < nperm; ++iperm) {
665 resultContainer->push_back(
result);
669 std::hash<std::string> hash_string;
670 result->setSelectionCode(hash_string(sys.name()));
672 unsigned int ConvergenceStatusBitWord =
m_myFitter->ConvergenceStatus();
673 bool MinuitDidNotConverge =
674 (ConvergenceStatusBitWord &
m_myFitter->MinuitDidNotConvergeMask) != 0;
675 bool FitAbortedDueToNaN =
676 (ConvergenceStatusBitWord &
m_myFitter->FitAbortedDueToNaNMask) != 0;
677 bool AtLeastOneFitParameterAtItsLimit =
678 (ConvergenceStatusBitWord &
679 m_myFitter->AtLeastOneFitParameterAtItsLimitMask) != 0;
680 bool InvalidTransferFunctionAtConvergence =
681 (ConvergenceStatusBitWord &
682 m_myFitter->InvalidTransferFunctionAtConvergenceMask) != 0;
684 result->setMinuitDidNotConverge(((MinuitDidNotConverge) ? 1 : 0));
685 result->setFitAbortedDueToNaN(((FitAbortedDueToNaN) ? 1 : 0));
686 result->setAtLeastOneFitParameterAtItsLimit(
687 ((AtLeastOneFitParameterAtItsLimit) ? 1 : 0));
688 result->setInvalidTransferFunctionAtConvergence(
689 ((InvalidTransferFunctionAtConvergence) ? 1 : 0));
692 m_myFitter->Likelihood()->GetBestFitParameters()));
693 result->setEventProbability(
694 std::exp(
m_myFitter->Likelihood()->LogEventProbability()));
696 result->setParameterErrors(
697 m_myFitter->Likelihood()->GetBestFitParameterErrors());
699 KLFitter::Particles *myModelParticles =
701 KLFitter::Particles **myPermutedParticles =
702 m_myFitter->Likelihood()->PParticlesPermuted();
710 result->setModel_bhad_pt(myModelParticles->Parton(0)->Pt());
711 result->setModel_bhad_eta(myModelParticles->Parton(0)->Eta());
712 result->setModel_bhad_phi(myModelParticles->Parton(0)->Phi());
713 result->setModel_bhad_E(myModelParticles->Parton(0)->E());
714 result->setModel_bhad_jetIndex(
715 jet_indices.at((*myPermutedParticles)->JetIndex(0)));
717 result->setModel_blep_pt(myModelParticles->Parton(1)->Pt());
718 result->setModel_blep_eta(myModelParticles->Parton(1)->Eta());
719 result->setModel_blep_phi(myModelParticles->Parton(1)->Phi());
720 result->setModel_blep_E(myModelParticles->Parton(1)->E());
721 result->setModel_blep_jetIndex(
722 jet_indices.at((*myPermutedParticles)->JetIndex(1)));
724 result->setModel_lq1_pt(myModelParticles->Parton(2)->Pt());
725 result->setModel_lq1_eta(myModelParticles->Parton(2)->Eta());
726 result->setModel_lq1_phi(myModelParticles->Parton(2)->Phi());
727 result->setModel_lq1_E(myModelParticles->Parton(2)->E());
728 result->setModel_lq1_jetIndex(
729 jet_indices.at((*myPermutedParticles)->JetIndex(2)));
733 result->setModel_lq2_pt(myModelParticles->Parton(3)->Pt());
734 result->setModel_lq2_eta(myModelParticles->Parton(3)->Eta());
735 result->setModel_lq2_phi(myModelParticles->Parton(3)->Phi());
736 result->setModel_lq2_E(myModelParticles->Parton(3)->E());
737 result->setModel_lq2_jetIndex(
738 jet_indices.at((*myPermutedParticles)->JetIndex(3)));
741 result->setModel_Higgs_b1_pt(myModelParticles->Parton(4)->Pt());
742 result->setModel_Higgs_b1_eta(myModelParticles->Parton(4)->Eta());
743 result->setModel_Higgs_b1_phi(myModelParticles->Parton(4)->Phi());
744 result->setModel_Higgs_b1_E(myModelParticles->Parton(4)->E());
745 result->setModel_Higgs_b1_jetIndex(
746 jet_indices.at((*myPermutedParticles)->JetIndex(4)));
748 result->setModel_Higgs_b2_pt(myModelParticles->Parton(5)->Pt());
749 result->setModel_Higgs_b2_eta(myModelParticles->Parton(5)->Eta());
750 result->setModel_Higgs_b2_phi(myModelParticles->Parton(5)->Phi());
751 result->setModel_Higgs_b2_E(myModelParticles->Parton(5)->E());
752 result->setModel_Higgs_b2_jetIndex(
753 jet_indices.at((*myPermutedParticles)->JetIndex(5)));
759 result->setModel_lep_pt(myModelParticles->Electron(0)->Pt());
760 result->setModel_lep_eta(myModelParticles->Electron(0)->Eta());
761 result->setModel_lep_phi(myModelParticles->Electron(0)->Phi());
762 result->setModel_lep_E(myModelParticles->Electron(0)->E());
765 result->setModel_lep_index(
766 electron_indices.at((*myPermutedParticles)->ElectronIndex(0)));
768 result->setModel_lepZ1_pt(myModelParticles->Electron(1)->Pt());
769 result->setModel_lepZ1_eta(myModelParticles->Electron(1)->Eta());
770 result->setModel_lepZ1_phi(myModelParticles->Electron(1)->Phi());
771 result->setModel_lepZ1_E(myModelParticles->Electron(1)->E());
772 result->setModel_lepZ1_index(
773 electron_indices.at((*myPermutedParticles)->ElectronIndex(1)));
775 result->setModel_lepZ2_pt(myModelParticles->Electron(2)->Pt());
776 result->setModel_lepZ2_eta(myModelParticles->Electron(2)->Eta());
777 result->setModel_lepZ2_phi(myModelParticles->Electron(2)->Phi());
778 result->setModel_lepZ2_E(myModelParticles->Electron(2)->E());
779 result->setModel_lepZ2_index(
780 electron_indices.at((*myPermutedParticles)->ElectronIndex(2)));
786 result->setModel_lep_pt(myModelParticles->Muon(0)->Pt());
787 result->setModel_lep_eta(myModelParticles->Muon(0)->Eta());
788 result->setModel_lep_phi(myModelParticles->Muon(0)->Phi());
789 result->setModel_lep_E(myModelParticles->Muon(0)->E());
792 result->setModel_lep_index(
793 muon_indices.at((*myPermutedParticles)->MuonIndex(0)));
795 result->setModel_lepZ1_pt(myModelParticles->Muon(1)->Pt());
796 result->setModel_lepZ1_eta(myModelParticles->Muon(1)->Eta());
797 result->setModel_lepZ1_phi(myModelParticles->Muon(1)->Phi());
798 result->setModel_lepZ1_E(myModelParticles->Muon(1)->E());
799 result->setModel_lepZ1_index(
800 muon_indices.at((*myPermutedParticles)->MuonIndex(1)));
802 result->setModel_lepZ2_pt(myModelParticles->Muon(2)->Pt());
803 result->setModel_lepZ2_eta(myModelParticles->Muon(2)->Eta());
804 result->setModel_lepZ2_phi(myModelParticles->Muon(2)->Phi());
805 result->setModel_lepZ2_E(myModelParticles->Muon(2)->E());
806 result->setModel_lepZ2_index(
807 muon_indices.at((*myPermutedParticles)->MuonIndex(2)));
811 result->setModel_nu_pt(myModelParticles->Neutrino(0)->Pt());
812 result->setModel_nu_eta(myModelParticles->Neutrino(0)->Eta());
813 result->setModel_nu_phi(myModelParticles->Neutrino(0)->Phi());
814 result->setModel_nu_E(myModelParticles->Neutrino(0)->E());
816 result->setModel_b_from_top1_pt(myModelParticles->Parton(0)->Pt());
817 result->setModel_b_from_top1_eta(myModelParticles->Parton(0)->Eta());
818 result->setModel_b_from_top1_phi(myModelParticles->Parton(0)->Phi());
819 result->setModel_b_from_top1_E(myModelParticles->Parton(0)->E());
820 result->setModel_b_from_top1_jetIndex(
821 jet_indices.at((*myPermutedParticles)->JetIndex(0)));
823 result->setModel_b_from_top2_pt(myModelParticles->Parton(1)->Pt());
824 result->setModel_b_from_top2_eta(myModelParticles->Parton(1)->Eta());
825 result->setModel_b_from_top2_phi(myModelParticles->Parton(1)->Phi());
826 result->setModel_b_from_top2_E(myModelParticles->Parton(1)->E());
827 result->setModel_b_from_top2_jetIndex(
828 jet_indices.at((*myPermutedParticles)->JetIndex(1)));
830 result->setModel_lj1_from_top1_pt(myModelParticles->Parton(2)->Pt());
831 result->setModel_lj1_from_top1_eta(myModelParticles->Parton(2)->Eta());
832 result->setModel_lj1_from_top1_phi(myModelParticles->Parton(2)->Phi());
833 result->setModel_lj1_from_top1_E(myModelParticles->Parton(2)->E());
834 result->setModel_lj1_from_top1_jetIndex(
835 jet_indices.at((*myPermutedParticles)->JetIndex(2)));
837 result->setModel_lj2_from_top1_pt(myModelParticles->Parton(3)->Pt());
838 result->setModel_lj2_from_top1_eta(myModelParticles->Parton(3)->Eta());
839 result->setModel_lj2_from_top1_phi(myModelParticles->Parton(3)->Phi());
840 result->setModel_lj2_from_top1_E(myModelParticles->Parton(3)->E());
841 result->setModel_lj2_from_top1_jetIndex(
842 jet_indices.at((*myPermutedParticles)->JetIndex(3)));
844 result->setModel_lj1_from_top2_pt(myModelParticles->Parton(4)->Pt());
845 result->setModel_lj1_from_top2_eta(myModelParticles->Parton(4)->Eta());
846 result->setModel_lj1_from_top2_phi(myModelParticles->Parton(4)->Phi());
847 result->setModel_lj1_from_top2_E(myModelParticles->Parton(4)->E());
848 result->setModel_lj1_from_top2_jetIndex(
849 jet_indices.at((*myPermutedParticles)->JetIndex(4)));
851 result->setModel_lj2_from_top2_pt(myModelParticles->Parton(5)->Pt());
852 result->setModel_lj2_from_top2_eta(myModelParticles->Parton(5)->Eta());
853 result->setModel_lj2_from_top2_phi(myModelParticles->Parton(5)->Phi());
854 result->setModel_lj2_from_top2_E(myModelParticles->Parton(5)->E());
855 result->setModel_lj2_from_top2_jetIndex(
856 jet_indices.at((*myPermutedParticles)->JetIndex(5)));
862 float sumEventProbability(0.), bestEventProbability(0.);
863 size_t bestPermutation(999), iPerm(0);
866 for (
auto x : *resultContainer) {
867 float prob =
x->eventProbability();
868 short minuitDidNotConverge =
x->minuitDidNotConverge();
869 short fitAbortedDueToNaN =
x->fitAbortedDueToNaN();
870 short atLeastOneFitParameterAtItsLimit =
871 x->atLeastOneFitParameterAtItsLimit();
872 short invalidTransferFunctionAtConvergence =
873 x->invalidTransferFunctionAtConvergence();
874 sumEventProbability += prob;
878 if (minuitDidNotConverge)
880 if (fitAbortedDueToNaN)
882 if (atLeastOneFitParameterAtItsLimit)
884 if (invalidTransferFunctionAtConvergence)
887 if (prob > bestEventProbability) {
888 bestEventProbability = prob;
890 bestPermutation = iPerm - 1;
896 for (
auto x : *resultContainer) {
897 x->setEventProbability(
x->eventProbability() / sumEventProbability);
898 if (iPerm == bestPermutation) {
899 x->setBestPermutation(1);
901 x->setBestPermutation(0);
909 std::move(resultAuxContainer), sys));
912 auto bestContainer = std::make_unique<xAOD::KLFitterResultContainer>();
913 auto bestAuxContainer =
914 std::make_unique<xAOD::KLFitterResultAuxContainer>();
915 bestContainer->setStore(bestAuxContainer.get());
917 for (
auto x : *resultContainer) {
918 if (
x->bestPermutation() == 1) {
921 bestContainer->push_back(
result);
925 std::move(bestAuxContainer), sys));
928 return StatusCode::SUCCESS;