ATLAS Offline Software
Loading...
Searching...
No Matches
JetReclusteringTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
3*/
4
7
15
16#include <sstream>
17
18#ifdef ROOTCORE // The macro for RootCore needs these (provides a way of getting around missing dictionaries)
20#include "JetRec/JetRecTool.h"
23#include "JetRec/JetFinder.h"
24#include "JetRec/JetTrimmer.h"
35#endif
36
38 AsgTool(name),
39 m_jetFilterTool("JetFilterTool/JetFilterTool_" + this->name()),
40 m_inputJetFilterTool("JetRecTool/JetRec_InputJetFilterTool_" + this->name()),
41 m_pseudoJetGetterTool("PseudoJetGetter/PseudoJetGetterTool_" + this->name()),
42 m_jetFromPseudoJetTool("JetFromPseudojet/JetFromPseudoJetTool_" + this->name()),
43 m_jetFinderTool("JetFinder/JetFinderTool_" + this->name()),
44 m_reclusterJetTool("JetRecTool/JetRec_JetReclusterTool_" + this->name()),
45 m_trimJetTool("JetRecTool/JetRec_JetTrimTool_" + this->name()),
46 m_effectiveRTool("EffectiveRTool/EffectiveRTool"),
47 m_jetTrimmingTool("JetTrimmer/JetTrimmerTool_" + this->name()),
48 m_jetTrimmingTool_JPJR("JetPseudojetRetriever/JetRec_JetTrimTool_JPJR_" + this->name()),
49 m_jetChargeTool("JetChargeTool/JetChargeTool_" + this->name()),
50 m_jetPullTool("JetPullTool/JetPullTool_" + this->name()),
51 m_energyCorrelatorTool("EnergyCorrelatorTool/EnergyCorrelatorTool_" + this->name()),
52 m_energyCorrelatorRatiosTool("EnergyCorrelatorRatiosTool/EnergyCorrelatorRatiosTool_" + this->name()),
53 m_ktSplittingScaleTool("KTSplittingScaleTool/KTSplittingScaleTool_" + this->name()),
54 m_dipolarityTool("DipolarityTool/DipolarityTool_" + this->name()),
55 m_centerOfMassShapesTool("CenterOfMassShapesTool/CenterOfMassShapesTool_" + this->name()),
56 m_nSubjettinessTool("NSubjettinessTool/NSubjettinessTool_" + this->name())
57{
58
59
60 declareProperty("InputJetContainer", m_inputJetContainer = "");
61 declareProperty("OutputJetContainer", m_outputJetContainer = "");
62 declareProperty("ReclusterRadius", m_radius = 1.0);
63 declareProperty("ReclusterAlgorithm", m_rc_alg = "AntiKt");
64 declareProperty("VariableRMinRadius", m_varR_minR =-1.0);
65 declareProperty("VariableRMassScale", m_varR_mass =-1.0);
66 declareProperty("InputJetPtMin", m_ptMin_input = 25.0);
67 declareProperty("RCJetPtMin", m_ptMin_rc = 50.0);
68 declareProperty("RCJetPtFrac", m_ptFrac = 0.05);
69 declareProperty("RCJetSubjetRadius", m_subjet_radius = 0.2);
70 declareProperty("DoArea", m_doArea = false);
71 declareProperty("AreaAttributes", m_areaAttributes = "ActiveArea ActiveArea4vec");
72
73}
74
77 ATH_MSG_WARNING(m_APP_NAME << " already initialized.");
78 return StatusCode::FAILURE;
79 }
80 ATH_MSG_INFO(m_APP_NAME << " initializing");
81 ATH_MSG_INFO( "Name is " << name());
82
83
84 ATH_MSG_INFO( "... with containers:" );
85 ATH_MSG_INFO( "\tInputJetContainer: " << m_inputJetContainer );
86 ATH_MSG_INFO( "\tOutputJetContainer: " << m_outputJetContainer );
87
88 // set to true, we're calling it now
89 m_isInitialized = true;
90
91 // set up some stuff to use within the initialize()
92 ToolHandleArray<IJetModifier> modArray;
93 ToolHandleArray<IPseudoJetGetter> getterArray;
94
95 // this is for intermediate output containers used between tools
96 std::string filteredInputJetContainer(m_inputJetContainer);
97 if(m_ptMin_input > 0) filteredInputJetContainer = "Filtered_"+name();
98 std::string filteredInputPseudoJetsContainer = "PseudoJets_"+name();
99 std::string reclusteredJetsContainer = "ReclusteredJets_"+name();
100
101 if(m_ptMin_input > 0){
102 ATH_MSG_INFO( "Input Jet Filtering" );
103 ATH_MSG_INFO( "\tPtMin: " << m_ptMin_input*1.e3 << " GeV" );
104 /* initialize input jet filtering */
105 // - create a tool that will filter jets
107 ASG_CHECK(m_jetFilterTool.setProperty("PtMin", m_ptMin_input*1.e3));
108 ASG_CHECK(m_jetFilterTool.setProperty("OutputLevel", msg().level() ) );
109 ASG_CHECK(m_jetFilterTool.retrieve() );
110 modArray.clear();
111 modArray.push_back(m_jetFilterTool.getHandle() );
112 ATH_CHECK(modArray.retrieve() );
113
114 // - create the master tool to filter the input jets
116 ASG_CHECK(m_inputJetFilterTool.setProperty("InputContainer", m_inputJetContainer));
117 ASG_CHECK(m_inputJetFilterTool.setProperty("OutputContainer", filteredInputJetContainer));
118 ASG_CHECK(m_inputJetFilterTool.setProperty("JetModifiers", modArray));
119 /* note: we cannot use shallow copies since we are removing elements from a
120 * container, we need a deep copy as linking will break */
121 ASG_CHECK(m_inputJetFilterTool.setProperty("ShallowCopy", false));
122 ASG_CHECK(m_inputJetFilterTool.setProperty("OutputLevel", msg().level() ) );
124 }
125
126 // only compute area if ptFrac = 0.0 and m_areaAttributes is specified
127 float ghostArea(0.0);
128 std::vector<std::string> areaAttributes;
129 if(m_doArea){
130 ATH_MSG_INFO( "Ghost Area Calculations:" );
131 ATH_MSG_INFO( "\tAreaAttributes: " << m_areaAttributes );
132 ghostArea = 0.01;
133 // split up the m_areaAttributes string specifying which attributes to record
134 std::string token;
135 std::istringstream ss(m_areaAttributes);
136 while(std::getline(ss, token, ' '))
137 areaAttributes.push_back(token);
138 }
139 /* initialize jet reclustering */
140 // - create a PseudoJet builder.
141 ATH_MSG_INFO( "PseudoJet Builder initializing..." );
142 m_pseudoJetGetterTool.setType ("PseudoJetGetter");
143 ASG_CHECK(m_pseudoJetGetterTool.setProperty("InputContainer", filteredInputJetContainer));
144 ASG_CHECK(m_pseudoJetGetterTool.setProperty("OutputContainer", filteredInputPseudoJetsContainer));
145 ASG_CHECK(m_pseudoJetGetterTool.setProperty("Label", "LCTopo"));
146 ASG_CHECK(m_pseudoJetGetterTool.setProperty("SkipNegativeEnergy", true));
147 ASG_CHECK(m_pseudoJetGetterTool.setProperty("GhostScale", 0.0));
148 ASG_CHECK(m_pseudoJetGetterTool.setProperty("OutputLevel", msg().level() ) );
150 getterArray.push_back(m_pseudoJetGetterTool.getHandle());
151 ATH_CHECK(getterArray.retrieve() );
152 // - create a Jet builder
153 ATH_MSG_INFO( "Jet Builder initializing..." );
154 m_jetFromPseudoJetTool.setType ("JetFromPseudojet");
155 ASG_CHECK(m_jetFromPseudoJetTool.setProperty("Attributes", areaAttributes));
156 ASG_CHECK(m_jetFromPseudoJetTool.setProperty("OutputLevel", msg().level() ) );
158 // - create a ClusterSequence Tool
159 ATH_MSG_INFO( "Cluster Sequencer initializing..." );
160 m_jetFinderTool.setType ("JetFinder");
161 ASG_CHECK(m_jetFinderTool.setProperty("JetAlgorithm", m_rc_alg));
162 ASG_CHECK(m_jetFinderTool.setProperty("JetRadius", m_radius));
163 ASG_CHECK(m_jetFinderTool.setProperty("VariableRMinRadius", m_varR_minR));
164 ASG_CHECK(m_jetFinderTool.setProperty("VariableRMassScale", m_varR_mass*1.e3));
165 ASG_CHECK(m_jetFinderTool.setProperty("PtMin", m_ptMin_rc*1.e3));
166 // set ghost area, ignore if trimming is being applied to reclustered jets
167 ASG_CHECK(m_jetFinderTool.setProperty("GhostArea", ghostArea));
168 ASG_CHECK(m_jetFinderTool.setProperty("RandomOption", 1));
169 ASG_CHECK(m_jetFinderTool.setProperty("JetBuilder", m_jetFromPseudoJetTool.getHandle()));
170 ASG_CHECK(m_jetFinderTool.setProperty("OutputLevel", msg().level() ) );
171 ASG_CHECK(m_jetFinderTool.retrieve());
172 // - create list of modifiers.
173 modArray.clear();
174 // we need to calculate effectiveR before trimming, if we are doing variableR
175 m_effectiveRTool.setType ("EffectiveRTool");
176 ATH_CHECK(m_effectiveRTool.retrieve());
177 modArray.push_back(m_effectiveRTool.getHandle() );
178 ATH_CHECK(modArray.retrieve() );
179 // - create our master reclustering tool
180 ATH_MSG_INFO( "Jet Reclusterer initializing..." );
181 m_reclusterJetTool.setType ("JetRecTool");
182 ASG_CHECK(m_reclusterJetTool.setProperty("OutputContainer", reclusteredJetsContainer));
183 ASG_CHECK(m_reclusterJetTool.setProperty("PseudoJetGetters", getterArray));
184 ASG_CHECK(m_reclusterJetTool.setProperty("JetFinder", m_jetFinderTool.getHandle()));
185 ASG_CHECK(m_reclusterJetTool.setProperty("JetModifiers", modArray));
186 ASG_CHECK(m_reclusterJetTool.setProperty("OutputLevel", msg().level() ) );
187 ASG_CHECK(m_reclusterJetTool.retrieve());
188
189 // clear modArray again
190 modArray.clear();
191 // then trim the reclustered jets
192 ATH_MSG_INFO( "Jet Trimmer initializing..." );
193 ATH_MSG_INFO( "\tPtFrac: " << m_ptFrac );
194 ATH_MSG_INFO( "\tRClus: " << m_subjet_radius );
195 m_jetTrimmingTool.setType ("JetTrimmer");
196 ASG_CHECK(m_jetTrimmingTool.setProperty("PtFrac", m_ptFrac));
197 ASG_CHECK(m_jetTrimmingTool.setProperty("RClus", m_subjet_radius));
198 ASG_CHECK(m_jetTrimmingTool.setProperty("JetBuilder", m_jetFromPseudoJetTool.getHandle()));
199 ASG_CHECK(m_jetTrimmingTool.setProperty("OutputLevel", msg().level() ) );
200 ASG_CHECK(m_jetTrimmingTool.retrieve() );
201
202 // because of changes to JetRec, can't rely on them making this tool for us anymore
203 ATH_MSG_INFO( "JetPseudojetRetriever initializing for Jet Trimmer..." );
204 m_jetTrimmingTool_JPJR.setType ("JetPseudojetRetriever");
206
207 // and then apply all other modifiers based on the trimmed reclustered jets
208 ATH_MSG_INFO( "\t... and queuing up various jet modifiers..." );
209
210 m_jetChargeTool.setType ("JetChargeTool");
211 ASG_CHECK(m_jetChargeTool.retrieve());
212 modArray.push_back(m_jetChargeTool.getHandle() );
213
214 m_jetPullTool.setType ("JetPullTool");
215 ASG_CHECK(m_jetPullTool.retrieve());
216 modArray.push_back(m_jetPullTool.getHandle() );
217
218 m_energyCorrelatorTool.setType ("EnergyCorrelatorTool");
220 modArray.push_back(m_energyCorrelatorTool.getHandle() );
221
222 m_energyCorrelatorRatiosTool.setType ("EnergyCorrelatorRatiosTool");
224 modArray.push_back(m_energyCorrelatorRatiosTool.getHandle() );
225
226 m_ktSplittingScaleTool.setType ("KTSplittingScaleTool");
228 modArray.push_back(m_ktSplittingScaleTool.getHandle() );
229
230 m_dipolarityTool.setType ("DipolarityTool");
231 ASG_CHECK(m_dipolarityTool.retrieve());
232 modArray.push_back(m_dipolarityTool.getHandle() );
233
234 m_centerOfMassShapesTool.setType ("CenterOfMassShapesTool");
236 modArray.push_back(m_centerOfMassShapesTool.getHandle() );
237
238 m_nSubjettinessTool.setType ("NSubjettinessTool");
239 ASG_CHECK(m_nSubjettinessTool.retrieve());
240 modArray.push_back(m_nSubjettinessTool.getHandle() );
241 ATH_CHECK(modArray.retrieve() );
242 // finish up the rest of the tool
243
244 m_trimJetTool.setType ("JetRecTool");
245 ASG_CHECK(m_trimJetTool.setProperty("InputContainer", reclusteredJetsContainer));
246 ASG_CHECK(m_trimJetTool.setProperty("OutputContainer", m_outputJetContainer));
247 ASG_CHECK(m_trimJetTool.setProperty("JetModifiers", modArray));
248 ASG_CHECK(m_trimJetTool.setProperty("JetGroomer", m_jetTrimmingTool.getHandle() ));
249 ASG_CHECK(m_trimJetTool.setProperty("JetPseudojetRetriever", m_jetTrimmingTool_JPJR.getHandle()));
250 ASG_CHECK(m_trimJetTool.setProperty("OutputLevel", msg().level() ) );
251 ASG_CHECK(m_trimJetTool.retrieve());
252
253 return StatusCode::SUCCESS;
254}
255
257 int retCode = 0;
258 if(m_ptMin_input > 0) {
259 if ( (retCode = m_inputJetFilterTool->execute() ) != 0) {
260 ATH_MSG_ERROR( "Failure in inputJetFilterTool with return code: " << retCode );
261 return retCode;
262 }
263 }
264 if ( (retCode = m_reclusterJetTool->execute() ) != 0) {
265 ATH_MSG_ERROR( "Failure in reclusterJetTool with return code: " << retCode );
266 return retCode;
267 }
268 if ( (retCode = m_trimJetTool->execute() ) != 0) {
269 ATH_MSG_ERROR( "Failure in trimJetTool with return code: " << retCode );
270 return retCode;
271 }
272 return 0;
273}
274
276 ATH_MSG_INFO("Properties for " << m_APP_NAME << "(" << name() << ")");
277 ATH_MSG_INFO(" InputJetContainer: " << m_inputJetContainer );
278 ATH_MSG_INFO(" OutputJetContainer: " << m_outputJetContainer );
279 ATH_MSG_INFO(" Radius: " << m_radius );
280 ATH_MSG_INFO(" ReclusteringAlgorithm: " << m_rc_alg << " (" << m_rc_alg << ")" );
281 ATH_MSG_INFO(" VariableRMinRadius: " << m_varR_minR );
282 ATH_MSG_INFO(" VariableRMassScale: " << m_varR_mass << " GeV" );
283 ATH_MSG_INFO(" InputJetPtCut: " << m_ptMin_input << " GeV" );
284 ATH_MSG_INFO(" ReclusteredJetPtCut: " << m_ptMin_rc << " GeV" );
285 ATH_MSG_INFO(" ReclusteredJetPtFrac: " << m_ptFrac );
286 ATH_MSG_INFO(" ReclusteredJetSubjetR: " << m_subjet_radius );
287
288 if(m_isInitialized){
289 m_inputJetFilterTool->print();
290 m_reclusterJetTool->print();
291 m_trimJetTool->print();
292 } else {
293 ATH_MSG_INFO(m_APP_NAME << " has not been initialized yet");
294 }
295
296 }
#define ASG_MAKE_ANA_TOOL(handle, type)
create the tool in the given tool handle
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
#define ASG_CHECK(...)
Helper macro for checking the status code returned by a function call.
Definition Check.h:43
static Double_t ss
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
virtual void print() const override
Print the state of the tool.
asg::AnaToolHandle< IJetModifier > m_centerOfMassShapesTool
asg::AnaToolHandle< IJetExecuteTool > m_inputJetFilterTool
virtual StatusCode initialize() override
Dummy implementation of the initialisation function.
virtual int execute() const override
Method to be called for each event.
asg::AnaToolHandle< IJetModifier > m_nSubjettinessTool
asg::AnaToolHandle< IJetExecuteTool > m_reclusterJetTool
asg::AnaToolHandle< IPseudoJetGetter > m_pseudoJetGetterTool
asg::AnaToolHandle< IJetFinder > m_jetFinderTool
asg::AnaToolHandle< IJetFromPseudojet > m_jetFromPseudoJetTool
asg::AnaToolHandle< IJetModifier > m_jetFilterTool
JetReclusteringTool(const std::string &myname)
asg::AnaToolHandle< IJetModifier > m_ktSplittingScaleTool
asg::AnaToolHandle< IJetExecuteTool > m_trimJetTool
asg::AnaToolHandle< IJetGroomer > m_jetTrimmingTool
asg::AnaToolHandle< IJetModifier > m_jetPullTool
asg::AnaToolHandle< IJetModifier > m_jetChargeTool
asg::AnaToolHandle< IJetModifier > m_effectiveRTool
asg::AnaToolHandle< IJetPseudojetRetriever > m_jetTrimmingTool_JPJR
asg::AnaToolHandle< IJetModifier > m_energyCorrelatorRatiosTool
asg::AnaToolHandle< IJetModifier > m_dipolarityTool
asg::AnaToolHandle< IJetModifier > m_energyCorrelatorTool
AsgTool(const std::string &name)
Constructor specifying the tool instance's name.
Definition AsgTool.cxx:58
MsgStream & msg
Definition testRead.cxx:32