File indexing completed on 2024-05-03 04:10:19
0001 #include "TauAnalysis/MCEmbeddingTools/plugins/DoubleCollectionMerger.h"
0002 #include "FWCore/Framework/interface/MakerMacros.h"
0003
0004 #include "DataFormats/Common/interface/SortedCollection.h"
0005
0006 #include "DataFormats/EcalDigi/interface/EBSrFlag.h"
0007 #include "DataFormats/EcalDigi/interface/EESrFlag.h"
0008 #include "DataFormats/EcalDigi/interface/EcalSrFlag.h"
0009 #include "DataFormats/HcalDigi/interface/HcalDigiCollections.h"
0010
0011 #include "DataFormats/Common/interface/OwnVector.h"
0012 #include "DataFormats/Common/interface/RangeMap.h"
0013
0014 typedef DoubleCollectionMerger<edm::SortedCollection<EESrFlag>, EESrFlag, edm::SortedCollection<EBSrFlag>, EBSrFlag>
0015 EcalSrFlagColMerger;
0016 typedef DoubleCollectionMerger<HBHEDigiCollection, HBHEDataFrame, HcalCalibDigiCollection, HcalCalibDataFrame>
0017 HcalDigiColMerger;
0018
0019 template <typename T1, typename T2, typename T3, typename T4>
0020 DoubleCollectionMerger<T1, T2, T3, T4>::DoubleCollectionMerger(const edm::ParameterSet &iConfig) {
0021 std::vector<edm::InputTag> inCollections = iConfig.getParameter<std::vector<edm::InputTag>>("mergCollections");
0022 for (auto const &inCollection : inCollections) {
0023 inputs1_[inCollection.instance()].push_back(consumes<MergeCollection1>(inCollection));
0024 inputs2_[inCollection.instance()].push_back(consumes<MergeCollection2>(inCollection));
0025 }
0026 for (const auto &toproduce : inputs1_) {
0027 produces<MergeCollection1>(toproduce.first);
0028 }
0029 for (const auto &toproduce : inputs2_) {
0030 produces<MergeCollection2>(toproduce.first);
0031 }
0032 }
0033
0034 template <typename T1, typename T2, typename T3, typename T4>
0035 DoubleCollectionMerger<T1, T2, T3, T4>::~DoubleCollectionMerger() {
0036
0037 }
0038
0039 template <typename T1, typename T2, typename T3, typename T4>
0040 void DoubleCollectionMerger<T1, T2, T3, T4>::produce(edm::Event &iEvent, const edm::EventSetup &iSetup) {
0041 for (auto input_ : inputs1_) {
0042 std::unique_ptr<MergeCollection1> output(new MergeCollection1());
0043 std::vector<edm::Handle<MergeCollection1>> inputCollections;
0044 inputCollections.resize(input_.second.size());
0045 for (unsigned id = 0; id < input_.second.size(); id++) {
0046 iEvent.getByToken(input_.second[id], inputCollections[id]);
0047 }
0048 fill_output_obj(output, inputCollections);
0049 iEvent.put(std::move(output), input_.first);
0050 }
0051
0052 for (auto input_ : inputs2_) {
0053 std::unique_ptr<MergeCollection2> output(new MergeCollection2());
0054 std::vector<edm::Handle<MergeCollection2>> inputCollections;
0055 inputCollections.resize(input_.second.size());
0056 for (unsigned id = 0; id < input_.second.size(); id++) {
0057 iEvent.getByToken(input_.second[id], inputCollections[id]);
0058 }
0059 fill_output_obj(output, inputCollections);
0060 iEvent.put(std::move(output), input_.first);
0061 }
0062 }
0063
0064 template <typename T1, typename T2, typename T3, typename T4>
0065 void DoubleCollectionMerger<T1, T2, T3, T4>::fill_output_obj(
0066 std::unique_ptr<MergeCollection1> &output, std::vector<edm::Handle<MergeCollection1>> &inputCollections) {
0067 assert(0);
0068 }
0069
0070 template <typename T1, typename T2, typename T3, typename T4>
0071 void DoubleCollectionMerger<T1, T2, T3, T4>::fill_output_obj(
0072 std::unique_ptr<MergeCollection2> &output, std::vector<edm::Handle<MergeCollection2>> &inputCollections) {
0073 assert(0);
0074 }
0075
0076 template <typename T1, typename T2, typename T3, typename T4>
0077 void DoubleCollectionMerger<T1, T2, T3, T4>::fill_output_obj_digiflag(
0078 std::unique_ptr<MergeCollection1> &output, std::vector<edm::Handle<MergeCollection1>> &inputCollections) {
0079 std::map<uint32_t, BaseHit1> output_map;
0080
0081
0082 for (auto const &inputCollection : inputCollections) {
0083 for (typename MergeCollection1::const_iterator obj = inputCollection->begin(); obj != inputCollection->end();
0084 ++obj) {
0085 DetId detIdObject(obj->id().rawId());
0086
0087 std::map<uint32_t, EESrFlag>::iterator it = output_map.find(detIdObject.rawId());
0088 if (it == output_map.end()) {
0089 BaseHit1 *akt_flag_obj = &output_map[detIdObject.rawId()];
0090 const T2 &newSrFlag(*obj);
0091 *akt_flag_obj = newSrFlag;
0092 } else {
0093
0094 BaseHit1 preFlag = it->second;
0095 BaseHit1 *akt_flag_obj = &output_map[detIdObject.rawId()];
0096 T2 newSrFlag(*obj);
0097
0098 newSrFlag.setValue(std::max(obj->value(), preFlag.value()));
0099 if (preFlag.value() == 3 or obj->value() == 3)
0100 newSrFlag.setValue(3);
0101 if (preFlag.value() == 7 or obj->value() == 7)
0102 newSrFlag.setValue(7);
0103
0104 *akt_flag_obj = newSrFlag;
0105 }
0106 }
0107 }
0108
0109
0110 for (typename std::map<uint32_t, BaseHit1>::const_iterator outFlags = output_map.begin();
0111 outFlags != output_map.end();
0112 ++outFlags) {
0113 BaseHit1 currFlag = outFlags->second;
0114 output->push_back(outFlags->second);
0115 }
0116 output->sort();
0117 }
0118
0119 template <typename T1, typename T2, typename T3, typename T4>
0120 void DoubleCollectionMerger<T1, T2, T3, T4>::fill_output_obj_digiflag(
0121 std::unique_ptr<MergeCollection2> &output, std::vector<edm::Handle<MergeCollection2>> &inputCollections) {
0122 std::map<uint32_t, BaseHit2> output_map;
0123
0124
0125 for (auto const &inputCollection : inputCollections) {
0126 for (typename MergeCollection2::const_iterator obj = inputCollection->begin(); obj != inputCollection->end();
0127 ++obj) {
0128 DetId detIdObject(obj->id().rawId());
0129
0130 std::map<uint32_t, EBSrFlag>::iterator it = output_map.find(detIdObject.rawId());
0131 if (it == output_map.end()) {
0132 BaseHit2 *akt_flag_obj = &output_map[detIdObject.rawId()];
0133 const T4 &newSrFlag(*obj);
0134 *akt_flag_obj = newSrFlag;
0135 } else {
0136
0137 BaseHit2 preFlag = it->second;
0138 BaseHit2 *akt_flag_obj = &output_map[detIdObject.rawId()];
0139 T4 newSrFlag(*obj);
0140
0141 newSrFlag.setValue(std::max(obj->value(), preFlag.value()));
0142 if (preFlag.value() == 3 or obj->value() == 3)
0143 newSrFlag.setValue(3);
0144 if (preFlag.value() == 7 or obj->value() == 7)
0145 newSrFlag.setValue(7);
0146
0147 *akt_flag_obj = newSrFlag;
0148 }
0149 }
0150 }
0151
0152
0153 for (typename std::map<uint32_t, BaseHit2>::const_iterator outFlags = output_map.begin();
0154 outFlags != output_map.end();
0155 ++outFlags) {
0156 BaseHit2 currFlag = outFlags->second;
0157 output->push_back(outFlags->second);
0158 }
0159 output->sort();
0160 }
0161
0162 template <typename T1, typename T2, typename T3, typename T4>
0163 void DoubleCollectionMerger<T1, T2, T3, T4>::fill_output_obj_hcaldigi(
0164 std::unique_ptr<MergeCollection1> &output, std::vector<edm::Handle<MergeCollection1>> &inputCollections) {
0165
0166 return;
0167 }
0168
0169 template <typename T1, typename T2, typename T3, typename T4>
0170 void DoubleCollectionMerger<T1, T2, T3, T4>::fill_output_obj_hcaldigi(
0171 std::unique_ptr<MergeCollection2> &output, std::vector<edm::Handle<MergeCollection2>> &inputCollections) {
0172
0173 return;
0174 }
0175
0176 template <>
0177 void DoubleCollectionMerger<edm::SortedCollection<EESrFlag>, EESrFlag, edm::SortedCollection<EBSrFlag>, EBSrFlag>::
0178 fill_output_obj(std::unique_ptr<MergeCollection1> &output,
0179 std::vector<edm::Handle<MergeCollection1>> &inputCollections) {
0180 fill_output_obj_digiflag(output, inputCollections);
0181 }
0182
0183 template <>
0184 void DoubleCollectionMerger<edm::SortedCollection<EESrFlag>, EESrFlag, edm::SortedCollection<EBSrFlag>, EBSrFlag>::
0185 fill_output_obj(std::unique_ptr<MergeCollection2> &output,
0186 std::vector<edm::Handle<MergeCollection2>> &inputCollections) {
0187 fill_output_obj_digiflag(output, inputCollections);
0188 }
0189
0190 template <>
0191 void DoubleCollectionMerger<HBHEDigiCollection, HBHEDataFrame, HcalCalibDigiCollection, HcalCalibDataFrame>::
0192 fill_output_obj(std::unique_ptr<MergeCollection1> &output,
0193 std::vector<edm::Handle<MergeCollection1>> &inputCollections) {
0194 fill_output_obj_hcaldigi(output, inputCollections);
0195 }
0196
0197 template <>
0198 void DoubleCollectionMerger<HBHEDigiCollection, HBHEDataFrame, HcalCalibDigiCollection, HcalCalibDataFrame>::
0199 fill_output_obj(std::unique_ptr<MergeCollection2> &output,
0200 std::vector<edm::Handle<MergeCollection2>> &inputCollections) {
0201 fill_output_obj_hcaldigi(output, inputCollections);
0202 }
0203
0204 DEFINE_FWK_MODULE(EcalSrFlagColMerger);
0205 DEFINE_FWK_MODULE(HcalDigiColMerger);