File indexing completed on 2024-04-06 12:27:40
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include "FWCore/Utilities/interface/isFinite.h"
0010
0011 #include "RecoPPS/Local/interface/CTPPSDiamondRecHitProducerAlgorithm.h"
0012 #include "DataFormats/CTPPSDetId/interface/CTPPSDiamondDetId.h"
0013
0014
0015
0016 void CTPPSDiamondRecHitProducerAlgorithm::build(const CTPPSGeometry& geom,
0017 const edm::DetSetVector<CTPPSDiamondDigi>& input,
0018 edm::DetSetVector<CTPPSDiamondRecHit>& output) {
0019 for (const auto& vec : input) {
0020 const CTPPSDiamondDetId detid(vec.detId());
0021
0022 if (detid.channel() > MAX_CHANNEL)
0023 continue;
0024
0025
0026 const DetGeomDesc* det = geom.sensor(detid);
0027
0028 const float x_pos = det->translation().x(), y_pos = det->translation().y();
0029 float z_pos = 0.;
0030 z_pos = det->parentZPosition();
0031
0032
0033 const auto& diamondDimensions = det->getDiamondDimensions();
0034 const float x_width = 2.0 * diamondDimensions.xHalfWidth;
0035 const float y_width = 2.0 * diamondDimensions.yHalfWidth;
0036 const float z_width = 2.0 * diamondDimensions.zHalfWidth;
0037
0038 const int sector = detid.arm(), station = detid.station(), plane = detid.plane(), channel = detid.channel();
0039
0040 std::vector<double> lut;
0041 if (apply_calib_)
0042 lut = calibLUT_->bins(sector, station, plane, channel);
0043 if (lut.size() != 1024)
0044 lut = std::vector<double>(1024, 0.0);
0045
0046
0047 const auto& ch_params =
0048 (apply_calib_) ? calib_->parameters(sector, station, plane, channel) : std::vector<double>{};
0049
0050 const double ch_t_offset = (apply_calib_) ? calib_->timeOffset(sector, station, plane, channel) : 0.;
0051 const double ch_t_precis = (apply_calib_) ? calib_->timePrecision(sector, station, plane, channel) : 0.;
0052
0053 edm::DetSet<CTPPSDiamondRecHit>& rec_hits = output.find_or_insert(detid);
0054
0055 for (const auto& digi : vec) {
0056 const int t_lead = digi.leadingEdge(), t_trail = digi.trailingEdge();
0057
0058 if (t_lead == 0 && t_trail == 0)
0059 continue;
0060
0061 double tot = -1., ch_t_twc = 0.;
0062 if (t_lead != 0 && t_trail != 0) {
0063 tot = (t_trail - t_lead) * ts_to_ns_;
0064 if (calib_fct_ && apply_calib_ && !ch_params.empty()) {
0065
0066 ch_t_twc = calib_fct_->evaluate(std::vector<double>{tot}, ch_params);
0067 if (edm::isNotFinite(ch_t_twc))
0068 ch_t_twc = 0.;
0069 }
0070 }
0071
0072 const int time_slice =
0073 (t_lead != 0) ? (t_lead - ch_t_offset / ts_to_ns_) / 1024 : CTPPSDiamondRecHit::TIMESLICE_WITHOUT_LEADING;
0074
0075
0076 const double t0 = (t_lead % 1024) * ts_to_ns_ + lut[t_lead % 1024] * ts_to_ns_ - ch_t_twc;
0077 rec_hits.emplace_back(
0078
0079 x_pos,
0080 x_width,
0081 y_pos,
0082 y_width,
0083 z_pos,
0084 z_width,
0085
0086 t0,
0087 tot,
0088 ch_t_precis,
0089 time_slice,
0090
0091 digi.hptdcErrorFlags(),
0092 digi.multipleHit());
0093 }
0094 }
0095 }