wolfhece 2.0.47__py3-none-any.whl → 2.0.49__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
wolfhece/PyGui.py CHANGED
@@ -8,7 +8,7 @@ import logging
8
8
  from pathlib import Path
9
9
 
10
10
  from .apps.splashscreen import WolfLauncher
11
- from .wolf_array import WOLF_ARRAY_FULL_LOGICAL, WOLF_ARRAY_MB_SINGLE, WolfArray,getkeyblock, WolfArray_Sim2D
11
+ from .wolf_array import WOLF_ARRAY_FULL_LOGICAL, WOLF_ARRAY_MB_SINGLE, WolfArray, getkeyblock, WolfArray_Sim2D, WOLF_ARRAY_FULL_INTEGER16, WOLF_ARRAY_MB_INTEGER
12
12
  from .PyTranslate import _
13
13
  from .PyDraw import WolfMapViewer,imagetexture
14
14
 
@@ -409,7 +409,7 @@ class Wolf2DModel(GenMapManager):
409
409
  self.myparam = myparam
410
410
  self.myparam.parent = self
411
411
 
412
- self.mynap= np.ones([self.myparam.nxfin, self.myparam.nyfin], order='F')
412
+ self.mynap= np.ones([self.myparam.nxfin, self.myparam.nyfin], order='F', dtype=np.int16)
413
413
 
414
414
  self.mysuxy = prev_suxsuy(self)
415
415
  self.xyfile = xy_file(self)
@@ -543,7 +543,7 @@ class Wolf2DModel(GenMapManager):
543
543
  if dir != '':
544
544
  # Either a directory or a file "/_/_/_/dir/simul" for example.
545
545
 
546
- assert exists(dir) or dirname(dir), f"'{dir}' does nto exists"
546
+ assert exists(dir) or dirname(dir), f"'{dir}' does not exists"
547
547
 
548
548
  if dir=='':
549
549
  if self.wx_exists:
@@ -643,7 +643,7 @@ class Wolf2DModel(GenMapManager):
643
643
  ('.top','Bed Elevation [m]',WOLF_ARRAY_FULL_SINGLE),
644
644
  ('.topini_fine','Bed Elevation - computed [m]',WOLF_ARRAY_FULL_SINGLE),
645
645
  ('.frot','Roughness coefficient [law dependent]',WOLF_ARRAY_FULL_SINGLE),
646
- ('.inf','Infiltration zone [-]',WOLF_ARRAY_FULL_SINGLE),
646
+ ('.inf','Infiltration zone [-]', WOLF_ARRAY_FULL_INTEGER),
647
647
  ('.hbin','Initial water depth [m]',WOLF_ARRAY_FULL_SINGLE),
648
648
  ('.qxbin','Initial discharge along X [m^2/s]',WOLF_ARRAY_FULL_SINGLE),
649
649
  ('.qybin','Initial discharge along Y [m^2/s]',WOLF_ARRAY_FULL_SINGLE)
@@ -1146,7 +1146,7 @@ class Wolf2DModel(GenMapManager):
1146
1146
  self.myblocfile.my_vec_blocks.find_minmax(True)
1147
1147
  self.myblocfile.write_file()
1148
1148
 
1149
- def get_header_MB(self,abs=False):
1149
+ def get_header_MB(self, abs=False):
1150
1150
  """#> Renvoit un header avec les infos multi-blocs"""
1151
1151
  myheader:header_wolf
1152
1152
  myheader = self.mymnap.get_header(abs=abs)
@@ -1154,8 +1154,15 @@ class Wolf2DModel(GenMapManager):
1154
1154
  myheader.head_blocks[getkeyblock(curblock.blockindex)] = curblock.get_header(abs=abs)
1155
1155
  return myheader
1156
1156
 
1157
- def get_header(self,abs=True):
1158
- """#> Renvoit un header de matrice "fine" non MB"""
1157
+ def get_header(self, abs=False):
1158
+ """
1159
+ Renvoi d'un header de matrice "fine" non MB
1160
+
1161
+ @param abs: If True, the header will be absolute, if False, it will be relative
1162
+ @type abs: bool
1163
+
1164
+ @return: header_wolf
1165
+ """
1159
1166
 
1160
1167
  curhead = header_wolf()
1161
1168
 
@@ -1165,26 +1172,51 @@ class Wolf2DModel(GenMapManager):
1165
1172
  curhead.dx = self.myparam.dxfin
1166
1173
  curhead.dy = self.myparam.dyfin
1167
1174
 
1168
- curhead.origx = self.myparam.xminfin
1169
- curhead.origy = self.myparam.yminfin
1175
+ if abs:
1176
+ curhead.origx = self.myparam.xminfin + self.myparam.translx
1177
+ curhead.origy = self.myparam.yminfin + self.myparam.transly
1170
1178
 
1171
- curhead.translx = self.myparam.translx
1172
- curhead.transly = self.myparam.transly
1179
+ curhead.translx = 0.
1180
+ curhead.transly = 0.
1181
+
1182
+ else:
1183
+
1184
+ curhead.origx = self.myparam.xminfin
1185
+ curhead.origy = self.myparam.yminfin
1186
+
1187
+ curhead.translx = self.myparam.translx
1188
+ curhead.transly = self.myparam.transly
1173
1189
 
1174
1190
  return curhead
1175
1191
 
1176
- def read_fine_array(self,which=''):
1177
- """Lecture d'une matrice fine"""
1192
+ def read_fine_array(self, which:str=''):
1193
+ """
1194
+ Lecture d'une matrice fine
1195
+
1196
+ @param which: suffixe du fichier
1197
+ @type which: str
1198
+ """
1178
1199
 
1179
- myarray =WolfArray()
1180
- myarray.set_header(self.get_header())
1181
- myarray.filename = self.filenamegen+which
1182
- myarray.read_data()
1200
+ if Path(self.filenamegen + which).exists():
1201
+ myarray = WolfArray(fname = self.filenamegen + which)
1202
+
1203
+ else:
1204
+ logging.error(f"File {self.filenamegen + which} does not exist")
1205
+ myarray = None
1206
+
1207
+ # myarray.set_header(self.get_header())
1208
+ # myarray.filename = self.filenamegen+which
1209
+ # myarray.read_data()
1183
1210
 
1184
1211
  return myarray
1185
1212
 
1186
- def read_MB_array(self,which=''):
1187
- """Lecture d'une matrice MB"""
1213
+ def read_MB_array(self, which:str=''):
1214
+ """
1215
+ Lecture d'une matrice MB
1216
+
1217
+ @param which: suffixe du fichier
1218
+ @type which: str
1219
+ """
1188
1220
 
