Process the event and put new data products into it.
40 {
41
42
43
44
45
46
47
48
49
50
51
52 if (verbose_) {
53 ldmx_log(debug)
54 << "TrigScintFirmwareTracker: produce() starts! Event number: "
55 << event.getEventHeader().getEventNumber();
56 }
57
58
61
62
63 for (int i = 0; i < NCENT; ++i) {
64 for (int j = 0; j < COMBO; ++j) {
65 for (int k = 0; k < 2; ++k) {
67 }
68 }
69 }
70
71
72
73
74
75 for (int i = 0; i < NCENT; i++) {
76 for (int j = 0; j < COMBO; j++) {
77 LOOKUP[i][j][0] = (i - A[1] + A[0]);
78 LOOKUP[i][j][1] = (i - A[2] + A[0]);
79 if (j / 3 == 0) {
80 LOOKUP[i][j][0] -= 1;
81 } else if (j / 3 == 2) {
82 LOOKUP[i][j][0] += 1;
83 }
84 if (j % 3 == 0) {
85 LOOKUP[i][j][1] -= 1;
86 } else if (j % 3 == 2) {
87 LOOKUP[i][j][1] += 1;
88 }
89 if (not((LOOKUP[i][j][0] >= 0) and (LOOKUP[i][j][1] >= 0) and
90 (LOOKUP[i][j][0] < NCENT) and (LOOKUP[i][j][1] < NCENT))) {
91 LOOKUP[i][j][0] = -1;
92 LOOKUP[i][j][1] = -1;
93 }
94 }
95 }
96
100
101
102
107
108 for (int j = 0; j < NHITS; j++) {
109 clearHit(HPad1[j]);
110 clearHit(HPad2[j]);
111 clearHit(HPad3[j]);
112 }
113 for (int j = 0; j < NCLUS; j++) {
114 if (j < NTRK) {
115 clearClus(Pad1[j]);
116 }
117 clearClus(Pad2[j]);
118 clearClus(Pad3[j]);
119 }
120 for (int j = 0; j < NTRK; j++) {
121 clearTrack(outTrk[j]);
122 }
123
124 const auto &digis1{
126 const auto &digis2{
128 const auto &digis3{
130
131 if (verbose_) {
132 ldmx_log(debug) << "Got digi collection " << digis1_collection_ << "_"
133 << passName_ << " with " << digis1.size() << " entries ";
134 }
135
136
137
138
139 int occupied[NCHAN];
140 for (int i = 0; i < NCHAN; i++) {
141 occupied[i] = -1;
142 }
143 int count = 0;
144 for (const auto &digi : digis1) {
145 if ((digi.getPE() >
minThr_) and (digi.getBarID() <= NCHAN) and
146 (digi.getBarID() >= 0)) {
149 if (occupied[digi.getBarID()] >= 0) {
150 if (HPad1[occupied[digi.getBarID()]].Amp < digi.getPE()) {
151 HPad1[occupied[digi.getBarID()]].bID = (
ap_int<12>)(digi.getBarID());
152 HPad1[occupied[digi.getBarID()]].mID =
154 HPad1[occupied[digi.getBarID()]].Amp = (
ap_int<12>)(digi.getPE());
155 HPad1[occupied[digi.getBarID()]].Time = (
ap_int<12>)(digi.getTime());
156 }
157 } else {
158 HPad1[count].bID = (
ap_int<12>)(digi.getBarID());
159 HPad1[count].mID = (
ap_int<12>)(digi.getModuleID());
160 HPad1[count].Amp = (
ap_int<12>)(digi.getPE());
161 HPad1[count].Time = (
ap_int<12>)(digi.getTime());
162 occupied[digi.getBarID()] = count;
163 count++;
164 }
165 }
166 }
167
168 for (int i = 0; i < NCHAN; i++) {
169 occupied[i] = -1;
170 }
171 count = 0;
172 for (const auto &digi : digis2) {
173 if ((digi.getPE() >
minThr_) and (digi.getBarID() <= NCHAN) and
174 (digi.getBarID() >= 0)) {
177 if (occupied[digi.getBarID()] >= 0) {
178 if (HPad2[occupied[digi.getBarID()]].Amp < digi.getPE()) {
179 HPad2[occupied[digi.getBarID()]].bID = (
ap_int<12>)(digi.getBarID());
180 HPad2[occupied[digi.getBarID()]].mID =
182 HPad2[occupied[digi.getBarID()]].Amp = (
ap_int<12>)(digi.getPE());
183 HPad2[occupied[digi.getBarID()]].Time = (
ap_int<12>)(digi.getTime());
184 }
185 } else {
186 HPad2[count].bID = (
ap_int<12>)(digi.getBarID());
187 HPad2[count].mID = (
ap_int<12>)(digi.getModuleID());
188 HPad2[count].Amp = (
ap_int<12>)(digi.getPE());
189 HPad2[count].Time = (
ap_int<12>)(digi.getTime());
190 occupied[digi.getBarID()] = count;
191 count++;
192 }
193 }
194 }
195 for (int i = 0; i < NCHAN; i++) {
196 occupied[i] = -1;
197 }
198 count = 0;
199 for (const auto &digi : digis3) {
200 if ((digi.getPE() >
minThr_) and (digi.getBarID() <= NCHAN) and
201 (digi.getBarID() >= 0)) {
204 if (occupied[digi.getBarID()] >= 0) {
205 if (HPad3[occupied[digi.getBarID()]].Amp < digi.getPE()) {
206 HPad3[occupied[digi.getBarID()]].bID = (
ap_int<12>)(digi.getBarID());
207 HPad3[occupied[digi.getBarID()]].mID =
209 HPad3[occupied[digi.getBarID()]].Amp = (
ap_int<12>)(digi.getPE());
210 HPad3[occupied[digi.getBarID()]].Time = (
ap_int<12>)(digi.getTime());
211 }
212 } else {
213 HPad3[count].bID = (
ap_int<12>)(digi.getBarID());
214 HPad3[count].mID = (
ap_int<12>)(digi.getModuleID());
215 HPad3[count].Amp = (
ap_int<12>)(digi.getPE());
216 HPad3[count].Time = (
ap_int<12>)(digi.getTime());
217 occupied[digi.getBarID()] = count;
218 count++;
219 }
220 }
221 }
222
223
224
225
226 int counterN = 0;
227 std::array<Cluster, NCLUS> Point1 = clusterproducer_sw(HPad1);
228 int topSeed = 0;
229 for (int i = 0; i < NCLUS; i++) {
230 if ((Point1[i].Seed.Amp < 450) and (Point1[i].Seed.Amp > 30) and
231 (Point1[i].Seed.bID < (NCHAN + 1)) and (Point1[i].Seed.bID >= 0) and
232 (Point1[i].Sec.Amp < 450) and (counterN < NTRK)) {
233 if (Point1[i].Seed.bID >= topSeed) {
234 cpyHit(Pad1[counterN].Seed, Point1[i].Seed);
235 cpyHit(Pad1[counterN].Sec, Point1[i].Sec);
236 calcCent(Pad1[counterN]);
237 counterN++;
238 topSeed = Point1[i].Seed.bID;
239 }
240 }
241 }
242 std::array<Cluster, NCLUS> Point2 = clusterproducer_sw(HPad2);
243 topSeed = 0;
244 for (int i = 0; i < NCLUS; i++) {
245 if ((Point2[i].Seed.Amp < 450) and (Point2[i].Seed.Amp > 30) and
246 (Point2[i].Seed.bID < (NCHAN + 1)) and (Point2[i].Seed.bID >= 0) and
247 (Point2[i].Sec.Amp < 450)) {
248 if (Point2[i].Seed.bID >= topSeed) {
249 cpyHit(Pad2[i].Seed, Point2[i].Seed);
250 cpyHit(Pad2[i].Sec, Point2[i].Sec);
251 calcCent(Pad2[i]);
252 topSeed = Point2[i].Seed.bID;
253 }
254 }
255 }
256 std::array<Cluster, NCLUS> Point3 = clusterproducer_sw(HPad3);
257 topSeed = 0;
258 for (int i = 0; i < NCLUS; i++) {
259 if ((Point3[i].Seed.Amp < 450) and (Point3[i].Seed.Amp > 30) and
260 (Point3[i].Seed.bID < (NCHAN + 1)) and (Point3[i].Seed.bID >= 0) and
261 (Point3[i].Sec.Amp < 450)) {
262 if (Point3[i].Seed.bID >= topSeed) {
263 cpyHit(Pad3[i].Seed, Point3[i].Seed);
264 cpyHit(Pad3[i].Sec, Point3[i].Sec);
265 calcCent(Pad3[i]);
266 topSeed = Point3[i].Seed.bID;
267 }
268 }
269 }
270
271
272
273
274
275
276
277
278
279
280 trackproducer_hw(Pad1, Pad2, Pad3, outTrk, LOOKUP);
281 for (int I = 0; I < NTRK; I++) {
282 if (outTrk[I].Pad1.Seed.Amp > 0. && outTrk[I].Pad1.Sec.Amp >= 0. &&
283 outTrk[I].Pad2.Seed.Amp > 0. && outTrk[I].Pad2.Sec.Amp >= 0. &&
284 outTrk[I].Pad3.Seed.Amp > 0. && outTrk[I].Pad3.Sec.Amp >= 0.) {
286 tracks_.push_back(trk);
287 }
288 }
289 event.add(output_collection_, tracks_);
290 tracks_.resize(0);
291
292 return;
293}
Sign Arbitrary Precision Type.