PyVisualFields 2.0.6__tar.gz → 2.0.8__tar.gz

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.
Files changed (33) hide show
  1. {pyvisualfields-2.0.6/src/PyVisualFields.egg-info → pyvisualfields-2.0.8}/PKG-INFO +2 -2
  2. {pyvisualfields-2.0.6 → pyvisualfields-2.0.8}/README.md +1 -1
  3. {pyvisualfields-2.0.6 → pyvisualfields-2.0.8}/setup.py +1 -1
  4. {pyvisualfields-2.0.6 → pyvisualfields-2.0.8}/src/PyVisualFields/Deviation_Analysis.py +118 -12
  5. pyvisualfields-2.0.8/src/PyVisualFields/__init__.py +1 -0
  6. {pyvisualfields-2.0.6 → pyvisualfields-2.0.8}/src/PyVisualFields/utils.py +29 -1
  7. {pyvisualfields-2.0.6 → pyvisualfields-2.0.8/src/PyVisualFields.egg-info}/PKG-INFO +2 -2
  8. pyvisualfields-2.0.6/src/PyVisualFields/__init__.py +0 -1
  9. {pyvisualfields-2.0.6 → pyvisualfields-2.0.8}/LICENSE +0 -0
  10. {pyvisualfields-2.0.6 → pyvisualfields-2.0.8}/MANIFEST.in +0 -0
  11. {pyvisualfields-2.0.6 → pyvisualfields-2.0.8}/pyproject.toml +0 -0
  12. {pyvisualfields-2.0.6 → pyvisualfields-2.0.8}/setup.cfg +0 -0
  13. {pyvisualfields-2.0.6 → pyvisualfields-2.0.8}/src/PyVisualFields/PyGlaucoMetrics.py +0 -0
  14. {pyvisualfields-2.0.6 → pyvisualfields-2.0.8}/src/PyVisualFields/pkl_files/locmaps.json +0 -0
  15. {pyvisualfields-2.0.6 → pyvisualfields-2.0.8}/src/PyVisualFields/pkl_files/normvals.json +0 -0
  16. {pyvisualfields-2.0.6 → pyvisualfields-2.0.8}/src/PyVisualFields/pkl_files/normvals_meta.json +0 -0
  17. {pyvisualfields-2.0.6 → pyvisualfields-2.0.8}/src/PyVisualFields/pkl_files/vf.cigts.pkl +0 -0
  18. {pyvisualfields-2.0.6 → pyvisualfields-2.0.8}/src/PyVisualFields/pkl_files/vf.plr.nouri.2012.pkl +0 -0
  19. {pyvisualfields-2.0.6 → pyvisualfields-2.0.8}/src/PyVisualFields/pkl_files/vf.schell2014.pkl +0 -0
  20. {pyvisualfields-2.0.6 → pyvisualfields-2.0.8}/src/PyVisualFields/pkl_files/vf.vfi.pkl +0 -0
  21. {pyvisualfields-2.0.6 → pyvisualfields-2.0.8}/src/PyVisualFields/pkl_files/vfctrIowaPC26.pkl +0 -0
  22. {pyvisualfields-2.0.6 → pyvisualfields-2.0.8}/src/PyVisualFields/pkl_files/vfctrIowaPeri.pkl +0 -0
  23. {pyvisualfields-2.0.6 → pyvisualfields-2.0.8}/src/PyVisualFields/pkl_files/vfctrSunyiu10d2.pkl +0 -0
  24. {pyvisualfields-2.0.6 → pyvisualfields-2.0.8}/src/PyVisualFields/pkl_files/vfctrSunyiu24d2.pkl +0 -0
  25. {pyvisualfields-2.0.6 → pyvisualfields-2.0.8}/src/PyVisualFields/pkl_files/vfpwgRetest24d2.pkl +0 -0
  26. {pyvisualfields-2.0.6 → pyvisualfields-2.0.8}/src/PyVisualFields/pkl_files/vfpwgSunyiu24d2.pkl +0 -0
  27. {pyvisualfields-2.0.6 → pyvisualfields-2.0.8}/src/PyVisualFields/pkl_files/vfseries.pkl +0 -0
  28. {pyvisualfields-2.0.6 → pyvisualfields-2.0.8}/src/PyVisualFields/vfprogression.py +0 -0
  29. {pyvisualfields-2.0.6 → pyvisualfields-2.0.8}/src/PyVisualFields/visualFields.py +0 -0
  30. {pyvisualfields-2.0.6 → pyvisualfields-2.0.8}/src/PyVisualFields.egg-info/SOURCES.txt +0 -0
  31. {pyvisualfields-2.0.6 → pyvisualfields-2.0.8}/src/PyVisualFields.egg-info/dependency_links.txt +0 -0
  32. {pyvisualfields-2.0.6 → pyvisualfields-2.0.8}/src/PyVisualFields.egg-info/requires.txt +0 -0
  33. {pyvisualfields-2.0.6 → pyvisualfields-2.0.8}/src/PyVisualFields.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PyVisualFields
