35 struct TriggerSamples {
36 uint16_t apv_trigger_;
37 std::vector<short> samples_;
41 uint8_t hybrid_id_{0};
43 std::vector<TriggerSamples> triggers_;
47 std::map<uint32_t, ChannelInfo> channel_map;
49 for (
const auto& hit : hits) {
50 const float noise = peds.noise(hit.getFebId(), hit.getHybridId(),
51 hit.getApvId(), hit.getChannel());
52 if (noise <= 0)
continue;
54 const int16_t pchannel =
59 auto& ch = channel_map[key];
61 ch.hybrid_id_ = hit.getHybridId();
62 ch.feb_id_ = hit.getFebId();
63 ch.triggers_.push_back({hit.getApvTrigger(), hit.getSamples()});
66 std::vector<ldmx::SiStripWaveform> waveforms;
68 for (
auto& [key, ch] : channel_map) {
70 std::sort(ch.triggers_.begin(), ch.triggers_.end(),
71 [](
const TriggerSamples& a,
const TriggerSamples& b) {
72 return a.apv_trigger_ < b.apv_trigger_;
76 std::vector<short> samples;
77 samples.reserve(ch.triggers_.size() *
79 for (
const auto& trig : ch.triggers_) {
80 for (
short s : trig.samples_) samples.push_back(s);
83 if (samples.empty())
continue;
87 for (
short s : samples)
93 int max_streak = 0, cur_streak = 0;
94 for (
short s : samples) {
96 max_streak = std::max(max_streak, ++cur_streak);
104 uint8_t n_trig =
static_cast<uint8_t
>(
105 std::min(
static_cast<int>(ch.triggers_.size()), 255));
107 waveforms.emplace_back(std::move(samples), pchannel, ch.hybrid_id_,
111 ldmx_log(debug) <<
"Built " << waveforms.size()
117 for (
const auto& wf : waveforms) {
118 ldmx_log(trace) << wf;
121 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,...