Skip to content

Commit

Permalink
Add ECAL portable data formats, collections and conditions for migrat…
Browse files Browse the repository at this point in the history
…ion to alpaka.
  • Loading branch information
thomreis committed Oct 3, 2023
1 parent f738fee commit 5756e0f
Show file tree
Hide file tree
Showing 37 changed files with 495 additions and 4 deletions.
27 changes: 27 additions & 0 deletions CondFormats/DataRecord/interface/EcalMultifitConditionsRcd.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#ifndef CondFormats_DataRecord_EcalMultifitConditionsRcd_h
#define CondFormats_DataRecord_EcalMultifitConditionsRcd_h

#include "FWCore/Framework/interface/DependentRecordImplementation.h"

#include "CondFormats/DataRecord/interface/EcalGainRatiosRcd.h"
#include "CondFormats/DataRecord/interface/EcalPedestalsRcd.h"
#include "CondFormats/DataRecord/interface/EcalPulseCovariancesRcd.h"
#include "CondFormats/DataRecord/interface/EcalPulseShapesRcd.h"
#include "CondFormats/DataRecord/interface/EcalSampleMaskRcd.h"
#include "CondFormats/DataRecord/interface/EcalSamplesCorrelationRcd.h"
#include "CondFormats/DataRecord/interface/EcalTimeBiasCorrectionsRcd.h"
#include "CondFormats/DataRecord/interface/EcalTimeCalibConstantsRcd.h"
#include "CondFormats/DataRecord/interface/EcalTimeOffsetConstantRcd.h"

class EcalMultifitConditionsRcd
: public edm::eventsetup::DependentRecordImplementation<EcalMultifitConditionsRcd,
edm::mpl::Vector<EcalGainRatiosRcd,
EcalPedestalsRcd,
EcalPulseCovariancesRcd,
EcalPulseShapesRcd,
EcalSampleMaskRcd,
EcalSamplesCorrelationRcd,
EcalTimeBiasCorrectionsRcd,
EcalTimeCalibConstantsRcd,
EcalTimeOffsetConstantRcd>> {};
#endif
4 changes: 4 additions & 0 deletions CondFormats/DataRecord/src/EcalMultifitConditionsRcd.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#include "CondFormats/DataRecord/interface/EcalMultifitConditionsRcd.h"
#include "FWCore/Framework/interface/eventsetuprecord_registration_macro.h"

EVENTSETUP_RECORD_REG(EcalMultifitConditionsRcd);
5 changes: 5 additions & 0 deletions CondFormats/EcalObjects/BuildFile.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,18 @@
<use name="DataFormats/EcalDetId"/>
<use name="DataFormats/EcalDigi"/>
<use name="DataFormats/Math"/>
<use name="DataFormats/Portable"/>
<use name="DataFormats/SoATemplate"/>
<use name="HeterogeneousCore/CUDACore"/>
<use name="HeterogeneousCore/CUDAUtilities"/>
<use name="boost"/>
<use name="boost_serialization"/>
<use name="rootmath"/>
<use name="clhep"/>
<use name="cuda"/>
<use name="HeterogeneousCore/AlpakaCore"/>
<use name="HeterogeneousCore/AlpakaInterface"/>
<flags ALPAKA_BACKENDS="1"/>
<export>
<lib name="1"/>
</export>
11 changes: 11 additions & 0 deletions CondFormats/EcalObjects/interface/EcalElectronicsMappingPortable.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#ifndef CondFormats_EcalObjects_interface_EcalElectronicsMappingPortable_h
#define CondFormats_EcalObjects_interface_EcalElectronicsMappingPortable_h

#include "CondFormats/EcalObjects/interface/EcalElectronicsMappingSoA.h"
#include "DataFormats/Portable/interface/PortableHostCollection.h"
#include "HeterogeneousCore/AlpakaInterface/interface/config.h"
#include "HeterogeneousCore/AlpakaInterface/interface/memory.h"

using EcalElectronicsMappingPortableHost = PortableHostCollection<EcalElectronicsMappingSoA>;

#endif
12 changes: 12 additions & 0 deletions CondFormats/EcalObjects/interface/EcalElectronicsMappingSoA.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#ifndef CondFormats_EcalObjects_EcalElectronicsMappingSoA_h
#define CondFormats_EcalObjects_EcalElectronicsMappingSoA_h

