File indexing completed on 2024-04-06 12:19:13
0001 #include "IORawData/CaloPatterns/interface/HcalFiberPattern.h"
0002 #include "FWCore/Utilities/interface/Exception.h"
0003
0004 static inline int setIf(const std::string& name, const std::map<std::string, std::string>& params) {
0005 std::map<std::string, std::string>::const_iterator j = params.find(name);
0006 if (j == params.end())
0007 throw cms::Exception("InvalidFormat") << "Missing parameter '" << name << "'";
0008 else
0009 return strtol(j->second.c_str(), nullptr, 0);
0010 }
0011
0012 HcalFiberPattern::HcalFiberPattern(const std::map<std::string, std::string>& params, const std::vector<uint32_t>& data)
0013 : pattern_(data) {
0014 crate_ = setIf("CRATE", params);
0015 slot_ = setIf("SLOT", params);
0016 fiber_ = setIf("FIBER", params);
0017 dcc_ = setIf("DCC", params);
0018 spigot_ = setIf("SPIGOT", params);
0019 tb_ = setIf("TOPBOTTOM", params);
0020 }
0021
0022 HcalQIESample HcalFiberPattern::unpack(int bc, int fc) {
0023 uint32_t w1 = pattern_[bc * 2];
0024 uint32_t w2 = pattern_[bc * 2 + 1];
0025
0026 int adc = 0, capid = 0;
0027 bool dv = (w1 & 0x10000) != 0;
0028 bool er = (w1 & 0x20000) != 0;
0029
0030 switch (fc) {
0031 case (0):
0032 adc = (w2 & 0xFE00) >> 9;
0033 capid = (w1 & 0x0180) >> 7;
0034 break;
0035 case (1):
0036 adc = (w2 & 0xFE) >> 1;
0037 capid = (w1 & 0x0060) >> 5;
0038 break;
0039 case (2):
0040 adc = (w1 & 0xFE00) >> 9;
0041 capid = (w1 & 0x0018) >> 3;
0042 break;
0043 default:
0044 break;
0045 }
0046 return HcalQIESample(adc, capid, fiber_, fc, dv, er);
0047 }
0048
0049 std::vector<HcalQIESample> HcalFiberPattern::getSamples(int bunch, int npresamples, int nsamples, int fiberChan) {
0050 if (bunch < npresamples)
0051 throw cms::Exception("InvalidArgument")
0052 << "Asked for " << npresamples << " presamples with event at bunch " << bunch;
0053 if (nsamples - npresamples + bunch >= (int)(pattern_.size() / 2))
0054 throw cms::Exception("InvalidArgument")
0055 << "Asked for " << nsamples << " with event at " << bunch << " and " << npresamples << " presamples, but only "
0056 << pattern_.size() / 2 << " bunches are available";
0057
0058 std::vector<HcalQIESample> retval;
0059 retval.reserve(nsamples);
0060
0061 for (int i = 0; i < nsamples; i++) {
0062 int bc = bunch + i - npresamples;
0063 retval.push_back(unpack(bc, fiberChan));
0064 }
0065 return retval;
0066 }
0067
0068 HcalElectronicsId HcalFiberPattern::getId(int fiberChan) {
0069 HcalElectronicsId retval(fiberChan, fiber_, spigot_, dcc_);
0070 retval.setHTR(crate_, slot_, tb_);
0071 return retval;
0072 }