ÔOfflineÕ algorithm (cont.)
3. Search for clusters: convert to ÔcmÕ, search for 2-dim clusters, produces sorted list of clusters with energy above  Õcluster_thresholdÕ

  for(edge=0; edge<3; edge++) {
    for(id=0; id<npeak[edge]; id++) {
      peak[edge][id].coord = peak[edge][id].coord * geom->edge[edge] / 36.;
      peak[edge][id].width = peak[edge][id].width * geom->edge[edge] / 36.;
      peak[edge][id].tmp = 0.0;
    } }
  npsble = -1;
  for(u=0; u<npeak[0]; u++) {
    for(v=0; v<npeak[1]; v++) {
      for(w=0; w<npeak[2]; w++) {
        dltz = peak[0][u].coord/geom->edge[0] + peak[1][v].coord/geom->edge[1] + peak[2][w].coord/geom->edge[2];
        spread = ( peak[0][u].width + peak[1][v].width + peak[2][w].width ) *2.*sqrt(12.);
        sum_edge = geom->edge[0] + geom->edge[1] + geom->edge[2];
        if(ABS(dltz-2.)*sum_edge < spread) {
          npsble++;
          if(npsble == NHIT) return(-1);
          hit[npsble].sector = sector + 1; /* in hit[] sector = 1..6 */
          hit[npsble].layer = io + 1;      /* in hit[] io = 1..2 */
          hit[npsble].i = geom->h *
                          ( peak[0][u].coord/geom->edge[0] - peak[1][v].coord/geom->edge[1] - peak[2][w].coord/geom->edge[2] ) / 2. + geom->h2;
          hit[npsble].j = geom->edge[1] *
                          ( peak[2][w].coord/geom->edge[2] - peak[1][v].coord/geom->edge[1] ) / 2.;
          hit[npsble].k = geom->d;
          hit[npsble].di = sqrt( peak[0][u].width * peak[0][u].width / (geom->edge[0] * geom->edge[0]) +
                                 peak[1][v].width * peak[1][v].width / (geom->edge[1] * geom->edge[1]) +
                                 peak[2][w].width * peak[2][w].width / (geom->edge[2] * geom->edge[2]) ) * geom->h / 2.;
          hit[npsble].dj = sqrt( peak[2][w].width * peak[2][w].width / (geom->edge[2] * geom->edge[2]) +
                                 peak[1][v].width * peak[1][v].width / (geom->edge[1] * geom->edge[1]) ) * geom->edge[1] / 2.;
          /*hit[npsble].width = sqrt( hit[npsble].di*hit[npsble].di + hit[npsble].dj*hit[npsble].dj );*/
          hit[npsble].energy = peak[0][u].energy + peak[1][v].energy + peak[2][w].energy;
          hit[npsble].peak1[0] = u;  hit[npsble].peak1[1] = v;  hit[npsble].peak1[2] = w;
          hit[npsble].peakn[0] = 1; hit[npsble].peakn[1] = 1; hit[npsble].peakn[2] = 1; /* temporary one peak per layer only */
          peak[0][u].tmp = peak[0][u].tmp + hit[npsble].energy;
          peak[1][v].tmp = peak[1][v].tmp + hit[npsble].energy;
          peak[2][w].tmp = peak[2][w].tmp + hit[npsble].energy;
        }
      } } }
  qsort((void *)hit, npsble, sizeof(ECHit), (int (*) (const void *, const void *))hit_compare);
  nhit = 0; while(hit[nhit].energy > th && nhit < NHIT && nhit < npsble) nhit++;