diff --git a/LightSimtastic.py b/LightSimtastic.py index 8b0d150cfb5f750ebade527ae9c0f4be6a7657de..a5a733d4e1650d58f5e966fa8e606ae562a88bbe 100644 --- a/LightSimtastic.py +++ b/LightSimtastic.py @@ -8,14 +8,16 @@ import matplotlib.pyplot as plt import scipy import scipy.stats as stats import scipy.signal as signal -from tqdm import tqdm, notebook +from tqdm.auto import tqdm from itertools import repeat, chain, product, zip_longest from operator import add from types import SimpleNamespace +from AdditionalPDFs import borel import json import re import codecs import random +from copy import deepcopy np.set_printoptions(suppress=True) @@ -328,18 +330,15 @@ class SiPMSimulation: 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)) - tAp = np.array(ns.dist_ftAp.rvs(size=nPG_sum)) - nAp = np.array(stats.binom.rvs( - n=np.ones(nPG_sum).astype(int), - p=(ns.pAp*(1 - np.exp(-tAp/ns.taur))), - size=nPG_sum - ) - ) -# nAp = np.random.binomial(n=1, p=(ns.pAp*(1 - np.exp(-tAp/ns.taur))), size=nPG_sum) + npXT_sum = np.sum(npXT) + + nPG_pXT_sum = nPG_sum + npXT_sum + + pg_l_d = np.ones(nlight_sum) pg_l_t = np.asarray(ns.dist_ftlight.rvs(size=nlight_sum)) @@ -358,12 +357,16 @@ class SiPMSimulation: pXT_n = np.split(npXT, nPG_cumsum)[:-1] dXT_n = np.split(ndXT, nPG_cumsum)[:-1] - Ap_n = np.split(nAp, nPG_cumsum)[:-1] - Ap_nt = np.split(tAp, 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)] + + pg_pXT_d = [np.concatenate(elem) for elem in zip(pg_d, pXT_n)] + pg_pXT_t = [np.concatenate(elem) for elem in zip(pg_t, pg_t)] + + + pbar.update(1) pbar.set_description("{0}".format(self.pb_ag_text[2])) @@ -440,38 +443,86 @@ class SiPMSimulation: pbar.update(1) pbar.set_description("{0}".format(self.pb_ag_text[4])) - Ap_d = [ - np.array( - list(chain.from_iterable( - [ - [1-np.exp(-elem_Ap_t/ns.tslow)]*elem_Ap_n - if(elem_Ap_n > 0 and elem_pg_d >0) - else [] - for elem_pg_d, elem_pg_t, elem_Ap_n, elem_Ap_t in zip(list_pg_d, list_pg_t, list_Ap_n, list_Ap_t) - ] - ) - ) + Ap_d = [] + Ap_t = [] + + for list_pg_pXT_d, list_pg_pXT_t in zip(pg_pXT_d, pg_pXT_t): + _Apd_list = [] + _Apt_list = [] + + for d, t in zip(list_pg_pXT_d, list_pg_pXT_t): - ) - for list_pg_d, list_pg_t, list_Ap_n, list_Ap_t, in zip(pg_d, pg_t, Ap_n, Ap_nt) - ] + if(d>0): + + _tAp = ns.dist_ftAp.rvs(size=int(d)) + + _nAp = stats.binom.rvs( + n=np.ones(int(d)).astype(int), + p=(ns.pAp*(1 - np.exp(-_tAp/ns.taur))), + size=int(d) + ) + + cond_sel = (_nAp>0) + + if(sum(cond_sel)>0): + _tAp = _tAp[cond_sel] + _nAp = _nAp[cond_sel] + + + _Apd = (1-np.exp(-_tAp/ns.tslow))*_nAp + _Apdt = t + _tAp + else: + _Apd = [] + _Apdt = [] + + else: + _Apd = [] + _Apdt = [] + + _Apd_list.extend(list(_Apd)) + _Apt_list.extend(list(_Apdt)) + + Ap_d.append(_Apd_list) + Ap_t.append(_Apt_list) + + Ap_d = np.array(Ap_d) + Ap_t = np.array(Ap_t) + - Ap_t = [ - np.array( - list(chain.from_iterable( - [ - [elem_pg_t + elem_Ap_t]*elem_Ap_n - if(elem_Ap_n > 0 and elem_pg_d >0) - else [] - for elem_pg_d, elem_pg_t, elem_Ap_n, elem_Ap_t in zip(list_pg_d, list_pg_t, list_Ap_n, list_Ap_t) - ] - ) - ) - ) + +# Ap_d = [ +# np.array( +# list(chain.from_iterable( +# [ +# [1-np.exp(-elem_Ap_t/ns.tslow)]*elem_Ap_n +# if(elem_Ap_n > 0 and elem_pg_d >0) +# else [] +# for elem_pg_d, elem_pg_t, elem_Ap_n, elem_Ap_t in zip(list_pg_d, list_pg_t, list_Ap_n, list_Ap_t) +# ] +# ) +# ) + +# ) +# for list_pg_d, list_pg_t, list_Ap_n, list_Ap_t, in zip(pg_pXT_d, pg_pXT_t, Ap_n, Ap_t) +# ] + + +# Ap_t = [ +# np.array( +# list(chain.from_iterable( +# [ +# [elem_pg_t + elem_Ap_t]*elem_Ap_n +# if(elem_Ap_n > 0 and elem_pg_d >0) +# else [] +# for elem_pg_d, elem_pg_t, elem_Ap_n, elem_Ap_t in zip(list_pg_d, list_pg_t, list_Ap_n, list_Ap_t) +# ] +# ) +# ) +# ) - for list_pg_d, list_pg_t, list_Ap_n, list_Ap_t, in zip(pg_d, pg_t, Ap_n, Ap_nt) - ] +# for list_pg_d, list_pg_t, list_Ap_n, list_Ap_t, in zip(pg_pXT_d, pg_pXT_t, Ap_n, Ap_t) +# ] pbar.update(1) pbar.set_description("{0}".format(self.pb_ag_text[5])) @@ -533,7 +584,6 @@ class SiPMSimulation: Q = np.array(ns.dist_Q.rvs(ns.n_sim)) - n_ag_d = np.asarray([len(list_ag_d) for list_ag_d in ns.ag_d]) Sig1 = ns.dist_Sig1.rvs(np.sum(n_ag_d)) n_ag_d_cumsum = np.cumsum(n_ag_d)[:-1] @@ -670,7 +720,7 @@ class SiPMSimulation: elif(ns.Gen_npXT == "Binomial"): ns.dist_fpXT = scipy.stats.binom(n=1, p = ns.ppXT) elif(ns.Gen_npXT == "Borel"): - ns.dist_fpXT = self.borel_gen(name="borel_npXT")(mu=ns.ppXT) + ns.dist_fpXT = borel(mu=ns.ppXT) else: raise Exception("The Prompt Cross-talk Discharge distribution mode that has been selected is invalid. Please choose from the following options: {0}".format( ", ".join(self.VariableDictionary["Gen_npXT"]["options"]))) @@ -680,7 +730,7 @@ class SiPMSimulation: elif(ns.Gen_ndXT== "Binomial"): ns.dist_fdXT = scipy.stats.binom(n=1, p = ns.pdXT) elif(ns.Gen_ndXT == "Borel"): - ns.dist_fdXT = self.borel_gen(name="borel_ndXT")(mu=ns.pdXT) + ns.dist_fdXT = borel(mu=ns.pdXT) else: raise Exception("The Delayed Cross-talk Discharge mode that has been selected is invalid. Please choose from the following options: {0}".format( ", ".join(self.VariableDictionary["Gen_ndXT"]["options"])))