From d8a98c49a0cd93faeb8c3346ff3a5c2300512f05 Mon Sep 17 00:00:00 2001 From: naik-aakash Date: Wed, 1 Jan 2025 14:39:11 +0100 Subject: [PATCH 01/30] add tests for icohp-distance plotter --- tests/cli/test_cli.py | 16 + tests/test_data/cli-reference.json | 642 +++++++++++++++-------------- 2 files changed, 345 insertions(+), 313 deletions(-) diff --git a/tests/cli/test_cli.py b/tests/cli/test_cli.py index a2387445..d50b613e 100644 --- a/tests/cli/test_cli.py +++ b/tests/cli/test_cli.py @@ -41,6 +41,7 @@ ["plot", "1", "--style", "dark_background"], ["plot", "1", "--sigma", "1.2"], ["plot", "1", "--fwhm", "1"], + ["plot-icohp-distance", "-cbonds"], ] error_test_cases = [ @@ -213,6 +214,21 @@ def test_icoxxlist_plots(self, tmp_path, inject_mocks, clean_plot): test = get_parser().parse_args(args) run(test) + os.chdir(TestDir / "test_data/CdF_comp_range") + args = ["ploticohpdistance", "--cobis", "-cbonds", "-c", "red", "green", "blue", "yellow"] + test = get_parser().parse_args(args) + run(test) + + expected_colors = [[[0.0, 0.0, 1.0, 0.4]], [[0.0, 0.5019607843137255, 0.0, 0.4]], [[1.0, 0.0, 0.0, 0.4]]] + handles, legends = plt.gca().get_legend_handles_labels() + marker_colors = [] + for handle in handles: + colors = handle.get_facecolor().tolist() + if colors not in marker_colors: + marker_colors.append(colors) + np.testing.assert_array_almost_equal(sorted(marker_colors), expected_colors) + assert sorted(set(legends)) == ["Cd-Cd", "Cd-F", "F-F"] + def test_lobsterin_generation(self, tmp_path): os.chdir(TestDir / "test_data/Test_Input_Generation_Empty") lobsterinpath = tmp_path / "lobsterin.lobsterpy" diff --git a/tests/test_data/cli-reference.json b/tests/test_data/cli-reference.json index a6dca037..2bbc967b 100644 --- a/tests/test_data/cli-reference.json +++ b/tests/test_data/cli-reference.json @@ -1937,11 +1937,11 @@ -11.57895 ], [ - 4.064615392916008e-06, + 4.0646153929160085e-06, -11.52882 ], [ - 1.0111499921820393e-05, + 1.0111499921820395e-05, -11.4787 ], [ @@ -1949,7 +1949,7 @@ -11.42857 ], [ - 2.9390976379763435e-05, + 2.9390976379763442e-05, -11.37845 ], [ @@ -1961,7 +1961,7 @@ -11.2782 ], [ - 8.443256598386891e-05, + 8.443256598386892e-05, -11.22807 ], [ @@ -1973,7 +1973,7 @@ -11.12782 ], [ - 0.00018914508952974225, + 0.00018914508952974228, -11.07769 ], [ @@ -1989,11 +1989,11 @@ -10.92732 ], [ - 0.00037082089649587434, + 0.0003708208964958743, -10.87719 ], [ - 0.0004336245310124366, + 0.0004336245310124365, -10.82707 ], [ @@ -2025,7 +2025,7 @@ -10.47619 ], [ - 0.0013930867057367728, + 0.0013930867057367724, -10.42607 ], [ @@ -2033,7 +2033,7 @@ -10.37594 ], [ - 0.0018316737501006429, + 0.001831673750100643, -10.32581 ], [ @@ -2041,7 +2041,7 @@ -10.27569 ], [ - 0.0023900772024109704, + 0.00239007720241097, -10.22556 ], [ @@ -2049,7 +2049,7 @@ -10.17544 ], [ - 0.0030958989387559893, + 0.003095898938755989, -10.12531 ], [ @@ -2081,11 +2081,11 @@ -9.77444 ], [ - 0.008137143295459278, + 0.008137143295459276, -9.72431 ], [ - 0.009111927872413274, + 0.009111927872413272, -9.67419 ], [ @@ -2097,7 +2097,7 @@ -9.57393 ], [ - 0.012664086874357458, + 0.01266408687435746, -9.52381 ], [ @@ -2125,7 +2125,7 @@ -9.22306 ], [ - 0.025715752068637437, + 0.025715752068637444, -9.17293 ], [ @@ -2177,7 +2177,7 @@ -8.57143 ], [ - 0.07676687724763481, + 0.07676687724763484, -8.5213 ], [ @@ -2185,7 +2185,7 @@ -8.47118 ], [ - 0.08854037339986863, + 0.08854037339986864, -8.42105 ], [ @@ -2197,15 +2197,15 @@ -8.3208 ], [ - 0.10827890637810782, + 0.10827890637810784, -8.27068 ], [ - 0.11539812534407988, + 0.1153981253440799, -8.22055 ], [ - 0.12277619401981617, + 0.12277619401981618, -8.17043 ], [ @@ -2217,11 +2217,11 @@ -8.07018 ], [ - 0.14636070239264723, + 0.14636070239264726, -8.02005 ], [ - 0.15466175761353684, + 0.15466175761353687, -7.96992 ], [ @@ -2261,7 +2261,7 @@ -7.5188 ], [ - 0.24453386929196796, + 0.2445338692919679, -7.46867 ], [ @@ -2277,7 +2277,7 @@ -7.3183 ], [ - 0.2800603902059092, + 0.28006039020590917, -7.26817 ], [ @@ -2293,7 +2293,7 @@ -7.11779 ], [ - 0.3121493596644482, + 0.31214935966444823, -7.06767 ], [ @@ -2301,7 +2301,7 @@ -7.01754 ], [ - 0.32620754529743234, + 0.3262075452974323, -6.96742 ], [ @@ -2309,7 +2309,7 @@ -6.91729 ], [ - 0.338592481545285, + 0.33859248154528493, -6.86717 ], [ @@ -2321,7 +2321,7 @@ -6.76692 ], [ - 0.35353040903661204, + 0.3535304090366121, -6.71679 ], [ @@ -2333,7 +2333,7 @@ -6.61654 ], [ - 0.36333495643516817, + 0.3633349564351682, -6.56642 ], [ @@ -2353,15 +2353,15 @@ -6.36591 ], [ - 0.3665869720590435, + 0.36658697205904345, -6.31579 ], [ - 0.3651555743025907, + 0.36515557430259066, -6.26566 ], [ - 0.3630801073849135, + 0.3630801073849134, -6.21554 ], [ @@ -2389,7 +2389,7 @@ -5.91479 ], [ - 0.332439407811993, + 0.3324394078119931, -5.86466 ], [ @@ -2429,7 +2429,7 @@ -5.41353 ], [ - 0.2534836173700605, + 0.25348361737006053, -5.36341 ], [ @@ -2437,7 +2437,7 @@ -5.31328 ], [ - 0.23524171075012776, + 0.2352417107501277, -5.26316 ], [ @@ -2445,11 +2445,11 @@ -5.21303 ], [ - 0.21684071423729653, + 0.21684071423729648, -5.16291 ], [ - 0.2076596042100203, + 0.20765960421002033, -5.11278 ], [ @@ -2465,7 +2465,7 @@ -4.96241 ], [ - 0.17172729210472984, + 0.1717272921047298, -4.91228 ], [ @@ -2481,7 +2481,7 @@ -4.7619 ], [ - 0.13820355190402855, + 0.13820355190402853, -4.71178 ], [ @@ -2513,7 +2513,7 @@ -4.3609 ], [ - 0.08246663817431554, + 0.08246663817431556, -4.31078 ], [ @@ -2521,11 +2521,11 @@ -4.26065 ], [ - 0.07124361320896054, + 0.07124361320896053, -4.21053 ], [ - 0.06604605881172779, + 0.06604605881172777, -4.1604 ], [ @@ -2549,7 +2549,7 @@ -3.90977 ], [ - 0.040388105694524765, + 0.04038810569452477, -3.85965 ], [ @@ -2561,7 +2561,7 @@ -3.7594 ], [ - 0.030800259980014014, + 0.03080025998001402, -3.70927 ], [ @@ -2569,7 +2569,7 @@ -3.65915 ], [ - 0.025447631702521706, + 0.025447631702521702, -3.60902 ], [ @@ -2581,7 +2581,7 @@ -3.50877 ], [ - 0.018777269282353178, + 0.01877726928235318, -3.45865 ], [ @@ -2589,7 +2589,7 @@ -3.40852 ], [ - 0.015116026033972708, + 0.015116026033972703, -3.3584 ], [ @@ -2613,7 +2613,7 @@ -3.10777 ], [ - 0.0070111230053803136, + 0.007011123005380312, -3.05764 ], [ @@ -2625,19 +2625,19 @@ -2.95739 ], [ - 0.004100708708803657, + 0.004100708708803658, -2.90727 ], [ - 0.003239225767170314, + 0.0032392257671703148, -2.85714 ], [ - 0.002417734367185481, + 0.0024177343671854807, -2.80702 ], [ - 0.0016278672137538498, + 0.0016278672137538495, -2.75689 ], [ @@ -2645,7 +2645,7 @@ -2.70677 ], [ - 0.00011018702877305857, + 0.00011018702877305868, -2.65664 ], [ @@ -2653,11 +2653,11 @@ -2.60652 ], [ - -0.0013786150731831235, + -0.0013786150731831238, -2.55639 ], [ - -0.0021325509625462306, + -0.00213255096254623, -2.50627 ], [ @@ -2669,11 +2669,11 @@ -2.40602 ], [ - -0.0045251094572744295, + -0.00452510945727443, -2.35589 ], [ - -0.005391784752564531, + -0.005391784752564532, -2.30576 ], [ @@ -2729,7 +2729,7 @@ -1.65414 ], [ - -0.026505554544686886, + -0.02650555454468688, -1.6040099999999997 ], [ @@ -2745,7 +2745,7 @@ -1.45363 ], [ - -0.03773018335658152, + -0.03773018335658153, -1.4035099999999998 ], [ @@ -2753,7 +2753,7 @@ -1.35338 ], [ - -0.04460525122664337, + -0.044605251226643376, -1.3032599999999999 ], [ @@ -2761,7 +2761,7 @@ -1.25313 ], [ - -0.05245494577537396, + -0.052454945775373976, -1.20301 ], [ @@ -2801,7 +2801,7 @@ -0.7518799999999999 ], [ - -0.1094508021189985, + -0.10945080211899853, -0.7017500000000001 ], [ @@ -2825,11 +2825,11 @@ -0.45113000000000003 ], [ - -0.16078011063461525, + -0.16078011063461528, -0.4009999999999998 ], [ - -0.17074682318417858, + -0.17074682318417855, -0.3508800000000001 ], [ @@ -2841,7 +2841,7 @@ -0.25063000000000013 ], [ - -0.2031632531994053, + -0.20316325319940534, -0.2004999999999999 ], [ @@ -2861,7 +2861,7 @@ 0.0 ], [ - -0.2656408434753054, + -0.26564084347530537, 0.05013000000000023 ], [ @@ -2881,7 +2881,7 @@ 0.25063000000000013 ], [ - -0.33830213696707145, + -0.3383021369670715, 0.30074999999999985 ], [ @@ -2893,7 +2893,7 @@ 0.4009999999999998 ], [ - -0.38626907487192935, + -0.3862690748719293, 0.45113000000000003 ], [ @@ -2905,7 +2905,7 @@ 0.55138 ], [ - -0.4369777245575577, + -0.43697772455755757, 0.6014999999999997 ], [ @@ -2917,11 +2917,11 @@ 0.7017499999999997 ], [ - -0.4898342972222741, + -0.489834297222274, 0.7518799999999999 ], [ - -0.5078071300450898, + -0.5078071300450897, 0.8020100000000001 ], [ @@ -2985,7 +2985,7 @@ 1.5538799999999995 ], [ - -0.7870540458210135, + -0.7870540458210133, 1.6040099999999997 ], [ @@ -3005,11 +3005,11 @@ 1.8045100000000005 ], [ - -0.8545805993273862, + -0.8545805993273863, 1.8546399999999998 ], [ - -0.8659578290680996, + -0.8659578290680994, 1.9047599999999996 ], [ @@ -3017,7 +3017,7 @@ 1.9548899999999998 ], [ - -0.8862456918355582, + -0.8862456918355581, 2.0050100000000004 ], [ @@ -3025,15 +3025,15 @@ 2.0551399999999997 ], [ - -0.9029887455740052, + -0.902988745574005, 2.1052599999999995 ], [ - -0.9099426238652571, + -0.9099426238652569, 2.1553900000000006 ], [ - -0.9159095292218045, + -0.9159095292218044, 2.2055100000000003 ], [ @@ -3113,15 +3113,15 @@ 3.15789 ], [ - -0.8106908486158199, + -0.8106908486158197, 3.2080199999999994 ], [ - -0.7951630577522119, + -0.7951630577522117, 3.2581500000000005 ], [ - -0.7789128731541192, + -0.7789128731541191, 3.3082700000000003 ], [ @@ -3173,7 +3173,7 @@ 3.90977 ], [ - -0.5274216917773168, + -0.5274216917773167, 3.9598999999999993 ], [ @@ -3185,7 +3185,7 @@ 4.06015 ], [ - -0.4666054995362411, + -0.4666054995362412, 4.110280000000001 ], [ @@ -3241,7 +3241,7 @@ 4.761899999999999 ], [ - -0.22321200161919608, + -0.22321200161919613, 4.81203 ], [ @@ -3249,7 +3249,7 @@ 4.862160000000001 ], [ - -0.19638643398181752, + -0.1963864339818175, 4.912280000000001 ], [ @@ -13722,7 +13722,7 @@ -8.1203 ], [ - -2.943546193682945e-06, + -2.9435461936829445e-06, -8.07018 ], [ @@ -13730,7 +13730,7 @@ -8.02005 ], [ - -6.269396027916123e-06, + -6.269396027916122e-06, -7.96992 ], [ @@ -13738,7 +13738,7 @@ -7.9198 ], [ - -1.2679732191521777e-05, + -1.2679732191521779e-05, -7.86967 ], [ @@ -13750,7 +13750,7 @@ -7.76942 ], [ - -3.2945897376812796e-05, + -3.294589737681279e-05, -7.7193 ], [ @@ -13758,7 +13758,7 @@ -7.66917 ], [ - -5.815048538861616e-05, + -5.815048538861615e-05, -7.61905 ], [ @@ -13774,7 +13774,7 @@ -7.46867 ], [ - -0.00015369703139244024, + -0.00015369703139244022, -7.41855 ], [ @@ -13786,7 +13786,7 @@ -7.3183 ], [ - -0.0002756335476472915, + -0.00027563354764729156, -7.26817 ], [ @@ -13798,11 +13798,11 @@ -7.16792 ], [ - -0.0004359273312598699, + -0.0004359273312598697, -7.11779 ], [ - -0.0004937367049364638, + -0.0004937367049364637, -7.06767 ], [ @@ -13826,11 +13826,11 @@ -6.81704 ], [ - -0.0007674396514481609, + -0.0007674396514481608, -6.76692 ], [ - -0.0007818107831450826, + -0.0007818107831450825, -6.71679 ], [ @@ -13850,15 +13850,15 @@ -6.51629 ], [ - -0.0006250371350926205, + -0.0006250371350926203, -6.46617 ], [ - -0.000554326725089156, + -0.0005543267250891561, -6.41604 ], [ - -0.00047819129971297844, + -0.0004781912997129785, -6.36591 ], [ @@ -13874,23 +13874,23 @@ -6.21554 ], [ - -0.00015145958675141528, + -0.0001514595867514152, -6.16541 ], [ - -7.4349855367581e-05, + -7.434985536758094e-05, -6.11529 ], [ - -2.5044803475157553e-06, + -2.504480347515684e-06, -6.06516 ], [ - 6.259011314960848e-05, + 6.25901131496085e-05, -6.01504 ], [ - 0.00011988260298765516, + 0.00011988260298765517, -5.96491 ], [ @@ -13914,7 +13914,7 @@ -5.71429 ], [ - 0.00028679456490794507, + 0.000286794564907945, -5.66416 ], [ @@ -13930,7 +13930,7 @@ -5.51378 ], [ - 0.00026063463638697544, + 0.0002606346363869754, -5.46366 ], [ @@ -13942,11 +13942,11 @@ -5.36341 ], [ - 0.00020560879561512145, + 0.00020560879561512147, -5.31328 ], [ - 0.0001852724323020636, + 0.00018527243230206356, -5.26316 ], [ @@ -13954,7 +13954,7 @@ -5.21303 ], [ - 0.00014521029812180686, + 0.00014521029812180684, -5.16291 ], [ @@ -13974,11 +13974,11 @@ -4.96241 ], [ - 6.482917391209477e-05, + 6.482917391209475e-05, -4.91228 ], [ - 5.3404988298007524e-05, + 5.340498829800751e-05, -4.86216 ], [ @@ -14002,11 +14002,11 @@ -4.61153 ], [ - 1.3324782479186285e-05, + 1.3324782479186283e-05, -4.5614 ], [ - 1.0199475151543176e-05, + 1.0199475151543174e-05, -4.51128 ], [ @@ -14018,7 +14018,7 @@ -4.41103 ], [ - 4.307547100477609e-06, + 4.30754710047761e-06, -4.3609 ], [ @@ -14026,11 +14026,11 @@ -4.31078 ], [ - 2.300590745307093e-06, + 2.3005907453070933e-06, -4.26065 ], [ - 1.6547596627139757e-06, + 1.6547596627139755e-06, -4.21053 ], [ @@ -14058,7 +14058,7 @@ -3.90977 ], [ - 1.1330634791071583e-07, + 1.133063479107158e-07, -3.85965 ], [ @@ -14082,7 +14082,7 @@ -3.60902 ], [ - 7.006141039525079e-09, + 7.0061410395250805e-09, -3.5589 ], [ @@ -14246,7 +14246,7 @@ -1.55388 ], [ - 1.909591506362483e-08, + 1.9095915063624834e-08, -1.5037599999999998 ], [ @@ -14270,7 +14270,7 @@ -1.25313 ], [ - 6.098125175396693e-07, + 6.098125175396694e-07, -1.20301 ], [ @@ -14294,7 +14294,7 @@ -0.9523799999999998 ], [ - 6.1240342786809e-06, + 6.1240342786808995e-06, -0.9022600000000001 ], [ @@ -14306,7 +14306,7 @@ -0.8020100000000001 ], [ - 1.6092630316411544e-05, + 1.609263031641154e-05, -0.7518799999999999 ], [ @@ -14334,7 +14334,7 @@ -0.45113000000000003 ], [ - 0.0001004146473458492, + 0.00010041464734584921, -0.4009999999999998 ], [ @@ -14342,11 +14342,11 @@ -0.3508800000000001 ], [ - 0.00015282578161892978, + 0.00015282578161892975, -0.30074999999999985 ], [ - 0.00018546615228089388, + 0.00018546615228089386, -0.25063000000000013 ], [ @@ -14354,15 +14354,15 @@ -0.2004999999999999 ], [ - 0.00026455831473608775, + 0.0002645583147360878, -0.15038000000000018 ], [ - 0.0003110812262901419, + 0.00031108122629014184, -0.10024999999999995 ], [ - 0.0003620969684209355, + 0.00036209696842093547, -0.05013000000000023 ], [ @@ -14374,11 +14374,11 @@ 0.05013000000000023 ], [ - 0.0005386014534188365, + 0.0005386014534188364, 0.10024999999999995 ], [ - 0.000603374049095702, + 0.0006033740490957018, 0.15038000000000018 ], [ @@ -14390,7 +14390,7 @@ 0.25063000000000013 ], [ - 0.0008015695766481287, + 0.0008015695766481286, 0.30074999999999985 ], [ @@ -14422,15 +14422,15 @@ 0.6516299999999999 ], [ - 0.0011918963500397357, + 0.0011918963500397355, 0.7017499999999997 ], [ - 0.0012121664686238116, + 0.0012121664686238118, 0.7518799999999999 ], [ - 0.0012241183055551766, + 0.0012241183055551768, 0.8020100000000001 ], [ @@ -14438,7 +14438,7 @@ 0.8521299999999998 ], [ - 0.0012211390935051225, + 0.0012211390935051223, 0.9022600000000001 ], [ @@ -14454,7 +14454,7 @@ 1.0526299999999997 ], [ - 0.0010938253886365065, + 0.0010938253886365063, 1.10276 ], [ @@ -14486,11 +14486,11 @@ 1.4536300000000004 ], [ - 0.0001840889645708313, + 0.00018408896457083128, 1.5037599999999998 ], [ - -7.581216143648001e-06, + -7.581216143647996e-06, 1.5538799999999995 ], [ @@ -14514,11 +14514,11 @@ 1.8045100000000005 ], [ - -0.0014868749267891608, + -0.0014868749267891606, 1.8546399999999998 ], [ - -0.0017611979853936791, + -0.0017611979853936787, 1.9047599999999996 ], [ @@ -14530,7 +14530,7 @@ 2.0050100000000004 ], [ - -0.0025250470184075566, + -0.002525047018407556, 2.0551399999999997 ], [ @@ -14538,11 +14538,11 @@ 2.1052599999999995 ], [ - -0.0029138745848155, + -0.0029138745848154993, 2.1553900000000006 ], [ - -0.0030516779571043624, + -0.003051677957104362, 2.2055100000000003 ], [ @@ -14554,11 +14554,11 @@ 2.3057599999999994 ], [ - -0.003169025789766358, + -0.0031690257897663576, 2.3558900000000005 ], [ - -0.003096120920572543, + -0.0030961209205725426, 2.40602 ], [ @@ -14574,7 +14574,7 @@ 2.5563900000000004 ], [ - -0.002311623039404519, + -0.0023116230394045188, 2.6065199999999997 ], [ @@ -14590,7 +14590,7 @@ 2.7568900000000003 ], [ - -0.0011505741141283915, + -0.0011505741141283911, 2.8070199999999996 ], [ @@ -14598,19 +14598,19 @@ 2.8571399999999993 ], [ - -0.0006002579431588931, + -0.0006002579431588929, 2.9072700000000005 ], [ - -0.0003522147296406182, + -0.00035221472964061816, 2.95739 ], [ - -0.00012706541430884674, + -0.00012706541430884666, 3.0075199999999995 ], [ - 7.289247801025726e-05, + 7.289247801025739e-05, 3.05764 ], [ @@ -14618,7 +14618,7 @@ 3.1077700000000004 ], [ - 0.00039686221700858465, + 0.0003968622170085846, 3.15789 ], [ @@ -14626,7 +14626,7 @@ 3.2080199999999994 ], [ - 0.0006269834374043477, + 0.0006269834374043476, 3.2581500000000005 ], [ @@ -14634,7 +14634,7 @@ 3.3082700000000003 ], [ - 0.0007777996649816139, + 0.0007777996649816137, 3.3583999999999996 ], [ @@ -14670,7 +14670,7 @@ 3.7593999999999994 ], [ - 0.0008119170222705373, + 0.0008119170222705374, 3.80952 ], [ @@ -14678,7 +14678,7 @@ 3.8596500000000002 ], [ - 0.000715181079718302, + 0.0007151810797183018, 3.90977 ], [ @@ -14686,7 +14686,7 @@ 3.9598999999999993 ], [ - 0.0006030956638025623, + 0.0006030956638025624, 4.01003 ], [ @@ -14702,7 +14702,7 @@ 4.160400000000001 ], [ - 0.0003739930781937501, + 0.00037399307819375, 4.21053 ], [ @@ -14722,19 +14722,19 @@ 4.41103 ], [ - 0.00015631759594250587, + 0.00015631759594250585, 4.46115 ], [ - 0.0001263887831521841, + 0.00012638878315218406, 4.511280000000001 ], [ - 0.00010087941662872025, + 0.00010087941662872026, 4.561400000000001 ], [ - 7.948353893296978e-05, + 7.94835389329698e-05, 4.61153 ], [ @@ -14766,7 +14766,7 @@ 4.96241 ], [ - 7.334867626927726e-06, + 7.334867626927725e-06, 5.01253 ] ], @@ -42485,7 +42485,7 @@ -11.32832 ], [ - -1.7325788763999164e-07, + -1.7325788763999167e-07, -11.2782 ], [ @@ -42493,11 +42493,11 @@ -11.22807 ], [ - -2.301116882406029e-07, + -2.3011168824060296e-07, -11.17794 ], [ - -2.6561973643998434e-07, + -2.656197364399843e-07, -11.12782 ], [ @@ -42517,7 +42517,7 @@ -10.92732 ], [ - -5.559045671470932e-07, + -5.559045671470933e-07, -10.87719 ], [ @@ -42561,7 +42561,7 @@ -10.37594 ], [ - -2.447879096089737e-06, + -2.4478790960897367e-06, -10.32581 ], [ @@ -42589,7 +42589,7 @@ -10.02506 ], [ - -5.697588002928196e-06, + -5.697588002928197e-06, -9.97494 ], [ @@ -42597,15 +42597,15 @@ -9.92481 ], [ - -7.139675028105158e-06, + -7.13967502810516e-06, -9.87469 ], [ - -7.97096080826319e-06, + -7.970960808263188e-06, -9.82456 ], [ - -8.883201733651884e-06, + -8.883201733651881e-06, -9.77444 ], [ @@ -42613,7 +42613,7 @@ -9.72431 ], [ - -1.0973550795692162e-05, + -1.0973550795692164e-05, -9.67419 ], [ @@ -42621,11 +42621,11 @@ -9.62406 ], [ - -1.3458583443060006e-05, + -1.3458583443060003e-05, -9.57393 ], [ - -1.4864531764917217e-05, + -1.4864531764917219e-05, -9.52381 ], [ @@ -42633,15 +42633,15 @@ -9.47368 ], [ - -1.8034412156125947e-05, + -1.803441215612595e-05, -9.42356 ], [ - -1.9810658760170127e-05, + -1.9810658760170134e-05, -9.37343 ], [ - -2.1722451917505404e-05, + -2.17224519175054e-05, -9.32331 ], [ @@ -42657,11 +42657,11 @@ -9.17293 ], [ - -3.083588295114318e-05, + -3.0835882951143195e-05, -9.12281 ], [ - -3.3505359556875266e-05, + -3.350535955687527e-05, -9.07268 ], [ @@ -42677,19 +42677,19 @@ -8.92231 ], [ - -4.585538030960596e-05, + -4.5855380309605965e-05, -8.87218 ], [ - -4.936999577057731e-05, + -4.936999577057732e-05, -8.82206 ], [ - -5.305596748123537e-05, + -5.3055967481235357e-05, -8.77193 ], [ - -5.691176350133613e-05, + -5.691176350133615e-05, -8.7218 ], [ @@ -42709,7 +42709,7 @@ -8.5213 ], [ - -7.860057806032602e-05, + -7.860057806032603e-05, -8.47118 ], [ @@ -42721,7 +42721,7 @@ -8.37093 ], [ - -9.328084764917153e-05, + -9.328084764917154e-05, -8.3208 ], [ @@ -42733,7 +42733,7 @@ -8.22055 ], [ - -0.00010883140138960966, + -0.00010883140138960965, -8.17043 ], [ @@ -42741,15 +42741,15 @@ -8.1203 ], [ - -0.00011946591273130722, + -0.00011946591273130725, -8.07018 ], [ - -0.00012480559531094542, + -0.00012480559531094545, -8.02005 ], [ - -0.00013013165862163509, + -0.00013013165862163506, -7.96992 ], [ @@ -42761,7 +42761,7 @@ -7.86967 ], [ - -0.0001457958470190608, + -0.00014579584701906076, -7.81955 ], [ @@ -42773,7 +42773,7 @@ -7.7193 ], [ - -0.00016046939328586855, + -0.00016046939328586852, -7.66917 ], [ @@ -42785,11 +42785,11 @@ -7.56892 ], [ - -0.0001734575991169756, + -0.00017345759911697558, -7.5188 ], [ - -0.00017729264614978224, + -0.0001772926461497822, -7.46867 ], [ @@ -42801,11 +42801,11 @@ -7.36842 ], [ - -0.00018697470236333743, + -0.0001869747023633374, -7.3183 ], [ - -0.00018952025390995384, + -0.00018952025390995387, -7.26817 ], [ @@ -42817,11 +42817,11 @@ -7.16792 ], [ - -0.00019484189598524781, + -0.00019484189598524784, -7.11779 ], [ - -0.00019579214665945137, + -0.0001957921466594514, -7.06767 ], [ @@ -42829,7 +42829,7 @@ -7.01754 ], [ - -0.00019638652610548884, + -0.00019638652610548882, -6.96742 ], [ @@ -42837,7 +42837,7 @@ -6.91729 ], [ - -0.0001951931865276297, + -0.00019519318652762974, -6.86717 ], [ @@ -42861,7 +42861,7 @@ -6.61654 ], [ - -0.0001801357778739592, + -0.00018013577787395922, -6.56642 ], [ @@ -42869,19 +42869,19 @@ -6.51629 ], [ - -0.00017100365167593774, + -0.00017100365167593772, -6.46617 ], [ - -0.00016580181168054687, + -0.00016580181168054684, -6.41604 ], [ - -0.00016034688084781202, + -0.00016034688084781205, -6.36591 ], [ - -0.0001546104265529585, + -0.00015461042655295847, -6.31579 ], [ @@ -42889,7 +42889,7 @@ -6.26566 ], [ - -0.00014239833516559158, + -0.00014239833516559156, -6.21554 ], [ @@ -42897,7 +42897,7 @@ -6.16541 ], [ - -0.00012935456327183752, + -0.0001293545632718375, -6.11529 ], [ @@ -42905,7 +42905,7 @@ -6.06516 ], [ - -0.00011572400495647253, + -0.00011572400495647255, -6.01504 ], [ @@ -42913,11 +42913,11 @@ -5.96491 ], [ - -0.00010180957956532756, + -0.00010180957956532759, -5.91479 ], [ - -9.482962702122574e-05, + -9.482962702122576e-05, -5.86466 ], [ @@ -42925,99 +42925,99 @@ -5.81454 ], [ - -8.098222811902677e-05, + -8.098222811902674e-05, -5.76441 ], [ - -7.417381568738998e-05, + -7.417381568739001e-05, -5.71429 ], [ - -6.747637914330574e-05, + -6.74763791433057e-05, -5.66416 ], [ - -6.09173572355586e-05, + -6.0917357235558585e-05, -5.61404 ], [ - -5.4528861923457266e-05, + -5.452886192345727e-05, -5.56391 ], [ - -4.834041726539748e-05, + -4.8340417265397495e-05, -5.51378 ], [ - -4.236448090923218e-05, + -4.23644809092322e-05, -5.46366 ], [ - -3.6609365111022865e-05, + -3.660936511102288e-05, -5.41353 ], [ - -3.108585226854891e-05, + -3.1085852268548925e-05, -5.36341 ], [ - -2.5806580925532823e-05, + -2.5806580925532847e-05, -5.31328 ], [ - -2.078484369439816e-05, + -2.0784843694398175e-05, -5.26316 ], [ - -1.6031177084163596e-05, + -1.60311770841636e-05, -5.21303 ], [ - -1.155484555278206e-05, + -1.155484555278205e-05, -5.16291 ], [ - -7.361651137600179e-06, + -7.3616511376001816e-06, -5.11278 ], [ - -3.4553106098049308e-06, + -3.455310609804939e-06, -5.06266 ], [ - 1.6232957281246374e-07, + 1.623295728124582e-07, -5.01253 ], [ - 3.492096573716947e-06, + 3.492096573716943e-06, -4.96241 ], [ - 6.535766769471918e-06, + 6.535766769471909e-06, -4.91228 ], [ - 9.29684168834514e-06, + 9.296841688345132e-06, -4.86216 ], [ - 1.1780427840315109e-05, + 1.1780427840315106e-05, -4.81203 ], [ - 1.3993107502499578e-05, + 1.3993107502499571e-05, -4.7619 ], [ - 1.5943020830992025e-05, + 1.594302083099202e-05, -4.71178 ], [ - 1.76403100421718e-05, + 1.7640310042171804e-05, -4.66165 ], [ - 1.9096573610534873e-05, + 1.9096573610534866e-05, -4.61153 ], [ @@ -43029,7 +43029,7 @@ -4.51128 ], [ - 2.212683229958028e-05, + 2.2126832299580284e-05, -4.46115 ], [ @@ -43037,19 +43037,19 @@ -4.41103 ], [ - 2.3159523455704597e-05, + 2.315952345570459e-05, -4.3609 ], [ - 2.342034211928515e-05, + 2.3420342119285144e-05, -4.31078 ], [ - 2.3529051965184317e-05, + 2.3529051965184313e-05, -4.26065 ], [ - 2.349937541178967e-05, + 2.3499375411789667e-05, -4.21053 ], [ @@ -43057,7 +43057,7 @@ -4.1604 ], [ - 2.3081108104355147e-05, + 2.3081108104355154e-05, -4.11028 ], [ @@ -43069,19 +43069,19 @@ -4.01003 ], [ - 2.175902934460582e-05, + 2.1759029344605812e-05, -3.9599 ], [ - 2.11845856627563e-05, + 2.1184585662756297e-05, -3.90977 ], [ - 2.056315746830559e-05, + 2.0563157468305586e-05, -3.85965 ], [ - 1.9906262466290044e-05, + 1.990626246629004e-05, -3.80952 ], [ @@ -43089,7 +43089,7 @@ -3.7594 ], [ - 1.8529032277055714e-05, + 1.8529032277055718e-05, -3.70927 ], [ @@ -43101,7 +43101,7 @@ -3.60902 ], [ - 1.645365082762146e-05, + 1.6453650827621464e-05, -3.5589 ], [ @@ -43125,7 +43125,7 @@ -3.30827 ], [ - 1.3109659826336665e-05, + 1.3109659826336661e-05, -3.25815 ], [ @@ -43157,7 +43157,7 @@ -2.90727 ], [ - 1.2533730077701877e-05, + 1.253373007770188e-05, -2.85714 ], [ @@ -43165,7 +43165,7 @@ -2.80702 ], [ - 1.342111612989341e-05, + 1.3421116129893409e-05, -2.75689 ], [ @@ -43189,11 +43189,11 @@ -2.50627 ], [ - 1.935088315498163e-05, + 1.9350883154981633e-05, -2.45614 ], [ - 2.0876522500484605e-05, + 2.087652250048461e-05, -2.40602 ], [ @@ -43241,19 +43241,19 @@ -1.8546399999999998 ], [ - 5.673626271843739e-05, + 5.67362627184374e-05, -1.80451 ], [ - 6.144338144176996e-05, + 6.144338144176998e-05, -1.75439 ], [ - 6.643755764193302e-05, + 6.643755764193304e-05, -1.70426 ], [ - 7.172088395604303e-05, + 7.172088395604306e-05, -1.65414 ], [ @@ -43281,7 +43281,7 @@ -1.35338 ], [ - 0.0001168082498429969, + 0.00011680824984299687, -1.3032599999999999 ], [ @@ -43297,7 +43297,7 @@ -1.1528799999999997 ], [ - 0.0001482913985804431, + 0.00014829139858044314, -1.10276 ], [ @@ -43325,7 +43325,7 @@ -0.8020100000000001 ], [ - 0.00020826830501295227, + 0.00020826830501295232, -0.7518799999999999 ], [ @@ -43333,7 +43333,7 @@ -0.7017500000000001 ], [ - 0.00022499786684366786, + 0.0002249978668436679, -0.6516299999999999 ], [ @@ -43345,7 +43345,7 @@ -0.55138 ], [ - 0.00024817760860431, + 0.00024817760860430994, -0.5012499999999998 ], [ @@ -43429,15 +43429,15 @@ 0.5012499999999998 ], [ - 0.0002012959377817215, + 0.00020129593778172143, 0.55138 ], [ - 0.00018484673303380866, + 0.0001848467330338086, 0.6014999999999997 ], [ - 0.00016694273702605735, + 0.0001669427370260573, 0.6516299999999999 ], [ @@ -43453,35 +43453,35 @@ 0.8020100000000001 ], [ - 8.156124315182612e-05, + 8.15612431518261e-05, 0.8521299999999998 ], [ - 5.7061885074515015e-05, + 5.706188507451503e-05, 0.9022600000000001 ], [ - 3.145559518768042e-05, + 3.145559518768037e-05, 0.9523799999999998 ], [ - 4.837931438673674e-06, + 4.837931438673685e-06, 1.00251 ], [ - -2.268572188999805e-05, + -2.2685721889998066e-05, 1.0526299999999997 ], [ - -5.100023636557066e-05, + -5.100023636557067e-05, 1.10276 ], [ - -7.998284438867142e-05, + -7.998284438867149e-05, 1.1528799999999997 ], [ - -0.00010950371438931693, + -0.00010950371438931692, 1.20301 ], [ @@ -43493,7 +43493,7 @@ 1.3032599999999999 ], [ - -0.0001998976067205775, + -0.00019989760672057738, 1.3533799999999996 ], [ @@ -43505,7 +43505,7 @@ 1.4536300000000004 ], [ - -0.00028988254862999364, + -0.00028988254862999353, 1.5037599999999998 ], [ @@ -43517,11 +43517,11 @@ 1.6040099999999997 ], [ - -0.00037519343810686286, + -0.000375193438106863, 1.65414 ], [ - -0.0004018576013174927, + -0.0004018576013174928, 1.7042599999999997 ], [ @@ -43537,11 +43537,11 @@ 1.8546399999999998 ], [ - -0.0004957363694642163, + -0.0004957363694642162, 1.9047599999999996 ], [ - -0.0005153440406602138, + -0.0005153440406602137, 1.9548899999999998 ], [ @@ -43557,19 +43557,19 @@ 2.1052599999999995 ], [ - -0.0005748646750095953, + -0.0005748646750095951, 2.1553900000000006 ], [ - -0.000584582575596191, + -0.0005845825755961909, 2.2055100000000003 ], [ - -0.0005920980899756473, + -0.000592098089975647, 2.2556399999999996 ], [ - -0.0005972987951930536, + -0.0005972987951930535, 2.3057599999999994 ], [ @@ -43581,7 +43581,7 @@ 2.40602 ], [ - -0.0005981076178533239, + -0.0005981076178533238, 2.4561399999999995 ], [ @@ -43589,7 +43589,7 @@ 2.5062700000000007 ], [ - -0.000586645808624893, + -0.0005866458086248931, 2.5563900000000004 ], [ @@ -43605,7 +43605,7 @@ 2.7067700000000006 ], [ - -0.0005397742684693166, + -0.0005397742684693165, 2.7568900000000003 ], [ @@ -43621,7 +43621,7 @@ 2.9072700000000005 ], [ - -0.0004685286881228044, + -0.0004685286881228043, 2.95739 ], [ @@ -43633,15 +43633,15 @@ 3.05764 ], [ - -0.0004036795664923969, + -0.00040367956649239693, 3.1077700000000004 ], [ - -0.00038061232880902385, + -0.0003806123288090239, 3.15789 ], [ - -0.0003570360089426209, + -0.00035703600894262087, 3.2080199999999994 ], [ @@ -43649,7 +43649,7 @@ 3.2581500000000005 ], [ - -0.0003089007941251903, + -0.00030890079412519033, 3.3082700000000003 ], [ @@ -43657,7 +43657,7 @@ 3.3583999999999996 ], [ - -0.0002603148023678322, + -0.0002603148023678321, 3.40852 ], [ @@ -43665,11 +43665,11 @@ 3.4586500000000004 ], [ - -0.00021233726695790258, + -0.0002123372669579026, 3.50877 ], [ - -0.00018888261934083822, + -0.00018888261934083827, 3.5588999999999995 ], [ @@ -43677,59 +43677,59 @@ 3.60902 ], [ - -0.00014356575014016576, + -0.00014356575014016573, 3.6591500000000003 ], [ - -0.00012192474370680833, + -0.00012192474370680834, 3.70927 ], [ - -0.00010112510277384642, + -0.00010112510277384655, 3.7593999999999994 ], [ - -8.124047689221905e-05, + -8.124047689221908e-05, 3.80952 ], [ - -6.235647310666415e-05, + -6.23564731066641e-05, 3.8596500000000002 ], [ - -4.4432562464348735e-05, + -4.44325624643487e-05, 3.90977 ], [ - -2.7493518899093662e-05, + -2.7493518899093716e-05, 3.9598999999999993 ], [ - -1.157460084159072e-05, + -1.1574600841590702e-05, 4.01003 ], [ - 3.297745307272015e-06, + 3.2977453072719763e-06, 4.06015 ], [ - 1.710563331579012e-05, + 1.710563331579013e-05, 4.110280000000001 ], [ - 2.983941717801201e-05, + 2.9839417178011994e-05, 4.160400000000001 ], [ - 4.1497310108176056e-05, + 4.149731010817606e-05, 4.21053 ], [ - 5.2084949874988715e-05, + 5.2084949874988654e-05, 4.26065 ], [ - 6.161491813846689e-05, + 6.16149181384669e-05, 4.310779999999999 ], [ @@ -43741,7 +43741,7 @@ 4.41103 ], [ - 8.407766816673594e-05, + 8.407766816673589e-05, 4.46115 ], [ @@ -43749,11 +43749,11 @@ 4.511280000000001 ], [ - 9.425846901536609e-05, + 9.42584690153661e-05, 4.561400000000001 ], [ - 9.802692424480867e-05, + 9.802692424480866e-05, 4.61153 ], [ @@ -43769,7 +43769,7 @@ 4.761899999999999 ], [ - 0.00010537150043592374, + 0.00010537150043592372, 4.81203 ], [ @@ -43781,11 +43781,11 @@ 4.912280000000001 ], [ - 0.00010417557849645457, + 0.00010417557849645454, 4.96241 ], [ - 0.00010277252027280329, + 0.00010277252027280327, 5.01253 ] ], @@ -55239,5 +55239,21 @@ ] }, "stdout": "" + }, + "plot-icohp-distance -cbonds": { + "plot": { + "facecolor": [ + 1.0, + 1.0, + 1.0, + 1.0 + ], + "size": [ + 12.0, + 8.0 + ], + "xydata": [] + }, + "stdout": "" } -} +} \ No newline at end of file From 45f27fc348aeaa4f92fb7240ba4a819111174a12 Mon Sep 17 00:00:00 2001 From: naik-aakash Date: Wed, 1 Jan 2025 14:40:15 +0100 Subject: [PATCH 02/30] add option in cli to get colored icohpdistance plots --- src/lobsterpy/cli.py | 79 +++++++++++++++++++++++++++--- src/lobsterpy/plotting/__init__.py | 3 +- 2 files changed, 74 insertions(+), 8 deletions(-) diff --git a/src/lobsterpy/cli.py b/src/lobsterpy/cli.py index ed686588..8e21c038 100644 --- a/src/lobsterpy/cli.py +++ b/src/lobsterpy/cli.py @@ -472,6 +472,65 @@ def get_parser() -> argparse.ArgumentParser: "If not set, plots consist of summed cohps.", ) + # Specific to icohp distance plotter args + icohp_distance_plotter_args = argparse.ArgumentParser(add_help=False) + icohp_distance_plotter_group = icohp_distance_plotter_args.add_argument_group( + "Options specific to ICOHP distance plotter" + ) + icohp_distance_plotter_group.add_argument( + "-alpha", + type=float, + default=0.4, + dest="alpha", + help="Transparency of the markers in the plot.", + ) + icohp_distance_plotter_group.add_argument( + "-cbonds", + "--colorbonds", + "--color-bonds", + default=False, + dest="colorbonds", + action="store_true", + help="If set, will color ICOHPs based on atom types", + ) + icohp_distance_plotter_group.add_argument( + "-c", + "--colors", + dest="colors", + nargs="+", + type=str, + default=None, + help="Custom list of colors for the plot. " + "Should be equal to the number of unique atom pairs in the structure.", + ) + icohp_distance_plotter_group.add_argument( + "-lprefix", + "--legendprefix", + "--legend-prefix", + type=str, + dest="legendprefix", + default="", + help="Prefix for the legend in the plot.", + ) + icohp_distance_plotter_group.add_argument( + "-msize", + "--markersize", + "--marker-size", + type=float, + default=50, + dest="markersize", + help="Size of the markers in the plot.", + ) + icohp_distance_plotter_group.add_argument( + "-mstyle", + "--markerstyle", + "--marker-style", + type=str, + default="o", + dest="markerstyle", + help="Marker style for the plot.", + ) + # Args specific to calc quality description dict and texts calc_quality_args = argparse.ArgumentParser(add_help=False) calc_quality_args_group = calc_quality_args.add_argument_group( @@ -628,7 +687,7 @@ def get_parser() -> argparse.ArgumentParser: subparsers.add_parser( "plot-icohp-distance", aliases=["ploticohpdistance"], - parents=[icohplist_file, plotting_parent, analysis_switch], + parents=[icohplist_file, plotting_parent, analysis_switch, icohp_distance_plotter_args], help="Plot ICOHPs or ICOOPs or ICOBIs with respect to bond lengths", ) # Mode for normal plotting (without automatic detection of relevant COHPs) @@ -723,7 +782,6 @@ def _user_figsize(width, height, aspect=None): return {"figure.figsize": (width, width / aspect)} -# TODO: add automatic functionality for COBIs, COOPs def run(args): """ Run actions based on args. @@ -1184,9 +1242,6 @@ def run(args): "icobilist" ) args.icohplist = filename - # filename = args.icohplist.parent / "ICOBILIST.lobster" - # if not filename.exists(): - # filename = filename.with_name(zpath(filename.name)) options = {"are_cobis": True, "are_coops": False} elif args.coops: filename = get_file_paths(path_to_lobster_calc=Path(os.getcwd()), requested_files=["icooplist"]).get( @@ -1204,9 +1259,19 @@ def run(args): icohpcollection = Icohplist(filename=args.icohplist, **options).icohpcollection icohp_plotter = IcohpDistancePlotter(**options) - icohp_plotter.add_icohps(icohpcollection=icohpcollection, label="") + icohp_plotter.add_icohps(icohpcollection=icohpcollection, label=args.legendprefix) + + get_plot_kwargs = { + "alpha": args.alpha, + "color_interactions": args.colorbonds, + "colors": args.colors, + "marker_size": args.markersize, + "marker_style": args.markerstyle, + "xlim": args.xlim, + "ylim": args.ylim, + } - plt = icohp_plotter.get_plot(xlim=args.xlim, ylim=args.ylim) + plt = icohp_plotter.get_plot(**get_plot_kwargs) ax = plt.gca() ax.set_title(args.title) diff --git a/src/lobsterpy/plotting/__init__.py b/src/lobsterpy/plotting/__init__.py index 70b731f0..f428ddc5 100644 --- a/src/lobsterpy/plotting/__init__.py +++ b/src/lobsterpy/plotting/__init__.py @@ -1208,6 +1208,7 @@ def get_plot( else: y = data["icohps"] for i, pair in enumerate(data["atom_types"]): + legend_label = f"{pair}" if not label else f"{label}-({pair})" ax.scatter( x[i], y[i], @@ -1215,7 +1216,7 @@ def get_plot( s=marker_size, alpha=alpha, marker=marker_style, - label=f"{label}-({pair})", + label=legend_label, ) # Filter out duplicate labels and add only unique labels to the legend From 9a0be1994331d27a3d08295c571122a843c882f7 Mon Sep 17 00:00:00 2001 From: naik-aakash Date: Wed, 1 Jan 2025 14:57:10 +0100 Subject: [PATCH 03/30] attempt to disable deprecation warnings (temporary change) --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 29a88c8f..1e4f0c0d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -143,6 +143,7 @@ isort.required-imports = ["from __future__ import annotations"] [tool.pytest.ini_options] addopts = "-x --durations=30 --quiet -rxXs --color=yes -p no:warnings" +filterwarnings = ["ignore::DeprecationWarning"] [tool.coverage.report] exclude_lines = [ From 125afdc993b67b66cfb7b9948649f6cff592de22 Mon Sep 17 00:00:00 2001 From: naik-aakash Date: Wed, 1 Jan 2025 15:01:28 +0100 Subject: [PATCH 04/30] revert disable deprecation warnings in pyproject.toml --- pyproject.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 1e4f0c0d..29a88c8f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -143,7 +143,6 @@ isort.required-imports = ["from __future__ import annotations"] [tool.pytest.ini_options] addopts = "-x --durations=30 --quiet -rxXs --color=yes -p no:warnings" -filterwarnings = ["ignore::DeprecationWarning"] [tool.coverage.report] exclude_lines = [ From f7c151b29d448ca0d14cbc63b797dfcf8502ed19 Mon Sep 17 00:00:00 2001 From: naik-aakash Date: Sat, 4 Jan 2025 19:27:33 +0100 Subject: [PATCH 05/30] add bwdf plotting to cli --- src/lobsterpy/cli.py | 140 ++++++++++++++++++++++++++++- src/lobsterpy/plotting/__init__.py | 96 ++++++++++++++++++++ 2 files changed, 235 insertions(+), 1 deletion(-) diff --git a/src/lobsterpy/cli.py b/src/lobsterpy/cli.py index 8e21c038..447d95ea 100644 --- a/src/lobsterpy/cli.py +++ b/src/lobsterpy/cli.py @@ -18,6 +18,7 @@ from lobsterpy.cohp.analyze import Analysis from lobsterpy.cohp.describe import Description +from lobsterpy.featurize.core import FeaturizeIcoxxlist from lobsterpy.featurize.utils import get_file_paths from lobsterpy.plotting import ( IcohpDistancePlotter, @@ -472,7 +473,7 @@ def get_parser() -> argparse.ArgumentParser: "If not set, plots consist of summed cohps.", ) - # Specific to icohp distance plotter args + # Args specific to icohp distance plotter args icohp_distance_plotter_args = argparse.ArgumentParser(add_help=False) icohp_distance_plotter_group = icohp_distance_plotter_args.add_argument_group( "Options specific to ICOHP distance plotter" @@ -531,6 +532,69 @@ def get_parser() -> argparse.ArgumentParser: help="Marker style for the plot.", ) + # Args specific to plotting BWDFs + bwdf_plotting_args = argparse.ArgumentParser(add_help=False) + bwdf_plotting_group = bwdf_plotting_args.add_argument_group("Options specific to plotting BWDFs") + bwdf_plotting_group.add_argument( + "-atompairs", + "--atom-pairs", + dest="atompairs", + action="store_true", + default=False, + help="If True, will plot the BWDFs for all unique atom pairs. Default: False.", + ) + bwdf_plotting_group.add_argument( + "-binwidth", + "--bin-width", + type=float, + dest="binwidth", + default=0.02, + help="Bin width used for computing the BWDFs. Default: 0.1.", + ) + bwdf_plotting_group.add_argument( + "-interacttol", + "--interactions-tolerance", + type=float, + dest="interacttol", + default=1e-3, + help="Numerical tolerance considered for interactions to be insignificant. Default: 1e-3.", + ) + bwdf_plotting_group.add_argument( + "-maxlen", + "--maxlength", + "--max-length", + type=float, + dest="maxlen", + default=5, + help="Maximum bond length for the BWDFs in Angstroms. Default: 5.", + ) + bwdf_plotting_group.add_argument( + "-minlen", + "--minlength", + "--min-length", + type=float, + dest="minlen", + default=0, + help="Minimum bond length for the BWDFs in Angstroms. Default: 0.", + ) + bwdf_plotting_group.add_argument( + "-norm", + "--normalization", + type=str, + default="formula_units", + dest="norm", + help="Normalization of the BWDFs. Options: 'formula_units', 'area', 'counts' and 'none'. " + "Default: 'formula_units'.", + ) + bwdf_plotting_group.add_argument( + "-siteindex", + "--site-index", + type=int, + default=None, + dest="siteindex", + help="Site index for which the BWDFs are to be plotted. Default: None. If None, all sites are considered.", + ) + # Args specific to calc quality description dict and texts calc_quality_args = argparse.ArgumentParser(add_help=False) calc_quality_args_group = calc_quality_args.add_argument_group( @@ -672,6 +736,18 @@ def get_parser() -> argparse.ArgumentParser: ], help=("Creates an interactive plot of most important COHPs or COBIs or COOPs automatically."), ) + subparsers.add_parser( + "plot-bwdf", + aliases=["plotbwdf"], + parents=[ + icohplist_file, + structure_file, + bwdf_plotting_args, + plotting_parent, + analysis_switch, + ], + help="Plot bond-weighted distribution functions (BWDFs) from ICOXXLIST.lobster.", + ) subparsers.add_parser( "plot-dos", aliases=["plotdos"], @@ -865,6 +941,7 @@ def run(args): "plot", "plot-automatic", "plot-automatic-ia", + "plot-bwdf", "plot-dos", "plotdos", "plot-icohp-distance", @@ -911,6 +988,67 @@ def run(args): orbital_resolved=args.orbitalresolved, ) + if args.action == "plot-bwdf": + if args.cobis: + filename = get_file_paths(path_to_lobster_calc=Path(os.getcwd()), requested_files=["icobilist"]).get( + "icobilist" + ) + options = {"are_cobis": True, "are_coops": False} + elif args.coops: + filename = get_file_paths(path_to_lobster_calc=Path(os.getcwd()), requested_files=["icooplist"]).get( + "icooplist" + ) + options = {"are_cobis": False, "are_coops": True} + else: + filename = get_file_paths(path_to_lobster_calc=Path(os.getcwd()), requested_files=["icohplist"]).get( + "icohplist" + ) + options = {"are_cobis": False, "are_coops": False} + + structure_filename = get_file_paths(path_to_lobster_calc=Path(os.getcwd()), requested_files=["structure"]).get( + "structure" + ) + + feat_icoxx = FeaturizeIcoxxlist( + path_to_icoxxlist=filename, + path_to_structure=structure_filename, + interactions_tol=args.interacttol, + normalization=args.norm, + bin_width=args.binwidth, + min_length=args.minlen, + max_length=args.maxlen, + **options, + ) + + bwdf = feat_icoxx.calc_site_bwdf(site_index=args.siteindex) if args.siteindex else feat_icoxx.calc_bwdf() + + formatted_bwdf = IcohpDistancePlotter.bwdf_data_to_plot(bwdf) + if args.siteindex: + site = feat_icoxx.structure.sites[args.siteindex] + label = site.species_string + else: + label = feat_icoxx.structure.composition.get_reduced_formula_and_factor()[0] + + icohp_dist_plotter = IcohpDistancePlotter(are_coops=args.coops, are_cobis=args.cobis) + + for pair, bwdf_data in formatted_bwdf.items(): + bwdf_dict = {pair: bwdf_data} + if args.atompairs and pair != "summed": + icohp_dist_plotter.add_bwdf(bwdf=bwdf_dict, label=label) + plt = icohp_dist_plotter.get_bwdf_plot(sigma=args.sigma, xlim=args.xlim, ylim=args.ylim) + if not args.hideplot: + plt.show() + elif not args.atompairs and pair == "summed": # for only summed bwdf + icohp_dist_plotter.add_bwdf(bwdf=bwdf_dict, label=label) + plt = icohp_dist_plotter.get_bwdf_plot(sigma=args.sigma, xlim=args.xlim, ylim=args.ylim) + if not args.hideplot: + plt.show() + elif not args.atompairs and pair == str(args.siteindex): # for site specific bwdf + icohp_dist_plotter.add_bwdf(bwdf=bwdf_dict, label=label) + plt = icohp_dist_plotter.get_bwdf_plot(sigma=args.sigma, xlim=args.xlim, ylim=args.ylim) + if not args.hideplot: + plt.show() + if args.action == "plot": if args.cobis: filename = get_file_paths(path_to_lobster_calc=Path(os.getcwd()), requested_files=["cobicar"]).get( diff --git a/src/lobsterpy/plotting/__init__.py b/src/lobsterpy/plotting/__init__.py index f428ddc5..5092e341 100644 --- a/src/lobsterpy/plotting/__init__.py +++ b/src/lobsterpy/plotting/__init__.py @@ -1110,6 +1110,36 @@ def __init__(self, are_coops: bool = False, are_cobis: bool = False): self.are_coops = are_coops self.are_cobis = are_cobis self._icohps = {} # type: ignore + self._bwdfs = {} # type: ignore + + @staticmethod + def bwdf_data_to_plot(raw_bwdf: dict): + """ + Restructure bond weighted distribution function (BWDF) data for plotting. + + :param raw_bwdf: dict containing BWDF data as obtained from FeaturizeIcoxxlist. + + """ + # Keep only the BWDF data necessary for plotting + for pair in raw_bwdf: # noqa: PLC0206 + if pair not in ("centers", "edges", "bin_width", "wasserstein_dist_to_rdf"): + raw_bwdf[pair].update({"centers": raw_bwdf["centers"]}) + del raw_bwdf[pair]["icoxx_counts"] + for key in ("centers", "edges", "bin_width", "wasserstein_dist_to_rdf"): + del raw_bwdf[key] + + return raw_bwdf + + def add_bwdf(self, label: str, bwdf: dict): + """ + Add bond weighted distribution function (BWDF) for plotting. + + :param label: Label for the BWDF. Must be unique. + :param bwdf: dict containing BWDF data formatted with + IcohpDistancePlotter.bwdf_data_to_plot. + + """ + self._bwdfs[label] = bwdf def add_icohps(self, label: str, icohpcollection: IcohpCollection): """ @@ -1235,3 +1265,69 @@ def get_plot( ax.scatter(x, y, s=marker_size, marker=marker_style, label=label) return plt + + def get_bwdf_plot( + self, + ax: mpl.axes.Axes | None = None, + colors: list[str] | None = None, + plot_negative: bool = True, + sigma: float | None = None, + xlim: tuple[float, float] | None = None, + ylim: tuple[float, float] | None = None, + ): + """ + Get a matplotlib plot showing the bond weighted distribution function (BWDF). + + :param ax: Existing Matplotlib Axes object to plot to. + :param colors: list of hex color codes to be used in plot + :param plot_negative: Will plot -1*ICOHPs. Works only for ICOHPs + :param sigma: Standard deviation of Gaussian broadening applied to + distribution data. If ,None no broadening will be + added. + :param xlim: Specifies the x-axis limits. Defaults to None for + automatic determination. + :param ylim: Specifies the y-axis limits. Defaults to None for + automatic determination. + + Returns: + A matplotlib object. + """ + if self.are_coops and not self.are_cobis: + cohp_label = "ICOOP" + elif self.are_cobis and not self.are_coops: + cohp_label = "ICOBI" + elif self.are_cobis and self.are_coops: + raise ValueError("Plot data should not contain ICOBI and ICOOP data at same time") + else: + cohp_label = "ICOHP (eV)" + + if ax is None: + _, ax = plt.subplots() + + if xlim: + ax.set_xlim(xlim) + if ylim: + ax.set_ylim(ylim) + + palette = InteractiveCohpPlotter.COLOR_PALETTE if colors is None else colors + pal_iter = cycle(palette) + + for label, bwdf in self._bwdfs.items(): + for pair in bwdf: + legend_label = f"{pair}" if not label else f"{label}: {pair}" + if plot_negative and cohp_label == "ICOHP (eV)": + icoxx_weights = PlainCohpPlotter._broaden( + bwdf[pair]["centers"], -1 * bwdf[pair]["icoxx_binned"], sigma=sigma + ) + ax.plot(bwdf[pair]["centers"], icoxx_weights, label=legend_label, c=next(pal_iter)) + else: + icoxx_weights = PlainCohpPlotter._broaden( + bwdf[pair]["centers"], bwdf[pair]["icoxx_binned"], sigma=sigma + ) + ax.plot(bwdf[pair]["centers"], icoxx_weights, label=legend_label, c=next(pal_iter)) + + ax.set_ylabel(f"BWDF-{cohp_label}") + ax.set_xlabel("Bond lengths (\u00c5)") + ax.legend() + + return plt From c5de7f8aa0998324decb0475caa0f6080cafc28c Mon Sep 17 00:00:00 2001 From: naik-aakash Date: Sat, 4 Jan 2025 19:34:32 +0100 Subject: [PATCH 06/30] minor cleanup --- src/lobsterpy/plotting/__init__.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/lobsterpy/plotting/__init__.py b/src/lobsterpy/plotting/__init__.py index 5092e341..35590a29 100644 --- a/src/lobsterpy/plotting/__init__.py +++ b/src/lobsterpy/plotting/__init__.py @@ -1121,12 +1121,16 @@ def bwdf_data_to_plot(raw_bwdf: dict): """ # Keep only the BWDF data necessary for plotting - for pair in raw_bwdf: # noqa: PLC0206 - if pair not in ("centers", "edges", "bin_width", "wasserstein_dist_to_rdf"): - raw_bwdf[pair].update({"centers": raw_bwdf["centers"]}) - del raw_bwdf[pair]["icoxx_counts"] - for key in ("centers", "edges", "bin_width", "wasserstein_dist_to_rdf"): - del raw_bwdf[key] + + excluded_keys = {"centers", "edges", "bin_width", "wasserstein_dist_to_rdf"} + + for pair, value in raw_bwdf.items(): + if pair not in excluded_keys: + value.update({"centers": raw_bwdf.get("centers")}) + value.pop("icoxx_counts") + + for key in excluded_keys: + raw_bwdf.pop(key) return raw_bwdf From 549f6ea836941f02c880e8c51e53292cdae75f72 Mon Sep 17 00:00:00 2001 From: naik-aakash Date: Sat, 4 Jan 2025 19:34:59 +0100 Subject: [PATCH 07/30] minor cleanup --- src/lobsterpy/plotting/__init__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/lobsterpy/plotting/__init__.py b/src/lobsterpy/plotting/__init__.py index 35590a29..c95d1867 100644 --- a/src/lobsterpy/plotting/__init__.py +++ b/src/lobsterpy/plotting/__init__.py @@ -1121,7 +1121,6 @@ def bwdf_data_to_plot(raw_bwdf: dict): """ # Keep only the BWDF data necessary for plotting - excluded_keys = {"centers", "edges", "bin_width", "wasserstein_dist_to_rdf"} for pair, value in raw_bwdf.items(): From d11a45710bedef33b37931723af1bac1b48c0646 Mon Sep 17 00:00:00 2001 From: naik-aakash Date: Sun, 5 Jan 2025 11:08:39 +0100 Subject: [PATCH 08/30] add save plot option for bwdf cli and cleanup --- src/lobsterpy/cli.py | 39 +++++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/src/lobsterpy/cli.py b/src/lobsterpy/cli.py index 447d95ea..1af45a4c 100644 --- a/src/lobsterpy/cli.py +++ b/src/lobsterpy/cli.py @@ -942,6 +942,7 @@ def run(args): "plot-automatic", "plot-automatic-ia", "plot-bwdf", + "plotbwdf", "plot-dos", "plotdos", "plot-icohp-distance", @@ -988,7 +989,7 @@ def run(args): orbital_resolved=args.orbitalresolved, ) - if args.action == "plot-bwdf": + if args.action in ["plot-bwdf", "plotbwdf"]: if args.cobis: filename = get_file_paths(path_to_lobster_calc=Path(os.getcwd()), requested_files=["icobilist"]).get( "icobilist" @@ -1023,6 +1024,8 @@ def run(args): bwdf = feat_icoxx.calc_site_bwdf(site_index=args.siteindex) if args.siteindex else feat_icoxx.calc_bwdf() formatted_bwdf = IcohpDistancePlotter.bwdf_data_to_plot(bwdf) + + # Set label for plot (legend) if args.siteindex: site = feat_icoxx.structure.sites[args.siteindex] label = site.species_string @@ -1031,23 +1034,31 @@ def run(args): icohp_dist_plotter = IcohpDistancePlotter(are_coops=args.coops, are_cobis=args.cobis) + # Assimilate data for plotting + plot_data_dicts = {} for pair, bwdf_data in formatted_bwdf.items(): - bwdf_dict = {pair: bwdf_data} if args.atompairs and pair != "summed": - icohp_dist_plotter.add_bwdf(bwdf=bwdf_dict, label=label) - plt = icohp_dist_plotter.get_bwdf_plot(sigma=args.sigma, xlim=args.xlim, ylim=args.ylim) - if not args.hideplot: - plt.show() + plot_data_dicts.update({pair: bwdf_data}) elif not args.atompairs and pair == "summed": # for only summed bwdf - icohp_dist_plotter.add_bwdf(bwdf=bwdf_dict, label=label) - plt = icohp_dist_plotter.get_bwdf_plot(sigma=args.sigma, xlim=args.xlim, ylim=args.ylim) - if not args.hideplot: - plt.show() + plot_data_dicts.update({pair: bwdf_data}) elif not args.atompairs and pair == str(args.siteindex): # for site specific bwdf - icohp_dist_plotter.add_bwdf(bwdf=bwdf_dict, label=label) - plt = icohp_dist_plotter.get_bwdf_plot(sigma=args.sigma, xlim=args.xlim, ylim=args.ylim) - if not args.hideplot: - plt.show() + plot_data_dicts.update({pair: bwdf_data}) + + # Iterate over all pairs and plot + for pair, bwdf_data in plot_data_dicts.items(): + bwdf_dict = {pair: bwdf_data} + icohp_dist_plotter.add_bwdf(bwdf=bwdf_dict, label=label) + plot = icohp_dist_plotter.get_bwdf_plot(sigma=args.sigma, xlim=args.xlim, ylim=args.ylim) + title = f"{args.title} : {pair}" if args.title else "" + plot.title(title) + if not args.hideplot and not args.save_plot: + plot.show() + elif args.save_plot and not args.hideplot: + fig = plot.gcf() + fig.savefig(f"{pair.replace('-', '_')}_{args.save_plot}") + plot.show() + if args.save_plot and args.hideplot: + plot.savefig(f"{pair.replace('-', '_')}_{args.save_plot}") if args.action == "plot": if args.cobis: From f81237efc0cd1873f47cfe176407d7fbdc859b13 Mon Sep 17 00:00:00 2001 From: naik-aakash Date: Sun, 5 Jan 2025 11:09:19 +0100 Subject: [PATCH 09/30] add cli tests for bwdf plots --- tests/cli/test_cli.py | 7 +- tests/test_data/cli-reference.json | 5099 +++++++++++++++++++++++++++- 2 files changed, 5103 insertions(+), 3 deletions(-) diff --git a/tests/cli/test_cli.py b/tests/cli/test_cli.py index d50b613e..aadc4a3f 100644 --- a/tests/cli/test_cli.py +++ b/tests/cli/test_cli.py @@ -42,6 +42,11 @@ ["plot", "1", "--sigma", "1.2"], ["plot", "1", "--fwhm", "1"], ["plot-icohp-distance", "-cbonds"], + ["plot-bwdf"], + ["plot-bwdf", "--sigma", "0.1"], + ["plot-bwdf", "-norm", "counts"], + ["plotbwdf", "-binwidth", "0.02"], + ["plotbwdf", "-siteindex", "0"], ] error_test_cases = [ @@ -725,7 +730,7 @@ def assert_is_finite_file(path: Path) -> None: assert path.is_file() assert path.stat().st_size > 0 - @pytest.mark.skip(reason="Only enable this test to regenerate test data") + @pytest.mark.skip(reason="Only enable this test to regenerate cli plots test data") def test_generate_ref_data(self, inject_mocks): json_data = {} diff --git a/tests/test_data/cli-reference.json b/tests/test_data/cli-reference.json index 2bbc967b..acb4d491 100644 --- a/tests/test_data/cli-reference.json +++ b/tests/test_data/cli-reference.json @@ -55240,7 +55240,7 @@ }, "stdout": "" }, - "plot-icohp-distance -cbonds": { + "plot-bwdf": { "plot": { "facecolor": [ 1.0, @@ -55252,7 +55252,5102 @@ 12.0, 8.0 ], - "xydata": [] + "xydata": [ + [ + [ + 0.01, + -0.0 + ], + [ + 0.03, + -0.0 + ], + [ + 0.05, + -0.0 + ], + [ + 0.06999999999999999, + -0.0 + ], + [ + 0.09, + -0.0 + ], + [ + 0.11, + -0.0 + ], + [ + 0.13, + -0.0 + ], + [ + 0.15000000000000002, + -0.0 + ], + [ + 0.17, + -0.0 + ], + [ + 0.19, + -0.0 + ], + [ + 0.21000000000000002, + -0.0 + ], + [ + 0.23, + -0.0 + ], + [ + 0.25, + -0.0 + ], + [ + 0.27, + -0.0 + ], + [ + 0.29000000000000004, + -0.0 + ], + [ + 0.31, + -0.0 + ], + [ + 0.33, + -0.0 + ], + [ + 0.35000000000000003, + -0.0 + ], + [ + 0.37, + -0.0 + ], + [ + 0.39, + -0.0 + ], + [ + 0.41000000000000003, + -0.0 + ], + [ + 0.43, + -0.0 + ], + [ + 0.45, + -0.0 + ], + [ + 0.47000000000000003, + -0.0 + ], + [ + 0.49, + -0.0 + ], + [ + 0.51, + -0.0 + ], + [ + 0.53, + -0.0 + ], + [ + 0.55, + -0.0 + ], + [ + 0.5700000000000001, + -0.0 + ], + [ + 0.59, + -0.0 + ], + [ + 0.61, + -0.0 + ], + [ + 0.63, + -0.0 + ], + [ + 0.65, + -0.0 + ], + [ + 0.67, + -0.0 + ], + [ + 0.6900000000000001, + -0.0 + ], + [ + 0.71, + -0.0 + ], + [ + 0.73, + -0.0 + ], + [ + 0.75, + -0.0 + ], + [ + 0.77, + -0.0 + ], + [ + 0.79, + -0.0 + ], + [ + 0.81, + -0.0 + ], + [ + 0.83, + -0.0 + ], + [ + 0.85, + -0.0 + ], + [ + 0.87, + -0.0 + ], + [ + 0.89, + -0.0 + ], + [ + 0.91, + -0.0 + ], + [ + 0.93, + -0.0 + ], + [ + 0.95, + -0.0 + ], + [ + 0.97, + -0.0 + ], + [ + 0.99, + -0.0 + ], + [ + 1.01, + -0.0 + ], + [ + 1.03, + -0.0 + ], + [ + 1.05, + -0.0 + ], + [ + 1.07, + -0.0 + ], + [ + 1.09, + -0.0 + ], + [ + 1.11, + -0.0 + ], + [ + 1.1300000000000001, + -0.0 + ], + [ + 1.15, + -0.0 + ], + [ + 1.17, + -0.0 + ], + [ + 1.19, + -0.0 + ], + [ + 1.21, + -0.0 + ], + [ + 1.23, + -0.0 + ], + [ + 1.25, + -0.0 + ], + [ + 1.27, + -0.0 + ], + [ + 1.29, + -0.0 + ], + [ + 1.31, + -0.0 + ], + [ + 1.33, + -0.0 + ], + [ + 1.35, + -0.0 + ], + [ + 1.37, + -0.0 + ], + [ + 1.39, + -0.0 + ], + [ + 1.41, + -0.0 + ], + [ + 1.43, + -0.0 + ], + [ + 1.45, + -0.0 + ], + [ + 1.47, + -0.0 + ], + [ + 1.49, + -0.0 + ], + [ + 1.51, + -0.0 + ], + [ + 1.53, + -0.0 + ], + [ + 1.55, + -0.0 + ], + [ + 1.57, + -0.0 + ], + [ + 1.59, + -0.0 + ], + [ + 1.61, + -0.0 + ], + [ + 1.6300000000000001, + -0.0 + ], + [ + 1.65, + -0.0 + ], + [ + 1.67, + -0.0 + ], + [ + 1.69, + -0.0 + ], + [ + 1.71, + -0.0 + ], + [ + 1.73, + -0.0 + ], + [ + 1.75, + -0.0 + ], + [ + 1.77, + -0.0 + ], + [ + 1.79, + -0.0 + ], + [ + 1.81, + -0.0 + ], + [ + 1.83, + -0.0 + ], + [ + 1.85, + -0.0 + ], + [ + 1.87, + -0.0 + ], + [ + 1.89, + -0.0 + ], + [ + 1.91, + -0.0 + ], + [ + 1.93, + -0.0 + ], + [ + 1.95, + -0.0 + ], + [ + 1.97, + -0.0 + ], + [ + 1.99, + -0.0 + ], + [ + 2.01, + -0.0 + ], + [ + 2.03, + -0.0 + ], + [ + 2.05, + -0.0 + ], + [ + 2.07, + -0.0 + ], + [ + 2.09, + -0.0 + ], + [ + 2.11, + -0.0 + ], + [ + 2.13, + -0.0 + ], + [ + 2.15, + -0.0 + ], + [ + 2.17, + -0.0 + ], + [ + 2.19, + -0.0 + ], + [ + 2.21, + -0.0 + ], + [ + 2.23, + -0.0 + ], + [ + 2.25, + -0.0 + ], + [ + 2.2699999999999996, + -0.0 + ], + [ + 2.2899999999999996, + -0.0 + ], + [ + 2.3099999999999996, + -0.0 + ], + [ + 2.3299999999999996, + -0.0 + ], + [ + 2.3499999999999996, + -0.0 + ], + [ + 2.3699999999999997, + -0.0 + ], + [ + 2.3899999999999997, + -0.0 + ], + [ + 2.4099999999999997, + -0.0 + ], + [ + 2.4299999999999997, + -0.0 + ], + [ + 2.4499999999999997, + -0.0 + ], + [ + 2.4699999999999998, + -0.0 + ], + [ + 2.4899999999999998, + -0.0 + ], + [ + 2.51, + -0.0 + ], + [ + 2.53, + -0.0 + ], + [ + 2.55, + -0.0 + ], + [ + 2.57, + -0.0 + ], + [ + 2.59, + -0.0 + ], + [ + 2.61, + -0.0 + ], + [ + 2.63, + -0.0 + ], + [ + 2.65, + -0.0 + ], + [ + 2.67, + -0.0 + ], + [ + 2.69, + -0.0 + ], + [ + 2.71, + -0.0 + ], + [ + 2.73, + -0.0 + ], + [ + 2.75, + -0.0 + ], + [ + 2.7699999999999996, + -0.0 + ], + [ + 2.7899999999999996, + -0.0 + ], + [ + 2.8099999999999996, + -0.0 + ], + [ + 2.8299999999999996, + -0.0 + ], + [ + 2.8499999999999996, + 6.78468 + ], + [ + 2.8699999999999997, + -0.0 + ], + [ + 2.8899999999999997, + -0.0 + ], + [ + 2.9099999999999997, + -0.0 + ], + [ + 2.9299999999999997, + -0.0 + ], + [ + 2.9499999999999997, + -0.0 + ], + [ + 2.9699999999999998, + -0.0 + ], + [ + 2.9899999999999998, + -0.0 + ], + [ + 3.01, + -0.0 + ], + [ + 3.03, + -0.0 + ], + [ + 3.05, + -0.0 + ], + [ + 3.07, + -0.0 + ], + [ + 3.09, + -0.0 + ], + [ + 3.11, + -0.0 + ], + [ + 3.13, + -0.0 + ], + [ + 3.15, + -0.0 + ], + [ + 3.17, + -0.0 + ], + [ + 3.19, + -0.0 + ], + [ + 3.21, + -0.0 + ], + [ + 3.23, + -0.0 + ], + [ + 3.25, + -0.0 + ], + [ + 3.2699999999999996, + -0.0 + ], + [ + 3.2899999999999996, + -0.0 + ], + [ + 3.3099999999999996, + -0.0 + ], + [ + 3.3299999999999996, + -0.0 + ], + [ + 3.3499999999999996, + -0.0 + ], + [ + 3.3699999999999997, + -0.0 + ], + [ + 3.3899999999999997, + -0.0 + ], + [ + 3.4099999999999997, + -0.0 + ], + [ + 3.4299999999999997, + -0.0 + ], + [ + 3.4499999999999997, + -0.0 + ], + [ + 3.4699999999999998, + -0.0 + ], + [ + 3.4899999999999998, + -0.0 + ], + [ + 3.51, + -0.0 + ], + [ + 3.53, + -0.0 + ], + [ + 3.55, + -0.0 + ], + [ + 3.57, + -0.0 + ], + [ + 3.59, + -0.0 + ], + [ + 3.61, + -0.0 + ], + [ + 3.63, + -0.0 + ], + [ + 3.65, + -0.0 + ], + [ + 3.67, + -0.0 + ], + [ + 3.69, + -0.0 + ], + [ + 3.71, + -0.0 + ], + [ + 3.73, + -0.0 + ], + [ + 3.75, + -0.0 + ], + [ + 3.7699999999999996, + -0.0 + ], + [ + 3.7899999999999996, + -0.0 + ], + [ + 3.8099999999999996, + -0.0 + ], + [ + 3.8299999999999996, + -0.0 + ], + [ + 3.8499999999999996, + -0.0 + ], + [ + 3.8699999999999997, + -0.0 + ], + [ + 3.8899999999999997, + -0.0 + ], + [ + 3.9099999999999997, + -0.0 + ], + [ + 3.9299999999999997, + -0.0 + ], + [ + 3.9499999999999997, + -0.0 + ], + [ + 3.9699999999999998, + -0.0 + ], + [ + 3.9899999999999998, + -0.0 + ], + [ + 4.01, + -0.0 + ], + [ + 4.029999999999999, + 0.68946 + ], + [ + 4.05, + -0.0 + ], + [ + 4.069999999999999, + -0.0 + ], + [ + 4.09, + -0.0 + ], + [ + 4.109999999999999, + -0.0 + ], + [ + 4.13, + -0.0 + ], + [ + 4.1499999999999995, + -0.0 + ], + [ + 4.17, + -0.0 + ], + [ + 4.1899999999999995, + -0.0 + ], + [ + 4.21, + -0.0 + ], + [ + 4.2299999999999995, + -0.0 + ], + [ + 4.25, + -0.0 + ], + [ + 4.27, + -0.0 + ], + [ + 4.29, + -0.0 + ], + [ + 4.31, + -0.0 + ], + [ + 4.33, + -0.0 + ], + [ + 4.35, + -0.0 + ], + [ + 4.37, + -0.0 + ], + [ + 4.39, + -0.0 + ], + [ + 4.41, + -0.0 + ], + [ + 4.43, + -0.0 + ], + [ + 4.45, + -0.0 + ], + [ + 4.47, + -0.0 + ], + [ + 4.49, + -0.0 + ], + [ + 4.51, + -0.0 + ], + [ + 4.529999999999999, + -0.0 + ], + [ + 4.55, + -0.0 + ], + [ + 4.569999999999999, + -0.0 + ], + [ + 4.59, + -0.0 + ], + [ + 4.609999999999999, + -0.0 + ], + [ + 4.63, + -0.0 + ], + [ + 4.6499999999999995, + -0.0 + ], + [ + 4.67, + -0.0 + ], + [ + 4.6899999999999995, + -0.0 + ], + [ + 4.71, + -0.0 + ], + [ + 4.7299999999999995, + -0.0 + ], + [ + 4.75, + -0.0 + ], + [ + 4.77, + -0.0 + ], + [ + 4.79, + -0.0 + ], + [ + 4.81, + -0.0 + ], + [ + 4.83, + -0.0 + ], + [ + 4.85, + -0.0 + ], + [ + 4.87, + -0.0 + ], + [ + 4.89, + -0.0 + ], + [ + 4.91, + -0.0 + ], + [ + 4.93, + 0.05649999999999999 + ], + [ + 4.95, + -0.0 + ], + [ + 4.97, + -0.0 + ], + [ + 4.99, + -0.0 + ] + ] + ] + }, + "stdout": "" + }, + "plot-bwdf --sigma 0.1": { + "plot": { + "facecolor": [ + 1.0, + 1.0, + 1.0, + 1.0 + ], + "size": [ + 12.0, + 8.0 + ], + "xydata": [ + [ + [ + 0.01, + 0.0 + ], + [ + 0.03, + 0.0 + ], + [ + 0.05, + 0.0 + ], + [ + 0.06999999999999999, + 0.0 + ], + [ + 0.09, + 0.0 + ], + [ + 0.11, + 0.0 + ], + [ + 0.13, + 0.0 + ], + [ + 0.15000000000000002, + 0.0 + ], + [ + 0.17, + 0.0 + ], + [ + 0.19, + 0.0 + ], + [ + 0.21000000000000002, + 0.0 + ], + [ + 0.23, + 0.0 + ], + [ + 0.25, + 0.0 + ], + [ + 0.27, + 0.0 + ], + [ + 0.29000000000000004, + 0.0 + ], + [ + 0.31, + 0.0 + ], + [ + 0.33, + 0.0 + ], + [ + 0.35000000000000003, + 0.0 + ], + [ + 0.37, + 0.0 + ], + [ + 0.39, + 0.0 + ], + [ + 0.41000000000000003, + 0.0 + ], + [ + 0.43, + 0.0 + ], + [ + 0.45, + 0.0 + ], + [ + 0.47000000000000003, + 0.0 + ], + [ + 0.49, + 0.0 + ], + [ + 0.51, + 0.0 + ], + [ + 0.53, + 0.0 + ], + [ + 0.55, + 0.0 + ], + [ + 0.5700000000000001, + 0.0 + ], + [ + 0.59, + 0.0 + ], + [ + 0.61, + 0.0 + ], + [ + 0.63, + 0.0 + ], + [ + 0.65, + 0.0 + ], + [ + 0.67, + 0.0 + ], + [ + 0.6900000000000001, + 0.0 + ], + [ + 0.71, + 0.0 + ], + [ + 0.73, + 0.0 + ], + [ + 0.75, + 0.0 + ], + [ + 0.77, + 0.0 + ], + [ + 0.79, + 0.0 + ], + [ + 0.81, + 0.0 + ], + [ + 0.83, + 0.0 + ], + [ + 0.85, + 0.0 + ], + [ + 0.87, + 0.0 + ], + [ + 0.89, + 0.0 + ], + [ + 0.91, + 0.0 + ], + [ + 0.93, + 0.0 + ], + [ + 0.95, + 0.0 + ], + [ + 0.97, + 0.0 + ], + [ + 0.99, + 0.0 + ], + [ + 1.01, + 0.0 + ], + [ + 1.03, + 0.0 + ], + [ + 1.05, + 0.0 + ], + [ + 1.07, + 0.0 + ], + [ + 1.09, + 0.0 + ], + [ + 1.11, + 0.0 + ], + [ + 1.1300000000000001, + 0.0 + ], + [ + 1.15, + 0.0 + ], + [ + 1.17, + 0.0 + ], + [ + 1.19, + 0.0 + ], + [ + 1.21, + 0.0 + ], + [ + 1.23, + 0.0 + ], + [ + 1.25, + 0.0 + ], + [ + 1.27, + 0.0 + ], + [ + 1.29, + 0.0 + ], + [ + 1.31, + 0.0 + ], + [ + 1.33, + 0.0 + ], + [ + 1.35, + 0.0 + ], + [ + 1.37, + 0.0 + ], + [ + 1.39, + 0.0 + ], + [ + 1.41, + 0.0 + ], + [ + 1.43, + 0.0 + ], + [ + 1.45, + 0.0 + ], + [ + 1.47, + 0.0 + ], + [ + 1.49, + 0.0 + ], + [ + 1.51, + 0.0 + ], + [ + 1.53, + 0.0 + ], + [ + 1.55, + 0.0 + ], + [ + 1.57, + 0.0 + ], + [ + 1.59, + 0.0 + ], + [ + 1.61, + 0.0 + ], + [ + 1.6300000000000001, + 0.0 + ], + [ + 1.65, + 0.0 + ], + [ + 1.67, + 0.0 + ], + [ + 1.69, + 0.0 + ], + [ + 1.71, + 0.0 + ], + [ + 1.73, + 0.0 + ], + [ + 1.75, + 0.0 + ], + [ + 1.77, + 0.0 + ], + [ + 1.79, + 0.0 + ], + [ + 1.81, + 0.0 + ], + [ + 1.83, + 0.0 + ], + [ + 1.85, + 0.0 + ], + [ + 1.87, + 0.0 + ], + [ + 1.89, + 0.0 + ], + [ + 1.91, + 0.0 + ], + [ + 1.93, + 0.0 + ], + [ + 1.95, + 0.0 + ], + [ + 1.97, + 0.0 + ], + [ + 1.99, + 0.0 + ], + [ + 2.01, + 0.0 + ], + [ + 2.03, + 0.0 + ], + [ + 2.05, + 0.0 + ], + [ + 2.07, + 0.0 + ], + [ + 2.09, + 0.0 + ], + [ + 2.11, + 0.0 + ], + [ + 2.13, + 0.0 + ], + [ + 2.15, + 0.0 + ], + [ + 2.17, + 0.0 + ], + [ + 2.19, + 0.0 + ], + [ + 2.21, + 0.0 + ], + [ + 2.23, + 0.0 + ], + [ + 2.25, + 0.0 + ], + [ + 2.2699999999999996, + 0.0 + ], + [ + 2.2899999999999996, + 0.0 + ], + [ + 2.3099999999999996, + 0.0 + ], + [ + 2.3299999999999996, + 0.0 + ], + [ + 2.3499999999999996, + 0.0 + ], + [ + 2.3699999999999997, + 0.0 + ], + [ + 2.3899999999999997, + 0.0 + ], + [ + 2.4099999999999997, + 0.0 + ], + [ + 2.4299999999999997, + 0.0 + ], + [ + 2.4499999999999997, + 0.0 + ], + [ + 2.4699999999999998, + 0.0001970152274695678 + ], + [ + 2.4899999999999998, + 0.0004297832546056816 + ], + [ + 2.51, + 0.0009007979868630229 + ], + [ + 2.53, + 0.0018139843849293655 + ], + [ + 2.55, + 0.003509683082686321 + ], + [ + 2.57, + 0.006524248300399316 + ], + [ + 2.59, + 0.01165255819626901 + ], + [ + 2.61, + 0.019995869826806047 + ], + [ + 2.63, + 0.03296761590960603 + ], + [ + 2.65, + 0.05222314270969713 + ], + [ + 2.67, + 0.0794816155177445 + ], + [ + 2.69, + 0.11622474151493396 + ], + [ + 2.71, + 0.16328967055528293 + ], + [ + 2.73, + 0.2204179999852325 + ], + [ + 2.75, + 0.28586673582354377 + ], + [ + 2.7699999999999996, + 0.3562118875586879 + ], + [ + 2.7899999999999996, + 0.4264630567356551 + ], + [ + 2.8099999999999996, + 0.49054928034358714 + ], + [ + 2.8299999999999996, + 0.5421407985186705 + ], + [ + 2.8499999999999996, + 0.5872941158942511 + ], + [ + 2.8699999999999997, + 0.5756649132404086 + ], + [ + 2.8899999999999997, + 0.5421407985186705 + ], + [ + 2.9099999999999997, + 0.49054928034358714 + ], + [ + 2.9299999999999997, + 0.4264630567356551 + ], + [ + 2.9499999999999997, + 0.3562118875586879 + ], + [ + 2.9699999999999998, + 0.28586673582354377 + ], + [ + 2.9899999999999998, + 0.2204179999852325 + ], + [ + 3.01, + 0.16328967055528293 + ], + [ + 3.03, + 0.11622474151493396 + ], + [ + 3.05, + 0.0794816155177445 + ], + [ + 3.07, + 0.05222314270969713 + ], + [ + 3.09, + 0.03296761590960603 + ], + [ + 3.11, + 0.019995869826806047 + ], + [ + 3.13, + 0.01165255819626901 + ], + [ + 3.15, + 0.006524248300399316 + ], + [ + 3.17, + 0.003509683082686321 + ], + [ + 3.19, + 0.0018139843849293655 + ], + [ + 3.21, + 0.0009007979868630229 + ], + [ + 3.23, + 0.0004297832546056816 + ], + [ + 3.25, + 0.0001970152274695678 + ], + [ + 3.2699999999999996, + 0.0 + ], + [ + 3.2899999999999996, + 0.0 + ], + [ + 3.3099999999999996, + 0.0 + ], + [ + 3.3299999999999996, + 0.0 + ], + [ + 3.3499999999999996, + 0.0 + ], + [ + 3.3699999999999997, + 0.0 + ], + [ + 3.3899999999999997, + 0.0 + ], + [ + 3.4099999999999997, + 0.0 + ], + [ + 3.4299999999999997, + 0.0 + ], + [ + 3.4499999999999997, + 0.0 + ], + [ + 3.4699999999999998, + 0.0 + ], + [ + 3.4899999999999998, + 0.0 + ], + [ + 3.51, + 0.0 + ], + [ + 3.53, + 0.0 + ], + [ + 3.55, + 0.0 + ], + [ + 3.57, + 0.0 + ], + [ + 3.59, + 0.0 + ], + [ + 3.61, + 0.0 + ], + [ + 3.63, + 0.0 + ], + [ + 3.65, + 2.002071118036049e-05 + ], + [ + 3.67, + 4.367462617550617e-05 + ], + [ + 3.69, + 9.153920008350869e-05 + ], + [ + 3.71, + 0.00018433731200784715 + ], + [ + 3.73, + 0.00035665441821705824 + ], + [ + 3.75, + 0.0006629948992720826 + ], + [ + 3.7699999999999996, + 0.0011841343694912112 + ], + [ + 3.7899999999999996, + 0.00203198270379586 + ], + [ + 3.8099999999999996, + 0.0033501731054429934 + ], + [ + 3.8299999999999996, + 0.005306922061560424 + ], + [ + 3.8499999999999996, + 0.008076931356359346 + ], + [ + 3.8699999999999997, + 0.011810772252322344 + ], + [ + 3.8899999999999997, + 0.016593516018595628 + ], + [ + 3.9099999999999997, + 0.022398903746354788 + ], + [ + 3.9299999999999997, + 0.029049812176978208 + ], + [ + 3.9499999999999997, + 0.03619829498166648 + ], + [ + 3.9699999999999998, + 0.0433372272674562 + ], + [ + 3.9899999999999998, + 0.04984967704087585 + ], + [ + 4.01, + 0.0550924133410393 + ], + [ + 4.029999999999999, + 0.05968089889935123 + ], + [ + 4.05, + 0.05849913792289866 + ], + [ + 4.069999999999999, + 0.0550924133410393 + ], + [ + 4.09, + 0.04984967704087585 + ], + [ + 4.109999999999999, + 0.0433372272674562 + ], + [ + 4.13, + 0.03619829498166648 + ], + [ + 4.1499999999999995, + 0.029049812176978208 + ], + [ + 4.17, + 0.022398903746354788 + ], + [ + 4.1899999999999995, + 0.016593516018595628 + ], + [ + 4.21, + 0.011810772252322344 + ], + [ + 4.2299999999999995, + 0.008076931356359346 + ], + [ + 4.25, + 0.005306922061560424 + ], + [ + 4.27, + 0.0033501731054429934 + ], + [ + 4.29, + 0.00203198270379586 + ], + [ + 4.31, + 0.0011841343694912112 + ], + [ + 4.33, + 0.0006629948992720826 + ], + [ + 4.35, + 0.00035665441821705824 + ], + [ + 4.37, + 0.00018433731200784715 + ], + [ + 4.39, + 9.153920008350869e-05 + ], + [ + 4.41, + 4.367462617550617e-05 + ], + [ + 4.43, + 2.002071118036049e-05 + ], + [ + 4.45, + 0.0 + ], + [ + 4.47, + 0.0 + ], + [ + 4.49, + 0.0 + ], + [ + 4.51, + 0.0 + ], + [ + 4.529999999999999, + 0.0 + ], + [ + 4.55, + 1.640661070533994e-06 + ], + [ + 4.569999999999999, + 3.5790566224524966e-06 + ], + [ + 4.59, + 7.501471883384446e-06 + ], + [ + 4.609999999999999, + 1.5106109315179071e-05 + ], + [ + 4.63, + 2.922718450564759e-05 + ], + [ + 4.6499999999999995, + 5.433123286176523e-05 + ], + [ + 4.67, + 9.703766988114383e-05 + ], + [ + 4.6899999999999995, + 0.0001665173074064718 + ], + [ + 4.71, + 0.0002745406266607622 + ], + [ + 4.7299999999999995, + 0.0004348926645173961 + ], + [ + 4.75, + 0.0006618899162160284 + ], + [ + 4.77, + 0.0009678714243846088 + ], + [ + 4.79, + 0.0013598086256645095 + ], + [ + 4.81, + 0.0018355496499710573 + ], + [ + 4.83, + 0.002380579566616291 + ], + [ + 4.85, + 0.0029663848032723517 + ], + [ + 4.87, + 0.0035514073921783353 + ], + [ + 4.89, + 0.004085090872290612 + ], + [ + 4.91, + 0.0045147236297518635 + ], + [ + 4.93, + 0.004890741722236741 + ], + [ + 4.95, + 0.0047938985476224496 + ], + [ + 4.97, + 0.0045147236297518635 + ], + [ + 4.99, + 0.004085090872290612 + ] + ] + ] + }, + "stdout": "" + }, + "plot-bwdf -norm counts": { + "plot": { + "facecolor": [ + 1.0, + 1.0, + 1.0, + 1.0 + ], + "size": [ + 12.0, + 8.0 + ], + "xydata": [ + [ + [ + 0.01, + -0.0 + ], + [ + 0.03, + -0.0 + ], + [ + 0.05, + -0.0 + ], + [ + 0.06999999999999999, + -0.0 + ], + [ + 0.09, + -0.0 + ], + [ + 0.11, + -0.0 + ], + [ + 0.13, + -0.0 + ], + [ + 0.15000000000000002, + -0.0 + ], + [ + 0.17, + -0.0 + ], + [ + 0.19, + -0.0 + ], + [ + 0.21000000000000002, + -0.0 + ], + [ + 0.23, + -0.0 + ], + [ + 0.25, + -0.0 + ], + [ + 0.27, + -0.0 + ], + [ + 0.29000000000000004, + -0.0 + ], + [ + 0.31, + -0.0 + ], + [ + 0.33, + -0.0 + ], + [ + 0.35000000000000003, + -0.0 + ], + [ + 0.37, + -0.0 + ], + [ + 0.39, + -0.0 + ], + [ + 0.41000000000000003, + -0.0 + ], + [ + 0.43, + -0.0 + ], + [ + 0.45, + -0.0 + ], + [ + 0.47000000000000003, + -0.0 + ], + [ + 0.49, + -0.0 + ], + [ + 0.51, + -0.0 + ], + [ + 0.53, + -0.0 + ], + [ + 0.55, + -0.0 + ], + [ + 0.5700000000000001, + -0.0 + ], + [ + 0.59, + -0.0 + ], + [ + 0.61, + -0.0 + ], + [ + 0.63, + -0.0 + ], + [ + 0.65, + -0.0 + ], + [ + 0.67, + -0.0 + ], + [ + 0.6900000000000001, + -0.0 + ], + [ + 0.71, + -0.0 + ], + [ + 0.73, + -0.0 + ], + [ + 0.75, + -0.0 + ], + [ + 0.77, + -0.0 + ], + [ + 0.79, + -0.0 + ], + [ + 0.81, + -0.0 + ], + [ + 0.83, + -0.0 + ], + [ + 0.85, + -0.0 + ], + [ + 0.87, + -0.0 + ], + [ + 0.89, + -0.0 + ], + [ + 0.91, + -0.0 + ], + [ + 0.93, + -0.0 + ], + [ + 0.95, + -0.0 + ], + [ + 0.97, + -0.0 + ], + [ + 0.99, + -0.0 + ], + [ + 1.01, + -0.0 + ], + [ + 1.03, + -0.0 + ], + [ + 1.05, + -0.0 + ], + [ + 1.07, + -0.0 + ], + [ + 1.09, + -0.0 + ], + [ + 1.11, + -0.0 + ], + [ + 1.1300000000000001, + -0.0 + ], + [ + 1.15, + -0.0 + ], + [ + 1.17, + -0.0 + ], + [ + 1.19, + -0.0 + ], + [ + 1.21, + -0.0 + ], + [ + 1.23, + -0.0 + ], + [ + 1.25, + -0.0 + ], + [ + 1.27, + -0.0 + ], + [ + 1.29, + -0.0 + ], + [ + 1.31, + -0.0 + ], + [ + 1.33, + -0.0 + ], + [ + 1.35, + -0.0 + ], + [ + 1.37, + -0.0 + ], + [ + 1.39, + -0.0 + ], + [ + 1.41, + -0.0 + ], + [ + 1.43, + -0.0 + ], + [ + 1.45, + -0.0 + ], + [ + 1.47, + -0.0 + ], + [ + 1.49, + -0.0 + ], + [ + 1.51, + -0.0 + ], + [ + 1.53, + -0.0 + ], + [ + 1.55, + -0.0 + ], + [ + 1.57, + -0.0 + ], + [ + 1.59, + -0.0 + ], + [ + 1.61, + -0.0 + ], + [ + 1.6300000000000001, + -0.0 + ], + [ + 1.65, + -0.0 + ], + [ + 1.67, + -0.0 + ], + [ + 1.69, + -0.0 + ], + [ + 1.71, + -0.0 + ], + [ + 1.73, + -0.0 + ], + [ + 1.75, + -0.0 + ], + [ + 1.77, + -0.0 + ], + [ + 1.79, + -0.0 + ], + [ + 1.81, + -0.0 + ], + [ + 1.83, + -0.0 + ], + [ + 1.85, + -0.0 + ], + [ + 1.87, + -0.0 + ], + [ + 1.89, + -0.0 + ], + [ + 1.91, + -0.0 + ], + [ + 1.93, + -0.0 + ], + [ + 1.95, + -0.0 + ], + [ + 1.97, + -0.0 + ], + [ + 1.99, + -0.0 + ], + [ + 2.01, + -0.0 + ], + [ + 2.03, + -0.0 + ], + [ + 2.05, + -0.0 + ], + [ + 2.07, + -0.0 + ], + [ + 2.09, + -0.0 + ], + [ + 2.11, + -0.0 + ], + [ + 2.13, + -0.0 + ], + [ + 2.15, + -0.0 + ], + [ + 2.17, + -0.0 + ], + [ + 2.19, + -0.0 + ], + [ + 2.21, + -0.0 + ], + [ + 2.23, + -0.0 + ], + [ + 2.25, + -0.0 + ], + [ + 2.2699999999999996, + -0.0 + ], + [ + 2.2899999999999996, + -0.0 + ], + [ + 2.3099999999999996, + -0.0 + ], + [ + 2.3299999999999996, + -0.0 + ], + [ + 2.3499999999999996, + -0.0 + ], + [ + 2.3699999999999997, + -0.0 + ], + [ + 2.3899999999999997, + -0.0 + ], + [ + 2.4099999999999997, + -0.0 + ], + [ + 2.4299999999999997, + -0.0 + ], + [ + 2.4499999999999997, + -0.0 + ], + [ + 2.4699999999999998, + -0.0 + ], + [ + 2.4899999999999998, + -0.0 + ], + [ + 2.51, + -0.0 + ], + [ + 2.53, + -0.0 + ], + [ + 2.55, + -0.0 + ], + [ + 2.57, + -0.0 + ], + [ + 2.59, + -0.0 + ], + [ + 2.61, + -0.0 + ], + [ + 2.63, + -0.0 + ], + [ + 2.65, + -0.0 + ], + [ + 2.67, + -0.0 + ], + [ + 2.69, + -0.0 + ], + [ + 2.71, + -0.0 + ], + [ + 2.73, + -0.0 + ], + [ + 2.75, + -0.0 + ], + [ + 2.7699999999999996, + -0.0 + ], + [ + 2.7899999999999996, + -0.0 + ], + [ + 2.8099999999999996, + -0.0 + ], + [ + 2.8299999999999996, + -0.0 + ], + [ + 2.8499999999999996, + 0.56539 + ], + [ + 2.8699999999999997, + -0.0 + ], + [ + 2.8899999999999997, + -0.0 + ], + [ + 2.9099999999999997, + -0.0 + ], + [ + 2.9299999999999997, + -0.0 + ], + [ + 2.9499999999999997, + -0.0 + ], + [ + 2.9699999999999998, + -0.0 + ], + [ + 2.9899999999999998, + -0.0 + ], + [ + 3.01, + -0.0 + ], + [ + 3.03, + -0.0 + ], + [ + 3.05, + -0.0 + ], + [ + 3.07, + -0.0 + ], + [ + 3.09, + -0.0 + ], + [ + 3.11, + -0.0 + ], + [ + 3.13, + -0.0 + ], + [ + 3.15, + -0.0 + ], + [ + 3.17, + -0.0 + ], + [ + 3.19, + -0.0 + ], + [ + 3.21, + -0.0 + ], + [ + 3.23, + -0.0 + ], + [ + 3.25, + -0.0 + ], + [ + 3.2699999999999996, + -0.0 + ], + [ + 3.2899999999999996, + -0.0 + ], + [ + 3.3099999999999996, + -0.0 + ], + [ + 3.3299999999999996, + -0.0 + ], + [ + 3.3499999999999996, + -0.0 + ], + [ + 3.3699999999999997, + -0.0 + ], + [ + 3.3899999999999997, + -0.0 + ], + [ + 3.4099999999999997, + -0.0 + ], + [ + 3.4299999999999997, + -0.0 + ], + [ + 3.4499999999999997, + -0.0 + ], + [ + 3.4699999999999998, + -0.0 + ], + [ + 3.4899999999999998, + -0.0 + ], + [ + 3.51, + -0.0 + ], + [ + 3.53, + -0.0 + ], + [ + 3.55, + -0.0 + ], + [ + 3.57, + -0.0 + ], + [ + 3.59, + -0.0 + ], + [ + 3.61, + -0.0 + ], + [ + 3.63, + -0.0 + ], + [ + 3.65, + -0.0 + ], + [ + 3.67, + -0.0 + ], + [ + 3.69, + -0.0 + ], + [ + 3.71, + -0.0 + ], + [ + 3.73, + -0.0 + ], + [ + 3.75, + -0.0 + ], + [ + 3.7699999999999996, + -0.0 + ], + [ + 3.7899999999999996, + -0.0 + ], + [ + 3.8099999999999996, + -0.0 + ], + [ + 3.8299999999999996, + -0.0 + ], + [ + 3.8499999999999996, + -0.0 + ], + [ + 3.8699999999999997, + -0.0 + ], + [ + 3.8899999999999997, + -0.0 + ], + [ + 3.9099999999999997, + -0.0 + ], + [ + 3.9299999999999997, + -0.0 + ], + [ + 3.9499999999999997, + -0.0 + ], + [ + 3.9699999999999998, + -0.0 + ], + [ + 3.9899999999999998, + -0.0 + ], + [ + 4.01, + -0.0 + ], + [ + 4.029999999999999, + 0.0287275 + ], + [ + 4.05, + -0.0 + ], + [ + 4.069999999999999, + -0.0 + ], + [ + 4.09, + -0.0 + ], + [ + 4.109999999999999, + -0.0 + ], + [ + 4.13, + -0.0 + ], + [ + 4.1499999999999995, + -0.0 + ], + [ + 4.17, + -0.0 + ], + [ + 4.1899999999999995, + -0.0 + ], + [ + 4.21, + -0.0 + ], + [ + 4.2299999999999995, + -0.0 + ], + [ + 4.25, + -0.0 + ], + [ + 4.27, + -0.0 + ], + [ + 4.29, + -0.0 + ], + [ + 4.31, + -0.0 + ], + [ + 4.33, + -0.0 + ], + [ + 4.35, + -0.0 + ], + [ + 4.37, + -0.0 + ], + [ + 4.39, + -0.0 + ], + [ + 4.41, + -0.0 + ], + [ + 4.43, + -0.0 + ], + [ + 4.45, + -0.0 + ], + [ + 4.47, + -0.0 + ], + [ + 4.49, + -0.0 + ], + [ + 4.51, + -0.0 + ], + [ + 4.529999999999999, + -0.0 + ], + [ + 4.55, + -0.0 + ], + [ + 4.569999999999999, + -0.0 + ], + [ + 4.59, + -0.0 + ], + [ + 4.609999999999999, + -0.0 + ], + [ + 4.63, + -0.0 + ], + [ + 4.6499999999999995, + -0.0 + ], + [ + 4.67, + -0.0 + ], + [ + 4.6899999999999995, + -0.0 + ], + [ + 4.71, + -0.0 + ], + [ + 4.7299999999999995, + -0.0 + ], + [ + 4.75, + -0.0 + ], + [ + 4.77, + -0.0 + ], + [ + 4.79, + -0.0 + ], + [ + 4.81, + -0.0 + ], + [ + 4.83, + -0.0 + ], + [ + 4.85, + -0.0 + ], + [ + 4.87, + -0.0 + ], + [ + 4.89, + -0.0 + ], + [ + 4.91, + -0.0 + ], + [ + 4.93, + 0.0035312499999999992 + ], + [ + 4.95, + -0.0 + ], + [ + 4.97, + -0.0 + ], + [ + 4.99, + -0.0 + ] + ] + ] + }, + "stdout": "" + }, + "plot-icohp-distance -cbonds": { + "plot": { + "facecolor": [ + 1.0, + 1.0, + 1.0, + 1.0 + ], + "size": [ + 12.0, + 8.0 + ], + "xydata": [] + }, + "stdout": "" + }, + "plotbwdf -binwidth 0.02": { + "plot": { + "facecolor": [ + 1.0, + 1.0, + 1.0, + 1.0 + ], + "size": [ + 12.0, + 8.0 + ], + "xydata": [ + [ + [ + 0.01, + -0.0 + ], + [ + 0.03, + -0.0 + ], + [ + 0.05, + -0.0 + ], + [ + 0.06999999999999999, + -0.0 + ], + [ + 0.09, + -0.0 + ], + [ + 0.11, + -0.0 + ], + [ + 0.13, + -0.0 + ], + [ + 0.15000000000000002, + -0.0 + ], + [ + 0.17, + -0.0 + ], + [ + 0.19, + -0.0 + ], + [ + 0.21000000000000002, + -0.0 + ], + [ + 0.23, + -0.0 + ], + [ + 0.25, + -0.0 + ], + [ + 0.27, + -0.0 + ], + [ + 0.29000000000000004, + -0.0 + ], + [ + 0.31, + -0.0 + ], + [ + 0.33, + -0.0 + ], + [ + 0.35000000000000003, + -0.0 + ], + [ + 0.37, + -0.0 + ], + [ + 0.39, + -0.0 + ], + [ + 0.41000000000000003, + -0.0 + ], + [ + 0.43, + -0.0 + ], + [ + 0.45, + -0.0 + ], + [ + 0.47000000000000003, + -0.0 + ], + [ + 0.49, + -0.0 + ], + [ + 0.51, + -0.0 + ], + [ + 0.53, + -0.0 + ], + [ + 0.55, + -0.0 + ], + [ + 0.5700000000000001, + -0.0 + ], + [ + 0.59, + -0.0 + ], + [ + 0.61, + -0.0 + ], + [ + 0.63, + -0.0 + ], + [ + 0.65, + -0.0 + ], + [ + 0.67, + -0.0 + ], + [ + 0.6900000000000001, + -0.0 + ], + [ + 0.71, + -0.0 + ], + [ + 0.73, + -0.0 + ], + [ + 0.75, + -0.0 + ], + [ + 0.77, + -0.0 + ], + [ + 0.79, + -0.0 + ], + [ + 0.81, + -0.0 + ], + [ + 0.83, + -0.0 + ], + [ + 0.85, + -0.0 + ], + [ + 0.87, + -0.0 + ], + [ + 0.89, + -0.0 + ], + [ + 0.91, + -0.0 + ], + [ + 0.93, + -0.0 + ], + [ + 0.95, + -0.0 + ], + [ + 0.97, + -0.0 + ], + [ + 0.99, + -0.0 + ], + [ + 1.01, + -0.0 + ], + [ + 1.03, + -0.0 + ], + [ + 1.05, + -0.0 + ], + [ + 1.07, + -0.0 + ], + [ + 1.09, + -0.0 + ], + [ + 1.11, + -0.0 + ], + [ + 1.1300000000000001, + -0.0 + ], + [ + 1.15, + -0.0 + ], + [ + 1.17, + -0.0 + ], + [ + 1.19, + -0.0 + ], + [ + 1.21, + -0.0 + ], + [ + 1.23, + -0.0 + ], + [ + 1.25, + -0.0 + ], + [ + 1.27, + -0.0 + ], + [ + 1.29, + -0.0 + ], + [ + 1.31, + -0.0 + ], + [ + 1.33, + -0.0 + ], + [ + 1.35, + -0.0 + ], + [ + 1.37, + -0.0 + ], + [ + 1.39, + -0.0 + ], + [ + 1.41, + -0.0 + ], + [ + 1.43, + -0.0 + ], + [ + 1.45, + -0.0 + ], + [ + 1.47, + -0.0 + ], + [ + 1.49, + -0.0 + ], + [ + 1.51, + -0.0 + ], + [ + 1.53, + -0.0 + ], + [ + 1.55, + -0.0 + ], + [ + 1.57, + -0.0 + ], + [ + 1.59, + -0.0 + ], + [ + 1.61, + -0.0 + ], + [ + 1.6300000000000001, + -0.0 + ], + [ + 1.65, + -0.0 + ], + [ + 1.67, + -0.0 + ], + [ + 1.69, + -0.0 + ], + [ + 1.71, + -0.0 + ], + [ + 1.73, + -0.0 + ], + [ + 1.75, + -0.0 + ], + [ + 1.77, + -0.0 + ], + [ + 1.79, + -0.0 + ], + [ + 1.81, + -0.0 + ], + [ + 1.83, + -0.0 + ], + [ + 1.85, + -0.0 + ], + [ + 1.87, + -0.0 + ], + [ + 1.89, + -0.0 + ], + [ + 1.91, + -0.0 + ], + [ + 1.93, + -0.0 + ], + [ + 1.95, + -0.0 + ], + [ + 1.97, + -0.0 + ], + [ + 1.99, + -0.0 + ], + [ + 2.01, + -0.0 + ], + [ + 2.03, + -0.0 + ], + [ + 2.05, + -0.0 + ], + [ + 2.07, + -0.0 + ], + [ + 2.09, + -0.0 + ], + [ + 2.11, + -0.0 + ], + [ + 2.13, + -0.0 + ], + [ + 2.15, + -0.0 + ], + [ + 2.17, + -0.0 + ], + [ + 2.19, + -0.0 + ], + [ + 2.21, + -0.0 + ], + [ + 2.23, + -0.0 + ], + [ + 2.25, + -0.0 + ], + [ + 2.2699999999999996, + -0.0 + ], + [ + 2.2899999999999996, + -0.0 + ], + [ + 2.3099999999999996, + -0.0 + ], + [ + 2.3299999999999996, + -0.0 + ], + [ + 2.3499999999999996, + -0.0 + ], + [ + 2.3699999999999997, + -0.0 + ], + [ + 2.3899999999999997, + -0.0 + ], + [ + 2.4099999999999997, + -0.0 + ], + [ + 2.4299999999999997, + -0.0 + ], + [ + 2.4499999999999997, + -0.0 + ], + [ + 2.4699999999999998, + -0.0 + ], + [ + 2.4899999999999998, + -0.0 + ], + [ + 2.51, + -0.0 + ], + [ + 2.53, + -0.0 + ], + [ + 2.55, + -0.0 + ], + [ + 2.57, + -0.0 + ], + [ + 2.59, + -0.0 + ], + [ + 2.61, + -0.0 + ], + [ + 2.63, + -0.0 + ], + [ + 2.65, + -0.0 + ], + [ + 2.67, + -0.0 + ], + [ + 2.69, + -0.0 + ], + [ + 2.71, + -0.0 + ], + [ + 2.73, + -0.0 + ], + [ + 2.75, + -0.0 + ], + [ + 2.7699999999999996, + -0.0 + ], + [ + 2.7899999999999996, + -0.0 + ], + [ + 2.8099999999999996, + -0.0 + ], + [ + 2.8299999999999996, + -0.0 + ], + [ + 2.8499999999999996, + 6.78468 + ], + [ + 2.8699999999999997, + -0.0 + ], + [ + 2.8899999999999997, + -0.0 + ], + [ + 2.9099999999999997, + -0.0 + ], + [ + 2.9299999999999997, + -0.0 + ], + [ + 2.9499999999999997, + -0.0 + ], + [ + 2.9699999999999998, + -0.0 + ], + [ + 2.9899999999999998, + -0.0 + ], + [ + 3.01, + -0.0 + ], + [ + 3.03, + -0.0 + ], + [ + 3.05, + -0.0 + ], + [ + 3.07, + -0.0 + ], + [ + 3.09, + -0.0 + ], + [ + 3.11, + -0.0 + ], + [ + 3.13, + -0.0 + ], + [ + 3.15, + -0.0 + ], + [ + 3.17, + -0.0 + ], + [ + 3.19, + -0.0 + ], + [ + 3.21, + -0.0 + ], + [ + 3.23, + -0.0 + ], + [ + 3.25, + -0.0 + ], + [ + 3.2699999999999996, + -0.0 + ], + [ + 3.2899999999999996, + -0.0 + ], + [ + 3.3099999999999996, + -0.0 + ], + [ + 3.3299999999999996, + -0.0 + ], + [ + 3.3499999999999996, + -0.0 + ], + [ + 3.3699999999999997, + -0.0 + ], + [ + 3.3899999999999997, + -0.0 + ], + [ + 3.4099999999999997, + -0.0 + ], + [ + 3.4299999999999997, + -0.0 + ], + [ + 3.4499999999999997, + -0.0 + ], + [ + 3.4699999999999998, + -0.0 + ], + [ + 3.4899999999999998, + -0.0 + ], + [ + 3.51, + -0.0 + ], + [ + 3.53, + -0.0 + ], + [ + 3.55, + -0.0 + ], + [ + 3.57, + -0.0 + ], + [ + 3.59, + -0.0 + ], + [ + 3.61, + -0.0 + ], + [ + 3.63, + -0.0 + ], + [ + 3.65, + -0.0 + ], + [ + 3.67, + -0.0 + ], + [ + 3.69, + -0.0 + ], + [ + 3.71, + -0.0 + ], + [ + 3.73, + -0.0 + ], + [ + 3.75, + -0.0 + ], + [ + 3.7699999999999996, + -0.0 + ], + [ + 3.7899999999999996, + -0.0 + ], + [ + 3.8099999999999996, + -0.0 + ], + [ + 3.8299999999999996, + -0.0 + ], + [ + 3.8499999999999996, + -0.0 + ], + [ + 3.8699999999999997, + -0.0 + ], + [ + 3.8899999999999997, + -0.0 + ], + [ + 3.9099999999999997, + -0.0 + ], + [ + 3.9299999999999997, + -0.0 + ], + [ + 3.9499999999999997, + -0.0 + ], + [ + 3.9699999999999998, + -0.0 + ], + [ + 3.9899999999999998, + -0.0 + ], + [ + 4.01, + -0.0 + ], + [ + 4.029999999999999, + 0.68946 + ], + [ + 4.05, + -0.0 + ], + [ + 4.069999999999999, + -0.0 + ], + [ + 4.09, + -0.0 + ], + [ + 4.109999999999999, + -0.0 + ], + [ + 4.13, + -0.0 + ], + [ + 4.1499999999999995, + -0.0 + ], + [ + 4.17, + -0.0 + ], + [ + 4.1899999999999995, + -0.0 + ], + [ + 4.21, + -0.0 + ], + [ + 4.2299999999999995, + -0.0 + ], + [ + 4.25, + -0.0 + ], + [ + 4.27, + -0.0 + ], + [ + 4.29, + -0.0 + ], + [ + 4.31, + -0.0 + ], + [ + 4.33, + -0.0 + ], + [ + 4.35, + -0.0 + ], + [ + 4.37, + -0.0 + ], + [ + 4.39, + -0.0 + ], + [ + 4.41, + -0.0 + ], + [ + 4.43, + -0.0 + ], + [ + 4.45, + -0.0 + ], + [ + 4.47, + -0.0 + ], + [ + 4.49, + -0.0 + ], + [ + 4.51, + -0.0 + ], + [ + 4.529999999999999, + -0.0 + ], + [ + 4.55, + -0.0 + ], + [ + 4.569999999999999, + -0.0 + ], + [ + 4.59, + -0.0 + ], + [ + 4.609999999999999, + -0.0 + ], + [ + 4.63, + -0.0 + ], + [ + 4.6499999999999995, + -0.0 + ], + [ + 4.67, + -0.0 + ], + [ + 4.6899999999999995, + -0.0 + ], + [ + 4.71, + -0.0 + ], + [ + 4.7299999999999995, + -0.0 + ], + [ + 4.75, + -0.0 + ], + [ + 4.77, + -0.0 + ], + [ + 4.79, + -0.0 + ], + [ + 4.81, + -0.0 + ], + [ + 4.83, + -0.0 + ], + [ + 4.85, + -0.0 + ], + [ + 4.87, + -0.0 + ], + [ + 4.89, + -0.0 + ], + [ + 4.91, + -0.0 + ], + [ + 4.93, + 0.05649999999999999 + ], + [ + 4.95, + -0.0 + ], + [ + 4.97, + -0.0 + ], + [ + 4.99, + -0.0 + ] + ] + ] + }, + "stdout": "" + }, + "plotbwdf -siteindex 0": { + "plot": { + "facecolor": [ + 1.0, + 1.0, + 1.0, + 1.0 + ], + "size": [ + 12.0, + 8.0 + ], + "xydata": [ + [ + [ + 0.01, + -0.0 + ], + [ + 0.03, + -0.0 + ], + [ + 0.05, + -0.0 + ], + [ + 0.06999999999999999, + -0.0 + ], + [ + 0.09, + -0.0 + ], + [ + 0.11, + -0.0 + ], + [ + 0.13, + -0.0 + ], + [ + 0.15000000000000002, + -0.0 + ], + [ + 0.17, + -0.0 + ], + [ + 0.19, + -0.0 + ], + [ + 0.21000000000000002, + -0.0 + ], + [ + 0.23, + -0.0 + ], + [ + 0.25, + -0.0 + ], + [ + 0.27, + -0.0 + ], + [ + 0.29000000000000004, + -0.0 + ], + [ + 0.31, + -0.0 + ], + [ + 0.33, + -0.0 + ], + [ + 0.35000000000000003, + -0.0 + ], + [ + 0.37, + -0.0 + ], + [ + 0.39, + -0.0 + ], + [ + 0.41000000000000003, + -0.0 + ], + [ + 0.43, + -0.0 + ], + [ + 0.45, + -0.0 + ], + [ + 0.47000000000000003, + -0.0 + ], + [ + 0.49, + -0.0 + ], + [ + 0.51, + -0.0 + ], + [ + 0.53, + -0.0 + ], + [ + 0.55, + -0.0 + ], + [ + 0.5700000000000001, + -0.0 + ], + [ + 0.59, + -0.0 + ], + [ + 0.61, + -0.0 + ], + [ + 0.63, + -0.0 + ], + [ + 0.65, + -0.0 + ], + [ + 0.67, + -0.0 + ], + [ + 0.6900000000000001, + -0.0 + ], + [ + 0.71, + -0.0 + ], + [ + 0.73, + -0.0 + ], + [ + 0.75, + -0.0 + ], + [ + 0.77, + -0.0 + ], + [ + 0.79, + -0.0 + ], + [ + 0.81, + -0.0 + ], + [ + 0.83, + -0.0 + ], + [ + 0.85, + -0.0 + ], + [ + 0.87, + -0.0 + ], + [ + 0.89, + -0.0 + ], + [ + 0.91, + -0.0 + ], + [ + 0.93, + -0.0 + ], + [ + 0.95, + -0.0 + ], + [ + 0.97, + -0.0 + ], + [ + 0.99, + -0.0 + ], + [ + 1.01, + -0.0 + ], + [ + 1.03, + -0.0 + ], + [ + 1.05, + -0.0 + ], + [ + 1.07, + -0.0 + ], + [ + 1.09, + -0.0 + ], + [ + 1.11, + -0.0 + ], + [ + 1.1300000000000001, + -0.0 + ], + [ + 1.15, + -0.0 + ], + [ + 1.17, + -0.0 + ], + [ + 1.19, + -0.0 + ], + [ + 1.21, + -0.0 + ], + [ + 1.23, + -0.0 + ], + [ + 1.25, + -0.0 + ], + [ + 1.27, + -0.0 + ], + [ + 1.29, + -0.0 + ], + [ + 1.31, + -0.0 + ], + [ + 1.33, + -0.0 + ], + [ + 1.35, + -0.0 + ], + [ + 1.37, + -0.0 + ], + [ + 1.39, + -0.0 + ], + [ + 1.41, + -0.0 + ], + [ + 1.43, + -0.0 + ], + [ + 1.45, + -0.0 + ], + [ + 1.47, + -0.0 + ], + [ + 1.49, + -0.0 + ], + [ + 1.51, + -0.0 + ], + [ + 1.53, + -0.0 + ], + [ + 1.55, + -0.0 + ], + [ + 1.57, + -0.0 + ], + [ + 1.59, + -0.0 + ], + [ + 1.61, + -0.0 + ], + [ + 1.6300000000000001, + -0.0 + ], + [ + 1.65, + -0.0 + ], + [ + 1.67, + -0.0 + ], + [ + 1.69, + -0.0 + ], + [ + 1.71, + -0.0 + ], + [ + 1.73, + -0.0 + ], + [ + 1.75, + -0.0 + ], + [ + 1.77, + -0.0 + ], + [ + 1.79, + -0.0 + ], + [ + 1.81, + -0.0 + ], + [ + 1.83, + -0.0 + ], + [ + 1.85, + -0.0 + ], + [ + 1.87, + -0.0 + ], + [ + 1.89, + -0.0 + ], + [ + 1.91, + -0.0 + ], + [ + 1.93, + -0.0 + ], + [ + 1.95, + -0.0 + ], + [ + 1.97, + -0.0 + ], + [ + 1.99, + -0.0 + ], + [ + 2.01, + -0.0 + ], + [ + 2.03, + -0.0 + ], + [ + 2.05, + -0.0 + ], + [ + 2.07, + -0.0 + ], + [ + 2.09, + -0.0 + ], + [ + 2.11, + -0.0 + ], + [ + 2.13, + -0.0 + ], + [ + 2.15, + -0.0 + ], + [ + 2.17, + -0.0 + ], + [ + 2.19, + -0.0 + ], + [ + 2.21, + -0.0 + ], + [ + 2.23, + -0.0 + ], + [ + 2.25, + -0.0 + ], + [ + 2.2699999999999996, + -0.0 + ], + [ + 2.2899999999999996, + -0.0 + ], + [ + 2.3099999999999996, + -0.0 + ], + [ + 2.3299999999999996, + -0.0 + ], + [ + 2.3499999999999996, + -0.0 + ], + [ + 2.3699999999999997, + -0.0 + ], + [ + 2.3899999999999997, + -0.0 + ], + [ + 2.4099999999999997, + -0.0 + ], + [ + 2.4299999999999997, + -0.0 + ], + [ + 2.4499999999999997, + -0.0 + ], + [ + 2.4699999999999998, + -0.0 + ], + [ + 2.4899999999999998, + -0.0 + ], + [ + 2.51, + -0.0 + ], + [ + 2.53, + -0.0 + ], + [ + 2.55, + -0.0 + ], + [ + 2.57, + -0.0 + ], + [ + 2.59, + -0.0 + ], + [ + 2.61, + -0.0 + ], + [ + 2.63, + -0.0 + ], + [ + 2.65, + -0.0 + ], + [ + 2.67, + -0.0 + ], + [ + 2.69, + -0.0 + ], + [ + 2.71, + -0.0 + ], + [ + 2.73, + -0.0 + ], + [ + 2.75, + -0.0 + ], + [ + 2.7699999999999996, + -0.0 + ], + [ + 2.7899999999999996, + -0.0 + ], + [ + 2.8099999999999996, + -0.0 + ], + [ + 2.8299999999999996, + -0.0 + ], + [ + 2.8499999999999996, + 6.78468 + ], + [ + 2.8699999999999997, + -0.0 + ], + [ + 2.8899999999999997, + -0.0 + ], + [ + 2.9099999999999997, + -0.0 + ], + [ + 2.9299999999999997, + -0.0 + ], + [ + 2.9499999999999997, + -0.0 + ], + [ + 2.9699999999999998, + -0.0 + ], + [ + 2.9899999999999998, + -0.0 + ], + [ + 3.01, + -0.0 + ], + [ + 3.03, + -0.0 + ], + [ + 3.05, + -0.0 + ], + [ + 3.07, + -0.0 + ], + [ + 3.09, + -0.0 + ], + [ + 3.11, + -0.0 + ], + [ + 3.13, + -0.0 + ], + [ + 3.15, + -0.0 + ], + [ + 3.17, + -0.0 + ], + [ + 3.19, + -0.0 + ], + [ + 3.21, + -0.0 + ], + [ + 3.23, + -0.0 + ], + [ + 3.25, + -0.0 + ], + [ + 3.2699999999999996, + -0.0 + ], + [ + 3.2899999999999996, + -0.0 + ], + [ + 3.3099999999999996, + -0.0 + ], + [ + 3.3299999999999996, + -0.0 + ], + [ + 3.3499999999999996, + -0.0 + ], + [ + 3.3699999999999997, + -0.0 + ], + [ + 3.3899999999999997, + -0.0 + ], + [ + 3.4099999999999997, + -0.0 + ], + [ + 3.4299999999999997, + -0.0 + ], + [ + 3.4499999999999997, + -0.0 + ], + [ + 3.4699999999999998, + -0.0 + ], + [ + 3.4899999999999998, + -0.0 + ], + [ + 3.51, + -0.0 + ], + [ + 3.53, + -0.0 + ], + [ + 3.55, + -0.0 + ], + [ + 3.57, + -0.0 + ], + [ + 3.59, + -0.0 + ], + [ + 3.61, + -0.0 + ], + [ + 3.63, + -0.0 + ], + [ + 3.65, + -0.0 + ], + [ + 3.67, + -0.0 + ], + [ + 3.69, + -0.0 + ], + [ + 3.71, + -0.0 + ], + [ + 3.73, + -0.0 + ], + [ + 3.75, + -0.0 + ], + [ + 3.7699999999999996, + -0.0 + ], + [ + 3.7899999999999996, + -0.0 + ], + [ + 3.8099999999999996, + -0.0 + ], + [ + 3.8299999999999996, + -0.0 + ], + [ + 3.8499999999999996, + -0.0 + ], + [ + 3.8699999999999997, + -0.0 + ], + [ + 3.8899999999999997, + -0.0 + ], + [ + 3.9099999999999997, + -0.0 + ], + [ + 3.9299999999999997, + -0.0 + ], + [ + 3.9499999999999997, + -0.0 + ], + [ + 3.9699999999999998, + -0.0 + ], + [ + 3.9899999999999998, + -0.0 + ], + [ + 4.01, + -0.0 + ], + [ + 4.029999999999999, + 0.68946 + ], + [ + 4.05, + -0.0 + ], + [ + 4.069999999999999, + -0.0 + ], + [ + 4.09, + -0.0 + ], + [ + 4.109999999999999, + -0.0 + ], + [ + 4.13, + -0.0 + ], + [ + 4.1499999999999995, + -0.0 + ], + [ + 4.17, + -0.0 + ], + [ + 4.1899999999999995, + -0.0 + ], + [ + 4.21, + -0.0 + ], + [ + 4.2299999999999995, + -0.0 + ], + [ + 4.25, + -0.0 + ], + [ + 4.27, + -0.0 + ], + [ + 4.29, + -0.0 + ], + [ + 4.31, + -0.0 + ], + [ + 4.33, + -0.0 + ], + [ + 4.35, + -0.0 + ], + [ + 4.37, + -0.0 + ], + [ + 4.39, + -0.0 + ], + [ + 4.41, + -0.0 + ], + [ + 4.43, + -0.0 + ], + [ + 4.45, + -0.0 + ], + [ + 4.47, + -0.0 + ], + [ + 4.49, + -0.0 + ], + [ + 4.51, + -0.0 + ], + [ + 4.529999999999999, + -0.0 + ], + [ + 4.55, + -0.0 + ], + [ + 4.569999999999999, + -0.0 + ], + [ + 4.59, + -0.0 + ], + [ + 4.609999999999999, + -0.0 + ], + [ + 4.63, + -0.0 + ], + [ + 4.6499999999999995, + -0.0 + ], + [ + 4.67, + -0.0 + ], + [ + 4.6899999999999995, + -0.0 + ], + [ + 4.71, + -0.0 + ], + [ + 4.7299999999999995, + -0.0 + ], + [ + 4.75, + -0.0 + ], + [ + 4.77, + -0.0 + ], + [ + 4.79, + -0.0 + ], + [ + 4.81, + -0.0 + ], + [ + 4.83, + -0.0 + ], + [ + 4.85, + -0.0 + ], + [ + 4.87, + -0.0 + ], + [ + 4.89, + -0.0 + ], + [ + 4.91, + -0.0 + ], + [ + 4.93, + 0.05649999999999999 + ], + [ + 4.95, + -0.0 + ], + [ + 4.97, + -0.0 + ], + [ + 4.99, + -0.0 + ] + ] + ] }, "stdout": "" } From 404461b8cb1169335c7c853986a9b274debd83a1 Mon Sep 17 00:00:00 2001 From: naik-aakash Date: Sun, 5 Jan 2025 12:09:31 +0100 Subject: [PATCH 10/30] fix plot saving filename --- src/lobsterpy/cli.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/lobsterpy/cli.py b/src/lobsterpy/cli.py index 1af45a4c..9cb2fc5a 100644 --- a/src/lobsterpy/cli.py +++ b/src/lobsterpy/cli.py @@ -1051,14 +1051,19 @@ def run(args): plot = icohp_dist_plotter.get_bwdf_plot(sigma=args.sigma, xlim=args.xlim, ylim=args.ylim) title = f"{args.title} : {pair}" if args.title else "" plot.title(title) + + if args.save_plot: + filename = Path(args.save_plot) + plot_filename = filename.parent / f"{pair.replace('-', '_')}_{filename.stem}{filename.suffix}" + if not args.hideplot and not args.save_plot: plot.show() elif args.save_plot and not args.hideplot: fig = plot.gcf() - fig.savefig(f"{pair.replace('-', '_')}_{args.save_plot}") + fig.savefig(plot_filename) plot.show() if args.save_plot and args.hideplot: - plot.savefig(f"{pair.replace('-', '_')}_{args.save_plot}") + plot.savefig(plot_filename) if args.action == "plot": if args.cobis: From 8a92a30e7eb50150fd62ea1c8902a31571076ba4 Mon Sep 17 00:00:00 2001 From: naik-aakash Date: Sun, 5 Jan 2025 12:10:20 +0100 Subject: [PATCH 11/30] add more BWDF plot tests --- tests/cli/test_cli.py | 60 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/tests/cli/test_cli.py b/tests/cli/test_cli.py index aadc4a3f..cacc4089 100644 --- a/tests/cli/test_cli.py +++ b/tests/cli/test_cli.py @@ -234,6 +234,66 @@ def test_icoxxlist_plots(self, tmp_path, inject_mocks, clean_plot): np.testing.assert_array_almost_equal(sorted(marker_colors), expected_colors) assert sorted(set(legends)) == ["Cd-Cd", "Cd-F", "F-F"] + def test_plot_bwdf(self, tmp_path, inject_mocks, clean_plot): + # tests for checking if plots are saved + os.chdir(TestDir / "test_data/CdF_comp_range") + plot_path = tmp_path / "plot.png" + args = ["plotbwdf", "--hideplot", "--saveplot", str(plot_path)] + test = get_parser().parse_args(args) + run(test) + self.assert_is_finite_file(tmp_path / "summed_plot.png") + + # check for atompairs arg (multiple plots should be generated) + plot_path = tmp_path / "bwdf.pdf" + args = ["plotbwdf", "--hideplot", "-atompairs", "--saveplot", str(plot_path)] + test = get_parser().parse_args(args) + run(test) + self.assert_is_finite_file(tmp_path / "Cd_Cd_bwdf.pdf") + self.assert_is_finite_file(tmp_path / "Cd_F_bwdf.pdf") + self.assert_is_finite_file(tmp_path / "F_F_bwdf.pdf") + + # check for siteindex arg (one plots with corresponding to + # siteindex should be generated) + plot_path = tmp_path / "bwdf.eps" + args = ["plotbwdf", "--hideplot", "-siteindex", "2", "--saveplot", str(plot_path)] + test = get_parser().parse_args(args) + run(test) + self.assert_is_finite_file(tmp_path / "2_bwdf.eps") + + # check for binwidth arg + args = ["plotbwdf", "-binwidth", "0.02"] + test = get_parser().parse_args(args) + run(test) + ax = plt.gca() + lines = ax.get_lines() + line = lines[0] + x_data = line.get_xdata() + assert len(x_data) == 250 + assert pytest.approx(max(x_data)) == 4.99 + assert np.allclose(np.diff(x_data), 0.02, atol=1e-8) + + # check if icobis are read correctly + os.chdir(TestDir / "test_data/K3Sb") + args = ["plotbwdf", "--cobis"] + test = get_parser().parse_args(args) + run(test) + ax = plt.gca() + lines = ax.get_lines() + line = lines[0] + y_data = line.get_ydata() + assert np.all(y_data >= 0) + + # icoops + args = ["plotbwdf", "--coops"] + test = get_parser().parse_args(args) + run(test) + ax = plt.gca() + lines = ax.get_lines() + line = lines[0] + y_data = line.get_ydata() + assert np.any(y_data >= 0) + assert np.any(y_data <= 0) + def test_lobsterin_generation(self, tmp_path): os.chdir(TestDir / "test_data/Test_Input_Generation_Empty") lobsterinpath = tmp_path / "lobsterin.lobsterpy" From 10da3e49c62ece3cee5681ad1c35bb0c735104bc Mon Sep 17 00:00:00 2001 From: naik-aakash Date: Sun, 5 Jan 2025 13:31:14 +0100 Subject: [PATCH 12/30] add cli docs --- docs/reference/cli.rst | 1 + docs/reference/cli_subcommands/plotbwdf.rst | 15 +++++++++++++++ 2 files changed, 16 insertions(+) create mode 100644 docs/reference/cli_subcommands/plotbwdf.rst diff --git a/docs/reference/cli.rst b/docs/reference/cli.rst index dcb7d8f9..c331ed78 100644 --- a/docs/reference/cli.rst +++ b/docs/reference/cli.rst @@ -9,6 +9,7 @@ CLI Reference cli_subcommands/descriptionquality cli_subcommands/plotauto cli_subcommands/plotautoia + cli_subcommands/plotbwdf cli_subcommands/plotdos cli_subcommands/ploticohpdistance cli_subcommands/plot diff --git a/docs/reference/cli_subcommands/plotbwdf.rst b/docs/reference/cli_subcommands/plotbwdf.rst new file mode 100644 index 00000000..d02e7caf --- /dev/null +++ b/docs/reference/cli_subcommands/plotbwdf.rst @@ -0,0 +1,15 @@ +plot-bwdf +========== + +Plot ICOHPs or ICOOPs or ICOBIs with respect to bond lengths. + +.. hint:: Aliases available + + - plotbwdf + +.. argparse:: + :module: lobsterpy.cli + :func: get_parser + :prog: lobsterpy + :path: plot-bwdf + From 235b0edaff6670fd61a14674650e4c65fc4432ef Mon Sep 17 00:00:00 2001 From: naik-aakash Date: Sun, 5 Jan 2025 13:32:09 +0100 Subject: [PATCH 13/30] update tutorials --- docs/tutorial/commandlineinterface.rst | 12 ++ docs/tutorial/tutorial.ipynb | 159 ++++++++++++++++-- .../tutorial/tutorial_assets/example_bwdf.png | Bin 0 -> 59954 bytes 3 files changed, 153 insertions(+), 18 deletions(-) create mode 100644 docs/tutorial/tutorial_assets/example_bwdf.png diff --git a/docs/tutorial/commandlineinterface.rst b/docs/tutorial/commandlineinterface.rst index 3c8e0120..a5828a75 100644 --- a/docs/tutorial/commandlineinterface.rst +++ b/docs/tutorial/commandlineinterface.rst @@ -270,6 +270,14 @@ You can plot COHPs/COBIs/COOPs from the command line. .. image:: tutorial_assets/ICOHPs_distance_example.png +- ``lobsterpy plot-bwdf`` will plot Bond Weighted Distribution function (BWDF) using ICOHPs as weights against bond lengths. Example output plot is shown below. For more details on BWDFs check the orignal publication : `https://doi.org/10.1002/anie.201404223 `_ + +.. code:: bash + + lobsterpy plot-bwdf + +.. image:: tutorial_assets/example_bwdf.png + 5. Additional Options ~~~~~~~~~~~~~~~~~~~~~ @@ -297,6 +305,10 @@ either of these commands: lobsterpy description-quality --help +.. code:: bash + + lobsterpy plot-bwdf --help + .. code:: bash lobsterpy plot-dos --help diff --git a/docs/tutorial/tutorial.ipynb b/docs/tutorial/tutorial.ipynb index c3648941..35672ff2 100644 --- a/docs/tutorial/tutorial.ipynb +++ b/docs/tutorial/tutorial.ipynb @@ -407,7 +407,8 @@ "outputs": [], "source": [ "from matplotlib import style\n", - "from pymatgen.io.lobster import Doscar\n", + "from pymatgen.io.lobster import Doscar, Icohplist\n", + "from lobsterpy.featurize.core import FeaturizeIcoxxlist\n", "from lobsterpy.plotting import InteractiveCohpPlotter, IcohpDistancePlotter, PlainCohpPlotter, PlainDosPlotter, get_style_list" ] }, @@ -538,6 +539,126 @@ "Due to sphinx rendering limitations for Plotly figures, the output is not directly visible within the notebook; please use the link to see the [interactive orbital resolved plot](tutorial_assets/CdF2_orb.html)" ] }, + { + "cell_type": "markdown", + "id": "b93a38e5-7a1b-4b95-a580-82c81c2a8937", + "metadata": {}, + "source": [ + "### Plot ICOHPs / ICOBIS / ICOOPs Againsts bond-lengths" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "25fa1eff-a3de-4126-8349-bc932cb23efb", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "outputs": [], + "source": [ + "# Directory of your VASP and Lobster computations\n", + "directory = Path(\".\") / \"..\" / \"..\" / \"tests\" / \"test_data\" / \"CdF_comp_range\"" + ] + }, + { + "cell_type": "markdown", + "id": "e47e4de6-879a-4d32-802d-a0c418403c76", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "```python\n", + "#### Change directory to your Lobster computations (Change this cell block type to Code and remove formatting when executing locally)\n", + "directory = Path(\"LobsterPy\") / \"tests\" / \"test_data\" / \"CdF_comp_range\"\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3fa696e7-55b7-4537-9cf8-c7511b4a5447", + "metadata": {}, + "outputs": [], + "source": [ + "# Plotting ICOHPs against distance\n", + "\n", + "icohp_plotter = IcohpDistancePlotter(are_cobis=False, are_coops=False) # If reading and plotting ICOBIs or ICOOPs set args accordingly\n", + "icohplist = Icohplist(filename=directory / \"ICOHPLIST.lobster.gz\", are_cobis=False, are_coops=False)\n", + "icohp_plotter.add_icohps(label=\"CdF2\", icohpcollection=icohplist.icohpcollection)\n", + "\n", + "# color_interactions=False, will disable datapoints colouring based on atom pair types\n", + "icohp_plotter.get_plot(color_interactions=True, marker_size=20, alpha=0.9);" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a2aebbe1-00bd-45e6-a2fc-76b6f77cb757", + "metadata": {}, + "outputs": [], + "source": [ + "# Computing and Plotting BWDFs from ICOHPs\n", + "\n", + "## We will use the featurizer to compute the BWDF \n", + "feat_icoxx = FeaturizeIcoxxlist(path_to_icoxxlist=directory / \"ICOHPLIST.lobster.gz\",\n", + " path_to_structure=directory / \"CONTCAR.gz\",\n", + " normalization=\"counts\",\n", + " max_length=6,\n", + " min_length=0,\n", + " bin_width=0.1,\n", + " are_cobis=False,\n", + " are_coops=False)\n", + "\n", + "bwdf = feat_icoxx.calc_bwdf() # this method will compute the BWDF for the entire structure and all unique atom pairs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cf8dc25a-3606-4ace-a5c4-ef21695ce4d9", + "metadata": {}, + "outputs": [], + "source": [ + "# getting data required for plotting (important to transform the data required by the plotter)\n", + "plot_bwdf_data = IcohpDistancePlotter.bwdf_data_to_plot(bwdf) " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "86d0b3c8-aaf5-463e-8078-867ed6ae730e", + "metadata": {}, + "outputs": [], + "source": [ + "# Plotting\n", + "icohp_plotter = IcohpDistancePlotter(are_cobis=False, are_coops=False) # If reading and plotting ICOBIs or ICOOPs set args accordingly\n", + "icohp_plotter.add_bwdf(label=\"CdF2\", bwdf=plot_bwdf_data)\n", + "icohp_plotter.get_bwdf_plot(sigma=0.3);" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2f27305d-e77f-4609-9940-1d36768d5069", + "metadata": {}, + "outputs": [], + "source": [ + "# One can also compute and plot BWDF for a single site of the structure\n", + "bwdf = feat_icoxx.calc_site_bwdf(site_index=1)\n", + "plot_bwdf_data = IcohpDistancePlotter.bwdf_data_to_plot(bwdf) # transform the data for plotting\n", + "\n", + "# Plotting\n", + "icohp_plotter = IcohpDistancePlotter(are_cobis=False, are_coops=False) # If reading and plotting ICOBIs or ICOOPs set args accordingly\n", + "icohp_plotter.add_bwdf(label=\"CdF2\", bwdf=plot_bwdf_data)\n", + "icohp_plotter.get_bwdf_plot(sigma=0.3);" + ] + }, { "cell_type": "markdown", "id": "eb17675e", @@ -836,14 +957,17 @@ ] }, { - "metadata": {}, "cell_type": "markdown", - "source": "### BatchIcoxxlistFeaturizer", - "id": "a5220531c2082185" + "id": "a5220531c2082185", + "metadata": {}, + "source": [ + "### BatchIcoxxlistFeaturizer" + ] }, { - "metadata": {}, "cell_type": "markdown", + "id": "9de31478633c9afc", + "metadata": {}, "source": [ "`BatchIcoxxlistFeaturizer` provides a convenient way to extract BWDF as features from the LOBSTER calculation directory. The extracted features consist of the following:\n", "\n", @@ -851,14 +975,14 @@ "2. Complete BWDF as columns in the dataframe\n", "3. BWDF values sorted by bond distances as columns in the dataframe\n", "4. Bond distances sorted by BWDF values as columns in the dataframe" - ], - "id": "9de31478633c9afc" + ] }, { - "metadata": {}, "cell_type": "code", - "outputs": [], "execution_count": null, + "id": "2ed6793640da4fac", + "metadata": {}, + "outputs": [], "source": [ "# Initialize the batch ICOXXLIST featurizer\n", "batch_icohp = BatchIcoxxlistFeaturizer(path_to_lobster_calcs=directory / \"..\" / \"Featurizer_test_data\" / \"Lobster_calcs\", # path to parent lobster calcs\n", @@ -869,12 +993,12 @@ " read_icobis=False, # set to true to read ICOBI data\n", " read_icoops=False, # set to true to read ICOOP data\n", " n_jobs=3,)" - ], - "id": "2ed6793640da4fac" + ] }, { - "metadata": {}, "cell_type": "markdown", + "id": "b3111a3881b29058", + "metadata": {}, "source": [ "```python\n", "## Initialize batch ICOXXLIST featurizer (Change this cell block type to Code and remove formatting when executing locally)\n", @@ -887,19 +1011,18 @@ " read_icoops=False, # set to true to read ICOOP data\n", " n_jobs=3,)\n", "```" - ], - "id": "b3111a3881b29058" + ] }, { - "metadata": {}, "cell_type": "code", - "outputs": [], "execution_count": null, + "id": "7c731fe3e32065be", + "metadata": {}, + "outputs": [], "source": [ "# get the BWDF stats df\n", "batch_icohp.get_df()" - ], - "id": "7c731fe3e32065be" + ] }, { "cell_type": "markdown", diff --git a/docs/tutorial/tutorial_assets/example_bwdf.png b/docs/tutorial/tutorial_assets/example_bwdf.png new file mode 100644 index 0000000000000000000000000000000000000000..a29ffdf32e1005f6188900819a4ca40f8d083eb1 GIT binary patch literal 59954 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

