# noise_coincidence.py
# ----------------------------------------------------------------------
# A program for determining how many noise blips are needed to get a
# specified coincidence ratio with a signal of a specified amount.
from random import *
from math import *
# SET VARIABLES
# Signal blip length (S)
sig_dur = 60E-9
# Noise blip duration (S)
noise_dur = 10E-9
# Approx number of signals per second
sig_freq = 1.5
# Coincidence ratio (ratio between signals:coincidences)
coinc_ratio = input("Enter coincidence ratio: ")
# START MAIN ROUTINE
# We calculate the cumulative probabilities, so we can say 'if we are
# getting 50% coincidences, this could be due to a noise level of N
# blips per second' The maths is as follows,
# P1(cumul) = P1
# P2(cumul) = !P1*P2 + P1
# P3(cumul) = !P1*!P2*P3 + !p1*P2 + P1
# P4(cumul) = !P1*!P2*!P3*P4 + !P1*!P2*P3 + !P1*P2 + P1
# etc.
# Where Pn is the probability of the nth blip coinciding, !Pn is the
# probability of the nth blip NOT coinciding.
# We can use an iterative method (if you look Pn is P(n-1) with an extra
# term) and stop when Pn(cumul) is more than the coincidence ratio.
# ALGORITHM
# Initialise with probability of one blip coinciding
n = 1
Pcumul = (noise_dur+sig_dur)*sig_freq
# We see that the new term in each iteration is comprised of all the !Pn
# from the previous iteration with the extra !P(n-1)*Pn factor. We
# therefore store the series up to !P(n-2) in an array to avoid
# recalculating. This is initialised as 1
Pnot_series = 1
# Keep iterating until we break past the ratio. n will then be set to
# the number we want
while Pcumul < coinc_ratio:
# Bump up the amount of noise blips 1 at a time
n = n + 1
# Calculate !P(n-1)
Pprev_not = 1 - ((n-1)*noise_dur+sig_dur)*sig_freq
# Calculate prob of nth particle coinciding
Pn = (n*noise_dur+sig_dur)*sig_freq
# Extend array
Pnot_series = Pnot_series * Pprev_not
# Calculate current cumulative probability
Pcumul = Pnot_series * Pn + Pcumul
# OUTPUT
print "Signal blip size: \t", sig_dur
print "Signal frequency: \t", sig_freq
print "Noise blip size: \t", noise_dur
print "Coincidence ratio:\t", coinc_ratio
print "Number of noise blips/sec:\t", n