3
- Version: 2.0.6
3
+ Version: 2.0.8
4
4
  Summary: A python toolkit for visual field analysis
5
5
  Home-page: https://github.com/mohaEs/PyVisualField
6
6
  Author: Mohammad Eslami, Bharath Erusalagandi, Mousa Moradi
@@ -77,7 +77,7 @@ The list and description of all functions are available at [All_Functions](#list
77
77
  - Data [demo_1_Data.ipynb](demo_1_Data.ipynb)
78
78
  - Normalization and deviation analysis [demo_2_Deviation_Analysis.ipynb](demo_2_Deviation_Analysis.ipynb)
79
79
  - Plotting [demo_3_Plotting.ipynb](demo_3_Plotting.ipynb)
80
- - Progression Analysis [demo_4_Analysis.ipynb](demo_4_Analysis.ipynb)
80
+ - Progression Analysis [demo_4_ProgressionAnalysis.ipynb](demo_4_ProgressionAnalysis.ipynb)
81
81
  - Glaucoma Detection [demo5_PyGlaucoMetrics.ipynb](demo5_PyGlaucoMetrics.ipynb) </br>
82
82
 
83
83
  __Notice:__ PyGlaucoMetric is also available as a seperatre PyPI package and GitHub repository (built upon PyVisualFields), which includes a graphical user interface (GUI) for progression analysis and glaucoma detection. Indeed PyVisualFields is designed as a developer-facing package library, while pyGlaucoMetric serves as an accessible GUI application implementing selected visual field analysis components.
@@ -38,7 +38,7 @@ The list and description of all functions are available at [All_Functions](#list
38
38
  - Data [demo_1_Data.ipynb](demo_1_Data.ipynb)
39
39
  - Normalization and deviation analysis [demo_2_Deviation_Analysis.ipynb](demo_2_Deviation_Analysis.ipynb)
40
40
  - Plotting [demo_3_Plotting.ipynb](demo_3_Plotting.ipynb)
41
- - Progression Analysis [demo_4_Analysis.ipynb](demo_4_Analysis.ipynb)
41
+ - Progression Analysis [demo_4_ProgressionAnalysis.ipynb](demo_4_ProgressionAnalysis.ipynb)
42
42
  - Glaucoma Detection [demo5_PyGlaucoMetrics.ipynb](demo5_PyGlaucoMetrics.ipynb) </br>
43
43
 
44
44
  __Notice:__ PyGlaucoMetric is also available as a seperatre PyPI package and GitHub repository (built upon PyVisualFields), which includes a graphical user interface (GUI) for progression analysis and glaucoma detection. Indeed PyVisualFields is designed as a developer-facing package library, while pyGlaucoMetric serves as an accessible GUI application implementing selected visual field analysis components.
@@ -5,7 +5,7 @@ with open("README.md", "r", encoding="utf-8") as fh:
5
5
 
6
6
  setuptools.setup(
7
7
  name="PyVisualFields",
8
- version="2.0.6",
8
+ version="2.0.8",
9
9
  author="Mohammad Eslami, Bharath Erusalagandi, Mousa Moradi",
10
10
  author_email="Mohammad_eslami@meei.harvard.edu",
11
11
  description="A python toolkit for visual field analysis",
@@ -803,19 +803,111 @@ def py_getgl(df_vf: pd.DataFrame) -> pd.DataFrame:
803
803
 
804
804
  # return df_gp
805
805
 
806
+ # def py_getglp(df_gi: pd.DataFrame) -> pd.DataFrame:
807
+ # """Global indices probability values."""
808
+
809
+ # nv = _nv()
810
+ # lut_dict = nv["glp_lut"]
811
+ # probs = nv["glp_probs"]
812
+ # idxm_0 = [i - 1 for i in (nv["glp_idxm"] or [])]
813
+ # idxs_0 = [i - 1 for i in (nv["glp_idxs"] or [])]
814
+
815
+ # gl_cols = ["msens", "ssens", "tmd", "tsd", "pmd", "psd", "gh", "vfi"]
816
+
817
+ # mean_cols = [gl_cols[i] for i in idxm_0 if i < len(gl_cols)]
818
+ # std_cols = [gl_cols[i] for i in idxs_0 if i < len(gl_cols)]
819
+
820
+ # n_probs = len(probs)
821
+
822
+ # prob_vals = np.array([
823
+ # _parse_lut_value(p) if isinstance(p, str) else float(p)
824
+ # for p in probs
825
+ # ])
826
+
827
+ # df_gp = df_gi.copy()
828
+
829
+ # def _prob_col_name(col):
830
+ # return f"{col}prob"
831
+
832
+ # def _build_col_lut(col):
833
+ # raw = lut_dict.get(col, [np.nan] * n_probs)
834
+ # return np.array([
835
+ # _parse_lut_value(v) if isinstance(v, str) else float(v)
836
+ # for v in raw
837
+ # ])
838
+
839
+ # # Left-tailed: lower values are abnormal
840
+ # for col in mean_cols:
841
+ # if col not in df_gi.columns:
842
+ # continue
843
+
844
+ # cutoffs = _build_col_lut(col)
845
+ # vals = df_gi[col].values.astype(float)
846
+ # vp = np.full(len(vals), np.nan)
847
+
848
+ # for i in range(n_probs - 1, 0, -1):
849
+ # vp[vals < cutoffs[i]] = prob_vals[i]
850
+
851
+ # df_gp[_prob_col_name(col)] = vp
852
+
853
+ # # Right-tailed: higher values are abnormal
854
+ # for col in std_cols:
855
+ # if col not in df_gi.columns:
856
+ # continue
857
+
858
+ # cutoffs = _build_col_lut(col)
859
+ # vals = df_gi[col].values.astype(float)
860
+ # vp = np.full(len(vals), np.nan)
861
+
862
+ # for i in range(n_probs - 1, 0, -1):
863
+ # vp[vals > cutoffs[i]] = prob_vals[i]
864
+
865
+ # df_gp[_prob_col_name(col)] = vp
866
+
867
+ # return df_gp
868
+
869
+
870
+
806
871
  def py_getglp(df_gi: pd.DataFrame) -> pd.DataFrame:
807
- """Global indices probability values."""
872
+ """Compute missing global-index probability values only."""
808
873
 
809
874
  nv = _nv()
810
875
  lut_dict = nv["glp_lut"]
811
876
  probs = nv["glp_probs"]
877
+
812
878
  idxm_0 = [i - 1 for i in (nv["glp_idxm"] or [])]
813
879
  idxs_0 = [i - 1 for i in (nv["glp_idxs"] or [])]
814
880
 
815
881
  gl_cols = ["msens", "ssens", "tmd", "tsd", "pmd", "psd", "gh", "vfi"]
816
882
 
817
883
  mean_cols = [gl_cols[i] for i in idxm_0 if i < len(gl_cols)]
818
- std_cols = [gl_cols[i] for i in idxs_0 if i < len(gl_cols)]
884
+ std_cols = [gl_cols[i] for i in idxs_0 if i < len(gl_cols)]
885
+
886
+ def _prob_col_name(col):
887
+ return f"{col}prob"
888
+
889
+ # candidates that can be computed
890
+ computable_cols = [
891
+ c for c in (mean_cols + std_cols)
892
+ if c in df_gi.columns
893
+ ]
894
+
895
+ available_gl = [c for c in gl_cols if c in df_gi.columns]
896
+ missing_gl = [c for c in gl_cols if c not in df_gi.columns]
897
+
898
+ print(f"==> py_getglp: available globals: {available_gl}")
899
+ print(f"==> py_getglp: missing globals: {missing_gl}")
900
+
901
+ missing_prob_cols = [
902
+ c for c in computable_cols
903
+ if _prob_col_name(c) not in df_gi.columns
904
+ ]
905
+
906
+ print(f"==> py_getglp: missing global probability indices: "
907
+ f"{[_prob_col_name(c) for c in missing_prob_cols]}")
908
+
909
+ if not missing_prob_cols:
910
+ return df_gi.copy()
819
911
 
820
912
  n_probs = len(probs)
821
913
 
@@ -824,11 +916,6 @@ def py_getglp(df_gi: pd.DataFrame) -> pd.DataFrame:
824
916
  for p in probs
825
917
  ])
826
918
 
827
- df_gp = df_gi.copy()
828
-
829
- def _prob_col_name(col):
830
- return f"{col}prob"
831
-
832
919
  def _build_col_lut(col):
833
920
  raw = lut_dict.get(col, [np.nan] * n_probs)
834
921
  return np.array([
@@ -836,9 +923,11 @@ def py_getglp(df_gi: pd.DataFrame) -> pd.DataFrame:
836
923
  for v in raw
837
924
  ])
838
925
 
926
+ computed = {}
927
+
839
928
  # Left-tailed: lower values are abnormal
840
929
  for col in mean_cols:
841
- if col not in df_gi.columns:
930
+ if col not in missing_prob_cols:
842
931
  continue
843
932
 
844
933
  cutoffs = _build_col_lut(col)
@@ -848,11 +937,11 @@ def py_getglp(df_gi: pd.DataFrame) -> pd.DataFrame:
848
937
  for i in range(n_probs - 1, 0, -1):
849
938
  vp[vals < cutoffs[i]] = prob_vals[i]
850
939
 
851
- df_gp[_prob_col_name(col)] = vp
940
+ computed[_prob_col_name(col)] = vp
852
941
 
853
942
  # Right-tailed: higher values are abnormal
854
943
  for col in std_cols:
855
- if col not in df_gi.columns:
944
+ if col not in missing_prob_cols:
856
945
  continue
857
946
 
858
947
  cutoffs = _build_col_lut(col)
@@ -862,10 +951,27 @@ def py_getglp(df_gi: pd.DataFrame) -> pd.DataFrame:
862
951
  for i in range(n_probs - 1, 0, -1):
863
952
  vp[vals > cutoffs[i]] = prob_vals[i]
864
953
 
865
- df_gp[_prob_col_name(col)] = vp
954
+ computed[_prob_col_name(col)] = vp
866
955
 
867
- return df_gp
956
+ if "md" in df_gi.columns and "mdprob" not in df_gi.columns:
957
+ cutoffs = _build_col_lut("tmd")
958
+ vals = df_gi["md"].values.astype(float)
959
+ vp = np.full(len(vals), np.nan)
868
960
 
961
+ for i in range(n_probs - 1, 0, -1):
962
+ vp[vals < cutoffs[i]] = prob_vals[i]
963
+
964
+ computed["mdprob"] = vp
965
+
966
+ if computed:
967
+ out = pd.concat(
968
+ [df_gi.copy(), pd.DataFrame(computed, index=df_gi.index)],
969
+ axis=1,
970
+ )
971
+ else:
972
+ out = df_gi.copy()
973
+
974
+ return out
869
975
 
870
976
  def py_getallvalues(df_vf: pd.DataFrame):
871
977
  """Compute all deviations and global indices in one call.
@@ -0,0 +1 @@
1
+ __version__ = "2.0.8"
@@ -119,34 +119,62 @@ META_ALIASES = {
119
119
  "vfi": [
120
120
  "vfi"
121
121
  ],
122
+ #probability
123
+ "vfiprob": [
124
+ "vfi_p", "vfiprob", "vfip"
125
+ ],
122
126
 
123
127
  "msens": [
124
128
  "msens", "ms", "meansensitivity"
125
129
  ],
130
+ #probability
131
+ "msensprob": [
132
+ "msens_p", "msensprob", "msenp", "ms_p", "msprob", "msp"
133
+ ],
126
134
 
127
135
  "ssens": [
128
136
  "ssens", "ss", "sdsensitivity"
129
137
  ],
138
+ #probability
139
+ "ssensprob": [
140
+ "ssens_p", "ssensprob", "lsenp", "ss_p", "ssprob", "ssp"
141
+ ],
130
142
 
131
143
  "tmd": [
132
144
  "tmd"
133
145
  ],
146
+ #probability
147
+ "tmdprob": [
148
+ "tmd_p", "tmdprob", "tmdp"
149
+ ],
134
150
 
135
151
  "tsd": [
136
152
  "tsd"
137
153
  ],
154
+ #probability
155
+ "tsdprob": [
156
+ "tsd_p", "tsdprob", "tsdp"
157
+ ],
138
158
 
139
159
  "pmd": [
140
160
  "pmd"
141
161
  ],
162
+ #probability
163
+ "pmdprob": [
164
+ "pmd_p", "pmdprob", "pmdp"
165
+ ],
142
166
 
143
167
  "gh": [
144
168
  "gh", "generalheight"
145
169
  ],
170
+ #probability
171
+ "ghprob": [
172
+ "gh_p", "ghprob", "ghp"
173
+ ],
146
174
 
147
175
  # Reliability
148
176
  "fpr": [
149
- "fpr"
177
+ "fpr"
150
178
  ],
151
179
 
152
180
  "fnr": [
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PyVisualFields
3
- Version: 2.0.6
3
+ Version: 2.0.8
4
4
  Summary: A python toolkit for visual field analysis
5
5
  Home-page: https://github.com/mohaEs/PyVisualField
6
6
  Author: Mohammad Eslami, Bharath Erusalagandi, Mousa Moradi
@@ -77,7 +77,7 @@ The list and description of all functions are available at [All_Functions](#list
77
77
  - Data [demo_1_Data.ipynb](demo_1_Data.ipynb)
78
78
  - Normalization and deviation analysis [demo_2_Deviation_Analysis.ipynb](demo_2_Deviation_Analysis.ipynb)
79
79
  - Plotting [demo_3_Plotting.ipynb](demo_3_Plotting.ipynb)
80
- - Progression Analysis [demo_4_Analysis.ipynb](demo_4_Analysis.ipynb)
80
+ - Progression Analysis [demo_4_ProgressionAnalysis.ipynb](demo_4_ProgressionAnalysis.ipynb)
81
81
  - Glaucoma Detection [demo5_PyGlaucoMetrics.ipynb](demo5_PyGlaucoMetrics.ipynb) </br>
82
82
 
83
83
  __Notice:__ PyGlaucoMetric is also available as a seperatre PyPI package and GitHub repository (built upon PyVisualFields), which includes a graphical user interface (GUI) for progression analysis and glaucoma detection. Indeed PyVisualFields is designed as a developer-facing package library, while pyGlaucoMetric serves as an accessible GUI application implementing selected visual field analysis components.
@@ -1 +0,0 @@
1
- __version__ = "2.0.6"
File without changes
File without changes