CASM  1.1.0
A Clusters Approach to Statistical Mechanics
query.cc
Go to the documentation of this file.
1 #include "casm/app/query.hh"
2 
9 #include "casm/casm_io/Log.hh"
11 #include "casm/clex/PrimClex.hh"
15 
16 namespace CASM {
17 
18 namespace Completer {
19 
21 
28 
29  m_desc.add_options()(
30 
31  "columns,k",
32  po::value<std::vector<std::string>>(&m_columns_vec)
33  ->multitoken()
34  ->zero_tokens()
35  ->value_name(ArgHandler::query()),
36  "List of values you want printed as columns")(
37 
38  "json,j",
39  "Print in JSON format (CSV otherwise, unless output extension is "
40  ".json/.JSON)")("verbatim,v",
41  "Print exact properties specified, without prepending "
42  "'name' and 'selected' entries")(
43 
44  "all,a",
45  "Print results all objects in input selection, whether or not they are "
46  "selected.")("no-header,n", "Print without header (CSV only)")(
47 
48  "alias",
49  po::value<std::vector<std::string>>(&m_new_alias_vec)->multitoken(),
50  "Create an alias for a query that will persist within this project. "
51  "Ex: 'casm query --alias is_Ni_dilute = lt(atom_frac(Ni),0.10001)'")(
52 
53  "write-pos",
54  "Write POS file (VASP structure format) for each configuration")(
55 
56  "write-config",
57  "Write config.json file (CASM DoF values format) for each configuration")(
58 
59  "write-structure",
60  "Write structure.json file (CASM structure format) for each "
61  "configuration")(
62 
63  "include-equivalents",
64  "Include an entry for all distinct configurations equivalent by "
65  "supercell symmetry");
66 
67  return;
68 }
69 
70 bool QueryOption::verbatim_flag() const { return vm().count("verbatim"); }
71 
72 const std::vector<std::string> &QueryOption::columns_vec() const {
73  return m_columns_vec;
74 }
75 
76 const std::vector<std::string> &QueryOption::new_alias_vec() const {
77  return m_new_alias_vec;
78 }
79 
80 } // namespace Completer
81 
82 namespace query_impl {
83 
85 void write_pos(Supercell const &supercell, DirectoryStructure const &dir) {
86  write_lat(supercell, dir);
87 }
88 
90 void write_config_json(Supercell const &supercell,
91  DirectoryStructure const &dir) {
92  throw std::runtime_error("--write-config is not supported for supercells");
93 }
94 
96 void write_structure_json(Supercell const &supercell,
97  DirectoryStructure const &dir) {
98  throw std::runtime_error("--write-structure is not supported for supercells");
99 }
100 
101 } // namespace query_impl
102 
103 // -- QueryCommandImplBase --------------------------------------------
104 
107  public:
109 
111 
112  virtual int help() const;
113 
114  virtual int desc() const;
115 
116  virtual int run() const;
117 
118  protected:
120 };
121 
123  : m_cmd(cmd) {}
124 
126  log() << std::endl << m_cmd.opt().desc() << std::endl;
127 
128  log() << "Prints the properties for the objects currently selected in the "
129  "MASTER\n"
130  "selection or the specifed selection file via --selection (-c).\n\n"
131 
132  "Property values are output in column-separated (default) or JSON "
133  "format. By default, \n"
134  "entries for 'name' and 'selected' values are included in the "
135  "output. \n\n"
136 
137  "The type of objects acted on is specified via --type (-t).\n\n";
138 
139  m_cmd.print_names(log());
140  return 0;
141 }
142 
143 int QueryCommandImplBase::desc() const { return help(); }
144 
146  throw CASM::runtime_error("Unknown error in 'casm query'.", ERR_UNKNOWN);
147 }
148 
149 // -- QueryCommandImpl -----------------
150 
158 template <typename DataObject>
160  public:
161  QueryCommandImpl(const QueryCommand &cmd);
162 
163  int help() const override;
164 
165  int desc() const override;
166 
167  int run() const override;
168 
169  private:
170  int _alias() const;
171 
172  void _write_pos() const;
173 
174  void _write_config_json() const;
175 
176  void _write_structure_json() const;
177 
178  int _query() const;
179 
180  int _count(std::string s) const { return m_cmd.vm().count(s); }
181 
182  const fs::path &_selection_path() const {
183  return m_cmd.opt().selection_path();
184  }
185 
186  const std::vector<std::string> &_columns_vec() const {
187  return m_cmd.opt().columns_vec();
188  }
189 
190  std::vector<std::string> _all_columns() const;
191 
192  fs::path _output_path() const { return m_cmd.opt().output_path(); }
193 
194  bool _write_json() const;
195 
196  bool _write_gz() const;
197 
199  return m_query_dict;
200  }
201 
203  return m_query_dict;
204  }
205 
206  std::string _sel_str() const { return m_data.sel_str(); }
207 
208  double _sel_size() const { return m_data.sel_size(); }
209 
210  DB::Selection<DataObject> &_sel(Index i = 0) { return m_data.sel(i); }
211 
212  const DB::Selection<DataObject> &_sel(Index i = 0) const {
213  return m_data.sel(i);
214  }
215 
216  private:
217  // access default dictionary and selections
219 
221 };
222 
223 template <typename DataObject>
226 
227 template <>
230  typedef Configuration DataObject;
232  // query_dict.insert(QueryIO::permute_scel_factor_group_op<QueryData<DataObject>>());
234  query_dict.insert(
237 }
238 
239 template <typename DataObject>
241  : QueryCommandImplBase(cmd), m_data(cmd) {
242  // construct query data formatter
243  for (auto const &formatter : m_data.dict()) {
244  m_query_dict.insert(
246  formatter));
247  }
249 }
250 
251 template <typename DataObject>
253  if (!m_cmd.opt().help_opt_vec().size()) {
255  }
256 
257  log() << "Prints the properties for the objects currently selected in the "
258  "MASTER\n"
259  "selection or the specifed selection file.\n\n"
260 
261  "Property values are output in column-separated (default) or JSON "
262  "format. By default, \n"
263  "entries for 'name' and 'selected' values are included in the "
264  "output. \n\n";
265 
266  for (const std::string &str : m_cmd.opt().help_opt_vec()) {
267  if (str.empty()) {
268  continue;
269  }
270 
271  if (str[0] == 'o') {
272  log() << "Available operators for use within queries:" << std::endl;
273  _dict().print_help(log(), DatumFormatterClass::Operator);
274  } else if (str[0] == 'p') {
275  log() << "Available property tags are currently:" << std::endl;
276  _dict().print_help(log(), DatumFormatterClass::Property);
277  }
278  log() << std::endl;
279  }
280  log() << std::endl;
281  return 0;
282 }
283 
284 template <typename DataObject>
286  return help();
287 }
288 
289 template <typename DataObject>
291  if (_count("columns")) {
292  return _query();
293 
294  } else if (_count("alias")) {
295  return _alias();
296 
297  } else if (_count("write-pos") || _count("write-config") ||
298  _count("write-structure")) {
299  if (_count("write-pos")) _write_pos();
300  if (_count("write-config")) _write_config_json();
301  if (_count("write-structure")) _write_structure_json();
302 
303  return 0;
304  }
305 
306  throw runtime_error("unknown error in 'casm query'", ERR_UNKNOWN);
307 }
308 
309 template <typename DataObject>
311  ProjectSettings &set = m_cmd.primclex().settings();
312 
313  // get user input
314  std::string new_alias_str;
315  for (auto const &substr : m_cmd.opt().new_alias_vec()) {
316  new_alias_str += substr;
317  }
318 
319  // parse new_alias_str to create formatter
320  auto it = std::find(new_alias_str.cbegin(), new_alias_str.cend(), '=');
321  std::string alias_name =
322  boost::trim_copy(std::string(new_alias_str.cbegin(), it));
323  std::string alias_command =
324  boost::trim_copy(std::string(++it, new_alias_str.cend()));
325 
326  try {
327  set.set_query_alias(traits<DataObject>::name, alias_name, alias_command);
328  commit(set);
329  return 0;
330  } catch (std::runtime_error &e) {
331  err_log() << "Unable to learn alias\n"
332  << " \"" << alias_name << " = " << alias_command << "\"\n"
333  << e.what() << std::endl;
334  return ERR_UNKNOWN;
335  }
336 }
337 
338 template <typename DataObject>
340  using namespace query_impl;
341  for (const auto &obj : _sel().selected()) {
342  write_pos(obj, m_cmd.primclex().dir());
343  }
344 }
345 
346 template <typename DataObject>
348  using namespace query_impl;
349  for (const auto &obj : _sel().selected()) {
350  write_config_json(obj, m_cmd.primclex().dir());
351  }
352 }
353 
354 template <typename DataObject>
356  using namespace query_impl;
357  for (const auto &obj : _sel().selected()) {
358  write_structure_json(obj, m_cmd.primclex().dir());
359  }
360 }
361 
362 namespace {
363 bool _check_gz(fs::path p) {
364  if (p.extension() == ".gz" || p.extension() == ".GZ") {
365  return true;
366  }
367  return false;
368 }
369 
370 bool _check_json(fs::path p) {
371  if (p.extension() == ".json" || p.extension() == ".JSON") {
372  return true;
373  }
374  return false;
375 }
376 } // namespace
377 
378 template <typename DataObject>
380  jsonParser &json, PrimClex const &primclex,
381  DataObject const &object) {
382  std::stringstream msg;
383  msg << "Error in `casm query`: --include-equivalents not valid for type '"
385  throw std::runtime_error(msg.str());
386 }
387 
388 template <>
390  jsonParser &json, PrimClex const &primclex,
391  Configuration const &object) {
392  bool include_equivalents = true;
393  ConfigEnumByPermutation enumerator{object};
395  for (auto const &configuration : enumerator) {
396  QueryData<Configuration> data{primclex, configuration, include_equivalents,
397  equivalent_index, &enumerator.sym_op()};
398  json.push_back(formatter(data));
400  }
401 }
402 
403 template <typename DataObject>
405  std::ostream &stream, PrimClex const &primclex,
406  DataObject const &object) {
407  std::stringstream msg;
408  msg << "Error in `casm query`: --include-equivalents not valid for type '"
410  throw std::runtime_error(msg.str());
411 }
412 
413 template <>
415  std::ostream &stream, PrimClex const &primclex,
416  Configuration const &object) {
417  bool include_equivalents = true;
419  ConfigEnumByPermutation enumerator{object};
420  for (auto const &configuration : enumerator) {
421  QueryData<Configuration> data{primclex, configuration, include_equivalents,
422  equivalent_index, &enumerator.sym_op()};
423  stream << formatter(data);
425  }
426 }
427 
428 template <typename DataObject>
430  // WARNING: Valgrind has found some initialization/read errors in this block,
431  // but unable to diagnose exact problem
432 
433  bool include_equivalents = _count("include-equivalents");
434 
435  // set output_stream: where the query results are written
436  std::unique_ptr<std::ostream> uniq_fout;
437  std::ostream &output_stream = make_ostream_if(
438  _count("output"), log(), uniq_fout, _output_path(), _write_gz());
439  output_stream << FormatFlag(output_stream).print_header(!_count("no-header"));
440 
441  // set status_log: where query settings and PrimClex initialization messages
442  // are sent
443  Log *status_log_ptr =
444  (_output_path().string() == "STDOUT") ? &err_log() : &log();
445  if (!status_log_ptr)
446  throw std::runtime_error("Unable to resolve default status log.");
447  Log &status_log(*status_log_ptr);
448  if (_output_path().string() == "STDOUT") {
449  log().set_verbosity(0);
450  }
451 
452  // Print info
453  status_log << "Print:"
454  << std::endl; // ***This line, from Valgrind: conditional depends
455  // on unitialized value
456  for (int p = 0; p < _columns_vec().size(); p++) {
457  status_log << " - " << _columns_vec()[p]
458  << std::endl; // **This line, from Valgrind: invalid read
459  }
460  if (_count("output")) {
461  if (_output_path().string() == "STDOUT") {
462  status_log << "to " << _output_path() << std::endl;
463  } else {
464  status_log << "to " << fs::absolute(_output_path()) << std::endl;
465  }
466  }
467  status_log << std::endl;
468 
470  _dict().parse(_all_columns());
471 
472  auto begin = _count("all") ? _sel().all().begin() : _sel().selected().begin();
473  auto end = _count("all") ? _sel().all().end() : _sel().selected().end();
474 
475  if (_write_json()) {
476  jsonParser json = jsonParser::array();
477  for (auto it = begin; it != end; ++it) {
478  if (include_equivalents) {
479  _query_equivalents(formatter, json, m_cmd.primclex(), *it);
480  } else {
481  QueryData<DataObject> data{m_cmd.primclex(), *it};
482  json.push_back(formatter(data));
483  }
484  }
485  output_stream << json;
486  } else { // write CSV
487  for (auto it = begin; it != end; ++it) {
488  if (include_equivalents) {
489  _query_equivalents(formatter, output_stream, m_cmd.primclex(), *it);
490  } else {
491  QueryData<DataObject> data{m_cmd.primclex(), *it};
492  output_stream << formatter(data);
493  }
494  }
495  }
496 
497  if (!uniq_fout) {
498  status_log << "\n -Output printed to terminal, since no output file "
499  "specified-\n";
500  }
501  status_log << " DONE." << std::endl << std::endl;
502  return 0;
503 }
504 
505 template <typename DataObject>
506 std::vector<std::string> QueryCommandImpl<DataObject>::_all_columns() const {
507  // Construct DataFormatter
508  std::vector<std::string> all_columns;
509  if (!m_cmd.opt().verbatim_flag()) {
510  all_columns.push_back("name");
511  /*all_columns.push_back("alias_or_name");*/
512  all_columns.push_back("selected");
513  }
514  if (_count("include-equivalents")) {
515  all_columns.push_back("equivalent_index");
516  // all_columns.push_back("permute_scel_factor_group_op");
517  all_columns.push_back("permute_factor_group_op");
518  all_columns.push_back("permute_factor_group_op_desc");
519  all_columns.push_back("permute_translation");
520  }
521  all_columns.insert(all_columns.end(), _columns_vec().begin(),
522  _columns_vec().end());
523  return all_columns;
524 }
525 
526 template <typename DataObject>
528  if (_count("json")) {
529  return true;
530  }
531  // Checks for: X.json.gz / X.json / X.gz (also accepts .JSON or .GZ)
532  else if (_check_gz(_output_path())) {
533  return _check_json(_output_path().stem());
534  } else {
535  return _check_json(_output_path());
536  }
537 }
538 
539 template <typename DataObject>
541  if (m_cmd.opt().gzip_flag()) {
542  return true;
543  }
544  // Checks for: X.json.gz / X.json / X.gz (also accepts .JSON or .GZ)
545  else {
546  return _check_gz(_output_path());
547  }
548 }
549 
550 // -- class QueryCommand ----------------------------------------------------
551 
552 const std::string QueryCommand::name = "query";
553 
556  : APICommand<Completer::QueryOption>(_args, _opt) {}
557 
559 
561  if (!in_project()) {
562  err_log().error("No casm project found");
563  err_log() << std::endl;
564  return ERR_NO_PROJ;
565  }
566 
567  std::string cmd;
568  std::vector<std::vector<std::string>> allowed_cmd = {
569  {"alias"}, {"columns"}, {"write-pos", "write-config", "write-structure"}};
570 
571  Index num_cmd(0);
572  std::vector<bool> requested(3, false);
573  for (int i = 0; i < allowed_cmd.size(); ++i) {
574  for (auto const &option : allowed_cmd[i]) {
575  if (vm().count(option)) {
576  requested[i] = true;
577  }
578  }
579  if (requested[i]) {
580  num_cmd++;
581  }
582  }
583 
584  if (num_cmd != 1) {
585  err_log() << "Error in 'casm query'. Only the following combinations of "
586  "options are allowed: \n "
587  << "1) -k/--columns \n"
588  << "2) --alias" << allowed_cmd << std::endl;
589  return ERR_INVALID_ARG;
590  }
591  return 0;
592 }
593 
594 int QueryCommand::help() const { return impl().help(); }
595 
596 int QueryCommand::desc() const { return impl().desc(); }
597 
598 int QueryCommand::run() const { return impl().run(); }
599 
601  if (!m_impl) {
602  if (in_project()) {
603  if (!opt().db_type_opts().count(opt().db_type())) {
604  std::stringstream msg;
605  msg << "--type " << opt().db_type() << " is not allowed for 'casm "
606  << name << "'.";
607  print_names(err_log());
608  throw CASM::runtime_error(msg.str(), ERR_INVALID_ARG);
609  }
610 
611  DB::for_type_short(opt().db_type(),
613  } else {
614  m_impl = notstd::make_unique<QueryCommandImplBase>(*this);
615  }
616  }
617  return *m_impl;
618 }
619 
620 void QueryCommand::print_names(std::ostream &sout) const {
621  sout << "The allowed types are:\n";
622 
623  for (const auto &db_type : opt().db_type_opts()) {
624  sout << " " << db_type << std::endl;
625  }
626 }
627 
628 } // namespace CASM
std::set< std::string > & s
#define ERR_NO_PROJ
Definition: errors.hh:13
#define ERR_UNKNOWN
Definition: errors.hh:10
#define ERR_INVALID_ARG
Definition: errors.hh:7
bool in_project() const
Definition: APICommand.cc:15
const OptionType & opt() const
Definition: APICommand.hh:61
const po::variables_map & vm() const
Definition: APICommand.hh:59
static std::string query()
Get value_type string for query completion.
Definition: Handlers.cc:62
const po::options_description & desc()
Get the program options, filled with the initialized values.
Definition: Handlers.cc:321
po::variables_map & vm()
Get the variables map.
Definition: Handlers.cc:310
po::options_description m_desc
Definition: Handlers.hh:260
void add_db_type_suboption(std::string _default, std::set< std::string > _configtype_opts)
Definition: Handlers.cc:536
void add_general_help_suboption()
Add a smart –help suboption that takes "properties" or "operators".
Definition: Handlers.cc:567
void add_selection_suboption(const fs::path &_default="MASTER")
Add –selection suboption (defaults to MASTER)
Definition: Handlers.cc:407
void add_output_suboption()
Add a –output suboption. Expects to allow "STDOUT" to print to screen.
Definition: Handlers.cc:626
std::vector< std::string > m_columns_vec
Definition: Handlers.hh:951
const fs::path & selection_path() const
Returns the string corresponding to add_config_suboption()
Definition: Handlers.cc:338
void initialize() override
Fill in the options descriptions accordingly.
Definition: query.cc:22
bool verbatim_flag() const
Definition: query.cc:70
std::string db_type() const
Definition: Handlers.cc:555
const std::vector< std::string > & new_alias_vec() const
Definition: query.cc:76
const std::vector< std::string > & columns_vec() const
Definition: query.cc:72
std::vector< std::string > m_new_alias_vec
Definition: Handlers.hh:953
const fs::path output_path() const
Returns the path corresponding to add_output_suboption()
Definition: Handlers.cc:370
Enumerate all equivalent Configurations obtained by permuations in a Supercell.
ConfigInsertResult insert(bool primitive_only=false) const
Insert this configuration (in primitive & canonical form) in the database.
Parsing dictionary for constructing a DataFormatter<DataObject> object.
Extract data from objects of 'DataObject' class.
Specification of CASM project directory structure.
bool print_header() const
Definition: FormatFlag.hh:31
Definition: Log.hh:48
void set_verbosity(int _verbosity)
Definition: Log.cc:57
void error(const std::string &what)
Definition: Log.hh:129
PrimClex is the top-level data structure for a CASM project.
Definition: PrimClex.hh:55
void set_query_alias(query_alias_map_type const &_query_alias)
int run() const override
Definition: query.cc:598
QueryCommandImplBase & impl() const
Definition: query.cc:600
static const std::string name
Definition: query.hh:61
std::unique_ptr< QueryCommandImplBase > m_impl
Definition: query.hh:82
int help() const override
Definition: query.cc:594
QueryCommand(const CommandArgs &_args, Completer::QueryOption &_opt)
Definition: query.cc:554
int vm_count_check() const override
Definition: query.cc:560
int desc() const override
Definition: query.cc:596
void print_names(std::ostream &sout) const
Definition: query.cc:620
Defaults used if DataObject type doesn't matter or not given.
Definition: query.cc:106
virtual int desc() const
Definition: query.cc:143
virtual int help() const
Definition: query.cc:125
const QueryCommand & m_cmd
Definition: query.cc:119
virtual ~QueryCommandImplBase()
Definition: query.cc:110
QueryCommandImplBase(const QueryCommand &cmd)
Definition: query.cc:122
virtual int run() const
Definition: query.cc:145
std::string _sel_str() const
Definition: query.cc:206
DataFormatterDictionary< QueryData< DataObject > > m_query_dict
Definition: query.cc:220
void _write_config_json() const
Definition: query.cc:347
DB::InterfaceData< DataObject > m_data
Definition: query.cc:218
const std::vector< std::string > & _columns_vec() const
Definition: query.cc:186
fs::path _output_path() const
Definition: query.cc:192
DB::Selection< DataObject > & _sel(Index i=0)
Definition: query.cc:210
int help() const override
Definition: query.cc:252
QueryCommandImpl(const QueryCommand &cmd)
Definition: query.cc:240
const DB::Selection< DataObject > & _sel(Index i=0) const
Definition: query.cc:212
int run() const override
Definition: query.cc:290
void _write_structure_json() const
Definition: query.cc:355
const fs::path & _selection_path() const
Definition: query.cc:182
const DataFormatterDictionary< QueryData< DataObject > > & _dict() const
Definition: query.cc:202
void _write_pos() const
Definition: query.cc:339
double _sel_size() const
Definition: query.cc:208
std::vector< std::string > _all_columns() const
Definition: query.cc:506
int _count(std::string s) const
Definition: query.cc:180
int desc() const override
Definition: query.cc:285
int _alias() const
Definition: query.cc:310
int _query() const
Definition: query.cc:429
bool _write_gz() const
Definition: query.cc:540
bool _write_json() const
Definition: query.cc:527
DataFormatterDictionary< QueryData< DataObject > > & _dict()
Definition: query.cc:198
Represents a supercell of the primitive parent crystal structure.
Definition: Supercell.hh:51
static jsonParser array()
Returns an empty json array.
Definition: jsonParser.hh:409
std::ostream & make_ostream_if(bool output, std::ostream &sout, std::unique_ptr< std::ostream > &fout, fs::path out_path, bool gzip)
Return a reference to proper std::ostream.
void commit(ProjectSettings const &set)
jsonParser & push_back(const T &value, Args &&... args)
Definition: jsonParser.hh:684
GenericDatumFormatter< bool, ConfigEnumDataType > selected()
void for_type_short(std::string short_name, F f)
const std::set< std::string > & types_short()
std::set of all QueryTraits<DataObject>::short_name
Generic1DDatumFormatter< Eigen::Vector3l, QueryDataType > permute_translation()
Definition: QueryIO_impl.hh:90
GenericDatumFormatter< Index, QueryDataType > equivalent_index()
Definition: QueryIO_impl.hh:39
GenericDatumFormatter< std::string, QueryDataType > permute_factor_group_op_desc()
Description of permute factor group operation in the prim factor group.
Definition: QueryIO_impl.hh:73
GenericDatumFormatter< Index, QueryDataType > permute_factor_group_op()
Definition: QueryIO_impl.hh:60
void write_config_json(Supercell const &supercell, DirectoryStructure const &dir)
For 'write_config_json' with Supercell use 'write_lat'.
Definition: query.cc:90
void write_pos(Supercell const &supercell, DirectoryStructure const &dir)
For 'write_pos' with Supercell use 'write_lat'.
Definition: query.cc:85
void write_structure_json(Supercell const &supercell, DirectoryStructure const &dir)
For 'write_config_json' with Supercell use 'write_lat'.
Definition: query.cc:96
Main CASM namespace.
Definition: APICommand.hh:8
Log & log()
Definition: Log.hh:424
void _query_equivalents(DataFormatter< QueryData< DataObject >> &formatter, jsonParser &json, PrimClex const &primclex, DataObject const &object)
Definition: query.cc:379
void _update_query_dict(DataFormatterDictionary< QueryData< DataObject >> &query_dict)
Definition: query.cc:224
void write_lat(Supercell const &supercell, DirectoryStructure const &dir)
Definition: clex_io.cc:22
DatumFormatterAdapter< ExternalType, InternalType > make_datum_formatter_adapter(BaseDatumFormatter< InternalType > const &_base_formatter)
Iterator find(Iterator begin, Iterator end, const T &value, BinaryCompare q)
Equivalent to std::find(begin, end, value), but with custom comparison.
Definition: algorithm.hh:16
std::string help()
Uses 'multiline_help<T>()' by default.
Definition: Help.hh:22
void _update_query_dict< Configuration >(DataFormatterDictionary< QueryData< Configuration >> &query_dict)
Definition: query.cc:228
INDEX_TYPE Index
For long integer indexing:
Definition: definitions.hh:39
Log & err_log()
Definition: Log.hh:426
PrimClex * primclex
Definition: settings.cc:135
DirectoryStructure const & dir
Definition: settings.cc:136
ProjectSettings & set
Definition: settings.cc:137
Data structure holding basic CASM command info.
PrimClex const & primclex
Provides access to project data.
Definition: QueryIO.hh:31