#include "DataFormats/SoATemplate/interface/SoACommon.h"
#include "DataFormats/SoATemplate/interface/SoALayout.h"
#include "DataFormats/SoATemplate/interface/SoAView.h"

GENERATE_SOA_LAYOUT(EcalElectronicsMappingSoALayout, SOA_COLUMN(uint32_t, rawid))

using EcalElectronicsMappingSoA = EcalElectronicsMappingSoALayout<>;

#endif
11 changes: 11 additions & 0 deletions CondFormats/EcalObjects/interface/EcalMultifitConditionsPortable.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#ifndef CondFormats_EcalObjects_interface_EcalMultifitConditionsPortable_h
#define CondFormats_EcalObjects_interface_EcalMultifitConditionsPortable_h

#include "CondFormats/EcalObjects/interface/EcalMultifitConditionsSoA.h"
#include "DataFormats/Portable/interface/PortableHostCollection.h"
#include "HeterogeneousCore/AlpakaInterface/interface/config.h"
#include "HeterogeneousCore/AlpakaInterface/interface/memory.h"

using EcalMultifitConditionsPortableHost = PortableHostCollection<EcalMultifitConditionsSoA>;

#endif
57 changes: 57 additions & 0 deletions CondFormats/EcalObjects/interface/EcalMultifitConditionsSoA.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
#ifndef CondFormats_EcalObjects_EcalMultifitConditionsSoA_h
#define CondFormats_EcalObjects_EcalMultifitConditionsSoA_h

#include <Eigen/Dense>
#include "DataFormats/SoATemplate/interface/SoACommon.h"
#include "DataFormats/SoATemplate/interface/SoALayout.h"
#include "DataFormats/SoATemplate/interface/SoAView.h"
#include "DataFormats/EcalDigi/interface/EcalConstants.h"
#include "CondFormats/EcalObjects/interface/EcalPulseShapes.h"

using PulseShapeArray = std::array<float, EcalPulseShape::TEMPLATESAMPLES>;
using SampleCorrelationArray = std::array<double, ecalPh1::sampleSize>;

using CovarianceMatrix = Eigen::Matrix<float, EcalPulseShape::TEMPLATESAMPLES, EcalPulseShape::TEMPLATESAMPLES>;

constexpr size_t N_TIMEBIASCORRECTIONS_BINS_EB = 71;
constexpr size_t N_TIMEBIASCORRECTIONS_BINS_EE = 58;
using TimeBiasCorrArrayEB = std::array<float, N_TIMEBIASCORRECTIONS_BINS_EB>;
using TimeBiasCorrArrayEE = std::array<float, N_TIMEBIASCORRECTIONS_BINS_EE>;

GENERATE_SOA_LAYOUT(EcalMultifitConditionsSoALayout,
SOA_COLUMN(uint32_t, rawid),
SOA_COLUMN(float, pedestals_mean_x12),
SOA_COLUMN(float, pedestals_mean_x6),
SOA_COLUMN(float, pedestals_mean_x1),
SOA_COLUMN(float, pedestals_rms_x12),
SOA_COLUMN(float, pedestals_rms_x6),
SOA_COLUMN(float, pedestals_rms_x1),
SOA_COLUMN(PulseShapeArray, pulseShapes),
// NxN N=templatesamples for each xtal
SOA_EIGEN_COLUMN(CovarianceMatrix, pulseCovariance),
SOA_COLUMN(float, gain12Over6),
SOA_COLUMN(float, gain6Over1),
SOA_COLUMN(float, timeCalibConstants),
// timeBiasCorrections (fixed since 2011)
SOA_SCALAR(TimeBiasCorrArrayEB, timeBiasCorrections_amplitude_EB),
SOA_SCALAR(TimeBiasCorrArrayEB, timeBiasCorrections_shift_EB),
SOA_SCALAR(TimeBiasCorrArrayEE, timeBiasCorrections_amplitude_EE),
SOA_SCALAR(TimeBiasCorrArrayEE, timeBiasCorrections_shift_EE),
// Sample correlation scalar: array of 10 values for each gain in EB and EE
SOA_SCALAR(SampleCorrelationArray, sampleCorrelation_EB_G12),
SOA_SCALAR(SampleCorrelationArray, sampleCorrelation_EB_G6),
SOA_SCALAR(SampleCorrelationArray, sampleCorrelation_EB_G1),
SOA_SCALAR(SampleCorrelationArray, sampleCorrelation_EE_G12),
SOA_SCALAR(SampleCorrelationArray, sampleCorrelation_EE_G6),
SOA_SCALAR(SampleCorrelationArray, sampleCorrelation_EE_G1),
// Samples Masks
SOA_SCALAR(unsigned int, sampleMask_EB),
SOA_SCALAR(unsigned int, sampleMask_EE),
SOA_SCALAR(float, timeOffset_EB),
SOA_SCALAR(float, timeOffset_EE),
// offset for hashed ID access to EE items of columns
SOA_SCALAR(uint32_t, offsetEE))

