ATLAS Offline Software
DataPrepUtilities.cxx
Go to the documentation of this file.
1 /*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
9 
11 
12 namespace {
13  using namespace FlavorTagDiscriminants;
14 
15  // define a regex literal operator
16  std::regex operator "" _r(const char* c, size_t /* length */) {
17  return std::regex(c);
18  }
19 
23  // ____________________________________________________________________
24  // High level adapter stuff
25  //
26  // We define a few structures to map variable names to type, default
27  // value, etc. These are only used by the high level interface.
28  //
29  typedef std::vector<std::pair<std::regex, EDMType> > TypeRegexes;
30  typedef std::vector<std::pair<std::regex, std::string> > StringRegexes;
31 
32  // Function to map the regular expressions + the list of inputs to a
33  // list of variable configurations.
34  std::vector<FTagInputConfig> get_input_config(
35  const std::vector<std::string>& variable_names,
36  const TypeRegexes& type_regexes,
37  const StringRegexes& default_flag_regexes);
38 
39  // Since the names of the inputs are stored in the NN config, we
40  // also allow some user-configured remapping. Items in replaced_vars
41  // are removed as they are used.
42  void remap_inputs(std::vector<lwt::Input>& nn,
43  std::map<std::string, std::string>& replaced_vars,
44  std::map<std::string, double>& defaults);
45 
46  // replace strings for flip taggers
47  void rewriteFlipConfig(lwt::GraphConfig&, const StringRegexes&);
48 
49 
50  //_______________________________________________________________________
51  // Implementation of the above functions
52  //
53 
54 
55  std::vector<FTagInputConfig> get_input_config(
56  const std::vector<std::string>& variable_names,
57  const TypeRegexes& type_regexes,
58  const StringRegexes& default_flag_regexes)
59  {
60  std::vector<FTagInputConfig> inputs;
61  for (const auto& var: variable_names) {
63  input.name = var;
64  input.type = str::match_first(type_regexes, var, "type matching");
65  input.default_flag = str::sub_first(default_flag_regexes, var,
66  "default matching");
67  inputs.push_back(input);
68  }
69  return inputs;
70  }
71 
72 
73  // do some input variable magic in case someone asked
74  void remap_inputs(std::vector<lwt::Input>& nn,
75  std::map<std::string, std::string>& replaced_vars,
76  std::map<std::string, double>& defaults) {
77  // keep track of the new default values, and which values they
78  // were moved from
79  std::map<std::string, double> new_defaults;
80  std::set<std::string> moved_defaults;
81  for (lwt::Input& input: nn) {
82  std::string nn_name = input.name;
83  auto replacement_itr = replaced_vars.find(nn_name);
84  if (replacement_itr != replaced_vars.end()) {
85  std::string new_name = replacement_itr->second;
86  input.name = new_name;
87  if (defaults.count(nn_name)) {
88  new_defaults[new_name] = defaults.at(nn_name);
89  moved_defaults.insert(nn_name);
90  }
91  replaced_vars.erase(replacement_itr);
92  }
93  }
94  for (const auto& new_default: new_defaults) {
95  defaults[new_default.first] = new_default.second;
96  // if something was a new default we don't want to delete it
97  // below.
98  moved_defaults.erase(new_default.first);
99  }
100  // delete anything that was moved but wasn't assigned to
101  for (const auto& moved: moved_defaults) {
102  defaults.erase(moved);
103  }
104  }
105 
106  void rewriteFlipConfig(lwt::GraphConfig& config,
107  const StringRegexes& res){
108  std::string context = "building negative tag b-btagger";
109  for (auto& node: config.inputs) {
110  for (auto& var: node.variables) {
111  var.name = str::sub_first(res, var.name, context);
112  }
113  std::map<std::string, double> new_defaults;
114  for (auto& pair: node.defaults) {
115  new_defaults[str::sub_first(res, pair.first, context)] = pair.second;
116  }
117  node.defaults = new_defaults;
118  }
119  std::map<std::string, lwt::OutputNodeConfig> new_outputs;
120  for (auto& pair: config.outputs) {
121  new_outputs[str::sub_first(res, pair.first, context)] = pair.second;
122  }
123  config.outputs = new_outputs;
124  }
125 
126 }
127 // __________________________________________________________________________
128 // Start of functions accessible in the FlavorTagDiscriminants namespace
129 
130 namespace FlavorTagDiscriminants {
131 
133  : track_prefix ("btagIp_"),
134  flip (FlipTagConfig::STANDARD),
135  track_link_name ("BTagTrackToJetAssociator"),
136  track_link_type (TrackLinkType::TRACK_PARTICLE),
137  default_output_value (NAN),
138  invalid_ip_key ("invalidIp")
139  {
140  }
141 
142  // ________________________________________________________________________
143  // Internal code
144  namespace internal {
145 
146  // ______________________________________________________________________
147  // Internal utility functions
148  //
149 
150  // The 'get' namespace is for factories that build std::function
151  // objects
152  namespace get {
153  // factory for functions that get variables out of the b-tagging
154  // object
155  VarFromBTag varFromBTag(const std::string& name, EDMType type,
156  const std::string& default_flag) {
157  if(default_flag.size() == 0 || name==default_flag)
158  {
159  switch (type) {
165  default: {
166  throw std::logic_error("Unknown EDM type");
167  }
168  }
169  }
170  else{
171  switch (type) {
172  case EDMType::INT: return BVarGetter<int>(name, default_flag);
173  case EDMType::FLOAT: return BVarGetter<float>(name, default_flag);
174  case EDMType::DOUBLE: return BVarGetter<double>(name, default_flag);
175  case EDMType::CHAR: return BVarGetter<char>(name, default_flag);
176  case EDMType::UCHAR: return BVarGetter<unsigned char>(name, default_flag);
177  default: {
178  throw std::logic_error("Unknown EDM type");
179  }
180  }
181  }
182  }
183  } // end of get namespace
184  } // end of internal namespace
185 
186 
187 
188  // ______________________________________________________________________
189  // High level configuration functions
190  //
191  // Most of the NN code should be a relatively thin wrapper on these
192  // functions.
193 
194  namespace dataprep {
195 
196  // Get the regex which remap the names if we're using flip taggers
198 
199  std::string flip_name = "";
200  if (flip_config == FlipTagConfig::FLIP_SIGN) {
201  flip_name = "Flip";
202  }
203  else if (flip_config == FlipTagConfig::NEGATIVE_IP_ONLY) {
204  flip_name = "Neg";
205  }
206  else if (flip_config == FlipTagConfig::SIMPLE_FLIP) {
207  flip_name = "SimpleFlip";
208  }
209 
210  StringRegexes flip_converters {
211  {"(GN1[^_]*|GN2[^_]*)"_r, "$1" + flip_name},
212  {"(GN1[^_]*|GN2[^_]*)_(.*)"_r, "$1" + flip_name + "_$2"},
213  {"(IP[23]D)_(.*)"_r, "$1Neg_$2"},
214  {"(rnnip|(?:dips|DIPS)[^_]*)_(.*)"_r, "$1flip_$2"},
215  {"(JetFitter|SV1|JetFitterSecondaryVertex)_(.*)"_r, "$1Flip_$2"},
216  {"(rnnip|(?:dips|DIPS)[^_]*)"_r, "$1flip"},
217  {"^(DL1|DL1r[^_]*|DL1rmu|DL1d[^_]*)$"_r, "$1" + flip_name},
218  {"pt|abs_eta|eta"_r, "$&"},
219  {"softMuon.*|smt.*"_r, "$&"}
220  };
221 
222  return flip_converters;
223  }
224 
225  // Translate string config to config objects
226  //
227  // This parses the saved NN configuration structure and translates
228  // informaton encoded as strings into structures and enums to be
229  // consumed by the code that actually constructs the NN.
230  //
231  std::tuple<
232  std::vector<FTagInputConfig>,
233  std::vector<ConstituentsInputConfig>,
234  FTagOptions>
235  createGetterConfig( lwt::GraphConfig& config,
236  FlipTagConfig flip_config,
237  std::map<std::string, std::string> remap_scalar,
238  TrackLinkType track_link_type
239  ){
240 
241  // we rewrite the inputs if we're using flip taggers
242  StringRegexes flip_converters = getNameFlippers(flip_config);
243 
244  if (flip_config != FlipTagConfig::STANDARD) {
245  rewriteFlipConfig(config, flip_converters);
246  }
247 
248  // build the jet inputs
249 
250  // type and default value-finding regexes are hardcoded for now
251  TypeRegexes type_regexes = {
252  {".*_isDefaults"_r, EDMType::CHAR},
253  // TODO: in the future we should migrate RNN and IPxD
254  // variables to floats. This is outside the scope of the
255  // current flavor tagging developments and AFT-438.
256  {"IP[23]D(Neg)?_[pbc](b|c|u|tau)"_r, EDMType::FLOAT},
257  {"SV1(Flip)?_[pbc](b|c|u|tau)"_r, EDMType::FLOAT},
258  {"(rnnip|iprnn|(?:dips|DIPS)[^_]*)(flip)?_p(b|c|u|tau)"_r, EDMType::FLOAT},
259  {"(JetFitter|SV1|JetFitterSecondaryVertex)(Flip)?_[Nn].*"_r, EDMType::INT},
260  {"(JetFitter|SV1|JetFitterSecondaryVertex).*"_r, EDMType::FLOAT},
261  {"(log_)?pt|abs_eta|eta|phi|energy|mass"_r, EDMType::CUSTOM_GETTER},
262  {"softMuon_p[bcu]"_r, EDMType::FLOAT},
263  {"softMuon_.*"_r, EDMType::FLOAT},
264  };
265 
266  StringRegexes default_flag_regexes{
267  {"IP2D_.*"_r, "IP2D_isDefaults"},
268  {"IP2DNeg_.*"_r, "IP2DNeg_isDefaults"},
269  {"IP3D_.*"_r, "IP3D_isDefaults"},
270  {"IP3DNeg_.*"_r, "IP3DNeg_isDefaults"},
271  {"SV1_.*"_r, "SV1_isDefaults"},
272  {"SV1Flip_.*"_r, "SV1Flip_isDefaults"},
273  {"JetFitter_.*"_r, "JetFitter_isDefaults"},
274  {"JetFitterFlip_.*"_r, "JetFitterFlip_isDefaults"},
275  {"JetFitterSecondaryVertex_.*"_r, "JetFitterSecondaryVertex_isDefaults"},
276  {"JetFitterSecondaryVertexFlip_.*"_r, "JetFitterSecondaryVertexFlip_isDefaults"},
277  {"rnnip_.*"_r, "rnnip_isDefaults"},
278  {"((?:dips|DIPS)[^_]*)_.*"_r, "$1_isDefaults"},
279  {"rnnipflip_.*"_r, "rnnipflip_isDefaults"},
280  {"iprnn_.*"_r, ""},
281  {"smt_.*"_r, "softMuon_isDefaults"},
282  {"softMuon_.*"_r, "softMuon_isDefaults"},
283  {"((log_)?pt|abs_eta|eta|phi|energy|mass)"_r, ""}}; // no default for custom cases
284 
285  std::vector<FTagInputConfig> input_config;
286  for (auto& node: config.inputs){
287  // allow the user to remape some of the inputs
288  remap_inputs(node.variables, remap_scalar, node.defaults);
289 
290  std::vector<std::string> input_names;
291  for (const auto& var: node.variables) {
292  input_names.push_back(var.name);
293  }
294 
295  // check to make sure the next line doesn't overwrite something
296  // TODO: figure out how to support multiple scalar input nodes
297  if (!input_config.empty()) {
298  throw std::logic_error(
299  "We don't currently support multiple scalar input nodes");
300  }
301  input_config = get_input_config(input_names, type_regexes, default_flag_regexes);
302  }
303 
304  // build the constituents inputs
305  std::vector<std::pair<std::string, std::vector<std::string>>> constituent_names;
306  for (auto& node: config.input_sequences) {
307  remap_inputs(node.variables, remap_scalar,
308  node.defaults);
309 
310  std::vector<std::string> names;
311  for (const auto& var: node.variables) {
312  names.push_back(var.name);
313  }
314  constituent_names.emplace_back(node.name, names);
315  }
316 
317  std::vector<ConstituentsInputConfig> constituent_configs;
318  for (auto el: constituent_names){
319  constituent_configs.push_back(
320  createConstituentsLoaderConfig(el.first, el.second, flip_config));
321  }
322 
323  // some additional options
325 
326  if (auto h = remap_scalar.extract(options.track_prefix)) {
327  options.track_prefix = h.mapped();
328  }
329  if (auto h = remap_scalar.extract(options.track_link_name)) {
330  options.track_link_name = h.mapped();
331  }
332  if (auto h = remap_scalar.extract(options.invalid_ip_key)) {
333  options.invalid_ip_key = h.mapped();
334  }
335  options.flip = flip_config;
336  options.remap_scalar = remap_scalar;
337  options.track_link_type = track_link_type;
338  return std::make_tuple(input_config, constituent_configs, options);
339  }
340 
341  // Translate configuration to getter functions
342  //
343  // This focuses on the scalar inputs, i.e. the inputs for DL1d,
344  // the code for the track inputs is below.
345  std::tuple<
346  std::vector<internal::VarFromBTag>,
347  std::vector<internal::VarFromJet>,
350  const std::vector<FTagInputConfig>& inputs)
351  {
353  std::vector<internal::VarFromBTag> varsFromBTag;
354  std::vector<internal::VarFromJet> varsFromJet;
355 
356  for (const auto& input: inputs) {
357  if (input.type != EDMType::CUSTOM_GETTER) {
358  auto filler = internal::get::varFromBTag(input.name, input.type,
359  input.default_flag);
360  deps.bTagInputs.insert(input.name);
361  varsFromBTag.push_back(filler);
362  } else {
363  varsFromJet.push_back(getter_utils::namedCustomJetGetter(input.name));
364  }
365  if (input.default_flag.size() > 0) {
366  deps.bTagInputs.insert(input.default_flag);
367  }
368  }
369 
370  return std::make_tuple(varsFromBTag, varsFromJet, deps);
371  }
372 
373 
374  // Translate configuration to setter functions
375  //
376  // This returns the "decorators" that we use to save outputs to
377  // the EDM.
378  std::tuple<
379  std::map<std::string, internal::OutNodeFloat>,
381  std::set<std::string>>
383  const lwt::GraphConfig& config,
384  const FTagOptions& options)
385  {
387  std::map<std::string, internal::OutNodeFloat> decorators;
388  std::map<std::string, std::string> remap = options.remap_scalar;
389  std::set<std::string> used_remap;
390 
391  for (const auto& out_node: config.outputs) {
392  std::string node_name = out_node.first;
393 
395  for (const std::string& element: out_node.second.labels) {
396  std::string name = node_name + "_" + element;
397 
398  // let user rename the output
399  if (auto h = remap.extract(name)){
400  name = h.mapped();
401  used_remap.insert(h.key());
402  }
403  deps.bTagOutputs.insert(name);
404 
406  node.emplace_back(element, f);
407  }
408  decorators[node_name] = node;
409  }
410 
411  return std::make_tuple(decorators, deps, used_remap);
412  }
413 
414  // return a function to check IP validity
415  std::tuple<
416  std::function<char(const internal::Tracks&)>,
417  std::vector<SG::AuxElement::Decorator<char>>,
419  std::set<std::string>>
421  const lwt::GraphConfig& gc, const FTagOptions& opts) {
422  using namespace internal;
424  std::map<std::string, std::string> remap = opts.remap_scalar;
425  std::set<std::string> used_remap;
426  // dummy if there's no invalid check key
427  std::function checker = [](const Tracks&) -> char {return 0;};
428  // if we do have a key, return 1 for invalid
429  if (!opts.invalid_ip_key.empty()) {
430  std::string ip_key = opts.track_prefix + opts.invalid_ip_key;
431  SG::AuxElement::ConstAccessor<char> invalid_check(ip_key);
432  checker = [invalid_check](const Tracks& trs){
433  for (const xAOD::TrackParticle* trk: trs) {
434  if (invalid_check(*trk)) return 1;
435  }
436  return 0;
437  };
438  deps.trackInputs.insert(ip_key);
439  }
440  std::vector<SG::AuxElement::Decorator<char>> default_decs;
441  for (const auto& output: gc.outputs) {
442  std::string basename = output.first;
443  std::string dec_name = basename + "_isDefaults";
444  if (auto h = remap.extract(dec_name)) {
445  dec_name = h.mapped();
446  used_remap.insert(h.key());
447  }
448  default_decs.emplace_back(dec_name);
449  deps.bTagOutputs.insert(dec_name);
450  }
451  return {checker, default_decs, deps, used_remap};
452  }
453 
455  const std::map<std::string, std::string>& requested,
456  const std::set<std::string>& used)
457  {
458  // we want to make sure every remapping was used
459  std::set<std::string> unused;
460  for (auto [k, v]: requested) {
461  if (!used.count(k)) unused.insert(k);
462  }
463  if (unused.size() > 0) {
464  std::string outputs;
465  for (const auto& item: unused) {
466  outputs.append(item);
467  if (item != *unused.rbegin()) outputs.append(", ");
468  }
469  throw std::logic_error("found unused output remapping(s): " + outputs);
470  }
471  }
472  } // end of datapre namespace
473 
474 } // end of FlavorTagDiscriminants namespace
475 
FlavorTagDiscriminants::FlipTagConfig::SIMPLE_FLIP
@ SIMPLE_FLIP
used
BTaggingUtilities.h
beamspotnt.var
var
Definition: bin/beamspotnt.py:1394
BTagTrackIpAccessor.h
FlavorTagDiscriminants::dataprep::createGetterConfig
std::tuple< std::vector< FTagInputConfig >, std::vector< ConstituentsInputConfig >, FTagOptions > createGetterConfig(lwt::GraphConfig &graph_config, FlipTagConfig flip_config, std::map< std::string, std::string > remap_scalar, TrackLinkType track_link_type)
Definition: DataPrepUtilities.cxx:235
python.CaloRecoConfig.f
f
Definition: CaloRecoConfig.py:127
FlavorTagDiscriminants::dataprep::createIpChecker
std::tuple< std::function< char(const internal::Tracks &)>, std::vector< SG::AuxElement::Decorator< char > >, FTagDataDependencyNames, std::set< std::string > > createIpChecker(const lwt::GraphConfig &, const FTagOptions &)
Definition: DataPrepUtilities.cxx:420
FlavorTagDiscriminants::FlipTagConfig::STANDARD
@ STANDARD
FlavorTagDiscriminants
This file contains "getter" functions used for accessing tagger inputs from the EDM.
Definition: AssociationEnums.h:11
FlavorTagDiscriminants::internal::BVarGetterNoDefault
Definition: DataPrepUtilities.h:108
FlavorTagDiscriminants::EDMType
EDMType
Definition: DataPrepUtilities.h:33
FlavorTagDiscriminants::dataprep::StringRegexes
std::vector< std::pair< std::regex, std::string > > StringRegexes
Definition: DataPrepUtilities.h:148
CustomGetterUtils.h
FlavorTagDiscriminants::EDMType::INT
@ INT
xAOD::char
char
Definition: TrigDecision_v1.cxx:38
FlavorTagDiscriminants::FlipTagConfig::NEGATIVE_IP_ONLY
@ NEGATIVE_IP_ONLY
FlavorTagDiscriminants::EDMType::DOUBLE
@ DOUBLE
SG::ConstAccessor
Helper class to provide constant type-safe access to aux data.
Definition: ConstAccessor.h:54
postInclude.inputs
inputs
Definition: postInclude.SortInput.py:15
FlavorTagDiscriminants::dataprep::createDecorators
std::tuple< std::map< std::string, internal::OutNodeFloat >, FTagDataDependencyNames, std::set< std::string > > createDecorators(const lwt::GraphConfig &config, const FTagOptions &options)
Definition: DataPrepUtilities.cxx:382
FlavorTagDiscriminants::FTagDataDependencyNames::bTagInputs
std::set< std::string > bTagInputs
Definition: FTagDataDependencyNames.h:14
config
Definition: PhysicsAnalysis/AnalysisCommon/AssociationUtils/python/config.py:1
PrepareReferenceFile.regex
regex
Definition: PrepareReferenceFile.py:43
FlavorTagDiscriminants::FTagInputConfig
Definition: DataPrepUtilities.h:38
FlavorTagDiscriminants::getter_utils::namedCustomJetGetter
std::function< std::pair< std::string, double >const xAOD::Jet &)> namedCustomJetGetter(const std::string &)
Definition: CustomGetterUtils.cxx:318
FlavorTagDiscriminants::createConstituentsLoaderConfig
ConstituentsInputConfig createConstituentsLoaderConfig(const std::string &name, const std::vector< std::string > &input_variables, FlipTagConfig flip_config)
Definition: ConstituentsLoader.cxx:84
FlavorTagDiscriminants::FTagDataDependencyNames
Definition: FTagDataDependencyNames.h:12
DataPrepUtilities.h
FlavorTagDiscriminants::internal::Tracks
std::vector< const xAOD::TrackParticle * > Tracks
Definition: DataPrepUtilities.h:65
FlavorTagDiscriminants::FTagDataDependencyNames::bTagOutputs
std::set< std::string > bTagOutputs
Definition: FTagDataDependencyNames.h:15
FlavorTagDiscriminants::str::sub_first
std::string sub_first(const StringRegexes &res, const std::string &var_name, const std::string &context)
Definition: PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/Root/StringUtils.cxx:19
SG::Decorator
Helper class to provide type-safe access to aux data.
Definition: Decorator.h:58
FlavorTagDiscriminants::FlipTagConfig::FLIP_SIGN
@ FLIP_SIGN
h
python.subdetectors.mmg.names
names
Definition: mmg.py:8
FlavorTagDiscriminants::EDMType::UCHAR
@ UCHAR
FlavorTagDiscriminants::EDMType::CHAR
@ CHAR
PlotPulseshapeFromCool.input
input
Definition: PlotPulseshapeFromCool.py:106
res
std::pair< std::vector< unsigned int >, bool > res
Definition: JetGroupProductTest.cxx:14
FlavorTagDiscriminants::TrackLinkType
TrackLinkType
Definition: AssociationEnums.h:12
plotIsoValidation.el
el
Definition: plotIsoValidation.py:197
python.AtlRunQueryLib.options
options
Definition: AtlRunQueryLib.py:379
PyPoolBrowser.node
node
Definition: PyPoolBrowser.py:131
python.CreateTierZeroArgdict.outputs
outputs
Definition: CreateTierZeroArgdict.py:189
merge.output
output
Definition: merge.py:17
node::name
void name(const std::string &n)
Definition: node.h:38
FlavorTagDiscriminants::internal::get::varFromBTag
VarFromBTag varFromBTag(const std::string &name, EDMType, const std::string &defaultflag)
Definition: DataPrepUtilities.cxx:155
FlavorTagDiscriminants::dataprep::checkForUnusedRemaps
void checkForUnusedRemaps(const std::map< std::string, std::string > &requested, const std::set< std::string > &used)
Definition: DataPrepUtilities.cxx:454
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
FlavorTagDiscriminants::internal::VarFromBTag
std::function< NamedVar(const SG::AuxElement &)> VarFromBTag
Definition: DataPrepUtilities.h:68
Base_Fragment.defaults
dictionary defaults
This includes now the top quark, the leptons and the bosons.
Definition: GeneratorFilters/share/common/Base_Fragment.py:79
item
Definition: ItemListSvc.h:43
FlavorTagDiscriminants::FTagOptions
Definition: DataPrepUtilities.h:45
FlavorTagDiscriminants::internal::BVarGetter
Definition: DataPrepUtilities.h:79
FlavorTagDiscriminants::FTagOptions::FTagOptions
FTagOptions()
Definition: DataPrepUtilities.cxx:132
python.PyAthena.v
v
Definition: PyAthena.py:157
unused
void unused(Args &&...)
Definition: VP1ExpertSettings.cxx:39
FlavorTagDiscriminants::FTagDataDependencyNames::trackInputs
std::set< std::string > trackInputs
Definition: FTagDataDependencyNames.h:13
FlavorTagDiscriminants::str::match_first
T match_first(const std::vector< std::pair< std::regex, T > > &regexes, const std::string &var_name, const std::string &context)
Definition: PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/StringUtils.h:27
FlavorTagDiscriminants::EDMType::FLOAT
@ FLOAT
remap
std::map< std::string, std::string > remap
list of directories to be explicitly remapped
Definition: hcg.cxx:92
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
get
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
Definition: hcg.cxx:127
FlavorTagDiscriminants::dataprep::createBvarGetters
std::tuple< std::vector< internal::VarFromBTag >, std::vector< internal::VarFromJet >, FTagDataDependencyNames > createBvarGetters(const std::vector< FTagInputConfig > &inputs)
Definition: DataPrepUtilities.cxx:349
FlavorTagDiscriminants::Tracks
std::vector< const xAOD::TrackParticle * > Tracks
Definition: TracksLoader.h:36
xAOD::TrackParticle_v1
Class describing a TrackParticle.
Definition: TrackParticle_v1.h:43
FlavorTagDiscriminants::internal::OutNodeFloat
std::vector< std::pair< std::string, OutputSetterFloat > > OutNodeFloat
Definition: DataPrepUtilities.h:141
FlavorTagDiscriminants::FlipTagConfig
FlipTagConfig
Definition: FlipTagEnums.h:14
athena.opts
opts
Definition: athena.py:86
FlavorTagDiscriminants::dataprep::getNameFlippers
StringRegexes getNameFlippers(const FlipTagConfig &flip_config)
Definition: DataPrepUtilities.cxx:197
python.compressB64.c
def c
Definition: compressB64.py:93
Input
NswErrorCalibData::Input Input
Definition: NswErrorCalibData.cxx:5
FlavorTagDiscriminants::EDMType::CUSTOM_GETTER
@ CUSTOM_GETTER
StringUtils.h
node
Definition: memory_hooks-stdcmalloc.h:74
fitman.k
k
Definition: fitman.py:528
FlavorTagDiscriminants::TrackLinkType::TRACK_PARTICLE
@ TRACK_PARTICLE
dumpTriggerInfo.checker
checker
Definition: dumpTriggerInfo.py:20
beamspotman.basename
basename
Definition: beamspotman.py:640