def TISC_sim(SNR,
             threshold,
             b_input_delay,
             c_input_delay,
             num_bits=3,
             noise_sigma=32.0,
             sample_freq=2600000000.0,
             TISC_sample_length=16,
             num_samples=80,
             upsample=10,
             seed=5522684,
             draw_flag=0,
             digitization_factor=32.0,
             output_dir="output/",
             boresight=0,
             baseline=0,
             debug=False):

    # Setup
    save_output_flag = 0
    #if(save_output_flag):
    #outfile = str(output_dir+"/test.root")
    trigger_flag = 0
    #num_bits = 3 # Number of bits available to the digitizer
    #num_samples = num_samples*upsample
    filter_flag = False
    #sample_frequency = 2800000000.0
    def_max_sum = 0.0
    def_as_max_sum = 0.0
    ghi_max_sum = 0.0
    ghi_as_max_sum = 0.0
    timestep = 1.0 / sample_freq

    # Phi sectors have alternating baselines
    if (boresight == 0):
        abc_impulse_amp = 1.000
        def_impulse_amp = 0.835
    elif (boresight == 1):
        abc_impulse_amp = 0.962
        def_impulse_amp = 0.885

    # Fill numpy arrays with zeros
    a_input_noise = np.zeros(num_samples)
    b_input_noise = np.zeros(num_samples)
    c_input_noise = np.zeros(num_samples)
    d_input_noise = np.zeros(num_samples)
    e_input_noise = np.zeros(num_samples)
    f_input_noise = np.zeros(num_samples)

    time = np.zeros(num_samples)
    upsampled_time = np.zeros(num_samples)
    a_input_signal = np.zeros(num_samples)
    b_input_signal = np.zeros(num_samples)
    c_input_signal = np.zeros(num_samples)
    d_input_signal = np.zeros(num_samples)
    e_input_signal = np.zeros(num_samples)
    f_input_signal = np.zeros(num_samples)

    a_input_signal_noise = np.zeros(num_samples)
    b_input_signal_noise = np.zeros(num_samples)
    c_input_signal_noise = np.zeros(num_samples)
    d_input_signal_noise = np.zeros(num_samples)
    e_input_signal_noise = np.zeros(num_samples)
    f_input_signal_noise = np.zeros(num_samples)

    a_dig_waveform = np.zeros(num_samples)
    b_dig_waveform = np.zeros(num_samples)
    c_dig_waveform = np.zeros(num_samples)
    d_dig_waveform = np.zeros(num_samples)
    e_dig_waveform = np.zeros(num_samples)
    f_dig_waveform = np.zeros(num_samples)

    empty_list = np.zeros(num_samples)

    ###################################
    # Generate Thermal Noise
    a_input_noise = generate_noise(num_samples,
                                   noise_sigma,
                                   filter_flag,
                                   seed=seed + 0)
    b_input_noise = generate_noise(num_samples,
                                   noise_sigma,
                                   filter_flag,
                                   seed=seed + 1)
    c_input_noise = generate_noise(num_samples,
                                   noise_sigma,
                                   filter_flag,
                                   seed=seed + 2)

    d_input_noise = generate_noise(num_samples,
                                   noise_sigma,
                                   filter_flag,
                                   seed=seed + 3)
    e_input_noise = generate_noise(num_samples,
                                   noise_sigma,
                                   filter_flag,
                                   seed=seed + 4)
    f_input_noise = generate_noise(num_samples,
                                   noise_sigma,
                                   filter_flag,
                                   seed=seed + 5)
    ###################################

    #####################################
    # Determine RMS of noise and signal amplitude

    #noise_rms = np.sqrt(np.mean((a_input_noise-noise_mean)**2,))

    signal_amp = SNR * 2 * noise_sigma

    #####################################

    a_input_noise = butter_bandpass_filter(a_input_noise)
    b_input_noise = butter_bandpass_filter(b_input_noise)
    c_input_noise = butter_bandpass_filter(c_input_noise)

    d_input_noise = butter_bandpass_filter(d_input_noise)
    e_input_noise = butter_bandpass_filter(e_input_noise)
    f_input_noise = butter_bandpass_filter(f_input_noise)

    #####################################
    # Generate impulse
    if (SNR != 0):
        # Generate Signal and Amplify
        a_input_signal = impulse_gen(num_samples,
                                     upsample,
                                     draw_flag=draw_flag,
                                     output_dir=output_dir)
        difference = np.amax(a_input_signal) - np.amin(
            a_input_signal)  # Get peak to peak voltage
        a_input_signal *= (1 / difference)  # Normalize input
        a_input_signal *= signal_amp  # Amplify
        #b_input_signal = np.concatenate([a_input_signal[:num_samples+b_input_delay],empty_list[:(-1)*b_input_delay]])
        #c_input_signal = np.concatenate([a_input_signal[:num_samples+c_input_delay],empty_list[:(-1)*c_input_delay]])
        b_input_signal = np.concatenate([
            a_input_signal[-b_input_delay:], empty_list[:(-1) * b_input_delay]
        ])
        c_input_signal = np.concatenate([
            a_input_signal[-c_input_delay:], empty_list[:(-1) * c_input_delay]
        ])

        a_input_signal = a_input_signal * abc_impulse_amp
        b_input_signal = b_input_signal * abc_impulse_amp
        c_input_signal = c_input_signal * abc_impulse_amp

        d_input_signal = a_input_signal * def_impulse_amp
        e_input_signal = b_input_signal * def_impulse_amp
        f_input_signal = c_input_signal * def_impulse_amp
        """
      time = np.linspace(0.0,timestep*num_samples,num_samples)
      plt.plot(time,a_input_signal,time,b_input_signal,time,c_input_signal)
      plt.plot(time,d_input_signal,time,e_input_signal,time,f_input_signal)
      plt.plot(time,g_input_signal,time,h_input_signal,time,i_input_signal)
      plt.title("impulse")
      plt.show()  
      """
        # Add the signal to the noise
        a_input_signal_noise = np.add(a_input_noise, a_input_signal)
        b_input_signal_noise = np.add(b_input_noise, b_input_signal)
        c_input_signal_noise = np.add(c_input_noise, c_input_signal)

        d_input_signal_noise = np.add(d_input_noise, d_input_signal)
        e_input_signal_noise = np.add(e_input_noise, e_input_signal)
        f_input_signal_noise = np.add(f_input_noise, f_input_signal)
        """
      time = np.linspace(0.0,timestep*num_samples,num_samples)
      plt.plot(time,a_input_signal_noise,time,b_input_signal_noise,time,c_input_signal_noise)
      plt.plot(time,d_input_signal_noise,time,e_input_signal_noise,time,f_input_signal_noise)
      #plt.plot(time,g_input_signal_noise,time,h_input_signal_noise,time,i_input_signal_noise)
      plt.title("impulse+noise")
      plt.show()
      """
    else:
        a_input_signal_noise = a_input_noise
        b_input_signal_noise = b_input_noise
        c_input_signal_noise = c_input_noise

        d_input_signal_noise = d_input_noise
        e_input_signal_noise = e_input_noise
        f_input_signal_noise = f_input_noise