1189
1221
  myarray =WolfArrayMB()
1190
1222
  myarray.set_header(self.get_header_MB())
@@ -1252,3 +1284,159 @@ class Wolf2DModel(GenMapManager):
1252
1284
  logging.info(_('Finished !'))
1253
1285
 
1254
1286
  pass
1287
+
1288
+ @property
1289
+ def is_multiblock(self):
1290
+ return self.myblocfile.nb_blocks>1
1291
+
1292
+ @property
1293
+ def nb_blocks(self):
1294
+ return self.myblocfile.nb_blocks
1295
+
1296
+ def help_files(self):
1297
+
1298
+ ret= _('Text files\n')
1299
+ ret+= ('----------\n')
1300
+
1301
+ for key, val in self.files_others['Charachteristics']:
1302
+ ret += f"{val} : {key}\n"
1303
+
1304
+ ret +='\n\n'
1305
+
1306
+ ret += _('Fine array - monoblock\n')
1307
+ ret += ('----------------------\n')
1308
+
1309
+ for key, val, dtype in self.files_fine_array['Characteristics']:
1310
+
1311
+ if dtype == WOLF_ARRAY_FULL_LOGICAL:
1312
+ ret += f"{val} : {key} [int16]\n"
1313
+ elif dtype == WOLF_ARRAY_FULL_INTEGER:
1314
+ ret += f"{val} : {key} [int32]\n"
1315
+ elif dtype == WOLF_ARRAY_FULL_SINGLE:
1316
+ ret += f"{val} : {key} [float32]\n"
1317
+ else:
1318
+ ret += f"{val} : {key} error - check code\n"
1319
+
1320
+ ret +='\n\n'
1321
+
1322
+ ret += _('Multiblock arrays\n')
1323
+ ret += ('-----------------\n')
1324
+
1325
+ for key, val, dtype in self.files_MB_array['Initial Conditions']:
1326
+
1327
+ if dtype == WOLF_ARRAY_MB_INTEGER:
1328
+ ret += f"{val} : {key} [int32]\n"
1329
+ elif dtype == WOLF_ARRAY_MB_SINGLE:
1330
+ ret += f"{val} : {key} [float32]\n"
1331
+ else:
1332
+ ret += f"{val} : {key} error - check code\n"
1333
+
1334
+ return ret
1335
+
1336
+ def check_infiltration(self):
1337
+
1338
+ ret = _('inside .inf binary file') + '\n'
1339
+ ret += ('-----------------------') + '\n'
1340
+
1341
+ inf = self.read_fine_array('.inf')
1342
+
1343
+ maxinf = inf.array.data.max()
1344
+ ret += _('Maximum infiltration zone : ') + str(maxinf) + '\n'
1345
+ for i in range(1,maxinf+1):
1346
+
1347
+ nb = np.sum(inf.array.data == i)
1348
+ if nb>0:
1349
+ indices = np.where(inf.array.data == i)
1350
+ ret += f"Zone {i} : {nb} cells -- Indices (i,j) of the zone's first cell ({indices[0][0]+1} ; {indices[1][0]+1}) (1-based)\n"
1351
+ else:
1352
+ ret += f"Zone {i} : 0 cells\n"
1353
+
1354
+ ret += '\n'
1355
+
1356
+ ret += _('inside .fil text file') + '\n'
1357
+ ret += ('----------------------') + '\n'
1358
+
1359
+ ret += f"Zones {self.myinfil.nb_zones}" + '\n'
1360
+ ret += f"Time steps {self.myinfil.nb_steps}" + '\n'
1361
+
1362
+ if maxinf != self.myinfil.nb_zones:
1363
+ ret += _('Warning : number of zones in .inf and .fil files are different') + '\n'
1364
+
1365
+ return ret
1366
+
1367
+
1368
+ def copy2gpu(self, dirout:str=''):
1369
+ """
1370
+ Copie des matrices pour le code GPU
1371
+ """
1372
+
1373
+ def to_absolute(array:WolfArray):
1374
+ array.origx += array.translx
1375
+ array.origy += array.transly
1376
+ array.translx = 0.
1377
+ array.transly = 0.
1378
+
1379
+ ret = ''
1380
+
1381
+ dirout = Path(dirout)
1382
+ makedirs(dirout, exist_ok=True)
1383
+
1384
+ inf = self.read_fine_array('.inf')
1385
+ to_absolute(inf)
1386
+ inf.write_all(dirout / 'infiltration_zones.npy')
1387
+ del(inf)
1388
+
1389
+ ret += '.inf --> infiltration_zones.npy [np.int32]\n'
1390
+
1391
+ frot = self.read_fine_array('.frot')
1392
+ to_absolute(frot)
1393
+ frot.write_all(dirout / 'manning.npy')
1394
+ del(frot)
1395
+
1396
+ ret += '.frot --> manning.npy [np.float32]\n'
1397
+
1398
+ hbin = self.read_fine_array('.hbin')
1399
+ to_absolute(hbin)
1400
+ hbin.write_all(dirout / 'h.npy')
1401
+ del(hbin)
1402
+
1403
+ ret += '.hbin --> h.npy [np.float32]\n'
1404
+
1405
+ qxbin = self.read_fine_array('.qxbin')
1406
+ to_absolute(qxbin)
1407
+ qxbin.write_all(dirout / 'qx.npy')
1408
+ del(qxbin)
1409
+
1410
+ ret += '.qxbin --> qx.npy [np.float32]\n'
1411
+
1412
+ qybin = self.read_fine_array('.qybin')
1413
+ to_absolute(qybin)
1414
+ qybin.write_all(dirout / 'qy.npy')
1415
+ del(qybin)
1416
+
1417
+ ret += '.qybin --> qy.npy [np.float32]\n'
1418
+
1419
+ nap = self.read_fine_array('.napbin')
1420
+ napgpu = np.zeros_like(nap.array.data, dtype = np.uint8)
1421
+ napgpu[np.where(nap.array.data != 0)] = 1
1422
+ np.save(dirout / 'nap.npy', napgpu)
1423
+
1424
+ ret += '.napbin --> nap.npy [np.uint8]\n'
1425
+
1426
+ top = self.read_fine_array('.top')
1427
+ to_absolute(top)
1428
+ top.array.data[np.where(napgpu != 1)] = 99999.
1429
+ top.nullvalue = 99999.
1430
+ top.write_all(dirout / 'bathymetry.npy')
1431
+
1432
+ ret += '.top --> bathymetry.npy [np.float32]\n'
1433
+ ret += _('Force a value 99999. outside nap')
1434
+
1435
+ nb = np.sum(top.array.data != 99999.)
1436
+ assert nb == np.sum(napgpu == 1), 'Error in couting active cells'
1437
+
1438
+ ret += f'\n{nb} active cells in bathymetry.npy'
1439
+
1440
+ del(top)
1441
+
1442
+ return ret
wolfhece/PyPalette.py CHANGED
@@ -136,9 +136,9 @@ class wolfpalette(wx.Frame,LinearSegmentedColormap):
136
136
  dlg.Destroy()
