Compare commits
2904 Commits
0.1a
...
38-simplif
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e434bda993 | ||
| c0c3cbbd7b | |||
| 76d4ec290c | |||
| 63dac0fff6 | |||
| b15cfe2e1d | |||
| 29a1e4ebe6 | |||
| 50cabb0038 | |||
| 8dd5789b0c | |||
| c4aeab0d89 | |||
| ef69fc429f | |||
| c8f9c1c33a | |||
| 59f2c4b46f | |||
| 8eb958c91b | |||
| 6b7f297d7a | |||
| 70d5c2d621 | |||
| 7393201b90 | |||
| d02f74ab10 | |||
| 0a5f5f0817 | |||
| db976e5ea9 | |||
| c021ca19d7 | |||
| 356988e71d | |||
| ad62284e0e | |||
| 0fb0b0f11c | |||
| e3dd4a4e28 | |||
| 2bbb84190c | |||
| fb32d5e0c5 | |||
| f043401cc0 | |||
| eb15382b5f | |||
| 7fbc3bc5ae | |||
| 221743fe20 | |||
| 554afc5a81 | |||
| c79e886d77 | |||
| 76f2d5d972 | |||
| 2d08fd029d | |||
| 8f22d438d3 | |||
| 93b7de3baa | |||
| 05642e775b | |||
| 47205ca493 | |||
| 5c7f0b56eb | |||
| c574031931 | |||
| e1a0fde619 | |||
| 48d196df11 | |||
| 6cc9cb4a96 | |||
| 5eab686445 | |||
| b12e7937ac | |||
| 78f2dbcab2 | |||
| 8b95c7a0fe | |||
| f03ace75e7 | |||
| 9c78471d20 | |||
| 09d2fb1022 | |||
| 3cae6d3a78 | |||
| 2e85d083a3 | |||
| ba4e6cfe50 | |||
| 1f16d01648 | |||
| 3069e7d526 | |||
| a9aeb7aaa3 | |||
| b9adb182ad | |||
| a823eb2440 | |||
| 486e3dc9c3 | |||
| 8d356050d7 | |||
| 43cab3767f | |||
| a1f6c5ffca | |||
| e4e7afa996 | |||
| 0634d24814 | |||
| 43c2b97b3d | |||
|
|
8d94440e77 | ||
|
|
66b7dea706 | ||
|
|
ebf6d4806a | ||
|
|
207d0b3a6f | ||
|
|
3b3bbc29d1 | ||
| 0c3fca9299 | |||
| 2d33a60421 | |||
|
|
a8c6f4c972 | ||
|
|
0d91f9e3fe | ||
|
|
494d281d61 | ||
| 5ef427ec12 | |||
| 29cf978782 | |||
| 091449819c | |||
| cd9c139349 | |||
| 084fb10cea | |||
| dde9520879 | |||
| 7847f40a35 | |||
| 2c188432a1 | |||
| 86dc0f5436 | |||
| 83ba63a3fd | |||
| 3392100206 | |||
| 401265eb3a | |||
| dd685d5d5e | |||
| 3cd17ff364 | |||
| d879aa1a8b | |||
| 445f1da5ac | |||
| 962cf4edac | |||
| eb0dd87a9e | |||
| e9cc579cf6 | |||
| f1fd52b750 | |||
| 5449210797 | |||
| 0af948030b | |||
| 21b1be0e56 | |||
| 58eee13b07 | |||
| c57eb4f556 | |||
| 47bb8c4326 | |||
| 29ffcf2e37 | |||
| e35d5d6df9 | |||
| 79f3d40714 | |||
| 9cef22b74b | |||
| c254ee09b3 | |||
| be32f4f61d | |||
| 9036a9054e | |||
| dd02527c1d | |||
| a383101d2c | |||
|
|
7c926327dd | ||
|
|
e9d3caafd3 | ||
| 0b50a91f57 | |||
| 8725f5083c | |||
| 13e0d8b106 | |||
| a13defbe42 | |||
| 0ee239f4a6 | |||
| 131f6782af | |||
| 15cad42868 | |||
|
|
0dc5aff3fc | ||
| 7f9d240d02 | |||
|
|
7c5e16ecc6 | ||
|
|
321a871d62 | ||
|
|
a738dc57ec | ||
| ca56139922 | |||
| 81240a8ffe | |||
| d236d3d80f | |||
| 2dd48b4c62 | |||
|
|
e850e5d4fe | ||
|
|
4fd27994f6 | ||
|
|
ca140d3fe1 | ||
|
|
60db23e83c | ||
| b976ec6ab0 | |||
| 702b7f3fb1 | |||
| 320cb42390 | |||
| cc1139d2ca | |||
| aa73bb0ae8 | |||
| de11c3b611 | |||
| 92c328e3c6 | |||
| 819ea8bf00 | |||
|
|
bd9c1d0f73 | ||
| 30eb8fbbbd | |||
| 8b03aab381 | |||
|
|
5efe75f4ea | ||
|
|
7ccad4cb86 | ||
| 3af02bbbf7 | |||
| a6af015f05 | |||
|
|
b4e72eafe7 | ||
|
|
fbeab85bb3 | ||
|
|
0c43040faf | ||
| 6e40811b01 | |||
|
|
04067cac8e | ||
| 67e2ba3ad7 | |||
|
|
2ccdfb8470 | ||
|
|
f502ac0a00 | ||
|
|
978bf42a3e | ||
| 5289be55dd | |||
| 27c9bbb96a | |||
|
|
4451209907 | ||
|
|
ded46d45cc | ||
| c9bd0a147c | |||
| 07e7ef3efa | |||
| f11ffc67ff | |||
| 217fa330c1 | |||
| bfec58cc24 | |||
| 172786dc6d | |||
| a9784d33e5 | |||
| 21453159b7 | |||
| f40d22af33 | |||
| 01fea084d5 | |||
| 16f6e2d1fd | |||
| 49c747b638 | |||
| f8f4e6789c | |||
| 08c2d7556f | |||
| 7d77cb0b2f | |||
| 6f70b2c0e2 | |||
| 8f1ab87045 | |||
| 5351043493 | |||
| dccbaa357a | |||
| 37c8858096 | |||
| f93499da7d | |||
| e4cfebe989 | |||
| da360990f6 | |||
| e083e75d73 | |||
| 79192cda33 | |||
| 066db3df53 | |||
| 6d81e4a132 | |||
| f49b9054b0 | |||
| 82e2c325ae | |||
| 85ae05b580 | |||
| e64135c7a8 | |||
| b7795ca562 | |||
| 8066bd2f01 | |||
| df6a6c1c71 | |||
| 1f6a44eeef | |||
| 2bab42a0dc | |||
| c7d8569105 | |||
| 003ba76650 | |||
| 7617958a1c | |||
| 32c95757c6 | |||
| dad383b197 | |||
| 707c596672 | |||
| 075beb2db3 | |||
| 7023bc4ce4 | |||
| 9486d7aced | |||
| 1a20d7fbcb | |||
| fb6ba83cc5 | |||
| 02083e2bf8 | |||
| 7187cb337b | |||
| fa093ccac6 | |||
| 6ad187b7fa | |||
| 78eca1b222 | |||
| 492f5b96f2 | |||
| be397edf1c | |||
| fa4423f65d | |||
| 29440deb6f | |||
| aa38e2b851 | |||
| 3a1c907043 | |||
| 3354e3980e | |||
| a9135ec483 | |||
| be1e49fa57 | |||
|
|
3be78ec576 | ||
|
|
5a2aeeb70d | ||
|
|
570e47f2df | ||
|
|
4a0759ee6e | ||
|
|
8419fc9681 | ||
|
|
98e429d8fd | ||
|
|
ceb33bf59e | ||
|
|
f28ee2bb59 | ||
| 8b741c9102 | |||
|
|
0ef2afa775 | ||
|
|
dd05d46be7 | ||
| e6a326d437 | |||
| 18aa67e5ba | |||
|
|
e94129ec36 | ||
|
|
813a2c989e | ||
|
|
f21973c7b6 | ||
|
|
2ecd7b1ec5 | ||
|
|
929ddb0ab2 | ||
|
|
b4eeef55a6 | ||
| cc8d301cff | |||
| b39489b253 | |||
| 7382ca5d47 | |||
| 34ca64ee17 | |||
| 2963be5bba | |||
| c1cb0e4a37 | |||
| 15882ed27e | |||
| b21b113edd | |||
| 9764e12b19 | |||
| 8ae00529f0 | |||
| 3c3fd00654 | |||
| 2d775fa1b9 | |||
| 2687d6cdef | |||
| eaabdce47a | |||
| fe73d2e054 | |||
|
|
6caa3ee9ce | ||
|
|
bae20e7e7c | ||
|
|
bf20ad92da | ||
|
|
bca4ce1c11 | ||
| e6f4545058 | |||
| f51fdd01d5 | |||
| 6f4378e4c2 | |||
| 2963587ea1 | |||
| 06235cc092 | |||
| 61b514fae1 | |||
| dcca731890 | |||
| 508250f03f | |||
|
|
291db16e2b | ||
|
|
d9777eaa05 | ||
|
|
0e65478645 | ||
|
|
2d7b7708a1 | ||
|
|
025822c485 | ||
|
|
ed9a7c27aa | ||
|
|
bb313f0f49 | ||
| 102b7eafe3 | |||
|
|
02a0abffd9 | ||
|
|
caf76fe94b | ||
| 3ccf826f25 | |||
| fdcd35186f | |||
| 87bd46b535 | |||
| 8164710ea4 | |||
| 74c68d6a14 | |||
| 77eec8e94c | |||
| 20dc5a132a | |||
|
|
8270bd4974 | ||
|
|
777981e8c6 | ||
|
|
399bb722eb | ||
| b228467097 | |||
| 3806026438 | |||
| d0e6c2819c | |||
| 1ee3e43451 | |||
| aca0cfcabc | |||
| 98e9e786af | |||
| 6b9231abd3 | |||
| b11b5c630b | |||
|
|
dd2efe7514 | ||
|
|
49f7ba3eab | ||
|
|
d4fa0a7697 | ||
|
|
7b2973982d | ||
|
|
dce00caf25 | ||
|
|
076c498fab | ||
|
|
281e92e2a9 | ||
|
|
cd63896060 | ||
|
|
790cf803d7 | ||
|
|
ab6e74c482 | ||
|
|
d45a5ccf0d | ||
|
|
c45f52510b | ||
|
|
8a4be00ac6 | ||
|
|
242d8e3b1d | ||
|
|
531d33946f | ||
| f21e5913bb | |||
| 7be10a22b4 | |||
| 912347beda | |||
| 6d4610983d | |||
| dfc9de69de | |||
| 0995350697 | |||
| a90ef26344 | |||
| 9fd982b1ef | |||
|
|
af43d247c6 | ||
|
|
be71fc0298 | ||
|
|
bcc5055ef3 | ||
| 81c7ac2f6e | |||
| 0d07adeeae | |||
| 106c6c3939 | |||
| e8df5198ea | |||
| a8db13095e | |||
| ea07823a61 | |||
|
|
02900d8c9d | ||
|
|
545203f798 | ||
|
|
685d68fd47 | ||
|
|
15d294626f | ||
|
|
2e2924efa1 | ||
|
|
e9ee37f5f7 | ||
|
|
bae318520b | ||
|
|
eedcd2aaa5 | ||
|
|
ff4755bc79 | ||
|
|
7d2e1e7df6 | ||
|
|
56919b7d8a | ||
| d6381e80c1 | |||
| 6032018067 | |||
| a9d92e70ce | |||
| 49bcdd2680 | |||
| 9583f9d351 | |||
| 7bf3bb6835 | |||
| 9ae8e36061 | |||
| 4dfcdb41ec | |||
| 16b469ff67 | |||
|
|
f0e2fdb470 | ||
|
|
f892225229 | ||
|
|
2a22409145 | ||
|
|
45949afca6 | ||
|
|
f1690edf71 | ||
|
|
6a0c1dda9d | ||
|
|
3abeabc75c | ||
|
|
48d5406639 | ||
|
|
0964139799 | ||
|
|
6afb61b666 | ||
|
|
815a18f2f3 | ||
|
|
718172dcd1 | ||
|
|
5e6d2e7211 | ||
|
|
b01c15d755 | ||
|
|
86035d3cd6 | ||
|
|
4ab453899a | ||
|
|
6c3998285b | ||
|
|
974be21a06 | ||
|
|
dfe3f9b32a | ||
|
|
cf7fafbe62 | ||
|
|
637b821582 | ||
|
|
d0503d4261 | ||
|
|
18308a7168 | ||
|
|
f56087b68e | ||
|
|
7dbc2cb334 | ||
|
|
2d233a7099 | ||
| 739a6e89f4 | |||
| c23bbfae8a | |||
| 6546f8f196 | |||
| ce1564c2f8 | |||
| 8a187905cb | |||
| 402248f340 | |||
|
|
6936cfcfa6 | ||
|
|
96adbddeba | ||
|
|
dcd0bc40d7 | ||
| a82a1cddc8 | |||
| f22f7845cb | |||
| 26a4cc568a | |||
| a0f9561bcf | |||
|
|
b7d3568498 | ||
|
|
9929e3d441 | ||
|
|
45370e2c67 | ||
|
|
d4e2f4a070 | ||
|
|
146da1d794 | ||
| 677d3a200c | |||
| e46c0fb862 | |||
| a2af6b44f3 | |||
| 34891d3dc1 | |||
| a85b79e432 | |||
| 5f2848d584 | |||
|
|
d3fee396b2 | ||
|
|
0c4085ed76 | ||
|
|
2b9cf655ae | ||
|
|
86f6584d91 | ||
|
|
a45e817213 | ||
| 5c74160710 | |||
| e75beff883 | |||
| d9a4c40d0b | |||
|
|
b9cf219b39 | ||
|
|
7b2ae2fa8f | ||
|
|
108ba80b83 | ||
|
|
8dcea2a8c3 | ||
| e211a901ff | |||
| 393413d6fc | |||
| d5e9cd07d4 | |||
| 529939b4b8 | |||
| 7dae8e1107 | |||
| 017683806b | |||
| c898f93293 | |||
| 93bdaa8998 | |||
| e68b634f25 | |||
| cc9ae9c146 | |||
|
|
076115f7f5 | ||
|
|
d14e789e97 | ||
|
|
7bbcb489bf | ||
|
|
97458b5b42 | ||
|
|
b4316ae717 | ||
|
|
c89e47ac43 | ||
|
|
da2b1ed133 | ||
| db9a1371b1 | |||
| bf5c371459 | |||
| bfc745dd30 | |||
| 146ef7098c | |||
| 974ee12076 | |||
| 37e2e39f3a | |||
| f310afb4c6 | |||
| 6d6179bb55 | |||
| 62287df1b4 | |||
| b3524c562d | |||
| 9e75f8d4f2 | |||
| ef6e011d22 | |||
| eb07c19c2e | |||
|
|
09721c7bb9 | ||
|
|
653e7c9b9a | ||
|
|
1b815a27b8 | ||
|
|
7fe5d0f7a3 | ||
|
|
61b14dc770 | ||
|
|
153beff663 | ||
|
|
318ca25ef8 | ||
| f802f1db58 | |||
| b348117d5a | |||
| 90e26cbd8f | |||
| 12082cb2a9 | |||
| ed654024b2 | |||
| 17c27f9294 | |||
| ed7ee5d944 | |||
| 37da7327d0 | |||
| c172cfa892 | |||
| 1fc62a5e9d | |||
| cf34c9465c | |||
| dda997e457 | |||
| fbc01290d5 | |||
| 64885db214 | |||
| 5b48b744fd | |||
| 469d91bfdc | |||
| 663d244f70 | |||
| 7a0d3486a6 | |||
| 754d42c8e3 | |||
| 415af11f63 | |||
| d151cdbc6d | |||
| b22d04db47 | |||
| e210bd8793 | |||
| 0e70520a78 | |||
| ad686d42db | |||
| a9636caf73 | |||
|
|
27f5a0d50c | ||
|
|
85b34177c4 | ||
|
|
775d3de46c | ||
|
|
6d26338f2e | ||
|
|
02873938cb | ||
|
|
d84be68694 | ||
|
|
787c46eeaf | ||
|
|
da29b286f1 | ||
|
|
7734650d2e | ||
|
|
f5c1fea159 | ||
|
|
6ae5a213d1 | ||
|
|
10aa0360bc | ||
|
|
c308415aa5 | ||
|
|
2c92f6f2fd | ||
| 3b52b7a28f | |||
| 9f1672d793 | |||
| 319343499b | |||
| d360d9db92 | |||
| 9a5624c951 | |||
| 1d215c181c | |||
| 84ed0b900f | |||
| 1d571a0046 | |||
| 3bd5243f2a | |||
| 6b28b9c9c6 | |||
| 704a45f845 | |||
|
|
869ede96a9 | ||
| 6c162fc94a | |||
| 27ea20fa47 | |||
| c376364206 | |||
| c3e8b2c03d | |||
| afade77922 | |||
| 0cec2c81d3 | |||
| a0fcf03c1e | |||
| 91959367d4 | |||
|
|
82ac08157c | ||
|
|
0dc4d64826 | ||
|
|
51f2ded063 | ||
| b870b5378a | |||
| 5f6f986e3e | |||
| 8d3bd88be9 | |||
| e7284cba41 | |||
| 6ab2609e8c | |||
| 47b045ad35 | |||
| 1de1dc71f8 | |||
| f6688b3a28 | |||
| 77dd0d4733 | |||
| 3bc3d07793 | |||
| c46513a626 | |||
| b4516fb2cb | |||
| 9c119819a6 | |||
| 0474e5fbe9 | |||
| ccec76b8a1 | |||
|
|
1ff50c000e | ||
| 689192b25d | |||
|
|
71d8626fa3 | ||
| d223011f90 | |||
|
|
67cf1f9010 | ||
|
|
b1a1e8924a | ||
| 1f2dd689ba | |||
|
|
5258a7e9b4 | ||
| 871fb685a4 | |||
| 2c588c1c80 | |||
| df0f059ff3 | |||
| b0ad99eced | |||
| e05909b188 | |||
| 27e425844a | |||
| 2379dee142 | |||
|
|
4581025b4d | ||
|
|
59e67b51d5 | ||
|
|
80835bc56e | ||
|
|
b6c682315d | ||
|
|
46d4ad7ea5 | ||
|
|
854f5b8c7e | ||
| 4896c1e1d8 | |||
| e3e420a94b | |||
|
|
86419220e2 | ||
|
|
68b2917e7f | ||
|
|
d2ba8888d1 | ||
|
|
d4e279aeba | ||
| 2c07dd63b8 | |||
| 22e5de194e | |||
| 9b63c1bb24 | |||
| f4201c4e2f | |||
| 4cb3f72ba8 | |||
| 5870843a03 | |||
| 4ed8e54822 | |||
| 8ae0449c01 | |||
| 3a66ec1c95 | |||
| 19f943627a | |||
|
|
4d1c3985f4 | ||
|
|
f43478d0c0 | ||
|
|
88ddbc1efc | ||
|
|
8487d696c6 | ||
|
|
3845e7291e | ||
|
|
d4b76bdecb | ||
|
|
7d175a4bc9 | ||
|
|
b18298c4db | ||
| 77b4458ab5 | |||
| 04e75abcf5 | |||
|
|
b607da7262 | ||
| 34508fc4a3 | |||
| 1b5f58bbbd | |||
| a5667c1e06 | |||
| 2a8efd0904 | |||
| 7ad36c2305 | |||
| 910ed66676 | |||
| 08124174b1 | |||
|
|
fe1e76f53a | ||
|
|
f4750472c7 | ||
|
|
675052975a | ||
|
|
e3f7840d9e | ||
|
|
d4033eca08 | ||
|
|
5b5da2e40d | ||
|
|
7b6f64b46a | ||
|
|
335f3c4150 | ||
| 47d6aeabff | |||
|
|
0a1d15c429 | ||
|
|
accb3c5d51 | ||
|
|
075b6e26c7 | ||
| 7de8c2ee8b | |||
| ca886d4355 | |||
| ec32981787 | |||
| 7c0de44974 | |||
| 0168d8923d | |||
| 46a6cdcc00 | |||
| fe0e4be43d | |||
| 06cacdd4cb | |||
| f50e38241e | |||
| 083e5c8fe9 | |||
| 8155389b3d | |||
| 5e161d308a | |||
| 9b5fe3baba | |||
| d695c0016a | |||
| cbba41f16a | |||
| d57c193a0b | |||
| 20eb54e9c5 | |||
|
|
629bae63e2 | ||
|
|
b0749e0ddc | ||
|
|
8d931fa97a | ||
|
|
ec9bce97ee | ||
|
|
b93407012e | ||
|
|
1ffe4dcbb2 | ||
|
|
a68cb9b0b7 | ||
|
|
58191e2d8f | ||
|
|
628f335b34 | ||
|
|
c38e3eb07a | ||
|
|
7910df3cc9 | ||
|
|
2d850b70db | ||
|
|
756b5d67da | ||
|
|
82c0b7837c | ||
|
|
0230f0bf2e | ||
|
|
9b787ac4e8 | ||
|
|
02b7fae3df | ||
|
|
15722c436e | ||
|
|
b220059e5b | ||
|
|
455733ea19 | ||
| f49d323c13 | |||
| ae4c345fa7 | |||
| 65f0d23f07 | |||
| 2554f6ca7e | |||
| 8073a872c1 | |||
| ea9939a0c0 | |||
| 18926610cf | |||
| 3d1d97dd26 | |||
| b02a0e8f9a | |||
| 4c42d34adc | |||
| c90a2f6ae1 | |||
| be82706413 | |||
| 644470f156 | |||
| d6150c5d1a | |||
| 073a71e150 | |||
| d3de33a12b | |||
| e6648a3cec | |||
| 36a4f0df8a | |||
|
|
6e8ed7dad9 | ||
| 0320ad67b9 | |||
| 9b0ef55b70 | |||
| 4d3b300e17 | |||
| 56295f0c81 | |||
| a876384338 | |||
| 964aa9ce6c | |||
| af54cb0d4b | |||
| 349715d13c | |||
| 726210daeb | |||
| e72111a6fb | |||
| 5fcb07e647 | |||
| f0b6897053 | |||
|
|
0366181532 | ||
| ba37d587a6 | |||
|
|
90e6c758d8 | ||
|
|
1edc745903 | ||
| 10c26a8261 | |||
| b730b16ac6 | |||
| c655371bae | |||
| 67ee544522 | |||
| 4cf785a135 | |||
| f3627033b1 | |||
| bd086e6cd4 | |||
| a201b99c2e | |||
| 889628ceee | |||
| 366db9aef0 | |||
| 79412c392d | |||
| 8f5292b957 | |||
| 4002ccfd1a | |||
|
|
aba1a16f98 | ||
|
|
8f78b6d8c8 | ||
|
|
a44ada9938 | ||
|
|
ef8c19b747 | ||
| f9203d92e8 | |||
| 39f9238a06 | |||
| 8dabfb41d8 | |||
| 4918448d92 | |||
| 9e74ff04c2 | |||
| 39b925f475 | |||
| b076ee90fa | |||
| bff888c98a | |||
| 2e5ed974f0 | |||
| 90bc7642fd | |||
| 08b3c70497 | |||
| 69955ff439 | |||
| fa46385a52 | |||
| 144ecda61e | |||
| ff65fd2290 | |||
|
|
f56d32b661 | ||
|
|
da06115886 | ||
|
|
dc6c6445a9 | ||
|
|
1b85625643 | ||
|
|
af393d5118 | ||
| 819e4d7076 | |||
| 60a2863629 | |||
| c6cd6b2d69 | |||
| 0e057af39b | |||
| 473529961e | |||
| d2437b5014 | |||
| 97de485c99 | |||
| 98f7ff8406 | |||
| f4632ac1f5 | |||
| c520c7c212 | |||
| ec394d447d | |||
| a22e64889d | |||
| 4835c0ca8a | |||
| 975bd64266 | |||
| de8886b73b | |||
| f4839bb609 | |||
| 5b5902a329 | |||
| 1c51ed12fc | |||
| 49de0fb22e | |||
| b191bd8cf4 | |||
| 4589f92a1a | |||
| 44f63f8163 | |||
| a1ee8d408c | |||
| d6400562d6 | |||
| 0013d099f3 | |||
| 534222e241 | |||
| 796eea87a1 | |||
| bb395d2514 | |||
| 5aef50f922 | |||
| ffa30e92e9 | |||
| 23ed5ceb5c | |||
| 185cc14e38 | |||
| 80d2ff508b | |||
| c7dc1481a1 | |||
| 0ebc6e11f8 | |||
| 78d5ee58b5 | |||
| 8d6de02afe | |||
| 7ab13ebaad | |||
| a76dd06497 | |||
| 7c61c7c471 | |||
| 39e048cf2f | |||
| 440c2c7bf3 | |||
| 7be9fc28fa | |||
| a81c98c0b8 | |||
| fe81bd9719 | |||
| fde0de26f2 | |||
| acdcf74c63 | |||
| 1324bf3d7c | |||
| 00cdbb5052 | |||
| 4150e7f7d4 | |||
| 8badba4a89 | |||
| 549700bf7a | |||
| c39303042f | |||
| fb4753ca83 | |||
| 08703bf691 | |||
| 8c9fded873 | |||
| 1296e914c3 | |||
| e0e106d898 | |||
| 151900753a | |||
| aada482b19 | |||
|
|
b6fddaf208 | ||
|
|
fc3a825e73 | ||
|
|
983e4c25a3 | ||
|
|
6aacd2dd55 | ||
|
|
b2f211516a | ||
|
|
16a8170e49 | ||
|
|
8280a5043c | ||
|
|
55101c9e9e | ||
|
|
615ca54640 | ||
|
|
f01860b6f1 | ||
|
|
3f50dae2de | ||
|
|
887eeba6ec | ||
|
|
8f721da643 | ||
| deaa67bb30 | |||
| f01868bc36 | |||
| 36e68ee1ed | |||
|
|
149fe3f74d | ||
|
|
7086d43076 | ||
|
|
a5b3c5da1b | ||
|
|
fab1f53a41 | ||
| 4d37abc7d8 | |||
|
|
7d3196bf21 | ||
|
|
f1cd250cb1 | ||
|
|
da6f35d76b | ||
|
|
b10432f3bf | ||
|
|
9491a28710 | ||
|
|
3dde42e639 | ||
|
|
87b4ce1345 | ||
|
|
9a8d7da0e6 | ||
|
|
5931331b1d | ||
|
|
6f65789844 | ||
|
|
c61277f429 | ||
| 846da4cab7 | |||
| c8adc24c67 | |||
| 255eca3c05 | |||
| af5953b053 | |||
| c19f057abf | |||
| 1f2b3147fd | |||
| 43930a07cb | |||
| 2a987cbdfa | |||
| 238998e626 | |||
| b465ba2111 | |||
| 370e8a7074 | |||
| 259538f0b0 | |||
| 3096ee4573 | |||
| 92b12537eb | |||
| e9ce9635e0 | |||
| c70222972c | |||
| 8397856213 | |||
| 961be8ccbc | |||
| 7522201e06 | |||
| 69ad0bf23b | |||
| 5bb55a8181 | |||
| eab416df3f | |||
| 0949a6deac | |||
| 6acb0ad580 | |||
| 316d19ba9e | |||
| 8a2bb65581 | |||
| 330e15441e | |||
| 365657064f | |||
| a5d863bf95 | |||
|
|
6d0083040c | ||
|
|
586abea874 | ||
|
|
2ee3c9a304 | ||
|
|
2e6c33de45 | ||
|
|
864f035456 | ||
|
|
27a6af6636 | ||
|
|
62625d6941 | ||
|
|
7c528a4bfd | ||
|
|
8dc5be8e49 | ||
|
|
a7fd239574 | ||
| 6a40eef3fc | |||
| 183f9e77c0 | |||
|
|
c8affae0c2 | ||
|
|
ec8d471ce1 | ||
|
|
a96f8dcb7d | ||
|
|
c65d6b8376 | ||
|
|
ff891cacdc | ||
|
|
00df77e723 | ||
|
|
219d2d0e5a | ||
| 7496025137 | |||
| 4269256469 | |||
| f2f908f8b5 | |||
| 8381782194 | |||
| 518019322d | |||
| 4bf03ef0d9 | |||
| cc0281f9dc | |||
| 1d253b5ee5 | |||
| 0eeb07583b | |||
| 0cf46a0cc3 | |||
| 7027f9ca58 | |||
| c23fc0f303 | |||
| ed915f29df | |||
| 0418acf472 | |||
| e333ae0ece | |||
| 197164f849 | |||
| a4c697d250 | |||
| bed5c8ffcf | |||
| 330ab9b823 | |||
| b1a12bf666 | |||
| f0e4ba5ab2 | |||
| d93a571a51 | |||
| 1862b6d6e1 | |||
| 6e43e67172 | |||
| e5b0210c27 | |||
| 78ba5484c6 | |||
| f1fdd3b17b | |||
| 104a8dda64 | |||
| 7ef784f2d2 | |||
| d15828a058 | |||
| 51fe48553d | |||
| a97258513e | |||
| e310e1b6a6 | |||
| 38a071ac5b | |||
| 8717df836a | |||
| 9d540fdd9b | |||
| 91340b66e9 | |||
| cacfb37468 | |||
|
|
49adc5418f | ||
|
|
8a600e1bfa | ||
| 9c63621ba4 | |||
| bab34a23c4 | |||
| 7e39593b05 | |||
| 7ecf976401 | |||
| 7f0d3c2ab4 | |||
| bf36e5e6a5 | |||
| 88bf4c8f67 | |||
| c6105330e0 | |||
| 16997ff49b | |||
| 39b450b005 | |||
|
|
e6d5dccb74 | ||
| 9a61a7f27d | |||
| 8e59845558 | |||
| 699575f9d5 | |||
| 33bc4e060f | |||
| 9eea1e9b14 | |||
| 79cbaf3397 | |||
| eaa7a993af | |||
| ba001fb53d | |||
|
|
9e1af65af7 | ||
| f4fc067f16 | |||
| ca5167cb04 | |||
| aea58b3c11 | |||
| f21fc7bb37 | |||
| 34ae5dddd2 | |||
| e2b69d043c | |||
| 21f02bf675 | |||
| 881cc39e0e | |||
| 89dc390125 | |||
|
|
1ceb347602 | ||
|
|
bac6d6f5ec | ||
|
|
71973a5348 | ||
|
|
b232a2a194 | ||
|
|
5648fc1870 | ||
|
|
0852bf0f80 | ||
|
|
afd03da178 | ||
|
|
8ce9e40d49 | ||
|
|
19566715a7 | ||
| 8e4fa5edca | |||
| 726544bf3b | |||
| c83671f140 | |||
| 070c32e007 | |||
| 2ce609a19c | |||
| 1bbb686778 | |||
| 3cfd2371fc | |||
| 47a79c7660 | |||
| 0e650dfb75 | |||
| 9a5196c33f | |||
| 62610cd592 | |||
| c6c13f85bc | |||
| d818e6aef9 | |||
| 0f2660e20b | |||
|
|
f7cada6d09 | ||
| a5097e1da6 | |||
|
|
6722024749 | ||
|
|
dabd7f463c | ||
|
|
75d206b9b1 | ||
| ed994e987f | |||
| b185ce72b1 | |||
| b30ab69ad2 | |||
| 50e7b83812 | |||
| 2b0aa38b37 | |||
| 55a54ae154 | |||
| e9dd34eca7 | |||
| a75c16b2cd | |||
| b9bdaa391b | |||
| bdcb0ba649 | |||
|
|
f6225f8176 | ||
|
|
09374f8242 | ||
| e0e0be48c7 | |||
| a9f05d3572 | |||
|
|
2cbecfd54e | ||
|
|
6ba7fd8874 | ||
|
|
6729256087 | ||
| 8fb6a4ea19 | |||
| 9c12dde741 | |||
|
|
13f7976e53 | ||
|
|
2460d3e9d6 | ||
| 4faf007e0b | |||
| 8a024b66e0 | |||
| 53aa02669c | |||
| 4c859eae1b | |||
| 4b01c7a28b | |||
| 2b942338b0 | |||
|
|
641a3a09e9 | ||
|
|
3369fb6382 | ||
|
|
76144252ea | ||
|
|
24ded1cf2b | ||
| d067d4787e | |||
| ea7b609091 | |||
|
|
5920c64ec5 | ||
|
|
b64009e525 | ||
|
|
9f48b23d88 | ||
|
|
db628a5228 | ||
|
|
606dc6a596 | ||
| 17f94228ab | |||
| 879282657a | |||
| 8e6237a08d | |||
| ec095c572d | |||
|
|
5d076511ec | ||
| 4b6b3de547 | |||
|
|
8d36393e36 | ||
|
|
e3f758fa63 | ||
| c6fa6d8ff8 | |||
| 256f3b6838 | |||
| 2c054161c1 | |||
|
|
95a2f21675 | ||
|
|
cc25a8e6cf | ||
|
|
fe8128a61a | ||
|
|
4d8dc912ac | ||
|
|
1dacc08b26 | ||
| ff6f2ed2d9 | |||
| 92e083770e | |||
| 81f3758414 | |||
| 9bfba65aee | |||
| 8f1943b48f | |||
| 15e76e4932 | |||
|
|
43cf9c4e3d | ||
|
|
b211294b94 | ||
|
|
2e24c406ac | ||
| f6774cb592 | |||
| 90dae62922 | |||
| 3c7b9eb8ea | |||
|
|
503f72d6b0 | ||
|
|
f1d2467780 | ||
| c7e4cd0c8b | |||
| a23af62d23 | |||
| 604edea95a | |||
| c45b997aec | |||
| 67b3f4f363 | |||
| 8ce4f05a05 | |||
|
|
b542a99293 | ||
|
|
ec1f9bc3f2 | ||
|
|
66da4bd442 | ||
|
|
cb38651898 | ||
|
|
4a2d118191 | ||
| 4bb616492c | |||
| ff1ab722df | |||
| a9d06790d2 | |||
| 0f61799024 | |||
| 37373864ce | |||
|
|
fd3305c694 | ||
|
|
eb66c381cd | ||
| 9edabc6aef | |||
| 7ec2006967 | |||
|
|
9f955f4f5f | ||
| 07c16695ba | |||
| 100a39afd9 | |||
| fda9de5738 | |||
| 3cd64d09de | |||
| 0a8f6f8a39 | |||
| e0077524f4 | |||
| b585f571da | |||
| c20ea78e52 | |||
| 3c8ed2e44e | |||
|
|
f1f6082cd8 | ||
|
|
df2d5929d3 | ||
|
|
a48bb60809 | ||
|
|
537b7cb4a3 | ||
| b3b3dca41a | |||
| 2554534759 | |||
|
|
f393585831 | ||
| bd37b60dcb | |||
|
|
fe2957f76d | ||
| 039f98a811 | |||
| e6aa1ad031 | |||
|
|
571b90e5b7 | ||
|
|
e9a0be347c | ||
| fe2a2a9714 | |||
| 7846e1303a | |||
| 9b97937049 | |||
| 942b606fca | |||
|
|
b36f20ff59 | ||
|
|
526cd4303e | ||
| 874fdd730a | |||
|
|
42dcf7576b | ||
|
|
8023ba2993 | ||
|
|
55c1a38f29 | ||
|
|
7ae8f651d3 | ||
| fd2b82e978 | |||
| 4e6a6dc2a8 | |||
|
|
726c823646 | ||
|
|
071c18f649 | ||
| 460af0e094 | |||
| 2cc05329f9 | |||
| 8a80af78cf | |||
| 1ed4f73e5c | |||
|
|
a450189ba2 | ||
| fd9e4f0c05 | |||
| 5c6f1eb564 | |||
| acaf7f5172 | |||
|
|
1b16c13525 | ||
|
|
87b617b924 | ||
|
|
de5392ac33 | ||
|
|
f6ecc57d26 | ||
|
|
9662827273 | ||
| 29165aadc7 | |||
|
|
a7b02c68de | ||
|
|
9e48bb1fa4 | ||
|
|
811f52c95c | ||
|
|
ab410b790c | ||
|
|
cc2da4fc41 | ||
|
|
6891591ae9 | ||
|
|
7d5bfe8107 | ||
| 863718a3f8 | |||
| aa954dcd52 | |||
| 0692569056 | |||
| b260c23deb | |||
| 2fa9a60023 | |||
| 014152e30e | |||
| 6042b38ee9 | |||
| 4f1541ce4e | |||
| 57295c4a17 | |||
| d310cf3ff7 | |||
| 0018ae10d0 | |||
| 17a93cf62f | |||
| 60ebaa6528 | |||
| 9499688887 | |||
| 41e5c004b2 | |||
| 04bf655cf1 | |||
| 924eb8aae6 | |||
| ddb1fb8b97 | |||
| cab9061030 | |||
| 125b72a582 | |||
| 154e7b459f | |||
| 90006809a5 | |||
| e8a0a87dad | |||
| 85a01fb0f1 | |||
| 5e2dc6c9f9 | |||
| 20b31a1c5c | |||
| 4107f0249d | |||
| 482ae112e8 | |||
| dfa04f7b0a | |||
| d5645cf979 | |||
| a5a3087283 | |||
| c60c659608 | |||
| aa5d11d735 | |||
| b084490f74 | |||
|
|
8b7496a2fb | ||
| c353c24283 | |||
| 7ca6509611 | |||
| bd62115e5d | |||
|
|
290a623664 | ||
|
|
7009983925 | ||
| 17e6169cee | |||
| 06b8c8413f | |||
| 121ef4357f | |||
|
|
4244c4209b | ||
| f13542840f | |||
| f86f33b22f | |||
| 04d43f67c5 | |||
| f93713fdad | |||
| d48d29f7ec | |||
| 9c089329f3 | |||
| 389965e573 | |||
| c644095b5a | |||
| 7748a39a72 | |||
| 548c863f10 | |||
| d21afcf31a | |||
| be588252cf | |||
| 60594c97cf | |||
| 37875d5c87 | |||
| dbb3fab6d0 | |||
| 1918c11b42 | |||
| 176f13db09 | |||
| 547355fbdf | |||
| 52f9e61c9f | |||
| f41a330606 | |||
| 2633f4b9cf | |||
| 7e0f4efbcc | |||
| 7f0ab4dd94 | |||
| e5f5ab8412 | |||
| b286290797 | |||
|
|
cf5cae0ad4 | ||
| 897b915eff | |||
| 90e27f1d08 | |||
| a017c4deb4 | |||
| 3869922378 | |||
| 227112cbac | |||
| 20e86cee5a | |||
| 68f864e93a | |||
|
|
01fe32c9b2 | ||
| a560f4140b | |||
|
|
e46f9066d9 | ||
| f57aa37d99 | |||
| ac25f9cacb | |||
| 154f802f27 | |||
| 721874dbb7 | |||
| aa6f4324d0 | |||
| 818fb7a296 | |||
|
|
4b67481ffa | ||
|
|
76a99005ec | ||
|
|
351d473cbf | ||
|
|
da372b435c | ||
|
|
9ee32ee95e | ||
|
|
2a0cb9f6c8 | ||
|
|
6e2861fe24 | ||
|
|
34d5f9bf7d | ||
|
|
49092a928e | ||
| 43116ec2c6 | |||
| 1d9e52f577 | |||
| e3a4a2861d | |||
| 0e566f9748 | |||
| e0926c6b20 | |||
| d966b87eba | |||
| bd4da2cc84 | |||
| 8dcff4a467 | |||
| d0b5626c91 | |||
| fedb7c2c0d | |||
| a9334372e8 | |||
| 138aeebf2c | |||
| f7e54275c3 | |||
| 09b2dfa5d1 | |||
| dbc38385b5 | |||
| 097222a43d | |||
| 1b3c29c47e | |||
| 5bc9f14074 | |||
|
|
532a90a61f | ||
| 74393432da | |||
| 8e12bb1bc6 | |||
| 1c610d22f0 | |||
| beed46229a | |||
| 533f7ea353 | |||
| 3c0db3efa4 | |||
|
|
13666312fa | ||
|
|
92f4ae3923 | ||
| a61eebba29 | |||
|
|
9b22d0f8d6 | ||
| 3931f13fbe | |||
| 9e6b376c62 | |||
|
|
5fc83459e2 | ||
|
|
2da1d81d3d | ||
|
|
647cb1e32b | ||
|
|
1e99ae8272 | ||
| 583f39dd17 | |||
|
|
fc0934ba1d | ||
| 574704cc49 | |||
| 3ae166b147 | |||
|
|
5564fb54dc | ||
|
|
0691992850 | ||
|
|
12e383738d | ||
|
|
aff08d3a9c | ||
|
|
e7bd1c8d31 | ||
| 4f8631e829 | |||
|
|
9b7b22c305 | ||
|
|
afd7a94852 | ||
|
|
cb5f7b6946 | ||
|
|
2f7033329b | ||
|
|
d31fec8781 | ||
|
|
f52b42f009 | ||
|
|
85829b22eb | ||
|
|
b140dd4f53 | ||
| 795733cc5f | |||
| cb1fb60eec | |||
| f1f9295370 | |||
|
|
96ce713337 | ||
|
|
a3487b66ea | ||
| f1a9726f91 | |||
| 02da277f04 | |||
|
|
68ef127617 | ||
| a90e0bd78b | |||
| ab260e45f2 | |||
|
|
987f5c4d62 | ||
|
|
4e735b3672 | ||
|
|
a8bfc3c68f | ||
| 53089a3279 | |||
| 30e2e1df84 | |||
| 71da6ded2b | |||
|
|
a0633cafa4 | ||
|
|
c56a11634a | ||
|
|
bec8604904 | ||
| b0405cf213 | |||
| 42c288ad82 | |||
| c07642653d | |||
| 581a85b81f | |||
| b10b79ea79 | |||
| d08bd4cc9e | |||
| acaf592590 | |||
|
|
0f05be6a50 | ||
|
|
9746913f8b | ||
| 8e6c4d06ce | |||
| ed4c112e99 | |||
| f409861d10 | |||
| 103ae716a2 | |||
|
|
c9f0b126df | ||
| 929f58b942 | |||
| 7bb2d54f6e | |||
|
|
27597e6b4b | ||
|
|
5958e05f3b | ||
|
|
6ebad273a9 | ||
| 410fe18390 | |||
| c44f351636 | |||
| 8e60268fc5 | |||
|
|
33d81eb538 | ||
|
|
9f9d492b8b | ||
|
|
71876638c8 | ||
| 2b6297859b | |||
| ca1d3dca38 | |||
| 97ee03b443 | |||
| 8e8b3e0462 | |||
| f91e1cde6f | |||
| 203974cd83 | |||
| f6a20c4ea2 | |||
| 9dc472f907 | |||
|
|
9f164fc075 | ||
|
|
477aacbb4a | ||
|
|
cf200e1425 | ||
| 5928967e28 | |||
| 6feffaeadb | |||
| b0dcf5ff4b | |||
| d77abdc1d0 | |||
| 5214d31908 | |||
|
|
b96af41324 | ||
| c10639b49c | |||
| 43c314a1f8 | |||
|
|
9dc1545b63 | ||
|
|
51be558560 | ||
| 0a6ad8b663 | |||
| be463c2adf | |||
| 6daccad341 | |||
| d5a7e1f35f | |||
| 1b512a0864 | |||
| ab979e9b10 | |||
| 0be5c4b694 | |||
| 0ff6f78a6c | |||
| 62a7d94816 | |||
| a8544dfb93 | |||
| d293a5d9e1 | |||
| 718879fad0 | |||
| 300ff9215b | |||
|
|
16003b6353 | ||
|
|
2601ec2865 | ||
| 1b17842f63 | |||
| 0717f491aa | |||
| 0d5c0e5bd2 | |||
|
|
9aba69686d | ||
| 08b9cec674 | |||
| 053caa5cf6 | |||
| aea77cd49c | |||
| 7257d43155 | |||
| 754883c5c9 | |||
| 15799feee7 | |||
| d2d8498739 | |||
| 5412de8249 | |||
| ddedd3ed7a | |||
| a2c73f7726 | |||
|
|
01c556562e | ||
| 8e839df718 | |||
| b061c81b2c | |||
| d6dd8bfaa8 | |||
| 909e2241a7 | |||
| a07162d668 | |||
|
|
abfb8c86e7 | ||
| be8035e118 | |||
| 9e85a9df47 | |||
| 50750fc4e0 | |||
| 66c5142cb9 | |||
| 0af795969b | |||
| f7d0e49458 | |||
| 20300daecf | |||
| bdc85fa56a | |||
| 9007197786 | |||
| 4077ec207c | |||
| 86c76c6f61 | |||
| 530a629d15 | |||
| f7af1d0b1b | |||
| 6434366e55 | |||
|
|
1e03541d6d | ||
|
|
e2c1b8501e | ||
| 0fb6e5d4df | |||
| 04304d3db8 | |||
| eaa4849a20 | |||
| cf399ed747 | |||
| 7d736823b1 | |||
| cd612def81 | |||
| 62fa3ad8b1 | |||
| 02a59f46a9 | |||
| 5897113140 | |||
| eb5cf08d58 | |||
| 16c2ecb82f | |||
|
|
33e34ef194 | ||
| c540cd0f81 | |||
| 17cdffe735 | |||
|
|
d7abd3bef9 | ||
| 1ff3b845bb | |||
| 60c882fe04 | |||
| 396555b4b4 | |||
| f493359c26 | |||
| ceed165307 | |||
| a745381e8e | |||
| 395295a295 | |||
| 0f1292e9f2 | |||
| 41a870d720 | |||
| 5115705c4e | |||
| a2ca96ae57 | |||
|
|
b542f83201 | ||
| cb91911313 | |||
| b2d48cd523 | |||
| 3ad82c0c9e | |||
| 8975913143 | |||
|
|
5e593fc932 | ||
| b3a4470910 | |||
| 69b2daaab8 | |||
| 50129fc8d9 | |||
|
|
9bc6f601a1 | ||
|
|
c954614544 | ||
|
|
74b19ac094 | ||
|
|
92525732a3 | ||
|
|
3da76e9f1c | ||
|
|
36b4a2a05f | ||
|
|
4b3687fd2b | ||
| 840610cb18 | |||
| 83fd0efd83 | |||
| 22eb46999c | |||
|
|
eb0cb7d5ab | ||
|
|
cf4615a438 | ||
| ba56bfbd25 | |||
|
|
a3fbeafeac | ||
|
|
2a054f75f5 | ||
| 5a3b77dc7b | |||
| f3a96ae200 | |||
|
|
092aeb4cec | ||
|
|
4767add68f | ||
| e911262c3e | |||
| cf971d6a87 | |||
| 1143d97f36 | |||
|
|
f814ec8656 | ||
| 77153bc8e9 | |||
| a8861dfdab | |||
|
|
d9f087cb72 | ||
|
|
72f5f160c2 | ||
| 46236eeb55 | |||
| 0a911154ca | |||
| 11a7f17655 | |||
|
|
6405350dcc | ||
|
|
b979649e82 | ||
|
|
45ff145616 | ||
|
|
f4f7615bf8 | ||
| fa2b65ea3d | |||
| b97f79c31d | |||
| d81fb3e2e9 | |||
| 55bc0de036 | |||
| ba58cb548b | |||
| f43611aeda | |||
| c9d872d52b | |||
| cae5c961b0 | |||
| a2ab98c202 | |||
| 4d9c7b02cf | |||
| 77b076d560 | |||
| 12e6106227 | |||
| 184983bc87 | |||
| f58d17be14 | |||
|
|
d1354a33b1 | ||
| 6847bfe8c4 | |||
| dc656e5c57 | |||
| 862fb3240a | |||
| d96bc3c621 | |||
| 7d56e15ccf | |||
| aeaa13e277 | |||
|
|
89a70aae0b | ||
|
|
141dd3c9e6 | ||
| 29915f3669 | |||
| 3090d5fca0 | |||
| a8577ac80a | |||
| c784d46521 | |||
|
|
2ef647251e | ||
|
|
f4a76680ad | ||
| 6563b01293 | |||
|
|
2628e9d568 | ||
|
|
e9660eea9c | ||
| 50ee351995 | |||
| efe47d7a20 | |||
| 413a921e5d | |||
| fce0c98a89 | |||
| b0c80075fa | |||
|
|
e5189fd3aa | ||
|
|
94bf08df60 | ||
|
|
312932ce5e | ||
|
|
39a7ce2d89 | ||
|
|
62254e8af0 | ||
|
|
1b3fc717a6 | ||
|
|
d4dea0d356 | ||
|
|
8f92b4ec25 | ||
|
|
d1cb6fe41f | ||
| 686ca4489c | |||
| 08dfe35620 | |||
| 6b7dbe3f9a | |||
| b23228253a | |||
| 29701ea68b | |||
| bcc58e4937 | |||
| f5dcfc654d | |||
| 227faf14c2 | |||
| f935da8296 | |||
| 80577dcfc7 | |||
| fd70ef2251 | |||
| 62876dd01d | |||
| 3092b4f657 | |||
| 486aadd791 | |||
| 22ced8c07c | |||
| de38b60893 | |||
| 54222b7f11 | |||
| 50f6d7d987 | |||
| e75c34afeb | |||
| 6c214bbc77 | |||
| 488068105b | |||
| bb60093657 | |||
| 786879d4ad | |||
|
|
79163206f8 | ||
| 76d4d59ed9 | |||
| d037e0a1f2 | |||
| 2e6d39c52e | |||
| bf63348151 | |||
|
|
b3a4928a9c | ||
|
|
640ed1acda | ||
| f1e3720a0e | |||
| d370ef67c0 | |||
| 085eee7d75 | |||
|
|
2dda4d8e04 | ||
|
|
43eecfe78b | ||
|
|
95dce91ada | ||
| 0656a571cd | |||
| 50d3c5f235 | |||
| 3f7a61736a | |||
|
|
49a4cccc92 | ||
| 35705f1f1d | |||
| 8bc390fb74 | |||
| 393289245f | |||
| ef1755a80f | |||
| c90b061de9 | |||
|
|
9122d8debf | ||
|
|
6c149b7119 | ||
|
|
3f027bedf5 | ||
|
|
94c1e85484 | ||
|
|
4244047096 | ||
|
|
6269632875 | ||
|
|
3d5cce9e7a | ||
|
|
43a7da41f2 | ||
|
|
1266f08da8 | ||
|
|
4ca8b2b86c | ||
|
|
4ae19675f1 | ||
|
|
b233d80cb4 | ||
|
|
fa7a0e9c10 | ||
|
|
f51761146b | ||
|
|
4b6eac5e52 | ||
|
|
2dd815fb2b | ||
|
|
fe7bae50e6 | ||
|
|
af7b0e1887 | ||
|
|
b235733d2b | ||
|
|
ea4cc6a1a3 | ||
|
|
fced74473f | ||
|
|
842de86544 | ||
|
|
39748ca7c2 | ||
|
|
fcfa2e9edc | ||
|
|
ce341dc6e0 | ||
|
|
15fd175813 | ||
|
|
92a1c77f9c | ||
|
|
a01b6f6db5 | ||
|
|
6d5e9fdfcd | ||
|
|
380c96e5a5 | ||
|
|
fcd977c9bc | ||
|
|
181a87facb | ||
|
|
f6bf551187 | ||
|
|
368994a28f | ||
|
|
e2ec6b3574 | ||
|
|
305122d02b | ||
|
|
55c5291121 | ||
|
|
47b41a1296 | ||
|
|
a95120ba5e | ||
|
|
2fc1c7031d | ||
|
|
c74205c46f | ||
|
|
f0c1ec14f2 | ||
|
|
d57cfa0085 | ||
|
|
b5d081841b | ||
|
|
2c3ad881f1 | ||
|
|
5a87d0d3b3 | ||
|
|
749e42b778 | ||
|
|
bb48946fe2 | ||
|
|
4435d8d855 | ||
|
|
3bb7156e65 | ||
|
|
cf1ed748d2 | ||
|
|
008d730609 | ||
|
|
44d2acf331 | ||
|
|
7b22eb1620 | ||
|
|
4c82f29b1a | ||
|
|
8bb5d9dd2c | ||
|
|
7671b76f2f | ||
|
|
11a3839cff | ||
|
|
8ffa37eea6 | ||
|
|
b4c463b16f | ||
|
|
1b92d88403 | ||
|
|
6ff8069fe0 | ||
|
|
919f4dd2d6 | ||
|
|
21e068ec24 | ||
|
|
fab785d164 | ||
|
|
5d35fb419d | ||
|
|
049b2b6991 | ||
|
|
f1f54bf7b5 | ||
|
|
ef2db012be | ||
|
|
2b926c4466 | ||
|
|
01d90b715b | ||
|
|
a9e70adbcd | ||
|
|
8dbb19380f | ||
|
|
653ab1ad4d | ||
|
|
7559f45b5b | ||
|
|
f959e5f9f3 | ||
|
|
58bdf3b147 | ||
|
|
e306a60b27 | ||
|
|
3949c6b3f1 | ||
|
|
2d8bb0b700 | ||
|
|
a9c9e45942 | ||
|
|
75d2d79ee5 | ||
|
|
0a54e627eb | ||
|
|
17e9f8b5fe | ||
|
|
2954e5acea | ||
|
|
af555ab1ee | ||
|
|
200695e7ca | ||
|
|
a3d3c02773 | ||
|
|
41ca6114b1 | ||
|
|
86819f6b4a | ||
|
|
c502f26c88 | ||
|
|
52e481abc5 | ||
|
|
b69387e49f | ||
|
|
c2c2047dcf | ||
|
|
236a1a43f8 | ||
|
|
61e4aa98c6 | ||
|
|
d7418d2b30 | ||
|
|
0318fe7c32 | ||
|
|
9e5b3f6916 | ||
|
|
41eebfbcda | ||
|
|
42268cd3e9 | ||
|
|
bcde390d42 | ||
|
|
c055b52325 | ||
|
|
877bd69b59 | ||
|
|
064c9fb919 | ||
|
|
4beae3bb2b | ||
|
|
b11a03af58 | ||
|
|
0ce8b7afb3 | ||
|
|
d578b0f0dc | ||
|
|
18d2654029 | ||
|
|
cb0b8c5735 | ||
|
|
8e54594260 | ||
| d668a483fc | |||
| f5c06cd6b7 | |||
| b8840dff13 | |||
| 91c181ef2d | |||
| ae0cc5e160 | |||
| 45184fd888 | |||
| 75a8397b21 | |||
| 96124537cd | |||
| ad909804d1 | |||
| 04da34deec | |||
| 2e840cdfeb | |||
| dfefd8af87 | |||
| 34c1e80e78 | |||
| 900c7af931 | |||
| 010963dcd1 | |||
| d68a1bcf0e | |||
| 019a3ae0f3 | |||
| d093349b50 | |||
| be2bacf5e8 | |||
| 5f92d1f0db | |||
| 231e7dafa9 | |||
| 4e520df145 | |||
| ae967b3429 | |||
| c1bddd5c0b | |||
| 72d15e1fc5 | |||
| 699ba6f122 | |||
| cf514ae024 | |||
| 28a5cedbc6 | |||
| 405402ffdc | |||
| d4481e4acd | |||
| c52277e4a2 | |||
| 9288a169a4 | |||
| dc38bd6e79 | |||
| eaa3c2e75d | |||
| 51f4082e04 | |||
| 0dffe37d3b | |||
| bfa7ffc960 | |||
| 65740e6cff | |||
|
|
d0a46eb2bb | ||
|
|
dc677062f4 | ||
|
|
18f8fc25a8 | ||
| 04ec43c699 | |||
| 8307974edf | |||
| bcb3eca8b2 | |||
| f35559e7c0 | |||
|
|
180cd25b51 | ||
| 80e0ca99d7 | |||
| a215ba35b1 | |||
| ca7ce5f13c | |||
| 777941b669 | |||
|
|
db3347b17c | ||
|
|
a95a33abc9 | ||
|
|
e4c1912896 | ||
|
|
ee2f462c92 | ||
| a54ffe01f8 | |||
| 21042bc071 | |||
|
|
6a2bbe3f91 | ||
|
|
f46c618748 | ||
| df002ce9ac | |||
| 7e76bf7577 | |||
| 4a6b653a72 | |||
| c73435dec3 | |||
|
|
b3edeca81d | ||
|
|
c60689c8ad | ||
|
|
aacfbf3bbb | ||
|
|
93f9070396 | ||
| 84739ed8ab | |||
| 420f382051 | |||
| f34262d931 | |||
| ce4ac4fd04 | |||
| fa19ae9b9c | |||
| 8ee515e79f | |||
| 5155efc710 | |||
| 8d37e9299c | |||
| 17585f9381 | |||
| c8d8525c11 | |||
| 1e4b1d691a | |||
| 4233af55c6 | |||
| fa42134a00 | |||
|
|
d099e4b466 | ||
| d7680f8ae3 | |||
| 15700b074d | |||
| 8a5fcf05bf | |||
| 7c5b8cb646 | |||
| 8866d54428 | |||
| 94236190ba | |||
| 3d41e0abcd | |||
| 6e6b3570a8 | |||
| a2ddd04b2f | |||
| cbbe019475 | |||
| 7d5b8db232 | |||
| fd8abd18b5 | |||
| 49b07163ad | |||
| d953609419 | |||
| 9632ecf41f | |||
| f6d05dd2cc | |||
| 12641f8d52 | |||
| e1e3d54f8e | |||
| e6b788d423 | |||
| 76a856aa11 | |||
| 9f13f8db49 | |||
| d98ecea18a | |||
| 81640d30f9 | |||
| facffa1bf2 | |||
| f1d806c154 | |||
| a8e56dba8b | |||
| bcff0b74fe | |||
| 280e954cac | |||
| a4c2666584 | |||
| ad91504211 | |||
| 060bc1d0c8 | |||
| eb1d7c07a0 | |||
| 30ccd331d4 | |||
| b29c7068e3 | |||
| e53dd99d75 | |||
| 135ac0ef80 | |||
| e51704f2b7 | |||
| 9c3770ea9f | |||
| 74d31afa3d | |||
| f428a72e86 | |||
| c500f1b8bb | |||
| f9d40439a9 | |||
| 71f59b3c64 | |||
|
|
08749840ba | ||
| 5228657a60 | |||
| 7921d12c80 | |||
| 49727b25df | |||
|
|
36e7bc1bb2 | ||
| a6ce93cd9f | |||
| c72ed1e169 | |||
| 7b9d1f172a | |||
|
|
dd6bce89fb | ||
|
|
14c22d73b7 | ||
| 94782f6758 | |||
| f8623fc454 | |||
|
|
37ed561f73 | ||
| 28d2464aee | |||
|
|
a4c7e61e1a | ||
|
|
7c8a437dd8 | ||
| 9f15376fd8 | |||
| 9d51339268 | |||
|
|
f4bdb38e16 | ||
|
|
b72e16aaed | ||
|
|
87f87ffb95 | ||
| 4c42e9ceb5 | |||
| 30049baf94 | |||
| 3efb237452 | |||
| 471cfe755b | |||
| c13bdd2cf2 | |||
| a8522d0fae | |||
|
|
2a798a554b | ||
|
|
10fbfe5554 | ||
|
|
19ced8b8c5 | ||
| 638f552d6d | |||
| adfe9cc027 | |||
| 8bd9f7debc | |||
| 987ee597fd | |||
| 48c0dbacfb | |||
| 3273709b54 | |||
| 05cc8e52b9 | |||
| c7f7d9785b | |||
| fb8d888845 | |||
| 8ee075c2b1 | |||
|
|
1ed83d786d | ||
| 8433767b22 | |||
|
|
d4fd93ed8f | ||
|
|
c7d8d0ecf5 | ||
| 6ad78acc85 | |||
| 63ff8e48c5 | |||
|
|
6fd1f9e2cc | ||
|
|
38d225fbcf | ||
| fd569823f8 | |||
| 288bbe13d7 | |||
| 5890e905fc | |||
| e3100562da | |||
| 8cef8ff2db | |||
| 39184ef150 | |||
| ed85d0ef12 | |||
| 546dfad722 | |||
| c47bf7911a | |||
| ef613e48a4 | |||
| 08fc5d554b | |||
| 950696053c | |||
|
|
7eded42142 | ||
| 55a589b525 | |||
| 5293bb6ec7 | |||
| 0be69de6f7 | |||
| 5c7123af66 | |||
| e8cbc2f377 | |||
|
|
4f47f9f343 | ||
|
|
a8b7eff561 | ||
| 9e3f3b29d2 | |||
| 8714616d1b | |||
| 253e9f4b1e | |||
| a813eb462f | |||
| 4591b7b1d9 | |||
| 4bbb40c8b7 | |||
| 3bec20bd45 | |||
| 30d911b5cc | |||
| 47bd7384f8 | |||
| 0abbb79e64 | |||
| 806b974011 | |||
| 043f60dc2a | |||
| 952a2ea535 | |||
| 8393f283c7 | |||
| f01187615b | |||
| 579461f7b4 | |||
| 9f71bf8082 | |||
| b3acef0bcd | |||
| c3d134e6ca | |||
| 1ec468a586 | |||
| 3583f70e2b | |||
| e554330154 | |||
| 3c4cbff9f3 | |||
| 78ebb1f8db | |||
| 073ed658b3 | |||
| 4093dd0ce7 | |||
| 410b3c2f55 | |||
| d02bb369ec | |||
| 69b5b410f0 | |||
| 3cee0e6df9 | |||
| 79f0982558 | |||
| 3568a8a59a | |||
| a3deb2a9d3 | |||
| 467f0ae79b | |||
| 280f8544e4 | |||
| be326cba7b | |||
| 14cd175297 | |||
| b5d94eed61 | |||
| b96366e321 | |||
| e6d8701411 | |||
| 8e09fd7c42 | |||
| 661b4d11c0 | |||
| f3769846ba | |||
| 7e33502824 | |||
| dd668b90d6 | |||
| 536019259e | |||
| de89fc83ce | |||
| 2395c12b26 | |||
| a255718f59 | |||
| 9c8c5bb842 | |||
| 02117399b5 | |||
| 9996033ca5 | |||
| 0d7ee9d779 | |||
| 62b1a4e670 | |||
| 73c49d8291 | |||
| 7965239a92 | |||
| 724032b3f6 | |||
| e341994825 | |||
| 0520df5963 | |||
| ae2fc73d89 | |||
| 51aa949b56 | |||
| 36b0aea86c | |||
| 618dd10c23 | |||
| a1d29a45cb | |||
| 163a501ae9 | |||
| 53614bb5b9 | |||
| 0dd69a0e19 | |||
| ecf4a7ced7 | |||
| 5057664b1d | |||
| e46e8cb71b | |||
| f8db6b1d9f | |||
| 8ca87bc777 | |||
| a6eaac6c33 | |||
|
|
d49c90026d | ||
|
|
4962561d6c | ||
| 46ccd44e16 | |||
| d9844fff17 | |||
| 42cbfeb787 | |||
| 25ca11f572 | |||
| 093f750aa1 | |||
| 41b7ca6968 | |||
| 3cc77f4868 | |||
| 73d71a61d5 | |||
| 1f47f3dd85 | |||
| 392a556ac4 | |||
| 08df7c3304 | |||
| 54b557930f | |||
|
|
9b7db91037 | ||
| db17cb4f8d | |||
| 4edd5f8e52 | |||
| 5f740783f0 | |||
| 3138bbfa93 | |||
| 7c5aff0a27 | |||
| 731acc7117 | |||
|
|
521de9ee89 | ||
| dc5d76efb8 | |||
| eb5f028a47 | |||
| c315b917b8 | |||
| e62ff9d68c | |||
| dbaead4754 | |||
| 30e8f0c96a | |||
| ca77b06293 | |||
|
|
c84632fb27 | ||
| 4a836fd1f7 | |||
| 019b801603 | |||
| f09af16120 | |||
| a2b0854345 | |||
| 79e429db8d | |||
|
|
2bb2ddbc7b | ||
|
|
1cb86d7b47 | ||
| 8a79addb4e | |||
| 67c11558f3 | |||
| 46c152b7a1 | |||
| f7e1247060 | |||
|
|
c34fbe1228 | ||
|
|
97ca69a07d | ||
|
|
366ac29481 | ||
| f8807a7ea6 | |||
| 63ac0107d0 | |||
| c7d7acd7e3 | |||
| 3705eb567b | |||
| 4480854ee5 | |||
| d8a764db31 | |||
| f58c5a5f9d | |||
| fd27a43110 | |||
| 41991c5d81 | |||
| a82c1d39c6 | |||
| ecb3670aeb | |||
| 210d39882d | |||
| ae0c08eeb2 | |||
| 8cb4f11bf8 | |||
| ec42e1bd15 | |||
| dbe47690eb | |||
| ddb1ad4a15 | |||
|
|
f906211064 | ||
| edd8920d54 | |||
| 72fa9e8feb | |||
| 28fc226750 | |||
| df44979337 | |||
| 37f9292c39 | |||
| c489fad6ba | |||
| 416f4c7aa7 | |||
| 6181829ef6 | |||
| 4a9c02e1d1 | |||
| 9359338e81 | |||
| 9519372247 | |||
| 2139674afa | |||
| a9cd53886b | |||
| 2a8729c39b | |||
| f15e27e81d | |||
| b5345bb5d3 | |||
| 27e334609c | |||
| 5f9a9242d1 | |||
| a475b366d4 | |||
| 5fcaddb028 | |||
| 1fecec1696 | |||
| bd2bad7367 | |||
| 76788c0223 | |||
| 7a712ca37c | |||
| d7cfd0d176 | |||
| a2640e3126 | |||
| 320b7b7219 | |||
| 2d66248cf9 | |||
| 4409a9c3ce | |||
| fef1a95391 | |||
| 7b22bce2b0 | |||
| 14048d6784 | |||
| f075970f5e | |||
| e164b1f168 | |||
| 040c21dc13 | |||
| 4c5b58dbf1 | |||
| cee48146d0 | |||
| a1c79b554a | |||
| 65df2c7dde | |||
| c1c2aa4b7c | |||
| 06576586c6 | |||
| 722e21f582 | |||
| 31d56cb287 | |||
| 438b2706b7 | |||
| cad6ed2274 | |||
| 7225da87db | |||
| fa6626d62a | |||
| d954c3bbe8 | |||
| b8d680f54f | |||
| 15080f1699 | |||
| a5fe838514 | |||
| f3467221cc | |||
| 2de79eac77 | |||
| c651b5ca78 | |||
| db4dd47daa | |||
| e6f404a219 | |||
| 9f7f00314a | |||
| e6b5848f36 | |||
| 78a5a5117a | |||
| 4606f84809 | |||
| 18785edf68 | |||
| 6f26ab07b7 | |||
| c2168dbef3 | |||
| 6108519acb | |||
| 848d11270b | |||
| 827a0da210 | |||
| c14650d33c | |||
| c09a3271f9 | |||
| 8c7a2af2db | |||
| 5e26519d66 | |||
| ddc682de95 | |||
| 96ea0d7ac3 | |||
| e7b454bae8 | |||
| 3ee221b8eb | |||
| f2cad2e151 | |||
| d5e16d64da | |||
| 2956f3b733 | |||
| e7a5e388f6 | |||
| 303a5f9cf0 | |||
| ada9f4e780 | |||
|
|
0d0b43103b | ||
|
|
8f6f6cf8b6 | ||
|
|
8893a8ec6b | ||
| 5170a0b1c6 | |||
| 70f2761003 | |||
| 3cbb6138e0 | |||
| f01c6109a8 | |||
|
|
ce705888f1 | ||
|
|
7edee1266a | ||
|
|
acd9e942f9 | ||
|
|
3c1be950b9 | ||
|
|
3b4e1dcd1e | ||
|
|
5f0e59d95a | ||
|
|
f6930618f2 | ||
|
|
0b1f16866b | ||
|
|
f29d285910 | ||
|
|
534718aadf | ||
|
|
d2b39ff078 | ||
| 44f19f02d8 | |||
| 537b18774a | |||
|
|
2bb99a6f2e | ||
|
|
17c3dd4f69 | ||
|
|
29c14fb512 | ||
|
|
943432dfb3 | ||
|
|
a866bf5228 | ||
|
|
490ad0f0c2 | ||
|
|
ee16cef901 | ||
|
|
c9a75ca2d0 | ||
|
|
feab50af28 | ||
|
|
cb3f9804f9 | ||
|
|
cdf924e8c2 | ||
|
|
5083c5a876 | ||
|
|
1a9f68f741 | ||
|
|
d5b277db99 | ||
|
|
0d18e35f6a | ||
|
|
1312d06ccf | ||
|
|
0c7c5645b6 | ||
|
|
28276d1f8c | ||
|
|
686002567c | ||
|
|
74794061f6 | ||
|
|
7c490d5e1f | ||
|
|
5f8018a8dc | ||
| 79829706be | |||
| 0d8324a4ae | |||
| 2b90c73f9f | |||
|
|
67e37fe530 | ||
|
|
d6ae82e070 | ||
|
|
77ad274f8f | ||
|
|
df5f0f41b4 | ||
|
|
69d3f43db9 | ||
| 1a5eed5559 | |||
| f3ba22b235 | |||
|
|
c227b6499e | ||
|
|
46cbe96a43 | ||
|
|
40f38ebf84 | ||
|
|
30970b8451 | ||
|
|
c3d7581f94 | ||
|
|
a9d5f74a03 | ||
|
|
d4bb265c37 | ||
| ed7a323c50 | |||
|
|
41a495371d | ||
|
|
f7a84233bf | ||
|
|
2e8926ea5b | ||
|
|
23b9fda5e4 | ||
|
|
9f93c25aa8 | ||
|
|
466e0020a6 | ||
|
|
957d2ccfe7 | ||
| d29c57ab4b | |||
| 5f8569c7d9 | |||
| d67556796c | |||
| 3f91fddd3e | |||
| ae21c9a149 | |||
| 50a5586355 | |||
|
|
43646e8e63 | ||
|
|
021cb873ae | ||
|
|
7e76b30460 | ||
|
|
7f05568f65 | ||
|
|
ab8775c58d | ||
|
|
a2eb5868a7 | ||
|
|
b310062687 | ||
| f1cee0cbfd | |||
| 7a9c44198f | |||
| 69efd4d411 | |||
|
|
0a1d177d60 | ||
|
|
e5bddab2be | ||
|
|
574c26c3ec | ||
| cffca858aa | |||
| 8a4ac82c3a | |||
|
|
fdd7ff003b | ||
| 4fdcf1cf60 | |||
| 1f1d0aa118 | |||
| 851da7eb15 | |||
|
|
56a89ae386 | ||
|
|
bd0d96c2ff | ||
|
|
8173e44b04 | ||
|
|
8a16643bd8 | ||
|
|
67ac580778 | ||
|
|
8197d8f3d5 | ||
|
|
07bbc2926e | ||
|
|
734eca30db | ||
| 386131e9f3 | |||
|
|
7f85ed99c0 | ||
|
|
82089a6490 | ||
|
|
657472f576 | ||
|
|
0a00aab3ba | ||
|
|
abc45a4c8f | ||
|
|
96fcc2470b | ||
|
|
e1c2629f97 | ||
|
|
8592557613 | ||
|
|
8a84342883 | ||
| c51ba1bd56 | |||
|
|
1d6d786dbb | ||
|
|
19e60e5f0c | ||
|
|
f192a72ad7 | ||
|
|
b700940f54 | ||
|
|
2e45456a6e | ||
|
|
160ee81c44 | ||
|
|
647fddb904 | ||
|
|
0f1427a9f0 | ||
|
|
78d61a9822 | ||
|
|
0a0ab4bfa9 | ||
| ed17272999 | |||
| bb3e068232 | |||
| 69011f13ac | |||
|
|
165419cb88 | ||
|
|
db3429e780 | ||
|
|
6177c6292c | ||
|
|
d53e4b7c0c | ||
|
|
d611b8606e | ||
| d933c30148 | |||
| 1f383579b4 | |||
|
|
a1fbea98be | ||
|
|
39a12bd1d1 | ||
|
|
dc088509d4 | ||
|
|
54cb6d2f9a | ||
|
|
b5b7453214 | ||
|
|
2ea2db0791 | ||
|
|
c01c88b657 | ||
|
|
cd26d85f7c | ||
|
|
7ed1ad2983 | ||
|
|
4f67e3e31a | ||
|
|
02dbca06f2 | ||
|
|
7aedc35c16 | ||
| 8ae692db70 | |||
| 9c7fbc4725 | |||
| 21bb39d528 | |||
|
|
2a15ec75d2 | ||
|
|
c28e2bda2a | ||
| 06337b4d66 | |||
|
|
5d378f9f0f | ||
|
|
f2fc5e5071 | ||
| 5ee85d89a3 | |||
| afb7a189ad | |||
| 0f8b228931 | |||
| d69db63132 | |||
|
|
d74aeb237c | ||
|
|
686395defc | ||
|
|
f738160a8b | ||
|
|
3fa4a31978 | ||
|
|
b8c26a6588 | ||
| 223902f2d4 | |||
|
|
d8a59ac81d | ||
|
|
dc4d19ba88 | ||
|
|
c5fc9ee89c | ||
|
|
c28641d629 | ||
|
|
1c08152e65 | ||
|
|
bcc6c8a73d | ||
| a31e1a21f0 | |||
|
|
1b95ed0da7 | ||
|
|
422a76012e | ||
|
|
84f1639e59 | ||
| 2201c3ea4d | |||
| a2047aa37b | |||
| 809b6bea61 | |||
| 0cd427486c | |||
| 9b1f7541fd | |||
| 43f9e6fe0d | |||
|
|
94448297bb | ||
|
|
fc319f7162 | ||
|
|
43d243e0a1 | ||
|
|
6676484a61 | ||
|
|
d5b3a7d40f | ||
|
|
f13dda9a0f | ||
|
|
fbaaac8435 | ||
|
|
f8cbdf7ff0 | ||
|
|
55d3692f33 | ||
|
|
a315384417 | ||
|
|
7029c0b576 | ||
|
|
c0ca788c5c | ||
|
|
b96f81553d | ||
|
|
69a023e048 | ||
|
|
158da88523 | ||
|
|
30680a7820 | ||
|
|
0223869df6 | ||
|
|
eb873fd69f | ||
|
|
52e304b0af | ||
|
|
2b3e40b3b6 | ||
| 0064ff1889 | |||
|
|
21ffbcabc8 | ||
|
|
2dd36379a8 | ||
|
|
195352a7ca | ||
| 0a7b02c04a | |||
|
|
793e09910c | ||
|
|
4498c72c90 | ||
| 0fa701a878 | |||
| b49206407a | |||
|
|
d78b0f1cff | ||
|
|
07395802b7 | ||
|
|
ddbfb03f27 | ||
|
|
cdd33d7e2f | ||
|
|
34abad46e2 | ||
|
|
a19cdc4fee | ||
|
|
0adc890aef | ||
|
|
5bb50d5be4 | ||
|
|
8e7b2e5b8a | ||
|
|
c71e28ecb7 | ||
|
|
09f0cd3e71 | ||
|
|
cfbcc9d362 | ||
| 4109696800 | |||
|
|
7120a20499 | ||
|
|
3d3cac7085 | ||
|
|
9faf42fd79 | ||
|
|
376d1cc6f8 | ||
|
|
c58bb53002 | ||
|
|
4399004277 | ||
|
|
3e7e693a66 | ||
|
|
2c1e9c63d8 | ||
|
|
dd5523b2ac | ||
|
|
e41b1436f9 | ||
|
|
e78314461b | ||
|
|
03eac54ced | ||
|
|
2308695fa8 | ||
|
|
3473ce732c | ||
|
|
708f0a1f1a | ||
|
|
f4b905c2e6 | ||
|
|
ce57f184e7 | ||
|
|
8035903fa5 | ||
|
|
5b8e2da59e | ||
|
|
48c889129a | ||
| 4bd92565b9 | |||
|
|
fd3d4cc476 | ||
|
|
f7878cdb4a | ||
| 3dc9bb3d06 | |||
| 33164d4d1f | |||
|
|
98df4db95d | ||
|
|
b391f5e082 | ||
|
|
c790b4f353 | ||
|
|
30ee81a39d | ||
|
|
d38adb75b2 | ||
|
|
9d5b7ad5ae | ||
|
|
19e4435497 | ||
|
|
bb97df6179 | ||
|
|
217db9bbdd | ||
| 844708bbac | |||
|
|
dedf6eff00 | ||
| 130dc8db4e | |||
| d1f1fb42f3 | |||
| 34d31a1aa8 | |||
| ff2b50f615 | |||
| 2b42583999 | |||
| 7a47594614 | |||
|
|
26c958b421 | ||
|
|
61c7e9f417 | ||
|
|
57a9444478 | ||
| f5fa4f4faf | |||
| efd8f1f0c6 | |||
| e9c4987ca0 | |||
| 49cbfd92e5 | |||
|
|
70b3f031f8 | ||
|
|
5d8346b1ca | ||
|
|
cfca52e576 | ||
| 4eef4d238b | |||
|
|
ac7d239b40 | ||
|
|
0753071cfb | ||
|
|
254c745f25 | ||
|
|
956e16fdca | ||
|
|
1001da728e | ||
|
|
23430c9d90 | ||
|
|
de608798b9 | ||
|
|
0dc1091078 | ||
|
|
ab1d27747a | ||
|
|
60b9f176f0 | ||
| cc0b1e0a5b | |||
| 81b95e6a22 | |||
|
|
bf1194ec3b | ||
|
|
3ba57cfc56 | ||
|
|
258b8b1ff4 | ||
|
|
de5c65bc1d | ||
| c940b092d0 | |||
| 7588ad3c5b | |||
| 623f5d7b7e | |||
|
|
fb3b599f50 | ||
|
|
d756f5d2e1 | ||
|
|
d0d38b81cb | ||
|
|
69c17f9fdb | ||
| 1f7049691c | |||
|
|
eb592a3426 | ||
|
|
827a07a7ef | ||
|
|
533ccc7b5c | ||
|
|
ef8ebc300e | ||
| 497ca39c91 | |||
| 038caf4d54 | |||
| 6597c881a6 | |||
| 779b9e7313 | |||
| 7785bd1900 | |||
|
|
ee777b4beb | ||
|
|
3e164fd0c6 | ||
| 3dd65b9cc3 | |||
|
|
96395f6a1a | ||
|
|
845fd6a7b3 | ||
|
|
834e836a3d | ||
|
|
4bfe4ce047 | ||
|
|
0f4d13b8a5 | ||
| 2dc7819a84 | |||
|
|
8af4f8ad1e | ||
|
|
6719939a66 | ||
| 5d970fde1e | |||
| b1736358b7 | |||
| 70d9389f4b | |||
| f844f7b316 | |||
| 8c8ef7bb2a | |||
|
|
def9760f4b | ||
|
|
ceed663a77 | ||
|
|
64b8e1a9e8 | ||
|
|
fba2aad664 | ||
|
|
2668f4435c | ||
|
|
4f634cc43a | ||
| d9cb3517cc | |||
| 0e3576d193 | |||
| 0b02e8c213 | |||
| 0b6fbd22c5 | |||
| f4f744e22c | |||
| fc86179c39 | |||
| 17933c75f0 | |||
| 2115864d5c | |||
| 1e58a86110 | |||
| 49bf0ecd3c | |||
| 092852d745 | |||
| 8802267628 | |||
| e31890d8fc | |||
| 108d6c75d6 | |||
| da22dcce90 | |||
| d79165a9f2 | |||
| 641cb498f0 | |||
|
|
707618c6b1 | ||
| ae563454af | |||
| ea976295d0 | |||
|
|
2bd31f433b | ||
| f704d8b258 | |||
| 398a25f902 | |||
| 120f2743d2 | |||
|
|
dde7d73d2a | ||
| 1bee360bbb | |||
| 591e5a7110 | |||
| 0236a19db1 | |||
| ec9840839e | |||
| 05d38f583f | |||
| 173724ee5a | |||
| 3320cd64a4 | |||
| 6078338757 | |||
| cf944358dd | |||
| ca1b41511c | |||
| d53a3dad04 | |||
| 960f9ca71a | |||
| b8c92ed551 | |||
| b8aabfce99 | |||
| a8fe4b7419 | |||
| 5507a22865 | |||
| e051be8a06 | |||
| 3dd02d7f0c | |||
| dd8766277a | |||
| 5d2900510e | |||
| 06d6060a9f | |||
| 4990e33d27 | |||
| f99f5dbc8f | |||
|
|
b5e279a318 | ||
|
|
8463a87507 | ||
| 29de650b4e | |||
| 76f04bec6f | |||
| a08c9e91e0 | |||
|
|
b73f9fab45 | ||
| 97aaa0b0d3 | |||
| a5c1f68f03 | |||
| 5e6173b351 | |||
| d05e9320e5 | |||
| a46b0db583 | |||
| f77ba344c3 | |||
| e99d2630a1 | |||
|
|
a32f6fc037 | ||
|
|
0d8b6b4446 | ||
|
|
8282a7aa12 | ||
|
|
82d9d45abf | ||
|
|
3e81adfec6 | ||
|
|
5bb616ffc5 | ||
|
|
fb956f381a | ||
|
|
489199af10 | ||
|
|
69b345c96b | ||
| 1af88fbe85 | |||
| 327a22818a | |||
| 9aa8a5bf13 | |||
| 0fcd6fab9d | |||
| a46fb88282 | |||
| a854cf2762 | |||
|
|
90bf6cb99e | ||
|
|
9e124436e3 | ||
|
|
27155ad816 | ||
|
|
99adb5ce9c | ||
|
|
0789f51d69 | ||
|
|
ab840fbcf1 | ||
|
|
edd925af99 | ||
| e542aa70d9 | |||
| 4292197818 | |||
| ec3ecd04bb | |||
| a383f8c769 | |||
| cb5bd7dc09 | |||
| bb52f8ac83 | |||
| b42f88605b | |||
| 7635f790fd | |||
| 7ec28664b4 | |||
|
|
c9f07b6540 | ||
|
|
2cd7572ee4 | ||
|
|
7281220b55 | ||
|
|
1abcb9d9a9 | ||
|
|
c68597ce62 | ||
| 311b3f1de1 | |||
| c840e07635 | |||
| 0d3fb8be93 | |||
| 8dd100792e | |||
|
|
0cc29802a4 | ||
|
|
a6d19eae7d | ||
| 4548f361e4 | |||
|
|
017532272f | ||
|
|
68bbea9854 | ||
|
|
b44fbe0b02 | ||
|
|
61c745cd79 | ||
|
|
7ede5a7859 | ||
|
|
728cf15f19 | ||
| ac99ec8a76 | |||
|
|
123634924b | ||
|
|
8f0c1fb8ec | ||
|
|
5410b4481a | ||
|
|
54fd3004b4 | ||
| 2c9ad97a4a | |||
| 37e50b12e6 | |||
| 03219e69d6 | |||
| dec3e733a2 | |||
| ca4c5edb18 | |||
| b1990e6e1c | |||
| 2393b88f05 | |||
| f1c7f00193 | |||
| c1818622de | |||
| c94c569fcb | |||
| c851fa6901 | |||
| 6d8a17b7e2 | |||
|
|
1c749dd9a8 | ||
|
|
c54ba04ae2 | ||
|
|
add4944c05 | ||
|
|
c35dd456fe | ||
|
|
44050564b8 | ||
|
|
931853016a | ||
| 231a8b0244 | |||
| 8d4aaab92a | |||
| a2ca6fd66f | |||
| dc281c6c0e | |||
| bb6ebc7ee1 | |||
|
|
9ec7da7e4e | ||
|
|
cab58a10aa | ||
|
|
d25e791bb8 | ||
|
|
833b29a488 | ||
|
|
f2510ff400 | ||
|
|
4a911a4ac9 | ||
|
|
ab53a72c57 | ||
|
|
99a5a4499a | ||
|
|
eb153679ba | ||
|
|
aba3997b20 | ||
|
|
635ac1686b | ||
|
|
fd6e4cb02a | ||
| 30bc8ccd82 | |||
| 245a7455ff | |||
| ff52ec5410 | |||
| 6b14c452e2 | |||
| 864ef6c64d | |||
|
|
3330a3ae35 | ||
|
|
a95caa5efc | ||
|
|
aa624c0358 | ||
|
|
b91f4c9619 | ||
|
|
613bef1678 | ||
|
|
fd796ba6e1 | ||
| 57dfb86819 | |||
| 04b6c53ec0 | |||
| 883fdf6bf5 | |||
| c5ce958a41 | |||
| c5da8fd994 | |||
| 546e919dc9 | |||
| 3d8bea8f7e | |||
| 63849177be | |||
| 77b7d26902 | |||
| e6e38dbb95 | |||
| 93dfe76b7e | |||
| 864cb112bc | |||
| b3ea4229a4 | |||
| 1d70a236d1 | |||
| ba7ab07473 | |||
| 3cb73fb948 | |||
| 0721e225a7 | |||
| e6b0c2b470 | |||
| e0568e3849 | |||
|
|
b0acee7136 | ||
|
|
0dce58ede4 | ||
|
|
ce75a82f5b | ||
|
|
15b245c2e8 | ||
|
|
5488d4e0fc | ||
|
|
85f0717f10 | ||
|
|
ab9a49a727 | ||
|
|
c676fc5762 | ||
|
|
74682952e7 | ||
|
|
5be662524f | ||
|
|
6e51c05c94 | ||
|
|
1c71286fd8 | ||
|
|
0b6b7a7aed | ||
|
|
6c73e30754 | ||
| 0c76c496fb | |||
| c86adb4e6e | |||
| 2da7861b6f | |||
|
|
c04235dffc | ||
|
|
caa0dce637 | ||
| a239de26e8 | |||
| b9ce5b4f41 | |||
| 6dc0b206e9 | |||
| 0a6cff5f23 | |||
| bd10f7b61e | |||
|
|
b588c29513 | ||
| 9a4677c794 | |||
| 5f8b6de1ec | |||
| 82540c50af | |||
| b46f085a74 | |||
| 4994168247 | |||
| 5badf2ba34 | |||
| 56a0563709 | |||
| f177901883 | |||
|
|
c4b6b4c648 | ||
|
|
6ee3a1b0b4 | ||
| 7cab62b97e | |||
| 15bdc47f84 | |||
| 367610d032 | |||
| 426c2d0d4c | |||
| 0760c2fe3a | |||
| 8bf9b55288 | |||
| ca8081b7aa | |||
| 58aad840c8 | |||
| 4b641f1b3c | |||
| 463535f01a | |||
| bb84e27e54 | |||
|
|
694a10bd4a | ||
| 4d268da435 | |||
|
|
fee0d05253 | ||
| 7816e6342f | |||
|
|
b42b87602b | ||
|
|
492aac831a | ||
| 67dd66535a | |||
|
|
6213962654 | ||
|
|
0494f2a11b | ||
| c15716388d | |||
| d21798f633 | |||
| 043c45e02c | |||
| b243be8075 | |||
| e35d6b9371 | |||
| 0824026159 | |||
|
|
f6f1c9cf2f | ||
|
|
a015b0c90d | ||
|
|
e8aa9de060 | ||
|
|
1cdda3652f | ||
|
|
bebe3a3c45 | ||
|
|
0ad7e629ce | ||
|
|
45eb138717 | ||
| 5b52f718fe | |||
| 814906ef65 | |||
| 27ecdb899b | |||
| ae57381733 | |||
| c46b8a7821 | |||
|
|
dc78abed09 | ||
|
|
a606b030e2 | ||
|
|
787cac7d68 | ||
|
|
16ae4bdfe9 | ||
|
|
8ba34db05c | ||
|
|
49a248d139 | ||
| 474622027e | |||
| a0bbe8ca04 | |||
|
|
486449fbb5 | ||
|
|
85f0445e6b | ||
|
|
ea68b38f7e | ||
|
|
380cccdf16 | ||
|
|
a3fb4770c6 | ||
| c7aeb1959b | |||
| 54916fa421 | |||
| 78b41f3d57 | |||
|
|
e321ad26b2 | ||
|
|
a86a2efb8a | ||
|
|
ffa58c1f89 | ||
|
|
5fbd9d7fa9 | ||
|
|
3507314955 | ||
|
|
77c87067da | ||
|
|
8f71297884 | ||
|
|
567ae16f1d | ||
|
|
5f0b7fbdc0 | ||
|
|
714e70de69 | ||
|
|
f6922fafef | ||
|
|
cc2d823272 | ||
|
|
0ceba15118 | ||
|
|
0dbcca1c6f | ||
| b23c9d1104 | |||
| addb8ae815 | |||
|
|
b953377c58 | ||
|
|
4a48874f88 | ||
|
|
1966a2b612 | ||
|
|
3556a2becc | ||
|
|
acd8f70369 | ||
|
|
16c07da6e4 | ||
|
|
125728f2b1 | ||
| c5f9842c37 | |||
| d9b685eebb | |||
| cb114dc696 | |||
| d4d464d400 | |||
| cc002c9460 | |||
| 4184fcffdc | |||
| 4344a7c8a6 | |||
| b10d8606cc | |||
| 7dd1519f83 | |||
| 35c184ede7 | |||
| 5496b2deaa | |||
| 757a6d784b | |||
| cdb8af56b3 | |||
| abbe9cb2c4 | |||
| 693362a278 | |||
| dd360bd9cc | |||
| 1878b887f6 | |||
| 82ac85d743 | |||
| 5c9f17bce3 | |||
| d15441900e | |||
| 091ab23b90 | |||
| 8acd84976e | |||
| fa6db084b8 | |||
| 2b8c60a3d4 | |||
| d477467b02 | |||
| 61c136fec3 | |||
| 0e73f21bda | |||
| be0bf20382 | |||
| d32b401508 | |||
| 759697add8 | |||
| c35eea4588 | |||
| 1b86d3bfa4 | |||
| cdd24e23fb | |||
| e66e0701a4 | |||
| 47f0fcb030 | |||
| 6a59bee73d | |||
| 3508d00c28 | |||
| 2b5e8216ba | |||
| 922cb6a807 | |||
| 81ce161744 | |||
| 30503185e4 | |||
| 7e3bcefd19 | |||
| 1c40cb3852 | |||
| 35e477c13f | |||
| 903e87e1e1 | |||
| b07f1b5b78 | |||
| bec1ee1716 | |||
| d5c9ad41be | |||
| 46a20a10e6 | |||
| c88ba18d2f | |||
| f6bf37c920 | |||
| d3199a5798 | |||
| 7092f6e8b5 | |||
| bc87c12cfa | |||
| 401c09d0b4 | |||
| 36675d4a92 | |||
| 9dc5b57ee0 | |||
| eab0ea5a7e | |||
| f5eda74730 | |||
| 8eb69822b1 | |||
| a8330b6d91 | |||
| 89f996ffe3 | |||
| 1accc92421 | |||
| d22a224804 | |||
| dbd53024b2 | |||
|
|
75ffe0c37a | ||
|
|
41a2e840f8 | ||
|
|
2d48ad3bb2 | ||
| 23fa136dc5 | |||
| 64158174e6 | |||
| ef50c3d4d8 | |||
| 538c2e2dff | |||
| 19eaa171fd | |||
| b4c19acd99 | |||
| 45fb1935ef | |||
| 540891f3d7 | |||
| 4769b447a8 | |||
| ff98371a04 | |||
| 0bfe2ccc3d | |||
| 9bbbe89b36 | |||
| 2961867c10 | |||
| 1d61b4936c | |||
| 6be85efa1f | |||
| f5ab88909f | |||
| d46d5c2bb0 | |||
| f0d60de745 | |||
| 92ed582c01 | |||
| c5e55fd867 | |||
| e6301af2bb | |||
| 9d1a78222e | |||
| 3fe1e3906e | |||
| 8213cdc575 | |||
| 0749420f9a | |||
|
|
2fcf325a6e | ||
|
|
13b8a9daec | ||
|
|
fa58ec2aee | ||
|
|
59930c3238 | ||
| 5d85a4bdc8 | |||
|
|
2eace0d304 | ||
|
|
31273b384e | ||
|
|
201c34a85b | ||
|
|
112e0bc7fa | ||
| 3c9865c767 | |||
| d665e47d02 | |||
| 9e7f20a9fb | |||
| 223c992f20 | |||
| 4bb75d17fb | |||
| ef8bd6572e | |||
| 04e28943d5 | |||
| 32eee12f25 | |||
| 752811c8fd | |||
| ce8b954a8b | |||
|
|
479058a41e | ||
|
|
ca809c4673 | ||
| 70a700101b | |||
| 5650f7bfc7 | |||
| 9603f7127c | |||
| 609005433a | |||
| e6ac337466 | |||
| 553bb9990b | |||
| 41684cd282 | |||
| 3e559f61da | |||
| d7a4692afc | |||
| ec1cc26b8c | |||
| dc43a3520d | |||
| 4acf634f8d | |||
| 9d38ed9771 | |||
| 746b073572 | |||
| fc3e1a613e | |||
| 04e6a51e99 | |||
| d405e9e6f9 | |||
| 9dc57e3977 | |||
| c7f09988e5 | |||
| 1702051d8f | |||
| d47623ed65 | |||
| 8ed281ae2d | |||
| 094213bd21 | |||
| 411b365987 | |||
| 4b7bfc6aa9 | |||
| 4bb03d6418 | |||
| 9ff18c7425 | |||
| d0d17ee656 | |||
| 8cb638e5bc | |||
| 758de94fff | |||
|
|
8fb9ca9dc2 | ||
|
|
8fa9ec74c0 | ||
| 2a385512ee | |||
| 9958c86287 | |||
| 25921e3718 | |||
| 0e8c5a7e48 | |||
|
|
7da6b57ed1 | ||
|
|
03033f57a1 | ||
| fbce83293d | |||
| c40aec192c | |||
| 8c66f1823a | |||
| 86803cdff0 | |||
| 013c948b33 | |||
| 7fd191dcc6 | |||
| 97344c9f21 | |||
| bff84ede81 | |||
| 3b613d8330 | |||
| da18039c87 | |||
| 224c6b625c | |||
| 185b308166 | |||
| 4f440d282d | |||
| c3e072e952 | |||
| d4bf29e4ff | |||
| 32cf20b81d | |||
| c03b8a220f | |||
| 77e7f666f0 | |||
| c41eb36a34 | |||
| 2d776f84da | |||
| 12c6fecf74 | |||
|
|
db76861124 | ||
|
|
898169647b | ||
|
|
e4ddb8b55e | ||
|
|
dde360d4cc | ||
|
|
8de25cc149 | ||
|
|
6e2c1851ec | ||
|
|
5268d35d39 | ||
|
|
34e27f3e67 | ||
| 1266ced058 | |||
| 29700e793e | |||
| ff39d97b82 | |||
| a079bd331b | |||
| 0cee4cd644 | |||
| a385553a29 | |||
| 00f52c444a | |||
| 4c8174f5ae | |||
| 0481fa748b | |||
| 46f5e55c8e | |||
| cb80170ccf | |||
| e7507a325f | |||
| e659e13a0e | |||
| cb7eb481d9 | |||
| 3278470deb | |||
| 307e960d34 | |||
| d9ca0141de | |||
| fb2553e980 | |||
| 6af43fc9fd | |||
| 8df11078b4 | |||
| bead7a24c3 | |||
| 0dec3eb7f0 | |||
| 36531c9923 | |||
| 88b2a319fd | |||
| ef8adc6c0a | |||
| faacfc423c | |||
| c26782bf7c | |||
| e6b49cfdb3 | |||
| b049dda90f | |||
| 9b8413beaf | |||
| d58b671d36 | |||
| 0af8ab2b08 | |||
| 90936bd47a | |||
| dac3be5110 | |||
| 5b044a3f14 | |||
| 253a49c06b | |||
| fbbfcbcaea | |||
| e347e8eef9 | |||
| 9a2d127e30 | |||
| 8edea03fe7 | |||
| ac27a8ef2e | |||
| c83a11a2c3 | |||
| 84f3a29a86 | |||
| d0b3f0ee5d | |||
| c0f7060368 | |||
| e38b917623 | |||
| 8eb82cabc0 | |||
|
|
bddc2ab83e | ||
|
|
270e3b6d00 | ||
|
|
45999de6d2 | ||
|
|
98c50e5312 | ||
| ede06550cd | |||
| c3ec80d947 | |||
| f9d8173b2f | |||
| 5a093ed736 | |||
| 34c1f9111b | |||
|
|
4aa7856267 | ||
|
|
a4f948fd76 | ||
| 1a4d306a40 | |||
| 738f280abe | |||
|
|
d016a80a72 | ||
| 25351d3827 | |||
| 0c1e64895b | |||
|
|
aaf04a13d5 | ||
| dcc3881720 | |||
| e05c3d56bc | |||
| 32a1c8bcd3 | |||
| 33d10300f5 | |||
| 336572bfc3 | |||
| 8bf51c9315 | |||
| bf37a6546d | |||
| a484709bc4 | |||
| e92c00af48 | |||
| 5d4084ac8a | |||
| 6c363d34ff | |||
| 91cd80bdb5 | |||
| a3a959d75a |
4
.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
*.pyc
|
||||
*~
|
||||
.idea
|
||||
pylot/RELEASE-VERSION
|
||||
111
README.md
@@ -1,2 +1,111 @@
|
||||
# PyLoT
|
||||
Python picking and Location Tool
|
||||
|
||||
version: 0.3
|
||||
|
||||
The Python picking and Localisation Tool
|
||||
|
||||
This python library contains a graphical user interfaces for picking seismic phases. This software needs [ObsPy][ObsPy]
|
||||
and the PySide2 Qt5 bindings for python to be installed first.
|
||||
|
||||
PILOT has originally been developed in Mathworks' MatLab. In order to distribute PILOT without facing portability
|
||||
problems, it has been decided to redevelop the software package in Python. The great work of the ObsPy group allows easy
|
||||
handling of a bunch of seismic data and PyLoT will benefit a lot compared to the former MatLab version.
|
||||
|
||||
The development of PyLoT is part of the joint research project MAGS2 and AlpArray.
|
||||
|
||||
## Installation
|
||||
|
||||
At the moment there is no automatic installation procedure available for PyLoT. Best way to install is to clone the
|
||||
repository and add the path to your Python path.
|
||||
|
||||
It is highly recommended to use Anaconda for a simple creation of a Python installation using either the *pylot.yml* or the *requirements.txt* file found in the PyLoT root directory. First make sure that the *conda-forge* channel is available in your Anaconda installation:
|
||||
|
||||
conda config --add channels conda-forge
|
||||
|
||||
Afterwards run (from the PyLoT main directory where the files *requirements.txt* and *pylot.yml* are located)
|
||||
|
||||
conda env create -f pylot.yml
|
||||
or
|
||||
|
||||
conda create --name pylot_38 --file requirements.txt
|
||||
|
||||
to create a new Anaconda environment called "pylot_38".
|
||||
|
||||
Afterwards activate the environment by typing
|
||||
|
||||
conda activate pylot_38
|
||||
|
||||
#### Prerequisites:
|
||||
|
||||
In order to run PyLoT you need to install:
|
||||
|
||||
- Python 3
|
||||
- obspy
|
||||
- pyside2
|
||||
- pyqtgraph
|
||||
- cartopy
|
||||
|
||||
(the following are already dependencies of the above packages):
|
||||
- scipy
|
||||
- numpy
|
||||
- matplotlib <= 3.3.x
|
||||
|
||||
#### Some handwork:
|
||||
|
||||
PyLoT needs a properties folder on your system to work. It should be situated in your home directory
|
||||
(on Windows usually C:/Users/*username*):
|
||||
|
||||
mkdir ~/.pylot
|
||||
|
||||
In the next step you have to copy some files to this directory:
|
||||
|
||||
*for local distance seismicity*
|
||||
|
||||
cp path-to-pylot/inputs/pylot_local.in ~/.pylot/pylot.in
|
||||
|
||||
*for regional distance seismicity*
|
||||
|
||||
cp path-to-pylot/inputs/pylot_regional.in ~/.pylot/pylot.in
|
||||
|
||||
*for global distance seismicity*
|
||||
|
||||
cp path-to-pylot/inputs/pylot_global.in ~/.pylot/pylot.in
|
||||
|
||||
and some extra information on error estimates (just needed for reading old PILOT data) and the Richter magnitude scaling
|
||||
relation
|
||||
|
||||
cp path-to-pylot/inputs/PILOT_TimeErrors.in path-to-pylot/inputs/richter_scaling.data ~/.pylot/
|
||||
|
||||
You may need to do some modifications to these files. Especially folder names should be reviewed.
|
||||
|
||||
PyLoT has been tested on Mac OSX (10.11), Debian Linux 8 and on Windows 10.
|
||||
|
||||
## Release notes
|
||||
|
||||
#### Features:
|
||||
|
||||
- event organisation in project files and waveform visualisation
|
||||
- consistent manual phase picking through predefined SNR dependant zoom level
|
||||
- consistent automatic phase picking routines using Higher Order Statistics, AIC and Autoregression
|
||||
- interactive tuning of auto-pick parameters
|
||||
- uniform uncertainty estimation from waveform's properties for automatic and manual picks
|
||||
- pdf representation and comparison of picks taking the uncertainty intrinsically into account
|
||||
- Richter and moment magnitude estimation
|
||||
- location determination with external installation of [NonLinLoc](http://alomax.free.fr/nlloc/index.html)
|
||||
|
||||
#### Known issues:
|
||||
|
||||
We hope to solve these with the next release.
|
||||
|
||||
## Staff
|
||||
|
||||
Original author(s): M. Rische, S. Wehling-Benatelli, L. Kueperkoch, M. Bischoff (PILOT)
|
||||
|
||||
Developer(s): S. Wehling-Benatelli, M. Paffrath, L. Kueperkoch, K. Olbert, M. Bischoff, C. Wollin, M. Rische, D. Arnold, K. Cökerim, S. Zimmermann
|
||||
|
||||
Others: A. Bruestle, T. Meier, W. Friederich
|
||||
|
||||
|
||||
[ObsPy]: http://github.com/obspy/obspy/wiki
|
||||
|
||||
April 2022
|
||||
|
||||
561
autoPyLoT.py
Executable file
@@ -0,0 +1,561 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
import argparse
|
||||
import datetime
|
||||
import glob
|
||||
import os
|
||||
import traceback
|
||||
|
||||
from obspy import read_events
|
||||
from obspy.core.event import ResourceIdentifier
|
||||
|
||||
import pylot.core.loc.focmec as focmec
|
||||
import pylot.core.loc.hash as hash
|
||||
import pylot.core.loc.hypo71 as hypo71
|
||||
import pylot.core.loc.hypodd as hypodd
|
||||
import pylot.core.loc.hyposat as hyposat
|
||||
import pylot.core.loc.nll as nll
|
||||
import pylot.core.loc.velest as velest
|
||||
# from PySide.QtGui import QWidget, QInputDialog
|
||||
from pylot.core.analysis.magnitude import MomentMagnitude, LocalMagnitude
|
||||
from pylot.core.io.data import Data
|
||||
from pylot.core.io.inputs import PylotParameter
|
||||
from pylot.core.pick.autopick import autopickevent, iteratepicker
|
||||
from pylot.core.util.dataprocessing import restitute_data, Metadata
|
||||
from pylot.core.util.defaults import SEPARATOR
|
||||
from pylot.core.util.event import Event
|
||||
from pylot.core.util.structure import DATASTRUCTURE
|
||||
from pylot.core.util.utils import get_none, trim_station_components, check4gapsAndRemove, check4doubled, \
|
||||
check4rotated
|
||||
from pylot.core.util.version import get_git_version as _getVersionString
|
||||
|
||||
__version__ = _getVersionString()
|
||||
|
||||
|
||||
def autoPyLoT(input_dict=None, parameter=None, inputfile=None, fnames=None, eventid=None, savepath=None,
|
||||
savexml=True, station='all', iplot=0, ncores=0, obspyDMT_wfpath=False):
|
||||
"""
|
||||
Determine phase onsets automatically utilizing the automatic picking
|
||||
algorithms by Kueperkoch et al. 2010/2012.
|
||||
:param obspyDMT_wfpath: if obspyDMT is used, name of data directory ("raw" or "processed")
|
||||
:param input_dict:
|
||||
:type input_dict:
|
||||
:param parameter: PylotParameter object containing parameters used for automatic picking
|
||||
:type parameter: pylot.core.io.inputs.PylotParameter
|
||||
:param inputfile: path to the input file containing all parameter information for automatic picking
|
||||
(for formatting details, see. `~pylot.core.io.inputs.PylotParameter`
|
||||
:type inputfile: str
|
||||
:param fnames: list of data file names or None when called from GUI
|
||||
:type fnames: str
|
||||
:param eventid: event path incl. event ID (path to waveform files)
|
||||
:type eventid: str
|
||||
:param savepath: save path for autoPyLoT output, if None/"None" output will be saved in event folder
|
||||
:type savepath: str
|
||||
:param savexml: export results in XML file if True
|
||||
:type savexml: bool
|
||||
:param station: choose specific station name or 'all' to pick all stations
|
||||
:type station: str
|
||||
:param iplot: logical variable for plotting: 0=none, 1=partial, 2=all
|
||||
:type iplot: int
|
||||
:param ncores: number of cores used for parallel processing. Default (0) uses all available cores
|
||||
:type ncores: int
|
||||
:return: dictionary containing picks
|
||||
:rtype: dict
|
||||
"""
|
||||
|
||||
if ncores == 1:
|
||||
sp_info = 'autoPyLoT is running serial on 1 cores.'
|
||||
else:
|
||||
if ncores == 0:
|
||||
ncores_readable = 'all available'
|
||||
else:
|
||||
ncores_readable = ncores
|
||||
sp_info = 'autoPyLoT is running in parallel on {} cores.'.format(ncores_readable)
|
||||
|
||||
splash = '''************************************\n
|
||||
*********autoPyLoT starting*********\n
|
||||
The Python picking and Location Tool\n
|
||||
Version {version} 2017\n
|
||||
\n
|
||||
Authors:\n
|
||||
L. Kueperkoch (BESTEC GmbH, Landau i. d. Pfalz, \n
|
||||
now at igem GmbH, Mainz)
|
||||
M. Paffrath (Ruhr-Universitaet Bochum)\n
|
||||
S. Wehling-Benatelli (Ruhr-Universitaet Bochum)\n
|
||||
|
||||
{sp}
|
||||
***********************************'''.format(version=_getVersionString(),
|
||||
sp=sp_info)
|
||||
print(splash)
|
||||
|
||||
parameter = get_none(parameter)
|
||||
inputfile = get_none(inputfile)
|
||||
eventid = get_none(eventid)
|
||||
|
||||
fig_dict = None
|
||||
fig_dict_wadatijack = None
|
||||
|
||||
if input_dict and isinstance(input_dict, dict):
|
||||
if 'parameter' in input_dict:
|
||||
parameter = input_dict['parameter']
|
||||
if 'fig_dict' in input_dict:
|
||||
fig_dict = input_dict['fig_dict']
|
||||
if 'fig_dict_wadatijack' in input_dict:
|
||||
fig_dict_wadatijack = input_dict['fig_dict_wadatijack']
|
||||
if 'station' in input_dict:
|
||||
station = input_dict['station']
|
||||
if 'fnames' in input_dict:
|
||||
fnames = input_dict['fnames']
|
||||
if 'eventid' in input_dict:
|
||||
eventid = input_dict['eventid']
|
||||
if 'iplot' in input_dict:
|
||||
iplot = input_dict['iplot']
|
||||
if 'savexml' in input_dict:
|
||||
savexml = input_dict['savexml']
|
||||
if 'obspyDMT_wfpath' in input_dict:
|
||||
obspyDMT_wfpath = input_dict['obspyDMT_wfpath']
|
||||
|
||||
if not parameter:
|
||||
if not inputfile:
|
||||
print('Using default input parameter')
|
||||
parameter = PylotParameter(inputfile)
|
||||
else:
|
||||
if not type(parameter) == PylotParameter:
|
||||
print('Wrong input type for parameter: {}'.format(type(parameter)))
|
||||
return
|
||||
if inputfile:
|
||||
print('Parameters set and input file given. Choose either of both.')
|
||||
return
|
||||
|
||||
evt = None
|
||||
|
||||
# reading parameter file
|
||||
if parameter.hasParam('datastructure'):
|
||||
# getting information on data structure
|
||||
datastructure = DATASTRUCTURE[parameter.get('datastructure')]()
|
||||
dsfields = {'root': parameter.get('rootpath'),
|
||||
'dpath': parameter.get('datapath'),
|
||||
'dbase': parameter.get('database')}
|
||||
|
||||
exf = ['root', 'dpath', 'dbase']
|
||||
|
||||
if parameter['eventID'] != '*' and fnames == 'None':
|
||||
dsfields['eventID'] = parameter['eventID']
|
||||
exf.append('eventID')
|
||||
|
||||
datastructure.modifyFields(**dsfields)
|
||||
datastructure.setExpandFields(exf)
|
||||
|
||||
# check if default location routine NLLoc is available and all stations are used
|
||||
if get_none(parameter['nllocbin']) and station == 'all':
|
||||
locflag = 1
|
||||
# get NLLoc-root path
|
||||
nllocroot = parameter.get('nllocroot')
|
||||
# get path to NLLoc executable
|
||||
nllocbin = parameter.get('nllocbin')
|
||||
nlloccall = '%s/NLLoc' % nllocbin
|
||||
# get name of phase file
|
||||
phasef = parameter.get('phasefile')
|
||||
phasefile = '%s/obs/%s' % (nllocroot, phasef)
|
||||
# get name of NLLoc-control file
|
||||
ctrf = parameter.get('ctrfile')
|
||||
ctrfile = '%s/run/%s' % (nllocroot, ctrf)
|
||||
# pattern of NLLoc ttimes from location grid
|
||||
ttpat = parameter.get('ttpatter')
|
||||
# pattern of NLLoc-output file
|
||||
nllocoutpatter = parameter.get('outpatter')
|
||||
maxnumit = 2 # maximum number of iterations for re-picking
|
||||
else:
|
||||
locflag = 0
|
||||
print(" !!! ")
|
||||
print("!!No location routine available, autoPyLoT is running in non-location mode!!")
|
||||
print("!!No source parameter estimation possible!!")
|
||||
print(" !!! ")
|
||||
|
||||
wfpath_extension = ''
|
||||
if obspyDMT_wfpath not in [None, False, 'False', '']:
|
||||
wfpath_extension = obspyDMT_wfpath
|
||||
print('Using obspyDMT structure. There will be no restitution, as pre-processed data are expected.')
|
||||
if wfpath_extension != 'processed':
|
||||
print('WARNING: Expecting wfpath_extension to be "processed" for'
|
||||
' pre-processed data but received "{}" instead!!!'.format(wfpath_extension))
|
||||
|
||||
if not input_dict:
|
||||
# started in production mode
|
||||
datapath = datastructure.expandDataPath()
|
||||
if fnames == 'None' and parameter['eventID'] == '*':
|
||||
# multiple event processing
|
||||
# read each event in database
|
||||
events = [event for event in glob.glob(os.path.join(datapath, '*')) if
|
||||
(os.path.isdir(event) and not event.endswith('EVENTS-INFO'))]
|
||||
elif fnames == 'None' and parameter['eventID'] != '*' and not type(parameter['eventID']) == list:
|
||||
# single event processing
|
||||
events = glob.glob(os.path.join(datapath, parameter['eventID']))
|
||||
elif fnames == 'None' and type(parameter['eventID']) == list:
|
||||
# multiple event processing
|
||||
events = []
|
||||
for eventID in parameter['eventID']:
|
||||
events.append(os.path.join(datapath, eventID))
|
||||
else:
|
||||
# autoPyLoT was initialized from GUI
|
||||
events = [eventid]
|
||||
evID = os.path.split(eventid)[-1]
|
||||
locflag = 2
|
||||
else:
|
||||
# started in tune or interactive mode
|
||||
datapath = os.path.join(parameter['rootpath'],
|
||||
parameter['datapath'])
|
||||
events = []
|
||||
for eventID in eventid:
|
||||
events.append(os.path.join(datapath,
|
||||
parameter['database'],
|
||||
eventID))
|
||||
|
||||
if not events:
|
||||
print('autoPyLoT: No events given. Return!')
|
||||
return
|
||||
|
||||
# transform system path separator to '/'
|
||||
for index, eventpath in enumerate(events):
|
||||
eventpath = eventpath.replace(SEPARATOR, '/')
|
||||
events[index] = eventpath
|
||||
|
||||
allpicks = {}
|
||||
glocflag = locflag
|
||||
|
||||
nEvents = len(events)
|
||||
for index, eventpath in enumerate(events):
|
||||
print('Working on: {} ({}/{})'.format(eventpath, index + 1, nEvents))
|
||||
evID = os.path.split(eventpath)[-1]
|
||||
event_datapath = os.path.join(eventpath, wfpath_extension)
|
||||
fext = '.xml'
|
||||
filename = os.path.join(eventpath, 'PyLoT_' + evID + fext)
|
||||
try:
|
||||
data = Data(evtdata=filename)
|
||||
data.get_evt_data().path = eventpath
|
||||
print('Reading event data from filename {}...'.format(filename))
|
||||
except Exception as e:
|
||||
print('Could not read event from file {}: {}'.format(filename, e))
|
||||
data = Data()
|
||||
pylot_event = Event(eventpath) # event should be path to event directory
|
||||
data.setEvtData(pylot_event)
|
||||
if fnames == 'None':
|
||||
data.set_wf_data(glob.glob(os.path.join(datapath, event_datapath, '*')))
|
||||
# the following is necessary because within
|
||||
# multiple event processing no event ID is provided
|
||||
# in autopylot.in
|
||||
try:
|
||||
parameter.get('eventID')
|
||||
except Exception:
|
||||
now = datetime.datetime.now()
|
||||
eventID = '%d%02d%02d%02d%02d' % (now.year,
|
||||
now.month,
|
||||
now.day,
|
||||
now.hour,
|
||||
now.minute)
|
||||
parameter.setParam(eventID=eventID)
|
||||
else:
|
||||
data.set_wf_data(fnames)
|
||||
|
||||
eventpath = events[0]
|
||||
# now = datetime.datetime.now()
|
||||
# evID = '%d%02d%02d%02d%02d' % (now.year,
|
||||
# now.month,
|
||||
# now.day,
|
||||
# now.hour,
|
||||
# now.minute)
|
||||
parameter.setParam(eventID=eventid)
|
||||
wfdat = data.get_wf_data() # all available streams
|
||||
if not station == 'all':
|
||||
wfdat = wfdat.select(station=station)
|
||||
if not wfdat:
|
||||
print('Could not find station {}. STOP!'.format(station))
|
||||
return
|
||||
# wfdat = remove_underscores(wfdat)
|
||||
# trim components for each station to avoid problems with different trace starttimes for one station
|
||||
wfdat = check4gapsAndRemove(wfdat)
|
||||
wfdat = check4doubled(wfdat)
|
||||
wfdat = trim_station_components(wfdat, trim_start=True, trim_end=False)
|
||||
if not wfpath_extension:
|
||||
metadata = Metadata(parameter.get('invdir'))
|
||||
else:
|
||||
metadata = Metadata(os.path.join(eventpath, 'resp'))
|
||||
corr_dat = None
|
||||
if metadata:
|
||||
# rotate stations to ZNE
|
||||
try:
|
||||
wfdat = check4rotated(wfdat, metadata)
|
||||
except Exception as e:
|
||||
print('Could not rotate station {} to ZNE:\n{}'.format(wfdat[0].stats.station,
|
||||
traceback.format_exc()))
|
||||
if locflag:
|
||||
print("Restitute data ...")
|
||||
corr_dat = restitute_data(wfdat.copy(), metadata, ncores=ncores)
|
||||
if not corr_dat and locflag:
|
||||
locflag = 2
|
||||
print('Stations: %s' % (station))
|
||||
print(wfdat)
|
||||
##########################################################
|
||||
# !automated picking starts here!
|
||||
fdwj = None
|
||||
if fig_dict_wadatijack:
|
||||
fdwj = fig_dict_wadatijack[evID]
|
||||
picks = autopickevent(wfdat, parameter, iplot=iplot, fig_dict=fig_dict,
|
||||
fig_dict_wadatijack=fdwj,
|
||||
ncores=ncores, metadata=metadata, origin=data.get_evt_data().origins)
|
||||
##########################################################
|
||||
# locating
|
||||
if locflag > 0:
|
||||
# write phases to NLLoc-phase file
|
||||
nll.export(picks, phasefile, parameter)
|
||||
|
||||
# For locating the event the NLLoc-control file has to be modified!
|
||||
nllocout = '%s_%s' % (evID, nllocoutpatter)
|
||||
# create comment line for NLLoc-control file
|
||||
nll.modify_inputs(ctrf, nllocroot, nllocout, phasef,
|
||||
ttpat)
|
||||
|
||||
# locate the event
|
||||
nll.locate(ctrfile, parameter)
|
||||
|
||||
# !iterative picking if traces remained unpicked or occupied with bad picks!
|
||||
# get theoretical onset times for picks with weights >= 4
|
||||
# in order to reprocess them using smaller time windows around theoretical onset
|
||||
# get stations with bad onsets
|
||||
badpicks = []
|
||||
for key in picks:
|
||||
if picks[key]['P']['weight'] >= 4 or picks[key]['S']['weight'] >= 4:
|
||||
badpicks.append([key, picks[key]['P']['mpp']])
|
||||
|
||||
# TODO keep code DRY (Don't Repeat Yourself) the following part is written twice
|
||||
# suggestion: delete block and modify the later similar block to work properly
|
||||
|
||||
if len(badpicks) == 0:
|
||||
print("autoPyLoT: No bad onsets found, thus no iterative picking necessary!")
|
||||
# get NLLoc-location file
|
||||
locsearch = '%s/loc/%s.????????.??????.grid?.loc.hyp' % (nllocroot, nllocout)
|
||||
if len(glob.glob(locsearch)) > 0:
|
||||
# get latest NLLoc-location file if several are available
|
||||
nllocfile = max(glob.glob(locsearch), key=os.path.getctime)
|
||||
evt = read_events(nllocfile)[0]
|
||||
# calculate seismic moment Mo and moment magnitude Mw
|
||||
moment_mag = MomentMagnitude(corr_dat, evt, parameter.get('vp'),
|
||||
parameter.get('Qp'),
|
||||
parameter.get('rho'), True,
|
||||
iplot)
|
||||
# update pick with moment property values (w0, fc, Mo)
|
||||
for stats, props in moment_mag.moment_props.items():
|
||||
picks[stats]['P'].update(props)
|
||||
evt = moment_mag.updated_event()
|
||||
net_mw = moment_mag.net_magnitude()
|
||||
if net_mw is not None:
|
||||
print("Network moment magnitude: %4.1f" % net_mw.mag)
|
||||
# calculate local (Richter) magntiude
|
||||
WAscaling = parameter.get('WAscaling')
|
||||
magscaling = parameter.get('magscaling')
|
||||
local_mag = LocalMagnitude(corr_dat, evt,
|
||||
parameter.get('sstop'),
|
||||
WAscaling, True, iplot)
|
||||
# update pick with local magnitude property values
|
||||
for stats, amplitude in local_mag.amplitudes.items():
|
||||
picks[stats]['S']['Ao'] = amplitude.generic_amplitude
|
||||
print("Local station magnitudes scaled with:")
|
||||
print("log(Ao) + %f * log(r) + %f * r + %f" % (WAscaling[0],
|
||||
WAscaling[1],
|
||||
WAscaling[2]))
|
||||
evt = local_mag.updated_event(magscaling)
|
||||
net_ml = local_mag.net_magnitude(magscaling)
|
||||
if net_ml:
|
||||
print("Network local magnitude: %4.1f" % net_ml.mag)
|
||||
if magscaling is None:
|
||||
scaling = False
|
||||
elif magscaling[0] != 0 and magscaling[1] != 0:
|
||||
scaling = False
|
||||
else:
|
||||
scaling = True
|
||||
if scaling:
|
||||
print("Network local magnitude scaled with:")
|
||||
print("%f * Ml + %f" % (magscaling[0], magscaling[1]))
|
||||
else:
|
||||
print("autoPyLoT: No NLLoc-location file available!")
|
||||
print("No source parameter estimation possible!")
|
||||
locflag = 9
|
||||
else:
|
||||
# get theoretical P-onset times from NLLoc-location file
|
||||
locsearch = '%s/loc/%s.????????.??????.grid?.loc.hyp' % (nllocroot, nllocout)
|
||||
if len(glob.glob(locsearch)) > 0:
|
||||
# get latest file if several are available
|
||||
nllocfile = max(glob.glob(locsearch), key=os.path.getctime)
|
||||
nlloccounter = 0
|
||||
while len(badpicks) > 0 and nlloccounter <= maxnumit:
|
||||
nlloccounter += 1
|
||||
if nlloccounter > maxnumit:
|
||||
print("autoPyLoT: Number of maximum iterations reached, stop iterative picking!")
|
||||
break
|
||||
print("autoPyLoT: Starting with iteration No. %d ..." % nlloccounter)
|
||||
if input_dict:
|
||||
if 'fig_dict' in input_dict:
|
||||
fig_dict = input_dict['fig_dict']
|
||||
picks = iteratepicker(wfdat, nllocfile, picks, badpicks, parameter,
|
||||
fig_dict=fig_dict)
|
||||
else:
|
||||
picks = iteratepicker(wfdat, nllocfile, picks, badpicks, parameter)
|
||||
# write phases to NLLoc-phase file
|
||||
nll.export(picks, phasefile, parameter)
|
||||
# remove actual NLLoc-location file to keep only the last
|
||||
os.remove(nllocfile)
|
||||
# locate the event
|
||||
nll.locate(ctrfile, parameter)
|
||||
print("autoPyLoT: Iteration No. %d finished." % nlloccounter)
|
||||
# get updated NLLoc-location file
|
||||
nllocfile = max(glob.glob(locsearch), key=os.path.getctime)
|
||||
# check for bad picks
|
||||
badpicks = []
|
||||
for key in picks:
|
||||
if picks[key]['P']['weight'] >= 4 or picks[key]['S']['weight'] >= 4:
|
||||
badpicks.append([key, picks[key]['P']['mpp']])
|
||||
print("autoPyLoT: After iteration No. %d: %d bad onsets found ..." % (nlloccounter,
|
||||
len(badpicks)))
|
||||
if len(badpicks) == 0:
|
||||
print("autoPyLoT: No more bad onsets found, stop iterative picking!")
|
||||
nlloccounter = maxnumit
|
||||
evt = read_events(nllocfile)[0]
|
||||
if locflag < 2:
|
||||
# calculate seismic moment Mo and moment magnitude Mw
|
||||
moment_mag = MomentMagnitude(corr_dat, evt, parameter.get('vp'),
|
||||
parameter.get('Qp'),
|
||||
parameter.get('rho'), True,
|
||||
iplot)
|
||||
# update pick with moment property values (w0, fc, Mo)
|
||||
for stats, props in moment_mag.moment_props.items():
|
||||
if stats in picks:
|
||||
picks[stats]['P'].update(props)
|
||||
evt = moment_mag.updated_event()
|
||||
net_mw = moment_mag.net_magnitude()
|
||||
if net_mw is not None:
|
||||
print("Network moment magnitude: %4.1f" % net_mw.mag)
|
||||
# calculate local (Richter) magntiude
|
||||
WAscaling = parameter.get('WAscaling')
|
||||
magscaling = parameter.get('magscaling')
|
||||
local_mag = LocalMagnitude(corr_dat, evt,
|
||||
parameter.get('sstop'),
|
||||
WAscaling, True, iplot)
|
||||
# update pick with local magnitude property values
|
||||
for stats, amplitude in local_mag.amplitudes.items():
|
||||
if stats in picks:
|
||||
picks[stats]['S']['Ao'] = amplitude.generic_amplitude
|
||||
print("Local station magnitudes scaled with:")
|
||||
print("log(Ao) + %f * log(r) + %f * r + %f" % (WAscaling[0],
|
||||
WAscaling[1],
|
||||
WAscaling[2]))
|
||||
evt = local_mag.updated_event(magscaling)
|
||||
net_ml = local_mag.net_magnitude(magscaling)
|
||||
if net_ml:
|
||||
print("Network local magnitude: %4.1f" % net_ml.mag)
|
||||
if magscaling is None:
|
||||
scaling = False
|
||||
elif magscaling[0] != 0 and magscaling[1] != 0:
|
||||
scaling = False
|
||||
else:
|
||||
scaling = True
|
||||
if scaling:
|
||||
print("Network local magnitude scaled with:")
|
||||
print("%f * Ml + %f" % (magscaling[0], magscaling[1]))
|
||||
else:
|
||||
print("autoPyLoT: No NLLoc-location file available! Stop iteration!")
|
||||
locflag = 9
|
||||
##########################################################
|
||||
# write phase files for various location
|
||||
# and fault mechanism calculation routines
|
||||
# ObsPy event object
|
||||
if evt is not None:
|
||||
event_id = eventpath.split('/')[-1]
|
||||
evt.resource_id = ResourceIdentifier('smi:local/' + event_id)
|
||||
data.applyEVTData(evt, 'event')
|
||||
data.applyEVTData(picks)
|
||||
if savexml:
|
||||
if savepath == 'None' or savepath is None:
|
||||
saveEvtPath = eventpath
|
||||
else:
|
||||
saveEvtPath = savepath
|
||||
fnqml = '%s/PyLoT_%s_autopylot' % (saveEvtPath, evID)
|
||||
data.exportEvent(fnqml, fnext='.xml', fcheck=['auto', 'magnitude', 'origin'])
|
||||
if locflag == 1:
|
||||
# HYPO71
|
||||
hypo71file = '%s/PyLoT_%s_HYPO71_phases' % (eventpath, evID)
|
||||
hypo71.export(picks, hypo71file, parameter)
|
||||
# HYPOSAT
|
||||
hyposatfile = '%s/PyLoT_%s_HYPOSAT_phases' % (eventpath, evID)
|
||||
hyposat.export(picks, hyposatfile, parameter)
|
||||
# VELEST
|
||||
velestfile = '%s/PyLoT_%s_VELEST_phases.cnv' % (eventpath, evID)
|
||||
velest.export(picks, velestfile, evt, parameter)
|
||||
# hypoDD
|
||||
hypoddfile = '%s/PyLoT_%s_hypoDD_phases.pha' % (eventpath, evID)
|
||||
hypodd.export(picks, hypoddfile, parameter, evt)
|
||||
# FOCMEC
|
||||
focmecfile = '%s/PyLoT_%s_FOCMEC.in' % (eventpath, evID)
|
||||
focmec.export(picks, focmecfile, parameter, evt)
|
||||
# HASH
|
||||
hashfile = '%s/PyLoT_%s_HASH' % (eventpath, evID)
|
||||
hash.export(picks, hashfile, parameter, evt)
|
||||
|
||||
endsplash = '''------------------------------------------\n'
|
||||
-----Finished event %s!-----\n'
|
||||
------------------------------------------'''.format \
|
||||
(version=_getVersionString()) % evID
|
||||
print(endsplash)
|
||||
locflag = glocflag
|
||||
if locflag == 0:
|
||||
print("autoPyLoT was running in non-location mode!")
|
||||
|
||||
# save picks for current event ID to dictionary with ALL picks
|
||||
allpicks[evID] = picks
|
||||
|
||||
endsp = '''####################################\n
|
||||
************************************\n
|
||||
*********autoPyLoT terminates*******\n
|
||||
The Python picking and Location Tool\n
|
||||
************************************'''.format(version=_getVersionString())
|
||||
print(endsp)
|
||||
return allpicks
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# parse arguments
|
||||
parser = argparse.ArgumentParser(
|
||||
description='''autoPyLoT automatically picks phase onset times using higher order statistics,
|
||||
autoregressive prediction and AIC followed by locating the seismic events using
|
||||
NLLoc''')
|
||||
|
||||
parser.add_argument('-i', '-I', '--inputfile', type=str,
|
||||
action='store',
|
||||
help='''full path to the file containing the input
|
||||
parameters for autoPyLoT''')
|
||||
parser.add_argument('-p', '-P', '--iplot', type=int,
|
||||
action='store', default=0,
|
||||
help='''optional, logical variable for plotting: 0=none, 1=partial, 2=all''')
|
||||
parser.add_argument('-f', '-F', '--fnames', type=str,
|
||||
action='store',
|
||||
help='''optional, list of data file names''')
|
||||
parser.add_argument('-e', '--eventid', type=str,
|
||||
action='store',
|
||||
help='''optional, event path incl. event ID''')
|
||||
parser.add_argument('-s', '-S', '--spath', type=str,
|
||||
action='store',
|
||||
help='''optional, save path for autoPyLoT output''')
|
||||
parser.add_argument('-c', '-C', '--ncores', type=int,
|
||||
action='store', default=0,
|
||||
help='''optional, number of CPU cores used for parallel processing (default: all available(=0))''')
|
||||
parser.add_argument('-dmt', '-DMT', '--obspy_dmt_wfpath', type=str,
|
||||
action='store', default=False,
|
||||
help='''optional, wftype (raw, processed) used for obspyDMT database structure''')
|
||||
|
||||
cla = parser.parse_args()
|
||||
|
||||
picks = autoPyLoT(inputfile=str(cla.inputfile), fnames=str(cla.fnames),
|
||||
eventid=str(cla.eventid), savepath=str(cla.spath),
|
||||
ncores=cla.ncores, iplot=int(cla.iplot), obspyDMT_wfpath=str(cla.obspy_dmt_wfpath))
|
||||
12
autopylot.sh
Normal file
@@ -0,0 +1,12 @@
|
||||
#!/bin/bash
|
||||
|
||||
#$ -l low
|
||||
#$ -cwd
|
||||
#$ -pe smp 40
|
||||
##$ -l mem=3G
|
||||
#$ -l h_vmem=6G
|
||||
#$ -l os=*stretch
|
||||
|
||||
conda activate pylot_311
|
||||
|
||||
python ./autoPyLoT.py -i /home/marcel/.pylot/pylot_adriaarray.in -c 20 -dmt processed
|
||||
474
docs/gui.md
Normal file
@@ -0,0 +1,474 @@
|
||||
# PyLoT Documentation
|
||||
|
||||
- [PyLoT Documentation](#pylot-documentation)
|
||||
- [PyLoT GUI](#pylot-gui)
|
||||
- [First start](#first-start)
|
||||
- [Main Screen](#main-screen)
|
||||
- [Waveform Plot](#waveform-plot)
|
||||
- [Mouse view controls](#mouse-view-controls)
|
||||
- [Buttons](#buttons)
|
||||
- [Array Map](#array-map)
|
||||
- [Eventlist](#eventlist)
|
||||
- [Usage](#usage)
|
||||
- [Projects and Events](#projects-and-events)
|
||||
- [Event folder structure](#event-folder-structure)
|
||||
- [Loading event information from CSV file](#loading-event-information-from-csv-file)
|
||||
- [Adding events to project](#adding-events-to-project)
|
||||
- [Saving projects](#saving-projects)
|
||||
- [Adding metadata](#adding-metadata)
|
||||
- [Picking](#picking)
|
||||
- [Manual Picking](#manual-picking)
|
||||
- [Picking window](#picking-window)
|
||||
- [Picking Window Settings](#picking-window-settings)
|
||||
- [Filtering](#filtering)
|
||||
- [Export and Import of manual picks](#export-and-import-of-manual-picks)
|
||||
- [Export](#export)
|
||||
- [Import](#import)
|
||||
- [Automatic Picking](#automatic-picking)
|
||||
- [Tuning](#tuning)
|
||||
- [Production run of the autopicker](#production-run-of-the-autopicker)
|
||||
- [Evaluation of automatic picks](#evaluation-of-automatic-picks)
|
||||
- [1. Jackknife check](#1-jackknife-check)
|
||||
- [2. Wadati check](#2-wadati-check)
|
||||
- [Comparison between automatic and manual picks](#comparison-between-automatic-and-manual-picks)
|
||||
- [Export and Import of automatic picks](#export-and-import-of-automatic-picks)
|
||||
- [Location determination](#location-determination)
|
||||
- [FAQ](#faq)
|
||||
|
||||
# PyLoT GUI
|
||||
|
||||
This section describes how to use PyLoT graphically to view waveforms and create manual or automatic picks.
|
||||
|
||||
## First start
|
||||
|
||||
After opening PyLoT for the first time, the setup routine asks for the following information:
|
||||
|
||||
Questions:
|
||||
|
||||
1. Full Name
|
||||
2. Authority: Enter authority/institution name
|
||||
3. Format: Enter output format (*.xml, *.cnv, *.obs)
|
||||
|
||||
[//]: <> (TODO: explain what these things mean, where they are used)
|
||||
|
||||
## Main Screen
|
||||
|
||||
After entering the [information](#first-start), PyLoTs main window is shown. It defaults to a view of
|
||||
the [Waveform Plot](#waveform-plot), which starts empty.
|
||||
|
||||
<img src=images/gui/pylot-main-screen.png alt="Tune autopicks button" title="Tune autopicks button">
|
||||
|
||||
Add trace data by [loading a project](#projects-and-events) or by [adding event data](#adding-events-to-project).
|
||||
|
||||
### Waveform Plot
|
||||
|
||||
The waveform plot shows a trace list of all stations of an event.
|
||||
Click on any trace to open the stations [picking window](#picking-window), where you can review automatic and manual
|
||||
picks.
|
||||
|
||||
<img src=images/gui/pylot-waveform-plot.png alt="A Waveform Plot showing traces of one event">
|
||||
|
||||
Above the traces the currently displayed event can be selected. In the bottom bar information about the trace under the
|
||||
mouse cursor is shown. This information includes the station name (station), the absolute UTC time (T) of the point
|
||||
under the mouse cursor and the relative time since the first trace start in seconds (t) as well as a trace count.
|
||||
|
||||
#### Mouse view controls
|
||||
|
||||
Hold left mouse button and drag to pan view.
|
||||
|
||||
Hold right mouse button and Direction | Result --- | --- Move the mouse up | Increase amplitude scale Move the mouse
|
||||
down | Decrease amplitude scale Move the mouse right | Increase time scale Move the mouse left | Decrease time scale
|
||||
|
||||
Press right mouse button and click "View All" from the context menu to reset the view.
|
||||
|
||||
#### Buttons
|
||||
|
||||
[//]: <> (Hack: We need these invisible spaces to add space to the first column, otherwise )
|
||||
|
||||
| Icon | Description |
|
||||
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| <img src="../icons/newfile.png" alt="Create new project" width="64" height="64"> | Create a new project, for more information about projects see [Projects and Events](#projects-and-events). |
|
||||
| <img src="../icons/openproject.png" alt="Open project" width="64" height="64"> | Load a project file from disk. |
|
||||
| <img src="../icons/saveproject.png" alt="Save Project" width="64" height="64"> | Save all current events into an associated project file on disk. If there is no project file currently associated, you will be asked to create a new one. |
|
||||
| <img src="../icons/saveprojectas.png" alt="Save Project as" width="64" height="64"> | Save all current events into a new project file on disk. See [Saving projects](#saving-projects). |
|
||||
| <img src="../icons/add.png" alt="Add event data" width="64" height="64"> | Add event data by selecting directories containing waveforms. For more information see [Event folder structure](#event-folder-structure). |
|
||||
| <img src="../icons/openpick.png" alt="Load event information" width="64" height="64"> | Load picks/origins from disk into the currently displayed event. If a pick already exists for a station, the one from file will overwrite the existing one. |
|
||||
| <img src="../icons/openpicks.png" alt="Load information for all events" width="64" height="64"> | Load picks/origins for all events of the current project. PyLoT searches for files within the directory of the event and tries to load them for that event. For this function to work, the files containing picks/origins have to be named as described in [Event folder structure](#event-folder-structure). If a pick already exists for a station, the one from file will overwrite the existing one. |
|
||||
| <img src="../icons/savepicks.png" alt="Save picks" width="64" height="64"> | Save event information such as picks and origin to file. You will be asked to select a directory in which this information should be saved. |
|
||||
| <img src="../icons/openloc.png" alt="Load location information" width="64" height="64"> | Load location information from disk, |
|
||||
| <img src="../icons/Matlab_PILOT_icon.png" alt="Load legacy information" width="64" height="64"> | Load event information from a previous, MatLab based PILOT version. |
|
||||
| <img src="../icons/key_Z.png" alt="Display Z" width="64" height="64"> | Display Z component of streams in waveform plot. |
|
||||
| <img src="../icons/key_N.png" alt="Display N" width="64" height="64"> | Display N component of streams in waveform plot. |
|
||||
| <img src="../icons/key_E.png" alt="Display E" width="64" height="64"> | Display E component of streams in waveform plot. |
|
||||
| <img src="../icons/tune.png" alt="Tune Autopicker" width="64" height="64"> | Open the [Tune Autopicker window](#tuning). |
|
||||
| <img src="../icons/autopylot_button.png" alt="" width="64" height="64"> | Opens a window that allows starting the autopicker for all events ([Production run of the AutoPicker](#production-run-of-the-autopicker)). |
|
||||
| <img src="../icons/compare_button.png" alt="Comparison" width="64" height="64"> | Compare automatic and manual picks, only available if automatic and manual picks for an event exist. See [Comparison between automatic and manual picks](#comparison-between-automatic-and-manual-picks). |
|
||||
| <img src="../icons/locate_button.png" alt="Locate event" width="64" height="64"> | Run a location routine (NonLinLoc) as configured in the settings on the picks. See [Location determination](#location-determination). |
|
||||
|
||||
### Array Map
|
||||
|
||||
The array map will display a color diagram to allow a visual check of the consistency of picks across multiple stations.
|
||||
This works by calculating the time difference of every onset to the earliest onset. Then isolines are drawn between
|
||||
stations with the same time difference and the areas between isolines are colored.
|
||||
The result should resemble a color gradient as the wavefront rolls over the network area. Stations where picks are
|
||||
earlier/later than their neighbours can be reviewed by clicking on them, which opens
|
||||
the [picking window](#picking-window).
|
||||
|
||||
Above the Array Map the picks that are used to create the map can be customized. The phase of picks that should be used
|
||||
can be selected, which allows checking the consistency of the P- and S-phase separately. Additionally the pick type can
|
||||
be set to manual, automatic or hybrid, meaning display only manual picks, automatic picks or only display automatic
|
||||
picks for stations where there are no manual ones.
|
||||
|
||||

|
||||
*Array Map for an event at the Northern Mid Atlantic Ridge, between North Africa and Mexico (Lat. 22.58, Lon. -45.11).
|
||||
The wavefront moved from west to east over the network area (Alps and Balcan region), with the earliest onsets in blue
|
||||
in the west.*
|
||||
|
||||
To be able to display an array map PyLoT needs to load an inventory file, where the metadata of seismic stations is
|
||||
kept. For more information see [Metadata](#adding-metadata). Additionally automatic or manual picks need to exist for
|
||||
the current event.
|
||||
|
||||
### Eventlist
|
||||
|
||||
The eventlist displays event parameters. The displayed parameters are saved in the .xml file in the event folder. Events
|
||||
can be deleted from the project by pressing the red X in the leftmost column of the corresponding event.
|
||||
|
||||
<img src="images/gui/eventlist.png" alt="Eventlist">
|
||||
|
||||
| Column | Description |
|
||||
|------------|--------------------------------------------------------------------------------------------------------------------|
|
||||
| Event | Full path to the events folder. |
|
||||
| Time | Time of event. |
|
||||
| Lat | Latitude in degrees of event location. |
|
||||
| Lon | Longitude in degrees of event location. |
|
||||
| Depth | Depth in km of event. |
|
||||
| Mag | Magnitude of event. |
|
||||
| [N] MP | Number of manual picks. |
|
||||
| [N] AP | Number of automatic picks. |
|
||||
| Tuning Set | Select whether this event is a Tuning event. See [Automatic Picking](#automatic-picking). |
|
||||
| Test Set | Select whether this event is a Test event. See [Automatic Picking](#automatic-picking). |
|
||||
| Notes | Free form text field for notes regarding this event. Text will be saved in the notes.txt file in the event folder. |
|
||||
|
||||
## Usage
|
||||
|
||||
### Projects and Events
|
||||
|
||||
PyLoT uses projects to categorize different seismic data. A project consists of one or multiple events. Events contain
|
||||
seismic traces from one or multiple stations. An event also contains further information, e.g. origin time, source
|
||||
parameters and automatic as well as manual picks. Projects are used to group events which should be analysed together. A
|
||||
project could contain all events from a specific region within a timeframe of interest or all recorded events of a
|
||||
seismological experiment.
|
||||
|
||||
### Event folder structure
|
||||
|
||||
PyLoT expects the following folder structure for seismic data:
|
||||
|
||||
* Every event should be in it's own folder with the following naming scheme for the folders:
|
||||
``e[id].[doy].[yy]``, where ``[id]`` is a four-digit numerical id increasing from 0001, ``[doy]`` the three digit day
|
||||
of year and ``[yy]`` the last two digits of the year of the event. This structure has to be created by the user of
|
||||
PyLoT manually.
|
||||
* These folders should contain the seismic data for their event as ``.mseed`` or other supported filetype
|
||||
* All automatic and manual picks should be in an ``.xml`` file in their event folder. PyLoT saves picks in this file.
|
||||
This file does not have to be added manually unless there are picks to be imported. The format used to save picks is
|
||||
QUAKEML.
|
||||
Picks are saved in a file with the same filename as the event folder with ``PyLoT_`` prepended.
|
||||
* The file ``notes.txt`` is used for saving analysts comments. Everything saved here will be displayed in the 'Notes'
|
||||
column of the eventlist.
|
||||
|
||||
### Loading event information from CSV file
|
||||
|
||||
Event information can be saved in a ``.csv`` file located in the rootpath. The file is made from one header line, which
|
||||
is followed by one or multiple data lines. Values are separated by comma, while a dot is used as a decimal separator.
|
||||
This information is then shown in the table in the [Eventlist tab](#Eventlist).
|
||||
|
||||
One example header and data line is shown below.
|
||||
```event,Date,Time,Magnitude,Lat,Long,Depth,Region,Basis Lat,Basis Long,Distance [km],Distance [rad],Distance [deg]```
|
||||
```e0001.024.16,24/01/16,10:30:30,7.1,59.66,-153.45,128,Southern Alaska,46.62,10.26,8104.65,1.27,72.89,7.1```
|
||||
|
||||
The meaning of the header entries is:
|
||||
|
||||
| Header | description |
|
||||
|----------------------|------------------------------------------------------------------------------------------------|
|
||||
| event | Event id, has to be the same as the folder name in which waveform data for this event is kept. |
|
||||
| Data | Origin date of the event, format DD/MM/YY or DD/MM/YYYY. |
|
||||
| Time | Origin time of the event. Format HH:MM:SS. |
|
||||
| Lat, Long | Origin latitude and longitude in decimal degrees. |
|
||||
| Region | Flinn-Engdahl region name. |
|
||||
| Basis Lat, Basis Lon | Latitude and longitude of the basis of the station network in decimal degrees. |
|
||||
| Distance [km] | Distance from origin coordinates to basis coordinates in km. |
|
||||
| Distance [rad] | Distance from origin coordinates to basis coordinates in rad. |
|
||||
|
||||
### Adding events to project
|
||||
|
||||
PyLoT GUI starts with an empty project. To add events, use the add event data button. Select one or multiple folders
|
||||
containing events.
|
||||
|
||||
[//]: <> (TODO: explain _Directories: Root path, Data path, Database path_)
|
||||
|
||||
### Saving projects
|
||||
|
||||
Save the current project from the menu with File->Save project or File->Save project as. PyLoT uses ``.plp`` files to
|
||||
save project information. This file format is not interchangeable between different versions of Python interpreters.
|
||||
Saved projects contain the automatic and manual picks. Seismic trace data is not included into the ``.plp`` file, but
|
||||
read from its location used when saving the file.
|
||||
|
||||
### Adding metadata
|
||||
|
||||
[//]: <> (TODO: Add picture of metadata "manager" when it is done)
|
||||
|
||||
PyLoT can handle ``.dless``, ``.xml``, ``.resp`` and ``.dseed`` file formats for Metadata. Metadata files stored on disk
|
||||
can be added to a project by clicking *Edit*->*Manage Inventories*. This opens up a window where the folders which
|
||||
contain metadata files can be selected. PyLoT will then search these files for the station names when it needs the
|
||||
information.
|
||||
|
||||
# Picking
|
||||
|
||||
PyLoTs automatic and manual pick determination works as following:
|
||||
|
||||
* Using certain parameters, a first initial/coarse pick is determined. The first manual pick is determined by visual
|
||||
review of the whole waveform and selection of the most likely onset by the analyst. The first automatic pick is
|
||||
determined by calculation of a characteristic function (CF) for the seismic trace. When a wave arrives, the CFs
|
||||
properties change, which is determined as the signals onset.
|
||||
* Afterwards, a refined set of parameters is applied to a small part of the waveform around the initial onset. For
|
||||
manual picks this means a closer view of the trace, for automatic picks this is done by a recalculated CF with
|
||||
different parameters.
|
||||
* This second picking phase results in the precise pick, which is treated as the onset time.
|
||||
|
||||
## Manual Picking
|
||||
|
||||
To create manual picks, you will need to open or create a project that contains seismic trace data (
|
||||
see [Adding events to projects](#adding-events-to-project)). Click on a trace to open
|
||||
the [Picking window](#picking-window).
|
||||
|
||||
### Picking window
|
||||
|
||||
Open the picking window of a station by leftclicking on any trace in the waveform plot. Here you can create manual picks
|
||||
for the selected station.
|
||||
|
||||
<img src="images/gui/picking/pickwindow.png" alt="Picking window">
|
||||
|
||||
*Picking window of a station.*
|
||||
|
||||
#### Picking Window Settings
|
||||
|
||||
| Icon | Shortcut | Menu Alternative | Description |
|
||||
|----------------------------------------------------------------------------------|----------------|-----------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| <img src="../icons/filter_p.png" alt="Filter P" width="64" height="64"> | p | Filter->Apply P Filter | Filter all channels according to the options specified in Filter parameter, P Filter section. |
|
||||
| <img src="../icons/filter_s.png" alt="Filter S" width="64" height="64"> | s | Filter->Apply S Filter | Filter all channels according to the options specified in Filter parameter, S Filter section. |
|
||||
| <img src="../icons/key_A.png" alt="Filter Automatically" width="64" height="64"> | Ctrl + a | Filter->Automatic Filtering | If enabled, automatically select the correct filter option (P, S) depending on the selected phase to be picked. |
|
||||
|  | 1 (P) or 5 (S) | Picks->P or S | Select phase to pick. If Automatic Filtering is enabled, this will apply the appropriate filter depending on the phase. |
|
||||
|  | - | - | Zoom into waveform. |
|
||||
|  | - | - | Reset zoom to default view. |
|
||||
|  | - | - | Delete all manual picks on this station. |
|
||||
|  | - | - | Click this button and then the picked phase to rename it. |
|
||||
|  | - | - | If checked, after accepting the manual picks for this station with 'OK', the picking window for the next station will be opened. This option is useful for fast manual picking of a complete event. |
|
||||
| Estimated onsets | - | - | Show the theoretical onsets for this station. Needs metadata and origin information. |
|
||||
| Compare to channel | - | - | Select a data channel to compare against. The selected channel will be displayed in the picking window behind every channel allowing the analyst to visually compare signal correlation between different channels. |
|
||||
| Scaling | - | - | Individual means every channel is scaled to its own maximum. If a channel is selected here, all channels will be scaled relatively to this channel. |
|
||||
|
||||
| Menu Command | Shortcut | Description |
|
||||
|---------------------------|----------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| P Channels and S Channels | - | Select which channels should be treated as P or S channels during picking. When picking a phase, only the corresponding channels will be shown during the precise pick. Normally, the Z channel should be selected for the P phase and the N and E channel for the S phase. |
|
||||
|
||||
### Filtering
|
||||
|
||||
Access the Filter options by pressing Ctrl+f on the Waveform plot or by the menu under *Edit*->*Filter Parameter*.
|
||||
|
||||
<img src=images/gui/pylot-filter-options.png>
|
||||
|
||||
Here you are able to select filter type, order and frequencies for the P and S pick separately. These settings are used
|
||||
in the GUI for displaying the filtered waveform data and during manual picking. The values used by PyLoT for automatic
|
||||
picking are displayed next to the manual values. They can be changed in the [Tune Autopicker dialog](#tuning).
|
||||
A green value automatic value means the automatic and manual filter parameter is configured the same, red means they are
|
||||
configured differently. By toggling the "Overwrite filteroptions" checkmark you can set whether the manual
|
||||
precise/second pick uses the filter settings for the automatic picker (unchecked) or whether it uses the filter options
|
||||
in this dialog (checked). To guarantee consistent picking results between automatic and manual picking it is recommended
|
||||
to use the same filter settings for the determination of automatic and manual picks.
|
||||
|
||||
### Export and Import of manual picks
|
||||
|
||||
#### Export
|
||||
|
||||
After the creation of manual picks they can either be saved in the project file (
|
||||
see [Saving projects](#saving-projects)). Alternatively the picks can be exported by pressing
|
||||
the <img src="../icons/savepicks.png" alt="Save event information button" title="Save picks button" height=24 width=24>
|
||||
button above the waveform plot or in the menu File->Save event information (shortcut Ctrl+p). Select the event directory
|
||||
in which to save the file. The filename will be ``PyLoT_[event_folder_name].[filetype selected during first startup]``
|
||||
.
|
||||
You can rename and copy this file, but PyLoT will then no longer be able to automatically recognize the correct picks
|
||||
for an event and the file will have to be manually selected when loading.
|
||||
|
||||
#### Import
|
||||
|
||||
To import previously saved picks press
|
||||
the <img src="../icons/openpick.png" alt="Load event information button" width="24" height="24"> button and select the
|
||||
file to load. You will be asked to save the current state of your project if you have not done so before. You can
|
||||
continue without saving by pressing "Discard". This does not delete any information from your project, it just means
|
||||
that no project file is saved before the changes of importing picks are applied. PyLoT will automatically load files
|
||||
named after the scheme it uses when saving picks, described in the paragraph above. If it can't find any matching files,
|
||||
a file dialogue will open and you can select the file you wish to load.
|
||||
|
||||
If you see a warning "Mismatch in event identifiers" and are asked whether to continue loading the picks, this means
|
||||
that PyLoT doesn't recognize the picks in the file as belonging to this specific event. They could have either been
|
||||
saved under a different installation of PyLoT but with the same waveform data, which means they are still compatible and
|
||||
you can continue loading them. Or they could be picks from a different event, in which case loading them is not
|
||||
recommended.
|
||||
|
||||
## Automatic Picking
|
||||
|
||||
The general workflow for automatic picking is as following:
|
||||
|
||||
- After setting up the project by loading waveforms and optionally metadata, the right parameters for the autopicker
|
||||
have to be determined
|
||||
- This [tuning](#tuning) is done for single stations with immediate graphical feedback of all picking results
|
||||
- Afterwards the autopicker can be run for all or a subset of events from the project
|
||||
|
||||
For automatic picking PyLoT discerns between tune and test events, which the user has to set as such. Tune events are
|
||||
used to calibrate the autopicking algorithm, test events are then used to test the calibration. The purpose of that is
|
||||
controlling whether the parameters found during tuning are able to reliably pick the "unknown" test events.
|
||||
If this behaviour is not desired and all events should be handled the same, dont mark any events. Since this is just a
|
||||
way to group events to compare the picking results, nothing else will change.
|
||||
|
||||
### Tuning
|
||||
|
||||
Tuning describes the process of adjusting the autopicker settings to the characteristics of your data set. To do this in
|
||||
PyLoT, use the <img src=../icons/tune.png height=24 alt="Tune autopicks button" title="Tune autopicks button"> button to
|
||||
open the Tune Autopicker.
|
||||
|
||||
<img src=images/gui/tuning/tune_autopicker.png>
|
||||
|
||||
View of a station in the Tune Autopicker window.
|
||||
|
||||
1. Select the event to be displayed and processed.
|
||||
2. Select the station from the event.
|
||||
3. To pick the currently displayed trace, click
|
||||
the <img src=images/gui/tuning/autopick_trace_button.png alt="Pick trace button" title="Autopick trace button" height=16>
|
||||
button.
|
||||
4. These tabs are used to select the current view. __Traces Plot__ contains a plot of the stations traces, where manual
|
||||
picks can be created/edited. __Overview__ contains graphical results of the automatic picking process. The __P and S
|
||||
tabs__ contain the automatic picking results of the P and S phase, while __log__ contains a useful text output of
|
||||
automatic picking.
|
||||
5. These buttons are used to load/save/reset settings for automatic picking. The parameters can be saved in PyLoT input
|
||||
files, which have the file ending *.in*. They are human readable text files, which can also be edited by hand. Saving
|
||||
the parameters allows you to load them again later, even on different machines.
|
||||
6. These menus control the behaviour of the creation of manual picks from the Tune Autopicker window. Picks allows to
|
||||
select the phase for which a manual pick should be created, Filter allows to filter waveforms and edit the filter
|
||||
parameters. P-Channels and S-Channels allow to select the channels that should be displayed when creating a manual P
|
||||
or S pick.
|
||||
7. This menu is the same as in the [Picking Window](#picking-window-settings), with the exception of the __Manual
|
||||
Onsets__ options. The __Manual Onsets__ buttons accepts or reject the manual picks created in the Tune Autopicker
|
||||
window, pressing accept adds them to the manual picks for the event, while reject removes them.
|
||||
8. The traces plot in the centre allows creating manual picks and viewing the waveforms.
|
||||
9. The parameters which influence the autopicking result are in the Main settings and Advanced settings tabs on the left
|
||||
side. For a description of all the parameters see the [tuning documentation](tuning.md).
|
||||
|
||||
### Production run of the autopicker
|
||||
|
||||
After the settings used during tuning give the desired results, the autopicker can be used on the complete dataset. To
|
||||
invoke the autopicker on the whole set of events, click
|
||||
the <img src=../icons/autopylot_button.png alt="Autopick" title="Autopick" height=32> button.
|
||||
|
||||
### Evaluation of automatic picks
|
||||
|
||||
PyLoT has two internal consistency checks for automatic picks that were determined for an event:
|
||||
|
||||
1. Jackknife check
|
||||
2. Wadati check
|
||||
|
||||
#### 1. Jackknife check
|
||||
|
||||
The jackknife test in PyLoT checks the consistency of automatically determined P-picks by checking the statistical
|
||||
variance of the picks. The variance of all P-picks is calculated and compared to the variance of subsets, in which one
|
||||
pick is removed.
|
||||
The idea is, that picks that are close together in time should not influence the estimation of the variance much, while
|
||||
picks whose positions deviates from the norm influence the variance to a greater extent. If the estimated variance of a
|
||||
subset with a pick removed differs to much from the estimated variance of all picks, the pick that was removed from the
|
||||
subset will be marked as invalid.
|
||||
The factor by which picks are allowed to skew from the estimation of variance can be configured, it is called *
|
||||
jackfactor*, see [here](tuning.md#Pick-quality-control).
|
||||
|
||||
Additionally, the deviation of picks from the median is checked. For that, the median of all P-picks that passed the
|
||||
Jackknife test is calculated. Picks whose onset times deviate from the mean onset time by more than the *mdttolerance*
|
||||
are marked as invalid.
|
||||
|
||||
<img src=images/gui/jackknife_plot.png title="Jackknife/Median test diagram">
|
||||
|
||||
*The result of both tests (Jackknife and Median) is shown in a diagram afterwards. The onset time is plotted against a
|
||||
running number of stations. Picks that failed either the Jackknife or the median test are colored red. The median is
|
||||
plotted as a green line.*
|
||||
|
||||
The Jackknife and median check are suitable to check for picks that are outside of the expected time window, for
|
||||
example, when a wrong phase was picked. It won't recognize picks that are in close proximity to the right onset which
|
||||
are just slightly to late/early.
|
||||
|
||||
#### 2. Wadati check
|
||||
|
||||
The Wadati check checks the consistency of S picks. For this the SP-time, the time difference between S and P onset is
|
||||
plotted against the P onset time. A line is fitted to the points, which minimizes the error. Then the deviation of
|
||||
single picks to this line is checked. If the deviation in seconds is above the *wdttolerance*
|
||||
parameter ([see here](tuning.md#Pick-quality-control)), the pick is marked as invalid.
|
||||
|
||||
<img src=images/gui/wadati_plot.png title="Output diagram of Wadati check">
|
||||
|
||||
*The Wadati plot in PyLoT shows the SP onset time difference over the P onset time. A first line is fitted (black). All
|
||||
picks which deviate to much from this line are marked invalid (red). Then a second line is fitted which excludes the
|
||||
invalid picks. From this lines slope, the ratio of P and S wave velocity is determined.*
|
||||
|
||||
### Comparison between automatic and manual picks
|
||||
|
||||
Every pick in PyLoT consists of an earliest possible, latest possible and most likely onset time. The earliest and
|
||||
latest possible onset time characterize the uncertainty of a pick. This approach is described in Diel, Kissling and
|
||||
Bormann (2012) - Tutorial for consistent phase picking at local to regional distances. These times are represented as a
|
||||
Probability Density Function (PDF) for every pick. The PDF is implemented as two exponential distributions around the
|
||||
most likely onset as the expected value.
|
||||
|
||||
To compare two single picks, their PDFs are cross correlated to create a new PDF. This corresponds to the subtraction of
|
||||
the automatic pick from the manual pick.
|
||||
|
||||
<img src=images/gui/comparison/comparison_pdf.png title="Comparison between automatic and manual pick">
|
||||
|
||||
*Comparison between an automatic and a manual pick for a station in PyLoT by comparing their PDFs.*
|
||||
*The upper plot shows the difference between the two single picks that are shown in the lower plot.*
|
||||
*The difference is implemented as a cross correlation between the two PDFs. and results in a new PDF, the comparison
|
||||
PDF.*
|
||||
*The expected value of the comparison PDF corresponds to the time distance between the automatic and manual picks most
|
||||
likely onset.*
|
||||
*The standard deviation corresponds to the combined uncertainty.*
|
||||
|
||||
To compare the automatic and manual picks between multiple stations of an event, the properties of all the comparison
|
||||
PDFs are shown in a histogram.
|
||||
|
||||
<img src=images/gui/comparison/compare_widget.png title="Comparison between picks of an event">
|
||||
|
||||
*Comparison between the automatic and manual picks for an event in PyLoT.*
|
||||
*The top left plot shows the standard deviation of the comparison PDFs for P picks.*
|
||||
*The bottom left plot shows the expected values of the comparison PDFs for P picks.*
|
||||
*The top right plot shows the standard deviation of the comparison PDFs for S picks.*
|
||||
*The bottom right plot shows the expected values of the comparison PDFs for S picks.*
|
||||
*The standard deviation plots show that most P picks have an uncertainty between 1 and 2 seconds, while S pick
|
||||
uncertainties have a much larger spread between 1 to 15 seconds.*
|
||||
*This means P picks have higher quality classes on average than S picks.*
|
||||
*The expected values are largely negative, meaning that the algorithm tends to pick earlier than the analyst with the
|
||||
applied settings (Manual - Automatic).*
|
||||
*The number of samples mentioned in the plots legends is the amount of stations that have an automatic and a manual P
|
||||
pick.*
|
||||
|
||||
### Export and Import of automatic picks
|
||||
|
||||
Picks can be saved in *.xml* format.
|
||||
|
||||
# Location determination
|
||||
|
||||
To be added.
|
||||
|
||||
# FAQ
|
||||
|
||||
Q: During manual picking the error "No channel to plot for phase ..." is displayed, and I am unable to create a pick.
|
||||
A: Select a channel that should be used for the corresponding phase in the Pickwindow. For further information
|
||||
read [Picking Window settings](#picking-window-settings).
|
||||
|
||||
Q: I see a warning "Mismatch in event identifiers" when loading picks from a file.
|
||||
A: This means that PyLoT doesn't recognize the picks in the file as belonging to this specific event. They could have
|
||||
been saved under a different installation of PyLoT but with the same waveform data, which means they are still
|
||||
compatible and you can continue loading them or they could be the picks of a different event, in which case loading them
|
||||
is not recommended.
|
||||
BIN
docs/gui.pdf
Normal file
BIN
docs/images/gui/arraymap-example.png
Normal file
|
After Width: | Height: | Size: 1.6 MiB |
BIN
docs/images/gui/comparison/compare_widget.png
Normal file
|
After Width: | Height: | Size: 87 KiB |
BIN
docs/images/gui/comparison/comparison_pdf.png
Normal file
|
After Width: | Height: | Size: 89 KiB |
BIN
docs/images/gui/eventlist.png
Normal file
|
After Width: | Height: | Size: 191 KiB |
BIN
docs/images/gui/jackknife_plot.png
Normal file
|
After Width: | Height: | Size: 123 KiB |
BIN
docs/images/gui/picking/continue.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
docs/images/gui/picking/filterphase.png
Normal file
|
After Width: | Height: | Size: 2.6 KiB |
BIN
docs/images/gui/picking/phase_selection.png
Normal file
|
After Width: | Height: | Size: 597 B |
BIN
docs/images/gui/picking/pickwindow.png
Normal file
|
After Width: | Height: | Size: 166 KiB |
BIN
docs/images/gui/pylot-filter-options.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
docs/images/gui/pylot-main-screen.png
Normal file
|
After Width: | Height: | Size: 56 KiB |
BIN
docs/images/gui/pylot-waveform-plot.png
Normal file
|
After Width: | Height: | Size: 127 KiB |
BIN
docs/images/gui/tuning/autopick_trace_button.png
Normal file
|
After Width: | Height: | Size: 876 B |
BIN
docs/images/gui/tuning/tune_autopicker.png
Normal file
|
After Width: | Height: | Size: 254 KiB |
BIN
docs/images/gui/wadati_plot.png
Normal file
|
After Width: | Height: | Size: 46 KiB |
150
docs/tuning.md
Normal file
@@ -0,0 +1,150 @@
|
||||
# AutoPyLoT Tuning
|
||||
|
||||
A description of the parameters used for determining automatic picks.
|
||||
|
||||
## Filter parameters and cut times
|
||||
|
||||
Parameters applied to the traces before picking algorithm starts.
|
||||
|
||||
| Name | Description |
|
||||
|---------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| *P Start*, *P
|
||||
Stop* | Define time interval relative to trace start time for CF calculation on vertical trace. Value is relative to theoretical onset time if 'Use TauPy' option is enabled in main settings of 'Tune Autopicker' dialogue. |
|
||||
| *S Start*, *S
|
||||
Stop* | Define time interval relative to trace start time for CF calculation on horizontal traces. Value is relative to theoretical onset time if 'Use TauPy' option is enabled in main settings of 'Tune Autopicker' dialogue. |
|
||||
| *Bandpass
|
||||
Z1* | Filter settings for Butterworth bandpass applied to vertical trace for calculation of initial P pick. |
|
||||
| *Bandpass
|
||||
Z2* | Filter settings for Butterworth bandpass applied to vertical trace for calculation of precise P pick. |
|
||||
| *Bandpass
|
||||
H1* | Filter settings for Butterworth bandpass applied to horizontal traces for calculation of initial S pick. |
|
||||
| *Bandpass
|
||||
H2* | Filter settings for Butterworth bandpass applied to horizontal traces for calculation of precise S pick. |
|
||||
|
||||
## Inital P pick
|
||||
|
||||
Parameters used for determination of initial P pick.
|
||||
|
||||
| Name | Description |
|
||||
|--------------|------------------------------------------------------------------------------------------------------------------------------|
|
||||
| *
|
||||
tLTA* | Size of gliding LTA window in seconds used for calculation of HOS-CF. |
|
||||
| *pickwin
|
||||
P* | Size of time window in seconds in which the minimum of the AIC-CF in front of the maximum of the HOS-CF is determined. |
|
||||
| *
|
||||
AICtsmooth* | Average of samples in this time window will be used for smoothing of the AIC-CF. |
|
||||
| *
|
||||
checkwinP* | Time in front of the global maximum of the HOS-CF in which to search for a second local extrema. |
|
||||
| *minfactorP* | Used with *
|
||||
checkwinP*. If a second local maximum is found, it has to be at least as big as the first maximum * *minfactorP*. |
|
||||
| *
|
||||
tsignal* | Time window in seconds after the initial P pick used for determining signal amplitude. |
|
||||
| *
|
||||
tnoise* | Time window in seconds in front of initial P pick used for determining noise amplitude. |
|
||||
| *tsafetey* | Time in seconds between *tsignal* and *
|
||||
tnoise*. |
|
||||
| *
|
||||
tslope* | Time window in seconds after initial P pick in which the slope of the onset is calculated. |
|
||||
|
||||
## Inital S pick
|
||||
|
||||
Parameters used for determination of initial S pick
|
||||
|
||||
| Name | Description |
|
||||
|---------------|------------------------------------------------------------------------------------------------------------------------------|
|
||||
| *
|
||||
tdet1h* | Length of time window in seconds in which AR params of the waveform are determined. |
|
||||
| *
|
||||
tpred1h* | Length of time window in seconds in which the waveform is predicted using the AR model. |
|
||||
| *
|
||||
AICtsmoothS* | Average of samples in this time window is used for smoothing the AIC-CF. |
|
||||
| *
|
||||
pickwinS* | Time window in which the minimum in the AIC-CF in front of the maximum in the ARH-CF is determined. |
|
||||
| *
|
||||
checkwinS* | Time in front of the global maximum of the ARH-CF in which to search for a second local extrema. |
|
||||
| *minfactorP* | Used with *
|
||||
checkwinS*. If a second local maximum is found, it has to be at least as big as the first maximum * *minfactorS*. |
|
||||
| *
|
||||
tsignal* | Time window in seconds after the initial P pick used for determining signal amplitude. |
|
||||
| *
|
||||
tnoise* | Time window in seconds in front of initial P pick used for determining noise amplitude. |
|
||||
| *tsafetey* | Time in seconds between *tsignal* and *
|
||||
tnoise*. |
|
||||
| *
|
||||
tslope* | Time window in seconds after initial P pick in which the slope of the onset is calculated. |
|
||||
|
||||
## Precise P pick
|
||||
|
||||
Parameters used for determination of precise P pick.
|
||||
|
||||
| Name | Description |
|
||||
|--------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| *Precalcwin* | Time window in seconds for recalculation of the HOS-CF. The new CF will be two times the size of *
|
||||
Precalcwin*, since it will be calculated from the initial pick to +/- *Precalcwin*. |
|
||||
| *
|
||||
tsmoothP* | Average of samples in this time window will be used for smoothing the second HOS-CF. |
|
||||
| *
|
||||
ausP* | Controls artificial uplift of samples during precise picking. A common local minimum of the smoothed and unsmoothed HOS-CF is found when the previous sample is larger or equal to the current sample times (1+*
|
||||
ausP*). |
|
||||
|
||||
## Precise S pick
|
||||
|
||||
Parameters used for determination of precise S pick.
|
||||
|
||||
| Name | Description |
|
||||
|--------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| *
|
||||
tdet2h* | Time window for determination of AR coefficients. |
|
||||
| *
|
||||
tpred2h* | Time window in which the waveform is predicted using the determined AR parameters. |
|
||||
| *Srecalcwin* | Time window for recalculation of ARH-CF. New CF will be calculated from initial pick +/- *
|
||||
Srecalcwin*. |
|
||||
| *
|
||||
tsmoothS* | Average of samples in this time window will be used for smoothing the second ARH-CF. |
|
||||
| *
|
||||
ausS* | Controls artificial uplift of samples during precise picking. A common local minimum of the smoothed and unsmoothed ARH-CF is found when the previous sample is larger or equal to the current sample times (1+*
|
||||
ausS*). |
|
||||
| *
|
||||
pickwinS* | Time window around initial pick in which to look for a precise pick. |
|
||||
|
||||
## Pick quality control
|
||||
|
||||
Parameters used for checking quality and integrity of automatic picks.
|
||||
|
||||
| Name | Description |
|
||||
|--------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| *
|
||||
minAICPslope* | Initial P picks with a slope lower than this value will be discared. |
|
||||
| *
|
||||
minAICPSNR* | Initial P picks with a SNR below this value will be discarded. |
|
||||
| *
|
||||
minAICSslope* | Initial S picks with a slope lower than this value will be discarded. |
|
||||
| *
|
||||
minAICSSNR* | Initial S picks with a SNR below this value will be discarded. |
|
||||
| *minsiglength*, *noisefacor*. *minpercent* | Parameters for checking signal length. In the time window of size *
|
||||
minsiglength* after the initial P pick *
|
||||
minpercent* of samples have to be larger than the RMS value. |
|
||||
| *
|
||||
zfac* | To recognize misattributed S picks, the RMS amplitude of vertical and horizontal traces are compared. The RMS amplitude of the vertical traces has to be at least *
|
||||
zfac* higher than the RMS amplitude on the horizontal traces for the pick to be accepted as a valid P pick. |
|
||||
| *
|
||||
jackfactor* | A P pick is removed if the jackknife pseudo value of the variance of his subgroup is larger than the variance of all picks multiplied with the *
|
||||
jackfactor*. |
|
||||
| *
|
||||
mdttolerance* | Maximum allowed deviation of P onset times from the median. Value in seconds. |
|
||||
| *
|
||||
wdttolerance* | Maximum allowed deviation of S onset times from the line during the Wadati test. Value in seconds. |
|
||||
|
||||
## Pick quality determination
|
||||
|
||||
Parameters for discrete quality classes.
|
||||
|
||||
| Name | Description |
|
||||
|------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| *
|
||||
timeerrorsP* | Width of the time windows in seconds between earliest and latest possible pick which represent the quality classes 0, 1, 2, 3 for P onsets. |
|
||||
| *
|
||||
timeerrorsS* | Width of the time windows in seconds between earliest and latest possible pick which represent the quality classes 0, 1, 2, 3 for S onsets. |
|
||||
| *nfacP*, *nfacS* | For determination of latest possible onset time. The time when the signal reaches an amplitude of *
|
||||
nfac* * mean value of the RMS amplitude in the time window *tnoise* corresponds to the latest possible onset time. |
|
||||
|
||||
BIN
docs/tuning.pdf
Normal file
19
help/index.html
Normal file
@@ -0,0 +1,19 @@
|
||||
<html>
|
||||
<head><title>PyLoT - the Python picking and Localisation Tool</title></head>
|
||||
<body>
|
||||
<p><b>PyLoT</b> is a program which is capable of picking seismic phases,
|
||||
exporting these as numerous standard phase format and localize the corresponding
|
||||
seismic event with external software as, e.g.:</p>
|
||||
<ul type="circle">
|
||||
<li><a href="http://alomax.free.fr/nlloc/index.html">NonLinLoc</a></li>
|
||||
<li>HypoInvers</li>
|
||||
<li>HypoSat</li>
|
||||
<li>whatever you want ...</li>
|
||||
</ul>
|
||||
<p>Read more on the
|
||||
<a href="https://ariadne.geophysik.rub.de/trac/PyLoT/wiki/">PyLoT WikiPage</a>.</p>
|
||||
<p>Bug reports are very much appreciated and can also be delivered on our
|
||||
<a href="https://ariadne.geophysik.rub.de/trac/PyLoT">PyLoT TracPage</a> after
|
||||
successful registration.</p>
|
||||
</body>
|
||||
</html>
|
||||
62
icons.qrc
Normal file
@@ -0,0 +1,62 @@
|
||||
<RCC>
|
||||
<qresource>
|
||||
<file>icons/pylot.ico</file>
|
||||
<file>icons/pylot.png</file>
|
||||
<file>icons/back.png</file>
|
||||
<file>icons/home.png</file>
|
||||
<file>icons/newfile.png</file>
|
||||
<file>icons/open.png</file>
|
||||
<file>icons/openproject.png</file>
|
||||
<file>icons/add.png</file>
|
||||
<file>icons/save.png</file>
|
||||
<file>icons/saveas.png</file>
|
||||
<file>icons/saveproject.png</file>
|
||||
<file>icons/saveprojectas.png</file>
|
||||
<file>icons/manupicksicon_small.png</file>
|
||||
<file>icons/autopicksicon_small.png</file>
|
||||
<file>icons/tune.png</file>
|
||||
<file>icons/autopylot_button.png</file>
|
||||
<file>icons/pick.png</file>
|
||||
<file>icons/waveform.png</file>
|
||||
<file>icons/openpick.png</file>
|
||||
<file>icons/openpicks.png</file>
|
||||
<file>icons/openpick.png</file>
|
||||
<file>icons/openpicks.png</file>
|
||||
<file>icons/savepicks.png</file>
|
||||
<file>icons/preferences.png</file>
|
||||
<file>icons/parameter.png</file>
|
||||
<file>icons/inventory.png</file>
|
||||
<file>icons/map.png</file>
|
||||
<file>icons/openloc.png</file>
|
||||
<file>icons/compare_button.png</file>
|
||||
<file>icons/pick_qualities_button.png</file>
|
||||
<file>icons/eventlist_xml_button.png</file>
|
||||
<file>icons/locate_button.png</file>
|
||||
<file>icons/Matlab_PILOT_icon.png</file>
|
||||
<file>icons/printer.png</file>
|
||||
<file>icons/delete.png</file>
|
||||
<file>icons/key_A.png</file>
|
||||
<file>icons/key_E.png</file>
|
||||
<file>icons/key_N.png</file>
|
||||
<file>icons/key_P.png</file>
|
||||
<file>icons/key_Q.png</file>
|
||||
<file>icons/key_R.png</file>
|
||||
<file>icons/key_S.png</file>
|
||||
<file>icons/key_T.png</file>
|
||||
<file>icons/key_U.png</file>
|
||||
<file>icons/key_V.png</file>
|
||||
<file>icons/key_W.png</file>
|
||||
<file>icons/key_Z.png</file>
|
||||
<file>icons/filter.png</file>
|
||||
<file>icons/filter_p.png</file>
|
||||
<file>icons/filter_s.png</file>
|
||||
<file>icons/sync.png</file>
|
||||
<file>icons/zoom_0.png</file>
|
||||
<file>icons/zoom_in.png</file>
|
||||
<file>icons/zoom_out.png</file>
|
||||
<file>splash/splash.png</file>
|
||||
</qresource>
|
||||
<qresource prefix="/help">
|
||||
<file>help/index.html</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
BIN
icons/Matlab_PILOT_icon.png
Normal file
|
After Width: | Height: | Size: 50 KiB |
BIN
icons/add.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
icons/autopicksicon_small.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
icons/autopicsicon.png
Normal file
|
After Width: | Height: | Size: 7.1 KiB |
BIN
icons/autopylot_button.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
icons/back.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
icons/compare_button.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
icons/delete.png
Normal file
|
After Width: | Height: | Size: 5.0 KiB |
BIN
icons/eventlist_xml_button.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
icons/filter.png
Normal file
|
After Width: | Height: | Size: 4.6 KiB |
BIN
icons/filter_p.png
Normal file
|
After Width: | Height: | Size: 5.4 KiB |
BIN
icons/filter_s.png
Normal file
|
After Width: | Height: | Size: 7.8 KiB |
BIN
icons/home.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
icons/inventory.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
icons/key_A.png
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
icons/key_E.png
Normal file
|
After Width: | Height: | Size: 37 KiB |
BIN
icons/key_N.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
icons/key_P.png
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
icons/key_Q.png
Normal file
|
After Width: | Height: | Size: 59 KiB |
BIN
icons/key_R.png
Normal file
|
After Width: | Height: | Size: 47 KiB |
BIN
icons/key_S.png
Normal file
|
After Width: | Height: | Size: 55 KiB |
BIN
icons/key_T.png
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
icons/key_U.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
icons/key_V.png
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
icons/key_W.png
Normal file
|
After Width: | Height: | Size: 54 KiB |
BIN
icons/key_Z.png
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
icons/locate_button.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
icons/manupicksicon_small.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
icons/manupicsicon.png
Normal file
|
After Width: | Height: | Size: 7.5 KiB |
BIN
icons/map.png
Normal file
|
After Width: | Height: | Size: 56 KiB |
BIN
icons/newfile.png
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
icons/open.png
Normal file
|
After Width: | Height: | Size: 37 KiB |
BIN
icons/openfile.png
Normal file
|
After Width: | Height: | Size: 50 KiB |
BIN
icons/openloc.png
Normal file
|
After Width: | Height: | Size: 57 KiB |
BIN
icons/openpick.png
Normal file
|
After Width: | Height: | Size: 50 KiB |
BIN
icons/openpicks.png
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
icons/openproject.png
Normal file
|
After Width: | Height: | Size: 58 KiB |
BIN
icons/parameter.png
Normal file
|
After Width: | Height: | Size: 38 KiB |
BIN
icons/pick.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
icons/pick_qualities_button.png
Normal file
|
After Width: | Height: | Size: 3.2 KiB |
BIN
icons/preferences.png
Normal file
|
After Width: | Height: | Size: 38 KiB |
BIN
icons/printer.png
Normal file
|
After Width: | Height: | Size: 6.5 KiB |
BIN
icons/pylot.ico
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
icons/pylot.png
Normal file
|
After Width: | Height: | Size: 39 KiB |
BIN
icons/save.png
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
icons/saveas.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
icons/savepicks.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
icons/saveproject.png
Normal file
|
After Width: | Height: | Size: 35 KiB |
BIN
icons/saveprojectas.png
Normal file
|
After Width: | Height: | Size: 41 KiB |
BIN
icons/sync.png
Normal file
|
After Width: | Height: | Size: 4.2 KiB |
BIN
icons/tune.png
Normal file
|
After Width: | Height: | Size: 37 KiB |
BIN
icons/waveform.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
icons/zoom_0.png
Normal file
|
After Width: | Height: | Size: 6.9 KiB |
BIN
icons/zoom_in.png
Normal file
|
After Width: | Height: | Size: 7.0 KiB |
BIN
icons/zoom_out.png
Normal file
|
After Width: | Height: | Size: 6.9 KiB |
110182
icons_rc_2.py
Normal file
109998
icons_rc_3.py
Normal file
3
inputs/PILOT_TimeErrors.in
Normal file
@@ -0,0 +1,3 @@
|
||||
## default time errors for old PILOT phases
|
||||
0.04 0.08 0.16 0.32 #timeerrorsP# %discrete time errors [s] corresponding to picking weights [0 1 2 3] for P
|
||||
0.04 0.08 0.16 0.32 #timeerrorsS# %discrete time errors [s] corresponding to picking weights [0 1 2 3] for S
|
||||
100
inputs/pylot_global.in
Normal file
@@ -0,0 +1,100 @@
|
||||
%This is a parameter input file for PyLoT/autoPyLoT.
|
||||
%All main and special settings regarding data handling
|
||||
%and picking are to be set here!
|
||||
%Parameters are optimized for %extent data sets!
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
#main settings#
|
||||
#rootpath# %project path
|
||||
#datapath# %data path
|
||||
#database# %name of data base
|
||||
#eventID# %event ID for single event processing (* for all events found in database)
|
||||
#invdir# %full path to inventory or dataless-seed file
|
||||
PILOT #datastructure# %choose data structure
|
||||
True #apverbose# %choose 'True' or 'False' for terminal output
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
#NLLoc settings#
|
||||
None #nllocbin# %path to NLLoc executable
|
||||
None #nllocroot# %root of NLLoc-processing directory
|
||||
None #phasefile# %name of autoPyLoT-output phase file for NLLoc
|
||||
None #ctrfile# %name of autoPyLoT-output control file for NLLoc
|
||||
ttime #ttpatter# %pattern of NLLoc ttimes from grid
|
||||
AUTOLOC_nlloc #outpatter# %pattern of NLLoc-output file
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
#parameters for seismic moment estimation#
|
||||
3530.0 #vp# %average P-wave velocity
|
||||
2500.0 #rho# %average rock density [kg/m^3]
|
||||
300.0 0.8 #Qp# %quality factor for P waves (Qp*f^a); list(Qp, a)
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
#settings local magnitude#
|
||||
1.0 1.0 1.0 #WAscaling# %Scaling relation (log(Ao)+Alog(r)+Br+C) of Wood-Anderson amplitude Ao [nm] If zeros are set, original Richter magnitude is calculated!
|
||||
1.0 1.0 #magscaling# %Scaling relation for derived local magnitude [a*Ml+b]. If zeros are set, no scaling of network magnitude is applied!
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
#filter settings#
|
||||
0.01 0.01 #minfreq# %Lower filter frequency [P, S]
|
||||
0.3 0.3 #maxfreq# %Upper filter frequency [P, S]
|
||||
3 3 #filter_order# %filter order [P, S]
|
||||
bandpass bandpass #filter_type# %filter type (bandpass, bandstop, lowpass, highpass) [P, S]
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
#common settings picker#
|
||||
global #extent# %extent of array ("local", "regional" or "global")
|
||||
-150.0 #pstart# %start time [s] for calculating CF for P-picking (if TauPy: seconds relative to estimated onset)
|
||||
600.0 #pstop# %end time [s] for calculating CF for P-picking (if TauPy: seconds relative to estimated onset)
|
||||
200.0 #sstart# %start time [s] relative to P-onset for calculating CF for S-picking
|
||||
1150.0 #sstop# %end time [s] after P-onset for calculating CF for S-picking
|
||||
True #use_taup# %use estimated traveltimes from TauPy for calculating windows for CF
|
||||
iasp91 #taup_model# %define TauPy model for traveltime estimation. Possible values: 1066a, 1066b, ak135, ak135f, herrin, iasp91, jb, prem, pwdk, sp6
|
||||
0.05 0.5 #bpz1# %lower/upper corner freq. of first band pass filter Z-comp. [Hz]
|
||||
0.001 0.5 #bpz2# %lower/upper corner freq. of second band pass filter Z-comp. [Hz]
|
||||
0.05 0.5 #bph1# %lower/upper corner freq. of first band pass filter H-comp. [Hz]
|
||||
0.001 0.5 #bph2# %lower/upper corner freq. of second band pass filter z-comp. [Hz]
|
||||
#special settings for calculating CF#
|
||||
%!!Edit the following only if you know what you are doing!!%
|
||||
#Z-component#
|
||||
HOS #algoP# %choose algorithm for P-onset determination (HOS, ARZ, or AR3)
|
||||
150.0 #tlta# %for HOS-/AR-AIC-picker, length of LTA window [s]
|
||||
4 #hosorder# %for HOS-picker, order of Higher Order Statistics
|
||||
2 #Parorder# %for AR-picker, order of AR process of Z-component
|
||||
16.0 #tdet1z# %for AR-picker, length of AR determination window [s] for Z-component, 1st pick
|
||||
10.0 #tpred1z# %for AR-picker, length of AR prediction window [s] for Z-component, 1st pick
|
||||
12.0 #tdet2z# %for AR-picker, length of AR determination window [s] for Z-component, 2nd pick
|
||||
6.0 #tpred2z# %for AR-picker, length of AR prediction window [s] for Z-component, 2nd pick
|
||||
0.001 #addnoise# %add noise to seismogram for stable AR prediction
|
||||
60.0 10.0 40.0 10.0 #tsnrz# %for HOS/AR, window lengths for SNR-and slope estimation [tnoise, tsafetey, tsignal, tslope] [s]
|
||||
150.0 #pickwinP# %for initial AIC pick, length of P-pick window [s]
|
||||
35.0 #Precalcwin# %for HOS/AR, window length [s] for recalculation of CF (relative to 1st pick)
|
||||
6.0 #aictsmooth# %for HOS/AR, take average of samples for smoothing of AIC-function [s]
|
||||
4.0 #tsmoothP# %for HOS/AR, take average of samples for smoothing CF [s]
|
||||
0.001 #ausP# %for HOS/AR, artificial uplift of samples (aus) of CF (P)
|
||||
1.1 #nfacP# %for HOS/AR, noise factor for noise level determination (P)
|
||||
#H-components#
|
||||
ARH #algoS# %choose algorithm for S-onset determination (ARH or AR3)
|
||||
12.0 #tdet1h# %for HOS/AR, length of AR-determination window [s], H-components, 1st pick
|
||||
6.0 #tpred1h# %for HOS/AR, length of AR-prediction window [s], H-components, 1st pick
|
||||
8.0 #tdet2h# %for HOS/AR, length of AR-determinaton window [s], H-components, 2nd pick
|
||||
4.0 #tpred2h# %for HOS/AR, length of AR-prediction window [s], H-components, 2nd pick
|
||||
4 #Sarorder# %for AR-picker, order of AR process of H-components
|
||||
30.0 #Srecalcwin# %for AR-picker, window length [s] for recalculation of CF (2nd pick) (H)
|
||||
195.0 #pickwinS# %for initial AIC pick, length of S-pick window [s]
|
||||
100.0 10.0 45.0 10.0 #tsnrh# %for ARH/AR3, window lengths for SNR-and slope estimation [tnoise, tsafetey, tsignal, tslope] [s]
|
||||
22.0 #aictsmoothS# %for AIC-picker, take average of samples for smoothing of AIC-function [s]
|
||||
10.0 #tsmoothS# %for AR-picker, take average of samples for smoothing CF [s] (S)
|
||||
0.001 #ausS# %for HOS/AR, artificial uplift of samples (aus) of CF (S)
|
||||
1.2 #nfacS# %for AR-picker, noise factor for noise level determination (S)
|
||||
#first-motion picker#
|
||||
1 #minfmweight# %minimum required P weight for first-motion determination
|
||||
3.0 #minFMSNR# %miniumum required SNR for first-motion determination
|
||||
10.0 #fmpickwin# %pick window around P onset for calculating zero crossings
|
||||
#quality assessment#
|
||||
1.0 2.0 4.0 8.0 #timeerrorsP# %discrete time errors [s] corresponding to picking weights [0 1 2 3] for P
|
||||
4.0 8.0 16.0 32.0 #timeerrorsS# %discrete time errors [s] corresponding to picking weights [0 1 2 3] for S
|
||||
0.5 #minAICPslope# %below this slope [counts/s] the initial P pick is rejected
|
||||
1.1 #minAICPSNR# %below this SNR the initial P pick is rejected
|
||||
1.0 #minAICSslope# %below this slope [counts/s] the initial S pick is rejected
|
||||
1.3 #minAICSSNR# %below this SNR the initial S pick is rejected
|
||||
5.0 #minsiglength# %length of signal part for which amplitudes must exceed noiselevel [s]
|
||||
1.0 #noisefactor# %noiselevel*noisefactor=threshold
|
||||
10.0 #minpercent# %required percentage of amplitudes exceeding threshold
|
||||
1.2 #zfac# %P-amplitude must exceed at least zfac times RMS-S amplitude
|
||||
25.0 #mdttolerance# %maximum allowed deviation of P picks from median [s]
|
||||
50.0 #wdttolerance# %maximum allowed deviation from Wadati-diagram
|
||||
5.0 #jackfactor# %pick is removed if the variance of the subgroup with the pick removed is larger than the mean variance of all subgroups times safety factor
|
||||
100
inputs/pylot_local.in
Normal file
@@ -0,0 +1,100 @@
|
||||
%This is a parameter input file for PyLoT/autoPyLoT.
|
||||
%All main and special settings regarding data handling
|
||||
%and picking are to be set here!
|
||||
%Parameters are optimized for %extent data sets!
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
#main settings#
|
||||
/DATA/Insheim #rootpath# %project path
|
||||
EVENT_DATA/LOCAL #datapath# %data path
|
||||
2018.02_Insheim #database# %name of data base
|
||||
e0006.038.18 #eventID# %event ID for single event processing (* for all events found in database)
|
||||
/DATA/Insheim/STAT_INFO #invdir# %full path to inventory or dataless-seed file
|
||||
PILOT #datastructure# %choose data structure
|
||||
True #apverbose# %choose 'True' or 'False' for terminal output
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
#NLLoc settings#
|
||||
/home/ludger/NLLOC #nllocbin# %path to NLLoc executable
|
||||
/home/ludger/NLLOC/Insheim #nllocroot# %root of NLLoc-processing directory
|
||||
AUTOPHASES.obs #phasefile# %name of autoPyLoT-output phase file for NLLoc
|
||||
Insheim_min1d032016_auto.in #ctrfile# %name of autoPyLoT-output control file for NLLoc
|
||||
ttime #ttpatter# %pattern of NLLoc ttimes from grid
|
||||
AUTOLOC_nlloc #outpatter# %pattern of NLLoc-output file
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
#parameters for seismic moment estimation#
|
||||
3530.0 #vp# %average P-wave velocity
|
||||
2500.0 #rho# %average rock density [kg/m^3]
|
||||
300.0 0.8 #Qp# %quality factor for P waves (Qp*f^a); list(Qp, a)
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
#settings local magnitude#
|
||||
1.11 0.0009 -2.0 #WAscaling# %Scaling relation (log(Ao)+Alog(r)+Br+C) of Wood-Anderson amplitude Ao [nm] If zeros are set, original Richter magnitude is calculated!
|
||||
0.0 0.0 #magscaling# %Scaling relation for derived local magnitude [a*Ml+b]. If zeros are set, no scaling of network magnitude is applied!
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
#filter settings#
|
||||
2.0 2.0 #minfreq# %Lower filter frequency [P, S]
|
||||
30.0 15.0 #maxfreq# %Upper filter frequency [P, S]
|
||||
3 3 #filter_order# %filter order [P, S]
|
||||
bandpass bandpass #filter_type# %filter type (bandpass, bandstop, lowpass, highpass) [P, S]
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
#common settings picker#
|
||||
local #extent# %extent of array ("local", "regional" or "global")
|
||||
7.0 #pstart# %start time [s] for calculating CF for P-picking
|
||||
16.0 #pstop# %end time [s] for calculating CF for P-picking
|
||||
-0.5 #sstart# %start time [s] relative to P-onset for calculating CF for S-picking
|
||||
10.0 #sstop# %end time [s] after P-onset for calculating CF for S-picking
|
||||
False #use_taup# %use estimated traveltimes from TauPy for calculating windows for CF
|
||||
iasp91 #taup_model# %define TauPy model for traveltime estimation
|
||||
2.0 20.0 #bpz1# %lower/upper corner freq. of first band pass filter Z-comp. [Hz]
|
||||
2.0 30.0 #bpz2# %lower/upper corner freq. of second band pass filter Z-comp. [Hz]
|
||||
2.0 10.0 #bph1# %lower/upper corner freq. of first band pass filter H-comp. [Hz]
|
||||
2.0 15.0 #bph2# %lower/upper corner freq. of second band pass filter z-comp. [Hz]
|
||||
#special settings for calculating CF#
|
||||
%!!Edit the following only if you know what you are doing!!%
|
||||
#Z-component#
|
||||
HOS #algoP# %choose algorithm for P-onset determination (HOS, ARZ, or AR3)
|
||||
4.0 #tlta# %for HOS-/AR-AIC-picker, length of LTA window [s]
|
||||
4 #hosorder# %for HOS-picker, order of Higher Order Statistics
|
||||
2 #Parorder# %for AR-picker, order of AR process of Z-component
|
||||
1.2 #tdet1z# %for AR-picker, length of AR determination window [s] for Z-component, 1st pick
|
||||
0.4 #tpred1z# %for AR-picker, length of AR prediction window [s] for Z-component, 1st pick
|
||||
0.6 #tdet2z# %for AR-picker, length of AR determination window [s] for Z-component, 2nd pick
|
||||
0.2 #tpred2z# %for AR-picker, length of AR prediction window [s] for Z-component, 2nd pick
|
||||
0.001 #addnoise# %add noise to seismogram for stable AR prediction
|
||||
3.0 0.0 1.0 0.5 #tsnrz# %for HOS/AR, window lengths for SNR-and slope estimation [tnoise, tsafetey, tsignal, tslope] [s]
|
||||
3.0 #pickwinP# %for initial AIC pick, length of P-pick window [s]
|
||||
6.0 #Precalcwin# %for HOS/AR, window length [s] for recalculation of CF (relative to 1st pick)
|
||||
0.4 #aictsmooth# %for HOS/AR, take average of samples for smoothing of AIC-function [s]
|
||||
0.1 #tsmoothP# %for HOS/AR, take average of samples for smoothing CF [s]
|
||||
0.4 #ausP# %for HOS/AR, artificial uplift of samples (aus) of CF (P)
|
||||
1.3 #nfacP# %for HOS/AR, noise factor for noise level determination (P)
|
||||
#H-components#
|
||||
ARH #algoS# %choose algorithm for S-onset determination (ARH or AR3)
|
||||
0.8 #tdet1h# %for HOS/AR, length of AR-determination window [s], H-components, 1st pick
|
||||
0.4 #tpred1h# %for HOS/AR, length of AR-prediction window [s], H-components, 1st pick
|
||||
0.6 #tdet2h# %for HOS/AR, length of AR-determinaton window [s], H-components, 2nd pick
|
||||
0.3 #tpred2h# %for HOS/AR, length of AR-prediction window [s], H-components, 2nd pick
|
||||
4 #Sarorder# %for AR-picker, order of AR process of H-components
|
||||
5.0 #Srecalcwin# %for AR-picker, window length [s] for recalculation of CF (2nd pick) (H)
|
||||
4.0 #pickwinS# %for initial AIC pick, length of S-pick window [s]
|
||||
2.0 0.2 1.5 1.0 #tsnrh# %for ARH/AR3, window lengths for SNR-and slope estimation [tnoise, tsafetey, tsignal, tslope] [s]
|
||||
1.0 #aictsmoothS# %for AIC-picker, take average of samples for smoothing of AIC-function [s]
|
||||
0.7 #tsmoothS# %for AR-picker, take average of samples for smoothing CF [s] (S)
|
||||
0.9 #ausS# %for HOS/AR, artificial uplift of samples (aus) of CF (S)
|
||||
1.5 #nfacS# %for AR-picker, noise factor for noise level determination (S)
|
||||
#first-motion picker#
|
||||
1 #minfmweight# %minimum required P weight for first-motion determination
|
||||
2.0 #minFMSNR# %miniumum required SNR for first-motion determination
|
||||
0.2 #fmpickwin# %pick window around P onset for calculating zero crossings
|
||||
#quality assessment#
|
||||
0.04 0.08 0.16 0.32 #timeerrorsP# %discrete time errors [s] corresponding to picking weights [0 1 2 3] for P
|
||||
0.05 0.10 0.20 0.40 #timeerrorsS# %discrete time errors [s] corresponding to picking weights [0 1 2 3] for S
|
||||
0.8 #minAICPslope# %below this slope [counts/s] the initial P pick is rejected
|
||||
1.1 #minAICPSNR# %below this SNR the initial P pick is rejected
|
||||
1.0 #minAICSslope# %below this slope [counts/s] the initial S pick is rejected
|
||||
1.5 #minAICSSNR# %below this SNR the initial S pick is rejected
|
||||
1.0 #minsiglength# %length of signal part for which amplitudes must exceed noiselevel [s]
|
||||
1.1 #noisefactor# %noiselevel*noisefactor=threshold
|
||||
50.0 #minpercent# %required percentage of amplitudes exceeding threshold
|
||||
1.1 #zfac# %P-amplitude must exceed at least zfac times RMS-S amplitude
|
||||
5.0 #mdttolerance# %maximum allowed deviation of P picks from median [s]
|
||||
1.0 #wdttolerance# %maximum allowed deviation from Wadati-diagram
|
||||
2.0 #jackfactor# %pick is removed if the variance of the subgroup with the pick removed is larger than the mean variance of all subgroups times safety factor
|
||||
100
inputs/pylot_regional.in
Normal file
@@ -0,0 +1,100 @@
|
||||
%This is a parameter input file for PyLoT/autoPyLoT.
|
||||
%All main and special settings regarding data handling
|
||||
%and picking are to be set here!
|
||||
%Parameters are optimized for %extent data sets!
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
#main settings#
|
||||
#rootpath# %project path
|
||||
#datapath# %data path
|
||||
#database# %name of data base
|
||||
#eventID# %event ID for single event processing (* for all events found in database)
|
||||
#invdir# %full path to inventory or dataless-seed file
|
||||
PILOT #datastructure# %choose data structure
|
||||
True #apverbose# %choose 'True' or 'False' for terminal output
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
#NLLoc settings#
|
||||
None #nllocbin# %path to NLLoc executable
|
||||
None #nllocroot# %root of NLLoc-processing directory
|
||||
None #phasefile# %name of autoPyLoT-output phase file for NLLoc
|
||||
None #ctrfile# %name of autoPyLoT-output control file for NLLoc
|
||||
ttime #ttpatter# %pattern of NLLoc ttimes from grid
|
||||
AUTOLOC_nlloc #outpatter# %pattern of NLLoc-output file
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
#parameters for seismic moment estimation#
|
||||
3530.0 #vp# %average P-wave velocity
|
||||
2500.0 #rho# %average rock density [kg/m^3]
|
||||
300.0 0.8 #Qp# %quality factor for P waves (Qp*f^a); list(Qp, a)
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
#settings local magnitude#
|
||||
1.11 0.0009 -2.0 #WAscaling# %Scaling relation (log(Ao)+Alog(r)+Br+C) of Wood-Anderson amplitude Ao [nm] If zeros are set, original Richter magnitude is calculated!
|
||||
1.0382 -0.447 #magscaling# %Scaling relation for derived local magnitude [a*Ml+b]. If zeros are set, no scaling of network magnitude is applied!
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
#filter settings#
|
||||
1.0 1.0 #minfreq# %Lower filter frequency [P, S]
|
||||
10.0 10.0 #maxfreq# %Upper filter frequency [P, S]
|
||||
2 2 #filter_order# %filter order [P, S]
|
||||
bandpass bandpass #filter_type# %filter type (bandpass, bandstop, lowpass, highpass) [P, S]
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
#common settings picker#
|
||||
local #extent# %extent of array ("local", "regional" or "global")
|
||||
15.0 #pstart# %start time [s] for calculating CF for P-picking
|
||||
60.0 #pstop# %end time [s] for calculating CF for P-picking
|
||||
-1.0 #sstart# %start time [s] relative to P-onset for calculating CF for S-picking
|
||||
10.0 #sstop# %end time [s] after P-onset for calculating CF for S-picking
|
||||
True #use_taup# %use estimated traveltimes from TauPy for calculating windows for CF
|
||||
iasp91 #taup_model# %define TauPy model for traveltime estimation
|
||||
2.0 10.0 #bpz1# %lower/upper corner freq. of first band pass filter Z-comp. [Hz]
|
||||
2.0 12.0 #bpz2# %lower/upper corner freq. of second band pass filter Z-comp. [Hz]
|
||||
2.0 8.0 #bph1# %lower/upper corner freq. of first band pass filter H-comp. [Hz]
|
||||
2.0 10.0 #bph2# %lower/upper corner freq. of second band pass filter z-comp. [Hz]
|
||||
#special settings for calculating CF#
|
||||
%!!Edit the following only if you know what you are doing!!%
|
||||
#Z-component#
|
||||
HOS #algoP# %choose algorithm for P-onset determination (HOS, ARZ, or AR3)
|
||||
7.0 #tlta# %for HOS-/AR-AIC-picker, length of LTA window [s]
|
||||
4 #hosorder# %for HOS-picker, order of Higher Order Statistics
|
||||
2 #Parorder# %for AR-picker, order of AR process of Z-component
|
||||
1.2 #tdet1z# %for AR-picker, length of AR determination window [s] for Z-component, 1st pick
|
||||
0.4 #tpred1z# %for AR-picker, length of AR prediction window [s] for Z-component, 1st pick
|
||||
0.6 #tdet2z# %for AR-picker, length of AR determination window [s] for Z-component, 2nd pick
|
||||
0.2 #tpred2z# %for AR-picker, length of AR prediction window [s] for Z-component, 2nd pick
|
||||
0.001 #addnoise# %add noise to seismogram for stable AR prediction
|
||||
3.0 0.1 0.5 1.0 #tsnrz# %for HOS/AR, window lengths for SNR-and slope estimation [tnoise, tsafetey, tsignal, tslope] [s]
|
||||
3.0 #pickwinP# %for initial AIC pick, length of P-pick window [s]
|
||||
6.0 #Precalcwin# %for HOS/AR, window length [s] for recalculation of CF (relative to 1st pick)
|
||||
0.2 #aictsmooth# %for HOS/AR, take average of samples for smoothing of AIC-function [s]
|
||||
0.1 #tsmoothP# %for HOS/AR, take average of samples for smoothing CF [s]
|
||||
0.001 #ausP# %for HOS/AR, artificial uplift of samples (aus) of CF (P)
|
||||
1.3 #nfacP# %for HOS/AR, noise factor for noise level determination (P)
|
||||
#H-components#
|
||||
ARH #algoS# %choose algorithm for S-onset determination (ARH or AR3)
|
||||
0.8 #tdet1h# %for HOS/AR, length of AR-determination window [s], H-components, 1st pick
|
||||
0.4 #tpred1h# %for HOS/AR, length of AR-prediction window [s], H-components, 1st pick
|
||||
0.6 #tdet2h# %for HOS/AR, length of AR-determinaton window [s], H-components, 2nd pick
|
||||
0.3 #tpred2h# %for HOS/AR, length of AR-prediction window [s], H-components, 2nd pick
|
||||
4 #Sarorder# %for AR-picker, order of AR process of H-components
|
||||
5.0 #Srecalcwin# %for AR-picker, window length [s] for recalculation of CF (2nd pick) (H)
|
||||
4.0 #pickwinS# %for initial AIC pick, length of S-pick window [s]
|
||||
2.0 0.3 1.5 1.0 #tsnrh# %for ARH/AR3, window lengths for SNR-and slope estimation [tnoise, tsafetey, tsignal, tslope] [s]
|
||||
1.0 #aictsmoothS# %for AIC-picker, take average of samples for smoothing of AIC-function [s]
|
||||
0.7 #tsmoothS# %for AR-picker, take average of samples for smoothing CF [s] (S)
|
||||
0.9 #ausS# %for HOS/AR, artificial uplift of samples (aus) of CF (S)
|
||||
1.5 #nfacS# %for AR-picker, noise factor for noise level determination (S)
|
||||
#first-motion picker#
|
||||
1 #minfmweight# %minimum required P weight for first-motion determination
|
||||
2.0 #minFMSNR# %miniumum required SNR for first-motion determination
|
||||
0.2 #fmpickwin# %pick window around P onset for calculating zero crossings
|
||||
#quality assessment#
|
||||
0.02 0.04 0.08 0.16 #timeerrorsP# %discrete time errors [s] corresponding to picking weights [0 1 2 3] for P
|
||||
0.04 0.08 0.16 0.32 #timeerrorsS# %discrete time errors [s] corresponding to picking weights [0 1 2 3] for S
|
||||
0.8 #minAICPslope# %below this slope [counts/s] the initial P pick is rejected
|
||||
1.1 #minAICPSNR# %below this SNR the initial P pick is rejected
|
||||
1.0 #minAICSslope# %below this slope [counts/s] the initial S pick is rejected
|
||||
1.5 #minAICSSNR# %below this SNR the initial S pick is rejected
|
||||
1.0 #minsiglength# %length of signal part for which amplitudes must exceed noiselevel [s]
|
||||
1.0 #noisefactor# %noiselevel*noisefactor=threshold
|
||||
10.0 #minpercent# %required percentage of amplitudes exceeding threshold
|
||||
1.5 #zfac# %P-amplitude must exceed at least zfac times RMS-S amplitude
|
||||
6.0 #mdttolerance# %maximum allowed deviation of P picks from median [s]
|
||||
1.0 #wdttolerance# %maximum allowed deviation from Wadati-diagram
|
||||
5.0 #jackfactor# %pick is removed if the variance of the subgroup with the pick removed is larger than the mean variance of all subgroups times safety factor
|
||||
53
inputs/richter_scaling.data
Normal file
@@ -0,0 +1,53 @@
|
||||
0 1.4
|
||||
10 1.5
|
||||
20 1.7
|
||||
25 1.9
|
||||
30 2.1
|
||||
35 2.3
|
||||
40 2.4
|
||||
45 2.5
|
||||
50 2.6
|
||||
60 2.8
|
||||
70 2.8
|
||||
75 2.9
|
||||
85 2.9
|
||||
90 3.0
|
||||
100 3.0
|
||||
110 3.1
|
||||
120 3.1
|
||||
130 3.2
|
||||
140 3.2
|
||||
150 3.3
|
||||
160 3.3
|
||||
170 3.4
|
||||
180 3.4
|
||||
190 3.5
|
||||
200 3.5
|
||||
210 3.6
|
||||
230 3.7
|
||||
240 3.7
|
||||
250 3.8
|
||||
260 3.8
|
||||
270 3.9
|
||||
280 3.9
|
||||
290 4.0
|
||||
300 4.0
|
||||
310 4.1
|
||||
320 4.2
|
||||
330 4.2
|
||||
340 4.2
|
||||
350 4.3
|
||||
360 4.3
|
||||
370 4.3
|
||||
380 4.4
|
||||
390 4.4
|
||||
400 4.5
|
||||
430 4.6
|
||||
470 4.7
|
||||
510 4.8
|
||||
560 4.9
|
||||
600 5.1
|
||||
700 5.2
|
||||
800 5.4
|
||||
900 5.5
|
||||
1000 5.7
|
||||
228
makePyLoT.py
Normal file
@@ -0,0 +1,228 @@
|
||||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
from __future__ import print_function
|
||||
|
||||
"""
|
||||
makePyLoT -- build and install PyLoT
|
||||
|
||||
makePyLoT is a python make file in order to establish the folder structure and
|
||||
meet requisites
|
||||
|
||||
It defines
|
||||
:class CLIError:
|
||||
:method main:
|
||||
|
||||
:author: Sebastian Wehling-Benatelli
|
||||
|
||||
:copyright: 2014 MAGS2 EP3 Working Group. All rights reserved.
|
||||
|
||||
:license: GNU Lesser General Public License, Version 3
|
||||
(http://www.gnu.org/copyleft/lesser.html)
|
||||
|
||||
:contact: sebastian.wehling@rub.de
|
||||
|
||||
updated: Updated
|
||||
"""
|
||||
|
||||
import glob
|
||||
import os
|
||||
import sys
|
||||
import shutil
|
||||
import copy
|
||||
|
||||
from argparse import ArgumentParser
|
||||
from argparse import RawDescriptionHelpFormatter
|
||||
|
||||
__all__ = []
|
||||
__version__ = 0.1
|
||||
__date__ = '2014-11-26'
|
||||
__updated__ = '2016-04-28'
|
||||
|
||||
DEBUG = 0
|
||||
TESTRUN = 0
|
||||
PROFILE = 0
|
||||
|
||||
|
||||
class CLIError(Exception):
|
||||
"""Generic exception to raise and log different fatal errors."""
|
||||
|
||||
def __init__(self, msg):
|
||||
super(CLIError).__init__(type(self))
|
||||
self.msg = "E: %s" % msg
|
||||
|
||||
def __str__(self):
|
||||
return self.msg
|
||||
|
||||
def __unicode__(self):
|
||||
return self.msg
|
||||
|
||||
|
||||
def main(argv=None): # IGNORE:C0111
|
||||
'''Command line options.'''
|
||||
|
||||
if argv is None:
|
||||
argv = sys.argv
|
||||
else:
|
||||
sys.argv.extend(argv)
|
||||
|
||||
program_name = os.path.basename(sys.argv[0])
|
||||
program_version = "v%s" % __version__
|
||||
program_build_date = str(__updated__)
|
||||
program_version_message = 'makePyLoT %s (%s)' % (
|
||||
program_version, program_build_date)
|
||||
program_shortdesc = __import__('__main__').__doc__.split("\n")[1]
|
||||
program_license = '''{0:s}
|
||||
|
||||
Created by Sebastian Wehling-Benatelli on {1:s}.
|
||||
Copyright 2014 MAGS2 EP3 Working Group. All rights reserved.
|
||||
|
||||
GNU Lesser General Public License, Version 3
|
||||
(http://www.gnu.org/copyleft/lesser.html)
|
||||
|
||||
Distributed on an "AS IS" basis without warranties
|
||||
or conditions of any kind, either express or implied.
|
||||
|
||||
USAGE
|
||||
'''.format(program_shortdesc, str(__date__))
|
||||
|
||||
try:
|
||||
# Setup argument parser
|
||||
parser = ArgumentParser(description=program_license,
|
||||
formatter_class=RawDescriptionHelpFormatter)
|
||||
parser.add_argument("-b", "--build", dest="build", action="store_true",
|
||||
help="build PyLoT")
|
||||
parser.add_argument("-v", "--verbose", dest="verbose", action="count",
|
||||
help="set verbosity level")
|
||||
parser.add_argument("-i", "--install", dest="install",
|
||||
action="store_true",
|
||||
help="install PyLoT on the system")
|
||||
parser.add_argument("-d", "--directory", dest="directory",
|
||||
help="installation directory", metavar="RE")
|
||||
parser.add_argument('-V', '--version', action='version',
|
||||
version=program_version_message)
|
||||
|
||||
# Process arguments
|
||||
args = parser.parse_args()
|
||||
|
||||
verbose = args.verbose
|
||||
build = args.build
|
||||
install = args.install
|
||||
directory = args.directory
|
||||
|
||||
if verbose > 0:
|
||||
print("Verbose mode on")
|
||||
if install and not directory:
|
||||
raise CLIError("""Trying to install without appropriate
|
||||
destination; please specify an installation
|
||||
directory!""")
|
||||
if build and install:
|
||||
print("Building and installing PyLoT ...\n")
|
||||
buildPyLoT(verbose)
|
||||
installPyLoT(verbose)
|
||||
elif build and not install:
|
||||
print("Building PyLoT without installing! Please wait ...\n")
|
||||
buildPyLoT(verbose)
|
||||
cleanUp()
|
||||
return 0
|
||||
except KeyboardInterrupt:
|
||||
cleanUp(1)
|
||||
return 0
|
||||
except Exception as e:
|
||||
if DEBUG or TESTRUN:
|
||||
raise e
|
||||
indent = len(program_name) * " "
|
||||
sys.stderr.write(program_name + ": " + repr(e) + "\n")
|
||||
sys.stderr.write(indent + " for help use --help")
|
||||
return 2
|
||||
|
||||
|
||||
def buildPyLoT(verbosity=None):
|
||||
system = sys.platform
|
||||
if verbosity > 1:
|
||||
msg = ("... on system: {0}\n"
|
||||
"\n"
|
||||
" Current working directory: {1}\n"
|
||||
).format(system, os.getcwd())
|
||||
print(msg)
|
||||
if system.startswith(('win', 'microsoft')):
|
||||
raise CLIError(
|
||||
"building on Windows system not tested yet; implementation pending")
|
||||
elif system == 'darwin':
|
||||
# create a symbolic link to the desired python interpreter in order to
|
||||
# display the right application name
|
||||
for path in os.getenv('PATH').split(':'):
|
||||
found = glob.glob(os.path.join(path, 'python'))
|
||||
if found:
|
||||
os.symlink(found, './PyLoT')
|
||||
break
|
||||
|
||||
|
||||
def installPyLoT(verbosity=None):
|
||||
files_to_copy = {'pylot_local.in': ['~', '.pylot'],
|
||||
'pylot_regional.in': ['~', '.pylot'],
|
||||
'pylot_global.in': ['~', '.pylot']}
|
||||
if verbosity > 0:
|
||||
print('starting installation of PyLoT ...')
|
||||
if verbosity > 1:
|
||||
print('copying input files into destination folder ...')
|
||||
ans = input('please specify scope of interest '
|
||||
'([0]=local, 1=regional, 2=global, 3=active) :') or 0
|
||||
if not isinstance(ans, int):
|
||||
ans = int(ans)
|
||||
if ans == 0:
|
||||
ans = 'local'
|
||||
elif ans == 1:
|
||||
ans = 'regional'
|
||||
elif ans == 2:
|
||||
ans = 'global'
|
||||
elif ans == 3:
|
||||
ans = 'active'
|
||||
link_dest = []
|
||||
for file, destination in files_to_copy.items():
|
||||
link_file = ans in file
|
||||
if link_file:
|
||||
link_dest = copy.deepcopy(destination)
|
||||
link_dest.append('pylot.in')
|
||||
link_dest = os.path.join(*link_dest)
|
||||
destination.append(file)
|
||||
destination = os.path.join(*destination)
|
||||
srcfile = os.path.join('input', file)
|
||||
assert not os.path.isabs(srcfile), 'source files seem to be ' \
|
||||
'corrupted ...'
|
||||
if verbosity > 1:
|
||||
print('copying file {file} to folder {dest}'.format(file=file, dest=destination))
|
||||
shutil.copyfile(srcfile, destination)
|
||||
if link_file:
|
||||
if verbosity:
|
||||
print('linking input file for autoPyLoT ...')
|
||||
os.symlink(destination, link_dest)
|
||||
|
||||
|
||||
def cleanUp(verbosity=None):
|
||||
if verbosity >= 1:
|
||||
print('cleaning up build files...')
|
||||
if sys.platform == 'darwin':
|
||||
os.remove('./PyLoT')
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
if DEBUG:
|
||||
sys.argv.append("-h")
|
||||
sys.argv.append("-v")
|
||||
if TESTRUN:
|
||||
import doctest
|
||||
|
||||
doctest.testmod()
|
||||
if PROFILE:
|
||||
import cProfile
|
||||
import pstats
|
||||
|
||||
profile_filename = 'makePyLoT_profile.txt'
|
||||
cProfile.run('main()', profile_filename)
|
||||
statsfile = open("profile_stats.txt", "wb")
|
||||
p = pstats.Stats(profile_filename, stream=statsfile)
|
||||
stats = p.strip_dirs().sort_stats('cumulative')
|
||||
stats.print_stats()
|
||||
statsfile.close()
|
||||
sys.exit(0)
|
||||
sys.exit(main())
|
||||
14
pylot.yml
Normal file
@@ -0,0 +1,14 @@
|
||||
name: pylot_38
|
||||
channels:
|
||||
- conda-forge
|
||||
- defaults
|
||||
dependencies:
|
||||
- cartopy=0.20.2
|
||||
- matplotlib-base=3.3.4
|
||||
- numpy=1.22.3
|
||||
- obspy=1.3.0
|
||||
- pyqtgraph=0.12.4
|
||||
- pyside2>=5.13.2
|
||||
- python=3.8.12
|
||||
- qt>=5.12.9
|
||||
- scipy=1.8.0
|
||||
27
pylot/__init__.py
Normal file
@@ -0,0 +1,27 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# --------------------------------------------------------
|
||||
# Purpose: Convience imports for PyLoT
|
||||
#
|
||||
'''
|
||||
================================================
|
||||
PyLoT - the Python picking and Localization Tool
|
||||
================================================
|
||||
|
||||
This python library contains a graphical user interfaces for picking
|
||||
seismic phases. This software needs ObsPy (http://github.com/obspy/obspy/wiki)
|
||||
and the Qt4 libraries to be installed first.
|
||||
|
||||
PILOT has been developed in Mathworks' MatLab. In order to distribute
|
||||
PILOT without facing portability problems, it has been decided to re-
|
||||
develop the software package in Python. The great work of the ObsPy
|
||||
group allows easy handling of a bunch of seismic data and PyLoT will
|
||||
benefit a lot compared to the former MatLab version.
|
||||
|
||||
The development of PyLoT is part of the joint research project MAGS2.
|
||||
|
||||
:copyright:
|
||||
The PyLoT Development Team
|
||||
:license:
|
||||
GNU Lesser General Public License, Version 3
|
||||
(http://www.gnu.org/copyleft/lesser.html)
|
||||
'''
|
||||
1
pylot/core/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
1
pylot/core/analysis/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
871
pylot/core/analysis/magnitude.py
Normal file
@@ -0,0 +1,871 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Created autumn/winter 2015.
|
||||
Revised/extended summer 2017.
|
||||
|
||||
:author: Ludger Küperkoch / MAGS2 EP3 working group
|
||||
"""
|
||||
|
||||
import matplotlib.pyplot as plt
|
||||
import numpy as np
|
||||
import obspy.core.event as ope
|
||||
from obspy.geodetics import degrees2kilometers
|
||||
from scipy import integrate, signal
|
||||
from scipy.optimize import curve_fit
|
||||
|
||||
from pylot.core.pick.utils import getsignalwin, crossings_nonzero_all, \
|
||||
select_for_phase
|
||||
from pylot.core.util.utils import common_range, fit_curve
|
||||
|
||||
|
||||
def richter_magnitude_scaling(delta):
|
||||
distance = np.array([0, 10, 20, 25, 30, 35, 40, 45, 50, 60, 70, 75, 85, 90, 100, 110,
|
||||
120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 230, 240, 250,
|
||||
260, 270, 280, 290, 300, 310, 320, 330, 340, 350, 360, 370, 380,
|
||||
390, 400, 430, 470, 510, 560, 600, 700, 800, 900, 1000])
|
||||
richter_scaling = np.array([1.4, 1.5, 1.7, 1.9, 2.1, 2.3, 2.4, 2.5, 2.6, 2.8, 2.8, 2.9,
|
||||
2.9, 3.0, 3.1, 3.1, 3.2, 3.2, 3.3, 3.3, 3.4, 3.4, 3.5, 3.5,
|
||||
3.6, 3.7, 3.7, 3.8, 3.8, 3.9, 3.9, 4.0, 4.0, 4.1, 4.2, 4.2,
|
||||
4.2, 4.2, 4.3, 4.3, 4.3, 4.4, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9,
|
||||
5.1, 5.2, 5.4, 5.5, 5.7])
|
||||
# prepare spline interpolation to calculate return value
|
||||
func, params = fit_curve(distance, richter_scaling)
|
||||
return func(delta, params)
|
||||
|
||||
|
||||
class Magnitude(object):
|
||||
"""
|
||||
Base class object for Magnitude calculation within PyLoT.
|
||||
"""
|
||||
|
||||
def __init__(self, stream, event, verbosity=False, iplot=0):
|
||||
self._type = "M"
|
||||
self._stream = stream
|
||||
self._plot_flag = iplot
|
||||
self._verbosity = verbosity
|
||||
self._event = event
|
||||
self._magnitudes = dict()
|
||||
|
||||
def __str__(self):
|
||||
print(
|
||||
'number of stations used: {0}\n'.format(len(self.magnitudes.values())))
|
||||
print('\tstation\tmagnitude')
|
||||
for s, m in self.magnitudes.items(): print('\t{0}\t{1}'.format(s, m))
|
||||
|
||||
def __nonzero__(self):
|
||||
return bool(self.magnitudes)
|
||||
|
||||
@property
|
||||
def type(self):
|
||||
return self._type
|
||||
|
||||
@property
|
||||
def plot_flag(self):
|
||||
return self._plot_flag
|
||||
|
||||
@plot_flag.setter
|
||||
def plot_flag(self, value):
|
||||
self._plot_flag = value
|
||||
|
||||
@property
|
||||
def verbose(self):
|
||||
return self._verbosity
|
||||
|
||||
@verbose.setter
|
||||
def verbose(self, value):
|
||||
if not isinstance(value, bool):
|
||||
print('WARNING: only boolean values accepted...\n')
|
||||
value = bool(value)
|
||||
self._verbosity = value
|
||||
|
||||
@property
|
||||
def stream(self):
|
||||
return self._stream
|
||||
|
||||
@stream.setter
|
||||
def stream(self, value):
|
||||
self._stream = value
|
||||
|
||||
@property
|
||||
def event(self):
|
||||
return self._event
|
||||
|
||||
@property
|
||||
def origin_id(self):
|
||||
return self._event.origins[0].resource_id
|
||||
|
||||
@property
|
||||
def arrivals(self):
|
||||
return self._event.origins[0].arrivals
|
||||
|
||||
@property
|
||||
def magnitudes(self):
|
||||
return self._magnitudes
|
||||
|
||||
@magnitudes.setter
|
||||
def magnitudes(self, value):
|
||||
"""
|
||||
takes a tuple and saves the key value pair to private
|
||||
attribute _magnitudes
|
||||
:param value: station, magnitude value pair
|
||||
:type value: tuple or list
|
||||
:return:
|
||||
"""
|
||||
station, magnitude = value
|
||||
self._magnitudes[station] = magnitude
|
||||
|
||||
def calc(self):
|
||||
pass
|
||||
|
||||
def updated_event(self, magscaling=None):
|
||||
net_ml = self.net_magnitude(magscaling)
|
||||
if net_ml:
|
||||
self.event.magnitudes.append(net_ml)
|
||||
return self.event
|
||||
|
||||
def net_magnitude(self, magscaling=None):
|
||||
if self:
|
||||
if magscaling is None:
|
||||
scaling = False
|
||||
elif magscaling[0] == 0.0 and magscaling[1] == 0.0:
|
||||
scaling = False
|
||||
else:
|
||||
scaling = True
|
||||
if scaling == True:
|
||||
# scaling necessary
|
||||
print("Scaling network magnitude ...")
|
||||
mag = ope.Magnitude(
|
||||
mag=np.median([M.mag for M in self.magnitudes.values()]) * \
|
||||
magscaling[0] + magscaling[1],
|
||||
magnitude_type=self.type,
|
||||
origin_id=self.origin_id,
|
||||
station_count=len(self.magnitudes),
|
||||
azimuthal_gap=self.origin_id.get_referred_object().quality.azimuthal_gap)
|
||||
else:
|
||||
# no scaling necessary
|
||||
# Temporary fix needs rework
|
||||
if (len(self.magnitudes.keys()) == 0):
|
||||
print("Error in local magnitude calculation ")
|
||||
return None
|
||||
mag = ope.Magnitude(
|
||||
mag=np.median([M.mag for M in self.magnitudes.values()]),
|
||||
magnitude_type=self.type,
|
||||
origin_id=self.origin_id,
|
||||
station_count=len(self.magnitudes),
|
||||
azimuthal_gap=self.origin_id.get_referred_object().quality.azimuthal_gap)
|
||||
return mag
|
||||
|
||||
|
||||
class LocalMagnitude(Magnitude):
|
||||
"""
|
||||
Method to derive peak-to-peak amplitude as seen on a Wood-Anderson-
|
||||
seismograph. Has to be derived from instrument corrected traces!
|
||||
"""
|
||||
|
||||
# poles, zeros and sensitivity of WA seismograph
|
||||
# (see Uhrhammer & Collins, 1990, BSSA, pp. 702-716)
|
||||
_paz = {
|
||||
'poles': [5.6089 - 5.4978j, -5.6089 - 5.4978j],
|
||||
'zeros': [0j, 0j],
|
||||
'gain': 2080,
|
||||
'sensitivity': 1
|
||||
}
|
||||
|
||||
_amplitudes = dict()
|
||||
|
||||
def __init__(self, stream, event, calc_win, wascaling, verbosity=False, iplot=0):
|
||||
super(LocalMagnitude, self).__init__(stream, event, verbosity, iplot)
|
||||
|
||||
self._calc_win = calc_win
|
||||
self._wascaling = wascaling
|
||||
self._type = 'ML'
|
||||
self.calc()
|
||||
|
||||
@property
|
||||
def calc_win(self):
|
||||
return self._calc_win
|
||||
|
||||
@calc_win.setter
|
||||
def calc_win(self, value):
|
||||
self._calc_win = value
|
||||
|
||||
@property
|
||||
def wascaling(self):
|
||||
return self._wascaling
|
||||
|
||||
@property
|
||||
def amplitudes(self):
|
||||
return self._amplitudes
|
||||
|
||||
@amplitudes.setter
|
||||
def amplitudes(self, value):
|
||||
station, a0 = value
|
||||
self._amplitudes[station] = a0
|
||||
|
||||
def peak_to_peak(self, st, t0):
|
||||
|
||||
try:
|
||||
iplot = int(self.plot_flag)
|
||||
except:
|
||||
if self.plot_flag == True or self.plot_flag == 'True':
|
||||
iplot = 2
|
||||
else:
|
||||
iplot = 0
|
||||
|
||||
# simulate Wood-Anderson response
|
||||
st.simulate(paz_remove=None, paz_simulate=self._paz)
|
||||
|
||||
# trim waveform to common range
|
||||
stime, etime = common_range(st)
|
||||
st.trim(stime, etime)
|
||||
|
||||
# get time delta from waveform data
|
||||
dt = st[0].stats.delta
|
||||
|
||||
power = [np.power(tr.data, 2) for tr in st if tr.stats.channel[-1] not
|
||||
in 'Z3']
|
||||
# checking horizontal count and calculating power_sum accordingly
|
||||
if len(power) == 1:
|
||||
print('WARNING: Only one horizontal found for station {0}.'.format(st[0].stats.station))
|
||||
power_sum = power[0]
|
||||
elif len(power) == 2:
|
||||
power_sum = power[0] + power[1]
|
||||
else:
|
||||
raise ValueError('Wood-Anderson aomplitude defintion only valid for'
|
||||
' up to two horizontals: {0} given'.format(len(power)))
|
||||
|
||||
sqH = np.sqrt(power_sum)
|
||||
|
||||
# get time array
|
||||
th = np.arange(0, st[0].stats.npts / st[0].stats.sampling_rate, dt)
|
||||
# get maximum peak within pick window
|
||||
iwin = getsignalwin(th, t0 - stime, self.calc_win)
|
||||
ii = min([iwin[len(iwin) - 1], len(th)])
|
||||
iwin = iwin[0:ii]
|
||||
wapp = np.max(sqH[iwin])
|
||||
if self.verbose:
|
||||
print("Determined Wood-Anderson peak-to-peak amplitude for station {0}: {1} "
|
||||
"mm".format(st[0].stats.station, wapp))
|
||||
|
||||
# check for plot flag (for debugging only)
|
||||
fig = None
|
||||
if iplot > 1:
|
||||
fig = plt.figure()
|
||||
ax = fig.add_subplot(211)
|
||||
ax.plot(th, st[0].data, 'k')
|
||||
ax.plot(th, sqH)
|
||||
ax.plot(th[iwin], sqH[iwin], 'g')
|
||||
ax.plot([t0 - stime, t0 - stime], [0, max(sqH)], 'r', linewidth=2)
|
||||
ax.set_title('Station %s, Channel %s, RMS Horizontal Trace, '
|
||||
'WA-peak-to-peak=%6.3f mm' % (st[0].stats.station,
|
||||
st[0].stats.channel,
|
||||
wapp))
|
||||
ax.set_xlabel('Time [s]')
|
||||
ax.set_ylabel('Displacement [mm]')
|
||||
ax = fig.add_subplot(212)
|
||||
ax.plot(th, st[1].data, 'k')
|
||||
ax.plot(th, sqH)
|
||||
ax.plot(th[iwin], sqH[iwin], 'g')
|
||||
ax.plot([t0 - stime, t0 - stime], [0, max(sqH)], 'r', linewidth=2)
|
||||
ax.set_title('Channel %s, RMS Horizontal Trace, '
|
||||
'WA-peak-to-peak=%6.3f mm' % (st[1].stats.channel,
|
||||
wapp))
|
||||
ax.set_xlabel('Time [s]')
|
||||
ax.set_ylabel('Displacement [mm]')
|
||||
fig.show()
|
||||
try:
|
||||
input()
|
||||
except SyntaxError:
|
||||
pass
|
||||
plt.close(fig)
|
||||
|
||||
return wapp, fig
|
||||
|
||||
def calc(self):
|
||||
for a in self.arrivals:
|
||||
if a.phase not in 'sS':
|
||||
continue
|
||||
pick = a.pick_id.get_referred_object()
|
||||
station = pick.waveform_id.station_code
|
||||
# make sure calculating Ml only from reliable onsets
|
||||
# NLLoc: time_weight = 0 => do not use onset!
|
||||
if a.time_weight == 0:
|
||||
print("Uncertain pick at Station {}, do not use it!".format(station))
|
||||
continue
|
||||
wf = select_for_phase(self.stream.select(
|
||||
station=station), a.phase)
|
||||
if not wf:
|
||||
if self.verbose:
|
||||
print(
|
||||
'WARNING: no waveform data found for station {0}'.format(
|
||||
station))
|
||||
continue
|
||||
delta = degrees2kilometers(a.distance)
|
||||
onset = pick.time
|
||||
a0, self.p2p_fig = self.peak_to_peak(wf, onset)
|
||||
amplitude = ope.Amplitude(generic_amplitude=a0 * 1e-3)
|
||||
amplitude.unit = 'm'
|
||||
amplitude.category = 'point'
|
||||
amplitude.waveform_id = pick.waveform_id
|
||||
amplitude.magnitude_hint = self.type
|
||||
amplitude.pick_id = pick.resource_id
|
||||
amplitude.type = 'AML'
|
||||
self.event.amplitudes.append(amplitude)
|
||||
self.amplitudes = (station, amplitude)
|
||||
# using standard Gutenberg-Richter relation
|
||||
# or scale WA amplitude with given scaling relation
|
||||
if str(self.wascaling) == '[0.0, 0.0, 0.0]':
|
||||
print("Calculating original Richter magnitude ...")
|
||||
magnitude = ope.StationMagnitude(mag=np.log10(a0) \
|
||||
+ richter_magnitude_scaling(delta))
|
||||
else:
|
||||
print("Calculating scaled local magnitude ...")
|
||||
a0 = a0 * 1e03 # mm to nm (see Havskov & Ottemöller, 2010)
|
||||
magnitude = ope.StationMagnitude(mag=np.log10(a0) \
|
||||
+ self.wascaling[0] * np.log10(delta) + self.wascaling[1]
|
||||
* delta + self.wascaling[
|
||||
2])
|
||||
if self.verbose:
|
||||
print(
|
||||
"Local Magnitude for station {0}: ML = {1:3.1f}".format(
|
||||
station, magnitude.mag))
|
||||
magnitude.origin_id = self.origin_id
|
||||
magnitude.waveform_id = pick.waveform_id
|
||||
magnitude.amplitude_id = amplitude.resource_id
|
||||
magnitude.station_magnitude_type = self.type
|
||||
self.event.station_magnitudes.append(magnitude)
|
||||
self.magnitudes = (station, magnitude)
|
||||
|
||||
|
||||
class MomentMagnitude(Magnitude):
|
||||
'''
|
||||
Method to calculate seismic moment Mo and moment magnitude Mw.
|
||||
Requires results of class calcsourcespec for calculating plateau w0
|
||||
and corner frequency fc of source spectrum, respectively. Uses
|
||||
subfunction calcMoMw.py. Returns modified dictionary of picks including
|
||||
Dc-value, corner frequency fc, seismic moment Mo and
|
||||
corresponding moment magntiude Mw.
|
||||
'''
|
||||
|
||||
_props = dict()
|
||||
|
||||
def __init__(self, stream, event, vp, Qp, density, verbosity=False,
|
||||
iplot=False):
|
||||
super(MomentMagnitude, self).__init__(stream, event, verbosity, iplot)
|
||||
|
||||
self._vp = vp
|
||||
self._Qp = Qp
|
||||
self._density = density
|
||||
self._type = 'Mw'
|
||||
self.calc()
|
||||
|
||||
@property
|
||||
def p_velocity(self):
|
||||
return self._vp
|
||||
|
||||
@property
|
||||
def p_attenuation(self):
|
||||
return self._Qp
|
||||
|
||||
@property
|
||||
def rock_density(self):
|
||||
return self._density
|
||||
|
||||
@property
|
||||
def moment_props(self):
|
||||
return self._props
|
||||
|
||||
@moment_props.setter
|
||||
def moment_props(self, value):
|
||||
station, props = value
|
||||
self._props[station] = props
|
||||
|
||||
@property
|
||||
def seismic_moment(self):
|
||||
return self._m0
|
||||
|
||||
@seismic_moment.setter
|
||||
def seismic_moment(self, value):
|
||||
self._m0 = value
|
||||
|
||||
def calc(self):
|
||||
for a in self.arrivals:
|
||||
if a.phase not in 'pP':
|
||||
continue
|
||||
# make sure calculating Mo only from reliable onsets
|
||||
# NLLoc: time_weight = 0 => do not use onset!
|
||||
if a.time_weight == 0:
|
||||
continue
|
||||
pick = a.pick_id.get_referred_object()
|
||||
station = pick.waveform_id.station_code
|
||||
if len(self.stream) <= 2:
|
||||
print("Station:" '{0}'.format(station))
|
||||
print("WARNING: No instrument corrected data available,"
|
||||
" no magnitude calculation possible! Go on.")
|
||||
continue
|
||||
wf = self.stream.select(station=station)
|
||||
if not wf:
|
||||
continue
|
||||
try:
|
||||
scopy = wf.copy()
|
||||
except AssertionError:
|
||||
print("WARNING: Something's wrong with the data,"
|
||||
"station {},"
|
||||
"no calculation of moment magnitude possible! Go on.".format(station))
|
||||
continue
|
||||
onset = pick.time
|
||||
distance = degrees2kilometers(a.distance)
|
||||
azimuth = a.azimuth
|
||||
incidence = a.takeoff_angle
|
||||
if not 0. <= incidence <= 360.:
|
||||
if self.verbose:
|
||||
print(f'WARNING: Incidence angle outside bounds - {incidence}')
|
||||
return
|
||||
w0, fc = calcsourcespec(scopy, onset, self.p_velocity, distance,
|
||||
azimuth, incidence, self.p_attenuation,
|
||||
self.plot_flag, self.verbose)
|
||||
if w0 is None or fc is None:
|
||||
if self.verbose:
|
||||
print("WARNING: insufficient frequency information")
|
||||
continue
|
||||
WF = select_for_phase(scopy, "P")
|
||||
m0, mw = calcMoMw(WF, w0, self.rock_density, self.p_velocity,
|
||||
distance, self.verbose)
|
||||
self.moment_props = (station, dict(w0=w0, fc=fc, Mo=m0))
|
||||
magnitude = ope.StationMagnitude(mag=mw)
|
||||
magnitude.origin_id = self.origin_id
|
||||
magnitude.waveform_id = pick.waveform_id
|
||||
magnitude.station_magnitude_type = self.type
|
||||
self.event.station_magnitudes.append(magnitude)
|
||||
self.magnitudes = (station, magnitude)
|
||||
|
||||
# WIP JG
|
||||
def getSourceSpec(self):
|
||||
for a in self.arrivals:
|
||||
if a.phase not in 'pP':
|
||||
continue
|
||||
# make sure calculating Mo only from reliable onsets
|
||||
# NLLoc: time_weight = 0 => do not use onset!
|
||||
if a.time_weight == 0:
|
||||
continue
|
||||
pick = a.pick_id.get_referred_object()
|
||||
station = pick.waveform_id.station_code
|
||||
if len(self.stream) <= 2:
|
||||
print("Station:" '{0}'.format(station))
|
||||
print("WARNING: No instrument corrected data available,"
|
||||
" no magnitude calculation possible! Go on.")
|
||||
continue
|
||||
wf = self.stream.select(station=station)
|
||||
if not wf:
|
||||
continue
|
||||
try:
|
||||
scopy = wf.copy()
|
||||
except AssertionError:
|
||||
print("WARNING: Something's wrong with the data,"
|
||||
"station {},"
|
||||
"no calculation of moment magnitude possible! Go on.".format(station))
|
||||
continue
|
||||
onset = pick.time
|
||||
distance = degrees2kilometers(a.distance)
|
||||
azimuth = a.azimuth
|
||||
incidence = a.takeoff_angle
|
||||
w0, fc, plt = calcsourcespec(scopy, onset, self.p_velocity, distance,
|
||||
azimuth, incidence, self.p_attenuation,
|
||||
3, self.verbose)
|
||||
return w0, fc, plt
|
||||
|
||||
def calcMoMw(wfstream, w0, rho, vp, delta, verbosity=False):
|
||||
'''
|
||||
Subfunction of run_calcMoMw to calculate individual
|
||||
seismic moments and corresponding moment magnitudes.
|
||||
|
||||
:param: wfstream
|
||||
:type: `~obspy.core.stream.Stream`
|
||||
|
||||
:param: w0, height of plateau of source spectrum
|
||||
:type: float
|
||||
|
||||
:param: rho, rock density [kg/m³]
|
||||
:type: integer
|
||||
|
||||
:param: delta, hypocentral distance [km]
|
||||
:type: integer
|
||||
|
||||
:param: inv, name/path of inventory or dataless-SEED file
|
||||
:type: string
|
||||
'''
|
||||
|
||||
tr = wfstream[0]
|
||||
delta = delta * 1000 # hypocentral distance in [m]
|
||||
|
||||
if verbosity:
|
||||
print(
|
||||
"calcMoMw: Calculating seismic moment Mo and moment magnitude Mw \
|
||||
for station {0} ...".format(tr.stats.station))
|
||||
|
||||
# additional common parameters for calculating Mo
|
||||
# average radiation pattern of P waves (Aki & Richards, 1980)
|
||||
rP = 2 / np.sqrt(15)
|
||||
freesurf = 2.0 # free surface correction, assuming vertical incidence
|
||||
|
||||
Mo = w0 * 4 * np.pi * rho * np.power(vp, 3) * delta / (rP * freesurf)
|
||||
|
||||
# Mw = np.log10(Mo * 1e07) * 2 / 3 - 10.7 # after Hanks & Kanamori (1979),
|
||||
# defined for [dyn*cm]!
|
||||
Mw = np.log10(Mo) * 2 / 3 - 6.7 # for metric units
|
||||
|
||||
if verbosity:
|
||||
print(
|
||||
"calcMoMw: Calculated seismic moment Mo = {0} Nm => Mw = {1:3.1f} ".format(
|
||||
Mo, Mw))
|
||||
|
||||
return Mo, Mw
|
||||
|
||||
|
||||
def calcsourcespec(wfstream, onset, vp, delta, azimuth, incidence,
|
||||
qp, iplot=0, verbosity=False):
|
||||
'''
|
||||
Subfunction to calculate the source spectrum and to derive from that the plateau
|
||||
(usually called omega0) and the corner frequency assuming Aki's omega-square
|
||||
source model. Has to be derived from instrument corrected displacement traces,
|
||||
thus restitution and integration necessary! Integrated traces are rotated
|
||||
into ray-coordinate system ZNE => LQT using Obspy's rotate modul!
|
||||
|
||||
:param: wfstream (corrected for instrument)
|
||||
:type: `~obspy.core.stream.Stream`
|
||||
|
||||
:param: onset, P-phase onset time
|
||||
:type: float
|
||||
|
||||
:param: vp, Vp-wave velocity
|
||||
:type: float
|
||||
|
||||
:param: delta, hypocentral distance [km]
|
||||
:type: integer
|
||||
|
||||
:param: azimuth
|
||||
:type: integer
|
||||
|
||||
:param: incidence
|
||||
:type: integer
|
||||
|
||||
:param: Qp, quality factor for P-waves
|
||||
:type: integer
|
||||
|
||||
:param: iplot, show results (iplot>1) or not (iplot<1)
|
||||
:type: integer
|
||||
'''
|
||||
if verbosity:
|
||||
print("Calculating source spectrum for station %s ...." % wfstream[0].stats.station)
|
||||
|
||||
try:
|
||||
iplot = int(iplot)
|
||||
except:
|
||||
if iplot == True or iplot == 'True':
|
||||
iplot = 2
|
||||
else:
|
||||
iplot = 0
|
||||
|
||||
# get Q value
|
||||
Q, A = qp
|
||||
|
||||
dist = delta * 1000 # hypocentral distance in [m]
|
||||
|
||||
Fc = None
|
||||
w0 = None
|
||||
zdat = select_for_phase(wfstream, "P")
|
||||
|
||||
if len(zdat) == 0:
|
||||
print("No vertical component found in stream:\n{}".format(wfstream))
|
||||
print("No calculation of source spectrum possible!")
|
||||
return w0, Fc
|
||||
|
||||
dt = zdat[0].stats.delta
|
||||
|
||||
freq = zdat[0].stats.sampling_rate
|
||||
|
||||
# trim traces to common range (for rotation)
|
||||
trstart, trend = common_range(wfstream)
|
||||
wfstream.trim(trstart, trend)
|
||||
# rotate into LQT (ray-coordindate-) system using Obspy's rotate
|
||||
# L: P-wave direction
|
||||
# Q: SV-wave direction
|
||||
# T: SH-wave direction
|
||||
LQT = wfstream.rotate('ZNE->LQT', azimuth, incidence)
|
||||
ldat = LQT.select(component="L")
|
||||
if len(ldat) == 0:
|
||||
# if horizontal channels are 1 and 2
|
||||
# no azimuth information is available and thus no
|
||||
# rotation is possible!
|
||||
if verbosity:
|
||||
print("calcsourcespec: Azimuth information is missing, "
|
||||
"no rotation of components possible!")
|
||||
# instead, use component 3
|
||||
ldat = LQT.select(component="3")
|
||||
if len(ldat) == 0:
|
||||
# maybe component z available
|
||||
ldat = LQT.select(component="Z")
|
||||
|
||||
# integrate to displacement
|
||||
# unrotated vertical component (for comparison)
|
||||
inttrz = signal.detrend(integrate.cumtrapz(zdat[0].data, None, dt))
|
||||
# rotated component Z => L
|
||||
Ldat = signal.detrend(integrate.cumtrapz(ldat[0].data, None, dt))
|
||||
|
||||
# get window after P pulse for
|
||||
# calculating source spectrum
|
||||
rel_onset = onset - trstart
|
||||
impickP = int(rel_onset * freq)
|
||||
wfzc = Ldat[impickP: len(Ldat) - 1]
|
||||
# get time array
|
||||
t = np.arange(0, len(inttrz) * dt, dt)
|
||||
# calculate spectrum using only first cycles of
|
||||
# waveform after P onset!
|
||||
zc = crossings_nonzero_all(wfzc)
|
||||
if np.size(zc) == 0 or len(zc) <= 3:
|
||||
if verbosity:
|
||||
print("calcsourcespec: Something is wrong with the waveform, "
|
||||
"no zero crossings derived!\n")
|
||||
print("No calculation of source spectrum possible!")
|
||||
else:
|
||||
index = min([3, len(zc) - 1])
|
||||
calcwin = (zc[index] - zc[0]) * dt
|
||||
iwin = getsignalwin(t, rel_onset, calcwin)
|
||||
xdat = Ldat[iwin]
|
||||
|
||||
# fft
|
||||
fny = freq / 2
|
||||
# l = len(xdat) / freq
|
||||
# number of fft bins after Bath
|
||||
# n = freq * l
|
||||
# find next power of 2 of data length
|
||||
m = pow(2, np.ceil(np.log(len(xdat)) / np.log(2)))
|
||||
N = min(int(np.power(m, 2)), 16384)
|
||||
# N = int(np.power(m, 2))
|
||||
y = dt * np.fft.fft(xdat, N)
|
||||
Y = abs(y[: int(N / 2)])
|
||||
L = (N - 1) / freq
|
||||
f = np.arange(0, fny, 1 / L)
|
||||
|
||||
# remove zero-frequency and frequencies above
|
||||
# corner frequency of seismometer (assumed
|
||||
# to be 100 Hz)
|
||||
fi = np.where((f >= 1) & (f < 100))
|
||||
F = f[fi]
|
||||
YY = Y[fi]
|
||||
|
||||
# correction for attenuation
|
||||
wa = 2 * np.pi * F # angular frequency
|
||||
D = np.exp((wa * dist) / (2 * vp * Q * F ** A))
|
||||
YYcor = YY.real * D
|
||||
|
||||
# get plateau (DC value) and corner frequency
|
||||
# initial guess of plateau
|
||||
w0in = np.mean(YYcor[0:100])
|
||||
# initial guess of corner frequency
|
||||
# where spectral level reached 50% of flat level
|
||||
iin = np.where(YYcor >= 0.5 * w0in)
|
||||
Fcin = F[iin[0][np.size(iin) - 1]]
|
||||
|
||||
# use of implicit scipy otimization function
|
||||
fit = synthsourcespec(F, w0in, Fcin)
|
||||
[optspecfit, _] = curve_fit(synthsourcespec, F, YYcor, [w0in, Fcin])
|
||||
w01 = optspecfit[0]
|
||||
fc1 = optspecfit[1]
|
||||
if verbosity:
|
||||
print("calcsourcespec: Determined w0-value: %e m/Hz, \n"
|
||||
"calcsourcespec: Determined corner frequency: %f Hz" % (w01, fc1))
|
||||
|
||||
# use of conventional fitting
|
||||
[w02, fc2] = fitSourceModel(F, YYcor, Fcin, iplot, verbosity)
|
||||
|
||||
# get w0 and fc as median of both
|
||||
# source spectrum fits
|
||||
w0 = np.median([w01, w02])
|
||||
Fc = np.median([fc1, fc2])
|
||||
if verbosity:
|
||||
print("calcsourcespec: Using w0-value = %e m/Hz and fc = %f Hz" % (
|
||||
w0, Fc))
|
||||
if iplot >= 1:
|
||||
f1 = plt.figure()
|
||||
tLdat = np.arange(0, len(Ldat) * dt, dt)
|
||||
plt.subplot(2, 1, 1)
|
||||
# show displacement in mm
|
||||
p1, = plt.plot(t, np.multiply(inttrz, 1000), 'k')
|
||||
p2, = plt.plot(tLdat, np.multiply(Ldat, 1000))
|
||||
plt.legend([p1, p2], ['Displacement', 'Rotated Displacement'])
|
||||
if iplot == 1:
|
||||
plt.plot(t[iwin], np.multiply(xdat, 1000), 'g')
|
||||
plt.title('Seismogram and P Pulse, Station %s-%s' \
|
||||
% (zdat[0].stats.station, zdat[0].stats.channel))
|
||||
else:
|
||||
plt.title('Seismogram, Station %s-%s' \
|
||||
% (zdat[0].stats.station, zdat[0].stats.channel))
|
||||
plt.xlabel('Time since %s' % zdat[0].stats.starttime)
|
||||
plt.ylabel('Displacement [mm]')
|
||||
|
||||
if iplot > 1:
|
||||
plt.subplot(2, 1, 2)
|
||||
p1, = plt.loglog(f, Y.real, 'k')
|
||||
p2, = plt.loglog(F, YY.real)
|
||||
p3, = plt.loglog(F, YYcor, 'r')
|
||||
p4, = plt.loglog(F, fit, 'g')
|
||||
plt.loglog([Fc, Fc], [w0 / 100, w0], 'g')
|
||||
plt.legend([p1, p2, p3, p4], ['Raw Spectrum',
|
||||
'Used Raw Spectrum',
|
||||
'Q-Corrected Spectrum',
|
||||
'Fit to Spectrum'])
|
||||
plt.title('Source Spectrum from P Pulse, w0=%e m/Hz, fc=%6.2f Hz' \
|
||||
% (w0, Fc))
|
||||
plt.xlabel('Frequency [Hz]')
|
||||
plt.ylabel('Amplitude [m/Hz]')
|
||||
plt.grid()
|
||||
if iplot == 3:
|
||||
return w0, Fc, plt
|
||||
plt.show()
|
||||
try:
|
||||
input()
|
||||
except SyntaxError:
|
||||
pass
|
||||
plt.close(f1)
|
||||
|
||||
return w0, Fc
|
||||
|
||||
|
||||
def synthsourcespec(f, omega0, fcorner):
|
||||
'''
|
||||
Calculates synthetic source spectrum from given plateau and corner
|
||||
frequency assuming Akis omega-square model.
|
||||
|
||||
:param: f, frequencies
|
||||
:type: array
|
||||
|
||||
:param: omega0, DC-value (plateau) of source spectrum
|
||||
:type: float
|
||||
|
||||
:param: fcorner, corner frequency of source spectrum
|
||||
:type: float
|
||||
'''
|
||||
|
||||
# ssp = omega0 / (pow(2, (1 + f / fcorner)))
|
||||
ssp = omega0 / (1 + pow(2, (f / fcorner)))
|
||||
|
||||
return ssp
|
||||
|
||||
|
||||
def fitSourceModel(f, S, fc0, iplot, verbosity=False):
|
||||
'''
|
||||
Calculates synthetic source spectrum by varying corner frequency fc.
|
||||
Returns best approximated plateau omega0 and corner frequency, i.e. with least
|
||||
common standard deviations.
|
||||
|
||||
:param: f, frequencies
|
||||
:type: array
|
||||
|
||||
:param: S, observed source spectrum
|
||||
:type: array
|
||||
|
||||
:param: fc0, initial corner frequency
|
||||
:type: float
|
||||
'''
|
||||
|
||||
try:
|
||||
iplot = int(iplot)
|
||||
except:
|
||||
if iplot == True or iplot == 'True':
|
||||
iplot = 2
|
||||
else:
|
||||
iplot = 0
|
||||
|
||||
w0 = []
|
||||
stdw0 = []
|
||||
fc = []
|
||||
stdfc = []
|
||||
STD = []
|
||||
# get window around initial corner frequency for trials
|
||||
# left side of initial corner frequency
|
||||
fcstopl = max(f[0], fc0 - max(1, fc0 / 2))
|
||||
il = np.where(f <= fcstopl)
|
||||
il = il[0][np.size(il) - 1]
|
||||
# right side of initial corner frequency
|
||||
fcstopr = min(fc0 + (fc0 / 2), f[len(f) - 1])
|
||||
ir = np.where(f >= fcstopr)
|
||||
# check, if fcstopr is available
|
||||
if np.size(ir) == 0:
|
||||
fcstopr = fc0
|
||||
ir = len(f) - 1
|
||||
else:
|
||||
ir = ir[0][0]
|
||||
|
||||
# vary corner frequency around initial point
|
||||
print("fitSourceModel: Varying corner frequency "
|
||||
"around initial corner frequency ...")
|
||||
# check difference of il and ir in order to
|
||||
# keep calculation time acceptable
|
||||
idiff = ir - il
|
||||
if idiff > 100000:
|
||||
increment = 1000
|
||||
elif idiff <= 100000 and idiff > 10000:
|
||||
increment = 100
|
||||
elif idiff <= 20:
|
||||
increment = 1
|
||||
else:
|
||||
increment = 10
|
||||
for i in range(il, ir, increment):
|
||||
FC = f[i]
|
||||
indexdc = np.where((f > 0) & (f <= FC))
|
||||
dc = np.mean(S[indexdc])
|
||||
stddc = np.std(dc - S[indexdc])
|
||||
w0.append(dc)
|
||||
stdw0.append(stddc)
|
||||
fc.append(FC)
|
||||
# slope
|
||||
indexfc = np.where((f >= FC) & (f <= fcstopr))
|
||||
yi = dc / (1 + (f[indexfc] / FC) ** 2)
|
||||
stdFC = np.std(yi - S[indexfc])
|
||||
stdfc.append(stdFC)
|
||||
STD.append(stddc + stdFC)
|
||||
|
||||
# get best found w0 anf fc from minimum
|
||||
if len(STD) > 0:
|
||||
Fc = fc[np.argmin(STD)]
|
||||
w0 = w0[np.argmin(STD)]
|
||||
elif len(STD) == 0:
|
||||
Fc = fc0
|
||||
w0 = max(S)
|
||||
if verbosity:
|
||||
print(
|
||||
"fitSourceModel: best fc: {0} Hz, best w0: {1} m/Hz".format(Fc, w0))
|
||||
if iplot >= 1:
|
||||
plt.figure() # iplot)
|
||||
plt.loglog(f, S, 'k')
|
||||
plt.loglog([f[0], Fc], [w0, w0], 'g')
|
||||
plt.loglog([Fc, Fc], [w0 / 100, w0], 'g')
|
||||
plt.title('Calculated Source Spectrum, Omega0=%e m/Hz, fc=%6.2f Hz' \
|
||||
% (w0, Fc))
|
||||
plt.xlabel('Frequency [Hz]')
|
||||
plt.ylabel('Amplitude [m/Hz]')
|
||||
plt.grid()
|
||||
if iplot == 2:
|
||||
plt.figure() # iplot + 1)
|
||||
plt.subplot(311)
|
||||
plt.plot(fc, STD, '*')
|
||||
plt.title('Common Standard Deviations')
|
||||
plt.xticks([])
|
||||
plt.subplot(312)
|
||||
plt.plot(fc, stdw0, '*')
|
||||
plt.title('Standard Deviations of w0-Values')
|
||||
plt.xticks([])
|
||||
plt.subplot(313)
|
||||
plt.plot(fc, stdfc, '*')
|
||||
plt.title('Standard Deviations of Corner Frequencies')
|
||||
plt.xlabel('Corner Frequencies [Hz]')
|
||||
plt.show()
|
||||
try:
|
||||
input()
|
||||
except SyntaxError:
|
||||
pass
|
||||
plt.close()
|
||||
|
||||
return w0, Fc
|
||||
1
pylot/core/io/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
336
pylot/core/io/data.py
Normal file
@@ -0,0 +1,336 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import os
|
||||
from dataclasses import dataclass, field
|
||||
from typing import List, Union
|
||||
|
||||
from obspy import UTCDateTime
|
||||
|
||||
from pylot.core.io.event import EventData
|
||||
from pylot.core.io.waveformdata import WaveformData
|
||||
from pylot.core.util.dataprocessing import Metadata
|
||||
|
||||
@dataclass
|
||||
class Data:
|
||||
event_data: EventData = field(default_factory=EventData)
|
||||
waveform_data: WaveformData = field(default_factory=WaveformData)
|
||||
metadata: Metadata = field(default_factory=Metadata)
|
||||
_parent: Union[None, 'QtWidgets.QWidget'] = None
|
||||
|
||||
def __init__(self, parent=None, evtdata=None):
|
||||
self._parent = parent
|
||||
self.event_data = EventData(evtdata)
|
||||
self.waveform_data = WaveformData()
|
||||
|
||||
def __str__(self):
|
||||
return str(self.waveform_data.wfdata)
|
||||
|
||||
def __add__(self, other):
|
||||
if not isinstance(other, Data):
|
||||
raise TypeError("Operands must be of type 'Data'")
|
||||
if self.event_data.is_new() and other.event_data.is_new():
|
||||
pass
|
||||
elif other.event_data.is_new():
|
||||
new_picks = other.event_data.evtdata.picks
|
||||
old_picks = self.event_data.evtdata.picks
|
||||
old_picks.extend([pick for pick in new_picks if pick not in old_picks])
|
||||
elif self.event_data.is_new():
|
||||
return other + self
|
||||
elif self.event_data.get_id() == other.event_data.get_id():
|
||||
other.event_data.set_new()
|
||||
return self + other
|
||||
else:
|
||||
raise ValueError("Both Data objects have differing unique Event identifiers")
|
||||
return self
|
||||
|
||||
def get_parent(self):
|
||||
return self._parent
|
||||
|
||||
def filter_wf_data(self, **kwargs):
|
||||
self.waveform_data.wfdata.detrend('linear')
|
||||
self.waveform_data.wfdata.taper(0.02, type='cosine')
|
||||
self.waveform_data.wfdata.filter(**kwargs)
|
||||
self.waveform_data.dirty = True
|
||||
|
||||
def set_wf_data(self, fnames: List[str], fnames_alt: List[str] = None, check_rotated=False, metadata=None, tstart=0, tstop=0):
|
||||
return self.waveform_data.load_waveforms(fnames, fnames_alt, check_rotated, metadata, tstart, tstop)
|
||||
|
||||
def reset_wf_data(self):
|
||||
self.waveform_data.reset()
|
||||
|
||||
def get_wf_data(self):
|
||||
return self.waveform_data.wfdata
|
||||
|
||||
def rotate_wf_data(self):
|
||||
self.waveform_data.rotate_zne(self.metadata)
|
||||
|
||||
|
||||
class GenericDataStructure(object):
|
||||
"""
|
||||
GenericDataBase type holds all information about the current data-
|
||||
base working on.
|
||||
"""
|
||||
|
||||
def __init__(self, **kwargs):
|
||||
|
||||
self.allowedFields = []
|
||||
self.expandFields = ['root']
|
||||
self.dsFields = {}
|
||||
|
||||
self.modifyFields(**kwargs)
|
||||
|
||||
def modifyFields(self, **kwargs):
|
||||
|
||||
"""
|
||||
|
||||
:param kwargs:
|
||||
"""
|
||||
assert isinstance(kwargs, dict), 'dictionary type object expected'
|
||||
|
||||
if not self.extraAllowed():
|
||||
kwargs = self.updateNotAllowed(kwargs)
|
||||
|
||||
for key, value in kwargs.items():
|
||||
key = str(key).lower()
|
||||
if value is not None:
|
||||
if type(value) not in (str, int, float):
|
||||
for n, val in enumerate(value):
|
||||
value[n] = str(val)
|
||||
else:
|
||||
value = str(value)
|
||||
try:
|
||||
self.setFieldValue(key, value)
|
||||
except KeyError as e:
|
||||
errmsg = ''
|
||||
errmsg += 'WARNING:\n'
|
||||
errmsg += 'unable to set values for datastructure fields\n'
|
||||
errmsg += '%s; desired value was: %s\n' % (e, value)
|
||||
print(errmsg)
|
||||
|
||||
def isField(self, key):
|
||||
"""
|
||||
|
||||
:param key:
|
||||
:return:
|
||||
"""
|
||||
return key in self.getFields().keys()
|
||||
|
||||
def getFieldValue(self, key):
|
||||
"""
|
||||
|
||||
:param key:
|
||||
:return:
|
||||
"""
|
||||
if self.isField(key):
|
||||
return self.getFields()[key]
|
||||
else:
|
||||
return
|
||||
|
||||
def setFieldValue(self, key, value):
|
||||
"""
|
||||
|
||||
:param key:
|
||||
:param value:
|
||||
:raise KeyError:
|
||||
"""
|
||||
if not self.extraAllowed() and key not in self.getAllowed():
|
||||
raise KeyError
|
||||
else:
|
||||
if not self.isField(key):
|
||||
print('creating new field "%s"' % key)
|
||||
self.getFields()[key] = value
|
||||
|
||||
def getFields(self):
|
||||
"""
|
||||
|
||||
|
||||
:return:
|
||||
"""
|
||||
return self.dsFields
|
||||
|
||||
def getExpandFields(self):
|
||||
"""
|
||||
|
||||
|
||||
:return:
|
||||
"""
|
||||
return self.expandFields
|
||||
|
||||
def setExpandFields(self, keys):
|
||||
"""
|
||||
|
||||
:param keys:
|
||||
"""
|
||||
expandFields = []
|
||||
for key in keys:
|
||||
if self.isField(key):
|
||||
expandFields.append(key)
|
||||
self.expandFields = expandFields
|
||||
|
||||
def getAllowed(self):
|
||||
"""
|
||||
|
||||
|
||||
:return:
|
||||
"""
|
||||
return self.allowedFields
|
||||
|
||||
def extraAllowed(self):
|
||||
"""
|
||||
|
||||
|
||||
:return:
|
||||
"""
|
||||
return not self.allowedFields
|
||||
|
||||
def updateNotAllowed(self, kwargs):
|
||||
"""
|
||||
|
||||
:param kwargs:
|
||||
:return:
|
||||
"""
|
||||
for key in kwargs:
|
||||
if key not in self.getAllowed():
|
||||
kwargs.__delitem__(key)
|
||||
return kwargs
|
||||
|
||||
def hasSuffix(self):
|
||||
"""
|
||||
|
||||
|
||||
:return:
|
||||
"""
|
||||
try:
|
||||
self.getFieldValue('suffix')
|
||||
except KeyError:
|
||||
return False
|
||||
else:
|
||||
if self.getFieldValue('suffix'):
|
||||
return True
|
||||
return False
|
||||
|
||||
def expandDataPath(self):
|
||||
"""
|
||||
|
||||
|
||||
:return:
|
||||
"""
|
||||
expandList = []
|
||||
for item in self.getExpandFields():
|
||||
expandList.append(self.getFieldValue(item))
|
||||
if self.hasSuffix():
|
||||
expandList.append('*%s' % self.getFieldValue('suffix'))
|
||||
return os.path.join(*expandList)
|
||||
|
||||
def getCatalogName(self):
|
||||
"""
|
||||
|
||||
|
||||
:return:
|
||||
"""
|
||||
return os.path.join(self.getFieldValue('root'), 'catalog.qml')
|
||||
|
||||
|
||||
class PilotDataStructure(GenericDataStructure):
|
||||
"""
|
||||
Object containing the data access information for the old PILOT data
|
||||
structure.
|
||||
"""
|
||||
|
||||
def __init__(self, **fields):
|
||||
if not fields:
|
||||
fields = {'database': '',
|
||||
'root': ''}
|
||||
|
||||
GenericDataStructure.__init__(self, **fields)
|
||||
|
||||
self.setExpandFields(['root', 'database'])
|
||||
|
||||
|
||||
class SeiscompDataStructure(GenericDataStructure):
|
||||
"""
|
||||
Dictionary containing the data access information for an SDS data archive:
|
||||
|
||||
:param str dataType: Desired data type. Default: ``'waveform'``
|
||||
:param sdate, edate: Either date string or an instance of
|
||||
:class:`obspy.core.utcdatetime.UTCDateTime. Default: ``None``
|
||||
:type sdate, edate: str or UTCDateTime or None
|
||||
"""
|
||||
|
||||
def __init__(self, rootpath='/data/SDS', dataformat='MSEED',
|
||||
filesuffix=None, **kwargs):
|
||||
super(GenericDataStructure, self).__init__()
|
||||
|
||||
edate = UTCDateTime()
|
||||
halfyear = UTCDateTime('1970-07-01')
|
||||
sdate = UTCDateTime(edate - halfyear)
|
||||
del halfyear
|
||||
|
||||
year = ''
|
||||
if not edate.year == sdate.year:
|
||||
nyears = edate.year - sdate.year
|
||||
for yr in range(nyears):
|
||||
year += '{0:04d},'.format(sdate.year + yr)
|
||||
year = '{' + year[:-1] + '}'
|
||||
else:
|
||||
year = '{0:04d}'.format(sdate.year)
|
||||
|
||||
# SDS fields' default values
|
||||
# definitions from
|
||||
# http://www.seiscomp3.org/wiki/doc/applications/slarchive/SDS
|
||||
|
||||
self.dsFields = {'root': '/data/SDS', 'YEAR': year, 'NET': '??',
|
||||
'STA': '????', 'CHAN': 'HH?', 'TYPE': 'D', 'LOC': '',
|
||||
'DAY': '{0:03d}'.format(sdate.julday)
|
||||
}
|
||||
self.modifiyFields(**kwargs)
|
||||
|
||||
def modifiyFields(self, **kwargs):
|
||||
"""
|
||||
|
||||
:param kwargs:
|
||||
"""
|
||||
if kwargs and isinstance(kwargs, dict):
|
||||
for key, value in kwargs.iteritems():
|
||||
key = str(key)
|
||||
if type(value) not in (str, int, float):
|
||||
for n, val in enumerate(value):
|
||||
value[n] = str(val)
|
||||
else:
|
||||
value = str(value)
|
||||
try:
|
||||
self.setFieldValue(key, value)
|
||||
except KeyError as e:
|
||||
errmsg = ''
|
||||
errmsg += 'WARNING:\n'
|
||||
errmsg += 'unable to set values for SDS fields\n'
|
||||
errmsg += '%s; desired value was: %s\n' % (e, value)
|
||||
print(errmsg)
|
||||
|
||||
def setFieldValue(self, key, value):
|
||||
"""
|
||||
|
||||
:param key:
|
||||
:param value:
|
||||
"""
|
||||
if self.isField(key):
|
||||
self.getFields()[key] = value
|
||||
else:
|
||||
print('Warning: trying to set value of non-existent field '
|
||||
'{field}'.format(field=key))
|
||||
|
||||
def expandDataPath(self):
|
||||
"""
|
||||
|
||||
|
||||
:return:
|
||||
"""
|
||||
fullChan = '{0}.{1}'.format(self.getFields()['CHAN'], self.getType())
|
||||
dataPath = os.path.join(self.getFields()['SDSdir'],
|
||||
self.getFields()['YEAR'],
|
||||
self.getFields()['NET'],
|
||||
self.getFields()['STA'],
|
||||
fullChan,
|
||||
'*{0}'.format(self.getFields()['DAY']))
|
||||
return dataPath
|
||||
616
pylot/core/io/default_parameters.py
Normal file
@@ -0,0 +1,616 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
import numpy as np
|
||||
|
||||
"""
|
||||
Default parameters used for picking
|
||||
"""
|
||||
|
||||
defaults = {'rootpath': {'type': str,
|
||||
'tooltip': 'project path',
|
||||
'value': '',
|
||||
'namestring': 'Root path'},
|
||||
|
||||
'datapath': {'type': str,
|
||||
'tooltip': 'data path',
|
||||
'value': '',
|
||||
'namestring': 'Data path'},
|
||||
|
||||
'database': {'type': str,
|
||||
'tooltip': 'name of data base',
|
||||
'value': '',
|
||||
'namestring': 'Database path'},
|
||||
|
||||
'eventID': {'type': str,
|
||||
'tooltip': 'event ID for single event processing (* for all events found in database)',
|
||||
'value': '',
|
||||
'namestring': 'Event ID'},
|
||||
|
||||
'extent': {'type': str,
|
||||
'tooltip': 'extent of array ("active", "local", "regional" or "global")',
|
||||
'value': 'local',
|
||||
'namestring': 'Array extent'},
|
||||
|
||||
'invdir': {'type': str,
|
||||
'tooltip': 'full path to inventory or dataless-seed file',
|
||||
'value': '',
|
||||
'namestring': 'Inventory directory'},
|
||||
|
||||
'datastructure': {'type': str,
|
||||
'tooltip': 'choose data structure',
|
||||
'value': 'PILOT',
|
||||
'namestring': 'Datastructure'},
|
||||
|
||||
'apverbose': {'type': bool,
|
||||
'tooltip': "choose 'True' or 'False' for terminal output",
|
||||
'value': True,
|
||||
'namestring': 'App. verbosity'},
|
||||
|
||||
'nllocbin': {'type': str,
|
||||
'tooltip': 'path to NLLoc executable',
|
||||
'value': '',
|
||||
'namestring': 'NLLoc bin path'},
|
||||
|
||||
'nllocroot': {'type': str,
|
||||
'tooltip': 'root of NLLoc-processing directory',
|
||||
'value': '',
|
||||
'namestring': 'NLLoc root path'},
|
||||
|
||||
'phasefile': {'type': str,
|
||||
'tooltip': 'name of autoPyLoT-output phase file for NLLoc',
|
||||
'value': 'AUTOPHASES.obs',
|
||||
'namestring': 'Phase filename'},
|
||||
|
||||
'ctrfile': {'type': str,
|
||||
'tooltip': 'name of autoPyLoT-output control file for NLLoc',
|
||||
'value': '',
|
||||
'namestring': 'Control filename'},
|
||||
|
||||
'ttpatter': {'type': str,
|
||||
'tooltip': 'pattern of NLLoc ttimes from grid',
|
||||
'value': 'ttime',
|
||||
'namestring': 'Traveltime pattern'},
|
||||
|
||||
'outpatter': {'type': str,
|
||||
'tooltip': 'pattern of NLLoc-output file',
|
||||
'value': 'AUTOLOC_nlloc',
|
||||
'namestring': 'NLLoc output pattern'},
|
||||
|
||||
'vp': {'type': float,
|
||||
'tooltip': 'average P-wave velocity',
|
||||
'value': 3530.,
|
||||
'min': 0.,
|
||||
'max': np.inf,
|
||||
'namestring': 'P-velocity'},
|
||||
|
||||
'rho': {'type': float,
|
||||
'tooltip': 'average rock density [kg/m^3]',
|
||||
'value': 2500.,
|
||||
'min': 0.,
|
||||
'max': np.inf,
|
||||
'namestring': 'Density'},
|
||||
|
||||
'Qp': {'type': (float, float),
|
||||
'tooltip': 'quality factor for P waves (Qp*f^a); list(Qp, a)',
|
||||
'value': (300., 0.8),
|
||||
'namestring': ('Quality factor', 'Qp1', 'Qp2')},
|
||||
|
||||
'pstart': {'type': float,
|
||||
'tooltip': 'start time [s] for calculating CF for P-picking (if TauPy:'
|
||||
' seconds relative to estimated onset)',
|
||||
'value': 15.0,
|
||||
'min': -np.inf,
|
||||
'max': np.inf,
|
||||
'namestring': 'P start'},
|
||||
|
||||
'pstop': {'type': float,
|
||||
'tooltip': 'end time [s] for calculating CF for P-picking (if TauPy:'
|
||||
' seconds relative to estimated onset)',
|
||||
'value': 60.0,
|
||||
'min': -np.inf,
|
||||
'max': np.inf,
|
||||
'namestring': 'P stop'},
|
||||
|
||||
'sstart': {'type': float,
|
||||
'tooltip': 'start time [s] relative to P-onset for calculating CF for S-picking',
|
||||
'value': -1.0,
|
||||
'min': -np.inf,
|
||||
'max': np.inf,
|
||||
'namestring': 'S start'},
|
||||
|
||||
'sstop': {'type': float,
|
||||
'tooltip': 'end time [s] after P-onset for calculating CF for S-picking',
|
||||
'value': 10.0,
|
||||
'min': -np.inf,
|
||||
'max': np.inf,
|
||||
'namestring': 'S stop'},
|
||||
|
||||
'bpz1': {'type': (float, float),
|
||||
'tooltip': 'lower/upper corner freq. of first band pass filter Z-comp. [Hz]',
|
||||
'value': (2, 20),
|
||||
'min': (0., 0.),
|
||||
'max': (np.inf, np.inf),
|
||||
'namestring': ('Z-bandpass 1', 'Lower', 'Upper')},
|
||||
|
||||
'bpz2': {'type': (float, float),
|
||||
'tooltip': 'lower/upper corner freq. of second band pass filter Z-comp. [Hz]',
|
||||
'value': (2, 30),
|
||||
'min': (0., 0.),
|
||||
'max': (np.inf, np.inf),
|
||||
'namestring': ('Z-bandpass 2', 'Lower', 'Upper')},
|
||||
|
||||
'bph1': {'type': (float, float),
|
||||
'tooltip': 'lower/upper corner freq. of first band pass filter H-comp. [Hz]',
|
||||
'value': (2, 15),
|
||||
'min': (0., 0.),
|
||||
'max': (np.inf, np.inf),
|
||||
'namestring': ('H-bandpass 1', 'Lower', 'Upper')},
|
||||
|
||||
'bph2': {'type': (float, float),
|
||||
'tooltip': 'lower/upper corner freq. of second band pass filter z-comp. [Hz]',
|
||||
'value': (2, 20),
|
||||
'min': (0., 0.),
|
||||
'max': (np.inf, np.inf),
|
||||
'namestring': ('H-bandpass 2', 'Lower', 'Upper')},
|
||||
|
||||
'algoP': {'type': str,
|
||||
'tooltip': 'choose algorithm for P-onset determination (HOS, ARZ, or AR3)',
|
||||
'value': 'HOS',
|
||||
'namestring': 'P algorithm'},
|
||||
|
||||
'tlta': {'type': float,
|
||||
'tooltip': 'for HOS-/AR-AIC-picker, length of LTA window [s]',
|
||||
'value': 7.0,
|
||||
'min': 0.,
|
||||
'max': np.inf,
|
||||
'namestring': 'LTA window'},
|
||||
|
||||
'hosorder': {'type': int,
|
||||
'tooltip': 'for HOS-picker, order of Higher Order Statistics',
|
||||
'value': 4,
|
||||
'min': 0,
|
||||
'max': np.inf,
|
||||
'namestring': 'HOS order'},
|
||||
|
||||
'Parorder': {'type': int,
|
||||
'tooltip': 'for AR-picker, order of AR process of Z-component',
|
||||
'value': 2,
|
||||
'min': 0,
|
||||
'max': np.inf,
|
||||
'namestring': 'AR order P'},
|
||||
|
||||
'tdet1z': {'type': float,
|
||||
'tooltip': 'for AR-picker, length of AR determination window [s] for Z-component, 1st pick',
|
||||
'value': 1.2,
|
||||
'min': 0.,
|
||||
'max': np.inf,
|
||||
'namestring': 'AR det. window Z 1'},
|
||||
|
||||
'tpred1z': {'type': float,
|
||||
'tooltip': 'for AR-picker, length of AR prediction window [s] for Z-component, 1st pick',
|
||||
'value': 0.4,
|
||||
'min': 0.,
|
||||
'max': np.inf,
|
||||
'namestring': 'AR pred. window Z 1'},
|
||||
|
||||
'tdet2z': {'type': float,
|
||||
'tooltip': 'for AR-picker, length of AR determination window [s] for Z-component, 2nd pick',
|
||||
'value': 0.6,
|
||||
'min': 0.,
|
||||
'max': np.inf,
|
||||
'namestring': 'AR det. window Z 2'},
|
||||
|
||||
'tpred2z': {'type': float,
|
||||
'tooltip': 'for AR-picker, length of AR prediction window [s] for Z-component, 2nd pick',
|
||||
'value': 0.2,
|
||||
'min': 0.,
|
||||
'max': np.inf,
|
||||
'namestring': 'AR pred. window Z 2'},
|
||||
|
||||
'addnoise': {'type': float,
|
||||
'tooltip': 'add noise to seismogram for stable AR prediction',
|
||||
'value': 0.001,
|
||||
'min': 0.,
|
||||
'max': np.inf,
|
||||
'namestring': 'Add noise'},
|
||||
|
||||
'tsnrz': {'type': (float, float, float, float),
|
||||
'tooltip': 'for HOS/AR, window lengths for SNR-and slope estimation [tnoise, tsafetey, tsignal, tslope] [s]',
|
||||
'value': (3, 0.1, 0.5, 1.0),
|
||||
'min': (0., 0., 0., 0.),
|
||||
'max': (np.inf, np.inf, np.inf, np.inf),
|
||||
'namestring': ('SNR windows P', 'Noise', 'Safety', 'Signal', 'Slope')},
|
||||
|
||||
'pickwinP': {'type': float,
|
||||
'tooltip': 'for initial AIC pick, length of P-pick window [s]',
|
||||
'value': 3.0,
|
||||
'min': 0.,
|
||||
'max': np.inf,
|
||||
'namestring': 'AIC window P'},
|
||||
|
||||
'Precalcwin': {'type': float,
|
||||
'tooltip': 'for HOS/AR, window length [s] for recalculation of CF (relative to 1st pick)',
|
||||
'value': 6.0,
|
||||
'min': 0.,
|
||||
'max': np.inf,
|
||||
'namestring': 'Recal. window P'},
|
||||
|
||||
'aictsmooth': {'type': float,
|
||||
'tooltip': 'for HOS/AR, take average of samples for smoothing of AIC-function [s]',
|
||||
'value': 0.2,
|
||||
'min': 0.,
|
||||
'max': np.inf,
|
||||
'namestring': 'AIC smooth P'},
|
||||
|
||||
'tsmoothP': {'type': float,
|
||||
'tooltip': 'for HOS/AR, take average of samples in this time window for smoothing CF [s]',
|
||||
'value': 0.1,
|
||||
'min': 0.,
|
||||
'max': np.inf,
|
||||
'namestring': 'CF smooth P'},
|
||||
|
||||
'ausP': {'type': float,
|
||||
'tooltip': 'for HOS/AR, artificial uplift of samples (aus) of CF (P)',
|
||||
'value': 0.001,
|
||||
'min': 0.,
|
||||
'max': np.inf,
|
||||
'namestring': 'Artificial uplift P'},
|
||||
|
||||
'nfacP': {'type': float,
|
||||
'tooltip': 'for HOS/AR, noise factor for noise level determination (P)',
|
||||
'value': 1.3,
|
||||
'min': 0.,
|
||||
'max': np.inf,
|
||||
'namestring': 'Noise factor P'},
|
||||
|
||||
'algoS': {'type': str,
|
||||
'tooltip': 'choose algorithm for S-onset determination (ARH or AR3)',
|
||||
'value': 'ARH',
|
||||
'namestring': 'S algorithm'},
|
||||
|
||||
'tdet1h': {'type': float,
|
||||
'tooltip': 'for HOS/AR, length of AR-determination window [s], H-components, 1st pick',
|
||||
'value': 0.8,
|
||||
'min': 0.,
|
||||
'max': np.inf,
|
||||
'namestring': 'AR det. window H 1'},
|
||||
|
||||
'tpred1h': {'type': float,
|
||||
'tooltip': 'for HOS/AR, length of AR-prediction window [s], H-components, 1st pick',
|
||||
'value': 0.4,
|
||||
'min': 0.,
|
||||
'max': np.inf,
|
||||
'namestring': 'AR pred. window H 1'},
|
||||
|
||||
'tdet2h': {'type': float,
|
||||
'tooltip': 'for HOS/AR, length of AR-determinaton window [s], H-components, 2nd pick',
|
||||
'value': 0.6,
|
||||
'min': 0.,
|
||||
'max': np.inf,
|
||||
'namestring': 'AR det. window H 2'},
|
||||
|
||||
'tpred2h': {'type': float,
|
||||
'tooltip': 'for HOS/AR, length of AR-prediction window [s], H-components, 2nd pick',
|
||||
'value': 0.3,
|
||||
'min': 0.,
|
||||
'max': np.inf,
|
||||
'namestring': 'AR pred. window H 2'},
|
||||
|
||||
'Sarorder': {'type': int,
|
||||
'tooltip': 'for AR-picker, order of AR process of H-components',
|
||||
'value': 4,
|
||||
'min': 0,
|
||||
'max': np.inf,
|
||||
'namestring': 'AR order S'},
|
||||
|
||||
'Srecalcwin': {'type': float,
|
||||
'tooltip': 'for AR-picker, window length [s] for recalculation of CF (2nd pick) (H)',
|
||||
'value': 5.0,
|
||||
'min': 0.,
|
||||
'max': np.inf,
|
||||
'namestring': 'Recal. window S'},
|
||||
|
||||
'pickwinS': {'type': float,
|
||||
'tooltip': 'for initial AIC pick, length of S-pick window [s]',
|
||||
'value': 3.0,
|
||||
'min': 0.,
|
||||
'max': np.inf,
|
||||
'namestring': 'AIC window S'},
|
||||
|
||||
'tsnrh': {'type': (float, float, float, float),
|
||||
'tooltip': 'for ARH/AR3, window lengths for SNR-and slope estimation [tnoise, tsafetey, tsignal, tslope] [s]',
|
||||
'value': (2, 0.2, 1.5, 0.5),
|
||||
'min': (0., 0., 0., 0.),
|
||||
'max': (np.inf, np.inf, np.inf, np.inf),
|
||||
'namestring': ('SNR windows S', 'Noise', 'Safety', 'Signal', 'Slope')},
|
||||
|
||||
'aictsmoothS': {'type': float,
|
||||
'tooltip': 'for AIC-picker, take average of samples in this time window for smoothing of AIC-function [s]',
|
||||
'value': 0.5,
|
||||
'min': 0.,
|
||||
'max': np.inf,
|
||||
'namestring': 'AIC smooth S'},
|
||||
|
||||
'tsmoothS': {'type': float,
|
||||
'tooltip': 'for AR-picker, take average of samples for smoothing CF [s] (S)',
|
||||
'value': 0.7,
|
||||
'min': 0.,
|
||||
'max': np.inf,
|
||||
'namestring': 'CF smooth S'},
|
||||
|
||||
'ausS': {'type': float,
|
||||
'tooltip': 'for HOS/AR, artificial uplift of samples (aus) of CF (S)',
|
||||
'value': 0.9,
|
||||
'min': 0.,
|
||||
'max': np.inf,
|
||||
'namestring': 'Artificial uplift S'},
|
||||
|
||||
'nfacS': {'type': float,
|
||||
'tooltip': 'for AR-picker, noise factor for noise level determination (S)',
|
||||
'value': 1.5,
|
||||
'min': 0.,
|
||||
'max': np.inf,
|
||||
'namestring': 'Noise factor S'},
|
||||
|
||||
'minfmweight': {'type': int,
|
||||
'tooltip': 'minimum required P weight for first-motion determination',
|
||||
'value': 1,
|
||||
'namestring': 'Min. P weight'},
|
||||
|
||||
'minFMSNR': {'type': float,
|
||||
'tooltip': 'miniumum required SNR for first-motion determination',
|
||||
'value': 2.,
|
||||
'min': 0.,
|
||||
'max': np.inf,
|
||||
'namestring': 'Min SNR'},
|
||||
|
||||
'fmpickwin': {'type': float,
|
||||
'tooltip': 'pick window [s] around P onset for calculating zero crossings',
|
||||
'value': 0.2,
|
||||
'min': 0.,
|
||||
'max': np.inf,
|
||||
'namestring': 'Zero crossings window'},
|
||||
|
||||
'timeerrorsP': {'type': (float, float, float, float),
|
||||
'tooltip': 'discrete time errors [s] corresponding to picking weights [0 1 2 3] for P',
|
||||
'value': (0.01, 0.02, 0.04, 0.08),
|
||||
'min': (0., 0., 0., 0.),
|
||||
'max': (np.inf, np.inf, np.inf, np.inf),
|
||||
'namestring': ('Time errors P', '0', '1', '2', '3')},
|
||||
|
||||
'timeerrorsS': {'type': (float, float, float, float),
|
||||
'tooltip': 'discrete time errors [s] corresponding to picking weights [0 1 2 3] for S',
|
||||
'value': (0.04, 0.08, 0.16, 0.32),
|
||||
'min': (0., 0., 0., 0.),
|
||||
'max': (np.inf, np.inf, np.inf, np.inf),
|
||||
'namestring': ('Time errors S', '0', '1', '2', '3')},
|
||||
|
||||
'minAICPslope': {'type': float,
|
||||
'tooltip': 'below this slope [counts/s] the initial P pick is rejected',
|
||||
'value': 0.8,
|
||||
'min': 0.,
|
||||
'max': np.inf,
|
||||
'namestring': 'Min. slope P'},
|
||||
|
||||
'minAICPSNR': {'type': float,
|
||||
'tooltip': 'below this SNR the initial P pick is rejected',
|
||||
'value': 1.1,
|
||||
'min': 0.,
|
||||
'max': np.inf,
|
||||
'namestring': 'Min. SNR P'},
|
||||
|
||||
'minAICSslope': {'type': float,
|
||||
'tooltip': 'below this slope [counts/s] the initial S pick is rejected',
|
||||
'value': 1.,
|
||||
'min': 0.,
|
||||
'max': np.inf,
|
||||
'namestring': 'Min. slope S'},
|
||||
|
||||
'minAICSSNR': {'type': float,
|
||||
'tooltip': 'below this SNR the initial S pick is rejected',
|
||||
'value': 1.5,
|
||||
'min': 0.,
|
||||
'max': np.inf,
|
||||
'namestring': 'Min. SNR S'},
|
||||
|
||||
'minsiglength': {'type': float,
|
||||
'tooltip': 'length of signal part for which amplitudes must exceed noiselevel [s]',
|
||||
'value': 1.,
|
||||
'min': 0.,
|
||||
'max': np.inf,
|
||||
'namestring': 'Min. signal length'},
|
||||
|
||||
'noisefactor': {'type': float,
|
||||
'tooltip': 'noiselevel*noisefactor=threshold',
|
||||
'value': 1.0,
|
||||
'min': 0.,
|
||||
'max': np.inf,
|
||||
'namestring': 'Noise factor'},
|
||||
|
||||
'minpercent': {'type': float,
|
||||
'tooltip': 'required percentage of amplitudes exceeding threshold',
|
||||
'value': 10.,
|
||||
'min': 0.,
|
||||
'max': np.inf,
|
||||
'namestring': 'Min amplitude [%]'},
|
||||
|
||||
'zfac': {'type': float,
|
||||
'tooltip': 'P-amplitude must exceed at least zfac times RMS-S amplitude',
|
||||
'value': 1.5,
|
||||
'min': 0.,
|
||||
'max': np.inf,
|
||||
'namestring': 'Z factor'},
|
||||
|
||||
'mdttolerance': {'type': float,
|
||||
'tooltip': 'maximum allowed deviation of P picks from median [s]',
|
||||
'value': 6.0,
|
||||
'min': 0.,
|
||||
'max': np.inf,
|
||||
'namestring': 'Median tolerance'},
|
||||
|
||||
'wdttolerance': {'type': float,
|
||||
'tooltip': 'maximum allowed deviation from Wadati-diagram',
|
||||
'value': 1.0,
|
||||
'min': 0.,
|
||||
'max': np.inf,
|
||||
'namestring': 'Wadati tolerance'},
|
||||
|
||||
'jackfactor': {'type': float,
|
||||
'tooltip': 'pick is removed if the variance of the subgroup with the pick removed is larger than the mean variance of all subgroups times safety factor',
|
||||
'value': 5.0,
|
||||
'min': 0.,
|
||||
'max': np.inf,
|
||||
'namestring': 'Jackknife safety factor'},
|
||||
|
||||
'WAscaling': {'type': (float, float, float),
|
||||
'tooltip': 'Scaling relation (log(Ao)+Alog(r)+Br+C) of Wood-Anderson amplitude Ao [nm] \
|
||||
If zeros are set, original Richter magnitude is calculated!',
|
||||
'value': (0., 0., 0.),
|
||||
'min': (-np.inf, -np.inf, -np.inf),
|
||||
'max': (np.inf, np.inf, np.inf),
|
||||
'namestring': ('Wood-Anderson scaling', '', '', '')},
|
||||
|
||||
'magscaling': {'type': (float, float),
|
||||
'tooltip': 'Scaling relation for derived local magnitude [a*Ml+b]. \
|
||||
If zeros are set, no scaling of network magnitude is applied!',
|
||||
'value': (0., 0.),
|
||||
'min': (0., -np.inf),
|
||||
'max': (np.inf, np.inf),
|
||||
'namestring': ('Local mag. scaling', '', '')},
|
||||
|
||||
'minfreq': {'type': (float, float),
|
||||
'tooltip': 'Lower filter frequency [P, S]',
|
||||
'value': (1.0, 1.0),
|
||||
'min': (0., 0.),
|
||||
'max': (np.inf, np.inf),
|
||||
'namestring': ('Lower freq.', 'P', 'S')},
|
||||
|
||||
'maxfreq': {'type': (float, float),
|
||||
'tooltip': 'Upper filter frequency [P, S]',
|
||||
'value': (10.0, 10.0),
|
||||
'min': (0., 0.),
|
||||
'max': (np.inf, np.inf),
|
||||
'namestring': ('Upper freq.', 'P', 'S')},
|
||||
|
||||
'filter_order': {'type': (int, int),
|
||||
'tooltip': 'filter order [P, S]',
|
||||
'value': (2, 2),
|
||||
'min': (0, 0),
|
||||
'max': (np.inf, np.inf),
|
||||
'namestring': ('Order', 'P', 'S')},
|
||||
|
||||
'filter_type': {'type': (str, str),
|
||||
'tooltip': 'filter type (bandpass, bandstop, lowpass, highpass) [P, S]',
|
||||
'value': ('bandpass', 'bandpass'),
|
||||
'namestring': ('Type', 'P', 'S')},
|
||||
|
||||
'use_taup': {'type': bool,
|
||||
'tooltip': 'use estimated traveltimes from TauPy for calculating windows for CF',
|
||||
'value': True,
|
||||
'namestring': 'Use TauPy'},
|
||||
|
||||
'taup_model': {'type': str,
|
||||
'tooltip': 'Define TauPy model for traveltime estimation. Possible values: 1066a, 1066b, ak135, ak135f, herrin, iasp91, jb, prem, pwdk, sp6',
|
||||
'value': None,
|
||||
'namestring': 'TauPy model'},
|
||||
|
||||
'taup_phases': {'type': str,
|
||||
'tooltip': 'Specify possible phases for TauPy (comma separated). See Obspy TauPy documentation for possible values.',
|
||||
'value': 'ttall',
|
||||
'namestring': 'TauPy phases'},
|
||||
}
|
||||
|
||||
settings_main = {
|
||||
'dirs': [
|
||||
'rootpath',
|
||||
'datapath',
|
||||
'database',
|
||||
'eventID',
|
||||
'invdir',
|
||||
'datastructure',
|
||||
'apverbose'],
|
||||
'nlloc': [
|
||||
'nllocbin',
|
||||
'nllocroot',
|
||||
'phasefile',
|
||||
'ctrfile',
|
||||
'ttpatter',
|
||||
'outpatter'],
|
||||
'smoment': [
|
||||
'vp',
|
||||
'rho',
|
||||
'Qp'],
|
||||
'localmag': [
|
||||
'WAscaling',
|
||||
'magscaling'],
|
||||
'filter': [
|
||||
'minfreq',
|
||||
'maxfreq',
|
||||
'filter_order',
|
||||
'filter_type'],
|
||||
'pick': [
|
||||
'extent',
|
||||
'pstart',
|
||||
'pstop',
|
||||
'sstart',
|
||||
'sstop',
|
||||
'use_taup',
|
||||
'taup_model',
|
||||
'taup_phases',
|
||||
'bpz1',
|
||||
'bpz2',
|
||||
'bph1',
|
||||
'bph2']
|
||||
}
|
||||
|
||||
settings_special_pick = {
|
||||
'z': [
|
||||
'algoP',
|
||||
'tlta',
|
||||
'hosorder',
|
||||
'Parorder',
|
||||
'tdet1z',
|
||||
'tpred1z',
|
||||
'tdet2z',
|
||||
'tpred2z',
|
||||
'addnoise',
|
||||
'tsnrz',
|
||||
'pickwinP',
|
||||
'Precalcwin',
|
||||
'aictsmooth',
|
||||
'tsmoothP',
|
||||
'ausP',
|
||||
'nfacP'],
|
||||
'h': [
|
||||
'algoS',
|
||||
'tdet1h',
|
||||
'tpred1h',
|
||||
'tdet2h',
|
||||
'tpred2h',
|
||||
'Sarorder',
|
||||
'Srecalcwin',
|
||||
'pickwinS',
|
||||
'tsnrh',
|
||||
'aictsmoothS',
|
||||
'tsmoothS',
|
||||
'ausS',
|
||||
'nfacS'],
|
||||
'fm': [
|
||||
'minfmweight',
|
||||
'minFMSNR',
|
||||
'fmpickwin'],
|
||||
'quality': [
|
||||
'timeerrorsP',
|
||||
'timeerrorsS',
|
||||
'minAICPslope',
|
||||
'minAICPSNR',
|
||||
'minAICSslope',
|
||||
'minAICSSNR',
|
||||
'minsiglength',
|
||||
'noisefactor',
|
||||
'minpercent',
|
||||
'zfac',
|
||||
'mdttolerance',
|
||||
'wdttolerance',
|
||||
'jackfactor'],
|
||||
}
|
||||
106
pylot/core/io/event.py
Normal file
@@ -0,0 +1,106 @@
|
||||
import copy
|
||||
from dataclasses import dataclass
|
||||
from typing import Union
|
||||
|
||||
from obspy import read_events
|
||||
from obspy.core.event import Event as ObsPyEvent
|
||||
|
||||
|
||||
@dataclass
|
||||
class EventData:
|
||||
evtdata: Union[ObsPyEvent, None] = None
|
||||
_new: bool = False
|
||||
|
||||
def __init__(self, evtdata=None):
|
||||
self.set_event_data(evtdata)
|
||||
|
||||
def set_event_data(self, evtdata):
|
||||
if isinstance(evtdata, ObsPyEvent):
|
||||
self.evtdata = evtdata
|
||||
elif isinstance(evtdata, dict):
|
||||
self.evtdata = self.read_pilot_event(**evtdata)
|
||||
elif isinstance(evtdata, str):
|
||||
self.evtdata = self.read_event_file(evtdata)
|
||||
else:
|
||||
self.set_new()
|
||||
self.evtdata = ObsPyEvent(picks=[])
|
||||
|
||||
def read_event_file(self, evtdata: str) -> ObsPyEvent:
|
||||
try:
|
||||
cat = read_events(evtdata)
|
||||
if len(cat) != 1:
|
||||
raise ValueError(f'ambiguous event information for file: {evtdata}')
|
||||
return cat[0]
|
||||
except TypeError as e:
|
||||
self.handle_event_file_error(e, evtdata)
|
||||
|
||||
def handle_event_file_error(self, e: TypeError, evtdata: str):
|
||||
if 'Unknown format for file' in str(e):
|
||||
if 'PHASES' in evtdata:
|
||||
picks = self.picksdict_from_pilot(evtdata)
|
||||
evtdata = ObsPyEvent(picks=self.picks_from_picksdict(picks))
|
||||
elif 'LOC' in evtdata:
|
||||
raise NotImplementedError('PILOT location information read support not yet implemented.')
|
||||
elif 'event.pkl' in evtdata:
|
||||
evtdata = self.qml_from_obspy_dmt(evtdata)
|
||||
else:
|
||||
raise e
|
||||
else:
|
||||
raise e
|
||||
|
||||
def set_new(self):
|
||||
self._new = True
|
||||
|
||||
def is_new(self) -> bool:
|
||||
return self._new
|
||||
|
||||
def get_picks_str(self) -> str:
|
||||
return '\n'.join(str(pick) for pick in self.evtdata.picks)
|
||||
|
||||
def replace_origin(self, event: ObsPyEvent, force_overwrite: bool = False):
|
||||
if self.evtdata.origins or force_overwrite:
|
||||
event.origins = self.evtdata.origins
|
||||
|
||||
def replace_magnitude(self, event: ObsPyEvent, force_overwrite: bool = False):
|
||||
if self.evtdata.magnitudes or force_overwrite:
|
||||
event.magnitudes = self.evtdata.magnitudes
|
||||
|
||||
def replace_picks(self, event: ObsPyEvent, picktype: str):
|
||||
checkflag = 1
|
||||
picks = event.picks
|
||||
for j, pick in reversed(list(enumerate(picks))):
|
||||
if picktype in str(pick.method_id.id):
|
||||
picks.pop(j)
|
||||
checkflag = 2
|
||||
|
||||
if checkflag > 0:
|
||||
for pick in self.evtdata.picks:
|
||||
if picktype in str(pick.method_id.id):
|
||||
picks.append(pick)
|
||||
|
||||
def get_id(self) -> Union[str, None]:
|
||||
try:
|
||||
return self.evtdata.resource_id.id
|
||||
except:
|
||||
return None
|
||||
|
||||
def apply_event_data(self, data, typ='pick'):
|
||||
if typ == 'pick':
|
||||
self.apply_picks(data)
|
||||
elif typ == 'event':
|
||||
self.apply_event(data)
|
||||
|
||||
def apply_picks(self, picks):
|
||||
self.evtdata.picks = picks
|
||||
|
||||
def apply_event(self, event: ObsPyEvent):
|
||||
if self.is_new():
|
||||
self.evtdata = event
|
||||
else:
|
||||
old_event = self.evtdata
|
||||
if old_event.resource_id == event.resource_id:
|
||||
picks = copy.deepcopy(old_event.picks)
|
||||
event = self.merge_picks(event, picks)
|
||||
old_event.update(event)
|
||||
else:
|
||||
print(f"WARNING: Mismatch in event resource id's: {old_event.resource_id} and {event.resource_id}")
|
||||
84
pylot/core/io/getEventListFromXML.py
Normal file
@@ -0,0 +1,84 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
Script to get event parameters from PyLoT-xml file to write
|
||||
them into eventlist.
|
||||
LK, igem, 03/2021
|
||||
Edited for use in PyLoT
|
||||
JG, igem, 01/2022
|
||||
"""
|
||||
|
||||
import os
|
||||
import argparse
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
import glob
|
||||
|
||||
from obspy.core.event import read_events
|
||||
from pyproj import Proj
|
||||
|
||||
"""
|
||||
Creates an eventlist file summarizing all events found in a certain folder. Only called by pressing UI Button eventlis_xml_action
|
||||
|
||||
:rtype:
|
||||
:param path: Path to root folder where single Event folder are to found
|
||||
"""
|
||||
|
||||
|
||||
def geteventlistfromxml(path, outpath):
|
||||
p = Proj(proj='utm', zone=32, ellps='WGS84')
|
||||
|
||||
# open eventlist file and write header
|
||||
evlist = outpath + '/eventlist'
|
||||
evlistobj = open(evlist, 'w')
|
||||
evlistobj.write(
|
||||
'EventID Date To Lat Lon EAST NORTH Dep Ml NoP NoS RMS errH errZ Gap \n')
|
||||
|
||||
# data path
|
||||
dp = path + "/e*/*.xml"
|
||||
# list of all available xml-files
|
||||
xmlnames = glob.glob(dp)
|
||||
|
||||
# read all onset weights
|
||||
for names in xmlnames:
|
||||
print("Getting location parameters from {}".format(names))
|
||||
cat = read_events(names)
|
||||
try:
|
||||
st = cat.events[0].origins[0].time
|
||||
Lat = cat.events[0].origins[0].latitude
|
||||
Lon = cat.events[0].origins[0].longitude
|
||||
EAST, NORTH = p(Lon, Lat)
|
||||
Dep = cat.events[0].origins[0].depth / 1000
|
||||
Ml = cat.events[0].magnitudes[1].mag
|
||||
NoP = []
|
||||
NoS = []
|
||||
except IndexError:
|
||||
print('Insufficient data found for event (not localised): ' + names.split('/')[-1].split('_')[-1][
|
||||
:-4] + ' Skipping event for eventlist.')
|
||||
continue
|
||||
|
||||
for i in range(len(cat.events[0].origins[0].arrivals)):
|
||||
if cat.events[0].origins[0].arrivals[i].phase == 'P':
|
||||
NoP.append(cat.events[0].origins[0].arrivals[i].phase)
|
||||
elif cat.events[0].origins[0].arrivals[i].phase == 'S':
|
||||
NoS.append(cat.events[0].origins[0].arrivals[i].phase)
|
||||
# NoP = cat.events[0].origins[0].quality.used_station_count
|
||||
errH = cat.events[0].origins[0].origin_uncertainty.max_horizontal_uncertainty
|
||||
errZ = cat.events[0].origins[0].depth_errors.uncertainty
|
||||
Gap = cat.events[0].origins[0].quality.azimuthal_gap
|
||||
# evID = names.split('/')[6]
|
||||
evID = names.split('/')[-1].split('_')[-1][:-4]
|
||||
Date = str(st.year) + str('%02d' % st.month) + str('%02d' % st.day)
|
||||
To = str('%02d' % st.hour) + str('%02d' % st.minute) + str('%02d' % st.second) + \
|
||||
'.' + str('%06d' % st.microsecond)
|
||||
|
||||
# write into eventlist
|
||||
evlistobj.write('%s %s %s %9.6f %9.6f %13.6f %13.6f %8.6f %3.1f %d %d NaN %d %d %d\n' % (evID, \
|
||||
Date, To, Lat, Lon,
|
||||
EAST, NORTH, Dep, Ml,
|
||||
len(NoP), len(NoS),
|
||||
errH, errZ, Gap))
|
||||
print('Adding Event ' + names.split('/')[-1].split('_')[-1][:-4] + ' to eventlist')
|
||||
print('Eventlist created and saved in: ' + outpath)
|
||||
evlistobj.close()
|
||||
504
pylot/core/io/inputs.py
Normal file
@@ -0,0 +1,504 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from pylot.core.io import default_parameters
|
||||
from pylot.core.util.errors import ParameterError
|
||||
|
||||
|
||||
class PylotParameter(object):
|
||||
'''
|
||||
PylotParameter is a parameter type object capable to read and/or write
|
||||
parameter ASCII.
|
||||
|
||||
:param fn str: Filename of the input file
|
||||
|
||||
Parameters are given for example as follows:
|
||||
========== ========== =======================================
|
||||
Name Value Comment
|
||||
========== ========== =======================================
|
||||
phl S # phaselabel
|
||||
ff1 0.1 # freqmin
|
||||
ff2 0.5 # freqmax
|
||||
tdet 6.875 # det-window_(s)_for_ar
|
||||
tpred 2.5 # pred-window_(s)_for_ar
|
||||
order 4 # order_of_ar
|
||||
fnoise 0 # noise_level_for_ar
|
||||
suppp 7 # envelopecoeff
|
||||
tolt 300 # (s)time around arrival time
|
||||
f1tpwt 4 # propfact_minfreq_secondtaper
|
||||
pickwindow 9 # length_of_pick_window
|
||||
w1 1 # length_of_smoothing_window
|
||||
w2 0.37 # cf(i-1)*(1+peps)_for_local_min
|
||||
w3 0.25 # cf(i-1)*(1+peps)_for_local_min
|
||||
tslope 0.8;2 # slope_det_window_loc_glob
|
||||
aerr 30;60 # adjusted_error_slope_fitting_loc_glob
|
||||
tsn 20;5;20;10 # length_signal_window_S/N
|
||||
proPh Sn # nextprominentphase
|
||||
========== ========== =======================================
|
||||
'''
|
||||
|
||||
def __init__(self, fnin=None, fnout=None, verbosity=0, **kwargs):
|
||||
'''
|
||||
Initialize parameter object:
|
||||
|
||||
io content of an ASCII file an form a type consistent dictionary
|
||||
contain all parameters.
|
||||
'''
|
||||
|
||||
self.__init_default_paras()
|
||||
self.__init_subsettings()
|
||||
self.__filename = fnin
|
||||
self.__parameter = {}
|
||||
self._verbosity = verbosity
|
||||
self._parFileCont = {}
|
||||
# io from parsed arguments alternatively
|
||||
for key, val in kwargs.items():
|
||||
self._parFileCont[key] = val
|
||||
self.from_file()
|
||||
if fnout:
|
||||
self.export2File(fnout)
|
||||
|
||||
# Human-readable string representation of the object
|
||||
def __str__(self):
|
||||
string = ''
|
||||
string += 'Automated picking parameter:\n\n'
|
||||
if self.__parameter:
|
||||
for key, value in self.iteritems():
|
||||
string += '%s:\t\t%s\n' % (key, value)
|
||||
else:
|
||||
string += 'Empty parameter dictionary.'
|
||||
return string
|
||||
|
||||
# Set default values of parameter names
|
||||
def __init_default_paras(self):
|
||||
"""set default values of parameter names"""
|
||||
parameters = default_parameters.defaults
|
||||
self.__defaults = parameters
|
||||
|
||||
def __init_subsettings(self):
|
||||
self._settings_main = default_parameters.settings_main
|
||||
self._settings_special_pick = default_parameters.settings_special_pick
|
||||
|
||||
# String representation of the object
|
||||
def __repr__(self):
|
||||
return "PylotParameter('%s')" % self.__filename
|
||||
|
||||
# Boolean test
|
||||
def __nonzero__(self):
|
||||
return bool(self.__parameter)
|
||||
|
||||
def __getitem__(self, key):
|
||||
try:
|
||||
return self.__parameter[key]
|
||||
except:
|
||||
return None
|
||||
|
||||
def __setitem__(self, key, value):
|
||||
try:
|
||||
value = self.check_range(value, self.__defaults[key]['max'], self.__defaults[key]['min'])
|
||||
except KeyError:
|
||||
# no min/max values in defaults
|
||||
pass
|
||||
self.__parameter[key] = value
|
||||
|
||||
def __delitem__(self, key):
|
||||
del self.__parameter[key]
|
||||
|
||||
def __iter__(self):
|
||||
return iter(self.__parameter)
|
||||
|
||||
def __len__(self):
|
||||
return len(self.__parameter.keys())
|
||||
|
||||
def iteritems(self):
|
||||
"""
|
||||
Iterate over parameters
|
||||
:return: key, value tupel
|
||||
:rtype:
|
||||
"""
|
||||
for key, value in self.__parameter.items():
|
||||
yield key, value
|
||||
|
||||
def hasParam(self, parameter):
|
||||
"""
|
||||
Check if parameter is in keys
|
||||
:param parameter: parameter to look for in keys
|
||||
:type parameter:
|
||||
:return:
|
||||
:rtype: bool
|
||||
"""
|
||||
return parameter in self.__parameter.keys()
|
||||
|
||||
def get(self, *args):
|
||||
"""
|
||||
Get first available parameter in args
|
||||
:param args:
|
||||
:type args:
|
||||
:return:
|
||||
:rtype:
|
||||
"""
|
||||
try:
|
||||
for param in args:
|
||||
try:
|
||||
return self.__getitem__(param)
|
||||
except KeyError as e:
|
||||
self._printParameterError(e)
|
||||
raise ParameterError(e)
|
||||
except TypeError:
|
||||
try:
|
||||
return self.__getitem__(args)
|
||||
except KeyError as e:
|
||||
self._printParameterError(e)
|
||||
raise ParameterError(e)
|
||||
|
||||
def get_defaults(self):
|
||||
"""
|
||||
get default parameters
|
||||
:return:
|
||||
:rtype: dict
|
||||
"""
|
||||
return self.__defaults
|
||||
|
||||
def get_main_para_names(self):
|
||||
"""
|
||||
Get main parameter names
|
||||
:return: list of keys available in parameters
|
||||
:rtype:
|
||||
"""
|
||||
return self._settings_main
|
||||
|
||||
def get_special_para_names(self):
|
||||
"""
|
||||
Get pick parameter names
|
||||
:return: list of keys available in parameters
|
||||
:rtype:
|
||||
"""
|
||||
return self._settings_special_pick
|
||||
|
||||
def get_all_para_names(self):
|
||||
"""
|
||||
Get all parameter names
|
||||
:return:
|
||||
:rtype: list
|
||||
"""
|
||||
all_names = []
|
||||
all_names += self.get_main_para_names()['dirs']
|
||||
all_names += self.get_main_para_names()['nlloc']
|
||||
all_names += self.get_main_para_names()['smoment']
|
||||
all_names += self.get_main_para_names()['localmag']
|
||||
all_names += self.get_main_para_names()['pick']
|
||||
all_names += self.get_main_para_names()['filter']
|
||||
all_names += self.get_special_para_names()['z']
|
||||
all_names += self.get_special_para_names()['h']
|
||||
all_names += self.get_special_para_names()['fm']
|
||||
all_names += self.get_special_para_names()['quality']
|
||||
return all_names
|
||||
|
||||
def reinit_default_parameters(self):
|
||||
self.__init_default_paras()
|
||||
|
||||
@staticmethod
|
||||
def check_range(value, max_value, min_value):
|
||||
"""
|
||||
Check if value is within the min/max values defined in default_parameters. Works for tuple and scalar values.
|
||||
:param value: Value to be checked against min/max range
|
||||
:param max_value: Maximum allowed value, tuple or scalar
|
||||
:param min_value: Minimum allowed value, tuple or scalar
|
||||
:return: value tuple/scalar clamped to the valid range
|
||||
|
||||
>>> checkRange(-5, 10, 0)
|
||||
0
|
||||
>>> checkRange((-5., 100.), (10., 10.), (0., 0.))
|
||||
(0.0, 10.0)
|
||||
"""
|
||||
try:
|
||||
# Try handling tuples by comparing their elements
|
||||
comparisons = [(a > b) for a, b in zip(value, max_value)]
|
||||
if True in comparisons:
|
||||
value = tuple(max_value[i] if comp else value[i] for i, comp in enumerate(comparisons))
|
||||
comparisons = [(a < b) for a, b in zip(value, min_value)]
|
||||
if True in comparisons:
|
||||
value = tuple(min_value[i] if comp else value[i] for i, comp in enumerate(comparisons))
|
||||
except TypeError:
|
||||
value = max(min_value, min(max_value, value))
|
||||
return value
|
||||
|
||||
def checkValue(self, param, value):
|
||||
"""
|
||||
Check type of value against expected type of param.
|
||||
Print warning message if type check fails
|
||||
:param param:
|
||||
:type param:
|
||||
:param value:
|
||||
:type value:
|
||||
:return:
|
||||
:rtype:
|
||||
"""
|
||||
is_type = type(value)
|
||||
expect_type = self.get_defaults()[param]['type']
|
||||
if not is_type == expect_type and not is_type == tuple:
|
||||
message = 'Type check failed for param: {}, is type: {}, expected type:{}'
|
||||
message = message.format(param, is_type, expect_type)
|
||||
print(Warning(message))
|
||||
|
||||
def setParamKV(self, param, value):
|
||||
"""
|
||||
set parameter param to value
|
||||
:param param:
|
||||
:type param:
|
||||
:param value:
|
||||
:type value:
|
||||
:return:
|
||||
:rtype: None
|
||||
"""
|
||||
self.__setitem__(param, value)
|
||||
|
||||
def setParam(self, **kwargs):
|
||||
"""
|
||||
Set multiple parameters
|
||||
:param kwargs:
|
||||
:type kwargs:
|
||||
:return:
|
||||
:rtype: None
|
||||
"""
|
||||
for key in kwargs:
|
||||
self.__setitem__(key, kwargs[key])
|
||||
|
||||
@staticmethod
|
||||
def _printParameterError(errmsg):
|
||||
print('ParameterError:\n non-existent parameter %s' % errmsg)
|
||||
|
||||
def reset_defaults(self):
|
||||
"""
|
||||
Reset current parameters to default parameters
|
||||
:return:
|
||||
:rtype: None
|
||||
"""
|
||||
defaults = self.get_defaults()
|
||||
for param_name, param in defaults.items():
|
||||
self.setParamKV(param_name, param['value'])
|
||||
|
||||
def from_file(self, fnin=None):
|
||||
"""
|
||||
read parameters from file and set values to read values
|
||||
:param fnin: filename
|
||||
:type fnin:
|
||||
:return:
|
||||
:rtype: None
|
||||
"""
|
||||
if not fnin:
|
||||
if self.__filename is not None:
|
||||
fnin = self.__filename
|
||||
else:
|
||||
return
|
||||
|
||||
if isinstance(fnin, (list, tuple)):
|
||||
fnin = fnin[0]
|
||||
|
||||
inputFile = open(fnin, 'r')
|
||||
try:
|
||||
lines = inputFile.readlines()
|
||||
for line in lines:
|
||||
parspl = line.split('\t')[:2]
|
||||
self._parFileCont[parspl[0].strip()] = parspl[1]
|
||||
except IndexError as e:
|
||||
if self._verbosity > 0:
|
||||
self._printParameterError(e)
|
||||
inputFile.seek(0)
|
||||
lines = inputFile.readlines()
|
||||
for line in lines:
|
||||
if not line.startswith(('#', '%', '\n', ' ')):
|
||||
parspl = line.split('#')[:2]
|
||||
self._parFileCont[parspl[1].strip()] = parspl[0].strip()
|
||||
for key, value in self._parFileCont.items():
|
||||
try:
|
||||
val = int(value)
|
||||
except:
|
||||
try:
|
||||
val = float(value)
|
||||
except:
|
||||
if len(value.split(' ')) > 1:
|
||||
vallist = value.strip().split(' ')
|
||||
val = []
|
||||
for val0 in vallist:
|
||||
try:
|
||||
val0 = float(val0)
|
||||
except:
|
||||
pass
|
||||
val.append(val0)
|
||||
else:
|
||||
val = str(value.strip())
|
||||
self._parFileCont[key] = val
|
||||
self.__parameter = self._parFileCont
|
||||
|
||||
def export2File(self, fnout):
|
||||
"""
|
||||
Export parameters to file
|
||||
:param fnout: Filename of export file
|
||||
:type fnout: str
|
||||
:return:
|
||||
:rtype:
|
||||
"""
|
||||
fid_out = open(fnout, 'w')
|
||||
lines = []
|
||||
# for key, value in self.iteritems():
|
||||
# lines.append('{key}\t{value}\n'.format(key=key, value=value))
|
||||
# fid_out.writelines(lines)
|
||||
header = ('%This is a parameter input file for PyLoT/autoPyLoT.\n' +
|
||||
'%All main and special settings regarding data handling\n' +
|
||||
'%and picking are to be set here!\n' +
|
||||
'%Parameters are optimized for %{} data sets!\n'.format(self.get_main_para_names()['pick'][0]))
|
||||
separator = '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n'
|
||||
|
||||
fid_out.write(header)
|
||||
self.write_section(fid_out, self.get_main_para_names()['dirs'],
|
||||
'main settings', separator)
|
||||
self.write_section(fid_out, self.get_main_para_names()['nlloc'],
|
||||
'NLLoc settings', separator)
|
||||
self.write_section(fid_out, self.get_main_para_names()['smoment'],
|
||||
'parameters for seismic moment estimation', separator)
|
||||
self.write_section(fid_out, self.get_main_para_names()['localmag'],
|
||||
'settings local magnitude', separator)
|
||||
self.write_section(fid_out, self.get_main_para_names()['filter'],
|
||||
'filter settings', separator)
|
||||
self.write_section(fid_out, self.get_main_para_names()['pick'],
|
||||
'common settings picker', separator)
|
||||
fid_out.write(('#special settings for calculating CF#\n' +
|
||||
'%!!Edit the following only if you know what you are doing!!%\n'))
|
||||
self.write_section(fid_out, self.get_special_para_names()['z'],
|
||||
'Z-component', None)
|
||||
self.write_section(fid_out, self.get_special_para_names()['h'],
|
||||
'H-components', None)
|
||||
self.write_section(fid_out, self.get_special_para_names()['fm'],
|
||||
'first-motion picker', None)
|
||||
self.write_section(fid_out, self.get_special_para_names()['quality'],
|
||||
'quality assessment', None)
|
||||
|
||||
def write_section(self, fid, names, title, separator):
|
||||
"""
|
||||
write a section of parameters to file
|
||||
:param fid: File object to write to
|
||||
:type fid:
|
||||
:param names: which parameter names to write to file
|
||||
:type names:
|
||||
:param title: title of section
|
||||
:type title: str
|
||||
:param separator: section separator, written at start of section
|
||||
:type separator: str
|
||||
:return:
|
||||
:rtype:
|
||||
"""
|
||||
if separator:
|
||||
fid.write(separator)
|
||||
fid.write('#{}#\n'.format(title))
|
||||
l_val = 50
|
||||
l_name = 15
|
||||
l_ttip = 100
|
||||
for name in names:
|
||||
value = self[name]
|
||||
if type(value) == list or type(value) == tuple:
|
||||
value_tmp = ''
|
||||
for vl in value:
|
||||
value_tmp += '{} '.format(vl)
|
||||
value = value_tmp
|
||||
tooltip = self.get_defaults()[name]['tooltip']
|
||||
if not len(str(value)) > l_val:
|
||||
value = '{:<{}} '.format(str(value), l_val)
|
||||
else:
|
||||
value = '{} '.format(str(value))
|
||||
name += '#'
|
||||
if not len(name) > l_name:
|
||||
name = '#{:<{}} '.format(name, l_name)
|
||||
else:
|
||||
name = '#{} '.format(name)
|
||||
if not len(tooltip) > l_ttip:
|
||||
ttip = '%{:<{}}\n'.format(tooltip, l_ttip)
|
||||
else:
|
||||
ttip = '%{}\n'.format(tooltip)
|
||||
line = value + name + ttip
|
||||
fid.write(line)
|
||||
|
||||
|
||||
class FilterOptions(object):
|
||||
'''
|
||||
FilterOptions is a parameter object type providing Butterworth filter
|
||||
option parameter for PyLoT. Its easy to access properties helps to manage
|
||||
file based as well as parameter manipulation within the GUI.
|
||||
|
||||
:type filtertype: str, optional
|
||||
:param filtertype: String containing the desired filtertype For information
|
||||
about the supported filter types see _`Supported Filter` section .
|
||||
|
||||
:type freq: list, optional
|
||||
:param freq: list of float(s) describing the cutoff limits of the filter
|
||||
|
||||
:type order: int, optional
|
||||
:param order: Integer value describing the order of the desired Butterworth
|
||||
filter.
|
||||
|
||||
.. rubric:: _`Supported Filter`
|
||||
|
||||
``'bandpass'``
|
||||
Butterworth-Bandpass
|
||||
|
||||
``'bandstop'``
|
||||
Butterworth-Bandstop
|
||||
|
||||
``'lowpass'``
|
||||
Butterworth-Lowpass
|
||||
|
||||
``'highpass'``
|
||||
Butterworth-Highpass
|
||||
'''
|
||||
|
||||
def __init__(self, filtertype='bandpass', freq=[2., 5.], order=3,
|
||||
**kwargs):
|
||||
self._order = order
|
||||
self._filtertype = filtertype
|
||||
self._freq = freq
|
||||
|
||||
def __str__(self):
|
||||
hrs = '''\n\tFilter parameter:\n
|
||||
Type:\t\t{ftype}\n
|
||||
Frequencies:\t{freq}\n
|
||||
Order:\t\t{order}\n
|
||||
'''.format(ftype=self.getFilterType(),
|
||||
freq=self.getFreq(),
|
||||
order=self.getOrder())
|
||||
return hrs
|
||||
|
||||
def __nonzero__(self):
|
||||
return bool(self.getFilterType())
|
||||
|
||||
def parseFilterOptions(self):
|
||||
if self:
|
||||
robject = {'type': self.getFilterType(),
|
||||
'corners': self.getOrder(),
|
||||
'zerophase': False}
|
||||
if not self.getFilterType() in ['highpass', 'lowpass']:
|
||||
robject['freqmin'] = self.getFreq()[0]
|
||||
robject['freqmax'] = self.getFreq()[1]
|
||||
elif self.getFilterType() == 'highpass':
|
||||
robject['freq'] = self.getFreq()[0]
|
||||
elif self.getFilterType() == 'lowpass':
|
||||
robject['freq'] = self.getFreq()[1]
|
||||
return robject
|
||||
return None
|
||||
|
||||
def getFreq(self):
|
||||
return self.__getattribute__('_freq')
|
||||
|
||||
def setFreq(self, freq):
|
||||
self.__setattr__('_freq', freq)
|
||||
|
||||
def getOrder(self):
|
||||
return self.__getattribute__('_order')
|
||||
|
||||
def setOrder(self, order):
|
||||
self.__setattr__('_order', order)
|
||||
|
||||
def getFilterType(self):
|
||||
return self.__getattribute__('_filtertype')
|
||||
|
||||
def setFilterType(self, filtertype):
|
||||
self.__setattr__('_filtertype', filtertype)
|
||||