File indexing completed on 2023-03-17 10:56:32
0001 #include "DQM/SiStripCommissioningSources/interface/VpspScanTask.h"
0002 #include "DataFormats/SiStripCommon/interface/SiStripConstants.h"
0003 #include "DataFormats/SiStripCommon/interface/SiStripFecKey.h"
0004 #include "DataFormats/SiStripCommon/interface/SiStripHistoTitle.h"
0005 #include "DQMServices/Core/interface/DQMStore.h"
0006 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0007 #include <algorithm>
0008
0009 using namespace sistrip;
0010
0011
0012
0013 VpspScanTask::VpspScanTask(DQMStore* dqm, const FedChannelConnection& conn)
0014 : CommissioningTask(dqm, conn, "VpspScanTask"), vpsp_() {}
0015
0016
0017
0018 VpspScanTask::~VpspScanTask() {}
0019
0020
0021
0022 void VpspScanTask::book() {
0023 uint16_t nbins = 60;
0024
0025 std::string title;
0026
0027 vpsp_.resize(2);
0028 for (uint16_t iapv = 0; iapv < 2; iapv++) {
0029 if (connection().i2cAddr(iapv)) {
0030 std::stringstream extra_info;
0031 extra_info << sistrip::apv_ << iapv;
0032
0033 title = SiStripHistoTitle(sistrip::EXPERT_HISTO,
0034 sistrip::VPSP_SCAN,
0035 sistrip::FED_KEY,
0036 fedKey(),
0037 sistrip::LLD_CHAN,
0038 connection().lldChannel(),
0039 extra_info.str())
0040 .title();
0041
0042 vpsp_[iapv].histo(dqm()->bookProfile(title, title, nbins, -0.5, nbins * 1. - 0.5, 1025, 0., 1025.));
0043
0044 vpsp_[iapv].vNumOfEntries_.resize(nbins, 0);
0045 vpsp_[iapv].vSumOfContents_.resize(nbins, 0);
0046 vpsp_[iapv].vSumOfSquares_.resize(nbins, 0);
0047 }
0048 }
0049 }
0050
0051
0052
0053 void VpspScanTask::fill(const SiStripEventSummary& summary, const edm::DetSet<SiStripRawDigi>& digis) {
0054
0055 uint32_t vpsp = summary.vpsp();
0056 uint32_t ccu_chan = summary.vpspCcuChan();
0057
0058
0059 if (SiStripFecKey(fecKey()).ccuChan() != ccu_chan) {
0060 return;
0061 }
0062
0063 if (digis.data.size() != 256) {
0064 edm::LogWarning(mlDqmSource_) << "[VpspScanTask::" << __func__ << "]"
0065 << " Unexpected number of digis! " << digis.data.size();
0066 return;
0067 }
0068
0069
0070 for (uint16_t iapv = 0; iapv < 2; iapv++) {
0071 if (vpsp >= vpsp_[iapv].vNumOfEntries_.size()) {
0072 edm::LogWarning(mlDqmSource_) << "[VpspScanTask::" << __func__ << "]"
0073 << " Unexpected VPSP value! " << vpsp;
0074 return;
0075 }
0076
0077 std::vector<uint16_t> baseline;
0078 baseline.reserve(128);
0079 for (uint16_t idigi = 128 * iapv; idigi < 128 * (iapv + 1); idigi++) {
0080 baseline.push_back(digis.data[idigi].adc());
0081 }
0082 sort(baseline.begin(), baseline.end());
0083 uint16_t index = baseline.size() % 2 ? baseline.size() / 2 : baseline.size() / 2 - 1;
0084
0085 if (!baseline.empty()) {
0086 updateHistoSet(vpsp_[iapv], vpsp, baseline[index]);
0087 }
0088 }
0089 }
0090
0091
0092
0093 void VpspScanTask::update() {
0094 for (uint32_t iapv = 0; iapv < vpsp_.size(); iapv++) {
0095 updateHistoSet(vpsp_[iapv]);
0096 }
0097 }