137
137
 
138
138
  if step==0:
139
- self.values = np.linspace(self.values[0], self.values[-1], num=self.nb, endpoint=True)
139
+ self.values = np.linspace(self.values[0], self.values[-1], num=self.nb, endpoint=True)[0:self.nb]
140
140
  else:
141
- self.values = np.arange(self.values[0], self.values[0]+(self.nb)*step, step)
141
+ self.values = np.arange(self.values[0], self.values[0]+(self.nb)*step, step)[0:self.nb]
142
142
 
143
143
  self.fill_segmentdata()
144
144
 
wolfhece/apps/version.py CHANGED
@@ -5,7 +5,7 @@ class WolfVersion():
5
5
 
6
6
  self.major = 2
7
7
  self.minor = 0
8
- self.patch = 47
8
+ self.patch = 49
9
9
 
10
10
  def __str__(self):
11
11
 
wolfhece/eva/pyseries.py CHANGED
@@ -298,6 +298,8 @@ class EVA_Serie:
298
298
  else:
299
299
  raise Exception('Format non supported -- Please code your importing filter')
300
300
 
301
+ self.check_dupliactes()
302
+
301
303
  self.nb = self.data.shape[0]
302
304
 
303
305
  self.index_isnan = np.where(np.isnan(self.data))[0]
@@ -341,6 +343,17 @@ class EVA_Serie:
341
343
 
342
344
  self.tz_info = self.data.index[0].tz
343
345
 
346
+ def check_dupliactes(self):
347
+ """
348
+ Check if there are duplicates in the data
349
+ """
350
+ if not self.data.index.is_unique:
351
+ print('****\n')
352
+ print('Non unique index detected - removing duplicates - keep first value\n')
353
+ print(self.data.index[self.data.index.duplicated()])
354
+ print('****\n\n')
355
+ self.data = self.data[~self.data.index.duplicated(keep='first')]
356
+
344
357
  def filter(self):
345
358
  """
346
359
  Set zero, negative, NaN, Nat to np.nan
@@ -349,7 +362,7 @@ class EVA_Serie:
349
362
  if len(curindex)>0:
350
363
  self.data.iloc[curindex]=np.nan
351
364
 
352
- def get_date_max(self, year, seasons=None) -> list():
365
+ def get_date_max(self, year, seasons=None) -> list:
353
366
  """
354
367
  Récupère la date du maximum de l'année "year"
355
368
  Possibilité de traiter plusieurs saisons
@@ -365,7 +378,7 @@ class EVA_Serie:
365
378
  resdates.append((self.maxima[curseason]['date'][idx], curseason))
366
379
  return resdates
367
380
 
368
- def get_one_maxevent(self, year, seasons=None) -> list():
381
+ def get_one_maxevent(self, year, seasons=None) -> list:
369
382
  """
370
383
  Récupération de l'événement max pour une année spécifique
371
384
  Possibilité de traiter plusieurs saisons
@@ -431,7 +444,6 @@ class EVA_Serie:
431
444
  def save_max_events(self, filename, years_bounds:list=None, seasons=None):
432
445
  """
433
446
  Enregistrement des crues maximales dans un fichier CSV
434
- Un onglet par saison
435
447
  """
436
448
  seasons = sanitize_seasons(seasons)
437
449
 
@@ -1238,7 +1250,7 @@ class EVA_Serie:
1238
1250
  fig:Figure=None,
1239
1251
  ax:Axes=None,
1240
1252
  color:str='red',
1241
- alpha=1.) -> tuple([Figure,Axes]):
1253
+ alpha=1.) -> tuple[Figure,Axes]:
1242
1254
  """
1243
1255
  Plot median hydrograph scale by constant
1244
1256
  """
@@ -1265,7 +1277,7 @@ class EVA_Serie:
1265
1277
  k+=1
1266
1278
 
1267
1279
 
1268
- def plot_classified_flowrate_curve(self, fig:Figure=None, ax:Axes=None, label='', textvalues=True, show=False) -> tuple([Figure,Axes]):
1280
+ def plot_classified_flowrate_curve(self, fig:Figure=None, ax:Axes=None, label='', textvalues=True, show=False) -> tuple[Figure,Axes]:
1269
1281
 
1270
1282
  if ax is None:
1271
1283
  fig,ax = plt.subplots(1,1)
@@ -1367,7 +1379,7 @@ class EVA_Serie:
1367
1379
  if show:
1368
1380
  plt.show()
1369
1381
 
1370
- def plot_ci(self, seasons=None, laws=['GEV'], methods=['MLE'], fig:Figure=None, ax:Axes=None, show=False, alpha=.1) -> tuple([Figure,Axes]):
1382
+ def plot_ci(self, seasons=None, laws=['GEV'], methods=['MLE'], fig:Figure=None, ax:Axes=None, show=False, alpha=.1) -> tuple[Figure,Axes]:
1371
1383
  """
1372
1384
  Plotting confidence interval
1373
1385
  """
@@ -1419,7 +1431,7 @@ class EVA_Serie:
1419
1431
 
1420
1432
  return (fig,ax)
1421
1433
 
1422
- def plot_annual(self, years=None, hydrol=True, fig:Figure=None, ax:Axes=None, show=False, withdatemax=True) -> tuple([Figure,Axes]):
1434
+ def plot_annual(self, years=None, hydrol=True, fig:Figure=None, ax:Axes=None, show=False, withdatemax=True) -> tuple[Figure,Axes]:
1423
1435
  """
1424
1436
  Tracé en superposition des différentes années sur l'emprise d'une année civile ou hydrologique
1425
1437
  """
@@ -1483,7 +1495,7 @@ class EVA_Serie:
1483
1495
 
1484
1496
  return (fig,ax)
1485
1497
 
1486
- def plot_serie(self, fig:Figure=None, ax:Axes=None, show=False, background=True, backcolor='lemonchiffon') -> tuple([Figure,Axes]):
1498
+ def plot_serie(self, fig:Figure=None, ax:Axes=None, show=False, background=True, backcolor='lemonchiffon') -> tuple[Figure,Axes]:
1487
1499
  """Tracé de l'ensemble de la série pour toutes les années"""
