15static void GPUExtractPbPbCollision(GPUParam&
param, GPUTrackingInOutPointers& ioPtrs)
17 std::vector<uint32_t> counts(
param.continuousMaxTimeBin + 1);
18 std::vector<uint32_t> sums(
param.continuousMaxTimeBin + 1);
19 std::vector<uint32_t> countsTracks(
param.continuousMaxTimeBin + 1);
20 std::vector<uint32_t> sumsTracks(
param.continuousMaxTimeBin + 1);
21 std::vector<bool>
mask(
param.continuousMaxTimeBin + 1);
22 const int32_t driftlength = 520;
23 const bool checkAfterGlow =
true;
24 const int32_t afterGlowLength = checkAfterGlow ? 8000 : 0;
25 for (uint32_t
i = 0;
i < ioPtrs.clustersNative->nClustersTotal;
i++) {
26 int32_t
time = ioPtrs.clustersNative->clustersLinear[
i].getTime();
27 if (time < 0 || time >
param.continuousMaxTimeBin) {
28 fprintf(stderr,
"Invalid time %d > %d\n",
time,
param.continuousMaxTimeBin);
29 throw std::runtime_error(
"Invalid Time");
33 for (uint32_t
i = 0;
i < ioPtrs.nMergedTracks;
i++) {
34 if (ioPtrs.mergedTracks[
i].NClusters() < 40) {
37 int32_t
time = ioPtrs.mergedTracks[
i].GetParam().GetTZOffset();
38 if (time < 0 || time >
param.continuousMaxTimeBin) {
44 for (int32_t
i = driftlength;
i <
param.continuousMaxTimeBin;
i++) {
50 for (int32_t
i =
param.continuousMaxTimeBin + 1 - driftlength;
i > 0;
i--) {
57 uint32_t countTracks = 0;
62 countTracks += countsTracks[
i];
63 if (
i -
first >= driftlength) {
64 sums[
i - driftlength] =
count;
65 sumsTracks[
i - driftlength] = countTracks;
70 count -= counts[
i - driftlength];
71 countTracks -= countsTracks[
i - driftlength];
75 printf(
"BASELINE Min %d Avg %d\n",
min, (int32_t)avg);
82 uint32_t
max = 0, maxpos = 0;
83 for (int32_t
i =
first;
i <
last - driftlength - afterGlowLength;
i++) {
84 if (sums[
i] > 10 *
min && sums[
i] > avg && sumsTracks[
i] > 3) {
85 bool noColInAfterGlow =
true;
87 for (int32_t ii =
i + driftlength; ii <
i + driftlength + afterGlowLength; ii++) {
88 if (sums[ii] > 10 *
min && sums[ii] > avg && sumsTracks[ii] > 3) {
89 noColInAfterGlow =
false;
93 if (noColInAfterGlow && sums[
i] >
max) {
102 uint32_t glowcount = 0;
103 if (checkAfterGlow) {
104 int32_t glowstart = maxpos + driftlength;
105 int32_t glowend = std::min<int32_t>(last, maxpos + driftlength + afterGlowLength);
106 for (int32_t
i = glowstart;
i < glowend;
i++) {
112 printf(
"MAX %d: %u (Tracks %u) Glow %d (%d)\n", maxpos,
max, sumsTracks[maxpos], glow, glowcount);
113 for (int32_t
i = std::max<int32_t>(
first, maxpos - driftlength); i < std::min<int32_t>(last, maxpos + driftlength + afterGlowLength);
i++) {
118 }
while (found && !checkAfterGlow);
120 uint32_t noisecount = 0;
127 printf(
"AVERAGE NOISE: %d\n", noise / noisecount);