24 m_leptonType(
"SetMe") {
34 return StatusCode::FAILURE;
40 if (
m_config->bTagWP().size() != 1) {
43 " b-tagging WP - cannot pick b-jets. Please select only 1 WP if you want to use the PseudoTop reconstruction");
52 return StatusCode::SUCCESS;
57 if ((!
event.m_isLoose &&
60 evtStore()->contains<xAOD::PseudoTopResultContainer>(
m_config->sgKeyPseudoTopLoose(
event.m_hashValue)))) {
61 return StatusCode::SUCCESS;
67 pseudoTop->setStore(pseudoTopAuxCont);
72 PseudoTopResult->
IniVar(
true);
84 m_nu_px =
event.m_met->mpx() / 1.e3;
85 m_nu_py =
event.m_met->mpy() / 1.e3;
96 PseudoTopResult->
auxdecor<
float >(
"PseudoTop_Reco_top_lep_eta") =
m_top_lep.Eta();
97 PseudoTopResult->
auxdecor<
float >(
"PseudoTop_Reco_top_lep_phi") =
m_top_lep.Phi();
100 PseudoTopResult->
auxdecor<
float >(
"PseudoTop_Reco_top_had_pt") =
m_top_had.Pt();
101 PseudoTopResult->
auxdecor<
float >(
"PseudoTop_Reco_top_had_eta") =
m_top_had.Eta();
102 PseudoTopResult->
auxdecor<
float >(
"PseudoTop_Reco_top_had_phi") =
m_top_had.Phi();
105 PseudoTopResult->
auxdecor<
float >(
"PseudoTop_Reco_ttbar_pt") =
m_ttbar.Pt();
106 PseudoTopResult->
auxdecor<
float >(
"PseudoTop_Reco_ttbar_eta") =
m_ttbar.Eta();
107 PseudoTopResult->
auxdecor<
float >(
"PseudoTop_Reco_ttbar_phi") =
m_ttbar.Phi();
108 PseudoTopResult->
auxdecor<
float >(
"PseudoTop_Reco_ttbar_m") =
m_ttbar.M();
114 std::string outputSGKey(
"SetMe");
115 if (!
event.m_isLoose) {
118 outputSGKey =
m_config->sgKeyPseudoTopLoose(
event.m_hashValue);
120 std::string outputSGKeyAux = outputSGKey +
"Aux.";
124 if (!
save || !saveAux) {
125 return StatusCode::FAILURE;
129 return StatusCode::SUCCESS;
133 if (
evtStore()->contains<xAOD::PseudoTopResultContainer>(
m_config->sgKeyPseudoTop(0))) {
134 return StatusCode::SUCCESS;
140 pseudoTop->setStore(pseudoTopAuxCont);
145 PseudoTopResult->
IniVar(
false);
163 PseudoTopResult->
auxdecor<
float >(
"PseudoTop_Particle_top_lep_pt") =
m_top_lep.Pt();
164 PseudoTopResult->
auxdecor<
float >(
"PseudoTop_Particle_top_lep_eta") =
m_top_lep.Eta();
165 PseudoTopResult->
auxdecor<
float >(
"PseudoTop_Particle_top_lep_phi") =
m_top_lep.Phi();
166 PseudoTopResult->
auxdecor<
float >(
"PseudoTop_Particle_top_lep_m") =
m_top_lep.M();
168 PseudoTopResult->
auxdecor<
float >(
"PseudoTop_Particle_top_had_pt") =
m_top_had.Pt();
169 PseudoTopResult->
auxdecor<
float >(
"PseudoTop_Particle_top_had_eta") =
m_top_had.Eta();
170 PseudoTopResult->
auxdecor<
float >(
"PseudoTop_Particle_top_had_phi") =
m_top_had.Phi();
171 PseudoTopResult->
auxdecor<
float >(
"PseudoTop_Particle_top_had_m") =
m_top_had.M();
173 PseudoTopResult->
auxdecor<
float >(
"PseudoTop_Particle_ttbar_pt") =
m_ttbar.Pt();
174 PseudoTopResult->
auxdecor<
float >(
"PseudoTop_Particle_ttbar_eta") =
m_ttbar.Eta();
175 PseudoTopResult->
auxdecor<
float >(
"PseudoTop_Particle_ttbar_phi") =
m_ttbar.Phi();
176 PseudoTopResult->
auxdecor<
float >(
"PseudoTop_Particle_ttbar_m") =
m_ttbar.M();
183 std::string outputSGKey =
m_config->sgKeyPseudoTop(0);
184 std::string outputSGKeyAux = outputSGKey +
"Aux.";
188 if (!
save || !saveAux) {
189 return StatusCode::FAILURE;
193 return StatusCode::SUCCESS;
198 m_lepton.SetPtEtaPhiE(
event.m_electrons.at(0)->pt() / 1.e3,
event.m_electrons.at(0)->eta(),
event.m_electrons.at(
199 0)->phi(),
event.m_electrons.at(0)->e() / 1.e3);
202 0)->phi(),
event.m_muons.at(0)->e() / 1.e3);
204 ATH_MSG_ERROR(
" Please supply a valid LeptonType : kElectron or kMuon");
217 0)->phi(), plEvent.
m_muons->
at(0)->e() / 1.e3);
219 ATH_MSG_ERROR(
" Please supply a valid LeptonType : kElectron or kMuon");
229 for (
const auto*
const jetPtr :
event.m_jets) {
230 TLorentzVector helpVec(0, 0, 0, 0);
231 helpVec.SetPtEtaPhiE(jetPtr->pt() / 1.e3, jetPtr->eta(), jetPtr->phi(), jetPtr->e() / 1.e3);
236 const bool hasbTagFlag = jetPtr->isAvailable<
char>(
"isbtagged_" +
out);
239 if (jetPtr->auxdataConst<
char>(
"isbtagged_" +
out) && bCounter < 2) {
258 for (
const auto *jetPtr : *plEvent.
m_jets) {
259 TLorentzVector helpVec(0, 0, 0, 0);
260 helpVec.SetPtEtaPhiE(jetPtr->pt() / 1.e3, jetPtr->eta(), jetPtr->phi(), jetPtr->e() / 1.e3);
262 int nGhosts = jetPtr->auxdata<
int>(
"GhostBHadronsFinalCount");
264 if (nGhosts >= 1 && bCounter < 2) {
274 double bestwmass = 999.e9;
275 TLorentzVector Whelp(0, 0, 0, 0);
293 for (
unsigned int iJet = 0; iJet <
m_lightJets.size(); ++iJet) {
294 for (
unsigned int kJet = 0; kJet <
m_lightJets.size(); ++kJet) {
295 if (iJet == kJet)
continue;
299 if (fabs(
mWPDG - Whelp.M()) < fabs(
mWPDG - bestwmass)) {
301 bestwmass = Whelp.M();
325 double mdiff = 0.5 * (
mWPDG *
mWPDG - l_m * l_m);
328 double a = l_E * l_E - l_pz * l_pz;
329 double b = -2. * l_pz * (mdiff + pT_vl);
330 double c =
m_met_et *
m_met_et * l_E * l_E - mdiff * mdiff - pT_vl * pT_vl - 2. * mdiff * pT_vl;
332 delta =
b *
b - 4. *
a *
c;
338 double v_pz_1 = 0.5 * (-
b - sqrt(delta)) /
a;
339 double v_pz_2 = 0.5 * (-
b + sqrt(delta)) /
a;
341 v_pz = (fabs(v_pz_1) > fabs(v_pz_2)) ? v_pz_2 : v_pz_1;
356 return StatusCode::SUCCESS;