1488
1500
  if fig is None and ax is None:
1489
1501
  fig,ax = plt.subplots(1,1)
@@ -1510,7 +1522,7 @@ class EVA_Serie:
1510
1522
 
1511
1523
  return (fig,ax)
1512
1524
 
1513
- def plot_cdf(self, seasons=None, fig:Figure=None, ax:Axes=None, show=False, n_bins=100) -> tuple([Figure,Axes]):
1525
+ def plot_cdf(self, seasons=None, fig:Figure=None, ax:Axes=None, show=False, n_bins=100) -> tuple[Figure,Axes]:
1514
1526
  """
1515
1527
  Plotting empirical cdf
1516
1528
  """
@@ -1537,7 +1549,7 @@ class EVA_Serie:
1537
1549
 
1538
1550
  return (fig,ax)
1539
1551
 
1540
- def plot_T_Qmaxima(self, seasons=None, empirical_func='Cunnane', fig:Figure=None, ax:Axes=None, show=False, alpha=1., color_marker_label=None) -> tuple([Figure,Axes]):
1552
+ def plot_T_Qmaxima(self, seasons=None, empirical_func='Cunnane', fig:Figure=None, ax:Axes=None, show=False, alpha=1., color_marker_label=None) -> tuple[Figure,Axes]:
1541
1553
  """
1542
1554
  Plotting Q vs return period
1543
1555
  """
@@ -1600,7 +1612,7 @@ class EVA_Serie:
1600
1612
 
1601
1613
  return (fig,ax)
1602
1614
 
1603
- def plot_maxevents(self, seasons=None, before=1, after=2, adim=True, fig:Figure=None, ax:Axes=None, show=False, alpha=.2, nbevents=None) -> tuple([Figure,Axes]):
1615
+ def plot_maxevents(self, seasons=None, before=1, after=2, adim=True, fig:Figure=None, ax:Axes=None, show=False, alpha=.2, nbevents=None) -> tuple[Figure,Axes]:
1604
1616
  """
1605
1617
  Tracé des événements/hydrogrammes associés aux maxima identifiés
1606
1618
  Les ordonnées sont adimensionnaliées sur base de la valeur maximale
@@ -1692,7 +1704,7 @@ class EVA_Serie:
1692
1704
 
1693
1705
  return (fig,ax)
1694
1706
 
1695
- def plot_comp_maxevents(self, seasons=None, before=1, after=2, fig:Figure=None, ax:Axes=None, show=False, alpha=.2, nbevents=None) -> tuple([Figure,Axes]):
1707
+ def plot_comp_maxevents(self, seasons=None, before=1, after=2, fig:Figure=None, ax:Axes=None, show=False, alpha=.2, nbevents=None) -> tuple[Figure,Axes]:
1696
1708
  """
1697
1709
  Tracé des événements médians
1698
1710
  Les ordonnées sont adimensionnaliées sur base de la valeur maximale
@@ -1781,7 +1793,7 @@ class EVA_Serie:
1781
1793
  fig:Figure=None,
1782
1794
  ax:Axes=None,
1783
1795
  show=False,
1784
- alpha=.2) -> tuple([Figure,Axes]):
1796
+ alpha=.2) -> tuple[Figure,Axes]:
1785
1797
  """
1786
1798
  Tracé d'un événement quelconque autour d'une date
1787
1799
  """
@@ -1825,7 +1837,7 @@ class EVA_Serie:
1825
1837
  fig:Figure=None,
1826
1838
  ax:Axes=None,
1827
1839
  show=False,
1828
- alpha=.2) -> tuple([Figure,Axes]):
1840
+ alpha=.2) -> tuple[Figure,Axes]:
1829
1841
  """
1830
1842
  Tracé d'un événement spécifique associés au maxima identifié
1831
1843
  Les ordonnées sont adimensionnaliées sur base de la valeur maximale
@@ -1875,7 +1887,7 @@ class EVA_Serie:
1875
1887
  ax:Axes=None,
1876
1888
  show=False,
1877
1889
  alpha=1.,
1878
- styles:dict=None) -> tuple([Figure,Axes]):
1890
+ styles:dict=None) -> tuple[Figure,Axes]:
1879
1891
  """
1880
1892
  Plotting fitted models
1881
1893
  """
@@ -1969,7 +1981,7 @@ class EVA_Serie:
1969
1981
 
1970
1982
  return (fig,ax)
1971
1983
 
1972
- def plot_qq(self, seasons=None, laws=['GEV'], methods=['MLE'], fig:Figure=None, ax:Axes=None) -> tuple([Figure,Axes]):
1984
+ def plot_qq(self, seasons=None, laws=['GEV'], methods=['MLE'], fig:Figure=None, ax:Axes=None) -> tuple[Figure,Axes]:
1973
1985
  """
1974
1986
  Q-Q Plot
1975
1987
 
@@ -2011,7 +2023,7 @@ class EVA_Serie:
2011
2023
  ax.legend()
2012
2024
  return(fig, ax)
2013
2025
 
2014
- def plot_summary(self, seasons=None, nb_laws=None, forced_laws=[], sort:typing.Literal['RSS', 'AICc', 'AIC', 'BIC']='RSS', fig:Figure=None, ax:Axes=None, show=False) -> tuple([Figure,Axes]):
2026
+ def plot_summary(self, seasons=None, nb_laws=None, forced_laws=[], sort:typing.Literal['RSS', 'AICc', 'AIC', 'BIC']='RSS', fig:Figure=None, ax:Axes=None, show=False) -> tuple[Figure,Axes]:
2015
2027
  """Plot summary results.
2016
2028
 
2017
2029
  Parameters
@@ -2202,7 +2214,7 @@ class EVA_Series:
2202
2214
  ax:Axes=None,
2203
2215
  show=False,
2204
2216
  alpha=1.,
2205
- color_marker_label=None) -> tuple([Figure,Axes]):
2217
+ color_marker_label=None) -> tuple[Figure,Axes]:
2206
2218
 
2207
2219
  return self._current_serie.plot_T_Qmaxima(seasons, empirical_func, fig, ax, show, alpha, color_marker_label)
2208
2220
 
@@ -2214,7 +2226,7 @@ class EVA_Series:
2214
2226
  ax:Axes=None,
2215
2227
  show=False,
2216
2228
  alpha=1.,
2217
- styles:dict=None) -> tuple([Figure,Axes]):
2229
+ styles:dict=None) -> tuple[Figure,Axes]:
2218
2230
 
2219
2231
  return self._current_serie.plot_fit(seasons, laws, methods, fig, ax, show, alpha, styles)
2220
2232
 
@@ -2437,7 +2449,7 @@ class EVA_Series:
2437
2449
 
2438
2450
  return plots
2439
2451
 
2440
- def evaluate_ci(self, seasons=None, durations=[1], laws=['GEV'], nboot=100, show=False) -> dict():
2452
+ def evaluate_ci(self, seasons=None, durations=[1], laws=['GEV'], nboot=100, show=False) -> dict:
2441
2453
  """