##########################################
#time = np.linspace(0.0,timestep*num_samples,num_samples)
#plt.plot(time,a_input_noise,time,b_input_noise,time,c_input_noise)
#plt.title("noise")
#plt.show()
##########################################
# Digitized the incoming signal and noise (RITC)
    a_dig_waveform = digitize(a_input_signal_noise, num_samples, num_bits,
                              digitization_factor)
    b_dig_waveform = digitize(b_input_signal_noise, num_samples, num_bits,
                              digitization_factor)
    c_dig_waveform = digitize(c_input_signal_noise, num_samples, num_bits,
                              digitization_factor)

    d_dig_waveform = digitize(d_input_signal_noise, num_samples, num_bits,
                              digitization_factor)
    e_dig_waveform = digitize(e_input_signal_noise, num_samples, num_bits,
                              digitization_factor)
    f_dig_waveform = digitize(f_input_signal_noise, num_samples, num_bits,
                              digitization_factor)

    ##########################################
    """
   time = np.linspace(0.0,timestep*num_samples,num_samples)
   plt.plot(time,a_dig_waveform,time,b_dig_waveform,time,c_dig_waveform)
   plt.plot(time,d_dig_waveform,time,e_dig_waveform,time,f_dig_waveform)
   #plt.plot(time,g_dig_waveform,time,h_dig_waveform,time,i_dig_waveform)
   plt.title("Digitized")
   plt.show()
   """

    ##########################################
    # Run the signal through the GLITC module to get trigger

    trigger_flag, max_total_sum, best_angle, total_sum = sum_correlate(
        num_samples,
        a_dig_waveform,
        b_dig_waveform,
        c_dig_waveform,
        d_dig_waveform,
        e_dig_waveform,
        f_dig_waveform,
        baseline,
        threshold,
        TISC_sample_length,
        debug=debug)
    #print abc_max_sum
    #print def_max_sum
    #print ghi_max_sum

    #########################################

    #dummy = raw_input('Press any key to close')

    return max_total_sum, best_angle
