Project
Loading...
Searching...
No Matches
GRPTool.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
12#include <boost/program_options.hpp>
13#include <cstdlib>
14#include <string>
19#include <fairlogger/Logger.h>
20#include <TFile.h>
24#include <SimConfig/SimConfig.h>
25#include <unordered_map>
26#include <filesystem>
30
31//
32// Created by Sandro Wenzel on 20.06.22.
33//
34
35// A utility to create/edit GRP objects for MC
36
37enum class GRPCommand {
38 kNONE,
39 kCREATE,
40 kANCHOR,
45};
46
47// CCDB host, overridable via ALICEO2_CCDB_HOST as the CCDB test suites do.
48// Without it this tool always contacts alice-ccdb.cern.ch, which CcdbApi flags
49// as needing an alien token -- fatal in CI, where CCDB is reached through a
50// local proxy instead.
51namespace
52{
53std::string defaultCCDBHost()
54{
55 const char* host = std::getenv("ALICEO2_CCDB_HOST");
56 return (host && *host) ? std::string(host) : std::string("http://alice-ccdb.cern.ch");
57}
58} // namespace
59
60// options struct filled from command line
61struct Options {
62 std::vector<std::string> readout;
63 std::vector<std::string> skipreadout;
64 int run; // run number
65 int orbitsPerTF = 256; // number of orbits per timeframe --> used to calculate start orbit for collisions
67 std::string grpfilename = ""; // generic filename placeholder used by various commands
68 std::vector<std::string> continuous = {};
69 std::vector<std::string> triggered = {};
70 bool clearRO = false;
71 std::string outprefix = "";
72 std::string fieldstring = "";
73 std::string bcPatternFile = "";
74 bool print = false; // whether to print outcome of GRP operation
75 bool lhciffromccdb = false; // whether only to take GRPLHCIF from CCDB
76 std::string publishto = "";
77 std::string ccdbhost = defaultCCDBHost();
78 bool isRun5 = false; // whether or not this is supposed to be a Run5 detector configuration
79 std::string vertex = "ccdb";
80 std::string configKeyValues = "";
81 uint64_t timestamp = 0;
82 std::string detectorList; // detector layout
83};
84
85namespace
86{
87class CCDBHelper
88{
89 public:
90 CCDBHelper(Options const& opts)
91 {
92 api.init(opts.ccdbhost);
93 auto soreor = o2::ccdb::BasicCCDBManager::getRunDuration(api, opts.run);
94 runStart = soreor.first;
95 runEnd = soreor.second;
96 if (opts.timestamp > 0) {
97 timestamp = opts.timestamp;
98 } else {
99 timestamp = runStart;
100 }
101 }
103 uint64_t runStart = -1;
104 uint64_t runEnd = -1;
105 uint64_t timestamp = -1;
106};
107} // namespace
108
109// a simple reusable CCDB wrapper; caching some info across functions
110std::unique_ptr<CCDBHelper> gCCDBWrapper;
111
112void print_globalHelp(int argc, char* argv[])
113{
114 std::cout << "** A GRP utility **\n\n";
115 std::cout << "Usage: " << argv[0] << " subcommand [sub-command-options]\n";
116 std::cout << "\n";
117 std::cout << "The following subcommands are available:\n";
118 std::cout << "\t createGRPs : Create baseline GRP objects/file\n";
119 std::cout << "\t anchorGRPs : Fetch GRP objects from CCDB based on run number\n";
120 std::cout << "\t print_GRPECS : print a GRPECS object/file\n";
121 std::cout << "\t print_GRPMAG : print a GRPMagField object/file\n";
122 std::cout << "\t print_GRPLHC : print a GRPLHCIF object/file\n";
123 std::cout << "\t setROMode : modify/set readoutMode in a GRPECS file\n";
124 std::cout << "\n";
125 std::cout << "Sub-command options can be seen with subcommand --help\n";
126}
127
128namespace
129{
130template <typename T>
131void printGRP(std::string const& filename, std::string const& objtype)
132{
133 std::cout << "\nPrinting " << objtype << " from file " << filename << "\n\n";
134 auto grp = T::loadFrom(filename);
135 if (grp) {
136 grp->print();
137 delete grp;
138 } else {
139 std::cerr << "Error loading " << objtype << " objects from file " << filename << "\n";
140 }
141}
142} // namespace
143
144void printGRPECS(std::string const& filename)
145{
146 printGRP<o2::parameters::GRPECSObject>(filename, "GRPECS");
147}
148
149void printGRPMAG(std::string const& filename)
150{
151 printGRP<o2::parameters::GRPMagField>(filename, "GRPMAG");
152}
153
154void printGRPLHC(std::string const& filename)
155{
156 printGRP<o2::parameters::GRPLHCIFData>(filename, "GRPLHCIF");
157}
158
159void setROMode(std::string const& filename, std::vector<std::string> const& continuous,
160 std::vector<std::string> const& triggered, bool clear = false)
161{
163
164 if (filename.size() == 0) {
165 std::cout << "no filename given\n";
166 return;
167 }
169 const std::string grpName{o2::base::NameConf::CCDBOBJECT};
170 TFile flGRP(filename.c_str(), "update");
171 if (flGRP.IsZombie()) {
172 LOG(error) << "Failed to open GRPECS file " << filename << " in update mode ";
173 return;
174 }
175 std::unique_ptr<GRPECSObject> grp(static_cast<GRPECSObject*>(flGRP.GetObjectChecked(grpName.c_str(), GRPECSObject::Class())));
176 if (grp.get()) {
177 // clear complete state (continuous state) first of all when asked
178 if (clear) {
179 for (auto id = DetID::First; id <= DetID::Last; ++id) {
180 if (grp->isDetReadOut(id)) {
181 grp->remDetContinuousReadOut(id);
182 }
183 }
184 }
185
186 //
187 for (auto& detstr : continuous) {
188 // convert to detID
189 o2::detectors::DetID id(detstr.c_str());
190 if (grp->isDetReadOut(id)) {
191 grp->addDetContinuousReadOut(id);
192 LOG(info) << "Setting det " << detstr << " to continuous RO mode";
193 }
194 }
195 //
196 for (auto& detstr : triggered) {
197 // convert to detID
198 o2::detectors::DetID id(detstr.c_str());
199 if (grp->isDetReadOut(id)) {
200 grp->addDetTrigger(id);
201 LOG(info) << "Setting det " << detstr << " to trigger CTP";
202 }
203 }
204 grp->print();
205 flGRP.WriteObjectAny(grp.get(), grp->Class(), grpName.c_str());
206 }
207 flGRP.Close();
208}
209
210// copies a file idendified by filename to a CCDB snapshot starting under path
211// and with the CCDBpath hierarchy
212bool publish(std::string const& filename, std::string const& path, std::string CCDBpath)
213{
214 if (!std::filesystem::exists(filename)) {
215 LOG(error) << "Input file " << filename << "does not exist\n";
216 return false;
217 }
218
219 std::string targetdir = path + CCDBpath;
220 try {
222 } catch (std::exception e) {
223 LOGP(error, "Could not create local snapshot cache directory {}, reason: {}", targetdir, e.what());
224 return false;
225 }
226
227 auto targetfile = std::filesystem::path(targetdir + "/snapshot.root");
228 auto opts = std::filesystem::copy_options::overwrite_existing;
229 std::filesystem::copy_file(filename, targetfile, opts);
230 if (std::filesystem::exists(targetfile)) {
231 LOG(info) << "file " << filename << " copied/published to " << targetfile;
232 }
233 return true;
234}
235
236// download a set of basic GRP files based on run number/time
237bool anchor_GRPs(Options const& opts, std::vector<std::string> const& paths = {"GLO/Config/GRPECS", "GLO/Config/GRPMagField", "GLO/Config/GRPLHCIF"})
238{
239 if (!gCCDBWrapper) {
240 gCCDBWrapper = std::move(std::make_unique<CCDBHelper>(opts));
241 }
242 // fix the timestamp early
243 uint64_t timestamp = gCCDBWrapper->timestamp;
244
245 const bool preserve_path = true;
246 const std::string filename("snapshot.root");
247 std::map<std::string, std::string> filter;
248 bool success = true;
249 for (auto& p : paths) {
250 LOG(info) << "Fetching " << p << " from CCDB";
251 success &= gCCDBWrapper->api.retrieveBlob(p, opts.publishto, filter, timestamp, preserve_path, filename);
252 }
253 return success;
254}
255
256// creates a mean vertex object for further use (CCDB queries) in the CCDB cache
258{
259 // either
260 const char* CCDBPATH = "/GLO/Calib/MeanVertex";
261 if (opts.vertex == "ccdb") {
262 anchor_GRPs(opts, {CCDBPATH});
263 } else {
264 LOG(info) << "Creating MeanVertex object on the fly using the InteractionDiamond params";
266 const auto& xyz = param.position;
267 const auto& sigma = param.width;
268 std::unique_ptr<o2::dataformats::MeanVertexObject> meanv(new o2::dataformats::MeanVertexObject(xyz[0], xyz[1], xyz[2], sigma[0], sigma[1], sigma[2], param.slopeX, param.slopeY));
270 api.init("file://" + opts.publishto);
271 std::map<std::string, std::string> meta;
272 meta["Created-by"] = "Monte Carlo GRPTool";
273 if (!gCCDBWrapper) {
274 gCCDBWrapper = std::move(std::make_unique<CCDBHelper>(opts));
275 }
276 api.storeAsTFileAny(meanv.get(), CCDBPATH, meta, gCCDBWrapper->runStart, gCCDBWrapper->runEnd);
277
278 // we created a file not called snapshot.root ---> still need to do this ... so that this object get's picked up later on
279 // we pick up the latest produced file and will rename it to snapshot.root (thanks ChatGPT)
280 std::filesystem::path directory_path = opts.publishto + CCDBPATH;
281 // Timepoint to hold the latest modification time
282 std::filesystem::file_time_type latest_time = std::filesystem::file_time_type::min();
283 // Path to hold the latest modified file
284 std::filesystem::path latest_file;
285 // Iterate over all files in the directory
286 for (const auto& file : std::filesystem::directory_iterator(directory_path)) {
287 // Check if the file is a regular file
288 if (file.is_regular_file()) {
289 // Get the last modification time of the file
290 std::filesystem::file_time_type mod_time = std::filesystem::last_write_time(file.path());
291 // Check if the modification time is later than the latest time found so far
292 if (mod_time > latest_time) {
293 latest_time = mod_time;
294 latest_file = file.path();
295 }
296 }
297 }
298 auto oldpath = latest_file;
299 auto newpath = latest_file.parent_path();
300 newpath.append(std::string("snapshot.root"));
301 std::filesystem::rename(oldpath, newpath);
302 }
303 return true;
304}
305
306// creates a set of basic GRP files (for simulation)
307bool create_GRPs(Options const& opts)
308{
309 // some code duplication from o2-sim --> remove it
310
311 uint64_t runStart = -1; // used in multiple GRPs
312
313 // MeanVertexObject
314 {
315 LOG(info) << "---- creating MeanVertex ----";
317 }
318
319 // GRPECS
320 {
321 LOG(info) << " --- creating GRP ECS -----";
323 grp.setRun(opts.run);
324 // if
325 auto& ccdbmgr = o2::ccdb::BasicCCDBManager::instance();
326 auto soreor = ccdbmgr.getRunDuration(opts.run);
327 runStart = soreor.first;
328 grp.setTimeStart(runStart);
329 grp.setTimeEnd(soreor.second);
330 grp.setNHBFPerTF(opts.orbitsPerTF);
331 std::vector<std::string> modules{};
332 if (!o2::conf::SimConfig::determineActiveModulesList(opts.detectorList, opts.readout, std::vector<std::string>(), modules)) {
333 return false;
334 }
335 std::vector<std::string> readout{};
336 o2::conf::SimConfig::determineReadoutDetectors(modules, std::vector<std::string>(), opts.skipreadout, readout);
337 for (auto& detstr : readout) {
338 o2::detectors::DetID id(detstr.c_str());
339 grp.addDetReadOut(id);
340 // set default RO modes
343 }
344 }
345 grp.setIsMC(true);
346 grp.setRunType(o2::parameters::GRPECSObject::RunType::PHYSICS);
347 // grp.setDataPeriod("mc"); // decide what to put here
348 std::string grpfilename = o2::base::NameConf::getGRPECSFileName(opts.outprefix);
349 TFile grpF(grpfilename.c_str(), "recreate");
350 grpF.WriteObjectAny(&grp, grp.Class(), o2::base::NameConf::CCDBOBJECT.data());
351 grpF.Close();
352 if (opts.print) {
353 grp.print();
354 }
355 if (opts.publishto.size() > 0) {
356 publish(grpfilename, opts.publishto, "/GLO/Config/GRPECS");
357 }
358 }
359
360 // GRPMagField
361 {
362 LOG(info) << " --- creating magfield GRP -----";
364 // parse the wanted field value
365 int fieldvalue = 0;
366 o2::conf::SimFieldMode fieldmode;
367 auto ok = o2::conf::SimConfig::parseFieldString(opts.fieldstring, fieldvalue, fieldmode);
368 if (!ok) {
369 LOG(error) << "Error parsing field string " << opts.fieldstring;
370 return false;
371 }
372
373 if (fieldmode == o2::conf::SimFieldMode::kCCDB) {
374 // we download the object from CCDB
375 LOG(info) << "Downloading mag field directly from CCDB";
376 if (!anchor_GRPs(opts, {"GLO/Config/GRPMagField"})) {
377 LOG(fatal) << "Downloading mag field failed";
378 }
379 if (opts.print) {
380 // print the object that was downloaded
381 printGRPMAG(std::string(opts.publishto) + std::string("/GLO/Config/GRPMagField/snapshot.root"));
382 }
383 } else {
384 // let's not create an actual mag field object for this
385 // we only need to lookup the currents from the possible
386 // values of mag field
387 // +-2,+-5,0 and uniform
388
389 const std::unordered_map<int, std::pair<int, int>> field_to_current = {{2, {12000, 6000}},
390 {5, {30000, 6000}},
391 {-2, {-12000, -6000}},
392 {-5, {-30000, -6000}},
393 {0, {0, 0}}};
394
395 auto currents_iter = field_to_current.find(fieldvalue);
396 if (currents_iter == field_to_current.end()) {
397 LOG(error) << " Could not lookup currents for fieldvalue " << fieldvalue;
398 return false;
399 }
400
401 o2::units::Current_t currDip = (*currents_iter).second.second;
402 o2::units::Current_t currL3 = (*currents_iter).second.first;
403 grp.setL3Current(currL3);
404 grp.setDipoleCurrent(currDip);
406 if (opts.print) {
407 grp.print();
408 }
409 std::string grpfilename = o2::base::NameConf::getGRPMagFieldFileName(opts.outprefix);
410 TFile grpF(grpfilename.c_str(), "recreate");
411 grpF.WriteObjectAny(&grp, grp.Class(), o2::base::NameConf::CCDBOBJECT.data());
412 grpF.Close();
413 if (opts.publishto.size() > 0) {
414 publish(grpfilename, opts.publishto, "/GLO/Config/GRPMagField");
415 }
416 }
417 }
418
419 // GRPLHCIF --> complete it later
420 {
421 LOG(info) << " --- creating GRP LHCIF -----";
422 if (opts.lhciffromccdb) { // if we take the whole object it directly from CCDB, we can just download it
423 LOG(info) << "Downloading complete GRPLHCIF object directly from CCDB";
424 anchor_GRPs(opts, {"GLO/Config/GRPLHCIF"});
425 } else {
427 // eventually we need to set the beam info from the generator, at the moment put some plausible values
428 grp.setFillNumberWithTime(runStart, 0); // RS FIXME
429 grp.setInjectionSchemeWithTime(runStart, ""); // RS FIXME
430 grp.setBeamEnergyPerZWithTime(runStart, 6.8e3); // RS FIXME
431 grp.setAtomicNumberB1WithTime(runStart, 1.); // RS FIXME
432 grp.setAtomicNumberB2WithTime(runStart, 1.); // RS FIXME
433 grp.setCrossingAngleWithTime(runStart, 0.); // RS FIXME
434 grp.setBeamAZ();
435
436 // set the BC pattern if necessary
437 if (opts.bcPatternFile.size() > 0) {
438 // load bunch filling from the file (with standard CCDB convention)
439 auto* bc = o2::BunchFilling::loadFrom(opts.bcPatternFile, "ccdb_object");
440 if (!bc) {
441 // if it failed, retry with default naming
443 }
444 if (!bc) {
445 LOG(fatal) << "Failed to load bunch filling from " << opts.bcPatternFile;
446 }
447 grp.setBunchFillingWithTime(grp.getBeamEnergyPerZTime(), *bc); // borrow the time from the existing entry
448 delete bc;
449 } else {
450 // we initialize with a default bunch filling scheme;
451 LOG(info) << "Initializing with default bunch filling";
453 bc.setDefault();
455 }
456
457 std::string grpfilename = o2::base::NameConf::getGRPLHCIFFileName(opts.outprefix);
458 if (opts.print) {
459 grp.print();
460 }
461 TFile grpF(grpfilename.c_str(), "recreate");
462 grpF.WriteObjectAny(&grp, grp.Class(), o2::base::NameConf::CCDBOBJECT.data());
463 grpF.Close();
464 if (opts.publishto.size() > 0) {
465 publish(grpfilename, opts.publishto, "/GLO/Config/GRPLHCIF");
466 }
467 }
468 }
469
470 return true;
471}
472
473void perform_Command(Options const& opts)
474{
475 switch (opts.command) {
476 case GRPCommand::kCREATE: {
477 create_GRPs(opts);
478 break;
479 }
480 case GRPCommand::kANCHOR: {
481 anchor_GRPs(opts);
482 break;
483 }
486 break;
487 }
490 break;
491 }
494 break;
495 }
497 setROMode(opts.grpfilename, opts.continuous, opts.triggered, opts.clearRO);
498 break;
499 }
500 default: {
501 }
502 }
503}
504
505bool parseOptions(int argc, char* argv[], Options& optvalues)
506{
507 namespace bpo = boost::program_options;
508 bpo::options_description global("Global options");
509 global.add_options()("command", bpo::value<std::string>(), "command to execute")("subargs", bpo::value<std::vector<std::string>>(), "Arguments for command");
510 global.add_options()("help,h", "Produce help message.");
511
512 bpo::positional_options_description pos;
513 pos.add("command", 1).add("subargs", -1);
514
515 bpo::variables_map vm;
516 bpo::parsed_options parsed{nullptr};
517 try {
518 parsed = bpo::command_line_parser(argc, argv).options(global).positional(pos).allow_unregistered().run();
519
520 bpo::store(parsed, vm);
521
522 // help
523 if (vm.count("help") > 0 && vm.count("command") == 0) {
524 print_globalHelp(argc, argv);
525 return false;
526 }
527 } catch (const bpo::error& e) {
528 std::cerr << e.what() << "\n\n";
529 std::cerr << "Error parsing global options; Available options:\n";
530 std::cerr << global << std::endl;
531 return false;
532 }
533
534 auto subparse = [&parsed](auto& desc, auto& vm, std::string const& command_name) {
535 try {
536 // Collect all the unrecognized options from the first pass. This will include the
537 // (positional) command name, so we need to erase that.
538 std::vector<std::string> opts = bpo::collect_unrecognized(parsed.options, bpo::include_positional);
539 // opts.erase(opts.begin());
540
541 // Parse again... and store to vm
542 bpo::store(bpo::command_line_parser(opts).options(desc).run(), vm);
543 bpo::notify(vm);
544
545 if (vm.count("help")) {
546 std::cout << desc << std::endl;
547 return false;
548 }
549 } catch (const bpo::error& e) {
550 std::cerr << e.what() << "\n\n";
551 std::cerr << "Error parsing options for " << command_name << " Available options:\n";
552 std::cerr << desc << std::endl;
553 return false;
554 }
555 return true;
556 };
557
558 std::string cmd = vm["command"].as<std::string>();
559
560 if (cmd == "anchorGRPs") {
561 optvalues.command = GRPCommand::kANCHOR;
562 // ls command has the following options:
563 bpo::options_description desc("anchor GRP options");
564
565 // ls command has the following options:
566 desc.add_options()("run", bpo::value<int>(&optvalues.run)->default_value(-1), "Run number");
567 desc.add_options()("print", "print resulting GRPs");
568 desc.add_options()("publishto", bpo::value<std::string>(&optvalues.publishto)->default_value("GRP"), "Base path under which GRP objects should be published on disc. This path can serve as lookup for CCDB queries of the GRP objects.");
569 if (!subparse(desc, vm, "anchorGRPs")) {
570 return false;
571 }
572 if (vm.count("print") > 0) {
573 optvalues.print = true;
574 }
575 } else if (cmd == "createGRPs") {
576 optvalues.command = GRPCommand::kCREATE;
577
578 // ls command has the following options:
579 bpo::options_description desc("create options");
580 desc.add_options()("detectorList", bpo::value<std::string>(&optvalues.detectorList)->default_value("ALICE2"), "Pick a specific version of ALICE, for specifics check the o2-sim description");
581 desc.add_options()("readoutDets", bpo::value<std::vector<std::string>>(&optvalues.readout)->multitoken()->default_value(std::vector<std::string>({"all"}), "all Run3 detectors"), "Detector list to be readout/active");
582 desc.add_options()("skipReadout", bpo::value<std::vector<std::string>>(&optvalues.skipreadout)->multitoken()->default_value(std::vector<std::string>(), "nothing skipped"), "list of inactive detectors (precendence over --readout)");
583 desc.add_options()("run", bpo::value<int>(&optvalues.run)->default_value(-1), "Run number");
584 desc.add_options()("hbfpertf", bpo::value<int>(&optvalues.orbitsPerTF)->default_value(128), "heart beat frames per timeframe (timeframelength)");
585 desc.add_options()("field", bpo::value<std::string>(&optvalues.fieldstring)->default_value("-5"), "L3 field rounded to kGauss, allowed values +-2,+-5 and 0; +-<intKGaus>U for uniform field");
586 desc.add_options()("outprefix,o", bpo::value<std::string>(&optvalues.outprefix)->default_value("o2sim"), "Prefix for GRP output files");
587 desc.add_options()("bcPatternFile", bpo::value<std::string>(&optvalues.bcPatternFile)->default_value(""), "Interacting BC pattern file (e.g. from CreateBCPattern.C)");
588 desc.add_options()("lhcif-CCDB", "take GRPLHCIF directly from CCDB");
589 desc.add_options()("print", "print resulting GRPs");
590 desc.add_options()("publishto", bpo::value<std::string>(&optvalues.publishto)->default_value(""), "Base path under which GRP objects should be published on disc. This path can serve as lookup for CCDB queries of the GRP objects.");
591 desc.add_options()("isRun5", bpo::bool_switch(&optvalues.isRun5), "Whether or not to expect a Run5 detector configuration. (deprecated, use detectorList option)");
592 desc.add_options()("vertex", bpo::value<std::string>(&optvalues.vertex)->default_value("ccdb"), "How the vertex is to be initialized. Default is CCDB. Alternative is \"Diamond\" which is constructing the mean vertex from the Diamond param via the configKeyValues path");
593 desc.add_options()("timestamp", bpo::value<uint64_t>(&optvalues.timestamp)->default_value(0), "Force timestamp to be used (useful when anchoring)");
594 desc.add_options()("configKeyValues", bpo::value<std::string>(&optvalues.configKeyValues)->default_value(""), "Semicolon separated key=value strings (e.g.: 'TPC.gasDensity=1;...')");
595 if (!subparse(desc, vm, "createGRPs")) {
596 return false;
597 }
598 if (vm.count("print") > 0) {
599 optvalues.print = true;
600 }
601 if (vm.count("lhcif-CCDB") > 0) {
602 optvalues.lhciffromccdb = true;
603 }
604 auto vertexmode = vm["vertex"].as<std::string>();
605 if (!(vertexmode == "ccdb" || vertexmode == "Diamond")) {
606 return false;
607 }
608 // init params
610
611 } else if (cmd == "setROMode") {
612 // set/modify the ROMode
614 bpo::options_description desc("setting detector readout modes");
615 desc.add_options()("file,f", bpo::value<std::string>(&optvalues.grpfilename)->default_value("o2sim_grpecs.root"), "Path to GRPECS file");
616 desc.add_options()("continuousRO", bpo::value<std::vector<std::string>>(&optvalues.continuous)->multitoken()->default_value(std::vector<std::string>({"all"}), "all active detectors"), "List of detectors to set to continuous mode");
617 desc.add_options()("triggerCTP", bpo::value<std::vector<std::string>>(&optvalues.triggered)->multitoken()->default_value(std::vector<std::string>({""}), "none"), "List of detectors to trigger CTP");
618 desc.add_options()("clear", "clears all RO modes (prio to applying other options)");
619 if (!subparse(desc, vm, "setROMode")) {
620 return false;
621 }
622 if (vm.count("clear") > 0) {
623 optvalues.clearRO = true;
624 }
625 } else if (cmd == "print_GRPECS") {
626 optvalues.command = GRPCommand::kPRINTECS;
627 // print the GRP
628 bpo::options_description desc("print options");
629 desc.add_options()("file,f", bpo::value<std::string>(&optvalues.grpfilename), "Path to GRP file");
630 if (!subparse(desc, vm, "print_GRPECS")) {
631 return false;
632 }
633 } else if (cmd == "print_GRPLHC") {
634 optvalues.command = GRPCommand::kPRINTLHC;
635 // print the GRP
636 bpo::options_description desc("print options");
637 desc.add_options()("file,f", bpo::value<std::string>(&optvalues.grpfilename), "Path to GRP file");
638 if (!subparse(desc, vm, "print_GRPECS")) {
639 return false;
640 }
641 } else if (cmd == "print_GRPMAG") {
642 optvalues.command = GRPCommand::kPRINTMAG;
643 // print the GRP
644 bpo::options_description desc("print options");
645 desc.add_options()("file,f", bpo::value<std::string>(&optvalues.grpfilename), "Path to GRP file");
646 if (!subparse(desc, vm, "print_GRPECS")) {
647 return false;
648 }
649 } else {
650 std::cerr << "Error: Unknown command " << cmd << std::endl;
651 return false;
652 }
653
654 return true;
655}
656
657int main(int argc, char* argv[])
658{
659 Options options;
660 if (parseOptions(argc, argv, options)) {
661 perform_Command(options);
662 } else {
663 std::cout << "Parse options failed\n";
664 return 1;
665 }
666 return 0;
667}
uint64_t bc
Definition RawEventData.h:5
Header of the AggregatedRunInfo struct.
container for the LHC InterFace data
Header of the General Run Parameters object for B field values.
bool publish(std::string const &filename, std::string const &path, std::string CCDBpath)
Definition GRPTool.cxx:212
bool create_MeanVertexObject(Options const &opts)
Definition GRPTool.cxx:257
void printGRPECS(std::string const &filename)
Definition GRPTool.cxx:144
std::unique_ptr< CCDBHelper > gCCDBWrapper
Definition GRPTool.cxx:110
void print_globalHelp(int argc, char *argv[])
Definition GRPTool.cxx:112
void setROMode(std::string const &filename, std::vector< std::string > const &continuous, std::vector< std::string > const &triggered, bool clear=false)
Definition GRPTool.cxx:159
GRPCommand
Definition GRPTool.cxx:37
bool anchor_GRPs(Options const &opts, std::vector< std::string > const &paths={"GLO/Config/GRPECS", "GLO/Config/GRPMagField", "GLO/Config/GRPLHCIF"})
Definition GRPTool.cxx:237
bool create_GRPs(Options const &opts)
Definition GRPTool.cxx:307
void perform_Command(Options const &opts)
Definition GRPTool.cxx:473
bool parseOptions(int argc, char *argv[], Options &optvalues)
Definition GRPTool.cxx:505
void printGRPMAG(std::string const &filename)
Definition GRPTool.cxx:149
void printGRPLHC(std::string const &filename)
Definition GRPTool.cxx:154
Definition of the Names Generator class.
uint16_t pos
Definition RawData.h:3
static BunchFilling * loadFrom(const std::string &fileName, const std::string &objName="")
static std::string getGRPECSFileName(const std::string_view prefix=STANDARDSIMPREFIX)
Definition NameConf.cxx:64
static std::string getGRPLHCIFFileName(const std::string_view prefix=STANDARDSIMPREFIX)
Definition NameConf.cxx:70
static constexpr std::string_view CCDBOBJECT
Definition NameConf.h:66
static std::string getGRPMagFieldFileName(const std::string_view prefix=STANDARDSIMPREFIX)
Definition NameConf.cxx:76
static BasicCCDBManager & instance()
std::pair< int64_t, int64_t > getRunDuration(int runnumber, bool fatal=true)
int storeAsTFileAny(const T *obj, std::string const &path, std::map< std::string, std::string > const &metadata, long startValidityTimestamp=-1, long endValidityTimestamp=-1, std::vector< char >::size_type maxSize=0) const
Definition CcdbApi.h:163
void init(std::string const &hosts)
Definition CcdbApi.cxx:237
static void updateFromString(std::string const &)
static bool parseFieldString(std::string const &fieldstring, int &fieldvalue, o2::conf::SimFieldMode &mode)
static void determineReadoutDetectors(std::vector< std::string > const &active, std::vector< std::string > const &enabledRO, std::vector< std::string > const &skippedRO, std::vector< std::string > &finalRO)
static bool determineActiveModulesList(const std::string &version, std::vector< std::string > const &input, std::vector< std::string > const &skipped, std::vector< std::string > &active)
Static class with identifiers, bitmasks and names for ALICE detectors.
Definition DetID.h:58
static constexpr ID First
Definition DetID.h:95
static constexpr ID Last
if extra detectors added, update this !!!
Definition DetID.h:93
static constexpr bool alwaysTriggeredRO(DetID::ID det)
void setTimeEnd(timePoint t)
void setTimeStart(timePoint t)
void setNHBFPerTF(uint32_t n)
void addDetReadOut(DetID id)
add specific detector to the list of readout detectors
void addDetContinuousReadOut(DetID id)
add specific detector to the list of continuously readout detectors
void print() const
print itself
void setBeamAZ(int a, int z, beamDirection beam)
void setBunchFillingWithTime(std::pair< long, o2::BunchFilling > p)
void setBeamEnergyPerZWithTime(std::pair< long, int32_t > p)
void setCrossingAngleWithTime(std::pair< long, o2::units::AngleRad_t > p)
void setAtomicNumberB1WithTime(std::pair< long, int32_t > p)
void setFillNumberWithTime(std::pair< long, int32_t > p)
void setInjectionSchemeWithTime(std::pair< long, std::string > p)
void setAtomicNumberB2WithTime(std::pair< long, int32_t > p)
void setDipoleCurrent(o2::units::Current_t v)
Definition GRPMagField.h:52
void print() const
print itself
void setL3Current(o2::units::Current_t v)
Definition GRPMagField.h:51
void setFieldUniformity(bool v)
Definition GRPMagField.h:53
GLsizei const GLchar *const * string
Definition glcorearb.h:809
GLsizei const GLuint * paths
Definition glcorearb.h:5475
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
Definition glcorearb.h:1308
GLsizei const GLchar *const * path
Definition glcorearb.h:3591
GLenum GLfloat param
Definition glcorearb.h:271
GLuint id
Definition glcorearb.h:650
std::string timestamp() noexcept
Definition Clock.h:84
void createDirectoriesIfAbsent(std::string const &path)
std::string filename()
std::string publishto
Definition GRPTool.cxx:76
std::vector< std::string > readout
Definition GRPTool.cxx:62
std::string outprefix
Definition GRPTool.cxx:71
bool print
Definition GRPTool.cxx:74
std::string configKeyValues
Definition GRPTool.cxx:80
std::vector< std::string > triggered
Definition GRPTool.cxx:69
std::string grpfilename
Definition GRPTool.cxx:67
std::string ccdbhost
Definition GRPTool.cxx:77
std::string fieldstring
Definition GRPTool.cxx:72
int run
Definition GRPTool.cxx:64
bool isRun5
Definition GRPTool.cxx:78
std::vector< std::string > skipreadout
Definition GRPTool.cxx:63
bool clearRO
Definition GRPTool.cxx:70
uint64_t timestamp
Definition GRPTool.cxx:81
std::string vertex
Definition GRPTool.cxx:79
std::vector< std::string > continuous
Definition GRPTool.cxx:68
std::string detectorList
Definition GRPTool.cxx:82
GRPCommand command
Definition GRPTool.cxx:66
bool lhciffromccdb
Definition GRPTool.cxx:75
std::string bcPatternFile
Definition GRPTool.cxx:73
int orbitsPerTF
Definition GRPTool.cxx:65
#define main
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"
vec clear()