diff --git a/AdditionalPDFs.py b/AdditionalPDFs.py index ba373ef5f12ab231928fc7016ec4dff5b553fc52..2934d4c22f3f5e9b9d77c92d44216b9c2be0f08b 100644 --- a/AdditionalPDFs.py +++ b/AdditionalPDFs.py @@ -5,7 +5,7 @@ import matplotlib.pyplot as plt from scipy.stats._distn_infrastructure import ( - rv_discrete, get_distribution_names) + rv_discrete, _ncx2_pdf, _ncx2_cdf, get_distribution_names) class gpd_gen(rv_discrete): diff --git a/Example.png b/Example.png index f38ff251b7ccdf5cc52ea4ee48c05303f3f70091..f6e165d7f9a83aeb4e4875c1243cb9c9d6fc1f98 100644 Binary files a/Example.png and b/Example.png differ diff --git a/Example.py b/Example.py index 8e6ce5c72b5e38f72347701193fb85a55c583f87..69f0d7ca4f5ded82f809c259eeaa8b3b6952c384 100644 --- a/Example.py +++ b/Example.py @@ -9,38 +9,38 @@ import numpy as np ################################# 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":[100], #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) +"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":[100], # 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) } ################################# @@ -55,7 +55,7 @@ s = SiPMSimulation() s.AddVariables(variables) -n_events = int(1e2) +n_events = int(1e5) ################################# diff --git a/LightSimtastic.py b/LightSimtastic.py index 1808e678c5c52d7dc8fa6ee5743caf04f179e9f2..c09d042a8136e452a3d0e5cf0e3dabc6f6bef2cd 100644 --- a/LightSimtastic.py +++ b/LightSimtastic.py @@ -250,7 +250,7 @@ class SiPMSimulation: line = _RemoveNonAscii(line) elems = line.replace('"', "").split(",") elems = _ToFloats(elems) - t0 = 0 #ns + if elems[0] in self.VariableDictionary: variables[elems[0]] = elems[1::] @@ -304,7 +304,18 @@ class SiPMSimulation: partialSum = 0 for _i in dXT_n: temp = [] - for _ii in _i:t0 = 0 #ns + for _ii in _i: + temp.append(dXT_nt[partialSum:partialSum+_ii]) + partialSum += _ii + output.append(temp) + return output + + + + def AllGeiger(self, ns): + + pbar = tqdm(range(len(self.pb_ag_text)-1)) + pbar.set_description("{0}".format(self.pb_ag_text[0])) nlight = np.asarray(ns.dist_flight.rvs(size=ns.n_sim)) nDC = np.asarray(ns.dist_fDC.rvs(size=ns.n_sim)) @@ -316,7 +327,16 @@ class SiPMSimulation: nPG = nDC + nlight - pbar.update(1)t0 = 0 #ns + pbar.update(1) + pbar.set_description("{0}".format(self.pb_ag_text[1])) + + nlight_sum = np.sum(nlight) + nDC_sum = np.sum(nDC) + nPG_sum = nlight_sum + nDC_sum + + npXT = np.array(ns.dist_fpXT.rvs(size=nPG_sum)) + ndXT = np.array(ns.dist_fdXT.rvs(size=nPG_sum)) + npXT_sum = np.sum(npXT) nPG_pXT_sum = nPG_sum + npXT_sum @@ -336,7 +356,13 @@ class SiPMSimulation: pg_l_d = np.split(pg_l_d, nlight_cumsum)[:-1] pg_l_t = np.split(pg_l_t, nlight_cumsum)[:-1] pg_dc_d = np.split(pg_dc_d, nDC_cumsum)[:-1] - pg_dc_t = np.split(pg_dc_t, nDC_cumsum)[:-1]t0 = 0 #ns + pg_dc_t = np.split(pg_dc_t, nDC_cumsum)[:-1] + + pXT_n = np.split(npXT, nPG_cumsum)[:-1] + dXT_n = np.split(ndXT, nPG_cumsum)[:-1] + + pg_d = [np.concatenate(elem) for elem in zip(pg_l_d, pg_dc_d)] + pg_t = [np.concatenate(elem) for elem in zip(pg_l_t, pg_dc_t)] pbar.update(1) @@ -466,7 +492,23 @@ class SiPMSimulation: - pbar.update(1)t0 = 0 #ns + pbar.update(1) + pbar.set_description("{0}".format(self.pb_ag_text[5])) + + ag_d = [ + np.concatenate( (list_pg_d, list_pXT_d, list_dXT_d, list_Ap_d)) + for list_pg_d, list_pXT_d, list_dXT_d, list_Ap_d, in zip(pg_d, pXT_d, dXT_d, Ap_d) + ] + + ag_t = [ + np.concatenate( (list_pg_t, list_pXT_t, list_dXT_t, list_Ap_t)) + for list_pg_t, list_pXT_t, list_dXT_t, list_Ap_t, in zip(pg_t, pXT_t, dXT_t, Ap_t) + ] + + ns.ag_d = ag_d + ns.ag_t = ag_t + + pbar.update(1) pbar.set_description("{0}".format(self.pb_ag_text[6])) @@ -687,7 +729,8 @@ class SiPMSimulation: end_time = time.time() - self.pars.at[index, "GeigerArray"] = np.vstack([ns.ag_d, ns.ag_t]) # self.pars.at[index, "TimeElapsed_GeigerArray"] = end_time-start_time + self.pars.at[index, "GeigerArray"] = np.vstack([ns.ag_d, ns.ag_t]) +# self.pars.at[index, "TimeElapsed_GeigerArray"] = end_time-start_time self.pars.at[index, "ChargeSpectrum"] = Qs diff --git a/__pycache__/AdditionalPDFs.cpython-310.pyc b/__pycache__/AdditionalPDFs.cpython-310.pyc deleted file mode 100644 index ee86b019f37fd574ba07d2f101f3083319470d3e..0000000000000000000000000000000000000000 Binary files a/__pycache__/AdditionalPDFs.cpython-310.pyc and /dev/null differ diff --git a/__pycache__/LightSimtastic.cpython-310.pyc b/__pycache__/LightSimtastic.cpython-310.pyc deleted file mode 100644 index bcf12a3a0a70470199e386ba5fce1d374b77d0c7..0000000000000000000000000000000000000000 Binary files a/__pycache__/LightSimtastic.cpython-310.pyc and /dev/null differ