def TISC_sim(SNR,threshold,
             b_input_delay,c_input_delay,num_bits=3,
             noise_sigma=32.0,
             sample_freq=2600000000.0,TISC_sample_length=16,
             num_samples=80,upsample=10,
             seed=5522684,draw_flag=0,digitization_factor=32.0,
             output_dir="output/",boresight=0,baseline=0,debug=False):
   
   # Setup
   save_output_flag = 0
   #if(save_output_flag):
      #outfile = str(output_dir+"/test.root")
   trigger_flag = 0
   #num_bits = 3 # Number of bits available to the digitizer
   #num_samples = num_samples*upsample
   filter_flag = False
   #sample_frequency = 2800000000.0
   def_max_sum = 0.0
   def_as_max_sum = 0.0
   ghi_max_sum = 0.0
   ghi_as_max_sum = 0.0
   timestep = 1.0/sample_freq
   
   
   
   # Phi sectors have alternating baselines
   if(boresight==0):
      abc_impulse_amp = 1.000
      def_impulse_amp = 0.835
   elif(boresight==1):
      abc_impulse_amp = 0.962
      def_impulse_amp = 0.885
   
   # Fill numpy arrays with zeros
   a_input_noise = np.zeros(num_samples)
   b_input_noise = np.zeros(num_samples)
   c_input_noise = np.zeros(num_samples)
   d_input_noise = np.zeros(num_samples)
   e_input_noise = np.zeros(num_samples)
   f_input_noise = np.zeros(num_samples)

   time = np.zeros(num_samples)
   upsampled_time = np.zeros(num_samples)
   a_input_signal = np.zeros(num_samples)
   b_input_signal = np.zeros(num_samples)
   c_input_signal = np.zeros(num_samples)
   d_input_signal = np.zeros(num_samples)
   e_input_signal = np.zeros(num_samples)
   f_input_signal = np.zeros(num_samples)

   a_input_signal_noise = np.zeros(num_samples)
   b_input_signal_noise = np.zeros(num_samples)
   c_input_signal_noise = np.zeros(num_samples)
   d_input_signal_noise = np.zeros(num_samples)
   e_input_signal_noise = np.zeros(num_samples)
   f_input_signal_noise = np.zeros(num_samples)

   a_dig_waveform = np.zeros(num_samples)
   b_dig_waveform = np.zeros(num_samples)
   c_dig_waveform = np.zeros(num_samples)
   d_dig_waveform = np.zeros(num_samples)
   e_dig_waveform = np.zeros(num_samples)
   f_dig_waveform = np.zeros(num_samples)
   
   empty_list = np.zeros(num_samples)


###################################
   # Generate Thermal Noise
   a_input_noise = generate_noise(num_samples,noise_sigma,filter_flag,seed=seed+0)
   b_input_noise = generate_noise(num_samples,noise_sigma,filter_flag,seed=seed+1)
   c_input_noise = generate_noise(num_samples,noise_sigma,filter_flag,seed=seed+2)
   
   d_input_noise = generate_noise(num_samples,noise_sigma,filter_flag,seed=seed+3)
   e_input_noise = generate_noise(num_samples,noise_sigma,filter_flag,seed=seed+4)
   f_input_noise = generate_noise(num_samples,noise_sigma,filter_flag,seed=seed+5)
###################################


#####################################
   # Determine RMS of noise and signal amplitude

   #noise_rms = np.sqrt(np.mean((a_input_noise-noise_mean)**2,))
   
   signal_amp = SNR*2*noise_sigma

#####################################
      
   a_input_noise = butter_bandpass_filter(a_input_noise)
   b_input_noise = butter_bandpass_filter(b_input_noise)
   c_input_noise = butter_bandpass_filter(c_input_noise)
   
   d_input_noise = butter_bandpass_filter(d_input_noise)
   e_input_noise = butter_bandpass_filter(e_input_noise)
   f_input_noise = butter_bandpass_filter(f_input_noise)

 
