File indexing completed on 2024-04-06 12:19:13
0001 #include "HtrXmlPatternSet.h"
0002 #include <cmath>
0003 #include <iostream>
0004
0005 ChannelPattern::ChannelPattern() {
0006 for (int i = 0; i < SAMPLES; i++) {
0007 fCReal[i] = 0;
0008 fCCoded[i] = 0;
0009 fCQuantized[i] = 0;
0010 }
0011 m_sample_pos = 0;
0012 }
0013
0014 void ChannelPattern::Fill_by_hand(const HcalElectronicsMap* emap, int pattern_number) {
0015 for (int iSample = 0; iSample < SAMPLES; iSample++) {
0016 fCCoded[iSample] = 0;
0017 fCQuantized[iSample] = 0;
0018 }
0019
0020 int dcc9[NUM_CRATES];
0021 int dcc19[NUM_CRATES];
0022 for (int jCrate = 0; jCrate < NUM_CRATES; jCrate++) {
0023 dcc9[jCrate] = -1;
0024 dcc19[jCrate] = -1;
0025 }
0026
0027 int iCrate;
0028 iCrate = 4;
0029 dcc9[iCrate] = 700;
0030 dcc19[iCrate] = 701;
0031 iCrate = 0;
0032 dcc9[iCrate] = 702;
0033 dcc19[iCrate] = 703;
0034 iCrate = 1;
0035 dcc9[iCrate] = 704;
0036 dcc19[iCrate] = 705;
0037 iCrate = 5;
0038 dcc9[iCrate] = 706;
0039 dcc19[iCrate] = 707;
0040 iCrate = 11;
0041 dcc9[iCrate] = 708;
0042 dcc19[iCrate] = 709;
0043 iCrate = 15;
0044 dcc9[iCrate] = 710;
0045 dcc19[iCrate] = 711;
0046 iCrate = 17;
0047 dcc9[iCrate] = 712;
0048 dcc19[iCrate] = 713;
0049 iCrate = 14;
0050 dcc9[iCrate] = 714;
0051 dcc19[iCrate] = 715;
0052 iCrate = 10;
0053 dcc9[iCrate] = 716;
0054 dcc19[iCrate] = 717;
0055 iCrate = 2;
0056 dcc9[iCrate] = 718;
0057 dcc19[iCrate] = 719;
0058 iCrate = 9;
0059 dcc9[iCrate] = 720;
0060 dcc19[iCrate] = 721;
0061 iCrate = 12;
0062 dcc9[iCrate] = 722;
0063 dcc19[iCrate] = 723;
0064 iCrate = 3;
0065 dcc9[iCrate] = 724;
0066 dcc19[iCrate] = 725;
0067 iCrate = 7;
0068 dcc9[iCrate] = 726;
0069 dcc19[iCrate] = 727;
0070 iCrate = 6;
0071 dcc9[iCrate] = 728;
0072 dcc19[iCrate] = 729;
0073 iCrate = 13;
0074 dcc9[iCrate] = 730;
0075 dcc19[iCrate] = 731;
0076
0077 int* dcc = nullptr;
0078 int spigot = -100;
0079 if (m_slot >= 2 && m_slot <= 8) {
0080 spigot = 2 * m_slot - m_tb - 3;
0081 dcc = dcc9;
0082 } else if (m_slot >= 13 && m_slot <= 18) {
0083 spigot = 2 * m_slot - m_tb - 25;
0084 dcc = dcc19;
0085 } else
0086 return;
0087
0088 int fiber_channel = (m_chan - 1) % 3;
0089 int fiber = (m_chan - fiber_channel - 1) / 3 + 1;
0090 int dcc_num = dcc[m_crate] - 700;
0091
0092 HcalElectronicsId heid(fiber_channel, fiber, spigot, dcc_num);
0093 heid.setHTR(m_crate, m_slot, m_tb);
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104 try {
0105 const HcalDetId hdid = emap->lookup(heid);
0106
0107 int etaabs = hdid.ietaAbs();
0108 int phi = hdid.iphi();
0109 int side = hdid.zside();
0110 int depth = hdid.depth();
0111 int subdet = hdid.subdet();
0112
0113
0114 if (pattern_number == 1) {
0115 if (m_crate == 2 || m_crate == 9 || m_crate == 12)
0116 return;
0117
0118 if (m_slot != 2 && m_slot != 13)
0119 return;
0120 if (m_tb != 0)
0121 return;
0122 if (m_chan != 5)
0123 return;
0124
0125
0126 fCCoded[31] = 17;
0127 }
0128
0129 if (pattern_number == 2) {
0130 if (depth > 1)
0131 return;
0132 if (subdet == 4 && etaabs < 30)
0133 return;
0134
0135 if ((etaabs + 2) % 4 != 0)
0136 return;
0137 int i = (etaabs + 2) / 4;
0138 if (i < 1 || i > 7)
0139 return;
0140
0141 if ((phi + 3) % 4 != 0)
0142 return;
0143 int j = (phi + 3) / 4;
0144 if (j < 1 || j > 18)
0145 return;
0146
0147
0148 if (side < 0)
0149 fCCoded[phi + 10] = i;
0150 if (side > 0)
0151 fCCoded[phi + 10] = i + 16;
0152 }
0153
0154 if (pattern_number == 3) {
0155 if (depth > 1 || etaabs != 18 || side != 1 || phi != 32)
0156 return;
0157 std::cout << "hello" << std::endl;
0158
0159 if (side > 0)
0160 fCCoded[15] = 20;
0161 }
0162
0163 } catch (...) {
0164 return;
0165 }
0166 }
0167
0168 void ChannelPattern::Fill(HtrXmlPatternToolParameters* params, HBHEDigiCollection::const_iterator data) {
0169
0170 for (int samples = 0; samples < params->m_samples_per_event; samples++) {
0171 int index = m_sample_pos + samples;
0172 if (index >= SAMPLES)
0173 continue;
0174
0175 fCCoded[index] = 0;
0176 fCQuantized[index] = 0;
0177 }
0178
0179
0180 for (int samples = 0; samples < data->size(); samples++) {
0181 int index = m_sample_pos + params->m_presamples_per_event - data->presamples() + samples;
0182 if (index < m_sample_pos || index >= (m_sample_pos + params->m_samples_per_event) || index >= SAMPLES)
0183 continue;
0184
0185 fCCoded[index] = data->sample(samples).adc();
0186 fCQuantized[index] = data->sample(samples).nominal_fC();
0187 }
0188
0189 m_sample_pos += params->m_samples_per_event;
0190 }
0191
0192 void ChannelPattern::Fill(HtrXmlPatternToolParameters* params, HFDigiCollection::const_iterator data) {
0193
0194 for (int samples = 0; samples < params->m_samples_per_event; samples++) {
0195 int index = m_sample_pos + samples;
0196 if (index >= SAMPLES)
0197 continue;
0198
0199 fCCoded[index] = 0;
0200 fCQuantized[index] = 0;
0201 }
0202
0203
0204 for (int samples = 0; samples < data->size(); samples++) {
0205 int index = m_sample_pos + params->m_presamples_per_event - data->presamples() + samples;
0206 if (index < m_sample_pos || index >= (m_sample_pos + params->m_samples_per_event) || index >= SAMPLES)
0207 continue;
0208
0209 fCCoded[index] = data->sample(samples).adc();
0210 fCQuantized[index] = data->sample(samples).nominal_fC();
0211 }
0212
0213 m_sample_pos += params->m_samples_per_event;
0214 }
0215
0216 void ChannelPattern::Fill(HtrXmlPatternToolParameters* params, HODigiCollection::const_iterator data) {
0217
0218 for (int samples = 0; samples < params->m_samples_per_event; samples++) {
0219 int index = m_sample_pos + samples;
0220 if (index >= SAMPLES)
0221 continue;
0222
0223 fCCoded[index] = 0;
0224 fCQuantized[index] = 0;
0225 }
0226
0227
0228 for (int samples = 0; samples < data->size(); samples++) {
0229 int index = m_sample_pos + params->m_presamples_per_event - data->presamples() + samples;
0230 if (index < m_sample_pos || index >= (m_sample_pos + params->m_samples_per_event) || index >= SAMPLES)
0231 continue;
0232
0233 fCCoded[index] = data->sample(samples).adc();
0234 fCQuantized[index] = data->sample(samples).nominal_fC();
0235 }
0236
0237 m_sample_pos += params->m_samples_per_event;
0238 }
0239
0240 HalfHtrData::HalfHtrData(int crate, int slot, int tb) {
0241 for (int i = 0; i < 24; i++)
0242 m_patterns[i].setLoc(crate, slot, tb, i + 1);
0243 m_crate = crate;
0244 m_slot = slot;
0245 m_tb = tb;
0246
0247 m_dcc = 0;
0248 m_spigot = 0;
0249 }
0250
0251 CrateData::CrateData(int crate, int slotsActive[ChannelPattern::NUM_SLOTS]) {
0252 for (int slot = 0; slot < ChannelPattern::NUM_SLOTS; slot++) {
0253 for (int tb = 0; tb < 2; tb++) {
0254 if (slotsActive[slot])
0255 m_slotsDoubled[slot][tb] = new HalfHtrData(crate, slot, tb);
0256 else
0257 m_slotsDoubled[slot][tb] = nullptr;
0258 }
0259 }
0260 }
0261
0262 CrateData::~CrateData() {
0263 for (int slot = 0; slot < ChannelPattern::NUM_SLOTS; slot++) {
0264 for (int tb = 0; tb < 2; tb++) {
0265 if (m_slotsDoubled[slot][tb])
0266 delete m_slotsDoubled[slot][tb];
0267 }
0268 }
0269 }
0270
0271 HalfHtrData* CrateData::getHalfHtrData(int slot, int tb) {
0272 if (slot >= 0 && slot < ChannelPattern::NUM_SLOTS && (tb == 0 || tb == 1))
0273 return m_slotsDoubled[slot][tb];
0274 else
0275 return nullptr;
0276 }
0277
0278 HtrXmlPatternSet::HtrXmlPatternSet(int cratesActive[ChannelPattern::NUM_CRATES],
0279 int slotsActive[ChannelPattern::NUM_SLOTS]) {
0280 for (int crate = 0; crate < ChannelPattern::NUM_CRATES; crate++) {
0281 if (cratesActive[crate])
0282 m_crates[crate] = new CrateData(crate, slotsActive);
0283 else
0284 m_crates[crate] = nullptr;
0285 }
0286 }
0287
0288 HtrXmlPatternSet::~HtrXmlPatternSet() {
0289 for (int crate = 0; crate < ChannelPattern::NUM_CRATES; crate++) {
0290 if (m_crates[crate])
0291 delete m_crates[crate];
0292 }
0293 }
0294
0295 CrateData* HtrXmlPatternSet::getCrate(int crate) {
0296 if (crate >= 0 && crate < ChannelPattern::NUM_CRATES)
0297 return m_crates[crate];
0298 else
0299 return nullptr;
0300 }