@@ -28,9 +28,10 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE {
2828 auto digi = digis[idx];
2929 auto digiflags = digi.flags ();
3030 // recHits[idx].flags() = digiflags;
31- bool isAvailable ((digiflags != hgcal::DIGI_FLAG::Invalid) && (digiflags != hgcal::DIGI_FLAG::NotAvailable) &&
32- calibvalid);
33- bool isToAavailable ((digiflags != hgcal::DIGI_FLAG::ZS_ToA) && (digiflags != hgcal::DIGI_FLAG::ZS_ToA_ADCm1));
31+ bool isAvailable ((digiflags != ::hgcal::DIGI_FLAG::Invalid) &&
32+ (digiflags != ::hgcal::DIGI_FLAG::NotAvailable) && calibvalid);
33+ bool isToAavailable ((digiflags != ::hgcal::DIGI_FLAG::ZS_ToA) &&
34+ (digiflags != ::hgcal::DIGI_FLAG::ZS_ToA_ADCm1));
3435 recHits[idx].flags () = (!isAvailable) * hgcalrechit::HGCalRecHitFlags::EnergyInvalid +
3536 (!isToAavailable) * hgcalrechit::HGCalRecHitFlags::TimeInvalid;
3637 }
@@ -61,8 +62,8 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE {
6162 bool calibvalid = calib.valid ();
6263 auto digi = digis[idx];
6364 auto digiflags = digi.flags ();
64- bool isAvailable ((digiflags != hgcal::DIGI_FLAG::Invalid) && (digiflags != hgcal::DIGI_FLAG::NotAvailable ) &&
65- calibvalid);
65+ bool isAvailable ((digiflags != :: hgcal::DIGI_FLAG::Invalid ) &&
66+ (digiflags != ::hgcal::DIGI_FLAG::NotAvailable) && calibvalid);
6667 bool useTOT ((digi.tctp () == 3 ) && isAvailable);
6768 bool useADC (!useTOT && isAvailable);
6869 recHits[idx].energy () = useADC * adc_denoise (digi.adc (),
@@ -111,9 +112,10 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE {
111112 bool calibvalid = calib.valid ();
112113 auto digi = digis[idx];
113114 auto digiflags = digi.flags ();
114- bool isAvailable ((digiflags != hgcal::DIGI_FLAG::Invalid) && (digiflags != hgcal::DIGI_FLAG::NotAvailable) &&
115- calibvalid);
116- bool isToAavailable ((digiflags != hgcal::DIGI_FLAG::ZS_ToA) && (digiflags != hgcal::DIGI_FLAG::ZS_ToA_ADCm1));
115+ bool isAvailable ((digiflags != ::hgcal::DIGI_FLAG::Invalid) &&
116+ (digiflags != ::hgcal::DIGI_FLAG::NotAvailable) && calibvalid);
117+ bool isToAavailable ((digiflags != ::hgcal::DIGI_FLAG::ZS_ToA) &&
118+ (digiflags != ::hgcal::DIGI_FLAG::ZS_ToA_ADCm1));
117119 bool isGood (isAvailable && isToAavailable);
118120 // INL correction
119121 auto toa = isGood * toa_inl_corr (digi.toa (), calib.TOA_CTDC (), calib.TOA_FTDC ());
@@ -125,6 +127,59 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE {
125127 }
126128 };
127129
130+ struct HGCalRecHitCalibrationKernel_handleCalibCell {
131+ ALPAKA_FN_ACC void operator ()(Acc1D const & acc,
132+ HGCalDigiDevice::View digis,
133+ HGCalRecHitDevice::View recHits,
134+ HGCalCalibParamDevice::ConstView calibs,
135+ HGCalMappingCellParamDevice::ConstView maps,
136+ HGCalDenseIndexInfoDevice::ConstView index) const {
137+ auto time_average = [&](float time_surr, float time_calib, float energy_surr, float energy_calib) {
138+ bool is_time_surr (time_surr > 0 );
139+ bool is_time_calib (time_calib > 0 );
140+ float totalEn = (is_time_surr * energy_surr + is_time_calib * energy_calib);
141+ float weighted_average =
142+ (totalEn > 0 )
143+ ? (is_time_surr * energy_surr * time_surr + is_time_calib * energy_calib * time_calib) / totalEn
144+ : 0 .0f ;
145+ return weighted_average;
146+ };
147+
148+ for (auto idx : uniform_elements (acc, digis.metadata ().size ())) {
149+ auto calib = calibs[idx];
150+ bool calibvalid = calib.valid ();
151+ auto digi = digis[idx];
152+ auto digiflags = digi.flags ();
153+ bool isAvailable ((digiflags != ::hgcal::DIGI_FLAG::Invalid) &&
154+ (digiflags != ::hgcal::DIGI_FLAG::NotAvailable) && calibvalid);
155+ bool isToAavailable ((digiflags != ::hgcal::DIGI_FLAG::ZS_ToA) &&
156+ (digiflags != ::hgcal::DIGI_FLAG::ZS_ToA_ADCm1));
157+
158+ auto cellIndex = index[idx].cellInfoIdx ();
159+ bool isCalibCell (maps[cellIndex].iscalib ());
160+ int offset = maps[cellIndex].caliboffset (); // Calibration-to-surrounding cell offset
161+ bool is_surr_cell ((offset != 0 ) && isAvailable && isCalibCell);
162+
163+ // Effectively operate only on the cell that surrounds the calibration cells
164+ if (!is_surr_cell) {
165+ continue ;
166+ }
167+
168+ recHits[idx + offset].flags () = hgcalrechit::HGCalRecHitFlags::Normal;
169+
170+ recHits[idx + offset].time () = isToAavailable * time_average (recHits[idx + offset].time (),
171+ recHits[idx].time (),
172+ recHits[idx + offset].energy (),
173+ recHits[idx].energy ());
174+
175+ bool is_negative_surr_energy (recHits[idx + offset].energy () < 0 );
176+ auto negative_energy_correction = (-1.0 * recHits[idx + offset].energy ()) * is_negative_surr_energy;
177+
178+ recHits[idx + offset].energy () += (negative_energy_correction + recHits[idx].energy ());
179+ }
180+ }
181+ };
182+
128183 struct HGCalRecHitCalibrationKernel_printRecHits {
129184 ALPAKA_FN_ACC void operator ()(Acc1D const & acc, HGCalRecHitDevice::ConstView view, int size) const {
130185 for (int i = 0 ; i < size; ++i) {
@@ -137,7 +192,9 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE {
137192 HGCalRecHitDevice HGCalRecHitCalibrationAlgorithms::calibrate (Queue& queue,
138193 HGCalDigiHost const & host_digis,
139194 HGCalCalibParamDevice const & device_calib,
140- HGCalConfigParamDevice const & device_config) const {
195+ HGCalConfigParamDevice const & device_config,
196+ HGCalMappingCellParamDevice const & device_mapping,
197+ HGCalDenseIndexInfoDevice const & device_index) const {
141198 LogDebug (" HGCalRecHitCalibrationAlgorithms" ) << " \n\n INFO -- Start of calibrate\n\n " << std::endl;
142199
143200 LogDebug (" HGCalRecHitCalibrationAlgorithms" ) << " \n\n INFO -- Copying the digis to the device\n\n " << std::endl;
@@ -176,6 +233,14 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE {
176233 device_digis.view (),
177234 device_recHits.view (),
178235 device_calib.view ());
236+ alpaka::exec<Acc1D>(queue,
237+ grid,
238+ HGCalRecHitCalibrationKernel_handleCalibCell{},
239+ device_digis.view (),
240+ device_recHits.view (),
241+ device_calib.view (),
242+ device_mapping.view (),
243+ device_index.view ());
179244
180245 LogDebug (" HGCalRecHitCalibrationAlgorithms" ) << " Input recHits: " << std::endl;
181246#ifdef EDM_ML_DEBUG
0 commit comments