RandomEngineSentry

Macros

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
#ifndef FWCore_ServiceRegistry_RandomEngineSentry_h
#define FWCore_ServiceRegistry_RandomEngineSentry_h

/**\class edm::RandomEngineSentry

Description:

*/
//
// Original Author: W. David Dagenhart
//         Created: 11/26/2013

#include "FWCore/AbstractServices/interface/RandomNumberGenerator.h"
#include "FWCore/ServiceRegistry/interface/Service.h"
#include "FWCore/Utilities/interface/Exception.h"
#include "FWCore/Utilities/interface/get_underlying_safe.h"

namespace CLHEP {
  class HepRandomEngine;
}

namespace edm {

  class LuminosityBlockIndex;
  class StreamID;

  template <class T>
  class RandomEngineSentry {
  public:
    explicit RandomEngineSentry(T* t, CLHEP::HepRandomEngine* engine) : t_(t), engine_(engine) {
      if (t) {
        t->setRandomEngine(engine);
      }
    }

    explicit RandomEngineSentry(T* t, StreamID const& streamID) : t_(t), engine_(nullptr) {
      if (t) {
        Service<RandomNumberGenerator> rng;
        if (!rng.isAvailable()) {
          throw cms::Exception("Configuration")
              << "Attempt to get a random engine when the RandomNumberGeneratorService is not configured.\n"
                 "You must configure the service if you want an engine.\n";
        }
        engine_ = &rng->getEngine(streamID);
        t->setRandomEngine(engine_);
      }
    }

    explicit RandomEngineSentry(T* t, LuminosityBlockIndex const& lumi) : t_(t), engine_(nullptr) {
      if (t) {
        Service<RandomNumberGenerator> rng;
        if (!rng.isAvailable()) {
          throw cms::Exception("Configuration")
              << "Attempt to get a random engine when the RandomNumberGeneratorService is not configured.\n"
                 "You must configure the service if you want an engine.\n";
        }
        engine_ = &rng->getEngine(lumi);
        t->setRandomEngine(engine_);
      }
    }

    ~RandomEngineSentry() {
      if (t_)
        t_->setRandomEngine(nullptr);
    }

    CLHEP::HepRandomEngine const* randomEngine() const { return get_underlying_safe(engine_); }
    CLHEP::HepRandomEngine*& randomEngine() { return get_underlying_safe(engine_); }

  private:
    edm::propagate_const<T*> t_;
    edm::propagate_const<CLHEP::HepRandomEngine*> engine_;
  };
}  // namespace edm
#endif