DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
TAMakerDBSCANAlgorithm.cpp
Go to the documentation of this file.
1
10#include "dbscan/Point.hpp"
11
12#include "TRACE/trace.h"
13#include "triggeralgs/Types.hpp"
14#include <chrono>
15#include <limits>
16#define TRACE_NAME "TAMakerDBSCANAlgorithm"
17
18#include <vector>
19
20using namespace triggeralgs;
21
22using Logging::TLVL_DEBUG_LOW;
23
24void
25TAMakerDBSCANAlgorithm::process(const TriggerPrimitive& input_tp, std::vector<TriggerActivity>& output_ta)
26{
27 if(input_tp.time_start < m_prev_timestamp){
28 TLOG_DEBUG(TLVL_DEBUG_LOW) << "[TAM:DBS] Out-of-order TPs: prev " << m_prev_timestamp << ", current " << input_tp.time_start;
29 return;
30 }
31
32 m_dbscan_clusters.clear();
33 m_dbscan->add_primitive(input_tp, &m_dbscan_clusters);
34
35 uint64_t t0=m_dbscan->get_first_prim_time();
36
37 for(auto const& cluster : m_dbscan_clusters){
38 auto& ta=output_ta.emplace_back();
39
40 ta.time_start = std::numeric_limits<timestamp_t>::max();
41 ta.time_end = 0;
42 ta.channel_start = std::numeric_limits<channel_t>::max();
43 ta.channel_end = 0;
44 ta.adc_integral = 0;
45
46 for(auto const& hit : cluster.hits){
47 auto const& prim=hit->primitive;
48
49 ta.inputs.push_back(prim);
50
51 ta.time_start = std::min(prim.time_start, ta.time_start);
52 ta.time_end = std::max(prim.time_start + prim.samples_over_threshold * 32, ta.time_end); // FIXME: Replace the hard-coded SOT to TOT scaling.
53
54 ta.channel_start = std::min(channel_t(prim.channel), ta.channel_start);
55 ta.channel_end = std::max(channel_t(prim.channel), ta.channel_end);
56
57 ta.adc_integral += prim.adc_integral;
58
59 ta.detid = prim.detid;
60 if (prim.adc_peak > ta.adc_peak) {
61 ta.adc_peak = prim.adc_peak;
62 ta.channel_peak = prim.channel;
63 ta.time_peak = prim.samples_to_peak * 32 + prim.time_start; // FIXME: Replace hard-coded STP to `time_peak` conversion.
64 }
65 }
66 ta.time_activity = ta.time_peak;
67
70 }
71
72 m_dbscan->trim_hits();
73}
74
75void
76TAMakerDBSCANAlgorithm::configure(const nlohmann::json& config)
77{
79
80 if (config.is_object())
81 {
82 if (config.contains("min_pts"))
83 m_min_pts = config["min_pts"];
84 if (config.contains("eps"))
85 m_eps = config["eps"];
86 }
87 m_dbscan=std::make_unique<dbscan::IncrementalDBSCAN>(m_eps, m_min_pts, 10000);
88}
89
90// Register algo in TA Factory
#define REGISTER_TRIGGER_ACTIVITY_MAKER(tam_name, tam_class)
void configure(const nlohmann::json &config)
void process(const TriggerPrimitive &input_tp, std::vector< TriggerActivity > &output_ta)
TP processing function that creates & fills TAs.
std::unique_ptr< dbscan::IncrementalDBSCAN > m_dbscan
std::vector< dbscan::Cluster > m_dbscan_clusters
virtual void configure(const nlohmann::json &config)
#define TLOG_DEBUG(lvl,...)
Definition Logging.hpp:112
dunedaq::trgdataformats::channel_t channel_t
Definition Types.hpp:20
#define TRACE_NAME
A single energy deposition on a TPC or PDS channel.