SiPixelCablingSoAESProducer

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
#include "CalibTracker/Records/interface/SiPixelMappingSoARecord.h"
#include "CondFormats/DataRecord/interface/SiPixelFedCablingMapRcd.h"
#include "CondFormats/DataRecord/interface/SiPixelQualityRcd.h"
#include "CondFormats/SiPixelObjects/interface/SiPixelFedCablingMap.h"
#include "CondFormats/SiPixelObjects/interface/SiPixelFedCablingTree.h"
#include "CondFormats/SiPixelObjects/interface/SiPixelMappingHost.h"
#include "CondFormats/SiPixelObjects/interface/SiPixelQuality.h"
#include "CondFormats/SiPixelObjects/interface/alpaka/SiPixelMappingDevice.h"
#include "DataFormats/SiPixelClusterSoA/interface/ClusteringConstants.h"
#include "FWCore/MessageLogger/interface/MessageLogger.h"
#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
#include "FWCore/ParameterSet/interface/ParameterSet.h"
#include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
#include "FWCore/Utilities/interface/ESGetToken.h"
#include "Geometry/Records/interface/TrackerDigiGeometryRecord.h"
#include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
#include "HeterogeneousCore/AlpakaCore/interface/alpaka/ESProducer.h"
#include "HeterogeneousCore/AlpakaInterface/interface/config.h"
#include "HeterogeneousCore/AlpakaInterface/interface/memory.h"

namespace ALPAKA_ACCELERATOR_NAMESPACE {

  using namespace cms::alpakatools;

  class SiPixelCablingSoAESProducer : public ESProducer {
  public:
    SiPixelCablingSoAESProducer(edm::ParameterSet const& iConfig)
        : ESProducer(iConfig), useQuality_(iConfig.getParameter<bool>("UseQualityInfo")) {
      auto cc = setWhatProduced(this);
      cablingMapToken_ = cc.consumes(edm::ESInputTag{"", iConfig.getParameter<std::string>("CablingMapLabel")});
      if (useQuality_) {
        qualityToken_ = cc.consumes();
      }
      geometryToken_ = cc.consumes();
    }

    static void fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
      edm::ParameterSetDescription desc;
      desc.add<std::string>("CablingMapLabel", "")->setComment("CablingMap label");
      desc.add<bool>("UseQualityInfo", false);
      descriptions.addWithDefaultLabel(desc);
    }

    std::optional<SiPixelMappingHost> produce(const SiPixelMappingSoARecord& iRecord) {
      auto cablingMap = iRecord.getTransientHandle(cablingMapToken_);
      const SiPixelQuality* quality = nullptr;
      if (useQuality_) {
        auto qualityInfo = iRecord.getTransientHandle(qualityToken_);
        quality = qualityInfo.product();
      }

      auto geom = iRecord.getTransientHandle(geometryToken_);
      SiPixelMappingHost product(pixelgpudetails::MAX_SIZE, cms::alpakatools::host());
      std::vector<unsigned int> const& fedIds = cablingMap->fedIds();
      std::unique_ptr<SiPixelFedCablingTree> const& cabling = cablingMap->cablingTree();

      unsigned int startFed = fedIds.front();
      unsigned int endFed = fedIds.back();

      sipixelobjects::CablingPathToDetUnit path;
      int index = 1;

      auto mapView = product.view();

      mapView.hasQuality() = useQuality_;
      for (unsigned int fed = startFed; fed <= endFed; fed++) {
        for (unsigned int link = 1; link <= pixelgpudetails::MAX_LINK; link++) {
          for (unsigned int roc = 1; roc <= pixelgpudetails::MAX_ROC; roc++) {
            path = {fed, link, roc};
            const sipixelobjects::PixelROC* pixelRoc = cabling->findItem(path);
            mapView[index].fed() = fed;
            mapView[index].link() = link;
            mapView[index].roc() = roc;
            if (pixelRoc != nullptr) {
              mapView[index].rawId() = pixelRoc->rawId();
              mapView[index].rocInDet() = pixelRoc->idInDetUnit();
              mapView[index].modToUnpDefault() = false;
              if (quality != nullptr)
                mapView[index].badRocs() = quality->IsRocBad(pixelRoc->rawId(), pixelRoc->idInDetUnit());
              else
                mapView[index].badRocs() = false;
            } else {  // store some dummy number
              mapView[index].rawId() = pixelClustering::invalidModuleId;
              mapView[index].rocInDet() = pixelClustering::invalidModuleId;
              mapView[index].badRocs() = true;
              mapView[index].modToUnpDefault() = true;
            }
            index++;
          }
        }
      }  // end of FED loop
      // Given FedId, Link and idinLnk; use the following formula
      // to get the rawId and idinDU
      // index = (FedID-1200) * MAX_LINK* MAX_ROC + (Link-1)* MAX_ROC + idinLnk;
      // where, MAX_LINK = 48, MAX_ROC = 8
      // FedID varies between 1200 to 1338 (In total 108 FED's)
      // Link varies between 1 to 48
      // idinLnk varies between 1 to 8

      auto trackerGeom = iRecord.getTransientHandle(geometryToken_);

      for (int i = 1; i < index; i++) {
        if (mapView[i].rawId() == pixelClustering::invalidModuleId) {
          mapView[i].moduleId() = pixelClustering::invalidModuleId;
        } else {
          auto gdet = trackerGeom->idToDetUnit(mapView[i].rawId());
          if (!gdet) {
            LogDebug("SiPixelCablingSoAESProducer") << " Not found: " << mapView[i].rawId() << std::endl;
            continue;
          }
          mapView[i].moduleId() = gdet->index();
        }
        LogDebug("SiPixelCablingSoAESProducer")
            << "----------------------------------------------------------------------------" << std::endl;
        LogDebug("SiPixelCablingSoAESProducer") << i << std::setw(20) << mapView[i].fed() << std::setw(20)
                                                << mapView[i].link() << std::setw(20) << mapView[i].roc() << std::endl;
        LogDebug("SiPixelCablingSoAESProducer")
            << i << std::setw(20) << mapView[i].rawId() << std::setw(20) << mapView[i].rocInDet() << std::setw(20)
            << mapView[i].moduleId() << std::endl;
        LogDebug("SiPixelCablingSoAESProducer")
            << i << std::setw(20) << mapView[i].badRocs() << std::setw(20) << std::endl;
        LogDebug("SiPixelCablingSoAESProducer")
            << "----------------------------------------------------------------------------" << std::endl;
      }

      mapView.size() = index - 1;

      return product;
    }

  private:
    edm::ESGetToken<SiPixelFedCablingMap, SiPixelFedCablingMapRcd> cablingMapToken_;
    edm::ESGetToken<SiPixelQuality, SiPixelQualityRcd> qualityToken_;
    edm::ESGetToken<TrackerGeometry, TrackerDigiGeometryRecord> geometryToken_;
    const bool useQuality_;
  };
}  // namespace ALPAKA_ACCELERATOR_NAMESPACE

#include "HeterogeneousCore/AlpakaCore/interface/alpaka/ModuleFactory.h"
DEFINE_FWK_EVENTSETUP_ALPAKA_MODULE(SiPixelCablingSoAESProducer);