File indexing completed on 2024-04-06 12:02:40
0001 #include "CondFormats/SiStripObjects/interface/PedsFullNoiseAnalysis.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 PedsFullNoiseAnalysis::PedsFullNoiseAnalysis(const uint32_t& key)
0014 : CommissioningAnalysis(key, "PedsFullNoiseAnalysis"),
0015 peds_(2, VFloat(128, sistrip::invalid_)),
0016 noise_(2, VFloat(128, sistrip::invalid_)),
0017 raw_(2, VFloat(128, sistrip::invalid_)),
0018 adProbab_(2, VFloat(128, sistrip::invalid_)),
0019 ksProbab_(2, VFloat(128, sistrip::invalid_)),
0020 jbProbab_(2, VFloat(128, sistrip::invalid_)),
0021 chi2Probab_(2, VFloat(128, sistrip::invalid_)),
0022 residualRMS_(2, VFloat(128, sistrip::invalid_)),
0023 residualSigmaGaus_(2, VFloat(128, sistrip::invalid_)),
0024 noiseSignificance_(2, VFloat(128, sistrip::invalid_)),
0025 residualMean_(2, VFloat(128, sistrip::invalid_)),
0026 residualSkewness_(2, VFloat(128, sistrip::invalid_)),
0027 residualKurtosis_(2, VFloat(128, sistrip::invalid_)),
0028 residualIntegralNsigma_(2, VFloat(128, sistrip::invalid_)),
0029 residualIntegral_(2, VFloat(128, sistrip::invalid_)),
0030 badStripBit_(2, VInt(128, sistrip::invalid_)),
0031 deadStripBit_(2, VInt(128, sistrip::invalid_)),
0032 deadStrip_(2, VInt(0, sistrip::invalid_)),
0033 badStrip_(2, VInt(0, sistrip::invalid_)),
0034 shiftedStrip_(2, VInt(0, sistrip::invalid_)),
0035 lowNoiseStrip_(2, VInt(0, sistrip::invalid_)),
0036 largeNoiseStrip_(2, VInt(0, sistrip::invalid_)),
0037 largeNoiseSignificance_(2, VInt(0, sistrip::invalid_)),
0038 badFitStatus_(2, VInt(0, sistrip::invalid_)),
0039 badADProbab_(2, VInt(0, sistrip::invalid_)),
0040 badKSProbab_(2, VInt(0, sistrip::invalid_)),
0041 badJBProbab_(2, VInt(0, sistrip::invalid_)),
0042 badChi2Probab_(2, VInt(0, sistrip::invalid_)),
0043 badTailStrip_(2, VInt(0, sistrip::invalid_)),
0044 badDoublePeakStrip_(2, VInt(0, sistrip::invalid_)),
0045 pedsMean_(2, sistrip::invalid_),
0046 pedsSpread_(2, sistrip::invalid_),
0047 noiseMean_(2, sistrip::invalid_),
0048 noiseSpread_(2, sistrip::invalid_),
0049 rawMean_(2, sistrip::invalid_),
0050 rawSpread_(2, sistrip::invalid_),
0051 pedsMax_(2, sistrip::invalid_),
0052 pedsMin_(2, sistrip::invalid_),
0053 noiseMax_(2, sistrip::invalid_),
0054 noiseMin_(2, sistrip::invalid_),
0055 rawMax_(2, sistrip::invalid_),
0056 rawMin_(2, sistrip::invalid_),
0057 legacy_(false) {
0058
0059 for (auto iapv : deadStrip_)
0060 iapv.reserve(128);
0061 for (auto iapv : badStrip_)
0062 iapv.reserve(128);
0063 for (auto iapv : shiftedStrip_)
0064 iapv.reserve(128);
0065 for (auto iapv : lowNoiseStrip_)
0066 iapv.reserve(128);
0067 for (auto iapv : largeNoiseStrip_)
0068 iapv.reserve(128);
0069 for (auto iapv : largeNoiseSignificance_)
0070 iapv.reserve(128);
0071 for (auto iapv : badFitStatus_)
0072 iapv.reserve(128);
0073 for (auto iapv : badADProbab_)
0074 iapv.reserve(128);
0075 for (auto iapv : badKSProbab_)
0076 iapv.reserve(128);
0077 for (auto iapv : badJBProbab_)
0078 iapv.reserve(128);
0079 for (auto iapv : badChi2Probab_)
0080 iapv.reserve(128);
0081 for (auto iapv : badTailStrip_)
0082 iapv.reserve(128);
0083 for (auto iapv : badDoublePeakStrip_)
0084 iapv.reserve(128);
0085 }
0086
0087
0088
0089 PedsFullNoiseAnalysis::PedsFullNoiseAnalysis()
0090 : CommissioningAnalysis("PedsFullNoiseAnalysis"),
0091 peds_(2, VFloat(128, sistrip::invalid_)),
0092 noise_(2, VFloat(128, sistrip::invalid_)),
0093 raw_(2, VFloat(128, sistrip::invalid_)),
0094 adProbab_(2, VFloat(128, sistrip::invalid_)),
0095 ksProbab_(2, VFloat(128, sistrip::invalid_)),
0096 jbProbab_(2, VFloat(128, sistrip::invalid_)),
0097 chi2Probab_(2, VFloat(128, sistrip::invalid_)),
0098 residualRMS_(2, VFloat(128, sistrip::invalid_)),
0099 residualSigmaGaus_(2, VFloat(128, sistrip::invalid_)),
0100 noiseSignificance_(2, VFloat(128, sistrip::invalid_)),
0101 residualMean_(2, VFloat(128, sistrip::invalid_)),
0102 residualSkewness_(2, VFloat(128, sistrip::invalid_)),
0103 residualKurtosis_(2, VFloat(128, sistrip::invalid_)),
0104 residualIntegralNsigma_(2, VFloat(128, sistrip::invalid_)),
0105 residualIntegral_(2, VFloat(128, sistrip::invalid_)),
0106 badStripBit_(2, VInt(128, sistrip::invalid_)),
0107 deadStripBit_(2, VInt(128, sistrip::invalid_)),
0108 deadStrip_(2, VInt(0, sistrip::invalid_)),
0109 badStrip_(2, VInt(0, sistrip::invalid_)),
0110 shiftedStrip_(2, VInt(0, sistrip::invalid_)),
0111 lowNoiseStrip_(2, VInt(0, sistrip::invalid_)),
0112 largeNoiseStrip_(2, VInt(0, sistrip::invalid_)),
0113 largeNoiseSignificance_(2, VInt(0, sistrip::invalid_)),
0114 badFitStatus_(2, VInt(0, sistrip::invalid_)),
0115 badADProbab_(2, VInt(0, sistrip::invalid_)),
0116 badKSProbab_(2, VInt(0, sistrip::invalid_)),
0117 badJBProbab_(2, VInt(0, sistrip::invalid_)),
0118 badChi2Probab_(2, VInt(0, sistrip::invalid_)),
0119 badTailStrip_(2, VInt(0, sistrip::invalid_)),
0120 badDoublePeakStrip_(2, VInt(128, sistrip::invalid_)),
0121 pedsMean_(2, sistrip::invalid_),
0122 pedsSpread_(2, sistrip::invalid_),
0123 noiseMean_(2, sistrip::invalid_),
0124 noiseSpread_(2, sistrip::invalid_),
0125 rawMean_(2, sistrip::invalid_),
0126 rawSpread_(2, sistrip::invalid_),
0127 pedsMax_(2, sistrip::invalid_),
0128 pedsMin_(2, sistrip::invalid_),
0129 noiseMax_(2, sistrip::invalid_),
0130 noiseMin_(2, sistrip::invalid_),
0131 rawMax_(2, sistrip::invalid_),
0132 rawMin_(2, sistrip::invalid_),
0133 legacy_(false) {
0134
0135 for (auto iapv : deadStrip_)
0136 iapv.reserve(128);
0137 for (auto iapv : badStrip_)
0138 iapv.reserve(128);
0139 for (auto iapv : shiftedStrip_)
0140 iapv.reserve(128);
0141 for (auto iapv : lowNoiseStrip_)
0142 iapv.reserve(128);
0143 for (auto iapv : largeNoiseStrip_)
0144 iapv.reserve(128);
0145 for (auto iapv : largeNoiseSignificance_)
0146 iapv.reserve(128);
0147 for (auto iapv : badFitStatus_)
0148 iapv.reserve(128);
0149 for (auto iapv : badADProbab_)
0150 iapv.reserve(128);
0151 for (auto iapv : badKSProbab_)
0152 iapv.reserve(128);
0153 for (auto iapv : badJBProbab_)
0154 iapv.reserve(128);
0155 for (auto iapv : badChi2Probab_)
0156 iapv.reserve(128);
0157 for (auto iapv : badTailStrip_)
0158 iapv.reserve(128);
0159 for (auto iapv : badDoublePeakStrip_)
0160 iapv.reserve(128);
0161 }
0162
0163
0164
0165 void PedsFullNoiseAnalysis::reset() {
0166 peds_ = VVFloat(2, VFloat(128, sistrip::invalid_));
0167 noise_ = VVFloat(2, VFloat(128, sistrip::invalid_));
0168 raw_ = VVFloat(2, VFloat(128, sistrip::invalid_));
0169 adProbab_ = VVFloat(2, VFloat(128, sistrip::invalid_));
0170 ksProbab_ = VVFloat(2, VFloat(128, sistrip::invalid_));
0171 jbProbab_ = VVFloat(2, VFloat(128, sistrip::invalid_));
0172 chi2Probab_ = VVFloat(2, VFloat(128, sistrip::invalid_));
0173 residualRMS_ = VVFloat(2, VFloat(128, sistrip::invalid_));
0174 residualSigmaGaus_ = VVFloat(2, VFloat(128, sistrip::invalid_));
0175 noiseSignificance_ = VVFloat(2, VFloat(128, sistrip::invalid_));
0176 residualMean_ = VVFloat(2, VFloat(128, sistrip::invalid_));
0177 residualSkewness_ = VVFloat(2, VFloat(128, sistrip::invalid_));
0178 residualKurtosis_ = VVFloat(2, VFloat(128, sistrip::invalid_));
0179 residualIntegralNsigma_ = VVFloat(2, VFloat(128, sistrip::invalid_));
0180 residualIntegral_ = VVFloat(2, VFloat(128, sistrip::invalid_));
0181
0182 deadStrip_ = VVInt(2, VInt(0, sistrip::invalid_));
0183 badStrip_ = VVInt(2, VInt(0, sistrip::invalid_));
0184 badStripBit_ = VVInt(2, VInt(128, sistrip::invalid_));
0185 deadStripBit_ = VVInt(2, VInt(128, sistrip::invalid_));
0186 shiftedStrip_ = VVInt(2, VInt(0, sistrip::invalid_));
0187 lowNoiseStrip_ = VVInt(2, VInt(0, sistrip::invalid_));
0188 largeNoiseStrip_ = VVInt(2, VInt(0, sistrip::invalid_));
0189 largeNoiseSignificance_ = VVInt(2, VInt(0, sistrip::invalid_));
0190 badFitStatus_ = VVInt(2, VInt(0, sistrip::invalid_));
0191 badADProbab_ = VVInt(2, VInt(0, sistrip::invalid_));
0192 badKSProbab_ = VVInt(2, VInt(0, sistrip::invalid_));
0193 badJBProbab_ = VVInt(2, VInt(0, sistrip::invalid_));
0194 badChi2Probab_ = VVInt(2, VInt(0, sistrip::invalid_));
0195 badTailStrip_ = VVInt(2, VInt(0, sistrip::invalid_));
0196 badDoublePeakStrip_ = VVInt(2, VInt(0, sistrip::invalid_));
0197
0198
0199 for (auto iapv : deadStrip_)
0200 iapv.reserve(128);
0201 for (auto iapv : badStrip_)
0202 iapv.reserve(128);
0203 for (auto iapv : shiftedStrip_)
0204 iapv.reserve(128);
0205 for (auto iapv : lowNoiseStrip_)
0206 iapv.reserve(128);
0207 for (auto iapv : largeNoiseStrip_)
0208 iapv.reserve(128);
0209 for (auto iapv : largeNoiseSignificance_)
0210 iapv.reserve(128);
0211 for (auto iapv : badFitStatus_)
0212 iapv.reserve(128);
0213 for (auto iapv : badADProbab_)
0214 iapv.reserve(128);
0215 for (auto iapv : badKSProbab_)
0216 iapv.reserve(128);
0217 for (auto iapv : badJBProbab_)
0218 iapv.reserve(128);
0219 for (auto iapv : badChi2Probab_)
0220 iapv.reserve(128);
0221 for (auto iapv : badTailStrip_)
0222 iapv.reserve(128);
0223 for (auto iapv : badDoublePeakStrip_)
0224 iapv.reserve(128);
0225
0226 pedsMean_ = VFloat(2, sistrip::invalid_);
0227 pedsSpread_ = VFloat(2, sistrip::invalid_);
0228 noiseMean_ = VFloat(2, sistrip::invalid_);
0229 noiseSpread_ = VFloat(2, sistrip::invalid_);
0230 rawMean_ = VFloat(2, sistrip::invalid_);
0231 rawSpread_ = VFloat(2, sistrip::invalid_);
0232 pedsMax_ = VFloat(2, sistrip::invalid_);
0233 pedsMin_ = VFloat(2, sistrip::invalid_);
0234 noiseMax_ = VFloat(2, sistrip::invalid_);
0235 noiseMin_ = VFloat(2, sistrip::invalid_);
0236 rawMax_ = VFloat(2, sistrip::invalid_);
0237 rawMin_ = VFloat(2, sistrip::invalid_);
0238
0239 legacy_ = false;
0240 }
0241
0242
0243
0244 bool PedsFullNoiseAnalysis::isValid() const {
0245 return (pedsMean_[0] < sistrip::maximum_ && pedsMean_[1] < sistrip::maximum_ && pedsSpread_[0] < sistrip::maximum_ &&
0246 pedsSpread_[1] < sistrip::maximum_ && noiseMean_[0] < sistrip::maximum_ &&
0247 noiseMean_[1] < sistrip::maximum_ && noiseSpread_[0] < sistrip::maximum_ &&
0248 noiseSpread_[1] < sistrip::maximum_ && rawMean_[0] < sistrip::maximum_ && rawMean_[1] < sistrip::maximum_ &&
0249 rawSpread_[0] < sistrip::maximum_ && rawSpread_[1] < sistrip::maximum_ && pedsMax_[0] < sistrip::maximum_ &&
0250 pedsMax_[1] < sistrip::maximum_ && pedsMin_[0] < sistrip::maximum_ && pedsMin_[1] < sistrip::maximum_ &&
0251 noiseMax_[0] < sistrip::maximum_ && noiseMax_[1] < sistrip::maximum_ && noiseMin_[0] < sistrip::maximum_ &&
0252 noiseMin_[1] < sistrip::maximum_ && rawMax_[0] < sistrip::maximum_ && rawMax_[1] < sistrip::maximum_ &&
0253 rawMin_[0] < sistrip::maximum_ && rawMin_[1] < sistrip::maximum_ && getErrorCodes().empty());
0254 }
0255
0256
0257
0258 void PedsFullNoiseAnalysis::summary(std::stringstream& ss) const {
0259 SiStripFecKey fec_key(fecKey());
0260 SiStripFedKey fed_key(fedKey());
0261
0262 sistrip::RunType type = SiStripEnumsAndStrings::runType(myName());
0263
0264 std::stringstream extra1, extra2, extra3;
0265 if (legacy_) {
0266 extra1 << sistrip::extrainfo::pedsAndRawNoise_;
0267 extra2 << sistrip::extrainfo::pedsAndCmSubNoise_;
0268 extra3 << sistrip::extrainfo::commonMode_;
0269 } else {
0270 extra1 << sistrip::extrainfo::pedestals_;
0271 extra2 << sistrip::extrainfo::rawNoise_;
0272 extra3 << sistrip::extrainfo::commonMode_;
0273 }
0274
0275 std::string title1 = SiStripHistoTitle(sistrip::EXPERT_HISTO,
0276 type,
0277 sistrip::FED_KEY,
0278 fed_key.key(),
0279 sistrip::LLD_CHAN,
0280 fec_key.lldChan(),
0281 extra1.str())
0282 .title();
0283 std::string title2 = SiStripHistoTitle(sistrip::EXPERT_HISTO,
0284 type,
0285 sistrip::FED_KEY,
0286 fed_key.key(),
0287 sistrip::LLD_CHAN,
0288 fec_key.lldChan(),
0289 extra2.str())
0290 .title();
0291 std::string title3 = SiStripHistoTitle(sistrip::EXPERT_HISTO,
0292 type,
0293 sistrip::FED_KEY,
0294 fed_key.key(),
0295 sistrip::APV,
0296 SiStripFecKey::i2cAddr(fec_key.lldChan(), true),
0297 extra3.str())
0298 .title();
0299 std::string title4 = SiStripHistoTitle(sistrip::EXPERT_HISTO,
0300 type,
0301 sistrip::FED_KEY,
0302 fed_key.key(),
0303 sistrip::APV,
0304 SiStripFecKey::i2cAddr(fec_key.lldChan(), false),
0305 extra3.str())
0306 .title();
0307
0308 ss << " Summary"
0309 << ":" << (isValid() ? "Valid" : "Invalid") << ":" << sistrip::controlView_ << ":" << fec_key.fecCrate() << "/"
0310 << fec_key.fecSlot() << "/" << fec_key.fecRing() << "/" << fec_key.ccuAddr() << "/" << fec_key.ccuChan() << ":"
0311 << sistrip::dqmRoot_ << sistrip::dir_ << "Collate" << sistrip::dir_
0312 << SiStripFecKey(fec_key.fecCrate(), fec_key.fecSlot(), fec_key.fecRing(), fec_key.ccuAddr(), fec_key.ccuChan())
0313 .path()
0314 << ":" << title1 << ";" << title2 << ";" << title3 << ";" << title4 << std::endl;
0315 }
0316
0317
0318
0319 void PedsFullNoiseAnalysis::print(std::stringstream& ss, uint32_t iapv) {
0320 if (iapv == 1 || iapv == 2) {
0321 iapv--;
0322 } else {
0323 iapv = 0;
0324 }
0325
0326 if (peds_[iapv].size() < 128 || noise_[iapv].size() < 128 || raw_[iapv].size() < 128) {
0327 edm::LogWarning(mlCommissioning_) << "[" << myName() << "::" << __func__ << "]"
0328 << " Unexpected number of pedestal/noise values: " << peds_[iapv].size() << ", "
0329 << noise_[iapv].size() << ", " << raw_[iapv].size();
0330 return;
0331 }
0332
0333 header(ss);
0334 ss << " Monitorables for APV number : " << iapv;
0335 if (iapv == 0) {
0336 ss << " (first of pair)";
0337 } else if (iapv == 1) {
0338 ss << " (second of pair)";
0339 }
0340 ss << std::endl;
0341 ss << std::fixed << std::setprecision(2);
0342 ss << " Example peds/noise for strips : "
0343 << " 0, 31, 63, 127" << std::endl
0344 << " Peds [ADC] : " << std::setw(6) << peds_[iapv][0] << ", " << std::setw(6)
0345 << peds_[iapv][31] << ", " << std::setw(6) << peds_[iapv][63] << ", " << std::setw(6) << peds_[iapv][127]
0346 << std::endl
0347 << " Noise [ADC] : " << std::setw(6) << noise_[iapv][0] << ", " << std::setw(6)
0348 << noise_[iapv][31] << ", " << std::setw(6) << noise_[iapv][63] << ", " << std::setw(6) << noise_[iapv][127]
0349 << std::endl
0350 << " Raw noise [ADC] : " << std::setw(6) << raw_[iapv][0] << ", " << std::setw(6) << raw_[iapv][31]
0351 << ", " << std::setw(6) << raw_[iapv][63] << ", " << std::setw(6) << raw_[iapv][127] << std::endl
0352 << " Dead strips (<5s) [strip] : (" << deadStrip_[iapv].size() << " in total) ";
0353
0354 for (uint16_t ii = 0; ii < deadStrip_[iapv].size(); ii++) {
0355 ss << deadStrip_[iapv][ii] << " ";
0356 }
0357
0358 ss << std::endl;
0359 ss << " Bad strips (>5s) [strip] : (" << badStrip_[iapv].size() << " in total) ";
0360 for (uint16_t ii = 0; ii < badStrip_[iapv].size(); ii++) {
0361 ss << badStrip_[iapv][ii] << " ";
0362 }
0363 ss << std::endl;
0364 ss << " Mean peds +/- spread [ADC] : " << pedsMean_[iapv] << " +/- " << pedsSpread_[iapv] << std::endl
0365 << " Min/Max pedestal [ADC] : " << pedsMin_[iapv] << " <-> " << pedsMax_[iapv] << std::endl
0366 << " Mean noise +/- spread [ADC] : " << noiseMean_[iapv] << " +/- " << noiseSpread_[iapv] << std::endl
0367 << " Min/Max noise [ADC] : " << noiseMin_[iapv] << " <-> " << noiseMax_[iapv] << std::endl
0368 << " Mean raw noise +/- spread [ADC] : " << rawMean_[iapv] << " +/- " << rawSpread_[iapv] << std::endl
0369 << " Min/Max raw noise [ADC] : " << rawMin_[iapv] << " <-> " << rawMax_[iapv] << std::endl
0370 << " Normalised noise : "
0371 << "(yet to be implemented...)" << std::endl
0372 << std::boolalpha << " isValid : " << isValid() << std::endl
0373 << std::noboolalpha << " Error codes (found " << std::setw(2) << std::setfill(' ') << getErrorCodes().size()
0374 << ") : ";
0375 if (getErrorCodes().empty()) {
0376 ss << "(none)";
0377 } else {
0378 VString::const_iterator istr = getErrorCodes().begin();
0379 VString::const_iterator jstr = getErrorCodes().end();
0380 for (; istr != jstr; ++istr) {
0381 ss << *istr << " ";
0382 }
0383 }
0384 ss << std::endl;
0385 }