Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
#include "CalibTracker/SiStripESProducers/plugins/fake/SiStripFedCablingFakeESSource.h"
#include "CalibTracker/SiStripCommon/interface/SiStripDetInfoFileReader.h"
#include "CalibFormats/SiStripObjects/interface/SiStripFecCabling.h"
#include "CalibFormats/SiStripObjects/interface/SiStripModule.h"
#include "CalibTracker/Records/interface/SiStripHashedDetIdRcd.h"
#include "CalibTracker/SiStripCommon/interface/SiStripDetInfoFileReader.h"
#include "CalibTracker/SiStripCommon/interface/SiStripFedIdListReader.h"
#include "CondFormats/SiStripObjects/interface/FedChannelConnection.h"
#include "CondFormats/SiStripObjects/interface/SiStripFedCabling.h"
#include "FWCore/MessageLogger/interface/MessageLogger.h"
#include <sstream>
#include <vector>
#include <map>

using namespace sistrip;

// -----------------------------------------------------------------------------
//
SiStripFedCablingFakeESSource::SiStripFedCablingFakeESSource(const edm::ParameterSet& pset)
    : SiStripFedCablingESProducer(pset), fedIds_(pset.getParameter<edm::FileInPath>("FedIdsFile")), pset_(pset) {
  findingRecord<SiStripFedCablingRcd>();
  m_detInfo = SiStripDetInfoFileReader::read(pset.getParameter<edm::FileInPath>("SiStripDetInfoFile").fullPath());
  edm::LogVerbatim("FedCabling") << "[SiStripFedCablingFakeESSource::" << __func__ << "]"
                                 << " Constructing object...";
}

// -----------------------------------------------------------------------------
//
SiStripFedCablingFakeESSource::~SiStripFedCablingFakeESSource() {
  edm::LogVerbatim("FedCabling") << "[SiStripFedCablingFakeESSource::" << __func__ << "]"
                                 << " Destructing object...";
}