using EcalMultifitConditionsSoA = EcalMultifitConditionsSoALayout<>;

#endif
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#ifndef CondFormats_EcalObjects_interface_alpaka_EcalElectronicsMappingPortable_h
#define CondFormats_EcalObjects_interface_alpaka_EcalElectronicsMappingPortable_h

#include "CondFormats/EcalObjects/interface/EcalElectronicsMappingPortable.h"
#include "CondFormats/EcalObjects/interface/EcalElectronicsMappingSoA.h"
#include "DataFormats/Portable/interface/alpaka/PortableCollection.h"
#include "HeterogeneousCore/AlpakaInterface/interface/config.h"
#include "HeterogeneousCore/AlpakaInterface/interface/memory.h"

namespace ALPAKA_ACCELERATOR_NAMESPACE {

using EcalElectronicsMappingPortableHost = EcalElectronicsMappingPortableHost;
using EcalElectronicsMappingPortableDevice = PortableCollection<EcalElectronicsMappingSoA>;

} // namespace ALPAKA_ACCELERATOR_NAMESPACE

#endif
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#ifndef CondFormats_EcalObjects_interface_alpaka_EcalMultifitConditionsPortable_h
#define CondFormats_EcalObjects_interface_alpaka_EcalMultifitConditionsPortable_h

#include "CondFormats/EcalObjects/interface/EcalMultifitConditionsPortable.h"
#include "CondFormats/EcalObjects/interface/EcalMultifitConditionsSoA.h"
#include "DataFormats/Portable/interface/alpaka/PortableCollection.h"
#include "HeterogeneousCore/AlpakaInterface/interface/config.h"
#include "HeterogeneousCore/AlpakaInterface/interface/memory.h"

namespace ALPAKA_ACCELERATOR_NAMESPACE {

using ::EcalMultifitConditionsPortableHost;
using EcalMultifitConditionsPortableDevice = PortableCollection<EcalMultifitConditionsSoA>;

} // namespace ALPAKA_ACCELERATOR_NAMESPACE

#endif
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#include "CondFormats/EcalObjects/interface/EcalElectronicsMappingPortable.h"
#include "FWCore/Utilities/interface/typelookup.h"

TYPELOOKUP_DATA_REG(EcalElectronicsMappingPortableHost);
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#include "CondFormats/EcalObjects/interface/EcalMultifitConditionsPortable.h"
#include "FWCore/Utilities/interface/typelookup.h"

TYPELOOKUP_DATA_REG(EcalMultifitConditionsPortableHost);
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#include "HeterogeneousCore/AlpakaCore/interface/alpaka/typelookup.h"

#include "CondFormats/EcalObjects/interface/alpaka/EcalElectronicsMappingPortable.h"
TYPELOOKUP_ALPAKA_DATA_REG(EcalElectronicsMappingPortableDevice);
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#include "HeterogeneousCore/AlpakaCore/interface/alpaka/typelookup.h"

#include "CondFormats/EcalObjects/interface/alpaka/EcalMultifitConditionsPortable.h"
TYPELOOKUP_ALPAKA_DATA_REG(EcalMultifitConditionsPortableDevice);
6 changes: 5 additions & 1 deletion DataFormats/EcalDigi/BuildFile.xml
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
<use name="DataFormats/Common"/>
<use name="DataFormats/EcalDetId"/>
<use name="DataFormats/DetId"/>
<use name="DataFormats/EcalDetId"/>
<use name="DataFormats/Portable"/>
<use name="DataFormats/SoATemplate"/>
<use name="FWCore/MessageLogger"/>
<use name="FWCore/Utilities"/>
<use name="HeterogeneousCore/AlpakaInterface"/>
<flags ALPAKA_BACKENDS="cuda rocm"/>
<export>
<lib name="1"/>
</export>
23 changes: 21 additions & 2 deletions DataFormats/EcalDigi/interface/EcalConstants.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
#ifndef DataFormats_EcalDigi_EcalConstants_h
#define DataFormats_EcalDigi_EcalConstants_h

