LDMX Software
clusterproducer_sw.cxx
1#include <stdio.h>
2
3#include <array>
4#include <iostream>
5
6#include "TrigScint/Firmware/clusterproducer.h"
7#include "TrigScint/Firmware/objdef.h"
8
9std::array<Cluster, NCLUS> clusterproducerSw(Hit inHit[NHITS]) {
10 ap_int<12> seedthr = 30;
11 ap_int<12> clusthr = 30;
12
13 ap_int<12> map_l1[NCHAN];
14
15 std::array<Cluster, NCLUS> out_clus;
16
17 for (int i = 0; i < NCLUS; ++i) {
18 clearClus(out_clus[i]);
19 }
20
21 // CLEAR THE MAP
22 for (int i = 0; i < NCHAN; ++i) {
23 map_l1[i] = -1;
24 }
25 // MAP TO CHANNELS
26 for (int j = 0; j < NHITS; ++j) {
27 if (inHit[j].b_id_ > -1) {
28 map_l1[inHit[j].b_id_] = j;
29 }
30 }
31 // NOW WE JUST LOOK FOR HITS EXCEEDING SEED, IF THEY DO WE PAIR 'EM.
32 for (int k = 0; k < NCLUS; ++k) {
33 bool do_next_cluster = true;
34 if ((map_l1[2 * k] > -1)) {
35 if (inHit[map_l1[2 * k]].amp_ > seedthr) {
36 clearClus(out_clus[k]);
37 out_clus[k].seed_.m_id_ = inHit[map_l1[2 * k]].m_id_;
38 out_clus[k].seed_.b_id_ = inHit[map_l1[2 * k]].b_id_;
39 out_clus[k].seed_.amp_ = inHit[map_l1[2 * k]].amp_;
40 out_clus[k].seed_.time_ = inHit[map_l1[2 * k]].time_;
41 if (map_l1[2 * k + 1] > -1) {
42 if (inHit[map_l1[2 * k + 1]].amp_ > clusthr) {
43 out_clus[k].sec_.m_id_ = inHit[map_l1[2 * k + 1]].m_id_;
44 out_clus[k].sec_.b_id_ = inHit[map_l1[2 * k + 1]].b_id_;
45 out_clus[k].sec_.amp_ = inHit[map_l1[2 * k + 1]].amp_;
46 out_clus[k].sec_.time_ = inHit[map_l1[2 * k + 1]].time_;
47 do_next_cluster = false;
48 // You can comment this line to turn it into Serialized
49 clearHit(inHit[map_l1[2 * k + 1]]);
50 }
51 }
52 }
53 }
54 if ((map_l1[2 * k + 1] > -1) and (do_next_cluster)) {
55 if (inHit[map_l1[2 * k + 1]].amp_ > seedthr) {
56 clearClus(out_clus[k]);
57 out_clus[k].seed_.m_id_ = inHit[map_l1[2 * k + 1]].m_id_;
58 out_clus[k].seed_.b_id_ = inHit[map_l1[2 * k + 1]].b_id_;
59 out_clus[k].seed_.amp_ = inHit[map_l1[2 * k + 1]].amp_;
60 out_clus[k].seed_.time_ = inHit[map_l1[2 * k + 1]].time_;
61 if (k < NCLUS - 1) {
62 if (map_l1[2 * k + 2] > -1) {
63 if (inHit[map_l1[2 * k + 2]].amp_ > clusthr) {
64 out_clus[k].sec_.m_id_ = inHit[map_l1[2 * k + 2]].m_id_;
65 out_clus[k].sec_.b_id_ = inHit[map_l1[2 * k + 2]].b_id_;
66 out_clus[k].sec_.amp_ = inHit[map_l1[2 * k + 2]].amp_;
67 out_clus[k].sec_.time_ = inHit[map_l1[2 * k + 2]].time_;
68 // You can comment this line to turn it into Serialized
69 clearHit(inHit[map_l1[2 * k + 2]]);
70 }
71 }
72 }
73 }
74 }
75 }
76
77 return out_clus;
78}
Definition objdef.h:49
Sign Arbitrary Precision Type.
Definition ap_int.h:28