def Sim2(NQ, T, Strig, R, F, Tf, Ts, St): pmt_mid, pmt_r, pmt_l, pmt_up, pmt_dn, r = make_pmts(PMTs) N_events = 10000 d = np.zeros((N_events, 200, len(PMTs))) H = np.zeros((25, 200, len(PMTs))) G = np.zeros((50, 200)) NGlob = (np.amax(NQ) * 4 * np.pi / r**2) * len(PMTs) Q = NQ / np.amax(NQ) for i in range(N_events): print(i) t0 = np.zeros(len(PMTs)) trig = np.random.normal(0, 5 * Strig, 1) N = np.random.poisson(NGlob) costheta = np.random.uniform(-1, 1, N) phi = np.random.uniform(0, 2 * np.pi, N) # n=np.unique(whichPMT(costheta, phi, pmt_mid, pmt_r, pmt_up), return_counts=True) n = whichPMT(costheta, phi, pmt_mid, pmt_r, pmt_up, r, [0, 0, 0]) for j, pmt in enumerate(PMTs): ch = np.random.choice( 3, size=np.random.binomial(n[j], Q[j]), replace=True, p=[R[j], (1 - R[j]) * F, (1 - R[j]) * (1 - F)]) nd = len(np.nonzero(ch == 0)[0]) nf = len(np.nonzero(ch == 1)[0]) ns = len(np.nonzero(ch == 2)[0]) td = np.random.normal(trig + 5 * T[j], 5 * St[j], nd) tf = np.random.normal( trig + 5 * T[j] + np.random.exponential(5 * Tf, nf), 5 * St[j], nf) ts = np.random.normal( trig + 5 * T[j] + np.random.exponential(5 * Ts, ns), 5 * St[j], ns) t = np.append(td, np.append(tf, ts)) h, bins = np.histogram(t, bins=np.arange(201) * 5) t0[j] = np.amin(np.nonzero(h > 0)[0]) d[i, :, j] = h for j in range(len(PMTs)): d[i, :, j] = np.roll(d[i, :, j], -int(np.amin(t0))) spectrum = np.histogram(np.sum(np.sum(d, axis=2), axis=1), bins=np.arange(400) - 0.5)[0] for k in range(200): G[:, k] = np.histogram(np.sum(d[:, k, :], axis=1), bins=np.arange(np.shape(G)[0] + 1) - 0.5)[0] for j in range(len(PMTs)): H[:, k, j] = np.histogram(d[:, k, j], bins=np.arange(np.shape(H)[0] + 1) - 0.5)[0] return H / N_events, G / N_events, spectrum
def mash(pmts): mid, rt, pmt_l, up, pmt_dn = make_pmts(pmts) R = 0.36 r = 1 * R V = [4 * np.pi * r**3 / 3] X = [0] Y = [0] Z = [0] v = (1 - R**3) * np.pi / 6 * np.cos(3 * np.pi / 8) r = 0.75 * (1 - R**4) / (1 - R**3) for i in range(8): X.append(r * np.cos(i * np.pi / 4)) Y.append(r * np.sin(i * np.pi / 4)) Z.append(0) V.append(v) v = (1 - R**3) / 3 * np.pi / 3 * (np.cos(np.pi / 8) - np.cos(3 * np.pi / 8)) for i in range(6): X.append(r * np.cos(i * np.pi / 3 + np.pi / 6) * np.sin(np.pi / 4)) Y.append(r * np.sin(i * np.pi / 3 + np.pi / 6) * np.sin(np.pi / 4)) Z.append(r * np.cos(np.pi / 4)) V.append(v) X.append(r * np.cos(i * np.pi / 3 + np.pi / 6) * np.sin(np.pi / 4)) Y.append(r * np.sin(i * np.pi / 3 + np.pi / 6) * np.sin(np.pi / 4)) Z.append(-r * np.cos(np.pi / 4)) V.append(v) v = (1 - R**3) / 3 * 2 * np.pi * (1 - np.cos(np.pi / 8)) X.append(0) Y.append(0) Z.append(-r) V.append(v) X.append(0) Y.append(0) Z.append(r) V.append(v) r_mash = np.vstack((X, np.vstack((Y, Z)))).T / 4 dS = np.zeros((len(r_mash), len(pmts))) for i in range(len(r_mash)): dS[i] = make_dS(r_mash[i], mid, rt, up) return r_mash, np.array(V) / (4 * np.pi / 3), dS
P1 = (P0 * (1 - np.prod(B[0], axis=0))) P = np.zeros((len(t[t < 100]), len(nu), len(Q))) for i in range(len(Q)): P2 = P0 * (1 - np.prod(B[0, np.delete(np.arange(len(Q)), i)], axis=0)) P[0, 0, i] = np.sum(np.sum(B[0, i] * P2 * pois, axis=1), axis=0) P[0, 1:] = np.sum(np.sum(B[1:] * P0 * pois, axis=3), axis=2) for i in range(1, len(t[t < 100])): # P[i]=np.sum(np.sum(B[:,:,i:,:]*P1[:len(t)-i,:]*pois, axis=3), axis=2) P[i] = np.sum(np.sum(B[:, :, i:, :] * P1[:len(t) - i, :] * pois / dt[i], axis=3), axis=2) return np.transpose(P, (1, 0, 2)), S, Mcov mid, rt, up = make_pmts(pmts) def whichPMT(v, us, mid, rt, up): hits = np.zeros(len(us[0])) - 1 for i in range(len(mid)): a = (1 - np.sum(mid[i] * v, axis=0)) / np.sum(us.T * mid[i], axis=1) r = v + (a * us).T - mid[i] hits[np.nonzero( np.logical_and( a > 0, np.logical_and( np.abs(np.sum(r * rt[i], axis=1)) < np.sum(rt[i]**2), np.abs(np.sum(r * up[i], axis=1)) < np.sum(up[i]** 2))))[0]] = i return hits
import numpy as np import matplotlib.pyplot as plt import time import os import sys from scipy.optimize import minimize from scipy.stats import poisson, binom from scipy.special import erf as erf import warnings from minimize import minimize, make_ps from PMTgiom import make_pmts from make_mash import mash from scipy.signal import convolve2d, convolve pmt_mid, pmt_r, pmt_l, pmt_up, pmt_dn, r=make_pmts(np.arange(20)) r_mash, V_mash=mash() def make_dS(d, m, rt, up): dS=np.zeros(len(m)) a=np.linspace(-1,1,100, endpoint=True) I=np.arange(len(a)**2) for i in range(len(dS)): x=m[i,0]+a[I//len(a)]*rt[i,0]+a[I%len(a)]*up[i,0]-d[0] y=m[i,1]+a[I//len(a)]*rt[i,1]+a[I%len(a)]*up[i,1]-d[1] z=m[i,2]+a[I//len(a)]*rt[i,2]+a[I%len(a)]*up[i,2]-d[2] dS[i]=np.sum((1-np.sum(d*m[i]))/(np.sqrt(x**2+y**2+z**2)**3))*((a[1]-a[0])*r/2)**2 return dS make_dS([0.2,0.2,0.2], pmt_mid, pmt_r, pmt_up)
b = np.sum(mid[i] * (mid[i] - d)) R = np.array([x[j], y[j], z[j]]) a = b / np.sum(R * mid[i]) if a > 0: v = mid[i] - d - a * R if np.abs(np.sum(v * up[i])) < (0.5 * r)**2 and np.abs( np.sum(v * rt[i])) < (0.5 * r)**2: n[i] += 1 hit += 1 if hit > 1: print('FFFFFFFFFFFFFFFFFFuck!!!!') sys.exit() return n pmt_mid, pmt_r, pmt_l, pmt_up, pmt_dn, r = make_pmts() h = np.zeros(20) K = 15 d = [0, 0, 0] pmts = np.arange(len(pmt_mid)) for i in range(K): print(i) N = 7000 costheta = np.random.uniform(-1, 1, N) phi = np.random.uniform(0, 2 * np.pi, N) n = whichPMT(costheta, phi, pmt_mid, pmt_r, pmt_up, r, d) h += n plt.figure() plt.bar(pmts, h / K)
def whichPMT(v, us, mid, rt, up): hits = np.zeros(len(us[0])) - 1 for i in range(len(mid)): a = (1 - np.sum(mid[i] * v, axis=0)) / np.sum(us.T * mid[i], axis=1) r = v + (a * us).T - mid[i] hits[np.nonzero( np.logical_and( a > 0, np.logical_and( np.abs(np.sum(r * rt[i], axis=1)) < np.sum(rt[i]**2), np.abs(np.sum(r * up[i], axis=1)) < np.sum(up[i]** 2))))[0]] = i return hits pmt_mid, pmt_r, pmt_l, pmt_up, pmt_dn = make_pmts(pmts) def Sim2(N, F, Tf, Ts, R, a, eta, Q, T, St, PEs, prm): f = np.sum(make_recomb(np.arange(1000 * 20) / 100, a, eta).reshape(1000, 20), axis=1) f[-1] = 1 - np.sum(f[:-1]) N_events = 10000 Strig = 2 d = np.zeros((N_events, 200, len(Q))) H = np.zeros((30, 200, len(Q))) G = np.zeros((250, 200)) trp = np.zeros((N_events, 200, len(Q))) sng = np.zeros((N_events, 200, len(Q))) Rtrp = np.zeros((N_events, 200, len(Q)))
spectrum=np.histogram(np.sum(np.sum(d, axis=2), axis=1), bins=np.arange(1000)-0.5)[0] for k in range(200): G[:,k]=np.histogram(np.sum(d[:,k,:], axis=1), bins=np.arange(np.shape(G)[0]+1)-0.5)[0] Gtrp[:,k]=np.histogram(np.sum(trp[:,k,:], axis=1), bins=np.arange(np.shape(G)[0]+1)-0.5)[0] Gsng[:,k]=np.histogram(np.sum(sng[:,k,:], axis=1), bins=np.arange(np.shape(G)[0]+1)-0.5)[0] GRtrp[:,k]=np.histogram(np.sum(Rtrp[:,k,:], axis=1), bins=np.arange(np.shape(G)[0]+1)-0.5)[0] GRsng[:,k]=np.histogram(np.sum(Rsng[:,k,:], axis=1), bins=np.arange(np.shape(G)[0]+1)-0.5)[0] for j in range(len(Q)): H[:,k,j]=np.histogram(d[:,k,j], bins=np.arange(np.shape(H)[0]+1)-0.5)[0] return H/N_events, G/N_events, spectrum, Gtrp/N_events, Gsng/N_events, GRtrp/N_events, GRsng/N_events PMTs=[0,1,4,7,8,14] mid, rt, pmt_l, up, pmt_dn, r=make_pmts(PMTs) def Sim2(N, Q, T, Strig, R, F, Tf, Ts, St): N_events=10 d=np.zeros((N_events, 200, len(Q))) H=np.zeros((50, 200, len(Q))) G=np.zeros((250,200)) for i in range(N_events): print(i) t0=np.zeros(len(Q)) trig=np.random.normal(0, 5*Strig, 1) N_glob=np.random.poisson(N) ch=np.random.choice(3, size=N_glob, replace=True, p=[R, (1-R)*F, (1-R)*(1-F)]) nd=len(np.nonzero(ch==0)[0]) nf=len(np.nonzero(ch==1)[0]) ns=len(np.nonzero(ch==2)[0]) tf=np.random.exponential(5*Tf, nf)