You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
I would like to request support in FHiCL C++ interface for multiple choice values.
I am going with an...
Example
Here unit is a configuration parameter of integral type (int) that may represent three choices: GeV (1), MeV (2) and megajoule (3).
Configuration data structure
structConfig {
using Name = fhicl::Name;
using Comment = fhicl::Comment;
using Choices = fhicl::Choices;
fhicl::Atom<double> energy {
Name { "energy" },
Comment { "energy (unit is specified by `unit` parameter)" }
}; // energy
fhicl::Choice<int> unit {
Name { "unit" },
Comment { "energy unit" },
Choices {
{
Name { "GeV" }, // the name of the choice
Comment{ "energies are in GeV" }, // and its description1// the value of `unit` if this choice is picked
},
{
Name { "MeV" }, // the name of the choice
Comment{ "energies are in MeV" }, // and its description2// the value of `unit` if this choice is picked
},
{
Name { "MJ" }, // the name of the choice
Comment{ "energies are in megajoule" }, // and its description3// the value of `unit` if this choice is picked
},
},
1// default: GeV
}; // unit
}; // Config
If the default value is omitted, the parameter is mandatory. Otherwise, its value must match a supported choice, or else a logic_error type of exception will be thrown at run time.
Configuration FHiCL table
energy: 10
unit: "MeV"
Description on console screen
## energy (unit is specified by `unit` parameter)
energy:
## energy unit
## Choose one among:
## "GeV" : energies are in GeV
## "MeV" : energies are in MeV
## "MJ" : energies are in megajoule
unit: "GeV" # default
User code to access the values
double energy = config().energy();
int unit = config().unit();
switch (unit) {
case1: break;
case2: energy *= 1e-3; break;
case3: energy *= JouleToGeV * 1e-6; break;
} // switch
Throws a art::error::Configuration type of art::Exception (or equivalent) if the value is not acceptable.
Bonus points
Additional candies:
works with enum and/or enum class types
can be used in a sequence (fhicl::ChoiceSequence)
choice value converted from name by default (would not work in the example, but if the type is std::string instead of int it will save replicating the Name into the value on each entry
different choices may have the same value (e.g. "MJ" and "megajoule" both supported and associated to the same value 3; if 3 is the default value, it will be written in the description as the first of the matching choices)
The text was updated successfully, but these errors were encountered:
This feature requires a design discussion. Although it seems to be a valuable feature to add, it is not clear to what extent the project:fhicl-cpp package can easily support this. We will get back to you.
This issue has been migrated from https://cdcvs.fnal.gov/redmine/issues/22574 (FNAL account required)
Originally created by @PetrilloAtWork on 2019-05-09 23:09:29
I would like to request support in FHiCL C++ interface for multiple choice values.
I am going with an...
Example
Here
unit
is a configuration parameter of integral type (int
) that may represent three choices: GeV (1
), MeV (2
) and megajoule (3
).Configuration data structure
If the default value is omitted, the parameter is mandatory. Otherwise, its value must match a supported choice, or else a
logic_error
type of exception will be thrown at run time.Configuration FHiCL table
Description on console screen
User code to access the values
Throws a
art::error::Configuration
type ofart::Exception
(or equivalent) if the value is not acceptable.Bonus points
Additional candies:
enum
and/orenum class
typesfhicl::ChoiceSequence
)std::string
instead ofint
it will save replicating theName
into the value on each entry"MJ"
and"megajoule"
both supported and associated to the same value3
; if3
is the default value, it will be written in the description as the first of the matching choices)The text was updated successfully, but these errors were encountered: