def getEQXs(fIn): isOut = lfmpp.getOut(fIn) t,xeq = lfmpp.getH5p(fIn,"xeq",Mask=isOut) t,yeq = lfmpp.getH5p(fIn,"yeq",Mask=isOut) t,tCr = lfmpp.getH5p(fIn,"tCr",Mask=isOut) t,tEq = lfmpp.getH5p(fIn,"Teq",Mask=isOut) R = [] P = [] Np = xeq.shape[1] print("Working with %d particles"%(Np)) for n in range(Np): #Accumulate EQXs for time after first crossing tCrn = tCr[:,n] tSlc1 = tCrn.argmax() teqn = tEq[tSlc1:,n] ts,Ind = np.unique(teqn,return_index=True) #Have unique EQXs Neq = len(Ind) if (Neq>0): x = xeq[tSlc1:,n] y = yeq[tSlc1:,n] x = x[Ind] y = y[Ind] r = np.sqrt(x**2.0 + y**2.0) phi = np.arctan2(y,x) for i in range(Neq): R.append(r[i]) P.append(phi[i]) return np.array(R),np.array(P)
def findMaxRad(fIn): isOut = lfmpp.getOut(fIn) t, ids = lfmpp.getH5p(fIn, "id", Mask=isOut) t, mp = lfmpp.getH5p(fIn, "mp", Mask=isOut) t, x = lfmpp.getH5p(fIn, "x", Mask=isOut) t, y = lfmpp.getH5p(fIn, "y", Mask=isOut) t, z = lfmpp.getH5p(fIn, "z", Mask=isOut) t, tCr = lfmpp.getH5p(fIn, "tCr", Mask=isOut) ids = ids[0, :] cylR = np.sqrt(x**2.0 + y**2.0) Np = len(ids) Rs = [] print("\tFound %d particles\n" % (Np)) print(Np) #Find slices for which particle is in sheath for n in range(Np): #Find last MP xing mpn = mp[:, n] tCrn = tCr[:, n] tSlc1 = tCrn.argmax() #Find box xing tSlc2 = np.argmax(mpn > 0) Rn = cylR[tSlc1:tSlc2, n] if (len(Rn) > 0): maxRn = Rn.max() Rs.append(maxRn) return Rs
def getXKA(fIn): isOut = lfmpp.getOut(fIn, mp=True) #Get spherical coordinates of last MP Xing R, Phi, Lambda = lfmpp.getSphLoss(fIn) #Get time index of last MP crossing t, tEq = lfmpp.getH5p(fIn, "Teq", Mask=isOut) tsEq = np.argmax(tEq, axis=0) #Use these slices to find values at last X'ing t, Kt = lfmpp.getH5p(fIn, "kev", Mask=isOut) t, Vxt = lfmpp.getH5p(fIn, "vx", Mask=isOut) t, Vyt = lfmpp.getH5p(fIn, "vy", Mask=isOut) t, Vzt = lfmpp.getH5p(fIn, "vz", Mask=isOut) Np = Kt.shape[1] K = np.zeros(Np) A = np.zeros(Np) for i in range(Np): tsi = tsMP[i] vxi = Vxt[tsi, i] vyi = Vyt[tsi, i] vzi = Vzt[tsi, i] vmag = np.sqrt(vxi**2.0 + vyi**2.0 + vzi**2.0) K[i] = Kt[tsi, i] A[i] = np.arccos(vzi / vmag) * 180 / np.pi mlt = Phi return mlt, K, A
def getPs(h5pFile, pC, Nk): isOut = lfmpp.getOut(h5pFile) R, PhiMP0, LambdaF, Tmp = lfmpp.getSphLoss1st(h5pFile) ids, PhiBX = lastPhi(h5pFile) dPhi = PhiBX - PhiMP0 Ind = (abs(dPhi) >= pC) Ntot = Ind.sum() ids = ids[Ind] print("Found %d values larger than %3.2f" % (Ntot, pC)) IndR = np.random.choice(Ntot, Nk, replace=False) ids = ids[IndR] return ids
def NumCross(fIn, onlyOut=True): isOut = lfmpp.getOut(fIn) t, tCrF = lfmpp.getH5p(fIn, "tCr") t, pids = lfmpp.getH5p(fIn, "id") pids = pids[-1, :] print("\tAll particles:\n") NumX_All = CountXs(tCrF, pids) print("\tOnly out:\n") NumX_Out = CountXs(tCrF[:, isOut], pids[isOut]) print("\tOnly in:\n") NumX_In = CountXs(tCrF[:, np.logical_not(isOut)], pids[np.logical_not(isOut)]) print("\t# of In + MP-X = %d\n" % np.sum(NumX_In > 0)) return NumX_All, NumX_Out, NumX_In
def getEQXs(fIn): isOut = lfmpp.getOut(fIn) t,xeq = lfmpp.getH5p(fIn,"xeq",Mask=isOut) t,yeq = lfmpp.getH5p(fIn,"yeq",Mask=isOut) t,tCr = lfmpp.getH5p(fIn,"tCr",Mask=isOut) t,tEq = lfmpp.getH5p(fIn,"Teq",Mask=isOut) t,Vx = lfmpp.getH5p(fIn,"vx",Mask=isOut) t,Vy = lfmpp.getH5p(fIn,"vy",Mask=isOut) t,Vz = lfmpp.getH5p(fIn,"vz",Mask=isOut) Vmag = np.sqrt(Vx**2.0+Vy**2.0+Vz**2.0) A = [] P = [] Np = xeq.shape[1] print("Working with %d particles"%(Np)) for n in range(Np): #Accumulate EQXs for time after first crossing tCrn = tCr[:,n] tSlc1 = tCrn.argmax() teqn = tEq[tSlc1:,n] ts,Ind = np.unique(teqn,return_index=True) #Have unique EQXs Neq = len(Ind) if (Neq>0): x = xeq[tSlc1:,n] y = yeq[tSlc1:,n] x = x[Ind] y = y[Ind] vm = Vmag[tSlc1:,n] vm = vm[Ind] vzn = Vz[tSlc1:,n] vzn = vzn[Ind] als = np.arccos(vzn/vm)*180.0/np.pi r = np.sqrt(x**2.0 + y**2.0) phi = np.arctan2(y,x) for i in range(Neq): A.append(als[i]) P.append(phi[i]) return np.array(A),np.array(P)
def mpxK(fIn): #Get energies at last/first MPX isOut = lfmpp.getOut(fIn, mp=True) t, kevPT = lfmpp.getH5p(fIn, "kev") #Last MP crossings pid, Tmpx = lfmpp.getH5pFin(fIn, "tCr", Mask=isOut) #First MP crossings R, Phi, Lambda, Tmpx0 = lfmpp.getSphLoss1st(fIn) Np = isOut.sum() #Number of out particles mpK = np.zeros(Np) mpK0 = np.zeros(Np) for n in range(Np): idn = np.int(pid[n] - 1) #Time slices of first/last MPX ts0 = np.argmin(Tmpx0[n] >= t) tsF = np.argmin(Tmpx[n] >= t) #print(n,idn,ts0,tsF) mpK[n] = kevPT[tsF, idn] mpK0[n] = kevPT[ts0, idn] return mpK0, mpK
def getPBlk(h5pFile, pC, Np): #Get Np particles for each of 3 types #pI:(0,180), (-15,0),(-180,-15) #And have dPhi>=pC pIL = [0, -45, -180] pIH = [180, 0.0, -45] Nd = len(pIL) pIDs = np.zeros(Np * Nd, dtype=np.int) isOut = lfmpp.getOut(h5pFile) R, PhiMP0, LambdaF, Tmp = lfmpp.getSphLoss1st(h5pFile) ids, PhiBX = lastPhi(h5pFile) dPhi = PhiBX - PhiMP0 print(PhiMP0.min(), PhiMP0.max()) print(dPhi.min(), dPhi.max()) for d in range(Nd): pcd = pC[d] if (pC[d] >= 0): IndPC = (dPhi >= pC[d]) else: IndPC = (dPhi <= pC[d]) IndPI = (PhiMP0 >= pIL[d]) & (PhiMP0 <= pIH[d]) Ind = IndPC & IndPI subIDs = ids[Ind] subDP = dPhi[Ind] #Pick Np randomly Ntot = Ind.sum() print("Found %d values w/ dP >= %f, and pI between %f and %f" % (Ntot, pC[d], pIL[d], pIH[d])) IndR = np.random.choice(Ntot, Np, replace=False) rIDs = subIDs[IndR] i0 = d * Np i1 = i0 + Np pIDs[i0:i1] = rIDs print(rIDs) print(subDP[IndR]) return pIDs
def getTimes(fIn, doTail=False): isOut = lfmpp.getOut(fIn, mp=True, tl=doTail) t, mpF = lfmpp.getH5p(fIn, "mp") mp = mpF[:, isOut] #Last MP crossings pid, Tmpx = lfmpp.getH5pFin(fIn, "tCr", Mask=isOut) #First MP crossings R, Phi, Lambda, Tmpx0 = lfmpp.getSphLoss1st(fIn) #Time of loss from box, time slice index tsMP = np.argmax(mp, axis=0) #Convert to physical time Tbx = t[tsMP] if (doTail): #Remove particles that leave through tail but never cross MP DelT = Tbx - Tmpx Tbx = Tbx[DelT > 0] Tmpx = Tmpx[DelT > 0] pid = pid[DelT > 0] return Tmpx, Tmpx0, Tbx, pid
def lastPhi(fIn): isOut = lfmpp.getOut(fIn) ids, x = lfmpp.getH5pFin(fIn, "x", Mask=isOut) ids, y = lfmpp.getH5pFin(fIn, "y", Mask=isOut) pBX = np.arctan2(y, x) * 180.0 / np.pi return pBX
pMP1 = [] pMP0 = [] msDp = [] pBX = [] mDp = [] LogScl = LogNorm(1, 500) for i in range(Ns): #xBin = np.linspace(-180,180,100) xBin = np.linspace(-60, 60, 100) yBin = np.linspace(0, 30, 30) fIn = dirStub + "/" + spcs[i] + "." + fileStub print("Reading %s" % (fIn)) print("Species %s" % (Leg[i])) isOut = lfmpp.getOut(fIn) pid, NumX = lfmpp.countMPX(fIn, isOut) R, PhiMP0, LambdaF, Tmp = lfmpp.getSphLoss1st(fIn) R, PhiMP1, LambdaL = lfmpp.getSphLoss(fIn) PhiBX = lastPhi(fIn) pMP0.append(PhiMP0) pMP1.append(PhiMP1) mpDp.append(PhiMP1 - PhiMP0) pBX.append(PhiBX) msDp.append(PhiBX - PhiMP1) mDp.append(PhiBX - PhiMP0) Nb = 40 N0 = -60 N1 = 120
def findCrossings(fIn, PhiC=30.0, DelPhi=5): isOut = lfmpp.getOut(fIn) t, ids = lfmpp.getH5p(fIn, "id", Mask=isOut) t, mp = lfmpp.getH5p(fIn, "mp", Mask=isOut) t, x = lfmpp.getH5p(fIn, "x", Mask=isOut) t, y = lfmpp.getH5p(fIn, "y", Mask=isOut) t, z = lfmpp.getH5p(fIn, "z", Mask=isOut) t, vx = lfmpp.getH5p(fIn, "vx", Mask=isOut) t, vy = lfmpp.getH5p(fIn, "vy", Mask=isOut) t, vz = lfmpp.getH5p(fIn, "vz", Mask=isOut) t, tCr = lfmpp.getH5p(fIn, "tCr", Mask=isOut) ids = ids[0, :] phi = np.arctan2(y, x) * 180 / np.pi if (np.abs(PhiC) > 5): #Fix for flop phi[phi < 0] = phi[phi < 0] + 360 Np = len(ids) #print("\tFound %d particles\n"%(Np)) Vx = [] Vy = [] Vz = [] sM = [] zM = [] for n in range(Np): #Find last MP xing mpn = mp[:, n] tCrn = tCr[:, n] tSlc1 = tCrn.argmax() #Find box xing tSlc2 = np.argmax(mpn > 0) pn = phi[tSlc1:tSlc2, n] #print(pn.shape) #Identify sign changes and bound for within +/- 5 degrees #Otherwise funny business @ p=0/360 dp = pn - PhiC dpsgn = np.sign(dp) dpFlp = ((np.roll(dpsgn, 1) - dpsgn) != 0).astype(int) dpFlp = (dpFlp > 0) dpAbs = np.abs(dp) <= DelPhi isPCr = dpFlp & dpAbs #print(len(pn),tCr.sum()) Nx = isPCr.sum() if (Nx > 0): vxn = vx[tSlc1:tSlc2, n] vyn = vy[tSlc1:tSlc2, n] vzn = vz[tSlc1:tSlc2, n] xn = x[tSlc1:tSlc2, n] yn = y[tSlc1:tSlc2, n] zn = z[tSlc1:tSlc2, n] vxx = vxn[isPCr] vyx = vyn[isPCr] vzx = vzn[isPCr] xx = xn[isPCr] yx = yn[isPCr] zx = zn[isPCr] for i in range(Nx): Vx.append(vxx[i]) Vy.append(vyx[i]) Vz.append(vzx[i]) sM.append(np.sqrt(xx[i]**2.0 + yx[i]**2.0)) zM.append(zx[i]) #print(n,isPCr) Vx = np.array(Vx) Vy = np.array(Vy) Vz = np.array(Vz) sM = np.array(sM) zM = np.array(zM) print("\tPhi = %5.2f, NumP = %d\n" % (PhiC, len(Vx))) return sM, zM, Vx, Vy, Vz
def lastK(fIn): isOut = lfmpp.getOut(fIn) ids, kev = lfmpp.getH5pFin(fIn, "kev", Mask=isOut) return ids, kev
def getLastEQX(fIn): isOut = lfmpp.getOut(fIn) ids, xeq = lfmpp.getH5pFin(fIn, "xeq", Mask=isOut) ids, yeq = lfmpp.getH5pFin(fIn, "yeq", Mask=isOut) return xeq, yeq