(+c2R=X1Dc@lz2ReBZX zwt@XYs5HdXH>!nbtclwrY{n6|eE91GM#)G~h#$xizX3;Y_mT43UXG`|9gk^$_{w2T z!hsuoBKR$6QT*-j^OB}vHqs!#@cAYBnU%%HYc=2$t2m5E-3X{K6&jShreSz#31b== z@e`QGR&2(U%c!Q0P#^)NNqswG45SWFX)Br9M@B><8=xWt?&I!OY&|y+6~P4m_Omz5 zrk=wy?ux=HEha>6b@hFOe2cLlKE&38Y%73g8koK}Jp4SA?rD4ycwg9*3TQHF;@M-~ zrDIg{cUw_A^f?AWoym#t^YS7?S&7{)5Fp@%c_p|0?+mPFjHv5tzT;i^Q5;kwWng~@ zMgp)Oy9&WcXe29oOH=R^A&NhuhSD6Sq1vO%*e;r}*L*%Fi1e6mynJ zsIAGk-&Un*qC*6mCZuuD*7>)Z%`3D;yXjLfNhS>&cOk`?6mI1zj{jOM?oF-r@@t{=D|0v*EP^Q&kWpei)q_g7Z%`!?3ReM`nKBC!pA@sD)MNe+S9vP$z)QJfQU-W??Ck!+j-9w0%l^=L7?SgmF+OeENiqbup&j| z)||&e3xObyyJf=4D+T=@HqX>B#=rhbsgD#Zq)G7+ET|rkZsSA$e`WkF`Ye*ya~sjV zjs?Mi%y$iZ`A2h2JV%OEG|4=K@{~(ZrIWW!=8CrF!zYhShIeD=3~j7b3)=cXGC|El z!awUkI5`DV$SD}IAzgf6?gtd zE5#(1TVgW>v@2e;^z=)%2^-M10UAa8oKkQei=uIl@#pzYSXiOGnQx!+-o7qN5Or{* z&;%^fFgOFz9!^i|fz!wiMf|iXBCK>kPT3r1>V={ykw*rO`Kdk8rUWp?3{f~&$dluU zOg977CLSEGHF@QY3uqF9ljC^y4T(Hb2)zY0xy4jf{+<>vA*3 zpR{4MsOk=e|Gu*@NfXnTc~+JT7Ix#sWcuUn6}ueUwr$#bt+b36^ormtd7KJz+cM?X zVP@b9q@CCVi-m`aAI$aCRdIUO1y3v#M@MqQAf9ZB4+|-MgRM!?9M4TA43eL8f!cr`x{BA zh~`tW@3`)>$>J>v%xpS6eRp))biNVJVpCv>XxB@?%EEhN*7bitj^NMbdSJA}5X5w_ zidFQV4@XS?*qWsLf{Iv@o>JDL)q0LeE-E;Iny%-5-X}|XW+~DZ|JzU=(@<^UPcGkLUvZEzATTzz*imm_#eJ1`&&VqNLUaaGKt%hWtS)U6 zaUaRM^&@NZj?cIzl1Si9mZeY}J^PP~ib8^$sPXD)|18`rLXwmAPE1UIi?m16^BJ-3 z{SKA3^6As3!=ny^zCvs*wsYYU)W{_a8k=f^9a>@wSwS@asaxAmStfyZNm4&TCncRr zV$n$9j^2-{_=>@g{rWAM8gM6vNhMn6##Mm{rt?o52cavkAc+9Qeux;B5$;#*R4V#B zlvyImLR(hhU_1^)$ZWw~^>}?*V5eB!NF*Q$Dih^?(G22ME{`rPT5<+Z%_t7x&gKoi`|ieh9tcogOi0;OIcM%|AoNA%AO8UIT!i$OymYKTxuc8toq> zK2pacd3PJ46|l!oBNJ(|#g z9PYu++%4Sj6})uG(EH~h8Smm%loUDGAY^?8nXa(2yM(OPuF|e4;f2nWo-IjzbKY+g zc@?nPiGdR9|B^j(NJxCPCev2aTO4?a#vQ9(q%I#+FI`gN8-TMfm1xa|Dd)*wCk>v` zdOMpLQ@~{@+6Q)|QY7v;^kj1NO8`0-OY~FwB2s!LCWWm*(qP#4GxKXjBU>Rx9O${-axVV6EP2)fbVI_pBR2h{9)qe}f4m?QbARKw z%7}9vVw~2u1x%6cn-(`9{y4;Ap)Q{Yw8_j%Mbzz5c^RI^zlxUWT_WNC$72w_|4ZQw zVK5|Ax8)b|45VF9TtDN>AU#Az6#1>=FTjhNM*^W&MVfh_=+)x1Dt64iT(zn7CR(eo z>=_+p&?}iA;v>*psA~>6LXcRp=E#GJ{Nt#j*S0hiy%fl1oX8f?83PR@1fF-g1GNlV zL@9udH8JHPHwXek4f5|?hi7DL6!Hgq)`m#2+_(2TaqL|e!7-iN;E~q=V26+`0A1-0 zq~-O{6Rene*>oKh%5u-+)BfBMZDBG`tNiN3Z=Ql-1a&gF=MM-hk3{{F$O&~rV)dkH zuMSbVEuPkVaZ4lI417S`h(q+14I~p1;D1GioMYZ4a`Wt62ADQ|BIza){+;3u8KjmP zAnqw7n}-4BiQC*rMTkWvmy=k=UUAznCRUNy>N`_3N?7CT)Cp~NVuu#6u?8kBQoagY z{Cl18LzAAB!2lGeCL7E-QUY5-ZnPW&KK{2zdTL$+)j81~AoQf!5Co}Y?%Q98hz`G< zac^Si!B{;f{%x`W0ho13qOZ|Ig0KWjpG#i=@JZZ8KTaVUlA>YyCRs#S-{(nykq3vTfVCl#ggL-OgV($ z0Z}rnix_iagjgaNX&AtepxWg$`H1L6i3gV*nMqIN*6A(8n}G~$64mYTd3 zndE~H6c=_UOB_dyhWgH)wB@cZ&Ym*bam%}x-=62C;|x|hwSJx4+WoxL)U?6zTFlo{ zyS*QMZdO-r_0B8cO*H5zU}iMY`?a=h3-$hcdwGhzq=ExipW>uu_}KAwa)G1niRs5H zfwETuiws&r>LLygh%`tTF&wt9&-e3=isIm^Z2!i23T11O=(93HvrU)&QQ*mT=Nxg} z0oohkjH&IVQ_yx3A7Fst?@{dsBYP?kJaR-0lw0D#s@aPXdyS|x6rACQMf^)rju_PJ zU7(^mqITA$#5a{+)xcR0d2Y^?cfbfn3*54i3B+nS5Ifq;=T~^p0pgm7<~U;iB#nnHNbDbNUjmJGc+wB zb9v1ed!D39nbz16bQ)0otF+?ji>%@fN`UV*P^TbzFtV^Dk*vMipIu#)`hC!KCo~!j zI}mjAzdbE_ee^o7PqxbeZ*KC<$tn7r8Dvj~A2u~d1sca72#wL5?z?M$5hpBWpUQSg zP#sC(9$2e5)HZtSPkGyd`)b0CK6Pa1|Be7r0Jvj#2A?SWB8JH-Ozq$O53aEz?SGy$ z={mLmvJl}v5Tm0Y$`Ky#2SVFt6gBbXy(H;FUn=q;pHJl_xf_w!b@-Wqjp39r$J_-} z)~QniI7x@XRQNK6ZvWW#DVg3t2*glKM#$pZet~swj_8MP^HwL!X-`l-rwS^ zsb#1R*%GtpQsMm8JU543$;UeWw0kFvS~_OPfz8RZ{4u;o#Q|VVncmqe@xBqeR1KsR z3|~|5>sVY$eS}Ew;$qQceTwZO&|M4jF!h;aajvS+BGU2Zu9f?g$9z0JT{nuGj`aQ? z;lxq7siJzVQgm?U{*Cd{( z$wVp`M!u5es!_`;7T2(dbWX~6UC>M=~0(#D*KCIpKfm6QMCvi3Znp4 zp3wi}Xf1#uPCc*1+58+GzfUu-PF-jwHiw4B3x?UerpCY3dGA)zllQxCM9VWGn&eSJ^ncj9h@DJx8bas|Svshp37I_PoeYdfcR@8Z|8Iv{4}` zXdUG(yLkst?&#!npK;B>^UgWnkDl=US2FMU>8pwtrYV=7wsL3py?c5UuETvM^XT=V zXNHTXr93yq=SZCRME6u1@MY8Sembei1X6x*?l`Cw{F>X*}QPy9A2{SpD#Ki z^Z3ap>c~q@+q`za4hbj|(#_GvGYvjXc^GTj^)$BUr=2kO(hYJrs}Z^@;lkX$9e5<% zE05&l8NsQ@Yv?=jFf1EcG@hlW7n;hykxkI8hbvcbXyg_X*OP5p*Vu#kkLo0y8cWj= zz-pG;OIZNYBQ-U!xJmL8cu=WZy6J!an{IBUc6o)#^$+D(;w(DnWmKP0-uju9C+MF^ zpNE67Yjv+Fjjs7!%Kb2{tVC(uVbRylKkU=8%e)`IfgxtsY8)PmY-A<5?d&N?u0Bg` z&)sVL99G3L7Yh_G;fj|0RxbFaf+1M}*RFTSQB%jCpeH@AiIuyh_Na)7eXv?}x6V3O zQ@VBjubdrKciWMddVA%Ps2nFORrE`e8nUf!OKT=?VkTdxv}tAOmf49##3^%Vzle3( z<{M?L7x3-kFZ2ky`B(lqI(6GR0cIb+*q@4V+q8b3c!(>WmHhK>zvv!Z+ilzbbmf%i z*}QTiWpochY+liQJ0~B+A@TXxKX|RBXII`^upI8fXn)SF>s-&?H4WUc=D?j(-f7wJ z22bf*VRtU1mhrx0U{s5E!+V$VShXql;1J&XhK}X-?f4TKh9Qqmp$A;XN(rJxZ|#@@ zxQ?i`XuKlV|AJUWSgj=&LUq7K?~Jj}!+^?5KNSwTq&3l}I+&A9_;KYES-7_pG-#Nw z|GKqnHI~-m&Xr%n0EG8V@k{D+xOGt))x;qd#@Z#K} z0akb5yDLL{ouyqeAMll~XUKh)`HUnbWpZ;ro2Oa$g;=!Iz_2UT&89(kDt{jp-s#Hs z2Utv0eoPFYsTZk|`OviSq##`h4SB9*v?~|F+m=<;v}vSSl{rkn`k;+ojK=IX@-K#z zXIbV$ueVLhd485Buz({mcg{l1_DA$C5fRD(Gs{7FLHd0KzXiNjYsAqw+8*0(ZGT*C zcCw*lJ%Y+C>&g#YQj`to&FwCN3nUUz=O&Yj6_ zX?o|K-6bi}n302Q(r((cGgSg#ztVs2tikhBxLd3@WH=hL3E$4M@`Tpw1_|KXYcKU{ z3Mj6gx+(I|pPVP%uCuS`@tD`s&nPV?7trW2Xq_ot_T9m zWR;7wrP^36YWJ1ZUKUxlgwLM>;Dm28_>tkGaNW^5(>oD<7*hAQcMoIfQ4M9@V-+)g zneYrh7gUy<>?WvZJpBIT^qbSB246m9(~q=Qcq&t8M2W_A9tch5IiyT|y@NMemAn1Y zCC2yr&oV!I*ZP(E>dN9&lm0R!9Dhq{W{m!7M++XWGqcYbc8&w;(~C2a&bKW}m3s@9 zhYF+J*1WBLr`}RzA2K&zYHVy0a;NiCYWPmQW79 zXA%A=6VS99A0?c<9@FW6+dlP+rQW%(;$U!A-?qp+hdiO@jwNsVLO4Y(L}|2?b~Qa@ z-#*-@pc=efu{nF!em9SmBZP^Gi!ouSx-#K6%JTpHx@eUEzMinO>7Pdna*`Ik#sIt!?F7PmX!l1wkW&n$tSecncC9R z{bG|Oaca}EiN0wH%e{47F=<=Z&#zy;KbESp?EY!_$HO0UQcbl@l%LVajTp@>HcI zG{Q08+YUvRjNW1zn@f6IbsytEf~t0_145}UDZjrq!R~=Gl zp8a&G%O}&rv-RpC)sUnH$-&g_a`4H|NiJR;T5q%v-MZSqJng>8%P8f49@}54YU#-3?b)qZ^D*z{V1C#E&7oO7 zwb|ixVP;7;kGqt$%+%+adyhQ!*~yO6Z2Zu~MDX-LDNpa5NT7UV zvRi#5(^PYq_mimysYXUO8q6#{UwqefTmIb_XPMCIb(6m{v+U*{i-r7jJ)pXMy;KP0 zto-56AyM2UchCRB3nxZ}-%LX0FO&3a_gpw5<2TQVuDC~z=~~AXmojtpAQ?7|tlQ(&pI*vl zk8gu#NbHGawMY9Dd8f3-Ff6=J!Q`6GYB&0ot9J_sOGvfvIy~imVMn^#tx+dN<=-Z+ z+ZjcT?j;>qsMy?JUGr1iYIsh_Vr{hP$zaB_iXbc4&H=e07M=#|7bFI8XQWrP}I+z z^J?fpiv?z3@6nkB2YIh78BIgv8$_`*<%)cM_E|)weBU_*;VJiqygEb=*RQ#slOr}u z+U7j^b+~rU)rZlg?noCcZPUqiA7;Ma|9HOjR6Lh?MkZzM-VD=s>#O&2wfLFcmj{{K zKjmtE@|CRP32+0qMk`74yjs@WIIqL|=$-kJZu1qFlukB`6Sd%cmE=+kYyU1LRyMXY z!m5Iqh&c!fuPO<>lMo^akPN0m?XE_s#Mq4dge@A#L!2jw@ZXZl>MRWn0bi|}E{anPF*9hnlz+AQPBiAO%NBy?&9mA8 zXK}+ASaIvtZ!fN@s;UYD^CZH3;hj2|5iFSB$3T$IrrkKK3C0gZJTB+R4d|qZK>5OR zaqSncF+frWZQyTzS>oh$oKpEwDecUtT(R}Y>|WaGvFk&1cZRRysaeB z0lq1%+0opjb}`GkPl?K}s!V)tykL%Uj_sB|ATXu%EhT*rZ=~%-S8*Tn5%l*lufhf_ndrDL3D^zPb_ zJI%s!W6e6HQxXQHQ@ay;4@HJ_rkAP+{`I2K{+-gd;boOC1$LQ*O|hpdq&D(PS`9Vr zC!iV{X7wfDUunR;yQ^+j6gVtsKk}BmVfNsD?r;h$)ag6d!1efudmg*CcFh{XlZEV2 zE4&wsU>(TMF1mAhOS?d?Mn=&k+b$Or9NSK%RLaOI79U(!Ref&x_vW)Xk6D|B3N20O zy3a>^GGt^PdehC0!&hwK-htxN@3uQhF>IaP&2d1H#pWCD@Tfg!SnlmmuXVx;trql2 zJ>&ht{~X+4Qo4M%{_PzVYi+a3bacu=+-#a{?_B#Fi=Jmhop^O`R7@?yxscv|MD3rk z&qA4*$>Ii5VS+fUU(SN{qY=g`&tstH9Hl^0w^gk^nymJ=v1--A%xJA+UcD zF$(0K*glboewvpHF=&Edb*2kM)(8ti^{>K&ibBQjOgrhFT(SCvY*aKbCq8mD%2qkSh=Rg!8P+xn7U48qPvH(s?2otk2Ccjpzy zC=Ib&qCpyI!koptd!+u6_T;hcJnrtBuY2@B>47xMp`nFq3|c2JoSFFZ#)WFp432rn zVR!;@+^C->X0e516Z-7!gq05c+0C4a@^Uh^1~;$ipa+9SbTwX#j9fDX^KGH2m|kYG zrP-37O6qsOiD6lj2FKQ>?KoVXmdve5p)n8VIIPO;u_@@q=|>9k=e%My1T_sY`Pz5G z4_1z2n&Fluac?yZg6QexB-n&pidOOz_qjcyGfZ5pt%Dsm__Eb?0#k9A)b#o#eRwHZ zeJPIqap@uK+F1vtkxy~=A`8{?EW+qrzVP+;FYMcsqJDC_e&Tz&UPjR?zSqEX+P6tk zL$k{?>)Yolh}n(h^a)h~pt;rXC(KrE4lbLAt#I+vGV510V2}051!=1MG|wO-LE!Xs ztWqO{EMfE;BQ^ z(s36P*B^KHUXe`dK6&4X(WK&Ab*+lBQ_;vzI$m!-dl$wr$vwzKY9}v}>L5FXrtp?> zS^fZThJ_|=M2C8)|CV-D6(E8EzrP=18tY0gcV1A>vyAeMh@hvjOYFvkEks_?$+m6u zI}b{+_x{UkJFdHe0T#@Vh3_N?et}N z78?V9IkrKzU8#w220V$Hie0p8<0R*`l8)tlweL*x;%1vc_Az>B*QWkgzt582pzX*B z5!sg^vsu`Al!^A%utwd7+cJnwa)qw(ySPu6!~Yp%X1GFN*s4 zf^%=Z^6k{kOUgN|K+uw4x%4XF0H-Q2UDlRiYMY?@2{<6y$neSxpv!f2imHCkIs&};>b8t z^|K{J5s9b*Jm)=t2%Je$tYE1Ox!u|{cN!rLR#goqS)rf14I#a|S zck1?oecef(%biEQZ_nqZWj%1;k7AK_^Fwu1Z}cP0S@qm^`BcbriJy*vSSFx;Z<~H$0pBR35s<~9dsfpD#l2O zrjg4BI~-LG(Hd)!PtVXY_Ia!!b>8>dp+ofF8DF?Pc}zd@Stlpwy7SV`zdbwk0kL(#v~#g?y>cjIOtwS6H4ZIOU!Vzu zXOw$B2oc-YbjfU}VR^|h(u+0rhtBfLA06>^J6Q&wQGMuUfdFA*(npeX2CDsU?vtKw zOz4Mo%<(z@h}2jP831Sgz6=Qtn){+1kGXffc;=%fe01gSg=_WOi z3oommKjmd&YSwZJXzuQAKt7idMC2OT3fWtsy$G&sm`H_8zIE zOG)Jy$rMVldtm=Q`lR`MdMji1MAhEe%|4Z}{~jJwk*azuSGd5|I1TQhYWRWD*wmSC zd?WFHF~kQsS;U=-boU7k*f%-ncp-Xma6MYo{*D?R+8YNx8+DnPa)Uyn#mc z=cf18+z3-P4%>ArsamkY=zt4{g*~IIzEf7=G|9f@i(%G&huMSfT}So) z*>2F;t#MC_V{engzk2jhE-BWfy78F#qMm1?8P_WE@uRoq-`CrRTAYCep$li6U3)28 zP9w!QOIE{&Uqk2Sg6nSPlNv$(hxQ3 zLx(c6Ei}h-j4sm9Fp6_({3Csd>1We5rm@br&Jezk(j^_Hv5tXh@v|2md-u5PSHJ%= zwR+i6)+mVkHs7_pJ>>P!Mf&p^XG%*;^F?GOJ2B}%-Zde=$R++F_0=wyug+O-cKZg6G$#_kmn5;8HqQXLSk9pPo27I-d<* z@60ETUpq=d==TS7^ekfW`qw>Ec;%J+cj`GlB7eLYwuLM-TlWjUPlJZh8yH)bJ-*LRg(vCwIT=$y!f@9%HP+>s zuIW*ejhkoeg6-}J@X9?(E4fJisQfg0LtA(&$!ffTWdCQ@_NZZ=l}R0&7t9Qt1cwKoR(>jJ_KM2f0Uo{TkG zzm6xZkZ~)!PD*H{WDv$NFNHT{`_R-6?$xpVOT$$o09PGDGS5ye*-Ad{Q5nDFAFcO! zfgDZu_4V`&a9=VNQ{z72f$--{&W_)+(J_Tco53zaQ zJ}&DYYhe~}%H%3w&p3OU$9UGteZ%gtk;C5J#>-G_D%zfx;}wi`op`w`3H5zAugs8a z`^5~Jlzl(FXJV|veDj8rx$X1P%&j9S`@_o0Dk((A?#v5WSEcuElg_MbsE%A?PD%ax zwUYMsvm>EgMXysIRhXD{YK6X6`oeg03;H<;SC(C*-CYZ1M3AciZcn

|)@l{?=ST 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 literal 0 HcmV?d00001 From 6b95906801e8ff0df5825a1113a614e07912c65d Mon Sep 17 00:00:00 2001 From: naik-aakash Date: Sun, 5 Jan 2025 15:17:41 +0100 Subject: [PATCH 14/30] add option to save plot data as jsons from automatic analysis --- src/lobsterpy/cli.py | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/lobsterpy/cli.py b/src/lobsterpy/cli.py index 9cb2fc5a..a7630e50 100644 --- a/src/lobsterpy/cli.py +++ b/src/lobsterpy/cli.py @@ -12,8 +12,10 @@ from pathlib import Path import matplotlib.style +from monty.json import jsanitize from monty.os.path import zpath -from pymatgen.electronic_structure.cohp import CompleteCohp +from monty.serialization import dumpfn +from pymatgen.electronic_structure.cohp import Cohp, CompleteCohp from pymatgen.io.lobster import Icohplist from lobsterpy.cohp.analyze import Analysis @@ -22,6 +24,7 @@ from lobsterpy.featurize.utils import get_file_paths from lobsterpy.plotting import ( IcohpDistancePlotter, + InteractiveCohpPlotter, PlainCohpPlotter, PlainDosPlotter, get_style_list, @@ -439,6 +442,17 @@ def get_parser() -> argparse.ArgumentParser: default=False, help="Sum COHP `Spin.up` and `Spin.down` populations for automatic analysis", ) + auto_group.add_argument( + "--save-plot-json", + "--saveplotjson", + "-spj", + nargs="?", + type=Path, + default=None, + metavar="FILENAME", + help="Write a JSON file with the plot data. " + "`monty.serialization.loadfn` or `json.load` can be used to load the data.", + ) # Argument that will help to switch automatic analysis analysis_switch = argparse.ArgumentParser(add_help=False) @@ -937,6 +951,22 @@ def run(args): with open(args.file_json, "w") as fd: json.dump(analysedict, fd) + if args.save_plot_json is not None: + ic_plotter = InteractiveCohpPlotter(are_coops=args.coops, are_cobis=args.cobis) + if args.action in ["plot-automatic-ia"]: + ic_plotter.add_all_relevant_cohps( + analyse=analyse, label_resolved=args.labelresolved, orbital_resolved=args.orbitalresolved + ) + else: + ic_plotter.add_all_relevant_cohps( + analyse=analyse, label_resolved=False, orbital_resolved=args.orbitalresolved + ) + monty_encoded_doc = jsanitize(ic_plotter._cohps, allow_bson=True, strict=True, enum_values=True) + for bond_label, cohp_data in monty_encoded_doc["All"].items(): + cohp_data.update({"are_coops": args.coops, "are_cobis": args.cobis}) + monty_encoded_doc["All"][bond_label] = Cohp.from_dict(cohp_data) + dumpfn(monty_encoded_doc["All"], args.save_plot_json) + if args.action in [ "plot", "plot-automatic", From d64cbbade407c34fdeb9179b41c9604ec247a598 Mon Sep 17 00:00:00 2001 From: naik-aakash Date: Sun, 5 Jan 2025 16:07:11 +0100 Subject: [PATCH 15/30] add tests for save plot json --- tests/cli/test_cli.py | 94 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 90 insertions(+), 4 deletions(-) diff --git a/tests/cli/test_cli.py b/tests/cli/test_cli.py index cacc4089..d011f149 100644 --- a/tests/cli/test_cli.py +++ b/tests/cli/test_cli.py @@ -15,6 +15,8 @@ import numpy as np import pytest from matplotlib.figure import Figure +from monty.serialization import loadfn +from pymatgen.electronic_structure.cohp import Cohp from lobsterpy.cli import get_parser, run @@ -186,7 +188,7 @@ def test_cli_interactive_plotter_cobi(self): test = get_parser().parse_args(args) run(test) - def test_cli_interactive_plotter_coops(self): + def test_cli_interactive_plotter_coops(self, tmp_path): os.chdir(TestDir / "test_data/CdF_comp_range") # tests skip showing plots generated using automatic interactive plotter args = [ @@ -199,6 +201,75 @@ def test_cli_interactive_plotter_coops(self): test = get_parser().parse_args(args) run(test) + def test_cli_save_plot_data(self, tmp_path, inject_mocks, clean_plot): + os.chdir(TestDir / "test_data/NaCl") + + # Interactive plotter + plot_data_path = tmp_path / "plotdata.json" + args = [ + "auto-plot-ia", + "--orbitalresolved", + "--labelresolved", + "--hideplot", + "--allbonds", + "-spj", + str(plot_data_path), + ] + test = get_parser().parse_args(args) + run(test) + self.assert_is_finite_file(plot_data_path) + plot_data = loadfn(plot_data_path) + expected_labels = [ + "Na1: 6 x Cl-Na", + "21: Cl2 (3p)-Na1 (3s) (2.85 Å)", + "23: Cl2 (3p)-Na1 (3s) (2.85 Å)", + "24: Cl2 (3p)-Na1 (3s) (2.85 Å)", + "27: Cl2 (3p)-Na1 (3s) (2.85 Å)", + "28: Cl2 (3p)-Na1 (3s) (2.85 Å)", + "30: Cl2 (3p)-Na1 (3s) (2.85 Å)", + "21: Cl2 (3s)-Na1 (3s) (2.85 Å)", + "23: Cl2 (3s)-Na1 (3s) (2.85 Å)", + "24: Cl2 (3s)-Na1 (3s) (2.85 Å)", + "27: Cl2 (3s)-Na1 (3s) (2.85 Å)", + "28: Cl2 (3s)-Na1 (3s) (2.85 Å)", + "30: Cl2 (3s)-Na1 (3s) (2.85 Å)", + "21: Cl2 (3p)-Na1 (2p) (2.85 Å)", + "23: Cl2 (3p)-Na1 (2p) (2.85 Å)", + "24: Cl2 (3p)-Na1 (2p) (2.85 Å)", + "27: Cl2 (3p)-Na1 (2p) (2.85 Å)", + "28: Cl2 (3p)-Na1 (2p) (2.85 Å)", + "30: Cl2 (3p)-Na1 (2p) (2.85 Å)", + "Cl2: 6 x Cl-Na", + ] + # test if saved json file contains valid Cohp objects + for label, data in plot_data.items(): + assert isinstance(data, Cohp) + assert label in expected_labels + + staitc_plot_data_path = tmp_path / "plotdata_static.json" + args = [ + "auto-plot", + "--orbitalresolved", + "--allbonds", + "-spj", + str(staitc_plot_data_path), + ] + test = get_parser().parse_args(args) + run(test) + self.assert_is_finite_file(staitc_plot_data_path) + plot_data = loadfn(staitc_plot_data_path) + # test if saved json file contains valid Cohp objects + expected_labels = [ + "Na1: 6 x Cl-Na", + "6x Cl (3p)-Na (3s) (2.85 Å)", + "6x Cl (3s)-Na (3s) (2.85 Å)", + "6x Cl (3p)-Na (2p) (2.85 Å)", + "Cl2: 6 x Cl-Na", + ] + for label, data in plot_data.items(): + assert isinstance(data, Cohp) + assert label in expected_labels + def test_icoxxlist_plots(self, tmp_path, inject_mocks, clean_plot): os.chdir(TestDir / "test_data/NaCl") plot_path = tmp_path / "plot.png" @@ -261,7 +332,7 @@ def test_plot_bwdf(self, tmp_path, inject_mocks, clean_plot): self.assert_is_finite_file(tmp_path / "2_bwdf.eps") # check for binwidth arg - args = ["plotbwdf", "-binwidth", "0.02"] + args = ["plotbwdf", "-binwidth", "0.02", "-minlen", "0", "-maxlen", "5"] test = get_parser().parse_args(args) run(test) ax = plt.gca() @@ -274,17 +345,29 @@ def test_plot_bwdf(self, tmp_path, inject_mocks, clean_plot): # check if icobis are read correctly os.chdir(TestDir / "test_data/K3Sb") - args = ["plotbwdf", "--cobis"] + args = ["plotbwdf", "--cobis", "-minlen", "2", "-maxlen", "6"] test = get_parser().parse_args(args) run(test) ax = plt.gca() lines = ax.get_lines() line = lines[0] y_data = line.get_ydata() + x_data = line.get_xdata() + assert pytest.approx(max(x_data)) == 5.99 + assert pytest.approx(min(x_data)) == 2.01 assert np.all(y_data >= 0) # icoops - args = ["plotbwdf", "--coops"] + args = [ + "plotbwdf", + "--coops", + "-x", + "3", + "5", + "-y", + "-0.4", + "0.1", + ] test = get_parser().parse_args(args) run(test) ax = plt.gca() @@ -293,6 +376,9 @@ def test_plot_bwdf(self, tmp_path, inject_mocks, clean_plot): y_data = line.get_ydata() assert np.any(y_data >= 0) assert np.any(y_data <= 0) + # test for x-y axis limits on generated plots + assert ax.get_xlim() == (3, 5) + assert ax.get_ylim() == (-0.4, 0.1) def test_lobsterin_generation(self, tmp_path): os.chdir(TestDir / "test_data/Test_Input_Generation_Empty") From 871d73256743b17e856e8d54006abb0d4b7e1e07 Mon Sep 17 00:00:00 2001 From: naik-aakash Date: Sun, 5 Jan 2025 16:14:35 +0100 Subject: [PATCH 16/30] fix description in docs --- docs/reference/cli_subcommands/plotbwdf.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference/cli_subcommands/plotbwdf.rst b/docs/reference/cli_subcommands/plotbwdf.rst index d02e7caf..cc004bb5 100644 --- a/docs/reference/cli_subcommands/plotbwdf.rst +++ b/docs/reference/cli_subcommands/plotbwdf.rst @@ -1,7 +1,7 @@ plot-bwdf ========== -Plot ICOHPs or ICOOPs or ICOBIs with respect to bond lengths. +Plot BWDFs using ICOHPs or ICOOPs or ICOBIs with respect to bond lengths. .. hint:: Aliases available From cfcb4210252261d3fd6dd0bdaab5726bd833400a Mon Sep 17 00:00:00 2001 From: naik-aakash Date: Mon, 6 Jan 2025 09:09:55 +0100 Subject: [PATCH 17/30] correct doc-string cli help for binwidth --- src/lobsterpy/cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lobsterpy/cli.py b/src/lobsterpy/cli.py index a7630e50..bae043b4 100644 --- a/src/lobsterpy/cli.py +++ b/src/lobsterpy/cli.py @@ -563,7 +563,7 @@ def get_parser() -> argparse.ArgumentParser: type=float, dest="binwidth", default=0.02, - help="Bin width used for computing the BWDFs. Default: 0.1.", + help="Bin width used for computing the BWDFs. Default: 0.02.", ) bwdf_plotting_group.add_argument( "-interacttol", From 89d1edf562f21a7b6f500e68be1fa29443a4617a Mon Sep 17 00:00:00 2001 From: naik-aakash Date: Tue, 7 Jan 2025 08:32:34 +0100 Subject: [PATCH 18/30] update cli help --- src/lobsterpy/cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lobsterpy/cli.py b/src/lobsterpy/cli.py index bae043b4..8a056860 100644 --- a/src/lobsterpy/cli.py +++ b/src/lobsterpy/cli.py @@ -458,7 +458,7 @@ def get_parser() -> argparse.ArgumentParser: analysis_switch = argparse.ArgumentParser(add_help=False) analysis_group = analysis_switch.add_argument_group( "Arguments to switch type of files analyzed during automatic analysis" - " (Also indicates file type for 'plot/plot-icohp-distance' action in cli)" + " (Also indicates file to be read for 'plot/plot-icohp-distance/plot-bwdf' action in cli)" ) analysis_group.add_argument( "--cobis", From bde84cfd0ad2f4241417bb81e300984f1d400b9e Mon Sep 17 00:00:00 2001 From: naik-aakash Date: Fri, 10 Jan 2025 08:44:15 +0100 Subject: [PATCH 19/30] address tutorial review --- docs/tutorial/commandlineinterface.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial/commandlineinterface.rst b/docs/tutorial/commandlineinterface.rst index a5828a75..6948f278 100644 --- a/docs/tutorial/commandlineinterface.rst +++ b/docs/tutorial/commandlineinterface.rst @@ -270,7 +270,7 @@ You can plot COHPs/COBIs/COOPs from the command line. .. image:: tutorial_assets/ICOHPs_distance_example.png -- ``lobsterpy plot-bwdf`` will plot Bond Weighted Distribution function (BWDF) using ICOHPs as weights against bond lengths. Example output plot is shown below. For more details on BWDFs check the orignal publication : `https://doi.org/10.1002/anie.201404223 `_ +- ``lobsterpy plot-bwdf`` will plot Bond Weighted Distribution function (BWDF) using ICOHPs, ICOOPs or ICOBIs as weights against bond lengths. Example output plot is shown below. For more details on BWDFs check the orignal publication : `https://doi.org/10.1002/anie.201404223 `_ .. code:: bash From 831ea6ec36e382d47fb0cf1c7f338737e696dffc Mon Sep 17 00:00:00 2001 From: naik-aakash Date: Fri, 10 Jan 2025 08:49:38 +0100 Subject: [PATCH 20/30] update default maxlen arg in cli --- src/lobsterpy/cli.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lobsterpy/cli.py b/src/lobsterpy/cli.py index 8a056860..f62bbfe6 100644 --- a/src/lobsterpy/cli.py +++ b/src/lobsterpy/cli.py @@ -579,8 +579,8 @@ def get_parser() -> argparse.ArgumentParser: "--max-length", type=float, dest="maxlen", - default=5, - help="Maximum bond length for the BWDFs in Angstroms. Default: 5.", + default=6, + help="Maximum bond length for the BWDFs in Angstroms. Default: 6.", ) bwdf_plotting_group.add_argument( "-minlen", From 8863d3e1d2086ca65cc19bc1f423e7318b7d6f5c Mon Sep 17 00:00:00 2001 From: naik-aakash Date: Fri, 10 Jan 2025 08:50:27 +0100 Subject: [PATCH 21/30] update cli ref test data --- tests/test_data/cli-reference.json | 2136 +++++++++++++++++++--------- 1 file changed, 1468 insertions(+), 668 deletions(-) diff --git a/tests/test_data/cli-reference.json b/tests/test_data/cli-reference.json index acb4d491..ead28f69 100644 --- a/tests/test_data/cli-reference.json +++ b/tests/test_data/cli-reference.json @@ -55240,7 +55240,7 @@ }, "stdout": "" }, - "plot-bwdf": { + "plot-bwdf --sigma 0.1": { "plot": { "facecolor": [ 1.0, @@ -55256,1010 +55256,1210 @@ [ [ 0.01, - -0.0 + 0.0 ], [ 0.03, - -0.0 + 0.0 ], [ 0.05, - -0.0 + 0.0 ], [ 0.06999999999999999, - -0.0 + 0.0 ], [ 0.09, - -0.0 + 0.0 ], [ 0.11, - -0.0 + 0.0 ], [ 0.13, - -0.0 + 0.0 ], [ 0.15000000000000002, - -0.0 + 0.0 ], [ 0.17, - -0.0 + 0.0 ], [ 0.19, - -0.0 + 0.0 ], [ 0.21000000000000002, - -0.0 + 0.0 ], [ 0.23, - -0.0 + 0.0 ], [ 0.25, - -0.0 + 0.0 ], [ 0.27, - -0.0 + 0.0 ], [ 0.29000000000000004, - -0.0 + 0.0 ], [ 0.31, - -0.0 + 0.0 ], [ 0.33, - -0.0 + 0.0 ], [ 0.35000000000000003, - -0.0 + 0.0 ], [ 0.37, - -0.0 + 0.0 ], [ 0.39, - -0.0 + 0.0 ], [ 0.41000000000000003, - -0.0 + 0.0 ], [ 0.43, - -0.0 + 0.0 ], [ 0.45, - -0.0 + 0.0 ], [ 0.47000000000000003, - -0.0 + 0.0 ], [ 0.49, - -0.0 + 0.0 ], [ 0.51, - -0.0 + 0.0 ], [ 0.53, - -0.0 + 0.0 ], [ 0.55, - -0.0 + 0.0 ], [ 0.5700000000000001, - -0.0 + 0.0 ], [ 0.59, - -0.0 + 0.0 ], [ 0.61, - -0.0 + 0.0 ], [ 0.63, - -0.0 + 0.0 ], [ 0.65, - -0.0 + 0.0 ], [ 0.67, - -0.0 + 0.0 ], [ 0.6900000000000001, - -0.0 + 0.0 ], [ 0.71, - -0.0 + 0.0 ], [ 0.73, - -0.0 + 0.0 ], [ 0.75, - -0.0 + 0.0 ], [ 0.77, - -0.0 + 0.0 ], [ 0.79, - -0.0 + 0.0 ], [ 0.81, - -0.0 + 0.0 ], [ 0.83, - -0.0 + 0.0 ], [ 0.85, - -0.0 + 0.0 ], [ 0.87, - -0.0 + 0.0 ], [ 0.89, - -0.0 + 0.0 ], [ 0.91, - -0.0 + 0.0 ], [ 0.93, - -0.0 + 0.0 ], [ 0.95, - -0.0 + 0.0 ], [ 0.97, - -0.0 + 0.0 ], [ 0.99, - -0.0 + 0.0 ], [ 1.01, - -0.0 + 0.0 ], [ 1.03, - -0.0 + 0.0 ], [ 1.05, - -0.0 + 0.0 ], [ 1.07, - -0.0 + 0.0 ], [ 1.09, - -0.0 + 0.0 ], [ 1.11, - -0.0 + 0.0 ], [ 1.1300000000000001, - -0.0 + 0.0 ], [ 1.15, - -0.0 + 0.0 ], [ 1.17, - -0.0 + 0.0 ], [ 1.19, - -0.0 + 0.0 ], [ 1.21, - -0.0 + 0.0 ], [ 1.23, - -0.0 + 0.0 ], [ 1.25, - -0.0 + 0.0 ], [ 1.27, - -0.0 + 0.0 ], [ 1.29, - -0.0 + 0.0 ], [ 1.31, - -0.0 + 0.0 ], [ 1.33, - -0.0 + 0.0 ], [ 1.35, - -0.0 + 0.0 ], [ 1.37, - -0.0 + 0.0 ], [ 1.39, - -0.0 + 0.0 ], [ 1.41, - -0.0 + 0.0 ], [ 1.43, - -0.0 + 0.0 ], [ 1.45, - -0.0 + 0.0 ], [ 1.47, - -0.0 + 0.0 ], [ 1.49, - -0.0 + 0.0 ], [ 1.51, - -0.0 + 0.0 ], [ 1.53, - -0.0 + 0.0 ], [ 1.55, - -0.0 + 0.0 ], [ 1.57, - -0.0 + 0.0 ], [ 1.59, - -0.0 + 0.0 ], [ 1.61, - -0.0 + 0.0 ], [ 1.6300000000000001, - -0.0 + 0.0 ], [ 1.65, - -0.0 + 0.0 ], [ 1.67, - -0.0 + 0.0 ], [ 1.69, - -0.0 + 0.0 ], [ 1.71, - -0.0 + 0.0 ], [ 1.73, - -0.0 + 0.0 ], [ 1.75, - -0.0 + 0.0 ], [ 1.77, - -0.0 + 0.0 ], [ 1.79, - -0.0 + 0.0 ], [ 1.81, - -0.0 + 0.0 ], [ 1.83, - -0.0 + 0.0 ], [ 1.85, - -0.0 + 0.0 ], [ 1.87, - -0.0 + 0.0 ], [ 1.89, - -0.0 + 0.0 ], [ 1.91, - -0.0 + 0.0 ], [ 1.93, - -0.0 + 0.0 ], [ 1.95, - -0.0 + 0.0 ], [ 1.97, - -0.0 + 0.0 ], [ 1.99, - -0.0 + 0.0 ], [ 2.01, - -0.0 + 0.0 ], [ 2.03, - -0.0 + 0.0 ], [ 2.05, - -0.0 + 0.0 ], [ 2.07, - -0.0 + 0.0 ], [ 2.09, - -0.0 + 0.0 ], [ 2.11, - -0.0 + 0.0 ], [ 2.13, - -0.0 + 0.0 ], [ 2.15, - -0.0 + 0.0 ], [ 2.17, - -0.0 + 0.0 ], [ 2.19, - -0.0 + 0.0 ], [ 2.21, - -0.0 + 0.0 ], [ 2.23, - -0.0 + 0.0 ], [ 2.25, - -0.0 + 0.0 ], [ 2.2699999999999996, - -0.0 + 0.0 ], [ 2.2899999999999996, - -0.0 + 0.0 ], [ 2.3099999999999996, - -0.0 + 0.0 ], [ 2.3299999999999996, - -0.0 + 0.0 ], [ 2.3499999999999996, - -0.0 + 0.0 ], [ 2.3699999999999997, - -0.0 + 0.0 ], [ 2.3899999999999997, - -0.0 + 0.0 ], [ 2.4099999999999997, - -0.0 + 0.0 ], [ 2.4299999999999997, - -0.0 + 0.0 ], [ 2.4499999999999997, - -0.0 + 0.0 ], [ 2.4699999999999998, - -0.0 + 0.0001970152274695678 ], [ 2.4899999999999998, - -0.0 + 0.0004297832546056816 ], [ 2.51, - -0.0 + 0.0009007979868630229 ], [ 2.53, - -0.0 + 0.0018139843849293655 ], [ 2.55, - -0.0 + 0.003509683082686321 ], [ 2.57, - -0.0 + 0.006524248300399316 ], [ 2.59, - -0.0 + 0.01165255819626901 ], [ 2.61, - -0.0 + 0.019995869826806047 ], [ 2.63, - -0.0 + 0.03296761590960603 ], [ 2.65, - -0.0 + 0.05222314270969713 ], [ 2.67, - -0.0 + 0.0794816155177445 ], [ 2.69, - -0.0 + 0.11622474151493396 ], [ 2.71, - -0.0 + 0.16328967055528293 ], [ 2.73, - -0.0 + 0.2204179999852325 ], [ 2.75, - -0.0 + 0.28586673582354377 ], [ 2.7699999999999996, - -0.0 + 0.3562118875586879 ], [ 2.7899999999999996, - -0.0 + 0.4264630567356551 ], [ 2.8099999999999996, - -0.0 + 0.49054928034358714 ], [ 2.8299999999999996, - -0.0 + 0.5421407985186705 ], [ 2.8499999999999996, - 6.78468 + 0.5872941158942511 ], [ 2.8699999999999997, - -0.0 + 0.5756649132404086 ], [ 2.8899999999999997, - -0.0 + 0.5421407985186705 ], [ 2.9099999999999997, - -0.0 + 0.49054928034358714 ], [ 2.9299999999999997, - -0.0 + 0.4264630567356551 ], [ 2.9499999999999997, - -0.0 + 0.3562118875586879 ], [ 2.9699999999999998, - -0.0 + 0.28586673582354377 ], [ 2.9899999999999998, - -0.0 + 0.2204179999852325 ], [ 3.01, - -0.0 + 0.16328967055528293 ], [ 3.03, - -0.0 + 0.11622474151493396 ], [ 3.05, - -0.0 + 0.0794816155177445 ], [ 3.07, - -0.0 + 0.05222314270969713 ], [ 3.09, - -0.0 + 0.03296761590960603 ], [ 3.11, - -0.0 + 0.019995869826806047 ], [ 3.13, - -0.0 + 0.01165255819626901 ], [ 3.15, - -0.0 + 0.006524248300399316 ], [ 3.17, - -0.0 + 0.003509683082686321 ], [ 3.19, - -0.0 + 0.0018139843849293655 ], [ 3.21, - -0.0 + 0.0009007979868630229 ], [ 3.23, - -0.0 + 0.0004297832546056816 ], [ 3.25, - -0.0 + 0.0001970152274695678 ], [ 3.2699999999999996, - -0.0 + 0.0 ], [ 3.2899999999999996, - -0.0 + 0.0 ], [ 3.3099999999999996, - -0.0 + 0.0 ], [ 3.3299999999999996, - -0.0 + 0.0 ], [ 3.3499999999999996, - -0.0 + 0.0 ], [ 3.3699999999999997, - -0.0 + 0.0 ], [ 3.3899999999999997, - -0.0 + 0.0 ], [ 3.4099999999999997, - -0.0 + 0.0 ], [ 3.4299999999999997, - -0.0 + 0.0 ], [ 3.4499999999999997, - -0.0 + 0.0 ], [ 3.4699999999999998, - -0.0 + 0.0 ], [ 3.4899999999999998, - -0.0 + 0.0 ], [ 3.51, - -0.0 + 0.0 ], [ 3.53, - -0.0 + 0.0 ], [ 3.55, - -0.0 + 0.0 ], [ 3.57, - -0.0 + 0.0 ], [ 3.59, - -0.0 + 0.0 ], [ 3.61, - -0.0 + 0.0 ], [ 3.63, - -0.0 + 0.0 ], [ 3.65, - -0.0 + 2.002071118036049e-05 ], [ 3.67, - -0.0 + 4.367462617550617e-05 ], [ 3.69, - -0.0 + 9.153920008350869e-05 ], [ 3.71, - -0.0 + 0.00018433731200784715 ], [ 3.73, - -0.0 + 0.00035665441821705824 ], [ 3.75, - -0.0 + 0.0006629948992720826 ], [ 3.7699999999999996, - -0.0 + 0.0011841343694912112 ], [ 3.7899999999999996, - -0.0 + 0.00203198270379586 ], [ 3.8099999999999996, - -0.0 + 0.0033501731054429934 ], [ 3.8299999999999996, - -0.0 + 0.005306922061560424 ], [ 3.8499999999999996, - -0.0 + 0.008076931356359346 ], [ 3.8699999999999997, - -0.0 + 0.011810772252322344 ], [ 3.8899999999999997, - -0.0 + 0.016593516018595628 ], [ 3.9099999999999997, - -0.0 + 0.022398903746354788 ], [ 3.9299999999999997, - -0.0 + 0.029049812176978208 ], [ 3.9499999999999997, - -0.0 + 0.03619829498166648 ], [ 3.9699999999999998, - -0.0 + 0.0433372272674562 ], [ 3.9899999999999998, - -0.0 + 0.04984967704087585 ], [ 4.01, - -0.0 + 0.0550924133410393 ], [ 4.029999999999999, - 0.68946 + 0.05968089889935123 ], [ 4.05, - -0.0 + 0.05849913792289866 ], [ 4.069999999999999, - -0.0 + 0.0550924133410393 ], [ 4.09, - -0.0 + 0.04984967704087585 ], [ 4.109999999999999, - -0.0 + 0.0433372272674562 ], [ 4.13, - -0.0 + 0.03619829498166648 ], [ 4.1499999999999995, - -0.0 + 0.029049812176978208 ], [ 4.17, - -0.0 + 0.022398903746354788 ], [ 4.1899999999999995, - -0.0 + 0.016593516018595628 ], [ 4.21, - -0.0 + 0.011810772252322344 ], [ 4.2299999999999995, - -0.0 + 0.008076931356359346 ], [ 4.25, - -0.0 + 0.005306922061560424 ], [ 4.27, - -0.0 + 0.0033501731054429934 ], [ 4.29, - -0.0 + 0.00203198270379586 ], [ 4.31, - -0.0 + 0.0011841343694912112 + ], + [ + 4.33, + 0.0006629948992720826 + ], + [ + 4.35, + 0.00035665441821705824 + ], + [ + 4.37, + 0.00018433731200784715 + ], + [ + 4.39, + 9.153920008350869e-05 + ], + [ + 4.41, + 4.367462617550617e-05 + ], + [ + 4.43, + 2.002071118036049e-05 + ], + [ + 4.45, + 0.0 + ], + [ + 4.47, + 0.0 + ], + [ + 4.49, + 0.0 + ], + [ + 4.51, + 0.0 + ], + [ + 4.529999999999999, + 0.0 + ], + [ + 4.55, + 1.640661070533994e-06 + ], + [ + 4.569999999999999, + 3.5790566224524966e-06 + ], + [ + 4.59, + 7.501471883384446e-06 + ], + [ + 4.609999999999999, + 1.5106109315179071e-05 + ], + [ + 4.63, + 2.922718450564759e-05 + ], + [ + 4.6499999999999995, + 5.433123286176523e-05 + ], + [ + 4.67, + 9.703766988114383e-05 + ], + [ + 4.6899999999999995, + 0.0001665173074064718 + ], + [ + 4.71, + 0.0002745406266607622 + ], + [ + 4.7299999999999995, + 0.0004348926645173961 + ], + [ + 4.75, + 0.0006618899162160284 + ], + [ + 4.77, + 0.0009678714243846088 + ], + [ + 4.79, + 0.0013598086256645095 + ], + [ + 4.81, + 0.0018355496499710573 + ], + [ + 4.83, + 0.002380579566616291 + ], + [ + 4.85, + 0.0029663848032723517 + ], + [ + 4.87, + 0.0035514073921783353 + ], + [ + 4.89, + 0.004085090872290612 + ], + [ + 4.91, + 0.0045147236297518635 + ], + [ + 4.93, + 0.004890741722236741 + ], + [ + 4.95, + 0.0047938985476224496 + ], + [ + 4.97, + 0.0045147236297518635 + ], + [ + 4.99, + 0.004085090872290612 + ], + [ + 5.01, + 0.0035514073921783353 + ], + [ + 5.029999999999999, + 0.0029663848032723517 + ], + [ + 5.05, + 0.002380579566616291 + ], + [ + 5.069999999999999, + 0.0018355496499710573 + ], + [ + 5.09, + 0.0013598086256645095 + ], + [ + 5.109999999999999, + 0.0009678714243846088 + ], + [ + 5.13, + 0.0006618899162160284 + ], + [ + 5.1499999999999995, + 0.0004348926645173961 + ], + [ + 5.17, + 0.0002745406266607622 + ], + [ + 5.1899999999999995, + 0.0001665173074064718 + ], + [ + 5.21, + 9.703766988114383e-05 + ], + [ + 5.2299999999999995, + 5.433123286176523e-05 + ], + [ + 5.25, + 2.922718450564759e-05 + ], + [ + 5.27, + 1.5106109315179071e-05 + ], + [ + 5.29, + 7.501471883384446e-06 + ], + [ + 5.31, + 5.901535780351769e-06 ], [ - 4.33, - -0.0 + 5.33, + 6.707084940688874e-06 ], [ - 4.35, - -0.0 + 5.35, + 1.0618897720939612e-05 ], [ - 4.37, - -0.0 + 5.37, + 2.13838340358942e-05 ], [ - 4.39, - -0.0 + 5.39, + 4.1373278172773355e-05 ], [ - 4.41, - -0.0 + 5.41, + 7.690994697847759e-05 ], [ - 4.43, - -0.0 + 5.43, + 0.00013736412101051122 ], [ - 4.45, - -0.0 + 5.45, + 0.00023571777427202866 ], [ - 4.47, - -0.0 + 5.47, + 0.0003886329083243852 ], [ - 4.49, - -0.0 + 5.49, + 0.0006156232797894044 ], [ - 4.51, - -0.0 + 5.51, + 0.0009369549645833268 ], [ - 4.529999999999999, - -0.0 + 5.529999999999999, + 0.001370094805704089 ], [ - 4.55, - -0.0 + 5.55, + 0.0019249113961176544 ], [ - 4.569999999999999, - -0.0 + 5.569999999999999, + 0.0025983586018528356 ], [ - 4.59, - -0.0 + 5.59, + 0.003369889446689752 ], [ - 4.609999999999999, - -0.0 + 5.609999999999999, + 0.0041991408241720835 ], [ - 4.63, - -0.0 + 5.63, + 0.005027284304892447 ], [ - 4.6499999999999995, - -0.0 + 5.6499999999999995, + 0.00578275341532395 ], [ - 4.67, - -0.0 + 5.67, + 0.006390930901018657 ], [ - 4.6899999999999995, - -0.0 + 5.6899999999999995, + 0.0069232127954777815 ], [ - 4.71, - -0.0 + 5.71, + 0.006786123997147673 ], [ - 4.7299999999999995, - -0.0 + 5.7299999999999995, + 0.006390930901018657 ], [ - 4.75, - -0.0 + 5.75, + 0.00578275341532395 ], [ - 4.77, - -0.0 + 5.77, + 0.005027284304892447 ], [ - 4.79, - -0.0 + 5.79, + 0.0041991408241720835 ], [ - 4.81, - -0.0 + 5.81, + 0.003369889446689752 ], [ - 4.83, - -0.0 + 5.83, + 0.0025983586018528356 ], [ - 4.85, - -0.0 + 5.85, + 0.0019249113961176544 ], [ - 4.87, - -0.0 + 5.87, + 0.001370094805704089 ], [ - 4.89, - -0.0 + 5.89, + 0.0009369549645833268 ], [ - 4.91, - -0.0 + 5.91, + 0.0006156232797894044 ], [ - 4.93, - 0.05649999999999999 + 5.93, + 0.0003886329083243852 ], [ - 4.95, - -0.0 + 5.95, + 0.00023571777427202866 ], [ - 4.97, - -0.0 + 5.97, + 0.00013736412101051122 ], [ - 4.99, - -0.0 + 5.99, + 7.690994697847759e-05 ] ] ] }, "stdout": "" }, - "plot-bwdf --sigma 0.1": { + "plot-bwdf -maxlen 5": { "plot": { "facecolor": [ 1.0, @@ -56275,1003 +56475,1003 @@ [ [ 0.01, - 0.0 + -0.0 ], [ 0.03, - 0.0 + -0.0 ], [ 0.05, - 0.0 + -0.0 ], [ 0.06999999999999999, - 0.0 + -0.0 ], [ 0.09, - 0.0 + -0.0 ], [ 0.11, - 0.0 + -0.0 ], [ 0.13, - 0.0 + -0.0 ], [ 0.15000000000000002, - 0.0 + -0.0 ], [ 0.17, - 0.0 + -0.0 ], [ 0.19, - 0.0 + -0.0 ], [ 0.21000000000000002, - 0.0 + -0.0 ], [ 0.23, - 0.0 + -0.0 ], [ 0.25, - 0.0 + -0.0 ], [ 0.27, - 0.0 + -0.0 ], [ 0.29000000000000004, - 0.0 + -0.0 ], [ 0.31, - 0.0 + -0.0 ], [ 0.33, - 0.0 + -0.0 ], [ 0.35000000000000003, - 0.0 + -0.0 ], [ 0.37, - 0.0 + -0.0 ], [ 0.39, - 0.0 + -0.0 ], [ 0.41000000000000003, - 0.0 + -0.0 ], [ 0.43, - 0.0 + -0.0 ], [ 0.45, - 0.0 + -0.0 ], [ 0.47000000000000003, - 0.0 + -0.0 ], [ 0.49, - 0.0 + -0.0 ], [ 0.51, - 0.0 + -0.0 ], [ 0.53, - 0.0 + -0.0 ], [ 0.55, - 0.0 + -0.0 ], [ 0.5700000000000001, - 0.0 + -0.0 ], [ 0.59, - 0.0 + -0.0 ], [ 0.61, - 0.0 + -0.0 ], [ 0.63, - 0.0 + -0.0 ], [ 0.65, - 0.0 + -0.0 ], [ 0.67, - 0.0 + -0.0 ], [ 0.6900000000000001, - 0.0 + -0.0 ], [ 0.71, - 0.0 + -0.0 ], [ 0.73, - 0.0 + -0.0 ], [ 0.75, - 0.0 + -0.0 ], [ 0.77, - 0.0 + -0.0 ], [ 0.79, - 0.0 + -0.0 ], [ 0.81, - 0.0 + -0.0 ], [ 0.83, - 0.0 + -0.0 ], [ 0.85, - 0.0 + -0.0 ], [ 0.87, - 0.0 + -0.0 ], [ 0.89, - 0.0 + -0.0 ], [ 0.91, - 0.0 + -0.0 ], [ 0.93, - 0.0 + -0.0 ], [ 0.95, - 0.0 + -0.0 ], [ 0.97, - 0.0 + -0.0 ], [ 0.99, - 0.0 + -0.0 ], [ 1.01, - 0.0 + -0.0 ], [ 1.03, - 0.0 + -0.0 ], [ 1.05, - 0.0 + -0.0 ], [ 1.07, - 0.0 + -0.0 ], [ 1.09, - 0.0 + -0.0 ], [ 1.11, - 0.0 + -0.0 ], [ 1.1300000000000001, - 0.0 + -0.0 ], [ 1.15, - 0.0 + -0.0 ], [ 1.17, - 0.0 + -0.0 ], [ 1.19, - 0.0 + -0.0 ], [ 1.21, - 0.0 + -0.0 ], [ 1.23, - 0.0 + -0.0 ], [ 1.25, - 0.0 + -0.0 ], [ 1.27, - 0.0 + -0.0 ], [ 1.29, - 0.0 + -0.0 ], [ 1.31, - 0.0 + -0.0 ], [ 1.33, - 0.0 + -0.0 ], [ 1.35, - 0.0 + -0.0 ], [ 1.37, - 0.0 + -0.0 ], [ 1.39, - 0.0 + -0.0 ], [ 1.41, - 0.0 + -0.0 ], [ 1.43, - 0.0 + -0.0 ], [ 1.45, - 0.0 + -0.0 ], [ 1.47, - 0.0 + -0.0 ], [ 1.49, - 0.0 + -0.0 ], [ 1.51, - 0.0 + -0.0 ], [ 1.53, - 0.0 + -0.0 ], [ 1.55, - 0.0 + -0.0 ], [ 1.57, - 0.0 + -0.0 ], [ 1.59, - 0.0 + -0.0 ], [ 1.61, - 0.0 + -0.0 ], [ 1.6300000000000001, - 0.0 + -0.0 ], [ 1.65, - 0.0 + -0.0 ], [ 1.67, - 0.0 + -0.0 ], [ 1.69, - 0.0 + -0.0 ], [ 1.71, - 0.0 + -0.0 ], [ 1.73, - 0.0 + -0.0 ], [ 1.75, - 0.0 + -0.0 ], [ 1.77, - 0.0 + -0.0 ], [ 1.79, - 0.0 + -0.0 ], [ 1.81, - 0.0 + -0.0 ], [ 1.83, - 0.0 + -0.0 ], [ 1.85, - 0.0 + -0.0 ], [ 1.87, - 0.0 + -0.0 ], [ 1.89, - 0.0 + -0.0 ], [ 1.91, - 0.0 + -0.0 ], [ 1.93, - 0.0 + -0.0 ], [ 1.95, - 0.0 + -0.0 ], [ 1.97, - 0.0 + -0.0 ], [ 1.99, - 0.0 + -0.0 ], [ 2.01, - 0.0 + -0.0 ], [ 2.03, - 0.0 + -0.0 ], [ 2.05, - 0.0 + -0.0 ], [ 2.07, - 0.0 + -0.0 ], [ 2.09, - 0.0 + -0.0 ], [ 2.11, - 0.0 + -0.0 ], [ 2.13, - 0.0 + -0.0 ], [ 2.15, - 0.0 + -0.0 ], [ 2.17, - 0.0 + -0.0 ], [ 2.19, - 0.0 + -0.0 ], [ 2.21, - 0.0 + -0.0 ], [ 2.23, - 0.0 + -0.0 ], [ 2.25, - 0.0 + -0.0 ], [ 2.2699999999999996, - 0.0 + -0.0 ], [ 2.2899999999999996, - 0.0 + -0.0 ], [ 2.3099999999999996, - 0.0 + -0.0 ], [ 2.3299999999999996, - 0.0 + -0.0 ], [ 2.3499999999999996, - 0.0 + -0.0 ], [ 2.3699999999999997, - 0.0 + -0.0 ], [ 2.3899999999999997, - 0.0 + -0.0 ], [ 2.4099999999999997, - 0.0 + -0.0 ], [ 2.4299999999999997, - 0.0 + -0.0 ], [ 2.4499999999999997, - 0.0 + -0.0 ], [ 2.4699999999999998, - 0.0001970152274695678 + -0.0 ], [ 2.4899999999999998, - 0.0004297832546056816 + -0.0 ], [ 2.51, - 0.0009007979868630229 + -0.0 ], [ 2.53, - 0.0018139843849293655 + -0.0 ], [ 2.55, - 0.003509683082686321 + -0.0 ], [ 2.57, - 0.006524248300399316 + -0.0 ], [ 2.59, - 0.01165255819626901 + -0.0 ], [ 2.61, - 0.019995869826806047 + -0.0 ], [ 2.63, - 0.03296761590960603 + -0.0 ], [ 2.65, - 0.05222314270969713 + -0.0 ], [ 2.67, - 0.0794816155177445 + -0.0 ], [ 2.69, - 0.11622474151493396 + -0.0 ], [ 2.71, - 0.16328967055528293 + -0.0 ], [ 2.73, - 0.2204179999852325 + -0.0 ], [ 2.75, - 0.28586673582354377 + -0.0 ], [ 2.7699999999999996, - 0.3562118875586879 + -0.0 ], [ 2.7899999999999996, - 0.4264630567356551 + -0.0 ], [ 2.8099999999999996, - 0.49054928034358714 + -0.0 ], [ 2.8299999999999996, - 0.5421407985186705 + -0.0 ], [ 2.8499999999999996, - 0.5872941158942511 + 6.78468 ], [ 2.8699999999999997, - 0.5756649132404086 + -0.0 ], [ 2.8899999999999997, - 0.5421407985186705 + -0.0 ], [ 2.9099999999999997, - 0.49054928034358714 + -0.0 ], [ 2.9299999999999997, - 0.4264630567356551 + -0.0 ], [ 2.9499999999999997, - 0.3562118875586879 + -0.0 ], [ 2.9699999999999998, - 0.28586673582354377 + -0.0 ], [ 2.9899999999999998, - 0.2204179999852325 + -0.0 ], [ 3.01, - 0.16328967055528293 + -0.0 ], [ 3.03, - 0.11622474151493396 + -0.0 ], [ 3.05, - 0.0794816155177445 + -0.0 ], [ 3.07, - 0.05222314270969713 + -0.0 ], [ 3.09, - 0.03296761590960603 + -0.0 ], [ 3.11, - 0.019995869826806047 + -0.0 ], [ 3.13, - 0.01165255819626901 + -0.0 ], [ 3.15, - 0.006524248300399316 + -0.0 ], [ 3.17, - 0.003509683082686321 + -0.0 ], [ 3.19, - 0.0018139843849293655 + -0.0 ], [ 3.21, - 0.0009007979868630229 + -0.0 ], [ 3.23, - 0.0004297832546056816 + -0.0 ], [ 3.25, - 0.0001970152274695678 + -0.0 ], [ 3.2699999999999996, - 0.0 + -0.0 ], [ 3.2899999999999996, - 0.0 + -0.0 ], [ 3.3099999999999996, - 0.0 + -0.0 ], [ 3.3299999999999996, - 0.0 + -0.0 ], [ 3.3499999999999996, - 0.0 + -0.0 ], [ 3.3699999999999997, - 0.0 + -0.0 ], [ 3.3899999999999997, - 0.0 + -0.0 ], [ 3.4099999999999997, - 0.0 + -0.0 ], [ 3.4299999999999997, - 0.0 + -0.0 ], [ 3.4499999999999997, - 0.0 + -0.0 ], [ 3.4699999999999998, - 0.0 + -0.0 ], [ 3.4899999999999998, - 0.0 + -0.0 ], [ 3.51, - 0.0 + -0.0 ], [ 3.53, - 0.0 + -0.0 ], [ 3.55, - 0.0 + -0.0 ], [ 3.57, - 0.0 + -0.0 ], [ 3.59, - 0.0 + -0.0 ], [ 3.61, - 0.0 + -0.0 ], [ 3.63, - 0.0 + -0.0 ], [ 3.65, - 2.002071118036049e-05 + -0.0 ], [ 3.67, - 4.367462617550617e-05 + -0.0 ], [ 3.69, - 9.153920008350869e-05 + -0.0 ], [ 3.71, - 0.00018433731200784715 + -0.0 ], [ 3.73, - 0.00035665441821705824 + -0.0 ], [ 3.75, - 0.0006629948992720826 + -0.0 ], [ 3.7699999999999996, - 0.0011841343694912112 + -0.0 ], [ 3.7899999999999996, - 0.00203198270379586 + -0.0 ], [ 3.8099999999999996, - 0.0033501731054429934 + -0.0 ], [ 3.8299999999999996, - 0.005306922061560424 + -0.0 ], [ 3.8499999999999996, - 0.008076931356359346 + -0.0 ], [ 3.8699999999999997, - 0.011810772252322344 + -0.0 ], [ 3.8899999999999997, - 0.016593516018595628 + -0.0 ], [ 3.9099999999999997, - 0.022398903746354788 + -0.0 ], [ 3.9299999999999997, - 0.029049812176978208 + -0.0 ], [ 3.9499999999999997, - 0.03619829498166648 + -0.0 ], [ 3.9699999999999998, - 0.0433372272674562 + -0.0 ], [ 3.9899999999999998, - 0.04984967704087585 + -0.0 ], [ 4.01, - 0.0550924133410393 + -0.0 ], [ 4.029999999999999, - 0.05968089889935123 + 0.68946 ], [ 4.05, - 0.05849913792289866 + -0.0 ], [ 4.069999999999999, - 0.0550924133410393 + -0.0 ], [ 4.09, - 0.04984967704087585 + -0.0 ], [ 4.109999999999999, - 0.0433372272674562 + -0.0 ], [ 4.13, - 0.03619829498166648 + -0.0 ], [ 4.1499999999999995, - 0.029049812176978208 + -0.0 ], [ 4.17, - 0.022398903746354788 + -0.0 ], [ 4.1899999999999995, - 0.016593516018595628 + -0.0 ], [ 4.21, - 0.011810772252322344 + -0.0 ], [ 4.2299999999999995, - 0.008076931356359346 + -0.0 ], [ 4.25, - 0.005306922061560424 + -0.0 ], [ 4.27, - 0.0033501731054429934 + -0.0 ], [ 4.29, - 0.00203198270379586 + -0.0 ], [ 4.31, - 0.0011841343694912112 + -0.0 ], [ 4.33, - 0.0006629948992720826 + -0.0 ], [ 4.35, - 0.00035665441821705824 + -0.0 ], [ 4.37, - 0.00018433731200784715 + -0.0 ], [ 4.39, - 9.153920008350869e-05 + -0.0 ], [ 4.41, - 4.367462617550617e-05 + -0.0 ], [ 4.43, - 2.002071118036049e-05 + -0.0 ], [ 4.45, - 0.0 + -0.0 ], [ 4.47, - 0.0 + -0.0 ], [ 4.49, - 0.0 + -0.0 ], [ 4.51, - 0.0 + -0.0 ], [ 4.529999999999999, - 0.0 + -0.0 ], [ 4.55, - 1.640661070533994e-06 + -0.0 ], [ 4.569999999999999, - 3.5790566224524966e-06 + -0.0 ], [ 4.59, - 7.501471883384446e-06 + -0.0 ], [ 4.609999999999999, - 1.5106109315179071e-05 + -0.0 ], [ 4.63, - 2.922718450564759e-05 + -0.0 ], [ 4.6499999999999995, - 5.433123286176523e-05 + -0.0 ], [ 4.67, - 9.703766988114383e-05 + -0.0 ], [ 4.6899999999999995, - 0.0001665173074064718 + -0.0 ], [ 4.71, - 0.0002745406266607622 + -0.0 ], [ 4.7299999999999995, - 0.0004348926645173961 + -0.0 ], [ 4.75, - 0.0006618899162160284 + -0.0 ], [ 4.77, - 0.0009678714243846088 + -0.0 ], [ 4.79, - 0.0013598086256645095 + -0.0 ], [ 4.81, - 0.0018355496499710573 + -0.0 ], [ 4.83, - 0.002380579566616291 + -0.0 ], [ 4.85, - 0.0029663848032723517 + -0.0 ], [ 4.87, - 0.0035514073921783353 + -0.0 ], [ 4.89, - 0.004085090872290612 + -0.0 ], [ 4.91, - 0.0045147236297518635 + -0.0 ], [ 4.93, - 0.004890741722236741 + 0.05649999999999999 ], [ 4.95, - 0.0047938985476224496 + -0.0 ], [ 4.97, - 0.0045147236297518635 + -0.0 ], [ 4.99, - 0.004085090872290612 + -0.0 ] ] ] @@ -58093,203 +58293,403 @@ -0.0 ], [ - 4.01, + 4.01, + -0.0 + ], + [ + 4.029999999999999, + 0.0287275 + ], + [ + 4.05, + -0.0 + ], + [ + 4.069999999999999, + -0.0 + ], + [ + 4.09, + -0.0 + ], + [ + 4.109999999999999, + -0.0 + ], + [ + 4.13, + -0.0 + ], + [ + 4.1499999999999995, + -0.0 + ], + [ + 4.17, + -0.0 + ], + [ + 4.1899999999999995, + -0.0 + ], + [ + 4.21, + -0.0 + ], + [ + 4.2299999999999995, + -0.0 + ], + [ + 4.25, + -0.0 + ], + [ + 4.27, + -0.0 + ], + [ + 4.29, + -0.0 + ], + [ + 4.31, + -0.0 + ], + [ + 4.33, + -0.0 + ], + [ + 4.35, + -0.0 + ], + [ + 4.37, + -0.0 + ], + [ + 4.39, + -0.0 + ], + [ + 4.41, + -0.0 + ], + [ + 4.43, + -0.0 + ], + [ + 4.45, + -0.0 + ], + [ + 4.47, + -0.0 + ], + [ + 4.49, + -0.0 + ], + [ + 4.51, + -0.0 + ], + [ + 4.529999999999999, + -0.0 + ], + [ + 4.55, + -0.0 + ], + [ + 4.569999999999999, + -0.0 + ], + [ + 4.59, + -0.0 + ], + [ + 4.609999999999999, + -0.0 + ], + [ + 4.63, + -0.0 + ], + [ + 4.6499999999999995, + -0.0 + ], + [ + 4.67, + -0.0 + ], + [ + 4.6899999999999995, + -0.0 + ], + [ + 4.71, + -0.0 + ], + [ + 4.7299999999999995, + -0.0 + ], + [ + 4.75, + -0.0 + ], + [ + 4.77, + -0.0 + ], + [ + 4.79, + -0.0 + ], + [ + 4.81, + -0.0 + ], + [ + 4.83, + -0.0 + ], + [ + 4.85, + -0.0 + ], + [ + 4.87, + -0.0 + ], + [ + 4.89, + -0.0 + ], + [ + 4.91, + -0.0 + ], + [ + 4.93, + 0.0035312499999999992 + ], + [ + 4.95, + -0.0 + ], + [ + 4.97, + -0.0 + ], + [ + 4.99, + -0.0 + ], + [ + 5.01, -0.0 ], [ - 4.029999999999999, - 0.0287275 + 5.029999999999999, + -0.0 ], [ - 4.05, + 5.05, -0.0 ], [ - 4.069999999999999, + 5.069999999999999, -0.0 ], [ - 4.09, + 5.09, -0.0 ], [ - 4.109999999999999, + 5.109999999999999, -0.0 ], [ - 4.13, + 5.13, -0.0 ], [ - 4.1499999999999995, + 5.1499999999999995, -0.0 ], [ - 4.17, + 5.17, -0.0 ], [ - 4.1899999999999995, + 5.1899999999999995, -0.0 ], [ - 4.21, + 5.21, -0.0 ], [ - 4.2299999999999995, + 5.2299999999999995, -0.0 ], [ - 4.25, + 5.25, -0.0 ], [ - 4.27, + 5.27, -0.0 ], [ - 4.29, + 5.29, -0.0 ], [ - 4.31, + 5.31, -0.0 ], [ - 4.33, + 5.33, -0.0 ], [ - 4.35, + 5.35, -0.0 ], [ - 4.37, + 5.37, -0.0 ], [ - 4.39, + 5.39, -0.0 ], [ - 4.41, + 5.41, -0.0 ], [ - 4.43, + 5.43, -0.0 ], [ - 4.45, + 5.45, -0.0 ], [ - 4.47, + 5.47, -0.0 ], [ - 4.49, + 5.49, -0.0 ], [ - 4.51, + 5.51, -0.0 ], [ - 4.529999999999999, + 5.529999999999999, -0.0 ], [ - 4.55, + 5.55, -0.0 ], [ - 4.569999999999999, + 5.569999999999999, -0.0 ], [ - 4.59, + 5.59, -0.0 ], [ - 4.609999999999999, + 5.609999999999999, -0.0 ], [ - 4.63, + 5.63, -0.0 ], [ - 4.6499999999999995, + 5.6499999999999995, -0.0 ], [ - 4.67, + 5.67, -0.0 ], [ - 4.6899999999999995, - -0.0 + 5.6899999999999995, + 0.01333 ], [ - 4.71, + 5.71, -0.0 ], [ - 4.7299999999999995, + 5.7299999999999995, -0.0 ], [ - 4.75, + 5.75, -0.0 ], [ - 4.77, + 5.77, -0.0 ], [ - 4.79, + 5.79, -0.0 ], [ - 4.81, + 5.81, -0.0 ], [ - 4.83, + 5.83, -0.0 ], [ - 4.85, + 5.85, -0.0 ], [ - 4.87, + 5.87, -0.0 ], [ - 4.89, + 5.89, -0.0 ], [ - 4.91, + 5.91, -0.0 ], [ - 4.93, - 0.0035312499999999992 + 5.93, + -0.0 ], [ - 4.95, + 5.95, -0.0 ], [ - 4.97, + 5.97, -0.0 ], [ - 4.99, + 5.99, -0.0 ] ] @@ -59028,303 +59428,503 @@ -0.0 ], [ - 3.51, + 3.51, + -0.0 + ], + [ + 3.53, + -0.0 + ], + [ + 3.55, + -0.0 + ], + [ + 3.57, + -0.0 + ], + [ + 3.59, + -0.0 + ], + [ + 3.61, + -0.0 + ], + [ + 3.63, + -0.0 + ], + [ + 3.65, + -0.0 + ], + [ + 3.67, + -0.0 + ], + [ + 3.69, + -0.0 + ], + [ + 3.71, + -0.0 + ], + [ + 3.73, + -0.0 + ], + [ + 3.75, + -0.0 + ], + [ + 3.7699999999999996, + -0.0 + ], + [ + 3.7899999999999996, + -0.0 + ], + [ + 3.8099999999999996, + -0.0 + ], + [ + 3.8299999999999996, + -0.0 + ], + [ + 3.8499999999999996, + -0.0 + ], + [ + 3.8699999999999997, + -0.0 + ], + [ + 3.8899999999999997, + -0.0 + ], + [ + 3.9099999999999997, + -0.0 + ], + [ + 3.9299999999999997, + -0.0 + ], + [ + 3.9499999999999997, + -0.0 + ], + [ + 3.9699999999999998, + -0.0 + ], + [ + 3.9899999999999998, + -0.0 + ], + [ + 4.01, + -0.0 + ], + [ + 4.029999999999999, + 0.68946 + ], + [ + 4.05, + -0.0 + ], + [ + 4.069999999999999, + -0.0 + ], + [ + 4.09, + -0.0 + ], + [ + 4.109999999999999, + -0.0 + ], + [ + 4.13, + -0.0 + ], + [ + 4.1499999999999995, + -0.0 + ], + [ + 4.17, + -0.0 + ], + [ + 4.1899999999999995, + -0.0 + ], + [ + 4.21, + -0.0 + ], + [ + 4.2299999999999995, + -0.0 + ], + [ + 4.25, + -0.0 + ], + [ + 4.27, + -0.0 + ], + [ + 4.29, + -0.0 + ], + [ + 4.31, + -0.0 + ], + [ + 4.33, + -0.0 + ], + [ + 4.35, + -0.0 + ], + [ + 4.37, + -0.0 + ], + [ + 4.39, + -0.0 + ], + [ + 4.41, + -0.0 + ], + [ + 4.43, + -0.0 + ], + [ + 4.45, + -0.0 + ], + [ + 4.47, + -0.0 + ], + [ + 4.49, + -0.0 + ], + [ + 4.51, -0.0 ], [ - 3.53, + 4.529999999999999, -0.0 ], [ - 3.55, + 4.55, -0.0 ], [ - 3.57, + 4.569999999999999, -0.0 ], [ - 3.59, + 4.59, -0.0 ], [ - 3.61, + 4.609999999999999, -0.0 ], [ - 3.63, + 4.63, -0.0 ], [ - 3.65, + 4.6499999999999995, -0.0 ], [ - 3.67, + 4.67, -0.0 ], [ - 3.69, + 4.6899999999999995, -0.0 ], [ - 3.71, + 4.71, -0.0 ], [ - 3.73, + 4.7299999999999995, -0.0 ], [ - 3.75, + 4.75, -0.0 ], [ - 3.7699999999999996, + 4.77, -0.0 ], [ - 3.7899999999999996, + 4.79, -0.0 ], [ - 3.8099999999999996, + 4.81, -0.0 ], [ - 3.8299999999999996, + 4.83, -0.0 ], [ - 3.8499999999999996, + 4.85, -0.0 ], [ - 3.8699999999999997, + 4.87, -0.0 ], [ - 3.8899999999999997, + 4.89, -0.0 ], [ - 3.9099999999999997, + 4.91, -0.0 ], [ - 3.9299999999999997, - -0.0 + 4.93, + 0.05649999999999999 ], [ - 3.9499999999999997, + 4.95, -0.0 ], [ - 3.9699999999999998, + 4.97, -0.0 ], [ - 3.9899999999999998, + 4.99, -0.0 ], [ - 4.01, + 5.01, -0.0 ], [ - 4.029999999999999, - 0.68946 + 5.029999999999999, + -0.0 ], [ - 4.05, + 5.05, -0.0 ], [ - 4.069999999999999, + 5.069999999999999, -0.0 ], [ - 4.09, + 5.09, -0.0 ], [ - 4.109999999999999, + 5.109999999999999, -0.0 ], [ - 4.13, + 5.13, -0.0 ], [ - 4.1499999999999995, + 5.1499999999999995, -0.0 ], [ - 4.17, + 5.17, -0.0 ], [ - 4.1899999999999995, + 5.1899999999999995, -0.0 ], [ - 4.21, + 5.21, -0.0 ], [ - 4.2299999999999995, + 5.2299999999999995, -0.0 ], [ - 4.25, + 5.25, -0.0 ], [ - 4.27, + 5.27, -0.0 ], [ - 4.29, + 5.29, -0.0 ], [ - 4.31, + 5.31, -0.0 ], [ - 4.33, + 5.33, -0.0 ], [ - 4.35, + 5.35, -0.0 ], [ - 4.37, + 5.37, -0.0 ], [ - 4.39, + 5.39, -0.0 ], [ - 4.41, + 5.41, -0.0 ], [ - 4.43, + 5.43, -0.0 ], [ - 4.45, + 5.45, -0.0 ], [ - 4.47, + 5.47, -0.0 ], [ - 4.49, + 5.49, -0.0 ], [ - 4.51, + 5.51, -0.0 ], [ - 4.529999999999999, + 5.529999999999999, -0.0 ], [ - 4.55, + 5.55, -0.0 ], [ - 4.569999999999999, + 5.569999999999999, -0.0 ], [ - 4.59, + 5.59, -0.0 ], [ - 4.609999999999999, + 5.609999999999999, -0.0 ], [ - 4.63, + 5.63, -0.0 ], [ - 4.6499999999999995, + 5.6499999999999995, -0.0 ], [ - 4.67, + 5.67, -0.0 ], [ - 4.6899999999999995, - -0.0 + 5.6899999999999995, + 0.07998 ], [ - 4.71, + 5.71, -0.0 ], [ - 4.7299999999999995, + 5.7299999999999995, -0.0 ], [ - 4.75, + 5.75, -0.0 ], [ - 4.77, + 5.77, -0.0 ], [ - 4.79, + 5.79, -0.0 ], [ - 4.81, + 5.81, -0.0 ], [ - 4.83, + 5.83, -0.0 ], [ - 4.85, + 5.85, -0.0 ], [ - 4.87, + 5.87, -0.0 ], [ - 4.89, + 5.89, -0.0 ], [ - 4.91, + 5.91, -0.0 ], [ - 4.93, - 0.05649999999999999 + 5.93, + -0.0 ], [ - 4.95, + 5.95, -0.0 ], [ - 4.97, + 5.97, -0.0 ], [ - 4.99, + 5.99, -0.0 ] ] @@ -60345,6 +60945,206 @@ [ 4.99, -0.0 + ], + [ + 5.01, + -0.0 + ], + [ + 5.029999999999999, + -0.0 + ], + [ + 5.05, + -0.0 + ], + [ + 5.069999999999999, + -0.0 + ], + [ + 5.09, + -0.0 + ], + [ + 5.109999999999999, + -0.0 + ], + [ + 5.13, + -0.0 + ], + [ + 5.1499999999999995, + -0.0 + ], + [ + 5.17, + -0.0 + ], + [ + 5.1899999999999995, + -0.0 + ], + [ + 5.21, + -0.0 + ], + [ + 5.2299999999999995, + -0.0 + ], + [ + 5.25, + -0.0 + ], + [ + 5.27, + -0.0 + ], + [ + 5.29, + -0.0 + ], + [ + 5.31, + -0.0 + ], + [ + 5.33, + -0.0 + ], + [ + 5.35, + -0.0 + ], + [ + 5.37, + -0.0 + ], + [ + 5.39, + -0.0 + ], + [ + 5.41, + -0.0 + ], + [ + 5.43, + -0.0 + ], + [ + 5.45, + -0.0 + ], + [ + 5.47, + -0.0 + ], + [ + 5.49, + -0.0 + ], + [ + 5.51, + -0.0 + ], + [ + 5.529999999999999, + -0.0 + ], + [ + 5.55, + -0.0 + ], + [ + 5.569999999999999, + -0.0 + ], + [ + 5.59, + -0.0 + ], + [ + 5.609999999999999, + -0.0 + ], + [ + 5.63, + -0.0 + ], + [ + 5.6499999999999995, + -0.0 + ], + [ + 5.67, + -0.0 + ], + [ + 5.6899999999999995, + 0.07998 + ], + [ + 5.71, + -0.0 + ], + [ + 5.7299999999999995, + -0.0 + ], + [ + 5.75, + -0.0 + ], + [ + 5.77, + -0.0 + ], + [ + 5.79, + -0.0 + ], + [ + 5.81, + -0.0 + ], + [ + 5.83, + -0.0 + ], + [ + 5.85, + -0.0 + ], + [ + 5.87, + -0.0 + ], + [ + 5.89, + -0.0 + ], + [ + 5.91, + -0.0 + ], + [ + 5.93, + -0.0 + ], + [ + 5.95, + -0.0 + ], + [ + 5.97, + -0.0 + ], + [ + 5.99, + -0.0 ] ] ] From 5b8b4b40edf6613898882f727373b0b9a8fdf06f Mon Sep 17 00:00:00 2001 From: naik-aakash Date: Fri, 10 Jan 2025 08:50:51 +0100 Subject: [PATCH 22/30] minor change in bwdf cli tests --- tests/cli/test_cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/cli/test_cli.py b/tests/cli/test_cli.py index d011f149..5b0d4ead 100644 --- a/tests/cli/test_cli.py +++ b/tests/cli/test_cli.py @@ -44,7 +44,7 @@ ["plot", "1", "--sigma", "1.2"], ["plot", "1", "--fwhm", "1"], ["plot-icohp-distance", "-cbonds"], - ["plot-bwdf"], + ["plot-bwdf", "-maxlen", "5"], ["plot-bwdf", "--sigma", "0.1"], ["plot-bwdf", "-norm", "counts"], ["plotbwdf", "-binwidth", "0.02"], From 0a8441e332730c0b07c68100518530a34589b42e Mon Sep 17 00:00:00 2001 From: naik-aakash Date: Fri, 10 Jan 2025 10:28:09 +0100 Subject: [PATCH 23/30] split bwdf plotter to seperate class and update cli accordingly --- src/lobsterpy/cli.py | 62 ++++++++++++++------ src/lobsterpy/plotting/__init__.py | 94 +++++++++++++++++++----------- 2 files changed, 104 insertions(+), 52 deletions(-) diff --git a/src/lobsterpy/cli.py b/src/lobsterpy/cli.py index f62bbfe6..1a198a21 100644 --- a/src/lobsterpy/cli.py +++ b/src/lobsterpy/cli.py @@ -23,6 +23,7 @@ from lobsterpy.featurize.core import FeaturizeIcoxxlist from lobsterpy.featurize.utils import get_file_paths from lobsterpy.plotting import ( + BWDFPlotter, IcohpDistancePlotter, InteractiveCohpPlotter, PlainCohpPlotter, @@ -1053,8 +1054,6 @@ def run(args): bwdf = feat_icoxx.calc_site_bwdf(site_index=args.siteindex) if args.siteindex else feat_icoxx.calc_bwdf() - formatted_bwdf = IcohpDistancePlotter.bwdf_data_to_plot(bwdf) - # Set label for plot (legend) if args.siteindex: site = feat_icoxx.structure.sites[args.siteindex] @@ -1062,23 +1061,50 @@ def run(args): else: label = feat_icoxx.structure.composition.get_reduced_formula_and_factor()[0] - icohp_dist_plotter = IcohpDistancePlotter(are_coops=args.coops, are_cobis=args.cobis) - - # Assimilate data for plotting - plot_data_dicts = {} - for pair, bwdf_data in formatted_bwdf.items(): - if args.atompairs and pair != "summed": - plot_data_dicts.update({pair: bwdf_data}) - elif not args.atompairs and pair == "summed": # for only summed bwdf - plot_data_dicts.update({pair: bwdf_data}) - elif not args.atompairs and pair == str(args.siteindex): # for site specific bwdf - plot_data_dicts.update({pair: bwdf_data}) - - # Iterate over all pairs and plot - for pair, bwdf_data in plot_data_dicts.items(): - bwdf_dict = {pair: bwdf_data} + icohp_dist_plotter = BWDFPlotter(are_coops=args.coops, are_cobis=args.cobis) + + # Assimilate data to get separate plots for each pair + plot_data = [] + for pair, value in bwdf.items(): + if args.atompairs and pair not in ["summed", "centers", "edges", "bin_width", "wasserstein_dist_to_rdf"]: + data = {pair: value} + data.update( + { + "centers": bwdf["centers"], + "edges": bwdf["edges"], + "bin_width": bwdf["bin_width"], + "wasserstein_dist_to_rdf": bwdf["wasserstein_dist_to_rdf"], + } + ) + plot_data.append(data) + elif not args.atompairs and pair == "summed": # summed only + data = {pair: value} + data.update( + { + "centers": bwdf["centers"], + "edges": bwdf["edges"], + "bin_width": bwdf["bin_width"], + "wasserstein_dist_to_rdf": bwdf["wasserstein_dist_to_rdf"], + } + ) + plot_data.append(data) + elif not args.atompairs and pair == str(args.siteindex): # specific site + data = {pair: value} + data.update( + { + "centers": bwdf["centers"], + "edges": bwdf["edges"], + "bin_width": bwdf["bin_width"], + "wasserstein_dist_to_rdf": bwdf["wasserstein_dist_to_rdf"], + } + ) + plot_data.append(data) + + # Iterate over assimilated data and plot + for bwdf_dict in plot_data: + pair = next(iter(bwdf_dict.keys())) icohp_dist_plotter.add_bwdf(bwdf=bwdf_dict, label=label) - plot = icohp_dist_plotter.get_bwdf_plot(sigma=args.sigma, xlim=args.xlim, ylim=args.ylim) + plot = icohp_dist_plotter.get_plot(sigma=args.sigma, xlim=args.xlim, ylim=args.ylim) title = f"{args.title} : {pair}" if args.title else "" plot.title(title) diff --git a/src/lobsterpy/plotting/__init__.py b/src/lobsterpy/plotting/__init__.py index c95d1867..b6ce16e5 100644 --- a/src/lobsterpy/plotting/__init__.py +++ b/src/lobsterpy/plotting/__init__.py @@ -1110,39 +1110,6 @@ def __init__(self, are_coops: bool = False, are_cobis: bool = False): self.are_coops = are_coops self.are_cobis = are_cobis self._icohps = {} # type: ignore - self._bwdfs = {} # type: ignore - - @staticmethod - def bwdf_data_to_plot(raw_bwdf: dict): - """ - Restructure bond weighted distribution function (BWDF) data for plotting. - - :param raw_bwdf: dict containing BWDF data as obtained from FeaturizeIcoxxlist. - - """ - # Keep only the BWDF data necessary for plotting - excluded_keys = {"centers", "edges", "bin_width", "wasserstein_dist_to_rdf"} - - for pair, value in raw_bwdf.items(): - if pair not in excluded_keys: - value.update({"centers": raw_bwdf.get("centers")}) - value.pop("icoxx_counts") - - for key in excluded_keys: - raw_bwdf.pop(key) - - return raw_bwdf - - def add_bwdf(self, label: str, bwdf: dict): - """ - Add bond weighted distribution function (BWDF) for plotting. - - :param label: Label for the BWDF. Must be unique. - :param bwdf: dict containing BWDF data formatted with - IcohpDistancePlotter.bwdf_data_to_plot. - - """ - self._bwdfs[label] = bwdf def add_icohps(self, label: str, icohpcollection: IcohpCollection): """ @@ -1269,7 +1236,66 @@ def get_plot( return plt - def get_bwdf_plot( + +class BWDFPlotter: + """ + Plotter to generate Bond weighted distribution functions using ICOHP or ICOBI or ICOOP as weights. + + :param are_coops: Bool indicating that populations are ICOOPs, not ICOHPs. + Defaults to False for COHPs. + :param are_cobis: Bool indicating that populations are ICOBIs, not ICOHPs. + Defaults to False for COHPs. + """ + + COLOR_PALETTE = [ + "#e41a1c", + "#377eb8", + "#4daf4a", + "#984ea3", + "#ff7f00", + "#ffff33", + "#a65628", + "#f781bf", + "#999999", + ] + + def __init__(self, are_coops: bool = False, are_cobis: bool = False): + """Initialize ICOHPs or ICOBI or ICOOP vs bond lengths plotter.""" + self.are_coops = are_coops + self.are_cobis = are_cobis + self._bwdfs = {} # type: ignore + + @staticmethod + def _bwdf_data_to_plot(raw_bwdf: dict): + """ + Restructure bond weighted distribution function (BWDF) data for plotting. + + :param raw_bwdf: dict containing BWDF data as obtained from + FeaturizeIcoxxlist.calc_bwdf() or FeaturizeIcoxxlist.calc_site_bwdf() + + """ + # Keep only the BWDF data necessary for plotting + excluded_keys = {"centers", "edges", "bin_width", "wasserstein_dist_to_rdf"} + + formatted_bwdf = {} + for pair, value in raw_bwdf.items(): + if pair not in excluded_keys: + formatted_bwdf[pair] = {"centers": raw_bwdf.get("centers"), "icoxx_binned": value.get("icoxx_binned")} + + return formatted_bwdf + + def add_bwdf(self, label: str, bwdf: dict): + """ + Add bond weighted distribution function (BWDF) for plotting. + + :param label: Label for the BWDF. Must be unique. + :param bwdf: dict containing BWDF data as obtained from + FeaturizeIcoxxlist.calc_bwdf() or FeaturizeIcoxxlist.calc_site_bwdf() + + """ + self._bwdfs[label] = self._bwdf_data_to_plot(bwdf) + + def get_plot( self, ax: mpl.axes.Axes | None = None, colors: list[str] | None = None, From a31a62c0595274aff5df55ae6221dc3ef4192c26 Mon Sep 17 00:00:00 2001 From: naik-aakash Date: Fri, 10 Jan 2025 10:42:37 +0100 Subject: [PATCH 24/30] rename vairable --- src/lobsterpy/cli.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lobsterpy/cli.py b/src/lobsterpy/cli.py index 1a198a21..47801e2e 100644 --- a/src/lobsterpy/cli.py +++ b/src/lobsterpy/cli.py @@ -1061,7 +1061,7 @@ def run(args): else: label = feat_icoxx.structure.composition.get_reduced_formula_and_factor()[0] - icohp_dist_plotter = BWDFPlotter(are_coops=args.coops, are_cobis=args.cobis) + bwdf_plotter = BWDFPlotter(are_coops=args.coops, are_cobis=args.cobis) # Assimilate data to get separate plots for each pair plot_data = [] @@ -1103,8 +1103,8 @@ def run(args): # Iterate over assimilated data and plot for bwdf_dict in plot_data: pair = next(iter(bwdf_dict.keys())) - icohp_dist_plotter.add_bwdf(bwdf=bwdf_dict, label=label) - plot = icohp_dist_plotter.get_plot(sigma=args.sigma, xlim=args.xlim, ylim=args.ylim) + bwdf_plotter.add_bwdf(bwdf=bwdf_dict, label=label) + plot = bwdf_plotter.get_plot(sigma=args.sigma, xlim=args.xlim, ylim=args.ylim) title = f"{args.title} : {pair}" if args.title else "" plot.title(title) From 14e23cf28438e5338fb3c40140bdb3a53b8c3104 Mon Sep 17 00:00:00 2001 From: naik-aakash Date: Fri, 10 Jan 2025 10:42:51 +0100 Subject: [PATCH 25/30] update tutorial --- docs/tutorial/tutorial.ipynb | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/docs/tutorial/tutorial.ipynb b/docs/tutorial/tutorial.ipynb index 35672ff2..8c83733e 100644 --- a/docs/tutorial/tutorial.ipynb +++ b/docs/tutorial/tutorial.ipynb @@ -409,7 +409,7 @@ "from matplotlib import style\n", "from pymatgen.io.lobster import Doscar, Icohplist\n", "from lobsterpy.featurize.core import FeaturizeIcoxxlist\n", - "from lobsterpy.plotting import InteractiveCohpPlotter, IcohpDistancePlotter, PlainCohpPlotter, PlainDosPlotter, get_style_list" + "from lobsterpy.plotting import BWDFPlotter, InteractiveCohpPlotter, IcohpDistancePlotter, PlainCohpPlotter, PlainDosPlotter, get_style_list" ] }, { @@ -618,17 +618,6 @@ "bwdf = feat_icoxx.calc_bwdf() # this method will compute the BWDF for the entire structure and all unique atom pairs" ] }, - { - "cell_type": "code", - "execution_count": null, - "id": "cf8dc25a-3606-4ace-a5c4-ef21695ce4d9", - "metadata": {}, - "outputs": [], - "source": [ - "# getting data required for plotting (important to transform the data required by the plotter)\n", - "plot_bwdf_data = IcohpDistancePlotter.bwdf_data_to_plot(bwdf) " - ] - }, { "cell_type": "code", "execution_count": null, @@ -637,9 +626,9 @@ "outputs": [], "source": [ "# Plotting\n", - "icohp_plotter = IcohpDistancePlotter(are_cobis=False, are_coops=False) # If reading and plotting ICOBIs or ICOOPs set args accordingly\n", - "icohp_plotter.add_bwdf(label=\"CdF2\", bwdf=plot_bwdf_data)\n", - "icohp_plotter.get_bwdf_plot(sigma=0.3);" + "bwdf_plotter = BWDFPlotter(are_cobis=False, are_coops=False) # If reading and plotting ICOBIs or ICOOPs set args accordingly\n", + "bwdf_plotter.add_bwdf(label=\"CdF2\", bwdf=bwdf) # Add the BWDF data\n", + "bwdf_plotter.get_bwdf_plot(sigma=0.3);" ] }, { @@ -651,12 +640,11 @@ "source": [ "# One can also compute and plot BWDF for a single site of the structure\n", "bwdf = feat_icoxx.calc_site_bwdf(site_index=1)\n", - "plot_bwdf_data = IcohpDistancePlotter.bwdf_data_to_plot(bwdf) # transform the data for plotting\n", "\n", "# Plotting\n", - "icohp_plotter = IcohpDistancePlotter(are_cobis=False, are_coops=False) # If reading and plotting ICOBIs or ICOOPs set args accordingly\n", - "icohp_plotter.add_bwdf(label=\"CdF2\", bwdf=plot_bwdf_data)\n", - "icohp_plotter.get_bwdf_plot(sigma=0.3);" + "bwdf_plotter = BWDFPlotter(are_cobis=False, are_coops=False) # If reading and plotting ICOBIs or ICOOPs set args accordingly\n", + "bwdf_plotter.add_bwdf(label=\"CdF2\", bwdf=bwdf) # Add the BWDF data\n", + "bwdf_plotter.get_bwdf_plot(sigma=0.3);" ] }, { From 7052ec18eae149671ddcde4795112a50066b1a01 Mon Sep 17 00:00:00 2001 From: naik-aakash Date: Fri, 10 Jan 2025 12:13:29 +0100 Subject: [PATCH 26/30] fix tutorial --- docs/tutorial/tutorial.ipynb | 298 ++++++++++++++++++++++++++++++----- 1 file changed, 262 insertions(+), 36 deletions(-) diff --git a/docs/tutorial/tutorial.ipynb b/docs/tutorial/tutorial.ipynb index 8c83733e..8aee5129 100644 --- a/docs/tutorial/tutorial.ipynb +++ b/docs/tutorial/tutorial.ipynb @@ -46,6 +46,10 @@ "execution_count": null, "id": "1ed178c0", "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:18:05.640047Z", + "start_time": "2025-01-10T10:18:05.636792Z" + }, "hide_input": false }, "outputs": [], @@ -65,6 +69,10 @@ "execution_count": null, "id": "b26e3796", "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:18:06.108616Z", + "start_time": "2025-01-10T10:18:06.105384Z" + }, "tags": [ "remove-cell" ] @@ -90,7 +98,12 @@ "cell_type": "code", "execution_count": null, "id": "a0ebf615", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:18:10.822824Z", + "start_time": "2025-01-10T10:18:06.886682Z" + } + }, "outputs": [], "source": [ "# Initialize Analysis object\n", @@ -107,7 +120,12 @@ "cell_type": "code", "execution_count": null, "id": "9db2ca46", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:18:10.831005Z", + "start_time": "2025-01-10T10:18:10.827549Z" + } + }, "outputs": [], "source": [ "# Initialize Description object and to get text description of the analysis\n", @@ -119,7 +137,12 @@ "cell_type": "code", "execution_count": null, "id": "c7244804", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:18:11.056748Z", + "start_time": "2025-01-10T10:18:10.904890Z" + } + }, "outputs": [], "source": [ "# Get static plots for detected relevant bonds\n", @@ -131,6 +154,10 @@ "execution_count": null, "id": "b2b1f822", "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:18:11.339667Z", + "start_time": "2025-01-10T10:18:11.072715Z" + }, "tags": [ "remove-output" ] @@ -158,7 +185,12 @@ "cell_type": "code", "execution_count": null, "id": "0dff40f8", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:18:13.162717Z", + "start_time": "2025-01-10T10:18:13.157983Z" + } + }, "outputs": [], "source": [ "# Dict summarizing the automatic analysis results\n", @@ -169,7 +201,12 @@ "cell_type": "code", "execution_count": null, "id": "f243f239", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:18:14.149132Z", + "start_time": "2025-01-10T10:18:14.144514Z" + } + }, "outputs": [], "source": [ "# Dict with bonds identified\n", @@ -180,7 +217,12 @@ "cell_type": "code", "execution_count": null, "id": "0e9cd6e6", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:18:14.815522Z", + "start_time": "2025-01-10T10:18:14.811460Z" + } + }, "outputs": [], "source": [ "# Dict with ions and their co-ordination environments\n", @@ -231,7 +273,12 @@ "cell_type": "code", "execution_count": null, "id": "77f40ef2", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:18:21.086307Z", + "start_time": "2025-01-10T10:18:17.216477Z" + } + }, "outputs": [], "source": [ "analyse = Analysis(\n", @@ -249,7 +296,12 @@ "cell_type": "code", "execution_count": null, "id": "861da67a", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:18:21.714038Z", + "start_time": "2025-01-10T10:18:21.708670Z" + } + }, "outputs": [], "source": [ "# Access the dict summarizing the results including orbital-wise analysis data \n", @@ -278,7 +330,12 @@ "cell_type": "code", "execution_count": null, "id": "17190525", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:18:23.548067Z", + "start_time": "2025-01-10T10:18:23.541339Z" + } + }, "outputs": [], "source": [ "# Initialize the Description object\n", @@ -291,6 +348,10 @@ "execution_count": null, "id": "84f26141", "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:18:24.371266Z", + "start_time": "2025-01-10T10:18:24.255263Z" + }, "tags": [ "remove-output" ] @@ -331,6 +392,10 @@ "execution_count": null, "id": "051a9998", "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:18:26.493468Z", + "start_time": "2025-01-10T10:18:26.490599Z" + }, "tags": [ "remove-cell" ] @@ -356,7 +421,12 @@ "cell_type": "code", "execution_count": null, "id": "f67b4bc6", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:18:31.332338Z", + "start_time": "2025-01-10T10:18:27.763103Z" + } + }, "outputs": [], "source": [ "# Get calculation quality summary dict\n", @@ -381,7 +451,12 @@ "cell_type": "code", "execution_count": null, "id": "0f11cac6", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:18:31.535251Z", + "start_time": "2025-01-10T10:18:31.531979Z" + } + }, "outputs": [], "source": [ "# Get a text description from calculation quality summary dictionary\n", @@ -403,7 +478,12 @@ "cell_type": "code", "execution_count": null, "id": "f6687ef3", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:18:33.420493Z", + "start_time": "2025-01-10T10:18:33.061487Z" + } + }, "outputs": [], "source": [ "from matplotlib import style\n", @@ -434,7 +514,12 @@ "cell_type": "code", "execution_count": null, "id": "5eca8c7c", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:18:35.516152Z", + "start_time": "2025-01-10T10:18:35.341151Z" + } + }, "outputs": [], "source": [ "# Using PlainCohpPlotter to get static plots of relevant bonds from Analysis object\n", @@ -462,7 +547,12 @@ "cell_type": "code", "execution_count": null, "id": "a7a454c5", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:18:37.480683Z", + "start_time": "2025-01-10T10:18:37.476816Z" + } + }, "outputs": [], "source": [ "label_list" @@ -472,7 +562,12 @@ "cell_type": "code", "execution_count": null, "id": "750935ed", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:18:38.570857Z", + "start_time": "2025-01-10T10:18:38.345650Z" + } + }, "outputs": [], "source": [ "# Using PlainCohpPlotter to get static plots of relevant orbitals COHPs from Analysis object\n", @@ -497,7 +592,12 @@ "cell_type": "code", "execution_count": null, "id": "80462ffb", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:18:39.541267Z", + "start_time": "2025-01-10T10:18:39.538137Z" + } + }, "outputs": [], "source": [ "# Using interactive plotter to add relevant cohps\n", @@ -508,7 +608,12 @@ "cell_type": "code", "execution_count": null, "id": "819090a7", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:18:40.539254Z", + "start_time": "2025-01-10T10:18:40.523608Z" + } + }, "outputs": [], "source": [ "interactive_cohp_plot.add_all_relevant_cohps(analyse=analyse, label_resolved=False,orbital_resolved=True,suffix='')" @@ -519,6 +624,10 @@ "execution_count": null, "id": "aa76b7ff", "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:18:41.354397Z", + "start_time": "2025-01-10T10:18:41.239332Z" + }, "tags": [ "remove-output" ] @@ -552,6 +661,10 @@ "execution_count": null, "id": "25fa1eff-a3de-4126-8349-bc932cb23efb", "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:18:43.814893Z", + "start_time": "2025-01-10T10:18:43.812334Z" + }, "tags": [ "remove-cell" ] @@ -583,7 +696,12 @@ "cell_type": "code", "execution_count": null, "id": "3fa696e7-55b7-4537-9cf8-c7511b4a5447", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:18:48.144300Z", + "start_time": "2025-01-10T10:18:47.093206Z" + } + }, "outputs": [], "source": [ "# Plotting ICOHPs against distance\n", @@ -600,7 +718,12 @@ "cell_type": "code", "execution_count": null, "id": "a2aebbe1-00bd-45e6-a2fc-76b6f77cb757", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:18:52.998170Z", + "start_time": "2025-01-10T10:18:52.967040Z" + } + }, "outputs": [], "source": [ "# Computing and Plotting BWDFs from ICOHPs\n", @@ -622,20 +745,30 @@ "cell_type": "code", "execution_count": null, "id": "86d0b3c8-aaf5-463e-8078-867ed6ae730e", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:19:01.028648Z", + "start_time": "2025-01-10T10:19:00.920286Z" + } + }, "outputs": [], "source": [ "# Plotting\n", "bwdf_plotter = BWDFPlotter(are_cobis=False, are_coops=False) # If reading and plotting ICOBIs or ICOOPs set args accordingly\n", "bwdf_plotter.add_bwdf(label=\"CdF2\", bwdf=bwdf) # Add the BWDF data\n", - "bwdf_plotter.get_bwdf_plot(sigma=0.3);" + "bwdf_plotter.get_plot(sigma=0.3);" ] }, { "cell_type": "code", "execution_count": null, "id": "2f27305d-e77f-4609-9940-1d36768d5069", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:19:06.550087Z", + "start_time": "2025-01-10T10:19:06.453128Z" + } + }, "outputs": [], "source": [ "# One can also compute and plot BWDF for a single site of the structure\n", @@ -644,7 +777,7 @@ "# Plotting\n", "bwdf_plotter = BWDFPlotter(are_cobis=False, are_coops=False) # If reading and plotting ICOBIs or ICOOPs set args accordingly\n", "bwdf_plotter.add_bwdf(label=\"CdF2\", bwdf=bwdf) # Add the BWDF data\n", - "bwdf_plotter.get_bwdf_plot(sigma=0.3);" + "bwdf_plotter.get_plot(sigma=0.3);" ] }, { @@ -660,6 +793,10 @@ "execution_count": null, "id": "a9354732", "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:19:09.871883Z", + "start_time": "2025-01-10T10:19:09.749752Z" + }, "tags": [ "remove-cell" ] @@ -697,7 +834,12 @@ "cell_type": "code", "execution_count": null, "id": "a271f2f0", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:19:11.439085Z", + "start_time": "2025-01-10T10:19:11.230354Z" + } + }, "outputs": [], "source": [ "style.use('default') # Complete reset the matplotlib figure style\n", @@ -722,7 +864,12 @@ "cell_type": "code", "execution_count": null, "id": "dbd469bc", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:19:12.374812Z", + "start_time": "2025-01-10T10:19:12.233244Z" + } + }, "outputs": [], "source": [ "dos_plotter = PlainDosPlotter(summed=True, stack=False, sigma=0.03)\n", @@ -742,7 +889,12 @@ "cell_type": "code", "execution_count": null, "id": "9d9a4a6a", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:19:13.472824Z", + "start_time": "2025-01-10T10:19:13.468543Z" + } + }, "outputs": [], "source": [ "from lobsterpy.structuregraph.graph import LobsterGraph" @@ -761,6 +913,10 @@ "execution_count": null, "id": "2e6a8da7", "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:19:18.835471Z", + "start_time": "2025-01-10T10:19:14.450218Z" + }, "tags": [ "remove-cell" ] @@ -807,7 +963,12 @@ "cell_type": "code", "execution_count": null, "id": "b70d9131", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:19:18.846792Z", + "start_time": "2025-01-10T10:19:18.841215Z" + } + }, "outputs": [], "source": [ "graph_NaCl_all.sg.graph.nodes.data() # view node data" @@ -817,7 +978,12 @@ "cell_type": "code", "execution_count": null, "id": "d15e116e", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:19:18.895345Z", + "start_time": "2025-01-10T10:19:18.892188Z" + } + }, "outputs": [], "source": [ "graph_NaCl_all.sg.graph.edges.data() # view edge data" @@ -853,7 +1019,12 @@ "cell_type": "code", "execution_count": null, "id": "033a1f84", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:19:18.999506Z", + "start_time": "2025-01-10T10:19:18.943514Z" + } + }, "outputs": [], "source": [ "from lobsterpy.featurize.batch import (BatchCoxxFingerprint, BatchIcoxxlistFeaturizer, BatchDosFeaturizer,\n", @@ -883,6 +1054,10 @@ "execution_count": null, "id": "657d3eb2", "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:19:24.868950Z", + "start_time": "2025-01-10T10:19:19.046929Z" + }, "tags": [ "remove-cell" ] @@ -925,6 +1100,10 @@ "execution_count": null, "id": "1e1fd1d0", "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:19:24.927291Z", + "start_time": "2025-01-10T10:19:24.917069Z" + }, "scrolled": true }, "outputs": [], @@ -937,7 +1116,12 @@ "cell_type": "code", "execution_count": null, "id": "d54090e3", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:19:24.986869Z", + "start_time": "2025-01-10T10:19:24.975024Z" + } + }, "outputs": [], "source": [ "# Get the fingerprints similarity matrix\n", @@ -969,7 +1153,12 @@ "cell_type": "code", "execution_count": null, "id": "2ed6793640da4fac", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:19:25.035763Z", + "start_time": "2025-01-10T10:19:25.032567Z" + } + }, "outputs": [], "source": [ "# Initialize the batch ICOXXLIST featurizer\n", @@ -1005,7 +1194,12 @@ "cell_type": "code", "execution_count": null, "id": "7c731fe3e32065be", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:19:25.381970Z", + "start_time": "2025-01-10T10:19:25.286296Z" + } + }, "outputs": [], "source": [ "# get the BWDF stats df\n", @@ -1037,6 +1231,10 @@ "execution_count": null, "id": "57176d72", "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:19:25.825700Z", + "start_time": "2025-01-10T10:19:25.822582Z" + }, "tags": [ "remove-cell" ] @@ -1074,7 +1272,12 @@ "cell_type": "code", "execution_count": null, "id": "94df0905", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:19:27.172907Z", + "start_time": "2025-01-10T10:19:26.828738Z" + } + }, "outputs": [], "source": [ "# get the DOS moments df\n", @@ -1085,7 +1288,12 @@ "cell_type": "code", "execution_count": null, "id": "d2456f82", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:19:28.708116Z", + "start_time": "2025-01-10T10:19:28.491483Z" + } + }, "outputs": [], "source": [ "# get the DOS fingerprints df\n", @@ -1118,6 +1326,10 @@ "execution_count": null, "id": "7c05bae8", "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:19:30.743966Z", + "start_time": "2025-01-10T10:19:30.740888Z" + }, "tags": [ "remove-cell" ] @@ -1159,7 +1371,12 @@ "cell_type": "code", "execution_count": null, "id": "9b49fcf7", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:19:44.098826Z", + "start_time": "2025-01-10T10:19:31.891677Z" + } + }, "outputs": [], "source": [ "# get summary stats features \n", @@ -1187,6 +1404,10 @@ "execution_count": null, "id": "2d40b39a", "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:19:44.135645Z", + "start_time": "2025-01-10T10:19:44.133062Z" + }, "tags": [ "remove-cell" ] @@ -1219,7 +1440,12 @@ "cell_type": "code", "execution_count": null, "id": "5f7259c0", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-10T10:19:49.661159Z", + "start_time": "2025-01-10T10:19:44.163100Z" + } + }, "outputs": [], "source": [ "# get the structure graphs df\n", From e4a2b50929639387c1b0098fe7c486ac59495d86 Mon Sep 17 00:00:00 2001 From: naik-aakash Date: Fri, 10 Jan 2025 12:15:48 +0100 Subject: [PATCH 27/30] add BWDFPlotter test --- tests/conftest.py | 37 ++++++++++++ tests/plotting/test_plotting.py | 100 ++++++++++++++++++++++++++++++++ 2 files changed, 137 insertions(+) diff --git a/tests/conftest.py b/tests/conftest.py index de1250a5..b716d32d 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -10,6 +10,7 @@ from lobsterpy.cohp.analyze import Analysis from lobsterpy.cohp.describe import Description +from lobsterpy.featurize.core import FeaturizeIcoxxlist TestDir = Path(__file__).absolute().parent @@ -582,6 +583,42 @@ def describe_nasbf6_orb(): # Fixtures for plotting module tests +@pytest.fixture +def bwdf_nacl(): + return FeaturizeIcoxxlist( + path_to_icoxxlist=TestDir / "test_data/NaCl/ICOHPLIST.lobster.gz", + path_to_structure=TestDir / "test_data/NaCl/CONTCAR.gz", + bin_width=0.1, + normalization="formula_units", + are_coops=False, + are_cobis=False, + ).calc_bwdf() + + +@pytest.fixture +def bwdf_cdf_cobi(): + return FeaturizeIcoxxlist( + path_to_icoxxlist=TestDir / "test_data/CdF_comp_range/ICOBILIST.lobster.gz", + path_to_structure=TestDir / "test_data/CdF_comp_range/CONTCAR.gz", + bin_width=0.1, + normalization="none", + are_coops=False, + are_cobis=True, + ).calc_bwdf() + + +@pytest.fixture +def bwdf_cdf_coop(): + return FeaturizeIcoxxlist( + path_to_icoxxlist=TestDir / "test_data/CdF_comp_range/ICOOPLIST.lobster.gz", + path_to_structure=TestDir / "test_data/CdF_comp_range/CONTCAR.gz", + bin_width=0.1, + normalization="counts", + are_coops=True, + are_cobis=False, + ).calc_site_bwdf(site_index=1) + + @pytest.fixture def plot_analyse_nacl(): return Analysis( diff --git a/tests/plotting/test_plotting.py b/tests/plotting/test_plotting.py index 24bb3444..bf404218 100644 --- a/tests/plotting/test_plotting.py +++ b/tests/plotting/test_plotting.py @@ -10,6 +10,7 @@ from lobsterpy.cohp.describe import Description from lobsterpy.plotting import ( + BWDFPlotter, IcohpDistancePlotter, InteractiveCohpPlotter, PlainCohpPlotter, @@ -750,3 +751,102 @@ def test_dos_plotter_exceptions(self, nacl_dos): str(err.value) == "Requested orbital is not available for this site, available orbitals are 3s, 2p_y, 2p_z, 2p_x" ) + + +class TestBWDFPlotter: + def test_bwdf_plotter_labels(self, bwdf_nacl, bwdf_cdf_coop, bwdf_cdf_cobi): + bwdf_plotter = BWDFPlotter() + bwdf_plotter.add_bwdf(bwdf=bwdf_nacl, label="NaCl") + fig = bwdf_plotter.get_plot().gca() + + assert fig.get_xlabel() == "Bond lengths (Å)" + assert fig.get_ylabel() == "BWDF-ICOHP (eV)" + + bwdf_plotter = BWDFPlotter(are_coops=True) + bwdf_plotter.add_bwdf(bwdf=bwdf_cdf_coop, label="CdF") + fig = bwdf_plotter.get_plot().gca() + + assert fig.get_xlabel() == "Bond lengths (Å)" + assert fig.get_ylabel() == "BWDF-ICOOP" + + bwdf_plotter = BWDFPlotter(are_cobis=True) + bwdf_plotter.add_bwdf(bwdf=bwdf_cdf_cobi, label="CdF") + fig = bwdf_plotter.get_plot().gca() + + assert fig.get_xlabel() == "Bond lengths (Å)" + assert fig.get_ylabel() == "BWDF-ICOBI" + + def test_bwdf_plot_data(self, bwdf_nacl, bwdf_cdf_coop, bwdf_cdf_cobi): + bwdf_plotter = BWDFPlotter() + bwdf_plotter.add_bwdf(bwdf=bwdf_nacl, label="NaCl") + fig = bwdf_plotter.get_plot().gcf() + + assert len(fig.axes[0].get_lines()) == 4 + + ref_xdata = bwdf_nacl["centers"] + ref_legends = [f"NaCl: {legend}" for legend in bwdf_plotter._bwdfs["NaCl"]] + for bwdf_lines in fig.axes[0].get_lines(): + pair = bwdf_lines._label.split(":")[-1].strip() + assert bwdf_lines._label in ref_legends + # Check x and y data + np.testing.assert_array_almost_equal(bwdf_lines.get_data()[0].tolist(), ref_xdata, decimal=4) + np.testing.assert_array_almost_equal( + bwdf_lines.get_data()[1], -1 * bwdf_nacl[pair]["icoxx_binned"], decimal=4 + ) + + # test for plot negative + fig = bwdf_plotter.get_plot(plot_negative=False).gcf() + + assert len(fig.axes[0].get_lines()) == 4 + + ref_xdata = bwdf_nacl["centers"] + ref_legends = [f"NaCl: {legend}" for legend in bwdf_plotter._bwdfs["NaCl"]] + for bwdf_lines in fig.axes[0].get_lines(): + pair = bwdf_lines._label.split(":")[-1].strip() + assert bwdf_lines._label in ref_legends + # Check x and y data + np.testing.assert_array_almost_equal(bwdf_lines.get_data()[0].tolist(), ref_xdata, decimal=4) + np.testing.assert_array_almost_equal(bwdf_lines.get_data()[1], bwdf_nacl[pair]["icoxx_binned"], decimal=4) + + # test for icobis + bwdf_plotter = BWDFPlotter(are_cobis=True) + bwdf_plotter.add_bwdf(bwdf=bwdf_cdf_cobi, label="CdF") + fig = bwdf_plotter.get_plot().gcf() + + assert len(fig.axes[0].get_lines()) == 4 + + ref_xdata = bwdf_cdf_cobi["centers"] + ref_legends = [f"CdF: {legend}" for legend in bwdf_plotter._bwdfs["CdF"]] + for bwdf_lines in fig.axes[0].get_lines(): + pair = bwdf_lines._label.split(":")[-1].strip() + assert bwdf_lines._label in ref_legends + # Check x and y data + np.testing.assert_array_almost_equal(bwdf_lines.get_data()[0].tolist(), ref_xdata, decimal=4) + np.testing.assert_array_almost_equal( + bwdf_lines.get_data()[1], bwdf_cdf_cobi[pair]["icoxx_binned"], decimal=4 + ) + + # test for icoops + bwdf_plotter = BWDFPlotter(are_coops=True) + bwdf_plotter.add_bwdf(bwdf=bwdf_cdf_coop, label="CdF") + fig = bwdf_plotter.get_plot().gcf() + + assert len(fig.axes[0].get_lines()) == 1 + + ref_xdata = bwdf_cdf_coop["centers"] + ref_legends = [f"CdF: {legend}" for legend in bwdf_plotter._bwdfs["CdF"]] + for bwdf_lines in fig.axes[0].get_lines(): + pair = bwdf_lines._label.split(":")[-1].strip() + assert bwdf_lines._label in ref_legends + # Check x and y data + np.testing.assert_array_almost_equal(bwdf_lines.get_data()[0].tolist(), ref_xdata, decimal=4) + np.testing.assert_array_almost_equal( + bwdf_lines.get_data()[1], bwdf_cdf_coop[pair]["icoxx_binned"], decimal=4 + ) + + def test_bwdf_plotter_exceptions(self, bwdf_nacl): + with pytest.raises(ValueError) as err: # noqa: PT012, PT011 + bwdf_plotter = BWDFPlotter(are_coops=True, are_cobis=True) + bwdf_plotter.add_bwdf(bwdf=bwdf_nacl, label="NaCl") + _ = bwdf_plotter.get_plot() + assert str(err.value) == "Plot data should not contain ICOBI and ICOOP data at same time" From 355ff1dd567a9dd35a619b901fd7a83b3a8e3a3e Mon Sep 17 00:00:00 2001 From: naik-aakash Date: Fri, 10 Jan 2025 16:03:24 +0100 Subject: [PATCH 28/30] address doc-string comments --- src/lobsterpy/plotting/__init__.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/lobsterpy/plotting/__init__.py b/src/lobsterpy/plotting/__init__.py index b6ce16e5..4a9257ed 100644 --- a/src/lobsterpy/plotting/__init__.py +++ b/src/lobsterpy/plotting/__init__.py @@ -58,9 +58,9 @@ class PlainCohpPlotter(CohpPlotter): :param zero_at_efermi: Shift all populations to have zero energy at the Fermi level. Defaults to True. :param are_coops: Bool indicating that populations are COOPs, not COHPs. - Defaults to False for COHPs. + Defaults to False, i.e., COHPs are plotted. :param are_cobis: Bool indicating that populations are COBIs, not COHPs. - Defaults to False for COHPs. + Defaults to False, i.e., ICOHPs are plotted. """ def get_plot( @@ -519,9 +519,9 @@ class InteractiveCohpPlotter(CohpPlotter): :param zero_at_efermi: Shift all populations to have zero energy at the Fermi level. Defaults to True. :param are_coops: Bool indicating that populations are COOPs, not COHPs. - Defaults to False for COHPs. + Defaults to False, i.e., COHPs are plotted. :param are_cobis: Bool indicating that populations are COBIs, not COHPs. - Defaults to False for COHPs. + Defaults to False, i.e., COHPs are plotted. """ COLOR_PALETTE = [ @@ -1088,9 +1088,9 @@ class IcohpDistancePlotter: Plotter to generate ICOHP or ICOBI or ICOOP vs bond lengths plots. :param are_coops: Bool indicating that populations are ICOOPs, not ICOHPs. - Defaults to False for COHPs. + Defaults to False, i.e., ICOHPs are plotted. :param are_cobis: Bool indicating that populations are ICOBIs, not ICOHPs. - Defaults to False for COHPs. + Defaults to False, i.e., ICOHPs are plotted. """ COLOR_PALETTE = [ @@ -1195,7 +1195,7 @@ def get_plot( ax.set_xlabel("Bond lengths (\u00c5)") if color_interactions: - colors = InteractiveCohpPlotter.COLOR_PALETTE if colors is None else colors + colors = self.COLOR_PALETTE if colors is None else colors atom_types = [] for data in self._icohps.values(): atom_types.extend(list(set(data["atom_types"]))) @@ -1242,9 +1242,9 @@ class BWDFPlotter: Plotter to generate Bond weighted distribution functions using ICOHP or ICOBI or ICOOP as weights. :param are_coops: Bool indicating that populations are ICOOPs, not ICOHPs. - Defaults to False for COHPs. + Defaults to False, i.e., ICOHPs are plotted. :param are_cobis: Bool indicating that populations are ICOBIs, not ICOHPs. - Defaults to False for COHPs. + Defaults to False, i.e., ICOHPs are plotted. """ COLOR_PALETTE = [ @@ -1338,7 +1338,7 @@ def get_plot( if ylim: ax.set_ylim(ylim) - palette = InteractiveCohpPlotter.COLOR_PALETTE if colors is None else colors + palette = self.COLOR_PALETTE if colors is None else colors pal_iter = cycle(palette) for label, bwdf in self._bwdfs.items(): From daae9850f7042915549edbcaafb1a9f634617db5 Mon Sep 17 00:00:00 2001 From: naik-aakash Date: Mon, 13 Jan 2025 22:16:40 +0100 Subject: [PATCH 29/30] remove redundant Path usage (address review comment) --- src/lobsterpy/cli.py | 66 ++++++++++++++------------------------------ 1 file changed, 21 insertions(+), 45 deletions(-) diff --git a/src/lobsterpy/cli.py b/src/lobsterpy/cli.py index 47801e2e..080eb44c 100644 --- a/src/lobsterpy/cli.py +++ b/src/lobsterpy/cli.py @@ -904,21 +904,17 @@ def run(args): "plot-automatic-ia", ]: req_files = get_file_paths( - path_to_lobster_calc=Path(os.getcwd()), requested_files=["structure", "charge", "icohplist", "cohpcar"] + path_to_lobster_calc=os.getcwd(), requested_files=["structure", "charge", "icohplist", "cohpcar"] ) if args.coops: - req_files_coops = get_file_paths( - path_to_lobster_calc=Path(os.getcwd()), requested_files=["icooplist", "coopcar"] - ) + req_files_coops = get_file_paths(path_to_lobster_calc=os.getcwd(), requested_files=["icooplist", "coopcar"]) req_files["icohplist"] = req_files_coops["icooplist"] req_files["cohpcar"] = req_files_coops["coopcar"] if args.cobis: - req_files_cobis = get_file_paths( - path_to_lobster_calc=Path(os.getcwd()), requested_files=["icobilist", "cobicar"] - ) + req_files_cobis = get_file_paths(path_to_lobster_calc=os.getcwd(), requested_files=["icobilist", "cobicar"]) req_files["icohplist"] = req_files_cobis["icobilist"] req_files["cohpcar"] = req_files_cobis["cobicar"] @@ -1022,22 +1018,16 @@ def run(args): if args.action in ["plot-bwdf", "plotbwdf"]: if args.cobis: - filename = get_file_paths(path_to_lobster_calc=Path(os.getcwd()), requested_files=["icobilist"]).get( - "icobilist" - ) + filename = get_file_paths(path_to_lobster_calc=os.getcwd(), requested_files=["icobilist"]).get("icobilist") options = {"are_cobis": True, "are_coops": False} elif args.coops: - filename = get_file_paths(path_to_lobster_calc=Path(os.getcwd()), requested_files=["icooplist"]).get( - "icooplist" - ) + filename = get_file_paths(path_to_lobster_calc=os.getcwd(), requested_files=["icooplist"]).get("icooplist") options = {"are_cobis": False, "are_coops": True} else: - filename = get_file_paths(path_to_lobster_calc=Path(os.getcwd()), requested_files=["icohplist"]).get( - "icohplist" - ) + filename = get_file_paths(path_to_lobster_calc=os.getcwd(), requested_files=["icohplist"]).get("icohplist") options = {"are_cobis": False, "are_coops": False} - structure_filename = get_file_paths(path_to_lobster_calc=Path(os.getcwd()), requested_files=["structure"]).get( + structure_filename = get_file_paths(path_to_lobster_calc=os.getcwd(), requested_files=["structure"]).get( "structure" ) @@ -1123,27 +1113,19 @@ def run(args): if args.action == "plot": if args.cobis: - filename = get_file_paths(path_to_lobster_calc=Path(os.getcwd()), requested_files=["cobicar"]).get( - "cobicar" - ) + filename = get_file_paths(path_to_lobster_calc=os.getcwd(), requested_files=["cobicar"]).get("cobicar") options = {"are_cobis": True, "are_coops": False} elif args.multi_cobis: - filename = get_file_paths(path_to_lobster_calc=Path(os.getcwd()), requested_files=["cobicar"]).get( - "cobicar" - ) + filename = get_file_paths(path_to_lobster_calc=os.getcwd(), requested_files=["cobicar"]).get("cobicar") options = {"are_cobis": False, "are_coops": False, "are_multi_center_cobis": True} elif args.coops: - filename = get_file_paths(path_to_lobster_calc=Path(os.getcwd()), requested_files=["coopcar"]).get( - "coopcar" - ) + filename = get_file_paths(path_to_lobster_calc=os.getcwd(), requested_files=["coopcar"]).get("coopcar") options = {"are_cobis": False, "are_coops": True} else: - filename = get_file_paths(path_to_lobster_calc=Path(os.getcwd()), requested_files=["cohpcar"]).get( - "cohpcar" - ) + filename = get_file_paths(path_to_lobster_calc=os.getcwd(), requested_files=["cohpcar"]).get("cohpcar") options = {"are_cobis": False, "are_coops": False} - structure_filename = get_file_paths(path_to_lobster_calc=Path(os.getcwd()), requested_files=["structure"]).get( + structure_filename = get_file_paths(path_to_lobster_calc=os.getcwd(), requested_files=["structure"]).get( "structure" ) @@ -1307,7 +1289,7 @@ def run(args): if args.action in ["description-quality"]: # Check for .gz files exist for default values and update accordingly req_files = get_file_paths( - path_to_lobster_calc=Path(os.getcwd()), requested_files=["structure", "lobsterin", "lobsterout"] + path_to_lobster_calc=os.getcwd(), requested_files=["structure", "lobsterin", "lobsterout"] ) for arg_name in req_files: setattr(args, arg_name, req_files[arg_name]) @@ -1327,7 +1309,7 @@ def run(args): bva_comp = args.bvacomp if bva_comp: - bva_files = get_file_paths(path_to_lobster_calc=Path(os.getcwd()), requested_files=["charge"]) + bva_files = get_file_paths(path_to_lobster_calc=os.getcwd(), requested_files=["charge"]) for arg_name in bva_files: setattr(args, arg_name, bva_files[arg_name]) @@ -1336,11 +1318,11 @@ def run(args): if dos_comparison: if "DOSCAR.LSO.lobster" in args.doscar.name: dos_files = get_file_paths( - path_to_lobster_calc=Path(os.getcwd()), requested_files=["vasprun", "doscar"], use_lso_dos=True + path_to_lobster_calc=os.getcwd(), requested_files=["vasprun", "doscar"], use_lso_dos=True ) else: dos_files = get_file_paths( - path_to_lobster_calc=Path(os.getcwd()), requested_files=["vasprun", "doscar"], use_lso_dos=False + path_to_lobster_calc=os.getcwd(), requested_files=["vasprun", "doscar"], use_lso_dos=False ) for arg_name in dos_files: setattr(args, arg_name, dos_files[arg_name]) @@ -1373,10 +1355,10 @@ def run(args): if args.action in ["plot-dos", "plotdos"]: if "DOSCAR.LSO.lobster" in args.doscar.name: req_files = get_file_paths( - path_to_lobster_calc=Path(os.getcwd()), requested_files=["structure", "doscar"], use_lso_dos=True + path_to_lobster_calc=os.getcwd(), requested_files=["structure", "doscar"], use_lso_dos=True ) else: - req_files = get_file_paths(path_to_lobster_calc=Path(os.getcwd()), requested_files=["structure", "doscar"]) + req_files = get_file_paths(path_to_lobster_calc=os.getcwd(), requested_files=["structure", "doscar"]) for arg_name in req_files: setattr(args, arg_name, req_files[arg_name]) @@ -1448,21 +1430,15 @@ def run(args): if args.action in ["plot-icohp-distance", "ploticohpdistance"]: if args.cobis: - filename = get_file_paths(path_to_lobster_calc=Path(os.getcwd()), requested_files=["icobilist"]).get( - "icobilist" - ) + filename = get_file_paths(path_to_lobster_calc=os.getcwd(), requested_files=["icobilist"]).get("icobilist") args.icohplist = filename options = {"are_cobis": True, "are_coops": False} elif args.coops: - filename = get_file_paths(path_to_lobster_calc=Path(os.getcwd()), requested_files=["icooplist"]).get( - "icooplist" - ) + filename = get_file_paths(path_to_lobster_calc=os.getcwd(), requested_files=["icooplist"]).get("icooplist") args.icohplist = filename options = {"are_cobis": False, "are_coops": True} else: - filename = get_file_paths(path_to_lobster_calc=Path(os.getcwd()), requested_files=["icohplist"]).get( - "icohplist" - ) + filename = get_file_paths(path_to_lobster_calc=os.getcwd(), requested_files=["icohplist"]).get("icohplist") args.icohplist = filename options = {"are_cobis": False, "are_coops": False} From 24e7190929a80007530910df7d136e77c476367b Mon Sep 17 00:00:00 2001 From: naik-aakash Date: Mon, 13 Jan 2025 22:39:53 +0100 Subject: [PATCH 30/30] Replace os with Path --- src/lobsterpy/cli.py | 43 +++++++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/src/lobsterpy/cli.py b/src/lobsterpy/cli.py index 080eb44c..91badb2e 100644 --- a/src/lobsterpy/cli.py +++ b/src/lobsterpy/cli.py @@ -7,7 +7,6 @@ import argparse import json -import os from math import log, sqrt from pathlib import Path @@ -904,17 +903,17 @@ def run(args): "plot-automatic-ia", ]: req_files = get_file_paths( - path_to_lobster_calc=os.getcwd(), requested_files=["structure", "charge", "icohplist", "cohpcar"] + path_to_lobster_calc=Path.cwd(), requested_files=["structure", "charge", "icohplist", "cohpcar"] ) if args.coops: - req_files_coops = get_file_paths(path_to_lobster_calc=os.getcwd(), requested_files=["icooplist", "coopcar"]) + req_files_coops = get_file_paths(path_to_lobster_calc=Path.cwd(), requested_files=["icooplist", "coopcar"]) req_files["icohplist"] = req_files_coops["icooplist"] req_files["cohpcar"] = req_files_coops["coopcar"] if args.cobis: - req_files_cobis = get_file_paths(path_to_lobster_calc=os.getcwd(), requested_files=["icobilist", "cobicar"]) + req_files_cobis = get_file_paths(path_to_lobster_calc=Path.cwd(), requested_files=["icobilist", "cobicar"]) req_files["icohplist"] = req_files_cobis["icobilist"] req_files["cohpcar"] = req_files_cobis["cobicar"] @@ -1018,16 +1017,16 @@ def run(args): if args.action in ["plot-bwdf", "plotbwdf"]: if args.cobis: - filename = get_file_paths(path_to_lobster_calc=os.getcwd(), requested_files=["icobilist"]).get("icobilist") + filename = get_file_paths(path_to_lobster_calc=Path.cwd(), requested_files=["icobilist"]).get("icobilist") options = {"are_cobis": True, "are_coops": False} elif args.coops: - filename = get_file_paths(path_to_lobster_calc=os.getcwd(), requested_files=["icooplist"]).get("icooplist") + filename = get_file_paths(path_to_lobster_calc=Path.cwd(), requested_files=["icooplist"]).get("icooplist") options = {"are_cobis": False, "are_coops": True} else: - filename = get_file_paths(path_to_lobster_calc=os.getcwd(), requested_files=["icohplist"]).get("icohplist") + filename = get_file_paths(path_to_lobster_calc=Path.cwd(), requested_files=["icohplist"]).get("icohplist") options = {"are_cobis": False, "are_coops": False} - structure_filename = get_file_paths(path_to_lobster_calc=os.getcwd(), requested_files=["structure"]).get( + structure_filename = get_file_paths(path_to_lobster_calc=Path.cwd(), requested_files=["structure"]).get( "structure" ) @@ -1113,19 +1112,19 @@ def run(args): if args.action == "plot": if args.cobis: - filename = get_file_paths(path_to_lobster_calc=os.getcwd(), requested_files=["cobicar"]).get("cobicar") + filename = get_file_paths(path_to_lobster_calc=Path.cwd(), requested_files=["cobicar"]).get("cobicar") options = {"are_cobis": True, "are_coops": False} elif args.multi_cobis: - filename = get_file_paths(path_to_lobster_calc=os.getcwd(), requested_files=["cobicar"]).get("cobicar") + filename = get_file_paths(path_to_lobster_calc=Path.cwd(), requested_files=["cobicar"]).get("cobicar") options = {"are_cobis": False, "are_coops": False, "are_multi_center_cobis": True} elif args.coops: - filename = get_file_paths(path_to_lobster_calc=os.getcwd(), requested_files=["coopcar"]).get("coopcar") + filename = get_file_paths(path_to_lobster_calc=Path.cwd(), requested_files=["coopcar"]).get("coopcar") options = {"are_cobis": False, "are_coops": True} else: - filename = get_file_paths(path_to_lobster_calc=os.getcwd(), requested_files=["cohpcar"]).get("cohpcar") + filename = get_file_paths(path_to_lobster_calc=Path.cwd(), requested_files=["cohpcar"]).get("cohpcar") options = {"are_cobis": False, "are_coops": False} - structure_filename = get_file_paths(path_to_lobster_calc=os.getcwd(), requested_files=["structure"]).get( + structure_filename = get_file_paths(path_to_lobster_calc=Path.cwd(), requested_files=["structure"]).get( "structure" ) @@ -1289,7 +1288,7 @@ def run(args): if args.action in ["description-quality"]: # Check for .gz files exist for default values and update accordingly req_files = get_file_paths( - path_to_lobster_calc=os.getcwd(), requested_files=["structure", "lobsterin", "lobsterout"] + path_to_lobster_calc=Path.cwd(), requested_files=["structure", "lobsterin", "lobsterout"] ) for arg_name in req_files: setattr(args, arg_name, req_files[arg_name]) @@ -1309,7 +1308,7 @@ def run(args): bva_comp = args.bvacomp if bva_comp: - bva_files = get_file_paths(path_to_lobster_calc=os.getcwd(), requested_files=["charge"]) + bva_files = get_file_paths(path_to_lobster_calc=Path.cwd(), requested_files=["charge"]) for arg_name in bva_files: setattr(args, arg_name, bva_files[arg_name]) @@ -1318,11 +1317,11 @@ def run(args): if dos_comparison: if "DOSCAR.LSO.lobster" in args.doscar.name: dos_files = get_file_paths( - path_to_lobster_calc=os.getcwd(), requested_files=["vasprun", "doscar"], use_lso_dos=True + path_to_lobster_calc=Path.cwd(), requested_files=["vasprun", "doscar"], use_lso_dos=True ) else: dos_files = get_file_paths( - path_to_lobster_calc=os.getcwd(), requested_files=["vasprun", "doscar"], use_lso_dos=False + path_to_lobster_calc=Path.cwd(), requested_files=["vasprun", "doscar"], use_lso_dos=False ) for arg_name in dos_files: setattr(args, arg_name, dos_files[arg_name]) @@ -1355,10 +1354,10 @@ def run(args): if args.action in ["plot-dos", "plotdos"]: if "DOSCAR.LSO.lobster" in args.doscar.name: req_files = get_file_paths( - path_to_lobster_calc=os.getcwd(), requested_files=["structure", "doscar"], use_lso_dos=True + path_to_lobster_calc=Path.cwd(), requested_files=["structure", "doscar"], use_lso_dos=True ) else: - req_files = get_file_paths(path_to_lobster_calc=os.getcwd(), requested_files=["structure", "doscar"]) + req_files = get_file_paths(path_to_lobster_calc=Path.cwd(), requested_files=["structure", "doscar"]) for arg_name in req_files: setattr(args, arg_name, req_files[arg_name]) @@ -1430,15 +1429,15 @@ def run(args): if args.action in ["plot-icohp-distance", "ploticohpdistance"]: if args.cobis: - filename = get_file_paths(path_to_lobster_calc=os.getcwd(), requested_files=["icobilist"]).get("icobilist") + filename = get_file_paths(path_to_lobster_calc=Path.cwd(), requested_files=["icobilist"]).get("icobilist") args.icohplist = filename options = {"are_cobis": True, "are_coops": False} elif args.coops: - filename = get_file_paths(path_to_lobster_calc=os.getcwd(), requested_files=["icooplist"]).get("icooplist") + filename = get_file_paths(path_to_lobster_calc=Path.cwd(), requested_files=["icooplist"]).get("icooplist") args.icohplist = filename options = {"are_cobis": False, "are_coops": True} else: - filename = get_file_paths(path_to_lobster_calc=os.getcwd(), requested_files=["icohplist"]).get("icohplist") + filename = get_file_paths(path_to_lobster_calc=Path.cwd(), requested_files=["icohplist"]).get("icohplist") args.icohplist = filename options = {"are_cobis": False, "are_coops": False}