29 typedef std::vector<std::pair<std::regex, EDMType> > TypeRegexes;
30 typedef std::vector<std::pair<std::regex, std::string> >
StringRegexes;
34 std::vector<FTagInputConfig> get_input_config(
35 const std::vector<std::string>& variable_names,
36 const TypeRegexes& type_regexes,
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);
47 void rewriteFlipConfig(lwt::GraphConfig&,
const StringRegexes&);
55 std::vector<FTagInputConfig> get_input_config(
56 const std::vector<std::string>& variable_names,
57 const TypeRegexes& type_regexes,
60 std::vector<FTagInputConfig>
inputs;
61 for (
const auto&
var: variable_names) {
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) {
79 std::map<std::string, double> new_defaults;
80 std::set<std::string> moved_defaults;
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;
88 new_defaults[new_name] =
defaults.at(nn_name);
89 moved_defaults.insert(nn_name);
91 replaced_vars.erase(replacement_itr);
94 for (
const auto& new_default: new_defaults) {
95 defaults[new_default.first] = new_default.second;
98 moved_defaults.erase(new_default.first);
101 for (
const auto& moved: moved_defaults) {
106 void rewriteFlipConfig(lwt::GraphConfig&
config,
108 std::string context =
"building negative tag b-btagger";
110 for (
auto&
var:
node.variables) {
113 std::map<std::string, double> new_defaults;
114 for (
auto& pair:
node.defaults) {
117 node.defaults = new_defaults;
119 std::map<std::string, lwt::OutputNodeConfig> new_outputs;
120 for (
auto& pair:
config.outputs) {
123 config.outputs = new_outputs;
133 : track_prefix (
"btagIp_"),
135 track_link_name (
"BTagTrackToJetAssociator"),
137 default_output_value (NAN),
138 invalid_ip_key (
"invalidIp")
156 const std::string& default_flag) {
157 if(default_flag.size() == 0 ||
name==default_flag)
166 throw std::logic_error(
"Unknown EDM type");
178 throw std::logic_error(
"Unknown EDM type");
199 std::string flip_name =
"";
207 flip_name =
"SimpleFlip";
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,
"$&"}
222 return flip_converters;
232 std::vector<FTagInputConfig>,
233 std::vector<ConstituentsInputConfig>,
237 std::map<std::string, std::string> remap_scalar,
245 rewriteFlipConfig(
config, flip_converters);
251 TypeRegexes type_regexes = {
258 {
"(rnnip|iprnn|(?:dips|DIPS)[^_]*)(flip)?_p(b|c|u|tau)"_r,
EDMType::FLOAT},
259 {
"(JetFitter|SV1|JetFitterSecondaryVertex)(Flip)?_[Nn].*"_r,
EDMType::INT},
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"},
281 {
"smt_.*"_r,
"softMuon_isDefaults"},
282 {
"softMuon_.*"_r,
"softMuon_isDefaults"},
283 {
"((log_)?pt|abs_eta|eta|phi|energy|mass)"_r,
""}};
285 std::vector<FTagInputConfig> input_config;
288 remap_inputs(
node.variables, remap_scalar,
node.defaults);
290 std::vector<std::string> input_names;
291 for (
const auto&
var:
node.variables) {
292 input_names.push_back(
var.name);
297 if (!input_config.empty()) {
298 throw std::logic_error(
299 "We don't currently support multiple scalar input nodes");
301 input_config = get_input_config(input_names, type_regexes, default_flag_regexes);
305 std::vector<std::pair<std::string, std::vector<std::string>>> constituent_names;
307 remap_inputs(
node.variables, remap_scalar,
310 std::vector<std::string>
names;
311 for (
const auto&
var:
node.variables) {
317 std::vector<ConstituentsInputConfig> constituent_configs;
318 for (
auto el: constituent_names){
319 constituent_configs.push_back(
326 if (
auto h = remap_scalar.extract(
options.track_prefix)) {
329 if (
auto h = remap_scalar.extract(
options.track_link_name)) {
330 options.track_link_name =
h.mapped();
332 if (
auto h = remap_scalar.extract(
options.invalid_ip_key)) {
333 options.invalid_ip_key =
h.mapped();
336 options.remap_scalar = remap_scalar;
337 options.track_link_type = track_link_type;
338 return std::make_tuple(input_config, constituent_configs,
options);
346 std::vector<internal::VarFromBTag>,
347 std::vector<internal::VarFromJet>,
350 const std::vector<FTagInputConfig>&
inputs)
353 std::vector<internal::VarFromBTag> varsFromBTag;
354 std::vector<internal::VarFromJet> varsFromJet;
361 varsFromBTag.push_back(filler);
365 if (
input.default_flag.size() > 0) {
370 return std::make_tuple(varsFromBTag, varsFromJet, deps);
379 std::map<std::string, internal::OutNodeFloat>,
381 std::set<std::string>>
383 const lwt::GraphConfig&
config,
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;
391 for (
const auto& out_node:
config.outputs) {
392 std::string node_name = out_node.first;
395 for (
const std::string& element: out_node.second.labels) {
396 std::string
name = node_name +
"_" + element;
401 used_remap.insert(
h.key());
406 node.emplace_back(element,
f);
408 decorators[node_name] =
node;
411 return std::make_tuple(decorators, deps, used_remap);
417 std::vector<SG::AuxElement::Decorator<char>>,
419 std::set<std::string>>
422 using namespace internal;
424 std::map<std::string, std::string>
remap =
opts.remap_scalar;
425 std::set<std::string> used_remap;
427 std::function
checker = [](
const Tracks&) ->
char {
return 0;};
429 if (!
opts.invalid_ip_key.empty()) {
430 std::string ip_key =
opts.track_prefix +
opts.invalid_ip_key;
434 if (invalid_check(*trk))
return 1;
440 std::vector<SG::AuxElement::Decorator<char>> default_decs;
441 for (
const auto&
output: gc.outputs) {
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());
448 default_decs.emplace_back(dec_name);
451 return {
checker, default_decs, deps, used_remap};
455 const std::map<std::string, std::string>& requested,
456 const std::set<std::string>&
used)
459 std::set<std::string>
unused;
460 for (
auto [
k,
v]: requested) {
469 throw std::logic_error(
"found unused output remapping(s): " +
outputs);