File indexing completed on 2023-03-17 11:25:08
0001
0002
0003
0004
0005
0006
0007 #include "DataFormats/Common/interface/Handle.h"
0008 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0009 #include <map>
0010 #include <memory>
0011
0012
0013 #include "DataMixingSiStripWorker.h"
0014
0015 using namespace std;
0016
0017 namespace edm {
0018
0019
0020
0021 DataMixingSiStripWorker::DataMixingSiStripWorker() {}
0022
0023
0024 DataMixingSiStripWorker::DataMixingSiStripWorker(const edm::ParameterSet &ps, edm::ConsumesCollector &&iC)
0025 : label_(ps.getParameter<std::string>("Label"))
0026
0027 {
0028
0029
0030
0031
0032
0033
0034 SistripLabelSig_ = ps.getParameter<edm::InputTag>("SistripLabelSig");
0035 SiStripPileInputTag_ = ps.getParameter<edm::InputTag>("SiStripPileInputTag");
0036
0037 SiStripDigiCollectionDM_ = ps.getParameter<std::string>("SiStripDigiCollectionDM");
0038
0039 SiStripDigiToken_ = iC.consumes<edm::DetSetVector<SiStripDigi>>(SistripLabelSig_);
0040 SiStripDigiPToken_ = iC.consumes<edm::DetSetVector<SiStripDigi>>(SiStripPileInputTag_);
0041
0042
0043 SiHitStorage_.clear();
0044 }
0045
0046
0047 DataMixingSiStripWorker::~DataMixingSiStripWorker() {}
0048
0049 void DataMixingSiStripWorker::addSiStripSignals(const edm::Event &e) {
0050
0051
0052 Handle<edm::DetSetVector<SiStripDigi>> input;
0053
0054 if (e.getByToken(SiStripDigiToken_, input)) {
0055 OneDetectorMap LocalMap;
0056
0057
0058 edm::DetSetVector<SiStripDigi>::const_iterator DSViter = input->begin();
0059 for (; DSViter != input->end(); DSViter++) {
0060 #ifdef DEBUG
0061 LogDebug("DataMixingSiStripWorker") << "Processing DetID " << DSViter->id;
0062 #endif
0063
0064 LocalMap.clear();
0065 LocalMap.reserve((DSViter->data).size());
0066 LocalMap.insert(LocalMap.end(), (DSViter->data).begin(), (DSViter->data).end());
0067
0068 SiHitStorage_.insert(SiGlobalIndex::value_type(DSViter->id, LocalMap));
0069 }
0070 }
0071 }
0072
0073 void DataMixingSiStripWorker::addSiStripPileups(const int bcr,
0074 const EventPrincipal *ep,
0075 unsigned int eventNr,
0076 ModuleCallingContext const *mcc) {
0077 LogDebug("DataMixingSiStripWorker") << "\n===============> adding pileups from event " << ep->id()
0078 << " for bunchcrossing " << bcr;
0079
0080
0081
0082
0083 std::shared_ptr<Wrapper<edm::DetSetVector<SiStripDigi>> const> inputPTR =
0084 getProductByTag<edm::DetSetVector<SiStripDigi>>(*ep, SiStripPileInputTag_, mcc);
0085
0086 if (inputPTR) {
0087 const edm::DetSetVector<SiStripDigi> *input = const_cast<edm::DetSetVector<SiStripDigi> *>(inputPTR->product());
0088
0089
0090
0091
0092
0093
0094
0095 OneDetectorMap LocalMap;
0096
0097
0098 edm::DetSetVector<SiStripDigi>::const_iterator DSViter = input->begin();
0099 for (; DSViter != input->end(); DSViter++) {
0100 #ifdef DEBUG
0101 LogDebug("DataMixingSiStripWorker") << "Pileups: Processing DetID " << DSViter->id;
0102 #endif
0103
0104
0105
0106 SiGlobalIndex::const_iterator itest;
0107
0108 itest = SiHitStorage_.find(DSViter->id);
0109
0110 if (itest != SiHitStorage_.end()) {
0111
0112 LocalMap = itest->second;
0113
0114
0115 LocalMap.insert(LocalMap.end(), (DSViter->data).begin(), (DSViter->data).end());
0116 std::stable_sort(LocalMap.begin(), LocalMap.end(), DataMixingSiStripWorker::StrictWeakOrdering());
0117 SiHitStorage_[DSViter->id] = LocalMap;
0118
0119 } else {
0120
0121
0122 LocalMap.clear();
0123 LocalMap.reserve((DSViter->data).size());
0124 LocalMap.insert(LocalMap.end(), (DSViter->data).begin(), (DSViter->data).end());
0125
0126 SiHitStorage_.insert(SiGlobalIndex::value_type(DSViter->id, LocalMap));
0127 }
0128 }
0129 }
0130 }
0131
0132 void DataMixingSiStripWorker::putSiStrip(edm::Event &e) {
0133
0134 std::vector<edm::DetSet<SiStripDigi>> vSiStripDigi;
0135
0136
0137
0138
0139
0140
0141 for (SiGlobalIndex::const_iterator IDet = SiHitStorage_.begin(); IDet != SiHitStorage_.end(); IDet++) {
0142 edm::DetSet<SiStripDigi> SSD(IDet->first);
0143
0144 OneDetectorMap LocalMap = IDet->second;
0145
0146
0147 int formerStrip = -1;
0148 int currentStrip;
0149 int ADCSum = 0;
0150
0151 OneDetectorMap::const_iterator iLocalchk;
0152 OneDetectorMap::const_iterator iLocal = LocalMap.begin();
0153 for (; iLocal != LocalMap.end(); ++iLocal) {
0154 currentStrip = iLocal->strip();
0155
0156 if (currentStrip == formerStrip) {
0157 ADCSum += iLocal->adc();
0158 } else {
0159 if (formerStrip != -1) {
0160 if (ADCSum > 511)
0161 ADCSum = 255;
0162 else if (ADCSum > 253 && ADCSum < 512)
0163 ADCSum = 254;
0164 SiStripDigi aHit(formerStrip, ADCSum);
0165 SSD.push_back(aHit);
0166 }
0167
0168 formerStrip = currentStrip;
0169 ADCSum = iLocal->adc();
0170 }
0171
0172 iLocalchk = iLocal;
0173 if ((++iLocalchk) == LocalMap.end()) {
0174 if (ADCSum > 511)
0175 ADCSum = 255;
0176 else if (ADCSum > 253 && ADCSum < 512)
0177 ADCSum = 254;
0178 SSD.push_back(SiStripDigi(formerStrip, ADCSum));
0179 }
0180 }
0181
0182 vSiStripDigi.push_back(SSD);
0183
0184 }
0185
0186
0187 LogInfo("DataMixingSiStripWorker") << "total # Merged strips: " << vSiStripDigi.size();
0188
0189
0190
0191 std::unique_ptr<edm::DetSetVector<SiStripDigi>> MySiStripDigis(new edm::DetSetVector<SiStripDigi>(vSiStripDigi));
0192
0193
0194
0195 e.put(std::move(MySiStripDigis), SiStripDigiCollectionDM_);
0196
0197
0198 SiHitStorage_.clear();
0199 }
0200
0201 }