36 struct TriggerSamples {
37 uint16_t apv_trigger_;
38 std::vector<short> samples_;
42 uint8_t hybrid_id_{0};
44 std::vector<TriggerSamples> triggers_;
48 std::map<uint32_t, ChannelInfo> channel_map;
50 for (
const auto& hit : hits) {
51 const float noise = peds.noise(hit.getFebId(), hit.getHybridId(),
52 hit.getApvId(), hit.getChannel());
53 if (noise <= 0)
continue;
55 const int16_t pchannel =
60 auto& ch = channel_map[key];
62 ch.hybrid_id_ = hit.getHybridId();
63 ch.feb_id_ = hit.getFebId();
64 ch.triggers_.push_back({hit.getApvTrigger(), hit.getSamples()});
67 std::vector<ldmx::SiStripWaveform> waveforms;
69 for (
auto& [key, ch] : channel_map) {
71 std::sort(ch.triggers_.begin(), ch.triggers_.end(),
72 [](
const TriggerSamples& a,
const TriggerSamples& b) {
73 return a.apv_trigger_ < b.apv_trigger_;
77 std::vector<short> samples;
78 samples.reserve(ch.triggers_.size() *
80 for (
const auto& trig : ch.triggers_) {
81 for (
short s : trig.samples_) samples.push_back(s);
84 if (samples.empty())
continue;
88 for (
short s : samples)
94 int max_streak = 0, cur_streak = 0;
95 for (
short s : samples) {
97 max_streak = std::max(max_streak, ++cur_streak);
105 uint8_t n_trig =
static_cast<uint8_t
>(
106 std::min(
static_cast<int>(ch.triggers_.size()), 255));
108 waveforms.emplace_back(std::move(samples), pchannel, ch.hybrid_id_,
112 ldmx_log(debug) <<
"Built " << waveforms.size()
118 for (
const auto& wf : waveforms) {
119 ldmx_log(trace) << wf;
122 event.add(output_collection_, waveforms);
constexpr uint32_t groupKey(uint8_t feb, uint8_t hybrid, int16_t pchannel)
Pack (feb, hybrid, pchannel) into a single 32-bit waveform-grouping key.
constexpr int16_t pchannel(uint8_t apv_id, uint8_t channel)
Convert an (APV id, APV channel) pair into the physical strip number (pchannel) within a hybrid,...