CombinedEventSetupInit

CombinedEventSetupInit

CombinedEventSetupInit

CombinedEventSetupInit

CommonSelectorEventSetupInit

EventSetupInit

EventSetupInit

EventSetupInit

NoEventSetupInit

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 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
#ifndef UtilAlgos_EventSetupInitTrait_h
#define UtilAlgos_EventSetupInitTrait_h
#include "CommonTools/UtilAlgos/interface/AndSelector.h"
#include "CommonTools/UtilAlgos/interface/OrSelector.h"
#include "FWCore/Framework/interface/ConsumesCollector.h"

namespace edm {
  class EventSetup;
  class Event;
}  // namespace edm

namespace helpers {
  struct NullAndOperand;
}

namespace reco {
  namespace modules {
    /// take no action (default)
    template <typename T>
    struct NoEventSetupInit {
      explicit NoEventSetupInit(edm::ConsumesCollector) {}
      NoEventSetupInit() = delete;
      void init(T&, const edm::Event&, const edm::EventSetup&) {}
    };

    /// implement common interface defined in:
    /// https://twiki.cern.ch/twiki/bin/view/CMS/SelectorInterface
    struct CommonSelectorEventSetupInit {
      explicit CommonSelectorEventSetupInit(edm::ConsumesCollector) {}
      CommonSelectorEventSetupInit() = delete;
      template <typename Selector>
      void init(Selector& selector, const edm::Event& evt, const edm::EventSetup& es) {
        selector.newEvent(evt, es);
      }
    };

    template <typename T>
    struct EventSetupInit {
      typedef NoEventSetupInit<T> type;
    };

    template <typename T1,
              typename T2,
              typename T3 = helpers::NullAndOperand,
              typename T4 = helpers::NullAndOperand,
              typename T5 = helpers::NullAndOperand>
    struct CombinedEventSetupInit {
      explicit CombinedEventSetupInit(edm::ConsumesCollector iC) : t1_(iC), t2_(iC), t3_(iC), t4_(iC), t5_(iC) {}
      template <template <typename, typename, typename, typename, typename> class SelectorT>
      void init(SelectorT<T1, T2, T3, T4, T5>& selector, const edm::Event& evt, const edm::EventSetup& es) {
        t1_.init(selector.s1_, evt, es);
        t2_.init(selector.s2_, evt, es);
        t3_.init(selector.s3_, evt, es);
        t4_.init(selector.s4_, evt, es);
        t5_.init(selector.s5_, evt, es);
      }
      typename EventSetupInit<T1>::type t1_;
      typename EventSetupInit<T2>::type t2_;
      typename EventSetupInit<T3>::type t3_;
      typename EventSetupInit<T4>::type t4_;
      typename EventSetupInit<T5>::type t5_;
    };

    template <typename T1, typename T2, typename T3, typename T4>
    struct CombinedEventSetupInit<T1, T2, T3, T4, helpers::NullAndOperand> {
      explicit CombinedEventSetupInit(edm::ConsumesCollector iC) : t1_(iC), t2_(iC), t3_(iC), t4_(iC) {}
      template <template <typename, typename, typename, typename, typename> class SelectorT>
      void init(SelectorT<T1, T2, T3, T4, helpers::NullAndOperand>& selector,
                const edm::Event& evt,
                const edm::EventSetup& es) {
        t1_.init(selector.s1_, evt, es);
        t2_.init(selector.s2_, evt, es);
        t3_.init(selector.s3_, evt, es);
        t4_.init(selector.s4_, evt, es);
      }
      typename EventSetupInit<T1>::type t1_;
      typename EventSetupInit<T2>::type t2_;
      typename EventSetupInit<T3>::type t3_;
      typename EventSetupInit<T4>::type t4_;
    };

    template <typename T1, typename T2, typename T3>
    struct CombinedEventSetupInit<T1, T2, T3, helpers::NullAndOperand, helpers::NullAndOperand> {
      explicit CombinedEventSetupInit(edm::ConsumesCollector iC) : t1_(iC), t2_(iC), t3_(iC) {}
      template <template <typename, typename, typename, typename, typename> class SelectorT>
      void init(SelectorT<T1, T2, T3, helpers::NullAndOperand, helpers::NullAndOperand>& selector,
                const edm::Event& evt,
                const edm::EventSetup& es) {
        t1_.init(selector.s1_, evt, es);
        t2_.init(selector.s2_, evt, es);
        t3_.init(selector.s3_, evt, es);
      }
      typename EventSetupInit<T1>::type t1_;
      typename EventSetupInit<T2>::type t2_;
      typename EventSetupInit<T3>::type t3_;
    };

    template <typename T1, typename T2>
    struct CombinedEventSetupInit<T1, T2, helpers::NullAndOperand, helpers::NullAndOperand, helpers::NullAndOperand> {
      explicit CombinedEventSetupInit(edm::ConsumesCollector iC) : t1_(iC), t2_(iC) {}
      template <template <typename, typename, typename, typename, typename> class SelectorT>
      void init(SelectorT<T1, T2, helpers::NullAndOperand, helpers::NullAndOperand, helpers::NullAndOperand>& selector,
                const edm::Event& evt,
                const edm::EventSetup& es) {
        t1_.init(selector.s1_, evt, es);
        t2_.init(selector.s2_, evt, es);
      }
      typename EventSetupInit<T1>::type t1_;
      typename EventSetupInit<T2>::type t2_;
    };

    template <typename T1, typename T2, typename T3, typename T4, typename T5>
    struct EventSetupInit<AndSelector<T1, T2, T3, T4, T5> > {
      typedef CombinedEventSetupInit<T1, T2, T3, T4, T5> type;
    };

    template <typename T1, typename T2, typename T3, typename T4, typename T5>
    struct EventSetupInit<OrSelector<T1, T2, T3, T4, T5> > {
      typedef CombinedEventSetupInit<T1, T2, T3, T4, T5> type;
    };

  }  // namespace modules
}  // namespace reco

#define EVENTSETUP_STD_INIT(SELECTOR)              \
  namespace reco {                                 \
    namespace modules {                            \
      template <>                                  \
      struct EventSetupInit<SELECTOR> {            \
        typedef CommonSelectorEventSetupInit type; \
      };                                           \
    }                                              \
  }                                                \
  struct __useless_ignoreme

#define EVENTSETUP_STD_INIT_T1(SELECTOR)           \
  namespace reco {                                 \
    namespace modules {                            \
      template <typename T1>                       \
      struct EventSetupInit<SELECTOR<T1> > {       \
        typedef CommonSelectorEventSetupInit type; \
      };                                           \
    }                                              \
  }                                                \
  struct __useless_ignoreme

#define EVENTSETUP_STD_INIT_T2(SELECTOR)           \
  namespace reco {                                 \
    namespace modules {                            \
      template <typename T1, typename T2>          \
      struct EventSetupInit<SELECTOR<T1, T2> > {   \
        typedef CommonSelectorEventSetupInit type; \
      };                                           \
    }                                              \
  }                                                \
  struct __useless_ignoreme

#define EVENTSETUP_STD_INIT_T3(SELECTOR)               \
  namespace reco {                                     \
    namespace modules {                                \
      template <typename T1, typename T2, typename T3> \
      struct EventSetupInit<SELECTOR<T1, T2, T3> > {   \
        typedef CommonSelectorEventSetupInit type;     \
      };                                               \
    }                                                  \
  }                                                    \
  struct __useless_ignoreme

#endif