#####################################
   # Generate impulse
   if (SNR != 0):
      # Generate Signal and Amplify
      a_input_signal = impulse_gen(num_samples,upsample,draw_flag=draw_flag,output_dir=output_dir)
      difference=np.amax(a_input_signal)-np.amin(a_input_signal) # Get peak to peak voltage
      a_input_signal *= (1/difference) # Normalize input
      a_input_signal *= signal_amp # Amplify
      #b_input_signal = np.concatenate([a_input_signal[:num_samples+b_input_delay],empty_list[:(-1)*b_input_delay]])
      #c_input_signal = np.concatenate([a_input_signal[:num_samples+c_input_delay],empty_list[:(-1)*c_input_delay]])
      b_input_signal = np.concatenate([a_input_signal[-b_input_delay:],empty_list[:(-1)*b_input_delay]])
      c_input_signal = np.concatenate([a_input_signal[-c_input_delay:],empty_list[:(-1)*c_input_delay]])
      
      
      
      a_input_signal =a_input_signal*abc_impulse_amp
      b_input_signal =b_input_signal*abc_impulse_amp
      c_input_signal =c_input_signal*abc_impulse_amp
      
      d_input_signal =a_input_signal*def_impulse_amp
      e_input_signal =b_input_signal*def_impulse_amp
      f_input_signal =c_input_signal*def_impulse_amp
      
      """
      time = np.linspace(0.0,timestep*num_samples,num_samples)
      plt.plot(time,a_input_signal,time,b_input_signal,time,c_input_signal)
      plt.plot(time,d_input_signal,time,e_input_signal,time,f_input_signal)
      plt.plot(time,g_input_signal,time,h_input_signal,time,i_input_signal)
      plt.title("impulse")
      plt.show()  
      """
      # Add the signal to the noise
      a_input_signal_noise = np.add(a_input_noise, a_input_signal)
      b_input_signal_noise = np.add(b_input_noise, b_input_signal)
      c_input_signal_noise = np.add(c_input_noise, c_input_signal)
      
      d_input_signal_noise = np.add(d_input_noise, d_input_signal)
      e_input_signal_noise = np.add(e_input_noise, e_input_signal)
      f_input_signal_noise = np.add(f_input_noise, f_input_signal)

      """
      time = np.linspace(0.0,timestep*num_samples,num_samples)
      plt.plot(time,a_input_signal_noise,time,b_input_signal_noise,time,c_input_signal_noise)
      plt.plot(time,d_input_signal_noise,time,e_input_signal_noise,time,f_input_signal_noise)
      #plt.plot(time,g_input_signal_noise,time,h_input_signal_noise,time,i_input_signal_noise)
      plt.title("impulse+noise")
      plt.show()
      """
   else:
      a_input_signal_noise = a_input_noise
      b_input_signal_noise = b_input_noise
      c_input_signal_noise = c_input_noise
      
      d_input_signal_noise = d_input_noise
      e_input_signal_noise = e_input_noise
      f_input_signal_noise = f_input_noise

##########################################
   #time = np.linspace(0.0,timestep*num_samples,num_samples)
   #plt.plot(time,a_input_noise,time,b_input_noise,time,c_input_noise)
   #plt.title("noise")
   #plt.show()
##########################################
   # Digitized the incoming signal and noise (RITC)
   a_dig_waveform = digitize(a_input_signal_noise,num_samples,num_bits,digitization_factor)
   b_dig_waveform = digitize(b_input_signal_noise,num_samples,num_bits,digitization_factor)
   c_dig_waveform = digitize(c_input_signal_noise,num_samples,num_bits,digitization_factor)
   
   d_dig_waveform = digitize(d_input_signal_noise,num_samples,num_bits,digitization_factor)
   e_dig_waveform = digitize(e_input_signal_noise,num_samples,num_bits,digitization_factor)
   f_dig_waveform = digitize(f_input_signal_noise,num_samples,num_bits,digitization_factor)


##########################################
   """
   time = np.linspace(0.0,timestep*num_samples,num_samples)
   plt.plot(time,a_dig_waveform,time,b_dig_waveform,time,c_dig_waveform)
   plt.plot(time,d_dig_waveform,time,e_dig_waveform,time,f_dig_waveform)
   #plt.plot(time,g_dig_waveform,time,h_dig_waveform,time,i_dig_waveform)
   plt.title("Digitized")
   plt.show()
   """
   
