File indexing completed on 2024-04-06 12:02:40
0001 #include "CondFormats/SiStripObjects/interface/NoiseAnalysis.h"
0002 #include "DataFormats/SiStripCommon/interface/SiStripHistoTitle.h"
0003 #include "DataFormats/SiStripCommon/interface/SiStripEnumsAndStrings.h"
0004 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0005 #include <iostream>
0006 #include <iomanip>
0007 #include <cmath>
0008
0009 using namespace sistrip;
0010
0011
0012
0013 NoiseAnalysis::NoiseAnalysis(const uint32_t& key)
0014 : CommissioningAnalysis(key, "NoiseAnalysis"),
0015 peds_(2, VFloat(128, sistrip::invalid_)),
0016 noise_(2, VFloat(128, sistrip::invalid_)),
0017 raw_(2, VFloat(128, sistrip::invalid_)),
0018 dead_(2, VInt(0, sistrip::invalid_)),
0019 noisy_(2, VInt(0, sistrip::invalid_)),
0020 pedsMean_(2, sistrip::invalid_),
0021 pedsSpread_(2, sistrip::invalid_),
0022 noiseMean_(2, sistrip::invalid_),
0023 noiseSpread_(2, sistrip::invalid_),
0024 rawMean_(2, sistrip::invalid_),
0025 rawSpread_(2, sistrip::invalid_),
0026 pedsMax_(2, sistrip::invalid_),
0027 pedsMin_(2, sistrip::invalid_),
0028 noiseMax_(2, sistrip::invalid_),
0029 noiseMin_(2, sistrip::invalid_),
0030 rawMax_(2, sistrip::invalid_),
0031 rawMin_(2, sistrip::invalid_),
0032 legacy_(false) {
0033 dead_[0].reserve(256);
0034 dead_[1].reserve(256);
0035 noisy_[0].reserve(256);
0036 noisy_[1].reserve(256);
0037 }
0038
0039
0040
0041 NoiseAnalysis::NoiseAnalysis()
0042 : CommissioningAnalysis("NoiseAnalysis"),
0043 peds_(2, VFloat(128, sistrip::invalid_)),
0044 noise_(2, VFloat(128, sistrip::invalid_)),
0045 raw_(2, VFloat(128, sistrip::invalid_)),
0046 dead_(2, VInt(0, sistrip::invalid_)),
0047 noisy_(2, VInt(0, sistrip::invalid_)),
0048 pedsMean_(2, sistrip::invalid_),
0049 pedsSpread_(2, sistrip::invalid_),
0050 noiseMean_(2, sistrip::invalid_),
0051 noiseSpread_(2, sistrip::invalid_),
0052 rawMean_(2, sistrip::invalid_),
0053 rawSpread_(2, sistrip::invalid_),
0054 pedsMax_(2, sistrip::invalid_),
0055 pedsMin_(2, sistrip::invalid_),
0056 noiseMax_(2, sistrip::invalid_),
0057 noiseMin_(2, sistrip::invalid_),
0058 rawMax_(2, sistrip::invalid_),
0059 rawMin_(2, sistrip::invalid_),
0060 legacy_(false) {
0061 dead_[0].reserve(256);
0062 dead_[1].reserve(256);
0063 noisy_[0].reserve(256);
0064 noisy_[1].reserve(256);
0065 }
0066
0067
0068
0069 void NoiseAnalysis::reset() {
0070 peds_ = VVFloat(2, VFloat(128, sistrip::invalid_));
0071 noise_ = VVFloat(2, VFloat(128, sistrip::invalid_));
0072 raw_ = VVFloat(2, VFloat(128, sistrip::invalid_));
0073 dead_ = VVInt(2, VInt(0, sistrip::invalid_));
0074 noisy_ = VVInt(2, VInt(0, sistrip::invalid_));
0075 pedsMean_ = VFloat(2, sistrip::invalid_);
0076 pedsSpread_ = VFloat(2, sistrip::invalid_);
0077 noiseMean_ = VFloat(2, sistrip::invalid_);
0078 noiseSpread_ = VFloat(2, sistrip::invalid_);
0079 rawMean_ = VFloat(2, sistrip::invalid_);
0080 rawSpread_ = VFloat(2, sistrip::invalid_);
0081 pedsMax_ = VFloat(2, sistrip::invalid_);
0082 pedsMin_ = VFloat(2, sistrip::invalid_);
0083 noiseMax_ = VFloat(2, sistrip::invalid_);
0084 noiseMin_ = VFloat(2, sistrip::invalid_);
0085 rawMax_ = VFloat(2, sistrip::invalid_);
0086 rawMin_ = VFloat(2, sistrip::invalid_);
0087 dead_[0].reserve(256);
0088 dead_[1].reserve(256);
0089 noisy_[0].reserve(256);
0090 noisy_[1].reserve(256);
0091 legacy_ = false;
0092 }
0093
0094
0095
0096 bool NoiseAnalysis::isValid() const {
0097 return (pedsMean_[0] < sistrip::maximum_ && pedsMean_[1] < sistrip::maximum_ && pedsSpread_[0] < sistrip::maximum_ &&
0098 pedsSpread_[1] < sistrip::maximum_ && noiseMean_[0] < sistrip::maximum_ &&
0099 noiseMean_[1] < sistrip::maximum_ && noiseSpread_[0] < sistrip::maximum_ &&
0100 noiseSpread_[1] < sistrip::maximum_ && rawMean_[0] < sistrip::maximum_ && rawMean_[1] < sistrip::maximum_ &&
0101 rawSpread_[0] < sistrip::maximum_ && rawSpread_[1] < sistrip::maximum_ && pedsMax_[0] < sistrip::maximum_ &&
0102 pedsMax_[1] < sistrip::maximum_ && pedsMin_[0] < sistrip::maximum_ && pedsMin_[1] < sistrip::maximum_ &&
0103 noiseMax_[0] < sistrip::maximum_ && noiseMax_[1] < sistrip::maximum_ && noiseMin_[0] < sistrip::maximum_ &&
0104 noiseMin_[1] < sistrip::maximum_ && rawMax_[0] < sistrip::maximum_ && rawMax_[1] < sistrip::maximum_ &&
0105 rawMin_[0] < sistrip::maximum_ && rawMin_[1] < sistrip::maximum_ && getErrorCodes().empty());
0106
0107
0108 }
0109
0110
0111
0112 void NoiseAnalysis::summary(std::stringstream& ss) const {
0113 SiStripFecKey fec_key(fecKey());
0114 SiStripFedKey fed_key(fedKey());
0115
0116 sistrip::RunType type = SiStripEnumsAndStrings::runType(myName());
0117
0118 std::stringstream extra1, extra2, extra3;
0119 if (legacy_) {
0120 extra1 << sistrip::extrainfo::pedsAndRawNoise_;
0121 extra2 << sistrip::extrainfo::pedsAndCmSubNoise_;
0122 extra3 << sistrip::extrainfo::commonMode_;
0123 } else {
0124 extra1 << sistrip::extrainfo::pedestals_;
0125 extra2 << sistrip::extrainfo::rawNoise_;
0126 extra3 << sistrip::extrainfo::commonMode_;
0127 }
0128
0129 std::string title1 = SiStripHistoTitle(sistrip::EXPERT_HISTO,
0130 type,
0131 sistrip::FED_KEY,
0132 fed_key.key(),
0133 sistrip::LLD_CHAN,
0134 fec_key.lldChan(),
0135 extra1.str())
0136 .title();
0137 std::string title2 = SiStripHistoTitle(sistrip::EXPERT_HISTO,
0138 type,
0139 sistrip::FED_KEY,
0140 fed_key.key(),
0141 sistrip::LLD_CHAN,
0142 fec_key.lldChan(),
0143 extra2.str())
0144 .title();
0145 std::string title3 = SiStripHistoTitle(sistrip::EXPERT_HISTO,
0146 type,
0147 sistrip::FED_KEY,
0148 fed_key.key(),
0149 sistrip::APV,
0150 SiStripFecKey::i2cAddr(fec_key.lldChan(), true),
0151 extra3.str())
0152 .title();
0153 std::string title4 = SiStripHistoTitle(sistrip::EXPERT_HISTO,
0154 type,
0155 sistrip::FED_KEY,
0156 fed_key.key(),
0157 sistrip::APV,
0158 SiStripFecKey::i2cAddr(fec_key.lldChan(), false),
0159 extra3.str())
0160 .title();
0161
0162 ss << " Summary"
0163 << ":" << (isValid() ? "Valid" : "Invalid") << ":" << sistrip::controlView_ << ":" << fec_key.fecCrate() << "/"
0164 << fec_key.fecSlot() << "/" << fec_key.fecRing() << "/" << fec_key.ccuAddr() << "/" << fec_key.ccuChan() << ":"
0165 << sistrip::dqmRoot_ << sistrip::dir_ << "Collate" << sistrip::dir_
0166 << SiStripFecKey(fec_key.fecCrate(), fec_key.fecSlot(), fec_key.fecRing(), fec_key.ccuAddr(), fec_key.ccuChan())
0167 .path()
0168 << ":" << title1 << ";" << title2 << ";" << title3 << ";" << title4 << std::endl;
0169 }
0170
0171
0172
0173 void NoiseAnalysis::print(std::stringstream& ss, uint32_t iapv) {
0174 if (iapv == 1 || iapv == 2) {
0175 iapv--;
0176 } else {
0177 iapv = 0;
0178 }
0179
0180 if (peds_[iapv].size() < 128 || noise_[iapv].size() < 128 || raw_[iapv].size() < 128) {
0181 edm::LogWarning(mlCommissioning_) << "[" << myName() << "::" << __func__ << "]"
0182 << " Unexpected number of pedestal/noise values: " << peds_[iapv].size() << ", "
0183 << noise_[iapv].size() << ", " << raw_[iapv].size();
0184 return;
0185 }
0186
0187 header(ss);
0188 ss << " Monitorables for APV number : " << iapv;
0189 if (iapv == 0) {
0190 ss << " (first of pair)";
0191 } else if (iapv == 1) {
0192 ss << " (second of pair)";
0193 }
0194 ss << std::endl;
0195 ss << std::fixed << std::setprecision(2);
0196 ss << " Example peds/noise for strips : "
0197 << " 0, 31, 63, 127" << std::endl
0198 << " Peds [ADC] : " << std::setw(6) << peds_[iapv][0] << ", " << std::setw(6)
0199 << peds_[iapv][31] << ", " << std::setw(6) << peds_[iapv][63] << ", " << std::setw(6) << peds_[iapv][127]
0200 << std::endl
0201 << " Noise [ADC] : " << std::setw(6) << noise_[iapv][0] << ", " << std::setw(6)
0202 << noise_[iapv][31] << ", " << std::setw(6) << noise_[iapv][63] << ", " << std::setw(6) << noise_[iapv][127]
0203 << std::endl
0204 << " Raw noise [ADC] : " << std::setw(6) << raw_[iapv][0] << ", " << std::setw(6) << raw_[iapv][31]
0205 << ", " << std::setw(6) << raw_[iapv][63] << ", " << std::setw(6) << raw_[iapv][127] << std::endl
0206 << " Dead strips (<5s) [strip] : (" << dead_[iapv].size() << " in total) ";
0207 for (uint16_t ii = 0; ii < dead_[iapv].size(); ii++) {
0208 ss << dead_[iapv][ii] << " ";
0209 }
0210
0211 ss << std::endl;
0212 ss << " Noisy strips (>5s) [strip] : (" << noisy_[iapv].size() << " in total) ";
0213 for (uint16_t ii = 0; ii < noisy_[iapv].size(); ii++) {
0214 ss << noisy_[iapv][ii] << " ";
0215 }
0216 ss << std::endl;
0217 ss << " Mean peds +/- spread [ADC] : " << pedsMean_[iapv] << " +/- " << pedsSpread_[iapv] << std::endl
0218 << " Min/Max pedestal [ADC] : " << pedsMin_[iapv] << " <-> " << pedsMax_[iapv] << std::endl
0219 << " Mean noise +/- spread [ADC] : " << noiseMean_[iapv] << " +/- " << noiseSpread_[iapv] << std::endl
0220 << " Min/Max noise [ADC] : " << noiseMin_[iapv] << " <-> " << noiseMax_[iapv] << std::endl
0221 << " Mean raw noise +/- spread [ADC] : " << rawMean_[iapv] << " +/- " << rawSpread_[iapv] << std::endl
0222 << " Min/Max raw noise [ADC] : " << rawMin_[iapv] << " <-> " << rawMax_[iapv] << std::endl
0223 << " Normalised noise : "
0224 << "(yet to be implemented...)" << std::endl
0225 << std::boolalpha << " isValid : " << isValid() << std::endl
0226 << std::noboolalpha << " Error codes (found " << std::setw(2) << std::setfill(' ') << getErrorCodes().size()
0227 << ") : ";
0228 if (getErrorCodes().empty()) {
0229 ss << "(none)";
0230 } else {
0231 VString::const_iterator istr = getErrorCodes().begin();
0232 VString::const_iterator jstr = getErrorCodes().end();
0233 for (; istr != jstr; ++istr) {
0234 ss << *istr << " ";
0235 }
0236 }
0237 ss << std::endl;
0238 }