Back to home page

Project CMSSW displayed by LXR

 
 

    


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   //if (heid.readoutVMECrateId()!=m_crate) std::cout << "crate: " << heid.readoutVMECrateId() << "; " << m_crate << std::endl;
0096   //if (heid.htrSlot()!=m_slot) std::cout << "slot:  " << heid.htrSlot() << "; " << m_slot << std::endl;
0097   //if (heid.htrTopBottom()!=m_tb) std::cout << "tb:    " << heid.htrTopBottom() << "; " << m_tb << std::endl;
0098   //if (heid.htrChanId()!=m_chan) std::cout << "chan:  " << heid.htrChanId() << "; " << m_chan << std::endl;
0099   //
0100   //if (heid.readoutVMECrateId()==14 && heid.htrTopBottom()==0 && heid.htrChanId()==3) {
0101   //  std::cout << heid.rawId() << " " << heid << std::endl;
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       //fill only one channel per half-crate
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       //put some data here
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       //add one to BX?
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       //add one to BX?
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   //first fill with pedestal value (currently hard-coded to 0)
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   //now fill with actual samples
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   //first fill with pedestal value (currently hard-coded to 0)
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   //now fill with actual samples
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   //first fill with pedestal value (currently hard-coded to 0)
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   //now fill with actual samples
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   //these are set later with map data
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 }