2442
2454
  Intervalles de confiance
2443
2455
 
@@ -2468,7 +2480,7 @@ class EVA_Series:
2468
2480
 
2469
2481
  return figax
2470
2482
 
2471
- def evaluate_ic(self, seasons=None, durations=[1], laws=['GEV'], nboot=100, show=False) -> dict():
2483
+ def evaluate_ic(self, seasons=None, durations=[1], laws=['GEV'], nboot=100, show=False) -> dict:
2472
2484
  """ alias evaluate_ci """
2473
2485
  return self.evaluate_ci(seasons, durations, laws, nboot, show)
2474
2486
 
@@ -2561,7 +2573,7 @@ class EVA_Series:
2561
2573
  ylim=None,
2562
2574
  before = 1,
2563
2575
  after = 3,
2564
- show=False) -> tuple([Figure, Axes, Axes]):
2576
+ show=False) -> tuple[Figure, Axes, Axes]:
2565
2577
  """
2566
2578
  ################
2567
2579
  ## GRAPHIQUES ##
@@ -2600,7 +2612,7 @@ class EVA_Series:
2600
2612
  ylim=None,
2601
2613
  before = 1,
2602
2614
  after=2,
2603
- show=False) -> tuple([Figure, Axes]):
2615
+ show=False) -> tuple[Figure, Axes]:
2604
2616
  """
2605
2617
  ################
2606
2618
  ## GRAPHIQUES ##
@@ -2661,7 +2673,7 @@ class EVA_Series:
2661
2673
 
2662
2674
  def plot_one_fit(self, seasons=None, durations=None, laws='popular',
2663
2675
  split_duration=True, split_season=True, xbounds=None,
2664
- ybounds=None, show=False) -> tuple([Figure, Axes]):
2676
+ ybounds=None, show=False) -> tuple[Figure, Axes]:
2665
2677
 
2666
2678
  seasons = sanitize_seasons(seasons)
2667
2679
 
@@ -2752,7 +2764,7 @@ class EVA_Series:
2752
2764
  return summary
2753
2765
 
2754
2766
  def plot_selected_max(self, seasons=None, durations=None,
2755
- split_seasons = False, scaling=False, show=False)-> tuple([Figure, Axes]):
2767
+ split_seasons = False, scaling=False, show=False)-> tuple[Figure, Axes]:
2756
2768
  """
2757
2769
  Graphique des dates des événements sélectionnés pour chaque durée (par défaut, toutes les durées)
2758
2770
  """
wolfhece/irm_qdf.py CHANGED
@@ -167,18 +167,19 @@ class Qdf_IRM():
167
167
 
168
168
  Exemple d'utilisation :
169
169
 
170
- #Pour importer les fichiers depuis le site web de l'IRM meteo.be
171
- import wolfhece.irm_qdf as qdf
170
+ Pour importer les fichiers depuis le site web de l'IRM meteo.be
171
+ from wolfhece.irm_qdf import Qdf_IRM
172
172
  qdf = Qdf_IRM(force_import=True)
173
173
 
174
174
  Il est possible de spécifier le répertoire de stockage des fichiers Excel
175
175
  Par défaut, il s'agit d'un sous-répertoire 'irm' du répertoire courant qui sera créé s'il n'exsiste pas
176
176
 
177
- Une fois importé, il est possible de charger une commune sur base de l'INS ou de son nom
177
+ Une fois importé/téléchargé, il est possible de charger une commune sur base de l'INS ou de son nom
178
178
 
179
- myqdf = qdf.Qdf_IRM(name='Jalhay')
179
+ myqdf = Qdf_IRM(name='Jalhay')
180
180
 
181
181
  Les données sont ensuite disponibles dans les propriétés, qui sont des "dataframes" pandas (https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html) :
182
+
182
183
  - qdf : les relation Quantité/durée/fréquence
183
184
  - standarddev : l'écart-type de l'erreur
184
185
  - confintlow : la valeur inférieure de l'intervalle de confiance (-2*stddev)
@@ -3029,6 +3029,25 @@ class prev_sim2D():
3029
3029
  ('.qybin','Initial discharge along Y [m^2/s]',WOLF_ARRAY_FULL_SINGLE)
3030
3030
  ]}
3031
3031
 
3032
+ self.files_others={'Generic file':[
3033
+ ('','First parametric file - historical'),
3034
+ ('.par','Parametric file - multiblocks')],
3035
+ 'Charachteristics':[
3036
+ ('.fil','Infiltration hydrographs [m³/s]'),
3037
+ ('.mnap','Resulting mesh [-]'),
3038
+ ('.trl','Translation to real world [m]')
3039
+ ]}
3040
+
3041
+ self.files_vectors={'Block file':[
3042
+ ('.bloc','Blocks geometry')],
3043
+ 'Borders':[
3044
+ ('.sux','X borders'),
3045
+ ('.suy','Y borders')],
3046
+ 'Contour':[
3047
+ ('.xy','General perimeter')
3048
+ ]}
3049
+
3050
+
3032
3051
  def get_header(self):
3033
3052
  curhead = header_wolf()
3034
3053
 
wolfhece/wolf_array.py CHANGED
@@ -71,6 +71,7 @@ WOLF_ARRAY_FULL_INTEGER8 = 8
71
71
  WOLF_ARRAY_MB_SINGLE = 3
72
72
  WOLF_ARRAY_MB_INTEGER = 9
73
73
 
74
+ WOLF_ARRAY_FULL_INTEGER16_2 = 0
74
75
  WOLF_ARRAY_FULL_INTEGER16 = 11
75
76
  WOLF_ARRAY_MNAP_INTEGER = 20
76
77
 
@@ -156,7 +157,14 @@ class header_wolf():
156
157
  ret += _(' - Origin : ({} ; {}) \n').format(self.origx, self.origy)
