ipyvasp 1.0.8__py2.py3-none-any.whl → 1.1.0__py2.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.
ipyvasp/_lattice.py CHANGED
@@ -231,6 +231,21 @@ def periodic_table(selection=None):
231
231
  ax.set(xlim=[-0.6,17.6],ylim=[9.6,-0.6]) # to show borders correctly
232
232
  return ax
233
233
 
234
+ def _write_text(dest, text: str, *, encoding: str = "utf-8") -> None:
235
+ "Write unicode text either to a path-like destination or to a writable text stream."
236
+ # Treat file-like objects (streams) first (avoid Path("CON") / weird Windows devices, etc.)
237
+ if hasattr(dest, "write") and callable(getattr(dest, "write")):
238
+ dest.write(text)
239
+ # Best-effort flush (sys.stdout has it, StringIO doesn't need it)
240
+ flush = getattr(dest, "flush", None)
241
+ if callable(flush):
242
+ flush()
243
+ return
244
+
245
+ # Otherwise treat as a filesystem path
246
+ path = Path(dest)
247
+ with path.open("w", encoding=encoding) as f:
248
+ f.write(text)
234
249
 
235
250
  def write_poscar(poscar_data, outfile=None, selective_dynamics=None, overwrite=False, comment="", scale=None, system=None):
236
251
  """Writes POSCAR data to a file or returns string
@@ -285,19 +300,18 @@ def write_poscar(poscar_data, outfile=None, selective_dynamics=None, overwrite=F
285
300
  pos_list = [f"{p} {s}" for p, s in zip(pos_list, sd)]
286
301
 
287
302
  out_str += "\n".join(pos_list)
288
- if outfile:
289
- path = Path(outfile)
290
- if not path.is_file():
291
- with path.open("w", encoding="utf-8") as f:
292
- f.write(out_str)
293
-
294
- elif overwrite and path.is_file():
295
- with path.open("w", encoding="utf-8") as f:
296
- f.write(out_str)
303
+ if outfile is not None:
304
+ # If it's a writable stream (sys.stdout, StringIO, open file handle), write directly.
305
+ if hasattr(outfile, "write") and callable(getattr(outfile, "write")):
306
+ _write_text(outfile, out_str)
297
307
  else:
298
- raise FileExistsError(
299
- f"{outfile!r} exists, can not overwrite, \nuse overwrite=True if you want to change."
300
- )
308
+ # Otherwise treat as path-like with overwrite protection.
309
+ path = Path(outfile)
310
+ if path.exists() and not overwrite:
311
+ raise FileExistsError(
312
+ f"{str(path)!r} exists, can not overwrite; use overwrite=True."
313
+ )
314
+ _write_text(path, out_str)
301
315
  else:
302
316
  print(out_str)
303
317
 
@@ -555,9 +569,8 @@ class InvokeMaterialsProject:
555
569
  return f"Structure(unit={self.unit},mp_id={self.mp_id!r},symbol={self.symbol!r},crystal={self.crystal!r},cif='{self._cif[:10]}...')"
556
570
 
557
571
  def write_cif(self, outfile=None):
558
- if isinstance(outfile, str):
559
- with open(outfile, "w") as f:
560
- f.write(self._cif)
572
+ if outfile is not None:
573
+ _write_text(outfile, self._cif)
561
574
  else:
562
575
  print(self._cif)
563
576
 
@@ -640,12 +653,12 @@ def get_kpath(
640
653
  ibzkpt : PathLike
641
654
  Path to ibzkpt file, required for HSE calculations.
642
655
  outfile : PathLike
643
- Path/to/file to write kpoints.
656
+ Path/to/file to write kpoints. Use sys.stdout to print to console.
644
657
  rec_basis : array_like
645
658
  Reciprocal basis 3x3 array to use for calculating uniform points.
646
659
 
647
660
 
648
- If `outfile = None`, KPONITS file content is printed.
661
+ If `outfile = None`, kpoints array (Nx3) is returned.
649
662
  """
650
663
  if isinstance(kpoints, str):
651
664
  kpoints = _str2kpoints(kpoints)
@@ -766,10 +779,9 @@ def get_kpath(
766
779
  )
767
780
  out_str = "{}\n{}".format(top_str, out_str)
768
781
  if outfile != None:
769
- with open(outfile, "w", encoding="utf-8") as f: # allow unicode
770
- f.write(out_str)
782
+ _write_text(outfile, out_str)
771
783
  else:
772
- print(out_str)
784
+ return points # return points for any processing by user.
773
785
 
774
786
 
775
787
  # Cell
