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