Skip to content

Commit 2e8c612

Browse files
authored
Merge pull request #43294 from PixelTracksAlpaka/alpaka_port_configs
Pixel Alpaka Migration: Configs and Fixes [VII]
2 parents ff42400 + c426124 commit 2e8c612

File tree

49 files changed

+1795
-219
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+1795
-219
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import FWCore.ParameterSet.Config as cms
2+
3+
# This modifier chain is for turning on DQM modules used for alpaka device/host validation for pixels
4+
5+
alpakaValidationPixel = cms.Modifier()
6+
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import FWCore.ParameterSet.Config as cms
2+
3+
from Configuration.ProcessModifiers.alpaka_cff import *
4+
from Configuration.ProcessModifiers.alpakaValidationPixel_cff import *
5+
6+
# This modifier chain is for turning on DQM modules used for alpaka device/host validation
7+
8+
alpakaValidation = cms.ModifierChain(
9+
alpaka,
10+
alpakaValidationPixel
11+
)

Configuration/PyReleaseValidation/python/upgradeWorkflowComponents.py

Lines changed: 53 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -896,6 +896,7 @@ def setup_(self, step, stepName, stepDict, k, properties):
896896
# - HLT on CPU
897897
# - Pixel-only reconstruction on CPU, with DQM and validation
898898
# - harvesting
899+
899900
upgradeWFs['PatatrackPixelOnlyCPU'] = PatatrackWorkflow(
900901
digi = {
901902
# the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
@@ -1062,8 +1063,7 @@ def setup_(self, step, stepName, stepDict, k, properties):
10621063
upgradeWFs['PatatrackECALOnlyAlpaka'] = PatatrackWorkflow(
10631064
digi = {
10641065
# customize the ECAL Local Reco part of the HLT menu for Alpaka
1065-
'--procModifiers': 'alpaka',
1066-
'--customise' : 'HLTrigger/Configuration/customizeHLTforAlpaka.customizeHLTforAlpakaEcalLocalReco'
1066+
'--procModifiers': 'alpaka', # alpaka modifier activates customiseHLTForAlpaka
10671067
},
10681068
reco = {
10691069
'-s': 'RAW2DIGI:RawToDigi_ecalOnly,RECO:reconstruction_ecalOnly,VALIDATION:@ecalOnlyValidation,DQM:@ecalOnly',
@@ -1536,6 +1536,53 @@ def setup_(self, step, stepName, stepDict, k, properties):
15361536
offset = 0.597,
15371537
)
15381538

1539+
1540+
# Alpaka workflows
1541+
1542+
upgradeWFs['PatatrackPixelOnlyAlpaka'] = PatatrackWorkflow(
1543+
digi = {
1544+
'--procModifiers': 'alpaka', # alpaka modifier activates customiseHLTForAlpaka
1545+
},
1546+
reco = {
1547+
'-s': 'RAW2DIGI:RawToDigi_pixelOnly,RECO:reconstruction_pixelTrackingOnly,VALIDATION:@pixelTrackingOnlyValidation,DQM:@pixelTrackingOnlyDQM',
1548+
'--procModifiers': 'alpaka'
1549+
},
1550+
harvest = {
1551+
'-s': 'HARVESTING:@trackingOnlyValidation+@pixelTrackingOnlyDQM'
1552+
},
1553+
suffix = 'Patatrack_PixelOnlyAlpaka',
1554+
offset = 0.402,
1555+
)
1556+
1557+
upgradeWFs['PatatrackPixelOnlyAlpakaValidation'] = PatatrackWorkflow(
1558+
digi = {
1559+
'--procModifiers': 'alpaka', # alpaka modifier activates customiseHLTForAlpaka
1560+
},
1561+
reco = {
1562+
'-s': 'RAW2DIGI:RawToDigi_pixelOnly,RECO:reconstruction_pixelTrackingOnly,VALIDATION:@pixelTrackingOnlyValidation,DQM:@pixelTrackingOnlyDQM',
1563+
'--procModifiers': 'alpakaValidation'
1564+
},
1565+
harvest = {
1566+
'-s': 'HARVESTING:@trackingOnlyValidation+@pixelTrackingOnlyDQM'
1567+
},
1568+
suffix = 'Patatrack_PixelOnlyAlpaka_Validation',
1569+
offset = 0.403,
1570+
)
1571+
1572+
upgradeWFs['PatatrackPixelOnlyAlpakaProfiling'] = PatatrackWorkflow(
1573+
digi = {
1574+
'--procModifiers': 'alpaka', # alpaka modifier activates customiseHLTForAlpaka
1575+
},
1576+
reco = {
1577+
'-s': 'RAW2DIGI:RawToDigi_pixelOnly,RECO:reconstruction_pixelTrackingOnly',
1578+
'--procModifiers': 'alpaka',
1579+
'--customise' : 'RecoTracker/Configuration/customizePixelOnlyForProfiling.customizePixelOnlyForProfilingGPUOnly'
1580+
},
1581+
harvest = None,
1582+
suffix = 'Patatrack_PixelOnlyAlpaka_Profiling',
1583+
offset = 0.404,
1584+
)
1585+
15391586
# end of Patatrack workflows
15401587

15411588
class UpgradeWorkflow_ProdLike(UpgradeWorkflow):
@@ -2741,31 +2788,31 @@ def condition(self, fragment, stepList, key, hasHarvest):
27412788
},
27422789
'2022HI' : {
27432790
'Geom' : 'DB:Extended',
2744-
'GT':'auto:phase1_2022_realistic_hi',
2791+
'GT':'auto:phase1_2022_realistic_hi',
27452792
'HLTmenu': '@fake2',
27462793
'Era':'Run3_pp_on_PbPb',
27472794
'BeamSpot': 'DBrealistic',
27482795
'ScenToRun' : ['GenSim','Digi','RecoNano','HARVESTNano','ALCA'],
27492796
},
27502797
'2022HIRP' : {
27512798
'Geom' : 'DB:Extended',
2752-
'GT':'auto:phase1_2022_realistic_hi',
2799+
'GT':'auto:phase1_2022_realistic_hi',
27532800
'HLTmenu': '@fake2',
27542801
'Era':'Run3_pp_on_PbPb_approxSiStripClusters',
27552802
'BeamSpot': 'DBrealistic',
27562803
'ScenToRun' : ['GenSim','Digi','RecoNano','HARVESTNano','ALCA'],
27572804
},
27582805
'2023HI' : {
27592806
'Geom' : 'DB:Extended',
2760-
'GT':'auto:phase1_2023_realistic_hi',
2807+
'GT':'auto:phase1_2023_realistic_hi',
27612808
'HLTmenu': '@fake2',
27622809
'Era':'Run3_pp_on_PbPb',
27632810
'BeamSpot': 'DBrealistic',
27642811
'ScenToRun' : ['GenSim','Digi','RecoNano','HARVESTNano','ALCA'],
27652812
},
27662813
'2023HIRP' : {
27672814
'Geom' : 'DB:Extended',
2768-
'GT':'auto:phase1_2023_realistic_hi',
2815+
'GT':'auto:phase1_2023_realistic_hi',
27692816
'HLTmenu': '@fake2',
27702817
'Era':'Run3_pp_on_PbPb_approxSiStripClusters',
27712818
'BeamSpot': 'DBrealistic',

DQM/SiPixelHeterogeneous/plugins/SiPixelCompareTrackSoAAlpaka.cc

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -176,9 +176,9 @@ void SiPixelCompareTrackSoAAlpaka<T>::analyze(const edm::Event& iEvent, const ed
176176

177177
float ptHost = tsoaHost.view()[it].pt();
178178
float etaHost = tsoaHost.view()[it].eta();
179-
float phiHost = helper::phi(tsoaHost.view(), it);
180-
float zipHost = helper::zip(tsoaHost.view(), it);
181-
float tipHost = helper::tip(tsoaHost.view(), it);
179+
float phiHost = reco::phi(tsoaHost.view(), it);
180+
float zipHost = reco::zip(tsoaHost.view(), it);
181+
float tipHost = reco::tip(tsoaHost.view(), it);
182182

183183
if (!(ptHost > 0.))
184184
continue;
@@ -193,7 +193,7 @@ void SiPixelCompareTrackSoAAlpaka<T>::analyze(const edm::Event& iEvent, const ed
193193

194194
for (auto gid : looseTrkidxDevice) {
195195
float etaDevice = tsoaDevice.view()[gid].eta();
196-
float phiDevice = helper::phi(tsoaDevice.view(), gid);
196+
float phiDevice = reco::phi(tsoaDevice.view(), gid);
197197
float dr2 = reco::deltaR2(etaHost, phiHost, etaDevice, phiDevice);
198198
if (dr2 > dr2cut_)
199199
continue; // this is arbitrary
@@ -210,22 +210,22 @@ void SiPixelCompareTrackSoAAlpaka<T>::analyze(const edm::Event& iEvent, const ed
210210
nLooseAndAboveTracksHost_matchedDevice++;
211211

212212
hchi2_->Fill(tsoaHost.view()[it].chi2(), tsoaDevice.view()[closestTkidx].chi2());
213-
hCharge_->Fill(reco::charge<T>(tsoaHost.view(), it), reco::charge<T>(tsoaDevice.view(), closestTkidx));
213+
hCharge_->Fill(reco::charge(tsoaHost.view(), it), reco::charge(tsoaDevice.view(), closestTkidx));
214214
hnHits_->Fill(helper::nHits(tsoaHost.view(), it), helper::nHits(tsoaDevice.view(), closestTkidx));
215215
hnLayers_->Fill(tsoaHost.view()[it].nLayers(), tsoaDevice.view()[closestTkidx].nLayers());
216216
hpt_->Fill(tsoaHost.view()[it].pt(), tsoaDevice.view()[closestTkidx].pt());
217217
hptLogLog_->Fill(tsoaHost.view()[it].pt(), tsoaDevice.view()[closestTkidx].pt());
218218
heta_->Fill(etaHost, tsoaDevice.view()[closestTkidx].eta());
219-
hphi_->Fill(phiHost, helper::phi(tsoaDevice.view(), closestTkidx));
220-
hz_->Fill(zipHost, helper::zip(tsoaDevice.view(), closestTkidx));
221-
htip_->Fill(tipHost, helper::tip(tsoaDevice.view(), closestTkidx));
219+
hphi_->Fill(phiHost, reco::phi(tsoaDevice.view(), closestTkidx));
220+
hz_->Fill(zipHost, reco::zip(tsoaDevice.view(), closestTkidx));
221+
htip_->Fill(tipHost, reco::tip(tsoaDevice.view(), closestTkidx));
222222
hptdiffMatched_->Fill(ptHost - tsoaDevice.view()[closestTkidx].pt());
223-
hCurvdiffMatched_->Fill((reco::charge<T>(tsoaHost.view(), it) / tsoaHost.view()[it].pt()) -
224-
(reco::charge<T>(tsoaDevice.view(), closestTkidx) / tsoaDevice.view()[closestTkidx].pt()));
223+
hCurvdiffMatched_->Fill((reco::charge(tsoaHost.view(), it) / tsoaHost.view()[it].pt()) -
224+
(reco::charge(tsoaDevice.view(), closestTkidx) / tsoaDevice.view()[closestTkidx].pt()));
225225
hetadiffMatched_->Fill(etaHost - tsoaDevice.view()[closestTkidx].eta());
226-
hphidiffMatched_->Fill(reco::deltaPhi(phiHost, helper::phi(tsoaDevice.view(), closestTkidx)));
227-
hzdiffMatched_->Fill(zipHost - helper::zip(tsoaDevice.view(), closestTkidx));
228-
htipdiffMatched_->Fill(tipHost - helper::tip(tsoaDevice.view(), closestTkidx));
226+
hphidiffMatched_->Fill(reco::deltaPhi(phiHost, reco::phi(tsoaDevice.view(), closestTkidx)));
227+
hzdiffMatched_->Fill(zipHost - reco::zip(tsoaDevice.view(), closestTkidx));
228+
htipdiffMatched_->Fill(tipHost - reco::tip(tsoaDevice.view(), closestTkidx));
229229
hpt_eta_tkAllHostMatched_->Fill(etaHost, tsoaHost.view()[it].pt()); //matched to gpu
230230
hphi_z_tkAllHostMatched_->Fill(etaHost, zipHost);
231231
}

DQM/SiPixelHeterogeneous/python/SiPixelHeterogenousDQM_FirstStep_cff.py

Lines changed: 76 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,35 @@
77
from DQM.SiPixelHeterogeneous.siPixelPhase2MonitorTrackSoA_cfi import *
88
from DQM.SiPixelHeterogeneous.siPixelHIonPhase1MonitorTrackSoA_cfi import *
99
from DQM.SiPixelHeterogeneous.siPixelMonitorVertexSoA_cfi import *
10+
# Alpaka Modules
11+
from Configuration.ProcessModifiers.alpaka_cff import alpaka
12+
from DQM.SiPixelHeterogeneous.siPixelPhase1MonitorRecHitsSoAAlpaka_cfi import *
13+
from DQM.SiPixelHeterogeneous.siPixelPhase2MonitorRecHitsSoAAlpaka_cfi import *
14+
from DQM.SiPixelHeterogeneous.siPixelHIonPhase1MonitorRecHitsSoAAlpaka_cfi import *
15+
from DQM.SiPixelHeterogeneous.siPixelPhase1MonitorTrackSoAAlpaka_cfi import *
16+
from DQM.SiPixelHeterogeneous.siPixelPhase2MonitorTrackSoAAlpaka_cfi import *
17+
from DQM.SiPixelHeterogeneous.siPixelHIonPhase1MonitorTrackSoAAlpaka_cfi import *
18+
from DQM.SiPixelHeterogeneous.siPixelMonitorVertexSoAAlpaka_cfi import *
1019

1120
# Run-3 sequence
1221
monitorpixelSoASource = cms.Sequence(siPixelPhase1MonitorRecHitsSoA * siPixelPhase1MonitorTrackSoA * siPixelMonitorVertexSoA)
13-
22+
# Run-3 Alpaka sequence
23+
monitorpixelSoASourceAlpaka = cms.Sequence(siPixelPhase1MonitorRecHitsSoAAlpaka * siPixelPhase1MonitorTrackSoAAlpaka * siPixelMonitorVertexSoAAlpaka)
24+
alpaka.toReplaceWith(monitorpixelSoASource, monitorpixelSoASourceAlpaka)
1425
# Phase-2 sequence
1526
from Configuration.Eras.Modifier_phase2_tracker_cff import phase2_tracker
1627
_monitorpixelSoARecHitsSource = cms.Sequence(siPixelPhase2MonitorRecHitsSoA * siPixelPhase2MonitorTrackSoA * siPixelMonitorVertexSoA)
17-
phase2_tracker.toReplaceWith(monitorpixelSoASource, _monitorpixelSoARecHitsSource)
28+
(phase2_tracker & ~alpaka).toReplaceWith(monitorpixelSoASource, _monitorpixelSoARecHitsSource)
29+
_monitorpixelSoARecHitsSourceAlpaka = cms.Sequence(siPixelPhase2MonitorRecHitsSoAAlpaka * siPixelPhase2MonitorTrackSoAAlpaka * siPixelMonitorVertexSoAAlpaka)
30+
(phase2_tracker & alpaka).toReplaceWith(monitorpixelSoASource, _monitorpixelSoARecHitsSourceAlpaka)
1831

1932
# HIon Phase 1 sequence
2033
from Configuration.ProcessModifiers.pp_on_AA_cff import pp_on_AA
2134

2235
_monitorpixelSoARecHitsSourceHIon = cms.Sequence(siPixelHIonPhase1MonitorRecHitsSoA * siPixelHIonPhase1MonitorTrackSoA * siPixelMonitorVertexSoA)
2336
(pp_on_AA & ~phase2_tracker).toReplaceWith(monitorpixelSoASource, _monitorpixelSoARecHitsSourceHIon)
37+
_monitorpixelSoARecHitsSourceHIonAlpaka = cms.Sequence(siPixelHIonPhase1MonitorRecHitsSoAAlpaka * siPixelHIonPhase1MonitorTrackSoAAlpaka * siPixelMonitorVertexSoAAlpaka)
38+
(pp_on_AA & ~phase2_tracker & alpaka).toReplaceWith(monitorpixelSoASource, _monitorpixelSoARecHitsSourceHIonAlpaka)
2439

2540
#Define the sequence for GPU vs CPU validation
2641
#This should run:- individual monitor for the 2 collections + comparison module
@@ -33,6 +48,14 @@
3348
from DQM.SiPixelHeterogeneous.siPixelCompareVertexSoA_cfi import *
3449
from DQM.SiPixelHeterogeneous.siPixelPhase1RawDataErrorComparator_cfi import *
3550
from DQM.SiPixelPhase1Common.SiPixelPhase1RawData_cfi import *
51+
#Alpaka
52+
from DQM.SiPixelHeterogeneous.siPixelPhase1CompareRecHitsSoAAlpaka_cfi import *
53+
from DQM.SiPixelHeterogeneous.siPixelPhase2CompareRecHitsSoAAlpaka_cfi import *
54+
from DQM.SiPixelHeterogeneous.siPixelHIonPhase1CompareRecHitsSoAAlpaka_cfi import *
55+
from DQM.SiPixelHeterogeneous.siPixelPhase1CompareTrackSoAAlpaka_cfi import *
56+
from DQM.SiPixelHeterogeneous.siPixelPhase2CompareTrackSoAAlpaka_cfi import *
57+
from DQM.SiPixelHeterogeneous.siPixelHIonPhase1CompareTrackSoAAlpaka_cfi import *
58+
from DQM.SiPixelHeterogeneous.siPixelCompareVertexSoAAlpaka_cfi import *
3659

3760
# digi errors
3861
SiPixelPhase1RawDataConfForCPU = copy.deepcopy(SiPixelPhase1RawDataConf)
@@ -126,6 +149,43 @@
126149
topFolderName = 'SiPixelHeterogeneous/PixelVertexSoAGPU',
127150
)
128151

152+
### Alpaka
153+
154+
# PixelRecHits: monitor of CPUSerial product (Alpaka backend: 'serial_sync')
155+
siPixelRecHitsSoAMonitorSerial = siPixelPhase1MonitorRecHitsSoAAlpaka.clone(
156+
pixelHitsSrc = cms.InputTag( 'siPixelRecHitsPreSplittingAlpakaSerial' ),
157+
TopFolderName = cms.string( 'SiPixelHeterogeneous/PixelRecHitsSerial' )
158+
)
159+
160+
# PixelRecHits: monitor of Device product (Alpaka backend: '')
161+
siPixelRecHitsSoAMonitorDevice = siPixelPhase1MonitorRecHitsSoAAlpaka.clone(
162+
pixelHitsSrc = cms.InputTag( 'siPixelRecHitsPreSplittingAlpaka' ),
163+
TopFolderName = cms.string( 'SiPixelHeterogeneous/PixelRecHitsDevice' )
164+
)
165+
166+
# PixelTracks: monitor of CPUSerial product (Alpaka backend: 'serial_sync')
167+
siPixelTrackSoAMonitorSerial = siPixelPhase1MonitorTrackSoAAlpaka.clone(
168+
pixelTrackSrc = cms.InputTag('pixelTracksAlpakaSerial'),
169+
topFolderName = cms.string('SiPixelHeterogeneous/PixelTrackSerial')
170+
)
171+
172+
# PixelTracks: monitor of CPUSerial product (Alpaka backend: 'serial_sync')
173+
siPixelTrackSoAMonitorDevice = siPixelPhase1MonitorTrackSoAAlpaka.clone(
174+
pixelTrackSrc = cms.InputTag('pixelTracksAlpaka'),
175+
topFolderName = cms.string('SiPixelHeterogeneous/PixelTrackDevice')
176+
)
177+
178+
# PixelVertices: monitor of CPUSerial product (Alpaka backend: 'serial_sync')
179+
siPixelVertexSoAMonitorSerial = siPixelMonitorVertexSoAAlpaka.clone(
180+
pixelVertexSrc = cms.InputTag("pixelVerticesAlpakaSerial"),
181+
topFolderName = cms.string('SiPixelHeterogeneous/PixelVertexSerial')
182+
)
183+
184+
siPixelVertexSoAMonitorDevice = siPixelMonitorVertexSoAAlpaka.clone(
185+
pixelVertexSrc = cms.InputTag("pixelVerticesAlpaka"),
186+
topFolderName = cms.string('SiPixelHeterogeneous/PixelVertexDevice')
187+
)
188+
129189
# Run-3 sequence
130190
monitorpixelSoACompareSource = cms.Sequence(siPixelPhase1MonitorRawDataACPU *
131191
siPixelPhase1MonitorRawDataAGPU *
@@ -139,6 +199,17 @@
139199
siPixelMonitorVertexSoAGPU *
140200
siPixelCompareVertexSoA *
141201
siPixelPhase1RawDataErrorComparator)
202+
# and the Alpaka version
203+
monitorpixelSoACompareSourceAlpaka = cms.Sequence(
204+
siPixelRecHitsSoAMonitorSerial *
205+
siPixelRecHitsSoAMonitorDevice *
206+
siPixelPhase1CompareRecHitsSoAAlpaka *
207+
siPixelTrackSoAMonitorSerial *
208+
siPixelTrackSoAMonitorDevice *
209+
siPixelPhase1CompareTrackSoAAlpaka *
210+
siPixelVertexSoAMonitorSerial *
211+
siPixelVertexSoAMonitorDevice *
212+
siPixelCompareVertexSoAAlpaka )
142213

143214
# Phase-2 sequence
144215
_monitorpixelSoACompareSource = cms.Sequence(siPixelPhase2MonitorRecHitsSoACPU *
@@ -166,3 +237,6 @@
166237

167238
from Configuration.ProcessModifiers.gpuValidationPixel_cff import gpuValidationPixel
168239
gpuValidationPixel.toReplaceWith(monitorpixelSoASource, monitorpixelSoACompareSource)
240+
241+
from Configuration.ProcessModifiers.alpakaValidationPixel_cff import alpakaValidationPixel
242+
(alpakaValidationPixel & ~gpuValidationPixel).toReplaceWith(monitorpixelSoASource, monitorpixelSoACompareSourceAlpaka)

DataFormats/TrackSoA/interface/TracksSoA.h

Lines changed: 52 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1-
#ifndef DataFormats_Track_interface_TrackLayout_h
2-
#define DataFormats_Track_interface_TrackLayout_h
1+
#ifndef DataFormats_TrackSoA_interface_TracksSoA_h
2+
#define DataFormats_TrackSoA_interface_TracksSoA_h
3+
4+
#include <alpaka/alpaka.hpp>
35

46
#include <Eigen/Core>
7+
58
#include "HeterogeneousCore/AlpakaInterface/interface/OneToManyAssoc.h"
69
#include "Geometry/CommonTopologies/interface/SimplePixelTopology.h"
710
#include "DataFormats/SoATemplate/interface/SoALayout.h"
@@ -29,6 +32,7 @@ namespace reco {
2932
SOA_COLUMN(int8_t, nLayers),
3033
SOA_COLUMN(float, eta),
3134
SOA_COLUMN(float, pt),
35+
// state at the beam spot: {phi, tip, 1/pt, cotan(theta), zip}
3236
SOA_EIGEN_COLUMN(Vector5f, state),
3337
SOA_EIGEN_COLUMN(Vector15f, covariance),
3438
SOA_SCALAR(int, nTracks),
@@ -43,14 +47,56 @@ namespace reco {
4347
template <typename TrackerTraits>
4448
using TrackSoAConstView = typename reco::TrackSoA<TrackerTraits>::template Layout<>::ConstView;
4549

46-
template <typename TrackerTraits>
47-
ALPAKA_FN_HOST_ACC ALPAKA_FN_INLINE static constexpr float charge(const TrackSoAConstView<TrackerTraits> &tracks,
48-
int32_t i) {
50+
/* Implement a type trait to identify the specialisations of TrackSoAConstView<TrackerTraits>
51+
*
52+
* This is done explicitly for all possible pixel topologies, because we did not find a way
53+
* to use template deduction with a partial specialisation.
54+
*/
55+
template <typename T>
56+
struct IsTrackSoAConstView : std::false_type {};
57+
template <>
58+
struct IsTrackSoAConstView<TrackSoAConstView<pixelTopology::Phase1>> : std::true_type {};
59+
template <>
60+
struct IsTrackSoAConstView<TrackSoAView<pixelTopology::Phase1>> : std::true_type {};
61+
template <>
62+
struct IsTrackSoAConstView<TrackSoAConstView<pixelTopology::Phase2>> : std::true_type {};
63+
template <>
64+
struct IsTrackSoAConstView<TrackSoAView<pixelTopology::Phase2>> : std::true_type {};
65+
template <>
66+
struct IsTrackSoAConstView<TrackSoAConstView<pixelTopology::HIonPhase1>> : std::true_type {};
67+
template <>
68+
struct IsTrackSoAConstView<TrackSoAView<pixelTopology::HIonPhase1>> : std::true_type {};
69+
70+
template <typename T>
71+
constexpr bool isTrackSoAConstView = IsTrackSoAConstView<T>::value;
72+
73+
template <typename ConstView, typename = std::enable_if_t<isTrackSoAConstView<ConstView>>>
74+
ALPAKA_FN_HOST_ACC ALPAKA_FN_INLINE constexpr float charge(ConstView const& tracks, int32_t i) {
4975
//was: std::copysign(1.f, tracks[i].state()(2)). Will be constexpr with C++23
5076
float v = tracks[i].state()(2);
5177
return float((0.0f < v) - (v < 0.0f));
5278
}
5379

80+
template <typename ConstView, typename = std::enable_if_t<isTrackSoAConstView<ConstView>>>
81+
ALPAKA_FN_HOST_ACC ALPAKA_FN_INLINE constexpr float phi(ConstView const& tracks, int32_t i) {
82+
return tracks[i].state()(0);
83+
}
84+
85+
template <typename ConstView, typename = std::enable_if_t<isTrackSoAConstView<ConstView>>>
86+
ALPAKA_FN_HOST_ACC ALPAKA_FN_INLINE constexpr float tip(ConstView const& tracks, int32_t i) {
87+
return tracks[i].state()(1);
88+
}
89+
90+
template <typename ConstView, typename = std::enable_if_t<isTrackSoAConstView<ConstView>>>
91+
ALPAKA_FN_HOST_ACC ALPAKA_FN_INLINE constexpr float zip(ConstView const& tracks, int32_t i) {
92+
return tracks[i].state()(4);
93+
}
94+
95+
template <typename ConstView, typename = std::enable_if_t<isTrackSoAConstView<ConstView>>>
96+
ALPAKA_FN_HOST_ACC ALPAKA_FN_INLINE constexpr bool isTriplet(ConstView const& tracks, int32_t i) {
97+
return tracks[i].nLayers() == 3;
98+
}
99+
54100
} // namespace reco
55101

56-
#endif
102+
#endif // DataFormats_TrackSoA_interface_TracksSoA_h

0 commit comments

Comments
 (0)