From db712d0373f9a508cad085c676d36cab84602fd2 Mon Sep 17 00:00:00 2001 From: VEZINET Didier Date: Mon, 25 Nov 2019 10:52:22 +0100 Subject: [PATCH 01/18] [Issue218] Added safety check in tf.data.Plasma2D._set_dindrefdatagroup() for dradius, to handle cases with one time step only --- tofu/data/_core.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tofu/data/_core.py b/tofu/data/_core.py index adbfd68e7..efac182c4 100644 --- a/tofu/data/_core.py +++ b/tofu/data/_core.py @@ -2634,6 +2634,10 @@ def _set_dindrefdatagroup(self, dtime=None, dradius=None, dmesh=None, lkt = [k for k in dtime.keys() if k in dradius[k0]['depend']] assert len(lkt) == 1 axist = dradius[k0]['depend'].index(lkt[0]) + # Handle cases with only 1 time step + if data.ndim == 1: + assert dindref[lkt[0]]['size'] == 1 + data = data.reshape((1, data.size)) size = data.shape[1-axist] dindref[k0] = {'size':size, 'group':'radius'} From 806afc51a9332c3c3fbb172624375679b830aaca Mon Sep 17 00:00:00 2001 From: VEZINET Didier Date: Mon, 25 Nov 2019 13:11:14 +0100 Subject: [PATCH 02/18] [Issue218] Plasma2D extraction doesn't thrwo an error anymore, but extraction of 2d rectagular grid is not operational yet --- tofu/imas2tofu/_core.py | 170 +++++++++++++++++++++++++--------------- 1 file changed, 107 insertions(+), 63 deletions(-) diff --git a/tofu/imas2tofu/_core.py b/tofu/imas2tofu/_core.py index da640dc47..1a71bb941 100644 --- a/tofu/imas2tofu/_core.py +++ b/tofu/imas2tofu/_core.py @@ -1805,7 +1805,8 @@ def _set_fsig(self): self._dshort[ids][k]['fsig'] = self._get_fsig(v['str']) def _get_data(self, ids, sig, occ, comp=False, indt=None, indch=None, - stack=True, isclose=True, flatocc=True, nan=True, pos=None): + stack=True, isclose=True, flatocc=True, nan=True, + pos=None, warn=True): # get list of results for occ occref = self._dids[ids]['occ'] @@ -1814,9 +1815,10 @@ def _get_data(self, ids, sig, occ, comp=False, indt=None, indch=None, if comp: lstr = self._dcomp[ids][sig]['lstr'] kargs = self._dcomp[ids][sig].get('kargs', {}) - ddata = self.get_data(ids=ids, sig=lstr, - occ=occ, indch=indch, indt=indt, - stack=stack, flatocc=False, nan=nan, pos=pos) + ddata, _ = self.get_data(ids=ids, sig=lstr, + occ=occ, indch=indch, indt=indt, + stack=stack, flatocc=False, nan=nan, + pos=pos, warn=warn) out = [self._dcomp[ids][sig]['func']( *[ddata[kk][nn] for kk in lstr], **kargs ) for nn in range(0,nocc)] @@ -1855,7 +1857,7 @@ def _get_data(self, ids, sig, occ, comp=False, indt=None, indch=None, def get_data(self, ids=None, sig=None, occ=None, indch=None, indt=None, stack=True, - isclose=None, flatocc=True, nan=True, pos=None): + isclose=None, flatocc=True, nan=True, pos=None, warn=True): """ Return a dict of the desired signals extracted from specified ids If the ids has a field 'channel', indch is used to specify from which @@ -1894,8 +1896,8 @@ def get_data(self, ids=None, sig=None, occ=None, # ------------------ # get data - dout = dict.fromkeys(sig) - for ii in range(0,len(sig)): + dout, dfail = {}, {} + for ii in range(0, len(sig)): if isclose is None: isclose_ = sig[ii] == 't' else: @@ -1905,13 +1907,14 @@ def get_data(self, ids=None, sig=None, occ=None, indt=indt, indch=indch, stack=stack, isclose=isclose_, flatocc=flatocc, nan=nan, - pos=pos) + pos=pos, warn=warn) except Exception as err: - msg = '\n' + str(err) + '\n' - msg += '\tIn ids %s, signal %s not loaded !'%(ids,sig[ii]) - warnings.warn(msg) - del dout[sig[ii]] - return dout + dfail[sig[ii]] = str(err) + if warn: + msg = '\n' + str(err) + '\n' + msg += '\tIn ids %s, signal %s not loaded !'%(ids,sig[ii]) + warnings.warn(msg) + return dout, dfail def get_data_all(self, dsig=None, stack=True, isclose=None, flatocc=True, nan=True, pos=None): @@ -1934,14 +1937,29 @@ def get_data_all(self, dsig=None, stack=True, assert all([type(v) in [str,list] or v is None for v in dsig.values()]) # Get data + dfail = dict.fromkeys(dout.keys()) + anyerror = False for ids in dout.keys(): try: - dout[ids] = self.get_data(ids, sig=dsig[ids], stack=stack, - isclose=isclose, flatocc=flatocc, - nan=nan, pos=pos) + dout[ids], dfail[ids] = self.get_data(ids, sig=dsig[ids], + stack=stack, + isclose=isclose, + flatocc=flatocc, nan=nan, + pos=pos, warn=False) + if len(dfail[ids]) > 0: + anyerror = True except Exception as err: msg = "Could not get data from %s"%ids warnings.warn(msg) + if anyerror: + msg = "The following data could not be retrieved:" + for ids, v0 in dfail.items(): + if len(v0) == 0: + continue + msg += "\n\t- {}:".format(ids) + for k1, v1 in v0.items(): + msg += "\n\t\t{0} : {1}".format(k1, v1.replace('\n', ' ')) + warnings.warn(msg) return dout @@ -2012,8 +2030,8 @@ def _get_t0(self, t0=None): c0 = (len(t0.split('.')) <= 2 and all([ss.isdecimal() for ss in t0.split('.')])) if 'pulse_schedule' in self._dids.keys(): - events = self.get_data(ids='pulse_schedule', - sig='events')['events'] + events, _ = self.get_data(ids='pulse_schedule', + sig='events')['events'] if t0 in events['name']: t0 = events['t'][np.nonzero(events['name'] == t0)[0][0]] elif c0: @@ -2179,7 +2197,7 @@ def _checkformat_Plasma2D_dsig(self, dsig=None): @staticmethod - def _checkformat_mesh(nodes, indfaces, ids=None): + def _checkformat_mesh_NodesFaces(nodes, indfaces, ids=None): # Check mesh type if indfaces.shape[1] == 3: @@ -2301,6 +2319,10 @@ def inspect_ggd(ids): npts = ggd.space[ll].objects_per_dimension[0].object[0] + @staticmethod + def _checkformat_mesh_Rect(R, Z, ids=None): + pass + @@ -2374,7 +2396,7 @@ def _get_dextra(self, dextra=None, fordata=False, nan=True, pos=None): for ids, vv in dextra.items(): vs = [vvv if type(vvv) is str else vvv[0] for vvv in vv] vc = ['k' if type(vvv) is str else vvv[1] for vvv in vv] - out = self.get_data(ids=ids, sig=vs, nan=nan, pos=pos) + out, _ = self.get_data(ids=ids, sig=vs, nan=nan, pos=pos) inds = [ii for ii in range(0,len(vs)) if vs[ii] in out.keys()] for ii in inds: ss = vs[ii] @@ -2407,7 +2429,7 @@ def _get_dextra(self, dextra=None, fordata=False, nan=True, pos=None): for ids, vv in dextra.items(): vs = [vvv if type(vvv) is str else vvv[0] for vvv in vv] vc = ['k' if type(vvv) is str else vvv[1] for vvv in vv] - out = self.get_data(ids=ids, sig=vs, nan=nan, pos=pos) + out, _ = self.get_data(ids=ids, sig=vs, nan=nan, pos=pos) keyt = '%s.t'%ids any_ = False for ss in out.keys(): @@ -2490,7 +2512,7 @@ def to_Plasma2D(self, tlim=None, dsig=None, t0=None, _, _, shot, Exp = self._get_lidsidd_shotExp(lids, upper=True, errshot=True, errExp=True) # get data - out_ = self.get_data_all(dsig=dsig) + out0 = self.get_data_all(dsig=dsig) # ------------- # Input dicts @@ -2507,10 +2529,12 @@ def to_Plasma2D(self, tlim=None, dsig=None, t0=None, d1d, dradius = {}, {} d2d, dmesh = {}, {} for ids in lids: + # Hotfiw to avoid calling get_data a second time out0 -> out_ + # TBF in next release (ugly, sub-optimal...) # dtime - out_ = self.get_data(ids, sig='t') - lc = [len(out_) == 1, out_['t'].size > 0, 0 not in out_['t'].shape] + out_ = {'t': out0[ids].get('t')} + lc = [len(out_['t']) == 1, out_['t'].size > 0, 0 not in out_['t'].shape] keyt, nt, indt = None, None, None if all(lc): nt = out_['t'].size @@ -2522,8 +2546,9 @@ def to_Plasma2D(self, tlim=None, dsig=None, t0=None, indt = dtt['indt'] # d1d and dradius - lsig = [k for k in dsig[ids] if '1d' in k] - out_ = self.get_data(ids, lsig, indt=indt, nan=nan, pos=pos) + lsig = [k for k in dsig[ids] if '1d' in k and k in out0.keys()] + out_, _ = self.get_data(ids, lsig, indt=indt, nan=nan, pos=pos, + warn=False) if len(out_) > 0: nref, kref = None, None for ss in out_.keys(): @@ -2583,14 +2608,15 @@ def to_Plasma2D(self, tlim=None, dsig=None, t0=None, plot_X[plot_X.index(ss)] = key # d2d and dmesh - lsig = [k for k in dsig[ids] if '2d' in k] - lsigmesh = ['2dmeshNodes','2dmeshFaces'] - out_ = self.get_data(ids, sig=lsig, indt=indt, nan=nan, pos=pos) + lsig = [k for k in dsig[ids] if '2d' in k and k in out0.keys()] + lsigmesh = [k for k in lsig if 'mesh' in k] + out_, _ = self.get_data(ids, sig=lsig, indt=indt, nan=nan, pos=pos, + warn=False) - lc = [len(out_) > 0, all([ss in out_.keys() for ss in lsigmesh])] - if all(lc): + cmesh = any([ss in out_.keys() for ss in lsigmesh]) + if len(out_) > 0: npts = None - keym = '%s.mesh'%ids + keym = '%s.mesh'%ids if cmesh else None for ss in set(out_.keys()).difference(lsigmesh): assert out_[ss].ndim in [1,2] if out_[ss].ndim == 1: @@ -2618,29 +2644,46 @@ def to_Plasma2D(self, tlim=None, dsig=None, t0=None, d2d[key] = {'data':out_[ss], 'name':ss, 'dim':dim, 'quant':quant, 'units':units, - 'origin':ids, 'depend':(keyt,keym)} - - nodes = out_['2dmeshNodes'] - indfaces = out_['2dmeshFaces'] - indfaces,meshtype,ntri = self._checkformat_mesh(nodes,indfaces, - ids=ids) - nnod, nfaces = int(nodes.size/2), indfaces.shape[0] - if npts is not None: - if npts not in [nnod, int(nfaces/ntri)]: - msg = "There is an indexing unconsistency:\n" - msg += " - 2d profiles have npts = %s\n"%str(npts) - msg += " - mesh has %s nodes\n"%str(nnod) - msg += " %s faces"%str(int(nfaces/ntri)) + 'origin':ids, 'depend':(keyt, keym)} + + if cmesh: + lc = [all([ss in lsig for ss in ['2dmeshNodes', + '2dmeshFaces']]), + all([ss in lsig for ss in ['2dmeshR', '2dmeshZ']])] + if not np.sum(lc) == 1: + msg = ("2d mesh shall be provided either via:\n" + + "\t- '2dmeshR' and '2dmeshZ'\n" + + "\t- '2dmeshNodes' and '2dmeshFaces'") raise Exception(msg) - ftype = 1 if npts == nnod else 0 - else: - ftype = None - mpltri = mpl.tri.Triangulation(nodes[:,0], nodes[:,1], indfaces) - dmesh[keym] = {'dim':'mesh', 'quant':'mesh', 'units':'a.u.', - 'origin':ids, 'depend':(keym,), 'name':meshtype, - 'nodes':nodes, 'faces':indfaces, - 'type':meshtype, 'ntri':ntri, 'ftype':ftype, - 'nnodes':nnod,'nfaces':nfaces, 'mpltri':mpltri} + + # Nodes / Faces case + if lc[0]: + nodes = out_['2dmeshNodes'] + indfaces = out_['2dmeshFaces'] + func = self._checkformat_mesh_NodesFaces + indfaces,meshtype,ntri = func(nodes, indfaces, ids=ids) + nnod, nfaces = int(nodes.size/2), indfaces.shape[0] + if npts is not None: + if npts not in [nnod, int(nfaces/ntri)]: + msg = "There is an indexing unconsistency:\n" + msg += " - 2d profiles have npts = %s\n"%str(npts) + msg += " - mesh has %s nodes\n"%str(nnod) + msg += " %s faces"%str(int(nfaces/ntri)) + raise Exception(msg) + ftype = 1 if npts == nnod else 0 + else: + ftype = None + mpltri = mpl.tri.Triangulation(nodes[:,0], nodes[:,1], indfaces) + dmesh[keym] = {'dim':'mesh', 'quant':'mesh', 'units':'a.u.', + 'origin':ids, 'depend':(keym,), 'name':meshtype, + 'nodes':nodes, 'faces':indfaces, + 'type':meshtype, 'ntri':ntri, 'ftype':ftype, + 'nnodes':nnod,'nfaces':nfaces, 'mpltri':mpltri} + # R / Z case + elif lc[1]: + func = self._checkformat_mesh_Rect + pass + # t0 t0 = self._get_t0(t0) @@ -2690,7 +2733,7 @@ def _checkformat_Cam_geom(self, ids=None, geomcls=None, indch=None): def _to_Cam_Du(self, ids, lk, indch, nan=None, pos=None): Etendues, Surfaces = None, None - out = self.get_data(ids, sig=list(lk), indch=indch, + out, _ = self.get_data(ids, sig=list(lk), indch=indch, nan=nan, pos=pos) if 'los_ptsRZPhi' in out.keys() and out['los_ptsRZPhi'].size > 0: oo = out['los_ptsRZPhi'] @@ -2947,7 +2990,7 @@ def to_Data(self, ids=None, dsig=None, data=None, X=None, tlim=None, # data lk = sorted(dsig.keys()) dins = dict.fromkeys(lk) - t = self.get_data(ids, sig=dsig.get('t', 't'), indch=indch)['t'] + t, _ = self.get_data(ids, sig=dsig.get('t', 't'), indch=indch)['t'] if len(t) == 0: msg = "The time vector is not available for %s:\n"%ids msg += " - 't' <=> %s.%s\n"%(ids,self._dshort[ids]['t']['str']) @@ -2964,7 +3007,7 @@ def to_Data(self, ids=None, dsig=None, data=None, X=None, tlim=None, else: indchcam = [ii for ii in range(0,len(t)) if ls[ii] == su] indch = [indch[ii] for ii in range(0,len(t)) if ls[ii] == su] - t = self.get_data(ids, sig='t', indch=indch)['t'] + t, _ = self.get_data(ids, sig='t', indch=indch)['t'] if cam is not None: cam = cam.get_subset(indch=indchcam) msg = "indch set automatically for %s\n"%ids @@ -2996,7 +3039,7 @@ def to_Data(self, ids=None, dsig=None, data=None, X=None, tlim=None, indt = self._checkformat_tlim(t, tlim=tlim)['indt'] - out = self.get_data(ids, sig=[dsig[k] for k in lk], + out, _ = self.get_data(ids, sig=[dsig[k] for k in lk], indt=indt, indch=indch, nan=nan, pos=pos) for kk in set(lk).difference('t'): if not isinstance(out[dsig[kk]], np.ndarray): @@ -3011,7 +3054,7 @@ def to_Data(self, ids=None, dsig=None, data=None, X=None, tlim=None, else: indch = [indch[ii] for ii in range(0,len(out[dsig[kk]])) if ls[ii] == su] - out = self.get_data(ids, sig=[dsig[k] for k in lk], + out, _ = self.get_data(ids, sig=[dsig[k] for k in lk], indt=indt, indch=indch, nan=nan, pos=pos) if cam is not None: @@ -3070,8 +3113,9 @@ def to_Data(self, ids=None, dsig=None, data=None, X=None, tlim=None, dins['data'] = np.fliplr(dins['data']) if 'validity_timed' in self._dshort[ids].keys(): - inan = self.get_data(ids, sig='validity_timed', - indt=indt, indch=indch, nan=nan, pos=pos)['validity_timed'].T<0. + inan, _ = self.get_data(ids, sig='validity_timed', + indt=indt, indch=indch, + nan=nan, pos=pos)['validity_timed'].T<0. dins['data'][inan] = np.nan if 'X' in dins.keys() and np.any(np.isnan(dins['X'])): if fallback_X is None: @@ -3209,7 +3253,7 @@ def calc_signal(self, ids=None, dsig=None, tlim=None, t=None, res=None, ani = False if ids == 'bremsstrahlung_visible': try: - lamb = self.get_data(ids, sig='lamb')['lamb'] + lamb, _ = self.get_data(ids, sig='lamb')['lamb'] except Exception as err: lamb = 5238.e-10 msg = "bremsstrahlung_visible.lamb could not be retrived!\n" @@ -3228,7 +3272,7 @@ def calc_signal(self, ids=None, dsig=None, tlim=None, t=None, res=None, dq['quant'] = ['core_profiles.1dbrem'] elif ids == 'polarimeter': - lamb = self.get_data(ids, sig='lamb')['lamb'][0] + lamb, _ = self.get_data(ids, sig='lamb')['lamb'][0] # Get time reference doutt, dtut, tref = plasma.get_time_common(lq) From b0584b351268fa4d5bf7022716b929aca2d1a87b Mon Sep 17 00:00:00 2001 From: VEZINET Didier Date: Mon, 25 Nov 2019 15:14:14 +0100 Subject: [PATCH 03/18] [Issue218] Modifying MultiIDSLoader.to_Plasma2D() and tf.data.Plasma2D() to handle 'rect' meshes (nearest interpolation) --- tofu/data/_core.py | 208 ++++++++++++++++++++++++++++------------ tofu/imas2tofu/_core.py | 14 ++- tofu/version.py | 2 +- 3 files changed, 159 insertions(+), 65 deletions(-) diff --git a/tofu/data/_core.py b/tofu/data/_core.py index efac182c4..66db791d1 100644 --- a/tofu/data/_core.py +++ b/tofu/data/_core.py @@ -2373,7 +2373,7 @@ def _checkformat_dtrm(dtime=None, dradius=None, dmesh=None, 'depend'] lkmeshmax = ['type','ftype','nodes','faces', 'nfaces','nnodes','mpltri','size','ntri'] - lkmeshmin = ['type','ftype','nodes','faces'] + lkmeshmin = ['type', 'ftype'] dkok = {'dtime': {'max':lkok, 'min':['data'], 'ndim':[1]}, 'dradius':{'max':lkok, 'min':['data'], 'ndim':[1,2]}, 'd0d':{'max':lkok, 'min':['data'], 'ndim':[1,2,3]}, @@ -2418,61 +2418,143 @@ def _checkformat_dtrm(dtime=None, dradius=None, dmesh=None, msg += " - Expected: %s\n"%str(dkok[dk]['ndim']) msg += " - Provided: %s"%str(dd[dk][k0]['data'].ndim) raise Exception(msg) - if dk == 'dmesh': - dd[dk][k0]['nodes'] = np.atleast_2d(v0['nodes']).astype(float) - dd[dk][k0]['faces'] = np.atleast_2d(v0['faces']).astype(int) - nnodes = dd[dk][k0]['nodes'].shape[0] - nfaces = dd[dk][k0]['faces'].shape[0] - - # Test for duplicates - nodesu = np.unique(dd[dk][k0]['nodes'], axis=0) - facesu = np.unique(dd[dk][k0]['faces'], axis=0) - lc = [nodesu.shape[0] != nnodes, - facesu.shape[0] != nfaces] - if any(lc): - msg = "Non-valid mesh %s[%s]:\n"%(dk,k0) - if lc[0]: - msg += " Duplicate nodes: %s\n"%str(nnodes - nodesu.shape[0]) - msg += " - nodes.shape: %s\n"%str(dd[dk][k0]['nodes'].shape) - msg += " - unique nodes.shape: %s\n"%str(nodesu.shape) - if lc[1]: - msg += " Duplicate faces: %s\n"%str(nfaces - facesu.shape[0]) - msg += " - faces.shape: %s\n"%str(dd[dk][k0]['faces'].shape) - msg += " - unique faces.shape: %s"%str(facesu.shape) - raise Exception(msg) - # Test for unused nodes - facesu = np.unique(facesu) - c0 = np.all(facesu>=0) and facesu.size == nnodes - if not c0: - indnot = [ii for ii in range(0,nnodes) - if ii not in facesu] - msg = "Some nodes not used in mesh %s[%s]:\n"(dk,k0) - msg += " - unused nodes indices: %s"%str(indnot) - warnings.warn(msg) - - - dd[dk][k0]['nnodes'] = dd[dk][k0].get('nnodes', nnodes) - dd[dk][k0]['nfaces'] = dd[dk][k0].get('nfaces', nfaces) - - assert dd[dk][k0]['nodes'].shape == (v0['nnodes'],2) - assert np.max(dd[dk][k0]['faces']) < v0['nnodes'] - # Only triangular meshes so far - assert v0['type'] in ['tri', 'quadtri'], v0['type'] - - if 'tri' in v0['type']: - assert dd[dk][k0]['faces'].shape == (v0['nfaces'],3) - if v0.get('mpltri', None) is None: - dd[dk][k0]['mpltri'] = mplTri(dd[dk][k0]['nodes'][:,0], - dd[dk][k0]['nodes'][:,1], - dd[dk][k0]['faces']) - assert isinstance(dd[dk][k0]['mpltri'], mplTri) - assert dd[dk][k0]['ftype'] in [0,1] - ntri = dd[dk][k0]['ntri'] - if dd[dk][k0]['ftype'] == 1: - dd[dk][k0]['size'] = dd[dk][k0]['nnodes'] + # mesh + if dk == 'dmesh': + assert v0['type'] in ['rect', 'tri', 'quadtri'], v0['type'] + if v0['type'] == 'rect': + c0 = all([ss in v0.keys() and v0[ss].ndim in [1, 2] + for ss in ['R', 'Z']]) + if not c0: + msg = ("A mesh of type 'rect' must have attr.:\n" + + "\t- R of dim in [1, 2]\n" + + "\t- Z of dim in [1, 2]") + raise Exception(msg) + shapeu = np.unique(np.r_[v0['R'].shape, v0['Z'].shape]) + if shapeRZ is None: + shapeRZ = [None, None] else: - dd[dk][k0]['size'] = int(dd[dk][k0]['nfaces']/ntri) + shapeRZ = list(shapeRZ) + if v0['R'].ndim == 1: + assert np.all(np.diff(v0['R']) > 0.) + R = v0['R'] + else: + lc = [np.diff(v0['R'][0, :]) > 0., + np.diff(v0['R'][:, 0]) > 0.] + assert np.sum(lc) == 1 + if lc[0]: + R = v0['R'][0, :] + if shapeRZ[1] is None: + shapeRZ[1] = 'R' + assert shapeRZ[1] == 'R' + else: + R = v0['R'][:, 0] + if shapeRZ[0] is None: + shapeRZ[0] = 'R' + assert shapeRZ[0] = 'R' + if v0['Z'].ndim == 1: + assert np.all(np.diff(v0['Z']) > 0.) + Z = v0['Z'] + else: + lc = [np.diff(v0['Z'][0, :]) > 0., + np.diff(v0['Z'][:, 0]) > 0.] + assert np.sum(lc) == 1 + if lc[0]: + Z = v0['Z'][0, :] + if shapeRZ[1] is None: + shapeRZ[1] = 'Z' + assert shapeRZ[1] == 'Z' + else: + Z = v0['Z'][:, 0] + if shapeRZ[0] is None: + shapeRZ[0] = 'Z' + assert shapeRZ[0] = 'Z' + shapeRZ = tuple(shapeRZ) + assert shapeRZ in [('R', 'Z'), ('Z', 'R')] + + if None in shapeRZ: + msg = ("Please provide shapeRZ " + + " = ('R', 'Z') or ('Z', 'R')\n" + + "(Could not be inferred from data) itself)") + raise Exception(msg) + + def trifind(r, z, + Rbin=0.5*(R[1:] + R[:-1]), + Zbin=0.5*(Z[1:] + Z[:-1]), + nR=R.size, nZ=Z.size, shapeRZ=shapeRZ): + indR = np.searchsorted(Rbin, r) + indZ = np.searchsorted(Zbin, z) + if shapeRZ == ('R', 'Z'): + indpts = indR*nZ + indZ + else: + indpts = indZ*nR + indR + return indpts + + dd[dk][k0]['R'] = R + dd[dk][k0]['Z'] = Z + dd[dk][k0]['shapeRZ'] = shapeRZ + dd[dk][k0]['nR'] = R.size + dd[dk][k0]['nZ'] = Z.size + dd[dk][k0]['trifind'] = trifind + assert dd[dk][k0]['ftype'] == 0 + dd[dk][k0]['size'] = R.size*Z.size + + else: + assert all([ss in v0.keys() for ss in ['nodes', 'faces']]) + dd[dk][k0]['nodes'] = np.atleast_2d(v0['nodes']).astype(float) + dd[dk][k0]['faces'] = np.atleast_2d(v0['faces']).astype(int) + nnodes = dd[dk][k0]['nodes'].shape[0] + nfaces = dd[dk][k0]['faces'].shape[0] + + # Test for duplicates + nodesu = np.unique(dd[dk][k0]['nodes'], axis=0) + facesu = np.unique(dd[dk][k0]['faces'], axis=0) + lc = [nodesu.shape[0] != nnodes, + facesu.shape[0] != nfaces] + if any(lc): + msg = "Non-valid mesh %s[%s]:\n"%(dk,k0) + if lc[0]: + msg += " Duplicate nodes: %s\n"%str(nnodes - nodesu.shape[0]) + msg += " - nodes.shape: %s\n"%str(dd[dk][k0]['nodes'].shape) + msg += " - unique nodes.shape: %s\n"%str(nodesu.shape) + if lc[1]: + msg += " Duplicate faces: %s\n"%str(nfaces - facesu.shape[0]) + msg += " - faces.shape: %s\n"%str(dd[dk][k0]['faces'].shape) + msg += " - unique faces.shape: %s"%str(facesu.shape) + raise Exception(msg) + + # Test for unused nodes + facesu = np.unique(facesu) + c0 = np.all(facesu>=0) and facesu.size == nnodes + if not c0: + indnot = [ii for ii in range(0,nnodes) + if ii not in facesu] + msg = "Some nodes not used in mesh %s[%s]:\n"(dk,k0) + msg += " - unused nodes indices: %s"%str(indnot) + warnings.warn(msg) + + + dd[dk][k0]['nnodes'] = dd[dk][k0].get('nnodes', nnodes) + dd[dk][k0]['nfaces'] = dd[dk][k0].get('nfaces', nfaces) + + assert dd[dk][k0]['nodes'].shape == (v0['nnodes'],2) + assert np.max(dd[dk][k0]['faces']) < v0['nnodes'] + # Only triangular meshes so far + assert v0['type'] in ['tri', 'quadtri'], v0['type'] + + if 'tri' in v0['type']: + assert dd[dk][k0]['faces'].shape == (v0['nfaces'],3) + if v0.get('mpltri', None) is None: + dd[dk][k0]['mpltri'] = mplTri(dd[dk][k0]['nodes'][:,0], + dd[dk][k0]['nodes'][:,1], + dd[dk][k0]['faces']) + assert isinstance(dd[dk][k0]['mpltri'], mplTri) + assert dd[dk][k0]['ftype'] in [0,1] + ntri = dd[dk][k0]['ntri'] + if dd[dk][k0]['ftype'] == 1: + dd[dk][k0]['size'] = dd[dk][k0]['nnodes'] + else: + dd[dk][k0]['size'] = int(dd[dk][k0]['nfaces']/ntri) # Check unicity of all keys lk = [list(dv.keys()) for dv in dd.values()] @@ -3608,22 +3690,27 @@ def _get_finterp(self, assert len(lidmesh) == 1 idmesh = lidmesh[0] - # Get mesh - mpltri = self._ddata[idmesh]['data']['mpltri'] - trifind = mpltri.get_trifinder() - # Get common time indices if interp_t == 'nearest': - out = self._get_tcom(idquant,idref1d, idref2d, idq2dR) + out = self._get_tcom(idquant, idref1d, idref2d, idq2dR) tall, tbinall, ntall, indtq, indtr1, indtr2= out + # Get mesh + if self._ddata[idmesh]['data']['mpltri'] == 'rect': + mpltri = None + trifind = self._ddata[idmesh]['data']['trifind'] + else: + mpltri = self._ddata[idmesh]['data']['mpltri'] + trifind = mpltri.get_trifinder() + # # Prepare output # Interpolate # Note : Maybe consider using scipy.LinearNDInterpolator ? if idquant is not None: vquant = self._ddata[idquant]['data'] - if self._ddata[idmesh]['data']['ntri'] > 1: + if (self._ddata[idmesh]['data']['mpltri'] == 'quadtri' + and self._ddata[idmesh]['data']['ntri'] > 1): vquant = np.repeat(vquant, self._ddata[idmesh]['data']['ntri'], axis=0) else: @@ -3658,7 +3745,6 @@ def _get_finterp(self, indtq=indtq, indtr1=indtr1, indtr2=indtr2, trifind=trifind) - return func diff --git a/tofu/imas2tofu/_core.py b/tofu/imas2tofu/_core.py index 1a71bb941..4131ec19e 100644 --- a/tofu/imas2tofu/_core.py +++ b/tofu/imas2tofu/_core.py @@ -2615,7 +2615,7 @@ def to_Plasma2D(self, tlim=None, dsig=None, t0=None, cmesh = any([ss in out_.keys() for ss in lsigmesh]) if len(out_) > 0: - npts = None + npts, datashape = None, None keym = '%s.mesh'%ids if cmesh else None for ss in set(out_.keys()).difference(lsigmesh): assert out_[ss].ndim in [1,2] @@ -2681,8 +2681,16 @@ def to_Plasma2D(self, tlim=None, dsig=None, t0=None, 'nnodes':nnod,'nfaces':nfaces, 'mpltri':mpltri} # R / Z case elif lc[1]: - func = self._checkformat_mesh_Rect - pass + func = self._checkformat_mesh_Rect + R, Z, shapeRZ, ftype = func(out_['2dmeshR'], + out_['2dmeshZ'], + datashape=datashape) + dmesh[keym] = {'dim': 'mesh', 'quant': 'mesh', + 'units': 'a.u.', 'origin': ids, + 'depend': (keym,), 'name': meshtype, + 'R': R, 'Z': Z, 'shapeRZ': shapeRZ + 'type': 'rect', 'size': size, + 'ftype': ftype} # t0 diff --git a/tofu/version.py b/tofu/version.py index 7ac6f1128..c4f86fc36 100644 --- a/tofu/version.py +++ b/tofu/version.py @@ -1,2 +1,2 @@ # Do not edit, pipeline versioning governed by git tags! -__version__ = '1.4.2-alpha2-20-gb97c0f0' +__version__ = '1.4.2-alpha2-28-g806afc5' From 635ceab70dba5c048a77f0fe4e7c9eb5c8439ac7 Mon Sep 17 00:00:00 2001 From: VEZINET Didier Date: Mon, 25 Nov 2019 17:45:45 +0100 Subject: [PATCH 04/18] [Issue218] Interpolation on Rect grid now seems operational, for 'nearest' interp only --- tofu/data/_comp.py | 4 +- tofu/data/_core.py | 42 ++++++++++------ tofu/imas2tofu/_core.py | 107 +++++++++++++++++++++++++++++++++++----- 3 files changed, 123 insertions(+), 30 deletions(-) diff --git a/tofu/data/_comp.py b/tofu/data/_comp.py index a18728a1b..95fdf34bb 100644 --- a/tofu/data/_comp.py +++ b/tofu/data/_comp.py @@ -450,8 +450,8 @@ def func(pts, vect=None, t=None, ntall=ntall, indpts = trifind(r,z) indok = indpts > -1 if t is None: - for ii in range(0,ntall): - val[ii,indok] = vquant[indtq[ii],indpts[indok]] + for ii in range(0, ntall): + val[ii,indok] = vquant[indtq[ii], indpts[indok]] t = tall else: ntall, indt, indtu = plasma._get_indtu(t=t, tall=tall, diff --git a/tofu/data/_core.py b/tofu/data/_core.py index 66db791d1..4fea9f5c6 100644 --- a/tofu/data/_core.py +++ b/tofu/data/_core.py @@ -2371,7 +2371,7 @@ def _checkformat_dtrm(dtime=None, dradius=None, dmesh=None, # Define allowed keys for each dict lkok = ['data', 'dim', 'quant', 'name', 'origin', 'units', 'depend'] - lkmeshmax = ['type','ftype','nodes','faces', + lkmeshmax = ['type','ftype','nodes','faces', 'R', 'Z', 'shapeRZ', 'nfaces','nnodes','mpltri','size','ntri'] lkmeshmin = ['type', 'ftype'] dkok = {'dtime': {'max':lkok, 'min':['data'], 'ndim':[1]}, @@ -2431,6 +2431,8 @@ def _checkformat_dtrm(dtime=None, dradius=None, dmesh=None, + "\t- Z of dim in [1, 2]") raise Exception(msg) shapeu = np.unique(np.r_[v0['R'].shape, v0['Z'].shape]) + + shapeRZ = v0['shapeRZ'] if shapeRZ is None: shapeRZ = [None, None] else: @@ -2439,8 +2441,8 @@ def _checkformat_dtrm(dtime=None, dradius=None, dmesh=None, assert np.all(np.diff(v0['R']) > 0.) R = v0['R'] else: - lc = [np.diff(v0['R'][0, :]) > 0., - np.diff(v0['R'][:, 0]) > 0.] + lc = [np.all(np.diff(v0['R'][0, :])) > 0., + np.all(np.diff(v0['R'][:, 0])) > 0.] assert np.sum(lc) == 1 if lc[0]: R = v0['R'][0, :] @@ -2451,13 +2453,13 @@ def _checkformat_dtrm(dtime=None, dradius=None, dmesh=None, R = v0['R'][:, 0] if shapeRZ[0] is None: shapeRZ[0] = 'R' - assert shapeRZ[0] = 'R' + assert shapeRZ[0] == 'R' if v0['Z'].ndim == 1: assert np.all(np.diff(v0['Z']) > 0.) Z = v0['Z'] else: - lc = [np.diff(v0['Z'][0, :]) > 0., - np.diff(v0['Z'][:, 0]) > 0.] + lc = [np.all(np.diff(v0['Z'][0, :])) > 0., + np.all(np.diff(v0['Z'][:, 0])) > 0.] assert np.sum(lc) == 1 if lc[0]: Z = v0['Z'][0, :] @@ -2468,7 +2470,7 @@ def _checkformat_dtrm(dtime=None, dradius=None, dmesh=None, Z = v0['Z'][:, 0] if shapeRZ[0] is None: shapeRZ[0] = 'Z' - assert shapeRZ[0] = 'Z' + assert shapeRZ[0] == 'Z' shapeRZ = tuple(shapeRZ) assert shapeRZ in [('R', 'Z'), ('Z', 'R')] @@ -2476,12 +2478,13 @@ def _checkformat_dtrm(dtime=None, dradius=None, dmesh=None, msg = ("Please provide shapeRZ " + " = ('R', 'Z') or ('Z', 'R')\n" + "(Could not be inferred from data) itself)") - raise Exception(msg) + raise Exception(msg) def trifind(r, z, Rbin=0.5*(R[1:] + R[:-1]), Zbin=0.5*(Z[1:] + Z[:-1]), - nR=R.size, nZ=Z.size, shapeRZ=shapeRZ): + nR=R.size, nZ=Z.size, + shapeRZ=shapeRZ): indR = np.searchsorted(Rbin, r) indZ = np.searchsorted(Zbin, z) if shapeRZ == ('R', 'Z'): @@ -2529,7 +2532,7 @@ def trifind(r, z, if not c0: indnot = [ii for ii in range(0,nnodes) if ii not in facesu] - msg = "Some nodes not used in mesh %s[%s]:\n"(dk,k0) + msg = "Some nodes not used in mesh %s[%s]:\n"%(dk,k0) msg += " - unused nodes indices: %s"%str(indnot) warnings.warn(msg) @@ -3598,13 +3601,22 @@ def _get_indtmult(self, idquant=None, idref1d=None, idref2d=None): # Get indtqr1r2 (tall with respect to tq, tr1, tr2) indtq, indtr1, indtr2 = None, None, None - indtq = np.digitize(tall, tbinq) + if tbinq.size > 0: + indtq = np.digitize(tall, tbinq) + else: + indtq = np.r_[0] if idref1d is None: assert np.all(indtq == np.arange(0,tall.size)) if idref1d is not None: - indtr1 = np.digitize(tall, tbinr1) + if tbinr1.size > 0: + indtr1 = np.digitize(tall, tbinr1) + else: + indtr1 = np.r_[0] if idref2d is not None: - indtr2 = np.digitize(tall, tbinr2) + if tbinr2.size > 0: + indtr2 = np.digitize(tall, tbinr2) + else: + indtr2 = np.r_[0] ntall = tall.size return tall, tbinall, ntall, indtq, indtr1, indtr2 @@ -3696,7 +3708,7 @@ def _get_finterp(self, tall, tbinall, ntall, indtq, indtr1, indtr2= out # Get mesh - if self._ddata[idmesh]['data']['mpltri'] == 'rect': + if self._ddata[idmesh]['data']['type'] == 'rect': mpltri = None trifind = self._ddata[idmesh]['data']['trifind'] else: @@ -3709,7 +3721,7 @@ def _get_finterp(self, # Note : Maybe consider using scipy.LinearNDInterpolator ? if idquant is not None: vquant = self._ddata[idquant]['data'] - if (self._ddata[idmesh]['data']['mpltri'] == 'quadtri' + if (self._ddata[idmesh]['data']['type'] == 'quadtri' and self._ddata[idmesh]['data']['ntri'] > 1): vquant = np.repeat(vquant, self._ddata[idmesh]['data']['ntri'], axis=0) diff --git a/tofu/imas2tofu/_core.py b/tofu/imas2tofu/_core.py index 4131ec19e..623577087 100644 --- a/tofu/imas2tofu/_core.py +++ b/tofu/imas2tofu/_core.py @@ -2296,7 +2296,7 @@ def _checkformat_mesh_NodesFaces(nodes, indfaces, ids=None): # TBF - def inspect_ggd(ids): + def inspect_ggd(self, ids): if ids not in self._dids.keys(): msg = "The ggd of ids %s cannot be inspected:\n"%ids msg += " => please add ids first (self.add_ids())" @@ -2320,8 +2320,60 @@ def inspect_ggd(ids): @staticmethod - def _checkformat_mesh_Rect(R, Z, ids=None): - pass + def _checkformat_mesh_Rect(R, Z, datashape=None, + shapeRZ=None, ids=None): + assert R.ndim in [1, 2] + assert Z.ndim in [1, 2] + shapeu = np.unique(np.r_[R.shape, Z.shape]) + shapeRZ = [None, None] + if R.ndim == 1: + assert np.all(np.diff(R) > 0.) + else: + lc = [np.all(np.diff(R[0, :])) > 0., + np.all(np.diff(R[:, 0])) > 0.] + assert np.sum(lc) == 1 + if lc[0]: + R = R[0, :] + if shapeRZ[1] is None: + shapeRZ[1] = 'R' + assert shapeRZ[1] == 'R' + else: + R = R[:, 0] + if shapeRZ[0] is None: + shapeRZ[0] = 'R' + assert shapeRZ[0] == 'R' + if Z.ndim == 1: + assert np.all(np.diff(Z) > 0.) + else: + lc = [np.all(np.diff(Z[0, :])) > 0., + np.all(np.diff(Z[:, 0])) > 0.] + assert np.sum(lc) == 1 + if lc[0]: + Z = Z[0, :] + if shapeRZ[1] is None: + shapeRZ[1] = 'Z' + assert shapeRZ[1] == 'Z' + else: + Z = Z[:, 0] + if shapeRZ[0] is None: + shapeRZ[0] = 'Z' + assert shapeRZ[0] == 'Z' + + if datashape is not None: + if None in shapeRZ: + pass + + if shapeRZ == ['R', 'Z']: + assert datashape == (R.size, Z.size) + elif shapeRZ == ['Z', 'R']: + assert datashape == (Z.size, R.size) + else: + msg = "Inconsistent data shape !" + raise Exception(msg) + + shapeRZ = tuple(shapeRZ) + assert shapeRZ in [('R', 'Z'), ('Z', 'R')] + return R, Z, shapeRZ, 0 @@ -2463,7 +2515,7 @@ def _get_dextra(self, dextra=None, fordata=False, nan=True, pos=None): def to_Plasma2D(self, tlim=None, dsig=None, t0=None, Name=None, occ=None, config=None, out=object, plot=None, plot_sig=None, plot_X=None, - bck=True, dextra=None, nan=True, pos=None): + bck=True, dextra=None, nan=True, pos=None, shapeRZ=None): # dsig dsig = self._checkformat_Plasma2D_dsig(dsig) @@ -2546,7 +2598,7 @@ def to_Plasma2D(self, tlim=None, dsig=None, t0=None, indt = dtt['indt'] # d1d and dradius - lsig = [k for k in dsig[ids] if '1d' in k and k in out0.keys()] + lsig = [k for k in dsig[ids] if '1d' in k and k in out0[ids].keys()] out_, _ = self.get_data(ids, lsig, indt=indt, nan=nan, pos=pos, warn=False) if len(out_) > 0: @@ -2608,7 +2660,7 @@ def to_Plasma2D(self, tlim=None, dsig=None, t0=None, plot_X[plot_X.index(ss)] = key # d2d and dmesh - lsig = [k for k in dsig[ids] if '2d' in k and k in out0.keys()] + lsig = [k for k in dsig[ids] if '2d' in k and k in out0[ids].keys()] lsigmesh = [k for k in lsig if 'mesh' in k] out_, _ = self.get_data(ids, sig=lsig, indt=indt, nan=nan, pos=pos, warn=False) @@ -2622,9 +2674,38 @@ def to_Plasma2D(self, tlim=None, dsig=None, t0=None, if out_[ss].ndim == 1: out_[ss] = np.atleast_2d(out_[ss]) shape = out_[ss].shape - assert len(shape) == 2 + assert len(shape) >= 2 if np.sum(shape) > 0: - assert nt in shape + if nt not in shape: + assert nt == 1 + assert len(shape) == 2 + datashape = tuple(shape) + if shapeRZ is None: + msg = ("Please provide shapeRZ" + + "indexing is ambiguous") + raise Exception(msg) + size = shape[0]*shape[1] + if shapeRZ == ('R', 'Z'): + out_[ss] = out_[ss].reshape((nt, size)) + elif shapeRZ == ('Z', 'R'): + out_[ss] = out_[ss].reshape((nt, size), + order='F') + shape = out_[ss].shape + if len(shape) == 3: + assert nt == shape[0] + datashape = tuple(shape[1], shape[2]) + if shapeRZ is None: + msg = ("Please provide shapeRZ" + + "indexing is ambiguous") + raise Exception(msg) + size = shape[1]*shape[2] + if shapeRZ == ('R', 'Z'): + out_[ss] = out_[ss].reshape((nt, size)) + elif shapeRZ == ('Z', 'R'): + out_[ss] = out_[ss].reshape((nt, size), + order='F') + shape = out_[ss].shape + axist = shape.index(nt) if npts is None: npts = shape[1-axist] @@ -2684,13 +2765,13 @@ def to_Plasma2D(self, tlim=None, dsig=None, t0=None, func = self._checkformat_mesh_Rect R, Z, shapeRZ, ftype = func(out_['2dmeshR'], out_['2dmeshZ'], - datashape=datashape) + datashape=datashape, + shapeRZ=shapeRZ, ids=ids) dmesh[keym] = {'dim': 'mesh', 'quant': 'mesh', 'units': 'a.u.', 'origin': ids, - 'depend': (keym,), 'name': meshtype, - 'R': R, 'Z': Z, 'shapeRZ': shapeRZ - 'type': 'rect', 'size': size, - 'ftype': ftype} + 'depend': (keym,), 'name': 'rect', + 'R': R, 'Z': Z, 'shapeRZ': shapeRZ, + 'type': 'rect', 'ftype': ftype} # t0 From 224aaf43f127e0f7a619966cee4683d767956559 Mon Sep 17 00:00:00 2001 From: VEZINET Didier Date: Mon, 25 Nov 2019 18:15:00 +0100 Subject: [PATCH 05/18] [Issue218] PEP8 Compliance 1 --- tofu/data/_comp.py | 2 +- tofu/data/_core.py | 35 ++++++++++++++++++++++------------- tofu/version.py | 2 +- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/tofu/data/_comp.py b/tofu/data/_comp.py index 95fdf34bb..77abb52cb 100644 --- a/tofu/data/_comp.py +++ b/tofu/data/_comp.py @@ -451,7 +451,7 @@ def func(pts, vect=None, t=None, ntall=ntall, indok = indpts > -1 if t is None: for ii in range(0, ntall): - val[ii,indok] = vquant[indtq[ii], indpts[indok]] + val[ii, indok] = vquant[indtq[ii], indpts[indok]] t = tall else: ntall, indt, indtu = plasma._get_indtu(t=t, tall=tall, diff --git a/tofu/data/_core.py b/tofu/data/_core.py index 4fea9f5c6..0a39b7c6b 100644 --- a/tofu/data/_core.py +++ b/tofu/data/_core.py @@ -2371,8 +2371,8 @@ def _checkformat_dtrm(dtime=None, dradius=None, dmesh=None, # Define allowed keys for each dict lkok = ['data', 'dim', 'quant', 'name', 'origin', 'units', 'depend'] - lkmeshmax = ['type','ftype','nodes','faces', 'R', 'Z', 'shapeRZ', - 'nfaces','nnodes','mpltri','size','ntri'] + lkmeshmax = ['type', 'ftype', 'nodes', 'faces', 'R', 'Z', 'shapeRZ', + 'nfaces', 'nnodes', 'mpltri', 'size', 'ntri'] lkmeshmin = ['type', 'ftype'] dkok = {'dtime': {'max':lkok, 'min':['data'], 'ndim':[1]}, 'dradius':{'max':lkok, 'min':['data'], 'ndim':[1,2]}, @@ -2477,7 +2477,7 @@ def _checkformat_dtrm(dtime=None, dradius=None, dmesh=None, if None in shapeRZ: msg = ("Please provide shapeRZ " + " = ('R', 'Z') or ('Z', 'R')\n" - + "(Could not be inferred from data) itself)") + + "Could not be inferred from data itself") raise Exception(msg) def trifind(r, z, @@ -2503,9 +2503,10 @@ def trifind(r, z, dd[dk][k0]['size'] = R.size*Z.size else: - assert all([ss in v0.keys() for ss in ['nodes', 'faces']]) - dd[dk][k0]['nodes'] = np.atleast_2d(v0['nodes']).astype(float) - dd[dk][k0]['faces'] = np.atleast_2d(v0['faces']).astype(int) + assert all([s in v0.keys() for s in ['nodes', 'faces']]) + func = np.atleast_2d + dd[dk][k0]['nodes'] = func(v0['nodes']).astype(float) + dd[dk][k0]['faces'] = func(v0['faces']).astype(int) nnodes = dd[dk][k0]['nodes'].shape[0] nfaces = dd[dk][k0]['faces'].shape[0] @@ -2515,15 +2516,23 @@ def trifind(r, z, lc = [nodesu.shape[0] != nnodes, facesu.shape[0] != nfaces] if any(lc): - msg = "Non-valid mesh %s[%s]:\n"%(dk,k0) + msg = "Non-valid mesh {0}[{1}]: \n".format(dk,k0) if lc[0]: - msg += " Duplicate nodes: %s\n"%str(nnodes - nodesu.shape[0]) - msg += " - nodes.shape: %s\n"%str(dd[dk][k0]['nodes'].shape) - msg += " - unique nodes.shape: %s\n"%str(nodesu.shape) + ndup = nnodes - nodesu.shape[0] + ndsh = dd[dk][k0]['nodes'].shape + undsh = nodesu.shape + msg += ( + " Duplicate nodes: {}\n".format(ndup) + + "\t- nodes.shape: {}\n".format(nodsh) + + "\t- unique shape: {}\n".format(undsh)) if lc[1]: - msg += " Duplicate faces: %s\n"%str(nfaces - facesu.shape[0]) - msg += " - faces.shape: %s\n"%str(dd[dk][k0]['faces'].shape) - msg += " - unique faces.shape: %s"%str(facesu.shape) + ndup = str(nfaces - facesu.shape[0]) + facsh = str(dd[dk][k0]['faces'].shape) + ufacsh = str(facesu.shape) + msg += ( + " Duplicate faces: {}\n".format(ndup) + + "\t- faces.shape: {}\n".format(facsh) + + "\ŧ- unique shape: {}".format(ufacsh)) raise Exception(msg) # Test for unused nodes diff --git a/tofu/version.py b/tofu/version.py index c4f86fc36..b9bc9214f 100644 --- a/tofu/version.py +++ b/tofu/version.py @@ -1,2 +1,2 @@ # Do not edit, pipeline versioning governed by git tags! -__version__ = '1.4.2-alpha2-28-g806afc5' +__version__ = '1.4.2-alpha2-30-g635ceab' From dda19c2c18a52583fde166c01487bd5d2c9d5324 Mon Sep 17 00:00:00 2001 From: VEZINET Didier Date: Mon, 25 Nov 2019 21:37:09 +0100 Subject: [PATCH 06/18] [Issue218] PEP8 Compliance 2 --- tofu/data/_core.py | 43 +++++++++++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/tofu/data/_core.py b/tofu/data/_core.py index 0a39b7c6b..f01c00716 100644 --- a/tofu/data/_core.py +++ b/tofu/data/_core.py @@ -2503,7 +2503,8 @@ def trifind(r, z, dd[dk][k0]['size'] = R.size*Z.size else: - assert all([s in v0.keys() for s in ['nodes', 'faces']]) + ls = ['nodes', 'faces'] + assert all([s in v0.keys() for s in ls]) func = np.atleast_2d dd[dk][k0]['nodes'] = func(v0['nodes']).astype(float) dd[dk][k0]['faces'] = func(v0['faces']).astype(int) @@ -2516,7 +2517,7 @@ def trifind(r, z, lc = [nodesu.shape[0] != nnodes, facesu.shape[0] != nfaces] if any(lc): - msg = "Non-valid mesh {0}[{1}]: \n".format(dk,k0) + msg = "Non-valid mesh {0}[{1}]: \n".format(dk, k0) if lc[0]: ndup = nnodes - nodesu.shape[0] ndsh = dd[dk][k0]['nodes'].shape @@ -2532,16 +2533,16 @@ def trifind(r, z, msg += ( " Duplicate faces: {}\n".format(ndup) + "\t- faces.shape: {}\n".format(facsh) - + "\ŧ- unique shape: {}".format(ufacsh)) + + "\t- unique shape: {}".format(ufacsh)) raise Exception(msg) # Test for unused nodes facesu = np.unique(facesu) - c0 = np.all(facesu>=0) and facesu.size == nnodes + c0 = np.all(facesu >= 0) and facesu.size == nnodes if not c0: - indnot = [ii for ii in range(0,nnodes) + indnot = [ii for ii in range(0, nnodes) if ii not in facesu] - msg = "Some nodes not used in mesh %s[%s]:\n"%(dk,k0) + msg = "Unused nodes in {0}[{1}]:\n".format(dk, k0) msg += " - unused nodes indices: %s"%str(indnot) warnings.warn(msg) @@ -2555,28 +2556,38 @@ def trifind(r, z, assert v0['type'] in ['tri', 'quadtri'], v0['type'] if 'tri' in v0['type']: - assert dd[dk][k0]['faces'].shape == (v0['nfaces'],3) + fshap = dd[dk][k0]['faces'].shape + fshap0 = (v0['nfaces', 3]) + if fshap != fshap0: + msg = ("Wrong shape of {}[{}]\n".format(dk, k0) + + "\t- Expected: {}\n".format(fshap0) + + "\t- Provided: {}".format(fshap) + raise Exception(msg) if v0.get('mpltri', None) is None: - dd[dk][k0]['mpltri'] = mplTri(dd[dk][k0]['nodes'][:,0], - dd[dk][k0]['nodes'][:,1], - dd[dk][k0]['faces']) + dd[dk][k0]['mpltri'] = mplTri( + dd[dk][k0]['nodes'][:, 0], + dd[dk][k0]['nodes'][:, 1], + dd[dk][k0]['faces']) assert isinstance(dd[dk][k0]['mpltri'], mplTri) - assert dd[dk][k0]['ftype'] in [0,1] + assert dd[dk][k0]['ftype'] in [0, 1] ntri = dd[dk][k0]['ntri'] if dd[dk][k0]['ftype'] == 1: dd[dk][k0]['size'] = dd[dk][k0]['nnodes'] else: - dd[dk][k0]['size'] = int(dd[dk][k0]['nfaces']/ntri) + dd[dk][k0]['size'] = int( + dd[dk][k0]['nfaces']/ntri) # Check unicity of all keys lk = [list(dv.keys()) for dv in dd.values()] lk = list(itt.chain.from_iterable(lk)) lku = sorted(set(lk)) - lk = ['%s : %s times'%(kk, str(lk.count(kk))) for kk in lku if lk.count(kk) > 1] + lk = ['%s : %s times'%(kk, str(lk.count(kk))) + for kk in lku if lk.count(kk) > 1] if len(lk) > 0: - msg = "Each key of (dtime,dradius,dmesh,d0d,d1d,d2d) must be unique !\n" - msg += "The following keys are repeated :\n" - msg += " - " + "\n - ".join(lk) + msg = ("Each key of (dtime, dradius, dmesh, d0d, d1d, d2d)" + + " must be unique !\n" + + "The following keys are repeated :\n" + + " - " + "\n - ".join(lk)) raise Exception(msg) dtime, dradius, dmesh = dd['dtime'], dd['dradius'], dd['dmesh'] From 2a6f8ee6396dfd08706638a99b3ab53438ad5024 Mon Sep 17 00:00:00 2001 From: VEZINET Didier Date: Mon, 25 Nov 2019 23:02:43 +0100 Subject: [PATCH 07/18] [Issue218] PEP8 Compliance 3 --- tofu/data/_core.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tofu/data/_core.py b/tofu/data/_core.py index f01c00716..90d1cc356 100644 --- a/tofu/data/_core.py +++ b/tofu/data/_core.py @@ -2540,17 +2540,16 @@ def trifind(r, z, facesu = np.unique(facesu) c0 = np.all(facesu >= 0) and facesu.size == nnodes if not c0: - indnot = [ii for ii in range(0, nnodes) - if ii not in facesu] + ino = str([ii for ii in range(0, nnodes) + if ii not in facesu]) msg = "Unused nodes in {0}[{1}]:\n".format(dk, k0) - msg += " - unused nodes indices: %s"%str(indnot) + msg += " - unused nodes indices: {}".format(ino) warnings.warn(msg) - dd[dk][k0]['nnodes'] = dd[dk][k0].get('nnodes', nnodes) dd[dk][k0]['nfaces'] = dd[dk][k0].get('nfaces', nfaces) - assert dd[dk][k0]['nodes'].shape == (v0['nnodes'],2) + assert dd[dk][k0]['nodes'].shape == (v0['nnodes'], 2) assert np.max(dd[dk][k0]['faces']) < v0['nnodes'] # Only triangular meshes so far assert v0['type'] in ['tri', 'quadtri'], v0['type'] @@ -2575,7 +2574,8 @@ def trifind(r, z, dd[dk][k0]['size'] = dd[dk][k0]['nnodes'] else: dd[dk][k0]['size'] = int( - dd[dk][k0]['nfaces']/ntri) + dd[dk][k0]['nfaces'] / ntri + ) # Check unicity of all keys lk = [list(dv.keys()) for dv in dd.values()] From b1386173ca7bbf2e19cf963aaa12bb0541d93935 Mon Sep 17 00:00:00 2001 From: VEZINET Didier Date: Tue, 26 Nov 2019 08:49:29 +0100 Subject: [PATCH 08/18] [Issue218] PEP8 Compliance 4 --- tofu/data/_core.py | 2 +- tofu/version.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tofu/data/_core.py b/tofu/data/_core.py index 90d1cc356..8aeccebb6 100644 --- a/tofu/data/_core.py +++ b/tofu/data/_core.py @@ -2560,7 +2560,7 @@ def trifind(r, z, if fshap != fshap0: msg = ("Wrong shape of {}[{}]\n".format(dk, k0) + "\t- Expected: {}\n".format(fshap0) - + "\t- Provided: {}".format(fshap) + + "\t- Provided: {}".format(fshap)) raise Exception(msg) if v0.get('mpltri', None) is None: dd[dk][k0]['mpltri'] = mplTri( diff --git a/tofu/version.py b/tofu/version.py index b9bc9214f..5e359d019 100644 --- a/tofu/version.py +++ b/tofu/version.py @@ -1,2 +1,2 @@ # Do not edit, pipeline versioning governed by git tags! -__version__ = '1.4.2-alpha2-30-g635ceab' +__version__ = '1.4.2-alpha2-33-g2a6f8ee' From 15af797001ac3f0fd995f6b83c0c6c9f22b94efa Mon Sep 17 00:00:00 2001 From: VEZINET Didier Date: Tue, 26 Nov 2019 08:51:51 +0100 Subject: [PATCH 09/18] [Issue218] PEP8 Compliance 5 --- tofu/data/_core.py | 11 ++++++----- tofu/version.py | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/tofu/data/_core.py b/tofu/data/_core.py index 8aeccebb6..1edbbcb0c 100644 --- a/tofu/data/_core.py +++ b/tofu/data/_core.py @@ -2581,7 +2581,7 @@ def trifind(r, z, lk = [list(dv.keys()) for dv in dd.values()] lk = list(itt.chain.from_iterable(lk)) lku = sorted(set(lk)) - lk = ['%s : %s times'%(kk, str(lk.count(kk))) + lk = ['{0} : {1} times'.format(kk, str(lk.count(kk))) for kk in lku if lk.count(kk) > 1] if len(lk) > 0: msg = ("Each key of (dtime, dradius, dmesh, d0d, d1d, d2d)" @@ -3724,8 +3724,8 @@ def _get_finterp(self, # Get common time indices if interp_t == 'nearest': - out = self._get_tcom(idquant, idref1d, idref2d, idq2dR) - tall, tbinall, ntall, indtq, indtr1, indtr2= out + out = self._get_tcom(idquant, idref1d, idref2d, idq2dR) + tall, tbinall, ntall, indtq, indtr1, indtr2= out # Get mesh if self._ddata[idmesh]['data']['type'] == 'rect': @@ -3741,8 +3741,9 @@ def _get_finterp(self, # Note : Maybe consider using scipy.LinearNDInterpolator ? if idquant is not None: vquant = self._ddata[idquant]['data'] - if (self._ddata[idmesh]['data']['type'] == 'quadtri' - and self._ddata[idmesh]['data']['ntri'] > 1): + c0 = (self._ddata[idmesh]['data']['type'] == 'quadtri' + and self._ddata[idmesh]['data']['ntri'] > 1) + if c0: vquant = np.repeat(vquant, self._ddata[idmesh]['data']['ntri'], axis=0) else: diff --git a/tofu/version.py b/tofu/version.py index 5e359d019..35f3b5cea 100644 --- a/tofu/version.py +++ b/tofu/version.py @@ -1,2 +1,2 @@ # Do not edit, pipeline versioning governed by git tags! -__version__ = '1.4.2-alpha2-33-g2a6f8ee' +__version__ = '1.4.2-alpha2-34-gb138617' From ff603f7127e26006271dff70e2c3f41e265dd397 Mon Sep 17 00:00:00 2001 From: VEZINET Didier Date: Tue, 26 Nov 2019 08:59:09 +0100 Subject: [PATCH 10/18] [Issue218] PEP8 Compliance 6 --- tofu/data/_core.py | 2 +- tofu/imas2tofu/_core.py | 41 ++++++++++++++++++++++------------------- tofu/version.py | 2 +- 3 files changed, 24 insertions(+), 21 deletions(-) diff --git a/tofu/data/_core.py b/tofu/data/_core.py index 1edbbcb0c..35dcbed25 100644 --- a/tofu/data/_core.py +++ b/tofu/data/_core.py @@ -3725,7 +3725,7 @@ def _get_finterp(self, # Get common time indices if interp_t == 'nearest': out = self._get_tcom(idquant, idref1d, idref2d, idq2dR) - tall, tbinall, ntall, indtq, indtr1, indtr2= out + tall, tbinall, ntall, indtq, indtr1, indtr2 = out # Get mesh if self._ddata[idmesh]['data']['type'] == 'rect': diff --git a/tofu/imas2tofu/_core.py b/tofu/imas2tofu/_core.py index 623577087..6452fb30d 100644 --- a/tofu/imas2tofu/_core.py +++ b/tofu/imas2tofu/_core.py @@ -1912,7 +1912,7 @@ def get_data(self, ids=None, sig=None, occ=None, dfail[sig[ii]] = str(err) if warn: msg = '\n' + str(err) + '\n' - msg += '\tIn ids %s, signal %s not loaded !'%(ids,sig[ii]) + msg += '\tsignal {0}.{1} not loaded!'.format(ids, sig[ii]) warnings.warn(msg) return dout, dfail @@ -2294,9 +2294,8 @@ def _checkformat_mesh_NodesFaces(nodes, indfaces, ids=None): indfaces[indclock,2]) = indfaces[indclock,2], indfaces[indclock,1] return indfaces, meshtype, ntri - - # TBF def inspect_ggd(self, ids): + # TBF if ids not in self._dids.keys(): msg = "The ggd of ids %s cannot be inspected:\n"%ids msg += " => please add ids first (self.add_ids())" @@ -2318,7 +2317,6 @@ def inspect_ggd(self, ids): for ll in range(0,nspace): npts = ggd.space[ll].objects_per_dimension[0].object[0] - @staticmethod def _checkformat_mesh_Rect(R, Z, datashape=None, shapeRZ=None, ids=None): @@ -2586,7 +2584,9 @@ def to_Plasma2D(self, tlim=None, dsig=None, t0=None, # dtime out_ = {'t': out0[ids].get('t')} - lc = [len(out_['t']) == 1, out_['t'].size > 0, 0 not in out_['t'].shape] + lc = [len(out_['t']) == 1, + out_['t'].size > 0, + 0 not in out_['t'].shape] keyt, nt, indt = None, None, None if all(lc): nt = out_['t'].size @@ -2598,7 +2598,8 @@ def to_Plasma2D(self, tlim=None, dsig=None, t0=None, indt = dtt['indt'] # d1d and dradius - lsig = [k for k in dsig[ids] if '1d' in k and k in out0[ids].keys()] + lsig = [k for k in dsig[ids] + if '1d' in k and k in out0[ids].keys()] out_, _ = self.get_data(ids, lsig, indt=indt, nan=nan, pos=pos, warn=False) if len(out_) > 0: @@ -2660,7 +2661,8 @@ def to_Plasma2D(self, tlim=None, dsig=None, t0=None, plot_X[plot_X.index(ss)] = key # d2d and dmesh - lsig = [k for k in dsig[ids] if '2d' in k and k in out0[ids].keys()] + lsig = [k for k in dsig[ids] + if '2d' in k and k in out0[ids].keys()] lsigmesh = [k for k in lsig if 'mesh' in k] out_, _ = self.get_data(ids, sig=lsig, indt=indt, nan=nan, pos=pos, warn=False) @@ -2668,7 +2670,7 @@ def to_Plasma2D(self, tlim=None, dsig=None, t0=None, cmesh = any([ss in out_.keys() for ss in lsigmesh]) if len(out_) > 0: npts, datashape = None, None - keym = '%s.mesh'%ids if cmesh else None + keym = '{}.mesh'.format(ids) if cmesh else None for ss in set(out_.keys()).difference(lsigmesh): assert out_[ss].ndim in [1,2] if out_[ss].ndim == 1: @@ -2723,9 +2725,9 @@ def to_Plasma2D(self, tlim=None, dsig=None, t0=None, units = self._dcomp[ids][ss].get('units', 'a.u.') key = '%s.%s'%(ids,ss) - d2d[key] = {'data':out_[ss], 'name':ss, - 'dim':dim, 'quant':quant, 'units':units, - 'origin':ids, 'depend':(keyt, keym)} + d2d[key] = {'data': out_[ss], 'name': ss, + 'dim': dim, 'quant': quant, 'units': units, + 'origin': ids, 'depend': (keyt, keym)} if cmesh: lc = [all([ss in lsig for ss in ['2dmeshNodes', @@ -2754,12 +2756,15 @@ def to_Plasma2D(self, tlim=None, dsig=None, t0=None, ftype = 1 if npts == nnod else 0 else: ftype = None - mpltri = mpl.tri.Triangulation(nodes[:,0], nodes[:,1], indfaces) - dmesh[keym] = {'dim':'mesh', 'quant':'mesh', 'units':'a.u.', - 'origin':ids, 'depend':(keym,), 'name':meshtype, - 'nodes':nodes, 'faces':indfaces, - 'type':meshtype, 'ntri':ntri, 'ftype':ftype, - 'nnodes':nnod,'nfaces':nfaces, 'mpltri':mpltri} + mpltri = mpl.tri.Triangulation(nodes[:, 0], + nodes[:, 1], indfaces) + dmesh[keym] = {'dim': 'mesh', 'quant': 'mesh', + 'units': 'a.u.', 'origin': ids, + 'depend': (keym,), 'name': meshtype, + 'nodes': nodes, 'faces': indfaces, + 'type': meshtype, 'ntri': ntri, + 'ftype': ftype, 'nnodes': nnod, + 'nfaces': nfaces, 'mpltri': mpltri} # R / Z case elif lc[1]: func = self._checkformat_mesh_Rect @@ -2773,14 +2778,12 @@ def to_Plasma2D(self, tlim=None, dsig=None, t0=None, 'R': R, 'Z': Z, 'shapeRZ': shapeRZ, 'type': 'rect', 'ftype': ftype} - # t0 t0 = self._get_t0(t0) if t0 != False: for tt in dtime.keys(): dtime[tt]['data'] = dtime[tt]['data'] - t0 - plasma = dict(dtime=dtime, dradius=dradius, dmesh=dmesh, d0d=d0d, d1d=d1d, d2d=d2d, Exp=Exp, shot=shot, Name=Name, config=config) diff --git a/tofu/version.py b/tofu/version.py index 35f3b5cea..d7f83d9d7 100644 --- a/tofu/version.py +++ b/tofu/version.py @@ -1,2 +1,2 @@ # Do not edit, pipeline versioning governed by git tags! -__version__ = '1.4.2-alpha2-34-gb138617' +__version__ = '1.4.2-alpha2-35-g15af797' From 395a555a63d29e7b63227facce0d956b543e728f Mon Sep 17 00:00:00 2001 From: VEZINET Didier Date: Tue, 26 Nov 2019 09:06:33 +0100 Subject: [PATCH 11/18] [Issue218] PEP8 Compliance 7 --- tofu/imas2tofu/_core.py | 27 ++++++++++++++------------- tofu/version.py | 2 +- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/tofu/imas2tofu/_core.py b/tofu/imas2tofu/_core.py index 6452fb30d..cc658db6f 100644 --- a/tofu/imas2tofu/_core.py +++ b/tofu/imas2tofu/_core.py @@ -2201,9 +2201,9 @@ def _checkformat_mesh_NodesFaces(nodes, indfaces, ids=None): # Check mesh type if indfaces.shape[1] == 3: - meshtype = 'tri' + mtype = 'tri' elif indfaces.shape[1] == 4: - meshtype = 'quad' + mtype = 'quad' else: msg = "Mesh seems to be neither triangular nor quadrilateral\n" msg += " => unrecognized mesh type, not implemented yet" @@ -2264,7 +2264,7 @@ def _checkformat_mesh_NodesFaces(nodes, indfaces, ids=None): warnings.warn(msg) # Convert to triangular mesh if necessary - if meshtype == 'quad': + if mtype == 'quad': # Convert to tri mesh (solution for unstructured meshes) indface = np.empty((indfaces.shape[0]*2,3), dtype=int) @@ -2272,7 +2272,7 @@ def _checkformat_mesh_NodesFaces(nodes, indfaces, ids=None): indface[1::2,:-1] = indfaces[:,2:] indface[1::2,-1] = indfaces[:,0] indfaces = indface - meshtype = 'quadtri' + mtype = 'quadtri' ntri = 2 else: ntri = 1 @@ -2292,7 +2292,7 @@ def _checkformat_mesh_NodesFaces(nodes, indfaces, ids=None): warnings.warn(msg) (indfaces[indclock,1], indfaces[indclock,2]) = indfaces[indclock,2], indfaces[indclock,1] - return indfaces, meshtype, ntri + return indfaces, mtype, ntri def inspect_ggd(self, ids): # TBF @@ -2744,14 +2744,15 @@ def to_Plasma2D(self, tlim=None, dsig=None, t0=None, nodes = out_['2dmeshNodes'] indfaces = out_['2dmeshFaces'] func = self._checkformat_mesh_NodesFaces - indfaces,meshtype,ntri = func(nodes, indfaces, ids=ids) + indfaces, mtype, ntri = func(nodes, indfaces, ids=ids) nnod, nfaces = int(nodes.size/2), indfaces.shape[0] if npts is not None: - if npts not in [nnod, int(nfaces/ntri)]: - msg = "There is an indexing unconsistency:\n" - msg += " - 2d profiles have npts = %s\n"%str(npts) - msg += " - mesh has %s nodes\n"%str(nnod) - msg += " %s faces"%str(int(nfaces/ntri)) + nft = int(nfaces/ntri) + if npts not in [nnod, nft]: + msg = "Inconsistent indices:\n" + msg += "\t- 2d profile {} npts\n".format(npts) + msg += "\t- mesh {} nodes\n".format(nnod) + msg += "\t {} faces".format(nft) raise Exception(msg) ftype = 1 if npts == nnod else 0 else: @@ -2760,9 +2761,9 @@ def to_Plasma2D(self, tlim=None, dsig=None, t0=None, nodes[:, 1], indfaces) dmesh[keym] = {'dim': 'mesh', 'quant': 'mesh', 'units': 'a.u.', 'origin': ids, - 'depend': (keym,), 'name': meshtype, + 'depend': (keym,), 'name': mtype, 'nodes': nodes, 'faces': indfaces, - 'type': meshtype, 'ntri': ntri, + 'type': mtype, 'ntri': ntri, 'ftype': ftype, 'nnodes': nnod, 'nfaces': nfaces, 'mpltri': mpltri} # R / Z case diff --git a/tofu/version.py b/tofu/version.py index d7f83d9d7..2361b0f84 100644 --- a/tofu/version.py +++ b/tofu/version.py @@ -1,2 +1,2 @@ # Do not edit, pipeline versioning governed by git tags! -__version__ = '1.4.2-alpha2-35-g15af797' +__version__ = '1.4.2-alpha2-36-gff603f7' From 67489eab02981a19ea8ebe6898c80309d8f35681 Mon Sep 17 00:00:00 2001 From: VEZINET Didier Date: Tue, 26 Nov 2019 09:08:42 +0100 Subject: [PATCH 12/18] [Issue218] PEP8 Compliance 8 --- tofu/imas2tofu/_core.py | 6 ++---- tofu/version.py | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/tofu/imas2tofu/_core.py b/tofu/imas2tofu/_core.py index cc658db6f..21e3440f6 100644 --- a/tofu/imas2tofu/_core.py +++ b/tofu/imas2tofu/_core.py @@ -3124,16 +3124,14 @@ def to_Data(self, ids=None, dsig=None, data=None, X=None, tlim=None, msg += "\n => Solution: choose indch accordingly !" raise Exception(msg) - if t.ndim == 2: assert np.all(np.isclose(t, t[0:1,:])) t = t[0,:] dins['t'] = t indt = self._checkformat_tlim(t, tlim=tlim)['indt'] - out, _ = self.get_data(ids, sig=[dsig[k] for k in lk], - indt=indt, indch=indch, nan=nan, pos=pos) + indt=indt, indch=indch, nan=nan, pos=pos) for kk in set(lk).difference('t'): if not isinstance(out[dsig[kk]], np.ndarray): if indch_auto: @@ -3208,7 +3206,7 @@ def to_Data(self, ids=None, dsig=None, data=None, X=None, tlim=None, if 'validity_timed' in self._dshort[ids].keys(): inan, _ = self.get_data(ids, sig='validity_timed', indt=indt, indch=indch, - nan=nan, pos=pos)['validity_timed'].T<0. + nan=nan, pos=pos)['validity_timed'].T < 0. dins['data'][inan] = np.nan if 'X' in dins.keys() and np.any(np.isnan(dins['X'])): if fallback_X is None: diff --git a/tofu/version.py b/tofu/version.py index 2361b0f84..0faaa11f4 100644 --- a/tofu/version.py +++ b/tofu/version.py @@ -1,2 +1,2 @@ # Do not edit, pipeline versioning governed by git tags! -__version__ = '1.4.2-alpha2-36-gff603f7' +__version__ = '1.4.2-alpha2-37-g395a555' From 97e859f83e5a5fdb4495fd253909d93bd4b25b43 Mon Sep 17 00:00:00 2001 From: VEZINET Didier Date: Tue, 26 Nov 2019 13:26:54 +0100 Subject: [PATCH 13/18] [Issue218] Replacing some assert by if / raise --- tofu/data/_core.py | 53 +++++++++++++++++++++++++++++++++++----------- tofu/version.py | 2 +- 2 files changed, 42 insertions(+), 13 deletions(-) diff --git a/tofu/data/_core.py b/tofu/data/_core.py index 35dcbed25..5dc004258 100644 --- a/tofu/data/_core.py +++ b/tofu/data/_core.py @@ -2421,7 +2421,13 @@ def _checkformat_dtrm(dtime=None, dradius=None, dmesh=None, # mesh if dk == 'dmesh': - assert v0['type'] in ['rect', 'tri', 'quadtri'], v0['type'] + + lmok = ['rect', 'tri', 'quadtri'] + if v0['type'] not in lmok: + msg = ("Mesh['type'] should be in {}\n".format(lmok) + + "\t- Provided: {}".format(v0['type'])) + raise Exception(msg) + if v0['type'] == 'rect': c0 = all([ss in v0.keys() and v0[ss].ndim in [1, 2] for ss in ['R', 'Z']]) @@ -2438,41 +2444,59 @@ def _checkformat_dtrm(dtime=None, dradius=None, dmesh=None, else: shapeRZ = list(shapeRZ) if v0['R'].ndim == 1: - assert np.all(np.diff(v0['R']) > 0.) + if np.any(np.diff(v0['R']) <= 0.): + msg = "Non-increasing R" + raise Exception(msg) R = v0['R'] else: lc = [np.all(np.diff(v0['R'][0, :])) > 0., np.all(np.diff(v0['R'][:, 0])) > 0.] - assert np.sum(lc) == 1 + if np.sum(lc) != 1: + msg = "Impossible to know R dimension!" + raise Exception(msg) if lc[0]: R = v0['R'][0, :] if shapeRZ[1] is None: shapeRZ[1] = 'R' - assert shapeRZ[1] == 'R' + if shapeRZ[1] != 'R': + msg = "Inconsistent shapeRZ" + raise Exception(msg) else: R = v0['R'][:, 0] if shapeRZ[0] is None: shapeRZ[0] = 'R' - assert shapeRZ[0] == 'R' + if shapeRZ[0] != 'R': + msg = "Inconsistent shapeRZ" + raise Exception(msg) if v0['Z'].ndim == 1: - assert np.all(np.diff(v0['Z']) > 0.) + if np.any(np.diff(v0['Z']) <= 0.): + msg = "Non-increasing Z" + raise Exception(msg) Z = v0['Z'] else: lc = [np.all(np.diff(v0['Z'][0, :])) > 0., np.all(np.diff(v0['Z'][:, 0])) > 0.] - assert np.sum(lc) == 1 + if np.sum(lc) != 1: + msg = "Impossible to know R dimension!" + raise Exception(msg) if lc[0]: Z = v0['Z'][0, :] if shapeRZ[1] is None: shapeRZ[1] = 'Z' - assert shapeRZ[1] == 'Z' + if shapeRZ[1] != 'Z': + msg = "Inconsistent shapeRZ" + raise Exception(msg) else: Z = v0['Z'][:, 0] if shapeRZ[0] is None: shapeRZ[0] = 'Z' - assert shapeRZ[0] == 'Z' + if shapeRZ[0] != 'Z': + msg = "Inconsistent shapeRZ" + raise Exception(msg) shapeRZ = tuple(shapeRZ) - assert shapeRZ in [('R', 'Z'), ('Z', 'R')] + if shapeRZ not in [('R', 'Z'), ('Z', 'R')]: + msg = "Inconsistent shapeRZ" + raise Exception(msg) if None in shapeRZ: msg = ("Please provide shapeRZ " @@ -2499,12 +2523,17 @@ def trifind(r, z, dd[dk][k0]['nR'] = R.size dd[dk][k0]['nZ'] = Z.size dd[dk][k0]['trifind'] = trifind - assert dd[dk][k0]['ftype'] == 0 + if dd[dk][k0]['ftype'] != 0: + msg = "Linear interpolation not handled yet !" + raise Exception(msg) dd[dk][k0]['size'] = R.size*Z.size else: ls = ['nodes', 'faces'] - assert all([s in v0.keys() for s in ls]) + if not all([s in v0.keys() for s in ls]): + msg = ("The following keys should be in dmesh:\n" + + "\t- {}".format(ls)) + raise Exception(msg) func = np.atleast_2d dd[dk][k0]['nodes'] = func(v0['nodes']).astype(float) dd[dk][k0]['faces'] = func(v0['faces']).astype(int) diff --git a/tofu/version.py b/tofu/version.py index 0faaa11f4..d698d402d 100644 --- a/tofu/version.py +++ b/tofu/version.py @@ -1,2 +1,2 @@ # Do not edit, pipeline versioning governed by git tags! -__version__ = '1.4.2-alpha2-37-g395a555' +__version__ = '1.4.2-alpha2-38-g67489ea' From f2a0855decdae061f823762c295f2c556ac8bf77 Mon Sep 17 00:00:00 2001 From: VEZINET Didier Date: Tue, 26 Nov 2019 13:47:06 +0100 Subject: [PATCH 14/18] [Issue218] anyerror True also if ids-wide failure --- tofu/imas2tofu/_core.py | 5 +++-- tofu/version.py | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/tofu/imas2tofu/_core.py b/tofu/imas2tofu/_core.py index 21e3440f6..d59c9c6db 100644 --- a/tofu/imas2tofu/_core.py +++ b/tofu/imas2tofu/_core.py @@ -1949,8 +1949,9 @@ def get_data_all(self, dsig=None, stack=True, if len(dfail[ids]) > 0: anyerror = True except Exception as err: - msg = "Could not get data from %s"%ids - warnings.warn(msg) + del dout[ids] + dfail[ids] = dict.fromkeys(dsig[ids].keys(), 'ids-wide failure') + anyerror = True if anyerror: msg = "The following data could not be retrieved:" for ids, v0 in dfail.items(): diff --git a/tofu/version.py b/tofu/version.py index d698d402d..fc2ac46f0 100644 --- a/tofu/version.py +++ b/tofu/version.py @@ -1,2 +1,2 @@ # Do not edit, pipeline versioning governed by git tags! -__version__ = '1.4.2-alpha2-38-g67489ea' +__version__ = '1.4.2-alpha2-39-g97e859f' From 20534d985f89020f8274a72a2aa86aaa62cfa71f Mon Sep 17 00:00:00 2001 From: VEZINET Didier Date: Tue, 26 Nov 2019 14:21:43 +0100 Subject: [PATCH 15/18] [Issue218] Minor bug fixes in tofu/imas2tofu (not covered by unti tests) --- tofu/data/_core.py | 2 +- tofu/imas2tofu/_core.py | 29 ++++++++++++++++------------- tofu/version.py | 2 +- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/tofu/data/_core.py b/tofu/data/_core.py index 5dc004258..8913c41cd 100644 --- a/tofu/data/_core.py +++ b/tofu/data/_core.py @@ -2585,7 +2585,7 @@ def trifind(r, z, if 'tri' in v0['type']: fshap = dd[dk][k0]['faces'].shape - fshap0 = (v0['nfaces', 3]) + fshap0 = (v0['nfaces'], 3) if fshap != fshap0: msg = ("Wrong shape of {}[{}]\n".format(dk, k0) + "\t- Expected: {}\n".format(fshap0) diff --git a/tofu/imas2tofu/_core.py b/tofu/imas2tofu/_core.py index d59c9c6db..8561286ff 100644 --- a/tofu/imas2tofu/_core.py +++ b/tofu/imas2tofu/_core.py @@ -2584,8 +2584,8 @@ def to_Plasma2D(self, tlim=None, dsig=None, t0=None, # TBF in next release (ugly, sub-optimal...) # dtime - out_ = {'t': out0[ids].get('t')} - lc = [len(out_['t']) == 1, + out_ = {'t': out0[ids].get('t', None)} + lc = [out_['t'] is not None, out_['t'].size > 0, 0 not in out_['t'].shape] keyt, nt, indt = None, None, None @@ -2597,6 +2597,8 @@ def to_Plasma2D(self, tlim=None, dsig=None, t0=None, dtime[keyt] = {'data':dtt['t'], 'origin':ids, 'name':'t'} indt = dtt['indt'] + else: + nt = None # d1d and dradius lsig = [k for k in dsig[ids] @@ -2622,16 +2624,17 @@ def to_Plasma2D(self, tlim=None, dsig=None, t0=None, keyt = '%s.homemade'%ids dtime[keyt] = {'data':np.arange(0,nt), 'origin':ids, 'name':'homemade'} + import ipdb; ipdb.set_trace() # DB else: if nt not in shape: msg = "Inconsistent shape with respect to 't'!\n" msg += " - %s.%s.shape = %s"%(ids,ss,str(shape)) msg += " - One dim should be t.size = %s"%str(nt) raise Exception(msg) - axist = shape.index(nt) - nr = shape[1-axist] - if axist == 1: - out_[ss] = out_[ss].T + axist = shape.index(nt) + nr = shape[1-axist] + if axist == 1: + out_[ss] = out_[ss].T if ss in self._dshort[ids].keys(): dim = self._dshort[ids][ss].get('dim', 'unknown') @@ -2644,16 +2647,16 @@ def to_Plasma2D(self, tlim=None, dsig=None, t0=None, key = '%s.%s'%(ids,ss) if nref is None: - dradius[key] = {'data':out_[ss], 'name':ss, - 'origin':ids, 'dim':dim, 'quant':quant, - 'units':units, 'depend':(keyt,key)} + dradius[key] = {'data': out_[ss], 'name': ss, + 'origin': ids, 'dim': dim, 'quant': quant, + 'units': units, 'depend': (keyt, key)} nref, kref = nr, key else: assert nr == nref - d1d[key] = {'data':out_[ss], 'name':ss, - 'origin':ids, 'dim':dim, 'quant':quant, - 'units':units, 'depend':(keyt,kref)} - assert out_[ss].shape == (nt,nr) + d1d[key] = {'data': out_[ss], 'name': ss, + 'origin': ids, 'dim': dim, 'quant': quant, + 'units': units, 'depend': (keyt, kref)} + assert out_[ss].shape == (nt, nr) if plot: if ss in plot_sig: diff --git a/tofu/version.py b/tofu/version.py index fc2ac46f0..42a614f63 100644 --- a/tofu/version.py +++ b/tofu/version.py @@ -1,2 +1,2 @@ # Do not edit, pipeline versioning governed by git tags! -__version__ = '1.4.2-alpha2-39-g97e859f' +__version__ = '1.4.2-alpha2-40-gf2a0855' From 2f9adbf713153fccbd359156c6c34e1fe1fd6232 Mon Sep 17 00:00:00 2001 From: VEZINET Didier Date: Tue, 26 Nov 2019 14:28:39 +0100 Subject: [PATCH 16/18] [Issue218] Minor bug fix in tofu/imas2tofu due to get_data() now returning tuple --- tofu/imas2tofu/_core.py | 20 ++++++++++---------- tofu/version.py | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/tofu/imas2tofu/_core.py b/tofu/imas2tofu/_core.py index 8561286ff..db63ec667 100644 --- a/tofu/imas2tofu/_core.py +++ b/tofu/imas2tofu/_core.py @@ -2031,8 +2031,8 @@ def _get_t0(self, t0=None): c0 = (len(t0.split('.')) <= 2 and all([ss.isdecimal() for ss in t0.split('.')])) if 'pulse_schedule' in self._dids.keys(): - events, _ = self.get_data(ids='pulse_schedule', - sig='events')['events'] + events = self.get_data(ids='pulse_schedule', + sig='events')[0]['events'] if t0 in events['name']: t0 = events['t'][np.nonzero(events['name'] == t0)[0][0]] elif c0: @@ -2831,7 +2831,7 @@ def _checkformat_Cam_geom(self, ids=None, geomcls=None, indch=None): def _to_Cam_Du(self, ids, lk, indch, nan=None, pos=None): Etendues, Surfaces = None, None out, _ = self.get_data(ids, sig=list(lk), indch=indch, - nan=nan, pos=pos) + nan=nan, pos=pos) if 'los_ptsRZPhi' in out.keys() and out['los_ptsRZPhi'].size > 0: oo = out['los_ptsRZPhi'] D = np.array([oo[:,0,0]*np.cos(oo[:,0,2]), @@ -3087,7 +3087,7 @@ def to_Data(self, ids=None, dsig=None, data=None, X=None, tlim=None, # data lk = sorted(dsig.keys()) dins = dict.fromkeys(lk) - t, _ = self.get_data(ids, sig=dsig.get('t', 't'), indch=indch)['t'] + t = self.get_data(ids, sig=dsig.get('t', 't'), indch=indch)[0]['t'] if len(t) == 0: msg = "The time vector is not available for %s:\n"%ids msg += " - 't' <=> %s.%s\n"%(ids,self._dshort[ids]['t']['str']) @@ -3104,7 +3104,7 @@ def to_Data(self, ids=None, dsig=None, data=None, X=None, tlim=None, else: indchcam = [ii for ii in range(0,len(t)) if ls[ii] == su] indch = [indch[ii] for ii in range(0,len(t)) if ls[ii] == su] - t, _ = self.get_data(ids, sig='t', indch=indch)['t'] + t = self.get_data(ids, sig='t', indch=indch)[0]['t'] if cam is not None: cam = cam.get_subset(indch=indchcam) msg = "indch set automatically for %s\n"%ids @@ -3208,9 +3208,9 @@ def to_Data(self, ids=None, dsig=None, data=None, X=None, tlim=None, dins['data'] = np.fliplr(dins['data']) if 'validity_timed' in self._dshort[ids].keys(): - inan, _ = self.get_data(ids, sig='validity_timed', - indt=indt, indch=indch, - nan=nan, pos=pos)['validity_timed'].T < 0. + inan = self.get_data(ids, sig='validity_timed', + indt=indt, indch=indch, + nan=nan, pos=pos)[0]['validity_timed'].T < 0. dins['data'][inan] = np.nan if 'X' in dins.keys() and np.any(np.isnan(dins['X'])): if fallback_X is None: @@ -3348,7 +3348,7 @@ def calc_signal(self, ids=None, dsig=None, tlim=None, t=None, res=None, ani = False if ids == 'bremsstrahlung_visible': try: - lamb, _ = self.get_data(ids, sig='lamb')['lamb'] + lamb = self.get_data(ids, sig='lamb')[0]['lamb'] except Exception as err: lamb = 5238.e-10 msg = "bremsstrahlung_visible.lamb could not be retrived!\n" @@ -3367,7 +3367,7 @@ def calc_signal(self, ids=None, dsig=None, tlim=None, t=None, res=None, dq['quant'] = ['core_profiles.1dbrem'] elif ids == 'polarimeter': - lamb, _ = self.get_data(ids, sig='lamb')['lamb'][0] + lamb = self.get_data(ids, sig='lamb')[0]['lamb'][0] # Get time reference doutt, dtut, tref = plasma.get_time_common(lq) diff --git a/tofu/version.py b/tofu/version.py index 42a614f63..4d8f7fbb9 100644 --- a/tofu/version.py +++ b/tofu/version.py @@ -1,2 +1,2 @@ # Do not edit, pipeline versioning governed by git tags! -__version__ = '1.4.2-alpha2-40-gf2a0855' +__version__ = '1.4.2-alpha2-41-g20534d9' From 7a52950f093b04a1bb42bdc08c8e3072940c6d79 Mon Sep 17 00:00:00 2001 From: VEZINET Didier Date: Tue, 26 Nov 2019 14:58:11 +0100 Subject: [PATCH 17/18] [Issue218] Minor bug fixes in tofu.geom.Rays.get_subset() due to hard-coded separator, fixed --- tofu/geom/_core.py | 11 +++-- tofu/imas2tofu/_core.py | 92 ++++++++++++++++++++++------------------- tofu/version.py | 2 +- 3 files changed, 59 insertions(+), 46 deletions(-) diff --git a/tofu/geom/_core.py b/tofu/geom/_core.py index 60ce6d4bd..123c9fd49 100644 --- a/tofu/geom/_core.py +++ b/tofu/geom/_core.py @@ -5241,17 +5241,21 @@ def get_subset(self, indch=None, Name=None): if indch is None: return self else: + indch = self._check_indch(indch) dd = self.to_dict() + sep = [kk for kk in dd.keys() + if all([ss in kk for ss in ['dId', 'dall', 'Name']])][0] + sep = sep[3] # Name assert Name in [None, True] or type(Name) is str if Name is True: pass elif type(Name) is str: - dd["dId_dall_Name"] = Name + dd[sep.join(['dId', 'dall', 'Name'])] = Name elif Name is None: - dd["dId_dall_Name"] = dd["dId_dall_Name"] + "-subset" + dd[sep.join(['dId', 'dall', 'Name'])] += "-subset" # Resize all np.ndarrays for kk in dd.keys(): @@ -5262,7 +5266,8 @@ def get_subset(self, indch=None, Name=None): dd[kk] = vv[indch] elif vv.ndim == 2 and vv.shape[1] == self.nRays: dd[kk] = vv[:, indch] - dd["dgeom_nRays"] = dd["dgeom_D"].shape[1] + dd[sep.join(['dgeom', 'nRays'])] = ( + dd[sep.join(['dgeom', 'D'])].shape[1]) # Recreate from dict obj = self.__class__(fromdict=dd) diff --git a/tofu/imas2tofu/_core.py b/tofu/imas2tofu/_core.py index db63ec667..c62e2d967 100644 --- a/tofu/imas2tofu/_core.py +++ b/tofu/imas2tofu/_core.py @@ -1804,9 +1804,9 @@ def _set_fsig(self): for k,v in self._dshort[ids].items(): self._dshort[ids][k]['fsig'] = self._get_fsig(v['str']) - def _get_data(self, ids, sig, occ, comp=False, indt=None, indch=None, - stack=True, isclose=True, flatocc=True, nan=True, - pos=None, warn=True): + def __get_data(self, ids, sig, occ, comp=False, indt=None, indch=None, + stack=True, isclose=True, flatocc=True, nan=True, + pos=None, warn=True): # get list of results for occ occref = self._dids[ids]['occ'] @@ -1815,10 +1815,10 @@ def _get_data(self, ids, sig, occ, comp=False, indt=None, indch=None, if comp: lstr = self._dcomp[ids][sig]['lstr'] kargs = self._dcomp[ids][sig].get('kargs', {}) - ddata, _ = self.get_data(ids=ids, sig=lstr, - occ=occ, indch=indch, indt=indt, - stack=stack, flatocc=False, nan=nan, - pos=pos, warn=warn) + ddata, _ = self._get_data(ids=ids, sig=lstr, + occ=occ, indch=indch, indt=indt, + stack=stack, flatocc=False, nan=nan, + pos=pos, warn=warn) out = [self._dcomp[ids][sig]['func']( *[ddata[kk][nn] for kk in lstr], **kargs ) for nn in range(0,nocc)] @@ -1855,15 +1855,9 @@ def _get_data(self, ids, sig, occ, comp=False, indt=None, indch=None, out = out[0] return out - def get_data(self, ids=None, sig=None, occ=None, - indch=None, indt=None, stack=True, - isclose=None, flatocc=True, nan=True, pos=None, warn=True): - """ Return a dict of the desired signals extracted from specified ids - - If the ids has a field 'channel', indch is used to specify from which - channel data shall be loaded (all by default) - - """ + def _get_data(self, ids=None, sig=None, occ=None, + indch=None, indt=None, stack=True, + isclose=None, flatocc=True, nan=True, pos=None, warn=True): # ------------------ # Check format input @@ -1903,11 +1897,12 @@ def get_data(self, ids=None, sig=None, occ=None, else: isclose_ = isclose try: - dout[sig[ii]] = self._get_data(ids, sig[ii], occ, comp=comp[ii], - indt=indt, indch=indch, - stack=stack, isclose=isclose_, - flatocc=flatocc, nan=nan, - pos=pos, warn=warn) + dout[sig[ii]] = self.__get_data(ids, sig[ii], occ, + comp=comp[ii], + indt=indt, indch=indch, + stack=stack, isclose=isclose_, + flatocc=flatocc, nan=nan, + pos=pos, warn=warn) except Exception as err: dfail[sig[ii]] = str(err) if warn: @@ -1916,6 +1911,19 @@ def get_data(self, ids=None, sig=None, occ=None, warnings.warn(msg) return dout, dfail + def get_data(self, ids=None, sig=None, occ=None, + indch=None, indt=None, stack=True, + isclose=None, flatocc=True, nan=True, pos=None, warn=True): + """ Return a dict of the desired signals extracted from specified ids + + If the ids has a field 'channel', indch is used to specify from which + channel data shall be loaded (all by default) + + """ + return self._get_data(ids=ids, sig=sig, occ=occ, indch=indch, + indt=indt, stack=stack, isclose=isclose, + flatocc=flatocc, nan=nan, pos=pos, warn=warn)[0] + def get_data_all(self, dsig=None, stack=True, isclose=None, flatocc=True, nan=True, pos=None): @@ -1941,11 +1949,11 @@ def get_data_all(self, dsig=None, stack=True, anyerror = False for ids in dout.keys(): try: - dout[ids], dfail[ids] = self.get_data(ids, sig=dsig[ids], - stack=stack, - isclose=isclose, - flatocc=flatocc, nan=nan, - pos=pos, warn=False) + dout[ids], dfail[ids] = self._get_data(ids, sig=dsig[ids], + stack=stack, + isclose=isclose, + flatocc=flatocc, nan=nan, + pos=pos, warn=False) if len(dfail[ids]) > 0: anyerror = True except Exception as err: @@ -2032,7 +2040,7 @@ def _get_t0(self, t0=None): and all([ss.isdecimal() for ss in t0.split('.')])) if 'pulse_schedule' in self._dids.keys(): events = self.get_data(ids='pulse_schedule', - sig='events')[0]['events'] + sig='events')['events'] if t0 in events['name']: t0 = events['t'][np.nonzero(events['name'] == t0)[0][0]] elif c0: @@ -2447,7 +2455,7 @@ def _get_dextra(self, dextra=None, fordata=False, nan=True, pos=None): for ids, vv in dextra.items(): vs = [vvv if type(vvv) is str else vvv[0] for vvv in vv] vc = ['k' if type(vvv) is str else vvv[1] for vvv in vv] - out, _ = self.get_data(ids=ids, sig=vs, nan=nan, pos=pos) + out = self.get_data(ids=ids, sig=vs, nan=nan, pos=pos) inds = [ii for ii in range(0,len(vs)) if vs[ii] in out.keys()] for ii in inds: ss = vs[ii] @@ -2480,7 +2488,7 @@ def _get_dextra(self, dextra=None, fordata=False, nan=True, pos=None): for ids, vv in dextra.items(): vs = [vvv if type(vvv) is str else vvv[0] for vvv in vv] vc = ['k' if type(vvv) is str else vvv[1] for vvv in vv] - out, _ = self.get_data(ids=ids, sig=vs, nan=nan, pos=pos) + out = self.get_data(ids=ids, sig=vs, nan=nan, pos=pos) keyt = '%s.t'%ids any_ = False for ss in out.keys(): @@ -2603,7 +2611,7 @@ def to_Plasma2D(self, tlim=None, dsig=None, t0=None, # d1d and dradius lsig = [k for k in dsig[ids] if '1d' in k and k in out0[ids].keys()] - out_, _ = self.get_data(ids, lsig, indt=indt, nan=nan, pos=pos, + out_ = self.get_data(ids, lsig, indt=indt, nan=nan, pos=pos, warn=False) if len(out_) > 0: nref, kref = None, None @@ -2668,8 +2676,8 @@ def to_Plasma2D(self, tlim=None, dsig=None, t0=None, lsig = [k for k in dsig[ids] if '2d' in k and k in out0[ids].keys()] lsigmesh = [k for k in lsig if 'mesh' in k] - out_, _ = self.get_data(ids, sig=lsig, indt=indt, nan=nan, pos=pos, - warn=False) + out_ = self.get_data(ids, sig=lsig, indt=indt, nan=nan, pos=pos, + warn=False) cmesh = any([ss in out_.keys() for ss in lsigmesh]) if len(out_) > 0: @@ -2830,8 +2838,8 @@ def _checkformat_Cam_geom(self, ids=None, geomcls=None, indch=None): def _to_Cam_Du(self, ids, lk, indch, nan=None, pos=None): Etendues, Surfaces = None, None - out, _ = self.get_data(ids, sig=list(lk), indch=indch, - nan=nan, pos=pos) + out = self.get_data(ids, sig=list(lk), indch=indch, + nan=nan, pos=pos) if 'los_ptsRZPhi' in out.keys() and out['los_ptsRZPhi'].size > 0: oo = out['los_ptsRZPhi'] D = np.array([oo[:,0,0]*np.cos(oo[:,0,2]), @@ -3087,7 +3095,7 @@ def to_Data(self, ids=None, dsig=None, data=None, X=None, tlim=None, # data lk = sorted(dsig.keys()) dins = dict.fromkeys(lk) - t = self.get_data(ids, sig=dsig.get('t', 't'), indch=indch)[0]['t'] + t = self.get_data(ids, sig=dsig.get('t', 't'), indch=indch)['t'] if len(t) == 0: msg = "The time vector is not available for %s:\n"%ids msg += " - 't' <=> %s.%s\n"%(ids,self._dshort[ids]['t']['str']) @@ -3104,7 +3112,7 @@ def to_Data(self, ids=None, dsig=None, data=None, X=None, tlim=None, else: indchcam = [ii for ii in range(0,len(t)) if ls[ii] == su] indch = [indch[ii] for ii in range(0,len(t)) if ls[ii] == su] - t = self.get_data(ids, sig='t', indch=indch)[0]['t'] + t = self.get_data(ids, sig='t', indch=indch)['t'] if cam is not None: cam = cam.get_subset(indch=indchcam) msg = "indch set automatically for %s\n"%ids @@ -3134,8 +3142,8 @@ def to_Data(self, ids=None, dsig=None, data=None, X=None, tlim=None, dins['t'] = t indt = self._checkformat_tlim(t, tlim=tlim)['indt'] - out, _ = self.get_data(ids, sig=[dsig[k] for k in lk], - indt=indt, indch=indch, nan=nan, pos=pos) + out = self.get_data(ids, sig=[dsig[k] for k in lk], + indt=indt, indch=indch, nan=nan, pos=pos) for kk in set(lk).difference('t'): if not isinstance(out[dsig[kk]], np.ndarray): if indch_auto: @@ -3149,7 +3157,7 @@ def to_Data(self, ids=None, dsig=None, data=None, X=None, tlim=None, else: indch = [indch[ii] for ii in range(0,len(out[dsig[kk]])) if ls[ii] == su] - out, _ = self.get_data(ids, sig=[dsig[k] for k in lk], + out = self.get_data(ids, sig=[dsig[k] for k in lk], indt=indt, indch=indch, nan=nan, pos=pos) if cam is not None: @@ -3210,7 +3218,7 @@ def to_Data(self, ids=None, dsig=None, data=None, X=None, tlim=None, if 'validity_timed' in self._dshort[ids].keys(): inan = self.get_data(ids, sig='validity_timed', indt=indt, indch=indch, - nan=nan, pos=pos)[0]['validity_timed'].T < 0. + nan=nan, pos=pos)['validity_timed'].T < 0. dins['data'][inan] = np.nan if 'X' in dins.keys() and np.any(np.isnan(dins['X'])): if fallback_X is None: @@ -3348,7 +3356,7 @@ def calc_signal(self, ids=None, dsig=None, tlim=None, t=None, res=None, ani = False if ids == 'bremsstrahlung_visible': try: - lamb = self.get_data(ids, sig='lamb')[0]['lamb'] + lamb = self.get_data(ids, sig='lamb')['lamb'] except Exception as err: lamb = 5238.e-10 msg = "bremsstrahlung_visible.lamb could not be retrived!\n" @@ -3367,7 +3375,7 @@ def calc_signal(self, ids=None, dsig=None, tlim=None, t=None, res=None, dq['quant'] = ['core_profiles.1dbrem'] elif ids == 'polarimeter': - lamb = self.get_data(ids, sig='lamb')[0]['lamb'][0] + lamb = self.get_data(ids, sig='lamb')['lamb'][0] # Get time reference doutt, dtut, tref = plasma.get_time_common(lq) diff --git a/tofu/version.py b/tofu/version.py index 4d8f7fbb9..afc36337b 100644 --- a/tofu/version.py +++ b/tofu/version.py @@ -1,2 +1,2 @@ # Do not edit, pipeline versioning governed by git tags! -__version__ = '1.4.2-alpha2-41-g20534d9' +__version__ = '1.4.2-alpha2-42-g2f9adbf' From 58bd9c4497207e5379b4e6f62521eae046a7e449 Mon Sep 17 00:00:00 2001 From: VEZINET Didier Date: Tue, 26 Nov 2019 16:41:14 +0100 Subject: [PATCH 18/18] [Issue218] PEP8 Compliance + removed ipdb.set_trace() debug point --- tofu/imas2tofu/_core.py | 17 +++++++++-------- tofu/version.py | 3 +-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/tofu/imas2tofu/_core.py b/tofu/imas2tofu/_core.py index c62e2d967..39ee55ce1 100644 --- a/tofu/imas2tofu/_core.py +++ b/tofu/imas2tofu/_core.py @@ -1912,8 +1912,8 @@ def _get_data(self, ids=None, sig=None, occ=None, return dout, dfail def get_data(self, ids=None, sig=None, occ=None, - indch=None, indt=None, stack=True, - isclose=None, flatocc=True, nan=True, pos=None, warn=True): + indch=None, indt=None, stack=True, + isclose=None, flatocc=True, nan=True, pos=None, warn=True): """ Return a dict of the desired signals extracted from specified ids If the ids has a field 'channel', indch is used to specify from which @@ -1952,13 +1952,14 @@ def get_data_all(self, dsig=None, stack=True, dout[ids], dfail[ids] = self._get_data(ids, sig=dsig[ids], stack=stack, isclose=isclose, - flatocc=flatocc, nan=nan, + flatocc=flatocc, + nan=nan, pos=pos, warn=False) if len(dfail[ids]) > 0: anyerror = True except Exception as err: del dout[ids] - dfail[ids] = dict.fromkeys(dsig[ids].keys(), 'ids-wide failure') + dfail[ids] = dict.fromkeys(dsig[ids].keys(), 'ids error') anyerror = True if anyerror: msg = "The following data could not be retrieved:" @@ -2612,7 +2613,7 @@ def to_Plasma2D(self, tlim=None, dsig=None, t0=None, lsig = [k for k in dsig[ids] if '1d' in k and k in out0[ids].keys()] out_ = self.get_data(ids, lsig, indt=indt, nan=nan, pos=pos, - warn=False) + warn=False) if len(out_) > 0: nref, kref = None, None for ss in out_.keys(): @@ -2632,7 +2633,6 @@ def to_Plasma2D(self, tlim=None, dsig=None, t0=None, keyt = '%s.homemade'%ids dtime[keyt] = {'data':np.arange(0,nt), 'origin':ids, 'name':'homemade'} - import ipdb; ipdb.set_trace() # DB else: if nt not in shape: msg = "Inconsistent shape with respect to 't'!\n" @@ -2656,8 +2656,9 @@ def to_Plasma2D(self, tlim=None, dsig=None, t0=None, if nref is None: dradius[key] = {'data': out_[ss], 'name': ss, - 'origin': ids, 'dim': dim, 'quant': quant, - 'units': units, 'depend': (keyt, key)} + 'origin': ids, 'dim': dim, + 'quant': quant, 'units': units, + 'depend': (keyt, key)} nref, kref = nr, key else: assert nr == nref diff --git a/tofu/version.py b/tofu/version.py index d88cd46a4..38f81c4e7 100644 --- a/tofu/version.py +++ b/tofu/version.py @@ -1,3 +1,2 @@ # Do not edit, pipeline versioning governed by git tags! -__version__ = '1.4.2-alpha2-42-g2f9adbf' - +__version__ = '1.4.2-alpha2-48-gbe9fde3'