art-framework-suite / fhicl-cpp

Other
0 stars 3 forks source link

FHiCL C++ interface for multiple choice values #4

Open knoepfel opened 3 years ago

knoepfel commented 3 years ago

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


struct Config {

  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 description
        1               // the value of `unit` if this choice is picked
      },
      {
        Name { "MeV" },                   // the name of the choice
        Comment{ "energies are in MeV" }, // and its description
        2               // the value of `unit` if this choice is picked
      },
      {
        Name { "MJ" },                          // the name of the choice
        Comment{ "energies are in megajoule" }, // and its description
        3               // 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) {
  case 1: break;
  case 2: energy *= 1e-3; break;
  case 3: 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:

knoepfel commented 3 years ago

Comment by @knoepfel on 2019-05-13 15:26:26


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.