20 #include "fastjet/PseudoJet.hh"
21 #include "fastjet/ClusterSequence.hh"
22 #include "fastjet/JetDefinition.hh"
23 #include "fastjet/contrib/SoftDrop.hh"
24 #include "fastjet/tools/Filter.hh"
25 #include "fastjet/contrib/Nsubjettiness.hh"
33 base_class(
t,
n,
p) {}
43 if (m_jetKey.key().empty()) {
44 ATH_MSG_FATAL(
"No jet collection provided for augmentation.");
45 return StatusCode::FAILURE;
49 auto init_dec = [&] (
WDHK&
k ) {
50 k =
k.key() + m_suffix;
51 return k.initialize();
77 if (!m_selectionString.empty()) {
78 ATH_CHECK( initializeParser( m_selectionString ));
82 m_trimmer.emplace(fastjet::JetDefinition(
fastjet::kt_algorithm, m_rclus), fastjet::SelectorPtFractionMin(m_ptfrac));
83 m_softdropper.emplace(m_beta, m_zcut, m_R0);
85 return StatusCode::SUCCESS;
92 if (!
jets.isValid()) {
93 ATH_MSG_ERROR(
"No jet collection with name " << m_jetKey.key() <<
" found in StoreGate!");
94 return StatusCode::FAILURE;
96 unsigned int nJets(
jets->size());
97 std::vector<const xAOD::Jet*> jetToCheck; jetToCheck.clear();
100 if (!m_selectionString.empty()) {
101 std::vector<int>
entries = m_parser->evaluateAsVector();
105 ATH_MSG_ERROR(
"Sizes incompatible! Are you sure your selection string used jets??");
106 return StatusCode::FAILURE;
109 for (
unsigned int i=0;
i<nJets; ++
i)
if (
entries[
i]==1) jetToCheck.push_back((*
jets)[
i]);
112 for (
unsigned int i=0;
i<nJets; ++
i) jetToCheck.push_back((*
jets)[
i]);
116 WDH dec_Qw (m_dec_Qw, ctx);
117 WDH dec_Tau1 (m_dec_Tau1, ctx);
118 WDH dec_Tau2 (m_dec_Tau2, ctx);
119 WDH dec_Tau3 (m_dec_Tau3, ctx);
120 WDH dec_Tau4 (m_dec_Tau4, ctx);
121 WDH dec_Tau21 (m_dec_Tau21, ctx);
122 WDH dec_Tau32 (m_dec_Tau32, ctx);
123 WDH dec_Split12 (m_dec_Split12, ctx);
124 WDH dec_Split23 (m_dec_Split23, ctx);
125 WDH dec_Split34 (m_dec_Split34, ctx);
126 WDH dec_ECF1 (m_dec_ECF1, ctx);
127 WDH dec_ECF2 (m_dec_ECF2, ctx);
128 WDH dec_ECF3 (m_dec_ECF3, ctx);
129 WDH dec_ECF4 (m_dec_ECF4, ctx);
130 WDH dec_C2 (m_dec_C2, ctx);
131 WDH dec_D2 (m_dec_D2, ctx);
132 WDH dec_pT (m_dec_pT, ctx);
133 WDH dec_m (m_dec_m, ctx);
134 WDH dec_NConstits (m_dec_NConstits, ctx);
135 WDH dec_eta (m_dec_eta, ctx);
136 WDH dec_phi (m_dec_phi, ctx);
137 WDH dec_timing (m_dec_timing, ctx);
139 std::vector<const xAOD::IParticle*> mergedGhostConstits;
140 std::vector<const xAOD::IParticle*> ghosts;
141 std::vector<fastjet::PseudoJet> constituents;
146 mergedGhostConstits.clear();
147 for (std::string ghostName: m_ghostNames) {
149 ATH_CHECK(
jet->getAssociatedObjects(ghostName, ghosts));
150 mergedGhostConstits.insert(mergedGhostConstits.end(), ghosts.begin(), ghosts.end());
154 constituents.clear();
157 for (
auto constit : mergedGhostConstits){
158 if (constit==
nullptr) {
163 if (constit->e()<0) {
ATH_MSG_INFO(
"################## Negative energy cluster");
continue;}
164 constituents.push_back( fastjet::PseudoJet(constit->p4()) );
169 double eConstit = caloConstit->
e()* caloConstit->e();
170 time += caloConstit->time()* eConstit;
177 dec_timing(*
jet) = 0;
183 int nConstits = constituents.size();
186 fastjet::PseudoJet groomed_jet;
190 fastjet::PseudoJet recluster_jet = cs.inclusive_jets(0.0).front();
193 if (m_grooming==
"Trimming"){
194 groomed_jet = m_trimmer->result(recluster_jet);
195 }
else if (m_grooming==
"SoftDrop"){
196 groomed_jet = m_softdropper->result(recluster_jet);
198 ATH_MSG_DEBUG(
" No grooming requested or wrong one, will not apply grooming");
199 groomed_jet = recluster_jet;
203 nConstits = groomed_jet.constituents().size();
210 dec_Tau1(*
jet) = -999;
211 dec_Tau2(*
jet) = -999;
212 dec_Tau3(*
jet) = -999;
213 dec_Tau4(*
jet) = -999;
215 dec_Tau21(*
jet) = -999;
216 dec_Tau32(*
jet) = -999;
218 dec_Split12(*
jet) = -999;
219 dec_Split23(*
jet) = -999;
220 dec_Split34(*
jet) = -999;
222 dec_ECF1(*
jet) = -999;
223 dec_ECF2(*
jet) = -999;
224 dec_ECF3(*
jet) = -999;
225 dec_ECF4(*
jet) = -999;
232 dec_NConstits(*
jet) = 0;
233 dec_eta(*
jet) = -999;
234 dec_phi(*
jet) = -999;
236 return StatusCode::SUCCESS;
240 dec_pT(*
jet) = groomed_jet.pt();
241 dec_m(*
jet) = groomed_jet.m();
242 dec_NConstits(*
jet) = nConstits;
243 dec_eta(*
jet) = groomed_jet.eta();
244 dec_phi(*
jet) = groomed_jet.phi() -
M_PI;
248 dec_Qw(*
jet) =
qw.result(groomed_jet);
251 fastjet::contrib::WTA_KT_Axes wta_kt_axes;
252 fastjet::contrib::NormalizedCutoffMeasure normalized_measure(1.0, 1.0, 1000000);
257 float tau1_wta = Tau1_wta.
result(groomed_jet);
258 float tau2_wta = Tau2_wta.
result(groomed_jet);
259 float tau3_wta = Tau3_wta.
result(groomed_jet);
260 float tau4_wta = Tau4_wta.
result(groomed_jet);
261 float tau21_wta = -999;
262 float tau32_wta = -999;
264 if( tau1_wta > 1
e-8 ) {
265 tau21_wta = tau2_wta / tau1_wta;
267 if( tau2_wta > 1
e-8 ) {
268 tau32_wta = tau3_wta / tau2_wta;
271 dec_Tau1(*
jet) = tau1_wta;
272 dec_Tau2(*
jet) = tau2_wta;
273 dec_Tau3(*
jet) = tau3_wta;
274 dec_Tau4(*
jet) = tau4_wta;
275 dec_Tau21(*
jet) = tau21_wta;
276 dec_Tau32(*
jet) = tau32_wta;
282 float split12 = Split12.
result(groomed_jet);
283 float split23 = Split23.
result(groomed_jet);
284 float split34 = Split34.
result(groomed_jet);
286 dec_Split12(*
jet) = split12;
287 dec_Split23(*
jet) = split23;
288 dec_Split34(*
jet) = split34;
295 float ecf1 = ECF1.
result(groomed_jet);
296 float ecf2 = ECF2.
result(groomed_jet);
297 float ecf3 = ECF3.
result(groomed_jet);
298 float ecf4 = ECF4.
result(groomed_jet);
303 c2 = ecf3 * ecf1 /
pow( ecf2, 2.0 );
304 d2 = ecf3 *
pow( ecf1, 3.0 ) /
pow( ecf2, 3.0 );
307 dec_ECF1(*
jet) = ecf1;
308 dec_ECF2(*
jet) = ecf2;
309 dec_ECF3(*
jet) = ecf3;
310 dec_ECF4(*
jet) = ecf4;
316 return StatusCode::SUCCESS;