1313#include " DataFormats/SiPixelDigi/interface/PixelDigi.h"
1414#include " DataFormats/SiPixelDigiSoA/interface/alpaka/SiPixelDigiErrorsSoACollection.h"
1515#include " DataFormats/SiPixelDigiSoA/interface/alpaka/SiPixelDigisSoACollection.h"
16+ #include " FWCore/MessageLogger/interface/MessageLogger.h"
1617#include " FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
1718#include " FWCore/ParameterSet/interface/ParameterSet.h"
1819#include " FWCore/ParameterSet/interface/ParameterSetDescription.h"
1920#include " FWCore/Utilities/interface/ESGetToken.h"
2021#include " FWCore/Utilities/interface/InputTag.h"
22+ #include " Geometry/CommonTopologies/interface/GeomDetEnumerators.h"
2123#include " Geometry/Records/interface/TrackerDigiGeometryRecord.h"
24+ #include " Geometry/Records/interface/TrackerTopologyRcd.h"
2225#include " Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
26+ #include " DataFormats/TrackerCommon/interface/TrackerTopology.h"
2327#include " HeterogeneousCore/AlpakaCore/interface/alpaka/EDPutToken.h"
2428#include " HeterogeneousCore/AlpakaCore/interface/alpaka/Event.h"
2529#include " HeterogeneousCore/AlpakaCore/interface/alpaka/stream/SynchronizingEDProducer.h"
@@ -41,8 +45,12 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE {
4145 private:
4246 void acquire (device::Event const & iEvent, device::EventSetup const & iSetup) override ;
4347 void produce (device::Event& iEvent, device::EventSetup const & iSetup) override ;
48+ void beginRun (edm::Run const &, edm::EventSetup const & iSetup) override ;
4449
4550 const edm::ESGetToken<TrackerGeometry, TrackerDigiGeometryRecord> geomToken_;
51+ const edm::ESGetToken<TrackerGeometry, TrackerDigiGeometryRecord> geomTokenBeginRun_; // For BeginRun
52+ const edm::ESGetToken<TrackerTopology, TrackerTopologyRcd> topoToken_;
53+
4654 const edm::EDGetTokenT<edm::DetSetVector<PixelDigi>> pixelDigiToken_;
4755 const device::EDPutToken<SiPixelDigisSoACollection> digiPutToken_;
4856 const device::EDPutToken<SiPixelClustersSoACollection> clusterPutToken_;
@@ -51,11 +59,14 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE {
5159 Algo algo_;
5260 uint32_t nDigis_ = 0 ;
5361 std::optional<SiPixelDigisSoACollection> digis_d_;
62+ mutable uint32_t offsetBPIX2_ = pixelTopology::Phase2::layerStart[1 ];
5463 };
5564
5665 SiPixelPhase2DigiToCluster::SiPixelPhase2DigiToCluster (const edm::ParameterSet& iConfig)
5766 : SynchronizingEDProducer(iConfig),
5867 geomToken_ (esConsumes()),
68+ geomTokenBeginRun_(esConsumes<TrackerGeometry, TrackerDigiGeometryRecord, edm::Transition::BeginRun>()),
69+ topoToken_(esConsumes<TrackerTopology, TrackerTopologyRcd, edm::Transition::BeginRun>()),
5970 pixelDigiToken_(consumes<edm::DetSetVector<PixelDigi>>(iConfig.getParameter<edm::InputTag>(" InputDigis" ))),
6071 digiPutToken_(produces()),
6172 clusterPutToken_(produces()),
@@ -80,6 +91,44 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE {
8091 desc.add <edm::InputTag>(" InputDigis" , edm::InputTag (" simSiPixelDigis:Pixel" ));
8192 descriptions.addWithDefaultLabel (desc);
8293 }
94+ void SiPixelPhase2DigiToCluster::beginRun (edm::Run const &, edm::EventSetup const & iSetup) {
95+ using namespace pixelTopology ;
96+
97+ auto const & trackerGeometry = iSetup.getData (geomTokenBeginRun_);
98+ auto const & trackerTopology = iSetup.getData (topoToken_);
99+
100+ auto const & dets = trackerGeometry.detUnits ();
101+
102+ uint32_t n_modules = 0 ;
103+ uint32_t oldLayer = std::numeric_limits<uint32_t >::max ();
104+ uint32_t layerCount = 0 ;
105+ uint32_t bpix2Start = 0 ;
106+
107+ // Loop over detector modules to find where BPIX2 starts
108+ for (auto & det : dets) {
109+ if (!GeomDetEnumerators::isInnerTracker (det->subDetector ()))
110+ continue ;
111+
112+ DetId detId = det->geographicalId ();
113+ auto layer = trackerTopology.layer (detId);
114+
115+ if (layer != oldLayer) {
116+ if (layerCount == 1 ) {
117+ // layer 1 is BPIX2
118+ bpix2Start = n_modules;
119+ }
120+ layerCount++;
121+ oldLayer = layer;
122+ }
123+ n_modules++;
124+ }
125+
126+ offsetBPIX2_ = bpix2Start;
127+
128+ LogDebug (" SiPixelPhase2DigiToCluster" )
129+ << " beginRun: BPIX2 module start = " << offsetBPIX2_ << " (total pixel modules: " << n_modules
130+ << " ). Offset from simplePixelTopology = " << pixelTopology::Phase2::layerStart[1 ] << ' \n ' ;
131+ }
83132
84133 void SiPixelPhase2DigiToCluster::acquire (device::Event const & iEvent, device::EventSetup const & iSetup) {
85134 auto const & input = iEvent.get (pixelDigiToken_);
@@ -117,7 +166,7 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE {
117166 assert (nDigis == nDigis_);
118167
119168 alpaka::memcpy (iEvent.queue (), digis_d_->buffer (), digis_h.buffer ());
120- algo_.makePhase2ClustersAsync (iEvent.queue (), clusterThresholds_, digis_d_->view (), nDigis_);
169+ algo_.makePhase2ClustersAsync (iEvent.queue (), clusterThresholds_, digis_d_->view (), nDigis_, offsetBPIX2_ );
121170 }
122171
123172 void SiPixelPhase2DigiToCluster::produce (device::Event& iEvent, device::EventSetup const & iSetup) {
0 commit comments