"""
This module contains tests for tofu.geom in its structured version
"""
# External modules
import os
import itertools as itt
import numpy as np
import matplotlib.pyplot as plt
import warnings as warn
# Importing package tofu.gem
import tofu as tf
from tofu import __version__
import tofu.defaults as tfd
import tofu.pathfile as tfpf
import tofu.utils as tfu
import tofu.geom as tfg
_here = os.path.abspath(os.path.dirname(__file__))
VerbHead = 'tofu.geom.test_03_core'
keyVers = 'Vers'
_Exp = 'WEST'
#######################################################
#
# Setup and Teardown
#
#######################################################
[docs]def setup_module(module):
print("") # this is to get a newline after the dots
lf = os.listdir(_here)
lf = [f for f in lf
if all([s in f for s in ['TFG_',_Exp,'.npz']])]
lF = []
for f in lf:
ff = f.split('_')
v = [fff[len(keyVers):] for fff in ff
if fff[:len(keyVers)]==keyVers]
msg = f + "\n "+str(ff) + "\n " + str(v)
assert len(v)==1, msg
v = v[0]
if '.npz' in v:
v = v[:v.index('.npz')]
# print(v, __version__)
if v!=__version__:
lF.append(f)
if len(lF)>0:
print("Removing the following previous test files:")
for f in lF:
os.remove(os.path.join(_here,f))
#print("setup_module before anything in this file")
[docs]def teardown_module(module):
#os.remove(VesTor.Id.SavePath + VesTor.Id.SaveName + '.npz')
#os.remove(VesLin.Id.SavePath + VesLin.Id.SaveName + '.npz')
#print("teardown_module after everything in this file")
#print("") # this is to get a newline
lf = os.listdir(_here)
lf = [f for f in lf
if all([s in f for s in ['TFG_',_Exp,'.npz']])]
lF = []
for f in lf:
ff = f.split('_')
v = [fff[len(keyVers):] for fff in ff
if fff[:len(keyVers)]==keyVers]
msg = f + "\n "+str(ff) + "\n " + str(v)
assert len(v)==1, msg
v = v[0]
if '.npz' in v:
v = v[:v.index('.npz')]
# print(v, __version__)
if v==__version__:
lF.append(f)
if len(lF)>0:
print("Removing the following test files:")
for f in lF:
os.remove(os.path.join(_here,f))
#######################################################
#
# Struct subclasses
#
#######################################################
path = os.path.join(_here, 'test_03_core_data')
lf = os.listdir(path)
lf = [f for f in lf if all([s in f for s in [_Exp,'.txt']])]
lCls = sorted(set([f.split('_')[1] for f in lf]))
# Define a dict of objects to be tested, in linear and toroidal geometry
dobj = {'Tor':{}, 'Lin':{}}
for tt in dobj.keys():
for cc in lCls:
lfc = [f for f in lf if f.split('_')[1] == cc and 'V0' in f]
ln = []
for f in lfc:
if 'CoilCS' in f:
ln.append(f.split('_')[2].split('.')[0])
else:
ln.append(f.split('_')[2].split('.')[0])
lnu = sorted(set(ln))
if not len(lnu) == len(ln):
msg = ("Non-unique name list for {0}:".format(cc)
+ "\n\tln = [{0}]".format(', '.join(ln))
+ "\n\tlnu = [{0}]".format(', '.join(lnu)))
raise Exception(msg)
dobj[tt][cc] = {}
for ii in range(0, len(ln)):
if 'BumperOuter' in ln[ii]:
Lim = np.r_[10.,20.]*np.pi/180.
elif 'BumperInner' in ln[ii]:
t0 = np.arange(0,360,60)*np.pi/180.
Dt = 5.*np.pi/180.
Lim = t0[np.newaxis,:] + Dt*np.r_[-1.,1.][:,np.newaxis]
elif 'Ripple' in ln[ii]:
t0 = np.arange(0,360,30)*np.pi/180.
Dt = 2.5*np.pi/180.
Lim = t0[np.newaxis,:] + Dt*np.r_[-1.,1.][:,np.newaxis]
elif 'IC' in ln[ii]:
t0 = np.arange(0,360,120)*np.pi/180.
Dt = 10.*np.pi/180.
Lim = t0[np.newaxis,:] + Dt*np.r_[-1.,1.][:,np.newaxis]
elif 'LH' in ln[ii]:
t0 = np.arange(-180,180,120)*np.pi/180.
Dt = 10.*np.pi/180.
Lim = t0[np.newaxis,:] + Dt*np.r_[-1.,1.][:,np.newaxis]
elif tt=='Lin':
Lim = np.r_[0.,10.]
else:
Lim = None
Poly = np.loadtxt(os.path.join(path,lfc[ii]))
assert Poly.ndim == 2
assert Poly.size >= 2*3
kwd = dict(Name=ln[ii]+tt, Exp=_Exp, SavePath=_here,
Poly=Poly, Lim=Lim, Type=tt)
dobj[tt][cc][ln[ii]] = eval('tfg.{}(**kwd)'.format(cc))
[docs]class Test01_Struct(object):
""" Class for testing the Struct clas and its methods
In tofu, a Struct is a 3D object defined by a 2D contour in a cross-section
It has a - toroidal or linear - extension (None if axisymmetric)
It has methods for plotting, computing key parameters...
"""
[docs] @classmethod
def setup_class(cls, dobj=dobj):
#print("")
#print("---- "+cls.__name__)
cls.dobj = dobj
[docs] @classmethod
def teardown_class(cls):
#print("teardown_class() after any methods in this class")
pass
[docs] def setup(self):
#print("TestUM:setup() before each test method")
pass
[docs] def teardown(self):
#print("TestUM:teardown() after each test method")
pass
[docs] def test00_set_move(self):
for typ in self.dobj.keys():
if typ == 'Tor':
move = 'rotate_around_torusaxis'
kwd = {}
else:
move = 'translate_in_cross_section'
kwd = {'direction_rz': [1., 0., 0.]}
for c in self.dobj[typ].keys():
for ii, n in enumerate(self.dobj[typ][c].keys()):
if ii % 2 == 0:
self.dobj[typ][c][n].set_move(move=move,
**kwd)
[docs] def test01_todict(self):
for typ in self.dobj.keys():
for c in self.dobj[typ].keys():
for n in self.dobj[typ][c].keys():
d = self.dobj[typ][c][n].to_dict()
assert type(d) is dict
assert all([any([s in k for k in d.keys()]
for s in ['Id','geom','sino','strip'])])
[docs] def test02_fromdict(self):
for typ in self.dobj.keys():
for c in self.dobj[typ].keys():
d = list(self.dobj[typ][c].values())[0].to_dict()
obj = eval('tfg.%s(fromdict=d)'%c)
assert isinstance(obj,eval('tfg.%s'%c))
[docs] def test03_copy_equal(self):
for typ in self.dobj.keys():
for c in self.dobj[typ].keys():
for n in self.dobj[typ][c].keys():
obj = self.dobj[typ][c][n].copy()
assert obj == self.dobj[typ][c][n]
assert not obj != self.dobj[typ][c][n]
[docs] def test04_get_nbytes(self):
for typ in self.dobj.keys():
for c in self.dobj[typ].keys():
for n in self.dobj[typ][c].keys():
nb, dnb = self.dobj[typ][c][n].get_nbytes()
[docs] def test05_strip_nbytes(self):
for typ in self.dobj.keys():
for c in self.dobj[typ].keys():
lok = eval('tfg.%s'%c)._dstrip['allowed']
nb = np.full((len(lok),), np.nan)
for n in self.dobj[typ][c].keys():
obj = self.dobj[typ][c][n]
for ii in lok:
obj.strip(ii)
nb[ii] = obj.get_nbytes()[0]
assert np.all(np.diff(nb)<0.)
for ii in lok[::-1]:
obj.strip(ii)
[docs] def test06_set_move_None(self):
for typ in self.dobj.keys():
for c in self.dobj[typ].keys():
for n in self.dobj[typ][c].keys():
self.dobj[typ][c][n].set_move()
[docs] def test07_rotate_copy(self):
for typ in self.dobj.keys():
if typ == 'Lin':
continue
dkwd0 = dict(axis_rz=[2.4, 0], angle=np.pi/4,
return_copy=True)
dkwd1 = dict(direction_rz=[1, 0], distance=0.1,
return_copy=True)
for c in self.dobj[typ].keys():
for ii, n in enumerate(self.dobj[typ][c].keys()):
if ii % 2 == 0:
obj = getattr(self.dobj[typ][c][n],
'rotate_in_cross_section')(**dkwd0)
else:
obj = getattr(self.dobj[typ][c][n],
'translate_in_cross_section')(**dkwd1)
[docs] def test08_set_dsino(self):
for typ in self.dobj.keys():
for c in self.dobj[typ].keys():
for n in self.dobj[typ][c].keys():
self.dobj[typ][c][n].set_dsino([2.4,0.])
[docs] def test09_setget_color(self):
for typ in self.dobj.keys():
for c in self.dobj[typ].keys():
for n in self.dobj[typ][c].keys():
col = self.dobj[typ][c][n].get_color()
self.dobj[typ][c][n].set_color(col)
[docs] def test10_isInside(self, NR=20, NZ=20, NThet=10):
for typ in self.dobj.keys():
if tt=='Tor':
R = np.linspace(1,3,100)
Z = np.linspace(-1,1,100)
phi = np.pi/4.
pts = np.array([np.tile(R,Z.size),
np.repeat(Z,R.size),
np.full((R.size*Z.size),phi)])
In = '(R,Z,Phi)'
else:
X = 4.
Y = np.linspace(1,3,100)
Z = np.linspace(-1,1,100)
pts = np.array([np.full((Y.size*Z.size),X),
np.tile(Y,Z.size),
np.repeat(Z,Y.size)])
In = '(X,Y,Z)'
for c in self.dobj[typ].keys():
for n in self.dobj[typ][c].keys():
obj = self.dobj[typ][c][n]
ind = obj.isInside(pts, In=In)
if obj.noccur<=1:
assert ind.shape==(pts.shape[1],)
elif not ind.shape == (obj.noccur,pts.shape[1]):
msg = "ind.shape = {0}".format(str(ind.shape))
msg += "\n But noccur = {0}".format(obj.noccur)
msg += "\n and npts = {0}".format(pts.shape[1])
raise Exception(msg)
[docs] def test11_InsideConvexPoly(self):
for typ in self.dobj.keys():
for c in self.dobj[typ].keys():
for n in self.dobj[typ][c].keys():
self.dobj[typ][c][n].get_InsideConvexPoly(Plot=False,
Test=True)
[docs] def test12_get_sampleEdge(self):
for typ in self.dobj.keys():
for c in self.dobj[typ].keys():
for n in self.dobj[typ][c].keys():
obj = self.dobj[typ][c][n]
out = obj.get_sampleEdge(0.05, resMode='abs',
offsetIn=0.001)
out = obj.get_sampleEdge(0.1, resMode='rel',
offsetIn=-0.001)
out = obj.get_sampleEdge(0.05, domain=[None, [-2., 0.]],
resMode='abs', offsetIn=0.)
[docs] def test13_get_sampleCross(self):
for typ in self.dobj.keys():
for c in self.dobj[typ].keys():
for n in self.dobj[typ][c].keys():
try:
obj = self.dobj[typ][c][n]
ii = 0
out = obj.get_sampleCross(0.02, resMode='abs')
ind = out[2]
ii = 1
out = obj.get_sampleCross(0.02, resMode='abs', ind=ind)
PMinMax = (obj.dgeom['P1Min'][0],
obj.dgeom['P1Max'][0])
DS1 = PMinMax[0] + (PMinMax[1]-PMinMax[0])/2.
ii = 2
out = obj.get_sampleCross(0.1, domain=[[None, DS1],
None],
resMode='rel')
except Exception as err:
msg = str(err)
msg += "\nFailed for {0}_{1}_{2}".format(typ, c, n)
msg += " and ii={0}".format(ii)
raise Exception(msg)
[docs] def test14_get_sampleS(self):
for typ in self.dobj.keys():
# Todo : introduce possibility of choosing In coordinates !
for c in self.dobj[typ].keys():
for n in self.dobj[typ][c].keys():
obj = self.dobj[typ][c][n]
P1Mm = (obj.dgeom['P1Min'][0], obj.dgeom['P1Max'][0])
P2Mm = (obj.dgeom['P2Min'][1], obj.dgeom['P2Max'][1])
DS = None#[[2., 3.], [0., 5.], [0., np.pi/2.]]
try:
ii = 0
out = obj.get_sampleS(0.05, resMode='abs', domain=DS,
offsetIn=0.02,
returnas='(X,Y,Z)')
pts0, ind = out[0], out[2]
ii = 1
out = obj.get_sampleS(0.05, resMode='abs', ind=ind,
offsetIn=0.02,
returnas='(X,Y,Z)')
pts1 = out[0]
except Exception as err:
msg = str(err)
msg += "\nFailed for {0}_{1}_{2}".format(typ,c,n)
msg += "\n ii={0}".format(ii)
msg += "\n Lim={0}".format(str(obj.Lim))
msg += "\n DS={0}".format(str(DS))
raise Exception(msg)
if type(pts0) is list:
assert all([np.allclose(pts0[ii],pts1[ii])
for ii in range(0,len(pts0))])
else:
assert np.allclose(pts0,pts1)
[docs] def test15_get_sampleV(self):
ldomain = [None,
[[2., 3.], [0., None], [0., np.pi/2.]]]
for typ in self.dobj.keys():
# Todo : introduce possibility of choosing In coordinates !
for c in self.dobj[typ].keys():
if issubclass(eval('tfg.%s'%c), tfg._core.StructOut):
continue
for n in self.dobj[typ][c].keys():
obj = self.dobj[typ][c][n]
for ii in range(len(ldomain)):
try:
print("Computing pts 0", ldomain[ii])
out = obj.get_sampleV(0.1, resMode='abs',
domain=ldomain[ii],
returnas='(X,Y,Z)',
algo='old')
pts0, ind0 = out[0], out[2]
except Exception as err:
msg = (str(err) +
"\nFailed for {0}_{1}_{2}\n".format(typ,
c, n)
+ "\t- ii = {0}\n".format(ii)
+ "\t- Lim = {0}\n".format(obj.Lim)
+ "\t- domain = {0}\n".format(ldomain[ii])
+ "\t- algo = 'old'"
)
raise Exception(msg)
try:
print("Computing pts 1")
out = obj.get_sampleV(0.1, resMode='abs',
ind=ind0,
returnas='(X,Y,Z)',
algo='old')
pts1, ind1 = out[0], out[2]
except Exception as err:
msg = (str(err) +
"\nFailed for {0}_{1}_{2}\n".format(typ,
c, n)
+ "\t- ii = {0}\n".format(ii)
+ "\t- Lim = {0}\n".format(obj.Lim)
+ "\t- ind = {0}\n".format(ind0)
+ "\t- algo = 'old'"
)
raise Exception(msg)
try:
print("ii, Computing pts 2")
print(ldomain[ii])
out = obj.get_sampleV(0.1, resMode='abs',
domain=ldomain[ii],
returnas='(X,Y,Z)',
algo='new')
pts2, ind2 = out[0], out[2]
except Exception as err:
msg = (str(err) +
"\nFailed for {0}_{1}_{2}\n".format(typ, c, n)
+ "\t- ii = {0}\n".format(ii)
+ "\t- Lim = {0}\n".format(obj.Lim)
+ "\t- domain = {0}\n".format(ldomain[ii])
+ "\t- algo = 'new'"
)
raise Exception(msg)
try:
print("Computing pts 3")
out = obj.get_sampleV(0.1, resMode='abs',
ind=ind0,
returnas='(X,Y,Z)',
algo='new')
pts3, ind3 = out[0], out[2]
except Exception as err:
msg = (str(err) +
"\nFailed for {0}_{1}_{2}\n".format(typ,
c, n)
+ "\t- ii = {0}\n".format(ii)
+ "\t- Lim = {0}\n".format(obj.Lim)
+ "\t- domain = {0}\n".format(ldomain[ii])
+ "\t- ind = {0}\n".format(ind0)
+ "\t- algo = 'new'"
)
raise Exception(msg)
if type(pts0) is list:
assert all([np.allclose(pts0[ii], pts1[ii])
for ii in range(0, len(pts0))])
assert all([np.allclose(pts0[ii], pts2[ii])
for ii in range(0, len(pts0))])
assert all([np.allclose(pts0[ii], pts3[ii])
for ii in range(0, len(pts0))])
else:
c0 = pts0.shape == pts1.shape
c1 = c0 and np.allclose(pts0, pts1)
if not c1:
msg = ("Volume sampling:\n"
+ "\t- bad reconstruction from ind\n"
+ "\t- (old algo)\n"
+ "\t- same shape: {}\n".format(c0)
+ "\t- np.allclose() {}\n".format(c1)
+ "\t- domain= {}\n".format(ldomain[ii])
+ "\t- ind = {}".format(ind0))
raise Exception(msg)
c0 = pts0.shape == pts2.shape
c1 = c0 and np.allclose(pts0, pts2)
if not c0:
lax = obj.plot()
lax[1].plot(pts0[0, :],
pts0[1, :], '.b') # x, y
lax[0].plot(np.sqrt(pts0[0, :]**2
+ pts0[1, :]**2),
pts0[2, :], '.r') # r, z
plt.title("pts0 : OLD")
plt.show(block=True)
lax = obj.plot()
lax[1].plot(pts2[0, :],
pts2[1, :], '.b') # x, y
lax[0].plot(np.sqrt(pts2[0, :]**2
+ pts2[1, :]**2),
pts2[2, :], '.r') # r, z
plt.title("pts2 : NEW")
plt.show(block=True)
n1 = pts0.shape
n2 = pts2.shape
msg = ("Volume sampling:\n"
+ "\t- no match old vs new algo\n"
+ "\t- same shape: {} ".format(c0)
+ "(old : {}, new: {})\n".format(n1,
n2)
+ "\t- np.allclose() {}\n".format(c1)
+ "\t- domain = {}".format(ldomain[ii]))
raise Exception(msg)
c0 = pts0.shape == pts3.shape
c1 = c0 and np.allclose(pts0, pts3)
if not c0:
msg = ("Volume sampling:\n"
+ "\t- bad reconstruction from ind\n"
+ "\t- (new algo)\n"
+ "\t- same shape: {}\n".format(c0)
+ "\t- np.allclose() {}\n".format(c1)
+ "\t- domain = {}".format(ldomain[ii])
+ "\t- ind = {}".format(ind0))
raise Exception(msg)
[docs] def test16_plot(self):
for typ in self.dobj.keys():
for c in self.dobj[typ].keys():
for n in self.dobj[typ][c].keys():
obj = self.dobj[typ][c][n]
lax = obj.plot(element='P', proj='all', draw=False)
lax = obj.plot(element='PIBsBvV', proj='all', draw=False)
lax = obj.plot(element='P', indices=True, draw=False)
plt.close('all')
[docs] def test17_plot_sino(self):
for typ in self.dobj.keys():
for c in self.dobj[typ].keys():
if issubclass(eval('tfg.%s'%c), tfg._core.StructOut):
continue
for n in self.dobj[typ][c].keys():
obj = self.dobj[typ][c][n]
lax = obj.plot_sino(Ang='xi', AngUnit='deg',
Sketch=True, draw=False)
lax = obj.plot_sino(Ang='theta', AngUnit='rad',
Sketch=False, draw=False, fs='a4')
plt.close('all')
[docs] def test18_saveload(self, verb=False):
for typ in self.dobj.keys():
for c in self.dobj[typ].keys():
for n in self.dobj[typ][c].keys():
obj = self.dobj[typ][c][n]
pfe = obj.save(return_pfe=True, verb=verb)
obj2 = tf.load(pfe, verb=verb)
assert obj==obj2
os.remove(pfe)
[docs] def test19_save_to_txt(self, verb=False):
for typ in self.dobj.keys():
for c in self.dobj[typ].keys():
for n in self.dobj[typ][c].keys():
obj = self.dobj[typ][c][n]
pfe = obj.save_to_txt(return_pfe=True, verb=verb)
os.remove(pfe)
#######################################################
#
# Creating Config objects and testing methods
#
#######################################################
# Define a dict dconfig holding all the typical Config we want to test
dconf = dict.fromkeys(dobj.keys())
for typ in dobj.keys():
# Get list of structures (lS) composing the config
lS = list(itt.chain.from_iterable([list(dobj[typ][c].values())
for c in dobj[typ].keys()]))
# Set the limits (none in toroidal geometry, [0., 10.] in linear geometry)
Lim = None if typ == 'Tor' else [0., 10.]
# Create config and store in dict
dconf[typ] = tfg.Config(Name='Test%s'%typ, Exp=_Exp,
lStruct=lS, Lim=Lim,
Type=typ, SavePath=_here)
[docs]class Test02_Config(object):
""" Class for testing the Config class and its methods
A Config class holds the geometrical configuration of a tokamak
It holds all the structural elements constituting it
It provides methods to plot, move them
"""
[docs] @classmethod
def setup_class(cls, dobj=dconf, verb=False):
#print("")
#print("--------- "+VerbHead+cls.__name__)
cls.dlpfe = {}
for typ in dobj.keys():
lS = dobj[typ].lStruct
lpfe = [os.path.join(ss.Id.SavePath, ss.Id.SaveName+'.npz')
for ss in lS]
for ss in lS:
ss.save(verb=verb)
cls.dlpfe[typ] = lpfe
cls.dobj = dobj
[docs] @classmethod
def teardown_class(cls):
#print("teardown_class() after any methods in this class")
for typ in cls.dlpfe.keys():
for f in cls.dlpfe[typ]:
os.remove(f)
[docs] def test01_todict(self):
for typ in self.dobj.keys():
d = self.dobj[typ].to_dict()
assert type(d) is dict
assert all([any([s in k for k in d.keys()]
for s in ['Id','geom','struct','sino','strip'])])
[docs] def test02_fromdict(self):
for typ in self.dobj.keys():
d = self.dobj[typ].to_dict()
obj = tfg.Config(fromdict=d)
assert isinstance(obj, tfg.Config)
[docs] def test03_copy_equal(self):
for typ in self.dobj.keys():
obj = self.dobj[typ].copy()
assert obj == self.dobj[typ]
assert not obj != self.dobj[typ]
[docs] def test04_get_nbytes(self):
for typ in self.dobj.keys():
nb, dnb = self.dobj[typ].get_nbytes()
[docs] def test05_strip_nbytes(self, verb=False):
lok = tfg.Config._dstrip['allowed']
nb = np.full((len(lok),), np.nan)
for typ in self.dobj.keys():
obj = self.dobj[typ]
for ii in lok:
obj.strip(ii, verb=verb)
nb[ii] = obj.get_nbytes()[0]
assert np.all(np.diff(nb)<0.)
for ii in lok[::-1]:
obj.strip(ii, verb=verb)
[docs] def test06_set_dsino(self):
for typ in self.dobj.keys():
self.dobj[typ].set_dsino([2.4,0.])
[docs] def test07_addremove_struct(self):
for typ in self.dobj.keys():
obj = self.dobj[typ]
n = [ss.Id.Name for ss in obj.lStruct if 'Baffle' in ss.Id.Name]
n = n[0]
B = obj.dStruct['dObj']['PFC'][n].copy()
assert n in obj.dStruct['dObj']['PFC'].keys()
assert n in obj.dextraprop['dvisible']['PFC'].keys()
assert hasattr(obj.PFC,n)
obj.remove_Struct('PFC',n)
assert n not in obj.dStruct['dObj']['PFC'].keys()
assert n not in obj.dextraprop['dvisible']['PFC'].keys()
try:
hasattr(obj.PFC,n)
except Exception as err:
assert err.__class__.__name__=='KeyError'
self.dobj[typ].add_Struct(struct=B,
dextraprop={'visible':True})
assert n in obj.dStruct['dObj']['PFC'].keys()
assert n in obj.dextraprop['dvisible']['PFC'].keys()
assert hasattr(obj.PFC,n)
[docs] def test08_setget_color(self):
for typ in self.dobj.keys():
col = self.dobj[typ].get_color()
for c in self.dobj[typ].dStruct['dObj'].keys():
eval("self.dobj[typ].%s.set_color('r')"%c)
[docs] def test09_get_summary(self):
for typ in self.dobj.keys():
self.dobj[typ].get_summary()
[docs] def test10_isInside(self, NR=20, NZ=20, NThet=10):
for typ in self.dobj.keys():
if typ=='Tor':
R = np.linspace(1,3,100)
Z = np.linspace(-1,1,100)
phi = np.pi/4.
pts = np.array([np.tile(R,Z.size),
np.repeat(Z,R.size),
np.full((R.size*Z.size),phi)])
In = '(R,Z,Phi)'
else:
X = 4.
Y = np.linspace(1,3,100)
Z = np.linspace(-1,1,100)
pts = np.array([np.full((Y.size*Z.size),X),
np.tile(Y,Z.size),
np.repeat(Z,Y.size)])
In = '(X,Y,Z)'
obj = self.dobj[typ]
ind = obj.isInside(pts, In=In)
if not ind.shape == (obj.nStruct, pts.shape[1]):
msg = "ind.shape = {0}".format(str(ind.shape))
msg += "\n But nStruct = {0}".format(obj.nStruct)
msg += "\n and npts = {0}".format(pts.shape[1])
raise Exception(msg)
[docs] def test11_setget_visible(self):
for typ in self.dobj.keys():
vis = self.dobj[typ].get_visible()
self.dobj[typ].CoilPF.set_visible(False)
[docs] def test12_plot(self):
for typ in self.dobj.keys():
n = [ss.Id.Name for ss in self.dobj[typ].lStruct
if 'Baffle' in ss.Id.Name][0]
eval("self.dobj[typ].PFC.%s.set_color('g')"%n)
lax = self.dobj[typ].plot()
plt.close('all')
[docs] def test13_plot_sino(self):
for typ in self.dobj.keys():
lax = self.dobj[typ].plot_sino()
plt.close('all')
[docs] def test14_from_svg(self):
pfe = os.path.join(_here, 'test_03_core_data', 'Inkscape.svg')
# to be solved when optional dependence svg.path is handled
# (or integrated)
conf = tfg.Config.from_svg(pfe, Name='Test', Exp='Test', res=10)
conf = tfg.Config.from_svg(
pfe, Name='Test', Exp='Test',
res=10, r0=-100, z0=-150, scale=0.01,
)
conf = tfg.Config.from_svg(
pfe, Name='Test', Exp='Test',
res=10, point_ref1=(0.7, -2), point_ref2=(2.8, 2),
)
conf = tfg.Config.from_svg(
pfe, Name='Test', Exp='Test',
res=10, point_ref1=(0.7, -2), length_ref=4.5,
)
[docs] def test15_load_config(self):
lc = sorted(tfg.utils._get_listconfig(returnas=dict).keys())
for cc in lc:
conf = tf.load_config(cc, strict=True)
[docs] def test16_calc_solidangle_particle(self):
conf = tf.load_config('AUG', strict=True)
pts = np.array([[2.5, 0., 0.], [2.5, 0., 0.5]])
theta = np.linspace(-1, 1, 4)*np.pi/4.
part_traj = np.array([
2.4*np.cos(theta),
2.4*np.sin(theta),
0*theta,
])
part_radius = np.array([1e-6, 10e-6, 100e-6, 1e-3])
out = conf.calc_solidangle_particle(
pts=pts,
part_traj=part_traj,
part_radius=part_radius,
)
[docs] def test17_calc_solidangle_particle_integrated(self):
conf = tf.load_config('WEST', strict=True)
theta = np.linspace(-1, 1, 4)*np.pi/4.
part_traj = np.array([
2.4*np.cos(theta),
2.4*np.sin(theta),
0*theta,
])
part_radius = np.array([1e-6, 10e-6, 100e-6, 1e-3])
out = conf.calc_solidangle_particle_integrated(
part_traj=part_traj,
part_radius=part_radius,
resolution=0.2,
)
plt.close('all')
[docs] def test18_saveload(self, verb=False):
for typ in self.dobj.keys():
self.dobj[typ].strip(-1)
pfe = self.dobj[typ].save(verb=verb, return_pfe=True)
obj = tf.load(pfe, verb=verb)
msg = "Unequal saved / loaded objects !"
assert obj==self.dobj[typ], msg
# Just to check the loaded version works fine
obj.strip(0, verb=verb)
os.remove(pfe)
#######################################################
#
# Creating Rays objects and testing methods
#
#######################################################
# Define a dict of cams to be tested
dCams = {}
foc = 0.08
DX = 0.05
for typ in dconf.keys():
dCams[typ] = {}
if typ=='Tor':
phi = np.pi/4.
eR = np.r_[np.cos(phi),np.sin(phi),0.]
ephi = np.r_[np.sin(phi),-np.cos(phi),0.]
R = 3.5
ph = np.r_[R*np.cos(phi),R*np.sin(phi),0.2]
else:
ph = np.r_[3.,4.,0.]
ez = np.r_[0.,0.,1.]
for c in ['CamLOS2D','CamLOS1D']:
if '1D' in c:
nP = 100
X = np.linspace(-DX,DX,nP)
if typ=='Tor':
D = (ph[:,np.newaxis] + foc*eR[:,np.newaxis]
+ X[np.newaxis,:]*ephi[:,np.newaxis])
else:
D = np.array([3.+X,
np.full((nP,),4.+foc),
np.full((nP,),0.02)])
else:
if typ=='Tor':
nP = 100
X = np.linspace(-DX,DX,nP)
D = (ph[:,np.newaxis] + foc*eR[:,np.newaxis]
+ np.repeat(X[::-1],nP)[np.newaxis,:]*ephi[:,np.newaxis]
+ np.tile(X,nP)[np.newaxis,:]*ez[:,np.newaxis])
else:
nP = 100
X = np.linspace(-DX,DX,nP)
D = np.array([np.repeat(3.+X[::-1],nP),
np.full((nP*nP,),4.+foc),
np.tile(0.01+X,nP)])
cls = eval("tfg.%s"%c)
dCams[typ][c] = cls(Name='V1000', config=dconf[typ],
dgeom={'pinhole':ph, 'D':D}, method="optimized",
Exp=_Exp, Diag='Test', SavePath=_here)
[docs]class Test03_Rays(object):
[docs] @classmethod
def setup_class(cls, dobj=dCams, verb=False):
#print ("")
#print "--------- "+VerbHead+cls.__name__
dlpfe = {}
for typ in dobj.keys():
dlpfe[typ] = {}
for c in dobj[typ].keys():
dlpfe[typ][c] = []
for s in dobj[typ][c].config.lStruct:
pfe = os.path.join(s.Id.SavePath,s.Id.SaveName+'.npz')
s.save(verb=verb)
dlpfe[typ][c].append(pfe)
dobj[typ][c].config.strip(-1)
dobj[typ][c].config.save(verb=verb)
dobj[typ][c].config.strip(0, verb=verb)
pfe = os.path.join(dobj[typ][c].config.Id.SavePath,
dobj[typ][c].config.Id.SaveName+'.npz')
dlpfe[typ][c].append(pfe)
cls.dobj = dobj
cls.dlpfe = dlpfe
[docs] @classmethod
def teardown_class(cls):
#print ("teardown_class() after any methods in this class")
pass
# for typ in cls.dobj.keys():
# for c in cls.dobj[typ].keys():
# for f in cls.dlpfe[typ][c]:
# try:
# os.remove(f)
# except Exception as err:
# msg = str(err)
# msg += '\n\n'+str(f)
# raise Exception(msg)
[docs] def setup(self):
#print ("TestUM:setup() before each test method")
pass
[docs] def teardown(self):
#print ("TestUM:teardown() after each test method")
pass
[docs] def test00_set_move(self):
for typ in self.dobj.keys():
if typ == 'Tor':
move = 'rotate_around_torusaxis'
kwd = {}
else:
move = 'translate_in_cross_section'
kwd = {'direction_rz': [1., 0., 0.]}
for c in self.dobj[typ].keys():
self.dobj[typ][c].set_move(move=move, **kwd)
[docs] def test01_todict(self):
for typ in self.dobj.keys():
for c in self.dobj[typ].keys():
d = self.dobj[typ][c].to_dict()
assert type(d) is dict
assert all([any([s in k for k in d.keys()]
for s in ['Id','geom','config',
'sino','chan','strip'])])
[docs] def test02_fromdict(self):
for typ in self.dobj.keys():
for c in self.dobj[typ].keys():
d = self.dobj[typ][c].to_dict()
obj = eval('tfg.%s(fromdict=d)'%c)
assert isinstance(obj, self.dobj[typ][c].__class__)
[docs] def test03_copy_equal(self):
for typ in self.dobj.keys():
for c in self.dobj[typ].keys():
obj = self.dobj[typ][c].copy()
assert obj == self.dobj[typ][c]
assert not obj != self.dobj[typ][c]
[docs] def test04_get_nbytes(self):
for typ in self.dobj.keys():
for c in self.dobj[typ].keys():
nb, dnb = self.dobj[typ][c].get_nbytes()
[docs] def test05_strip_nbytes(self, verb=False):
lok = tfg.Rays._dstrip['allowed']
nb = np.full((len(lok),), np.nan)
for typ in self.dobj.keys():
for c in self.dobj[typ].keys():
obj = self.dobj[typ][c]
for ii in lok:
obj.strip(ii, verb=verb)
nb[ii] = obj.get_nbytes()[0]
assert np.all(np.diff(nb)<0.)
for ii in lok[::-1]:
obj.strip(ii, verb=verb)
[docs] def test06_set_move_None(self):
for typ in self.dobj.keys():
for c in self.dobj[typ].keys():
self.dobj[typ][c].set_move()
[docs] def test07_rotate_copy(self):
for typ in self.dobj.keys():
if typ == 'Lin':
continue
dkwd0 = dict(axis_rz=[2.4, 0], angle=np.pi/4,
return_copy=True)
for c in self.dobj[typ].keys():
obj = getattr(self.dobj[typ][c],
'rotate_in_cross_section')(**dkwd0)
[docs] def test07_set_dsino(self):
for typ in self.dobj.keys():
for c in self.dobj[typ].keys():
self.dobj[typ][c].set_dsino([2.4,0.])
[docs] def test08_select(self):
for typ in self.dobj.keys():
for c in self.dobj[typ].keys():
n = [ss.Id.Name for ss in self.dobj[typ][c].config.lStruct
if 'Baffle' in ss.Id.Name][0]
ind = self.dobj[typ][c].select(touch='PFC_%s'%n)
ind = self.dobj[typ][c].select(touch=['PFC_%s'%n,[],[7,8,9]])
[docs] def test09_get_sample(self):
for typ in self.dobj.keys():
for c in self.dobj[typ].keys():
obj = self.dobj[typ][c]
Ds, us = obj.D[:], obj.u[:]
out = obj.get_sample(0.02, resMode='abs',
method='sum',DL=None)
k, res, lind = out
# nbrepet = np.r_[lind[0], np.diff(lind), k.size - lind[-1]]
# kus = k * np.repeat(us, nbrepet, axis=1)
# Pts = np.repeat(Ds, nbrepet, axis=1) + kus
k = np.asarray(np.split(k, lind))
assert len(res)==len(k)==obj.nRays
for ii in range(0,len(k)):
if not (np.isnan(obj.kIn[ii]) or np.isnan(obj.kOut[ii])):
ind = ~np.isnan(k[ii])
assert np.all((k[ii][ind]>=obj.kIn[ii]-res[ii])
& (k[ii][ind]<=obj.kOut[ii]+res[ii]))
assert np.all(res[~np.isnan(res)]<0.02)
out = obj.get_sample(0.1, resMode='rel',
method='simps',DL=[0,1])
k, res, lind = out
k = np.split(k, lind)
assert len(res)==len(k)==obj.nRays
for ii in range(0,len(k)):
if not (np.isnan(obj.kIn[ii]) or np.isnan(obj.kOut[ii])):
ind = ~np.isnan(k[ii])
if not np.all((k[ii][ind]>=obj.kIn[ii]-res[ii])
& (k[ii][ind]<=obj.kOut[ii]+res[ii])):
msg = typ+' '+c+' '+str(ii)
msg += "\n {0} {1}".format(obj.kIn[ii],obj.kOut[ii])
msg += "\n {0}".format(str(k[ii][ind]))
print(msg)
raise Exception(msg)
out = obj.get_sample(0.1, resMode='rel',
method='romb',DL=[0,1])
k, res, lind = out
k = np.split(k, lind)
assert len(res)==len(k)==obj.nRays
for ii in range(0,len(k)):
if not (np.isnan(obj.kIn[ii]) or np.isnan(obj.kOut[ii])):
ind = ~np.isnan(k[ii])
assert np.all((k[ii][ind]>=obj.kIn[ii]-res[ii])
& (k[ii][ind]<=obj.kOut[ii]+res[ii]))
[docs] def test10_calc_kInkOut_Isoflux(self):
nP = 10
r = np.linspace(0.1,0.4,nP)
theta = np.linspace(0.,2*np.pi,100)
lp2D = [np.array([2.4+r[ii]*np.cos(theta),
0.+r[ii]*np.sin(theta)]) for ii in range(0,nP)]
for typ in self.dobj.keys():
for c in self.dobj[typ].keys():
obj = self.dobj[typ][c]
kIn, kOut = obj.calc_kInkOut_Isoflux(lp2D)
assert kIn.shape == (nP, obj.nRays)
assert kOut.shape == (nP, obj.nRays)
for ii in range(0, nP):
ind = ~np.isnan(kIn[ii, :])
if not np.all((kIn[ii, ind] >= obj.kIn[ind])
& (kIn[ii, ind] <= obj.kOut[ind])):
msg = typ+' '+c+' '+str(ii)
msg += "\n {0} {1}".format(obj.kIn[ind], obj.kOut[ind])
msg += "\n {0}".format(str(kIn[ii, ind]))
raise Exception(msg)
ind = ~np.isnan(kOut[ii, :])
if not np.all((kOut[ii, ind] >= obj.kIn[ind])
& (kOut[ii, ind] <= obj.kOut[ind])):
msg = typ+' '+c+' '+str(ii)
msg += "\n {0} {1}".format(obj.kIn[ind], obj.kOut[ind])
msg += "\n {0}".format(str(kOut[ii, ind]))
raise Exception(msg)
ind = (~np.isnan(kIn[ii, :])) & (~np.isnan(kOut[ii, :]))
if not np.all(kIn[ii, ind] <= kOut[ii, ind]):
msg = typ+' '+c+' '+str(ii)
msg += "\n {0}".format(str(kIn[ii, ind]))
msg += "\n {0}".format(str(kOut[ii, ind]))
raise Exception(msg)
[docs] def test11_calc_signal(self):
def ffL(Pts, t=None, vect=None):
E = np.exp(-(Pts[1,:]-2.4)**2/0.1 - Pts[2,:]**2/0.1)
if vect is not None:
if np.asarray(vect).ndim==2:
E = E*vect[0,:]
else:
E = E*vect[0]
if t is not None:
E = E[np.newaxis,:]*t
return E
def ffT(Pts, t=None, vect=None):
E = np.exp(-(np.hypot(Pts[0,:],Pts[1,:])-2.4)**2/0.1
- Pts[2,:]**2/0.1)
if vect is not None:
if np.asarray(vect).ndim==2:
E = E*vect[0,:]
else:
E = E*vect[0]
if t is not None:
E = E[np.newaxis,:]*t
return E
ind = None#[0,10,20,30,40]
minimize = ["memory", "calls", "hybrid"]
for typ in self.dobj.keys():
c = 'CamLOS1D'
obj = self.dobj[typ][c]
for aa in [True, False]:
rm = 'rel'
# for rm in ["abs", "rel"]:
sigref, ii = None, 0
for dm in ["simps", "romb", "sum"]:
for mmz in minimize:
ff = ffT if obj.config.Id.Type == 'Tor' else ffL
t = np.arange(0, 10, 10)
connect = (hasattr(plt.get_current_fig_manager(),
'toolbar')
and getattr(plt.get_current_fig_manager(),
'toolbar')
is not None)
out = obj.calc_signal(ff, t=t, ani=aa,
fkwdargs={},
res=0.01, DL=None,
resMode=rm,
method=dm, minimize=mmz,
ind=ind,
plot=False, returnas=np.ndarray,
fs=(12, 6), connect=connect)
sig, units = out
assert not np.all(np.isnan(sig)), str(ii)
if sigref is not None:
assert np.allclose(sig, sigref)
if obj.nRays <= 100 and ii == 0:
sigref = sig
ii += 1
plt.close('all')
[docs] def test12_plot(self):
for typ in self.dobj.keys():
for c in self.dobj[typ].keys():
obj = self.dobj[typ][c]
if '2D' in c:
ind = np.arange(0,obj.nRays,100)
else:
ind = None
try:
lax = obj.plot(proj='all', element='LDIORP',
Leg='', draw=False)
lax = obj.plot(proj='cross', element='L',
Leg=None, draw=False)
lax = obj.plot(proj='hor', element='LDIO',
Leg='KD', draw=False)
except Exception as err:
pass
# msg = str(err)
# msg += typ+' '+c
# print(msg)
plt.close('all')
[docs] def test13_plot_sino(self):
for typ in self.dobj.keys():
for c in self.dobj[typ].keys():
obj = self.dobj[typ][c]
ax = obj.plot_sino()
plt.close('all')
[docs] def test14_plot_touch(self):
connect = (hasattr(plt.get_current_fig_manager(),'toolbar')
and getattr(plt.get_current_fig_manager(),'toolbar')
is not None)
for typ in self.dobj.keys():
for c in self.dobj[typ].keys():
obj = self.dobj[typ][c]
ind = np.arange(0,obj.nRays,100)
lax = obj.plot_touch(ind=ind, connect=connect)
plt.close('all')
[docs] def test15_saveload(self, verb=False):
for typ in self.dobj.keys():
for c in self.dobj[typ].keys():
obj = self.dobj[typ][c]
obj.strip(-1, verb=verb)
pfe = obj.save(verb=verb, return_pfe=True)
obj2 = tf.load(pfe, verb=verb)
msg = "Unequal saved / loaded objects !"
assert obj2==obj, msg
# Just to check the loaded version works fine
obj2.strip(0, verb=verb)
os.remove(pfe)
[docs] def test16_get_sample_same_res_unit(self):
dmeths = ['rel', 'abs']
qmeths = ['simps', 'romb', 'sum']
list_res = [0.25, np.r_[0.2, 0.5]]
DL = np.array([[1.,10.],[2.,20.]])
for dL in list_res:
for dm in dmeths:
for qm in qmeths:
out = tfg._GG.LOS_get_sample(2, dL, DL, dmethod=dm, method=qm)
k = out[0]
lind = out[2]
assert np.all(k[:lind[0]] >= DL[0][0])
assert np.all(k[:lind[0]] <= DL[1][0])
assert np.all(k[lind[0]:] >= DL[0][1])
assert np.all(k[lind[0]:] <= DL[1][1])
"""
class Test04_LOSCams(Test03_Rays):
@classmethod
def setup_class(cls):
#print ("")
#print "--------- "+VerbHead+cls.__name__
LVes = [Test01_Ves.VesLin]*3+[Test01_Ves.VesTor]*3
LS = [None, Test02_Struct.SL0, [Test02_Struct.SL0,Test02_Struct.SL1],
None, Test02_Struct.ST0, [Test02_Struct.ST0,Test02_Struct.ST1]]
cls.LObj = [None for vv in LVes]
N = 50
cls.N = N
for ii in range(0,len(LVes)):
P1M = LVes[ii].geom['P1Max'][0]
dchans = {'Name':['{0:02.0f}'.format(jj) for jj in range(0,N)]}
if ii%2==0:
Ds = np.array([np.linspace(-0.5,0.5,N),
np.full((N,),(0.95+0.3*ii/len(LVes))*P1M),
np.zeros((N,))])
us = np.array([np.linspace(-0.5,0.5,N),
-np.ones((N,)),
np.linspace(-0.5,0.5,N)])
cls.LObj[ii] = tfg.LOSCam1D('Test'+str(ii), (Ds,us), Ves=LVes[ii],
LStruct=LS[ii], Exp=None, Diag='Test',
SavePath=here, dchans=dchans)
else:
Ds = np.array([np.repeat(np.linspace(-0.5,0.5,int(N/10)),10),
np.full((N,),(0.95+0.3*ii/len(LVes))*P1M),
np.tile(np.linspace(-0.1,0.1,10),int(N/10))])
us = np.array([np.linspace(-0.5,0.5,N),
-np.ones((N,)),
np.linspace(-0.5,0.5,N)])
cls.LObj[ii] = tfg.LOSCam2D('Test'+str(ii), (Ds,us), Ves=LVes[ii],
LStruct=LS[ii], Exp=None, Diag='Test',
SavePath=here, dchans=dchans)
def test01_select(self):
for ii in range(0,len(self.LObj)):
if self.LObj[ii].LStruct is None:
el = 'Ves'
else:
el = self.LObj[ii].LStruct[-1].Id.Name
ind = self.LObj[ii].select(touch=el)
ind = self.LObj[ii].select(key='Name', val='15', out=bool)
ind = self.LObj[ii].select(key='Name', val=['02','35'], out=int)
"""
"""
#######################################################
#
# Creating Lens and Apert objects and testing methods
#
#######################################################
class Test09_LensTor:
@classmethod
def setup_class(cls, Ves=VesTor):
print ("")
print "--------- "+VerbHead+cls.__name__
O = np.array([0.,Ves._P1Max[0],Ves._P2Max[1]])
nIn = np.array([0.,-1.,-1.])
Rad, F1 = 0.05, 0.05
cls.Obj = tfg.Lens('Test', O, nIn, Rad, F1, Ves=Ves, Type='Sph', Exp='AUG', Diag='Test', shot=0, SavePath=Root+Addpath)
@classmethod
def teardown_class(cls):
#print ("teardown_class() after any methods in this class")
pass
def setup(self):
#print ("TestUM:setup() before each test method")
pass
def teardown(self):
#print ("TestUM:teardown() after each test method")
pass
def test01_plot_alone(self):
Lax = self.Obj.plot_alone(V='red', nin=1.5, nout=1., Lmax='F', V_NP=50, src=None, draw=False, a4=False, Test=True)
Lax = self.Obj.plot_alone(V='red', nin=1.5, nout=1., Lmax='F', V_NP=50, src={'Pt':[0.1,0.005], 'Type':'Pt', 'nn':[-1.,-0.005], 'NP':10}, draw=False, a4=False, Test=True)
Lax = self.Obj.plot_alone(V='red', nin=1.5, nout=1., Lmax='F', V_NP=50, src={'Pt':[0.1,0.005], 'Type':'Lin', 'nn':[-1.,-0.005], 'NP':10}, draw=False, a4=False, Test=True)
plt.close('all')
def test02_plot(self):
Lax = self.Obj.plot(Proj='All', Elt='PV', EltVes='P', draw=False, a4=False, Test=True)
Lax = self.Obj.plot(Proj='Cross', Elt='P', EltVes='', draw=False, a4=False, Test=True)
Lax = self.Obj.plot(Proj='Hor', Elt='V', EltVes='P', draw=False, a4=False, Test=True)
plt.close('all')
def test03_saveload(self):
self.Obj.save(verb=False)
obj = tfpf.Open(self.Obj.Id.SavePath + self.Obj.Id.SaveName + '.npz')
os.remove(self.Obj.Id.SavePath + self.Obj.Id.SaveName + '.npz')
class Test10_LensLin:
@classmethod
def setup_class(cls, Ves=VesLin):
print ("")
print "--------- "+VerbHead+cls.__name__
O = np.array([0.5,Ves._P1Max[0],Ves._P2Max[1]])
nIn = np.array([0.,-1.,-1.])
Rad, F1 = 0.05, 0.05
cls.Obj = tfg.Lens('Test', O, nIn, Rad, F1, Ves=Ves, Type='Sph', Exp='AUG', Diag='Test', shot=0, SavePath=Root+Addpath)
@classmethod
def teardown_class(cls):
#print ("teardown_class() after any methods in this class")
pass
def setup(self):
#print ("TestUM:setup() before each test method")
pass
def teardown(self):
#print ("TestUM:teardown() after each test method")
pass
def test01_plot_alone(self):
Lax = self.Obj.plot_alone(V='red', nin=1.5, nout=1., Lmax='F', V_NP=50, src=None, draw=False, a4=False, Test=True)
Lax = self.Obj.plot_alone(V='red', nin=1.5, nout=1., Lmax='F', V_NP=50, src={'Pt':[0.1,0.005], 'Type':'Pt', 'nn':[-1.,-0.005], 'NP':10}, draw=False, a4=False, Test=True)
Lax = self.Obj.plot_alone(V='red', nin=1.5, nout=1., Lmax='F', V_NP=50, src={'Pt':[0.1,0.005], 'Type':'Lin', 'nn':[-1.,-0.005], 'NP':10}, draw=False, a4=False, Test=True)
plt.close('all')
def test02_plot(self):
Lax = self.Obj.plot(Proj='All', Elt='PV', EltVes='P', draw=False, a4=False, Test=True)
Lax = self.Obj.plot(Proj='Cross', Elt='P', EltVes='', draw=False, a4=False, Test=True)
Lax = self.Obj.plot(Proj='Hor', Elt='V', EltVes='P', draw=False, a4=False, Test=True)
plt.close('all')
def test03_saveload(self):
self.Obj.save(verb=False)
obj = tfpf.Open(self.Obj.Id.SavePath + self.Obj.Id.SaveName + '.npz')
os.remove(self.Obj.Id.SavePath + self.Obj.Id.SaveName + '.npz')
class Test11_ApertTor:
@classmethod
def setup_class(cls, Ves=VesLin):
print ("")
print "--------- "+VerbHead+cls.__name__
O = np.array([0.,Ves._P1Max[0],0.5*Ves._P2Max[1]])
Poly = np.array([O[0] + 0.01*np.array([-1,1,1,-1]), O[1] + np.zeros((4,)), O[2] + 0.005*np.array([-1,-1,1,1])])
cls.Obj = tfg.Apert('Test', Poly, Ves=Ves, Exp='AUG', Diag='Test', shot=0, SavePath=Root+Addpath)
@classmethod
def teardown_class(cls):
#print ("teardown_class() after any methods in this class")
pass
def setup(self):
#print ("TestUM:setup() before each test method")
pass
def teardown(self):
#print ("TestUM:teardown() after each test method")
pass
def test01_plot(self):
Lax = self.Obj.plot(Proj='All', Elt='PV', EltVes='P', draw=False, a4=False, Test=True)
Lax = self.Obj.plot(Proj='Cross', Elt='P', EltVes='', draw=False, a4=False, Test=True)
Lax = self.Obj.plot(Proj='Hor', Elt='V', EltVes='P', draw=False, a4=False, Test=True)
plt.close('all')
def test02_saveload(self):
self.Obj.save(verb=False)
obj = tfpf.Open(self.Obj.Id.SavePath + self.Obj.Id.SaveName + '.npz')
os.remove(self.Obj.Id.SavePath + self.Obj.Id.SaveName + '.npz')
class Test12_ApertLin:
@classmethod
def setup_class(cls, Ves=VesLin):
print ("")
print "--------- "+VerbHead+cls.__name__
O = np.array([0.5,Ves._P1Max[0],0.5*Ves._P2Max[1]])
Poly = np.array([O[0] + 0.01*np.array([-1,1,1,-1]), O[1] + np.zeros((4,)), O[2] + 0.005*np.array([-1,-1,1,1])])
cls.Obj = tfg.Apert('Test', Poly, Ves=Ves, Exp='AUG', Diag='Test', shot=0, SavePath=Root+Addpath)
@classmethod
def teardown_class(cls):
#print ("teardown_class() after any methods in this class")
pass
def setup(self):
#print ("TestUM:setup() before each test method")
pass
def teardown(self):
#print ("TestUM:teardown() after each test method")
pass
def test01_plot(self):
Lax = self.Obj.plot(Proj='All', Elt='PV', EltVes='P', draw=False, a4=False, Test=True)
Lax = self.Obj.plot(Proj='Cross', Elt='P', EltVes='', draw=False, a4=False, Test=True)
Lax = self.Obj.plot(Proj='Hor', Elt='V', EltVes='P', draw=False, a4=False, Test=True)
plt.close('all')
def test02_saveload(self):
self.Obj.save(verb=False)
obj = tfpf.Open(self.Obj.Id.SavePath + self.Obj.Id.SaveName + '.npz')
os.remove(self.Obj.Id.SavePath + self.Obj.Id.SaveName + '.npz')
###########################################################
#
# Creating Detect objects and testing methods (Apert and Lens, Tor and Lin)
#
###########################################################
class Test13_DetectApertTor:
@classmethod
def setup_class(cls, Ves=VesTor):
print ("")
print "--------- "+VerbHead+cls.__name__
Out = np.load(Root+Addpath+'L_009.npz')
Poly, PAp0, PAp1 = Out['Poly'], Out['PolyAp0'], Out['PolyAp1']
Ap0 = tfg.Apert('Test0', PAp0, Ves=Ves, Exp='AUG', Diag='Test', shot=0, SavePath=Root+Addpath)
Ap1 = tfg.Apert('Test1', PAp1, Ves=Ves, Exp='AUG', Diag='Test', shot=0, SavePath=Root+Addpath)
cls.Obj = tfg.Detect('Test', Poly, Optics=[Ap0,Ap1], Ves=Ves, Exp='AUG', Diag='Test', shot=0, SavePath=Root+Addpath,
Etend_Method='quad', Etend_RelErr=1.e-2,
Cone_DRY=0.005, Cone_DXTheta=np.pi/512., Cone_DZ=0.005)
@classmethod
def teardown_class(cls):
#print ("teardown_class() after any methods in this class")
pass
def setup(self):
#print ("TestUM:setup() before each test method")
pass
def teardown(self):
#print ("TestUM:teardown() after each test method")
pass
def test01_refine_ConePoly(self):
self.Obj.refine_ConePoly( Proj='Cross', indPoly=0, Verb=False)
def test02_isInside(self, NR=10,NZ=10):
R = np.linspace(self.Obj.Ves._P1Min[0],self.Obj.Ves._P1Max[0],NR)
Z = np.linspace(self.Obj.Ves._P2Min[0],self.Obj.Ves._P2Max[0],NZ)
Pts = np.array([np.tile(R,(NZ,1)).flatten(), np.tile(Z,(NR,1)).T.flatten()])
indRZ = self.Obj.isInside(Pts, In='(R,Z)', Test=True)
Thet = np.pi/4.
Pts = np.array([Pts[0,:]*np.cos(Thet), Pts[0,:]*np.sin(Thet), Pts[1,:]])
ind = self.Obj.isInside(Pts, In='(X,Y,Z)', Test=True)
assert np.all(indRZ==ind)
def test03_calc_SAngVect(self, NR=10,NZ=10):
R = np.linspace(self.Obj.Ves._P1Min[0],self.Obj.Ves._P1Max[0],NR)
Z = np.linspace(self.Obj.Ves._P2Min[0],self.Obj.Ves._P2Max[0],NZ)
Pts = np.array([np.tile(R,(NZ,1)).flatten(), np.tile(Z,(NR,1)).T.flatten()])
SAngRZ1, VectRZ1 = self.Obj.calc_SAngVect(Pts, In='(R,Z)', Colis=False, Test=True)
SAngRZ, VectRZ = self.Obj.calc_SAngVect(Pts, In='(R,Z)', Colis=True, Test=True)
Thet = np.arctan2(self.Obj.LOS[self.Obj._LOSRef]['PRef'][1],self.Obj.LOS[self.Obj._LOSRef]['PRef'][0])
Pts = np.array([Pts[0,:]*np.cos(Thet), Pts[0,:]*np.sin(Thet), Pts[1,:]])
SAng1, Vect1 = self.Obj.calc_SAngVect(Pts, In='(X,Y,Z)', Colis=False, Test=True)
SAng, Vect = self.Obj.calc_SAngVect(Pts, In='(X,Y,Z)', Colis=True, Test=True)
ind1RZ0, ind10 = SAngRZ1>0, SAng1>0.
indRZ0, ind0 = SAngRZ>0., SAng>0.
assert np.all(ind1RZ0==ind10)
assert np.all(indRZ0==ind0)
assert np.all(SAngRZ1==SAng1) and np.all(VectRZ1[:,ind10]==Vect1[:,ind10])
assert np.all(SAngRZ==SAng) and np.all(VectRZ[:,ind0]==Vect[:,ind0])
def test04_calc_Sig(self):
func = lambda Pts, A=1.: A*np.exp(-(((np.hypot(Pts[0,:],Pts[1,:])-1.7)/0.3)**2 + ((Pts[2,:]-0.)/0.5)**2))
Sig1 = self.Obj.calc_Sig(func, extargs={'A':1.}, Method='Vol', Mode='simps', PreComp=True, Colis=True, dX12=[0.005, 0.005], dX12Mode='abs', ds=0.005, dsMode='abs', MarginS=0.001)
Sig2 = self.Obj.calc_Sig(func, extargs={'A':1.}, Method='Vol', Mode='sum', PreComp=False, Colis=True, dX12=[0.005, 0.005], dX12Mode='abs', ds=0.005, dsMode='abs', MarginS=0.001)
Sig3 = self.Obj.calc_Sig(func, extargs={'A':1.}, Method='LOS', Mode='trapz', PreComp=True, Colis=True, ds=0.005, dsMode='abs', MarginS=0.001)
Sig4 = self.Obj.calc_Sig(func, extargs={'A':1.}, Method='LOS', Mode='quad', PreComp=False, Colis=True, epsrel=1.e-4, MarginS=0.001)
assert np.abs(Sig1-Sig2)<0.001*min(Sig1,Sig2), str(Sig1)+" vs "+str(Sig2)
assert np.abs(Sig3-Sig4)<0.001*min(Sig3,Sig4), str(Sig3)+" vs "+str(Sig4)
def test05_debug_Etendue_BenchmarkRatioMode(self):
Etends, Ratio, RelErr, dX12, dX12Mode, Colis = self.Obj._debug_Etendue_BenchmarkRatioMode(RelErr=1.e-3, Ratio=[0.01,0.1], Modes=['simps','quad'], dX12=[0.002,0.002], dX12Mode='abs', Colis=True)
for kk in Etends.keys():
assert all([np.abs(ee-Etends[kk][0,0])<0.01*Etends[kk][0,0] for ee in Etends[kk][0,:]]), str(Etends[kk][0,:])
#def test06_calc_Etendue_AlongLOS(self):
# Etends, Ps, k, LOSRef = self.Obj.calc_Etendue_AlongLOS(Length='', NP=5, kMode='rel', Modes=['trapz','quad'], RelErr=1.e-3, dX12=[0.005, 0.005], dX12Mode='abs', Ratio=0.02, Colis=True, Test=True)
#def test07_calc_SAngNb(self):
# SA, ind, Pts = self.Obj.calc_SAngNb(Pts=None, Proj='Cross', Slice='Int', DRY=None, DXTheta=None, DZ=None, Colis=True)
# SA, ind, Pts = self.Obj.calc_SAngNb(Pts=None, Proj='Hor', Slice='Int', DRY=None, DXTheta=None, DZ=None, Colis=True)
# SA, ind, Pts = self.Obj.calc_SAngNb(Pts=None, Proj='Cross', Slice='Int', DRY=None, DXTheta=None, DZ=None, Colis=False)
# SA, ind, Pts = self.Obj.calc_SAngNb(Pts=None, Proj='Hor', Slice='Int', DRY=None, DXTheta=None, DZ=None, Colis=False)
def test08_set_Res(self):
self.Obj._set_Res(CrossMesh=[0.1,0.1], CrossMeshMode='abs', Mode='Iso', Amp=1., Deg=0, steps=0.01, Thres=0.05, ThresMode='rel', ThresMin=0.01,
IntResCross=[0.1,0.1], IntResCrossMode='rel', IntResLong=0.1, IntResLongMode='rel', Eq=None, Ntt=50, EqName=None, save=False, Test=True)
def test09_plot(self):
Lax = self.Obj.plot(Proj='All', Elt='PV', EltVes='P', draw=False, a4=False, Test=True)
Lax = self.Obj.plot(Proj='Cross', Elt='PC', EltVes='', draw=False, a4=False, Test=True)
Lax = self.Obj.plot(Proj='Hor', Elt='PVC', EltVes='P', draw=False, a4=False, Test=True)
plt.close('all')
def test10_plot_SAngNb(self):
Lax = self.Obj.plot_SAngNb(Lax=None, Proj='Cross', Slice='Int', Pts=None, plotfunc='scatter', DRY=None, DXTheta=None, DZ=None, Elt='P', EltVes='P', EltLOS='L', EltOptics='P', Colis=True, a4=False, draw=False, Test=True)
Lax = self.Obj.plot_SAngNb(Lax=None, Proj='Hor', Slice='Max', Pts=None, plotfunc='scatter', DRY=None, DXTheta=None, DZ=None, Elt='P', EltVes='P', EltLOS='', EltOptics='P', Colis=True, a4=False, draw=False, Test=True)
plt.close('all')
def test11_debug_plot_SAng_OnPlanePerp(self):
ax = self.Obj._debug_plot_SAng_OnPlanePerp(ax=None, Pos=tfd.DetSAngPlRa, dX12=tfd.DetSAngPldX12, dX12Mode=tfd.DetSAngPldX12Mode, Ratio=tfd.DetSAngPlRatio, Colis=True, draw=False, a4=False, Test=True)
plt.close('all')
def test12_plot_Etend_AlongLOS(self):
ax = self.Obj.plot_Etend_AlongLOS(ax=None, NP=5, kMode='rel', Modes=['trapz','simps'], dX12=[0.005, 0.005], dX12Mode='abs', Ratio=0.02, LOSPts=True, Colis=True, draw=False, a4=True, Test=True)
ax = self.Obj.plot_Etend_AlongLOS(ax=None, NP=5, kMode='rel', Modes=['quad'], RelErr=1.e-3, Ratio=0.01, LOSPts=True, Colis=False, draw=False, a4=False, Test=True)
plt.close('all')
def test13_plot_Sinogram(self):
ax = self.Obj.plot_Sinogram(ax=None, Proj='Cross', Elt='DLV', Ang='theta', AngUnit='rad', Sketch=True, LOSRef=None, draw=False, a4=False, Test=True)
ax = self.Obj.plot_Sinogram(ax=None, Proj='Cross', Elt='DLV', Ang='xi', AngUnit='deg', Sketch=False, LOSRef=None, draw=False, a4=True, Test=True)
plt.close('all')
def test14_plot_Res(self):
ax = self.Obj._plot_Res(ax=None, plotfunc='scatter', NC=20, draw=False, a4=False, Test=True)
ax = self.Obj._plot_Res(ax=None, plotfunc='contourf', NC=20, draw=False, a4=True, Test=True)
plt.close('all')
def test15_saveload(self):
self.Obj.save(verb=False)
obj = tfpf.Open(self.Obj.Id.SavePath + self.Obj.Id.SaveName + '.npz')
os.remove(self.Obj.Id.SavePath + self.Obj.Id.SaveName + '.npz')
def shiftthet(poly, thetobj=0.):
thet, R = np.arctan2(poly[1,:],poly[0,:]), np.hypot(poly[1,:],poly[0,:])
extthet = thetobj-np.mean(thet)
return np.array([R*np.cos(thet+extthet), R*np.sin(thet+extthet), poly[2,:]])
class Test14_DetectApertLin:
@classmethod
def setup_class(cls, Ves=VesLin):
print ("")
print "--------- "+VerbHead+cls.__name__
Out = np.load(Root+Addpath+'G_015.npz')
Poly, PAp0, PAp1 = Out['Poly'], Out['PolyAp0'], Out['PolyAp1']
Poly = shiftthet(Poly, thetobj=np.pi/2.)
PAp0, PAp1 = shiftthet(PAp0, thetobj=np.pi/2.), shiftthet(PAp1, thetobj=np.pi/2.)
Ap0 = tfg.Apert('Test0', PAp0, Ves=Ves, Exp='AUG', Diag='Test', shot=0, SavePath=Root+Addpath)
Ap1 = tfg.Apert('Test1', PAp1, Ves=Ves, Exp='AUG', Diag='Test', shot=0, SavePath=Root+Addpath)
cls.Obj = tfg.Detect('Test', Poly, Optics=[Ap0,Ap1], Ves=Ves, Exp='AUG', Diag='Test', shot=0, SavePath=Root+Addpath,
Etend_Method='quad', Etend_RelErr=1.e-2,
Cone_DRY=0.005, Cone_DXTheta=0.005, Cone_DZ=0.005)
@classmethod
def teardown_class(cls):
#print ("teardown_class() after any methods in this class")
pass
def setup(self):
#print ("TestUM:setup() before each test method")
pass
def teardown(self):
#print ("TestUM:teardown() after each test method")
pass
def test01_refine_ConePoly(self):
self.Obj.refine_ConePoly( Proj='Cross', indPoly=0, Verb=False)
def test02_isInside(self, NR=10,NZ=10):
R = np.linspace(self.Obj.Ves._P1Min[0],self.Obj.Ves._P1Max[0],NR)
Z = np.linspace(self.Obj.Ves._P2Min[0],self.Obj.Ves._P2Max[0],NZ)
Pts = np.array([np.tile(R,(NZ,1)).flatten(), np.tile(Z,(NR,1)).T.flatten()])
indRZ = self.Obj.isInside(Pts, In='(Y,Z)', Test=True)
Thet = 0.
Pts = np.array([Thet*np.ones((Pts.shape[1],)), Pts[0,:], Pts[1,:]])
ind = self.Obj.isInside(Pts, In='(X,Y,Z)', Test=True)
assert np.all(indRZ==ind)
def test03_calc_SAngVect(self, NR=10,NZ=10):
R = np.linspace(self.Obj.Ves._P1Min[0],self.Obj.Ves._P1Max[0],NR)
Z = np.linspace(self.Obj.Ves._P2Min[0],self.Obj.Ves._P2Max[0],NZ)
Pts = np.array([np.tile(R,(NZ,1)).flatten(), np.tile(Z,(NR,1)).T.flatten()])
SAngRZ1, VectRZ1 = self.Obj.calc_SAngVect(Pts, In='(Y,Z)', Colis=False, Test=True)
SAngRZ, VectRZ = self.Obj.calc_SAngVect(Pts, In='(Y,Z)', Colis=True, Test=True)
Thet = self.Obj.LOS[self.Obj._LOSRef]['PRef'][0]
Pts = np.array([Thet*np.ones((Pts.shape[1],)), Pts[0,:], Pts[1,:]])
SAng1, Vect1 = self.Obj.calc_SAngVect(Pts, In='(X,Y,Z)', Colis=False, Test=True)
SAng, Vect = self.Obj.calc_SAngVect(Pts, In='(X,Y,Z)', Colis=True, Test=True)
ind1RZ0, ind10 = SAngRZ1>0, SAng1>0.
indRZ0, ind0 = SAngRZ>0., SAng>0.
assert np.all(ind1RZ0==ind10)
assert np.all(indRZ0==ind0)
assert np.all(SAngRZ1==SAng1) and np.all(VectRZ1[:,ind10]==Vect1[:,ind10])
assert np.all(SAngRZ==SAng) and np.all(VectRZ[:,ind0]==Vect[:,ind0])
def test04_calc_Sig(self):
func = lambda Pts, A=1.: A*np.exp(-(((Pts[1,:]-1.7)/0.3)**2 + ((Pts[2,:]-0.)/0.5)**2))
Sig1 = self.Obj.calc_Sig(func, extargs={'A':1.}, Method='Vol', Mode='simps', PreComp=True, Colis=True, dX12=[0.005, 0.005], dX12Mode='abs', ds=0.005, dsMode='abs', MarginS=0.001)
Sig2 = self.Obj.calc_Sig(func, extargs={'A':1.}, Method='Vol', Mode='sum', PreComp=False, Colis=True, dX12=[0.005, 0.005], dX12Mode='abs', ds=0.005, dsMode='abs', MarginS=0.001)
Sig3 = self.Obj.calc_Sig(func, extargs={'A':1.}, Method='LOS', Mode='trapz', PreComp=True, Colis=True, ds=0.005, dsMode='abs', MarginS=0.001)
Sig4 = self.Obj.calc_Sig(func, extargs={'A':1.}, Method='LOS', Mode='quad', PreComp=False, Colis=True, epsrel=1.e-4, MarginS=0.001)
assert np.abs(Sig1-Sig2)<0.001*min(Sig1,Sig2), str(Sig1)+" vs "+str(Sig2)
assert np.abs(Sig3-Sig4)<0.001*min(Sig3,Sig4), str(Sig3)+" vs "+str(Sig4)
def test05_debug_Etendue_BenchmarkRatioMode(self):
Etends, Ratio, RelErr, dX12, dX12Mode, Colis = self.Obj._debug_Etendue_BenchmarkRatioMode(RelErr=1.e-3, Ratio=[0.01,0.1], Modes=['simps','quad'], dX12=[0.002,0.002], dX12Mode='abs', Colis=True)
for kk in Etends.keys():
assert all([np.abs(ee-Etends[kk][0,0])<0.01*Etends[kk][0,0] for ee in Etends[kk][0,:]]), str(Etends[kk][0,:])
#def test06_calc_Etendue_AlongLOS(self):
# Etends, Ps, k, LOSRef = self.Obj.calc_Etendue_AlongLOS(Length='', NP=5, kMode='rel', Modes=['trapz','quad'], RelErr=1.e-3, dX12=[0.005, 0.005], dX12Mode='abs', Ratio=0.02, Colis=True, Test=True)
#def test07_calc_SAngNb(self):
# SA, ind, Pts = self.Obj.calc_SAngNb(Pts=None, Proj='Cross', Slice='Int', DRY=None, DXTheta=None, DZ=None, Colis=True)
# SA, ind, Pts = self.Obj.calc_SAngNb(Pts=None, Proj='Hor', Slice='Int', DRY=None, DXTheta=None, DZ=None, Colis=True)
# SA, ind, Pts = self.Obj.calc_SAngNb(Pts=None, Proj='Cross', Slice='Int', DRY=None, DXTheta=None, DZ=None, Colis=False)
# SA, ind, Pts = self.Obj.calc_SAngNb(Pts=None, Proj='Hor', Slice='Int', DRY=None, DXTheta=None, DZ=None, Colis=False)
def test08_set_Res(self):
self.Obj._set_Res(CrossMesh=[0.1,0.1], CrossMeshMode='abs', Mode='Iso', Amp=1., Deg=0, steps=0.01, Thres=0.05, ThresMode='rel', ThresMin=0.01,
IntResCross=[0.1,0.1], IntResCrossMode='rel', IntResLong=0.1, IntResLongMode='rel', Eq=None, Ntt=50, EqName=None, save=False, Test=True)
def test09_plot(self):
Lax = self.Obj.plot(Proj='All', Elt='PV', EltVes='P', draw=False, a4=False, Test=True)
Lax = self.Obj.plot(Proj='Cross', Elt='PC', EltVes='', draw=False, a4=False, Test=True)
Lax = self.Obj.plot(Proj='Hor', Elt='PVC', EltVes='P', draw=False, a4=False, Test=True)
plt.close('all')
def test10_plot_SAngNb(self):
Lax = self.Obj.plot_SAngNb(Lax=None, Proj='Cross', Slice='Int', Pts=None, plotfunc='scatter', DRY=None, DXTheta=None, DZ=None, Elt='P', EltVes='P', EltLOS='L', EltOptics='P', Colis=True, a4=False, draw=False, Test=True)
Lax = self.Obj.plot_SAngNb(Lax=None, Proj='Hor', Slice='Max', Pts=None, plotfunc='scatter', DRY=None, DXTheta=None, DZ=None, Elt='P', EltVes='P', EltLOS='', EltOptics='P', Colis=True, a4=False, draw=False, Test=True)
plt.close('all')
def test11_debug_plot_SAng_OnPlanePerp(self):
ax = self.Obj._debug_plot_SAng_OnPlanePerp(ax=None, Pos=tfd.DetSAngPlRa, dX12=tfd.DetSAngPldX12, dX12Mode=tfd.DetSAngPldX12Mode, Ratio=tfd.DetSAngPlRatio, Colis=True, draw=False, a4=False, Test=True)
plt.close('all')
def test12_plot_Etend_AlongLOS(self):
ax = self.Obj.plot_Etend_AlongLOS(ax=None, NP=5, kMode='rel', Modes=['trapz','simps'], dX12=[0.005, 0.005], dX12Mode='abs', Ratio=0.02, LOSPts=True, Colis=True, draw=False, a4=True, Test=True)
ax = self.Obj.plot_Etend_AlongLOS(ax=None, NP=5, kMode='rel', Modes=['quad'], RelErr=1.e-3, Ratio=0.01, LOSPts=True, Colis=False, draw=False, a4=False, Test=True)
plt.close('all')
def test13_plot_Sinogram(self):
ax = self.Obj.plot_Sinogram(ax=None, Proj='Cross', Elt='DLV', Ang='theta', AngUnit='rad', Sketch=True, LOSRef=None, draw=False, a4=False, Test=True)
ax = self.Obj.plot_Sinogram(ax=None, Proj='Cross', Elt='DLV', Ang='xi', AngUnit='deg', Sketch=False, LOSRef=None, draw=False, a4=True, Test=True)
plt.close('all')
def test14_plot_Res(self):
ax = self.Obj._plot_Res(ax=None, plotfunc='scatter', NC=20, draw=False, a4=False, Test=True)
ax = self.Obj._plot_Res(ax=None, plotfunc='contourf', NC=20, draw=False, a4=True, Test=True)
plt.close('all')
def test15_saveload(self):
self.Obj.save(verb=False)
obj = tfpf.Open(self.Obj.Id.SavePath + self.Obj.Id.SaveName + '.npz')
os.remove(self.Obj.Id.SavePath + self.Obj.Id.SaveName + '.npz')
class Test15_DetectLensTor:
@classmethod
def setup_class(cls, Ves=VesTor):
print ("")
print "--------- "+VerbHead+cls.__name__
Out = np.load(Root+Addpath+'G_015.npz')
O = np.array([0.,Ves._P1Max[0],Ves._P2Max[1]])
nIn = np.array([0.,-1.,-1.])
Rad, F1 = 0.005, 0.010
Lens = tfg.Lens('Test', O, nIn, Rad, F1, Ves=Ves, Type='Sph', Exp='AUG', Diag='Test', shot=0, SavePath=Root+Addpath)
cls.Obj = tfg.Detect('Test', {'Rad':0.001}, Optics=Lens, Ves=Ves, Exp='AUG', Diag='Test', shot=0, SavePath=Root+Addpath,
Etend_Method='quad', Etend_RelErr=1.e-2,
Cone_DRY=0.005, Cone_DXTheta=np.pi/512., Cone_DZ=0.005)
@classmethod
def teardown_class(cls):
#print ("teardown_class() after any methods in this class")
pass
def setup(self):
#print ("TestUM:setup() before each test method")
pass
def teardown(self):
#print ("TestUM:teardown() after each test method")
pass
def test01_refine_ConePoly(self):
self.Obj.refine_ConePoly( Proj='Cross', indPoly=0, Verb=False)
def test02_isInside(self, NR=10,NZ=10):
R = np.linspace(self.Obj.Ves._P1Min[0],self.Obj.Ves._P1Max[0],NR)
Z = np.linspace(self.Obj.Ves._P2Min[0],self.Obj.Ves._P2Max[0],NZ)
Pts = np.array([np.tile(R,(NZ,1)).flatten(), np.tile(Z,(NR,1)).T.flatten()])
indRZ = self.Obj.isInside(Pts, In='(R,Z)', Test=True)
Thet = np.pi/4.
Pts = np.array([Pts[0,:]*np.cos(Thet), Pts[0,:]*np.sin(Thet), Pts[1,:]])
ind = self.Obj.isInside(Pts, In='(X,Y,Z)', Test=True)
assert np.all(indRZ==ind)
def test03_calc_SAngVect(self, NR=10,NZ=10):
R = np.linspace(self.Obj.Ves._P1Min[0],self.Obj.Ves._P1Max[0],NR)
Z = np.linspace(self.Obj.Ves._P2Min[0],self.Obj.Ves._P2Max[0],NZ)
Pts = np.array([np.tile(R,(NZ,1)).flatten(), np.tile(Z,(NR,1)).T.flatten()])
SAngRZ1, VectRZ1 = self.Obj.calc_SAngVect(Pts, In='(R,Z)', Colis=False, Test=True)
SAngRZ, VectRZ = self.Obj.calc_SAngVect(Pts, In='(R,Z)', Colis=True, Test=True)
Thet = np.arctan2(self.Obj.LOS[self.Obj._LOSRef]['PRef'][1],self.Obj.LOS[self.Obj._LOSRef]['PRef'][0])
Pts = np.array([Pts[0,:]*np.cos(Thet), Pts[0,:]*np.sin(Thet), Pts[1,:]])
SAng1, Vect1 = self.Obj.calc_SAngVect(Pts, In='(X,Y,Z)', Colis=False, Test=True)
SAng, Vect = self.Obj.calc_SAngVect(Pts, In='(X,Y,Z)', Colis=True, Test=True)
ind1RZ0, ind10 = SAngRZ1>0, SAng1>0.
indRZ0, ind0 = SAngRZ>0., SAng>0.
assert np.all(ind1RZ0==ind10)
assert np.all(indRZ0==ind0)
assert np.all(SAngRZ1==SAng1) and np.all(VectRZ1[:,ind10]==Vect1[:,ind10])
assert np.all(SAngRZ==SAng) and np.all(VectRZ[:,ind0]==Vect[:,ind0])
def test04_calc_Sig(self):
func = lambda Pts, A=1.: A*np.exp(-(((np.hypot(Pts[0,:],Pts[1,:])-1.7)/0.3)**2 + ((Pts[2,:]-0.)/0.5)**2))
Sig1 = self.Obj.calc_Sig(func, extargs={'A':1.}, Method='Vol', Mode='simps', PreComp=True, Colis=True, dX12=[0.005, 0.005], dX12Mode='abs', ds=0.005, dsMode='abs', MarginS=0.001)
Sig2 = self.Obj.calc_Sig(func, extargs={'A':1.}, Method='Vol', Mode='sum', PreComp=False, Colis=True, dX12=[0.005, 0.005], dX12Mode='abs', ds=0.005, dsMode='abs', MarginS=0.001)
Sig3 = self.Obj.calc_Sig(func, extargs={'A':1.}, Method='LOS', Mode='trapz', PreComp=True, Colis=True, ds=0.005, dsMode='abs', MarginS=0.001)
Sig4 = self.Obj.calc_Sig(func, extargs={'A':1.}, Method='LOS', Mode='quad', PreComp=False, Colis=True, epsrel=1.e-4, MarginS=0.001)
assert np.abs(Sig1-Sig2)<0.001*min(Sig1,Sig2), str(Sig1)+" vs "+str(Sig2)
assert np.abs(Sig3-Sig4)<0.001*min(Sig3,Sig4), str(Sig3)+" vs "+str(Sig4)
def test05_debug_Etendue_BenchmarkRatioMode(self):
Etends, Ratio, RelErr, dX12, dX12Mode, Colis = self.Obj._debug_Etendue_BenchmarkRatioMode(RelErr=1.e-3, Ratio=[0.01,0.1], Modes=['simps','quad'], dX12=[0.002,0.002], dX12Mode='abs', Colis=True)
for kk in Etends.keys():
assert all([np.abs(ee-Etends[kk][0,0])<0.01*Etends[kk][0,0] for ee in Etends[kk][0,:]]), str(Etends[kk][0,:])
#def test06_calc_Etendue_AlongLOS(self):
# Etends, Ps, k, LOSRef = self.Obj.calc_Etendue_AlongLOS(Length='', NP=5, kMode='rel', Modes=['trapz','quad'], RelErr=1.e-3, dX12=[0.005, 0.005], dX12Mode='abs', Ratio=0.02, Colis=True, Test=True)
#def test07_calc_SAngNb(self):
# SA, ind, Pts = self.Obj.calc_SAngNb(Pts=None, Proj='Cross', Slice='Int', DRY=None, DXTheta=None, DZ=None, Colis=True)
# SA, ind, Pts = self.Obj.calc_SAngNb(Pts=None, Proj='Hor', Slice='Int', DRY=None, DXTheta=None, DZ=None, Colis=True)
# SA, ind, Pts = self.Obj.calc_SAngNb(Pts=None, Proj='Cross', Slice='Int', DRY=None, DXTheta=None, DZ=None, Colis=False)
# SA, ind, Pts = self.Obj.calc_SAngNb(Pts=None, Proj='Hor', Slice='Int', DRY=None, DXTheta=None, DZ=None, Colis=False)
def test08_set_Res(self):
self.Obj._set_Res(CrossMesh=[0.1,0.1], CrossMeshMode='abs', Mode='Iso', Amp=1., Deg=0, steps=0.01, Thres=0.05, ThresMode='rel', ThresMin=0.01,
IntResCross=[0.1,0.1], IntResCrossMode='rel', IntResLong=0.1, IntResLongMode='rel', Eq=None, Ntt=50, EqName=None, save=False, Test=True)
def test09_plot(self):
Lax = self.Obj.plot(Proj='All', Elt='PV', EltVes='P', draw=False, a4=False, Test=True)
Lax = self.Obj.plot(Proj='Cross', Elt='PC', EltVes='', draw=False, a4=False, Test=True)
Lax = self.Obj.plot(Proj='Hor', Elt='PVC', EltVes='P', draw=False, a4=False, Test=True)
plt.close('all')
def test10_plot_SAngNb(self):
Lax = self.Obj.plot_SAngNb(Lax=None, Proj='Cross', Slice='Int', Pts=None, plotfunc='scatter', DRY=None, DXTheta=None, DZ=None, Elt='P', EltVes='P', EltLOS='L', EltOptics='P', Colis=True, a4=False, draw=False, Test=True)
Lax = self.Obj.plot_SAngNb(Lax=None, Proj='Hor', Slice='Max', Pts=None, plotfunc='scatter', DRY=None, DXTheta=None, DZ=None, Elt='P', EltVes='P', EltLOS='', EltOptics='P', Colis=True, a4=False, draw=False, Test=True)
plt.close('all')
def test11_debug_plot_SAng_OnPlanePerp(self):
ax = self.Obj._debug_plot_SAng_OnPlanePerp(ax=None, Pos=tfd.DetSAngPlRa, dX12=tfd.DetSAngPldX12, dX12Mode=tfd.DetSAngPldX12Mode, Ratio=tfd.DetSAngPlRatio, Colis=True, draw=False, a4=False, Test=True)
plt.close('all')
def test12_plot_Etend_AlongLOS(self):
ax = self.Obj.plot_Etend_AlongLOS(ax=None, NP=5, kMode='rel', Modes=['trapz','simps'], dX12=[0.005, 0.005], dX12Mode='abs', Ratio=0.02, LOSPts=True, Colis=True, draw=False, a4=True, Test=True)
ax = self.Obj.plot_Etend_AlongLOS(ax=None, NP=5, kMode='rel', Modes=['quad'], RelErr=1.e-3, Ratio=0.01, LOSPts=True, Colis=False, draw=False, a4=False, Test=True)
plt.close('all')
def test13_plot_Sinogram(self):
ax = self.Obj.plot_Sinogram(ax=None, Proj='Cross', Elt='DLV', Ang='theta', AngUnit='rad', Sketch=True, LOSRef=None, draw=False, a4=False, Test=True)
ax = self.Obj.plot_Sinogram(ax=None, Proj='Cross', Elt='DLV', Ang='xi', AngUnit='deg', Sketch=False, LOSRef=None, draw=False, a4=True, Test=True)
plt.close('all')
def test14_plot_Res(self):
ax = self.Obj._plot_Res(ax=None, plotfunc='scatter', NC=20, draw=False, a4=False, Test=True)
ax = self.Obj._plot_Res(ax=None, plotfunc='contourf', NC=20, draw=False, a4=True, Test=True)
plt.close('all')
def test15_saveload(self):
self.Obj.save(verb=False)
obj = tfpf.Open(self.Obj.Id.SavePath + self.Obj.Id.SaveName + '.npz')
os.remove(self.Obj.Id.SavePath + self.Obj.Id.SaveName + '.npz')
class Test16_DetectLensLin:
@classmethod
def setup_class(cls, Ves=VesLin):
print ("")
print "--------- "+VerbHead+cls.__name__
Out = np.load(Root+Addpath+'G_015.npz')
O = np.array([0.,Ves._P1Max[0],Ves._P2Max[1]])
nIn = np.array([0.,-1.,-1.])
Rad, F1 = 0.005, 0.010
Lens = tfg.Lens('Test', O, nIn, Rad, F1, Ves=Ves, Type='Sph', Exp='AUG', Diag='Test', shot=0, SavePath=Root+Addpath)
cls.Obj = tfg.Detect('Test', {'Rad':0.001}, Optics=Lens, Ves=Ves, Exp='AUG', Diag='Test', shot=0, SavePath=Root+Addpath,
Etend_Method='quad', Etend_RelErr=1.e-2,
Cone_DRY=0.005, Cone_DXTheta=0.005, Cone_DZ=0.005)
@classmethod
def teardown_class(cls):
#print ("teardown_class() after any methods in this class")
pass
def setup(self):
#print ("TestUM:setup() before each test method")
pass
def teardown(self):
#print ("TestUM:teardown() after each test method")
pass
def test01_refine_ConePoly(self):
self.Obj.refine_ConePoly( Proj='Cross', indPoly=0, Verb=False)
def test02_isInside(self, NR=10,NZ=10):
R = np.linspace(self.Obj.Ves._P1Min[0],self.Obj.Ves._P1Max[0],NR)
Z = np.linspace(self.Obj.Ves._P2Min[0],self.Obj.Ves._P2Max[0],NZ)
Pts = np.array([np.tile(R,(NZ,1)).flatten(), np.tile(Z,(NR,1)).T.flatten()])
indRZ = self.Obj.isInside(Pts, In='(Y,Z)', Test=True)
Thet = self.Obj.LOS[self.Obj._LOSRef]['PRef'][0]
Pts = np.array([Thet*np.ones((Pts.shape[1],)), Pts[0,:], Pts[1,:]])
ind = self.Obj.isInside(Pts, In='(X,Y,Z)', Test=True)
assert np.all(indRZ==ind)
def test03_calc_SAngVect(self, NR=10,NZ=10):
R = np.linspace(self.Obj.Ves._P1Min[0],self.Obj.Ves._P1Max[0],NR)
Z = np.linspace(self.Obj.Ves._P2Min[0],self.Obj.Ves._P2Max[0],NZ)
Pts = np.array([np.tile(R,(NZ,1)).flatten(), np.tile(Z,(NR,1)).T.flatten()])
SAngRZ1, VectRZ1 = self.Obj.calc_SAngVect(Pts, In='(Y,Z)', Colis=False, Test=True)
SAngRZ, VectRZ = self.Obj.calc_SAngVect(Pts, In='(Y,Z)', Colis=True, Test=True)
Thet = self.Obj.LOS[self.Obj._LOSRef]['PRef'][0]
Pts = np.array([Thet*np.ones((Pts.shape[1],)), Pts[0,:], Pts[1,:]])
SAng1, Vect1 = self.Obj.calc_SAngVect(Pts, In='(X,Y,Z)', Colis=False, Test=True)
SAng, Vect = self.Obj.calc_SAngVect(Pts, In='(X,Y,Z)', Colis=True, Test=True)
ind1RZ0, ind10 = SAngRZ1>0, SAng1>0.
indRZ0, ind0 = SAngRZ>0., SAng>0.
assert np.all(ind1RZ0==ind10)
assert np.all(indRZ0==ind0)
assert np.all(SAngRZ1==SAng1) and np.all(VectRZ1[:,ind10]==Vect1[:,ind10])
assert np.all(SAngRZ==SAng) and np.all(VectRZ[:,ind0]==Vect[:,ind0])
def test04_calc_Sig(self):
func = lambda Pts, A=1.: A*np.exp(-(((Pts[1,:]-1.7)/0.3)**2 + ((Pts[2,:]-0.)/0.5)**2))
Sig1 = self.Obj.calc_Sig(func, extargs={'A':1.}, Method='Vol', Mode='simps', PreComp=True, Colis=True, dX12=[0.005, 0.005], dX12Mode='abs', ds=0.005, dsMode='abs', MarginS=0.001)
Sig2 = self.Obj.calc_Sig(func, extargs={'A':1.}, Method='Vol', Mode='sum', PreComp=False, Colis=True, dX12=[0.005, 0.005], dX12Mode='abs', ds=0.005, dsMode='abs', MarginS=0.001)
Sig3 = self.Obj.calc_Sig(func, extargs={'A':1.}, Method='LOS', Mode='trapz', PreComp=True, Colis=True, ds=0.005, dsMode='abs', MarginS=0.001)
Sig4 = self.Obj.calc_Sig(func, extargs={'A':1.}, Method='LOS', Mode='quad', PreComp=False, Colis=True, epsrel=1.e-4, MarginS=0.001)
assert np.abs(Sig1-Sig2)<0.001*min(Sig1,Sig2), str(Sig1)+" vs "+str(Sig2)
assert np.abs(Sig3-Sig4)<0.001*min(Sig3,Sig4), str(Sig3)+" vs "+str(Sig4)
def test05_debug_Etendue_BenchmarkRatioMode(self):
Etends, Ratio, RelErr, dX12, dX12Mode, Colis = self.Obj._debug_Etendue_BenchmarkRatioMode(RelErr=1.e-3, Ratio=[0.01,0.1], Modes=['simps','quad'], dX12=[0.002,0.002], dX12Mode='abs', Colis=True)
for kk in Etends.keys():
assert all([np.abs(ee-Etends[kk][0,0])<0.01*Etends[kk][0,0] for ee in Etends[kk][0,:]]), str(Etends[kk][0,:])
#def test06_calc_Etendue_AlongLOS(self):
# Etends, Ps, k, LOSRef = self.Obj.calc_Etendue_AlongLOS(Length='', NP=5, kMode='rel', Modes=['trapz','quad'], RelErr=1.e-3, dX12=[0.005, 0.005], dX12Mode='abs', Ratio=0.02, Colis=True, Test=True)
#def test07_calc_SAngNb(self):
# SA, ind, Pts = self.Obj.calc_SAngNb(Pts=None, Proj='Cross', Slice='Int', DRY=None, DXTheta=None, DZ=None, Colis=True)
# SA, ind, Pts = self.Obj.calc_SAngNb(Pts=None, Proj='Hor', Slice='Int', DRY=None, DXTheta=None, DZ=None, Colis=True)
# SA, ind, Pts = self.Obj.calc_SAngNb(Pts=None, Proj='Cross', Slice='Int', DRY=None, DXTheta=None, DZ=None, Colis=False)
# SA, ind, Pts = self.Obj.calc_SAngNb(Pts=None, Proj='Hor', Slice='Int', DRY=None, DXTheta=None, DZ=None, Colis=False)
def test08_set_Res(self):
self.Obj._set_Res(CrossMesh=[0.1,0.1], CrossMeshMode='abs', Mode='Iso', Amp=1., Deg=0, steps=0.01, Thres=0.05, ThresMode='rel', ThresMin=0.01,
IntResCross=[0.1,0.1], IntResCrossMode='rel', IntResLong=0.1, IntResLongMode='rel', Eq=None, Ntt=50, EqName=None, save=False, Test=True)
def test09_plot(self):
Lax = self.Obj.plot(Proj='All', Elt='PV', EltVes='P', draw=False, a4=False, Test=True)
Lax = self.Obj.plot(Proj='Cross', Elt='PC', EltVes='', draw=False, a4=False, Test=True)
Lax = self.Obj.plot(Proj='Hor', Elt='PVC', EltVes='P', draw=False, a4=False, Test=True)
plt.close('all')
def test10_plot_SAngNb(self):
Lax = self.Obj.plot_SAngNb(Lax=None, Proj='Cross', Slice='Int', Pts=None, plotfunc='scatter', DRY=None, DXTheta=None, DZ=None, Elt='P', EltVes='P', EltLOS='L', EltOptics='P', Colis=True, a4=False, draw=False, Test=True)
Lax = self.Obj.plot_SAngNb(Lax=None, Proj='Hor', Slice='Max', Pts=None, plotfunc='scatter', DRY=None, DXTheta=None, DZ=None, Elt='P', EltVes='P', EltLOS='', EltOptics='P', Colis=True, a4=False, draw=False, Test=True)
plt.close('all')
def test11_debug_plot_SAng_OnPlanePerp(self):
ax = self.Obj._debug_plot_SAng_OnPlanePerp(ax=None, Pos=tfd.DetSAngPlRa, dX12=tfd.DetSAngPldX12, dX12Mode=tfd.DetSAngPldX12Mode, Ratio=tfd.DetSAngPlRatio, Colis=True, draw=False, a4=False, Test=True)
plt.close('all')
def test12_plot_Etend_AlongLOS(self):
ax = self.Obj.plot_Etend_AlongLOS(ax=None, NP=5, kMode='rel', Modes=['trapz','simps'], dX12=[0.005, 0.005], dX12Mode='abs', Ratio=0.02, LOSPts=True, Colis=True, draw=False, a4=True, Test=True)
ax = self.Obj.plot_Etend_AlongLOS(ax=None, NP=5, kMode='rel', Modes=['quad'], RelErr=1.e-3, Ratio=0.01, LOSPts=True, Colis=False, draw=False, a4=False, Test=True)
plt.close('all')
def test13_plot_Sinogram(self):
ax = self.Obj.plot_Sinogram(ax=None, Proj='Cross', Elt='DLV', Ang='theta', AngUnit='rad', Sketch=True, LOSRef=None, draw=False, a4=False, Test=True)
ax = self.Obj.plot_Sinogram(ax=None, Proj='Cross', Elt='DLV', Ang='xi', AngUnit='deg', Sketch=False, LOSRef=None, draw=False, a4=True, Test=True)
plt.close('all')
def test14_plot_Res(self):
ax = self.Obj._plot_Res(ax=None, plotfunc='scatter', NC=20, draw=False, a4=False, Test=True)
ax = self.Obj._plot_Res(ax=None, plotfunc='contourf', NC=20, draw=False, a4=True, Test=True)
plt.close('all')
def test15_saveload(self):
self.Obj.save(verb=False)
obj = tfpf.Open(self.Obj.Id.SavePath + self.Obj.Id.SaveName + '.npz')
os.remove(self.Obj.Id.SavePath + self.Obj.Id.SaveName + '.npz')
###########################################################
#
# Creating GDetect objects and testing methods (Apert and Lens, Tor and Lin)
#
###########################################################
class Test17_GDetectApertTor:
@classmethod
def setup_class(cls, Ves=VesTor):
print ("")
print "--------- "+VerbHead+cls.__name__
ld = ['L_009','L_012']#'L_010','L_011'
LD = []
Out = np.load(Root+Addpath+'L_009.npz')
PAp0, PAp1 = Out['PolyAp0'], Out['PolyAp1']
Ap0L = tfg.Apert('Test0L', PAp0, Ves=Ves, Exp='AUG', Diag='Test', shot=0, SavePath=Root+Addpath)
Ap1L = tfg.Apert('Test1L', PAp1, Ves=Ves, Exp='AUG', Diag='Test', shot=0, SavePath=Root+Addpath)
for dd in ld:
Poly = np.load(Root+Addpath+dd+'.npz')['Poly']
LD.append(tfg.Detect(dd, Poly, Optics=[Ap0L,Ap1L], Ves=Ves, Exp='AUG', Diag='Test', shot=0, SavePath=Root+Addpath,
CalcEtend=True, CalcSpanImp=True, CalcCone=True, CalcPreComp=False, Calc=True, Verb=False,
Etend_Method='simps', Etend_dX12=[0.05,0.05], Etend_dX12Mode='rel',
Cone_DRY=0.005, Cone_DXTheta=0.005, Cone_DZ=0.005))
ld = ['G_015','G_020']
Out = np.load(Root+Addpath+'G_015.npz')
PAp0, PAp1 = Out['PolyAp0'], Out['PolyAp1']
Ap0G = tfg.Apert('Test0G', PAp0, Ves=Ves, Exp='AUG', Diag='Test', shot=0, SavePath=Root+Addpath)
Ap1G = tfg.Apert('Test1G', PAp1, Ves=Ves, Exp='AUG', Diag='Test', shot=0, SavePath=Root+Addpath)
for dd in ld:
Poly = np.load(Root+Addpath+dd+'.npz')['Poly']
LD.append(tfg.Detect(dd, Poly, Optics=[Ap0G,Ap1G], Ves=Ves, Exp='AUG', Diag='Test', shot=0, SavePath=Root+Addpath,
CalcEtend=True, CalcSpanImp=True, CalcCone=True, CalcPreComp=False, Calc=True, Verb=False,
Etend_Method='simps', Etend_dX12=[0.05,0.05], Etend_dX12Mode='rel',
Cone_DRY=0.005, Cone_DXTheta=np.pi/512., Cone_DZ=0.005))
cls.Obj = tfg.GDetect('LG', LD, Exp='AUG', Diag='Test', shot=0, SavePath=Root+Addpath)
@classmethod
def teardown_class(cls):
#print ("teardown_class() after any methods in this class")
pass
def setup(self):
#print ("TestUM:setup() before each test method")
pass
def teardown(self):
#print ("TestUM:teardown() after each test method")
pass
def test01_select(self):
ind = self.Obj.select(Val='L_010', Crit='Name', PreExp=None, PostExp=None, Log='any', InOut='In', Out=bool)
ind = self.Obj.select(Val='G_015', Crit='Name', PreExp=None, PostExp=None, Log='any', InOut='In', Out=int)
ind = self.Obj.select(Val=['L_009','G_020'], Crit='Name', PreExp=None, PostExp=None, Log='any', InOut='Out', Out=int)
def test02_isInside(self, NR=10,NZ=10):
R = np.linspace(self.Obj.Ves._P1Min[0],self.Obj.Ves._P1Max[0],NR)
Z = np.linspace(self.Obj.Ves._P2Min[0],self.Obj.Ves._P2Max[0],NZ)
Pts = np.array([np.tile(R,(NZ,1)).flatten(), np.tile(Z,(NR,1)).T.flatten()])
indRZ = self.Obj.isInside(Pts, In='(R,Z)', Test=True)
Thet = np.pi/4.
Pts = np.array([Pts[0,:]*np.cos(Thet), Pts[0,:]*np.sin(Thet), Pts[1,:]])
ind = self.Obj.isInside(Pts, In='(X,Y,Z)', Test=True)
assert np.all(indRZ==ind)
def test03_get_GLOS(self):
GLOS = self.Obj.get_GLOS(Name='GLOSExtract')
def test04_calc_SAngVect(self, NR=10,NZ=10):
R = np.linspace(self.Obj.Ves._P1Min[0],self.Obj.Ves._P1Max[0],NR)
Z = np.linspace(self.Obj.Ves._P2Min[0],self.Obj.Ves._P2Max[0],NZ)
Pts = np.array([np.tile(R,(NZ,1)).flatten(), np.tile(Z,(NR,1)).T.flatten()])
SAngRZ1, VectRZ1 = self.Obj.calc_SAngVect(Pts, In='(R,Z)', Colis=False, Test=True)
SAngRZ, VectRZ = self.Obj.calc_SAngVect(Pts, In='(R,Z)', Colis=True, Test=True)
Thet = np.arctan2(self.Obj.LDetect[0].LOS[self.Obj._LOSRef]['PRef'][1],self.Obj.LDetect[0].LOS[self.Obj._LOSRef]['PRef'][0])
Pts = np.array([Pts[0,:]*np.cos(Thet), Pts[0,:]*np.sin(Thet), Pts[1,:]])
SAng1, Vect1 = self.Obj.calc_SAngVect(Pts, In='(X,Y,Z)', Colis=False, Test=True)
SAng, Vect = self.Obj.calc_SAngVect(Pts, In='(X,Y,Z)', Colis=True, Test=True)
def test05_calc_Sig(self):
func = lambda Pts, A=1.: A*np.exp(-(((np.hypot(Pts[0,:],Pts[1,:])-1.7)/0.3)**2 + ((Pts[2,:]-0.)/0.5)**2))
Sig1, GD1 = self.Obj.calc_Sig(func, extargs={'A':1.}, Method='Vol', Mode='simps', PreComp=True, Colis=True, dX12=[0.005, 0.005], dX12Mode='abs', ds=0.005, dsMode='abs', MarginS=0.001, Val=['L_009','L_011'])
Sig2, GD2 = self.Obj.calc_Sig(func, extargs={'A':1.}, Method='Vol', Mode='sum', PreComp=False, Colis=True, dX12=[0.005, 0.005], dX12Mode='abs', ds=0.005, dsMode='abs', MarginS=0.001, Val=['L_009','L_011'])
Sig3, GD3 = self.Obj.calc_Sig(func, extargs={'A':1.}, Method='LOS', Mode='trapz', PreComp=True, Colis=True, ds=0.005, dsMode='abs', MarginS=0.001, Val=['L_009','L_011'])
Sig4, GD4 = self.Obj.calc_Sig(func, extargs={'A':1.}, Method='LOS', Mode='quad', PreComp=False, Colis=True, epsrel=1.e-4, MarginS=0.001, Val=['L_009','L_011'])
assert np.all(np.abs(Sig1-Sig2)<0.001*Sig1), str(Sig1)+" vs "+str(Sig2)
assert np.all(np.abs(Sig3-Sig4)<0.001*Sig3), str(Sig3)+" vs "+str(Sig4)
#def test06_calc_SAngNb(self):
# SA, ind, Pts = self.Obj.calc_SAngNb(Pts=None, Proj='Cross', Slice='Int', DRY=None, DXTheta=None, DZ=None, Colis=True)
# SA, ind, Pts = self.Obj.calc_SAngNb(Pts=None, Proj='Hor', Slice='Int', DRY=None, DXTheta=None, DZ=None, Colis=True)
# SA, ind, Pts = self.Obj.calc_SAngNb(Pts=None, Proj='Cross', Slice='Int', DRY=None, DXTheta=None, DZ=None, Colis=False)
# SA, ind, Pts = self.Obj.calc_SAngNb(Pts=None, Proj='Hor', Slice='Int', DRY=None, DXTheta=None, DZ=None, Colis=False)
def test07_set_Res(self):
self.Obj._set_Res(CrossMesh=[0.1,0.1], CrossMeshMode='abs', Mode='Iso', Amp=1., Deg=0, steps=0.01, Thres=0.05, ThresMode='rel', ThresMin=0.01,
IntResCross=[0.1,0.1], IntResCrossMode='rel', IntResLong=0.1, IntResLongMode='rel', Eq=None, Ntt=50, EqName=None, save=False, Test=True)
def test08_plot(self):
Lax = self.Obj.plot(Proj='All', Elt='PV', EltLOS='LIO', EltOptics='P', EltVes='P', draw=False, a4=False, Test=True)
Lax = self.Obj.plot(Proj='Cross', Elt='PC', EltLOS='DIORP', EltOptics='PV', EltVes='', draw=False, a4=False, Test=True)
Lax = self.Obj.plot(Proj='Hor', Elt='PVC', EltLOS='L', EltOptics='', EltVes='P', draw=False, a4=False, Test=True)
plt.close('all')
def test09_plot_SAngNb(self):
Lax = self.Obj.plot_SAngNb(Lax=None, Proj='Cross', Slice='Int', Pts=None, plotfunc='scatter', DRY=None, DXTheta=None, DZ=None, Elt='P', EltVes='P', EltLOS='L', EltOptics='P', Colis=True, a4=False, draw=False, Test=True)
Lax = self.Obj.plot_SAngNb(Lax=None, Proj='Hor', Slice='Max', Pts=None, plotfunc='scatter', DRY=None, DXTheta=None, DZ=None, Elt='P', EltVes='P', EltLOS='', EltOptics='P', Colis=True, a4=False, draw=False, Test=True)
plt.close('all')
def test10_plot_Etend_AlongLOS(self):
ax = self.Obj.plot_Etend_AlongLOS(ax=None, NP=2, kMode='rel', Modes=['trapz','simps'], dX12=[0.005, 0.005], dX12Mode='abs', Ratio=0.02, LOSPts=True, Colis=True, draw=False, a4=True, Test=True, Val=['L_009','L_011'])
ax = self.Obj.plot_Etend_AlongLOS(ax=None, NP=2, kMode='rel', Modes=['quad'], RelErr=1.e-3, Ratio=0.01, LOSPts=True, Colis=False, draw=False, a4=False, Test=True, Val=['L_009','L_011'])
plt.close('all')
def test11_plot_Sinogram(self):
ax = self.Obj.plot_Sinogram(ax=None, Proj='Cross', Elt='DLV', Ang='theta', AngUnit='rad', Sketch=True, LOSRef=None, draw=False, a4=False, Test=True)
ax = self.Obj.plot_Sinogram(ax=None, Proj='Cross', Elt='DLV', Ang='xi', AngUnit='deg', Sketch=False, LOSRef=None, draw=False, a4=True, Test=True)
plt.close('all')
def test12_plot_Etendues(self):
ax = self.Obj.plot_Etendues(Mode='Etend', Elt='', ax=None, draw=False, a4=False, Test=True, Val='L_011', InOut='Out')
plt.close('all')
def test13_plot_Sig(self):
func = lambda Pts, A=1.: A*np.exp(-(((np.hypot(Pts[0,:],Pts[1,:])-1.7)/0.3)**2 + ((Pts[2,:]-0.)/0.5)**2))
ax = self.Obj.plot_Sig(func, extargs={'A':1.}, Method='Vol', Mode='simps', PreComp=True, Colis=True, dX12=[0.005, 0.005], dX12Mode='abs', ds=0.005, dsMode='abs', draw=False, a4=True, MarginS=0.001)
plt.close('all')
def test14_plot_Res(self):
ax = self.Obj._plot_Res(ax=None, plotfunc='scatter', NC=20, draw=False, a4=False, Test=True)
ax = self.Obj._plot_Res(ax=None, plotfunc='contourf', NC=20, draw=False, a4=True, Test=True)
plt.close('all')
def test15_saveload(self):
self.Obj.save(verb=False)
obj = tfpf.Open(self.Obj.Id.SavePath + self.Obj.Id.SaveName + '.npz')
os.remove(self.Obj.Id.SavePath + self.Obj.Id.SaveName + '.npz')
class Test18_GDetectApertLin:
@classmethod
def setup_class(cls, Ves=VesLin):
print ("")
print "--------- "+VerbHead+cls.__name__
ld = ['L_009','L_012']#'L_010','L_011'
LD = []
Out = np.load(Root+Addpath+'L_009.npz')
PAp0, PAp1 = shiftthet(Out['PolyAp0'], thetobj=np.pi/2.), shiftthet(Out['PolyAp1'], thetobj=np.pi/2.)
Ap0L = tfg.Apert('Test0L', PAp0, Ves=Ves, Exp='AUG', Diag='Test', shot=0, SavePath=Root+Addpath)
Ap1L = tfg.Apert('Test1L', PAp1, Ves=Ves, Exp='AUG', Diag='Test', shot=0, SavePath=Root+Addpath)
for dd in ld:
Poly = shiftthet(np.load(Root+Addpath+dd+'.npz')['Poly'], thetobj=np.pi/2.)
LD.append(tfg.Detect(dd, Poly, Optics=[Ap0L,Ap1L], Ves=Ves, Exp='AUG', Diag='Test', shot=0, SavePath=Root+Addpath,
CalcEtend=True, CalcSpanImp=True, CalcCone=True, CalcPreComp=False, Calc=True, Verb=False,
Etend_Method='simps', Etend_dX12=[0.05,0.05], Etend_dX12Mode='rel',
Cone_DRY=0.005, Cone_DXTheta=0.005, Cone_DZ=0.005))
ld = ['G_015','G_020']
Out = np.load(Root+Addpath+'G_015.npz')
PAp0, PAp1 = shiftthet(Out['PolyAp0'], thetobj=np.pi/2.), shiftthet(Out['PolyAp1'], thetobj=np.pi/2.)
Ap0G = tfg.Apert('Test0G', PAp0, Ves=Ves, Exp='AUG', Diag='Test', shot=0, SavePath=Root+Addpath)
Ap1G = tfg.Apert('Test1G', PAp1, Ves=Ves, Exp='AUG', Diag='Test', shot=0, SavePath=Root+Addpath)
for dd in ld:
Poly = shiftthet(np.load(Root+Addpath+dd+'.npz')['Poly'], thetobj=np.pi/2.)
LD.append(tfg.Detect(dd, Poly, Optics=[Ap0G,Ap1G], Ves=Ves, Exp='AUG', Diag='Test', shot=0, SavePath=Root+Addpath,
CalcEtend=True, CalcSpanImp=True, CalcCone=True, CalcPreComp=False, Calc=True, Verb=False,
Etend_Method='simps', Etend_dX12=[0.05,0.05], Etend_dX12Mode='rel',
Cone_DRY=0.005, Cone_DXTheta=0.005, Cone_DZ=0.005))
cls.Obj = tfg.GDetect('LG', LD, Exp='AUG', Diag='Test', shot=0, SavePath=Root+Addpath)
@classmethod
def teardown_class(cls):
#print ("teardown_class() after any methods in this class")
pass
def setup(self):
#print ("TestUM:setup() before each test method")
pass
def teardown(self):
#print ("TestUM:teardown() after each test method")
pass
def test01_select(self):
ind = self.Obj.select(Val='L_010', Crit='Name', PreExp=None, PostExp=None, Log='any', InOut='In', Out=bool)
ind = self.Obj.select(Val='G_015', Crit='Name', PreExp=None, PostExp=None, Log='any', InOut='In', Out=int)
ind = self.Obj.select(Val=['L_009','G_020'], Crit='Name', PreExp=None, PostExp=None, Log='any', InOut='Out', Out=int)
def test02_isInside(self, NR=10,NZ=10):
R = np.linspace(self.Obj.Ves._P1Min[0],self.Obj.Ves._P1Max[0],NR)
Z = np.linspace(self.Obj.Ves._P2Min[0],self.Obj.Ves._P2Max[0],NZ)
Pts = np.array([np.tile(R,(NZ,1)).flatten(), np.tile(Z,(NR,1)).T.flatten()])
indRZ = self.Obj.isInside(Pts, In='(R,Z)', Test=True)
Thet = np.pi/4.
Pts = np.array([Pts[0,:]*np.cos(Thet), Pts[0,:]*np.sin(Thet), Pts[1,:]])
ind = self.Obj.isInside(Pts, In='(X,Y,Z)', Test=True)
assert np.all(indRZ==ind)
def test03_get_GLOS(self):
GLOS = self.Obj.get_GLOS(Name='GLOSExtract')
def test04_calc_SAngVect(self, NR=10,NZ=10):
R = np.linspace(self.Obj.Ves._P1Min[0],self.Obj.Ves._P1Max[0],NR)
Z = np.linspace(self.Obj.Ves._P2Min[0],self.Obj.Ves._P2Max[0],NZ)
Pts = np.array([np.tile(R,(NZ,1)).flatten(), np.tile(Z,(NR,1)).T.flatten()])
SAngRZ1, VectRZ1 = self.Obj.calc_SAngVect(Pts, In='(R,Z)', Colis=False, Test=True)
SAngRZ, VectRZ = self.Obj.calc_SAngVect(Pts, In='(R,Z)', Colis=True, Test=True)
Thet = np.arctan2(self.Obj.LDetect[0].LOS[self.Obj._LOSRef]['PRef'][1],self.Obj.LDetect[0].LOS[self.Obj._LOSRef]['PRef'][0])
Pts = np.array([Pts[0,:]*np.cos(Thet), Pts[0,:]*np.sin(Thet), Pts[1,:]])
SAng1, Vect1 = self.Obj.calc_SAngVect(Pts, In='(X,Y,Z)', Colis=False, Test=True)
SAng, Vect = self.Obj.calc_SAngVect(Pts, In='(X,Y,Z)', Colis=True, Test=True)
def test05_calc_Sig(self):
func = lambda Pts, A=1.: A*np.exp(-(((np.hypot(Pts[0,:],Pts[1,:])-1.7)/0.3)**2 + ((Pts[2,:]-0.)/0.5)**2))
Sig1, GD1 = self.Obj.calc_Sig(func, extargs={'A':1.}, Method='Vol', Mode='simps', PreComp=True, Colis=True, dX12=[0.005, 0.005], dX12Mode='abs', ds=0.005, dsMode='abs', MarginS=0.001, Val=['L_009','L_011'])
Sig2, GD2 = self.Obj.calc_Sig(func, extargs={'A':1.}, Method='Vol', Mode='sum', PreComp=False, Colis=True, dX12=[0.005, 0.005], dX12Mode='abs', ds=0.005, dsMode='abs', MarginS=0.001, Val=['L_009','L_011'])
Sig3, GD3 = self.Obj.calc_Sig(func, extargs={'A':1.}, Method='LOS', Mode='trapz', PreComp=True, Colis=True, ds=0.005, dsMode='abs', MarginS=0.001, Val=['L_009','L_011'])
Sig4, GD4 = self.Obj.calc_Sig(func, extargs={'A':1.}, Method='LOS', Mode='quad', PreComp=False, Colis=True, epsrel=1.e-4, MarginS=0.001, Val=['L_009','L_011'])
assert np.all(np.abs(Sig1-Sig2)<0.001*Sig1), str(Sig1)+" vs "+str(Sig2)
assert np.all(np.abs(Sig3-Sig4)<0.001*Sig3), str(Sig3)+" vs "+str(Sig4)
#def test06_calc_SAngNb(self):
# SA, ind, Pts = self.Obj.calc_SAngNb(Pts=None, Proj='Cross', Slice='Int', DRY=None, DXTheta=None, DZ=None, Colis=True)
# SA, ind, Pts = self.Obj.calc_SAngNb(Pts=None, Proj='Hor', Slice='Int', DRY=None, DXTheta=None, DZ=None, Colis=True)
# SA, ind, Pts = self.Obj.calc_SAngNb(Pts=None, Proj='Cross', Slice='Int', DRY=None, DXTheta=None, DZ=None, Colis=False)
# SA, ind, Pts = self.Obj.calc_SAngNb(Pts=None, Proj='Hor', Slice='Int', DRY=None, DXTheta=None, DZ=None, Colis=False)
def test07_set_Res(self):
self.Obj._set_Res(CrossMesh=[0.1,0.1], CrossMeshMode='abs', Mode='Iso', Amp=1., Deg=0, steps=0.01, Thres=0.05, ThresMode='rel', ThresMin=0.01,
IntResCross=[0.1,0.1], IntResCrossMode='rel', IntResLong=0.1, IntResLongMode='rel', Eq=None, Ntt=50, EqName=None, save=False, Test=True)
def test08_plot(self):
Lax = self.Obj.plot(Proj='All', Elt='PV', EltLOS='LIO', EltOptics='P', EltVes='P', draw=False, a4=False, Test=True)
Lax = self.Obj.plot(Proj='Cross', Elt='PC', EltLOS='DIORP', EltOptics='PV', EltVes='', draw=False, a4=False, Test=True)
Lax = self.Obj.plot(Proj='Hor', Elt='PVC', EltLOS='L', EltOptics='', EltVes='P', draw=False, a4=False, Test=True)
plt.close('all')
def test09_plot_SAngNb(self):
Lax = self.Obj.plot_SAngNb(Lax=None, Proj='Cross', Slice='Int', Pts=None, plotfunc='scatter', DRY=None, DXTheta=None, DZ=None, Elt='P', EltVes='P', EltLOS='L', EltOptics='P', Colis=True, a4=False, draw=False, Test=True)
Lax = self.Obj.plot_SAngNb(Lax=None, Proj='Hor', Slice='Max', Pts=None, plotfunc='scatter', DRY=None, DXTheta=None, DZ=None, Elt='P', EltVes='P', EltLOS='', EltOptics='P', Colis=True, a4=False, draw=False, Test=True)
plt.close('all')
def test10_plot_Etend_AlongLOS(self):
ax = self.Obj.plot_Etend_AlongLOS(ax=None, NP=2, kMode='rel', Modes=['trapz','simps'], dX12=[0.005, 0.005], dX12Mode='abs', Ratio=0.02, LOSPts=True, Colis=True, draw=False, a4=True, Test=True, Val=['L_009','L_011'])
ax = self.Obj.plot_Etend_AlongLOS(ax=None, NP=2, kMode='rel', Modes=['quad'], RelErr=1.e-3, Ratio=0.01, LOSPts=True, Colis=False, draw=False, a4=False, Test=True, Val=['L_009','L_011'])
plt.close('all')
def test11_plot_Sinogram(self):
ax = self.Obj.plot_Sinogram(ax=None, Proj='Cross', Elt='DLV', Ang='theta', AngUnit='rad', Sketch=True, LOSRef=None, draw=False, a4=False, Test=True)
ax = self.Obj.plot_Sinogram(ax=None, Proj='Cross', Elt='DLV', Ang='xi', AngUnit='deg', Sketch=False, LOSRef=None, draw=False, a4=True, Test=True)
plt.close('all')
def test12_plot_Etendues(self):
ax = self.Obj.plot_Etendues(Mode='Etend', Elt='', ax=None, draw=False, a4=False, Test=True, Val='L_011', InOut='Out')
plt.close('all')
def test13_plot_Sig(self):
func = lambda Pts, A=1.: A*np.exp(-(((np.hypot(Pts[0,:],Pts[1,:])-1.7)/0.3)**2 + ((Pts[2,:]-0.)/0.5)**2))
ax = self.Obj.plot_Sig(func, extargs={'A':1.}, Method='Vol', Mode='simps', PreComp=True, Colis=True, dX12=[0.005, 0.005], dX12Mode='abs', ds=0.005, dsMode='abs', draw=False, a4=True, MarginS=0.001)
plt.close('all')
def test14_plot_Res(self):
ax = self.Obj._plot_Res(ax=None, plotfunc='scatter', NC=20, draw=False, a4=False, Test=True)
ax = self.Obj._plot_Res(ax=None, plotfunc='contourf', NC=20, draw=False, a4=True, Test=True)
plt.close('all')
def test15_saveload(self):
self.Obj.save(verb=False)
obj = tfpf.Open(self.Obj.Id.SavePath + self.Obj.Id.SaveName + '.npz')
os.remove(self.Obj.Id.SavePath + self.Obj.Id.SaveName + '.npz')
class Test19_GDetectLensTor:
@classmethod
def setup_class(cls, Ves=VesTor):
print ("")
print "--------- "+VerbHead+cls.__name__
LD = []
O = np.array([0.,Ves._P1Min[0],Ves._P2Max[1]])
nIn = np.array([0.,1.,-1.])
Rad, F1 = 0.005, 0.010
Lens = tfg.Lens('Test', O, nIn, Rad, F1, Ves=Ves, Type='Sph', Exp='AUG', Diag='Test', shot=0, SavePath=Root+Addpath)
ld = [('d01',0.),('d02',-0.01),('d03',-0.02)]
for (dd,dz) in ld:
O = np.array([0.,Ves._P1Min[0],Ves._P2Max[1]-dz])
Lens = tfg.Lens('Test', O, nIn, Rad, F1, Ves=Ves, Type='Sph', Exp='AUG', Diag='Test', shot=0, SavePath=Root+Addpath)
LD.append(tfg.Detect(dd, {'Rad':0.001}, Optics=Lens, Ves=Ves, Exp='AUG', Diag='Test', shot=0, SavePath=Root+Addpath,
CalcEtend=True, CalcSpanImp=True, CalcCone=True, CalcPreComp=False, Calc=True, Verb=False,
Etend_Method='simps', Etend_dX12=[0.05,0.05], Etend_dX12Mode='rel',
Cone_DRY=0.005, Cone_DXTheta=np.pi/512., Cone_DZ=0.005))
cls.Obj = tfg.GDetect('LG', LD, Exp='AUG', Diag='Test', shot=0, SavePath=Root+Addpath)
@classmethod
def teardown_class(cls):
#print ("teardown_class() after any methods in this class")
pass
def setup(self):
#print ("TestUM:setup() before each test method")
pass
def teardown(self):
#print ("TestUM:teardown() after each test method")
pass
def test01_select(self):
ind = self.Obj.select(Val='d01', Crit='Name', PreExp=None, PostExp=None, Log='any', InOut='In', Out=bool)
ind = self.Obj.select(Val='d02', Crit='Name', PreExp=None, PostExp=None, Log='any', InOut='In', Out=int)
ind = self.Obj.select(Val=['d01','d03'], Crit='Name', PreExp=None, PostExp=None, Log='any', InOut='Out', Out=int)
def test02_isInside(self, NR=10,NZ=10):
R = np.linspace(self.Obj.Ves._P1Min[0],self.Obj.Ves._P1Max[0],NR)
Z = np.linspace(self.Obj.Ves._P2Min[0],self.Obj.Ves._P2Max[0],NZ)
Pts = np.array([np.tile(R,(NZ,1)).flatten(), np.tile(Z,(NR,1)).T.flatten()])
indRZ = self.Obj.isInside(Pts, In='(R,Z)', Test=True)
Thet = np.pi/4.
Pts = np.array([Pts[0,:]*np.cos(Thet), Pts[0,:]*np.sin(Thet), Pts[1,:]])
ind = self.Obj.isInside(Pts, In='(X,Y,Z)', Test=True)
assert np.all(indRZ==ind)
def test03_get_GLOS(self):
GLOS = self.Obj.get_GLOS(Name='GLOSExtract')
def test04_calc_SAngVect(self, NR=10,NZ=10):
R = np.linspace(self.Obj.Ves._P1Min[0],self.Obj.Ves._P1Max[0],NR)
Z = np.linspace(self.Obj.Ves._P2Min[0],self.Obj.Ves._P2Max[0],NZ)
Pts = np.array([np.tile(R,(NZ,1)).flatten(), np.tile(Z,(NR,1)).T.flatten()])
SAngRZ1, VectRZ1 = self.Obj.calc_SAngVect(Pts, In='(R,Z)', Colis=False, Test=True)
SAngRZ, VectRZ = self.Obj.calc_SAngVect(Pts, In='(R,Z)', Colis=True, Test=True)
Thet = np.arctan2(self.Obj.LDetect[0].LOS[self.Obj._LOSRef]['PRef'][1],self.Obj.LDetect[0].LOS[self.Obj._LOSRef]['PRef'][0])
Pts = np.array([Pts[0,:]*np.cos(Thet), Pts[0,:]*np.sin(Thet), Pts[1,:]])
SAng1, Vect1 = self.Obj.calc_SAngVect(Pts, In='(X,Y,Z)', Colis=False, Test=True)
SAng, Vect = self.Obj.calc_SAngVect(Pts, In='(X,Y,Z)', Colis=True, Test=True)
def test05_calc_Sig(self):
func = lambda Pts, A=1.: A*np.exp(-(((np.hypot(Pts[0,:],Pts[1,:])-1.7)/0.3)**2 + ((Pts[2,:]-0.)/0.5)**2))
Sig1, GD1 = self.Obj.calc_Sig(func, extargs={'A':1.}, Method='Vol', Mode='simps', PreComp=True, Colis=True, dX12=[0.005, 0.005], dX12Mode='abs', ds=0.005, dsMode='abs', MarginS=0.001, Val=['d01','d03'])
Sig2, GD2 = self.Obj.calc_Sig(func, extargs={'A':1.}, Method='Vol', Mode='sum', PreComp=False, Colis=True, dX12=[0.005, 0.005], dX12Mode='abs', ds=0.005, dsMode='abs', MarginS=0.001, Val=['d01','d03'])
Sig3, GD3 = self.Obj.calc_Sig(func, extargs={'A':1.}, Method='LOS', Mode='trapz', PreComp=True, Colis=True, ds=0.005, dsMode='abs', MarginS=0.001, Val=['d01','d03'])
Sig4, GD4 = self.Obj.calc_Sig(func, extargs={'A':1.}, Method='LOS', Mode='quad', PreComp=False, Colis=True, epsrel=1.e-4, MarginS=0.001, Val=['d01','d03'])
assert np.all(np.abs(Sig1-Sig2)<0.001*Sig1), str(Sig1)+" vs "+str(Sig2)
assert np.all(np.abs(Sig3-Sig4)<0.001*Sig3), str(Sig3)+" vs "+str(Sig4)
#def test06_calc_SAngNb(self):
# SA, ind, Pts = self.Obj.calc_SAngNb(Pts=None, Proj='Cross', Slice='Int', DRY=None, DXTheta=None, DZ=None, Colis=True)
# SA, ind, Pts = self.Obj.calc_SAngNb(Pts=None, Proj='Hor', Slice='Int', DRY=None, DXTheta=None, DZ=None, Colis=True)
# SA, ind, Pts = self.Obj.calc_SAngNb(Pts=None, Proj='Cross', Slice='Int', DRY=None, DXTheta=None, DZ=None, Colis=False)
# SA, ind, Pts = self.Obj.calc_SAngNb(Pts=None, Proj='Hor', Slice='Int', DRY=None, DXTheta=None, DZ=None, Colis=False)
def test07_set_Res(self):
self.Obj._set_Res(CrossMesh=[0.1,0.1], CrossMeshMode='abs', Mode='Iso', Amp=1., Deg=0, steps=0.01, Thres=0.05, ThresMode='rel', ThresMin=0.01,
IntResCross=[0.1,0.1], IntResCrossMode='rel', IntResLong=0.1, IntResLongMode='rel', Eq=None, Ntt=50, EqName=None, save=False, Test=True)
def test08_plot(self):
Lax = self.Obj.plot(Proj='All', Elt='PV', EltLOS='LIO', EltOptics='P', EltVes='P', draw=False, a4=False, Test=True)
Lax = self.Obj.plot(Proj='Cross', Elt='PC', EltLOS='DIORP', EltOptics='PV', EltVes='', draw=False, a4=False, Test=True)
Lax = self.Obj.plot(Proj='Hor', Elt='PVC', EltLOS='L', EltOptics='', EltVes='P', draw=False, a4=False, Test=True)
plt.close('all')
def test09_plot_SAngNb(self):
Lax = self.Obj.plot_SAngNb(Lax=None, Proj='Cross', Slice='Int', Pts=None, plotfunc='scatter', DRY=None, DXTheta=None, DZ=None, Elt='P', EltVes='P', EltLOS='L', EltOptics='P', Colis=True, a4=False, draw=False, Test=True)
Lax = self.Obj.plot_SAngNb(Lax=None, Proj='Hor', Slice='Max', Pts=None, plotfunc='scatter', DRY=None, DXTheta=None, DZ=None, Elt='P', EltVes='P', EltLOS='', EltOptics='P', Colis=True, a4=False, draw=False, Test=True)
plt.close('all')
def test10_plot_Etend_AlongLOS(self):
ax = self.Obj.plot_Etend_AlongLOS(ax=None, NP=2, kMode='rel', Modes=['trapz','simps'], dX12=[0.005, 0.005], dX12Mode='abs', Ratio=0.02, LOSPts=True, Colis=True, draw=False, a4=True, Test=True, Val=['d01','d03'])
ax = self.Obj.plot_Etend_AlongLOS(ax=None, NP=2, kMode='rel', Modes=['quad'], RelErr=1.e-3, Ratio=0.01, LOSPts=True, Colis=False, draw=False, a4=False, Test=True, Val=['d01','d03'])
plt.close('all')
def test11_plot_Sinogram(self):
ax = self.Obj.plot_Sinogram(ax=None, Proj='Cross', Elt='DLV', Ang='theta', AngUnit='rad', Sketch=True, LOSRef=None, draw=False, a4=False, Test=True)
ax = self.Obj.plot_Sinogram(ax=None, Proj='Cross', Elt='DLV', Ang='xi', AngUnit='deg', Sketch=False, LOSRef=None, draw=False, a4=True, Test=True)
plt.close('all')
def test12_plot_Etendues(self):
ax = self.Obj.plot_Etendues(Mode='Etend', Elt='', ax=None, draw=False, a4=False, Test=True, Val='d02', InOut='Out')
plt.close('all')
def test13_plot_Sig(self):
func = lambda Pts, A=1.: A*np.exp(-(((np.hypot(Pts[0,:],Pts[1,:])-1.7)/0.3)**2 + ((Pts[2,:]-0.)/0.5)**2))
ax = self.Obj.plot_Sig(func, extargs={'A':1.}, Method='Vol', Mode='simps', PreComp=True, Colis=True, dX12=[0.005, 0.005], dX12Mode='abs', ds=0.005, dsMode='abs', draw=False, a4=True, MarginS=0.001)
plt.close('all')
def test14_plot_Res(self):
ax = self.Obj._plot_Res(ax=None, plotfunc='scatter', NC=20, draw=False, a4=False, Test=True)
ax = self.Obj._plot_Res(ax=None, plotfunc='contourf', NC=20, draw=False, a4=True, Test=True)
plt.close('all')
def test15_saveload(self):
self.Obj.save(verb=False)
obj = tfpf.Open(self.Obj.Id.SavePath + self.Obj.Id.SaveName + '.npz')
os.remove(self.Obj.Id.SavePath + self.Obj.Id.SaveName + '.npz')
class Test20_GDetectLensLin:
@classmethod
def setup_class(cls, Ves=VesTor):
print ("")
print "--------- "+VerbHead+cls.__name__
LD = []
O = np.array([0.,Ves._P1Min[0],Ves._P2Max[1]])
nIn = np.array([0.,1.,-1.])
Rad, F1 = 0.005, 0.010
Lens = tfg.Lens('Test', O, nIn, Rad, F1, Ves=Ves, Type='Sph', Exp='AUG', Diag='Test', shot=0, SavePath=Root+Addpath)
ld = [('d01',0.),('d02',-0.01),('d03',-0.02)]
for (dd,dz) in ld:
O = np.array([0.,Ves._P1Min[0],Ves._P2Max[1]-dz])
Lens = tfg.Lens('Test', O, nIn, Rad, F1, Ves=Ves, Type='Sph', Exp='AUG', Diag='Test', shot=0, SavePath=Root+Addpath)
LD.append(tfg.Detect(dd, {'Rad':0.001}, Optics=Lens, Ves=Ves, Exp='AUG', Diag='Test', shot=0, SavePath=Root+Addpath,
CalcEtend=True, CalcSpanImp=True, CalcCone=True, CalcPreComp=False, Calc=True, Verb=False,
Etend_Method='simps', Etend_dX12=[0.05,0.05], Etend_dX12Mode='rel',
Cone_DRY=0.005, Cone_DXTheta=0.005, Cone_DZ=0.005))
cls.Obj = tfg.GDetect('LG', LD, Exp='AUG', Diag='Test', shot=0, SavePath=Root+Addpath)
@classmethod
def teardown_class(cls):
#print ("teardown_class() after any methods in this class")
pass
def setup(self):
#print ("TestUM:setup() before each test method")
pass
def teardown(self):
#print ("TestUM:teardown() after each test method")
pass
def test01_select(self):
ind = self.Obj.select(Val='d01', Crit='Name', PreExp=None, PostExp=None, Log='any', InOut='In', Out=bool)
ind = self.Obj.select(Val='d02', Crit='Name', PreExp=None, PostExp=None, Log='any', InOut='In', Out=int)
ind = self.Obj.select(Val=['d01','d03'], Crit='Name', PreExp=None, PostExp=None, Log='any', InOut='Out', Out=int)
def test02_isInside(self, NR=10,NZ=10):
R = np.linspace(self.Obj.Ves._P1Min[0],self.Obj.Ves._P1Max[0],NR)
Z = np.linspace(self.Obj.Ves._P2Min[0],self.Obj.Ves._P2Max[0],NZ)
Pts = np.array([np.tile(R,(NZ,1)).flatten(), np.tile(Z,(NR,1)).T.flatten()])
indRZ = self.Obj.isInside(Pts, In='(R,Z)', Test=True)
Thet = np.pi/4.
Pts = np.array([Pts[0,:]*np.cos(Thet), Pts[0,:]*np.sin(Thet), Pts[1,:]])
ind = self.Obj.isInside(Pts, In='(X,Y,Z)', Test=True)
assert np.all(indRZ==ind)
def test03_get_GLOS(self):
GLOS = self.Obj.get_GLOS(Name='GLOSExtract')
def test04_calc_SAngVect(self, NR=10,NZ=10):
R = np.linspace(self.Obj.Ves._P1Min[0],self.Obj.Ves._P1Max[0],NR)
Z = np.linspace(self.Obj.Ves._P2Min[0],self.Obj.Ves._P2Max[0],NZ)
Pts = np.array([np.tile(R,(NZ,1)).flatten(), np.tile(Z,(NR,1)).T.flatten()])
SAngRZ1, VectRZ1 = self.Obj.calc_SAngVect(Pts, In='(R,Z)', Colis=False, Test=True)
SAngRZ, VectRZ = self.Obj.calc_SAngVect(Pts, In='(R,Z)', Colis=True, Test=True)
Thet = np.arctan2(self.Obj.LDetect[0].LOS[self.Obj._LOSRef]['PRef'][1],self.Obj.LDetect[0].LOS[self.Obj._LOSRef]['PRef'][0])
Pts = np.array([Pts[0,:]*np.cos(Thet), Pts[0,:]*np.sin(Thet), Pts[1,:]])
SAng1, Vect1 = self.Obj.calc_SAngVect(Pts, In='(X,Y,Z)', Colis=False, Test=True)
SAng, Vect = self.Obj.calc_SAngVect(Pts, In='(X,Y,Z)', Colis=True, Test=True)
def test05_calc_Sig(self):
func = lambda Pts, A=1.: A*np.exp(-(((np.hypot(Pts[0,:],Pts[1,:])-1.7)/0.3)**2 + ((Pts[2,:]-0.)/0.5)**2))
Sig1, GD1 = self.Obj.calc_Sig(func, extargs={'A':1.}, Method='Vol', Mode='simps', PreComp=True, Colis=True, dX12=[0.005, 0.005], dX12Mode='abs', ds=0.005, dsMode='abs', MarginS=0.001, Val=['d01','d03'])
Sig2, GD2 = self.Obj.calc_Sig(func, extargs={'A':1.}, Method='Vol', Mode='sum', PreComp=False, Colis=True, dX12=[0.005, 0.005], dX12Mode='abs', ds=0.005, dsMode='abs', MarginS=0.001, Val=['d01','d03'])
Sig3, GD3 = self.Obj.calc_Sig(func, extargs={'A':1.}, Method='LOS', Mode='trapz', PreComp=True, Colis=True, ds=0.005, dsMode='abs', MarginS=0.001, Val=['d01','d03'])
Sig4, GD4 = self.Obj.calc_Sig(func, extargs={'A':1.}, Method='LOS', Mode='quad', PreComp=False, Colis=True, epsrel=1.e-4, MarginS=0.001, Val=['d01','d03'])
assert np.all(np.abs(Sig1-Sig2)<0.001*Sig1), str(Sig1)+" vs "+str(Sig2)
assert np.all(np.abs(Sig3-Sig4)<0.001*Sig3), str(Sig3)+" vs "+str(Sig4)
#def test06_calc_SAngNb(self):
# SA, ind, Pts = self.Obj.calc_SAngNb(Pts=None, Proj='Cross', Slice='Int', DRY=None, DXTheta=None, DZ=None, Colis=True)
# SA, ind, Pts = self.Obj.calc_SAngNb(Pts=None, Proj='Hor', Slice='Int', DRY=None, DXTheta=None, DZ=None, Colis=True)
# SA, ind, Pts = self.Obj.calc_SAngNb(Pts=None, Proj='Cross', Slice='Int', DRY=None, DXTheta=None, DZ=None, Colis=False)
# SA, ind, Pts = self.Obj.calc_SAngNb(Pts=None, Proj='Hor', Slice='Int', DRY=None, DXTheta=None, DZ=None, Colis=False)
def test07_set_Res(self):
self.Obj._set_Res(CrossMesh=[0.1,0.1], CrossMeshMode='abs', Mode='Iso', Amp=1., Deg=0, steps=0.01, Thres=0.05, ThresMode='rel', ThresMin=0.01,
IntResCross=[0.1,0.1], IntResCrossMode='rel', IntResLong=0.1, IntResLongMode='rel', Eq=None, Ntt=50, EqName=None, save=False, Test=True)
def test08_plot(self):
Lax = self.Obj.plot(Proj='All', Elt='PV', EltLOS='LIO', EltOptics='P', EltVes='P', draw=False, a4=False, Test=True)
Lax = self.Obj.plot(Proj='Cross', Elt='PC', EltLOS='DIORP', EltOptics='PV', EltVes='', draw=False, a4=False, Test=True)
Lax = self.Obj.plot(Proj='Hor', Elt='PVC', EltLOS='L', EltOptics='', EltVes='P', draw=False, a4=False, Test=True)
plt.close('all')
def test09_plot_SAngNb(self):
Lax = self.Obj.plot_SAngNb(Lax=None, Proj='Cross', Slice='Int', Pts=None, plotfunc='scatter', DRY=None, DXTheta=None, DZ=None, Elt='P', EltVes='P', EltLOS='L', EltOptics='P', Colis=True, a4=False, draw=False, Test=True)
Lax = self.Obj.plot_SAngNb(Lax=None, Proj='Hor', Slice='Max', Pts=None, plotfunc='scatter', DRY=None, DXTheta=None, DZ=None, Elt='P', EltVes='P', EltLOS='', EltOptics='P', Colis=True, a4=False, draw=False, Test=True)
plt.close('all')
def test10_plot_Etend_AlongLOS(self):
ax = self.Obj.plot_Etend_AlongLOS(ax=None, NP=2, kMode='rel', Modes=['trapz','simps'], dX12=[0.005, 0.005], dX12Mode='abs', Ratio=0.02, LOSPts=True, Colis=True, draw=False, a4=True, Test=True, Val=['d01','d03'])
ax = self.Obj.plot_Etend_AlongLOS(ax=None, NP=2, kMode='rel', Modes=['quad'], RelErr=1.e-3, Ratio=0.01, LOSPts=True, Colis=False, draw=False, a4=False, Test=True, Val=['d01','d03'])
plt.close('all')
def test11_plot_Sinogram(self):
ax = self.Obj.plot_Sinogram(ax=None, Proj='Cross', Elt='DLV', Ang='theta', AngUnit='rad', Sketch=True, LOSRef=None, draw=False, a4=False, Test=True)
ax = self.Obj.plot_Sinogram(ax=None, Proj='Cross', Elt='DLV', Ang='xi', AngUnit='deg', Sketch=False, LOSRef=None, draw=False, a4=True, Test=True)
plt.close('all')
def test12_plot_Etendues(self):
ax = self.Obj.plot_Etendues(Mode='Etend', Elt='', ax=None, draw=False, a4=False, Test=True, Val='d02', InOut='Out')
plt.close('all')
def test13_plot_Sig(self):
func = lambda Pts, A=1.: A*np.exp(-(((np.hypot(Pts[0,:],Pts[1,:])-1.7)/0.3)**2 + ((Pts[2,:]-0.)/0.5)**2))
ax = self.Obj.plot_Sig(func, extargs={'A':1.}, Method='Vol', Mode='simps', PreComp=True, Colis=True, dX12=[0.005, 0.005], dX12Mode='abs', ds=0.005, dsMode='abs', draw=False, a4=True, MarginS=0.001)
plt.close('all')
def test14_plot_Res(self):
ax = self.Obj._plot_Res(ax=None, plotfunc='scatter', NC=20, draw=False, a4=False, Test=True)
ax = self.Obj._plot_Res(ax=None, plotfunc='contourf', NC=20, draw=False, a4=True, Test=True)
plt.close('all')
def test15_saveload(self):
self.Obj.save(verb=False)
obj = tfpf.Open(self.Obj.Id.SavePath + self.Obj.Id.SaveName + '.npz')
os.remove(self.Obj.Id.SavePath + self.Obj.Id.SaveName + '.npz')
"""