@@ -799,12 +811,12 @@ def get_kmesh(
799
811
  ibzkpt : PathLike
800
812
  Path to ibzkpt file, required for HSE calculations.
801
813
  outfile : PathLike
802
- Path/to/file to write kpoints.
814
+ Path/to/file to write kpoints. Use sys.stdout to print to console.
803
815
  endpoint : bool
804
816
  Default True, include endpoints in mesh at edges away from origin.
805
817
 
806
818
 
807
- If `outfile = None`, KPOINTS file content is printed.
819
+ If `outfile = None`, kpoints array (Nx3) is returned.
808
820
 
809
821
  """
810
822
  if len(args) not in [1, 3]:
@@ -879,10 +891,9 @@ def get_kmesh(
879
891
  )
880
892
  out_str = "{}\n{}".format(top_str, out_str)
881
893
  if outfile != None:
882
- with open(outfile, "w", encoding="utf-8") as f:
883
- f.write(out_str)
894
+ _write_text(outfile, out_str)
884
895
  else:
885
- print(out_str)
896
+ return points # return points for any processing by user.
886
897
 
887
898
 
888
899
  # Cell
ipyvasp/_version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "1.0.8"
1
+ __version__ = "1.1.0"
ipyvasp/bsdos.py CHANGED
@@ -270,7 +270,7 @@ class Bands(_BandsDosBase):
270
270
 
271
271
  Parameters
272
272
  ----------
273
- source : instance of `ipyvasp.DataSource` such as `ipyvasp.Vasprun` or `ipyvasp.Vaspout`.
273
+ source : instance of `ipyvasp.DataSource` such as `ipyvasp.Vasprun` or a user defined subclass.
274
274
  You can define your own class to parse data with same attributes and methods by subclassing `ipyvasp.DataSource`.
275
275
  """
276
276
 
@@ -627,7 +627,7 @@ class DOS(_BandsDosBase):
627
627
 
628
628
  Parameters
629
629
  ----------
630
- source : instance of `ipyvasp.DataSource` such as `ipyvasp.Vasprun` or `ipyvasp.Vaspout`.
630
+ source : instance of `ipyvasp.DataSource` such as `ipyvasp.Vasprun` or a user defined subclass.
631
631
  You can define your own class to parse data with same attributes and methods by subclassing `ipyvasp.DataSource`.
632
632
  """
633
633
 
ipyvasp/core/parser.py CHANGED
@@ -1,4 +1,4 @@
1
- __all__ = ["Vasprun", "Vaspout", "minify_vasprun", "xml2dict","read"]
1
+ __all__ = ["Vasprun", "minify_vasprun", "xml2dict","read"]
2
2
 
3
3
  import re
4
4
  from io import StringIO
@@ -14,7 +14,8 @@ from . import serializer
14
14
 
15
15
  class DataSource:
16
16
  """Base class for all data sources. It provides a common interface to access data from different sources.
17
- Subclass it to get data from a source and implement the abstract methods."""
17
+ Subclass it to get data from a source such as recently implemented `vaspout.h5` file and implement the required
18
+ methods with same output as done in Vasprun class."""
18
19
 
19
20
  def __init__(self, path, skipk=None):
20
21
  self._path = Path(path).absolute()
@@ -122,18 +123,6 @@ class DataSource:
122
123
  )
123
124
 
124
125
 
125
- class Vaspout(DataSource):
126
- "Read data from vaspout.h5 file on demand."
127
- # These methods are accessible from parent class, but need here for including in sphinx documentation
128
- get_evals_dataframe = DataSource.get_evals_dataframe
129
- poscar = DataSource.poscar
130
- dos = DataSource.dos
131
- bands = DataSource.bands
132
-
133
- def __init__(self, path, skipk=None):
134
- # super().__init__(path, skipk)
135
- raise NotImplementedError("Vaspout is not implemented yet.")
136
-
137
126
  def read(file, start_match, stop_match=r'\n', nth_match=1, skip_last=False,apply=None):
138
127
  """Reads a part of the file between start_match and stop_match and returns a generator. It is lazy and fast.
139
128
  `start_match` and `stop_match`(default is end of same line) are regular expressions. `nth_match` is the number of occurence of start_match to start reading.
@@ -937,7 +937,7 @@ def plt2text(
937
937
  print(out_str)
938
938
 
939
939
 
940
- def plt2html(plt_fig=None, transparent=True):
940
+ def plt2html(plt_fig=None, transparent=False):
941
941
  """Returns ``ipython.display.HTML(<svg of figure>)``. It clears figure after use. So ``plt.show()`` will not work after this.
942
942
 
943
943
  Parameters
@@ -64,7 +64,7 @@ class EvalsDataFrame(pd.DataFrame):
64
64
  Parameters
65
65
  ----------
66
66
  source : DataSource