157
158
  ret += _(' - End : ({} ; {}) \n').format(self.origx + self.nbx * self.dx, self.origy +self.nby * self.dy)
158
159
  ret += _(' - Widht x Height : {} x {} \n').format(self.nbx * self.dx, self.nby * self.dy)
159
- ret += _('Null value :{}\n'.format(self.nullvalue))
160
+ ret += _(' - Translation : ({} ; {})\n').format(self.translx, self.transly)
161
+ ret += _('Null value : {}\n\n'.format(self.nullvalue))
162
+
163
+ if len(self.head_blocks) > 0:
164
+ ret += _('Number of blocks : {}\n\n').format(len(self.head_blocks))
165
+ for key, value in self.head_blocks.items():
166
+ ret += _('Block {} : \n\n').format(key)
167
+ ret += str(value)
160
168
 
161
169
  return ret
162
170
 
@@ -697,7 +705,7 @@ class header_wolf():
697
705
  :param forceupdate : if True, the file is rewritten even if it already exists
698
706
  """
699
707
 
700
- assert wolftype in [WOLF_ARRAY_CSR_DOUBLE, WOLF_ARRAY_FULL_SINGLE, WOLF_ARRAY_FULL_DOUBLE, WOLF_ARRAY_SYM_DOUBLE, WOLF_ARRAY_FULL_LOGICAL, WOLF_ARRAY_CSR_DOUBLE, WOLF_ARRAY_FULL_INTEGER, WOLF_ARRAY_FULL_SINGLE_3D, WOLF_ARRAY_FULL_INTEGER8, WOLF_ARRAY_MB_SINGLE, WOLF_ARRAY_MB_INTEGER, WOLF_ARRAY_FULL_INTEGER16, WOLF_ARRAY_MNAP_INTEGER]
708
+ assert wolftype in [WOLF_ARRAY_CSR_DOUBLE, WOLF_ARRAY_FULL_SINGLE, WOLF_ARRAY_FULL_DOUBLE, WOLF_ARRAY_SYM_DOUBLE, WOLF_ARRAY_FULL_LOGICAL, WOLF_ARRAY_CSR_DOUBLE, WOLF_ARRAY_FULL_INTEGER, WOLF_ARRAY_FULL_SINGLE_3D, WOLF_ARRAY_FULL_INTEGER8, WOLF_ARRAY_MB_SINGLE, WOLF_ARRAY_MB_INTEGER, WOLF_ARRAY_FULL_INTEGER16, WOLF_ARRAY_MNAP_INTEGER, WOLF_ARRAY_FULL_INTEGER16_2], _('The type of array is not correct')
701
709
 
702
710
  if not os.path.exists(filename) or forceupdate:
703
711
  with open(filename,'w') as f:
@@ -2458,6 +2466,9 @@ class SelectionData():
2458
2466
  logging.error(_('Selection {} does not exist').format(which))
2459
2467
  return ''
2460
2468
 
2469
+ if len(curlist) == 0:
2470
+ return ''
2471
+
2461
2472
  for cur in curlist:
2462
2473
  txt += str(cur[0]) + '\t' + str(cur[1]) + '\n'
2463
2474
 
@@ -2487,6 +2498,9 @@ class SelectionData():
2487
2498
  logging.error(_('Selection {} does not exist').format(which))
2488
2499
  return ''
2489
2500
 
2501
+ if len(curlist) == 0:
2502
+ return ''
2503
+
2490
2504
  txt += '# For boundary conditions :\n'
2491
2505
  for cur in curlist:
2492
2506
  i,j = self.parent.get_ij_from_xy(cur[0], cur[1], aswolf=True)
@@ -3608,7 +3622,7 @@ class WolfArray(Element_To_Draw, header_wolf):
3608
3622
  dtype = np.float32
3609
3623
  elif self.wolftype in [WOLF_ARRAY_FULL_INTEGER, WOLF_ARRAY_MB_INTEGER, WOLF_ARRAY_MNAP_INTEGER]:
3610
3624
  dtype = np.int32
3611
- elif self.wolftype == WOLF_ARRAY_FULL_INTEGER16:
3625
+ elif self.wolftype in [WOLF_ARRAY_FULL_INTEGER16, WOLF_ARRAY_FULL_INTEGER16_2]:
3612
3626
  dtype = np.int16
3613
3627
  elif self.wolftype == WOLF_ARRAY_FULL_INTEGER8:
3614
3628
  dtype = np.int8
@@ -4618,7 +4632,7 @@ class WolfArray(Element_To_Draw, header_wolf):
4618
4632
  dtype = np.float32
4619
4633
  elif self.wolftype == WOLF_ARRAY_FULL_INTEGER:
4620
4634
  dtype = np.int32
4621
- elif self.wolftype == WOLF_ARRAY_FULL_INTEGER16:
4635
+ elif self.wolftype in [WOLF_ARRAY_FULL_INTEGER16, WOLF_ARRAY_FULL_INTEGER16_2]:
4622
4636
  dtype = np.int16
4623
4637
 
4624
4638
  self.dx = myhead.dx
@@ -5435,7 +5449,7 @@ class WolfArray(Element_To_Draw, header_wolf):
5435
5449
  elif self.wolftype == WOLF_ARRAY_FULL_INTEGER:
5436
5450
  locarray = np.frombuffer(f.read(self.nbx * self.nby * 4), dtype=np.int32)
5437
5451
  self.array = ma.masked_array(locarray.copy(), dtype=np.int32)
5438
- elif self.wolftype == WOLF_ARRAY_FULL_INTEGER16:
5452
+ elif self.wolftype in [WOLF_ARRAY_FULL_INTEGER16, WOLF_ARRAY_FULL_INTEGER16_2]:
5439
5453
  locarray = np.frombuffer(f.read(self.nbx * self.nby * 2), dtype=np.int16)
5440
5454
  self.array = ma.masked_array(locarray.copy(), dtype=np.int16)
5441
5455
 
@@ -5565,7 +5579,7 @@ class WolfArray(Element_To_Draw, header_wolf):
5565
5579
  if self.array is None:
5566
5580
  return
5567
5581
 
5568
- if self.wolftype in [WOLF_ARRAY_FULL_INTEGER, WOLF_ARRAY_FULL_INTEGER16]:
5582
+ if self.wolftype in [WOLF_ARRAY_FULL_INTEGER, WOLF_ARRAY_FULL_INTEGER16, WOLF_ARRAY_FULL_INTEGER16_2]:
5569
5583
  value=int(value)
5570
5584
 
5571
5585
  if value is not None:
@@ -6423,7 +6437,7 @@ class WolfArrayMB(WolfArray):
6423
6437
  def mask_data(self, value):
6424
6438
  """ Mask cells where values are equal to `value`"""
6425
6439
 
6426
- if self.wolftype in [WOLF_ARRAY_FULL_INTEGER, WOLF_ARRAY_FULL_INTEGER16]:
6440
+ if self.wolftype in [WOLF_ARRAY_FULL_INTEGER, WOLF_ARRAY_FULL_INTEGER16, WOLF_ARRAY_FULL_INTEGER16_2]:
6427
6441
  value=int(value)
6428
6442
 
6429
6443
  if value is not None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: wolfhece
3
- Version: 2.0.47
3
+ Version: 2.0.49
4
4
  Author-email: Pierre Archambeau <pierre.archambeau@uliege.be>
5
5
  License: AGPL-v3 License
6
6
  Project-URL: Homepage, https://uee.uliege.be/hece
@@ -7,10 +7,10 @@ wolfhece/Model1D.py,sha256=-cMz-ePSYzrKVVDidiDOz6cojEZ3y6u9gIb7RPwT6Y8,476593
7
7
  wolfhece/PyConfig.py,sha256=oGSL1WsLM9uinlNP4zGBLK3uHPmBfduUi7R-VtWuRFA,8034
8
8
  wolfhece/PyCrosssections.py,sha256=f4dNYRUGZKePruaaBiTcn5vlrw8TFTj9XwTDrdiF_uU,112450
9
9
  wolfhece/PyDraw.py,sha256=Zz2pcBUGA7s3FURP-4CPdoBqENtSrf-RLH1o-xZ6qrA,343578
10
- wolfhece/PyGui.py,sha256=UjK8wrBXVh04HlXuaS88K-oyrI4-muaPSmIpHRjGJLk,54136
10
+ wolfhece/PyGui.py,sha256=LZtmQuEa0p-67iYyvLHJRK8uBs1zKmA3UqDzejWogy8,59795
11
11
  wolfhece/PyGuiHydrology.py,sha256=wKhR-KthPRyzJ887NmsozmUpm2CIQIwO3IbYORCYjrE,7290
12
12
  wolfhece/PyHydrographs.py,sha256=GKK8U0byI45H9O_e4LAOOi7Aw0Tg7Q0Lx322stPg5IQ,3453
13
- wolfhece/PyPalette.py,sha256=Yjivc_Z3i6zpyTBM3U1Gd00bOqqM4D3CVkjs-oW3K3Q,22230
13
+ wolfhece/PyPalette.py,sha256=SYKYx_vxF_FVuceLhcIqFQsivGD6EoO_Xu-EGN9Ivko,22252
14
14
  wolfhece/PyParams.py,sha256=-0cax_Db6kFTe46BAgT24Ga2Xyp2Dm3gpuI-5uUSMxw,84758
15
15
  wolfhece/PyPictures.py,sha256=-mJB0JL2YYiEK3D7_ssDkvYiMWK4ve9kXhozQXNeSx8,2216
16
16
  wolfhece/PyTranslate.py,sha256=4appkmNeHHZLFmUtaA_k5_5QL-5ymxnbVN4R2OblmtE,622
@@ -32,7 +32,7 @@ wolfhece/friction_law.py,sha256=vMr6BgVVV2JqhPDjBtZBtosDIZcbykZxw-fKxiJzd4M,5200
32
32
  wolfhece/gpuview.py,sha256=Lq17jV2ytQShUuvi1UE_A1-6Q0IojsKxrKhkYHRf_8w,23437
33
33
  wolfhece/import_ascfiles.py,sha256=jg4urcLdSgFS1Knvh7AVGJqM44qc_uYDNrR568tMh-A,4167
34
34
  wolfhece/ins.py,sha256=0aU1mo4tYbw64Gwzrqbh-NCTH1tukmk0mpPHjRPHZXU,12661
35
- wolfhece/irm_qdf.py,sha256=0nOU_usEZuWMwYOPV9qtZoWsQTn2x2DxOuk7VlYMkbo,15419
35
+ wolfhece/irm_qdf.py,sha256=749SlAXiN1oXp5tfBJoPNJWxydQlY55K0qvIM5YexlM,15436
36
36
  wolfhece/ismember.py,sha256=fkLvaH9fhx-p0QrlEzqa6ySO-ios3ysjAgXVXzLgSpY,2482
37
37
  wolfhece/multiprojects.py,sha256=AMwEQZqo1Twh6tSPP-4L29-Fa8cI9d6dWce7l88awws,14675
38
38
  wolfhece/picc.py,sha256=KKPNk1BEe7QBzo2icIsdsxUopJ1LXYTomfdfeG2gCeA,7419
@@ -48,7 +48,7 @@ wolfhece/rain_SPWMI.py,sha256=YqsF-yFro3y_a6MfVRFfr-Rxi7NR1gl_i8VX7scmzes,13548
48
48
  wolfhece/test_Results2DGPU.py,sha256=NOJ_hFXrcLSQXS1dtsqXRQltqIZtDSHMz_EgAJ2_FHU,307
49
49
  wolfhece/textpillow.py,sha256=zEfLrKhfCDyMaVuQOUjHqz6MGKeQ4aewMxOsWi5-wKI,13832
50
50
  wolfhece/tools_mpl.py,sha256=q8Yc4aukPPiUcEzREvZRM_em67XqXaahdoaNt0DETfE,266
51
- wolfhece/wolf_array.py,sha256=9kNIuzJ22mD4SDvhuVqq56i61Uzxw3B-LbXzFE7nGDM,287654
51
+ wolfhece/wolf_array.py,sha256=ZdiL2UngJ3gpxu0in36bXqDXAFkNXfXgoNKlYshe5qI,288379
52
52
  wolfhece/wolf_hist.py,sha256=JpRXvzJLUP-RkSkvth3DQWglgTMFI2ZEUDb4RYOfeeI,3284
53
53
  wolfhece/wolf_texture.py,sha256=llQ7aV8scWXIkhpri9XjaPejzoBJsGfsln2ZnlRbFkU,16270
54
54
  wolfhece/wolf_tiles.py,sha256=F2JsJHdAP8fIffNJdG_J26bonCIRtIwMmxKFqdSCRDA,10088
@@ -66,7 +66,7 @@ wolfhece/apps/check_install.py,sha256=jrKR-njqnpIh6ZJqvP6KbDUPVCfwTNQj4glQhcyzs9
66
66
  wolfhece/apps/curvedigitizer.py,sha256=avWERHuVxPnJBOD_ibczwW_XG4vAenqWS8W1zjhBox8,4898
67
67
  wolfhece/apps/isocurrent.py,sha256=4XnNWPa8mYUK7V4zdDRFrHFIXNG2AN2og3TqWKKcqjY,3811
68
68
  wolfhece/apps/splashscreen.py,sha256=m9hMTqzhSUcTudApyNNjoAK9e2u5vgEkJVV79xmfM1s,2118
69
- wolfhece/apps/version.py,sha256=GU02tpPFaQBxJ6d59qXIRFZRbAPKUWA_xhCGwFLwzi0,388
69
+ wolfhece/apps/version.py,sha256=tejIrO28wyVtzgDMOfulj8-lCo6fAuZLVAHNwyLgfLM,388
70
70
  wolfhece/apps/wolf.py,sha256=gqfm-ZaUJqNsfCzmdtemSeqLw-GVdSVix-evg5WArJI,293
71
71
  wolfhece/apps/wolf2D.py,sha256=gWD9ee2-1pw_nUxjgRaJMuSe4kUT-RWhOeoTt_Lh1mM,267
72
72
  wolfhece/apps/wolf_logo.bmp,sha256=ruJ4MA51CpGO_AYUp_dB4SWKHelvhOvd7Q8NrVOjDJk,3126
@@ -83,7 +83,7 @@ wolfhece/eva/bootstrap.py,sha256=xHbIAZzFuaKLwiRpgvsLi5OZYqwaxYACqsAU-FnB6Pc,605
83
83
  wolfhece/eva/hydrogramme_mono.py,sha256=uZFIgJJ-JogMFzt7D7OnyVaHvgxCQJPZz9W9FgnuthA,8138
84
84
  wolfhece/eva/joint_models.py,sha256=KTal-jVJmeEWXPQ5mKyT032q186Drz3IFdc60daz-t0,5565
85
85
  wolfhece/eva/mixture_models.py,sha256=WRzGxE2rQ-RkQUskL6IlSeUqEWlAeezJrNhkr0QpeOI,15923
86
- wolfhece/eva/pyseries.py,sha256=7lboJE3ZGKVmMwBXQow9jTYfneTtsDwXeAPCe4y62QE,118129
86
+ wolfhece/eva/pyseries.py,sha256=Oz2QCPGrbebAwQL1Vl-kc4t1OkzS-pCuj5rZwDGEJ-I,118536
87
87
  wolfhece/fonts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
88
88
  wolfhece/fonts/arial.ttf,sha256=uwYWwXEZKaG6axcVPiDDM0MXLgf40xAQmMwR8BSShSY,37496
89
89
  wolfhece/fonts/helvetica.ttf,sha256=X4Zd3zdUmuRGMLE6UB-BMIbirpdK3Ia5czfNnuSx5P8,317968
@@ -211,7 +211,7 @@ wolfhece/mesh2d/bc_manager.py,sha256=vSVogXy1x3A6fZKWA6mPZSGX2e3EAUVmEjD9Bgww_hU
211
211
  wolfhece/mesh2d/cell_tracker.py,sha256=AR-Bty-QnrY1ni8Lwak2kU2UWMAJSBCF2ugl2YpfsB4,8660
212
212
  wolfhece/mesh2d/config_manager.py,sha256=vrxLku4isZJTxbHOACEEIEEjQB9pkLpaVPteJz9GhnE,14417
213
213
  wolfhece/mesh2d/cst_2D_boundary_conditions.py,sha256=BaJeKHyJiKEFWBkTQeYsDBW86703ooj65MFVpPMgjLg,2810
214
- wolfhece/mesh2d/wolf2dprev.py,sha256=DEoWWHjBdAMQQWMwTSk88QMgjnN-X4ZZCmOV5p0XNOM,136438
214
+ wolfhece/mesh2d/wolf2dprev.py,sha256=q-5dwegcBjNy2IAn511Uuktnl8zt3cTtSowardpml2g,137113
215
215
  wolfhece/models/HECE_169.pptx,sha256=OWJtsWz504A-REFaaxw8lwStHyQU2l7KEeiE7IZvtbk,3396930
216
216
  wolfhece/models/blue.pal,sha256=NnjJnjnYVdQkG54RyPXvo4Tl9ytB0cN7zpiHtj1N6bw,33
217
217
  wolfhece/models/diff16.pal,sha256=Pkp9kQ1GvmAKz3lgwohsw8eQySjVVKHbjhoWw-gZ6Nc,303
@@ -256,8 +256,8 @@ wolfhece/sounds/sonsw2.wav,sha256=pFLVt6By0_EPQNt_3KfEZ9a1uSuYTgQSX1I_Zurv9Rc,11
256
256
  wolfhece/ui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
257
257
  wolfhece/ui/wolf_multiselection_collapsiblepane.py,sha256=yGbU_JsF56jsmms0gh7mxa7tbNQ_SxqhpAZxhm-mTy4,14860
258
258
  wolfhece/ui/wolf_times_selection_comparison_models.py,sha256=wCxGRnE3kzEkWlWA6-3X8ADOFux_B0a5QWJ2GnXTgJw,4709
259
- wolfhece-2.0.47.dist-info/METADATA,sha256=dJFIlRUAXTIyvBqN11Wi44FxC7LY6fILWOjeJjvDfqg,2233
260
- wolfhece-2.0.47.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
261
- wolfhece-2.0.47.dist-info/entry_points.txt,sha256=AIu1KMswrdsqNq_2jPtrRIU4tLjuTnj2dCY-pxIlshw,276
262
- wolfhece-2.0.47.dist-info/top_level.txt,sha256=EfqZXMVCn7eILUzx9xsEu2oBbSo9liWPFWjIHik0iCI,9
263
- wolfhece-2.0.47.dist-info/RECORD,,
259
+ wolfhece-2.0.49.dist-info/METADATA,sha256=yvh37UvJwhh4d8FQvjpMLs2A9VYIMcuQRNmD02fszi8,2233
260
+ wolfhece-2.0.49.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
261
+ wolfhece-2.0.49.dist-info/entry_points.txt,sha256=AIu1KMswrdsqNq_2jPtrRIU4tLjuTnj2dCY-pxIlshw,276
262
+ wolfhece-2.0.49.dist-info/top_level.txt,sha256=EfqZXMVCn7eILUzx9xsEu2oBbSo9liWPFWjIHik0iCI,9
263
+ wolfhece-2.0.49.dist-info/RECORD,,