diff --git a/.gitignore b/.gitignore index b9df11e..9b979aa 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,9 @@ # Python virtual environment env/ - +errorlo* # eida_test.py results.txt file -examples/results.txt \ No newline at end of file +examples/results.txt + +*eidatoken* +*/*.csv +*/*.xls diff --git a/examples/AdAStations/station_list b/examples/AdAStations/station_list new file mode 100644 index 0000000..d69ce3a --- /dev/null +++ b/examples/AdAStations/station_list @@ -0,0 +1,1919 @@ +23.1287 41.8417 0 +28.1359 43.6376 0 +25.9763 43.2653 0 +6.054836 46.235876 0 +6.07608 46.309893 0 +6.066212 46.266947 0 +13.750296 44.905732 0 +15.05747 43.99191 0 +16.4488 43.1776 0 +16.455717 46.131166 0 +15.707297 43.866017 0 +16.7544 45.6135 0 +15.623055 44.878389 0 +15.968193 45.907328 0 +17.133 43.4944 0 +8.763 41.9279 0 +5.6433 43.8009 0 +7.3744 43.831 0 +7.424688 43.730343 0 +7.20276 43.6802 0 +10.153 44.166 0 +10.0658 44.4913 0 +7.70267 43.84617 0 +10.757 44.045 0 +8.9512 44.4712 0 +8.06617 44.11217 0 +23.7845 37.9665 0 +22.9795 38.2569 0 +24.437 38.0321 0 +24.0585 34.8389 0 +24.4632 35.3486 0 +23.6248 35.2348 0 +25.18017 35.304187 0 +22.136 36.9261 0 +25.0221 37.6541 0 +23.30117 35.86704 0 +21.8105 38.91657 0 +20.84874 39.65616 0 +25.3372 35.1801 0 +24.100138 38.633147 0 +25.18055 39.89725 0 +23.86517 41.34846 0 +25.53553 41.14503 0 +24.81204 35.01777 0 +25.530450000000002 40.47094 0 +21.274667 39.3445 0 +22.94686 36.71803 0 +26.046 40.885 0 +23.8436 39.1478 0 +26.0506 38.3869 0 +22.401 40.957 0 +23.0996 40.5978 0 +20.3299 39.5315 0 +22.898 41.162 0 +21.36321 39.95495 0 +23.1502 37.383 0 +22.48916 40.10333 0 +20.65779 38.78893 0 +27.17817 36.60233 0 +23.9791 40.3325 0 +23.6768 39.9363 0 +25.8553 39.2114 0 +23.595 41.10866 0 +24.7194 40.6064 0 +14.1407 40.82 0 +14.0935 40.8329 0 +14.1818 40.8382 0 +14.1473 40.8187 0 +14.147 40.8292 0 +14.1187 40.8211 0 +14.4223 40.8212 0 +14.1397 40.8291 0 +14.1443 40.8275 0 +13.8551 40.7115 0 +13.8758 40.7209 0 +13.9008 40.7458 0 +12.97673 37.66195 0 +14.4299 40.83 0 +14.4314 40.819 0 +14.4242 40.8059 0 +14.4238 40.8356 0 +5.675 44.9422 0 +13.2755 46.25383 0 +24.6332 45.3657 0 +26.1029 46.9387 0 +21.6401 45.6188 0 +28.1362 45.178 0 +26.5432 45.1187 0 +27.7655 45.5442 0 +27.8771 45.5373 0 +27.0558 45.7633 0 +26.394 46.3349 0 +27.8314 45.4702 0 +28.4196 44.8565 0 +13.8877 46.0322 0 +10.516896 43.65693 0 +10.46937 43.640408 0 +18.9507 44.0862 0 +19.5 42.05 0 +20.005316 39.878303 0 +22.6749 43.6227 0 +25.8751 42.9287 0 +28.4162 43.4059 0 +25.3396 41.6303 0 +26.4941 43.8024 0 +26.593 43.37 0 +23.7496 41.5469 0 +23.74 43.356 0 +23.4255 42.4762 0 +24.6207 43.387 0 +25.1732 43.1227 0 +26.5079 43.5662 0 +28.6057 43.5389 0 +23.2342 42.6144 0 +11.2795 48.142334 0 +11.22 47.91 0 +13.0275 47.6353 0 +12.87726 47.720501 0 +11.2473 48.1522 0 +11.275473 48.162877 0 +11.275394 48.162975 0 +11.275561 48.162972 0 +11.275332 48.162769 0 +11.27502 48.162958 0 +11.275565 48.16308 0 +11.276804 48.165591 0 +11.275476 48.162941000000004 0 +11.275065 48.162904 0 +11.273684 48.164357 0 +11.276289 48.164883 0 +11.2514 48.1629 0 +11.2635 48.1406 0 +12.6 48.12 0 +11.510058 48.067497 0 +11.587935 48.077927 0 +11.707375 48.070885 0 +11.7188 47.979698 0 +11.5171 48.0 0 +12.795714 47.737167 0 +12.841651 47.768345 0 +11.7104 47.038399 0 +11.288809 48.173897 0 +7.69498 47.33578 0 +6.46757 46.7872 0 +8.177979 47.8716 0 +8.424899 46.87033 0 +7.2301 47.39363 0 +6.472979 46.938 0 +6.61184 46.78233 0 +6.12055 46.29249 0 +8.012475 47.23088 0 +9.879519 46.7805 0 +7.40839 46.08105 0 +8.846759 47.89518 0 +8.013579 47.43757 0 +8.110509 46.4352 0 +7.13579 46.15632 0 +8.6629 46.45481 0 +8.318863 46.57814 0 +8.15117 46.75681 0 +7.70018 47.66038 0 +6.94038 46.21934 0 +9.492699 47.2946 0 +9.00825 46.84676 0 +6.30842 46.346559 0 +8.25262 47.71217 0 +7.11229 45.95101 0 +7.9640889999999995 46.05069 0 +7.16525 47.37926 0 +9.04171 45.92184 0 +8.63706 46.96764 0 +7.64884 47.50647 0 +9.111708 46.82574 0 +5.90792 46.19107 0 +9.336009 47.5643 0 +7.92093 47.47612 0 +7.08645 47.30266 0 +6.97302 46.14415 0 +6.097039 46.06018 0 +5.973429 46.06592 0 +7.29938 46.36334 0 +8.492359 47.76449 0 +8.86899 47.66974 0 +8.111869 47.52752 0 +6.958739 46.77362 0 +8.68161 47.6487 0 +9.44956 46.48317 0 +9.16648 46.2061 0 +6.27815 46.45175 0 +9.02207 46.42309 0 +9.1231 47.7528 0 +8.98681 47.52976 0 +8.92525 47.09837 0 +8.907529 47.41465 0 +7.62418 46.66487 0 +7.3688 46.99777 0 +8.58088 47.36921 0 +22.07272 38.36543 0 +17.848056 45.436024 0 +15.986949 45.826997 0 +14.30955 48.81989 0 +17.6707 48.8591 0 +13.5782 49.1309 0 +16.8341 50.0966 0 +16.3952 49.0619 0 +17.5425 49.7768 0 +18.1399 49.8346 0 +14.4331 50.0703 0 +14.5417 49.9883 0 +15.299556 49.029533 0 +15.4871 49.2948 0 +16.5933 49.3084 0 +14.1923 49.4389 0 +0.760999 45.573975 0 +3.1310000000000002 46.052 0 +5.3325 43.4917 0 +5.8067 43.5882 0 +3.451818 44.519686 0 +4.1563 44.3689 0 +6.045 43.951 0 +6.256064 47.246936 0 +1.7711 45.9568 0 +6.9218 43.7528 0 +3.111 45.763 0 +3.8445 46.5581 0 +6.6517 47.2484 0 +3.09 43.135 0 +2.932 45.435 0 +3.6936999999999998 45.5004 0 +6.7775 44.1095 0 +5.463089 47.505456 0 +5.810501 47.104272 0 +2.563 45.385 0 +1.5912 46.5152 0 +5.7439 45.2413 0 +2.200888 46.173861 0 +2.701 46.52 0 +7.254296 47.683438 0 +7.05 44.184 0 +3.221365 43.969837 0 +3.247 45.232 0 +2.55412 44.76055 0 +6.033356 43.079525 0 +5.7675 43.988 0 +9.363 42.953 0 +7.8629999999999995 43.398667 0 +7.153 43.896 0 +6.220211 46.154234 0 +5.096536 44.850137 0 +5.549892 44.429092 0 +5.088972 45.153917 0 +6.712353 45.472393 0 +5.069002 44.556977 0 +6.2253 44.1093 0 +4.611435 45.878365 0 +6.709738 44.910273 0 +6.074 44.3703 0 +6.68308 45.20865 0 +5.889317 45.881011 0 +4.7522 46.3459 0 +5.80467 45.060788 0 +5.801324 45.064487 0 +5.806072 45.06951 0 +6.401519 45.036803 0 +6.75611 46.0567 0 +5.6972439999999995 45.609314 0 +6.682073 46.329823 0 +6.11233 44.81517 0 +7.617472 44.116444 0 +3.621 45.97 0 +4.7442 46.95652 0 +3.8590809999999998 43.715286 0 +5.922489 46.759014 0 +6.6472 47.71069 0 +6.624517 45.688207 0 +5.4837 43.9412 0 +7.5532 43.986 0 +5.1064 43.9377 0 +3.618578 45.047528 0 +2.1642 44.1912 0 +9.2847 42.0945 0 +7.2366 44.0558 0 +6.811695 44.480935 0 +3.9587 44.1054 0 +6.4074 43.7471 0 +4.892048 44.905697 0 +2.483 45.749 0 +7.27652 47.965735 0 +23.5577 35.3692 0 +15.8063 40.29722 0 +16.70442 40.64907 0 +28.4128 44.4581 0 +11.2768 48.1639 0 +13.700627 48.844303 0 +13.71 48.83 0 +10.1071 47.6799 0 +23.0213 38.6926 0 +21.9785 38.2401 0 +24.0428 35.5193 0 +24.7995 34.9731 0 +22.9939 36.2447 0 +25.4733 35.0429 0 +23.7577 35.5604 0 +26.0909 35.2021 0 +25.52301 37.07274 0 +23.71767 37.97384 0 +24.08738 34.83914 0 +25.0709 35.3058 0 +24.89 35.288 0 +23.9811 35.4606 0 +21.92522 37.17872 0 +27.16106 35.5471 0 +19.79623 39.7127 0 +22.15042 38.0435 0 +23.0621 36.2566 0 +21.78209 40.30331 0 +23.385876 37.578529 0 +23.329567 37.612669 0 +23.22189 39.30567 0 +27.17666 36.57441 0 +25.61037 35.26134 0 +23.44443 40.37328 0 +24.550167 41.3525 0 +23.8638 38.0473 0 +21.46475 38.05586 0 +24.5482 38.8831 0 +25.475262999999998 36.366992 0 +22.0144 39.56468 0 +24.1997 35.407 0 +20.5886 38.17683 0 +23.7942 37.8524 0 +26.21691 35.1147 0 +21.2135 38.9224 0 +21.7089 37.5324 0 +21.9209 38.5933 0 +21.71 37.952 0 +20.576 39.2492 0 +22.9673 38.0228 0 +21.1833 38.5986 0 +21.4073 38.4124 0 +21.0965 39.5299 0 +21.525 38.616 0 +21.742 36.8955 0 +22.0566 38.4133 0 +21.7864 38.2836 0 +22.336 39.0211 0 +25.4056 36.4709 0 +24.513666 40.99666 0 +23.999200000000002 40.8178 0 +21.0489 40.4147 0 +20.7715 38.076 0 +23.3539 40.8217 0 +22.2325 39.711 0 +23.19178 39.36598 0 +21.2397 48.2961 0 +20.7258 46.3501 0 +16.7755 46.4703 0 +20.267 47.2996 0 +19.0201 47.4831 0 +18.2606 47.3631 0 +17.3317 47.4162 0 +18.0999 46.0883 0 +21.9007 47.3849 0 +18.6436 46.215 0 +17.5348 47.1712 0 +19.8934 47.9182 0 +16.5567 47.6807 0 +17.8877 46.9001 0 +22.5391 48.1304 0 +15.54308 41.75738 0 +11.7893 43.7967 0 +15.132629 41.199899 0 +10.482 45.1071 0 +13.409 42.53578 0 +15.816928 41.158295 0 +11.0031 44.8658 0 +14.08057 40.810901 0 +16.5088 39.4027 0 +12.98176 41.94903 0 +14.089047 40.778154 0 +14.163176 40.79817 0 +12.883011 43.768478 0 +14.05785 37.93745 0 +14.149329 40.829447 0 +11.6497 46.04818 0 +15.05257 37.57919 0 +14.945 37.498 0 +15.1345 37.7551 0 +13.659995 37.328791 0 +13.11718 42.26802 0 +14.910201 41.513145 0 +14.026023 37.990126 0 +13.3352 43.0627 0 +15.122 36.9596 0 +15.0325 37.2831 0 +15.222 37.0928 0 +14.5216 36.9926 0 +14.928733 38.083692 0 +13.433009 37.954428 0 +12.5647 37.7532 0 +10.858943 45.697536 0 +12.953452 37.946147 0 +15.703 38.162 0 +11.24579 43.52358 0 +14.567486 41.031206 0 +14.17989 41.200001 0 +10.52495 43.72193 0 +16.8158 39.48514 0 +13.40057 42.02193 0 +16.06124 40.52148 0 +15.807 40.6458 0 +12.70222 41.81112 0 +14.9315 42.2364 0 +11.0721 45.6468 0 +12.445128 43.937695 0 +11.90967 42.84906 0 +10.5243 45.6183 0 +13.101908 37.516469 0 +13.74926 37.94064 0 +18.4675 40.0724 0 +12.940570000000001 43.255 0 +14.335709 40.58256 0 +12.50993 42.23696 0 +12.7104 46.2601 0 +15.2149 38.809615 0 +13.776334 42.22944 0 +16.33762 39.6601 0 +11.673888999999999 45.361667 0 +15.51 42.123 0 +14.438636 40.818549 0 +12.770183 41.750225 0 +26.153 40.7362 0 +26.5132 40.6708 0 +25.8987 40.1908 0 +18.9226 42.5465 0 +13.405 42.354 0 +17.1839 44.7488 0 +6.678 45.052 0 +15.8939 38.2603 0 +13.216 37.578 0 +15.8155 39.9938 0 +19.26083 42.42967 0 +16.7583 39.1794 0 +19.8631 41.3472 0 +9.34732 46.47223 0 +14.3533 37.469 0 +10.3864 44.1594 0 +14.5242 35.8373 0 +13.8013 45.6589 0 +12.924 46.245 0 +12.7419 46.4258 0 +15.433272 48.670613 0 +12.5123 46.7474 0 +15.5232 47.2505 0 +13.6383 47.6913 0 +15.8618 47.9282 0 +15.8588 47.9282 0 +9.8803 47.286701 0 +10.7291 47.0211 0 +13.3447 47.0784 0 +14.132 48.055 0 +12.677 47.4243 0 +14.2659 47.8495 0 +11.1037 47.3448 0 +13.6416 46.6299 0 +14.5489 46.5092 0 +10.7623 47.4871 0 +16.2963 47.6997 0 +14.566836 47.11321 0 +15.0327 46.678 0 +11.2087 47.2205 0 +16.347 48.66 0 +16.3617 48.2483 0 +11.5763 47.3357 0 +16.07 48.11 0 +11.6363 47.2638 0 +17.144 40.633 0 +12.0472 46.2829 0 +13.2438 46.234 0 +13.0984 46.3195 0 +12.4379 46.009 0 +11.8047 45.8806 0 +12.4448 46.3116 0 +12.8814 46.4569 0 +12.6154 46.1495 0 +12.9877 46.2408 0 +13.1481 46.5491 0 +13.565 46.4428 0 +13.6336 45.9875 0 +12.1051 45.9922 0 +12.9729 46.5584 0 +22.7075 49.6314 0 +20.2996 49.4182 0 +19.7984 50.2195 0 +29.289 45.4245 0 +6.2549 43.3827 0 +0.7401700000000001 44.9395 0 +3.8589 47.2683 0 +2.2175 43.3411 0 +27.8666 45.5335 0 +5.88 44.9183 0 +27.2311 45.723 0 +8.9994 42.5483 0 +1.51639 45.3044 0 +27.7703 45.5897 0 +24.3537 47.0855 0 +23.345 44.0201 0 +21.137 45.3828 0 +27.6436 46.2334 0 +25.6611 46.0749 0 +22.496 47.6855 0 +27.0261 44.197 0 +23.7999 44.325 0 +25.3886 45.9675 0 +28.6323 44.075 0 +26.9747 45.3801 0 +22.7767 45.3933 0 +27.9303 44.6893 0 +24.9804 44.5281 0 +25.5154 46.7059 0 +26.8194 44.4739 0 +23.7698 45.446 0 +28.5876 43.8168 0 +24.3765 46.1497 0 +28.8127 46.9186 0 +25.945 45.4909 0 +26.2952 45.4272 0 +27.442166 46.837498 0 +27.1477 45.8723 0 +22.6922 44.6627 0 +26.685465 45.72664 0 +27.9949 45.6741 0 +23.2038 44.6609 0 +24.9609 44.8629 0 +28.0498 45.5977 0 +26.6489 46.5118 0 +28.8151 45.1861 0 +29.7269 45.1621 0 +27.8487 45.8996 0 +28.0808 45.8443 0 +25.0495 45.4371 0 +26.7277 45.8657 0 +25.3652 43.6572 0 +11.3205 46.7285 0 +11.3185 46.4952 0 +11.3778 46.463 0 +10.9436 45.9595 0 +10.5495 46.6164 0 +11.4118 46.9281 0 +19.406053 43.865156999999996 0 +19.8098 45.1573 0 +20.715084 43.888764 0 +19.973146 43.261405 0 +19.7005 43.5077 0 +19.4678 49.1505 0 +17.277 48.373 0 +17.1025 48.1961 0 +15.2518 45.504299 0 +13.7368 46.2281 0 +14.4221 45.738098 0 +15.4569 45.826 0 +14.2613 46.0807 0 +15.4695 46.149502 0 +14.4434 45.934799 0 +14.8101 45.531101 0 +15.6275 45.867199 0 +15.5018 46.460999 0 +14.0643 45.893398 0 +14.380700000000001 45.527802 0 +16.250401 46.448101 0 +14.5278 46.0438 0 +14.4433 46.294102 0 +15.1139 46.636501 0 +13.5094 46.244499 0 +14.0143 45.546397999999996 0 +14.8393 45.803299 0 +14.7014 46.101601 0 +15.0246 46.4342 0 +8.490392 39.122956 0 +21.81534 42.816477 0 +15.8597222 44.8086111 0 +21.70579 43.635172 0 +17.001111 43.8227778 0 +14.22011 36.032335 0 +14.483952 35.901233 0 +8.25474 47.58771 0 +6.95295 46.34176 0 +10.02309 46.41363 0 +7.12129 47.1609 0 +10.26355 46.62033 0 +6.26545 46.53363 0 +7.11106 46.25053 0 +7.29096 46.63394 0 +6.131509 46.43213 0 +7.64433 46.37454 0 +8.748279 46.59512 0 +9.38076 47.04921 0 +8.019579 46.23962 0 +16.3222 50.3502 0 +1.1953 44.3676 0 +5.571813 46.044786 0 +6.539745 44.78784 0 +7.2191 43.64387 0 +7.3919 43.9749 0 +4.542 45.279 0 +7.8399 44.2416 0 +10.5881 44.35047 0 +7.326 44.2455 0 +12.58676 42.608486 0 +13.0873 43.0365 0 +11.255134 43.774366 0 +13.572833 42.453167 0 +11.707267 44.07746 0 +12.65907 41.769756 0 +9.51739 44.31625 0 +13.6857 42.935 0 +14.39667 40.8275 0 +9.853652 44.049818 0 +9.4566 40.4444 0 +26.7437 41.847 0 +19.991711 44.098236 0 +13.764 45.709 0 +9.378 39.496 0 +25.2002 47.644 0 +13.9999 46.317402 0 +19.900001 42.040012 0 +23.2793 42.857 0 +26.583 42.467 0 +24.1734 42.5137 0 +24.7475 42.1469 0 +27.4099 43.1602 0 +24.7388 41.6942 0 +22.6513 42.8345 0 +21.72277 38.3959 0 +21.87263 38.39341 0 +21.945772 38.415536 0 +22.184363 38.321825 0 +21.89204 38.30811 0 +13.8167 45.2926 0 +14.751474 44.972003 0 +16.784453 43.608877 0 +18.14687 42.669083 0 +16.404696 44.004883 0 +15.270319 44.688436 0 +16.0686 46.1551 0 +16.891928 42.768552 0 +17.019674 43.287712 0 +14.87105 44.56347 0 +15.467266 45.61527 0 +14.483006 45.325086 0 +13.501932 45.494952 0 +18.31235 42.6007 0 +17.6999 42.8716 0 +15.769351 44.531422 0 +15.98687 45.827084 0 +24.0318 49.8186 0 +17.8278 49.3655 0 +4.7697400000000005 44.37408 0 +7.1312 43.5479 0 +22.8692 37.8902 0 +22.659 38.7664 0 +23.1189 37.6144 0 +22.9743 37.9879 0 +23.4662 38.0606 0 +24.4853 37.1609 0 +25.4282 36.4159 0 +22.6634 38.0357 0 +23.3122 38.1642 0 +23.93306 38.07794 0 +22.99886 38.64956 0 +27.1309 36.6106 0 +20.696265 37.851123 0 +21.13842 40.19588 0 +20.5746 38.6839 0 +20.656 38.621 0 +21.3836 40.7817 0 +20.5841 38.114 0 +21.013 37.2497 0 +22.9628 40.6319 0 +25.429562 36.385841 0 +12.7556 37.67883 0 +13.00433 37.80162 0 +13.943825 40.746222 0 +13.872129 40.75909 0 +12.92242 37.79082 0 +12.75932 37.89337 0 +14.034938 40.761401 0 +11.43431 44.188961 0 +11.5327 43.9545 0 +15.3331 40.9298 0 +15.458 40.4861 0 +27.736 41.129 0 +27.327514 40.747895 0 +26.4742 40.398 0 +27.5238 41.6308 0 +27.1777 40.6875 0 +28.8175 46.9975 0 +29.8723 46.5293 0 +28.3513 48.135 0 +5.672365 44.941426 0 +5.653199 44.95068 0 +12.5005 46.0266 0 +25.2919 46.2969 0 +28.0419 44.5858 0 +13.1386 46.275 0 +27.3351 44.6102 0 +26.7099 45.5481 0 +23.4969 47.6728 0 +21.7856 47.0902 0 +25.2167 47.6147 0 +25.2175 47.6326 0 +25.1805 47.633 0 +23.5981 46.7133 0 +28.0624 44.3207 0 +22.898 45.887 0 +26.609 48.2073 0 +27.408 46.0605 0 +26.5009 46.9551 0 +22.416 44.881 0 +27.8009 44.1168 0 +28.2467 46.4733 0 +23.1189 46.676 0 +21.7128 44.7815 0 +22.9494 47.1499 0 +28.4224 44.1779 0 +26.9768 44.9199 0 +26.6498 45.8512 0 +26.2276 47.3616 0 +27.8302 45.5007 0 +21.663 46.2653 0 +22.1246 45.754 0 +24.5222 46.5284 0 +28.0467 44.5445 0 +24.273 45.652 0 +27.6687 45.5939 0 +27.7911 46.6415 0 +22.2731 48.9333 0 +20.2339 49.1894 0 +18.836 48.4939 0 +15.6245 46.010799 0 +15.3177 45.9488 0 +14.9977 46.061199 0 +15.0246 46.4342 0 +11.67894 42.868614 0 +10.504497 43.631413 0 +20.0723 42.3637 0 +20.785909 40.623068 0 +20.44 41.6847 0 +19.495075 40.470026 0 +7.83223 46.21652 0 +7.771659 46.41554 0 +7.596779 46.21005 0 +21.947007 38.414981 0 +21.946015 38.414084 0 +21.948053 38.414174 0 +21.946234 38.412867 0 +21.948785 38.415496 0 +6.6888000000000005 43.881 0 +7.26333 44.83517 0 +6.934 45.8444 0 +7.5569 43.7825 0 +8.2372 44.2075 0 +10.4821 44.026 0 +7.5682 45.6019 0 +7.42033 44.22666 0 +9.2926 44.6071 0 +7.89317 43.9105 0 +7.13433 45.4595 0 +10.4915 43.91417 0 +7.8082 44.0426 0 +8.54517 44.54133 0 +7.116 44.5068 0 +7.1565 45.8378 0 +8.3527 44.8493 0 +6.79083 44.92083 0 +7.26533 45.14817 0 +7.8685 45.8753 0 +7.747 45.51267 0 +22.1398 38.3911 0 +21.3763 38.1962 0 +22.5271 38.4112 0 +21.9058 38.4269 0 +20.5623 38.4593 0 +22.3423 37.9363 0 +20.8367 37.7095 0 +22.3793 37.3703 0 +21.8116 38.4222 0 +15.9427 40.7867 0 +9.1733 41.1269 0 +15.233 37.9712 0 +13.753730000000001 37.74897 0 +16.6041 40.9071 0 +13.602 43.55017 0 +12.41991 43.55846 0 +11.4754 42.8519 0 +12.94153 43.49807 0 +12.6587 43.0426 0 +12.5715 43.3666 0 +12.26801 43.33419 0 +12.457 43.4807 0 +12.40663 43.38211 0 +10.59698 44.06238 0 +9.44782 44.76792 0 +11.76657 44.22454 0 +10.37218 46.47616 0 +14.5938 41.5461 0 +15.3776 40.0783 0 +15.2366 41.028 0 +11.9663 43.3292 0 +16.2114 39.2534 0 +10.8652 42.7908 0 +15.3046 40.4896 0 +10.210652 42.746577 0 +14.0183 41.5978 0 +12.9046 43.0049 0 +15.954618 39.528756 0 +14.90502 41.65418 0 +13.1954 43.37557 0 +13.962 37.158 0 +13.8229 37.4639 0 +15.303 40.3181 0 +13.3038 37.8943 0 +14.1625 37.4075 0 +11.95167 43.61888 0 +10.979506 43.795597 0 +11.29017 43.47311 0 +9.60668 40.31802 0 +15.0865 37.7802 0 +14.9129 37.6863 0 +15.0018 37.7653 0 +14.9865 37.7437 0 +15.121 37.882 0 +14.9041 37.7313 0 +15.2103 37.7896 0 +15.0336 37.7912 0 +15.0902 37.7357 0 +14.9979 37.7196 0 +15.026 37.8168 0 +14.9703 37.679 0 +14.9498 37.8208 0 +15.0216 37.6314 0 +15.0168 37.7659 0 +15.0567 37.8113 0 +15.1773 37.8204 0 +15.1885 37.6719 0 +14.857 37.824 0 +14.8152 37.747 0 +14.9744 37.6934 0 +14.8794 37.6181 0 +15.0274 37.6925 0 +14.9469 37.7731 0 +13.58379 42.26573 0 +11.1229 44.16782 0 +11.15622 43.20972 0 +12.7804 46.59658 0 +14.5665 37.7107 0 +13.25458 41.55827 0 +16.20777 38.97983 0 +13.31229 41.7945 0 +15.155 37.285 0 +14.872 37.3485 0 +14.7831 36.959 0 +14.7155 37.1783 0 +14.355 38.533 0 +14.5753 38.5642 0 +14.9483 38.4457 0 +13.9046 42.01154 0 +15.2304 38.7992 0 +15.1918 38.7866 0 +14.9608 38.3968 0 +14.9482 38.3961 0 +14.9801 38.3763 0 +14.986 38.396 0 +15.8856 38.6068 0 +11.804 42.6137 0 +12.69888 41.67778 0 +12.86432 35.8613 0 +13.04032 42.60286 0 +12.6302 35.518299999999996 0 +14.1832 42.0468 0 +10.514 46.05492 0 +10.6286 45.7753 0 +10.657926 43.273245 0 +15.8019 40.3249 0 +11.6765 42.77861 0 +14.731 38.1199 0 +15.1684 40.7826 0 +9.716 45.76972 0 +15.127 41.7059 0 +17.850423 40.589408 0 +12.11214 42.91263 0 +15.55352 40.1376 0 +14.25402 41.64188 0 +16.441 40.6044 0 +9.2321 45.4803 0 +15.2313 38.2713 0 +15.990414 39.890961 0 +15.158 41.37 0 +13.8779 41.1459 0 +12.570071 42.80387 0 +7.9271 45.0739 0 +16.0067 37.9531 0 +15.3528 38.1465 0 +14.96815 41.1227 0 +7.06101 45.76975 0 +15.48892 40.7564 0 +16.1958 41.0609 0 +15.9096 41.712 0 +14.5916 38.0339 0 +15.5083 38.2639 0 +12.74222 42.0228 0 +11.4248 44.3128 0 +15.7515 40.2663 0 +15.69992 38.0031 0 +14.8739 38.043 0 +12.5246 43.263 0 +12.580583 43.610823 0 +10.8987 44.8873 0 +17.0644 40.7888 0 +15.1356 38.0286 0 +13.11427 42.83355 0 +11.1724 45.3082 0 +16.450405 40.05096 0 +9.9307 45.4056 0 +15.9602 40.9441 0 +12.2386 43.6486 0 +12.84018 43.94105 0 +14.1148 37.8335 0 +11.9788 36.794200000000004 0 +12.0405 36.7714 0 +12.535 43.53567 0 +16.4383 38.4494 0 +13.71202 41.71743 0 +10.31311 44.76374 0 +14.81078 41.22345 0 +13.354 46.4075 0 +14.529 41.3641 0 +11.9729 36.8121 0 +8.34592 44.32425 0 +14.3624 37.2225 0 +12.7103 41.76039 0 +14.0568 37.6468 0 +14.1524 41.70328 0 +14.7057 41.3974 0 +16.3459 39.8772 0 +8.913604 44.867306 0 +11.35855 44.05428 0 +16.6886 39.0359 0 +14.37917 41.38667 0 +15.30738 40.56045 0 +15.7437 41.7546 0 +15.365 41.135 0 +15.8675 40.1821 0 +15.63277 40.39 0 +15.20908 40.92542 0 +13.53261 38.09193 0 +12.78225 43.436280000000004 0 +15.0737 37.1577 0 +13.60393 42.62279 0 +12.00017 42.06406 0 +10.90265 43.11478 0 +14.5502 41.7666 0 +13.9138 42.8081 0 +13.17913 38.70787 0 +14.2342 41.4154 0 +8.77 45.867695 0 +14.630154 41.18326 0 +10.6628 45.3135 0 +15.6163 40.9549 0 +13.62324 41.86965 0 +10.9765 44.35085 0 +15.330400000000001 40.6871 0 +15.1804 40.8969 0 +15.7967 40.5722 0 +15.5361 40.8755 0 +15.176 40.9643 0 +15.2292 41.0785 0 +17.517326 40.648402 0 +17.2846 40.5259 0 +13.5137 46.548 0 +10.8187 45.683 0 +13.645 46.1733 0 +13.0011 46.4142 0 +11.2099 45.6378 0 +27.1493 44.2144 0 +25.2172 44.1343 0 +22.7111 46.7917 0 +27.5748 47.1777 0 +22.9325 44.2782 0 +26.2526 44.6777 0 +24.4038 43.9986 0 +11.1884 45.8808 0 +10.9587 46.0835 0 +19.5 42.05 0 +20.005316 39.878303 0 +22.6749 43.6227 0 +25.8751 42.9287 0 +28.4162 43.4059 0 +25.3396 41.6303 0 +23.1287 41.8417 0 +26.4941 43.8024 0 +26.593 43.37 0 +23.7496 41.5469 0 +23.74 43.356 0 +23.4255 42.4762 0 +24.6207 43.387 0 +28.1359 43.6376 0 +25.1732 43.1227 0 +26.5079 43.5662 0 +28.6057 43.5389 0 +25.9763 43.2653 0 +23.2342 42.6144 0 +11.2795 48.142334 0 +11.22 47.91 0 +13.0275 47.6353 0 +12.87726 47.720501 0 +11.2473 48.1522 0 +11.275473 48.162877 0 +11.275394 48.162975 0 +11.275561 48.162972 0 +11.275332 48.162769 0 +11.27502 48.162958 0 +11.275565 48.16308 0 +11.276804 48.165591 0 +11.275476 48.162941000000004 0 +11.275065 48.162904 0 +11.273684 48.164357 0 +11.276289 48.164883 0 +11.2514 48.1629 0 +11.2635 48.1406 0 +12.6 48.12 0 +11.510058 48.067497 0 +11.587935 48.077927 0 +11.707375 48.070885 0 +11.7188 47.979698 0 +11.5171 48.0 0 +12.795714 47.737167 0 +12.841651 47.768345 0 +11.7104 47.038399 0 +11.288809 48.173897 0 +6.054836 46.235876 0 +6.07608 46.309893 0 +6.066212 46.266947 0 +8.25474 47.58771 0 +6.95295 46.34176 0 +7.69498 47.33578 0 +6.46757 46.7872 0 +8.177979 47.8716 0 +10.02309 46.41363 0 +8.424899 46.87033 0 +7.2301 47.39363 0 +6.472979 46.938 0 +6.61184 46.78233 0 +7.12129 47.1609 0 +6.12055 46.29249 0 +8.012475 47.23088 0 +9.879519 46.7805 0 +7.40839 46.08105 0 +8.846759 47.89518 0 +8.013579 47.43757 0 +8.110509 46.4352 0 +7.13579 46.15632 0 +10.26355 46.62033 0 +8.6629 46.45481 0 +6.26545 46.53363 0 +8.318863 46.57814 0 +7.11106 46.25053 0 +8.15117 46.75681 0 +7.70018 47.66038 0 +6.94038 46.21934 0 +7.29096 46.63394 0 +6.131509 46.43213 0 +9.492699 47.2946 0 +7.64433 46.37454 0 +9.00825 46.84676 0 +6.30842 46.346559 0 +8.25262 47.71217 0 +7.11229 45.95101 0 +7.9640889999999995 46.05069 0 +7.16525 47.37926 0 +9.04171 45.92184 0 +8.63706 46.96764 0 +7.64884 47.50647 0 +8.748279 46.59512 0 +9.111708 46.82574 0 +5.90792 46.19107 0 +9.38076 47.04921 0 +9.336009 47.5643 0 +7.92093 47.47612 0 +7.08645 47.30266 0 +6.97302 46.14415 0 +6.097039 46.06018 0 +5.973429 46.06592 0 +7.29938 46.36334 0 +8.019579 46.23962 0 +8.492359 47.76449 0 +8.86899 47.66974 0 +8.111869 47.52752 0 +6.958739 46.77362 0 +8.68161 47.6487 0 +9.44956 46.48317 0 +9.16648 46.2061 0 +6.27815 46.45175 0 +9.02207 46.42309 0 +9.1231 47.7528 0 +8.98681 47.52976 0 +8.92525 47.09837 0 +8.907529 47.41465 0 +7.62418 46.66487 0 +7.3688 46.99777 0 +8.58088 47.36921 0 +22.07272 38.36543 0 +13.750296 44.905732 0 +15.05747 43.99191 0 +16.4488 43.1776 0 +16.455717 46.131166 0 +15.707297 43.866017 0 +16.7544 45.6135 0 +15.623055 44.878389 0 +15.968193 45.907328 0 +17.133 43.4944 0 +17.848056 45.436024 0 +15.986949 45.826997 0 +14.30955 48.81989 0 +16.3222 50.3502 0 +17.6707 48.8591 0 +13.5782 49.1309 0 +16.8341 50.0966 0 +16.3952 49.0619 0 +17.5425 49.7768 0 +18.1399 49.8346 0 +14.4331 50.0703 0 +14.5417 49.9883 0 +15.299556 49.029533 0 +15.4871 49.2948 0 +16.5933 49.3084 0 +14.1923 49.4389 0 +0.760999 45.573975 0 +3.1310000000000002 46.052 0 +8.763 41.9279 0 +5.3325 43.4917 0 +5.8067 43.5882 0 +3.451818 44.519686 0 +4.1563 44.3689 0 +6.045 43.951 0 +6.256064 47.246936 0 +1.7711 45.9568 0 +5.6433 43.8009 0 +6.9218 43.7528 0 +3.111 45.763 0 +3.8445 46.5581 0 +6.6517 47.2484 0 +3.09 43.135 0 +2.932 45.435 0 +3.6936999999999998 45.5004 0 +6.7775 44.1095 0 +7.3744 43.831 0 +5.463089 47.505456 0 +5.810501 47.104272 0 +2.563 45.385 0 +1.5912 46.5152 0 +5.7439 45.2413 0 +2.200888 46.173861 0 +2.701 46.52 0 +7.254296 47.683438 0 +7.05 44.184 0 +3.221365 43.969837 0 +3.247 45.232 0 +2.55412 44.76055 0 +6.033356 43.079525 0 +5.7675 43.988 0 +7.424688 43.730343 0 +1.1953 44.3676 0 +9.363 42.953 0 +7.8629999999999995 43.398667 0 +7.153 43.896 0 +7.20276 43.6802 0 +6.220211 46.154234 0 +5.571813 46.044786 0 +6.539745 44.78784 0 +5.096536 44.850137 0 +5.549892 44.429092 0 +5.088972 45.153917 0 +6.712353 45.472393 0 +5.069002 44.556977 0 +6.2253 44.1093 0 +4.611435 45.878365 0 +6.709738 44.910273 0 +6.074 44.3703 0 +6.68308 45.20865 0 +5.889317 45.881011 0 +4.7522 46.3459 0 +5.80467 45.060788 0 +5.801324 45.064487 0 +5.806072 45.06951 0 +6.401519 45.036803 0 +6.75611 46.0567 0 +5.6972439999999995 45.609314 0 +6.682073 46.329823 0 +6.11233 44.81517 0 +7.617472 44.116444 0 +3.621 45.97 0 +4.7442 46.95652 0 +7.2191 43.64387 0 +3.8590809999999998 43.715286 0 +5.922489 46.759014 0 +6.6472 47.71069 0 +6.624517 45.688207 0 +5.4837 43.9412 0 +7.5532 43.986 0 +5.1064 43.9377 0 +3.618578 45.047528 0 +2.1642 44.1912 0 +9.2847 42.0945 0 +7.2366 44.0558 0 +6.811695 44.480935 0 +3.9587 44.1054 0 +6.4074 43.7471 0 +7.3919 43.9749 0 +4.892048 44.905697 0 +2.483 45.749 0 +7.27652 47.965735 0 +4.542 45.279 0 +23.5577 35.3692 0 +15.8063 40.29722 0 +16.70442 40.64907 0 +28.4128 44.4581 0 +11.2768 48.1639 0 +13.700627 48.844303 0 +13.71 48.83 0 +10.1071 47.6799 0 +10.153 44.166 0 +7.8399 44.2416 0 +10.0658 44.4913 0 +10.5881 44.35047 0 +7.70267 43.84617 0 +10.757 44.045 0 +8.9512 44.4712 0 +8.06617 44.11217 0 +7.326 44.2455 0 +23.0213 38.6926 0 +23.7845 37.9665 0 +22.9795 38.2569 0 +24.437 38.0321 0 +21.9785 38.2401 0 +24.0428 35.5193 0 +24.0585 34.8389 0 +24.7995 34.9731 0 +24.4632 35.3486 0 +23.6248 35.2348 0 +25.18017 35.304187 0 +22.9939 36.2447 0 +22.136 36.9261 0 +25.4733 35.0429 0 +23.7577 35.5604 0 +26.0909 35.2021 0 +25.0221 37.6541 0 +23.30117 35.86704 0 +25.52301 37.07274 0 +23.71767 37.97384 0 +21.8105 38.91657 0 +24.08738 34.83914 0 +25.0709 35.3058 0 +24.89 35.288 0 +23.9811 35.4606 0 +21.92522 37.17872 0 +20.84874 39.65616 0 +27.16106 35.5471 0 +19.79623 39.7127 0 +22.15042 38.0435 0 +25.3372 35.1801 0 +23.0621 36.2566 0 +24.100138 38.633147 0 +21.78209 40.30331 0 +25.18055 39.89725 0 +23.385876 37.578529 0 +23.329567 37.612669 0 +23.22189 39.30567 0 +27.17666 36.57441 0 +25.61037 35.26134 0 +23.86517 41.34846 0 +23.44443 40.37328 0 +24.550167 41.3525 0 +23.8638 38.0473 0 +25.53553 41.14503 0 +21.46475 38.05586 0 +24.81204 35.01777 0 +24.5482 38.8831 0 +25.530450000000002 40.47094 0 +21.274667 39.3445 0 +25.475262999999998 36.366992 0 +22.0144 39.56468 0 +24.1997 35.407 0 +22.94686 36.71803 0 +20.5886 38.17683 0 +23.7942 37.8524 0 +26.21691 35.1147 0 +21.2135 38.9224 0 +21.7089 37.5324 0 +21.9209 38.5933 0 +21.71 37.952 0 +20.576 39.2492 0 +22.9673 38.0228 0 +21.1833 38.5986 0 +21.4073 38.4124 0 +21.0965 39.5299 0 +21.525 38.616 0 +21.742 36.8955 0 +22.0566 38.4133 0 +21.7864 38.2836 0 +22.336 39.0211 0 +26.046 40.885 0 +23.8436 39.1478 0 +26.0506 38.3869 0 +25.4056 36.4709 0 +22.401 40.957 0 +23.0996 40.5978 0 +20.3299 39.5315 0 +24.513666 40.99666 0 +22.898 41.162 0 +23.999200000000002 40.8178 0 +21.36321 39.95495 0 +23.1502 37.383 0 +22.48916 40.10333 0 +20.65779 38.78893 0 +21.0489 40.4147 0 +27.17817 36.60233 0 +23.9791 40.3325 0 +23.6768 39.9363 0 +20.7715 38.076 0 +25.8553 39.2114 0 +23.3539 40.8217 0 +23.595 41.10866 0 +24.7194 40.6064 0 +22.2325 39.711 0 +23.19178 39.36598 0 +21.2397 48.2961 0 +20.7258 46.3501 0 +16.7755 46.4703 0 +20.267 47.2996 0 +19.0201 47.4831 0 +18.2606 47.3631 0 +17.3317 47.4162 0 +18.0999 46.0883 0 +21.9007 47.3849 0 +18.6436 46.215 0 +17.5348 47.1712 0 +19.8934 47.9182 0 +16.5567 47.6807 0 +17.8877 46.9001 0 +22.5391 48.1304 0 +15.54308 41.75738 0 +11.7893 43.7967 0 +15.132629 41.199899 0 +10.482 45.1071 0 +14.1407 40.82 0 +13.409 42.53578 0 +15.816928 41.158295 0 +11.0031 44.8658 0 +14.08057 40.810901 0 +16.5088 39.4027 0 +12.98176 41.94903 0 +12.58676 42.608486 0 +14.0935 40.8329 0 +14.089047 40.778154 0 +14.1818 40.8382 0 +14.163176 40.79817 0 +14.1473 40.8187 0 +14.147 40.8292 0 +14.1187 40.8211 0 +12.883011 43.768478 0 +14.4223 40.8212 0 +14.1397 40.8291 0 +14.05785 37.93745 0 +14.1443 40.8275 0 +14.149329 40.829447 0 +11.6497 46.04818 0 +15.05257 37.57919 0 +14.945 37.498 0 +15.1345 37.7551 0 +13.659995 37.328791 0 +13.0873 43.0365 0 +13.11718 42.26802 0 +11.255134 43.774366 0 +14.910201 41.513145 0 +14.026023 37.990126 0 +13.572833 42.453167 0 +13.3352 43.0627 0 +15.122 36.9596 0 +15.0325 37.2831 0 +15.222 37.0928 0 +14.5216 36.9926 0 +13.8551 40.7115 0 +13.8758 40.7209 0 +13.9008 40.7458 0 +14.928733 38.083692 0 +11.707267 44.07746 0 +12.65907 41.769756 0 +13.433009 37.954428 0 +12.5647 37.7532 0 +10.858943 45.697536 0 +12.953452 37.946147 0 +12.97673 37.66195 0 +15.703 38.162 0 +9.51739 44.31625 0 +13.6857 42.935 0 +11.24579 43.52358 0 +14.39667 40.8275 0 +14.567486 41.031206 0 +14.17989 41.200001 0 +10.52495 43.72193 0 +16.8158 39.48514 0 +9.853652 44.049818 0 +13.40057 42.02193 0 +16.06124 40.52148 0 +15.807 40.6458 0 +12.70222 41.81112 0 +14.9315 42.2364 0 +11.0721 45.6468 0 +12.445128 43.937695 0 +11.90967 42.84906 0 +10.5243 45.6183 0 +13.101908 37.516469 0 +13.74926 37.94064 0 +18.4675 40.0724 0 +9.4566 40.4444 0 +12.940570000000001 43.255 0 +14.335709 40.58256 0 +12.50993 42.23696 0 +12.7104 46.2601 0 +15.2149 38.809615 0 +13.776334 42.22944 0 +16.33762 39.6601 0 +11.673888999999999 45.361667 0 +15.51 42.123 0 +14.438636 40.818549 0 +14.4299 40.83 0 +14.4314 40.819 0 +12.770183 41.750225 0 +14.4242 40.8059 0 +14.4238 40.8356 0 +26.7437 41.847 0 +26.153 40.7362 0 +26.5132 40.6708 0 +25.8987 40.1908 0 +18.9226 42.5465 0 +13.405 42.354 0 +17.1839 44.7488 0 +6.678 45.052 0 +15.8939 38.2603 0 +13.216 37.578 0 +15.8155 39.9938 0 +19.991711 44.098236 0 +19.26083 42.42967 0 +16.7583 39.1794 0 +19.8631 41.3472 0 +13.764 45.709 0 +9.34732 46.47223 0 +14.3533 37.469 0 +10.3864 44.1594 0 +9.378 39.496 0 +14.5242 35.8373 0 +5.675 44.9422 0 +13.8013 45.6589 0 +12.924 46.245 0 +12.7419 46.4258 0 +13.2755 46.25383 0 +15.433272 48.670613 0 +12.5123 46.7474 0 +15.5232 47.2505 0 +13.6383 47.6913 0 +15.8618 47.9282 0 +15.8588 47.9282 0 +9.8803 47.286701 0 +10.7291 47.0211 0 +13.3447 47.0784 0 +14.132 48.055 0 +12.677 47.4243 0 +14.2659 47.8495 0 +11.1037 47.3448 0 +13.6416 46.6299 0 +14.5489 46.5092 0 +10.7623 47.4871 0 +16.2963 47.6997 0 +14.566836 47.11321 0 +15.0327 46.678 0 +11.2087 47.2205 0 +16.347 48.66 0 +16.3617 48.2483 0 +11.5763 47.3357 0 +16.07 48.11 0 +11.6363 47.2638 0 +17.144 40.633 0 +12.0472 46.2829 0 +13.2438 46.234 0 +13.0984 46.3195 0 +12.4379 46.009 0 +11.8047 45.8806 0 +12.4448 46.3116 0 +12.8814 46.4569 0 +12.6154 46.1495 0 +12.9877 46.2408 0 +13.1481 46.5491 0 +13.565 46.4428 0 +13.6336 45.9875 0 +12.1051 45.9922 0 +12.9729 46.5584 0 +22.7075 49.6314 0 +20.2996 49.4182 0 +19.7984 50.2195 0 +29.289 45.4245 0 +6.2549 43.3827 0 +0.7401700000000001 44.9395 0 +3.8589 47.2683 0 +2.2175 43.3411 0 +27.8666 45.5335 0 +5.88 44.9183 0 +27.2311 45.723 0 +8.9994 42.5483 0 +1.51639 45.3044 0 +27.7703 45.5897 0 +24.3537 47.0855 0 +24.6332 45.3657 0 +23.345 44.0201 0 +21.137 45.3828 0 +27.6436 46.2334 0 +26.1029 46.9387 0 +25.6611 46.0749 0 +25.2002 47.644 0 +21.6401 45.6188 0 +22.496 47.6855 0 +28.1362 45.178 0 +27.0261 44.197 0 +23.7999 44.325 0 +25.3886 45.9675 0 +28.6323 44.075 0 +26.9747 45.3801 0 +22.7767 45.3933 0 +27.9303 44.6893 0 +24.9804 44.5281 0 +26.5432 45.1187 0 +27.7655 45.5442 0 +25.5154 46.7059 0 +26.8194 44.4739 0 +23.7698 45.446 0 +28.5876 43.8168 0 +24.3765 46.1497 0 +28.8127 46.9186 0 +25.945 45.4909 0 +27.8771 45.5373 0 +26.2952 45.4272 0 +27.442166 46.837498 0 +27.0558 45.7633 0 +26.394 46.3349 0 +27.1477 45.8723 0 +22.6922 44.6627 0 +26.685465 45.72664 0 +27.8314 45.4702 0 +27.9949 45.6741 0 +23.2038 44.6609 0 +24.9609 44.8629 0 +28.0498 45.5977 0 +26.6489 46.5118 0 +28.8151 45.1861 0 +28.4196 44.8565 0 +29.7269 45.1621 0 +27.8487 45.8996 0 +28.0808 45.8443 0 +25.0495 45.4371 0 +26.7277 45.8657 0 +25.3652 43.6572 0 +11.3205 46.7285 0 +11.3185 46.4952 0 +11.3778 46.463 0 +10.9436 45.9595 0 +10.5495 46.6164 0 +11.4118 46.9281 0 +19.406053 43.865156999999996 0 +19.8098 45.1573 0 +20.715084 43.888764 0 +19.973146 43.261405 0 +19.7005 43.5077 0 +19.4678 49.1505 0 +17.277 48.373 0 +17.1025 48.1961 0 +15.2518 45.504299 0 +13.7368 46.2281 0 +14.4221 45.738098 0 +15.4569 45.826 0 +14.2613 46.0807 0 +15.4695 46.149502 0 +14.4434 45.934799 0 +14.8101 45.531101 0 +15.6275 45.867199 0 +13.9999 46.317402 0 +15.5018 46.460999 0 +14.0643 45.893398 0 +14.380700000000001 45.527802 0 +16.250401 46.448101 0 +14.5278 46.0438 0 +14.4433 46.294102 0 +15.1139 46.636501 0 +13.5094 46.244499 0 +14.0143 45.546397999999996 0 +14.8393 45.803299 0 +14.7014 46.101601 0 +13.8877 46.0322 0 +15.0246 46.4342 0 +8.490392 39.122956 0 +10.516896 43.65693 0 +10.46937 43.640408 0 +18.9507 44.0862 0 +21.81534 42.816477 0 +15.8597222 44.8086111 0 +21.70579 43.635172 0 +17.001111 43.8227778 0 +14.22011 36.032335 0 +14.483952 35.901233 0 +14.0739 49.2705 0 +26.9381081 43.1321836 0 +26.7803679 42.1181898 0 +25.9562249 43.7176294 0 +18.1037 43.2966 0 +28.877099 44.7659321 0 +22.6842196 49.0638537 0 +22.896893 50.0216728 0 +23.228785 50.2396867 0 +22.120825 49.259841 0 +22.404111 49.943115 0 +21.889923 49.9045362 0 +21.929433 50.579161 0 +20.923406 49.596788 0 +21.4761583 50.2310283 0 +20.0736794 49.835914 0 +20.323381 50.233895 0 +25.599565 44.5828828 0 +24.3981961 44.3138567 0 +19.13803 48.86676 0 +19.14271 48.50926 0 +20.51141 48.70615 0 +21.99737 49.01312 0 +21.72127 48.61993 0 +16.590442 48.728694 0 +16.594215 48.362882 0 +17.053046 47.758925 0 +16.396784 47.962882 0 +16.205468 48.37198 0 +15.652187 48.368663 0 +15.958719 47.40859 0 +15.406258 48.063503 0 +15.161949 48.348264 0 +14.649613 48.301372 0 +14.758903 47.947999 0 +15.077621 47.743667 0 +15.085607 47.445667 0 +15.298745 46.94884 0 +15.825348 46.756569 0 +14.140075 48.100292 0 +18.220939 49.150114 0 +18.464488 48.804489 0 +17.104104 48.715571 0 +17.674728 48.604392 0 +18.335925 48.446947 0 +18.999038 48.233339 0 +17.789761 48.244305 0 +18.352505999999998 48.015155 0 +17.655876 47.829403 0 +27.1932163 43.6885834 0 +27.7089688 43.6287568 0 +26.4608157 42.8336613 0 +15.94115 44.10775 0 +16.28067 43.82178 0 +16.05788 43.59037 0 +16.61076 43.51695 0 +17.21874 43.34215 0 +17.37366 43.20671 0 +18.708992 49.902233 0 +23.8756133 44.7765142 0 +24.3136466 44.9801045 0 +24.7919302 43.8298535 0 +26.574984 44.1142259 0 +18.80446 49.47437 0 +19.3038986 49.4548228 0 +18.86106 49.1745 0 +19.75251 48.9247 0 +19.7126 48.5689 0 +20.18784 48.84852 0 +19.99421 48.3175 0 +20.69957 49.31546 0 +20.742376 49.00075 0 +21.23942 49.20663 0 +21.174 48.91368 0 +21.93277 49.24889 0 +21.60924 49.21382 0 +21.24357 49.41712 0 +16.287281 45.360854 0 +17.248394 45.417427 0 +16.119632 46.003868 0 +15.78778 45.8698396 0 +16.24402 46.16748 0 +15.4719 45.728763 0 +15.57944 45.4075 0 +15.84483 45.506551 0 +15.57944 45.4075 0 +16.90884 45.26954 0 +16.612595 45.74821 0 +15.697693 45.818786 0 +16.188016 45.424458 0 +16.27109 45.42706 0 +16.59289 45.314612 0 +14.993574 48.934141 0 +14.732612 48.634316 0 +14.070468 48.460861 0 +14.416341 47.520995 0 +14.551274 46.933264 0 +14.007304 46.815741 0 +13.949906 47.094808 0 +13.761081 47.430144 0 +13.561024 47.82783 0 +13.497524 48.427019 0 +13.306443 48.122971 0 +13.125995 47.479792 0 +13.078006 46.911289 0 +12.64199 47.160486 0 +12.30854 47.37898 0 +14.1494 49.6168 0 +14.7074 49.2288 0 +14.9288 49.684 0 +15.0341 50.0752 0 +15.6502 50.061 0 +15.6077 49.6959 0 +15.7007 48.9434 0 +16.1962 49.4392 0 +16.1457 49.8528 0 +16.8893 49.7049 0 +17.29109 49.43025 0 +17.092 49.1521 0 +9.656586 48.126633 0 +11.849 47.7528 0 +11.0032 47.6836 0 +12.396 47.8673 0 +12.975 48.2928 0 +12.4605 48.478 0 +16.70589 47.28327 0 +17.148597 46.952098 0 +16.527617 46.864238 0 +17.314765 46.640763 0 +17.289686 46.159675 0 +17.795495 46.424445 0 +18.264761 46.525589 0 +18.481994 46.946341 0 +18.834197 47.154749 0 +18.965496 46.744449 0 +17.81597 45.916386 0 +10.7334 48.1651 0 +11.9233 48.3067 0 +22.8692 37.8902 0 +27.669172 43.1195367 0 +23.786496 38.7664 0 +19.9455 40.7082 0 +27.1993406 42.6037396 0 +26.2548328 42.0614521 0 +27.72946 42.0875621 0 +18.96271 43.62646 0 +18.42409 43.87458 0 +17.688522 43.821239 0 +17.793517 43.348317 0 +18.585392 43.169517 0 +18.446322 43.502236 0 +18.036111 43.751114 0 +18.008219 44.235739 0 +16.615556 44.785611 0 +17.165691 44.068548 0 +16.531313 44.481844 0 +17.157294 44.393089 0 +16.320242 44.890764 0 +17.657208 44.513557 0 +18.464769 45.058136 0 +18.089228 44.726258 0 +18.551372 44.383708 0 +18.997248 44.770368 0 +19.093175 44.398208 0 +17.662483 45.092811 0 +8.327315 46.010724 0 +8.4388 46.13512 0 +8.288 45.9358 0 +19.1844 42.1866 0 +23.7865 38.406639 0 +21.4378 42.4605 0 +23.290622 41.285234 0 +24.159552 41.159824 0 +24.882541 41.149814 0 +24.96409 40.980426 0 +25.599302 40.869004 0 +26.271823 41.33885 0 +22.020757 40.784455 0 +23.687219 40.660191 0 +21.594281 40.48323 0 +22.541959 40.470873 0 +23.185904 40.351632 0 +20.578799 39.900044 0 +21.047022 39.940931 0 +21.938318 40.041597 0 +21.630671 39.733743 0 +22.668355 39.728109 0 +21.746351 39.235059 0 +22.513179 39.372623 0 +22.826363 39.089484 0 +23.229 38.807616 0 +22.285317 38.700733 0 +23.455375 38.42562 0 +24.233059 38.182439 0 +21.922542 37.704209 0 +22.577381 37.521743 0 +22.586834 37.01819 0 +22.987585 36.967115 0 +22.333655 36.762178 0 +15.55595 44.08133 0 +15.97339 43.86128 0 +16.37304 43.66427 0 +16.58204 43.82542 0 +16.90315 43.48575 0 +17.60992 42.98679 0 +19.6203 47.3447 0 +20.525 48.1222 0 +19.5997 47.9039 0 +19.4386 46.8138 0 +21.1376 47.5514 0 +20.5675 46.7123 0 +21.9143 47.9811 0 +17.9238 47.4313 0 +18.3824 47.6386 0 +19.0186 47.8452 0 +21.1677 47.9245 0 +20.826788 47.182768 0 +20.0345 46.9877 0 +20.079 46.4475 0 +19.729025 46.332947 0 +19.131118999999998 46.327828 0 +20.2496 47.6389 0 +21.159 46.9099 0 +8.768451 45.379418 0 +8.361122 45.622597999999996 0 +8.288635 45.237928 0 +9.383602 45.137131 0 +9.761312 46.047153 0 +7.880076 44.535805 0 +9.836959 44.873936 0 +12.069651 44.983948 0 +11.435935 44.660509 0 +20.5374 48.4955 0 +19.5153 42.8503 0 +19.994596 39.425709 0 +20.5987 40.1499 0 +23.5847 38.7047 0 +22.536529 49.377962 0 +22.137023 49.593843 0 +22.6766233 50.3762967 0 +21.405213 49.641672 0 +22.1171633 50.229965 0 +21.069613 49.879362 0 +21.3554771 50.5923974 0 +20.30111 49.600797 0 +20.5063206 49.9698008 0 +20.94424 50.283043 0 +19.8706428 49.5583546 0 +19.004227 49.723945 0 +19.528032 49.918358 0 +19.173745 50.1902236 0 +17.6944065 50.1442223 0 +18.35449907 50.06966281 0 +19.861766 49.294 0 +23.7148 46.235 0 +25.3083 46.9461 0 +27.4472 45.0784 0 +22.3387 47.3108 0 +27.123 46.35 0 +20.9038 45.7162 0 +22.2469 46.4082 0 +25.4752 45.0282 0 +23.2152 45.63263 0 +21.8528 46.6164 0 +24.8165 45.7651 0 +23.7265 45.8661 0 +20.6203 45.8832 0 +21.5762 45.9792 0 +22.53426 46.02433 0 +27.1065 46.8187 0 +21.3114 46.2776 0 +23.8246 47.2213 0 +26.6592 47.2784 0 +22.9964 46.4139 0 +24.4502 47.4602 0 +26.646 47.7358 0 +25.9743289 44.2228719 0 +20.9378 42.8728 0 +20.0155 40.2948 0 +19.2497 41.96337 0 +23.3122 38.1642 0 +20.6231 42.4481 0 +23.63689 42.991448 0 +24.49 42.96 0 +25.331197 42.531642 0 +25.804958 42.413133 0 +22.831374 42.288958 0 +23.524965 42.047733 0 +23.988035 42.192493 0 +24.145215 41.766003 0 +25.807248 41.520753 0 +22.797826 43.879918 0 +23.116078 43.405501 0 +24.08 43.64 0 +25.577616 42.045966 0 +21.7778656 45.1564886 0 +22.8129 44.9836 0 +23.31579 45.15239 0 +22.0971517 45.3875322 0 +23.435478 43.689857 0 + diff --git a/examples/GMT_adria_map.sh b/examples/GMT_adria_map.sh new file mode 100755 index 0000000..1fb0399 --- /dev/null +++ b/examples/GMT_adria_map.sh @@ -0,0 +1,65 @@ +# This is a gmt script for creating global or regional maps of seismic station event data +# +# +infile=$1.txt +infileoutlines=$1_helper.txt +infileallperm=AdAStations/perm10plus.txt +infiletempdepl=AdAStations/yesDepl.txt +infiletempnodepl=AdAStations/notDepl.txt +#infileall=AdAStations/station_list +#infile2=gmt_inventory2020_permanent.txt +#infile3=SPAIN_noANT.txt +#infile4=NORWAY.txt +#infile5=Unavailable_Permanent_Stations.txt +ps=$2.ps +cfile=cfile.cpt +gridfile=tempgrid.grd +#region=-180/180/-90/90 +#region=-10/40/34/58 +#region=-24/46/33.4/70 +#region=0/40/33.4/55 +region=0/32/33.4/51 +mid=16.5 +#mid=11 +#mid=20 +#region=$3 +#mid=$4 +crange=0/100/0.5 +scale=20 +gmt makecpt -Cred,pink,green -T$crange -i2 -Z > $cfile +#gmt makecpt -Cpolar -T$crange -i2 -Z > $cfile +#gmt xyz2grd $infile -G$gridfile -R$3 -I1 +#gmt grdimage $gridfile -R$3 -JR$5/8.5i -K -C$cfile -BWseN -B5g -Ei > $ps +gmt pscoast -R$region -JR$mid/8.6i -Na/white -K -Dh -Sgrey20 -Ggrey40 -Wthinnest -B+t"" > $ps +#gmt grdimage $infile -R -J -O -K -Sc -C$cfile >> $ps +#gmt psxy $infile3 -R -J -O -K -St0.13 -Cwhite >> $ps +#gmt psxy $infile5 -R -J -O -K -St0.13 -Cwhite >> $ps +#gmt psxy $infile2 -R -J -O -K -St0.13 -Cwhite >> $ps +#gmt psxy $infile4 -R -J -O -K -St0.13 -Cwhite >> $ps +gmt psxy $infiletempnodepl -R -J -O -K -St0.16 -Cwhite -Wblack >> $ps +gmt psxy $infiletempdepl -R -J -O -K -St0.16 -Cblack -Wwhite >> $ps +gmt psxy $infileallperm -R -J -O -K -St0.16 -Cblack -Wwhite >> $ps +gmt psxy $infileoutlines -R -J -O -K -St -Cblack -Wblack >> $ps +gmt psxy $infile -R -J -O -K -St -C$cfile >> $ps +#gmt psxy $event_file -R -J -O -K -Sa0.45 -W1p -Cblack >> $ps +#gmt psxy $event_file -R -J -O -K -Sa0.3 -Wthick,yellow -Cblack >> $ps +#gmt psxy circle2.txt -R -J -O -K -Sp0.1 -W1p >> $ps +#gmt psxy circle2.txt -R -J -O -K -Se -W1p >> $ps +#gmt psscale -O -R -J -K -Dn0.05/-0.02+w8i/0.25i+h -C$cfile -Bx$scale+l'availability [%]' >> $ps +#gmt psscale -O -R -J -K -Dn0.05/-0.02+w8i/0.25i+h -C$cfile -Bx$scale+l'variability [%]' >> $ps +gmt psscale -O -R -J -K -Dn0.05/-0.02+w8i/0.25i+h -C$cfile -Bx$scale+l'availability [%]' >> $ps +#gmt psscale -O -R -J -K -Dn0.05/-0.1+w8i/0.25i+h+e -C$cfile -Bx$scale+l'depth [km]' >> $ps +gmt pslegend -R -J -O -Dn-0.05/-0.25+w2.2i/1i << EOF >> $ps +C white +F grey40 +S 0.1i t 0.18 black white 0.3i not available during test +C white +F grey40 +S 0.1i t 0.18 white black 0.3i not deployed yet +EOF +gmt psconvert -A5p -P-V -Tg $ps +rm $ps +#./GMT_generic_map.sh '201105051657' 'h' 'Residual_[s]' 'residual' 'global' 'S' '-20/20/0.1' '0.075' '-180/180/-90/90' '0' 'c' '45' '' '5' +#./GMT_generic_map.sh '201105051657' 'h' 'Residual_[s]' 'residual' 'europe' 'S' '-20/20/0.1' '0.2' '-10/40/35/55' '15' 'h' '5' '' '5' +#./GMT_generic_map.sh '201105051657' 'h' 'Residual_[s]' 'residual' 'usa' 'S' '-20/20/0.1' '0.2' '-130/-60/25/50' '-95' 'h' '5' '' '5' +#S 0.1i t 0.18 white thinnest,black 0.3i not available during test diff --git a/examples/GMT_adria_temp_map.sh b/examples/GMT_adria_temp_map.sh new file mode 100755 index 0000000..e8d9765 --- /dev/null +++ b/examples/GMT_adria_temp_map.sh @@ -0,0 +1,57 @@ +# This is a gmt script for creating global or regional maps of seismic station event data +# +# +infile=$1.txt +infileoutlines=$1_helper.txt +infileall=InventoryTemporary.txt +#infile2=gmt_inventory2020_permanent.txt +#infile3=SPAIN_noANT.txt +#infile4=NORWAY.txt +#infile5=Unavailable_Permanent_Stations.txt +ps=$2.ps +cfile=cfile.cpt +gridfile=tempgrid.grd +#region=-180/180/-90/90 +#region=-10/40/34/58 +#region=-24/46/33.4/70 +#region=0/40/33.4/55 +region=0/32/33.4/51 +mid=16.5 +#mid=11 +#mid=20 +#region=$3 +#mid=$4 +crange=0/100/0.5 +scale=20 +gmt makecpt -Cred,pink,green -T$crange -i2 -Z > $cfile +#gmt makecpt -Cpolar -T$crange -i2 -Z > $cfile +#gmt xyz2grd $infile -G$gridfile -R$3 -I1 +#gmt grdimage $gridfile -R$3 -JR$5/8.5i -K -C$cfile -BWseN -B5g -Ei > $ps +gmt pscoast -R$region -JR$mid/8.6i -Na/white -K -Dh -Sgrey20 -Ggrey40 -Wthinnest -B+t"" > $ps +#gmt grdimage $infile -R -J -O -K -Sc -C$cfile >> $ps +#gmt psxy $infile3 -R -J -O -K -St0.13 -Cwhite >> $ps +#gmt psxy $infile5 -R -J -O -K -St0.13 -Cwhite >> $ps +#gmt psxy $infile2 -R -J -O -K -St0.13 -Cwhite >> $ps +#gmt psxy $infile4 -R -J -O -K -St0.13 -Cwhite >> $ps +gmt psxy $infileall -R -J -O -K -St0.16 -Cblack -Wwhite >> $ps +gmt psxy $infileoutlines -R -J -O -K -St -Cblack -Wblack >> $ps +gmt psxy $infile -R -J -O -K -St -C$cfile >> $ps +#gmt psxy $event_file -R -J -O -K -Sa0.45 -W1p -Cblack >> $ps +#gmt psxy $event_file -R -J -O -K -Sa0.3 -Wthick,yellow -Cblack >> $ps +#gmt psxy circle2.txt -R -J -O -K -Sp0.1 -W1p >> $ps +#gmt psxy circle2.txt -R -J -O -K -Se -W1p >> $ps +#gmt psscale -O -R -J -K -Dn0.05/-0.02+w8i/0.25i+h -C$cfile -Bx$scale+l'availability [%]' >> $ps +#gmt psscale -O -R -J -K -Dn0.05/-0.02+w8i/0.25i+h -C$cfile -Bx$scale+l'variability [%]' >> $ps +gmt psscale -O -R -J -K -Dn0.05/-0.02+w8i/0.25i+h -C$cfile -Bx$scale+l'availability [%]' >> $ps +#gmt psscale -O -R -J -K -Dn0.05/-0.1+w8i/0.25i+h+e -C$cfile -Bx$scale+l'depth [km]' >> $ps +gmt pslegend -R -J -O -Dn-0.05/-0.25+w2.2i/1i << EOF >> $ps +C white +F black +S 0.1i t 0.18 black white 0.3i not available during test +EOF +gmt psconvert -A5p -P-V -Tg $ps +rm $ps +#./GMT_generic_map.sh '201105051657' 'h' 'Residual_[s]' 'residual' 'global' 'S' '-20/20/0.1' '0.075' '-180/180/-90/90' '0' 'c' '45' '' '5' +#./GMT_generic_map.sh '201105051657' 'h' 'Residual_[s]' 'residual' 'europe' 'S' '-20/20/0.1' '0.2' '-10/40/35/55' '15' 'h' '5' '' '5' +#./GMT_generic_map.sh '201105051657' 'h' 'Residual_[s]' 'residual' 'usa' 'S' '-20/20/0.1' '0.2' '-130/-60/25/50' '-95' 'h' '5' '' '5' +#S 0.1i t 0.18 white thinnest,black 0.3i not available during test diff --git a/examples/GMT_event_map.sh b/examples/GMT_event_map.sh new file mode 100755 index 0000000..1b8d90d --- /dev/null +++ b/examples/GMT_event_map.sh @@ -0,0 +1,56 @@ +# This is a gmt script for creating global or regional maps of seismic station event data +# +# +infile=$1.txt +infileoutlines=$1.txt +#infile2=gmt_inventory2020_permanent.txt +#infile3=SPAIN_noANT.txt +#infile4=NORWAY.txt +infile4=ALL.txt +#infile5=Unavailable_Permanent_Stations.txt +ps=$2.ps +cfile=cfile.cpt +gridfile=tempgrid.grd +#region=-180/180/-90/90 +#region=-10/40/34/58 +region=-10/46/33.4/70 +#region=-24/46/33.4/70 +#region=0/40/33.4/55 +#region=0/32/33.4/51 +mid=16.5 +#mid=11 +#mid=20 +#region=$3 +#mid=$4 +crange=0/100/0.5 +scale=20 +gmt makecpt -Cred,pink,green -T$crange -i2 -Z > $cfile +#gmt makecpt -Cpolar -T$crange -i2 -Z > $cfile +#gmt xyz2grd $infile -G$gridfile -R$3 -I1 +#gmt grdimage $gridfile -R$3 -JR$5/8.5i -K -C$cfile -BWseN -B5g -Ei > $ps +gmt pscoast -R$region -JR$mid/8.6i -Na/white -K -Dh -Sgrey20 -Ggrey40 -Wthinnest -B+t"" > $ps +#gmt grdimage $infile -R -J -O -K -Sc -C$cfile >> $ps +#gmt psxy $infile3 -R -J -O -K -St0.13 -Cwhite >> $ps +#gmt psxy $infile5 -R -J -O -K -St0.13 -Cwhite >> $ps +#gmt psxy $infile2 -R -J -O -K -St0.13 -Cwhite >> $ps +gmt psxy $infile4 -R -J -O -K -St0.13 -Cwhite >> $ps +gmt psxy $infileoutlines -R -J -O -K -St -Cblack -Wblack >> $ps +gmt psxy $infile -R -J -O -K -St -C$cfile >> $ps +#gmt psxy $event_file -R -J -O -K -Sa0.45 -W1p -Cblack >> $ps +#gmt psxy $event_file -R -J -O -K -Sa0.3 -Wthick,yellow -Cblack >> $ps +#gmt psxy circle2.txt -R -J -O -K -Sp0.1 -W1p >> $ps +#gmt psxy circle2.txt -R -J -O -K -Se -W1p >> $ps +#gmt psscale -O -R -J -K -Dn0.05/-0.02+w8i/0.25i+h -C$cfile -Bx$scale+l'availability [%]' >> $ps +#gmt psscale -O -R -J -K -Dn0.05/-0.02+w8i/0.25i+h -C$cfile -Bx$scale+l'variability [%]' >> $ps +gmt psscale -O -R -J -K -Dn0.05/-0.02+w8i/0.25i+h -C$cfile -Bx$scale+l'wfc availability [%]' >> $ps +#gmt psscale -O -R -J -K -Dn0.05/-0.1+w8i/0.25i+h+e -C$cfile -Bx$scale+l'depth [km]' >> $ps +gmt pslegend -R -J -O -Dn-0.05/-0.25+w2.2i/1i << EOF >> $ps +C white +F black +S 0.1i t 0.18 white thinnest,black 0.3i not available during test +EOF +gmt psconvert -A5p -P-V -Tg $ps +rm $ps +#./GMT_generic_map.sh '201105051657' 'h' 'Residual_[s]' 'residual' 'global' 'S' '-20/20/0.1' '0.075' '-180/180/-90/90' '0' 'c' '45' '' '5' +#./GMT_generic_map.sh '201105051657' 'h' 'Residual_[s]' 'residual' 'europe' 'S' '-20/20/0.1' '0.2' '-10/40/35/55' '15' 'h' '5' '' '5' +#./GMT_generic_map.sh '201105051657' 'h' 'Residual_[s]' 'residual' 'usa' 'S' '-20/20/0.1' '0.2' '-130/-60/25/50' '-95' 'h' '5' '' '5' diff --git a/examples/GMT_var_map.sh b/examples/GMT_var_map.sh new file mode 100755 index 0000000..3c7f1e4 --- /dev/null +++ b/examples/GMT_var_map.sh @@ -0,0 +1,46 @@ +# This is a gmt script for creating global or regional maps of seismic station event data +# +# +infile=$1 +#infile2=gmt_inventory2020_permanent.txt +#infile3=SPAIN_noANT.txt +#infile4=NORWAY.txt +#infile5=Unavailable_Permanent_Stations.txt +ps=$2.ps +cfile=cfile.cpt +gridfile=tempgrid.grd +#region=-180/180/-90/90 +#region=-10/40/34/58 +region=-24/46/33.4/70 +mid=11 +#region=$3 +#mid=$4 +crange=0/100/0.5 +scale=20 +gmt makecpt -Cwhite,red -T$crange -i2 -Z > $cfile +#gmt makecpt -Cpolar -T$crange -i2 -Z > $cfile +#gmt xyz2grd $infile -G$gridfile -R$3 -I1 +#gmt grdimage $gridfile -R$3 -JR$5/8.5i -K -C$cfile -BWseN -B5g -Ei > $ps +gmt pscoast -R$region -JR$mid/8.6i -K -Dh -Sgrey20 -Ggrey40 -Wthinnest -B+t"" > $ps +#gmt grdimage $infile -R -J -O -K -Sc -C$cfile >> $ps +#gmt psxy $infile3 -R -J -O -K -St0.13 -Cwhite >> $ps +#gmt psxy $infile5 -R -J -O -K -St0.13 -Cwhite >> $ps +#gmt psxy $infile2 -R -J -O -K -St0.13 -Cwhite >> $ps +#gmt psxy $infile4 -R -J -O -K -St0.13 -Cwhite >> $ps +gmt psxy $infile -R -J -O -K -St -C$cfile >> $ps +#gmt psxy $event_file -R -J -O -K -Sa0.45 -W1p -Cblack >> $ps +#gmt psxy $event_file -R -J -O -K -Sa0.3 -Wthick,yellow -Cblack >> $ps +#gmt psxy circle2.txt -R -J -O -K -Sp0.1 -W1p >> $ps +#gmt psxy circle2.txt -R -J -O -K -Se -W1p >> $ps +gmt psscale -O -R -J -Dn0.05/-0.02+w8i/0.25i+h -C$cfile -Bx$scale+l'variance of data availability [%]' >> $ps +#gmt psscale -O -R -J -K -Dn0.05/-0.1+w8i/0.25i+h+e -C$cfile -Bx$scale+l'depth [km]' >> $ps +#gmt pslegend -R -J -O -Dn-0.05/-0.25+w2.2i/1i << EOF >> $ps +#C white +#F black +#S 0.1i t 0.18 white thinnest,black 0.3i not available during test +#EOF +gmt psconvert -A5p -P-V -Tg $ps +rm $ps +#./GMT_generic_map.sh '201105051657' 'h' 'Residual_[s]' 'residual' 'global' 'S' '-20/20/0.1' '0.075' '-180/180/-90/90' '0' 'c' '45' '' '5' +#./GMT_generic_map.sh '201105051657' 'h' 'Residual_[s]' 'residual' 'europe' 'S' '-20/20/0.1' '0.2' '-10/40/35/55' '15' 'h' '5' '' '5' +#./GMT_generic_map.sh '201105051657' 'h' 'Residual_[s]' 'residual' 'usa' 'S' '-20/20/0.1' '0.2' '-130/-60/25/50' '-95' 'h' '5' '' '5' diff --git a/examples/adria_test.py b/examples/adria_test.py new file mode 100644 index 0000000..61953fa --- /dev/null +++ b/examples/adria_test.py @@ -0,0 +1,244 @@ +"""Test from the User Advisory Group to monitor Data Availability within EIDA. + +.. moduleauthor:: Florian Fuchs , Univ. Vienna, Austria +""" + +import os +import json +import argparse +import datetime +import random +import time +import requests +from obspy.clients.fdsn import Client +from obspy.clients.fdsn import RoutingClient +from obspy import UTCDateTime +from obspy import Stream + + +def wfcatalog(net, sta, cha, start, end): + params = dict() + params['network'] = net + params['station'] = sta + params['channel'] = cha + # No time can be included in these parameters because the WFCatalog + # at BGR seems to have problems with it + params['start'] = '%d-%02d-%02d' % (start.year, start.month, start.day) + params['end'] = '%d-%02d-%02d' % (end.year, end.month, end.day) + params['format'] = 'post' + params['service'] = 'wfcatalog' + r = requests.get('http://www.orfeus-eu.org/eidaws/routing/1/query', params) + if r.status_code == 200: + wfcurl = r.content.decode('utf-8').splitlines()[0] + else: + raise Exception('No routing information for WFCatalog: %s' % params) + + del params['format'] + del params['service'] + params['include'] = 'sample' + params['longestonly'] = 'false' + params['minimumlength'] = 0.0 + r = requests.get(wfcurl, params) + + if r.status_code == 200: + metrics = json.loads(r.content.decode('utf-8')) + # print(metrics) + else: + raise Exception('No metrics for %s.%s %s' % (net, sta, start)) + # print 'Retrieved metrics for', network.code, station.code + + return metrics + + +def main(): + # Default values for start and end time (last year) + sy = datetime.datetime.now().year - 1 + ey = sy + + desc = 'Script to check accessibility of data through all EIDA nodes.' + parser = argparse.ArgumentParser(description=desc) + parser.add_argument('-s', '--start', default=sy, type=int, + help='Year to start the test (default=last year).') + parser.add_argument('-e', '--end', default=ey, type=int, + help='Year to end the test (default=last year).') + parser.add_argument('--days', default=5, type=int, + help='How many days to randomly pick from the year (default=5).') + parser.add_argument('--hours', default=2, type=int, + help='How many hours to randomly pick from each day (default=2).') + parser.add_argument('--minutes', default=10, type=int, + help='Length of each individual download request in minutes (default=10).') + parser.add_argument('-t', '--timeout', default=30, type=int, + help='Number of seconds to be used as a timeout for the HTTP calls (default=30).') + parser.add_argument('-x', '--exclude', default=None, + help='List of comma-separated networks to be excluded from this test (e.g. XX,YY,ZZ).') + parser.add_argument('-a', '--authentication', default=os.path.expanduser('~/index.eidatoken'), + help='File containing the token to use during the authentication process (default=~/.eidatoken).') + + args = parser.parse_args() + + # List of networks to exclude + if args.exclude is not None: + nets2exclude = list(map(str.strip, args.exclude.split(','))) + else: + nets2exclude = list() + + # Create a client to the EIDA Routing Service + # path to personal eida token here + token = args.authentication + + eida_nodes = [ "http://eida.geo.uib.no", "GFZ", "RESIF", "INGV", "ETH", "BGR", "NIEP", "KOERI", "LMU", "NOA", "ICGC", "ODC" ] + #eida_nodes = [ "KOERI", "LMU", "NOA", "ICGC" ] + #eida_nodes = [ "LMU", "NOA", "ICGC" ] + #eida_nodes = [ "NOA", "ICGC" ] + #eida_nodes = [ "ICGC" ] + + #for node in eida_nodes: + + #try: + # rsClient = Client(base_url=node,timeout=args.timeout,eida_token=token) + #except: + # rsClient = Client(base_url=node,timeout=args.timeout) + try: + rsClient = RoutingClient("eida-routing",timeout=args.timeout,credentials={'EIDA_TOKEN': token}) + except: + rsClient = RoutingClient("eida-routing",timeout=args.timeout) + + for y in range(args.start, args.end+1): + print('Processing year %d' % y) + t0 = UTCDateTime(2023, 1, 1) + t1 = UTCDateTime(2023, 1, 31) + # Do not include restricted streams + try: + st = rsClient.get_stations(level='channel', channel='BHZ,HHZ', network='_ADARRAY',starttime=t0, endtime=t1, + includerestricted=True) + totchannels = len(st.get_contents()['channels']) + print('# %s' % st.get_contents()['channels']) + print('# %d channels found' % len(st.get_contents()['channels'])) + curchannel = 0 + for net in st: + for sta in net: + for cha in sta: + downloaded = [] + curchannel += 1 + if net.code in nets2exclude: + print('%d/%d; Network %s is blacklisted' + % (curchannel, totchannels, net.code)) + continue + # Keep track of the amount of time per request + reqstart = time.time() + data = Stream() + # Days should be restricted to the days in which the stream is open + realstart = max(t0, cha.start_date) + realend = min(t1, cha.end_date) if cha.end_date is not None else t1 + totaldays = int((realend - realstart) / (60 * 60 * 24)) + # We have less days in the epoch than samples to select + if totaldays <= args.days: + print('%d/%d; Skipped because of a short epoch; %d %s %s %s' + % (curchannel, totchannels, y, net.code, sta.code, cha.code)) + continue + days = random.sample(range(1, totaldays+1), args.days) + hours = random.sample(range(0, 24), + args.hours) # create random set of hours and days for download test + hours_with_data = 0 + days_with_metrics = 0 + # Get the inventory for the whole year to test + metadataProblem = False + try: + inventory = rsClient.get_stations(network=net.code, + station=sta.code, + channel=cha.code, + starttime=realstart, + endtime=realend, + level='response') + except Exception: + # If there are problems retrieving metadata signal it in metadataProblem + metadataProblem = True + # for day in tqdm(days) : # loop through all the random days + for day in days: # loop through all the random days + # Check WFCatalog for that day + try: + auxstart = realstart + day * (60*60*24) + auxend = realstart + (day+1) * (60*60*24) + metrics = wfcatalog(net.code, sta.code, cha.code, auxstart, auxend) + days_with_metrics += 1 + except Exception as e: + print(e) + for hour in hours: # loop through all the random hours (same for each day) + # start = UTCDateTime('%d-%03dT%02d:00:00' % (y, day, hour)) + start = realstart + day * (60*60*24) + hour * (60*60) + end = start + (args.minutes * 60) + try: + # get the data + data_temp = rsClient.get_waveforms(network=net.code, + station=sta.code, + location='*', + channel=cha.code, + starttime=start, + endtime=end) + data_temp.trim(starttime=start, endtime=end) + # Test metadata only in the case that we think it is OK + if not metadataProblem: + for tr in data_temp: + tr.remove_response(inventory=inventory) + if tr.data[0] != tr.data[0]: + metadataProblem = True + print('Error with metadata!') + break + data += data_temp + data_exists = 'yes' + hours_with_data += 1 + except Exception as e: + # print(year, channel, nodename, network, station, day, hour, e) + # print('----------------------------') + data_exists = 'no' + full_time = args.days * args.hours * args.minutes * 60 + if hours_with_data > 0: # check how much data was downloaded + locs = [] + for tr in data: + locs.append(tr.stats.location) + locs = list(set(locs)) + if len(locs) > 1: + completeness_by_loc = [[], [], []] + for loc in locs: + data_temp = data.copy().select(location=loc) + total_time_covered = 0 + for tr in data_temp: + time_covered = min(tr.stats.endtime - tr.stats.starttime, + args.minutes*60.0) + total_time_covered += time_covered + percentage_covered = total_time_covered / full_time + completeness_by_loc[0].append(loc) + completeness_by_loc[1].append(total_time_covered) + completeness_by_loc[2].append(percentage_covered) + percentage_covered = max(completeness_by_loc[2]) + total_time_covered = max(completeness_by_loc[1]) + else: + total_time_covered = 0 + for tr in data: + # Maximum of time is what we requested. If the DC sends + # more we consider only the requested time + time_covered = min(tr.stats.endtime - tr.stats.starttime, + args.minutes * 60.0) + total_time_covered += time_covered + percentage_covered = total_time_covered / full_time + else: + total_time_covered = 0.0 + percentage_covered = 0.0 + minutes = (time.time()-reqstart)/60.0 + print('%d/%d; %8.2f min; %d %s %s %s; perc received %3.1f; perc w/metrics %3.1f; %s' % + (curchannel, totchannels, minutes, y, net.code, sta.code, cha.code, + percentage_covered * 100.0, days_with_metrics*100.0/args.days, + 'ERROR' if metadataProblem else 'OK')) + downloaded.append([y, net.code, sta.code, cha.code, percentage_covered * 100, minutes, + days_with_metrics*100.0/args.days, 'ERROR' if metadataProblem else 'OK', 'eida-routing']) + with open('adria_results_2023_last.txt', 'a') as fout: + for l in downloaded: + to_write = '%d %s %s %s %f %f %f %s %s' % (l[0], l[1], l[2], l[3], l[4], l[5], l[6], l[7], l[8]) + fout.write(to_write + '\n') + except Exception as e: + print('No Stations available at node: '+node) + print(e) + + +if __name__ == '__main__': + main() diff --git a/examples/adria_test1.py b/examples/adria_test1.py new file mode 100644 index 0000000..6858bcc --- /dev/null +++ b/examples/adria_test1.py @@ -0,0 +1,258 @@ +"""Test from the User Advisory Group to monitor Data Availability within EIDA. + +.. moduleauthor:: Florian Fuchs , Univ. Vienna, Austria +""" + +import os +import json +import argparse +import datetime +import random +import time +import requests +from obspy.clients.fdsn import Client +from obspy.clients.fdsn import RoutingClient +from obspy import UTCDateTime +from obspy import Stream + + +def wfcatalog(net, sta, cha, start, end): + params = dict() + params['network'] = net + params['station'] = sta + params['channel'] = cha + # No time can be included in these parameters because the WFCatalog + # at BGR seems to have problems with it + params['start'] = '%d-%02d-%02d' % (start.year, start.month, start.day) + params['end'] = '%d-%02d-%02d' % (end.year, end.month, end.day) + params['format'] = 'post' + params['service'] = 'wfcatalog' + r = requests.get('http://www.orfeus-eu.org/eidaws/routing/1/query', params) + if r.status_code == 200: + wfcurl = r.content.decode('utf-8').splitlines()[0] + else: + raise Exception('No routing information for WFCatalog: %s' % params) + + del params['format'] + del params['service'] + params['include'] = 'sample' + params['longestonly'] = 'false' + params['minimumlength'] = 0.0 + r = requests.get(wfcurl, params) + + if r.status_code == 200: + metrics = json.loads(r.content.decode('utf-8')) + # print(metrics) + else: + raise Exception('No metrics for %s.%s %s' % (net, sta, start)) + # print 'Retrieved metrics for', network.code, station.code + + return metrics + + +def main(): + # Default values for start and end time (last year) + sy = datetime.datetime.now().year - 1 + ey = sy + + desc = 'Script to check accessibility of data through all EIDA nodes.' + parser = argparse.ArgumentParser(description=desc) + parser.add_argument('-s', '--start', default=sy, type=int, + help='Year to start the test (default=last year).') + parser.add_argument('-e', '--end', default=ey, type=int, + help='Year to end the test (default=last year).') + parser.add_argument('--days', default=5, type=int, + help='How many days to randomly pick from the year (default=5).') + parser.add_argument('--hours', default=2, type=int, + help='How many hours to randomly pick from each day (default=2).') + parser.add_argument('--minutes', default=10, type=int, + help='Length of each individual download request in minutes (default=10).') + parser.add_argument('-t', '--timeout', default=30, type=int, + help='Number of seconds to be used as a timeout for the HTTP calls (default=30).') + parser.add_argument('-x', '--exclude', default=None, + help='List of comma-separated networks to be excluded from this test (e.g. XX,YY,ZZ).') + parser.add_argument('-a', '--authentication', default=os.path.expanduser('~/.eidatoken'), + help='File containing the token to use during the authentication process (default=~/.eidatoken).') + + args = parser.parse_args() + + # List of networks to exclude + if args.exclude is not None: + nets2exclude = list(map(str.strip, args.exclude.split(','))) + else: + nets2exclude = list() + + # Create a client to the EIDA Routing Service + # path to personal eida token here + token = args.authentication + + eida_nodes = [ "http://eida.geo.uib.no", "GFZ", "RESIF", "INGV", "ETH", "BGR", "NIEP", "KOERI", "LMU", "NOA", "ICGC", "ODC" ] + #eida_nodes = [ "KOERI", "LMU", "NOA", "ICGC" ] + #eida_nodes = [ "LMU", "NOA", "ICGC" ] + #eida_nodes = [ "NOA", "ICGC" ] + #eida_nodes = [ "ICGC" ] + + try: + rsClient = RoutingClient("eida-routing",timeout=args.timeout,eida_token=token) + except: + rsClient = RoutingClient("eida-routing",timeout=args.timeout) + + for y in range(args.start, args.end+1): + print('Processing year %d' % y) + t0 = UTCDateTime(y, 1, 1) + t1 = UTCDateTime(y, 12, 31) + + # Do not include restricted streams + st = rsClient.get_stations(level='channel', channel='BHZ,HHZ', network='_ADARRAY',starttime=t0, endtime=t1, + includerestricted=False) + totchannels = len(st.get_contents()['channels']) + + print('# %s' % st.get_contents()['channels']) + print('# %d channels found' % len(st.get_contents()['channels'])) + + curchannel = 0 + for net in st: + for sta in net: + for cha in sta: + downloaded = [] + curchannel += 1 + + if net.code in nets2exclude: + print('%d/%d; Network %s is blacklisted' + % (curchannel, totchannels, net.code)) + continue + # Keep track of the amount of time per request + reqstart = time.time() + data = Stream() + + # Days should be restricted to the days in which the stream is open + realstart = max(t0, cha.start_date) + realend = min(t1, cha.end_date) if cha.end_date is not None else t1 + totaldays = int((realend - realstart) / (60 * 60 * 24)) + + # We have less days in the epoch than samples to select + if totaldays <= args.days: + print('%d/%d; Skipped because of a short epoch; %d %s %s %s' + % (curchannel, totchannels, y, net.code, sta.code, cha.code)) + continue + + days = random.sample(range(1, totaldays+1), args.days) + + hours = random.sample(range(0, 24), + args.hours) # create random set of hours and days for download test + hours_with_data = 0 + days_with_metrics = 0 + + # Get the inventory for the whole year to test + metadataProblem = False + try: + inventory = rsClient.get_stations(network=net.code, + station=sta.code, + channel=cha.code, + starttime=realstart, + endtime=realend, + level='response') + except Exception: + # If there are problems retrieving metadata signal it in metadataProblem + metadataProblem = True + + # for day in tqdm(days) : # loop through all the random days + for day in days: # loop through all the random days + # Check WFCatalog for that day + try: + auxstart = realstart + day * (60*60*24) + auxend = realstart + (day+1) * (60*60*24) + metrics = wfcatalog(net.code, sta.code, cha.code, auxstart, auxend) + days_with_metrics += 1 + except Exception as e: + print(e) + + for hour in hours: # loop through all the random hours (same for each day) + # start = UTCDateTime('%d-%03dT%02d:00:00' % (y, day, hour)) + start = realstart + day * (60*60*24) + hour * (60*60) + end = start + (args.minutes * 60) + + try: + # get the data + data_temp = rsClient.get_waveforms(network=net.code, + station=sta.code, + location='*', + channel=cha.code, + starttime=start, + endtime=end) + data_temp.trim(starttime=start, endtime=end) + + # Test metadata only in the case that we think it is OK + if not metadataProblem: + for tr in data_temp: + tr.remove_response(inventory=inventory) + if tr.data[0] != tr.data[0]: + metadataProblem = True + print('Error with metadata!') + break + + data += data_temp + + data_exists = 'yes' + hours_with_data += 1 + except Exception as e: + # print(year, channel, nodename, network, station, day, hour, e) + # print('----------------------------') + data_exists = 'no' + + full_time = args.days * args.hours * args.minutes * 60 + + if hours_with_data > 0: # check how much data was downloaded + locs = [] + for tr in data: + locs.append(tr.stats.location) + + locs = list(set(locs)) + if len(locs) > 1: + completeness_by_loc = [[], [], []] + for loc in locs: + data_temp = data.copy().select(location=loc) + total_time_covered = 0 + for tr in data_temp: + time_covered = min(tr.stats.endtime - tr.stats.starttime, + args.minutes*60.0) + total_time_covered += time_covered + + percentage_covered = total_time_covered / full_time + completeness_by_loc[0].append(loc) + completeness_by_loc[1].append(total_time_covered) + completeness_by_loc[2].append(percentage_covered) + percentage_covered = max(completeness_by_loc[2]) + total_time_covered = max(completeness_by_loc[1]) + + else: + total_time_covered = 0 + for tr in data: + # Maximum of time is what we requested. If the DC sends + # more we consider only the requested time + time_covered = min(tr.stats.endtime - tr.stats.starttime, + args.minutes * 60.0) + total_time_covered += time_covered + + percentage_covered = total_time_covered / full_time + + else: + total_time_covered = 0.0 + percentage_covered = 0.0 + + minutes = (time.time()-reqstart)/60.0 + print('%d/%d; %8.2f min; %d %s %s %s; perc received %3.1f; perc w/metrics %3.1f; %s' % + (curchannel, totchannels, minutes, y, net.code, sta.code, cha.code, + percentage_covered * 100.0, days_with_metrics*100.0/args.days, + 'ERROR' if metadataProblem else 'OK')) + downloaded.append([y, net.code, sta.code, cha.code, percentage_covered * 100, minutes, + days_with_metrics*100.0/args.days, 'ERROR' if metadataProblem else 'OK', 'eida-routing']) + + with open('adria_results3.txt', 'a') as fout: + for l in downloaded: + to_write = '%d %s %s %s %f %f %f %s %s' % (l[0], l[1], l[2], l[3], l[4], l[5], l[6], l[7], l[8]) + fout.write(to_write + '\n') + + +if __name__ == '__main__': + main() diff --git a/examples/adria_test2.py b/examples/adria_test2.py new file mode 100644 index 0000000..a078f1b --- /dev/null +++ b/examples/adria_test2.py @@ -0,0 +1,258 @@ +"""Test from the User Advisory Group to monitor Data Availability within EIDA. + +.. moduleauthor:: Florian Fuchs , Univ. Vienna, Austria +""" + +import os +import json +import argparse +import datetime +import random +import time +import requests +from obspy.clients.fdsn import Client +from obspy.clients.fdsn import RoutingClient +from obspy import UTCDateTime +from obspy import Stream + + +def wfcatalog(net, sta, cha, start, end): + params = dict() + params['network'] = net + params['station'] = sta + params['channel'] = cha + # No time can be included in these parameters because the WFCatalog + # at BGR seems to have problems with it + params['start'] = '%d-%02d-%02d' % (start.year, start.month, start.day) + params['end'] = '%d-%02d-%02d' % (end.year, end.month, end.day) + params['format'] = 'post' + params['service'] = 'wfcatalog' + r = requests.get('http://www.orfeus-eu.org/eidaws/routing/1/query', params) + if r.status_code == 200: + wfcurl = r.content.decode('utf-8').splitlines()[0] + else: + raise Exception('No routing information for WFCatalog: %s' % params) + + del params['format'] + del params['service'] + params['include'] = 'sample' + params['longestonly'] = 'false' + params['minimumlength'] = 0.0 + r = requests.get(wfcurl, params) + + if r.status_code == 200: + metrics = json.loads(r.content.decode('utf-8')) + # print(metrics) + else: + raise Exception('No metrics for %s.%s %s' % (net, sta, start)) + # print 'Retrieved metrics for', network.code, station.code + + return metrics + + +def main(): + # Default values for start and end time (last year) + sy = datetime.datetime.now().year - 1 + ey = sy + + desc = 'Script to check accessibility of data through all EIDA nodes.' + parser = argparse.ArgumentParser(description=desc) + parser.add_argument('-s', '--start', default=sy, type=int, + help='Year to start the test (default=last year).') + parser.add_argument('-e', '--end', default=ey, type=int, + help='Year to end the test (default=last year).') + parser.add_argument('--days', default=5, type=int, + help='How many days to randomly pick from the year (default=5).') + parser.add_argument('--hours', default=2, type=int, + help='How many hours to randomly pick from each day (default=2).') + parser.add_argument('--minutes', default=10, type=int, + help='Length of each individual download request in minutes (default=10).') + parser.add_argument('-t', '--timeout', default=30, type=int, + help='Number of seconds to be used as a timeout for the HTTP calls (default=30).') + parser.add_argument('-x', '--exclude', default=None, + help='List of comma-separated networks to be excluded from this test (e.g. XX,YY,ZZ).') + parser.add_argument('-a', '--authentication', default=os.path.expanduser('~/.eidatoken'), + help='File containing the token to use during the authentication process (default=~/.eidatoken).') + + args = parser.parse_args() + + # List of networks to exclude + if args.exclude is not None: + nets2exclude = list(map(str.strip, args.exclude.split(','))) + else: + nets2exclude = list() + + # Create a client to the EIDA Routing Service + # path to personal eida token here + token = args.authentication + + eida_nodes = [ "http://eida.geo.uib.no", "GFZ", "RESIF", "INGV", "ETH", "BGR", "NIEP", "KOERI", "LMU", "NOA", "ICGC", "ODC" ] + #eida_nodes = [ "KOERI", "LMU", "NOA", "ICGC" ] + #eida_nodes = [ "LMU", "NOA", "ICGC" ] + #eida_nodes = [ "NOA", "ICGC" ] + #eida_nodes = [ "ICGC" ] + + try: + rsClient = RoutingClient("eida-routing",timeout=args.timeout,eida_token=token) + except: + rsClient = RoutingClient("eida-routing",timeout=args.timeout) + + for y in range(args.start, args.end+1): + print('Processing year %d' % y) + t0 = UTCDateTime(2022, 6, 10) + t1 = UTCDateTime(2022, 7, 10) + + # Do not include restricted streams + st = rsClient.get_stations(level='channel', channel='BHZ,HHZ', network='_ADARRAY',starttime=t0, endtime=t1, + includerestricted=False) + totchannels = len(st.get_contents()['channels']) + + print('# %s' % st.get_contents()['channels']) + print('# %d channels found' % len(st.get_contents()['channels'])) + + curchannel = 0 + for net in st: + for sta in net: + for cha in sta: + downloaded = [] + curchannel += 1 + + if net.code in nets2exclude: + print('%d/%d; Network %s is blacklisted' + % (curchannel, totchannels, net.code)) + continue + # Keep track of the amount of time per request + reqstart = time.time() + data = Stream() + + # Days should be restricted to the days in which the stream is open + realstart = max(t0, cha.start_date) + realend = min(t1, cha.end_date) if cha.end_date is not None else t1 + totaldays = int((realend - realstart) / (60 * 60 * 24)) + + # We have less days in the epoch than samples to select + if totaldays <= args.days: + print('%d/%d; Skipped because of a short epoch; %d %s %s %s' + % (curchannel, totchannels, y, net.code, sta.code, cha.code)) + continue + + days = random.sample(range(1, totaldays+1), args.days) + + hours = random.sample(range(0, 24), + args.hours) # create random set of hours and days for download test + hours_with_data = 0 + days_with_metrics = 0 + + # Get the inventory for the whole year to test + metadataProblem = False + try: + inventory = rsClient.get_stations(network=net.code, + station=sta.code, + channel=cha.code, + starttime=realstart, + endtime=realend, + level='response') + except Exception: + # If there are problems retrieving metadata signal it in metadataProblem + metadataProblem = True + + # for day in tqdm(days) : # loop through all the random days + for day in days: # loop through all the random days + # Check WFCatalog for that day + try: + auxstart = realstart + day * (60*60*24) + auxend = realstart + (day+1) * (60*60*24) + metrics = wfcatalog(net.code, sta.code, cha.code, auxstart, auxend) + days_with_metrics += 1 + except Exception as e: + print(e) + + for hour in hours: # loop through all the random hours (same for each day) + # start = UTCDateTime('%d-%03dT%02d:00:00' % (y, day, hour)) + start = realstart + day * (60*60*24) + hour * (60*60) + end = start + (args.minutes * 60) + + try: + # get the data + data_temp = rsClient.get_waveforms(network=net.code, + station=sta.code, + location='*', + channel=cha.code, + starttime=start, + endtime=end) + data_temp.trim(starttime=start, endtime=end) + + # Test metadata only in the case that we think it is OK + if not metadataProblem: + for tr in data_temp: + tr.remove_response(inventory=inventory) + if tr.data[0] != tr.data[0]: + metadataProblem = True + print('Error with metadata!') + break + + data += data_temp + + data_exists = 'yes' + hours_with_data += 1 + except Exception as e: + # print(year, channel, nodename, network, station, day, hour, e) + # print('----------------------------') + data_exists = 'no' + + full_time = args.days * args.hours * args.minutes * 60 + + if hours_with_data > 0: # check how much data was downloaded + locs = [] + for tr in data: + locs.append(tr.stats.location) + + locs = list(set(locs)) + if len(locs) > 1: + completeness_by_loc = [[], [], []] + for loc in locs: + data_temp = data.copy().select(location=loc) + total_time_covered = 0 + for tr in data_temp: + time_covered = min(tr.stats.endtime - tr.stats.starttime, + args.minutes*60.0) + total_time_covered += time_covered + + percentage_covered = total_time_covered / full_time + completeness_by_loc[0].append(loc) + completeness_by_loc[1].append(total_time_covered) + completeness_by_loc[2].append(percentage_covered) + percentage_covered = max(completeness_by_loc[2]) + total_time_covered = max(completeness_by_loc[1]) + + else: + total_time_covered = 0 + for tr in data: + # Maximum of time is what we requested. If the DC sends + # more we consider only the requested time + time_covered = min(tr.stats.endtime - tr.stats.starttime, + args.minutes * 60.0) + total_time_covered += time_covered + + percentage_covered = total_time_covered / full_time + + else: + total_time_covered = 0.0 + percentage_covered = 0.0 + + minutes = (time.time()-reqstart)/60.0 + print('%d/%d; %8.2f min; %d %s %s %s; perc received %3.1f; perc w/metrics %3.1f; %s' % + (curchannel, totchannels, minutes, y, net.code, sta.code, cha.code, + percentage_covered * 100.0, days_with_metrics*100.0/args.days, + 'ERROR' if metadataProblem else 'OK')) + downloaded.append([y, net.code, sta.code, cha.code, percentage_covered * 100, minutes, + days_with_metrics*100.0/args.days, 'ERROR' if metadataProblem else 'OK', 'eida-routing']) + + with open('adria_results_last_month7.txt', 'a') as fout: + for l in downloaded: + to_write = '%d %s %s %s %f %f %f %s %s' % (l[0], l[1], l[2], l[3], l[4], l[5], l[6], l[7], l[8]) + fout.write(to_write + '\n') + + +if __name__ == '__main__': + main() diff --git a/examples/adria_test_single_nodes.py b/examples/adria_test_single_nodes.py new file mode 100644 index 0000000..6f0e883 --- /dev/null +++ b/examples/adria_test_single_nodes.py @@ -0,0 +1,244 @@ +"""Test from the User Advisory Group to monitor Data Availability within EIDA. + +.. moduleauthor:: Florian Fuchs , Univ. Vienna, Austria +""" + +import os +import json +import argparse +import datetime +import random +import time +import requests +from obspy.clients.fdsn import Client +from obspy.clients.fdsn import RoutingClient +from obspy import UTCDateTime +from obspy import Stream + + +def wfcatalog(net, sta, cha, start, end): + params = dict() + params['network'] = net + params['station'] = sta + params['channel'] = cha + # No time can be included in these parameters because the WFCatalog + # at BGR seems to have problems with it + params['start'] = '%d-%02d-%02d' % (start.year, start.month, start.day) + params['end'] = '%d-%02d-%02d' % (end.year, end.month, end.day) + params['format'] = 'post' + params['service'] = 'wfcatalog' + r = requests.get('http://www.orfeus-eu.org/eidaws/routing/1/query', params) + if r.status_code == 200: + wfcurl = r.content.decode('utf-8').splitlines()[0] + else: + raise Exception('No routing information for WFCatalog: %s' % params) + + del params['format'] + del params['service'] + params['include'] = 'sample' + params['longestonly'] = 'false' + params['minimumlength'] = 0.0 + r = requests.get(wfcurl, params) + + if r.status_code == 200: + metrics = json.loads(r.content.decode('utf-8')) + # print(metrics) + else: + raise Exception('No metrics for %s.%s %s' % (net, sta, start)) + # print 'Retrieved metrics for', network.code, station.code + + return metrics + + +def main(): + # Default values for start and end time (last year) + sy = datetime.datetime.now().year - 1 + ey = sy + + desc = 'Script to check accessibility of data through all EIDA nodes.' + parser = argparse.ArgumentParser(description=desc) + parser.add_argument('-s', '--start', default=sy, type=int, + help='Year to start the test (default=last year).') + parser.add_argument('-e', '--end', default=ey, type=int, + help='Year to end the test (default=last year).') + parser.add_argument('--days', default=5, type=int, + help='How many days to randomly pick from the year (default=5).') + parser.add_argument('--hours', default=2, type=int, + help='How many hours to randomly pick from each day (default=2).') + parser.add_argument('--minutes', default=10, type=int, + help='Length of each individual download request in minutes (default=10).') + parser.add_argument('-t', '--timeout', default=30, type=int, + help='Number of seconds to be used as a timeout for the HTTP calls (default=30).') + parser.add_argument('-x', '--exclude', default=None, + help='List of comma-separated networks to be excluded from this test (e.g. XX,YY,ZZ).') + parser.add_argument('-a', '--authentication', default=os.path.expanduser('~/index.eidatoken'), + help='File containing the token to use during the authentication process (default=~/.eidatoken).') + + args = parser.parse_args() + + # List of networks to exclude + if args.exclude is not None: + nets2exclude = list(map(str.strip, args.exclude.split(','))) + else: + nets2exclude = list() + + # Create a client to the EIDA Routing Service + # path to personal eida token here + token = args.authentication + + eida_nodes = [ "http://eida.geo.uib.no", "GFZ", "RESIF", "INGV", "ETH", "BGR", "NIEP", "KOERI", "LMU", "NOA", "ICGC", "ODC" ] + #eida_nodes = [ "KOERI", "LMU", "NOA", "ICGC" ] + #eida_nodes = [ "LMU", "NOA", "ICGC" ] + #eida_nodes = [ "NOA", "ICGC" ] + #eida_nodes = [ "ICGC" ] + + for node in eida_nodes: + + try: + rsClient = Client(base_url=node,timeout=args.timeout,eida_token=token) + except: + rsClient = Client(base_url=node,timeout=args.timeout) +# try: +# rsClient = RoutingClient("eida-routing",timeout=args.timeout,credentials={'EIDA_TOKEN': token}) +# except: +# rsClient = RoutingClient("eida-routing",timeout=args.timeout) +# + for y in range(args.start, args.end+1): + print('Processing year %d' % y) + t0 = UTCDateTime(2023, 1, 1) + t1 = UTCDateTime(2023, 1, 31) + # Do not include restricted streams + try: + st = rsClient.get_stations(level='channel', channel='BHZ,HHZ', network='_ADARRAY',starttime=t0, endtime=t1, + includerestricted=True) + totchannels = len(st.get_contents()['channels']) + print('# %s' % st.get_contents()['channels']) + print('# %d channels found' % len(st.get_contents()['channels'])) + curchannel = 0 + for net in st: + for sta in net: + for cha in sta: + downloaded = [] + curchannel += 1 + if net.code in nets2exclude: + print('%d/%d; Network %s is blacklisted' + % (curchannel, totchannels, net.code)) + continue + # Keep track of the amount of time per request + reqstart = time.time() + data = Stream() + # Days should be restricted to the days in which the stream is open + realstart = max(t0, cha.start_date) + realend = min(t1, cha.end_date) if cha.end_date is not None else t1 + totaldays = int((realend - realstart) / (60 * 60 * 24)) + # We have less days in the epoch than samples to select + if totaldays <= args.days: + print('%d/%d; Skipped because of a short epoch; %d %s %s %s' + % (curchannel, totchannels, y, net.code, sta.code, cha.code)) + continue + days = random.sample(range(1, totaldays+1), args.days) + hours = random.sample(range(0, 24), + args.hours) # create random set of hours and days for download test + hours_with_data = 0 + days_with_metrics = 0 + # Get the inventory for the whole year to test + metadataProblem = False + try: + inventory = rsClient.get_stations(network=net.code, + station=sta.code, + channel=cha.code, + starttime=realstart, + endtime=realend, + level='response') + except Exception: + # If there are problems retrieving metadata signal it in metadataProblem + metadataProblem = True + # for day in tqdm(days) : # loop through all the random days + for day in days: # loop through all the random days + # Check WFCatalog for that day + try: + auxstart = realstart + day * (60*60*24) + auxend = realstart + (day+1) * (60*60*24) + metrics = wfcatalog(net.code, sta.code, cha.code, auxstart, auxend) + days_with_metrics += 1 + except Exception as e: + print(e) + for hour in hours: # loop through all the random hours (same for each day) + # start = UTCDateTime('%d-%03dT%02d:00:00' % (y, day, hour)) + start = realstart + day * (60*60*24) + hour * (60*60) + end = start + (args.minutes * 60) + try: + # get the data + data_temp = rsClient.get_waveforms(network=net.code, + station=sta.code, + location='*', + channel=cha.code, + starttime=start, + endtime=end) + data_temp.trim(starttime=start, endtime=end) + # Test metadata only in the case that we think it is OK + if not metadataProblem: + for tr in data_temp: + tr.remove_response(inventory=inventory) + if tr.data[0] != tr.data[0]: + metadataProblem = True + print('Error with metadata!') + break + data += data_temp + data_exists = 'yes' + hours_with_data += 1 + except Exception as e: + # print(year, channel, nodename, network, station, day, hour, e) + # print('----------------------------') + data_exists = 'no' + full_time = args.days * args.hours * args.minutes * 60 + if hours_with_data > 0: # check how much data was downloaded + locs = [] + for tr in data: + locs.append(tr.stats.location) + locs = list(set(locs)) + if len(locs) > 1: + completeness_by_loc = [[], [], []] + for loc in locs: + data_temp = data.copy().select(location=loc) + total_time_covered = 0 + for tr in data_temp: + time_covered = min(tr.stats.endtime - tr.stats.starttime, + args.minutes*60.0) + total_time_covered += time_covered + percentage_covered = total_time_covered / full_time + completeness_by_loc[0].append(loc) + completeness_by_loc[1].append(total_time_covered) + completeness_by_loc[2].append(percentage_covered) + percentage_covered = max(completeness_by_loc[2]) + total_time_covered = max(completeness_by_loc[1]) + else: + total_time_covered = 0 + for tr in data: + # Maximum of time is what we requested. If the DC sends + # more we consider only the requested time + time_covered = min(tr.stats.endtime - tr.stats.starttime, + args.minutes * 60.0) + total_time_covered += time_covered + percentage_covered = total_time_covered / full_time + else: + total_time_covered = 0.0 + percentage_covered = 0.0 + minutes = (time.time()-reqstart)/60.0 + print('%d/%d; %8.2f min; %d %s %s %s; perc received %3.1f; perc w/metrics %3.1f; %s' % + (curchannel, totchannels, minutes, y, net.code, sta.code, cha.code, + percentage_covered * 100.0, days_with_metrics*100.0/args.days, + 'ERROR' if metadataProblem else 'OK')) + downloaded.append([y, net.code, sta.code, cha.code, percentage_covered * 100, minutes, + days_with_metrics*100.0/args.days, 'ERROR' if metadataProblem else 'OK', 'eida-routing']) + with open('adria_results_2023_3.txt', 'a') as fout: + for l in downloaded: + to_write = '%d %s %s %s %f %f %f %s %s' % (l[0], l[1], l[2], l[3], l[4], l[5], l[6], l[7], l[8]) + fout.write(to_write + '\n') + except Exception as e: + print('No Stations available at node: '+node) + print(e) + + +if __name__ == '__main__': + main() diff --git a/examples/adria_test_temp_nets.py b/examples/adria_test_temp_nets.py new file mode 100644 index 0000000..88c8c31 --- /dev/null +++ b/examples/adria_test_temp_nets.py @@ -0,0 +1,247 @@ +"""Test from the User Advisory Group to monitor Data Availability within EIDA. + +.. moduleauthor:: Florian Fuchs , Univ. Vienna, Austria +""" + +import os +import json +import argparse +import datetime +import random +import time +import requests +from obspy.clients.fdsn import Client +from obspy.clients.fdsn import RoutingClient +from obspy import UTCDateTime +from obspy import Stream + + +def wfcatalog(net, sta, cha, start, end): + params = dict() + params['network'] = net + params['station'] = sta + params['channel'] = cha + # No time can be included in these parameters because the WFCatalog + # at BGR seems to have problems with it + params['start'] = '%d-%02d-%02d' % (start.year, start.month, start.day) + params['end'] = '%d-%02d-%02d' % (end.year, end.month, end.day) + params['format'] = 'post' + params['service'] = 'wfcatalog' + r = requests.get('http://www.orfeus-eu.org/eidaws/routing/1/query', params) + if r.status_code == 200: + wfcurl = r.content.decode('utf-8').splitlines()[0] + else: + raise Exception('No routing information for WFCatalog: %s' % params) + + del params['format'] + del params['service'] + params['include'] = 'sample' + params['longestonly'] = 'false' + params['minimumlength'] = 0.0 + r = requests.get(wfcurl, params) + + if r.status_code == 200: + metrics = json.loads(r.content.decode('utf-8')) + # print(metrics) + else: + raise Exception('No metrics for %s.%s %s' % (net, sta, start)) + # print 'Retrieved metrics for', network.code, station.code + + return metrics + + +def main(): + # Default values for start and end time (last year) + sy = datetime.datetime.now().year - 1 + ey = sy + + desc = 'Script to check accessibility of data through all EIDA nodes.' + parser = argparse.ArgumentParser(description=desc) + parser.add_argument('-s', '--start', default=sy, type=int, + help='Year to start the test (default=last year).') + parser.add_argument('-e', '--end', default=ey, type=int, + help='Year to end the test (default=last year).') + parser.add_argument('--days', default=5, type=int, + help='How many days to randomly pick from the year (default=5).') + parser.add_argument('--hours', default=2, type=int, + help='How many hours to randomly pick from each day (default=2).') + parser.add_argument('--minutes', default=10, type=int, + help='Length of each individual download request in minutes (default=10).') + parser.add_argument('-t', '--timeout', default=30, type=int, + help='Number of seconds to be used as a timeout for the HTTP calls (default=30).') + parser.add_argument('-x', '--exclude', default=None, + help='List of comma-separated networks to be excluded from this test (e.g. XX,YY,ZZ).') + parser.add_argument('-a', '--authentication', default=os.path.expanduser('~/index.eidatoken'), + help='File containing the token to use during the authentication process (default=~/.eidatoken).') + + args = parser.parse_args() + + # List of networks to exclude + if args.exclude is not None: + nets2exclude = list(map(str.strip, args.exclude.split(','))) + else: + nets2exclude = list() + + # Create a client to the EIDA Routing Service + # path to personal eida token here + token = args.authentication + + #eida_nodes = [ "http://eida.geo.uib.no", "GFZ", "RESIF", "INGV", "ETH", "BGR", "NIEP", "KOERI", "LMU", "NOA", "ICGC", "ODC" ] + #eida_nodes = [ "KOERI", "LMU", "NOA", "ICGC" ] + #eida_nodes = [ "LMU", "NOA", "ICGC" ] + #eida_nodes = [ "NOA", "ICGC" ] + #eida_nodes = [ "ICGC" ] + temp_nets = ["1Y","2Y","4P","7B","9H","Y5","Y8","Z6","XP"] + + #for node in eida_nodes: + + #try: + # rsClient = Client(base_url=node,timeout=args.timeout,eida_token=token) + #except: + # rsClient = Client(base_url=node,timeout=args.timeout) + try: + rsClient = RoutingClient("eida-routing",timeout=args.timeout,credentials={'EIDA_TOKEN': token}) + except: + rsClient = RoutingClient("eida-routing",timeout=args.timeout) + + for y in range(args.start, args.end+1): + for netw in temp_nets: + print('Processing year %d' % y) + t0 = UTCDateTime(2023, 1, 1) + t1 = UTCDateTime(2023, 1, 31) + # Do not include restricted streams + try: + st = rsClient.get_stations(level='channel', channel='BHZ,HHZ', network=netw,starttime=t0, endtime=t1, + includerestricted=True) + totchannels = len(st.get_contents()['channels']) + print('# %s' % st.get_contents()['channels']) + print('# %d channels found' % len(st.get_contents()['channels'])) + curchannel = 0 + for net in st: + for sta in net: + for cha in sta: + downloaded = [] + curchannel += 1 + if net.code in nets2exclude: + print('%d/%d; Network %s is blacklisted' + % (curchannel, totchannels, net.code)) + continue + # Keep track of the amount of time per request + reqstart = time.time() + data = Stream() + # Days should be restricted to the days in which the stream is open + realstart = max(t0, cha.start_date) + realend = min(t1, cha.end_date) if cha.end_date is not None else t1 + totaldays = int((realend - realstart) / (60 * 60 * 24)) + # We have less days in the epoch than samples to select + if totaldays <= args.days: + print('%d/%d; Skipped because of a short epoch; %d %s %s %s' + % (curchannel, totchannels, y, net.code, sta.code, cha.code)) + continue + days = random.sample(range(1, totaldays+1), args.days) + hours = random.sample(range(0, 24), + args.hours) # create random set of hours and days for download test + hours_with_data = 0 + days_with_metrics = 0 + # Get the inventory for the whole year to test + metadataProblem = False + try: + inventory = rsClient.get_stations(network=net.code, + station=sta.code, + channel=cha.code, + starttime=realstart, + endtime=realend, + level='response') + except Exception: + # If there are problems retrieving metadata signal it in metadataProblem + metadataProblem = True + # for day in tqdm(days) : # loop through all the random days + for day in days: # loop through all the random days + # Check WFCatalog for that day + try: + auxstart = realstart + day * (60*60*24) + auxend = realstart + (day+1) * (60*60*24) + metrics = wfcatalog(net.code, sta.code, cha.code, auxstart, auxend) + days_with_metrics += 1 + except Exception as e: + print(e) + for hour in hours: # loop through all the random hours (same for each day) + # start = UTCDateTime('%d-%03dT%02d:00:00' % (y, day, hour)) + start = realstart + day * (60*60*24) + hour * (60*60) + end = start + (args.minutes * 60) + try: + # get the data + data_temp = rsClient.get_waveforms(network=net.code, + station=sta.code, + location='*', + channel=cha.code, + starttime=start, + endtime=end) + data_temp.trim(starttime=start, endtime=end) + # Test metadata only in the case that we think it is OK + if not metadataProblem: + for tr in data_temp: + tr.remove_response(inventory=inventory) + if tr.data[0] != tr.data[0]: + metadataProblem = True + print('Error with metadata!') + break + data += data_temp + data_exists = 'yes' + hours_with_data += 1 + except Exception as e: + # print(year, channel, nodename, network, station, day, hour, e) + # print('----------------------------') + data_exists = 'no' + full_time = args.days * args.hours * args.minutes * 60 + if hours_with_data > 0: # check how much data was downloaded + locs = [] + for tr in data: + locs.append(tr.stats.location) + locs = list(set(locs)) + if len(locs) > 1: + completeness_by_loc = [[], [], []] + for loc in locs: + data_temp = data.copy().select(location=loc) + total_time_covered = 0 + for tr in data_temp: + time_covered = min(tr.stats.endtime - tr.stats.starttime, + args.minutes*60.0) + total_time_covered += time_covered + percentage_covered = total_time_covered / full_time + completeness_by_loc[0].append(loc) + completeness_by_loc[1].append(total_time_covered) + completeness_by_loc[2].append(percentage_covered) + percentage_covered = max(completeness_by_loc[2]) + total_time_covered = max(completeness_by_loc[1]) + else: + total_time_covered = 0 + for tr in data: + # Maximum of time is what we requested. If the DC sends + # more we consider only the requested time + time_covered = min(tr.stats.endtime - tr.stats.starttime, + args.minutes * 60.0) + total_time_covered += time_covered + percentage_covered = total_time_covered / full_time + else: + total_time_covered = 0.0 + percentage_covered = 0.0 + minutes = (time.time()-reqstart)/60.0 + print('%d/%d; %8.2f min; %d %s %s %s; perc received %3.1f; perc w/metrics %3.1f; %s' % + (curchannel, totchannels, minutes, y, net.code, sta.code, cha.code, + percentage_covered * 100.0, days_with_metrics*100.0/args.days, + 'ERROR' if metadataProblem else 'OK')) + downloaded.append([y, net.code, sta.code, cha.code, percentage_covered * 100, minutes, + days_with_metrics*100.0/args.days, 'ERROR' if metadataProblem else 'OK', 'eida-routing']) + with open('adria_results_2023_temp_nets.txt', 'a') as fout: + for l in downloaded: + to_write = '%d %s %s %s %f %f %f %s %s' % (l[0], l[1], l[2], l[3], l[4], l[5], l[6], l[7], l[8]) + fout.write(to_write + '\n') + except Exception as e: + #print('No Stations available at node: '+node) + print(e) + time.sleep(1) + + +if __name__ == '__main__': + main() diff --git a/examples/eida_test.py b/examples/eida_test.py index 4c9f3c1..6ed9728 100644 --- a/examples/eida_test.py +++ b/examples/eida_test.py @@ -10,7 +10,7 @@ import random import time import requests -from obspy.clients.fdsn import RoutingClient +from obspy.clients.fdsn import Client from obspy import UTCDateTime from obspy import Stream @@ -84,162 +84,175 @@ def main(): # Create a client to the EIDA Routing Service # path to personal eida token here token = args.authentication - rsClient = RoutingClient("eida-routing", credentials={'EIDA_TOKEN': token}) - - for y in range(args.start, args.end+1): - print('Processing year %d' % y) - t0 = UTCDateTime(y, 1, 1) - t1 = UTCDateTime(y, 12, 31) - - # Do not include restricted streams - st = rsClient.get_stations(level='channel', channel='BHZ,HHZ', starttime=t0, endtime=t1, - includerestricted=False, timeout=args.timeout) - totchannels = len(st.get_contents()['channels']) - - print('# %s' % st.get_contents()['channels']) - print('# %d channels found' % len(st.get_contents()['channels'])) - - curchannel = 0 - for net in st: - for sta in net: - for cha in sta: - downloaded = [] - curchannel += 1 - - if net.code in nets2exclude: - print('%d/%d; Network %s is blacklisted' - % (curchannel, totchannels, net.code)) - continue - # Keep track of the amount of time per request - reqstart = time.time() - data = Stream() - - # Days should be restricted to the days in which the stream is open - realstart = max(t0, cha.start_date) - realend = min(t1, cha.end_date) if cha.end_date is not None else t1 - totaldays = int((realend - realstart) / (60 * 60 * 24)) - - # We have less days in the epoch than samples to select - if totaldays <= args.days: - print('%d/%d; Skipped because of a short epoch; %d %s %s %s' - % (curchannel, totchannels, y, net.code, sta.code, cha.code)) - continue - - days = random.sample(range(1, totaldays+1), args.days) - - hours = random.sample(range(0, 24), - args.hours) # create random set of hours and days for download test - hours_with_data = 0 - days_with_metrics = 0 - - # Get the inventory for the whole year to test - metadataProblem = False - try: - inventory = rsClient.get_stations(network=net.code, - station=sta.code, - channel=cha.code, - starttime=realstart, - endtime=realend, - level='response') - except Exception: - # If there are problems retrieving metadata signal it in metadataProblem - metadataProblem = True - - # for day in tqdm(days) : # loop through all the random days - for day in days: # loop through all the random days - # Check WFCatalog for that day - try: - auxstart = realstart + day * (60*60*24) - auxend = realstart + (day+1) * (60*60*24) - metrics = wfcatalog(net.code, sta.code, cha.code, auxstart, auxend) - days_with_metrics += 1 - except Exception as e: - print(e) - - for hour in hours: # loop through all the random hours (same for each day) - # start = UTCDateTime('%d-%03dT%02d:00:00' % (y, day, hour)) - start = realstart + day * (60*60*24) + hour * (60*60) - end = start + (args.minutes * 60) + eida_nodes = [ "http://eida.geo.uib.no", "ODC", "GFZ", "RESIF", "INGV", "ETH", "BGR", "NIEP", "KOERI", "LMU", "NOA", "ICGC" ] + #eida_nodes = [ "KOERI", "LMU", "NOA", "ICGC" ] + #eida_nodes = [ "LMU", "NOA", "ICGC" ] + #eida_nodes = [ "NOA", "ICGC" ] + #eida_nodes = [ "ICGC" ] + + for node in eida_nodes: + + try: + rsClient = Client(base_url=node,timeout=args.timeout,eida_token=token) + except: + rsClient = Client(base_url=node,timeout=args.timeout) + + for y in range(args.start, args.end+1): + print('Processing year %d' % y) + t0 = UTCDateTime(y, 1, 1) + t1 = UTCDateTime(y, 12, 31) + + # Do not include restricted streams + st = rsClient.get_stations(level='channel', channel='BHZ,HHZ', starttime=t0, endtime=t1, + includerestricted=False) + totchannels = len(st.get_contents()['channels']) + + print('# %s' % st.get_contents()['channels']) + print('# %d channels found' % len(st.get_contents()['channels'])) + + curchannel = 0 + for net in st: + for sta in net: + for cha in sta: + downloaded = [] + curchannel += 1 + + if net.code in nets2exclude: + print('%d/%d; Network %s is blacklisted' + % (curchannel, totchannels, net.code)) + continue + # Keep track of the amount of time per request + reqstart = time.time() + data = Stream() + + # Days should be restricted to the days in which the stream is open + realstart = max(t0, cha.start_date) + realend = min(t1, cha.end_date) if cha.end_date is not None else t1 + totaldays = int((realend - realstart) / (60 * 60 * 24)) + + # We have less days in the epoch than samples to select + if totaldays <= args.days: + print('%d/%d; Skipped because of a short epoch; %d %s %s %s' + % (curchannel, totchannels, y, net.code, sta.code, cha.code)) + continue + + days = random.sample(range(1, totaldays+1), args.days) + + hours = random.sample(range(0, 24), + args.hours) # create random set of hours and days for download test + hours_with_data = 0 + days_with_metrics = 0 + + # Get the inventory for the whole year to test + metadataProblem = False + try: + inventory = rsClient.get_stations(network=net.code, + station=sta.code, + channel=cha.code, + starttime=realstart, + endtime=realend, + level='response') + except Exception: + # If there are problems retrieving metadata signal it in metadataProblem + metadataProblem = True + + # for day in tqdm(days) : # loop through all the random days + for day in days: # loop through all the random days + # Check WFCatalog for that day try: - # get the data - data_temp = rsClient.get_waveforms(network=net.code, - station=sta.code, - channel=cha.code, - starttime=start, - endtime=end) - data_temp.trim(starttime=start, endtime=end) - - # Test metadata only in the case that we think it is OK - if not metadataProblem: - for tr in data_temp: - tr.remove_response(inventory=inventory) - if tr.data[0] != tr.data[0]: - metadataProblem = True - print('Error with metadata!') - break - - data += data_temp - - data_exists = 'yes' - hours_with_data += 1 + auxstart = realstart + day * (60*60*24) + auxend = realstart + (day+1) * (60*60*24) + metrics = wfcatalog(net.code, sta.code, cha.code, auxstart, auxend) + days_with_metrics += 1 except Exception as e: - # print(year, channel, nodename, network, station, day, hour, e) - # print('----------------------------') - data_exists = 'no' - - full_time = args.days * args.hours * args.minutes * 60 - - if hours_with_data > 0: # check how much data was downloaded - locs = [] - for tr in data: - locs.append(tr.stats.location) - - locs = list(set(locs)) - if len(locs) > 1: - completeness_by_loc = [[], [], []] - for loc in locs: - data_temp = data.copy().select(location=loc) + print(e) + + for hour in hours: # loop through all the random hours (same for each day) + # start = UTCDateTime('%d-%03dT%02d:00:00' % (y, day, hour)) + start = realstart + day * (60*60*24) + hour * (60*60) + end = start + (args.minutes * 60) + + try: + # get the data + data_temp = rsClient.get_waveforms(network=net.code, + station=sta.code, + location='*', + channel=cha.code, + starttime=start, + endtime=end) + data_temp.trim(starttime=start, endtime=end) + + # Test metadata only in the case that we think it is OK + if not metadataProblem: + for tr in data_temp: + tr.remove_response(inventory=inventory) + if tr.data[0] != tr.data[0]: + metadataProblem = True + print('Error with metadata!') + break + + data += data_temp + + data_exists = 'yes' + hours_with_data += 1 + except Exception as e: + # print(year, channel, nodename, network, station, day, hour, e) + # print('----------------------------') + data_exists = 'no' + + full_time = args.days * args.hours * args.minutes * 60 + + if hours_with_data > 0: # check how much data was downloaded + locs = [] + for tr in data: + locs.append(tr.stats.location) + + locs = list(set(locs)) + if len(locs) > 1: + completeness_by_loc = [[], [], []] + for loc in locs: + data_temp = data.copy().select(location=loc) + total_time_covered = 0 + for tr in data_temp: + time_covered = min(tr.stats.endtime - tr.stats.starttime, + args.minutes*60.0) + total_time_covered += time_covered + + percentage_covered = total_time_covered / full_time + completeness_by_loc[0].append(loc) + completeness_by_loc[1].append(total_time_covered) + completeness_by_loc[2].append(percentage_covered) + percentage_covered = max(completeness_by_loc[2]) + total_time_covered = max(completeness_by_loc[1]) + + else: total_time_covered = 0 - for tr in data_temp: + for tr in data: + # Maximum of time is what we requested. If the DC sends + # more we consider only the requested time time_covered = min(tr.stats.endtime - tr.stats.starttime, - args.minutes*60.0) + args.minutes * 60.0) total_time_covered += time_covered percentage_covered = total_time_covered / full_time - completeness_by_loc[0].append(loc) - completeness_by_loc[1].append(total_time_covered) - completeness_by_loc[2].append(percentage_covered) - percentage_covered = max(completeness_by_loc[2]) - total_time_covered = max(completeness_by_loc[1]) else: - total_time_covered = 0 - for tr in data: - # Maximum of time is what we requested. If the DC sends - # more we consider only the requested time - time_covered = min(tr.stats.endtime - tr.stats.starttime, - args.minutes * 60.0) - total_time_covered += time_covered - - percentage_covered = total_time_covered / full_time - - else: - total_time_covered = 0.0 - percentage_covered = 0.0 - - minutes = (time.time()-reqstart)/60.0 - print('%d/%d; %8.2f min; %d %s %s %s; perc received %3.1f; perc w/metrics %3.1f; %s' % - (curchannel, totchannels, minutes, y, net.code, sta.code, cha.code, - percentage_covered * 100.0, days_with_metrics*100.0/args.days, - 'ERROR' if metadataProblem else 'OK')) - downloaded.append([y, net.code, sta.code, cha.code, percentage_covered * 100, minutes, - days_with_metrics*100.0/args.days, 'ERROR' if metadataProblem else 'OK']) - - with open('results.txt', 'a') as fout: - for l in downloaded: - to_write = '%d %s %s %s %f %f %f %s' % (l[0], l[1], l[2], l[3], l[4], l[5], l[6], l[7]) - fout.write(to_write + '\n') + total_time_covered = 0.0 + percentage_covered = 0.0 + + minutes = (time.time()-reqstart)/60.0 + print('%d/%d; %8.2f min; %d %s %s %s; perc received %3.1f; perc w/metrics %3.1f; %s' % + (curchannel, totchannels, minutes, y, net.code, sta.code, cha.code, + percentage_covered * 100.0, days_with_metrics*100.0/args.days, + 'ERROR' if metadataProblem else 'OK')) + downloaded.append([y, net.code, sta.code, cha.code, percentage_covered * 100, minutes, + days_with_metrics*100.0/args.days, 'ERROR' if metadataProblem else 'OK', node]) + + with open('results.txt', 'a') as fout: + for l in downloaded: + to_write = '%d %s %s %s %f %f %f %s %s' % (l[0], l[1], l[2], l[3], l[4], l[5], l[6], l[7], l[8]) + fout.write(to_write + '\n') if __name__ == '__main__': diff --git a/examples/make_coordinate_list.py b/examples/make_coordinate_list.py new file mode 100644 index 0000000..0592492 --- /dev/null +++ b/examples/make_coordinate_list.py @@ -0,0 +1,43 @@ +from obspy.clients.fdsn import Client +from obspy import UTCDateTime + +def extract_station_coordinates(station_dictionary, save_path): + output = open(save_path,'w') + for network in station_dictionary: + for station in station_dictionary[network]: + output.write("%s %s %s %s\n" % ( + station_dictionary[network][station]["longitude"], + station_dictionary[network][station]["latitude"], + station_dictionary[network][station]["elevation"], + station + ) + ) + +def append_dictionary(station_dictionary, inv, service): + for network in inv: + if network.code not in station_dictionary: + station_dictionary[network.code] = {} + for station in network: + if station.code not in station_dictionary[network.code]: + station_dictionary[network.code][station.code] = { + "latitude" : station.latitude, + "longitude" : station.longitude, + "elevation" : station.elevation, + } + +#EIDA_nodes = [ "http://eida.geo.uib.no", "ODC", "GFZ", "RESIF", "INGV", "ETH", "BGR", "NIEP", "KOERI", "LMU", "NOA", "ICGC" ] +EIDA_nodes = [ "http://eida.geo.uib.no", "ODC", "GFZ", "RESIF", "INGV", "ETH", "BGR", "NIEP", "KOERI", "LMU", "NOA", "ICGC" ] +station_dictionary = {} +output_text = [] +start_year = UTCDateTime(2022,1,1) +end_year = UTCDateTime(2022,12,31) +for node in EIDA_nodes: + print(node) + inv = Client(node).get_stations( + channel = '*HZ', + starttime = start_year, + endtime = end_year, + level = 'station', + ) + append_dictionary(station_dictionary,inv, node) +extract_station_coordinates(station_dictionary, 'new_coordinates.xy') diff --git a/examples/plot_availability.py b/examples/plot_availability.py index b626e77..8d67ca6 100644 --- a/examples/plot_availability.py +++ b/examples/plot_availability.py @@ -27,7 +27,7 @@ def main(): years = set() for line in fin.readlines(): - year, net, sta, cha, percavailable, minutes, wfc, inventory = line.split(' ') + year, net, sta, cha, percavailable, minutes, wfc, inventory , node= line.split(' ') year = int(year) percavailable = float(percavailable) wfc = float(wfc) diff --git a/examples/tests2021/GMT_event_map.sh b/examples/tests2021/GMT_event_map.sh new file mode 100755 index 0000000..0882c6b --- /dev/null +++ b/examples/tests2021/GMT_event_map.sh @@ -0,0 +1,48 @@ +# This is a gmt script for creating global or regional maps of seismic station event data +# +# +infile=$1 +infile2=../gmt_inventory2020_permanent.txt +infile3=../SPAIN_noANT.txt +infile4=../NORWAY.txt +infile5=../Unavailable_Permanent_Stations.txt +ps=$2.ps +cfile=cfile.cpt +gridfile=tempgrid.grd +#region=-180/180/-90/90 +#region=-10/40/34/58 +region=-24/46/33.4/70 +mid=11 +#region=$3 +#mid=$4 +crange=0/100/0.5 +scale=20 +gmt makecpt -Cred,pink,green -T$crange -i2 -Z > $cfile +#gmt makecpt -Cwhite,red -T$crange -i2 -Z > $cfile +#gmt makecpt -Cpolar -T$crange -i2 -Z > $cfile +#gmt xyz2grd $infile -G$gridfile -R$3 -I1 +#gmt grdimage $gridfile -R$3 -JR$5/8.5i -K -C$cfile -BWseN -B5g -Ei > $ps +gmt pscoast -R$region -JR$mid/8.6i -K -Dh -Sgrey20 -Ggrey40 -Wthinnest -B+t"" > $ps +#gmt grdimage $infile -R -J -O -K -Sc -C$cfile >> $ps +gmt psxy $infile3 -R -J -O -K -St0.13 -Cwhite >> $ps +gmt psxy $infile5 -R -J -O -K -St0.13 -Cwhite >> $ps +gmt psxy $infile2 -R -J -O -K -St0.13 -Cwhite >> $ps +gmt psxy $infile4 -R -J -O -K -St0.13 -Cwhite >> $ps +gmt psxy $infile -R -J -O -K -St -C$cfile >> $ps +#gmt psxy $event_file -R -J -O -K -Sa0.45 -W1p -Cblack >> $ps +#gmt psxy $event_file -R -J -O -K -Sa0.3 -Wthick,yellow -Cblack >> $ps +#gmt psxy circle2.txt -R -J -O -K -Sp0.1 -W1p >> $ps +#gmt psxy circle2.txt -R -J -O -K -Se -W1p >> $ps +gmt psscale -O -R -J -K -Dn0.05/-0.02+w8i/0.25i+h -C$cfile -Bx$scale+l'availability [%]' >> $ps +#gmt psscale -O -R -J -Dn0.05/-0.02+w8i/0.25i+h -C$cfile -Bx$scale+l'variance of data availability [%]' >> $ps +#gmt psscale -O -R -J -K -Dn0.05/-0.1+w8i/0.25i+h+e -C$cfile -Bx$scale+l'depth [km]' >> $ps +gmt pslegend -R -J -O -Dn-0.05/-0.25+w2.2i/1i << EOF >> $ps +C white +F black +S 0.1i t 0.18 white thinnest,black 0.3i not available during test +EOF +gmt psconvert -A5p -P-V -Tg $ps +rm $ps +#./GMT_generic_map.sh '201105051657' 'h' 'Residual_[s]' 'residual' 'global' 'S' '-20/20/0.1' '0.075' '-180/180/-90/90' '0' 'c' '45' '' '5' +#./GMT_generic_map.sh '201105051657' 'h' 'Residual_[s]' 'residual' 'europe' 'S' '-20/20/0.1' '0.2' '-10/40/35/55' '15' 'h' '5' '' '5' +#./GMT_generic_map.sh '201105051657' 'h' 'Residual_[s]' 'residual' 'usa' 'S' '-20/20/0.1' '0.2' '-130/-60/25/50' '-95' 'h' '5' '' '5'