Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-01-30 09:32:32

0001 // This file is part of the Acts project.
0002 //
0003 // Copyright (C) 2017 CERN for the benefit of the Acts project
0004 //
0005 // This Source Code Form is subject to the terms of the Mozilla Public
0006 // License, v. 2.0. If a copy of the MPL was not distributed with this
0007 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
0008 
0009 #pragma once
0010 
0011 #include "Acts/Plugins/FpeMonitoring/FpeMonitor.hpp"
0012 #include "ActsExamples/Framework/IAlgorithm.hpp"
0013 #include "ActsExamples/Framework/IContextDecorator.hpp"
0014 #include "ActsExamples/Framework/IReader.hpp"
0015 #include "ActsExamples/Framework/IWriter.hpp"
0016 #include "ActsExamples/Framework/SequenceElement.hpp"
0017 #include "ActsExamples/Utilities/tbbWrap.hpp"
0018 #include <Acts/Utilities/Logger.hpp>
0019 
0020 #include <cstddef>
0021 #include <memory>
0022 #include <optional>
0023 #include <stdexcept>
0024 #include <string>
0025 #include <typeinfo>
0026 #include <unordered_map>
0027 #include <utility>
0028 #include <vector>
0029 
0030 #include <tbb/enumerable_thread_specific.h>
0031 
0032 namespace ActsExamples {
0033 class DataHandleBase;
0034 class IAlgorithm;
0035 class IContextDecorator;
0036 class IReader;
0037 class IWriter;
0038 class SequenceElement;
0039 
0040 using IterationCallback = void (*)();
0041 
0042 /// Custom exception class so FPE failures can be caught
0043 class FpeFailure : public std::runtime_error {
0044   using std::runtime_error::runtime_error;
0045 };
0046 
0047 class SequenceConfigurationException : public std::runtime_error {
0048  public:
0049   SequenceConfigurationException()
0050       : std::runtime_error{"Sequence configuration error"} {}
0051 };
0052 
0053 /// A simple algorithm sequencer for event processing.
0054 ///
0055 /// This is the backbone of the framework. It reads events from file,
0056 /// runs the configured algorithms for each event, and writes selected data
0057 /// back to a file.
0058 class Sequencer {
0059  public:
0060   struct FpeMask {
0061     std::string file;
0062     std::pair<std::size_t, std::size_t> lines;
0063     Acts::FpeType type;
0064     std::size_t count;
0065   };
0066 
0067   struct Config {
0068     /// number of events to skip at the beginning
0069     std::size_t skip = 0;
0070     /// number of events to process, SIZE_MAX to process all available events
0071     std::optional<std::size_t> events = std::nullopt;
0072     /// logging level
0073     Acts::Logging::Level logLevel = Acts::Logging::INFO;
0074     /// number of parallel threads to run, negative for automatic
0075     /// determination
0076     int numThreads = -1;
0077     /// output directory for timing information, empty for working directory
0078     std::string outputDir;
0079     /// output name of the timing file
0080     std::string outputTimingFile = "timing.tsv";
0081     /// Callback that is invoked in the event loop.
0082     /// @warning This function can be called from multiple threads and should therefore be thread-safe
0083     IterationCallback iterationCallback = []() {};
0084     /// Run data flow consistency checks
0085     /// Defaults to false right now until all components are migrated
0086     bool runDataFlowChecks = true;
0087 
0088     bool trackFpes = true;
0089     std::vector<FpeMask> fpeMasks{};
0090     bool failOnFirstFpe = false;
0091     std::size_t fpeStackTraceLength = 8;
0092   };
0093 
0094   Sequencer(const Config &cfg);
0095 
0096   /// Add a context decorator to the set of context decorators.
0097   ///
0098   /// @throws std::invalid_argument if the decorator is NULL.
0099   void addContextDecorator(std::shared_ptr<IContextDecorator> decorator);
0100 
0101   /// Add a reader to the set of readers.
0102   ///
0103   /// @throws std::invalid_argument if the reader is NULL.
0104   void addReader(std::shared_ptr<IReader> reader);
0105 
0106   /// Append an algorithm to the sequence of algorithms.
0107   ///
0108   /// @throws std::invalid_argument if the algorithm is NULL.
0109   void addAlgorithm(std::shared_ptr<IAlgorithm> algorithm);
0110 
0111   /// Append a sequence element to the sequence
0112   ///
0113   /// @throws std::invalid_argument if the element is NULL.
0114   void addElement(const std::shared_ptr<SequenceElement> &element);
0115 
0116   /// Add a writer to the set of writers.
0117   ///
0118   /// @throws std::invalid_argument if the writer is NULL.
0119   void addWriter(std::shared_ptr<IWriter> writer);
0120 
0121   /// Add an alias to the whiteboard.
0122   void addWhiteboardAlias(const std::string &aliasName,
0123                           const std::string &objectName);
0124 
0125   Acts::FpeMonitor::Result fpeResult() const;
0126 
0127   /// Run the event loop.
0128   ///
0129   /// @return status code compatible with the `main()` return code
0130   /// @returns EXIT_SUCCESS when everying worked without problems
0131   /// @returns EXIT_FAILURE if something went wrong
0132   ///
0133   /// @note If the number of events to process is undefined, the sequencer
0134   /// will process events until the first reader signals the end-of-file. If
0135   /// given, it sets an upper bound.
0136   ///
0137   /// This function is intended to be run as the last thing in the tool
0138   /// main function and its return value can be used directly as the program
0139   /// return value, i.e.
0140   ///
0141   ///     int main(int argc, char* argv[])
0142   ///     {
0143   ///         Sequencer::Config cfg;
0144   ///         ... // configure the sequencer
0145   ///         Sequencer seq;
0146   ///         ... // set up the algorithms
0147   ///         return seq.run();
0148   ///     }
0149   ///
0150   /// This will run the start-of-run hook for all configured services, run all
0151   /// configured readers, algorithms, and writers for each event, then invoke
0152   /// the end-of-run hook for all configured writers.
0153   int run();
0154 
0155   /// Get const access to the config
0156   const Config &config() const { return m_cfg; }
0157 
0158  private:
0159   /// List of all configured algorithm names.
0160   std::vector<std::string> listAlgorithmNames() const;
0161   /// Determine range of (requested) events; [SIZE_MAX, SIZE_MAX) for error.
0162   std::pair<std::size_t, std::size_t> determineEventsRange() const;
0163 
0164   std::pair<std::string, std::size_t> fpeMaskCount(
0165       const boost::stacktrace::stacktrace &st, Acts::FpeType type) const;
0166 
0167   void fpeReport() const;
0168 
0169   struct SequenceElementWithFpeResult {
0170     std::shared_ptr<SequenceElement> sequenceElement;
0171     tbb::enumerable_thread_specific<Acts::FpeMonitor::Result> fpeResult{};
0172   };
0173 
0174   Config m_cfg;
0175   tbbWrap::task_arena m_taskArena;
0176   std::vector<std::shared_ptr<IContextDecorator>> m_decorators;
0177   std::vector<std::shared_ptr<IReader>> m_readers;
0178   std::vector<SequenceElementWithFpeResult> m_sequenceElements;
0179   std::unique_ptr<const Acts::Logger> m_logger;
0180 
0181   std::unordered_map<std::string, std::string> m_whiteboardObjectAliases;
0182 
0183   std::unordered_map<std::string, const DataHandleBase *> m_whiteBoardState;
0184 
0185   std::atomic<std::size_t> m_nUnmaskedFpe = 0;
0186 
0187   const Acts::Logger &logger() const { return *m_logger; }
0188 };
0189 
0190 std::ostream &operator<<(std::ostream &os,
0191                          const ActsExamples::Sequencer::FpeMask &m);
0192 
0193 }  // namespace ActsExamples