##########################################
   # Run the signal through the GLITC module to get trigger

   trigger_flag, max_total_sum,best_angle,total_sum = sum_correlate(num_samples,a_dig_waveform,b_dig_waveform,c_dig_waveform,d_dig_waveform,e_dig_waveform,f_dig_waveform,baseline,threshold,TISC_sample_length,debug=debug)
   #print abc_max_sum
   #print def_max_sum
   #print ghi_max_sum
                                             

 

      
   

#########################################

   #dummy = raw_input('Press any key to close')


   return max_total_sum,best_angle
 for timestep in range(0,num_runs):
    event_passed_flag = 0 # Reset value
    max_sum = 0
    
    start = timestep*num_samples_per_window
    end = start+num_samples_per_window
    # Don't run off the end
    if(end>=num_samples):
       break
    
    if ((timestep % int((simulation_rate/event_rate)) == 0 or SNR[SNR_counter]==0)):
       #print "thermal event"
       #print len(a_therm[start:end])
       #print len(b_therm[start:end])
       #print len(c_therm[start:end])
       trigger_flag, max_total_sum,best_delays,total_sum = sum_correlate(num_samples_per_window,a_therm[start:end],b_therm[start:end],c_therm[start:end],d_therm[start:end],e_therm[start:end],f_therm[start:end],abc_baseline,threshold,TISC_sample_length=16)
       #d1,def_max_sum,as_def_max_sum,def_correlation_mean,d4,d5,as_def_angle,def_angle = sum_correlate(num_samples_per_window,d_therm[start:end],e_therm[start:end],f_therm[start:end],threshold,def_baseline,TISC_sample_length=16,delay_type_flag=1,average_subtract_flag=1,correlation_mean=def_correlation_mean)
       #d1,ghi_max_sum,as_ghi_max_sum,ghi_correlation_mean,d4,d5,as_ghi_angle,ghi_angle = sum_correlate(num_samples_per_window,g_therm[start:end],h_therm[start:end],i_therm[start:end],threshold,ghi_baseline,TISC_sample_length=16,delay_type_flag=1,average_subtract_flag=1,correlation_mean=ghi_correlation_mean)
       #print as_abc_max_sum
       #print as_def_max_sum
       #print as_ghi_max_sum
       #print len(a[start:end])
       #plt.figure(8)
       #plt.plot(time[start:end],a_therm[start:end],time[start:end],d_therm[start:end],time[start:end],g_therm[start:end])
       #plt.title("Noise")
       #plt.show()
       #abc_hist.append(abc_max_sum)
       #def_hist.append(def_max_sum)
       #ghi_hist.append(ghi_max_sum)
       #SNR_hist.append(abc_max_sum+def_max_sum+ghi_max_sum)
       
            # Don't run off the end
            if (end >= num_samples):
                break

            if ((timestep % int((simulation_rate / event_rate)) == 0
                 or SNR[SNR_counter] == 0)):
                #print "thermal event"
                #print len(a_therm[start:end])
                #print len(b_therm[start:end])
                #print len(c_therm[start:end])
                trigger_flag, max_total_sum, best_delays, total_sum = sum_correlate(
                    num_samples_per_window,
                    a_therm[start:end],
                    b_therm[start:end],
                    c_therm[start:end],
                    d_therm[start:end],
                    e_therm[start:end],
                    f_therm[start:end],
                    abc_baseline,
                    threshold,
                    TISC_sample_length=16)
                #d1,def_max_sum,as_def_max_sum,def_correlation_mean,d4,d5,as_def_angle,def_angle = sum_correlate(num_samples_per_window,d_therm[start:end],e_therm[start:end],f_therm[start:end],threshold,def_baseline,TISC_sample_length=16,delay_type_flag=1,average_subtract_flag=1,correlation_mean=def_correlation_mean)
                #d1,ghi_max_sum,as_ghi_max_sum,ghi_correlation_mean,d4,d5,as_ghi_angle,ghi_angle = sum_correlate(num_samples_per_window,g_therm[start:end],h_therm[start:end],i_therm[start:end],threshold,ghi_baseline,TISC_sample_length=16,delay_type_flag=1,average_subtract_flag=1,correlation_mean=ghi_correlation_mean)
                #print as_abc_max_sum
                #print as_def_max_sum
                #print as_ghi_max_sum
                #print len(a[start:end])
                #plt.figure(8)
                #plt.plot(time[start:end],a_therm[start:end],time[start:end],d_therm[start:end],time[start:end],g_therm[start:end])
                #plt.title("Noise")
                #plt.show()