Project
Loading...
Searching...
No Matches
GPUO2InterfaceUtils.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
14
15#include "GPUO2InterfaceUtils.h"
17#include "GPUO2InterfaceRefit.h"
18#include "TPCPadGainCalib.h"
19#include "CalibdEdxContainer.h"
20#include "TPCBase/Sector.h"
22#include "GPUParam.h"
26#include "TPCBase/CRU.h"
27#include "TPCBase/RDHUtils.h"
30#include <gsl/span>
31
32using namespace o2::gpu;
33
34using DigitArray = std::array<gsl::span<const o2::tpc::Digit>, o2::tpc::Sector::MAXSECTOR>;
35
36std::unique_ptr<TPCPadGainCalib> GPUO2InterfaceUtils::getPadGainCalibDefault()
37{
38 return std::make_unique<TPCPadGainCalib>();
39}
40
41std::unique_ptr<TPCPadGainCalib> GPUO2InterfaceUtils::getPadGainCalib(const o2::tpc::CalDet<float>& in)
42{
43 return std::make_unique<TPCPadGainCalib>(in);
44}
45
46std::unique_ptr<o2::tpc::CalibdEdxContainer> GPUO2InterfaceUtils::getCalibdEdxContainerDefault()
47{
48 return std::make_unique<o2::tpc::CalibdEdxContainer>();
49}
50
51template <>
52void GPUO2InterfaceUtils::RunZSEncoder<DigitArray>(const DigitArray& in, std::unique_ptr<uint64_t[]>* outBuffer, uint32_t* outSizes, o2::raw::RawFileWriter* raw, const o2::InteractionRecord* ir, int32_t version, bool verify, float threshold, bool padding, std::function<void(std::vector<o2::tpc::Digit>&)> digitsFilter)
53{
55 param.SetDefaults(5.00668, false);
56 o2::gpu::GPUReconstructionConvert::RunZSEncoder(in, outBuffer, outSizes, raw, ir, param, version, verify, threshold, padding, digitsFilter);
57}
58template <>
59void GPUO2InterfaceUtils::RunZSEncoder<DigitArray>(const DigitArray& in, std::unique_ptr<uint64_t[]>* outBuffer, uint32_t* outSizes, o2::raw::RawFileWriter* raw, const o2::InteractionRecord* ir, GPUO2InterfaceConfiguration& config, int32_t version, bool verify, bool padding, std::function<void(std::vector<o2::tpc::Digit>&)> digitsFilter)
60{
62 param.SetDefaults(&config.configGRP, &config.configReconstruction, &config.configProcessing, nullptr);
63 o2::gpu::GPUReconstructionConvert::RunZSEncoder(in, outBuffer, outSizes, raw, ir, param, version, verify, config.configReconstruction.tpc.zsThreshold, padding, digitsFilter);
64}
65
66void GPUO2InterfaceUtils::GPUReconstructionZSDecoder::DecodePage(std::vector<o2::tpc::Digit>& outputBuffer, const void* page, uint32_t tfFirstOrbit, const GPUParam* param, uint32_t triggerBC)
67{
69 if (o2::raw::RDHUtils::getMemorySize(*rdh) == sizeof(o2::header::RAWDataHeader)) {
70 return;
71 }
72 o2::tpc::TPCZSHDR* const hdr = (o2::tpc::TPCZSHDR*)(o2::tpc::rdh_utils::getLink(o2::raw::RDHUtils::getFEEID(*rdh)) == o2::tpc::rdh_utils::DLBZSLinkID ? ((const char*)page + o2::raw::RDHUtils::getMemorySize(*rdh) - sizeof(o2::tpc::TPCZSHDRV2)) : ((const char*)page + sizeof(o2::header::RAWDataHeader)));
73
74 if (mDecoders.size() < hdr->version + 1) {
75 mDecoders.resize(hdr->version + 1);
76 }
77 if (mDecoders[hdr->version] == nullptr) {
79 }
80 mDecoders[hdr->version](outputBuffer, page, tfFirstOrbit, triggerBC);
81}
82
83std::unique_ptr<GPUParam> GPUO2InterfaceUtils::getFullParam(float solenoidBz, uint32_t nHbfPerTf, std::unique_ptr<GPUO2InterfaceConfiguration>* pConfiguration, std::unique_ptr<GPUSettingsO2>* pO2Settings, bool* autoMaxTimeBin)
84{
85 std::unique_ptr<GPUParam> retVal = std::make_unique<GPUParam>();
86 std::unique_ptr<GPUO2InterfaceConfiguration> tmpConfig;
87 std::unique_ptr<GPUSettingsO2> tmpSettingsO2;
88 if (!pConfiguration) {
89 tmpConfig = std::make_unique<GPUO2InterfaceConfiguration>();
90 pConfiguration = &tmpConfig;
91 (*pConfiguration)->configGRP.grpContinuousMaxTimeBin = -1;
92 } else if (!*pConfiguration) {
93 *pConfiguration = std::make_unique<GPUO2InterfaceConfiguration>();
94 (*pConfiguration)->configGRP.grpContinuousMaxTimeBin = -1;
95 }
96 (*pConfiguration)->configGRP.solenoidBzNominalGPU = solenoidBz;
97 if (pO2Settings && *pO2Settings) {
98 **pO2Settings = (*pConfiguration)->ReadConfigurableParam();
99 } else {
100 if (!pO2Settings) {
101 pO2Settings = &tmpSettingsO2;
102 }
103 *pO2Settings = std::make_unique<GPUSettingsO2>((*pConfiguration)->ReadConfigurableParam());
104 }
105 if (nHbfPerTf == 0) {
106 nHbfPerTf = (*pO2Settings)->overrideNHbfPerTF ? (*pO2Settings)->overrideNHbfPerTF : 256;
107 }
108 if (autoMaxTimeBin) {
109 *autoMaxTimeBin = (*pConfiguration)->configGRP.grpContinuousMaxTimeBin == -1;
110 }
111 if ((*pConfiguration)->configGRP.grpContinuousMaxTimeBin == -1) {
112 (*pConfiguration)->configGRP.grpContinuousMaxTimeBin = GPUO2InterfaceUtils::getTpcMaxTimeBinFromNHbf(nHbfPerTf);
113 }
114 retVal->SetDefaults(&(*pConfiguration)->configGRP, &(*pConfiguration)->configReconstruction, &(*pConfiguration)->configProcessing, nullptr);
115 return retVal;
116}
117
118std::shared_ptr<GPUParam> GPUO2InterfaceUtils::getFullParamShared(float solenoidBz, uint32_t nHbfPerTf, std::unique_ptr<GPUO2InterfaceConfiguration>* pConfiguration, std::unique_ptr<GPUSettingsO2>* pO2Settings, bool* autoMaxTimeBin)
119{
120 return std::move(getFullParam(solenoidBz, nHbfPerTf, pConfiguration, pO2Settings, autoMaxTimeBin));
121}
122
123void GPUO2InterfaceUtils::paramUseExternalOccupancyMap(GPUParam* param, uint32_t nHbfPerTf, const uint32_t* occupancymap, int32_t occupancyMapSize)
124{
125 size_t expectedOccMapSize = nHbfPerTf ? GPUO2InterfaceRefit::fillOccupancyMapGetSize(nHbfPerTf, param) : 0;
126 if (occupancyMapSize != -1 && nHbfPerTf && (size_t)occupancyMapSize != expectedOccMapSize) {
127 throw std::runtime_error("Received occupancy map of wrong size, most likely --configKeyValues or HBperTF of map creator and map consumer are different");
128 }
129 if (occupancymap && occupancyMapSize > sizeof(*occupancymap) && occupancymap[1] != (param->rec.tpc.occupancyMapTimeBins * 0x10000 + param->rec.tpc.occupancyMapTimeBinsAverage)) {
130 throw std::runtime_error("Occupancy map has invalid paramters occupancyMapTimeBins and occupancyMapTimeBinsAverage");
131 }
132 if (occupancymap) {
133 param->occupancyTotal = *occupancymap;
134 if (param->rec.tpc.occupancyMapTimeBins) {
135 param->occupancyMap = occupancymap + 2;
136 param->occupancyMapSize = GPUTPCClusterOccupancyMapBin::getNBins(*param);
137 }
138 }
139}
140
Definition of container class for dE/dx corrections.
uint16_t padding
Definition of the TPC Digit.
int32_t retVal
uint32_t version
Definition RawData.h:8
Definitions of TPC Zero Suppression Data Headers.
static size_t fillOccupancyMapGetSize(uint32_t nHbfPerTf, const GPUParam *param=nullptr)
void DecodePage(std::vector< o2::tpc::Digit > &outputBuffer, const void *page, uint32_t tfFirstOrbit, const GPUParam *param, uint32_t triggerBC=0)
static std::unique_ptr< TPCPadGainCalib > getPadGainCalibDefault()
static void paramUseExternalOccupancyMap(GPUParam *param, uint32_t nHbfPerTf, const uint32_t *occupancymap, int32_t occupancyMapSize)
static std::unique_ptr< TPCPadGainCalib > getPadGainCalib(const o2::tpc::CalDet< float > &in)
static uint32_t getTpcMaxTimeBinFromNHbf(uint32_t nHbf)
static std::unique_ptr< GPUParam > getFullParam(float solenoidBz, uint32_t nHbfPerTf=0, std::unique_ptr< GPUO2InterfaceConfiguration > *pConfiguration=nullptr, std::unique_ptr< GPUSettingsO2 > *pO2Settings=nullptr, bool *autoMaxTimeBin=nullptr)
static std::unique_ptr< o2::tpc::CalibdEdxContainer > getCalibdEdxContainerDefault()
static std::shared_ptr< GPUParam > getFullParamShared(float solenoidBz, uint32_t nHbfPerTf=0, std::unique_ptr< GPUO2InterfaceConfiguration > *pConfiguration=nullptr, std::unique_ptr< GPUSettingsO2 > *pO2Settings=nullptr, bool *autoMaxTimeBin=nullptr)
static void RunZSEncoder(const S &in, std::unique_ptr< uint64_t[]> *outBuffer, uint32_t *outSizes, o2::raw::RawFileWriter *raw, const o2::InteractionRecord *ir, const GPUParam &param, int32_t version, bool verify, float threshold=0.f, bool padding=false, std::function< void(std::vector< o2::tpc::Digit > &)> digitsFilter=nullptr)
static std::function< void(std::vector< o2::tpc::Digit > &, const void *, uint32_t, uint32_t)> GetDecoder(int32_t version, const GPUParam *param)
static constexpr int MAXSECTOR
Definition Sector.h:44
std::array< gsl::span< const o2::tpc::Digit >, Sector::MAXSECTOR > DigitArray
GLenum GLfloat param
Definition glcorearb.h:271
constexpr int LHCMaxBunches
RAWDataHeaderV7 RAWDataHeader
constexpr int LHCBCPERTIMEBIN
Definition Constants.h:38
void SetDefaults(float solenoidBz, bool assumeConstantBz)
Definition GPUParam.cxx:33
unsigned char version
o2::InteractionRecord ir(0, 0)