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().GetTOffset();
 
   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);