67
- Data source to collect data from. Could be ``ipyvasp.Vasprun`` or ``ipyvasp.Vaspout``. Alternatively you can use ``DataSource.get_dataframe`` method to get dataframe directly.
67
+ Data source to collect data from. Could be ``ipyvasp.Vasprun`` or a user defined subclass of ``ipyvasp.DataSource``. Alternatively you can use ``DataSource.get_dataframe`` method to get dataframe directly.
68
68
  spins : list
69
69
  of spin indices [zero based here], In output data frame you will see corresponding spin number based on full data.
70
70
  bands : list
ipyvasp/widgets.py CHANGED
@@ -275,9 +275,9 @@ class Files:
275
275
  "Get KPathWidget instance with these files."
276
276
  return KPathWidget(files = self.with_name('POSCAR'), height = height)
277
277
 
278
- def bands_widget(self, height='450px'):
278
+ def bands_widget(self, height='450px',store_clicks=None):
279
279
  "Get BandsWidget instance with these files."
280
- return BandsWidget(files=self._files, height=height)
280
+ return BandsWidget(files=self._files, height=height, store_clicks=store_clicks)
281
281
 
282
282
  def map(self,func, to_df=False):
283
283
  """Map files to a function that takes path as argument.
@@ -438,7 +438,7 @@ class PropsPicker(VBox): # NOTE: remove New Later
438
438
 
439
439
  Parameters
440
440
  ----------
441
- system_summary : (Vasprun,Vaspout).summary
441
+ system_summary : DataSource.summary such as impelemented in Vasprun.
442
442
  N : int, default is 3, number of projections to pick.
443
443
 
444
444
  You can observe `projections` trait.
@@ -764,9 +764,7 @@ class BandsWidget(_ThemedFigureInteract):
764
764
  @dl.callback('out-data')
765
765
  def _load_data(self, file):
766
766
  if not file: return # First time not available
767
- self._bands = (
768
- vp.Vasprun(file) if file.parts[-1].endswith('xml') else vp.Vaspout(file)
769
- ).bands
767
+ self._bands = vp.Vasprun(file).bands
770
768
  self.params.ppicks.update(self.bands.source.summary)
771
769
  self.params.krange.max = self.bands.source.summary.NKPTS - 1
772
770
  self.params.krange.tooltip = f"Includes {self.bands.source.get_skipk()} non-zero weight kpoints"
@@ -912,7 +910,7 @@ class BandsWidget(_ThemedFigureInteract):
912
910
 
913
911
  @property
914
912
  def source(self):
915
- "Returns data source object such as Vasprun or Vaspout."
913
+ "Returns data source object such as Vasprun or user defined subclass of DataSource."
916
914
  return self.bands.source
917
915
 
918
916
  @property
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ipyvasp
3
- Version: 1.0.8
3
+ Version: 1.1.0
4
4
  Summary: A processing tool for VASP DFT input/output processing in Jupyter Notebook.
5
5
  Home-page: https://github.com/massgh/ipyvasp
6
6
  Author: Abdul Saboor
@@ -1,25 +1,25 @@
1
1
  ipyvasp/__init__.py,sha256=pzTqeKuf6sN2GQmaexmMgG677ggT3sxIFyQDXq_2whU,1422
2
2
  ipyvasp/__main__.py,sha256=eJV1TZSiT8mC_VqAeksNnBI2I8mKMiPkEIlwikbtOjI,216
3
3
  ipyvasp/_enplots.py,sha256=gJ7S9WBmrxvDEbmoccDRaJG01kpx9oNlRf7mozigbgY,37872
4
- ipyvasp/_lattice.py,sha256=4xI8LBypEhTLFxSSsUCGSJjKesxcymIyYBLeM21sO6Q,106414
5
- ipyvasp/_version.py,sha256=uyL3a6o1xccXPZ2OS65zqIN_lbEMT7PcCxErq7cuWwA,23
6
- ipyvasp/bsdos.py,sha256=omEiQrdbyZDI0Vd39bktzEyw2Il_w9rFsmYR_jEF-Xk,32180
4
+ ipyvasp/_lattice.py,sha256=-JQaIdB2e6yFh5j_U2343FH2aM_c3cSdqSC19cJINq4,107218
5
+ ipyvasp/_version.py,sha256=Zrv57EzpjdsuSPqsYvFkVsQKKRUOHFG7yURCf7qN-Tk,23
6
+ ipyvasp/bsdos.py,sha256=hVHpxkdT2ImRsxwFvMSMHxRSo4LqDM90DnUhwTP8vcs,32192
7
7
  ipyvasp/cli.py,sha256=-Lf-qdTvs7WyrA4ALNLaoqxMjLsZkXdPviyQps3ezqg,6880
8
- ipyvasp/evals_dataframe.py,sha256=KWbkvQJSyXeTSG6LJGcZKs0s5-tor5uPee2P8FJd7vs,20759
8
+ ipyvasp/evals_dataframe.py,sha256=n2iSH4D4ZbrxlAV4yDTVHbcl3ycfD0zfQYmTBcxjfkE,20789
9
9
  ipyvasp/lattice.py,sha256=NAe4cmXwkd6V0pRDTw1g5_CoNMfqOIT-NpyOSlSfyv0,33710
10
10
  ipyvasp/misc.py,sha256=ItSsG_aWiQZNRXM2F23atmNVdedyXFYtoShflYRvzOU,2645
11
11
  ipyvasp/potential.py,sha256=tzA73c5lkp6ahLSJchMrU043-QWaOV0nIOUA7VMmfKQ,11408
12
12
  ipyvasp/surface.py,sha256=MjE5oB0wW6Pca_C-xu8rN6OMH7lUEeNPNyM7Kz_Im-8,23766
13
13
  ipyvasp/utils.py,sha256=1eVDhYzK3dr0AC_CouWrU3xIhbVJu7AABscV-qi_vAA,18000
14
- ipyvasp/widgets.py,sha256=sM-CY8M1Vq-nO1haM741ju6suOxxp-JDUWZZoiRu2U4,53137
14
+ ipyvasp/widgets.py,sha256=Bpa4Y3Eopk_ZPFsVetfysClZP2q_2ONvmOwUol9vVGI,53154
15
15
  ipyvasp/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
- ipyvasp/core/parser.py,sha256=i1lMlfVPEA0-UFDz9lQnlVlMnVFBkEHBsqYPF3ez_2I,39805
17
- ipyvasp/core/plot_toolkit.py,sha256=9zecMlDVXQZbAqV7SsKyED7E3jlt9rxcdFnRG1Dh0qE,36231
16
+ ipyvasp/core/parser.py,sha256=o-uHyL_w9W0pmxoSt3JmLwwmmT3WRHlHSs_NoiHO-hs,39401
17
+ ipyvasp/core/plot_toolkit.py,sha256=aURiPAu0tWTNctuA9LMEL3CfraRgAOyTJURzDrrO0r0,36232
18
18
  ipyvasp/core/serializer.py,sha256=aEc7K5jVga8gxm9Tt2OgBw8wnsmWZGtODBnwRJ_5sf0,38423
19
19
  ipyvasp/core/spatial_toolkit.py,sha256=dXowREhiFzBvvr5f_bApzFhf8IzjH2E2Ix90oCBUetY,14885
20
- ipyvasp-1.0.8.dist-info/LICENSE,sha256=F3SO5RiAZOMfmMGf1KOuk2g_c4ObvuBJhd9iBLDgXoQ,1263
21
- ipyvasp-1.0.8.dist-info/METADATA,sha256=5aLUFrP0WL6hjG1BYmLYhTf4pMl8u17SZ-c2aZKPQmg,3218
22
- ipyvasp-1.0.8.dist-info/WHEEL,sha256=Kh9pAotZVRFj97E15yTA4iADqXdQfIVTHcNaZTjxeGM,110
23
- ipyvasp-1.0.8.dist-info/entry_points.txt,sha256=aU-gGjQG2Q8XfxDlNc_8__cwfp8WG2K5ZgFPInTm2jg,45
24
- ipyvasp-1.0.8.dist-info/top_level.txt,sha256=ftziWlMWu_1VpDP1sRTFrkfBnWxAi393HYDVu4wRhUk,8
25
- ipyvasp-1.0.8.dist-info/RECORD,,
20
+ ipyvasp-1.1.0.dist-info/LICENSE,sha256=F3SO5RiAZOMfmMGf1KOuk2g_c4ObvuBJhd9iBLDgXoQ,1263
21
+ ipyvasp-1.1.0.dist-info/METADATA,sha256=DCZLpgRjMRdVVJqT23OoP4AVFf_HeLUICtdBdSYa4_I,3218
22
+ ipyvasp-1.1.0.dist-info/WHEEL,sha256=Kh9pAotZVRFj97E15yTA4iADqXdQfIVTHcNaZTjxeGM,110
23
+ ipyvasp-1.1.0.dist-info/entry_points.txt,sha256=aU-gGjQG2Q8XfxDlNc_8__cwfp8WG2K5ZgFPInTm2jg,45
24
+ ipyvasp-1.1.0.dist-info/top_level.txt,sha256=ftziWlMWu_1VpDP1sRTFrkfBnWxAi393HYDVu4wRhUk,8
25
+ ipyvasp-1.1.0.dist-info/RECORD,,