File indexing completed on 2024-04-06 12:30:36
0001 #ifndef SimGeneral_MixingModule_Adjuster_h
0002 #define SimGeneral_MixingModule_Adjuster_h
0003
0004 #include "DataFormats/Common/interface/Wrapper.h"
0005 #include "FWCore/Framework/interface/ConsumesCollector.h"
0006 #include "FWCore/Framework/interface/Event.h"
0007 #include "FWCore/Framework/interface/EventPrincipal.h"
0008 #include "FWCore/Utilities/interface/EDGetToken.h"
0009 #include "FWCore/Utilities/interface/InputTag.h"
0010 #include "SimDataFormats/CaloHit/interface/PCaloHitContainer.h"
0011 #include "SimDataFormats/Track/interface/SimTrackContainer.h"
0012 #include "SimDataFormats/TrackingHit/interface/PSimHitContainer.h"
0013 #include "SimDataFormats/Vertex/interface/SimVertexContainer.h"
0014 #include "DataFormats/TrackingRecHit/interface/TrackingRecHitFwd.h"
0015
0016 #include <memory>
0017 #include <vector>
0018 #include <string>
0019 #include <iostream>
0020
0021 class FastTrackerRecHit;
0022
0023 namespace edm {
0024 class ModuleCallingContext;
0025
0026 class AdjusterBase {
0027 public:
0028 virtual ~AdjusterBase() {}
0029 virtual void doOffset(int bunchspace,
0030 int bcr,
0031 const edm::EventPrincipal&,
0032 ModuleCallingContext const*,
0033 unsigned int EventNr,
0034 int vertexOffset) = 0;
0035 virtual bool checkSignal(edm::Event const& event) = 0;
0036 };
0037
0038 template <typename T>
0039 class Adjuster : public AdjusterBase {
0040 public:
0041 Adjuster(InputTag const& tag, edm::ConsumesCollector&& iC, bool wrap);
0042
0043 ~Adjuster() override {}
0044
0045 void doOffset(int bunchspace,
0046 int bcr,
0047 const edm::EventPrincipal&,
0048 ModuleCallingContext const*,
0049 unsigned int EventNr,
0050 int vertexOffset) override;
0051
0052 bool checkSignal(edm::Event const& event) override {
0053 bool got = false;
0054 edm::Handle<T> result_t;
0055 got = event.getByToken(token_, result_t);
0056 return got;
0057 }
0058
0059 private:
0060 InputTag tag_;
0061 bool WrapT_ = false;
0062 EDGetTokenT<T> token_;
0063 };
0064
0065
0066
0067
0068
0069 namespace detail {
0070 void doTheOffset(int bunchspace,
0071 int bcr,
0072 std::vector<SimTrack>& product,
0073 unsigned int eventNr,
0074 int vertexOffset,
0075 bool wraptimes);
0076 void doTheOffset(int bunchspace,
0077 int bcr,
0078 std::vector<SimVertex>& product,
0079 unsigned int eventNr,
0080 int vertexOffset,
0081 bool wraptimes);
0082 void doTheOffset(int bunchspace,
0083 int bcr,
0084 std::vector<PCaloHit>& product,
0085 unsigned int eventNr,
0086 int vertexOffset,
0087 bool wraptimes);
0088 void doTheOffset(
0089 int bunchspace, int bcr, std::vector<PSimHit>& product, unsigned int eventNr, int vertexOffset, bool wraptimes);
0090 void doTheOffset(int bunchspace,
0091 int bcr,
0092 TrackingRecHitCollection& product,
0093 unsigned int eventNr,
0094 int vertexOffset,
0095 bool wraptimes);
0096 }
0097
0098 template <typename T>
0099 void Adjuster<T>::doOffset(int bunchspace,
0100 int bcr,
0101 const EventPrincipal& ep,
0102 ModuleCallingContext const* mcc,
0103 unsigned int eventNr,
0104 int vertexOffset) {
0105 std::shared_ptr<Wrapper<T> const> shPtr = getProductByTag<T>(ep, tag_, mcc);
0106 if (shPtr) {
0107 T& product = const_cast<T&>(*shPtr->product());
0108 detail::doTheOffset(bunchspace, bcr, product, eventNr, vertexOffset, WrapT_);
0109 }
0110 }
0111
0112 template <typename T>
0113 Adjuster<T>::Adjuster(InputTag const& tag, ConsumesCollector&& iC, bool wrapLongTimes)
0114 : tag_(tag), token_(iC.consumes<T>(tag)) {
0115 if (wrapLongTimes) {
0116 std::string Musearch = tag_.instance();
0117 if (Musearch.find("Muon") == 0)
0118 WrapT_ = true;
0119 }
0120 }
0121 }
0122
0123 #endif