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
#include "DQM/HcalCommon/interface/ElectronicsMap.h"
#include <iomanip>

namespace hcaldqm {
  namespace electronicsmap {
    void ElectronicsMap::initialize(HcalElectronicsMap const *emap, ElectronicsMapType etype /*=fHcalElectronicsMap*/) {
      _etype = etype;
      _emap = emap;
      //	if we actually use a HashMap then
      if (_etype != fHcalElectronicsMap) {
        if (_etype == fD2EHashMap) {
          std::vector<HcalElectronicsId> eids = emap->allElectronicsIdPrecision();
          for (std::vector<HcalElectronicsId>::const_iterator it = eids.begin(); it != eids.end(); ++it) {
            HcalGenericDetId did = HcalGenericDetId(_emap->lookup(*it));
            EMapType::iterator dit = _ids.find(did.rawId());
            if (dit != _ids.end())
              continue;
            //						if (!did.isHcalDetId())
            //							continue;

            _ids.insert(std::make_pair(did.rawId(), it->rawId()));
          }
        } else if (_etype == fT2EHashMap) {
          //	HcalTrigTowerDetId -> HcalElectronicsId
          std::vector<HcalTrigTowerDetId> tids = emap->allTriggerId();
          for (std::vector<HcalTrigTowerDetId>::const_iterator it = tids.begin(); it != tids.end(); ++it) {
            HcalElectronicsId eid = _emap->lookupTrigger(*it);
            uint32_t hash = it->rawId();
            EMapType::iterator eit = _ids.find(hash);
            if (eit != _ids.end())
              continue;

            _ids.insert(std::make_pair(hash, eid.rawId()));
          }
        } else if (_etype == fE2DHashMap) {
          //	HcalElectronicId -> HcalDetId hash map
          std::vector<HcalElectronicsId> eids = emap->allElectronicsIdPrecision();
          for (std::vector<HcalElectronicsId>::const_iterator it = eids.begin(); it != eids.end(); ++it) {
            HcalGenericDetId did = HcalGenericDetId(_emap->lookup(*it));
            uint32_t hash = it->rawId();
            EMapType::iterator eit = _ids.find(hash);
            if (eit != _ids.end())
              continue;

            //	note, we have EChannel hashing here
            _ids.insert(std::make_pair(hash, did.rawId()));
          }
        } else if (_etype == fE2THashMap) {
          //	HcalElectronicId -> HcalDetId hash map
          std::vector<HcalElectronicsId> eids = emap->allElectronicsIdTrigger();
          for (std::vector<HcalElectronicsId>::const_iterator it = eids.begin(); it != eids.end(); ++it) {
            HcalTrigTowerDetId tid = HcalTrigTowerDetId(_emap->lookupTrigger(*it));
            EMapType::iterator eit = _ids.find(it->rawId());
            if (eit != _ids.end())
              continue;

            //	eid.rawId() -> tid.rawId()
            _ids.insert(std::make_pair(it->rawId(), tid.rawId()));
          }
        }
      }
    }

    void ElectronicsMap::initialize(HcalElectronicsMap const *emap,
                                    ElectronicsMapType etype,
                                    filter::HashFilter const &filter) {
      _etype = etype;
      _emap = emap;

      //	note this initialization has iteration over electronics not
      //	detector.
      //	Filtering is done on Electronics id - possible to have
      //	several electronics ids to 1 detid - not vice versa
      if (_etype != fHcalElectronicsMap) {
        if (_etype == fD2EHashMap) {
          std::vector<HcalElectronicsId> eids = emap->allElectronicsIdPrecision();
          for (std::vector<HcalElectronicsId>::const_iterator it = eids.begin(); it != eids.end(); ++it) {
            HcalGenericDetId did = HcalGenericDetId(_emap->lookup(*it));
            if (filter.filter(*it))
              continue;
            //	skip those that are not detid or calib ids
            //						if (!did.isHcalDetId())
            //							continue;

            _ids.insert(std::make_pair(did.rawId(), it->rawId()));
          }
        } else if (_etype == fT2EHashMap) {
          std::vector<HcalElectronicsId> eids = emap->allElectronicsIdTrigger();
          for (std::vector<HcalElectronicsId>::const_iterator it = eids.begin(); it != eids.end(); ++it) {
            if (filter.filter(*it))
              continue;
            HcalTrigTowerDetId tid = emap->lookupTrigger(*it);
            _ids.insert(std::make_pair(tid.rawId(), it->rawId()));
          }
        } else if (_etype == fE2DHashMap) {
          std::vector<HcalElectronicsId> eids = emap->allElectronicsIdPrecision();
          for (std::vector<HcalElectronicsId>::const_iterator it = eids.begin(); it != eids.end(); ++it) {
            HcalGenericDetId did = HcalGenericDetId(_emap->lookup(*it));
            uint32_t hash = hashfunctions::hash_EChannel(*it);
            if (filter.filter(*it))
              continue;
            //	skip those that are not detid or calib ids
            //						if (!did.isHcalDetId())
            //							continue;

            //	note: use EChannel hashing here!
            _ids.insert(std::make_pair(hash, did.rawId()));
          }
        } else if (_etype == fE2THashMap) {
          std::vector<HcalElectronicsId> eids = emap->allElectronicsIdTrigger();
          for (std::vector<HcalElectronicsId>::const_iterator it = eids.begin(); it != eids.end(); ++it) {
            if (filter.filter(*it))
              continue;
            HcalTrigTowerDetId tid = emap->lookupTrigger(*it);
            _ids.insert(std::make_pair(it->rawId(), tid.rawId()));
          }
        }
      }
    }

    //	3 funcs below are only for 1->1 mappings
    uint32_t ElectronicsMap::lookup(DetId const &id) {
      uint32_t hash = id.rawId();
      if (_etype == fHcalElectronicsMap)
        return _emap->lookup(id).rawId();
      else {
        EMapType::iterator it = _ids.find(hash);
        return it == _ids.end() ? 0 : it->second;
      }
      return 0;
    }

    uint32_t ElectronicsMap::lookup(HcalDetId const &id) {
      // Turn the HcalDetId into a HcalGenericDetId to avoid newForm
      uint32_t hash = (id.oldFormat() ? id.otherForm() : id.rawId());
      HcalGenericDetId gdid(hash);
      if (_etype == fHcalElectronicsMap)
        return _emap->lookup(gdid).rawId();
      else {
        EMapType::iterator it = _ids.find(hash);
        return it == _ids.end() ? 0 : it->second;
      }
      return 0;
    }

    uint32_t ElectronicsMap::lookup(HcalElectronicsId const &id) {
      uint32_t hash = id.rawId();
      if (_etype == fHcalElectronicsMap)
        return _emap->lookup(id).rawId();
      else {
        EMapType::iterator it = _ids.find(hash);
        return it == _ids.end() ? 0 : it->second;
      }
      return 0;
    }

    void ElectronicsMap::print() {
      std::cout << "Electronics HashMap Type=" << _etype << std::endl;
      for (auto const &v : _ids) {
        std::cout << std::hex << v.first << "  " << v.second << std::dec << std::endl;
      }
    }
  }  // namespace electronicsmap
}  // namespace hcaldqm