// -----------------------------------------------------------------------------
//
SiStripFedCabling* SiStripFedCablingFakeESSource::make(const SiStripFedCablingRcd&) {
  edm::LogVerbatim("FedCabling") << "[SiStripFedCablingFakeESSource::" << __func__ << "]"
                                 << " Building \"fake\" FED cabling map"
                                 << " from real DetIds and FedIds (read from ascii file)";

  // Create FEC cabling object
  SiStripFecCabling* fec_cabling = new SiStripFecCabling();

  // Read DetId list from file
  typedef std::vector<uint32_t> Dets;
  Dets dets = m_detInfo.getAllDetIds();

  // Read FedId list from file
  typedef std::vector<uint16_t> Feds;
  Feds feds = SiStripFedIdListReader(fedIds_.fullPath()).fedIds();

  bool populateAllFeds = pset_.getParameter<bool>("PopulateAllFeds");

  // Iterator through DetInfo objects and populate FEC cabling object
  uint32_t imodule = 0;
  Dets::const_iterator idet = dets.begin();
  Dets::const_iterator jdet = dets.end();
  for (; idet != jdet; ++idet) {
    uint16_t npairs = m_detInfo.getNumberOfApvsAndStripLength(*idet).first / 2;
    for (uint16_t ipair = 0; ipair < npairs; ++ipair) {
      uint16_t addr = 0;
      if (npairs == 2 && ipair == 0) {
        addr = 32;
      } else if (npairs == 2 && ipair == 1) {
        addr = 36;
      } else if (npairs == 3 && ipair == 0) {
        addr = 32;
      } else if (npairs == 3 && ipair == 1) {
        addr = 34;
      } else if (npairs == 3 && ipair == 2) {
        addr = 36;
      } else {
        edm::LogWarning("FedCabling") << "[SiStripFedCablingFakeESSource::" << __func__ << "]"
                                      << " Inconsistent values for nPairs (" << npairs << ") and ipair (" << ipair
                                      << ")!";
      }
      uint32_t module_key =
          SiStripFecKey(fecCrate(imodule), fecSlot(imodule), fecRing(imodule), ccuAddr(imodule), ccuChan(imodule)).key();
      FedChannelConnection conn(fecCrate(imodule),
                                fecSlot(imodule),
                                fecRing(imodule),
                                ccuAddr(imodule),
                                ccuChan(imodule),
                                addr,
                                addr + 1,    // apv i2c addresses
                                module_key,  // dcu id
                                *idet,       // det id
                                npairs);     // apv pairs
      fec_cabling->addDevices(conn);
    }
    imodule++;
  }

  // Assign "dummy" FED ids/chans
  bool insufficient = false;
  Feds::const_iterator ifed = feds.begin();
  uint16_t fed_ch = 0;
  for (auto& icrate : fec_cabling->crates()) {
    for (auto& ifec : icrate.fecs()) {
      for (auto& iring : ifec.rings()) {
        for (auto& iccu : iring.ccus()) {
          for (auto& imod : iccu.modules()) {
            if (populateAllFeds) {
              for (uint16_t ipair = 0; ipair < imod.nApvPairs(); ipair++) {
                if (ifed == feds.end()) {
                  fed_ch++;
                  ifed = feds.begin();
                }
                if (fed_ch == 96) {
                  insufficient = true;
                  break;
                }

                std::pair<uint16_t, uint16_t> addr = imod.activeApvPair(imod.lldChannel(ipair));
                SiStripModule::FedChannel fed_channel((*ifed) / 16 + 1,  // 16 FEDs per crate, numbering starts from 1
                                                      (*ifed) % 16 + 2,  // FED slot starts from 2
                                                      *ifed,
                                                      fed_ch);
                imod.fedCh(addr.first, fed_channel);
                ifed++;
              }
            } else {
              // Patch introduced by D.Giordano 2/12/08
              //to reproduce the fake cabling used in 2x
              //that was designed to fill each fed iteratively
              //filling all channels of a fed before going to the next one
              if (96 - fed_ch < imod.nApvPairs()) {
                ifed++;
                fed_ch = 0;
              }  // move to next FED
              for (uint16_t ipair = 0; ipair < imod.nApvPairs(); ipair++) {
                std::pair<uint16_t, uint16_t> addr = imod.activeApvPair(imod.lldChannel(ipair));
                SiStripModule::FedChannel fed_channel((*ifed) / 16 + 1,  // 16 FEDs per crate, numbering starts from 1
                                                      (*ifed) % 16 + 2,  // FED slot starts from 2
                                                      (*ifed),
                                                      fed_ch);
                imod.fedCh(addr.first, fed_channel);
                fed_ch++;
              }
            }
          }
        }
      }
    }
  }

  if (insufficient) {
    edm::LogWarning(mlCabling_) << "[SiStripFedCablingFakeESSource::" << __func__ << "]"
                                << " Insufficient FED channels to cable entire system!";
  }

  // Some debug
  std::stringstream ss;
  ss << "[SiStripFedCablingFakeESSource::" << __func__ << "]"
     << " First count devices of FEC cabling " << std::endl;
  fec_cabling->countDevices().print(ss);
  LogTrace(mlCabling_) << ss.str();

  // Build FED cabling using FedChannelConnections
  std::vector<FedChannelConnection> conns;
  fec_cabling->connections(conns);
  SiStripFedCabling* cabling = new SiStripFedCabling(conns);

  return cabling;
}

// -----------------------------------------------------------------------------
//
void SiStripFedCablingFakeESSource::setIntervalFor(const edm::eventsetup::EventSetupRecordKey& key,
                                                   const edm::IOVSyncValue& iov_sync,
                                                   edm::ValidityInterval& iov_validity) {
  edm::ValidityInterval infinity(iov_sync.beginOfTime(), iov_sync.endOfTime());
  iov_validity = infinity;
}