File indexing completed on 2024-04-06 12:26:31
0001 #include "RecoLocalTracker/SiStripZeroSuppression/interface/SiStripPedestalsSubtractor.h"
0002 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0003 #include "FWCore/Utilities/interface/Exception.h"
0004
0005 void SiStripPedestalsSubtractor::init(const edm::EventSetup& es) {
0006 if (pedestalsWatcher_.check(es)) {
0007 pedestalsHandle = &es.getData(pedestalsToken_);
0008 }
0009 }
0010
0011 void SiStripPedestalsSubtractor::subtract(uint32_t detId, uint16_t firstStrip, std::vector<int16_t>& digis) {
0012 subtract_(detId, firstStrip, digis, digis);
0013 }
0014 void SiStripPedestalsSubtractor::subtract(const edm::DetSet<SiStripRawDigi>& input, std::vector<int16_t>& output) {
0015 subtract_(input.id, 0, input, output);
0016 }
0017
0018 template <class input_t>
0019 inline void SiStripPedestalsSubtractor::subtract_(uint32_t id,
0020 uint16_t firstStrip,
0021 const input_t& input,
0022 std::vector<int16_t>& output) {
0023 try {
0024 pedestals.resize(firstStrip + input.size());
0025 SiStripPedestals::Range pedestalsRange = pedestalsHandle->getRange(id);
0026 pedestalsHandle->allPeds(pedestals, pedestalsRange);
0027
0028 typename input_t::const_iterator inDigi = input.begin();
0029 std::vector<int>::const_iterator ped = pedestals.begin() + firstStrip;
0030 std::vector<int16_t>::iterator outDigi = output.begin();
0031
0032 while (inDigi != input.end()) {
0033 *outDigi = eval(*inDigi) - *ped + ((*ped > 895) ? 1024 : 0);
0034
0035 if (fedmode_ && *outDigi < 0)
0036 *outDigi = 0;
0037
0038 ++inDigi;
0039 ++ped;
0040 ++outDigi;
0041 }
0042
0043 } catch (cms::Exception& e) {
0044 edm::LogError("SiStripPedestalsSubtractor") << "[SiStripPedestalsSubtractor::subtract] DetId " << id
0045 << " propagating error from SiStripPedestal" << e.what();
0046 output.clear();
0047 }
0048 }