diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/dc.c | 45 | 
1 files changed, 30 insertions, 15 deletions
@@ -649,7 +649,8 @@ int is_breakdown(event *ev)  /* Returns 1 if the average time for the hits in the same card as   * `flasher_pmt_id` is at least 10 ns earlier than all the hits within 4 - * meters of the potential flasher. + * meters of the potential flasher or if there are more hit PMTs in the slot + * than within 4 meters.   *   * This cut is designed to help flag flashers in the is_flasher() function for   * events in which the flashing channel may be missing from the event, so there @@ -657,18 +658,23 @@ int is_breakdown(event *ev)  int is_slot_early(event *ev, int flasher_pmt_id)  {      int i; -    double t_slot, t_nearby; +    double t_slot[MAX_PMTS], t_nearby[MAX_PMTS]; +    double t_slot_median, t_nearby_median;      int n_slot, n_nearby;      double flasher_pos[3];      double pmt_dir[3];      double distance; +    size_t crate, card, channel; +    size_t flasher_crate, flasher_card, flasher_channel; + +    flasher_crate = flasher_pmt_id/512; +    flasher_card = (flasher_pmt_id % 512)/32; +    flasher_channel = flasher_pmt_id % 32;      COPY(flasher_pos,pmts[flasher_pmt_id].pos);      n_slot = 0;      n_nearby = 0; -    t_slot = 0.0; -    t_nearby = 0.0;      for (i = 0; i < MAX_PMTS; i++) {          if (!ev->pmt_hits[i].hit || pmts[i].pmt_type != PMT_NORMAL) continue; @@ -721,33 +727,42 @@ int is_slot_early(event *ev, int flasher_pmt_id)          if (i/32 == flasher_pmt_id/32) {              /* This hit is in the same slot as the potential flasher. */ -            t_slot += ev->pmt_hits[i].ept; -            n_slot += 1; +            t_slot[n_slot++] += ev->pmt_hits[i].ept;              continue;          } +	crate = i/512; +	card = (i % 512)/32; +	channel = i % 32; + +        /* Skip PMTs in the same crate that are to the left or right of the +         * flasher PC since those can often be cross-talk hits. */ +        if (crate == flasher_crate && abs(card - flasher_card) == 1 && (channel/4 == flasher_channel/4)) continue; +          /* Calculate the distance from the current channel to the high charge           * channel. */          SUB(pmt_dir,pmts[i].pos,flasher_pos);          distance = NORM(pmt_dir);          if (distance < 400.0) { -            t_nearby += ev->pmt_hits[i].ept; -            n_nearby += 1; +            t_nearby[n_nearby++] += ev->pmt_hits[i].ept;              continue;          }      } -    /* If there are no PMTs within 4 meters of the slot, it's almost certainly -     * a flasher. */ -    if (n_slot > 4 && n_nearby == 0) return 1; +    if (n_slot == 0) return 0; + +    /* If there are more PMTs in the slot than within 4 meters of the slot, +     * return it's likely to be a flasher. */ +    if (n_slot >= n_nearby) return 1; -    if (n_slot == 0 || n_nearby == 0) return 0; +    gsl_sort(t_slot,1,n_slot); +    t_slot_median = gsl_stats_median_from_sorted_data(t_slot,1,n_slot); -    t_slot /= n_slot; -    t_nearby /= n_nearby; +    gsl_sort(t_nearby,1,n_nearby); +    t_nearby_median = gsl_stats_median_from_sorted_data(t_nearby,1,n_nearby); -    return t_slot < t_nearby - 10.0; +    return t_slot_median < t_nearby_median - 10.0;  }  /* Returns 1 if the event is a flasher and 0 if it isn't. The definition of  | 