#include <array>

#include "FWCore/Utilities/interface/HostDeviceConstant.h"

// constants used to encode difference between corrected cc time and noncorrected cc time
Expand All @@ -13,6 +15,23 @@ namespace ecalcctiming {
inline constexpr const float encodingValue = 398.4375; // encodes time difference into 0 - 255 int range
} // namespace ecalcctiming

// temporary placing this here until a better place is found
namespace ecal {
// due to a ROOT limitation the std::array needs to be wrapped in a struct to
// be able to be stored in a ROOT file
// https://github.com/root-project/root/issues/12007
template <class T, std::size_t N>
struct StdArrayStruct {
std::array<T, N> array;

T* data() { return array.data(); };
const T* data() const { return array.data(); };

T& operator[](size_t n) { return array[n]; };
const T& operator[](size_t n) const { return array[n]; };
};
} // namespace ecal

// The HOST_DEVICE_CONSTANTs can not reside in the classes directly, which is
// why they are defined in a namespace and constant pointers to them are used in the classes
namespace ecalph2 {
Expand All @@ -30,7 +49,7 @@ class ecalPh2 {
public:
static constexpr double Samp_Period = 6.25; // ADC sampling period in ns
static constexpr unsigned int NGAINS = ecalph2::NGAINS; // Number of CATIA gains
static constexpr const float *gains = ecalph2::gains; // CATIA gain values
static constexpr const float* gains = ecalph2::gains; // CATIA gain values
static constexpr unsigned int gainId1 = 1; // Position of gain 1 in gains array
static constexpr unsigned int gainId10 = 0; // Position of gain 10 in gains array
static constexpr unsigned int sampleSize = 16; // Number of samples per event
Expand All @@ -49,7 +68,7 @@ class ecalPh1 {
public:
static constexpr double Samp_Period = 25.; // ADC sampling period in ns
static constexpr unsigned int NGAINS = ecalph1::NGAINS; // Number of MGPA gains including a zero gain
static constexpr const float *gains = ecalph1::gains; // MGPA gain values including a zero gain
static constexpr const float* gains = ecalph1::gains; // MGPA gain values including a zero gain
static constexpr unsigned int sampleSize = 10; // Number of samples per event
static constexpr unsigned int NBITS = 12; // Number of available bits
static constexpr unsigned int kNOffsets = 2000; // Number of time offsets generated for APD pulse shape
Expand Down
13 changes: 13 additions & 0 deletions DataFormats/EcalDigi/interface/EcalDigiHostCollection.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#ifndef DataFormats_EcalDigi_EcalDigiHostCollection_h
#define DataFormats_EcalDigi_EcalDigiHostCollection_h

#include "DataFormats/Portable/interface/PortableHostCollection.h"
#include "DataFormats/EcalDigi/interface/EcalDigiSoA.h"

namespace ecal {

// EcalDigiSoA in host memory
using DigiHostCollection = PortableHostCollection<EcalDigiSoA>;
} // namespace ecal

#endif
13 changes: 13 additions & 0 deletions DataFormats/EcalDigi/interface/EcalDigiPhase2HostCollection.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#ifndef DataFormats_EcalDigi_EcalDigiPhase2HostCollection_h
#define DataFormats_EcalDigi_EcalDigiPhase2HostCollection_h

#include "DataFormats/Portable/interface/PortableHostCollection.h"
#include "DataFormats/EcalDigi/interface/EcalDigiPhase2SoA.h"

namespace ecal {

// EcalDigiPhase2SoA in host memory
using DigiPhase2HostCollection = PortableHostCollection<EcalDigiPhase2SoA>;
} // namespace ecal

#endif
21 changes: 21 additions & 0 deletions DataFormats/EcalDigi/interface/EcalDigiPhase2SoA.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#ifndef DataFormats_EcalDigi_EcalDigiPhase2SoA_h
#define DataFormats_EcalDigi_EcalDigiPhase2SoA_h

#include "DataFormats/EcalDigi/interface/EcalConstants.h"
#include "DataFormats/SoATemplate/interface/SoALayout.h"

namespace ecal {

// due to a ROOT limitation the std::array needs to be wrapped in a struct
// https://github.com/root-project/root/issues/12007
using DataArrayPhase2Struct = StdArrayStruct<uint16_t, ecalPh2::sampleSize>;

GENERATE_SOA_LAYOUT(EcalDigiPhase2SoALayout,
SOA_COLUMN(uint32_t, id),
SOA_COLUMN(DataArrayPhase2Struct, data),
SOA_SCALAR(uint32_t, size))

using EcalDigiPhase2SoA = EcalDigiPhase2SoALayout<>;
} // namespace ecal

#endif
21 changes: 21 additions & 0 deletions DataFormats/EcalDigi/interface/EcalDigiSoA.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#ifndef DataFormats_EcalDigi_EcalDigiSoA_h
#define DataFormats_EcalDigi_EcalDigiSoA_h

#include "DataFormats/EcalDigi/interface/EcalConstants.h"
#include "DataFormats/SoATemplate/interface/SoALayout.h"

namespace ecal {

// due to a ROOT limitation the std::array needs to be wrapped in a struct
// https://github.com/root-project/root/issues/12007
using DataArrayStruct = StdArrayStruct<uint16_t, ecalPh1::sampleSize>;

GENERATE_SOA_LAYOUT(EcalDigiSoALayout,
SOA_COLUMN(uint32_t, id),
SOA_COLUMN(DataArrayStruct, data),
SOA_SCALAR(uint32_t, size))

using EcalDigiSoA = EcalDigiSoALayout<>;
} // namespace ecal

#endif
22 changes: 22 additions & 0 deletions DataFormats/EcalDigi/interface/alpaka/EcalDigiDeviceCollection.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#ifndef DataFormats_EcalDigi_interface_alpaka_EcalDigiDeviceCollection_h
#define DataFormats_EcalDigi_interface_alpaka_EcalDigiDeviceCollection_h

#include "DataFormats/Portable/interface/alpaka/PortableCollection.h"
#include "DataFormats/EcalDigi/interface/EcalDigiSoA.h"
#include "HeterogeneousCore/AlpakaInterface/interface/config.h"

namespace ALPAKA_ACCELERATOR_NAMESPACE {

namespace ecal {

// make the names from the top-level ecal namespace visible for unqualified lookup
// inside the ALPAKA_ACCELERATOR_NAMESPACE::portabletest namespace
using namespace ::ecal;

// EcalDigiSoA in device global memory
using DigiDeviceCollection = PortableCollection<EcalDigiSoA>;
} // namespace ecal

} // namespace ALPAKA_ACCELERATOR_NAMESPACE

#endif
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#ifndef DataFormats_EcalDigi_interface_alpaka_EcalDigiPhase2DeviceCollection_h
#define DataFormats_EcalDigi_interface_alpaka_EcalDigiPhase2DeviceCollection_h

#include "DataFormats/Portable/interface/alpaka/PortableCollection.h"
#include "DataFormats/EcalDigi/interface/EcalDigiPhase2SoA.h"
#include "HeterogeneousCore/AlpakaInterface/interface/config.h"

namespace ALPAKA_ACCELERATOR_NAMESPACE {

namespace ecal {

// make the names from the top-level ecal namespace visible for unqualified lookup
// inside the ALPAKA_ACCELERATOR_NAMESPACE::portabletest namespace
using namespace ::ecal;

// EcalDigiPhase2SoA in device global memory
using DigiPhase2DeviceCollection = PortableCollection<EcalDigiPhase2SoA>;
} // namespace ecal

} // namespace ALPAKA_ACCELERATOR_NAMESPACE

#endif
6 changes: 6 additions & 0 deletions DataFormats/EcalDigi/src/alpaka/classes_cuda.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#include "DataFormats/Common/interface/DeviceProduct.h"
#include "DataFormats/Common/interface/Wrapper.h"
#include "DataFormats/EcalDigi/interface/EcalDigiSoA.h"
#include "DataFormats/EcalDigi/interface/alpaka/EcalDigiDeviceCollection.h"
#include "DataFormats/EcalDigi/interface/EcalDigiPhase2SoA.h"
#include "DataFormats/EcalDigi/interface/alpaka/EcalDigiPhase2DeviceCollection.h"
Loading

0 comments on commit 5756e0f

Please sign in to comment.