import sys import os sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) from LightSimtastic import SiPMSimulation import matplotlib.pyplot as plt import numpy as np ################################# # THE SIMULATION TOOL TAKES A DICTIONARY AS AN INPUT, WITH EACH OF THE VARIABLES AS KEYS. # FOR EACH ELEMENT YOU ADD TO THE LISTS, ANOTHER SIMULATION WILL BE PERFORMED. # THIS ALLOWS SCANS THROUGH PARAMETERS. ################################# variables={ "Name_Sim":[0], #THIS CAN BE ANYTHING YOU LIKE "mu":[7], # MEAN NUMBER OF GEIGER DISCHARGES "ppXT":[0.0], # PROBABILITY OF PROMPT CROSS-TALK "pdXT":[0.2], #PROBABILITY OF DELAYED CROSS-TALK "taudXT":[25], #TIME CONSTANT FOR DELAYED CROSS-TALK (NS) "rdXT":[0.5], #FRACTION OF DELAYED CROSS-TALK FROM ADJACENT CELLS "pAp":[0.15], #PROBABILITY OF AFTERPULSE "tauAp":[7.5], #TIME CONSTANT OF AFTERPULSE "taur":[20], # SIPM RECOVERY TIME CONSTANT "Sig0":[0.075], #WIDTH OF PEDESTAL [NORMALISED ADC] "Sig1":[0.02], # INCREASE IN PEAK WIDTH PER ADDITIONAL DISCHARGE [NORMALISED ADC] "DCR":[0.0], # DARK COUNT RATE [GHZ] "Sigt":[0.02], # ELECTRONICS NOISE FOR CURRENT TRANSIENT (FOR TRANSIENT) "GSig":[0.75], # WIDTH OF ELECTRONICS NOISE TRANSFER FUNCTION (FOR TRANSIENT) "tslow":[20], # TIME CONSTANT FOR SLOW PART OF PULSE "tfast":[1.5], # TIME CONSTANT FOR FAST PART OF PULSE "rfast":[0.2], # PROPORTION OF SLOW/FAST "start_tgate":[-5], # GATE START TIME [NS] "len_tgate":[150], # LENGTH OF GATE "t0":[100,], # STARTING POINT OF GATE "tl0":[0], #GAUSSIAN MEAN OF PRIMARY GEIGER DICHARGE TIME DISTRIBUTION "tl1":[0.1], #GAUSSIAN WIDTH OF PRIMARY GEIGER DICHARGE TIME DISTRIBUTION "tl2":[0], #FREE PARAMETER "Gen_mu":["Poisson"], # NUMBER PRIMARY GEIGER DISCHARGE PDF "Gen_tmu":["Gauss"], # TIME OF PRIMARY GEIGER DISCHARGE PDF "Gen_gain":["Gauss"], # GAIN PDF (FOR TRANSIENT) "Gen_npXT":["Binomial"], #NUMBER PROMPT X-TALK DISCHARGE DISTRIBUTION "Gen_ndXT":["Binomial"], #NUMBER PROMPT X-TALK DISCHARGE DISTRIBUTION "Gen_tdXT":["Exp"], #TIME DELAYED X-TALK DISTRIBUTION "Gen_nAP":["Binom"], #NUMBER AFTER DISTRIBUTION "Gen_tAP":["Exp"], #AFTERPULSE TIME DISTRIBUTION "Gen_noise":["Gauss"] #ELECTRONIC NOISE DISTRIBUTION (FOR TRANSIENT) } ################################# # CREATE A SIPM SIMULATION CLASS OBJECT ################################# s = SiPMSimulation() ################################# # ADD VARIABLES ################################# s.AddVariables(variables) n_events = int(1e2) iterplot=10 ################################# # SIMULATE ################################# #s.Simulate(n_events, transients=False) s.Simulate(n_events, transients=True, n_transients=n_events) ################################# # EXTRACT SIMULATION DATAFRAME ################################# df = s.pars ################################# # TRANSIENT ################################# I = df.iloc[0]["Transients"]['I'] t = df.iloc[0]["Transients"]['t'] if iterplot>0: # Iterative plot wave_sum = np.sum(I, axis=0) wave_avg = wave_sum / len(I) x_min = t.min(); x_max = t.max() y_min = -0.2; y_max = np.max(I)+1 fig, ax = plt.subplots(figsize=(15.5,10.5)) plt.rc('font', size=20) plt.ion() plt.show() for index in range(iterplot): ax.clear() ax.plot(t, I[index], color='blue', label='Transient '+str(index)) ax.plot(t, wave_avg, color='red', label='Average transient') ax.grid(True, which='both', linestyle=':', linewidth=0.5, color='lightgrey') ax.set_xlim([x_min, x_max]) ax.set_ylim([y_min, y_max]) ax.set_xlabel('Time [ns]',loc='right') ax.set_ylabel('Intensity [a.u.]',loc='top') ax.set_title('Transients') ax.legend() plt.draw() plt.pause(0.01) input(" ") plt.ioff() plt.close() ################################# # EXTRACT CHARGE SPECTRUM ################################# Qs = df.iloc[0]["ChargeSpectrum"] ################################# # PLOT ################################# plt.figure(figsize=(15.5,10.5)) H, edges = np.histogram(Qs, bins=1000) edges = edges[:-1]+(edges[1]-edges[0]) plt.plot(edges, H) plt.title("Simulated Charge Spectrum") plt.yscale("log") plt.xticks(fontsize=25) plt.yticks(fontsize=25) plt.xlabel("# GD", fontsize=25), plt.savefig("./output/ExampleTransients.png")