*file member=anxx_search_lowocc_cut library=snoman language=fortran77 *file date=08:Nov:2004 <<< subroutine anxx_search_lowocc_cut * ANX: ANXX Banks Processor: Search for low occ cuts for each period * Contact: M. Huang, Texas * Parameters:- * ========== * Revision History:- * ================ * 5.01 M. Huang First version. implicit none include 'zunit.inc' include 'anxx_count_com.inc' * Arguments Declarations:- * ====================== * Local Variable Declarations:- * ============================ integer num_valley, num_bin_for_peak1, num_bin_one_peak integer ipmt, ihd, ibin, ibin_zero, iperiod, tot_num, + bin_peak1, bin1, bin2, min_bin, num_period, + bin_min_count_0 parameter (num_valley = 20, num_bin_for_peak1 = 7, + num_bin_one_peak = num_bin_for_peak1-2) parameter (bin1 = 1, bin2 = 60) real low_occ_stat, bin_size_low_occ, + min_rate_valley, count_peak1, min_count, min_count_0 integer num_allow_diff, tot_num_diff real count_allow_diff, count_diff parameter (num_allow_diff = 20, count_allow_diff = 10.0) logical warn_short * --- general initialization -------------------------------------------- warn_short = .false. bin_size_low_occ = (frac2 - frac1)/float(num_bin_low_occ) ibin_zero = int((0.0 - frac1)/bin_size_low_occ) + 1 * --- compute num_period; if too short, don't deal with low occ ------- num_period = int(elapse_time/time_interval) if (num_period .le. 0) then if (.not.warn_short) then write(iqprnt,90004) write(iqlog, 90004) warn_short = .true. endif else if (num_period .gt. nperiod) num_period = nperiod do iperiod = 1, nperiod+1 low_occ_rate_cut(iperiod) = -9999.0 do ibin = 1, max_num_bin low_occ_rate_count(ibin,iperiod) = 0.0 end do end do * --- count low occ hits and fill into different period -------------- bin_size_low_occ = (frac2 - frac1)/float(num_bin_low_occ) do ipmt = 0, npmt if (occ_count(ipmt) .gt. 0.0) then low_occ_stat = occ_count(ipmt)/float(num_period) ibin = (low_occ_stat-frac1)/bin_size_low_occ + 1 if (ibin.gt.num_bin_low_occ) ibin = num_bin_low_occ low_occ_rate_count(ibin,num_period+1) = + low_occ_rate_count(ibin,num_period+1) + 1.0 ihd = 3000 + nperiod + 1 call hf1 (ihd,low_occ_stat,1.0) do iperiod = 1, num_period low_occ_stat = low_occ_count(ipmt,iperiod) ibin = (low_occ_stat-frac1)/bin_size_low_occ + 1 if (ibin.gt.num_bin_low_occ) ibin = num_bin_low_occ low_occ_rate_count(ibin,iperiod) = + low_occ_rate_count(ibin,iperiod) + 1.0 ihd = 3000 + iperiod call hf1 (ihd,low_occ_stat,1.0) end do endif end do ! end of 1st ipmt loop * --- look for criterion cuts for each period ------------------------- do iperiod = 1, num_period+1 * * ... look for where is the min_count & min_bin .......... * min_count = 1.0e30 do ibin = bin1, bin2 if ( low_occ_rate_count(ibin,iperiod) .le. + min_count) then min_count = low_occ_rate_count(ibin,iperiod) min_bin = ibin endif end do * * ... check if there is any bins after min_bin ....... * tot_num_diff = 0 do ibin = min_bin+1, num_bin_low_occ count_diff = abs(min_count - + low_occ_rate_count(ibin,iperiod) ) if (count_diff .ge. count_allow_diff) + tot_num_diff = tot_num_diff + 1 end do * * ... for cases that have valley not near zero ....... * if (tot_num_diff .ge. num_allow_diff) then min_rate_valley = frac1 + + ( float(min_bin) - 0.5)*bin_size_low_occ else tot_num = 0 bin_peak1 = ibin_zero count_peak1 = low_occ_rate_count(ibin_zero,iperiod) min_count_0 = -999.0 bin_min_count_0 = -999 do ibin = ibin_zero+1, ibin_zero+num_bin_for_peak1 if ( low_occ_rate_count(ibin,iperiod) .gt. + count_peak1 ) then bin_peak1 = ibin endif if ( low_occ_rate_count(ibin, iperiod) .ge. + low_occ_rate_count(ibin-1,iperiod) ) + tot_num = tot_num + 1 if ( (low_occ_rate_count(ibin,iperiod).lt. + low_occ_rate_count(ibin-1,iperiod) ) .and. + (low_occ_rate_count(ibin,iperiod).lt. + low_occ_rate_count(ibin+1,iperiod) ) ) then min_count_0 = low_occ_rate_count(ibin,iperiod) bin_min_count_0 = ibin endif end do ! end of ibin loop if ( (tot_num.ge.num_bin_one_peak) .and. + ((bin_peak1-ibin_zero).ge.num_bin_one_peak) .and. + (min_count_0 .lt. 0.0) .and. + (bin_min_count_0 .lt. ibin_zero ) ) then min_rate_valley = -99.0 else if ( (min_count_0 .ge. 0.0) .and. + (bin_min_count_0 .gt. ibin_zero) ) then min_rate_valley = frac1 + + ( float(bin_min_count_0) - 0.5)*bin_size_low_occ endif endif ! end of if (tot_num_diff >= num_allow_diff) * *... calculate the final criterion cut for each period ... * if (iperiod .le. num_period) then low_occ_rate_cut(iperiod) = min_rate_valley/2.0 else low_occ_rate_cut(iperiod) = min_rate_valley endif end do ! end of iperiod loop endif ! end of if (num_period <= 0 ) * --------------------------------------------------------------------- 90004 format('Neutrino run is too short for low occupancy check') return end *endfile member=anxx_search_lowocc_cut