BPHAnalyzerWrapper

BPHESTokenWrapper

BPHEventSetupWrapper

BPHModuleWrapper

BPHTokenWrapper

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
#ifndef HeavyFlavorAnalysis_RecoDecay_BPHAnalyzerTokenWrapper_h
#define HeavyFlavorAnalysis_RecoDecay_BPHAnalyzerTokenWrapper_h
/** \classes BPHModuleWrapper, BPHTokenWrapper, BPHESTokenWrapper,
 *           BPHEventSetupWrapper and BPHAnalyzerWrapper
 *
 *  Description: 
 *    Common interfaces to define modules and get objects
 *    from "old" and "new" CMSSW version in an uniform way
 *
 *  \author Paolo Ronchese INFN Padova
 *
 */

//----------------------
// Base Class Headers --
//----------------------

//------------------------------------
// Collaborating Class Declarations --
//------------------------------------
#include "HeavyFlavorAnalysis/RecoDecay/interface/BPHRecoCandidate.h"
#include "FWCore/Framework/interface/Event.h"
#include "FWCore/Framework/interface/EventSetup.h"
#include "FWCore/Framework/interface/EDConsumerBase.h"
#include "FWCore/Framework/interface/ESConsumesCollector.h"
#include "FWCore/Framework/interface/one/EDAnalyzer.h"
#include "FWCore/Framework/interface/one/EDProducer.h"
#include "FWCore/Framework/interface/stream/EDAnalyzer.h"
#include "FWCore/Framework/interface/stream/EDProducer.h"

//---------------
// C++ Headers --
//---------------
#include <string>
#include <map>
#include <memory>

//              ---------------------
//              -- Class Interface --
//              ---------------------

class BPHModuleWrapper {
public:
  typedef edm::one::EDAnalyzer<> one_analyzer;
  typedef edm::one::EDProducer<> one_producer;
  typedef edm::stream::EDAnalyzer<> stream_analyzer;
  typedef edm::stream::EDProducer<> stream_producer;
};

template <class Obj>
class BPHTokenWrapper {
public:
  typedef edm::EDGetTokenT<Obj> type;
  bool get(const edm::Event& ev, edm::Handle<Obj>& obj) { return ev.getByToken(token, obj); }
  type token;
};

template <class Obj, class Rec>
class BPHESTokenWrapper {
public:
  typedef edm::ESGetToken<Obj, Rec> type;
  bool get(const edm::EventSetup& es, edm::ESHandle<Obj>& obj) {
    obj = es.get<Rec>().getHandle(token);
    return obj.isValid();
  }
  type token;
};

template <class T>
class BPHAnalyzerWrapper : public T {
protected:
  template <class Obj>
  void consume(BPHTokenWrapper<Obj>& tw, const std::string& label) {
    edm::InputTag tag(label);
    tw.token = this->template consumes<Obj>(tag);
    return;
  }
  template <class Obj>
  void consume(BPHTokenWrapper<Obj>& tw, const edm::InputTag& tag) {
    tw.token = this->template consumes<Obj>(tag);
    return;
  }
  template <class Obj, class Rec>
  void esConsume(BPHESTokenWrapper<Obj, Rec>& tw) {
    tw.token = this->template esConsumes<Obj, Rec>();
    return;
  }
  template <class Obj, class Rec>
  void esConsume(BPHESTokenWrapper<Obj, Rec>& tw, const std::string& label) {
    tw.token = this->template esConsumes<Obj, Rec>(edm::ESInputTag("", label));
    return;
  }
  template <class Obj, class Rec>
  void esConsume(BPHESTokenWrapper<Obj, Rec>& tw, const edm::ESInputTag& tag) {
    tw.token = this->template esConsumes<Obj>(tag);
    return;
  }
};

class BPHEventSetupWrapper {
public:
  explicit BPHEventSetupWrapper(const edm::EventSetup& es)
      : ep(&es), twMap(new std::map<BPHRecoCandidate::esType, void*>) {}
  BPHEventSetupWrapper(const edm::EventSetup& es, BPHRecoCandidate::esType type, void* token)
      : BPHEventSetupWrapper(es) {
    (*twMap)[type] = token;
  }
  BPHEventSetupWrapper(const edm::EventSetup& es, std::map<BPHRecoCandidate::esType, void*> tokenMap)
      : BPHEventSetupWrapper(es) {
    twMap->insert(tokenMap.begin(), tokenMap.end());
  }
  BPHEventSetupWrapper(const BPHEventSetupWrapper& es) = default;
  BPHEventSetupWrapper(const BPHEventSetupWrapper* es) : BPHEventSetupWrapper(*es) {}
  BPHEventSetupWrapper(const BPHEventSetupWrapper& es, BPHRecoCandidate::esType type, void* token)
      : BPHEventSetupWrapper(es) {
    (*twMap)[type] = token;
  }
  BPHEventSetupWrapper(BPHEventSetupWrapper& es, std::map<BPHRecoCandidate::esType, void*> tokenMap)
      : BPHEventSetupWrapper(es) {
    twMap->insert(tokenMap.begin(), tokenMap.end());
  }
  const edm::EventSetup* get() const { return ep; }
  operator const edm::EventSetup&() const { return *ep; }
  template <class Obj, class Rec>
  BPHESTokenWrapper<Obj, Rec>* get(BPHRecoCandidate::esType type) const {
    const auto& iter = twMap->find(type);
    return (iter == twMap->end() ? nullptr : static_cast<BPHESTokenWrapper<Obj, Rec>*>(iter->second));
  }

private:
  const edm::EventSetup* ep;
  std::shared_ptr<std::map<BPHRecoCandidate::esType, void*>> twMap;
};

#endif