Compare commits
587 Commits
2023.03.13
...
developer
| Author | SHA1 | Date | |
|---|---|---|---|
| 497b3ed00e | |||
| 300a296c20 | |||
| 01e392b112 | |||
| 5409cec73e | |||
|
|
1c31a85a43 | ||
| 134137ead0 | |||
| 6d3922f487 | |||
| f14cfb0b31 | |||
| cf4e6b65c1 | |||
| 0da80cd898 | |||
| 8e7921ae45 | |||
| b90851a855 | |||
| 683accd914 | |||
| 30e82e4740 | |||
| 08486b9812 | |||
| a5c661ce22 | |||
| 50448cefb4 | |||
| c1e5cfa101 | |||
| ae8c9175bf | |||
| e7f5a2aa11 | |||
| cad44943c3 | |||
| d4f8049623 | |||
| 925cd55b1c | |||
| ec11ba5a54 | |||
| eea4dca449 | |||
| 3285221e8a | |||
|
|
f32fcf1e88 | ||
| 3ff199822d | |||
| 0ba9a269a1 | |||
| afc51c9771 | |||
| 1cf9dc21ab | |||
| 3b92ffb902 | |||
|
|
0490c0ef23 | ||
| af2c6eca0c | |||
|
|
d3dc92b18b | ||
|
|
e243af045d | ||
|
|
1d66f1d26d | ||
|
|
9d40220274 | ||
|
|
41989836e7 | ||
|
|
db91f06c02 | ||
| 5041fd7fef | |||
|
|
d2560aa7f1 | ||
| 13e648ce42 | |||
| f9fdcca028 | |||
| 3684f29e1a | |||
| 9b411ffa25 | |||
| 965f8ab9f2 | |||
|
|
2d8f93a426 | ||
|
|
e7a91d38f2 | ||
| 6e006665ef | |||
| 26846f7c33 | |||
| 5eb8fa07db | |||
| 3387e22796 | |||
| be3749f493 | |||
| c39bd98f2d | |||
| 028bae82e9 | |||
| ddc44e1065 | |||
| 284472b48f | |||
| 6e3acbdf79 | |||
| 5b069d85a8 | |||
| 9af571ea0e | |||
| fff5fa73be | |||
| 15cbaa509e | |||
| 72056ff813 | |||
| 776338a3d4 | |||
| 89fe2a6329 | |||
| 6b763797df | |||
| 92991de5a8 | |||
| efe6124675 | |||
| 292e057004 | |||
| f468c20c57 | |||
| 975caaf813 | |||
| db4a8b9db7 | |||
| 595bf38605 | |||
| d83e9385ed | |||
| 8ca251bbb7 | |||
| f594826e95 | |||
| 071b142b10 | |||
| 956103bbd4 | |||
| f714aa22c5 | |||
| dff2be6cdc | |||
| 35a7458657 | |||
| 6e92acceb2 | |||
| 69dc463b56 | |||
| 953e29a383 | |||
| 3faa7097d3 | |||
| 1eb401d65f | |||
| 6389692c16 | |||
| d64ae91453 | |||
| c8fc7fd6c1 | |||
| 21da221417 | |||
| aa20ceaac1 | |||
| 6bebafa25a | |||
| ebabd37622 | |||
| 55b62f4654 | |||
| 912cf0e671 | |||
| ea01457e1d | |||
| fc5d870583 | |||
| f74bc36984 | |||
| 92648bf5bb | |||
| ee27f0bc1b | |||
| 047793766a | |||
| d91585a39f | |||
| 09709f0f96 | |||
| 2698087efa | |||
| 1bf3d5e67a | |||
| fa508e0376 | |||
| af51776eef | |||
| ef8d8a5fd2 | |||
| d8ee0c2279 | |||
| e1f8c4012f | |||
| d210b0956e | |||
| 3426ca9d32 | |||
| 6b79fcc552 | |||
| e0aadbcc0f | |||
| 767555c5cc | |||
| 45f2dce3fc | |||
| f0c6575a60 | |||
| 2926904cf7 | |||
| fb4a25ecee | |||
| 318b19ad79 | |||
| 9a37cee4e9 | |||
| d18ea00b85 | |||
| 4ff29161d4 | |||
| e0810d973d | |||
| 1caf88858b | |||
| 396ef0a298 | |||
| c3012ec06c | |||
| 34002f5be0 | |||
| b1c6b4b078 | |||
| f9d41f1d66 | |||
| 94a9476550 | |||
| 313fc75950 | |||
| 66ee7954db | |||
| 67042e8315 | |||
| 3bc594862c | |||
| 6c4c60ca71 | |||
| 92fd3f0609 | |||
| 929e441dc6 | |||
| a28c78c47f | |||
| f8a06d78f3 | |||
| 274a338520 | |||
| 36ed20117d | |||
| cd06ea1e31 | |||
| 98d0612314 | |||
| e274524c55 | |||
| f42609b66f | |||
| 5def4bdfc4 | |||
| da3037a8ea | |||
| ba02094c4e | |||
| 5d31d86b83 | |||
| cbd0aed8e5 | |||
| b775dd0efa | |||
| 72bf1fa257 | |||
| 8e20d08af2 | |||
| 856ca1e558 | |||
| 25e4070168 | |||
| ca3311da4c | |||
| 3d4eaec178 | |||
| 91f33edcf8 | |||
| 707bf023c6 | |||
| 23f8981346 | |||
| 8f0c946393 | |||
| 24fcfb3f9d | |||
| 7258adfe15 | |||
| 28792ea7e7 | |||
| 686eebd69b | |||
| 83482c8285 | |||
| 953c3f1587 | |||
| 230d43d1fe | |||
| 24f878a17b | |||
| aac3f8904b | |||
| 8dd9165078 | |||
| 982383980f | |||
| 56aa96e9b5 | |||
| 06f06cfbf4 | |||
| e97eae88bc | |||
| 925176b661 | |||
| e4f329466c | |||
| d19fe8b66a | |||
|
|
f4345a91a1 | ||
| ec67617e5c | |||
|
|
bab6a5e9e1 | ||
|
|
f84454fbc1 | ||
| c92830f854 | |||
| e77fd8d85d | |||
| cd0fb1b7bb | |||
| 50ab20317d | |||
| d0a946a919 | |||
|
|
ed142aa34e | ||
| 1227574590 | |||
|
|
3ac7b579a0 | ||
|
|
feb1b0868e | ||
|
|
6d2f34ef1d | ||
| b36a5b9933 | |||
|
|
d8ce5eabb8 | ||
|
|
ceecb0ca27 | ||
| ac3670dcd2 | |||
| 1c7bc61531 | |||
| 58245a62a4 | |||
| a464262558 | |||
| 995d3e0034 | |||
| 90d57cb6a9 | |||
|
|
30eab42294 | ||
| 1d0eeea7ee | |||
| d7c012d306 | |||
| 1665937540 | |||
|
|
9343e3c667 | ||
|
|
b4c8fc1765 | ||
|
|
3ad4e01a5d | ||
| 015b4add65 | |||
| 9051dae787 | |||
| 68bdd75c9c | |||
| a53873b695 | |||
| 77a39b4ef2 | |||
| 64be8b1e89 | |||
| 68bd9fb4f7 | |||
| 0d5d851585 | |||
| eb3d51d20c | |||
| 9f4298ac15 | |||
| fb79ba768c | |||
| 7bc48e3111 | |||
| 53b90d92d7 | |||
| fb6ef8b818 | |||
| 8bb9de0de1 | |||
| 451b50dfed | |||
| 22f2662e3b | |||
| ce3f555c08 | |||
|
|
dedab6010d | ||
| 62a5fda33f | |||
| 5073769403 | |||
| aabec193ff | |||
| d4a1044fce | |||
| dca0edcfcc | |||
| 5a24a79bf7 | |||
| 91f9c4fa83 | |||
| 3940d6f56e | |||
| f09879a46c | |||
| 1b0e891912 | |||
| 292d65491a | |||
| 36faec6ad3 | |||
|
|
062002243e | ||
|
|
98b1e287a4 | ||
| adf0124ea3 | |||
| e1f46d4747 | |||
|
|
d8c3fa0df3 | ||
|
|
27530fca31 | ||
|
|
cc7f13a10e | ||
|
|
625f4353fb | ||
|
|
2815913d10 | ||
| 5fa2402ec5 | |||
| 4d7d3c9138 | |||
|
|
c3f1d05033 | ||
|
|
0e4cb7cbcd | ||
|
|
bace9edf89 | ||
|
|
99735c3ee5 | ||
|
|
2571397c70 | ||
|
|
497c3abfc2 | ||
|
|
fca31cc432 | ||
|
|
8fe4a78feb | ||
|
|
ee170fa2e0 | ||
|
|
da760b2b93 | ||
| 2c8c2a46ea | |||
| 9625a8058c | |||
|
|
4d8bdae836 | ||
|
|
3297707ab7 | ||
|
|
598154645c | ||
|
|
9d8f9a9ba9 | ||
| 68f163b757 | |||
| b8c5bb2045 | |||
| b45df191e5 | |||
| 01cc745787 | |||
|
|
f9bc2eb126 | ||
|
|
4c86ad3198 | ||
|
|
5be0724f82 | ||
|
|
7c652498e4 | ||
| ae19c1b102 | |||
| 6e6b1b64e4 | |||
|
|
721d536350 | ||
| 361437428d | |||
|
|
aadbfeaf2d | ||
|
|
f119d14e7c | ||
| f8b12201f8 | |||
| 585c92be66 | |||
| 7c8639b8ae | |||
| a138b5b365 | |||
|
|
9fde62ae30 | ||
|
|
29fe988583 | ||
|
|
6740d9b363 | ||
|
|
1d1b55b864 | ||
| c32732b22e | |||
| 1e6b6fef0a | |||
|
|
5ab2c1693e | ||
| 0b3cd499a8 | |||
| 884e17f0c4 | |||
|
|
d0ccf236c0 | ||
|
|
396b955db7 | ||
|
|
5f14eb32aa | ||
|
|
cfec7c18ec | ||
|
|
04583acb21 | ||
|
|
95e11d668a | ||
| 772e58c743 | |||
| 470e2633c3 | |||
|
|
3312adddd1 | ||
| 46152d2419 | |||
|
|
b5c82783d6 | ||
| dc85a48864 | |||
| dc8a34592a | |||
| 9d0ae22981 | |||
| ec3cfc1138 | |||
| 8ec0d37cc6 | |||
| c1406efec6 | |||
| 7844216812 | |||
| 96ae1a1cca | |||
| 3793e7b7d4 | |||
| 713e4f6822 | |||
|
|
fada23365e | ||
| 89726ab3ff | |||
| f313f602ba | |||
|
|
6dd0a5b0dd | ||
|
|
c3b197f209 | ||
|
|
9f49ac6457 | ||
|
|
0b3ead6353 | ||
| 8b3625fc01 | |||
|
|
0da508a8b7 | ||
|
|
608eb1a436 | ||
|
|
c0bc6fe25a | ||
|
|
a0d540fd72 | ||
|
|
46a46b65e5 | ||
|
|
4f62b1a05c | ||
| 45dadf8b90 | |||
| e8e84a4e72 | |||
|
|
2f390971e6 | ||
| b7e17d1320 | |||
| c54b1cb6af | |||
| ddb89bce34 | |||
| f056f9d31b | |||
|
|
d9a50ad9f4 | ||
| ce0450d498 | |||
| 7b531059a0 | |||
|
|
bc187bb198 | ||
|
|
eb8c34f53b | ||
| d9a50705e4 | |||
| f4626c2c81 | |||
| e0a48e1e75 | |||
| ec4eb1978e | |||
| 842b376801 | |||
| 13b2cada66 | |||
|
|
3c2f149c22 | ||
| 0a5b5aac4b | |||
| 6e5b058fc1 | |||
| ace2b3a938 | |||
| 5a8213024e | |||
| bd66228b30 | |||
| e1c9754cd2 | |||
| ff101e19cd | |||
| e8ac048114 | |||
| 3c79e8d7b2 | |||
| a74fb2bcd1 | |||
| 63bb79d727 | |||
| 8d87a6ee4e | |||
| ab01940769 | |||
| 23aa9c2814 | |||
| 010f736e80 | |||
| 4dcbcad435 | |||
| 8f8a92b9c5 | |||
| 684eee984d | |||
| 297c3752e3 | |||
| fa504e6675 | |||
| b9b4f1ae35 | |||
| 3c2062f23e | |||
| e7247f1fee | |||
|
|
905a509a17 | ||
| b4dc1dde6c | |||
| 964ab19b42 | |||
| ce8911de10 | |||
| d1e5b0bc42 | |||
| 4b3ed22f76 | |||
| aad1ab0cf4 | |||
| 117637863d | |||
| e933a25453 | |||
| f1f369b48c | |||
| 6b149244d3 | |||
| 436d180e93 | |||
| c43a4030a5 | |||
| 6e826d2840 | |||
| 315d49f8df | |||
| e92578f89d | |||
| 0e45ae189d | |||
|
|
e6e260d8ca | ||
| fcc9b6ad54 | |||
| 0771461c01 | |||
| ed6686d4a7 | |||
| ec3d3e38a6 | |||
| e47d3d4d15 | |||
| f9dbffcb6e | |||
| e83527adee | |||
| dee86c63eb | |||
| ce41e8aa34 | |||
| 7e2c8a37dc | |||
| aeb59364c5 | |||
| 1f16f84fed | |||
|
|
0123169e35 | ||
| ffd7cd1070 | |||
| c6c7632ef7 | |||
| b79759bcff | |||
| d9e8e1c1c2 | |||
| c57e835a41 | |||
| b3d9af29fc | |||
| 4829429abd | |||
| f1ffc6057a | |||
| 8f51215cb3 | |||
| 7b21ce34d6 | |||
| e1497f9cb9 | |||
| 5088e5a205 | |||
| 06266f3905 | |||
| 5f805f8789 | |||
| 60868ae74e | |||
| 37e65634d4 | |||
| 6fcdba56a4 | |||
| 0b9fd0664e | |||
| 6add9aad5d | |||
| 76ab0228ac | |||
| a1e69bba37 | |||
| 270ee48148 | |||
| c679135138 | |||
| 0f88617477 | |||
| 04eed990c7 | |||
| d2bfb91a16 | |||
| 5e024153bc | |||
| e59de85a33 | |||
| fd010b9aa5 | |||
| 45957391a6 | |||
| f2f3817a7f | |||
| f43bb8eea4 | |||
| 8a7ed30676 | |||
| 5b832cb6aa | |||
| 7fa5b5d70a | |||
| 6348ccd05b | |||
| 8144397b2c | |||
| 2dc0963c56 | |||
| a44ba4dc35 | |||
| 007330caa7 | |||
| 492b4815a6 | |||
| 33b8e0817e | |||
| ab7425a9d3 | |||
| d8f925520e | |||
| 9f079b17a2 | |||
| 5b61ff24bb | |||
| c6477e0ed6 | |||
| 38d7fb0c38 | |||
| e848293916 | |||
|
|
15e8c0d9f1 | ||
| 588d11dedf | |||
| 782c8abd9a | |||
| 1d4a5d6d29 | |||
| 9c57571a41 | |||
| b4533ac11f | |||
| 991a4115d4 | |||
| ff107faae6 | |||
| d57643434d | |||
| de33aff077 | |||
| c13049f144 | |||
| ce7f01bdc4 | |||
|
|
bf523c0c5e | ||
| 1efd106c6a | |||
| 08dc8e3cbb | |||
| 96f7a1ecfb | |||
| 64d489f1e6 | |||
| 56abf82d92 | |||
| 3d21bb64c4 | |||
| f6b0ba9703 | |||
| d17bc5da62 | |||
| a884db0e2c | |||
| 5e9fd43d49 | |||
| 8bce89d5dc | |||
|
|
aa40128965 | ||
|
|
a03780718e | ||
| bd1a125154 | |||
| ffe7728966 | |||
| b69e053bb4 | |||
| daec0dc389 | |||
| c8bb70f876 | |||
| 9a08ecc5a5 | |||
| 9738cb7d74 | |||
| 4f4125a3b2 | |||
| 51412f40cf | |||
| ce7270e8a2 | |||
| d72c9e29a4 | |||
|
|
62dc0e1a34 | ||
|
|
d7aa3305d1 | ||
| 96ed74c47c | |||
| 4198db8365 | |||
|
|
e2d7af28dc | ||
| 66d57c1852 | |||
| aa4bf6e7f9 | |||
| 7f0868f344 | |||
| e57cf49c49 | |||
| 66baaf1ebd | |||
| 7d7ac26c30 | |||
| 1a7c74fe4e | |||
| 01e4bcb47e | |||
| 397e846509 | |||
| 314a8a0daa | |||
| ebb352b13a | |||
| 9b5d44f0b3 | |||
| 1892963fcb | |||
| 62f45b15d2 | |||
| 82ac45873c | |||
| 2b2e50916c | |||
| d34f396ef8 | |||
| f9c4405da6 | |||
| dad3dc3e46 | |||
| d003a6d8e0 | |||
| 72bec5d62e | |||
| 88c39ba702 | |||
| 9834b07b47 | |||
| 77d13f0794 | |||
| dd1690d7a1 | |||
| 1873cc9310 | |||
|
|
565858b6c6 | ||
|
|
7383b13f16 | ||
| d5ce03918c | |||
| c9dfa408db | |||
| 36a9bafbde | |||
| 15643c2320 | |||
| 71489b7106 | |||
| 7394833710 | |||
|
|
9c50a3ee1e | ||
|
|
fd79d59f4e | ||
| c628ae2192 | |||
| a56be25500 | |||
| d74661a375 | |||
| 054e733cd5 | |||
| fe4db54eb6 | |||
| 5be503c1bd | |||
| 58cdb5bd20 | |||
| e18c191247 | |||
| 1a338346d5 | |||
| d3d98db7e9 | |||
| 3f9ec695db | |||
| 6f50707cfb | |||
| a5f26252b8 | |||
| d032f43f11 | |||
| 0d53f83a2f | |||
| a7dcfe4b31 | |||
| b9a346a396 | |||
| 225e5490d2 | |||
| 95d89522d8 | |||
| 6fcb880538 | |||
| 65b8c9c5c1 | |||
| 0a7fd0a51a | |||
| 6834294437 | |||
| afee45790f | |||
| f0c789dc91 | |||
| a0f250a487 | |||
| fb25a01db5 | |||
| da4dd0df7e | |||
| 4c6be26846 | |||
| 74acbb15f5 | |||
| d65825e9ef | |||
| e757e25fa1 | |||
|
|
14ec4cf1da | ||
|
|
ea4aaf743f | ||
|
|
61f290441e | ||
| 80fc7eb220 | |||
| 73a9c42f62 | |||
| 72c992bc74 | |||
| f4e05f7a01 | |||
|
|
cb4f733350 | ||
|
|
a5022ff0ee | ||
|
|
cab2b335dc | ||
| b442b17415 | |||
|
|
37e7471dc4 | ||
|
|
3b8c612103 | ||
|
|
08c0c59a28 | ||
|
|
7e01095684 | ||
| 500442fd6b | |||
|
|
b67c6dea08 | ||
|
|
c9215a6d9b | ||
| 1bdf83e101 | |||
| 1bd813d620 | |||
| 943a85cbd5 | |||
| fc24558314 | |||
|
|
d23722a4b7 | ||
|
|
bc46d0f6ab | ||
|
|
532f76ed4f |
10
.clang-tidy
@@ -1,16 +1,24 @@
|
|||||||
---
|
---
|
||||||
Checks: '*,
|
Checks: '*,
|
||||||
|
-altera-*,
|
||||||
-android-cloexec-fopen,
|
-android-cloexec-fopen,
|
||||||
-cppcoreguidelines-pro-bounds-array-to-pointer-decay,
|
-cppcoreguidelines-pro-bounds-array-to-pointer-decay,
|
||||||
-cppcoreguidelines-pro-bounds-pointer-arithmetic,
|
-cppcoreguidelines-pro-bounds-pointer-arithmetic,
|
||||||
-fuchsia*,
|
-fuchsia*,
|
||||||
-readability-else-after-return,
|
-readability-else-after-return,
|
||||||
-readability-avoid-const-params-in-decls,
|
-readability-avoid-const-params-in-decls,
|
||||||
|
-readability-identifier-length,
|
||||||
-cppcoreguidelines-pro-bounds-constant-array-index,
|
-cppcoreguidelines-pro-bounds-constant-array-index,
|
||||||
-cppcoreguidelines-pro-type-reinterpret-cast,
|
-cppcoreguidelines-pro-type-reinterpret-cast,
|
||||||
-llvm-header-guard,
|
-llvm-header-guard,
|
||||||
|
-modernize-use-nodiscard,
|
||||||
|
-misc-non-private-member-variables-in-classes,
|
||||||
-readability-static-accessed-through-instance,
|
-readability-static-accessed-through-instance,
|
||||||
-readability-braces-around-statements,
|
-readability-braces-around-statements,
|
||||||
|
-readability-isolate-declaration,
|
||||||
|
-readability-implicit-bool-conversion,
|
||||||
|
-readability-identifier-length,
|
||||||
|
-readability-identifier-naming,
|
||||||
-hicpp-signed-bitwise,
|
-hicpp-signed-bitwise,
|
||||||
-hicpp-no-array-decay,
|
-hicpp-no-array-decay,
|
||||||
-hicpp-braces-around-statements,
|
-hicpp-braces-around-statements,
|
||||||
@@ -18,8 +26,6 @@ Checks: '*,
|
|||||||
-google-readability-todo,
|
-google-readability-todo,
|
||||||
-google-readability-braces-around-statements,
|
-google-readability-braces-around-statements,
|
||||||
-modernize-use-trailing-return-type,
|
-modernize-use-trailing-return-type,
|
||||||
-readability-isolate-declaration,
|
|
||||||
-readability-implicit-bool-conversion,
|
|
||||||
-llvmlibc-*'
|
-llvmlibc-*'
|
||||||
|
|
||||||
HeaderFilterRegex: \.h
|
HeaderFilterRegex: \.h
|
||||||
|
|||||||
33
.gitea/workflows/rh8-local.yml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
name: Build on local RHEL8
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- developer
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: "detectors-software-RH8"
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Build library
|
||||||
|
run: |
|
||||||
|
source /home/gitea_runner/.bashrc
|
||||||
|
conda activate det
|
||||||
|
mkdir build && cd build
|
||||||
|
conda activate det
|
||||||
|
cmake .. -DSLS_USE_PYTHON=ON
|
||||||
|
make -j 2
|
||||||
|
cd ../pyctbgui
|
||||||
|
make
|
||||||
|
|
||||||
|
- name: Deploy to NFS update server
|
||||||
|
if: gitea.ref == 'refs/heads/developer'
|
||||||
|
run: |
|
||||||
|
sftp -r gitea_runner@mpc2935:/slsDetectorSoftware/RH8 <<< $'put build/bin'
|
||||||
|
sftp -r gitea_runner@mpc2935:/slsDetectorSoftware/RH8 <<< $'put pyctbgui'
|
||||||
29
.gitea/workflows/rh8-native.yml
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
name: Build on RHEL8
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: "ubuntu-latest"
|
||||||
|
container:
|
||||||
|
image: gitea.psi.ch/detectors/rhel8-detectors-dev
|
||||||
|
steps:
|
||||||
|
- name: Clone repository
|
||||||
|
run: |
|
||||||
|
echo Cloning ${{ github.ref_name }}
|
||||||
|
git clone https://${{secrets.GITHUB_TOKEN}}@gitea.psi.ch/${{ github.repository }}.git --branch=${{ github.ref_name }} .
|
||||||
|
|
||||||
|
- name: Build library
|
||||||
|
run: |
|
||||||
|
mkdir build && cd build
|
||||||
|
cmake .. -DSLS_USE_PYTHON=ON -DSLS_USE_TESTS=ON -DSLS_USE_SIMULATOR=ON
|
||||||
|
make -j 2
|
||||||
|
|
||||||
|
- name: C++ unit tests
|
||||||
|
working-directory: ${{gitea.workspace}}/build
|
||||||
|
run: ctest -j1 --rerun-failed --output-on-failure
|
||||||
30
.gitea/workflows/rh9-local.yml
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
name: Build on local RHEL9
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- developer
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: "detectors-software-RH9"
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Build library
|
||||||
|
run: |
|
||||||
|
mkdir build && cd build
|
||||||
|
cmake -DSLS_USE_PYTHON=ON -DPython_EXECUTABLE=/usr/bin/python3.13 -DPython_INCLUDE_DIR=/usr/include/python3.13 -DPython_LIBRARY=/usr/lib64/libpython3.13.so ..
|
||||||
|
make -j 2
|
||||||
|
cd ../pyctbgui
|
||||||
|
make
|
||||||
|
|
||||||
|
- name: Deploy to NFS update server
|
||||||
|
if: gitea.ref == 'refs/heads/developer'
|
||||||
|
run: |
|
||||||
|
sftp -r gitea_runner@mpc2935:/slsDetectorSoftware/RH9 <<< $'put build/bin'
|
||||||
|
sftp -r gitea_runner@mpc2935:/slsDetectorSoftware/RH9 <<< $'put pyctbgui'
|
||||||
27
.gitea/workflows/rh9-native.yml
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
name: Build on RHEL9
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: "ubuntu-latest"
|
||||||
|
container:
|
||||||
|
image: gitea.psi.ch/detectors/rhel9-detectors-dev
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
|
||||||
|
- name: Build library
|
||||||
|
run: |
|
||||||
|
mkdir build && cd build
|
||||||
|
cmake .. -DSLS_USE_PYTHON=ON -DSLS_USE_TESTS=ON -DSLS_USE_SIMULATOR=ON
|
||||||
|
make -j 2
|
||||||
|
|
||||||
|
- name: C++ unit tests
|
||||||
|
working-directory: ${{gitea.workspace}}/build
|
||||||
|
run: ctest -j1 --rerun-failed --output-on-failure
|
||||||
64
.github/workflows/build_wheel.yml
vendored
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
name: Build wheel
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
pull_request:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
release:
|
||||||
|
types:
|
||||||
|
- published
|
||||||
|
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build_wheels:
|
||||||
|
name: Build wheels on ${{ matrix.os }}
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
os: [ubuntu-latest,]
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Build wheels
|
||||||
|
run: pipx run cibuildwheel==3.2.1
|
||||||
|
|
||||||
|
- uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: cibw-wheels-${{ matrix.os }}-${{ strategy.job-index }}
|
||||||
|
path: ./wheelhouse/*.whl
|
||||||
|
|
||||||
|
build_sdist:
|
||||||
|
name: Build source distribution
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Build sdist
|
||||||
|
run: pipx run build --sdist
|
||||||
|
|
||||||
|
- uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: cibw-sdist
|
||||||
|
path: dist/*.tar.gz
|
||||||
|
|
||||||
|
upload_pypi:
|
||||||
|
needs: [build_wheels, build_sdist]
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
environment: pypi
|
||||||
|
permissions:
|
||||||
|
id-token: write
|
||||||
|
if: github.event_name == 'release' && github.event.action == 'published'
|
||||||
|
# or, alternatively, upload to PyPI on every tag starting with 'v' (remove on: release above to use this)
|
||||||
|
# if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')
|
||||||
|
steps:
|
||||||
|
- uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
# unpacks all CIBW artifacts into dist/
|
||||||
|
pattern: cibw-*
|
||||||
|
path: dist
|
||||||
|
merge-multiple: true
|
||||||
|
|
||||||
|
- uses: pypa/gh-action-pypi-publish@release/v1
|
||||||
47
.github/workflows/cmake.yaml
vendored
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
name: Native CMake Build
|
||||||
|
|
||||||
|
on: [push, pull_request]
|
||||||
|
|
||||||
|
env:
|
||||||
|
# Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.)
|
||||||
|
BUILD_TYPE: Debug
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
# The CMake configure and build commands are platform agnostic and should work equally well on Windows or Mac.
|
||||||
|
# You can convert this to a matrix build if you need cross-platform coverage.
|
||||||
|
# See: https://docs.github.com/en/free-pro-team@latest/actions/learn-github-actions/managing-complex-workflows#using-a-build-matrix
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
name: Configure and build using cmake
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- uses: actions/setup-python@v5
|
||||||
|
with:
|
||||||
|
python-version: 3.12
|
||||||
|
cache: 'pip'
|
||||||
|
- run: pip install pytest numpy colorama
|
||||||
|
|
||||||
|
- uses: awalsh128/cache-apt-pkgs-action@latest
|
||||||
|
with:
|
||||||
|
packages: libhdf5-dev qtbase5-dev qt5-qmake libqt5svg5-dev libpng-dev libtiff-dev
|
||||||
|
version: 1.0
|
||||||
|
|
||||||
|
- name: Configure CMake
|
||||||
|
# Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make.
|
||||||
|
# See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type
|
||||||
|
run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DSLS_USE_TESTS=ON -DSLS_USE_HDF5=ON -DSLS_USE_GUI=ON -DSLS_USE_MOENCH=ON -DSLS_USE_PYTHON=ON
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
# Build your program with the given configuration
|
||||||
|
run: cmake --build ${{github.workspace}}/build -j4 --config ${{env.BUILD_TYPE}}
|
||||||
|
|
||||||
|
- name: C++ unit tests
|
||||||
|
working-directory: ${{github.workspace}}/build
|
||||||
|
run: ctest -C ${{env.BUILD_TYPE}} -j1 --rerun-failed --output-on-failure
|
||||||
|
|
||||||
|
- name: Python unit tests
|
||||||
|
working-directory: ${{github.workspace}}/build/bin
|
||||||
|
run: |
|
||||||
|
python -m pytest ${{github.workspace}}/python/tests
|
||||||
|
|
||||||
|
|
||||||
47
.github/workflows/conda_deploy_library.yaml
vendored
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
name: Build and deploy slsdetlib
|
||||||
|
|
||||||
|
on:
|
||||||
|
release:
|
||||||
|
types:
|
||||||
|
- published
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
platform: [ubuntu-latest, ] # macos-12, windows-2019]
|
||||||
|
python-version: ["3.12",]
|
||||||
|
|
||||||
|
runs-on: ${{ matrix.platform }}
|
||||||
|
|
||||||
|
# The setup-miniconda action needs this to activate miniconda
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: "bash -l {0}"
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Get conda
|
||||||
|
uses: conda-incubator/setup-miniconda@v3.0.4
|
||||||
|
with:
|
||||||
|
python-version: ${{ matrix.python-version }}
|
||||||
|
channels: conda-forge
|
||||||
|
|
||||||
|
- name: Prepare
|
||||||
|
run: conda install conda-build conda-verify pytest anaconda-client
|
||||||
|
|
||||||
|
- name: Enable upload
|
||||||
|
run: conda config --set anaconda_upload yes
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
env:
|
||||||
|
CONDA_TOKEN: ${{ secrets.CONDA_TOKEN }}
|
||||||
|
run: conda build conda-recipes/main-library --user slsdetectorgroup --token ${CONDA_TOKEN} --output-folder build_output
|
||||||
|
|
||||||
|
- name: Upload all Conda to github as artifacts
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: conda-packages
|
||||||
|
path: build_output/** # Uploads all packages
|
||||||
47
.github/workflows/conda_deploy_slsdet.yaml
vendored
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
name: deploy slsdet
|
||||||
|
|
||||||
|
on:
|
||||||
|
release:
|
||||||
|
types:
|
||||||
|
- published
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
platform: [ubuntu-latest, ] # macos-12, windows-2019]
|
||||||
|
python-version: ["3.12",]
|
||||||
|
|
||||||
|
runs-on: ${{ matrix.platform }}
|
||||||
|
|
||||||
|
# The setup-miniconda action needs this to activate miniconda
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: "bash -l {0}"
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Get conda
|
||||||
|
uses: conda-incubator/setup-miniconda@v3.0.4
|
||||||
|
with:
|
||||||
|
python-version: ${{ matrix.python-version }}
|
||||||
|
channels: conda-forge
|
||||||
|
|
||||||
|
- name: Prepare
|
||||||
|
run: conda install conda-build conda-verify pytest anaconda-client
|
||||||
|
|
||||||
|
- name: Enable upload
|
||||||
|
run: conda config --set anaconda_upload yes
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
env:
|
||||||
|
CONDA_TOKEN: ${{ secrets.CONDA_TOKEN }}
|
||||||
|
run: conda build conda-recipes/python-client --user slsdetectorgroup --token ${CONDA_TOKEN} --output-folder build_output
|
||||||
|
|
||||||
|
- name: Upload all Conda packages
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: conda-packages
|
||||||
|
path: build_output/** # Uploads all packages
|
||||||
42
.github/workflows/conda_library.yaml
vendored
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
name: Build slsdetlib
|
||||||
|
|
||||||
|
on: [pull_request]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
platform: [ubuntu-latest, ] # macos-12, windows-2019]
|
||||||
|
python-version: ["3.12",]
|
||||||
|
|
||||||
|
runs-on: ${{ matrix.platform }}
|
||||||
|
|
||||||
|
# The setup-miniconda action needs this to activate miniconda
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: "bash -l {0}"
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Get conda
|
||||||
|
uses: conda-incubator/setup-miniconda@v3.0.4
|
||||||
|
with:
|
||||||
|
python-version: ${{ matrix.python-version }}
|
||||||
|
channels: conda-forge
|
||||||
|
|
||||||
|
- name: Prepare
|
||||||
|
run: conda install conda-build conda-verify pytest anaconda-client
|
||||||
|
|
||||||
|
- name: Disable upload
|
||||||
|
run: conda config --set anaconda_upload no
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: conda build conda-recipes/main-library --output-folder build_output
|
||||||
|
|
||||||
|
- name: Upload all Conda packages
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: conda-packages
|
||||||
|
path: build_output/** # Uploads all packages
|
||||||
42
.github/workflows/conda_python.yaml
vendored
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
name: slsdet
|
||||||
|
|
||||||
|
on: [pull_request]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
platform: [ubuntu-latest, ] # macos-12, windows-2019]
|
||||||
|
python-version: ["3.12",]
|
||||||
|
|
||||||
|
runs-on: ${{ matrix.platform }}
|
||||||
|
|
||||||
|
# The setup-miniconda action needs this to activate miniconda
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: "bash -l {0}"
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Get conda
|
||||||
|
uses: conda-incubator/setup-miniconda@v3.0.4
|
||||||
|
with:
|
||||||
|
python-version: ${{ matrix.python-version }}
|
||||||
|
channels: conda-forge
|
||||||
|
|
||||||
|
- name: Prepare
|
||||||
|
run: conda install conda-build conda-verify pytest anaconda-client
|
||||||
|
|
||||||
|
- name: Disable upload
|
||||||
|
run: conda config --set anaconda_upload no
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: conda build conda-recipes/python-client --output-folder build_output
|
||||||
|
|
||||||
|
- name: Upload all Conda packages
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: conda-packages
|
||||||
|
path: build_output/** # Uploads all packages
|
||||||
2
.gitignore
vendored
@@ -9,7 +9,7 @@ bin/
|
|||||||
*.o
|
*.o
|
||||||
*.so
|
*.so
|
||||||
.*
|
.*
|
||||||
build
|
build/
|
||||||
RELEASE.txt
|
RELEASE.txt
|
||||||
Testing/
|
Testing/
|
||||||
|
|
||||||
|
|||||||
239
CMakeLists.txt
@@ -1,15 +1,170 @@
|
|||||||
# SPDX-License-Identifier: LGPL-3.0-or-other
|
# SPDX-License-Identifier: LGPL-3.0-or-other
|
||||||
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
||||||
cmake_minimum_required(VERSION 3.12)
|
cmake_minimum_required(VERSION 3.15)
|
||||||
project(slsDetectorPackage)
|
project(slsDetectorPackage)
|
||||||
set(PROJECT_VERSION 7.0.0)
|
|
||||||
|
# Read VERSION file into project version
|
||||||
|
set(VERSION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/VERSION")
|
||||||
|
file(READ "${VERSION_FILE}" VERSION_CONTENT)
|
||||||
|
string(STRIP "${VERSION_CONTENT}" PROJECT_VERSION_STRING)
|
||||||
|
set(PROJECT_VERSION ${PROJECT_VERSION_STRING})
|
||||||
|
|
||||||
|
# Pass it to the compiler
|
||||||
|
add_compile_definitions(SLS_DET_VERSION="${PROJECT_VERSION}")
|
||||||
|
|
||||||
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")
|
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")
|
||||||
|
|
||||||
cmake_policy(SET CMP0074 NEW)
|
cmake_policy(SET CMP0074 NEW)
|
||||||
|
|
||||||
|
if (${CMAKE_VERSION} VERSION_GREATER "3.24")
|
||||||
|
cmake_policy(SET CMP0135 NEW) #Fetch content download timestamp
|
||||||
|
endif()
|
||||||
include(cmake/project_version.cmake)
|
include(cmake/project_version.cmake)
|
||||||
include(cmake/SlsAddFlag.cmake)
|
include(cmake/SlsAddFlag.cmake)
|
||||||
include(cmake/SlsFindZeroMQ.cmake)
|
include(cmake/helpers.cmake)
|
||||||
|
|
||||||
|
|
||||||
|
find_package(Threads REQUIRED)
|
||||||
|
|
||||||
|
# POSIX threads are required for the moment but we use CMake to find them
|
||||||
|
# Once migrated to std::thread this can be removed
|
||||||
|
if(NOT CMAKE_USE_PTHREADS_INIT)
|
||||||
|
message(FATAL_ERROR "A POSIX threads (pthread) implementation is required, but was not found.")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
option(SLS_USE_SYSTEM_ZMQ "Use system installed libzmq" OFF)
|
||||||
|
|
||||||
|
# Using FetchContent to get libzmq
|
||||||
|
include(FetchContent)
|
||||||
|
option(SLS_FETCH_ZMQ_FROM_GITHUB "Fetch zmq from github" OFF)
|
||||||
|
option(SLS_FETCH_PYBIND11_FROM_GITHUB "Fetch pybind11 from github" OFF)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Allow FetchContent_Populate to be called with a single argument
|
||||||
|
# otherwise deprecated warning is issued
|
||||||
|
# Note: From cmake 3.28 we can pass EXCLUDE_FROM_ALL to FetchContent_Declare
|
||||||
|
# and avoid direct use of Populate
|
||||||
|
if (${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.30")
|
||||||
|
cmake_policy(SET CMP0169 OLD)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Patch libzmq to set minimum cmake version to 3.15 to avoid warnings
|
||||||
|
# with newer cmake versions
|
||||||
|
# Patch is applied in the FetchContent_Declare
|
||||||
|
set(SLS_LIBZMQ_VERSION "4.3.4")
|
||||||
|
|
||||||
|
find_program(PATCH_EXECUTABLE patch)
|
||||||
|
if(NOT PATCH_EXECUTABLE)
|
||||||
|
message(FATAL_ERROR "The 'patch' tool is required for patching lib zeromq. Please install it.")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(SLS_USE_SYSTEM_ZMQ)
|
||||||
|
# find_package(ZeroMQ REQUIRED)
|
||||||
|
# 1) Try a CMake package config if available (vcpkg, Homebrew, source builds)
|
||||||
|
# Many installs export either ZeroMQ::libzmq or libzmq.
|
||||||
|
find_package(ZeroMQ QUIET CONFIG)
|
||||||
|
|
||||||
|
set(ZEROMQ_TARGET "")
|
||||||
|
|
||||||
|
if (TARGET ZeroMQ::libzmq)
|
||||||
|
set(ZEROMQ_TARGET ZeroMQ::libzmq)
|
||||||
|
message(STATUS "Found target: ${ZEROMQ_TARGET} version: ${ZeroMQ_VERSION}")
|
||||||
|
elseif (TARGET libzmq)
|
||||||
|
set(ZEROMQ_TARGET libzmq)
|
||||||
|
message(STATUS "Found target: ${ZEROMQ_TARGET} version: ${ZeroMQ_VERSION}")
|
||||||
|
elseif (TARGET ZeroMQ::ZeroMQ) # rare older naming
|
||||||
|
set(ZEROMQ_TARGET ZeroMQ::ZeroMQ)
|
||||||
|
message(STATUS "Found target: ${ZEROMQ_TARGET} version: ${ZeroMQ_VERSION}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# 2) Fallback: use pkg-config hints + manual find_* to create an imported target
|
||||||
|
if (NOT ZEROMQ_TARGET)
|
||||||
|
find_package(PkgConfig QUIET)
|
||||||
|
if (PkgConfig_FOUND)
|
||||||
|
pkg_check_modules(PC_ZeroMQ QUIET libzmq)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
find_path(ZEROMQ_INCLUDE_DIR
|
||||||
|
NAMES zmq.h
|
||||||
|
HINTS ${PC_ZeroMQ_INCLUDE_DIRS}
|
||||||
|
)
|
||||||
|
|
||||||
|
find_library(ZEROMQ_LIBRARY
|
||||||
|
NAMES zmq libzmq
|
||||||
|
HINTS ${PC_ZeroMQ_LIBRARY_DIRS}
|
||||||
|
)
|
||||||
|
|
||||||
|
if (ZEROMQ_INCLUDE_DIR AND ZEROMQ_LIBRARY)
|
||||||
|
add_library(libzmq UNKNOWN IMPORTED)
|
||||||
|
set_target_properties(libzmq PROPERTIES
|
||||||
|
IMPORTED_LOCATION "${ZEROMQ_LIBRARY}"
|
||||||
|
INTERFACE_INCLUDE_DIRECTORIES "${ZEROMQ_INCLUDE_DIR}"
|
||||||
|
)
|
||||||
|
set(ZEROMQ_TARGET libzmq)
|
||||||
|
endif()
|
||||||
|
message(STATUS "ZeroMQ version (pkg-config): ${PC_ZeroMQ_VERSION}")
|
||||||
|
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# 3) Error out if still not found, with a helpful message
|
||||||
|
if (NOT ZEROMQ_TARGET)
|
||||||
|
message(FATAL_ERROR "ZeroMQ (libzmq) not found. Please install ZeroMQ development files.")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Use it
|
||||||
|
# target_link_libraries(your_target PRIVATE ${ZEROMQ_TARGET})
|
||||||
|
|
||||||
|
message(STATUS "Using system installed libzmq: ${ZeroMQ_LIBRARIES}")
|
||||||
|
message(STATUS "ZeroMQ target: ${ZEROMQ_TARGET}")
|
||||||
|
message(STATUS "ZeroMQ include dirs: ${ZeroMQ_INCLUDE_DIRS}")
|
||||||
|
else()
|
||||||
|
if(SLS_FETCH_ZMQ_FROM_GITHUB)
|
||||||
|
# Opt in to pull down a zmq version from github instead of
|
||||||
|
# using the bundled version
|
||||||
|
FetchContent_Declare(
|
||||||
|
libzmq
|
||||||
|
GIT_REPOSITORY https://github.com/zeromq/libzmq.git
|
||||||
|
GIT_TAG v${SLS_LIBZMQ_VERSION}
|
||||||
|
PATCH_COMMAND ${CMAKE_COMMAND} -E chdir <SOURCE_DIR> patch -p1 < ${CMAKE_CURRENT_SOURCE_DIR}/libs/libzmq/libzmq_cmake_version.patch
|
||||||
|
UPDATE_DISCONNECTED 1
|
||||||
|
)
|
||||||
|
else()
|
||||||
|
# Standard behaviour use libzmq included in this repo (libs/libzmq)
|
||||||
|
FetchContent_Declare(
|
||||||
|
libzmq
|
||||||
|
URL ${CMAKE_CURRENT_SOURCE_DIR}/libs/libzmq/libzmq-${SLS_LIBZMQ_VERSION}.tar.gz
|
||||||
|
URL_HASH MD5=cc20b769ac10afa352e5ed2769bb23b3
|
||||||
|
PATCH_COMMAND ${CMAKE_COMMAND} -E chdir <SOURCE_DIR> patch -p1 < ${CMAKE_CURRENT_SOURCE_DIR}/libs/libzmq/libzmq_cmake_version.patch
|
||||||
|
UPDATE_DISCONNECTED 1
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
# Disable unwanted options from libzmq
|
||||||
|
set(BUILD_TESTS OFF CACHE BOOL "Switch off libzmq test build")
|
||||||
|
set(BUILD_SHARED OFF CACHE BOOL "Switch off libzmq shared libs")
|
||||||
|
set(WITH_PERF_TOOL OFF CACHE BOOL "")
|
||||||
|
set(ENABLE_CPACK OFF CACHE BOOL "")
|
||||||
|
set(ENABLE_CLANG OFF CACHE BOOL "")
|
||||||
|
set(ENABLE_CURVE OFF CACHE BOOL "")
|
||||||
|
set(ENABLE_DRAFTS OFF CACHE BOOL "")
|
||||||
|
set(ENABLE_PRECOMPILED OFF CACHE BOOL "")
|
||||||
|
set(WITH_DOC OFF CACHE BOOL "")
|
||||||
|
set(WITH_DOCS OFF CACHE BOOL "")
|
||||||
|
|
||||||
|
|
||||||
|
# Using GetProperties and Populate to be able to exclude zmq
|
||||||
|
# from install (not possible with FetchContent_MakeAvailable(libzmq))
|
||||||
|
FetchContent_GetProperties(libzmq)
|
||||||
|
if(NOT libzmq_POPULATED)
|
||||||
|
FetchContent_Populate(libzmq)
|
||||||
|
add_subdirectory(${libzmq_SOURCE_DIR} ${libzmq_BINARY_DIR} EXCLUDE_FROM_ALL)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
endif()
|
||||||
|
|
||||||
include(GNUInstallDirs)
|
include(GNUInstallDirs)
|
||||||
|
|
||||||
# If conda build, always set lib dir to 'lib'
|
# If conda build, always set lib dir to 'lib'
|
||||||
@@ -37,7 +192,7 @@ endif()
|
|||||||
|
|
||||||
|
|
||||||
option(SLS_USE_HDF5 "HDF5 File format" OFF)
|
option(SLS_USE_HDF5 "HDF5 File format" OFF)
|
||||||
option(SLS_BUILD_SHARED_LIBRARIES "Build shared libaries" ON)
|
option(SLS_BUILD_SHARED_LIBRARIES "Build shared libaries" OFF)
|
||||||
option(SLS_USE_TEXTCLIENT "Text Client" ON)
|
option(SLS_USE_TEXTCLIENT "Text Client" ON)
|
||||||
option(SLS_USE_DETECTOR "Detector libs" ON)
|
option(SLS_USE_DETECTOR "Detector libs" ON)
|
||||||
option(SLS_USE_RECEIVER "Receiver" ON)
|
option(SLS_USE_RECEIVER "Receiver" ON)
|
||||||
@@ -55,6 +210,7 @@ option(SLS_BUILD_EXAMPLES "examples" OFF)
|
|||||||
option(SLS_TUNE_LOCAL "tune to local machine" OFF)
|
option(SLS_TUNE_LOCAL "tune to local machine" OFF)
|
||||||
option(SLS_DEVEL_HEADERS "install headers for devel" OFF)
|
option(SLS_DEVEL_HEADERS "install headers for devel" OFF)
|
||||||
option(SLS_USE_MOENCH "compile zmq and post processing for Moench" OFF)
|
option(SLS_USE_MOENCH "compile zmq and post processing for Moench" OFF)
|
||||||
|
option(SLS_USE_JUNGFRAU "compile post processing for Jungfrau" OFF)
|
||||||
|
|
||||||
#Convenience option to switch off defaults when building Moench binaries only
|
#Convenience option to switch off defaults when building Moench binaries only
|
||||||
option(SLS_BUILD_ONLY_MOENCH "compile only Moench" OFF)
|
option(SLS_BUILD_ONLY_MOENCH "compile only Moench" OFF)
|
||||||
@@ -68,6 +224,18 @@ if(SLS_BUILD_ONLY_MOENCH)
|
|||||||
set(SLS_USE_MOENCH ON CACHE BOOL "Enable" FORCE)
|
set(SLS_USE_MOENCH ON CACHE BOOL "Enable" FORCE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
#Convenience option to switch off defaults when building Jungfrau binaries only
|
||||||
|
option(SLS_BUILD_ONLY_JUNGFRAU "compile only Jungfrau" OFF)
|
||||||
|
if(SLS_BUILD_ONLY_JUNGFRAU)
|
||||||
|
message(STATUS "Build JUNGFRAU binaries only!")
|
||||||
|
set(SLS_BUILD_SHARED_LIBRARIES OFF CACHE BOOL "Disabled for JUNGFRAU_ONLY" FORCE)
|
||||||
|
set(SLS_USE_TEXTCLIENT OFF CACHE BOOL "Disabled for JUNGFRAU_ONLY" FORCE)
|
||||||
|
set(SLS_USE_DETECTOR OFF CACHE BOOL "Disabled for JUNGFRAU_ONLY" FORCE)
|
||||||
|
set(SLS_USE_RECEIVER OFF CACHE BOOL "Disabled for JUNGFRAU_ONLY" FORCE)
|
||||||
|
set(SLS_USE_RECEIVER_BINARIES OFF CACHE BOOL "Disabled for JUNGFRAU_ONLY" FORCE)
|
||||||
|
set(SLS_USE_JUNGFRAU ON CACHE BOOL "Enable" FORCE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
option(SLS_EXT_BUILD "external build of part of the project" OFF)
|
option(SLS_EXT_BUILD "external build of part of the project" OFF)
|
||||||
if(SLS_EXT_BUILD)
|
if(SLS_EXT_BUILD)
|
||||||
@@ -88,7 +256,6 @@ set(SLS_INTERNAL_QWT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libs/qwt-6.1.5)
|
|||||||
set(ClangFormat_EXCLUDE_PATTERNS "build/"
|
set(ClangFormat_EXCLUDE_PATTERNS "build/"
|
||||||
"libs/"
|
"libs/"
|
||||||
"slsDetectorCalibration/"
|
"slsDetectorCalibration/"
|
||||||
"ctbGui/"
|
|
||||||
"manual/"
|
"manual/"
|
||||||
"python/"
|
"python/"
|
||||||
"sample/"
|
"sample/"
|
||||||
@@ -97,11 +264,9 @@ find_package(ClangFormat)
|
|||||||
|
|
||||||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||||
|
|
||||||
if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
default_build_type("Release")
|
||||||
message(STATUS "No build type selected, default to Release")
|
set_std_fs_lib()
|
||||||
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build type (default Release)" FORCE)
|
message(STATUS "Extra linking to fs lib:${STD_FS_LIB}")
|
||||||
endif()
|
|
||||||
|
|
||||||
|
|
||||||
#Enable LTO if available
|
#Enable LTO if available
|
||||||
include(CheckIPOSupported)
|
include(CheckIPOSupported)
|
||||||
@@ -124,7 +289,7 @@ endif()
|
|||||||
# to control options for the libraries
|
# to control options for the libraries
|
||||||
if(NOT TARGET slsProjectOptions)
|
if(NOT TARGET slsProjectOptions)
|
||||||
add_library(slsProjectOptions INTERFACE)
|
add_library(slsProjectOptions INTERFACE)
|
||||||
target_compile_features(slsProjectOptions INTERFACE cxx_std_11)
|
target_compile_features(slsProjectOptions INTERFACE cxx_std_17)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (NOT TARGET slsProjectWarnings)
|
if (NOT TARGET slsProjectWarnings)
|
||||||
@@ -172,18 +337,24 @@ if (NOT TARGET slsProjectCSettings)
|
|||||||
-Wredundant-decls
|
-Wredundant-decls
|
||||||
-Wdouble-promotion
|
-Wdouble-promotion
|
||||||
-Werror=return-type
|
-Werror=return-type
|
||||||
|
-Wno-format-overflow
|
||||||
|
-Wno-format-truncation
|
||||||
)
|
)
|
||||||
sls_disable_c_warning("-Wstringop-truncation")
|
sls_disable_c_warning("-Wstringop-truncation")
|
||||||
|
target_link_libraries(slsProjectCSettings INTERFACE
|
||||||
|
Threads::Threads
|
||||||
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
if(SLS_USE_SANITIZER)
|
if(SLS_USE_SANITIZER)
|
||||||
target_compile_options(slsProjectOptions INTERFACE -fsanitize=address,undefined -fno-omit-frame-pointer)
|
target_compile_options(slsProjectOptions INTERFACE -fsanitize=address,undefined -fno-omit-frame-pointer)
|
||||||
target_link_libraries(slsProjectOptions INTERFACE -fsanitize=address,undefined)
|
target_link_libraries(slsProjectOptions INTERFACE -fsanitize=address,undefined)
|
||||||
# target_compile_options(slsProjectOptions INTERFACE -fsanitize=thread)
|
#target_compile_options(slsProjectOptions INTERFACE -fsanitize=thread -fno-omit-frame-pointer)
|
||||||
# target_link_libraries(slsProjectOptions INTERFACE -fsanitize=thread)
|
#target_link_libraries(slsProjectOptions INTERFACE -fsanitize=thread)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
if(SLS_TUNE_LOCAL)
|
if(SLS_TUNE_LOCAL)
|
||||||
target_compile_options(slsProjectOptions INTERFACE -mtune=native -march=native)
|
target_compile_options(slsProjectOptions INTERFACE -mtune=native -march=native)
|
||||||
endif()
|
endif()
|
||||||
@@ -202,10 +373,6 @@ set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
|||||||
set(CMAKE_INSTALL_RPATH $ORIGIN)
|
set(CMAKE_INSTALL_RPATH $ORIGIN)
|
||||||
set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
|
set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
|
||||||
|
|
||||||
|
|
||||||
custom_find_zmq()
|
|
||||||
|
|
||||||
|
|
||||||
if (SLS_USE_TESTS)
|
if (SLS_USE_TESTS)
|
||||||
enable_testing()
|
enable_testing()
|
||||||
add_subdirectory(tests)
|
add_subdirectory(tests)
|
||||||
@@ -238,18 +405,41 @@ if (SLS_USE_INTEGRATION_TESTS)
|
|||||||
endif (SLS_USE_INTEGRATION_TESTS)
|
endif (SLS_USE_INTEGRATION_TESTS)
|
||||||
|
|
||||||
if (SLS_USE_PYTHON)
|
if (SLS_USE_PYTHON)
|
||||||
find_package (Python 3.6 COMPONENTS Interpreter Development)
|
find_package (Python 3.8 COMPONENTS Interpreter Development.Module REQUIRED)
|
||||||
add_subdirectory(libs/pybind ${CMAKE_BINARY_DIR}/bin/)
|
set(PYBIND11_FINDPYTHON ON) # Needed for RH8
|
||||||
|
if(SLS_FETCH_PYBIND11_FROM_GITHUB)
|
||||||
|
FetchContent_Declare(
|
||||||
|
pybind11
|
||||||
|
GIT_REPOSITORY https://github.com/pybind/pybind11
|
||||||
|
GIT_TAG v2.13.6
|
||||||
|
)
|
||||||
|
|
||||||
|
else()
|
||||||
|
# https://github.com/pybind/pybind11/releases
|
||||||
|
FetchContent_Declare(
|
||||||
|
pybind11
|
||||||
|
URL ${CMAKE_CURRENT_SOURCE_DIR}/libs/pybind11/v2.13.6.tar.gz
|
||||||
|
URL_HASH MD5=a04dead9c83edae6d84e2e343da7feeb
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
FetchContent_MakeAvailable(pybind11)
|
||||||
|
|
||||||
add_subdirectory(python)
|
add_subdirectory(python)
|
||||||
endif(SLS_USE_PYTHON)
|
endif(SLS_USE_PYTHON)
|
||||||
|
|
||||||
if (SLS_USE_CTBGUI)
|
if (SLS_USE_CTBGUI)
|
||||||
add_subdirectory(ctbGui)
|
add_subdirectory(pyctbgui)
|
||||||
endif(SLS_USE_CTBGUI)
|
endif(SLS_USE_CTBGUI)
|
||||||
|
|
||||||
configure_file( .clang-tidy
|
# Workaround for file note being copied to build directory
|
||||||
|
# when issuing a python -m build
|
||||||
|
# TODO! Proper fix
|
||||||
|
if(EXISTS ".clang-tidy")
|
||||||
|
configure_file(.clang-tidy
|
||||||
${CMAKE_BINARY_DIR}/.clang-tidy
|
${CMAKE_BINARY_DIR}/.clang-tidy
|
||||||
)
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
if (SLS_BUILD_EXAMPLES)
|
if (SLS_BUILD_EXAMPLES)
|
||||||
add_subdirectory(sample)
|
add_subdirectory(sample)
|
||||||
@@ -264,6 +454,11 @@ if(SLS_USE_MOENCH)
|
|||||||
add_subdirectory(slsDetectorCalibration/moenchExecutables)
|
add_subdirectory(slsDetectorCalibration/moenchExecutables)
|
||||||
endif(SLS_USE_MOENCH)
|
endif(SLS_USE_MOENCH)
|
||||||
|
|
||||||
|
if(SLS_USE_JUNGFRAU)
|
||||||
|
add_subdirectory(slsDetectorCalibration/tiffio)
|
||||||
|
add_subdirectory(slsDetectorCalibration/jungfrauExecutables)
|
||||||
|
endif(SLS_USE_JUNGFRAU)
|
||||||
|
|
||||||
if(SLS_MASTER_PROJECT)
|
if(SLS_MASTER_PROJECT)
|
||||||
set(CMAKE_INSTALL_DIR "share/cmake/${PROJECT_NAME}")
|
set(CMAKE_INSTALL_DIR "share/cmake/${PROJECT_NAME}")
|
||||||
set(PROJECT_LIBRARIES slsSupportShared slsDetectorShared slsReceiverShared)
|
set(PROJECT_LIBRARIES slsSupportShared slsDetectorShared slsReceiverShared)
|
||||||
|
|||||||
154
README.md
@@ -1,20 +1,33 @@
|
|||||||
## Dependencies
|
## Dependencies
|
||||||
Before building from source make sure that you have the [software wiki](https://slsdetectorgroup.github.io/devdoc/dependencies.html) installed. If installing using conda, conda will manage the dependencies. Avoid also installing packages with pip.
|
Before building from source make sure that you have the [dependencies](https://slsdetectorgroup.github.io/devdoc/dependencies.html) installed. If installing using conda, conda will manage the dependencies. Avoid also installing dependency packages with pip.
|
||||||
|
|
||||||
## Documentaion
|
## Documentaion
|
||||||
Detailed documentation can be found in the [software wiki](https://slsdetectorgroup.github.io/devdoc/index.html) and on the [official site](https://www.psi.ch/en/detectors/software).
|
Detailed documentation including installation can be found in the [software wiki](https://slsdetectorgroup.github.io/devdoc/index.html).
|
||||||
|
|
||||||
|
List of releases can be found on the [official site](https://www.psi.ch/en/lxn/software-releases).
|
||||||
|
|
||||||
|
Firmware compatiblity can be found in [firmware page](https://github.com/slsdetectorgroup/slsDetectorFirmware)
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
### 1. Install binaries using conda
|
The slsDetectorPackage provides core detector software implemented in C++, along with Python bindings packaged as the slsdet Python extension module. Choose the option that best fits your environment and use case.
|
||||||
|
|
||||||
|
1. **Install pre-built binaries using conda (Recommended)**: Install pre-built binaries for the C++ client, receiver, GUI and the Python API (`slsdet`), simplifying setup across platforms.
|
||||||
|
|
||||||
|
2. **Pip**: Install only the Python extension module, either by downloading the pre-built library from PyPI or by building the extension locally from source. Available only from v9.2.0 onwards.
|
||||||
|
|
||||||
|
3. **Build from source**: Compile the entire package yourself, including both the C++ core and the Python bindings, for maximum control and customization. However, make sure that you have the dependencies installed. If installing using conda, conda will manage the dependencies. Avoid installing packages with pip and conda simultaneously.
|
||||||
|
|
||||||
|
### 1. Install pre-built binaries using conda (Recommended)
|
||||||
Conda is not only useful to manage python environments but can also
|
Conda is not only useful to manage python environments but can also
|
||||||
be used as a user space package manager. Dates in the tag (for eg. 2020.07.23.dev0)
|
be used as a user space package manager. Dates in the tag (for eg. 2020.07.23.dev0)
|
||||||
are from the developer branch. Please use released tags for stability.
|
are from the developer branch. Please use released tags for stability.
|
||||||
|
|
||||||
We have three different packages available:
|
We have three different packages available:
|
||||||
* **slsdetlib** shared libraries and command line utilities
|
* **slsdetlib** Shared libraries and command line utilities
|
||||||
* **slsdetgui** GUI
|
* **slsdetgui** GUI
|
||||||
* **slsdet** Python bindings
|
* **slsdet** Python bindings
|
||||||
|
* **moenchzmq** Moench
|
||||||
|
|
||||||
```
|
```
|
||||||
#Add channels for dependencies and our library
|
#Add channels for dependencies and our library
|
||||||
@@ -40,35 +53,38 @@ conda search slsdetlib
|
|||||||
conda search slsdet
|
conda search slsdet
|
||||||
# gui
|
# gui
|
||||||
conda search slsdetgui
|
conda search slsdetgui
|
||||||
|
# moench
|
||||||
|
conda search moenchzmq
|
||||||
```
|
```
|
||||||
|
|
||||||
### 2. Build from source
|
## 2. Pip
|
||||||
|
The Python extension module `slsdet` can be installed using pip. This is available from v9.2.0 onwards.
|
||||||
|
|
||||||
##### 2.1 Download Source Code from github
|
```
|
||||||
|
#Install the Python extension module from PyPI
|
||||||
|
pip install slsdet
|
||||||
|
|
||||||
|
# or install the python extension locally from source
|
||||||
|
git clone https://github.com/slsdetectorgroup/slsDetectorPackage.git --branch 9.2.0
|
||||||
|
cd slsDetectorPackage
|
||||||
|
pip install .
|
||||||
|
```
|
||||||
|
|
||||||
|
## 3. Build from source
|
||||||
|
|
||||||
|
### 3.1. Download Source Code from github
|
||||||
```
|
```
|
||||||
git clone https://github.com/slsdetectorgroup/slsDetectorPackage.git --branch 7.0.0
|
git clone https://github.com/slsdetectorgroup/slsDetectorPackage.git --branch 7.0.0
|
||||||
```
|
```
|
||||||
|
|
||||||
**Pybind for Python**<br>
|
> **Note:** For v6.x.x of slsDetectorPackage and older, refer [pybind11 notes on cloning](#Pybind-and-Zeromq).
|
||||||
* **v7.0.0+**:
|
|
||||||
pybind11 packaged into 'libs/pybind'. No longer a submodule. No need for "recursive" or "submodule update".
|
|
||||||
|
|
||||||
* **Older versions**:
|
|
||||||
pybind11 is a submodule. Must be cloned using "recursive" and updated when switching between versions using the following commands.
|
|
||||||
|
|
||||||
```
|
|
||||||
# clone using recursive to get pybind11 submodule
|
|
||||||
git clone --recursive https://github.com/slsdetectorgroup/slsDetectorPackage.git
|
|
||||||
|
|
||||||
# update submodule when switching between releases
|
|
||||||
cd slsDetectorPackage
|
|
||||||
git submodule update --init
|
|
||||||
```
|
|
||||||
|
|
||||||
##### 2.2 Build from source
|
|
||||||
|
|
||||||
|
|
||||||
###### Build using CMake
|
### 3.2. Build from source
|
||||||
|
|
||||||
|
One can either build using cmake or use the in-built cmk.sh script.
|
||||||
|
|
||||||
|
### 3.2.1. Build using CMake
|
||||||
|
|
||||||
```
|
```
|
||||||
# outside slsDetecorPackage folder
|
# outside slsDetecorPackage folder
|
||||||
@@ -94,26 +110,28 @@ Instead of the cmake command, one can use ccmake to get a list of options to con
|
|||||||
ccmake ..
|
ccmake ..
|
||||||
|
|
||||||
# choose the options
|
# choose the options
|
||||||
# first press [c] - configure
|
# first press [c] - configure (unil you see [g])
|
||||||
# then press [g] - generate
|
# then press [g] - generate
|
||||||
```
|
```
|
||||||
|
|
||||||
|Example cmake options|Comment|
|
|Example cmake options|Comment|
|
||||||
|---|---|
|
|---|---|
|
||||||
| -DSLS_USE_PYTHON=ON | Python |
|
| -DSLS_USE_PYTHON=ON | Python |
|
||||||
| -DPython_FIND_VIRTUALENV=ONLY | Python from only the conda environment |
|
| -DPython_FIND_VIRTUALENV=ONLY | Python from only the conda env |
|
||||||
| -DZeroMQ_HINT=/usr/lib64 | Use system zmq instead |
|
|
||||||
| -DSLS_USE_GUI=ON | GUI |
|
| -DSLS_USE_GUI=ON | GUI |
|
||||||
|
| -DSLS_USE_HDF5=ON | HDF5 |
|
||||||
|
| -DSLS_USE_SIMULATOR=ON | Simulator |
|
||||||
|
|
||||||
|
> **Note:** For v7.x.x of slsDetectorPackage and older, refer [zeromq notes for cmake option to hint library location](#Pybind-and-Zeromq).
|
||||||
|
|
||||||
###### Build using in-built cmk.sh script
|
### 3.2.2. Build using in-built cmk.sh script
|
||||||
|
|
||||||
```
|
```
|
||||||
The binaries are generated in slsDetectorPackage/build/bin directory.
|
The binaries are generated in slsDetectorPackage/build/bin directory.
|
||||||
|
|
||||||
Usage: ./cmk.sh [-b] [-c] [-d <HDF5 directory>] [e] [g] [-h] [i] [-j <Number of threads>]
|
Usage: $0 [-b] [-c] [-d <HDF5 directory>] [-e] [-g] [-h] [-i]
|
||||||
[-k <CMake command>] [-l <Install directory>] [m] [n] [-p] [-q <Zmq hint directory>]
|
[-j <Number of threads>] [-k <CMake command>] [-l <Install directory>]
|
||||||
[r] [s] [t] [u] [z]
|
[-m] [-n] [-p] [-r] [-s] [-t] [-u] [-z]
|
||||||
-[no option]: only make
|
-[no option]: only make
|
||||||
-b: Builds/Rebuilds CMake files normal mode
|
-b: Builds/Rebuilds CMake files normal mode
|
||||||
-c: Clean
|
-c: Clean
|
||||||
@@ -128,7 +146,6 @@ Usage: ./cmk.sh [-b] [-c] [-d <HDF5 directory>] [e] [g] [-h] [i] [-j <Number of
|
|||||||
-m: Manuals
|
-m: Manuals
|
||||||
-n: Manuals without compiling doxygen (only rst)
|
-n: Manuals without compiling doxygen (only rst)
|
||||||
-p: Builds/Rebuilds Python API
|
-p: Builds/Rebuilds Python API
|
||||||
-q: Zmq hint directory
|
|
||||||
-r: Build/Rebuilds only receiver
|
-r: Build/Rebuilds only receiver
|
||||||
-s: Simulator
|
-s: Simulator
|
||||||
-t: Build/Rebuilds only text client
|
-t: Build/Rebuilds only text client
|
||||||
@@ -145,13 +162,16 @@ Usage: ./cmk.sh [-b] [-c] [-d <HDF5 directory>] [e] [g] [-h] [i] [-j <Number of
|
|||||||
# new build, python and compile in parallel:
|
# new build, python and compile in parallel:
|
||||||
./cmk.sh -cbpj5
|
./cmk.sh -cbpj5
|
||||||
|
|
||||||
#To use the system zmq (/usr/lib64) instead
|
#For rebuilding only certain sections
|
||||||
./cmk.sh -cbj5 -q /usr/lib64
|
./cmk.sh -tg #only text client and gui
|
||||||
|
./cmk.sh -r #only receiver
|
||||||
```
|
```
|
||||||
|
|
||||||
###### Build on old distributions
|
> **Note:** For v7.x.x of slsDetectorPackage and older, refer [zeromq notes for cmk script option to hint library location](#Pybind-and-Zeromq).
|
||||||
|
|
||||||
If your linux distribution doesn't come with a C++11 compiler (gcc>4.8) then
|
### 3.3. Build on old distributions using conda
|
||||||
|
|
||||||
|
If your linux distribution doesn't come with a C++17 compiler (gcc>8) then
|
||||||
it's possible to install a newer gcc using conda and build the slsDetectorPackage
|
it's possible to install a newer gcc using conda and build the slsDetectorPackage
|
||||||
using this compiler
|
using this compiler
|
||||||
|
|
||||||
@@ -166,7 +186,10 @@ cmake ../slsDetectorPackage -DCMAKE_PREFIX_PATH=$CONDA_PREFIX
|
|||||||
make -j12
|
make -j12
|
||||||
```
|
```
|
||||||
|
|
||||||
###### Build slsDetectorGui (Qt5)
|
> **Note:** For v7.x.x of slsDetectorPackage and older, refer [zeromq notes for dependencies for conda](#Pybind-and-Zeromq).
|
||||||
|
|
||||||
|
|
||||||
|
### 3.4. Build slsDetectorGui (Qt5)
|
||||||
|
|
||||||
1. Using pre-built binary on conda
|
1. Using pre-built binary on conda
|
||||||
```
|
```
|
||||||
@@ -180,7 +203,14 @@ yum install qt5-qtbase-devel.x86_64
|
|||||||
yum install qt5-qtsvg-devel.x86_64
|
yum install qt5-qtsvg-devel.x86_64
|
||||||
```
|
```
|
||||||
|
|
||||||
3. Using conda
|
3. Using system installation on RHEL8
|
||||||
|
```
|
||||||
|
yum install qt5-qtbase-devel.x86_64
|
||||||
|
yum install qt5-qtsvg-devel.x86_64
|
||||||
|
yum install expat-devel.x86_64
|
||||||
|
```
|
||||||
|
|
||||||
|
4. Using conda
|
||||||
```
|
```
|
||||||
#Add channels for dependencies and our library
|
#Add channels for dependencies and our library
|
||||||
conda config --add channels conda-forge
|
conda config --add channels conda-forge
|
||||||
@@ -208,13 +238,15 @@ cd slsDetectorPackage
|
|||||||
./cmk.sh -cbgj9
|
./cmk.sh -cbgj9
|
||||||
```
|
```
|
||||||
|
|
||||||
###### Build documentation from package
|
> **Note:** For v7.x.x of slsDetectorPackage and older, refer [zeromq notes for dependencies for conda](#Pybind-and-Zeromq).
|
||||||
|
|
||||||
|
### 3.5. Build documentation from package
|
||||||
The documentation for the slsDetectorPackage is build using a combination
|
The documentation for the slsDetectorPackage is build using a combination
|
||||||
of Doxygen, Sphinx and Breathe. The easiest way to install the dependencies
|
of Doxygen, Sphinx and Breathe. The easiest way to install the dependencies
|
||||||
is to use conda
|
is to use conda
|
||||||
|
|
||||||
```
|
```
|
||||||
conda create -n myenv python sphinx_rtd_theme breathe
|
conda create -n myenv python=3.12 sphinx sphinx_rtd_theme breathe doxygen numpy
|
||||||
```
|
```
|
||||||
|
|
||||||
```
|
```
|
||||||
@@ -228,6 +260,48 @@ make rst # rst only, saves time in case the API did not change
|
|||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 4. Pybind and Zeromq
|
||||||
|
|
||||||
|
### Pybind11 for Python
|
||||||
|
**v8.0.0+**:
|
||||||
|
pybind11 is built
|
||||||
|
* by default from tar file in repo (libs/pybind/v2.1x.0.tar.gz)
|
||||||
|
* or use advanced option SLS_FETCH_PYBIND11_FROM_GITHUB [link].
|
||||||
|
* v9.0.0+: pybind11 (v2.13.6)
|
||||||
|
* v8.x.x : pybind11 (v2.11.0)
|
||||||
|
|
||||||
|
**v7.x.x**:
|
||||||
|
pybind11 packaged into ‘libs/pybind’. No longer a submodule. No need for “recursive” or “submodule update”.
|
||||||
|
|
||||||
|
**Older versions**:
|
||||||
|
pybind11 is a submodule. Must be cloned using “recursive” and updated when switching between versions using the following commands.
|
||||||
|
|
||||||
|
```
|
||||||
|
# Note: Only for v6.x.x versions and older
|
||||||
|
|
||||||
|
# clone using recursive to get pybind11 submodule
|
||||||
|
git clone --recursive https://github.com/slsdetectorgroup/slsDetectorPackage.git
|
||||||
|
|
||||||
|
# update submodule when switching between releases
|
||||||
|
cd slsDetectorPackage
|
||||||
|
git submodule update --init
|
||||||
|
```
|
||||||
|
|
||||||
|
### Zeromq
|
||||||
|
**v8.0.0+**:
|
||||||
|
zeromq (v4.3.4) is built
|
||||||
|
* by default from tar file in repo (libs/libzmq/libzmq-4.3.4.tar.gz)
|
||||||
|
* or use advanced option SLS_FETCH_ZMQ_FROM_GITHUB [link].
|
||||||
|
|
||||||
|
**v7.x.x and older**:
|
||||||
|
zeromq-devel must be installed and one can hint its location using
|
||||||
|
* cmake option:’-DZeroMQ_HINT=/usr/lib64’ or
|
||||||
|
* option ‘-q’ in cmk.sh script: : ./cmk.sh -cbj5 -q /usr/lib64
|
||||||
|
* ‘zeromq’ dependency added when installing using conda
|
||||||
|
|
||||||
|
|
||||||
## Support
|
## Support
|
||||||
dhanya.thattil@psi.ch
|
dhanya.thattil@psi.ch
|
||||||
erik.frojdh@psi.ch
|
erik.frojdh@psi.ch
|
||||||
|
alice.mazzoleni@psi.ch
|
||||||
77
RELEASE.txt
@@ -1,7 +1,7 @@
|
|||||||
SLS Detector Package Major Release 7.x.x released on xx.xx.2023
|
SLS Detector Package Major Release x.x.x released on xx.xx.202x
|
||||||
===============================================================
|
===============================================================
|
||||||
|
|
||||||
This document describes the differences between v7.x.x and v7.0.0
|
This document describes the differences between vx.x.x and v10.0.0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -23,36 +23,41 @@ This document describes the differences between v7.x.x and v7.0.0
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
1 New, Changed or Resolved Features
|
1 New, Changed or Resolved Features
|
||||||
=====================================
|
=====================================
|
||||||
|
|
||||||
|
Building shared libraries is disabled by default. If you need to link
|
||||||
|
against any of the libSls*.so libraries, you can enable this by passing
|
||||||
|
-DSLS_BUILD_SHARED_LIBRARIES=ON to CMake.
|
||||||
|
|
||||||
- moench being made compatible with jungfrau 2.0 boards (jungfrau structure, away from ctb)
|
Added SLS_USE_SYSTEM_ZMQ option (default OFF) to use the libzmq of the host
|
||||||
- eiger febl and feb in versions
|
instead of the one included in our repo.
|
||||||
|
|
||||||
|
Experimental support for building the detector client (including python bindings) on macOS
|
||||||
|
|
||||||
|
``rx_dbitlist`` keeps the order of the passed bit list
|
||||||
|
|
||||||
2 On-board Detector Server Compatibility
|
2 On-board Detector Server Compatibility
|
||||||
==========================================
|
==========================================
|
||||||
|
|
||||||
|
|
||||||
Eiger 7.0.0
|
Eiger 10.0.0
|
||||||
Jungfrau 7.0.0
|
Jungfrau 10.0.0
|
||||||
Mythen3 7.0.0
|
Mythen3 10.0.0
|
||||||
Gotthard2 7.0.0
|
Gotthard2 10.0.0
|
||||||
Gotthard 7.0.0
|
Moench 10.0.0
|
||||||
Moench 7.0.0
|
|
||||||
Ctb 7.0.0
|
|
||||||
|
|
||||||
|
|
||||||
On-board Detector Server Upgrade
|
On-board Detector Server Upgrade
|
||||||
--------------------------------
|
--------------------------------
|
||||||
|
|
||||||
From v6.1.0 (without tftp):
|
From v6.1.0 (without tftp):
|
||||||
|
update only on-board detector server
|
||||||
Using command 'updatedetectorserver'
|
Using command 'updatedetectorserver'
|
||||||
From 5.0.0 (with tftp):
|
|
||||||
Using command 'copydetectorserver'
|
|
||||||
|
udpate both on-board detector server and firmware simultaneously
|
||||||
|
Using command 'update'
|
||||||
|
|
||||||
Instructions available at
|
Instructions available at
|
||||||
https://slsdetectorgroup.github.io/devdoc/serverupgrade.html
|
https://slsdetectorgroup.github.io/devdoc/serverupgrade.html
|
||||||
@@ -63,22 +68,16 @@ This document describes the differences between v7.x.x and v7.0.0
|
|||||||
3 Firmware Requirements
|
3 Firmware Requirements
|
||||||
========================
|
========================
|
||||||
|
|
||||||
|
Eiger 02.10.2023 (v32) (updated in 7.0.3)
|
||||||
|
|
||||||
Eiger 20.02.2023 (v31)
|
Jungfrau 09.02.2025 (v1.6, HW v1.0) (updated in 9.1.0)
|
||||||
|
08.02.2025 (v2.6, HW v2.0) (updated in 9.1.0)
|
||||||
|
|
||||||
Jungfrau 04.11.2022 (v1.4, HW v1.0)
|
Mythen3 13.11.2024 (v2.0) (updated in 9.0.0)
|
||||||
03.11.2022 (v2.4, HW v2.0)
|
|
||||||
|
|
||||||
Mythen3 24.01.2023 (v1.4)
|
Gotthard2 03.10.2024 (v1.0) (updated in 9.0.0)
|
||||||
|
|
||||||
Gotthard2 23.11.2022 (v0.3)
|
Moench 26.10.2023 (v2.0) (updated in 8.0.2)
|
||||||
|
|
||||||
Gotthard 08.02.2018 (50um and 25um Master)
|
|
||||||
09.02.2018 (25 um Slave)
|
|
||||||
|
|
||||||
Moench 05.12.2022 (v0.3)
|
|
||||||
|
|
||||||
Ctb 05.12.2022 (v1.1)
|
|
||||||
|
|
||||||
|
|
||||||
Detector Upgrade
|
Detector Upgrade
|
||||||
@@ -91,15 +90,12 @@ This document describes the differences between v7.x.x and v7.0.0
|
|||||||
Mythen3 via command <.rbf>
|
Mythen3 via command <.rbf>
|
||||||
Gotthard2 via command <.rbf>
|
Gotthard2 via command <.rbf>
|
||||||
Moench via command <.pof>
|
Moench via command <.pof>
|
||||||
Ctb via command <.pof>
|
|
||||||
|
|
||||||
Gotthard cannot be upgraded remotely
|
|
||||||
|
|
||||||
Except Eiger,
|
Except Eiger,
|
||||||
upgrade
|
upgrade
|
||||||
Using command 'programfpga' or
|
Using command 'programfpga' or
|
||||||
|
|
||||||
udpate both server and firmware simultaneously
|
udpate both on-board detector server and firmware simultaneously
|
||||||
Using command 'update'
|
Using command 'update'
|
||||||
|
|
||||||
|
|
||||||
@@ -112,6 +108,7 @@ This document describes the differences between v7.x.x and v7.0.0
|
|||||||
4 Kernel Requirements
|
4 Kernel Requirements
|
||||||
======================
|
======================
|
||||||
|
|
||||||
|
|
||||||
Blackfin
|
Blackfin
|
||||||
--------
|
--------
|
||||||
Latest version: Fri Oct 29 00:00:00 2021
|
Latest version: Fri Oct 29 00:00:00 2021
|
||||||
@@ -119,10 +116,12 @@ This document describes the differences between v7.x.x and v7.0.0
|
|||||||
Older ones will work, but might have issues with programming firmware via
|
Older ones will work, but might have issues with programming firmware via
|
||||||
the package.
|
the package.
|
||||||
|
|
||||||
|
|
||||||
Nios
|
Nios
|
||||||
-----
|
-----
|
||||||
Compatible version: Mon May 10 18:00:21 CEST 2021
|
Compatible version: Mon May 10 18:00:21 CEST 2021
|
||||||
|
|
||||||
|
|
||||||
Kernel Upgrade
|
Kernel Upgrade
|
||||||
---------------
|
---------------
|
||||||
Eiger via bit files
|
Eiger via bit files
|
||||||
@@ -167,6 +166,15 @@ This document describes the differences between v7.x.x and v7.0.0
|
|||||||
Consuming slsDetectorPackage:
|
Consuming slsDetectorPackage:
|
||||||
https://slsdetectorgroup.github.io/devdoc/consuming.html
|
https://slsdetectorgroup.github.io/devdoc/consuming.html
|
||||||
|
|
||||||
|
Software Architecture
|
||||||
|
https://slsdetectorgroup.github.io/devdoc/softwarearchitecture.html
|
||||||
|
|
||||||
|
Set up commands in config file
|
||||||
|
https://slsdetectorgroup.github.io/devdoc/configcommands.html
|
||||||
|
|
||||||
|
Image Size and Output Characteristics
|
||||||
|
https://slsdetectorgroup.github.io/devdoc/dataformat.html
|
||||||
|
|
||||||
API Examples:
|
API Examples:
|
||||||
https://github.com/slsdetectorgroup/api-examples
|
https://github.com/slsdetectorgroup/api-examples
|
||||||
|
|
||||||
@@ -193,6 +201,14 @@ This document describes the differences between v7.x.x and v7.0.0
|
|||||||
https://slsdetectorgroup.github.io/devdoc/udpheader.html
|
https://slsdetectorgroup.github.io/devdoc/udpheader.html
|
||||||
https://slsdetectorgroup.github.io/devdoc/udpdetspec.html
|
https://slsdetectorgroup.github.io/devdoc/udpdetspec.html
|
||||||
|
|
||||||
|
Output Data:
|
||||||
|
https://slsdetectorgroup.github.io/devdoc/dataformat.html
|
||||||
|
https://slsdetectorgroup.github.io/devdoc/fileformat.html
|
||||||
|
https://slsdetectorgroup.github.io/devdoc/slsreceiverheaderformat.html
|
||||||
|
https://slsdetectorgroup.github.io/devdoc/masterfileattributes.html
|
||||||
|
https://slsdetectorgroup.github.io/devdoc/binaryfileformat.html
|
||||||
|
https://slsdetectorgroup.github.io/devdoc/hdf5fileformat.html
|
||||||
|
|
||||||
slsReceiver Zmq Format:
|
slsReceiver Zmq Format:
|
||||||
https://slsdetectorgroup.github.io/devdoc/slsreceiver.html#zmq-json-header-format
|
https://slsdetectorgroup.github.io/devdoc/slsreceiver.html#zmq-json-header-format
|
||||||
|
|
||||||
@@ -212,3 +228,4 @@ This document describes the differences between v7.x.x and v7.0.0
|
|||||||
|
|
||||||
dhanya.thattil@psi.ch
|
dhanya.thattil@psi.ch
|
||||||
erik.frojdh@psi.ch
|
erik.frojdh@psi.ch
|
||||||
|
alice.mazzoleni@psi.ch
|
||||||
|
|||||||
1
bash_autocomplete.sh
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
slsDetectorSoftware/generator/autocomplete/bash_autocomplete.sh
|
||||||
@@ -25,7 +25,9 @@ mark_as_advanced(
|
|||||||
ClangFormat_BIN)
|
ClangFormat_BIN)
|
||||||
|
|
||||||
if(ClangFormat_FOUND)
|
if(ClangFormat_FOUND)
|
||||||
exec_program(${ClangFormat_BIN} ${CMAKE_CURRENT_SOURCE_DIR} ARGS --version OUTPUT_VARIABLE CLANG_VERSION_TEXT)
|
execute_process(COMMAND ${ClangFormat_BIN} --version
|
||||||
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
OUTPUT_VARIABLE CLANG_VERSION_TEXT)
|
||||||
string(REGEX MATCH "([0-9]+)\\.[0-9]+\\.[0-9]+" CLANG_VERSION ${CLANG_VERSION_TEXT})
|
string(REGEX MATCH "([0-9]+)\\.[0-9]+\\.[0-9]+" CLANG_VERSION ${CLANG_VERSION_TEXT})
|
||||||
if((${CLANG_VERSION} GREATER "9") OR (${CLANG_VERSION} EQUAL "9"))
|
if((${CLANG_VERSION} GREATER "9") OR (${CLANG_VERSION} EQUAL "9"))
|
||||||
# A CMake script to find all source files and setup clang-format targets for them
|
# A CMake script to find all source files and setup clang-format targets for them
|
||||||
|
|||||||
@@ -1,38 +0,0 @@
|
|||||||
function(custom_find_zmq)
|
|
||||||
set(ZeroMQ_HINT "" CACHE STRING "Hint where ZeroMQ could be found")
|
|
||||||
#Adapted from: https://github.com/zeromq/cppzmq/
|
|
||||||
if (NOT TARGET libzmq)
|
|
||||||
if(ZeroMQ_HINT)
|
|
||||||
message(STATUS "Looking for ZeroMQ in: ${ZeroMQ_HINT}")
|
|
||||||
find_package(ZeroMQ 4
|
|
||||||
NO_DEFAULT_PATH
|
|
||||||
HINTS ${ZeroMQ_HINT}
|
|
||||||
)
|
|
||||||
else()
|
|
||||||
find_package(ZeroMQ 4 QUIET)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# libzmq autotools install: fallback to pkg-config
|
|
||||||
if(ZeroMQ_FOUND)
|
|
||||||
message(STATUS "Found libzmq using find_package")
|
|
||||||
else()
|
|
||||||
message(STATUS "CMake libzmq package not found, trying again with pkg-config (normal install of zeromq)")
|
|
||||||
list (APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/cmake/libzmq-pkg-config)
|
|
||||||
find_package(ZeroMQ 4 REQUIRED)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# TODO "REQUIRED" above should already cause a fatal failure if not found, but this doesn't seem to work
|
|
||||||
if(NOT ZeroMQ_FOUND)
|
|
||||||
message(FATAL_ERROR "ZeroMQ was not found, neither as a CMake package nor via pkg-config")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (ZeroMQ_FOUND AND NOT TARGET libzmq)
|
|
||||||
message(FATAL_ERROR "ZeroMQ version not supported!")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
get_target_property(VAR libzmq IMPORTED_LOCATION)
|
|
||||||
message(STATUS "Using libzmq: ${VAR}")
|
|
||||||
|
|
||||||
|
|
||||||
endfunction()
|
|
||||||
46
cmake/helpers.cmake
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
function(default_build_type val)
|
||||||
|
if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
||||||
|
message(STATUS "No build type selected, default to Release")
|
||||||
|
set(CMAKE_BUILD_TYPE ${val} CACHE STRING "Build type (default ${val})" FORCE)
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(set_std_fs_lib)
|
||||||
|
# from pybind11
|
||||||
|
# Check if we need to add -lstdc++fs or -lc++fs or nothing
|
||||||
|
if(DEFINED CMAKE_CXX_STANDARD AND CMAKE_CXX_STANDARD LESS 17)
|
||||||
|
set(STD_FS_NO_LIB_NEEDED TRUE)
|
||||||
|
elseif(MSVC)
|
||||||
|
set(STD_FS_NO_LIB_NEEDED TRUE)
|
||||||
|
else()
|
||||||
|
file(
|
||||||
|
WRITE ${CMAKE_CURRENT_BINARY_DIR}/main.cpp
|
||||||
|
"#include <filesystem>\nint main(int argc, char ** argv) {\n std::filesystem::path p(argv[0]);\n return p.string().length();\n}"
|
||||||
|
)
|
||||||
|
try_compile(
|
||||||
|
STD_FS_NO_LIB_NEEDED ${CMAKE_CURRENT_BINARY_DIR}
|
||||||
|
SOURCES ${CMAKE_CURRENT_BINARY_DIR}/main.cpp
|
||||||
|
COMPILE_DEFINITIONS -std=c++17)
|
||||||
|
try_compile(
|
||||||
|
STD_FS_NEEDS_STDCXXFS ${CMAKE_CURRENT_BINARY_DIR}
|
||||||
|
SOURCES ${CMAKE_CURRENT_BINARY_DIR}/main.cpp
|
||||||
|
COMPILE_DEFINITIONS -std=c++17
|
||||||
|
LINK_LIBRARIES stdc++fs)
|
||||||
|
try_compile(
|
||||||
|
STD_FS_NEEDS_CXXFS ${CMAKE_CURRENT_BINARY_DIR}
|
||||||
|
SOURCES ${CMAKE_CURRENT_BINARY_DIR}/main.cpp
|
||||||
|
COMPILE_DEFINITIONS -std=c++17
|
||||||
|
LINK_LIBRARIES c++fs)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(${STD_FS_NEEDS_STDCXXFS})
|
||||||
|
set(STD_FS_LIB stdc++fs PARENT_SCOPE)
|
||||||
|
elseif(${STD_FS_NEEDS_CXXFS})
|
||||||
|
set(STD_FS_LIB c++fs PARENT_SCOPE)
|
||||||
|
elseif(${STD_FS_NO_LIB_NEEDED})
|
||||||
|
set(STD_FS_LIB "" PARENT_SCOPE)
|
||||||
|
else()
|
||||||
|
message(WARNING "Unknown C++17 compiler - not passing -lstdc++fs")
|
||||||
|
set(STD_FS_LIB "")
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
#From: https://github.com/zeromq/cppzmq/
|
|
||||||
set(PKG_CONFIG_USE_CMAKE_PREFIX_PATH ON)
|
|
||||||
find_package(PkgConfig)
|
|
||||||
pkg_check_modules(PC_LIBZMQ QUIET libzmq)
|
|
||||||
|
|
||||||
set(ZeroMQ_VERSION ${PC_LIBZMQ_VERSION})
|
|
||||||
|
|
||||||
find_path(ZeroMQ_INCLUDE_DIR zmq.h
|
|
||||||
PATHS ${ZeroMQ_DIR}/include
|
|
||||||
${PC_LIBZMQ_INCLUDE_DIRS}
|
|
||||||
)
|
|
||||||
|
|
||||||
find_library(ZeroMQ_LIBRARY
|
|
||||||
NAMES zmq
|
|
||||||
PATHS ${ZeroMQ_DIR}/lib
|
|
||||||
${PC_LIBZMQ_LIBDIR}
|
|
||||||
${PC_LIBZMQ_LIBRARY_DIRS}
|
|
||||||
)
|
|
||||||
|
|
||||||
if(ZeroMQ_LIBRARY OR ZeroMQ_STATIC_LIBRARY)
|
|
||||||
set(ZeroMQ_FOUND ON)
|
|
||||||
message(STATUS "Found libzmq using PkgConfig")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set ( ZeroMQ_LIBRARIES ${ZeroMQ_LIBRARY} )
|
|
||||||
set ( ZeroMQ_INCLUDE_DIRS ${ZeroMQ_INCLUDE_DIR} )
|
|
||||||
|
|
||||||
if (NOT TARGET libzmq)
|
|
||||||
add_library(libzmq UNKNOWN IMPORTED)
|
|
||||||
set_target_properties(libzmq PROPERTIES
|
|
||||||
IMPORTED_LOCATION ${ZeroMQ_LIBRARIES}
|
|
||||||
INTERFACE_INCLUDE_DIRECTORIES ${ZeroMQ_INCLUDE_DIRS})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
include ( FindPackageHandleStandardArgs )
|
|
||||||
find_package_handle_standard_args ( ZeroMQ DEFAULT_MSG ZeroMQ_LIBRARIES ZeroMQ_INCLUDE_DIRS )
|
|
||||||
@@ -25,11 +25,6 @@ install(FILES
|
|||||||
DESTINATION ${CMAKE_INSTALL_DIR}
|
DESTINATION ${CMAKE_INSTALL_DIR}
|
||||||
)
|
)
|
||||||
|
|
||||||
install(FILES
|
|
||||||
"${CMAKE_SOURCE_DIR}/cmake/libzmq-pkg-config/FindZeroMQ.cmake"
|
|
||||||
COMPONENT devel
|
|
||||||
DESTINATION ${CMAKE_INSTALL_DIR}/libzmq-pkg-config
|
|
||||||
)
|
|
||||||
|
|
||||||
if (PROJECT_LIBRARIES OR PROJECT_STATIC_LIBRARIES)
|
if (PROJECT_LIBRARIES OR PROJECT_STATIC_LIBRARIES)
|
||||||
install(
|
install(
|
||||||
|
|||||||
@@ -13,17 +13,6 @@ include(CMakeFindDependencyMacro)
|
|||||||
set(SLS_USE_HDF5 "@SLS_USE_HDF5@")
|
set(SLS_USE_HDF5 "@SLS_USE_HDF5@")
|
||||||
|
|
||||||
|
|
||||||
find_package(ZeroMQ 4 QUIET)
|
|
||||||
# libzmq autotools install: fallback to pkg-config
|
|
||||||
if(NOT ZeroMQ_FOUND)
|
|
||||||
list (APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/libzmq-pkg-config)
|
|
||||||
find_package(ZeroMQ 4 REQUIRED)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT ZeroMQ_FOUND)
|
|
||||||
message(FATAL_ERROR "ZeroMQ was NOT found!")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
find_dependency(Threads)
|
find_dependency(Threads)
|
||||||
|
|
||||||
# Add optional dependencies here
|
# Add optional dependencies here
|
||||||
|
|||||||
15
cmk.sh
@@ -18,7 +18,6 @@ CTBGUI=0
|
|||||||
MANUALS=0
|
MANUALS=0
|
||||||
MANUALS_ONLY_RST=0
|
MANUALS_ONLY_RST=0
|
||||||
MOENCHZMQ=0
|
MOENCHZMQ=0
|
||||||
ZMQ_HINT_DIR=""
|
|
||||||
|
|
||||||
|
|
||||||
CLEAN=0
|
CLEAN=0
|
||||||
@@ -27,7 +26,7 @@ CMAKE_PRE=""
|
|||||||
CMAKE_POST=""
|
CMAKE_POST=""
|
||||||
|
|
||||||
usage() { echo -e "
|
usage() { echo -e "
|
||||||
Usage: $0 [-b] [-c] [-d <HDF5 directory>] [e] [g] [-h] [i] [-j <Number of threads>] [-k <CMake command>] [-l <Install directory>] [m] [n] [-p] [-q <Zmq hint directory>] [r] [s] [t] [u] [z]
|
Usage: $0 [-b] [-c] [-d <HDF5 directory>] [-e] [-g] [-h] [-i] [-j <Number of threads>] [-k <CMake command>] [-l <Install directory>] [-m] [-n] [-p] [-r] [-s] [-t] [-u] [-z]
|
||||||
-[no option]: only make
|
-[no option]: only make
|
||||||
-b: Builds/Rebuilds CMake files normal mode
|
-b: Builds/Rebuilds CMake files normal mode
|
||||||
-c: Clean
|
-c: Clean
|
||||||
@@ -42,7 +41,6 @@ Usage: $0 [-b] [-c] [-d <HDF5 directory>] [e] [g] [-h] [i] [-j <Number of thread
|
|||||||
-m: Manuals
|
-m: Manuals
|
||||||
-n: Manuals without compiling doxygen (only rst)
|
-n: Manuals without compiling doxygen (only rst)
|
||||||
-p: Builds/Rebuilds Python API
|
-p: Builds/Rebuilds Python API
|
||||||
-q: Zmq hint directory
|
|
||||||
-r: Build/Rebuilds only receiver
|
-r: Build/Rebuilds only receiver
|
||||||
-s: Simulator
|
-s: Simulator
|
||||||
-t: Build/Rebuilds only text client
|
-t: Build/Rebuilds only text client
|
||||||
@@ -140,10 +138,6 @@ while getopts ":bcd:eghij:k:l:mnpq:rstuz" opt ; do
|
|||||||
PYTHON=1
|
PYTHON=1
|
||||||
REBUILD=1
|
REBUILD=1
|
||||||
;;
|
;;
|
||||||
q)
|
|
||||||
echo "Zmq hint directory: $OPTARG"
|
|
||||||
ZMQ_HINT_DIR=$OPTARG
|
|
||||||
;;
|
|
||||||
r)
|
r)
|
||||||
echo "Compiling Options: Receiver"
|
echo "Compiling Options: Receiver"
|
||||||
RECEIVER=1
|
RECEIVER=1
|
||||||
@@ -260,13 +254,6 @@ if [ $TESTS -eq 1 ]; then
|
|||||||
echo "Tests Option enabled"
|
echo "Tests Option enabled"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
#zmq hint dir
|
|
||||||
if [ -n "$ZMQ_HINT_DIR" ]; then
|
|
||||||
CMAKE_POST+=" -DZeroMQ_HINT="$ZMQ_HINT_DIR
|
|
||||||
CMAKE_POST+=" -DZeroMQ_DIR="
|
|
||||||
# echo "Enabling Zmq Hint Directory: $ZMQ_HINT_DIR"
|
|
||||||
fi
|
|
||||||
|
|
||||||
#hdf5 rebuild
|
#hdf5 rebuild
|
||||||
if [ $HDF5 -eq 1 ]; then
|
if [ $HDF5 -eq 1 ]; then
|
||||||
# CMAKE_PRE+="HDF5_ROOT="$HDF5DIR
|
# CMAKE_PRE+="HDF5_ROOT="$HDF5DIR
|
||||||
|
|||||||
@@ -1,6 +0,0 @@
|
|||||||
# SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
|
|
||||||
echo "|<-------- starting python build"
|
|
||||||
cd python
|
|
||||||
${PYTHON} setup.py install
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
python:
|
|
||||||
- 3.8
|
|
||||||
- 3.9
|
|
||||||
- 3.10
|
|
||||||
- 3.11
|
|
||||||
|
|
||||||
numpy:
|
|
||||||
- 1.17
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
# SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
mkdir $PREFIX/lib
|
|
||||||
mkdir $PREFIX/bin
|
|
||||||
mkdir $PREFIX/include
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
cp build/bin/ctbGui $PREFIX/bin/.
|
|
||||||
cp build/bin/libctbRootLib.so $PREFIX/lib/.
|
|
||||||
|
|
||||||
@@ -1,131 +0,0 @@
|
|||||||
|
|
||||||
package:
|
|
||||||
name: sls_detector_software
|
|
||||||
version: {{ environ.get('GIT_DESCRIBE_TAG', '') }}
|
|
||||||
|
|
||||||
source:
|
|
||||||
- path: ..
|
|
||||||
|
|
||||||
build:
|
|
||||||
number: 0
|
|
||||||
binary_relocation: True
|
|
||||||
rpaths:
|
|
||||||
- lib/
|
|
||||||
|
|
||||||
requirements:
|
|
||||||
build:
|
|
||||||
- {{ compiler('c') }}
|
|
||||||
- {{compiler('cxx')}}
|
|
||||||
- cmake
|
|
||||||
- qt 5.*
|
|
||||||
- zeromq
|
|
||||||
- xorg-libx11
|
|
||||||
- xorg-libice
|
|
||||||
- xorg-libxext
|
|
||||||
- xorg-libsm
|
|
||||||
- xorg-libxau
|
|
||||||
- xorg-libxrender
|
|
||||||
- xorg-libxfixes
|
|
||||||
- {{ cdt('mesa-libgl-devel') }} # [linux]
|
|
||||||
- {{ cdt('mesa-libegl-devel') }} # [linux]
|
|
||||||
- {{ cdt('mesa-dri-drivers') }} # [linux]
|
|
||||||
- {{ cdt('libselinux') }} # [linux]
|
|
||||||
- {{ cdt('libxdamage') }} # [linux]
|
|
||||||
- {{ cdt('libxxf86vm') }} # [linux]
|
|
||||||
- expat
|
|
||||||
|
|
||||||
host:
|
|
||||||
- libstdcxx-ng
|
|
||||||
- libgcc-ng
|
|
||||||
- zeromq
|
|
||||||
- xorg-libx11
|
|
||||||
- xorg-libice
|
|
||||||
- xorg-libxext
|
|
||||||
- xorg-libsm
|
|
||||||
- xorg-libxau
|
|
||||||
- xorg-libxrender
|
|
||||||
- xorg-libxfixes
|
|
||||||
- expat
|
|
||||||
|
|
||||||
run:
|
|
||||||
- zeromq
|
|
||||||
- libstdcxx-ng
|
|
||||||
- libgcc-ng
|
|
||||||
|
|
||||||
|
|
||||||
outputs:
|
|
||||||
- name: slsdetlib
|
|
||||||
script: copy_lib.sh
|
|
||||||
|
|
||||||
requirements:
|
|
||||||
build:
|
|
||||||
- {{ compiler('c') }}
|
|
||||||
- {{compiler('cxx')}}
|
|
||||||
- libstdcxx-ng
|
|
||||||
- libgcc-ng
|
|
||||||
- zeromq
|
|
||||||
|
|
||||||
host:
|
|
||||||
- zeromq
|
|
||||||
|
|
||||||
run:
|
|
||||||
- libstdcxx-ng
|
|
||||||
- libgcc-ng
|
|
||||||
- zeromq
|
|
||||||
|
|
||||||
- name: slsdet
|
|
||||||
|
|
||||||
script: build_pylib.sh
|
|
||||||
|
|
||||||
requirements:
|
|
||||||
build:
|
|
||||||
- python
|
|
||||||
- {{ compiler('c') }}
|
|
||||||
- {{compiler('cxx')}}
|
|
||||||
- {{ pin_subpackage('slsdetlib', exact=True) }}
|
|
||||||
- setuptools
|
|
||||||
|
|
||||||
host:
|
|
||||||
- python
|
|
||||||
- {{ pin_subpackage('slsdetlib', exact=True) }}
|
|
||||||
|
|
||||||
|
|
||||||
run:
|
|
||||||
- libstdcxx-ng
|
|
||||||
- libgcc-ng
|
|
||||||
- python
|
|
||||||
- numpy
|
|
||||||
- {{ pin_subpackage('slsdetlib', exact=True) }}
|
|
||||||
|
|
||||||
|
|
||||||
test:
|
|
||||||
imports:
|
|
||||||
- slsdet
|
|
||||||
|
|
||||||
- name: slsdetgui
|
|
||||||
script: copy_gui.sh
|
|
||||||
requirements:
|
|
||||||
|
|
||||||
build:
|
|
||||||
- {{ compiler('c') }}
|
|
||||||
- {{compiler('cxx')}}
|
|
||||||
- {{ pin_subpackage('slsdetlib', exact=True) }}
|
|
||||||
|
|
||||||
run:
|
|
||||||
- {{ pin_subpackage('slsdetlib', exact=True) }}
|
|
||||||
- qt 5.*
|
|
||||||
- expat
|
|
||||||
|
|
||||||
- name: moenchzmq
|
|
||||||
script: copy_moench.sh
|
|
||||||
requirements:
|
|
||||||
|
|
||||||
build:
|
|
||||||
- {{ compiler('c') }}
|
|
||||||
- {{compiler('cxx')}}
|
|
||||||
- {{ pin_subpackage('slsdetlib', exact=True) }}
|
|
||||||
|
|
||||||
|
|
||||||
run:
|
|
||||||
- {{ pin_subpackage('slsdetlib', exact=True) }}
|
|
||||||
- expat
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
# SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
ctest -j2
|
|
||||||
@@ -1,10 +1,14 @@
|
|||||||
# SPDX-License-Identifier: LGPL-3.0-or-other
|
# SPDX-License-Identifier: LGPL-3.0-or-other
|
||||||
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
||||||
|
|
||||||
mkdir build
|
if [ ! -d "build" ]; then
|
||||||
mkdir install
|
mkdir build
|
||||||
|
fi
|
||||||
|
if [ ! -d "install" ]; then
|
||||||
|
mkdir install
|
||||||
|
fi
|
||||||
cd build
|
cd build
|
||||||
cmake .. \
|
cmake .. -G Ninja \
|
||||||
-DCMAKE_PREFIX_PATH=$CONDA_PREFIX \
|
-DCMAKE_PREFIX_PATH=$CONDA_PREFIX \
|
||||||
-DCMAKE_INSTALL_PREFIX=install \
|
-DCMAKE_INSTALL_PREFIX=install \
|
||||||
-DSLS_USE_TEXTCLIENT=ON \
|
-DSLS_USE_TEXTCLIENT=ON \
|
||||||
@@ -14,7 +18,8 @@ cmake .. \
|
|||||||
-DSLS_USE_TESTS=ON \
|
-DSLS_USE_TESTS=ON \
|
||||||
-DSLS_USE_PYTHON=OFF \
|
-DSLS_USE_PYTHON=OFF \
|
||||||
-DCMAKE_BUILD_TYPE=Release \
|
-DCMAKE_BUILD_TYPE=Release \
|
||||||
-DSLS_USE_HDF5=OFF\
|
-DSLS_USE_HDF5=OFF \
|
||||||
|
-DSLS_USE_SYSTEM_ZMQ=ON \
|
||||||
|
|
||||||
NCORES=$(getconf _NPROCESSORS_ONLN)
|
NCORES=$(getconf _NPROCESSORS_ONLN)
|
||||||
echo "Building using: ${NCORES} cores"
|
echo "Building using: ${NCORES} cores"
|
||||||
13
conda-recipes/main-library/conda_build_config.yaml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
|
||||||
|
c_compiler:
|
||||||
|
- gcc # [linux]
|
||||||
|
|
||||||
|
c_stdlib:
|
||||||
|
- sysroot # [linux]
|
||||||
|
|
||||||
|
cxx_compiler:
|
||||||
|
- gxx # [linux]
|
||||||
|
|
||||||
|
|
||||||
|
c_stdlib_version: # [linux]
|
||||||
|
- 2.17 # [linux]
|
||||||
@@ -4,18 +4,20 @@
|
|||||||
mkdir -p $PREFIX/lib
|
mkdir -p $PREFIX/lib
|
||||||
mkdir -p $PREFIX/bin
|
mkdir -p $PREFIX/bin
|
||||||
mkdir -p $PREFIX/include/sls
|
mkdir -p $PREFIX/include/sls
|
||||||
# mkdir $PREFIX/include/slsDetectorPackage
|
|
||||||
|
|
||||||
#Shared and static libraries
|
#Shared and static libraries
|
||||||
cp build/install/lib/* $PREFIX/lib/
|
cp build/install/lib/* $PREFIX/lib/
|
||||||
|
|
||||||
#Binaries
|
#Binaries
|
||||||
cp build/install/bin/sls_detector_acquire $PREFIX/bin/.
|
cp build/install/bin/sls_detector_acquire $PREFIX/bin/.
|
||||||
|
cp build/install/bin/sls_detector_acquire_zmq $PREFIX/bin/.
|
||||||
cp build/install/bin/sls_detector_get $PREFIX/bin/.
|
cp build/install/bin/sls_detector_get $PREFIX/bin/.
|
||||||
cp build/install/bin/sls_detector_put $PREFIX/bin/.
|
cp build/install/bin/sls_detector_put $PREFIX/bin/.
|
||||||
cp build/install/bin/sls_detector_help $PREFIX/bin/.
|
cp build/install/bin/sls_detector_help $PREFIX/bin/.
|
||||||
|
cp build/install/bin/sls_detector $PREFIX/bin/.
|
||||||
cp build/install/bin/slsReceiver $PREFIX/bin/.
|
cp build/install/bin/slsReceiver $PREFIX/bin/.
|
||||||
cp build/install/bin/slsMultiReceiver $PREFIX/bin/.
|
cp build/install/bin/slsMultiReceiver $PREFIX/bin/.
|
||||||
|
cp build/install/bin/slsFrameSynchronizer $PREFIX/bin/.
|
||||||
|
|
||||||
|
|
||||||
cp build/install/include/sls/* $PREFIX/include/sls
|
cp build/install/include/sls/* $PREFIX/include/sls
|
||||||
80
conda-recipes/main-library/meta.yaml
Executable file
@@ -0,0 +1,80 @@
|
|||||||
|
source:
|
||||||
|
path: ../..
|
||||||
|
|
||||||
|
{% set version = load_file_regex(load_file = 'VERSION', regex_pattern = '(\d+(?:\.\d+)*(?:[\+\w\.]+))').group(1) %}
|
||||||
|
package:
|
||||||
|
name: sls_detector_software
|
||||||
|
version: {{ version }}
|
||||||
|
|
||||||
|
build:
|
||||||
|
number: 0
|
||||||
|
binary_relocation: True
|
||||||
|
rpaths:
|
||||||
|
- lib/
|
||||||
|
|
||||||
|
requirements:
|
||||||
|
build:
|
||||||
|
- {{ compiler('c') }}
|
||||||
|
- {{ stdlib("c") }}
|
||||||
|
- {{ compiler('cxx') }}
|
||||||
|
- git
|
||||||
|
- cmake
|
||||||
|
- ninja
|
||||||
|
- qt 5.*
|
||||||
|
|
||||||
|
host:
|
||||||
|
- libstdcxx-ng
|
||||||
|
- libgcc-ng
|
||||||
|
- libgl-devel # [linux]
|
||||||
|
- libtiff
|
||||||
|
- zlib
|
||||||
|
- expat
|
||||||
|
- zeromq
|
||||||
|
|
||||||
|
run:
|
||||||
|
- libstdcxx-ng
|
||||||
|
- libgcc-ng
|
||||||
|
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
- name: slsdetlib
|
||||||
|
script: copy_lib.sh
|
||||||
|
|
||||||
|
requirements:
|
||||||
|
build:
|
||||||
|
- {{ compiler('c') }}
|
||||||
|
- {{ stdlib("c") }}
|
||||||
|
- {{ compiler('cxx') }}
|
||||||
|
|
||||||
|
run:
|
||||||
|
- libstdcxx-ng
|
||||||
|
- libgcc-ng
|
||||||
|
|
||||||
|
|
||||||
|
- name: slsdetgui
|
||||||
|
script: copy_gui.sh
|
||||||
|
requirements:
|
||||||
|
|
||||||
|
build:
|
||||||
|
- {{ compiler('c') }}
|
||||||
|
- {{compiler('cxx')}}
|
||||||
|
- {{ pin_subpackage('slsdetlib', exact=True) }}
|
||||||
|
|
||||||
|
|
||||||
|
run:
|
||||||
|
- {{ pin_subpackage('slsdetlib', exact=True) }}
|
||||||
|
- qt 5.*
|
||||||
|
|
||||||
|
|
||||||
|
- name: moenchzmq
|
||||||
|
script: copy_moench.sh
|
||||||
|
requirements:
|
||||||
|
|
||||||
|
build:
|
||||||
|
- {{ compiler('c') }}
|
||||||
|
- {{compiler('cxx')}}
|
||||||
|
- {{ pin_subpackage('slsdetlib', exact=True) }}
|
||||||
|
|
||||||
|
|
||||||
|
run:
|
||||||
|
- {{ pin_subpackage('slsdetlib', exact=True) }}
|
||||||
18
conda-recipes/python-client/conda_build_config.yaml
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
python:
|
||||||
|
- 3.11
|
||||||
|
- 3.12
|
||||||
|
- 3.13
|
||||||
|
- 3.14
|
||||||
|
|
||||||
|
|
||||||
|
c_compiler:
|
||||||
|
- gcc # [linux]
|
||||||
|
|
||||||
|
c_stdlib:
|
||||||
|
- sysroot # [linux]
|
||||||
|
|
||||||
|
cxx_compiler:
|
||||||
|
- gxx # [linux]
|
||||||
|
|
||||||
|
c_stdlib_version: # [linux]
|
||||||
|
- 2.17 # [linux]
|
||||||
45
conda-recipes/python-client/meta.yaml
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
source:
|
||||||
|
path: ../..
|
||||||
|
|
||||||
|
{% set version = load_file_regex(load_file = 'VERSION', regex_pattern = '(\d+(?:\.\d+)*(?:[\+\w\.]+))').group(1) %}
|
||||||
|
package:
|
||||||
|
name: slsdet
|
||||||
|
version: {{ version }}
|
||||||
|
|
||||||
|
build:
|
||||||
|
number: 0
|
||||||
|
script:
|
||||||
|
- unset CMAKE_GENERATOR && {{ PYTHON }} -m pip install . -vv --config-settings=cmake.define.SLS_USE_SYSTEM_ZMQ=ON # [not win]
|
||||||
|
|
||||||
|
requirements:
|
||||||
|
build:
|
||||||
|
- python
|
||||||
|
- {{ compiler('c') }}
|
||||||
|
- {{ stdlib("c") }}
|
||||||
|
- {{ compiler('cxx') }}
|
||||||
|
|
||||||
|
host:
|
||||||
|
- cmake
|
||||||
|
- ninja
|
||||||
|
- python
|
||||||
|
- pip
|
||||||
|
- scikit-build-core
|
||||||
|
- pybind11 >=2.13.0
|
||||||
|
- fmt
|
||||||
|
- zeromq
|
||||||
|
- nlohmann_json
|
||||||
|
- catch2
|
||||||
|
|
||||||
|
run:
|
||||||
|
- python
|
||||||
|
- numpy
|
||||||
|
|
||||||
|
|
||||||
|
test:
|
||||||
|
imports:
|
||||||
|
- slsdet
|
||||||
|
|
||||||
|
|
||||||
|
about:
|
||||||
|
summary: An example project built with pybind11 and scikit-build.
|
||||||
|
# license_file: LICENSE
|
||||||
@@ -1,90 +0,0 @@
|
|||||||
# SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
|
|
||||||
|
|
||||||
find_package(ROOT CONFIG REQUIRED COMPONENTS Core Gui)
|
|
||||||
find_package(TIFF REQUIRED)
|
|
||||||
|
|
||||||
target_include_directories(ROOT::Core INTERFACE "${ROOT_INCLUDE_DIRS}")
|
|
||||||
add_library(ROOT::Flags_CXX IMPORTED INTERFACE)
|
|
||||||
separate_arguments(ROOT_CXX_FLAGS)
|
|
||||||
target_compile_options(ROOT::Flags_CXX INTERFACE ${ROOT_CXX_FLAGS})
|
|
||||||
separate_arguments(ROOT_DEFINITIONS)
|
|
||||||
target_compile_definitions(ROOT::Flags_CXX INTERFACE ${ROOT_DEFINITIONS})
|
|
||||||
|
|
||||||
# This fixes a bug in the linker flags
|
|
||||||
string(REPLACE "-L " "-L" ROOT_EXE_LINKER_FLAGS "${ROOT_EXE_LINKER_FLAGS}")
|
|
||||||
separate_arguments(ROOT_EXE_LINKER_FLAGS)
|
|
||||||
|
|
||||||
# Stuck into using old property method due to separate -L and -l arguments
|
|
||||||
# (A full path to -l is better!)
|
|
||||||
set_property(TARGET ROOT::Flags_CXX PROPERTY
|
|
||||||
INTERFACE_LINK_LIBRARIES ${ROOT_EXE_LINKER_FLAGS})
|
|
||||||
set_property(TARGET ROOT::Core PROPERTY
|
|
||||||
INTERFACE_INCLUDE_DIRECTORIES "${ROOT_INCLUDE_DIRS}")
|
|
||||||
|
|
||||||
|
|
||||||
add_executable(ctbGui
|
|
||||||
ctbGui.cpp
|
|
||||||
ctbMain.cpp
|
|
||||||
ctbDacs.cpp
|
|
||||||
ctbPowers.cpp
|
|
||||||
ctbSlowAdcs.cpp
|
|
||||||
ctbSignals.cpp
|
|
||||||
ctbAdcs.cpp
|
|
||||||
ctbPattern.cpp
|
|
||||||
ctbAcquisition.cpp
|
|
||||||
${CMAKE_SOURCE_DIR}/slsDetectorCalibration/tiffio/src/tiffIO.cpp
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
#TODO! Replace with target
|
|
||||||
target_include_directories(ctbGui PRIVATE
|
|
||||||
${CMAKE_SOURCE_DIR}/slsDetectorCalibration/dataStructures
|
|
||||||
${CMAKE_SOURCE_DIR}/slsDetectorCalibration/interpolations
|
|
||||||
${CMAKE_SOURCE_DIR}/slsDetectorCalibration/
|
|
||||||
${CMAKE_SOURCE_DIR}/slsDetectorCalibration/tiffio/include/
|
|
||||||
)
|
|
||||||
|
|
||||||
# Headders needed for ROOT dictionary generation
|
|
||||||
set( HEADERS
|
|
||||||
ctbDefs.h
|
|
||||||
ctbMain.h
|
|
||||||
ctbDacs.h
|
|
||||||
ctbPattern.h
|
|
||||||
ctbSignals.h
|
|
||||||
ctbAdcs.h
|
|
||||||
ctbAcquisition.h
|
|
||||||
ctbPowers.h
|
|
||||||
ctbSlowAdcs.h
|
|
||||||
)
|
|
||||||
|
|
||||||
#set(ROOT_INCLUDE_PATH ${CMAKE_CURRENT_SOURCE_DIR})
|
|
||||||
|
|
||||||
# ROOT dictionary generation
|
|
||||||
root_generate_dictionary(ctbDict ${HEADERS} LINKDEF ctbLinkDef.h)
|
|
||||||
add_library(ctbRootLib SHARED ctbDict.cxx)
|
|
||||||
target_include_directories(ctbRootLib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
|
|
||||||
target_link_libraries(ctbRootLib PUBLIC
|
|
||||||
ROOT::Core
|
|
||||||
slsDetectorShared
|
|
||||||
${ROOT_LIBRARIES}
|
|
||||||
${ROOT_EXE_LINKER_FLAGS}
|
|
||||||
)
|
|
||||||
|
|
||||||
set_target_properties(
|
|
||||||
ctbRootLib PROPERTIES
|
|
||||||
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
|
|
||||||
)
|
|
||||||
|
|
||||||
target_link_libraries(ctbGui PUBLIC
|
|
||||||
slsDetectorShared
|
|
||||||
ctbRootLib
|
|
||||||
${TIFF_LIBRARIES}
|
|
||||||
)
|
|
||||||
|
|
||||||
set_target_properties(ctbGui PROPERTIES
|
|
||||||
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
|
|
||||||
|
|
||||||
)
|
|
||||||
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
# SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
|
|
||||||
|
|
||||||
INCS=ctbMain.h ctbDacs.h ctbPattern.h ctbSignals.h ctbAdcs.h ctbAcquisition.h ctbPowers.h ctbSlowAdcs.h
|
|
||||||
SRC= $(INCS:.h=.cpp) ctbDict.cpp
|
|
||||||
LINKDEF=ctbLinkDef.h
|
|
||||||
ZMQLIB=../slsReceiverSoftware/include
|
|
||||||
LIBRARYCBF=$(CBFLIBDIR)/lib/*.o
|
|
||||||
|
|
||||||
INCDIR=-I../slsReceiverSoftware/include/ -I../slsDetectorSoftware/include/ -I../slsSupportLib/include/ -I../slsDetectorCalibration -I../slsDetectorCalibration/dataStructures -I$(CBFLIBDIR)/include -I../slsDetectorCalibration/interpolations
|
|
||||||
LDFLAG=-L../build/bin -lSlsDetector -lSlsSupport -L/usr/lib64/ -lpthread -lm -lstdc++ -lzmq -pthread -lrt -ltiff -L$(ZMQLIB) -L$(CBFLIBDIR)/lib/ -std=c++11
|
|
||||||
#
|
|
||||||
MAIN=ctbGui.cpp
|
|
||||||
|
|
||||||
DESTDIR?=../build/bin
|
|
||||||
|
|
||||||
|
|
||||||
OBJS = $(SRC:.cpp=.o) $(MAIN:.cpp=.o)
|
|
||||||
|
|
||||||
all: $(DESTDIR)/ctbGui
|
|
||||||
|
|
||||||
|
|
||||||
doc:
|
|
||||||
cd manual && make DESTDIR=$(DESTDIR)
|
|
||||||
|
|
||||||
htmldoc:
|
|
||||||
cd manual && make html DESTDIR=$(DESTDIR)
|
|
||||||
|
|
||||||
ctbDict.cpp: $(INCS) $(LINKDEF)
|
|
||||||
rootcint -f ctbDict.cpp -c $(INCS) $(LINKDEF)
|
|
||||||
|
|
||||||
%.o : %.cpp
|
|
||||||
echo $@
|
|
||||||
g++ -DMYROOT `root-config --cflags --glibs` -lMinuit -DCTB $(LDFLAG) -o $@ -c $< $(INCDIR)
|
|
||||||
#$(CXX) -o $@ -c $< $(INCLUDES) $(DFLAGS) -fPIC $(EPICSFLAGS) -lpthread #$(FLAGS)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
$(DESTDIR)/ctbGui: $(OBJS) $(LINKDEF)
|
|
||||||
g++ -DMYROOT `root-config --cflags --glibs` -lMinuit -DCTB $(LDFLAG) -o ctbGui $(INCDIR) $(OBJS) ../slsDetectorCalibration/tiffIO.cpp
|
|
||||||
mv ctbGui $(DESTDIR)
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f $(DESTDIR)/ctbGui *.o ctbDict.* $(OBJS)
|
|
||||||
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
# SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
|
|
||||||
|
|
||||||
INCS=ctbMain.h ctbDacs.h ctbPattern.h ctbSignals.h ctbAdcs.h ctbAcquisition.h ctbPowers.h ctbSlowAdcs.h
|
|
||||||
SRC= $(INCS:.h=.cpp) ctbDict.cpp
|
|
||||||
LINKDEF=ctbLinkDef.h
|
|
||||||
#ctbActions.h
|
|
||||||
ZMQLIB=../slsReceiverSoftware/include
|
|
||||||
LIBRARYCBF=$(CBFLIBDIR)/lib/*.o
|
|
||||||
|
|
||||||
INCDIR=-I../slsReceiverSoftware/include/ -I../slsDetectorSoftware/include/ -I../slsSupportLib/include/ -I../slsDetectorCalibration -I../slsDetectorCalibration/dataStructures -I$(CBFLIBDIR)/include -I../slsDetectorCalibration/interpolations
|
|
||||||
|
|
||||||
LDFLAG=-L../build/bin -lSlsDetector -lSlsSupport -L/usr/lib64/ -lpthread -lm -lstdc++ -lzmq -pthread -lrt -ltiff -L$(ZMQLIB) -L$(CBFLIBDIR)/lib/ -std=c++11
|
|
||||||
#
|
|
||||||
MAIN=ctbGui.cpp
|
|
||||||
|
|
||||||
DESTDIR?=../build/bin
|
|
||||||
|
|
||||||
|
|
||||||
OBJS = $(SRC:.cpp=.o) $(MAIN:.cpp=.o)
|
|
||||||
|
|
||||||
all: $(DESTDIR)/ctbGui
|
|
||||||
|
|
||||||
|
|
||||||
doc:
|
|
||||||
cd manual && make DESTDIR=$(DESTDIR)
|
|
||||||
|
|
||||||
htmldoc:
|
|
||||||
cd manual && make html DESTDIR=$(DESTDIR)
|
|
||||||
|
|
||||||
ctbDict.cpp: $(INCS) $(LINKDEF)
|
|
||||||
rootcling -f ctbDict.cpp -c $(INCS) $(LINKDEF)
|
|
||||||
|
|
||||||
%.o : %.cpp
|
|
||||||
echo $@
|
|
||||||
g++ -DMYROOT `source root-config --cflags --glibs` -lMinuit -DCTB $(LDFLAG) -o $@ -c $< $(INCDIR)
|
|
||||||
#$(CXX) -o $@ -c $< $(INCLUDES) $(DFLAGS) -fPIC $(EPICSFLAGS) -lpthread #$(FLAGS)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
$(DESTDIR)/ctbGui: $(OBJS) $(LINKDEF)
|
|
||||||
g++ -DMYROOT `source root-config --cflags --glibs` -lMinuit -DCTB $(LDFLAG) -o ctbGui $(INCDIR) $(OBJS) ../slsDetectorCalibration/tiffIO.cpp
|
|
||||||
mv ctbGui $(DESTDIR)
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f $(DESTDIR)/ctbGui *.o ctbDict.* $(OBJS)
|
|
||||||
|
|
||||||
@@ -1,248 +0,0 @@
|
|||||||
// SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
#ifndef CTBACQUISITION_H
|
|
||||||
#define CTBACQUISITION_H
|
|
||||||
#include <TGFrame.h>
|
|
||||||
|
|
||||||
#include "ctbAdcs.h"
|
|
||||||
#include "ctbSignals.h"
|
|
||||||
#include "ctbPattern.h"
|
|
||||||
class TGTextEntry;
|
|
||||||
class TGLabel;
|
|
||||||
class TGNumberEntry;
|
|
||||||
class TGCheckButton;
|
|
||||||
class TThread;
|
|
||||||
class TGraph;
|
|
||||||
class TMultiGraph;
|
|
||||||
class THStack;
|
|
||||||
class TGButtonGroup;
|
|
||||||
class TGRadioButton;
|
|
||||||
class TGComboBox;
|
|
||||||
class TTimer;
|
|
||||||
class TCanvas;
|
|
||||||
class TH2F;
|
|
||||||
class TH1F;
|
|
||||||
class TGLabel;
|
|
||||||
class TGTextButton;
|
|
||||||
|
|
||||||
namespace sls
|
|
||||||
{
|
|
||||||
class Detector;
|
|
||||||
class detectorData;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class dataType> class slsDetectorData;
|
|
||||||
|
|
||||||
class singlePhotonDetector;
|
|
||||||
//class singlePhotonDetector;
|
|
||||||
class commonModeSubtraction;
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <stdint.h>
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
class ctbAcquisition : public TGGroupFrame {
|
|
||||||
|
|
||||||
|
|
||||||
enum {DESERIALIZER, MOENCH04, MOENCH02, MOENCH03, IMAGE32B, IMAGE16B, ADCSAR2, MYTHEN301, MYTHEN302};
|
|
||||||
|
|
||||||
|
|
||||||
private:
|
|
||||||
TGTextEntry *eOutdir;
|
|
||||||
TGTextEntry *eFname;
|
|
||||||
TGNumberEntry *eFindex;
|
|
||||||
TGCheckButton *cFileSave;
|
|
||||||
|
|
||||||
|
|
||||||
TGNumberEntry *eSerOff;
|
|
||||||
TGNumberEntry *eDynRange;
|
|
||||||
TGNumberEntry *eNumCount;
|
|
||||||
|
|
||||||
|
|
||||||
TGNumberEntry *ePixX;
|
|
||||||
TGNumberEntry *ePixY;
|
|
||||||
|
|
||||||
TGNumberEntry *eFitADC;
|
|
||||||
TGNumberEntry *eBitPlot;
|
|
||||||
TGNumberEntry *eMinRaw;
|
|
||||||
TGNumberEntry *eMaxRaw;
|
|
||||||
TGNumberEntry *eMinPedSub;
|
|
||||||
TGNumberEntry *eMaxPedSub;
|
|
||||||
TGCheckButton *cMinMaxRaw;
|
|
||||||
TGCheckButton *cMinMaxPedSub;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
TGNumberEntry *eMeasurements;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
TGTextButton *bStatus;
|
|
||||||
// TGTextButton
|
|
||||||
TGCheckButton *cCompile;
|
|
||||||
TGTextButton *cLoad;
|
|
||||||
// TGCheckButton *cRun;
|
|
||||||
|
|
||||||
TThread *acqThread;
|
|
||||||
|
|
||||||
|
|
||||||
THStack *adcStack;
|
|
||||||
THStack *bitStack;
|
|
||||||
THStack *countsStack;
|
|
||||||
|
|
||||||
|
|
||||||
TH1F *adcHisto[NADCS];
|
|
||||||
TH1F *countsHisto[NADCS];
|
|
||||||
|
|
||||||
TH1F *bitHisto[NSIGNALS];
|
|
||||||
float bitOffset[NSIGNALS];
|
|
||||||
|
|
||||||
// int enableFlag[NADCS+4];
|
|
||||||
int roMode;
|
|
||||||
|
|
||||||
int dBitOffset;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
TH1F *adcFit;
|
|
||||||
TH1F *bitPlot;
|
|
||||||
TH1F *countsFit;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
TH2F *h2DMapAn; // for 2D detectors
|
|
||||||
TH2F *h2DMapDig; // for 2D detectors
|
|
||||||
TH1F *h1DMap; //for 1D detectors
|
|
||||||
|
|
||||||
// TH2F *h2Scan; // for 2D detectors
|
|
||||||
// TMultiGraph *mgAdcs;
|
|
||||||
// TH1I *plotAdc[NADCS];
|
|
||||||
|
|
||||||
|
|
||||||
sls::Detector* myDet;
|
|
||||||
|
|
||||||
int plotFlag[NADCS];
|
|
||||||
int bitPlotFlag[NSIGNALS];
|
|
||||||
|
|
||||||
int ip;
|
|
||||||
// int nChannels;
|
|
||||||
// int chanEnable;
|
|
||||||
//int nADCs;
|
|
||||||
|
|
||||||
std::vector <int> dbitlist;
|
|
||||||
std::vector <int> adclist;
|
|
||||||
|
|
||||||
TGButtonGroup *bgPlot;// = new TGVButtonGroup(main_frame);
|
|
||||||
TGRadioButton *rbPlotOff;
|
|
||||||
TGRadioButton *rbWaveform;
|
|
||||||
TGRadioButton *rbDistribution;
|
|
||||||
TGRadioButton *rb2D;
|
|
||||||
// TGRadioButton *rbScan;
|
|
||||||
TGComboBox *cbDetType;
|
|
||||||
TGCheckButton *cbGetPedestal;
|
|
||||||
TGCheckButton *cbSubtractPedestal;
|
|
||||||
TGCheckButton *cbCommonMode;
|
|
||||||
TGTextButton *bResetPedestal;
|
|
||||||
|
|
||||||
TGLabel *lClickX;
|
|
||||||
TGLabel *lClickY;
|
|
||||||
TGLabel *lClickValue;
|
|
||||||
|
|
||||||
|
|
||||||
TCanvas *myCanvas;
|
|
||||||
TTimer *plotTimer;
|
|
||||||
|
|
||||||
char patternFile[10000];
|
|
||||||
char patternCompiler[10000];
|
|
||||||
|
|
||||||
int globalPlot;
|
|
||||||
int adcPlot;
|
|
||||||
int dbitPlot;
|
|
||||||
int tenG;
|
|
||||||
|
|
||||||
int nAnalogSamples, nDigitalSamples;
|
|
||||||
// int iScanStep;
|
|
||||||
|
|
||||||
slsDetectorData<uint16_t> *dataStructure;
|
|
||||||
singlePhotonDetector *photonFinder;
|
|
||||||
//singlePhotonDetector *photonFinder;
|
|
||||||
commonModeSubtraction *commonMode;
|
|
||||||
int cmSub;
|
|
||||||
|
|
||||||
int stop;
|
|
||||||
|
|
||||||
uint64_t dBitMask;
|
|
||||||
|
|
||||||
int deserializer;
|
|
||||||
|
|
||||||
public:
|
|
||||||
ctbAcquisition(TGVerticalFrame*, sls::Detector*);
|
|
||||||
void setOutdir();
|
|
||||||
void setFname();
|
|
||||||
void setMeasurements();
|
|
||||||
void setFsave(Bool_t);
|
|
||||||
void changePlot(Int_t);
|
|
||||||
void changeDetector(Int_t);
|
|
||||||
void changePlot();
|
|
||||||
void changeDetector();
|
|
||||||
void setFindex();
|
|
||||||
void Draw();
|
|
||||||
void setCanvas(TCanvas*);
|
|
||||||
|
|
||||||
void toggleAcquisition();
|
|
||||||
void loadPattern();
|
|
||||||
static void* ThreadHandle(void *arg);
|
|
||||||
void update();
|
|
||||||
void acquisitionFinished();
|
|
||||||
// string getParameters();
|
|
||||||
|
|
||||||
void setGraph (int i ,int en, Pixel_t col);
|
|
||||||
void setBitGraph (int i ,int en, Pixel_t col);
|
|
||||||
void startAcquisition();
|
|
||||||
static void progressCallback(double,void*);
|
|
||||||
static void dataCallback(sls::detectorData*, long unsigned int, unsigned int, void*);
|
|
||||||
int StopFlag;
|
|
||||||
|
|
||||||
int plotData(sls::detectorData*, int);
|
|
||||||
|
|
||||||
void setPatternFile(const char* t);
|
|
||||||
|
|
||||||
void setPatternCompiler(const char* t);
|
|
||||||
|
|
||||||
void setAnalogSamples(int);
|
|
||||||
void setDigitalSamples(int);
|
|
||||||
|
|
||||||
void setADCEnable(Int_t);
|
|
||||||
void setDbitEnable(Int_t);
|
|
||||||
void setReadoutMode(int);
|
|
||||||
void updateChans();
|
|
||||||
|
|
||||||
void resetPedestal();
|
|
||||||
|
|
||||||
void ToggleCommonMode(Bool_t);
|
|
||||||
void TogglePedSub(Bool_t);
|
|
||||||
void ChangeHistoLimitsPedSub(Long_t );
|
|
||||||
void ChangeHistoLimitsRaw(Long_t);
|
|
||||||
void ChangeHistoLimitsPedSub( );
|
|
||||||
void ChangeHistoLimitsRaw();
|
|
||||||
void ChangeHistoLimitsPedSub(Bool_t );
|
|
||||||
void ChangeHistoLimitsRaw(Bool_t);
|
|
||||||
|
|
||||||
|
|
||||||
void ChangeSerialOffset();
|
|
||||||
void ChangeSerialOffset(Long_t);
|
|
||||||
void ChangeNumberOfChannels();
|
|
||||||
void ChangeNumberOfChannels(Long_t);
|
|
||||||
void ChangeDynamicRange();
|
|
||||||
void ChangeDynamicRange(Long_t);
|
|
||||||
void ChangeImagePixels();
|
|
||||||
void ChangeImagePixels(Long_t);
|
|
||||||
|
|
||||||
void canvasClicked();
|
|
||||||
void FitADC();
|
|
||||||
void plotBit();
|
|
||||||
ClassDef(ctbAcquisition,0)
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,616 +0,0 @@
|
|||||||
// SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
#include <TApplication.h>
|
|
||||||
#include <TGClient.h>
|
|
||||||
#include <TCanvas.h>
|
|
||||||
#include <TF1.h>
|
|
||||||
#include <TRandom.h>
|
|
||||||
#include <TGButton.h>
|
|
||||||
#include <TRootEmbeddedCanvas.h>
|
|
||||||
#include <TGButtonGroup.h>
|
|
||||||
#include <TGNumberEntry.h>
|
|
||||||
#include <TGLabel.h>
|
|
||||||
#include <TList.h>
|
|
||||||
#include <TGFileDialog.h>
|
|
||||||
#include <TGComboBox.h>
|
|
||||||
#include <TH2F.h>
|
|
||||||
#include <TColor.h>
|
|
||||||
#include <TH1F.h>
|
|
||||||
#include <TGraphErrors.h>
|
|
||||||
#include <TGColorSelect.h>
|
|
||||||
#include <THStack.h>
|
|
||||||
#include <TGTab.h>
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <iostream>
|
|
||||||
#include <fstream>
|
|
||||||
|
|
||||||
#include "ctbAdcs.h"
|
|
||||||
#include "ctbDefs.h"
|
|
||||||
#include "sls/Detector.h"
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ctbAdc::ctbAdc(TGVerticalFrame *page, int i, sls::Detector *det)
|
|
||||||
: TGHorizontalFrame(page, 800,800), id(i), myDet(det) {
|
|
||||||
|
|
||||||
TGHorizontalFrame *hframe=this;
|
|
||||||
char tit[100];
|
|
||||||
|
|
||||||
page->AddFrame(hframe,new TGLayoutHints(kLHintsTop | kLHintsExpandX , 1,1,1,1));
|
|
||||||
hframe->MapWindow();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
sprintf(tit, "ADC%d", id);
|
|
||||||
|
|
||||||
sAdcLabel= new TGLabel(hframe, tit);
|
|
||||||
hframe->AddFrame(sAdcLabel,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 1, 1, 1, 1));
|
|
||||||
sAdcLabel->MapWindow();
|
|
||||||
sAdcLabel->SetTextJustify(kTextLeft);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
sAdcInvert= new TGCheckButton(hframe, "Inv");
|
|
||||||
hframe->AddFrame( sAdcInvert,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 1, 1, 1, 1));
|
|
||||||
sAdcInvert->MapWindow();
|
|
||||||
sAdcInvert->Connect("Toggled(Bool_t)","ctbAdc",this,"ToggledInvert(Bool_t)");
|
|
||||||
|
|
||||||
|
|
||||||
sAdcEnable= new TGCheckButton(hframe, "En");
|
|
||||||
hframe->AddFrame( sAdcEnable,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 1, 1, 1, 1));
|
|
||||||
sAdcEnable->MapWindow();
|
|
||||||
// sAdcEnable->SetOn(kTRUE);
|
|
||||||
// sAdcEnable->SetEnabled(kFALSE);
|
|
||||||
sAdcEnable->Connect("Toggled(Bool_t)","ctbAdc",this,"ToggledEnable(Bool_t)");
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
sAdcPlot= new TGCheckButton(hframe, "Plot");
|
|
||||||
hframe->AddFrame( sAdcPlot,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 1, 1, 1, 1));
|
|
||||||
sAdcPlot->MapWindow();
|
|
||||||
|
|
||||||
|
|
||||||
sAdcPlot->Connect("Toggled(Bool_t)","ctbAdc",this,"ToggledPlot(Bool_t)");
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
fColorSel = new TGColorSelect(hframe, id+1, 0);
|
|
||||||
|
|
||||||
fColorSel->Connect("ColorSelected(Pixel_t)","ctbAdc",this,"ColorChanged(Pixel_t)");
|
|
||||||
hframe->AddFrame(fColorSel, new TGLayoutHints(kLHintsTop |
|
|
||||||
kLHintsLeft, 2, 0, 2, 2));
|
|
||||||
|
|
||||||
|
|
||||||
fColorSel->SetColor(TColor::Number2Pixel(id+1));
|
|
||||||
// sprintf(tit,"adc%d",id);
|
|
||||||
// gADC=new TGraph();
|
|
||||||
// gADC->SetName(tit);
|
|
||||||
// gADC->SetLineColor(id+1);
|
|
||||||
// gADC->SetMarkerColor(id+1);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
};
|
|
||||||
Pixel_t ctbAdc::getColor(){
|
|
||||||
return fColorSel->GetColor();
|
|
||||||
}
|
|
||||||
Bool_t ctbAdc::getEnabled(){
|
|
||||||
return getPlot();
|
|
||||||
}
|
|
||||||
Bool_t ctbAdc::getPlot(){
|
|
||||||
return sAdcPlot->IsOn();
|
|
||||||
}
|
|
||||||
Bool_t ctbAdc::getInverted(){
|
|
||||||
return sAdcInvert->IsOn();
|
|
||||||
}
|
|
||||||
|
|
||||||
Bool_t ctbAdc::getEnable(){
|
|
||||||
return sAdcEnable->IsOn();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void ctbAdc::setInverted(Bool_t b){
|
|
||||||
// cout << id << "set enabled " << b << endl;
|
|
||||||
if (b)
|
|
||||||
sAdcInvert->SetOn(kTRUE,kTRUE);
|
|
||||||
else
|
|
||||||
sAdcInvert->SetOn(kFALSE,kTRUE);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void ctbAdc::setEnable(Bool_t b){
|
|
||||||
// cout << id << "set enabled " << b << endl;
|
|
||||||
if (b)
|
|
||||||
sAdcEnable->SetOn(kTRUE,kFALSE);
|
|
||||||
else
|
|
||||||
sAdcEnable->SetOn(kFALSE,kFALSE);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void ctbAdc::setAdcAlias(char *tit, int plot, int color) {
|
|
||||||
if (tit)
|
|
||||||
sAdcLabel->SetText(tit);
|
|
||||||
if (plot>0)
|
|
||||||
sAdcPlot->SetOn(kTRUE,kTRUE);
|
|
||||||
else if (plot==0)
|
|
||||||
sAdcPlot->SetOn(kFALSE,kTRUE);
|
|
||||||
if (color>=0)
|
|
||||||
fColorSel->SetColor(color);
|
|
||||||
fColorSel->SetEnabled(sAdcPlot->IsOn());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
string ctbAdc::getAdcAlias() {
|
|
||||||
|
|
||||||
char line[1000];
|
|
||||||
sprintf(line,"ADC%d %s %d %lx\n",id,sAdcLabel->GetText()->Data(),sAdcPlot->IsOn(),fColorSel->GetColor());
|
|
||||||
return string(line);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ctbAdc::update() {
|
|
||||||
|
|
||||||
|
|
||||||
//Emit("ToggledAdcEnable(Int_t)", id);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void ctbAdc::ToggledPlot(Bool_t b){
|
|
||||||
|
|
||||||
// Long_t mask=b<<id;
|
|
||||||
// ToggledAdcPlot(mask);
|
|
||||||
cout << "Colsel " << id << " enable " << b << endl;
|
|
||||||
if (b)
|
|
||||||
fColorSel->SetEnabled(kTRUE);
|
|
||||||
else
|
|
||||||
fColorSel->SetEnabled(kFALSE);
|
|
||||||
|
|
||||||
// fColorSel->SetEnabled(sAdcPlot->IsOn());
|
|
||||||
Emit("ToggledAdcPlot(Int_t)", id);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void ctbAdc::ToggledInvert(Bool_t b){
|
|
||||||
|
|
||||||
|
|
||||||
// fColorSel->SetEnabled(sAdcPlot->IsOn());
|
|
||||||
Emit("ToggledAdcInvert(Int_t)", id);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void ctbAdc::ToggledEnable(Bool_t b){
|
|
||||||
|
|
||||||
|
|
||||||
fColorSel->SetEnabled(sAdcPlot->IsOn());
|
|
||||||
Emit("ToggledAdcEnable(Int_t)", id);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void ctbAdc::ColorChanged(Pixel_t) {
|
|
||||||
|
|
||||||
Emit("ToggledAdcPlot(Int_t)", id);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void ctbAdc::ToggledAdcPlot(Int_t b){
|
|
||||||
|
|
||||||
|
|
||||||
Emit("ToggledAdcPlot(Int_t)", id);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void ctbAdc::ToggledAdcInvert(Int_t b){
|
|
||||||
|
|
||||||
|
|
||||||
Emit("ToggledAdcInvert(Int_t)", id);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void ctbAdc::ToggledAdcEnable(Int_t b){
|
|
||||||
|
|
||||||
|
|
||||||
Emit("ToggledAdcEnable(Int_t)", id);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void ctbAdc::setEnabled(Bool_t b){
|
|
||||||
// cout << id << "set enabled " << b << endl;
|
|
||||||
if (b)
|
|
||||||
sAdcPlot->SetOn(kTRUE,kFALSE);
|
|
||||||
else
|
|
||||||
sAdcPlot->SetOn(kFALSE,kFALSE);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void ctbAdc::setPlot(Bool_t b){
|
|
||||||
// cout << id << "set enabled " << b << endl;
|
|
||||||
if (b)
|
|
||||||
sAdcPlot->SetOn(kTRUE,kTRUE);
|
|
||||||
else
|
|
||||||
sAdcPlot->SetOn(kFALSE,kTRUE);
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ctbAdcs::ctbAdcs(TGVerticalFrame *page, sls::Detector *det)
|
|
||||||
: TGGroupFrame(page,"Adcs",kVerticalFrame), myDet(det) {
|
|
||||||
|
|
||||||
|
|
||||||
SetTitlePos(TGGroupFrame::kLeft);
|
|
||||||
page->AddFrame(this,new TGLayoutHints( kLHintsTop | kLHintsExpandX , 10,10,10,10));
|
|
||||||
MapWindow();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
TGHorizontalFrame* hframe=new TGHorizontalFrame(this, 800,800);
|
|
||||||
AddFrame(hframe,new TGLayoutHints(kLHintsTop | kLHintsExpandX , 1,1,1,1));
|
|
||||||
hframe->MapWindow();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int idac=0;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
TGHorizontalFrame* hhframe=new TGHorizontalFrame(this, 800,800);
|
|
||||||
AddFrame(hhframe,new TGLayoutHints(kLHintsTop | kLHintsExpandX , 1,1,1,1));
|
|
||||||
hhframe->MapWindow();
|
|
||||||
|
|
||||||
TGVerticalFrame *vframe;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
for (idac=0; idac<NADCS; idac++) {
|
|
||||||
if (idac%16==0) {
|
|
||||||
|
|
||||||
|
|
||||||
vframe=new TGVerticalFrame(hhframe, 400,800);
|
|
||||||
hhframe->AddFrame(vframe,new TGLayoutHints(kLHintsTop | kLHintsExpandX , 1,1,1,1));
|
|
||||||
vframe->MapWindow();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
sAdc[idac]=new ctbAdc(vframe,idac,myDet);
|
|
||||||
|
|
||||||
|
|
||||||
sAdc[idac]->Connect("ToggledAdcPlot(Int_t)","ctbAdcs",this,"ToggledAdcPlot(Int_t)");
|
|
||||||
sAdc[idac]->Connect("ToggledAdcInvert(Int_t)","ctbAdcs",this,"ToggledAdcInvert(Int_t)");
|
|
||||||
sAdc[idac]->Connect("ToggledAdcEnable(Int_t)","ctbAdcs",this,"ToggledAdcEnable(Int_t)");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
hframe=new TGHorizontalFrame(this, 800,800);
|
|
||||||
AddFrame(hframe,new TGLayoutHints(kLHintsTop | kLHintsExpandX , 1,1,1,1));
|
|
||||||
hframe->MapWindow();
|
|
||||||
|
|
||||||
|
|
||||||
bCheckHalf[0]=new TGTextButton(hframe, "All 0-15");
|
|
||||||
hframe->AddFrame(bCheckHalf[0],new TGLayoutHints(kLHintsTop | kLHintsExpandX, 5, 5, 5, 5));
|
|
||||||
bCheckHalf[0]->MapWindow();
|
|
||||||
bCheckHalf[0]->Connect("Clicked()","ctbAdcs",this,"CheckHalf0()");
|
|
||||||
|
|
||||||
|
|
||||||
bRemoveHalf[0]=new TGTextButton(hframe, "None 0-15");
|
|
||||||
hframe->AddFrame(bRemoveHalf[0],new TGLayoutHints(kLHintsBottom | kLHintsExpandX, 5, 5, 5, 5));
|
|
||||||
bRemoveHalf[0]->MapWindow();
|
|
||||||
bRemoveHalf[0]->Connect("Clicked()","ctbAdcs",this,"RemoveHalf0()");
|
|
||||||
|
|
||||||
|
|
||||||
bCheckHalf[1]=new TGTextButton(hframe, "All 16-23");
|
|
||||||
hframe->AddFrame(bCheckHalf[1],new TGLayoutHints(kLHintsTop | kLHintsExpandX, 5, 5, 5, 5));
|
|
||||||
bCheckHalf[1]->MapWindow();
|
|
||||||
bCheckHalf[1]->Connect("Clicked()","ctbAdcs",this,"CheckHalf1()");
|
|
||||||
// bCheckAll->Connect("Clicked()","ctbAdcs",this,"CheckAll()");
|
|
||||||
|
|
||||||
|
|
||||||
bRemoveHalf[1]=new TGTextButton(hframe, "None 16-23");
|
|
||||||
hframe->AddFrame(bRemoveHalf[1],new TGLayoutHints(kLHintsBottom | kLHintsExpandX, 5, 5, 5, 5));
|
|
||||||
bRemoveHalf[1]->MapWindow();
|
|
||||||
bRemoveHalf[1]->Connect("Clicked()","ctbAdcs",this,"RemoveHalf1()");
|
|
||||||
// bRemoveAll->Connect("Clicked()","ctbAdcs",this,"RemoveAll()");
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
hframe=new TGHorizontalFrame(this, 800,800);
|
|
||||||
AddFrame(hframe,new TGLayoutHints(kLHintsTop | kLHintsExpandX , 1,1,1,1));
|
|
||||||
hframe->MapWindow();
|
|
||||||
|
|
||||||
|
|
||||||
bCheckAll=new TGTextButton(hframe, "All");
|
|
||||||
hframe->AddFrame(bCheckAll,new TGLayoutHints(kLHintsTop | kLHintsExpandX, 5, 5, 5, 5));
|
|
||||||
bCheckAll->MapWindow();
|
|
||||||
bCheckAll->Connect("Clicked()","ctbAdcs",this,"CheckAll()");
|
|
||||||
|
|
||||||
|
|
||||||
bRemoveAll=new TGTextButton(hframe, "None");
|
|
||||||
hframe->AddFrame(bRemoveAll,new TGLayoutHints(kLHintsBottom | kLHintsExpandX, 5, 5, 5, 5));
|
|
||||||
bRemoveAll->MapWindow();
|
|
||||||
bRemoveAll->Connect("Clicked()","ctbAdcs",this,"RemoveAll()");
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
hframe=new TGHorizontalFrame(this, 800,50);
|
|
||||||
AddFrame(hframe,new TGLayoutHints(kLHintsTop | kLHintsExpandX , 1,1,1,1));
|
|
||||||
hframe->MapWindow();
|
|
||||||
|
|
||||||
|
|
||||||
TGLabel *label= new TGLabel(hframe, "Inversion mask: ");
|
|
||||||
hframe->AddFrame(label,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 1, 1, 1, 1));
|
|
||||||
label->MapWindow();
|
|
||||||
label->SetTextJustify(kTextLeft);
|
|
||||||
|
|
||||||
|
|
||||||
eInversionMask = new TGNumberEntry(hframe, 0, 16,999, TGNumberFormat::kNESHex,
|
|
||||||
TGNumberFormat::kNEANonNegative,
|
|
||||||
TGNumberFormat::kNELNoLimits);
|
|
||||||
|
|
||||||
hframe->AddFrame(eInversionMask,new TGLayoutHints(kLHintsTop | kLHintsExpandX, 1, 1, 1, 1));
|
|
||||||
eInversionMask->MapWindow();
|
|
||||||
eInversionMask->Resize(150,30);
|
|
||||||
eInversionMask->SetState(kFALSE);
|
|
||||||
|
|
||||||
|
|
||||||
hframe=new TGHorizontalFrame(this, 800,50);
|
|
||||||
AddFrame(hframe,new TGLayoutHints(kLHintsTop | kLHintsExpandX , 1,1,1,1));
|
|
||||||
hframe->MapWindow();
|
|
||||||
|
|
||||||
|
|
||||||
label= new TGLabel(hframe, "Enable mask: ");
|
|
||||||
hframe->AddFrame(label,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 1, 1, 1, 1));
|
|
||||||
label->MapWindow();
|
|
||||||
label->SetTextJustify(kTextLeft);
|
|
||||||
|
|
||||||
|
|
||||||
eEnableMask = new TGNumberEntry(hframe, 0, 16,999, TGNumberFormat::kNESHex,
|
|
||||||
TGNumberFormat::kNEANonNegative,
|
|
||||||
TGNumberFormat::kNELNoLimits);
|
|
||||||
|
|
||||||
hframe->AddFrame(eEnableMask,new TGLayoutHints(kLHintsTop | kLHintsExpandX, 1, 1, 1, 1));
|
|
||||||
eEnableMask->MapWindow();
|
|
||||||
eEnableMask->Resize(150,30);
|
|
||||||
eEnableMask->SetState(kFALSE);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int ctbAdcs::setEnable(int reg) {
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (reg > -1) {
|
|
||||||
myDet->setADCEnableMask(reg);
|
|
||||||
}
|
|
||||||
auto retval = myDet->getADCEnableMask().tsquash("Different values");
|
|
||||||
eEnableMask->SetHexNumber(retval);
|
|
||||||
return retval;
|
|
||||||
} CATCH_DISPLAY ("Could not set/get adc enablemask.", "ctbAdcs::setEnable")
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ctbAdcs::setInvert(int reg) {
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (reg > -1) {
|
|
||||||
myDet->setADCInvert(reg);
|
|
||||||
}
|
|
||||||
auto retval = myDet->getADCInvert().tsquash("Different values");
|
|
||||||
eInversionMask->SetHexNumber(retval);
|
|
||||||
return retval;
|
|
||||||
} CATCH_DISPLAY ("Could not set/get adc enablemask.", "ctbAdcs::setEnable")
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void ctbAdcs::update() {
|
|
||||||
Int_t invreg;
|
|
||||||
Int_t disreg;
|
|
||||||
|
|
||||||
disreg=setEnable();
|
|
||||||
invreg=setInvert();
|
|
||||||
|
|
||||||
for (int is=0; is<NADCS; is++) {
|
|
||||||
sAdc[is]->setAdcAlias(NULL,-1,-1);
|
|
||||||
if (invreg & (1<<is) )
|
|
||||||
sAdc[is]->setInverted(kTRUE);
|
|
||||||
else
|
|
||||||
sAdc[is]->setInverted(kFALSE);
|
|
||||||
|
|
||||||
if (disreg & (1<<is) )
|
|
||||||
sAdc[is]->setEnable(kTRUE);
|
|
||||||
else
|
|
||||||
sAdc[is]->setEnable(kFALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
Emit("AdcEnable(Int_t)", disreg);
|
|
||||||
|
|
||||||
}
|
|
||||||
string ctbAdcs::getAdcParameters() {
|
|
||||||
ostringstream line;
|
|
||||||
line << "reg "<< hex << setInvert() << "# ADC invert reg" << dec << endl;
|
|
||||||
line << "reg "<< hex << setEnable() << " # ADC enable reg"<< dec << endl;
|
|
||||||
return line.str();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void ctbAdcs::CheckAll() {
|
|
||||||
for (int is=0; is<NADCS; is++){
|
|
||||||
sAdc[is]->setPlot(kTRUE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void ctbAdcs::RemoveAll() {
|
|
||||||
for (int is=0; is<NADCS; is++) {
|
|
||||||
sAdc[is]->setPlot(kFALSE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void ctbAdcs::CheckHalf0() {
|
|
||||||
for (int is=0; is<NADCS/2; is++) {
|
|
||||||
sAdc[is]->setPlot(kTRUE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void ctbAdcs::RemoveHalf0() {
|
|
||||||
for (int is=0; is<NADCS/2; is++){
|
|
||||||
sAdc[is]->setPlot(kFALSE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ctbAdcs::CheckHalf1() {
|
|
||||||
for (int is=NADCS/2; is<NADCS; is++){
|
|
||||||
sAdc[is]->setPlot(kTRUE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void ctbAdcs::RemoveHalf1() {
|
|
||||||
for (int is=NADCS/2; is<NADCS; is++){
|
|
||||||
sAdc[is]->setPlot(kFALSE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int ctbAdcs::setAdcAlias(string line) {
|
|
||||||
|
|
||||||
int is=-1, plot=0, color=-1;
|
|
||||||
char tit[100];
|
|
||||||
int narg=sscanf(line.c_str(),"ADC%d %s %d %x",&is,tit,&plot, &color);
|
|
||||||
if (narg<2)
|
|
||||||
return -1;
|
|
||||||
if (narg!=3)
|
|
||||||
color=-1;
|
|
||||||
if (is>=0 && is<NADCS) {
|
|
||||||
sAdc[is]->setAdcAlias(tit,plot,color);
|
|
||||||
}
|
|
||||||
return is;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
string ctbAdcs::getAdcAlias() {
|
|
||||||
|
|
||||||
ostringstream line;
|
|
||||||
|
|
||||||
for (int is=0; is<NADCS; is++)
|
|
||||||
line << sAdc[is]->getAdcAlias();
|
|
||||||
|
|
||||||
return line.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void ctbAdcs::ToggledAdcPlot(Int_t b){
|
|
||||||
|
|
||||||
|
|
||||||
Emit("ToggledAdcPlot(Int_t)", b);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void ctbAdcs::AdcEnable(Int_t b){
|
|
||||||
Emit("AdcEnable(Int_t)", b);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void ctbAdcs::ToggledAdcEnable(Int_t b){
|
|
||||||
|
|
||||||
Int_t oreg=setEnable();
|
|
||||||
Int_t m=1<<b;
|
|
||||||
|
|
||||||
if (sAdc[b]->getEnable())
|
|
||||||
oreg|=m;
|
|
||||||
else
|
|
||||||
oreg&=~m;
|
|
||||||
|
|
||||||
setEnable(oreg);
|
|
||||||
|
|
||||||
Emit("AdcEnable(Int_t)", oreg);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void ctbAdcs::ToggledAdcInvert(Int_t b){
|
|
||||||
|
|
||||||
Int_t oreg=setInvert();
|
|
||||||
Int_t m=1<<b;
|
|
||||||
|
|
||||||
|
|
||||||
if (sAdc[b]->getInverted())
|
|
||||||
oreg|=m;
|
|
||||||
else
|
|
||||||
oreg&=~m;
|
|
||||||
|
|
||||||
setInvert(oreg);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Pixel_t ctbAdcs::getColor(int i){
|
|
||||||
if (i>=0 && i<NADCS)
|
|
||||||
return sAdc[i]->getColor();
|
|
||||||
return static_cast<Pixel_t>(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
Bool_t ctbAdcs::getEnabled(int i){
|
|
||||||
if (i>=0 && i<NADCS)
|
|
||||||
return sAdc[i]->getEnabled();
|
|
||||||
return static_cast<Bool_t>(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
Bool_t ctbAdcs::getEnable(int i){
|
|
||||||
if (i>=0 && i<NADCS)
|
|
||||||
return sAdc[i]->getEnable();
|
|
||||||
return static_cast<Bool_t>(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
Bool_t ctbAdcs::getPlot(int i){
|
|
||||||
if (i>=0 && i<NADCS)
|
|
||||||
return sAdc[i]->getPlot();
|
|
||||||
return static_cast<Bool_t>(-1);
|
|
||||||
}
|
|
||||||
157
ctbGui/ctbAdcs.h
@@ -1,157 +0,0 @@
|
|||||||
// SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef CTBADCS_H
|
|
||||||
#define CTBADCS_H
|
|
||||||
#include <TGFrame.h>
|
|
||||||
|
|
||||||
|
|
||||||
#define NADCS 32
|
|
||||||
|
|
||||||
class TRootEmbeddedCanvas;
|
|
||||||
class TGButtonGroup;
|
|
||||||
class TGVerticalFrame;
|
|
||||||
class TGHorizontalFrame;
|
|
||||||
class TGTextEntry;
|
|
||||||
class TGLabel;
|
|
||||||
class TGNumberEntry;
|
|
||||||
class TH2F;
|
|
||||||
class TGComboBox;
|
|
||||||
class TGCheckButton;
|
|
||||||
class TGColorSelect;
|
|
||||||
class TColor;
|
|
||||||
|
|
||||||
class THStack;
|
|
||||||
class TGraphErrors;
|
|
||||||
class TGTextButton;
|
|
||||||
class TGTab;
|
|
||||||
|
|
||||||
class TGraph;
|
|
||||||
|
|
||||||
namespace sls
|
|
||||||
{
|
|
||||||
class Detector;
|
|
||||||
};
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
class ctbAdc : public TGHorizontalFrame {
|
|
||||||
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
|
|
||||||
TGLabel *sAdcLabel;
|
|
||||||
TGCheckButton *sAdcEnable;
|
|
||||||
TGCheckButton *sAdcPlot;
|
|
||||||
TGCheckButton *sAdcInvert;
|
|
||||||
|
|
||||||
TGColorSelect *fColorSel;
|
|
||||||
|
|
||||||
// TGraph *gADC;
|
|
||||||
|
|
||||||
int id;
|
|
||||||
sls::Detector *myDet;
|
|
||||||
|
|
||||||
public:
|
|
||||||
ctbAdc(TGVerticalFrame *page, int i, sls::Detector *det);
|
|
||||||
|
|
||||||
|
|
||||||
void setAdcAlias(char *tit, int plot, int color);
|
|
||||||
string getAdcAlias();
|
|
||||||
void ToggledAdcPlot(Int_t b);
|
|
||||||
void ToggledAdcEnable(Int_t b);
|
|
||||||
void ToggledAdcInvert(Int_t b);
|
|
||||||
|
|
||||||
|
|
||||||
void ToggledPlot(Bool_t b);
|
|
||||||
void ToggledEnable(Bool_t b);
|
|
||||||
void ToggledInvert(Bool_t b);
|
|
||||||
void ColorChanged(Pixel_t);
|
|
||||||
void setEnabled(Bool_t b);
|
|
||||||
Bool_t getEnabled();
|
|
||||||
// TGraph *getGraph();
|
|
||||||
void update();
|
|
||||||
|
|
||||||
Pixel_t getColor();
|
|
||||||
|
|
||||||
Bool_t getEnable();
|
|
||||||
void setEnable(Bool_t);
|
|
||||||
void setPlot(Bool_t);
|
|
||||||
Bool_t getInverted();
|
|
||||||
Bool_t getPlot();
|
|
||||||
void setInverted(Bool_t);
|
|
||||||
|
|
||||||
ClassDef(ctbAdc,0)
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class ctbAdcs : public TGGroupFrame {
|
|
||||||
private:
|
|
||||||
|
|
||||||
ctbAdc *sAdc[NADCS];
|
|
||||||
sls::Detector *myDet;
|
|
||||||
|
|
||||||
|
|
||||||
TGTextButton *bCheckAll;
|
|
||||||
TGTextButton *bRemoveAll;
|
|
||||||
TGTextButton *bCheckHalf[2];
|
|
||||||
TGTextButton *bRemoveHalf[2];
|
|
||||||
TGNumberEntry *eInversionMask;
|
|
||||||
TGNumberEntry *eEnableMask;
|
|
||||||
|
|
||||||
|
|
||||||
/* TGTextButton *bPlotSelected; */
|
|
||||||
/* TGNumberEntry *eMinX; */
|
|
||||||
/* TGNumberEntry *eMaxX; */
|
|
||||||
/* TGNumberEntry *eMinY; */
|
|
||||||
/* TGNumberEntry *eMaxY; */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* TGTextButton *bGetPixel; */
|
|
||||||
/* TGNumberEntry *ePixelX; */
|
|
||||||
/* TGNumberEntry *ePixelY; */
|
|
||||||
/* TGLabel *lPixelValue; */
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
ctbAdcs(TGVerticalFrame *page, sls::Detector *det);
|
|
||||||
int setAdcAlias(string line);
|
|
||||||
string getAdcAlias();
|
|
||||||
string getAdcParameters();
|
|
||||||
void ToggledAdcPlot(Int_t);
|
|
||||||
void ToggledAdcInvert(Int_t);
|
|
||||||
void ToggledAdcEnable(Int_t);
|
|
||||||
void AdcEnable(Int_t b);
|
|
||||||
// TGraph *getGraph(int i);
|
|
||||||
void CheckAll();
|
|
||||||
void RemoveAll();
|
|
||||||
void update();
|
|
||||||
|
|
||||||
int setInvert(int reg=-1);
|
|
||||||
int setEnable(int reg=-1);
|
|
||||||
|
|
||||||
|
|
||||||
Pixel_t getColor(int i);
|
|
||||||
Bool_t getEnabled(int i);
|
|
||||||
Bool_t getPlot(int i);
|
|
||||||
Bool_t getEnable(int i);
|
|
||||||
|
|
||||||
void CheckHalf0();
|
|
||||||
void RemoveHalf0();
|
|
||||||
|
|
||||||
void CheckHalf1();
|
|
||||||
void RemoveHalf1();
|
|
||||||
|
|
||||||
|
|
||||||
ClassDef(ctbAdcs,0)
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,235 +0,0 @@
|
|||||||
// SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <iostream>
|
|
||||||
#include <fstream>
|
|
||||||
|
|
||||||
#include <TGTextEntry.h>
|
|
||||||
#include <TGLabel.h>
|
|
||||||
#include <TGNumberEntry.h>
|
|
||||||
#include <TGButton.h>
|
|
||||||
|
|
||||||
#include "ctbDacs.h"
|
|
||||||
#include "ctbDefs.h"
|
|
||||||
#include "sls/Detector.h"
|
|
||||||
#include "sls/sls_detector_defs.h"
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
|
|
||||||
ctbDac::ctbDac(TGGroupFrame *page, int idac, sls::Detector *det) : TGHorizontalFrame(page, 800,50) , id(idac), myDet(det) {
|
|
||||||
|
|
||||||
TGHorizontalFrame *hframe=this;
|
|
||||||
|
|
||||||
page->AddFrame(hframe,new TGLayoutHints(kLHintsTop | kLHintsExpandX , 1,1,1,1));
|
|
||||||
MapWindow();
|
|
||||||
|
|
||||||
char tit[100];
|
|
||||||
|
|
||||||
|
|
||||||
sprintf(tit, "DAC %d:",idac);
|
|
||||||
|
|
||||||
dacsLabel= new TGCheckButton(hframe, tit);// new TGLabel(hframe, tit);
|
|
||||||
dacsLabel->SetOn(kTRUE, kTRUE);
|
|
||||||
|
|
||||||
dacsLabel->Connect("Toggled(Bool_t)","ctbDac",this,"setOn(Bool_t)");
|
|
||||||
|
|
||||||
|
|
||||||
hframe->AddFrame(dacsLabel,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 5, 5, 5, 5));
|
|
||||||
dacsLabel->MapWindow();
|
|
||||||
dacsLabel->SetTextJustify(kTextLeft);
|
|
||||||
|
|
||||||
|
|
||||||
dacsEntry = new TGNumberEntry(hframe, 0, 9,999, TGNumberFormat::kNESInteger,
|
|
||||||
TGNumberFormat::kNEANonNegative,
|
|
||||||
TGNumberFormat::kNELLimitMinMax,
|
|
||||||
0, 65535);
|
|
||||||
|
|
||||||
hframe->AddFrame(dacsEntry,new TGLayoutHints(kLHintsTop | kLHintsExpandX, 5, 5, 5, 5));
|
|
||||||
dacsEntry->MapWindow();
|
|
||||||
dacsEntry->Resize(150,30);
|
|
||||||
|
|
||||||
|
|
||||||
dacsUnit= new TGCheckButton(hframe, "mV");
|
|
||||||
// if (idac!=slsDetectorDefs::ADC_VPP) {
|
|
||||||
hframe->AddFrame( dacsUnit,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 5, 5, 5, 5));
|
|
||||||
dacsUnit->MapWindow();
|
|
||||||
if (idac==slsDetectorDefs::ADC_VPP) {
|
|
||||||
dacsUnit->SetEnabled(kFALSE);
|
|
||||||
hframe->HideFrame(dacsUnit);
|
|
||||||
dacsUnit->MapWindow();
|
|
||||||
cout << "hiding!" << endl;
|
|
||||||
}
|
|
||||||
if (idac==slsDetectorDefs::HIGH_VOLTAGE) {
|
|
||||||
dacsUnit->SetText("V");
|
|
||||||
dacsUnit->SetOn(kTRUE,kTRUE);
|
|
||||||
dacsUnit->SetEnabled(kFALSE);
|
|
||||||
}
|
|
||||||
//}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
sprintf(tit, "xxx");
|
|
||||||
dacsValue= new TGLabel(hframe, tit);
|
|
||||||
hframe->AddFrame( dacsValue,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 5, 5, 5, 5));
|
|
||||||
dacsValue->MapWindow();
|
|
||||||
dacsValue->SetTextJustify(kTextLeft);
|
|
||||||
|
|
||||||
TGTextEntry *e=dacsEntry->TGNumberEntry::GetNumberEntry();
|
|
||||||
e->Connect("ReturnPressed()","ctbDac",this,"setValue()");
|
|
||||||
// e->Connect("ValueSet(Long_t)","ctbDac",this,"setValue(Long_t)");
|
|
||||||
dacsEntry->Connect("ValueSet(Long_t)","ctbDac",this,"setValue(Long_t)");
|
|
||||||
// cout << "(((((((((((((((((((((((((((((((" << dacsEntry->GetListOfSignals()->At(0)->IsA() << endl;
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int ctbDac::setLabel(char *tit, int mv) {
|
|
||||||
if(tit)
|
|
||||||
dacsLabel->SetText(tit);
|
|
||||||
if (mv==1)
|
|
||||||
dacsUnit->SetOn(kTRUE,kTRUE);
|
|
||||||
else if (mv==0)
|
|
||||||
dacsUnit->SetOn(kFALSE,kTRUE);
|
|
||||||
// else if (mv==2) {
|
|
||||||
// ;}
|
|
||||||
// else if (mv==3)
|
|
||||||
// ;
|
|
||||||
return id;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
string ctbDac::getLabel() {
|
|
||||||
ostringstream line;
|
|
||||||
line << dacsLabel->GetText() << " " << dacsUnit->IsOn() << endl;
|
|
||||||
// line << "DAC" << dec << id << " " << dacsUnit->IsOn() << endl;
|
|
||||||
return line.str();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
int ctbDac::getMoenchDacId() {
|
|
||||||
slsDetectorDefs::dacIndex moenchDacIndices[8] = {slsDetectorDefs::VBP_COLBUF, slsDetectorDefs::VIPRE, slsDetectorDefs::VIN_CM, slsDetectorDefs::VB_SDA, slsDetectorDefs::VCASC_SFP, slsDetectorDefs::VOUT_CM, slsDetectorDefs::VIPRE_CDS, slsDetectorDefs::IBIAS_SFP};
|
|
||||||
|
|
||||||
if (id >= 8) {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
return static_cast<int>(moenchDacIndices[id]);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ctbDac::setValue(Long_t a) {setValue();}
|
|
||||||
|
|
||||||
void ctbDac::setValue() {
|
|
||||||
cout << "setting dac! "<< id << " value " << dacsEntry->GetIntNumber() << " units " << dacsUnit->IsOn() << endl;
|
|
||||||
|
|
||||||
try {
|
|
||||||
int sid = id;
|
|
||||||
if (myDet->getDetectorType().squash() == slsDetectorDefs::MOENCH) {
|
|
||||||
sid = getMoenchDacId();
|
|
||||||
}
|
|
||||||
myDet->setDAC(static_cast<slsDetectorDefs::dacIndex>(sid), dacsEntry->GetIntNumber(), dacsUnit->IsOn());
|
|
||||||
} CATCH_DISPLAY ("Could not set dac " + to_string(id) + ".", "ctbDac::setValue")
|
|
||||||
|
|
||||||
getValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ctbDac::setOn(Bool_t b) {
|
|
||||||
// cout << "setting dac! "<< id << endl;
|
|
||||||
if ( dacsLabel->IsOn()) {
|
|
||||||
setValue();
|
|
||||||
} else {
|
|
||||||
try {
|
|
||||||
int sid = id;
|
|
||||||
if (myDet->getDetectorType().squash() == slsDetectorDefs::MOENCH) {
|
|
||||||
sid = getMoenchDacId();
|
|
||||||
}
|
|
||||||
myDet->setDAC(static_cast<slsDetectorDefs::dacIndex>(sid), -100, false);
|
|
||||||
} CATCH_DISPLAY ("Could not power off dac " + to_string(id) + ".", "ctbDac::setOn")
|
|
||||||
}
|
|
||||||
getValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
int ctbDac::getValue() {
|
|
||||||
try {
|
|
||||||
int sid = id;
|
|
||||||
if (myDet->getDetectorType().squash() == slsDetectorDefs::MOENCH) {
|
|
||||||
sid = getMoenchDacId();
|
|
||||||
}
|
|
||||||
int val = myDet->getDAC(static_cast<slsDetectorDefs::dacIndex>(sid), dacsUnit->IsOn()).tsquash("Different values");
|
|
||||||
cout << "dac " << id << " " << val << endl;
|
|
||||||
dacsValue->SetText(to_string(val).c_str());
|
|
||||||
if (val >= 0) {
|
|
||||||
dacsLabel->SetOn(kTRUE);
|
|
||||||
} else {
|
|
||||||
dacsLabel->SetOn(kFALSE);
|
|
||||||
}
|
|
||||||
return val;
|
|
||||||
} CATCH_DISPLAY ("Could not get dac " + to_string(id) + ".", "ctbDac::getValue")
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ctbDacs::ctbDacs(TGVerticalFrame *page, sls::Detector *det) : TGGroupFrame(page,"DACs",kVerticalFrame) , myDet(det){
|
|
||||||
|
|
||||||
SetTitlePos(TGGroupFrame::kLeft);
|
|
||||||
page->AddFrame(this,new TGLayoutHints( kLHintsTop | kLHintsExpandX , 10,10,10,10));
|
|
||||||
MapWindow();
|
|
||||||
|
|
||||||
// cout << "window mapped " << endl;
|
|
||||||
|
|
||||||
for (int idac=0; idac<NDACS; idac++) {
|
|
||||||
|
|
||||||
dacs[idac]=new ctbDac(this, idac, myDet);
|
|
||||||
|
|
||||||
}
|
|
||||||
dacs[NDACS]=new ctbDac(this, slsDetectorDefs::ADC_VPP, myDet);
|
|
||||||
dacs[NDACS+1]=new ctbDac(this, slsDetectorDefs::HIGH_VOLTAGE, myDet);
|
|
||||||
dacs[NDACS]->setLabel((char*)"ADC Vpp",2);
|
|
||||||
dacs[NDACS+1]->setLabel((char*)"High Voltage",3);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int ctbDacs::setDacAlias(string line) {
|
|
||||||
int is=-1, mv=0;
|
|
||||||
char tit[100];
|
|
||||||
int narg=sscanf(line.c_str(),"DAC%d %s %d",&is,tit,&mv);
|
|
||||||
if (narg<2)
|
|
||||||
return -1;
|
|
||||||
if (is>=0 && is<NDACS)
|
|
||||||
dacs[is]->setLabel(tit,mv);
|
|
||||||
return is;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
string ctbDacs::getDacAlias() {
|
|
||||||
ostringstream line;
|
|
||||||
|
|
||||||
for (int i=0; i<NDACS; i++)
|
|
||||||
line << dacs[i]->getLabel() << endl;
|
|
||||||
return line.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
string ctbDacs::getDacParameters() {
|
|
||||||
ostringstream line;
|
|
||||||
|
|
||||||
for (int i=0; i<NDACS; i++) {
|
|
||||||
//line << "dacs:" << i << " " << dacs[i]->getValue << endl;
|
|
||||||
line << "dac:" << i << " " << dacs[i]->getValue() << endl;
|
|
||||||
}
|
|
||||||
return line.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void ctbDacs::update() {
|
|
||||||
for (int idac=0; idac<NDACS+1; idac++) {
|
|
||||||
dacs[idac]->getValue();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,77 +0,0 @@
|
|||||||
// SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef CTBDACS_H
|
|
||||||
#define CTBDACS_H
|
|
||||||
#include <TGFrame.h>
|
|
||||||
|
|
||||||
|
|
||||||
#define NDACS 18
|
|
||||||
//#define NDACS 16
|
|
||||||
|
|
||||||
|
|
||||||
class TGTextEntry;
|
|
||||||
class TGLabel;
|
|
||||||
class TGNumberEntry;
|
|
||||||
class TGCheckButton;
|
|
||||||
|
|
||||||
|
|
||||||
namespace sls
|
|
||||||
{
|
|
||||||
class Detector;
|
|
||||||
};
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
|
|
||||||
class ctbDac : public TGHorizontalFrame {
|
|
||||||
|
|
||||||
|
|
||||||
protected:
|
|
||||||
// TGLabel *dacsLabel;
|
|
||||||
TGNumberEntry *dacsEntry;
|
|
||||||
TGCheckButton *dacsUnit;
|
|
||||||
TGCheckButton *dacsLabel;
|
|
||||||
TGLabel *dacsValue;
|
|
||||||
int id;
|
|
||||||
|
|
||||||
sls::Detector* myDet;
|
|
||||||
public:
|
|
||||||
ctbDac(TGGroupFrame*, int , sls::Detector*);
|
|
||||||
void setValue();
|
|
||||||
void setValue(Long_t);
|
|
||||||
int getValue();
|
|
||||||
void setOn(Bool_t);
|
|
||||||
|
|
||||||
int setLabel(char *tit, int mv);
|
|
||||||
string getLabel();
|
|
||||||
int getMoenchDacId();
|
|
||||||
|
|
||||||
|
|
||||||
ClassDef(ctbDac,0)
|
|
||||||
};
|
|
||||||
|
|
||||||
class ctbDacs : public TGGroupFrame {
|
|
||||||
private:
|
|
||||||
|
|
||||||
ctbDac *dacs[NDACS+2];
|
|
||||||
|
|
||||||
sls::Detector* myDet;
|
|
||||||
|
|
||||||
public:
|
|
||||||
ctbDacs(TGVerticalFrame *page, sls::Detector*);
|
|
||||||
|
|
||||||
int setDacAlias(string line);
|
|
||||||
// int setDacAlias(string line);
|
|
||||||
string getDacAlias();
|
|
||||||
string getDacParameters();
|
|
||||||
|
|
||||||
void update();
|
|
||||||
|
|
||||||
ClassDef(ctbDacs,0)
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
@@ -1,86 +0,0 @@
|
|||||||
// SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <stdexcept>
|
|
||||||
#include <chrono>
|
|
||||||
|
|
||||||
//#include "sls/sls_detector_exceptions.h"
|
|
||||||
//#include "sls/ansi.h"
|
|
||||||
#define RED "\x1b[31m"
|
|
||||||
#define RESET "\x1b[0m"
|
|
||||||
#define BOLD "\x1b[1m"
|
|
||||||
#define cprintf(code, format, ...) printf(code format RESET, ##__VA_ARGS__)
|
|
||||||
|
|
||||||
|
|
||||||
#define CATCH_DISPLAY(m, s) catch(...) { ctbDefs::DisplayExceptions(m, s); }
|
|
||||||
#define CATCH_HANDLE(...) catch(...) { ctbDefs::HandleExceptions(__VA_ARGS__); }
|
|
||||||
|
|
||||||
class ctbDefs {
|
|
||||||
public:
|
|
||||||
/**
|
|
||||||
* Empty Constructor
|
|
||||||
*/
|
|
||||||
ctbDefs(){};
|
|
||||||
|
|
||||||
// convert double seconds to chrono ns
|
|
||||||
static std::chrono::nanoseconds ConvertDoubleStoChronoNS(double timeS) {
|
|
||||||
using std::chrono::duration;
|
|
||||||
using std::chrono::duration_cast;
|
|
||||||
using std::chrono::nanoseconds;
|
|
||||||
return duration_cast<nanoseconds>(duration<double>(timeS));
|
|
||||||
}
|
|
||||||
|
|
||||||
// convert chrono ns to doubel s
|
|
||||||
static double ConvertChronoNStoDoubleS(std::chrono::nanoseconds timeNs) {
|
|
||||||
using std::chrono::duration;
|
|
||||||
using std::chrono::duration_cast;
|
|
||||||
return duration_cast<duration<double>>(timeNs).count();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void DisplayExceptions(std::string emsg, std::string src) {
|
|
||||||
try {
|
|
||||||
throw;
|
|
||||||
} /* catch (const sls::SocketError &e) {
|
|
||||||
throw;
|
|
||||||
} catch (const sls::SharedMemoryError &e) {
|
|
||||||
throw;
|
|
||||||
} */catch (const std::exception &e) {
|
|
||||||
ExceptionMessage(emsg, e.what(), src);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class CT> struct NonDeduced { using type = CT; };
|
|
||||||
template <class S, typename RT, typename... CT>
|
|
||||||
static void HandleExceptions(const std::string emsg, const std::string src, S* s,
|
|
||||||
RT (S::*somefunc)(CT...),
|
|
||||||
typename NonDeduced<CT>::type... Args) {
|
|
||||||
try {
|
|
||||||
throw;
|
|
||||||
} /*catch (const sls::SocketError &e) {
|
|
||||||
throw;
|
|
||||||
} catch (const sls::SharedMemoryError &e) {
|
|
||||||
throw;
|
|
||||||
} */catch (const std::exception &e) {
|
|
||||||
|
|
||||||
ExceptionMessage(emsg, e.what(), src);
|
|
||||||
(s->*somefunc)(Args...);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
static void ExceptionMessage(std::string message,
|
|
||||||
std::string exceptionMessage,
|
|
||||||
std::string source) {
|
|
||||||
// because sls_detector_exceptions cannot be included
|
|
||||||
if (exceptionMessage.find("hared memory") != std::string::npos) {
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
if (exceptionMessage.find("annot connect") != std::string::npos) {
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
cprintf(RED, "Warning (%s): %s [Caught Exception: %s]\n", source.c_str(), message.c_str(), exceptionMessage.c_str());
|
|
||||||
//return Message(qDefs::WARNING, message + std::string("\nCaught exception:\n") + exceptionMessage, source);
|
|
||||||
};
|
|
||||||
|
|
||||||
};
|
|
||||||
@@ -1,159 +0,0 @@
|
|||||||
// SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
#include <TApplication.h>
|
|
||||||
#include <TColor.h>
|
|
||||||
|
|
||||||
#include <TStyle.h>
|
|
||||||
#include <TROOT.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <iostream>
|
|
||||||
#include <fstream>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include "sls/Detector.h"
|
|
||||||
#include "sls/sls_detector_defs.h"
|
|
||||||
//#include "sls_receiver_defs.h"
|
|
||||||
#include "ctbMain.h"
|
|
||||||
#include "ctbDefs.h"
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
|
||||||
|
|
||||||
|
|
||||||
string afname, cfname, pfname;
|
|
||||||
int id=0;
|
|
||||||
|
|
||||||
int af=0, cf=0, pf=0;
|
|
||||||
|
|
||||||
|
|
||||||
cout << " *** " << argc << endl;
|
|
||||||
for (int ia=0; ia<argc; ia++) {
|
|
||||||
if (strcmp(argv[ia],"-alias")==0) {
|
|
||||||
if (ia+1<argc) {
|
|
||||||
afname=argv[ia+1];
|
|
||||||
ia++;
|
|
||||||
af=1;
|
|
||||||
}
|
|
||||||
|
|
||||||
} else if (strcmp(argv[ia],"-config")==0) {
|
|
||||||
if (ia+1<argc) {
|
|
||||||
cfname=argv[ia+1];
|
|
||||||
ia++;
|
|
||||||
cf=1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
} else if (strcmp(argv[ia],"-par")==0) {
|
|
||||||
if (ia+1<argc) {
|
|
||||||
pfname=argv[ia+1];
|
|
||||||
ia++;
|
|
||||||
pf=1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
} else if (strcmp(argv[ia],"-id")==0) {
|
|
||||||
if (ia+1<argc) {
|
|
||||||
id=atoi(argv[ia+1]);
|
|
||||||
ia++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
cout << " *** " << endl;
|
|
||||||
sls::Detector *myDet = nullptr;
|
|
||||||
try {
|
|
||||||
/****** Create detector ****************/
|
|
||||||
myDet=new sls::Detector(id);
|
|
||||||
cout << "Created multi detector id " << id << endl;
|
|
||||||
|
|
||||||
if (cf) {
|
|
||||||
myDet->loadConfig(cfname);
|
|
||||||
cout << "Config file loaded successfully" << endl;
|
|
||||||
} else {
|
|
||||||
cout << "No config file specified" << endl;
|
|
||||||
}
|
|
||||||
cout << "hostname " << myDet->getHostname() << endl;
|
|
||||||
|
|
||||||
if (pf) {
|
|
||||||
myDet->loadParameters(pfname);
|
|
||||||
cout << "Loaded parameter file successfully" << endl;
|
|
||||||
} else{
|
|
||||||
cout << "No parameter file specified" << endl;
|
|
||||||
}
|
|
||||||
} CATCH_DISPLAY ("Could not create detector/ load config/parameters.", "ctbGui::main")
|
|
||||||
|
|
||||||
/***********Create GUI stuff *******************/
|
|
||||||
TApplication theApp("App",&argc,argv);
|
|
||||||
|
|
||||||
|
|
||||||
gStyle->SetDrawBorder(0);
|
|
||||||
gStyle->SetCanvasColor(kWhite);
|
|
||||||
gStyle->SetCanvasDefH(800);
|
|
||||||
gStyle->SetCanvasDefW(800);
|
|
||||||
gStyle->SetCanvasBorderMode(0);
|
|
||||||
gStyle->SetPadBorderMode(0);
|
|
||||||
gStyle->SetPaintTextFormat("5.2f");
|
|
||||||
gStyle->SetLineWidth(2);
|
|
||||||
gStyle->SetTextSize(1.1);
|
|
||||||
gStyle->SetLabelSize(0.04,"xy");
|
|
||||||
gStyle->SetTitleSize(0.05,"xy");
|
|
||||||
gStyle->SetTitleOffset(1.0,"x");
|
|
||||||
gStyle->SetTitleOffset(1.1,"y");
|
|
||||||
gStyle->SetPadTopMargin(0.15);
|
|
||||||
gStyle->SetPadRightMargin(0.15);
|
|
||||||
gStyle->SetPadBottomMargin(0.15);
|
|
||||||
gStyle->SetPadLeftMargin(0.15);
|
|
||||||
gStyle->SetLegendBorderSize(1);
|
|
||||||
gStyle->SetFrameBorderMode(0);
|
|
||||||
gStyle->SetFrameFillColor(kWhite);
|
|
||||||
// gStyle->SetLegendFillColor(kWhite);
|
|
||||||
gStyle->SetTitleFillColor(kWhite);
|
|
||||||
gStyle->SetFillColor(kWhite);
|
|
||||||
gStyle->SetStatFontSize(0.03);
|
|
||||||
gStyle->SetStatBorderSize(1);
|
|
||||||
gStyle->SetStatFormat("6.4g");
|
|
||||||
gStyle->SetStatX(0.95);
|
|
||||||
gStyle->SetStatY(0.95);
|
|
||||||
gStyle->SetStatW(0.2);
|
|
||||||
gStyle->SetStatH(0.2);
|
|
||||||
gStyle->SetTitleX(0.1);
|
|
||||||
gStyle->SetTitleY(0.95);
|
|
||||||
gStyle->SetTitleBorderSize(0);
|
|
||||||
gStyle->SetTitleFontSize(0.05);
|
|
||||||
gROOT->SetStyle("Default");
|
|
||||||
|
|
||||||
|
|
||||||
TColor::InitializeColors();
|
|
||||||
const Int_t NRGBs = 5;
|
|
||||||
const Int_t NCont = 90;
|
|
||||||
|
|
||||||
Double_t stops[NRGBs] = { 0.00, 0.34, 0.61, 0.84, 1.00 };
|
|
||||||
Double_t red[NRGBs] = { 0.00, 0.00, 0.87, 1.00, 0.51 };
|
|
||||||
Double_t green[NRGBs] = { 0.00, 0.81, 1.00, 0.20, 0.00 };
|
|
||||||
Double_t blue[NRGBs] = { 0.51, 1.00, 0.12, 0.00, 0.00 };
|
|
||||||
TColor::CreateGradientColorTable(NRGBs, stops, red, green, blue, NCont);
|
|
||||||
gStyle->SetNumberContours(NCont);
|
|
||||||
|
|
||||||
|
|
||||||
gROOT->ForceStyle();
|
|
||||||
ctbMain *mf=new ctbMain(gClient->GetRoot(), myDet);
|
|
||||||
|
|
||||||
cout << " *** " << argc << endl;
|
|
||||||
for (int ia=0; ia<argc; ia++)
|
|
||||||
cout << argv[ia] << endl;
|
|
||||||
|
|
||||||
|
|
||||||
cout << " *** " << endl;
|
|
||||||
|
|
||||||
if (af)
|
|
||||||
mf->loadAlias(afname);
|
|
||||||
else
|
|
||||||
cout << "no alias specified" << endl;
|
|
||||||
|
|
||||||
theApp.Run();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
// SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
#pragma link C++ class ctbMain;
|
|
||||||
#pragma link C++ class ctbDacs;
|
|
||||||
#pragma link C++ class ctbDac;
|
|
||||||
#pragma link C++ class ctbSignals;
|
|
||||||
#pragma link C++ class ctbSignal;
|
|
||||||
#pragma link C++ class ctbAdc;
|
|
||||||
#pragma link C++ class ctbAdcs;
|
|
||||||
#pragma link C++ class ctbLoop;
|
|
||||||
#pragma link C++ class ctbWait;
|
|
||||||
#pragma link C++ class ctbPattern;
|
|
||||||
#pragma link C++ class ctbAcquisition;
|
|
||||||
#pragma link C++ class ctbPower;
|
|
||||||
#pragma link C++ class ctbPowers;
|
|
||||||
#pragma link C++ class ctbSlowAdc;
|
|
||||||
#pragma link C++ class ctbSlowAdcs;
|
|
||||||
@@ -1,588 +0,0 @@
|
|||||||
// SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
#include <TApplication.h>
|
|
||||||
#include <TGClient.h>
|
|
||||||
#include <TCanvas.h>
|
|
||||||
#include <TF1.h>
|
|
||||||
#include <TRandom.h>
|
|
||||||
#include <TGButton.h>
|
|
||||||
#include <TRootEmbeddedCanvas.h>
|
|
||||||
#include <TGButtonGroup.h>
|
|
||||||
#include <TGNumberEntry.h>
|
|
||||||
#include <TGLabel.h>
|
|
||||||
#include <TList.h>
|
|
||||||
#include <TGFileDialog.h>
|
|
||||||
#include <TGComboBox.h>
|
|
||||||
#include <TH2F.h>
|
|
||||||
#include <TColor.h>
|
|
||||||
#include <TH1F.h>
|
|
||||||
#include <TGraphErrors.h>
|
|
||||||
#include <THStack.h>
|
|
||||||
#include <TGTab.h>
|
|
||||||
#include <TApplication.h>
|
|
||||||
#include <TGCanvas.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include <TGMenu.h>
|
|
||||||
#include <TGDockableFrame.h>
|
|
||||||
//#include <TGMenuBar.h>
|
|
||||||
//#include <TGPopupMenu.h>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <iostream>
|
|
||||||
#include <fstream>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include "sls/Detector.h"
|
|
||||||
#include "ctbDefs.h"
|
|
||||||
#include "ctbMain.h"
|
|
||||||
#include "ctbDacs.h"
|
|
||||||
#include "ctbSlowAdcs.h"
|
|
||||||
#include "ctbPowers.h"
|
|
||||||
#include "ctbSignals.h"
|
|
||||||
#include "ctbPattern.h"
|
|
||||||
#include "ctbAdcs.h"
|
|
||||||
#include "ctbAcquisition.h"
|
|
||||||
//#include "ctbActions.h"
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ctbMain::ctbMain(const TGWindow *p, sls::Detector *det)
|
|
||||||
: TGMainFrame(p,800,800), pwrs(NULL), senses(NULL) {
|
|
||||||
|
|
||||||
myDet=det;
|
|
||||||
|
|
||||||
Connect("CloseWindow()", "ctbMain", this, "CloseWindow()");
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// fMenuDock = new TGDockableFrame(this);
|
|
||||||
// AddFrame(fMenuDock, new TGLayoutHints(kLHintsExpandX, 0, 0, 1, 0));
|
|
||||||
// fMenuDock->SetWindowName("GuiTest Menu");
|
|
||||||
|
|
||||||
fMenuBarLayout = new TGLayoutHints(kLHintsTop | kLHintsExpandX);
|
|
||||||
fMenuBarItemLayout = new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 0, 0);
|
|
||||||
fMenuBarHelpLayout = new TGLayoutHints(kLHintsTop | kLHintsRight);
|
|
||||||
|
|
||||||
fMenuFile = new TGPopupMenu(gClient->GetRoot());
|
|
||||||
int im=0;
|
|
||||||
|
|
||||||
fMenuFile->AddEntry("Open Alias", im++);
|
|
||||||
fMenuFile->AddEntry("Save Alias", im++);
|
|
||||||
fMenuFile->AddSeparator();
|
|
||||||
fMenuFile->AddEntry("Open Parameters", im++);
|
|
||||||
fMenuFile->AddEntry("Save Parameters", im++);
|
|
||||||
fMenuFile->AddSeparator();
|
|
||||||
fMenuFile->AddEntry("Open Configuration", im++);
|
|
||||||
fMenuFile->AddEntry("Save Configuration", im++);
|
|
||||||
fMenuFile->AddSeparator();
|
|
||||||
fMenuFile->AddEntry("Open Pattern", im++);
|
|
||||||
fMenuFile->AddEntry("Save Pattern", im++);
|
|
||||||
fMenuFile->AddSeparator();
|
|
||||||
fMenuFile->AddEntry("Exit", im++);
|
|
||||||
|
|
||||||
fMenuFile->Connect("Activated(Int_t)", "ctbMain", this,
|
|
||||||
"HandleMenu(Int_t)");
|
|
||||||
|
|
||||||
|
|
||||||
i_dacs=-1;
|
|
||||||
i_pwrs=-1;
|
|
||||||
i_senses=-1;
|
|
||||||
i_sig=-1;
|
|
||||||
i_adcs=-1;
|
|
||||||
i_pat=-1;
|
|
||||||
i_acq=-1;
|
|
||||||
|
|
||||||
int i_page=0;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
TGVerticalFrame *vframe=new TGVerticalFrame(this, 800,1200); //main frame
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
fMenuBar = new TGMenuBar(vframe, 1, 1, kHorizontalFrame);
|
|
||||||
fMenuBar->AddPopup("&File", fMenuFile, fMenuBarItemLayout);
|
|
||||||
// fMenuBar->AddPopup("&Test", fMenuTest, fMenuBarItemLayout);
|
|
||||||
// fMenuBar->AddPopup("&View", fMenuView, fMenuBarItemLayout);
|
|
||||||
// fMenuBar->AddPopup("&Help", fMenuHelp, fMenuBarHelpLayout);
|
|
||||||
|
|
||||||
vframe->AddFrame(fMenuBar, fMenuBarLayout);
|
|
||||||
|
|
||||||
TGHorizontalFrame* hpage=new TGHorizontalFrame(vframe, 800,1200); //horizontal frame. Inside there should be the tab and the canvas
|
|
||||||
mtab=new TGTab(hpage, 1500, 1200); //tab!
|
|
||||||
// page=new TGVerticalFrame(mtab, 1500,1200);
|
|
||||||
|
|
||||||
cout << "DACS" << endl;
|
|
||||||
|
|
||||||
TGCompositeFrame *tf = mtab->AddTab("DACs");
|
|
||||||
TGVerticalFrame *page=new TGVerticalFrame(tf, 1500,1200);
|
|
||||||
tf->AddFrame(page, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 10,10,10,1));
|
|
||||||
dacs=new ctbDacs(page, myDet);
|
|
||||||
i_dacs=i_page++;
|
|
||||||
|
|
||||||
|
|
||||||
cout << "power " << endl;
|
|
||||||
tf = mtab->AddTab("Power Supplies");
|
|
||||||
page=new TGVerticalFrame(tf, 1500,1200);
|
|
||||||
tf->AddFrame(page, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 10,10,10,1));
|
|
||||||
pwrs=new ctbPowers(page, myDet);
|
|
||||||
|
|
||||||
i_pwrs=i_page++;
|
|
||||||
|
|
||||||
cout << "sense " << endl;
|
|
||||||
tf = mtab->AddTab("Sense");
|
|
||||||
page=new TGVerticalFrame(tf, 1500,1200);
|
|
||||||
tf->AddFrame(page, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 10,10,10,1));
|
|
||||||
senses=new ctbSlowAdcs(page, myDet);
|
|
||||||
|
|
||||||
i_senses=i_page++;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
cout << "signals " << endl;
|
|
||||||
tf = mtab->AddTab("Signals");
|
|
||||||
page=new TGVerticalFrame(tf, 1500,1200);
|
|
||||||
tf->AddFrame(page, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 10,10,10,1));
|
|
||||||
sig=new ctbSignals(page, myDet);
|
|
||||||
sig->Connect("ToggledSignalPlot(Int_t)","ctbMain",this,"setSignalPlot(Int_t)");
|
|
||||||
|
|
||||||
i_sig=i_page++;
|
|
||||||
|
|
||||||
cout << "adcs " << endl;
|
|
||||||
tf = mtab->AddTab("ADCs");
|
|
||||||
page=new TGVerticalFrame(tf, 1500,1200);
|
|
||||||
tf->AddFrame(page, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 10,10,10,1));
|
|
||||||
adcs=new ctbAdcs(page, myDet);
|
|
||||||
adcs->Connect("ToggledAdcPlot(Int_t)","ctbMain",this,"setADCPlot(Int_t)");
|
|
||||||
adcs->Connect("AdcEnable(Int_t)","ctbMain",this,"setADCEnable(Int_t)");
|
|
||||||
i_adcs=i_page++;
|
|
||||||
|
|
||||||
|
|
||||||
cout << "pattern" << endl;
|
|
||||||
|
|
||||||
tf = mtab->AddTab("Pattern");
|
|
||||||
page=new TGVerticalFrame(tf, 1500,1200);
|
|
||||||
tf->AddFrame(page, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 10,10,10,1));
|
|
||||||
pat=new ctbPattern(page, myDet);
|
|
||||||
pat->Connect("patternFileChanged(const char*)","ctbMain",this,"setPatternFile(const char*)");
|
|
||||||
pat->Connect("patternCompilerChanged(const char*)","ctbMain",this,"setPatternCompiler(const char*)");
|
|
||||||
pat->Connect("analogSamplesChanged(const int)","ctbMain",this,"setAnalogSamples(int)");
|
|
||||||
pat->Connect("digitalSamplesChanged(const int)","ctbMain",this,"setDigitalSamples(int)");
|
|
||||||
pat->Connect("readoutModeChanged(int)","ctbMain",this,"setReadoutMode(int)");
|
|
||||||
|
|
||||||
i_pat=i_page++;
|
|
||||||
|
|
||||||
cout << "acquisition" << endl;
|
|
||||||
|
|
||||||
tf = mtab->AddTab("Acquisition");
|
|
||||||
page=new TGVerticalFrame(tf, 1500,1200);
|
|
||||||
tf->AddFrame(page, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 10,10,10,1));
|
|
||||||
acq=new ctbAcquisition(page, myDet);
|
|
||||||
|
|
||||||
|
|
||||||
i_acq=i_page++;
|
|
||||||
|
|
||||||
|
|
||||||
// cout << "actions" << endl;
|
|
||||||
// tf = mtab->AddTab("Actions");
|
|
||||||
// page=new TGVerticalFrame(tf, 1500,1200);
|
|
||||||
// tf->AddFrame(page, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 10,10,10,1));
|
|
||||||
// actions=new ctbActions(page, myDet);
|
|
||||||
|
|
||||||
|
|
||||||
// i_actions=i_page++;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
cout << "tabs finished" << endl;
|
|
||||||
|
|
||||||
hpage->AddFrame(mtab,new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 10,10,10,1));
|
|
||||||
|
|
||||||
vframe->AddFrame(hpage,new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 10,10,10,1));
|
|
||||||
|
|
||||||
AddFrame(vframe,new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 10,10,10,1));
|
|
||||||
vframe->MapWindow();
|
|
||||||
hpage->MapWindow();
|
|
||||||
mtab->MapWindow();
|
|
||||||
page->MapWindow();
|
|
||||||
|
|
||||||
// Sets window name and shows the main frame
|
|
||||||
cout << "dockabel" << endl;
|
|
||||||
TGDockableFrame *fdock=new TGDockableFrame(hpage);
|
|
||||||
hpage->AddFrame(fdock, new TGLayoutHints(kLHintsBottom | kLHintsCenterX | kLHintsExpandX | kLHintsExpandY, 10,10,10,10));
|
|
||||||
fdock->MapWindow();
|
|
||||||
|
|
||||||
cout << "canvas" << endl;
|
|
||||||
// // Creates widgets of the example
|
|
||||||
|
|
||||||
|
|
||||||
fEcanvas = new TRootEmbeddedCanvas ("Ecanvas",fdock,800,800);//hpage,800,800);
|
|
||||||
//fEcanvas = new TRootEmbeddedCanvas ("Ecanvas",this,800,800);//hpage,800,800);
|
|
||||||
// fEcanvas->Resize();
|
|
||||||
// fEcanvas->GetCanvas()->Update();
|
|
||||||
//AddFrame(fEcanvas, new TGLayoutHints(kLHintsBottom | kLHintsCenterX | kLHintsExpandX | kLHintsExpandY, 10,10,10,10));
|
|
||||||
|
|
||||||
// // hpage->
|
|
||||||
fdock->AddFrame(fEcanvas, new TGLayoutHints(kLHintsBottom | kLHintsCenterX | kLHintsExpandX | kLHintsExpandY, 10,10,10,10));
|
|
||||||
|
|
||||||
|
|
||||||
fEcanvas->MapWindow();
|
|
||||||
|
|
||||||
acq->setCanvas(getCanvas());
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
hpage->MapSubwindows();
|
|
||||||
mtab->Connect("Selected(Int_t)","ctbMain",this,"tabSelected(Int_t)");
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
cout << "connect mtab" << endl;
|
|
||||||
|
|
||||||
try{
|
|
||||||
setReadoutMode(pat->getReadoutMode());
|
|
||||||
} CATCH_DISPLAY ("Could not get readout flags", "ctbPattern::getReadoutMode")
|
|
||||||
|
|
||||||
setADCEnable(adcs->setEnable());
|
|
||||||
setAnalogSamples(pat->getAnalogSamples());
|
|
||||||
setDigitalSamples(pat->getDigitalSamples());
|
|
||||||
|
|
||||||
tabSelected(0);
|
|
||||||
|
|
||||||
SetWindowName("CTB Gui");
|
|
||||||
MapSubwindows();
|
|
||||||
Resize(1500,1200);
|
|
||||||
|
|
||||||
MapWindow();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ctbMain::CloseWindow() {
|
|
||||||
gApplication->Terminate();
|
|
||||||
}
|
|
||||||
|
|
||||||
TCanvas* ctbMain::getCanvas() {
|
|
||||||
return fEcanvas->GetCanvas();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void ctbMain::HandleMenu(Int_t id)
|
|
||||||
{
|
|
||||||
// Handle menu items.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
switch (id) {
|
|
||||||
|
|
||||||
case 0: // fMenuFile->AddEntry("Open Alias", im++);
|
|
||||||
cout << "Open Alias" << endl;
|
|
||||||
{
|
|
||||||
static TString dir(".");
|
|
||||||
TGFileInfo fi;
|
|
||||||
//fi.fFileTypes = filetypes;
|
|
||||||
fi.fIniDir = StrDup(dir);
|
|
||||||
printf("fIniDir = %s\n", fi.fIniDir);
|
|
||||||
new TGFileDialog(gClient->GetRoot(), this, kFDOpen, &fi);
|
|
||||||
printf("Open file: %s (dir: %s)\n", fi.fFilename, fi.fIniDir);
|
|
||||||
// dir = fi.fIniDir;
|
|
||||||
if (fi.fFilename)
|
|
||||||
loadAlias(fi.fFilename);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 1: // fMenuFile->AddEntry("Save Alias", im++);
|
|
||||||
cout << "Save Alias" << endl;
|
|
||||||
{
|
|
||||||
static TString dir(".");
|
|
||||||
TGFileInfo fi;
|
|
||||||
//fi.fFileTypes = filetypes;
|
|
||||||
fi.fIniDir = StrDup(dir);
|
|
||||||
printf("fIniDir = %s\n", fi.fIniDir);
|
|
||||||
new TGFileDialog(gClient->GetRoot(), this, kFDSave, &fi);
|
|
||||||
printf("Save file: %s (dir: %s)\n", fi.fFilename, fi.fIniDir);
|
|
||||||
// dir = fi.fIniDir;
|
|
||||||
if (fi.fFilename)
|
|
||||||
saveAlias(fi.fFilename);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 2: //fMenuFile->AddEntry("Open Parameters", im++);
|
|
||||||
cout << "Open Parameters" << endl;
|
|
||||||
{
|
|
||||||
static TString dir(".");
|
|
||||||
TGFileInfo fi;
|
|
||||||
//fi.fFileTypes = filetypes;
|
|
||||||
fi.fIniDir = StrDup(dir);
|
|
||||||
printf("fIniDir = %s\n", fi.fIniDir);
|
|
||||||
new TGFileDialog(gClient->GetRoot(), this, kFDOpen, &fi);
|
|
||||||
printf("Open file: %s (dir: %s)\n", fi.fFilename, fi.fIniDir);
|
|
||||||
// dir = fi.fIniDir;
|
|
||||||
if (fi.fFilename)
|
|
||||||
loadParameters(fi.fFilename);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 3: // fMenuFile->AddEntry("Open Configuration", im++);
|
|
||||||
cout << "Open configuration" << endl;
|
|
||||||
{
|
|
||||||
static TString dir(".");
|
|
||||||
TGFileInfo fi;
|
|
||||||
//fi.fFileTypes = filetypes;
|
|
||||||
fi.fIniDir = StrDup(dir);
|
|
||||||
printf("fIniDir = %s\n", fi.fIniDir);
|
|
||||||
new TGFileDialog(gClient->GetRoot(), this, kFDOpen, &fi);
|
|
||||||
printf("Open file: %s (dir: %s)\n", fi.fFilename, fi.fIniDir);
|
|
||||||
// dir = fi.fIniDir;
|
|
||||||
if (fi.fFilename)
|
|
||||||
loadConfiguration(fi.fFilename);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 4: //fMenuFile->AddEntry("Open Pattern", im++);
|
|
||||||
cout << "Open pattern" << endl;
|
|
||||||
{
|
|
||||||
static TString dir(".");
|
|
||||||
TGFileInfo fi;
|
|
||||||
//fi.fFileTypes = filetypes;
|
|
||||||
fi.fIniDir = StrDup(dir);
|
|
||||||
printf("fIniDir = %s\n", fi.fIniDir);
|
|
||||||
new TGFileDialog(gClient->GetRoot(), this, kFDOpen, &fi);
|
|
||||||
printf("Open file: %s (dir: %s)\n", fi.fFilename, fi.fIniDir);
|
|
||||||
// dir = fi.fIniDir;
|
|
||||||
if (fi.fFilename)
|
|
||||||
loadParameters(fi.fFilename);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 5: //fMenuFile->AddEntry("Save Pattern", im++);
|
|
||||||
cout << "Save pattern" << endl;
|
|
||||||
{
|
|
||||||
static TString dir(".");
|
|
||||||
TGFileInfo fi;
|
|
||||||
//fi.fFileTypes = filetypes;
|
|
||||||
fi.fIniDir = StrDup(dir);
|
|
||||||
printf("fIniDir = %s\n", fi.fIniDir);
|
|
||||||
new TGFileDialog(gClient->GetRoot(), this, kFDSave, &fi);
|
|
||||||
printf("Open file: %s (dir: %s)\n", fi.fFilename, fi.fIniDir);
|
|
||||||
// dir = fi.fIniDir;
|
|
||||||
if (fi.fFilename)
|
|
||||||
savePattern(fi.fFilename);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 6: // fMenuFile->AddEntry("Exit", im++);
|
|
||||||
CloseWindow();
|
|
||||||
|
|
||||||
default:
|
|
||||||
printf("Menu item %d selected\n", id);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int ctbMain::setADCPlot(Int_t i) {
|
|
||||||
|
|
||||||
// cout << "ADC " << i << " plot or color toggled" << endl;
|
|
||||||
// acq->setGraph(i,adcs->getGraph(i));
|
|
||||||
acq->setGraph(i,adcs->getEnabled(i),adcs->getColor(i));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int ctbMain::setSignalPlot(Int_t i) {
|
|
||||||
|
|
||||||
// cout << "ADC " << i << " plot or color toggled" << endl;
|
|
||||||
// acq->setGraph(i,adcs->getGraph(i));
|
|
||||||
acq->setBitGraph(i,sig->getPlot(i),sig->getColor(i));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void ctbMain::loadConfiguration(string fname) {
|
|
||||||
try{
|
|
||||||
myDet->loadConfig(fname);
|
|
||||||
} CATCH_DISPLAY ("Could not load config.", "ctbMain::loadConfiguration")
|
|
||||||
}
|
|
||||||
|
|
||||||
void ctbMain::loadParameters(string fname) {
|
|
||||||
try{
|
|
||||||
myDet->loadParameters(fname);
|
|
||||||
} CATCH_DISPLAY ("Could not load parameters.", "ctbMain::loadParameters")
|
|
||||||
}
|
|
||||||
|
|
||||||
void ctbMain::savePattern(string fname) {
|
|
||||||
try{
|
|
||||||
myDet->savePattern(fname);
|
|
||||||
} CATCH_DISPLAY ("Could not save pattern.", "ctbMain::savePattern")
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int ctbMain::loadAlias(string fname) {
|
|
||||||
|
|
||||||
|
|
||||||
string line;
|
|
||||||
char aaaa[1000];
|
|
||||||
int i;
|
|
||||||
ifstream myfile (fname.c_str());
|
|
||||||
if (myfile.is_open())
|
|
||||||
{
|
|
||||||
while ( getline (myfile,line) )
|
|
||||||
{
|
|
||||||
// cout << line ;
|
|
||||||
if (sscanf(line.c_str(),"BIT%d",&i)>0) {
|
|
||||||
//cout << "*******" << line<< endl;
|
|
||||||
sig->setSignalAlias(line);
|
|
||||||
// cout << line ;
|
|
||||||
} else if (sscanf(line.c_str(),"DAC%d",&i)>0) {
|
|
||||||
dacs->setDacAlias(line);
|
|
||||||
// cout << "+++++++++" << line<< endl;
|
|
||||||
} else if (sscanf(line.c_str(),"ADC%d",&i)>0) {
|
|
||||||
adcs->setAdcAlias(line);
|
|
||||||
// cout << "---------" << line<< endl;
|
|
||||||
} // else
|
|
||||||
// cout << "<<<<<<<" << line << endl;
|
|
||||||
else if (sscanf(line.c_str(),"PAT%s",aaaa)>0) {
|
|
||||||
pat->setPatternAlias(line);
|
|
||||||
// cout << "---------" << line<< endl;
|
|
||||||
} else if (sscanf(line.c_str(),"V%s",aaaa)>0) {
|
|
||||||
if (pwrs) pwrs->setPwrAlias(line);
|
|
||||||
// cout << "+++++++++" << line<< endl;
|
|
||||||
} else if (sscanf(line.c_str(),"SENSE%d",&i)>0) {
|
|
||||||
if (senses) senses->setSlowAdcAlias(line);
|
|
||||||
// cout << "+++++++++" << line<< endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
myfile.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
else cout << "Unable to open file";
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int ctbMain::saveAlias(string fname) {
|
|
||||||
|
|
||||||
|
|
||||||
string line;
|
|
||||||
ofstream myfile (fname.c_str());
|
|
||||||
if (myfile.is_open())
|
|
||||||
{
|
|
||||||
//while ( getline (myfile,line) )
|
|
||||||
// {
|
|
||||||
// cout << line ;
|
|
||||||
//if (sscanf(line.c_str(),"BIT%d",&i)>0) {
|
|
||||||
//cout << "*******" << line<< endl;
|
|
||||||
myfile << sig->getSignalAlias();
|
|
||||||
// cout << line ;
|
|
||||||
// } else if (sscanf(line.c_str(),"DAC%d",&i)>0) {
|
|
||||||
myfile << dacs->getDacAlias();
|
|
||||||
if (pwrs) myfile << pwrs->getPwrAlias();
|
|
||||||
if (senses) myfile << senses->getSlowAdcAlias();
|
|
||||||
// cout << "+++++++++" << line<< endl;
|
|
||||||
// } else if (sscanf(line.c_str(),"ADC%d",&i)>0) {
|
|
||||||
myfile << adcs->getAdcAlias();
|
|
||||||
// cout << "---------" << line<< endl;
|
|
||||||
// } // else
|
|
||||||
// cout << "<<<<<<<" << line << endl;
|
|
||||||
myfile << pat->getPatternAlias();
|
|
||||||
|
|
||||||
//}
|
|
||||||
myfile.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
else cout << "Unable to open file";
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void ctbMain::tabSelected(Int_t i) {
|
|
||||||
|
|
||||||
// cout << "Selected tab " << i << endl;
|
|
||||||
// cout << "Current tab is " << mtab->GetCurrent() << endl;
|
|
||||||
|
|
||||||
if (i==i_dacs) dacs->update();
|
|
||||||
else if (i==i_pwrs) pwrs->update();
|
|
||||||
else if (i==i_senses) ;//senses->update();
|
|
||||||
else if (i==i_sig) sig->update();
|
|
||||||
else if (i==i_adcs) adcs->update();
|
|
||||||
else if (i==i_pat) pat->update();
|
|
||||||
else if (i==i_acq) acq->update();
|
|
||||||
else if (i==i_acq) acq->update();
|
|
||||||
// else if (i==i_actions) actions->update();
|
|
||||||
else cout << "Unknown tab " << i << endl;
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void ctbMain::setPatternFile(const char* t) {
|
|
||||||
acq->setPatternFile(t);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void ctbMain::setPatternCompiler(const char* t) {
|
|
||||||
acq->setPatternCompiler(t);
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void ctbMain::setAnalogSamples(const int n) {
|
|
||||||
acq->setAnalogSamples(n);
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void ctbMain::setDigitalSamples(const int n) {
|
|
||||||
acq->setDigitalSamples(n);
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void ctbMain::setReadoutMode(int flags) {
|
|
||||||
acq->setReadoutMode(flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ctbMain::setADCEnable(Int_t reg){
|
|
||||||
acq->setADCEnable(reg);
|
|
||||||
}
|
|
||||||
130
ctbGui/ctbMain.h
@@ -1,130 +0,0 @@
|
|||||||
// SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
#ifndef CTBMAIN_H
|
|
||||||
#define CTBMAIN_H
|
|
||||||
#include <TGFrame.h>
|
|
||||||
|
|
||||||
|
|
||||||
class TRootEmbeddedCanvas;
|
|
||||||
class TGButtonGroup;
|
|
||||||
class TGVerticalFrame;
|
|
||||||
class TGHorizontalFrame;
|
|
||||||
class TGTextEntry;
|
|
||||||
class TGLabel;
|
|
||||||
class TGNumberEntry;
|
|
||||||
class TH2F;
|
|
||||||
class TGComboBox;
|
|
||||||
class TGCheckButton;
|
|
||||||
|
|
||||||
class THStack;
|
|
||||||
class TGraphErrors;
|
|
||||||
class TGTextButton;
|
|
||||||
class TGTab;
|
|
||||||
|
|
||||||
class TGMenuBar;
|
|
||||||
class TGPopupMenu;
|
|
||||||
class TGDockableFrame;
|
|
||||||
class TGLayoutHints;
|
|
||||||
class TGCanvas;
|
|
||||||
class TCanvas;
|
|
||||||
|
|
||||||
class ctbDacs;
|
|
||||||
class ctbSlowAdcs;
|
|
||||||
class ctbPowers;
|
|
||||||
|
|
||||||
|
|
||||||
class ctbSignals;
|
|
||||||
|
|
||||||
namespace sls
|
|
||||||
{
|
|
||||||
class Detector;
|
|
||||||
};
|
|
||||||
|
|
||||||
class ctbPattern;
|
|
||||||
class ctbAdcs;
|
|
||||||
class ctbAcquisition;
|
|
||||||
//class ctbActions;
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
class ctbMain : public TGMainFrame {
|
|
||||||
private:
|
|
||||||
|
|
||||||
|
|
||||||
sls::Detector *myDet;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
TRootEmbeddedCanvas *fEcanvas;
|
|
||||||
TRootEmbeddedCanvas *fModulecanvas;
|
|
||||||
TGButtonGroup *br;
|
|
||||||
|
|
||||||
TGTab *mtab;
|
|
||||||
|
|
||||||
|
|
||||||
ctbDacs *dacs;
|
|
||||||
int i_dacs;
|
|
||||||
|
|
||||||
ctbPowers *pwrs;
|
|
||||||
int i_pwrs;
|
|
||||||
|
|
||||||
ctbSlowAdcs *senses;
|
|
||||||
int i_senses;
|
|
||||||
|
|
||||||
|
|
||||||
ctbSignals *sig;
|
|
||||||
int i_sig;
|
|
||||||
|
|
||||||
|
|
||||||
ctbAdcs *adcs;
|
|
||||||
int i_adcs;
|
|
||||||
|
|
||||||
|
|
||||||
ctbPattern *pat;
|
|
||||||
int i_pat;
|
|
||||||
|
|
||||||
ctbAcquisition *acq;
|
|
||||||
int i_acq;
|
|
||||||
|
|
||||||
// ctbActions *actions;
|
|
||||||
int i_actions;
|
|
||||||
|
|
||||||
TGDockableFrame *fMenuDock;
|
|
||||||
|
|
||||||
TGMenuBar *fMenuBar;
|
|
||||||
TGPopupMenu *fMenuFile, *fMenuTest, *fMenuView, *fMenuHelp;
|
|
||||||
TGPopupMenu *fCascadeMenu, *fCascade1Menu, *fCascade2Menu;
|
|
||||||
TGPopupMenu *fMenuNew1, *fMenuNew2;
|
|
||||||
TGLayoutHints *fMenuBarLayout, *fMenuBarItemLayout, *fMenuBarHelpLayout;
|
|
||||||
TGCanvas *myCanvas;
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
|
||||||
ctbMain(const TGWindow *p, sls::Detector *det);
|
|
||||||
|
|
||||||
|
|
||||||
int loadAlias(string fname);
|
|
||||||
int saveAlias(string fname);
|
|
||||||
void loadParameters(string fname);
|
|
||||||
void savePattern(string fname);
|
|
||||||
void loadConfiguration(string fname);
|
|
||||||
void tabSelected(Int_t);
|
|
||||||
int setADCPlot(Int_t);
|
|
||||||
int setSignalPlot(Int_t);
|
|
||||||
void CloseWindow();
|
|
||||||
|
|
||||||
void setPatternFile(const char* t);
|
|
||||||
|
|
||||||
void setPatternCompiler(const char* t);
|
|
||||||
void setAnalogSamples(const int);
|
|
||||||
void setDigitalSamples(const int);
|
|
||||||
void setReadoutMode(int);
|
|
||||||
void setADCEnable(Int_t);
|
|
||||||
|
|
||||||
void HandleMenu(Int_t);
|
|
||||||
TCanvas* getCanvas();
|
|
||||||
ClassDef(ctbMain,0)
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,181 +0,0 @@
|
|||||||
// SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
#ifndef CTBPATTERN_H
|
|
||||||
#define CTBPATTERN_H
|
|
||||||
#include <TGFrame.h>
|
|
||||||
|
|
||||||
|
|
||||||
#define NLOOPS 3
|
|
||||||
#define NWAITS 3
|
|
||||||
#define NADCS 32
|
|
||||||
#define PATLEN 1024
|
|
||||||
|
|
||||||
class TRootEmbeddedCanvas;
|
|
||||||
class TGButtonGroup;
|
|
||||||
class TGVerticalFrame;
|
|
||||||
class TGHorizontalFrame;
|
|
||||||
class TGTextEntry;
|
|
||||||
class TGLabel;
|
|
||||||
class TGNumberEntry;
|
|
||||||
class TH2F;
|
|
||||||
class TGComboBox;
|
|
||||||
class TGCheckButton;
|
|
||||||
class TGTextEntry;
|
|
||||||
class TGCheckButton;
|
|
||||||
|
|
||||||
class THStack;
|
|
||||||
class TGraphErrors;
|
|
||||||
class energyCalibration;
|
|
||||||
class TGTextButton;
|
|
||||||
class TGTab;
|
|
||||||
|
|
||||||
namespace sls
|
|
||||||
{
|
|
||||||
class Detector;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class ctbLoop : public TGHorizontalFrame {
|
|
||||||
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
TGNumberEntry *eLoopStartAddr;
|
|
||||||
TGNumberEntry *eLoopStopAddr;
|
|
||||||
TGNumberEntry *eLoopNumber;
|
|
||||||
|
|
||||||
int id;
|
|
||||||
|
|
||||||
sls::Detector *myDet;
|
|
||||||
|
|
||||||
public:
|
|
||||||
ctbLoop(TGGroupFrame *page, int i,sls::Detector *det);
|
|
||||||
|
|
||||||
void setNLoops();
|
|
||||||
void update();
|
|
||||||
|
|
||||||
ClassDef(ctbLoop,0)
|
|
||||||
};
|
|
||||||
|
|
||||||
class ctbWait : public TGHorizontalFrame {
|
|
||||||
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
TGNumberEntry *eWaitAddr;
|
|
||||||
TGNumberEntry *eWaitTime;
|
|
||||||
|
|
||||||
int id;
|
|
||||||
|
|
||||||
sls::Detector *myDet;
|
|
||||||
|
|
||||||
public:
|
|
||||||
ctbWait(TGGroupFrame *page, int i,sls::Detector *det);
|
|
||||||
|
|
||||||
void setWaitTime();
|
|
||||||
void update();
|
|
||||||
|
|
||||||
ClassDef(ctbWait,0)
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class ctbPattern : public TGGroupFrame {
|
|
||||||
private:
|
|
||||||
|
|
||||||
|
|
||||||
TGNumberEntry *eAdcClkFreq;
|
|
||||||
TGNumberEntry *eRunClkFreq;
|
|
||||||
TGNumberEntry *eDBitClkFreq;
|
|
||||||
TGNumberEntry *eAdcClkPhase;
|
|
||||||
TGNumberEntry *eDBitClkPhase;
|
|
||||||
//TGNumberEntry *eRunClkPhase;
|
|
||||||
|
|
||||||
TGNumberEntry *eStartAddr;
|
|
||||||
TGNumberEntry *eStopAddr;
|
|
||||||
TGNumberEntry *eFrames;
|
|
||||||
TGNumberEntry *ePeriod;
|
|
||||||
TGNumberEntry *eTriggers;
|
|
||||||
// TGNumberEntry *eMeasurements;
|
|
||||||
TGNumberEntry *eAdcPipeline;
|
|
||||||
TGNumberEntry *eDBitPipeline;
|
|
||||||
|
|
||||||
ctbLoop *eLoop[NLOOPS];
|
|
||||||
ctbWait *eWait[NWAITS];
|
|
||||||
|
|
||||||
TGTextEntry *patternCompiler;
|
|
||||||
TGTextEntry *patternFile;
|
|
||||||
|
|
||||||
TGTextButton *browseCompiler;
|
|
||||||
TGTextButton *browseFile;
|
|
||||||
|
|
||||||
|
|
||||||
TGNumberEntry *eAnalogSamples;
|
|
||||||
TGNumberEntry *eDigitalSamples;
|
|
||||||
|
|
||||||
TGCheckButton *cbAnalog;
|
|
||||||
TGCheckButton *cbDigital;
|
|
||||||
|
|
||||||
char pat[PATLEN*8];
|
|
||||||
|
|
||||||
sls::Detector *myDet;
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
ctbPattern(TGVerticalFrame *page, sls::Detector *det);
|
|
||||||
|
|
||||||
void update();
|
|
||||||
void setAdcFreq();
|
|
||||||
void setRunFreq();
|
|
||||||
void setDBitFreq();
|
|
||||||
void setAdcPhase();
|
|
||||||
void setDBitPhase();
|
|
||||||
// void setRunPhase();
|
|
||||||
void setAdcPipeline();
|
|
||||||
void setDBitPipeline();
|
|
||||||
void setFrames();
|
|
||||||
void setTriggers();
|
|
||||||
// void setMeasurements();
|
|
||||||
void setPeriod();
|
|
||||||
|
|
||||||
|
|
||||||
void chooseCompiler();
|
|
||||||
void choosePattern();
|
|
||||||
|
|
||||||
string getCompiler();
|
|
||||||
string getPatternFile();
|
|
||||||
|
|
||||||
void setPatternAlias(string);
|
|
||||||
string getPatternAlias();
|
|
||||||
|
|
||||||
|
|
||||||
int getAnalogSamples();
|
|
||||||
void setAnalogSamples();
|
|
||||||
int getDigitalSamples();
|
|
||||||
void setDigitalSamples();
|
|
||||||
void setReadoutMode(Bool_t);
|
|
||||||
int getReadoutMode();
|
|
||||||
|
|
||||||
|
|
||||||
void setFile();
|
|
||||||
void setCompiler();
|
|
||||||
void patternFileChanged(const char*);
|
|
||||||
void patternCompilerChanged(const char*);
|
|
||||||
void analogSamplesChanged(const int t);
|
|
||||||
void digitalSamplesChanged(const int t);
|
|
||||||
void readoutModeChanged(int);
|
|
||||||
|
|
||||||
|
|
||||||
ClassDef(ctbPattern,0)
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,225 +0,0 @@
|
|||||||
// SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
#include <TGFrame.h>
|
|
||||||
|
|
||||||
|
|
||||||
#include <TGButtonGroup.h>
|
|
||||||
#include <TGNumberEntry.h>
|
|
||||||
#include <TGLabel.h>
|
|
||||||
#include <TList.h>
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <iostream>
|
|
||||||
#include <fstream>
|
|
||||||
|
|
||||||
#include "ctbDefs.h"
|
|
||||||
#include "ctbDacs.h"
|
|
||||||
#include "ctbPowers.h"
|
|
||||||
#include "sls/Detector.h"
|
|
||||||
#include "sls/sls_detector_defs.h"
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ctbPower::ctbPower(TGGroupFrame* f, int i, sls::Detector* d)
|
|
||||||
: ctbDac(f, i, d)
|
|
||||||
{
|
|
||||||
cout << "****************************************************************power " << i << endl;
|
|
||||||
dacsUnit->SetOn(kTRUE);
|
|
||||||
dacsUnit->SetEnabled(kFALSE);
|
|
||||||
|
|
||||||
switch(i) {
|
|
||||||
case slsDetectorDefs::V_POWER_IO:
|
|
||||||
dacsLabel->SetText("VIO");
|
|
||||||
break;
|
|
||||||
case slsDetectorDefs::V_POWER_A:
|
|
||||||
dacsLabel->SetText("VA");
|
|
||||||
break;
|
|
||||||
case slsDetectorDefs::V_POWER_B:
|
|
||||||
dacsLabel->SetText("VB");
|
|
||||||
break;
|
|
||||||
case slsDetectorDefs::V_POWER_C:
|
|
||||||
dacsLabel->SetText("VC");
|
|
||||||
break;
|
|
||||||
case slsDetectorDefs::V_POWER_D:
|
|
||||||
dacsLabel->SetText("VD");
|
|
||||||
break;
|
|
||||||
case slsDetectorDefs::V_POWER_CHIP:
|
|
||||||
dacsLabel->SetText("VCHIP");
|
|
||||||
dacsLabel->SetEnabled(kFALSE);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
dacsLabel->SetText("Bad index");
|
|
||||||
break;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
TGTextEntry *e=dacsEntry->TGNumberEntry::GetNumberEntry();
|
|
||||||
e->Disconnect ("ReturnPressed()");
|
|
||||||
e->Disconnect ("ValueSet(Long_t)");
|
|
||||||
|
|
||||||
e->Connect("ReturnPressed()","ctbPower",this,"setValue()");
|
|
||||||
dacsEntry->Connect("ValueSet(Long_t)","ctbPower",this,"setValue(Long_t)");
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
string ctbPower::getLabel() {
|
|
||||||
|
|
||||||
ostringstream line;
|
|
||||||
switch (id) {
|
|
||||||
case slsDetectorDefs::V_POWER_IO:
|
|
||||||
line << "VIO";
|
|
||||||
break;
|
|
||||||
case slsDetectorDefs::V_POWER_A:
|
|
||||||
line << "VA";
|
|
||||||
break;
|
|
||||||
case slsDetectorDefs::V_POWER_B:
|
|
||||||
line << "VB";
|
|
||||||
break;
|
|
||||||
case slsDetectorDefs::V_POWER_C:
|
|
||||||
line << "VC";
|
|
||||||
break;
|
|
||||||
case slsDetectorDefs::V_POWER_D:
|
|
||||||
line << "VD";
|
|
||||||
break;
|
|
||||||
case slsDetectorDefs::V_POWER_CHIP:
|
|
||||||
line << "VCHIP";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
line << "VBAD";
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
|
||||||
line << " " << dacsLabel->GetText() << endl;
|
|
||||||
return line.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ctbPower::setValue(Long_t a) {ctbPower::setValue();}
|
|
||||||
|
|
||||||
void ctbPower::setValue() {
|
|
||||||
cout << "***************************Setting power " << dacsEntry->GetIntNumber() << " " << id << " " << 1 << endl;
|
|
||||||
|
|
||||||
try {
|
|
||||||
myDet->setVoltage(static_cast<slsDetectorDefs::dacIndex>(id), dacsEntry->GetIntNumber());
|
|
||||||
} CATCH_DISPLAY ("Could not set power " + to_string(id) + ".", "ctbPower::setValue")
|
|
||||||
|
|
||||||
getValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int ctbPower::getValue() {
|
|
||||||
try {
|
|
||||||
|
|
||||||
int val = myDet->getVoltage(static_cast<slsDetectorDefs::dacIndex>(id)).tsquash("Different values");
|
|
||||||
cout << "****************************Getting power " << val << " " << id << " " << 1 << endl;
|
|
||||||
|
|
||||||
dacsValue->SetText(to_string(val).c_str());
|
|
||||||
if (val > 0) {
|
|
||||||
if (id != static_cast<int>(slsDetectorDefs::V_POWER_CHIP))
|
|
||||||
dacsLabel->SetOn(kTRUE);
|
|
||||||
} else {
|
|
||||||
dacsLabel->SetOn(kFALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
return val;
|
|
||||||
|
|
||||||
} CATCH_DISPLAY ("Could not get power " + to_string(id) + ".", "ctbPower::getValue")
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ctbPowers::ctbPowers(TGVerticalFrame* page, sls::Detector* det) : TGGroupFrame(page,"Power Supplies",kVerticalFrame) , myDet(det){
|
|
||||||
|
|
||||||
|
|
||||||
SetTitlePos(TGGroupFrame::kLeft);
|
|
||||||
page->AddFrame(this,new TGLayoutHints( kLHintsTop | kLHintsExpandX , 10,10,10,10));
|
|
||||||
MapWindow();
|
|
||||||
|
|
||||||
// cout << "window mapped " << endl;
|
|
||||||
|
|
||||||
for (int idac=0; idac<NPOWERS; idac++) {
|
|
||||||
dacs[idac]=new ctbPower(this, slsDetectorDefs::V_POWER_A+idac, myDet);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int ctbPowers::setPwrAlias(string line) {
|
|
||||||
|
|
||||||
int is=-1;
|
|
||||||
char tit[100];
|
|
||||||
|
|
||||||
if (sscanf(line.c_str(),"VA %s",tit)) {
|
|
||||||
dacs[0]->setLabel(tit,1);
|
|
||||||
is=0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sscanf(line.c_str(),"VB %s",tit)) {
|
|
||||||
dacs[1]->setLabel(tit,1);
|
|
||||||
is=1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sscanf(line.c_str(),"VC %s",tit)) {
|
|
||||||
dacs[2]->setLabel(tit,1);
|
|
||||||
is=2;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sscanf(line.c_str(),"VD %s",tit)) {
|
|
||||||
dacs[3]->setLabel(tit,1);
|
|
||||||
is=3;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sscanf(line.c_str(),"VIO %s",tit)) {
|
|
||||||
dacs[4]->setLabel(tit,1);
|
|
||||||
is=4;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sscanf(line.c_str(),"VCHIP %s",tit)) {
|
|
||||||
dacs[5]->setLabel(tit,1);
|
|
||||||
is=5;
|
|
||||||
}
|
|
||||||
|
|
||||||
return is;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
string ctbPowers::getPwrAlias() {
|
|
||||||
|
|
||||||
ostringstream line;
|
|
||||||
|
|
||||||
for (int i=0; i<NPOWERS; i++)
|
|
||||||
line << dacs[i]->getLabel() << endl;
|
|
||||||
return line.str();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
string ctbPowers::getPwrParameters() {
|
|
||||||
|
|
||||||
ostringstream line;
|
|
||||||
line << "v_a" << " " << dacs[0]->getValue() << " mv" << endl;
|
|
||||||
line << "v_b" << " " << dacs[1]->getValue() << " mv" << endl;
|
|
||||||
line << "v_c" << " " << dacs[2]->getValue() << " mv" << endl;
|
|
||||||
line << "v_d" << " " << dacs[3]->getValue() << " mv" << endl;
|
|
||||||
line << "v_io" << " " << dacs[4]->getValue() << " mv" << endl;
|
|
||||||
line << "v_chip" << " " << dacs[5]->getValue() << " mv" << endl;
|
|
||||||
// for (int i=0; i<POWERS; i++) {
|
|
||||||
// //line << "dacs:" << i << " " << dacs[i]->getValue << endl;
|
|
||||||
// line << "dac:" << i << " " << dacs[i]->getValue() << endl;
|
|
||||||
// }
|
|
||||||
return line.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void ctbPowers::update() {
|
|
||||||
for (int idac=0; idac<NPOWERS; idac++) {
|
|
||||||
dacs[idac]->getValue();
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,69 +0,0 @@
|
|||||||
// SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
#ifndef CTBPOWERS_H
|
|
||||||
#define CTBPOWERS_H
|
|
||||||
|
|
||||||
#include <TGFrame.h>
|
|
||||||
|
|
||||||
#define NPOWERS 6
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class TGTextEntry;
|
|
||||||
class TGLabel;
|
|
||||||
class TGNumberEntry;
|
|
||||||
class TGCheckButton;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
namespace sls
|
|
||||||
{
|
|
||||||
class Detector;
|
|
||||||
};
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
|
|
||||||
class ctbPower : public ctbDac {
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
ctbPower(TGGroupFrame* f, int i, sls::Detector* d);
|
|
||||||
|
|
||||||
string getLabel();
|
|
||||||
|
|
||||||
int getValue();
|
|
||||||
void setValue();
|
|
||||||
void setValue(Long_t);
|
|
||||||
|
|
||||||
ClassDef(ctbPower,0)
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
class ctbPowers : public TGGroupFrame
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
|
|
||||||
ctbPower *dacs[NPOWERS];
|
|
||||||
|
|
||||||
sls::Detector* myDet;
|
|
||||||
|
|
||||||
public:
|
|
||||||
//ctbPowers();
|
|
||||||
ctbPowers(TGVerticalFrame*, sls::Detector*);
|
|
||||||
|
|
||||||
int setPwrAlias(string);
|
|
||||||
string getPwrAlias();
|
|
||||||
string getPwrParameters();
|
|
||||||
|
|
||||||
void update();
|
|
||||||
|
|
||||||
ClassDef(ctbPowers,0)
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,543 +0,0 @@
|
|||||||
// SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
#include <TApplication.h>
|
|
||||||
#include <TGClient.h>
|
|
||||||
#include <TCanvas.h>
|
|
||||||
#include <TF1.h>
|
|
||||||
#include <TRandom.h>
|
|
||||||
#include <TGButton.h>
|
|
||||||
#include <TRootEmbeddedCanvas.h>
|
|
||||||
#include <TGButtonGroup.h>
|
|
||||||
#include <TGNumberEntry.h>
|
|
||||||
#include <TGLabel.h>
|
|
||||||
#include <TList.h>
|
|
||||||
#include <TGFileDialog.h>
|
|
||||||
#include <TGComboBox.h>
|
|
||||||
#include <TH2F.h>
|
|
||||||
#include <TColor.h>
|
|
||||||
#include <TH1F.h>
|
|
||||||
#include <TGraphErrors.h>
|
|
||||||
#include <THStack.h>
|
|
||||||
#include <TGTab.h>
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <iostream>
|
|
||||||
#include <fstream>
|
|
||||||
#include <TGButton.h>
|
|
||||||
#include <TRootEmbeddedCanvas.h>
|
|
||||||
#include <TGButtonGroup.h>
|
|
||||||
#include <TGNumberEntry.h>
|
|
||||||
#include <TGLabel.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <iostream>
|
|
||||||
#include <fstream>
|
|
||||||
#include <TColor.h>
|
|
||||||
#include <TGColorSelect.h>
|
|
||||||
|
|
||||||
|
|
||||||
#include "ctbSignals.h"
|
|
||||||
#include "ctbDefs.h"
|
|
||||||
#include "sls/Detector.h"
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//#define DEFAULTFN "run_0.encal"
|
|
||||||
|
|
||||||
|
|
||||||
ctbSignal::ctbSignal(TGFrame *page, int i, sls::Detector *det)
|
|
||||||
: TGHorizontalFrame(page, 800,50), myDet(det), id(i), hsig(NULL) {
|
|
||||||
|
|
||||||
|
|
||||||
TGHorizontalFrame *hframe=this;
|
|
||||||
char tit[100];
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
sprintf(tit, "BIT%d ",id);
|
|
||||||
|
|
||||||
sLabel= new TGLabel(hframe, tit);
|
|
||||||
hframe->AddFrame( sLabel,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 1, 1, 1, 1));
|
|
||||||
sLabel->MapWindow();
|
|
||||||
sLabel->SetTextJustify(kTextLeft);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
sOutput= new TGCheckButton(hframe, "Out");
|
|
||||||
hframe->AddFrame( sOutput,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 1, 1, 1, 1));
|
|
||||||
sOutput->MapWindow();
|
|
||||||
|
|
||||||
|
|
||||||
sOutput->Connect("Toggled(Bool_t)","ctbSignal",this,"ToggledOutput(Bool_t)");
|
|
||||||
|
|
||||||
sDbitList= new TGCheckButton(hframe, "DB List");
|
|
||||||
hframe->AddFrame( sDbitList,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 1, 1, 1, 1));
|
|
||||||
sDbitList->MapWindow();
|
|
||||||
|
|
||||||
sDbitList->Connect("Toggled(Bool_t)","ctbSignal",this,"ToggledDbitList(Bool_t)");
|
|
||||||
|
|
||||||
|
|
||||||
sPlot= new TGCheckButton(hframe, "Plot");
|
|
||||||
hframe->AddFrame( sPlot,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 1, 1, 1, 1));
|
|
||||||
sPlot->MapWindow();
|
|
||||||
|
|
||||||
sPlot->Connect("Toggled(Bool_t)","ctbSignal",this,"ToggledPlot(Bool_t)");
|
|
||||||
|
|
||||||
fColorSel = new TGColorSelect(hframe, id+1, 0);
|
|
||||||
fColorSel->Connect("ColorSelected(Pixel_t)","ctbSignal",this,"ColorChanged(Pixel_t)");
|
|
||||||
hframe->AddFrame(fColorSel, new TGLayoutHints(kLHintsTop |
|
|
||||||
kLHintsLeft, 2, 0, 2, 2));
|
|
||||||
|
|
||||||
|
|
||||||
fColorSel->SetColor(TColor::Number2Pixel(id+1));
|
|
||||||
|
|
||||||
|
|
||||||
ToggledOutput(kFALSE);
|
|
||||||
|
|
||||||
|
|
||||||
ToggledPlot(kFALSE);
|
|
||||||
|
|
||||||
// if (id==63) {
|
|
||||||
// sOutput->SetOn(kTRUE);
|
|
||||||
// sOutput->SetEnabled(kFALSE);
|
|
||||||
// }
|
|
||||||
// #ifdef CTB
|
|
||||||
// if (id==62) {
|
|
||||||
// sOutput->SetOn(kTRUE);
|
|
||||||
// sOutput->SetEnabled(kFALSE);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// // if (id>=32 && id<48)
|
|
||||||
// // fixOutput(1);
|
|
||||||
// // else if (id>=48 && id<64)
|
|
||||||
// // fixOutput(0);
|
|
||||||
|
|
||||||
// #endif
|
|
||||||
}
|
|
||||||
int ctbSignal::setSignalAlias(char *tit, int plot, int col) {
|
|
||||||
|
|
||||||
if (tit)
|
|
||||||
sLabel->SetText(tit);
|
|
||||||
|
|
||||||
if (plot>0) {
|
|
||||||
sPlot->SetOn(kTRUE,kTRUE);
|
|
||||||
} else if (plot==0)
|
|
||||||
sPlot->SetOn(kFALSE,kTRUE);
|
|
||||||
|
|
||||||
if (col>=0)
|
|
||||||
fColorSel->SetColor(col);//TColor::Number2Pixel(col+1));
|
|
||||||
|
|
||||||
fColorSel->SetEnabled(sPlot->IsOn());
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
string ctbSignal::getSignalAlias() {
|
|
||||||
|
|
||||||
|
|
||||||
ostringstream oss;
|
|
||||||
oss << "BIT" << dec << id << " " << sLabel->GetText()->Data() << " " << sPlot->IsOn() << hex << " " << fColorSel->GetColor() << endl;
|
|
||||||
return oss.str();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
int ctbSignal::setOutput(Long64_t r) {
|
|
||||||
|
|
||||||
|
|
||||||
// cout << hex << r << dec <<endl;
|
|
||||||
|
|
||||||
Long64_t mask=((Long64_t)1<<id);
|
|
||||||
|
|
||||||
if (r&mask)
|
|
||||||
sOutput->SetOn(kTRUE,kTRUE);
|
|
||||||
else
|
|
||||||
sOutput->SetOn(kFALSE,kTRUE);
|
|
||||||
|
|
||||||
return sOutput->IsOn();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
int ctbSignal::fixOutput(int i) {
|
|
||||||
|
|
||||||
if (i) {
|
|
||||||
sPlot->SetOn(kFALSE);
|
|
||||||
//sClock->SetOn(kFALSE,kTRUE);
|
|
||||||
sOutput->SetOn(kTRUE);
|
|
||||||
// sPlot->SetEnabled(kFALSE);
|
|
||||||
// sClock->SetEnabled(kTRUE);
|
|
||||||
} else {
|
|
||||||
sOutput->SetOn(kFALSE,kTRUE);
|
|
||||||
// sClock->SetOn(kFALSE);
|
|
||||||
// sClock->SetEnabled(kFALSE);
|
|
||||||
sPlot->SetEnabled(kTRUE);
|
|
||||||
}
|
|
||||||
sOutput->SetEnabled(kFALSE);
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
int ctbSignal::setDbitList(Long64_t r) {
|
|
||||||
|
|
||||||
if (r)
|
|
||||||
sDbitList->SetOn(kTRUE,kFALSE);
|
|
||||||
else
|
|
||||||
sDbitList->SetOn(kFALSE,kFALSE);
|
|
||||||
|
|
||||||
return sDbitList->IsOn();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
int ctbSignal::isDbitList() { return sDbitList->IsOn();}
|
|
||||||
int ctbSignal::isOutput() { return sOutput->IsOn();}
|
|
||||||
int ctbSignal::isPlot() { return sPlot->IsOn();}
|
|
||||||
Pixel_t ctbSignal::getColor(){return fColorSel->GetColor();}
|
|
||||||
|
|
||||||
void ctbSignal::ToggledOutput(Bool_t b) {
|
|
||||||
ToggledSignalOutput(id);
|
|
||||||
if (b) {
|
|
||||||
// sClock->SetEnabled(kTRUE);
|
|
||||||
sPlot->SetOn(kFALSE);
|
|
||||||
// sPlot->SetEnabled(kFALSE);
|
|
||||||
fColorSel->SetEnabled(kFALSE);
|
|
||||||
} else {
|
|
||||||
// sClock->SetEnabled(kFALSE);
|
|
||||||
// sClock->SetOn(kFALSE);
|
|
||||||
sPlot->SetEnabled(kTRUE);
|
|
||||||
if ( sPlot->IsOn())
|
|
||||||
fColorSel->SetEnabled(kFALSE);
|
|
||||||
else
|
|
||||||
fColorSel->SetEnabled(kTRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void ctbSignal::ToggledDbitList(Bool_t b){
|
|
||||||
Long_t mask=id;
|
|
||||||
ToggledSignalDbitList(mask);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void ctbSignal::ToggledPlot(Bool_t b){
|
|
||||||
Long_t mask=b<<id;
|
|
||||||
ToggledSignalPlot(mask);
|
|
||||||
fColorSel->SetEnabled(b);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ctbSignal::ColorChanged(Pixel_t p){
|
|
||||||
ToggledSignalPlot(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void ctbSignal::ToggledSignalOutput(Int_t b) {
|
|
||||||
cout << "Toggle signal " << id << " " << b << " " << sOutput->IsOn() <<endl;;
|
|
||||||
Emit("ToggledSignalOutput(Int_t)", id);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ctbSignal::ToggledSignalDbitList(Int_t b){
|
|
||||||
cout << "Toggle dbitlist " << id << " " << b << endl;;
|
|
||||||
Emit("ToggledSignalDbitList(Int_t)", id);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ctbSignal::ToggledSignalPlot(Int_t b){
|
|
||||||
Emit("ToggledSignalPlot(Int_t)", id);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ctbSignals::ctbSignals(TGVerticalFrame *page, sls::Detector *det)
|
|
||||||
: TGGroupFrame(page,"IO Signals",kVerticalFrame), myDet(det) {
|
|
||||||
|
|
||||||
|
|
||||||
SetTitlePos(TGGroupFrame::kLeft);
|
|
||||||
page->AddFrame(this,new TGLayoutHints( kLHintsTop | kLHintsExpandX , 10,10,10,10));
|
|
||||||
MapWindow();
|
|
||||||
|
|
||||||
|
|
||||||
TGHorizontalFrame *hframe;
|
|
||||||
|
|
||||||
TGHorizontalFrame* hhframe=new TGHorizontalFrame(this, 800,800);
|
|
||||||
AddFrame(hhframe,new TGLayoutHints(kLHintsTop | kLHintsExpandX , 1,1,1,1));
|
|
||||||
hhframe->MapWindow();
|
|
||||||
|
|
||||||
TGVerticalFrame *vframe;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int idac=0;
|
|
||||||
for (idac=0; idac<NSIGNALS; idac++) {
|
|
||||||
if (idac%((NSIGNALS+2)/2)==0) {
|
|
||||||
vframe=new TGVerticalFrame(hhframe, 400,800);
|
|
||||||
hhframe->AddFrame(vframe,new TGLayoutHints(kLHintsTop | kLHintsExpandX , 1,1,1,1));
|
|
||||||
vframe->MapWindow();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
signals[idac]=new ctbSignal(vframe,idac,myDet);
|
|
||||||
signals[idac]->Connect("ToggledSignalOutput(Int_t)","ctbSignals",this,"ToggledOutReg(Int_t)");
|
|
||||||
signals[idac]->Connect("ToggledSignalDbitList(Int_t)","ctbSignals",this,"ToggledDbitList(Int_t)");
|
|
||||||
signals[idac]->Connect("ToggledSignalPlot(Int_t)","ctbSignals",this,"ToggledPlot(Int_t)");
|
|
||||||
|
|
||||||
vframe->AddFrame(signals[idac],new TGLayoutHints(kLHintsTop | kLHintsExpandX , 1,1,1,1));
|
|
||||||
signals[idac]->MapWindow();
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
hframe=new TGHorizontalFrame(vframe, 800,50);
|
|
||||||
vframe->AddFrame(hframe,new TGLayoutHints(kLHintsTop | kLHintsExpandX , 1,1,1,1));
|
|
||||||
hframe->MapWindow();
|
|
||||||
|
|
||||||
|
|
||||||
TGLabel *label= new TGLabel(hframe, "IO Control Register: ");
|
|
||||||
hframe->AddFrame(label,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 1, 1, 1, 1));
|
|
||||||
label->MapWindow();
|
|
||||||
label->SetTextJustify(kTextLeft);
|
|
||||||
|
|
||||||
|
|
||||||
eIOCntrlRegister = new TGNumberEntry(hframe, 0, 16,999, TGNumberFormat::kNESHex,
|
|
||||||
TGNumberFormat::kNEANonNegative,
|
|
||||||
TGNumberFormat::kNELNoLimits);
|
|
||||||
|
|
||||||
hframe->AddFrame(eIOCntrlRegister,new TGLayoutHints(kLHintsTop | kLHintsExpandX, 1, 1, 1, 1));
|
|
||||||
eIOCntrlRegister->MapWindow();
|
|
||||||
eIOCntrlRegister->Resize(150,30);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
hframe=new TGHorizontalFrame(vframe, 800,50);
|
|
||||||
vframe->AddFrame(hframe,new TGLayoutHints(kLHintsTop | kLHintsExpandX , 1,1,1,1));
|
|
||||||
hframe->MapWindow();
|
|
||||||
|
|
||||||
|
|
||||||
label= new TGLabel(hframe, "DBit Offset: ");
|
|
||||||
hframe->AddFrame(label,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 1, 1, 1, 1));
|
|
||||||
label->MapWindow();
|
|
||||||
label->SetTextJustify(kTextLeft);
|
|
||||||
|
|
||||||
|
|
||||||
eDbitOffset = new TGNumberEntry(hframe, 0, 9,999, TGNumberFormat::kNESInteger,
|
|
||||||
TGNumberFormat::kNEANonNegative,
|
|
||||||
TGNumberFormat::kNELNoLimits);
|
|
||||||
|
|
||||||
hframe->AddFrame(eDbitOffset,new TGLayoutHints(kLHintsTop | kLHintsExpandX, 1, 1, 1, 1));
|
|
||||||
eDbitOffset->MapWindow();
|
|
||||||
eDbitOffset->Resize(150,30);
|
|
||||||
|
|
||||||
|
|
||||||
TGTextEntry *e= eDbitOffset->TGNumberEntry::GetNumberEntry();
|
|
||||||
e->Connect("ReturnPressed()","ctbSignals",this,"setDbitOffset()");
|
|
||||||
|
|
||||||
e->Connect("ValueSet(Long_t)","ctbSignals",this,"setDbitOffset(Long_t)");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int ctbSignals::setSignalAlias(string line) {
|
|
||||||
|
|
||||||
int is=-1, plot=0, col=-1;
|
|
||||||
char tit[100];
|
|
||||||
int narg=sscanf(line.c_str(),"BIT%d %s %d %d",&is,tit,&plot,&col);
|
|
||||||
if (narg<2)
|
|
||||||
return -1;
|
|
||||||
if (is>=0 && is<NIOSIGNALS) {
|
|
||||||
signals[is]->setSignalAlias(tit,plot,col);
|
|
||||||
}
|
|
||||||
return is;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
string ctbSignals::getSignalAlias() {
|
|
||||||
|
|
||||||
ostringstream oss;
|
|
||||||
for (int is=0; is<NIOSIGNALS; is++)
|
|
||||||
oss << signals[is]->getSignalAlias() << endl;
|
|
||||||
|
|
||||||
|
|
||||||
return oss.str();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void ctbSignals::update() {
|
|
||||||
try {
|
|
||||||
|
|
||||||
Long64_t oreg = static_cast<Long64_t>(myDet->getPatternIOControl().tsquash("Different values"));
|
|
||||||
cout << hex << oreg << dec << endl;
|
|
||||||
|
|
||||||
for (int idac=0; idac<NIOSIGNALS; idac++) {
|
|
||||||
signals[idac]->setOutput(oreg);
|
|
||||||
}
|
|
||||||
|
|
||||||
} CATCH_DISPLAY ("Could not get patternIOcontrol.", "ctbSignals::update")
|
|
||||||
|
|
||||||
if (myDet->getDetectorType().squash() == slsDetectorDefs::MOENCH) {
|
|
||||||
// enable all
|
|
||||||
for (int is=0; is<64; is++) {
|
|
||||||
signals[is]->setDbitList(1);
|
|
||||||
}
|
|
||||||
eDbitOffset->SetNumber(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ctb
|
|
||||||
else {
|
|
||||||
try {
|
|
||||||
|
|
||||||
auto dbitlist = myDet->getRxDbitList().tsquash("Different values");
|
|
||||||
// enable all
|
|
||||||
if (dbitlist.empty()) {
|
|
||||||
for (int is=0; is<64; is++) {
|
|
||||||
signals[is]->setDbitList(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// disable all
|
|
||||||
for (int is=0; is<64; is++) {
|
|
||||||
signals[is]->setDbitList(0);
|
|
||||||
}
|
|
||||||
// enable selected
|
|
||||||
for (const auto &value : dbitlist) {
|
|
||||||
signals[value]->setDbitList(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} CATCH_DISPLAY ("Could not get receiver dbit list.", "ctbSignals::update")
|
|
||||||
|
|
||||||
try {
|
|
||||||
auto val = myDet->getRxDbitOffset().tsquash("Different values");
|
|
||||||
eDbitOffset->SetNumber(val);
|
|
||||||
} CATCH_DISPLAY ("Could not get receiver dbit offset.", "ctbSignals::update")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
string ctbSignals::getSignalParameters() {
|
|
||||||
|
|
||||||
try {
|
|
||||||
|
|
||||||
auto val = myDet->getPatternIOControl().tsquash("Different values");
|
|
||||||
ostringstream line;
|
|
||||||
line << "patioctrl " << hex << val << dec << endl;
|
|
||||||
return line.str();
|
|
||||||
|
|
||||||
} CATCH_DISPLAY ("Could not get patternIOcontrol.", "ctbSignals::getSignalParameters")
|
|
||||||
|
|
||||||
return ("");
|
|
||||||
}
|
|
||||||
|
|
||||||
void ctbSignals::ToggledOutReg(Int_t mask) {
|
|
||||||
try {
|
|
||||||
|
|
||||||
Long64_t oreg = static_cast<Long64_t>(myDet->getPatternIOControl().tsquash("Different values"));
|
|
||||||
Long64_t m=((Long64_t)1)<<mask;
|
|
||||||
cout << dec << sizeof(Long64_t) << " " << mask << " " << hex << m << " ioreg " << oreg;
|
|
||||||
|
|
||||||
if (signals[mask]->isOutput()) {
|
|
||||||
cout << " or " << m ;
|
|
||||||
oreg|=m;
|
|
||||||
} else {
|
|
||||||
cout << " not " << ~m ;
|
|
||||||
oreg&=~m;
|
|
||||||
}
|
|
||||||
cout << " after " << oreg << endl;
|
|
||||||
|
|
||||||
myDet->setPatternIOControl(static_cast<uint64_t>(oreg));
|
|
||||||
oreg = static_cast<Long64_t>(myDet->getPatternIOControl().tsquash("Different values"));
|
|
||||||
cout << dec << sizeof(Long64_t) << " " << mask << " " << hex << m << " ioreg " << oreg << endl;
|
|
||||||
|
|
||||||
eIOCntrlRegister->SetText(to_string(oreg).c_str());
|
|
||||||
|
|
||||||
} CATCH_DISPLAY ("Could not get/set patternIOcontrol.", "ctbSignals::ToggledOutReg")
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void ctbSignals::ToggledDbitList(Int_t mask){
|
|
||||||
try {
|
|
||||||
|
|
||||||
auto dbitlist = myDet->getRxDbitList().tsquash("Different values");
|
|
||||||
|
|
||||||
// anyway all enabled
|
|
||||||
if ((dbitlist.empty()) && (signals[mask]->isDbitList())) {
|
|
||||||
;
|
|
||||||
}
|
|
||||||
// set the dbitlist
|
|
||||||
else {
|
|
||||||
std::vector <int> new_dbitlist;
|
|
||||||
for (int is=0; is<64; is++) {
|
|
||||||
if (signals[is]->isDbitList()){
|
|
||||||
new_dbitlist.push_back(is);
|
|
||||||
cout << is << " " << new_dbitlist.size() - 1 << endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (new_dbitlist.size() > 64)
|
|
||||||
new_dbitlist.clear();
|
|
||||||
myDet->setRxDbitList(new_dbitlist);
|
|
||||||
// get list again
|
|
||||||
dbitlist = myDet->getRxDbitList().tsquash("Different values");
|
|
||||||
}
|
|
||||||
|
|
||||||
// enable all
|
|
||||||
if (dbitlist.empty()) {
|
|
||||||
for (int is=0; is<64; is++) {
|
|
||||||
signals[is]->setDbitList(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// disable all
|
|
||||||
for (int is=0; is<64; is++) {
|
|
||||||
signals[is]->setDbitList(0);
|
|
||||||
}
|
|
||||||
// enable selected
|
|
||||||
for (const auto &value : dbitlist) {
|
|
||||||
signals[value]->setDbitList(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} CATCH_DISPLAY ("Could not get/set receiver dbit list.", "ctbSignals::ToggledDbitList")
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void ctbSignals::ToggledPlot(Int_t b) {
|
|
||||||
|
|
||||||
Emit("ToggledSignalPlot(Int_t)", b);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void ctbSignals::ToggledSignalPlot(Int_t b) {
|
|
||||||
|
|
||||||
Emit("ToggledSignalPlot(Int_t)", b);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Pixel_t ctbSignals::getColor(int i){
|
|
||||||
if (i>=0 && i<NSIGNALS)
|
|
||||||
return signals[i]->getColor();
|
|
||||||
return static_cast<Pixel_t>(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
int ctbSignals::getPlot(int i){
|
|
||||||
if (i>=0 && i<NSIGNALS)
|
|
||||||
return signals[i]->isPlot();
|
|
||||||
return -1;
|
|
||||||
};
|
|
||||||
|
|
||||||
void ctbSignals::setDbitOffset(Long_t) {
|
|
||||||
setDbitOffset();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ctbSignals::setDbitOffset(){
|
|
||||||
try {
|
|
||||||
myDet->setRxDbitOffset(eDbitOffset->GetNumber());
|
|
||||||
} CATCH_DISPLAY ("Could not set receiver dbit offset.", "ctbSignals::setDbitOffset")
|
|
||||||
}
|
|
||||||
@@ -1,123 +0,0 @@
|
|||||||
// SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
#ifndef CTBSIGNALS_H
|
|
||||||
#define CTBSIGNALS_H
|
|
||||||
#include <TGFrame.h>
|
|
||||||
|
|
||||||
|
|
||||||
#define NSIGNALS 64
|
|
||||||
|
|
||||||
#define NIOSIGNALS 64 //for moench board was 52
|
|
||||||
|
|
||||||
|
|
||||||
#define ADCLATCH 63
|
|
||||||
#define DIGSIGLATCH 62
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class TGTextEntry;
|
|
||||||
class TGLabel;
|
|
||||||
class TGNumberEntry;
|
|
||||||
class TGCheckButton;
|
|
||||||
class TH1I;
|
|
||||||
class TGTextButton;
|
|
||||||
class TGColorSelect;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class TGNumberEntry;
|
|
||||||
namespace sls
|
|
||||||
{
|
|
||||||
class Detector;
|
|
||||||
};
|
|
||||||
class ctbSignal;
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
class ctbSignal : public TGHorizontalFrame {
|
|
||||||
|
|
||||||
// RQ_OBJECT("ctbSignal")
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
TGLabel *sLabel;
|
|
||||||
TGCheckButton *sOutput;
|
|
||||||
TGCheckButton *sDbitList;
|
|
||||||
TGCheckButton *sPlot;
|
|
||||||
TGLabel *sValue;
|
|
||||||
TGNumberEntry *sEntry;
|
|
||||||
TGColorSelect *fColorSel;
|
|
||||||
|
|
||||||
sls::Detector *myDet;
|
|
||||||
Int_t id;
|
|
||||||
|
|
||||||
TH1I *hsig;
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
ctbSignal(TGFrame *page, int i, sls::Detector *det);
|
|
||||||
int setSignalAlias(char *tit, int plot, int col);
|
|
||||||
string getSignalAlias();
|
|
||||||
|
|
||||||
TH1I *getPlot() {return hsig;};
|
|
||||||
int setOutput(Long64_t);
|
|
||||||
int fixOutput(int);
|
|
||||||
int setDbitList(Long64_t);
|
|
||||||
|
|
||||||
void ToggledOutput(Bool_t);
|
|
||||||
void ToggledDbitList(Bool_t);
|
|
||||||
void ToggledPlot(Bool_t);
|
|
||||||
void ColorChanged(Pixel_t);
|
|
||||||
|
|
||||||
int isDbitList();
|
|
||||||
int isOutput();
|
|
||||||
int isPlot();
|
|
||||||
Pixel_t getColor();
|
|
||||||
|
|
||||||
|
|
||||||
void ToggledSignalOutput(Int_t); //*SIGNAL*
|
|
||||||
void ToggledSignalDbitList(Int_t); //*SIGNAL*
|
|
||||||
void ToggledSignalPlot(Int_t); //*SIGNAL*
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ClassDef(ctbSignal,0)
|
|
||||||
};
|
|
||||||
|
|
||||||
class ctbSignals : public TGGroupFrame {
|
|
||||||
private:
|
|
||||||
|
|
||||||
ctbSignal *signals[NSIGNALS];
|
|
||||||
|
|
||||||
TGNumberEntry *eIOCntrlRegister;
|
|
||||||
TGNumberEntry *eDbitOffset;
|
|
||||||
|
|
||||||
sls::Detector *myDet;
|
|
||||||
|
|
||||||
public:
|
|
||||||
ctbSignals(TGVerticalFrame *page, sls::Detector *det);
|
|
||||||
int setSignalAlias(string line);
|
|
||||||
string getSignalAlias();
|
|
||||||
|
|
||||||
int getPlot(int);
|
|
||||||
Pixel_t getColor(int);
|
|
||||||
|
|
||||||
void update();
|
|
||||||
// void saveParameters();
|
|
||||||
string getSignalParameters();
|
|
||||||
|
|
||||||
//void setDbitList(Int_t);
|
|
||||||
void setDbitOffset(Long_t);
|
|
||||||
void setDbitOffset();
|
|
||||||
|
|
||||||
void ToggledOutReg(Int_t);
|
|
||||||
void ToggledDbitList(Int_t);
|
|
||||||
void ToggledPlot(Int_t);
|
|
||||||
void ToggledSignalPlot(Int_t); //*SIGNAL*
|
|
||||||
|
|
||||||
ClassDef(ctbSignals,0)
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,184 +0,0 @@
|
|||||||
// SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <iostream>
|
|
||||||
#include <fstream>
|
|
||||||
|
|
||||||
#include <TGTextEntry.h>
|
|
||||||
#include <TGLabel.h>
|
|
||||||
#include <TGNumberEntry.h>
|
|
||||||
#include <TGButton.h>
|
|
||||||
|
|
||||||
#include "ctbSlowAdcs.h"
|
|
||||||
#include "ctbDefs.h"
|
|
||||||
#include "sls/Detector.h"
|
|
||||||
#include "sls/sls_detector_defs.h"
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ctbSlowAdc::ctbSlowAdc(TGGroupFrame *page, int idac, sls::Detector *det) : TGHorizontalFrame(page, 800,50) , id(idac), myDet(det) {
|
|
||||||
|
|
||||||
|
|
||||||
TGHorizontalFrame *hframe=this;
|
|
||||||
|
|
||||||
page->AddFrame(hframe,new TGLayoutHints(kLHintsTop | kLHintsExpandX , 1,1,1,1));
|
|
||||||
MapWindow();
|
|
||||||
|
|
||||||
char tit[100];
|
|
||||||
|
|
||||||
|
|
||||||
sprintf(tit, "SENSE %d:",idac-1000);
|
|
||||||
|
|
||||||
dacsLabel= new TGLabel(hframe, tit);// new TGLabel(hframe, tit);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
hframe->AddFrame(dacsLabel,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 5, 5, 5, 5));
|
|
||||||
dacsLabel->MapWindow();
|
|
||||||
dacsLabel->SetTextJustify(kTextLeft);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
sprintf(tit, "xxx");
|
|
||||||
dacsValue= new TGLabel(hframe, tit);
|
|
||||||
hframe->AddFrame( dacsValue,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 5, 5, 5, 5));
|
|
||||||
dacsValue->MapWindow();
|
|
||||||
dacsValue->SetTextJustify(kTextLeft);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
TGTextButton *b= new TGTextButton(hframe, "Update");
|
|
||||||
hframe->AddFrame( b,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 5, 5, 5, 5));
|
|
||||||
b->MapWindow();
|
|
||||||
b->SetTextJustify(kTextLeft);
|
|
||||||
|
|
||||||
b->Connect("Clicked()","ctbSlowAdc",this,"getValue()");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int ctbSlowAdc::setLabel(char *tit) {
|
|
||||||
if(tit)
|
|
||||||
dacsLabel->SetText(tit);
|
|
||||||
|
|
||||||
return id;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
string ctbSlowAdc::getLabel() {
|
|
||||||
ostringstream line;
|
|
||||||
line << dacsLabel->GetText() << endl;
|
|
||||||
|
|
||||||
// line << "DAC" << dec << id << " " << dacsUnit->IsOn() << endl;
|
|
||||||
|
|
||||||
return line.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int ctbSlowAdc::getValue() {
|
|
||||||
try {
|
|
||||||
std::string s;
|
|
||||||
|
|
||||||
// temp
|
|
||||||
if (id == static_cast<int>(slsDetectorDefs::SLOW_ADC_TEMP)) {
|
|
||||||
|
|
||||||
int val = myDet->getTemperature(static_cast<slsDetectorDefs::dacIndex>(id)).tsquash("Different values");
|
|
||||||
cout << "slow adc temp" << " " << val << endl;
|
|
||||||
|
|
||||||
s = to_string(val) + " " + to_string(0x00b0) + "C";//<2F>C
|
|
||||||
dacsValue->SetText(s.c_str());
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
// mv
|
|
||||||
else {
|
|
||||||
|
|
||||||
int val = myDet->getSlowADC(static_cast<slsDetectorDefs::dacIndex>(id)).tsquash("Different values");
|
|
||||||
cout << "slow adc " << id << " " << val << endl;
|
|
||||||
|
|
||||||
s = to_string(val) + " mV";
|
|
||||||
dacsValue->SetText(s.c_str());
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
} CATCH_DISPLAY ("Could not get slow dac " + to_string(id) + ".", "ctbSlowAdc::getValue")
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ctbSlowAdcs::ctbSlowAdcs(TGVerticalFrame *page, sls::Detector *det) : TGGroupFrame(page,"Sense",kVerticalFrame) , myDet(det){
|
|
||||||
|
|
||||||
SetTitlePos(TGGroupFrame::kLeft);
|
|
||||||
page->AddFrame(this,new TGLayoutHints( kLHintsTop | kLHintsExpandX , 10,10,10,10));
|
|
||||||
MapWindow();
|
|
||||||
|
|
||||||
// cout << "window mapped " << endl;
|
|
||||||
|
|
||||||
|
|
||||||
for (int idac=0; idac<NSLOWADCS + 1; idac++) {
|
|
||||||
|
|
||||||
adcs[idac]=new ctbSlowAdc(this, idac+1000, myDet);
|
|
||||||
|
|
||||||
}
|
|
||||||
adcs[NSLOWADCS]->setLabel((char*)"Temperature");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int ctbSlowAdcs::setSlowAdcAlias(string line) {
|
|
||||||
|
|
||||||
int is=-1, mv=0;
|
|
||||||
char tit[100];
|
|
||||||
int narg=sscanf(line.c_str(),"SENSE%d %s %d",&is,tit,&mv);
|
|
||||||
if (narg<2)
|
|
||||||
return -1;
|
|
||||||
if (is>=0 && is<NSLOWADCS)
|
|
||||||
adcs[is]->setLabel(tit);
|
|
||||||
return is;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
string ctbSlowAdcs::getSlowAdcAlias() {
|
|
||||||
|
|
||||||
ostringstream line;
|
|
||||||
|
|
||||||
for (int i=0; i<NSLOWADCS; i++)
|
|
||||||
line << adcs[i]->getLabel() << endl;
|
|
||||||
return line.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
string ctbSlowAdcs::getAdcParameters() {
|
|
||||||
|
|
||||||
ostringstream line;
|
|
||||||
|
|
||||||
for (int i=0; i<NSLOWADCS; i++) {
|
|
||||||
//line << "dacs:" << i << " " << dacs[i]->getValue << endl;
|
|
||||||
line << "adc:" << i << " " << adcs[i]->getValue() << endl;
|
|
||||||
}
|
|
||||||
line << "adc:-1" << adcs[NSLOWADCS]->getValue() << endl;
|
|
||||||
return line.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void ctbSlowAdcs::update() {
|
|
||||||
for (int idac=0; idac<NSLOWADCS+1; idac++) {
|
|
||||||
adcs[idac]->getValue();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,80 +0,0 @@
|
|||||||
// SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef CTBSLOWADCS_H
|
|
||||||
#define CTBSLOWADCS_H
|
|
||||||
#include <TGFrame.h>
|
|
||||||
|
|
||||||
|
|
||||||
//#define NDACS 16
|
|
||||||
#define NSLOWADCS 8
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class TGTextEntry;
|
|
||||||
class TGLabel;
|
|
||||||
class TGNumberEntry;
|
|
||||||
class TGCheckButton;
|
|
||||||
class TGTextButton;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
namespace sls
|
|
||||||
{
|
|
||||||
class Detector;
|
|
||||||
};
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
class ctbSlowAdc : public TGHorizontalFrame {
|
|
||||||
|
|
||||||
|
|
||||||
protected:
|
|
||||||
// TGLabel *dacsLabel;
|
|
||||||
// TGNumberEntry *dacsEntry;
|
|
||||||
// TGCheckButton *dacsUnit;
|
|
||||||
TGLabel *dacsLabel;
|
|
||||||
TGLabel *dacsValue;
|
|
||||||
int id;
|
|
||||||
|
|
||||||
sls::Detector* myDet;
|
|
||||||
public:
|
|
||||||
ctbSlowAdc(TGGroupFrame*, int , sls::Detector*);
|
|
||||||
int getValue();
|
|
||||||
|
|
||||||
int setLabel(char *tit);
|
|
||||||
string getLabel();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ClassDef(ctbSlowAdc,0)
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
class ctbSlowAdcs : public TGGroupFrame {
|
|
||||||
private:
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ctbSlowAdc *adcs[NSLOWADCS+1];
|
|
||||||
|
|
||||||
sls::Detector* myDet;
|
|
||||||
|
|
||||||
public:
|
|
||||||
ctbSlowAdcs(TGVerticalFrame *page, sls::Detector*);
|
|
||||||
|
|
||||||
int setSlowAdcAlias(string line);
|
|
||||||
// int setDacAlias(string line);
|
|
||||||
string getSlowAdcAlias();
|
|
||||||
string getAdcParameters();
|
|
||||||
|
|
||||||
void update();
|
|
||||||
|
|
||||||
ClassDef(ctbSlowAdcs,0)
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
@@ -40,7 +40,9 @@ set(SPHINX_SOURCE_FILES
|
|||||||
src/pydetector.rst
|
src/pydetector.rst
|
||||||
src/pyenums.rst
|
src/pyenums.rst
|
||||||
src/pyexamples.rst
|
src/pyexamples.rst
|
||||||
|
src/pyPatternGenerator.rst
|
||||||
src/servers.rst
|
src/servers.rst
|
||||||
|
src/multidet.rst
|
||||||
src/receiver_api.rst
|
src/receiver_api.rst
|
||||||
src/result.rst
|
src/result.rst
|
||||||
src/type_traits.rst
|
src/type_traits.rst
|
||||||
@@ -53,11 +55,21 @@ set(SPHINX_SOURCE_FILES
|
|||||||
src/serverdefaults.rst
|
src/serverdefaults.rst
|
||||||
src/quick_start_guide.rst
|
src/quick_start_guide.rst
|
||||||
src/troubleshooting.rst
|
src/troubleshooting.rst
|
||||||
|
src/pattern.rst
|
||||||
src/receivers.rst
|
src/receivers.rst
|
||||||
src/slsreceiver.rst
|
src/slsreceiver.rst
|
||||||
src/udpheader.rst
|
src/udpheader.rst
|
||||||
src/udpconfig.rst
|
src/udpconfig.rst
|
||||||
src/udpdetspec.rst
|
src/udpdetspec.rst
|
||||||
|
src/fileformat.rst
|
||||||
|
src/slsreceiverheaderformat.rst
|
||||||
|
src/masterfileattributes.rst
|
||||||
|
src/binaryfileformat.rst
|
||||||
|
src/hdf5fileformat.rst
|
||||||
|
src/zmqjsonheaderformat.rst
|
||||||
|
src/dataformat.rst
|
||||||
|
src/softwarearchitecture.rst
|
||||||
|
src/configcommands.rst
|
||||||
)
|
)
|
||||||
|
|
||||||
foreach(filename ${SPHINX_SOURCE_FILES})
|
foreach(filename ${SPHINX_SOURCE_FILES})
|
||||||
@@ -75,11 +87,16 @@ configure_file(
|
|||||||
"${SPHINX_BUILD}/gen_server_doc.py"
|
"${SPHINX_BUILD}/gen_server_doc.py"
|
||||||
@ONLY)
|
@ONLY)
|
||||||
|
|
||||||
configure_file(
|
configure_file(
|
||||||
"${CMAKE_CURRENT_SOURCE_DIR}/static/extra.css"
|
"${CMAKE_CURRENT_SOURCE_DIR}/static/extra.css"
|
||||||
"${SPHINX_BUILD}/static/css/extra.css"
|
"${SPHINX_BUILD}/static/css/extra.css"
|
||||||
@ONLY)
|
@ONLY)
|
||||||
|
|
||||||
|
|
||||||
|
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/src/images
|
||||||
|
DESTINATION ${SPHINX_BUILD}/src)
|
||||||
|
|
||||||
|
|
||||||
add_custom_target(server_rst python gen_server_doc.py)
|
add_custom_target(server_rst python gen_server_doc.py)
|
||||||
|
|
||||||
add_custom_target(docs
|
add_custom_target(docs
|
||||||
|
|||||||
@@ -890,7 +890,7 @@ EXCLUDE_SYMLINKS = NO
|
|||||||
# Note that the wildcards are matched against the file with absolute path, so to
|
# Note that the wildcards are matched against the file with absolute path, so to
|
||||||
# exclude all test directories for example use the pattern */test/*
|
# exclude all test directories for example use the pattern */test/*
|
||||||
|
|
||||||
EXCLUDE_PATTERNS = */docs/* */tests/* */python/* */manual */slsDetectorServers/* */libs/* */integrationTests *README* */slsDetectorGui/* */ctbGui/* */slsDetectorCalibration/*
|
EXCLUDE_PATTERNS = */docs/* */tests/* */python/* */manual */slsDetectorServers/* */libs/* */integrationTests *README* */slsDetectorGui/* */ctbGui/* */slsDetectorCalibration/* *TobiSchluter*
|
||||||
|
|
||||||
# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
|
# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
|
||||||
# (namespaces, classes, functions, etc.) that should be excluded from the
|
# (namespaces, classes, functions, etc.) that should be excluded from the
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ print(sys.path)
|
|||||||
|
|
||||||
# -- Project information -----------------------------------------------------
|
# -- Project information -----------------------------------------------------
|
||||||
|
|
||||||
project = 'slsDetectorPackage'
|
project = 'slsDetectorPackage @PROJECT_VERSION@'
|
||||||
copyright = '2020, PSD Detector Group'
|
copyright = '2020, PSD Detector Group'
|
||||||
author = 'PSD Detector Group'
|
author = 'PSD Detector Group'
|
||||||
version = '@PROJECT_VERSION@'
|
version = '@PROJECT_VERSION@'
|
||||||
@@ -63,4 +63,4 @@ html_static_path = ['static']
|
|||||||
|
|
||||||
|
|
||||||
def setup(app):
|
def setup(app):
|
||||||
app.add_stylesheet('css/extra.css') # may also be an URL
|
app.add_css_file('css/extra.css') # may also be an URL
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ print('\n\n\n\n SERVER CSV')
|
|||||||
|
|
||||||
src = Path('@CMAKE_SOURCE_DIR@')/'slsDetectorServers/'
|
src = Path('@CMAKE_SOURCE_DIR@')/'slsDetectorServers/'
|
||||||
detectors = ['Mythen3', 'Gotthard2', 'Eiger',
|
detectors = ['Mythen3', 'Gotthard2', 'Eiger',
|
||||||
'Jungfrau', 'Moench', 'Gotthard', 'Ctb']
|
'Jungfrau', 'Moench', 'Ctb']
|
||||||
|
|
||||||
|
|
||||||
for det in detectors:
|
for det in detectors:
|
||||||
|
|||||||
1309
docs/images_src/detector_data_format.drawio
Normal file
787
docs/images_src/system_communication_architecture.drawio
Normal file
@@ -0,0 +1,787 @@
|
|||||||
|
<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36" version="28.1.0">
|
||||||
|
<diagram name="Page-1" id="SqHbah1k9D3XqnipfQD4">
|
||||||
|
<mxGraphModel grid="0" page="0" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
|
||||||
|
<root>
|
||||||
|
<mxCell id="0" />
|
||||||
|
<mxCell id="1" parent="0" />
|
||||||
|
<mxCell id="kpcteDQP5Q-WdnKVJ5EM-1" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#BBDDFF;strokeColor=#BBEEFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="459" y="71" width="171" height="134" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="QgYz-w7MwsADk0cZRM1J-27" value="<p><font face="Courier New" style="">Client listening to&nbsp;<br><font style="">zmqport</font> : <font style=""><b style="">30001</b></font><br><font style="">zmqip</font>&nbsp; &nbsp;: <font style=""><b style="">129.129.100.115</b></font></font></p>" style="text;html=1;align=left;verticalAlign=middle;resizable=1;points=[];autosize=1;strokeColor=#4A7B72;fillColor=default;fontColor=#4A7B72;movable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-351.99" y="2247" width="186.49" height="51" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="IUwO_ccEPv4BRx6tuxwP-13" value="<font face="Comic Sans MS">Client/ GUI</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#AAAAFF;strokeColor=#AAAAFF;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="457.65" y="2121" width="132" height="68" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-164" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#E6E6E6;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-340" y="4949" width="810" height="621" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-162" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#DDEEDD;fontColor=#333333;strokeColor=#E6E6E6;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-240" y="5215" width="680" height="325" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-149" value="<font face="Courier New">&lt;&lt;class&gt;&gt; Module</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#AAEEEE;strokeColor=#77BBBB;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="58.870000000000005" y="5418" width="196" height="84" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-148" value="<font face="Courier New">&lt;&lt;class&gt;&gt; Module</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#99DDDD;strokeColor=#77BBBB;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="47.629999999999995" y="5405" width="196" height="84" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-147" value="<font face="Courier New">&lt;&lt;class&gt;&gt; Module</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#88CCCC;strokeColor=#77BBBB;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="37.129999999999995" y="5392" width="196" height="84" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-146" value="<font face="Courier New">&lt;&lt;class&gt;&gt; Module (s)</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#77BBBB;strokeColor=#77BBBB;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="25.239999999999995" y="5381" width="196" height="84" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-80" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#E6E6E6;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-277" y="4445" width="732" height="426" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-123" value="<font face="Courier New">Data Streamer</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#9AC7BF;strokeColor=#77BBBB;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;dashed=1;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="197.2" y="4642.5" width="179.12" height="84" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-122" value="Data Processor" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#AAAAFF;strokeColor=#9999FF;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;dashed=1;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-7.720000000000024" y="4643" width="167.88" height="84" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-119" value="<font face="Courier New">Listener</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#99BBEE;strokeColor=#77AADD;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;dashed=1;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-192" y="4651" width="146" height="84" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-62" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#E6E6E6;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-242.75" y="4184" width="762.75" height="176" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-54" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#E6E6E6;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-119" y="3595" width="547" height="397" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-36" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#EEEEFF;fontColor=#333333;strokeColor=#E6E6E6;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="157.39" y="3717" width="200.61" height="243" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-33" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#CCE5FF;fontColor=#333333;strokeColor=#E6E6E6;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-67" y="3727" width="187" height="233" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-7" value="Module 3" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#99CCFF;strokeColor=#99CCFF;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="490" y="128" width="132" height="68" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-2" value="Module 2" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#88BBEE;strokeColor=#88BBEE;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="482" y="121" width="132" height="68" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-6" value="Module 1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#77AADD;strokeColor=#77AADD;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="474" y="113" width="132" height="68" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-3" value="Module (s)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#6699CC;strokeColor=#6699CC;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="466.29999999999995" y="106" width="132" height="68" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="J8_Ag6N0oFm1g001oKw5-6" value="TCP" style="shape=doubleArrow;whiteSpace=wrap;html=1;strokeColor=#BBBBFF;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=12;fontColor=#FFFFFF;fillColor=#BBBBFF;gradientColor=none;arrowWidth=0.39080459770114734;arrowSize=0.11650485436893204;rotation=15;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="197" y="889" width="241.01" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-63" value="" style="shape=doubleArrow;whiteSpace=wrap;html=1;strokeColor=#CCCCFF;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=12;fontColor=default;fillColor=#CCCCFF;gradientColor=none;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="298.5" y="137" width="150" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-62" value="" style="shape=doubleArrow;whiteSpace=wrap;html=1;strokeColor=#BBBBFF;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=12;fontColor=default;fillColor=#BBBBFF;gradientColor=none;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="294.62" y="133" width="150" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-61" value="" style="shape=doubleArrow;whiteSpace=wrap;html=1;strokeColor=#AAAAFF;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=12;fontColor=default;fillColor=#AAAAFF;gradientColor=none;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="290.62" y="129" width="150" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-22" value="" style="shape=singleArrow;direction=south;whiteSpace=wrap;html=1;fillColor=#99CCFF;gradientColor=none;strokeColor=#99CCFF;arrowWidth=0.3473368342085482;arrowSize=0.26612903225806445;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="517" y="246.87" width="43" height="130" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-20" value="" style="shape=singleArrow;direction=south;whiteSpace=wrap;html=1;fillColor=#88BBEE;gradientColor=none;strokeColor=#88BBEE;arrowWidth=0.2813203300825186;arrowSize=0.28179723502304177;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="512" y="240" width="43" height="130" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-21" value="" style="shape=singleArrow;direction=south;whiteSpace=wrap;html=1;fillColor=#77AADD;gradientColor=none;strokeColor=#77AADD;arrowWidth=0.26856714178544006;arrowSize=0.24723502304147474;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="505.88" y="232" width="43" height="130" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-16" value="UDP" style="shape=singleArrow;direction=south;whiteSpace=wrap;html=1;fillColor=#6699CC;gradientColor=none;strokeColor=#6699CC;arrowWidth=0.2713178294573608;arrowSize=0.23333333333333386;fontColor=#FFFFFF;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;textDirection=vertical-lr;spacing=0;spacingBottom=0;spacingLeft=-2;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="499" y="224" width="43" height="130" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-5" value="Client / GUI" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#AAAAFF;strokeColor=#AAAAFF;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="125" y="109" width="132" height="68" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-1" value="" style="points=[[0.35,0,0],[0.98,0.51,0],[1,0.71,0],[0.67,1,0],[0,0.795,0],[0,0.65,0]];verticalLabelPosition=bottom;sketch=0;html=1;verticalAlign=top;aspect=fixed;align=center;pointerEvents=1;shape=mxgraph.cisco19.user;fillColor=#AAAAFF;strokeColor=none;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="166" y="59" width="50" height="50" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-35" value="" style="shape=singleArrow;direction=east;whiteSpace=wrap;html=1;fillColor=#BBFFDD;gradientColor=none;strokeColor=#BBFFDD;arrowWidth=0.3640710382513589;arrowSize=0.1682103825136619;flipH=1;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="255.375" y="433.625" width="150" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-36" value="" style="shape=singleArrow;direction=east;whiteSpace=wrap;html=1;fillColor=#AAEECC;gradientColor=none;strokeColor=#AAEECC;arrowWidth=0.39166666666667427;arrowSize=0.1850757575757575;flipH=1;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="256.625" y="428.375" width="150" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-37" value="" style="shape=singleArrow;direction=east;whiteSpace=wrap;html=1;fillColor=#99DDBB;gradientColor=none;strokeColor=#99DDBB;arrowWidth=0.3072404371584601;arrowSize=0.20247267759562873;flipH=1;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="260.875" y="424.625" width="150" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-38" value="ZMQ" style="shape=singleArrow;direction=east;whiteSpace=wrap;html=1;fillColor=#88CCAA;gradientColor=none;strokeColor=#88CCAA;arrowWidth=0.3015258215962414;arrowSize=0.21895539906103256;flipH=1;fontSize=10;fontColor=#FFFFFF;spacing=0;spacingBottom=2;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="264" y="416" width="150" height="35" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-43" value="" style="shape=singleArrow;direction=east;whiteSpace=wrap;html=1;fillColor=#BBFFDD;gradientColor=none;strokeColor=#BBFFDD;arrowWidth=0.30195728510032327;arrowSize=0.10804578407150964;rotation=45;flipV=0;flipH=1;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="188.495" y="295.625" width="270" height="40" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-44" value="" style="shape=singleArrow;direction=east;whiteSpace=wrap;html=1;fillColor=#AAEECC;gradientColor=none;strokeColor=#AAEECC;arrowWidth=0.3059021565555355;arrowSize=0.11059978613932724;rotation=45;flipV=0;flipH=1;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="187.745" y="288.375" width="270" height="40" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-45" value="" style="shape=singleArrow;direction=east;whiteSpace=wrap;html=1;fillColor=#99DDBB;gradientColor=none;strokeColor=#99DDBB;arrowWidth=0.2606119807565733;arrowSize=0.11229881466462685;rotation=45;flipV=0;flipH=1;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="185.995" y="281.625" width="270" height="40" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-46" value="ZMQ" style="shape=singleArrow;direction=east;whiteSpace=wrap;html=1;fillColor=#88CCAA;gradientColor=none;strokeColor=#88CCAA;arrowWidth=0.26899866177272147;arrowSize=0.11295618290402748;rotation=45;flipV=0;flipH=1;fontColor=#FFFFFF;fontSize=10;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="185.12" y="274" width="270" height="40" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-47" value="" style="shape=singleArrow;direction=north;whiteSpace=wrap;html=1;fillColor=#BBFFDD;gradientColor=none;strokeColor=#BBFFDD;arrowWidth=0.3881614350818457;arrowSize=0.13584129099660103;flipH=1;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="162.115" y="191.255" width="30" height="200" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-48" value="" style="shape=singleArrow;direction=north;whiteSpace=wrap;html=1;fillColor=#AAEECC;gradientColor=none;strokeColor=#AAEECC;arrowWidth=0.4039236188616011;arrowSize=0.13625893792486793;flipH=1;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="166.365" y="194.005" width="30" height="200" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-49" value="" style="shape=singleArrow;direction=north;whiteSpace=wrap;html=1;fillColor=#99DDBB;gradientColor=none;strokeColor=#99DDBB;arrowWidth=0.278008144362146;arrowSize=0.14744102244191368;flipH=1;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="170.615" y="196.255" width="30" height="200" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-50" value="ZMQ" style="shape=singleArrow;direction=north;whiteSpace=wrap;html=1;fillColor=#88CCAA;gradientColor=none;strokeColor=#88CCAA;arrowWidth=0.29264320269609984;arrowSize=0.15799814659217704;flipH=1;textDirection=vertical-lr;fontSize=10;fontColor=#FFFFFF;spacingLeft=-1;spacing=0;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="175" y="198.63" width="32.74" height="200" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-51" value="External&nbsp;<div>Processing</div><div>Chain</div>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#99DDBB;strokeColor=#99DDBB;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="126.99" y="409.37" width="115.01" height="85.63" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-56" value="" style="shape=doubleArrow;whiteSpace=wrap;html=1;rotation=45;arrowWidth=0.27989643421967686;arrowSize=0.14277638849485402;fillColor=#CCCCFF;strokeColor=#CCCCFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="244.9904832720494" y="263.6209665440989" width="250" height="40" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-57" value="" style="shape=doubleArrow;whiteSpace=wrap;html=1;rotation=45;arrowWidth=0.27989643421967686;arrowSize=0.14277638849485402;fillColor=#BBBBFF;strokeColor=#BBBBFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="245.7404832720494" y="257.8709665440989" width="250" height="40" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-58" value="" style="shape=doubleArrow;whiteSpace=wrap;html=1;rotation=45;arrowWidth=0.27989643421967686;arrowSize=0.14277638849485402;fillColor=#AAAAFF;strokeColor=#AAAAFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="245.9904832720494" y="251.8709665440989" width="250" height="40" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-59" value="TCP" style="shape=doubleArrow;whiteSpace=wrap;html=1;rotation=45;arrowWidth=0.27989643421967686;arrowSize=0.14277638849485402;fillColor=#9999FF;strokeColor=#9999FF;fontColor=#FFFFFF;fontSize=10;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="245.73999999999995" y="245.25048327204945" width="250" height="40" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-60" value="TCP" style="shape=doubleArrow;whiteSpace=wrap;html=1;strokeColor=#9999FF;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=10;fontColor=#FFFFFF;fillColor=#9999FF;gradientColor=none;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="285.62" y="125" width="150" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-67" value="Control 1:N" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="325" y="114" width="79" height="26" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-68" value="Control 1:N" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;rotation=45;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="343" y="243" width="79" height="26" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-69" value="Raw Data Packets&nbsp;<span style="background-color: transparent; color: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));">1:1</span>" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;rotation=90;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="499" y="285.25" width="137" height="26" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-70" value="Image Data 1:N" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;rotation=45;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="285.00493141924176" y="277.62493141924176" width="102" height="26" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-71" value="Assembled Data 1:N" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;rotation=0;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="289.6190475583121" y="407.6190475583121" width="128" height="26" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-72" value="Processed Data 1:1" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;rotation=90;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="143.87" y="303.87" width="123" height="26" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-99" value="UDP" style="shape=singleArrow;direction=south;whiteSpace=wrap;html=1;fillColor=#77AADD;gradientColor=none;strokeColor=#77AADD;arrowWidth=0.2713178294573608;arrowSize=0.23333333333333386;fontColor=#FFFFFF;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;textDirection=vertical-lr;spacing=0;spacingBottom=0;spacingLeft=-2;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="295.39" y="1604" width="43" height="188" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-101" value="Client" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#AAAAFF;strokeColor=#AAAAFF;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="54.37" y="836" width="132" height="68" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-102" value="Module
1952 / 1953
bchip100" style="rounded=1;whiteSpace=wrap;fillColor=#88BBEE;strokeColor=#88BBEE;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="599" y="816" width="137" height="85" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-103" value="" style="points=[[0.35,0,0],[0.98,0.51,0],[1,0.71,0],[0.67,1,0],[0,0.795,0],[0,0.65,0]];verticalLabelPosition=bottom;sketch=0;html=1;verticalAlign=top;aspect=fixed;align=center;pointerEvents=1;shape=mxgraph.cisco19.user;fillColor=#AAAAFF;strokeColor=none;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="95.37" y="786" width="50" height="50" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-111" value="Receiver<div>pc1234</div><div><b><font style="color: rgb(0, 76, 153);">10.0.1</font></b>.100</div>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#88BBEE;strokeColor=#88BBEE;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="258.39" y="1811" width="132" height="95" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-117" value="ZMQ" style="shape=singleArrow;direction=east;whiteSpace=wrap;html=1;fillColor=#99DDBB;gradientColor=none;strokeColor=#99DDBB;arrowWidth=0.2417936862291299;arrowSize=0.08753046681068456;rotation=38;flipV=0;flipH=1;fontColor=#FFFFFF;fontSize=10;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-393.75" y="2375.63" width="285.05" height="40" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-122" value="<font face="Comic Sans MS">External&nbsp;</font><div><font face="Comic Sans MS">Process</font></div><div><span><font face="Comic Sans MS" style="color: rgb(0, 76, 153);">129.129.200.175</font></span></div>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#99DDBB;strokeColor=#99DDBB;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="449.19" y="2444" width="139.01" height="72.63" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-127" value="TCP" style="shape=doubleArrow;whiteSpace=wrap;html=1;strokeColor=#BBBBFF;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=10;fontColor=#FFFFFF;fillColor=#BBBBFF;gradientColor=none;arrowWidth=0.39080459770114734;arrowSize=0.11650485436893204;rotation=0;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="200" y="854" width="235" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-128" value="Control" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="309" y="838" width="57" height="26" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-130" value="Raw Data&nbsp;<div>Packets</div>" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;rotation=0;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="240.76" y="1654" width="74" height="41" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-133" value="Processed Data" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;rotation=0;fontColor=#004C99;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="472.15000000000003" y="2363" width="103" height="26" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-135" value="<font style="" face="Courier New">port&nbsp; &nbsp; &nbsp;= 1952<br>stopport = 1953<br>hostname = bchip100</font>" style="text;align=left;verticalAlign=middle;resizable=1;points=[];autosize=1;strokeColor=#8888FF;fillColor=default;movable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;html=1;fontColor=#6666DD;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="446" y="845" width="142" height="58" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="J8_Ag6N0oFm1g001oKw5-7" value="<pre style=""><pre>udp src port: hardcoded (32410)<br><span style="background-color: transparent;">udp_srcip&nbsp; : <b><font style="">10.0.1</font></b>.15</span></pre></pre>" style="text;html=1;align=left;verticalAlign=middle;resizable=1;points=[];autosize=1;strokeColor=#004C99;fillColor=default;fontColor=#004C99;movable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;fontFamily=Helvetica;fontSize=12;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="17.11" y="1530.5" width="226.52" height="40" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="J8_Ag6N0oFm1g001oKw5-10" value="Module<div>bchip100</div>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#88BBEE;strokeColor=#88BBEE;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="255.39" y="1520" width="132" height="68" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="J8_Ag6N0oFm1g001oKw5-14" value="<pre style="">udp_dstport: 50001<br><span style="background-color: transparent;">udp_dstip&nbsp; : <b><font style="">10.0.1</font></b>.100<br></span><span style="background-color: transparent;">udp_dstmac : (specify for<br></span><span style="background-color: transparent;"> custom receivers)</span></pre>" style="text;html=1;align=left;verticalAlign=middle;resizable=1;points=[];autosize=1;strokeColor=#004C99;fillColor=default;fontColor=#004C99;movable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="20.47" y="1831" width="225.52" height="64" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="J8_Ag6N0oFm1g001oKw5-16" value="UDP" style="shape=singleArrow;direction=south;whiteSpace=wrap;html=1;fillColor=#77AADD;gradientColor=none;strokeColor=#77AADD;arrowWidth=0.2713178294573608;arrowSize=0.23333333333333386;fontColor=#FFFFFF;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;textDirection=vertical-lr;spacing=0;spacingBottom=0;spacingLeft=-2;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="450.9" y="1602" width="43" height="188" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="J8_Ag6N0oFm1g001oKw5-17" value="Receiver<div>pc1234</div><div><font style="color: rgb(0, 76, 153);"><b style="">10.0.2</b></font>.100</div>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#88BBEE;strokeColor=#88BBEE;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="413.9" y="1809" width="132" height="95" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="J8_Ag6N0oFm1g001oKw5-18" value="Raw Data&nbsp;<div>Packets</div>" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;rotation=0;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="396.27" y="1652" width="74" height="41" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="J8_Ag6N0oFm1g001oKw5-19" value="Module<div>bchip101</div>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#88BBEE;strokeColor=#88BBEE;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="410.9" y="1518" width="132" height="68" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="J8_Ag6N0oFm1g001oKw5-20" value="<pre style=""><pre>udp src port: hardcoded (32410)<br><span style="background-color: transparent;">udp_srcip&nbsp; : <b><font style="">10.0.2</font></b>.15</span></pre></pre>" style="text;html=1;align=left;verticalAlign=middle;resizable=1;points=[];autosize=1;strokeColor=#004C99;fillColor=default;fontColor=#004C99;movable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;fontFamily=Helvetica;fontSize=12;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="553.6999999999999" y="1533.5" width="227.61" height="37" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="J8_Ag6N0oFm1g001oKw5-21" value="<pre style="">udp_dstport: 50002<br><span style="background-color: transparent;">udp_dstip&nbsp; : <b><font style="">10.0.2</font></b>.100<br></span><span style="background-color: transparent;">udp_dstmac : (specify for<br></span><span style="background-color: transparent;"> custom receivers)</span></pre>" style="text;html=1;align=left;verticalAlign=middle;resizable=1;points=[];autosize=1;strokeColor=#004C99;fillColor=default;fontColor=#004C99;movable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="558" y="1820" width="227" height="68" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="J8_Ag6N0oFm1g001oKw5-24" value="TCP" style="shape=doubleArrow;whiteSpace=wrap;html=1;strokeColor=#BBBBFF;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=12;fontColor=#FFFFFF;fillColor=#BBBBFF;gradientColor=none;arrowWidth=0.3696597117203055;arrowSize=0.07695194442744;rotation=45;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="165.19" y="1269.62" width="328.51" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="J8_Ag6N0oFm1g001oKw5-25" value="Client" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#AAAAFF;strokeColor=#AAAAFF;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="62.99999999999999" y="1131" width="132" height="68" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="J8_Ag6N0oFm1g001oKw5-27" value="" style="points=[[0.35,0,0],[0.98,0.51,0],[1,0.71,0],[0.67,1,0],[0,0.795,0],[0,0.65,0]];verticalLabelPosition=bottom;sketch=0;html=1;verticalAlign=top;aspect=fixed;align=center;pointerEvents=1;shape=mxgraph.cisco19.user;fillColor=#AAAAFF;strokeColor=none;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="104" y="1081" width="50" height="50" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="J8_Ag6N0oFm1g001oKw5-28" value="TCP" style="shape=doubleArrow;whiteSpace=wrap;html=1;strokeColor=#BBBBFF;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=10;fontColor=#FFFFFF;fillColor=#BBBBFF;gradientColor=none;arrowWidth=0.3826240220923713;arrowSize=0.09377242087427196;rotation=32;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="190.48" y="1225.3" width="272.63" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="J8_Ag6N0oFm1g001oKw5-29" value="Control" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="317.2" y="1199" width="57" height="26" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="J8_Ag6N0oFm1g001oKw5-33" value="Module
1952 / 1953
bchip101" style="rounded=1;whiteSpace=wrap;fillColor=#88BBEE;strokeColor=#88BBEE;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;fontFamily=Helvetica;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="599" y="912" width="137" height="85" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="J8_Ag6N0oFm1g001oKw5-34" value="<font face="Courier New">Receiver</font><div><span style="background-color: transparent; color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));">1954</span></div><div>pc1234<span style="background-color: transparent; color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));"></span></div>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#88BBEE;strokeColor=#88BBEE;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="648" y="1273.5" width="137" height="85" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="J8_Ag6N0oFm1g001oKw5-35" value="<font face="Courier New">Receiver<br></font><div><span style="background-color: transparent; color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));">1955</span></div><div>pc1234</div>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#88BBEE;strokeColor=#88BBEE;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;fontFamily=Helvetica;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="648" y="1369.5" width="137" height="85" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="J8_Ag6N0oFm1g001oKw5-43" value="ZMQ" style="shape=singleArrow;direction=east;whiteSpace=wrap;html=1;fillColor=#99DDBB;gradientColor=none;strokeColor=#99DDBB;arrowWidth=0.27577655701663845;arrowSize=0.06779431315598941;rotation=48;flipV=0;flipH=1;fontColor=#FFFFFF;fontSize=10;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-419.7" y="2435.9" width="336.9" height="40" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="IUwO_ccEPv4BRx6tuxwP-4" value="<font style="" face="Courier New">port&nbsp; &nbsp; &nbsp;= 1952<br>stopport = 1953<br>hostname = bchip101</font>" style="text;align=left;verticalAlign=middle;resizable=1;points=[];autosize=1;strokeColor=#8888FF;fillColor=default;movable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;html=1;fontColor=#6666DD;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="446" y="912" width="141" height="58" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="IUwO_ccEPv4BRx6tuxwP-5" value="<font face="Courier New" style="">rx_tcpport&nbsp; = 1954<br>rx_hostname = pc1234</font>" style="text;align=left;verticalAlign=middle;resizable=1;points=[];autosize=1;strokeColor=#8888FF;fillColor=default;movable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;html=1;fontColor=#6666DD;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="461.43" y="1294.5" width="150.45" height="43" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="IUwO_ccEPv4BRx6tuxwP-6" value="<font face="Courier New" style="">rx_tcpport&nbsp; = 1955<br>rx_hostname = pc1234</font>" style="text;align=left;verticalAlign=middle;resizable=1;points=[];autosize=1;strokeColor=#8888FF;fillColor=default;movable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;html=1;fontColor=#6666DD;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="458.5" y="1395" width="153.38" height="43" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="IUwO_ccEPv4BRx6tuxwP-7" value="<font>GUI:&nbsp;&nbsp;</font><div>rx_zmqport (30001)&nbsp;<span style="background-color: transparent; color: light-dark(rgb(136, 136, 255), rgb(105, 105, 207));">=&nbsp;</span><span style="background-color: transparent; color: light-dark(rgb(136, 136, 255), rgb(105, 105, 207));">zmqport (30001)</span></div>" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#8888FF;fontSize=17;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-135.12" y="2343.0000000000005" width="310" height="53" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="IUwO_ccEPv4BRx6tuxwP-11" value="" style="endArrow=classic;html=1;rounded=0;fontColor=#AAAAFF;strokeColor=#AAAAFF;exitX=0.296;exitY=0.054;exitDx=0;exitDy=0;exitPerimeter=0;entryX=1.002;entryY=0.486;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="IUwO_ccEPv4BRx6tuxwP-7" target="QgYz-w7MwsADk0cZRM1J-27">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="-362.87" y="2530.63" as="sourcePoint" />
|
||||||
|
<mxPoint x="-463.99579291044756" y="2345" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="IUwO_ccEPv4BRx6tuxwP-12" value="" style="endArrow=classic;html=1;rounded=0;fontColor=#AAAAFF;strokeColor=#AAAAFF;exitX=0.48;exitY=1.008;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.548;entryY=-0.039;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="IUwO_ccEPv4BRx6tuxwP-7" target="QgYz-w7MwsADk0cZRM1J-18">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="-354.5" y="2562" as="sourcePoint" />
|
||||||
|
<mxPoint x="-146.5" y="2600" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="IUwO_ccEPv4BRx6tuxwP-14" value="" style="points=[[0.35,0,0],[0.98,0.51,0],[1,0.71,0],[0.67,1,0],[0,0.795,0],[0,0.65,0]];verticalLabelPosition=bottom;sketch=0;html=1;verticalAlign=top;aspect=fixed;align=center;pointerEvents=1;shape=mxgraph.cisco19.user;fillColor=#AAAAFF;strokeColor=none;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="498.64999999999986" y="2071" width="50" height="50" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="IUwO_ccEPv4BRx6tuxwP-15" value="ZMQ" style="shape=singleArrow;direction=east;whiteSpace=wrap;html=1;fillColor=#77AADD;gradientColor=none;strokeColor=#77AADD;arrowWidth=0.29750455482560484;arrowSize=0.24452443902291207;rotation=0;flipV=0;flipH=1;fontColor=#FFFFFF;fontSize=10;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="658" y="2504.9" width="90" height="40" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="IUwO_ccEPv4BRx6tuxwP-16" value="<pre style=""><span style="background-color: transparent;"><font style="">Receiver streaming out<br><font style="">rx_zmqport</font>&nbsp;= <font style=""><b style="">30001</b></font></font></span><br></pre>" style="text;html=1;align=left;verticalAlign=middle;resizable=1;points=[];autosize=1;strokeColor=#4A7B72;fillColor=default;fontColor=#4A7B72;movable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="755" y="2501.7000000000003" width="166" height="43.2" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="IUwO_ccEPv4BRx6tuxwP-17" value="<font face="Comic Sans MS">Receiver</font><div><font face="Comic Sans MS">pc1234</font></div><div><span><font style="color: rgb(74, 123, 114);" face="Comic Sans MS">129.129.100.115</font></span></div>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#88BBEE;strokeColor=#88BBEE;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="932" y="2459.9" width="137" height="85" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="IUwO_ccEPv4BRx6tuxwP-18" value="<font face="Comic Sans MS">Receiver</font><div><font face="Comic Sans MS">pc1234</font></div><div><span><font face="Comic Sans MS" style="color: rgb(74, 123, 114);">129.129.100.115</font></span></div>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#88BBEE;strokeColor=#88BBEE;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;fontFamily=Helvetica;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="932" y="2561" width="137" height="85" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="IUwO_ccEPv4BRx6tuxwP-19" value="<pre style=""><pre><span style="background-color: transparent;"><font style="">Receiver streaming out<br><font style="">rx_zmqport</font>&nbsp;= <font style=""><b style="">30002</b></font></font></span></pre></pre>" style="text;html=1;align=left;verticalAlign=middle;resizable=1;points=[];autosize=1;strokeColor=#4A7B72;fillColor=default;fontColor=#4A7B72;movable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="755" y="2561" width="166" height="44" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="IUwO_ccEPv4BRx6tuxwP-20" value="ZMQ" style="shape=singleArrow;direction=east;whiteSpace=wrap;html=1;fillColor=#77AADD;gradientColor=none;strokeColor=#77AADD;arrowWidth=0.3650504445573688;arrowSize=0.19810994147613833;rotation=0;flipV=0;flipH=1;fontColor=#FFFFFF;fontSize=10;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="656" y="2561" width="90" height="40" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="IUwO_ccEPv4BRx6tuxwP-22" value="<p><font face="Courier New" style="">Client listening to&nbsp;<br><font>zmqport</font> : <font style=""><b style="">30004</b></font><br><font>zmqip</font>&nbsp; &nbsp;: <font style=""><b style="">129.129.200.175 </b></font></font></p>" style="text;html=1;align=left;verticalAlign=middle;resizable=1;points=[];autosize=1;strokeColor=#004C99;fillColor=default;fontColor=#004C99;movable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="320.39" y="2204" width="198" height="49" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="IUwO_ccEPv4BRx6tuxwP-23" value="<font style="font-size: 17px;">External Process:</font><div><font style="font-size: 17px;">rx_zmqport (30001)&nbsp;</font><span style="font-size: 17px; background-color: transparent; color: light-dark(rgb(136, 136, 255), rgb(105, 105, 207));">!=&nbsp;</span><span style="font-size: 17px; background-color: transparent; color: light-dark(rgb(136, 136, 255), rgb(105, 105, 207));">zmqport (30004)</span></div>" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#8888FF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="754" y="2312.0000000000005" width="315" height="53" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="IUwO_ccEPv4BRx6tuxwP-25" value="" style="endArrow=classic;html=1;rounded=0;fontColor=#AAAAFF;strokeColor=#AAAAFF;exitX=0.497;exitY=0.986;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.482;entryY=0.009;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="IUwO_ccEPv4BRx6tuxwP-23" target="IUwO_ccEPv4BRx6tuxwP-16">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="612.31" y="2482" as="sourcePoint" />
|
||||||
|
<mxPoint x="820.31" y="2520" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="IUwO_ccEPv4BRx6tuxwP-27" value="ZMQ" style="shape=singleArrow;direction=north;whiteSpace=wrap;html=1;fillColor=#99DDBB;gradientColor=none;strokeColor=#99DDBB;arrowWidth=0.26530437257911216;arrowSize=0.11592009478500508;rotation=0;flipV=0;flipH=1;fontColor=#FFFFFF;fontSize=10;textDirection=vertical-lr;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="527.5699999999999" y="2258.1" width="40" height="100" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="IUwO_ccEPv4BRx6tuxwP-28" value="<p><font style="" face="Courier New">Client listening to&nbsp;<br><font>zmqport</font> : <font style=""><b style="">30003</b></font><br><font>zmqip</font>&nbsp; &nbsp;: <font style=""><b style="">129.129.200.175 </b></font></font></p>" style="text;html=1;align=left;verticalAlign=middle;resizable=1;points=[];autosize=1;strokeColor=#004C99;fillColor=default;fontColor=#004C99;movable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="528.9" y="2204" width="198" height="49" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="IUwO_ccEPv4BRx6tuxwP-30" value="ZMQ" style="shape=singleArrow;direction=north;whiteSpace=wrap;html=1;fillColor=#99DDBB;gradientColor=none;strokeColor=#99DDBB;arrowWidth=0.3197480273847759;arrowSize=0.13373882001308657;rotation=0;flipV=0;flipH=1;fontColor=#FFFFFF;fontSize=10;textDirection=vertical-lr;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="478.2" y="2258.1" width="40" height="100" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="IUwO_ccEPv4BRx6tuxwP-31" value="Assembled Data" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;rotation=-90;fontColor=#4A7B72;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="594" y="2535" width="106" height="26" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="IUwO_ccEPv4BRx6tuxwP-33" value="<p><font face="Courier New" style="">External Process&nbsp;listening to&nbsp;<br>Ports : <font style=""><b>30001, 30002</b></font><br>Ip&nbsp; &nbsp; : <font style=""><b style="">129.129.100.115 </b></font></font></p>" style="text;align=left;verticalAlign=middle;resizable=1;points=[];autosize=1;strokeColor=#4A7B72;fillColor=default;fontColor=#4A7B72;movable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;html=1;spacing=0;spacingLeft=5;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="414" y="2525.63" width="221" height="51.37" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="IUwO_ccEPv4BRx6tuxwP-37" value="" style="endArrow=classic;html=1;rounded=0;fontColor=#AAAAFF;strokeColor=#AAAAFF;entryX=1.005;entryY=0.41;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0.476;exitY=-0.014;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1" source="IUwO_ccEPv4BRx6tuxwP-23" target="IUwO_ccEPv4BRx6tuxwP-28">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="803" y="2313" as="sourcePoint" />
|
||||||
|
<mxPoint x="519.31" y="2373.93" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="IUwO_ccEPv4BRx6tuxwP-46" value="<p><font style="" face="Courier New">External Process&nbsp;streaming out&nbsp;<br>Ports : <b>30003, 30004</b></font></p>" style="text;align=left;verticalAlign=middle;resizable=1;points=[];autosize=1;strokeColor=#004C99;fillColor=default;fontColor=#004C99;movable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;html=1;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="418.9" y="2396" width="222.1" height="36" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="IUwO_ccEPv4BRx6tuxwP-50" value="" style="shape=image;editableCssRules=.*;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/svg+xml,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9Ii0wLjUgLTAuNSAyOCAyOCIgaGVpZ2h0PSIyOCIgd2lkdGg9IjI4IiBzdHlsZT0iY29sb3Itc2NoZW1lOiBsaWdodCBkYXJrOyI+JiN4YTsJICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5zdDAgeyBzdG9wLWNvbG9yOiBsaWdodC1kYXJrKHJnYigxNzAsIDE3MCwgMjU1KSwgcmdiKDAsIDIwNiwgMTcyKSk7IH0gLnN0MSB7IHN0b3AtY29sb3I6IGxpZ2h0LWRhcmsocmdiKDE3OCwgMTAyLCAyNTUpLCByZ2IoNywgMTMxLCAxNDMpKTsgfSA8L3N0eWxlPiYjeGE7CTxkZWZzPiYjeGE7CQk8bGluZWFyR3JhZGllbnQgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHkyPSIyNS4zMDkiIHgyPSIyMy40NTQiIHkxPSIzLjQ3NCIgeDE9IjIuMDM5IiBpZD0iQSI+JiN4YTsJCQk8c3RvcCBjbGFzcz0ic3QwIi8+JiN4YTsJCQk8c3RvcCBjbGFzcz0ic3QxIiBvZmZzZXQ9IjEiLz4mI3hhOwkJPC9saW5lYXJHcmFkaWVudD4mI3hhOwk8L2RlZnM+JiN4YTsJPHBhdGggZmlsbD0idXJsKCNBKSIgZD0iTTE1LjI1IDEzLjE3M2ExLjcgMS43IDAgMCAwLS4xMTYtLjY4Yy0uMDg1LS4yMTYtLjIxMy0uNDEzLS4zNzYtLjU3OHMtLjM2Mi0uMjkxLS41NzgtLjM3Ni0uNDQ4LS4xMjQtLjY4LS4xMTZjLS4yMzItLjAwOC0uNDY0LjAzMS0uNjguMTE2cy0uNDEzLjIxMy0uNTc4LjM3Ni0uMjkxLjM2Mi0uMzc2LjU3OGExLjcgMS43IDAgMCAwLS4xMTYuNjh2N2MwIC40NzIuMTY1Ljg5Mi40OTIgMS4yNTguMTY1LjE2My4zNjIuMjkxLjU3OS4zNzVzLjQ0OC4xMjMuNjguMTE1YTEuNyAxLjcgMCAwIDAgMS4yNTgtLjQ5Yy4zMjctLjM2Ni40OTItLjc4NC40OTItMS4yNnYtN3pNMTMuNS0uNWMxLjkzMiAwIDMuNzM2LjM2NiA1LjQxNCAxLjA5NCAxLjcxMy43MyAzLjIwOCAxLjczMiA0LjQ4MyAzLjAwOCAxLjI4MyAxLjI4NyAyLjMwNSAyLjgxIDMuMDA4IDQuNDg1LjczIDEuNjc2IDEuMDk0IDMuNDgyIDEuMDk0IDUuNDEzYTEzLjgyIDEzLjgyIDAgMCAxLTEuMDk0IDUuNDY5Yy0uNzEzIDEuNjU0LTEuNzM0IDMuMTU4LTMuMDA4IDQuNDMxLTEuMjg2IDEuMjgyLTIuODA5IDIuMzAzLTQuNDgzIDMuMDA2LTEuNzEuNzM2LTMuNTUzIDEuMTA4LTUuNDE0IDEuMDk0LTEuODc4LjAxMS0zLjczOS0uMzYxLTUuNDY5LTEuMDk0YTE0LjIzIDE0LjIzIDAgMCAxLTcuNDM3LTcuNDM3QTEzLjgyIDEzLjgyIDAgMCAxLS41IDEzLjVjMC0xLjkzMi4zNjQtMy43MzYgMS4wOTQtNS40MTMuNzMtMS43MTUgMS43MzItMy4yMDkgMy4wMDgtNC40ODVTNi4zNzggMS4zMDcgOC4wMzEuNTk0QTEzLjgyIDEzLjgyIDAgMCAxIDEzLjUtLjV6bTAgOS43MzVhMi4wMSAyLjAxIDAgMCAwIDEuNDc3LS42MDIgMi4wMSAyLjAxIDAgMCAwIC42MDItMS40NzdjMC0uNTgzLS4yMDEtMS4wNzQtLjYwMi0xLjQ3NS0uMTg0LS4yMS0uNDExLS4zNzctLjY2Ni0uNDkxcy0uNTMyLS4xNy0uODExLS4xNjZjLS4yNzktLjAwNC0uNTU2LjA1Mi0uODExLjE2NnMtLjQ4Mi4yODEtLjY2Ni40OTFjLS40MDEuNDAxLS42Ljg5Mi0uNiAxLjQ3NXMuMiAxLjA3Ni42IDEuNDc3Ljg5My42MDIgMS40NzcuNjAyeiIvPiYjeGE7PC9zdmc+;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-169" y="2355.5" width="28" height="28" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="IUwO_ccEPv4BRx6tuxwP-52" value="" style="shape=image;editableCssRules=.*;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/svg+xml,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9Ii0wLjUgLTAuNSAyOCAyOCIgaGVpZ2h0PSIyOCIgd2lkdGg9IjI4IiBzdHlsZT0iY29sb3Itc2NoZW1lOiBsaWdodCBkYXJrOyI+JiN4YTsJICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5zdDAgeyBzdG9wLWNvbG9yOiBsaWdodC1kYXJrKHJnYigxNzAsIDE3MCwgMjU1KSwgcmdiKDAsIDIwNiwgMTcyKSk7IH0gLnN0MSB7IHN0b3AtY29sb3I6IGxpZ2h0LWRhcmsocmdiKDE3OCwgMTAyLCAyNTUpLCByZ2IoNywgMTMxLCAxNDMpKTsgfSA8L3N0eWxlPiYjeGE7CTxkZWZzPiYjeGE7CQk8bGluZWFyR3JhZGllbnQgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHkyPSIyNS4zMDkiIHgyPSIyMy40NTQiIHkxPSIzLjQ3NCIgeDE9IjIuMDM5IiBpZD0iQSI+JiN4YTsJCQk8c3RvcCBjbGFzcz0ic3QwIi8+JiN4YTsJCQk8c3RvcCBjbGFzcz0ic3QxIiBvZmZzZXQ9IjEiLz4mI3hhOwkJPC9saW5lYXJHcmFkaWVudD4mI3hhOwk8L2RlZnM+JiN4YTsJPHBhdGggZmlsbD0idXJsKCNBKSIgZD0iTTE1LjI1IDEzLjE3M2ExLjcgMS43IDAgMCAwLS4xMTYtLjY4Yy0uMDg1LS4yMTYtLjIxMy0uNDEzLS4zNzYtLjU3OHMtLjM2Mi0uMjkxLS41NzgtLjM3Ni0uNDQ4LS4xMjQtLjY4LS4xMTZjLS4yMzItLjAwOC0uNDY0LjAzMS0uNjguMTE2cy0uNDEzLjIxMy0uNTc4LjM3Ni0uMjkxLjM2Mi0uMzc2LjU3OGExLjcgMS43IDAgMCAwLS4xMTYuNjh2N2MwIC40NzIuMTY1Ljg5Mi40OTIgMS4yNTguMTY1LjE2My4zNjIuMjkxLjU3OS4zNzVzLjQ0OC4xMjMuNjguMTE1YTEuNyAxLjcgMCAwIDAgMS4yNTgtLjQ5Yy4zMjctLjM2Ni40OTItLjc4NC40OTItMS4yNnYtN3pNMTMuNS0uNWMxLjkzMiAwIDMuNzM2LjM2NiA1LjQxNCAxLjA5NCAxLjcxMy43MyAzLjIwOCAxLjczMiA0LjQ4MyAzLjAwOCAxLjI4MyAxLjI4NyAyLjMwNSAyLjgxIDMuMDA4IDQuNDg1LjczIDEuNjc2IDEuMDk0IDMuNDgyIDEuMDk0IDUuNDEzYTEzLjgyIDEzLjgyIDAgMCAxLTEuMDk0IDUuNDY5Yy0uNzEzIDEuNjU0LTEuNzM0IDMuMTU4LTMuMDA4IDQuNDMxLTEuMjg2IDEuMjgyLTIuODA5IDIuMzAzLTQuNDgzIDMuMDA2LTEuNzEuNzM2LTMuNTUzIDEuMTA4LTUuNDE0IDEuMDk0LTEuODc4LjAxMS0zLjczOS0uMzYxLTUuNDY5LTEuMDk0YTE0LjIzIDE0LjIzIDAgMCAxLTcuNDM3LTcuNDM3QTEzLjgyIDEzLjgyIDAgMCAxLS41IDEzLjVjMC0xLjkzMi4zNjQtMy43MzYgMS4wOTQtNS40MTMuNzMtMS43MTUgMS43MzItMy4yMDkgMy4wMDgtNC40ODVTNi4zNzggMS4zMDcgOC4wMzEuNTk0QTEzLjgyIDEzLjgyIDAgMCAxIDEzLjUtLjV6bTAgOS43MzVhMi4wMSAyLjAxIDAgMCAwIDEuNDc3LS42MDIgMi4wMSAyLjAxIDAgMCAwIC42MDItMS40NzdjMC0uNTgzLS4yMDEtMS4wNzQtLjYwMi0xLjQ3NS0uMTg0LS4yMS0uNDExLS4zNzctLjY2Ni0uNDkxcy0uNTMyLS4xNy0uODExLS4xNjZjLS4yNzktLjAwNC0uNTU2LjA1Mi0uODExLjE2NnMtLjQ4Mi4yODEtLjY2Ni40OTFjLS40MDEuNDAxLS42Ljg5Mi0uNiAxLjQ3NXMuMiAxLjA3Ni42IDEuNDc3Ljg5My42MDIgMS40NzcuNjAyeiIvPiYjeGE7PC9zdmc+;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="726" y="2324.5" width="28" height="28" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="IUwO_ccEPv4BRx6tuxwP-57" value="Module 3" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#99CCFF;strokeColor=#99CCFF;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="475.70000000000005" y="413.27" width="132" height="68" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="IUwO_ccEPv4BRx6tuxwP-58" value="Module 2" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#88BBEE;strokeColor=#88BBEE;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="467.70000000000005" y="406.27" width="132" height="68" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="IUwO_ccEPv4BRx6tuxwP-59" value="Module 1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#77AADD;strokeColor=#77AADD;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="459.70000000000005" y="398.27" width="132" height="68" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="IUwO_ccEPv4BRx6tuxwP-60" value="Receiver (s)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#6699CC;strokeColor=#6699CC;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="452" y="391.27" width="132" height="68" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="IUwO_ccEPv4BRx6tuxwP-61" value="Option 1: Directly&nbsp;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;rotation=45;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="255.39" y="309.63" width="113" height="26" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="IUwO_ccEPv4BRx6tuxwP-62" value="Option 2: Indirectly" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;rotation=0;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="291.99605691619604" y="446.99605691619604" width="118" height="26" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-14" value="Client" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-173" y="3875.5" width="47" height="26" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-15" value="" style="endArrow=classic;startArrow=classic;html=1;rounded=0;entryX=0.016;entryY=0.505;entryDx=0;entryDy=0;entryPerimeter=0;fontColor=#666666;strokeColor=#666666;" edge="1" parent="1">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="-132" y="3889" as="sourcePoint" />
|
||||||
|
<mxPoint x="-46.998000000000104" y="3889.405" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-57" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#666666;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-27" target="hmBfKhxy8mBhXzrh4bXw-28">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-27" value="<div><font face="Courier New">Control Server</font></div><div><font face="Courier New">( C 98 )</font></div>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#77AADD;strokeColor=#77AADD;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-47" y="3750" width="146" height="60" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-28" value="<div><font face="Courier New">Stop Server</font></div><div><font face="Courier New">( C 98 )</font></div>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#77AADD;strokeColor=#77AADD;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-47" y="3853" width="146" height="60" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-29" value="Client&nbsp;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-173" y="3766.5" width="50" height="26" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-30" value="" style="endArrow=classic;startArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;fontColor=#666666;strokeColor=#666666;" edge="1" parent="1" target="hmBfKhxy8mBhXzrh4bXw-27">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="-133" y="3780" as="sourcePoint" />
|
||||||
|
<mxPoint x="-48" y="3783" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-34" value="On-board CPU" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontSize=17;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-34" y="3921" width="120" height="32" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-35" value="Registers" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#AAAAFF;strokeColor=#AAAAFF;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="182.34000000000003" y="3872.5" width="152" height="40" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-37" value="FPGA ( VHDL )" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontSize=17;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="184.00000000000003" y="3921" width="131" height="32" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-38" value="UDP Generator" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#AAAAFF;strokeColor=#AAAAFF;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="182.75" y="3820" width="152" height="40" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-39" value="Readout and Processing Logic" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#AAAAFF;strokeColor=#AAAAFF;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="183.5" y="3740" width="152" height="70" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-40" value="" style="endArrow=classic;startArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;fontColor=#666666;strokeColor=#666666;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-28" target="hmBfKhxy8mBhXzrh4bXw-35">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="64.37" y="3696" as="sourcePoint" />
|
||||||
|
<mxPoint x="176.37" y="3696" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-41" value="<span style="background-color: transparent;">Stop</span>" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;rotation=5;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="117.61000000000001" y="3867" width="40" height="26" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-42" value="" style="endArrow=classic;startArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;fontColor=#666666;strokeColor=#666666;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-27" target="hmBfKhxy8mBhXzrh4bXw-35">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="69.37" y="3580" as="sourcePoint" />
|
||||||
|
<mxPoint x="176.37" y="3696" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-43" value="<span style="background-color: transparent;">Control</span>" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;rotation=53;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="113" y="3811" width="55" height="26" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-46" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.75;exitDx=0;exitDy=0;fontColor=#666666;strokeColor=#666666;dashed=1;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-38">
|
||||||
|
<mxGeometry relative="1" as="geometry">
|
||||||
|
<mxPoint x="446" y="3849" as="targetPoint" />
|
||||||
|
<mxPoint x="350.27" y="3843" as="sourcePoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-48" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFDD;fontColor=#333333;strokeColor=#E6E6E6;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="157" y="3626" width="202" height="57" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-49" value="Sensor &amp; Chip" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontSize=17;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="198.2" y="3638.5" width="119" height="32" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-50" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=0;exitDx=0;exitDy=0;entryX=0.25;entryY=1;entryDx=0;entryDy=0;fontColor=#666666;strokeColor=#666666;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-36" target="hmBfKhxy8mBhXzrh4bXw-48">
|
||||||
|
<mxGeometry relative="1" as="geometry">
|
||||||
|
<mxPoint x="213.19" y="3721" as="sourcePoint" />
|
||||||
|
<mxPoint x="212.19" y="3689" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-51" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.644;exitY=0.993;exitDx=0;exitDy=0;entryX=0.65;entryY=0.007;entryDx=0;entryDy=0;entryPerimeter=0;exitPerimeter=0;fontColor=#666666;strokeColor=#666666;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-48" target="hmBfKhxy8mBhXzrh4bXw-36">
|
||||||
|
<mxGeometry relative="1" as="geometry">
|
||||||
|
<mxPoint x="281.19" y="3689" as="sourcePoint" />
|
||||||
|
<mxPoint x="281.19" y="3721" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-52" value="Control" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="154.39000000000001" y="3686" width="55" height="26" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-53" value="Data" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="285.62" y="3686" width="41" height="26" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-55" value="MODULE" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontSize=17;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-19" y="3642" width="91" height="32" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-58" value="<span style="background-color: transparent;">Spawns</span>" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="22" y="3817" width="55" height="26" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-59" value="<font face="Courier New">On-board&nbsp;</font><div><font face="Courier New">Detector&nbsp;</font><span style="font-family: &quot;Courier New&quot;; background-color: transparent; color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));">Server</span></div>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#77AADD;strokeColor=#77AADD;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-202.75" y="4236" width="160" height="84" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-60" value="Firmware&nbsp;<div>( *.bit, *.pof, *.rbf )</div>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#9999FF;strokeColor=#9999FF;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="37.86" y="4236" width="160" height="84" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-61" value="<font face="Courier New">slsDetectorPackage</font><div><font face="Courier New">( Client /&amp; Receiver )</font></div>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#77BBBB;strokeColor=#77BBBB;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="278.75" y="4236" width="200" height="84" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-64" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;fontColor=#666666;strokeColor=#666666;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-38">
|
||||||
|
<mxGeometry relative="1" as="geometry">
|
||||||
|
<mxPoint x="447" y="3830" as="targetPoint" />
|
||||||
|
<mxPoint x="356" y="3811" as="sourcePoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-66" value="UDP Port" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="350.12" y="3810" width="65" height="26" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-67" value="UDP Port 2" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="349.62" y="3829" width="74" height="26" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-68" value="TCP Port<div><span style="background-color: transparent; color: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));">Control</span></div>" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-124" y="3759" width="63" height="41" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-69" value="<span style="background-color: transparent; color: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));">TCP Port</span><div><span style="background-color: transparent; color: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));">Stop</span></div>" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-125" y="3868" width="63" height="41" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-71" value="Receiver" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="438.20000000000005" y="3817" width="61" height="26" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-72" value="Receiver" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="438.38" y="3836" width="61" height="26" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-75" value="<font face="Courier New">Listener</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#77AADD;strokeColor=#77AADD;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-208" y="4630.5" width="146" height="84" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-77" value="Data Processor" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#9999FF;strokeColor=#9999FF;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-22.51" y="4628" width="167.88" height="84" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-79" value="<font face="Courier New">Data Streamer</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#77BBBB;strokeColor=#77BBBB;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="182.34" y="4628" width="179.12" height="84" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-82" value="" style="endArrow=classic;startArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;fontColor=#666666;strokeColor=#666666;" edge="1" parent="1" target="hmBfKhxy8mBhXzrh4bXw-84">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="-289" y="4550" as="sourcePoint" />
|
||||||
|
<mxPoint x="-253" y="4554.5" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-106" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;strokeColor=#666666;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-84" target="hmBfKhxy8mBhXzrh4bXw-75">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-107" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;strokeColor=#666666;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-84" target="hmBfKhxy8mBhXzrh4bXw-77">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-108" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;strokeColor=#666666;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-84" target="hmBfKhxy8mBhXzrh4bXw-79">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-84" value="<font face="Courier New">TCP Server</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#AAAADD;strokeColor=#77AADD;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-208" y="4508" width="146" height="84" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-85" value="Client&nbsp;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-330" y="4537" width="50" height="26" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-86" value="TCP Port<div><span style="background-color: transparent; color: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));">Control</span></div>" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-276" y="4529.5" width="63" height="41" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-87" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.01;entryY=0.83;entryDx=0;entryDy=0;strokeColor=#666666;entryPerimeter=0;" edge="1" parent="1" target="hmBfKhxy8mBhXzrh4bXw-75">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="-291" y="4700" as="sourcePoint" />
|
||||||
|
<mxPoint x="-265" y="4672" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-88" value="Module" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-339" y="4686" width="55" height="26" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-89" value="UDP Port" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-278" y="4679.5" width="65" height="26" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-91" value="Data" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="351.12" y="3846.5" width="41" height="26" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-94" value="" style="endArrow=classic;html=1;rounded=0;strokeColor=#666666;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-75" target="hmBfKhxy8mBhXzrh4bXw-95">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="-50" y="4739" as="sourcePoint" />
|
||||||
|
<mxPoint y="4689" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-95" value="Assembles&nbsp;<div><span style="background-color: transparent; color: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));">into images in memory</span></div>" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=#666666;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-199" y="4754" width="129" height="41" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-96" value="Optional callbacks&nbsp;<div>for online processing</div>" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=#666666;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-39.62" y="4754" width="119" height="41" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-98" value="" style="endArrow=classic;html=1;rounded=0;strokeColor=#666666;exitX=0.25;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-77" target="hmBfKhxy8mBhXzrh4bXw-96">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="54.370000000000005" y="4719" as="sourcePoint" />
|
||||||
|
<mxPoint x="54.370000000000005" y="4754" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-99" value="Optional File" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=#666666;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="63" y="4810" width="82" height="26" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-100" value="" style="endArrow=classic;html=1;rounded=0;strokeColor=#666666;exitX=0.754;exitY=0.979;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-77" target="hmBfKhxy8mBhXzrh4bXw-99">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="86.62" y="4759" as="sourcePoint" />
|
||||||
|
<mxPoint x="121.99000000000001" y="4801" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-101" value="Optional Data Streaming" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=#666666;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="203.5" y="4774" width="138" height="26" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-102" value="" style="endArrow=classic;html=1;rounded=0;strokeColor=#666666;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-79" target="hmBfKhxy8mBhXzrh4bXw-101">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="275.12" y="4724" as="sourcePoint" />
|
||||||
|
<mxPoint x="310.49" y="4766" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-103" value="" style="endArrow=classic;html=1;rounded=0;entryX=-0.002;entryY=0.873;entryDx=0;entryDy=0;strokeColor=#666666;dashed=1;entryPerimeter=0;" edge="1" parent="1" target="hmBfKhxy8mBhXzrh4bXw-119">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="-291" y="4723" as="sourcePoint" />
|
||||||
|
<mxPoint x="-208" y="4723.5" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-104" value="Module" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-339" y="4708" width="55" height="26" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-105" value="UDP Port 2" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-284" y="4702.5" width="74" height="26" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-116" value="RECEIVER" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontSize=17;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="24.71" y="4472" width="101" height="32" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-117" value="UPGRADE COMPONENTS" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontSize=17;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="11.369999999999997" y="4196" width="218" height="32" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-121" value="<div><span style="background-color: transparent; color: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));">Data packets</span></div>" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-284" y="4657" width="80" height="26" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-124" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1.001;exitY=0.818;exitDx=0;exitDy=0;fontColor=#666666;strokeColor=#666666;dashed=1;exitPerimeter=0;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-123">
|
||||||
|
<mxGeometry relative="1" as="geometry">
|
||||||
|
<mxPoint x="469" y="4711" as="targetPoint" />
|
||||||
|
<mxPoint x="382.62" y="4711" as="sourcePoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-125" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.75;exitDx=0;exitDy=0;fontColor=#666666;strokeColor=#666666;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-79">
|
||||||
|
<mxGeometry relative="1" as="geometry">
|
||||||
|
<mxPoint x="470" y="4691" as="targetPoint" />
|
||||||
|
<mxPoint x="382.62" y="4691" as="sourcePoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-126" value="ZMQ Port" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="370.74" y="4671" width="68" height="26" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-127" value="ZMQ Port 2" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="369.24" y="4690" width="77" height="26" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-128" value="GUI" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="462.82000000000005" y="4678" width="39" height="26" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-129" value="GUI" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="462" y="4697" width="39" height="26" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-130" value="Images" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="370.24" y="4653" width="53" height="26" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-131" value="<font face="Courier New">C++ API</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#77BBBB;strokeColor=#77BBBB;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-199" y="4999" width="146" height="84" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-132" value="<font face="Courier New">Python API</font><span style="color: rgba(0, 0, 0, 0); font-family: monospace; font-size: 0px; text-align: start; text-wrap-mode: nowrap;">%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22%26lt%3Bfont%20face%3D%26quot%3BCourier%20New%26quot%3B%26gt%3BC%2B%2B%20API%26lt%3B%2Ffont%26gt%3B%22%20style%3D%22rounded%3D1%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3BfillColor%3D%2377AADD%3BstrokeColor%3D%2377AADD%3BlabelPosition%3Dcenter%3BverticalLabelPosition%3Dmiddle%3Balign%3Dcenter%3BverticalAlign%3Dmiddle%3BfontSize%3D17%3BgradientColor%3Dnone%3BfontColor%3D%23FFFFFF%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22-180%22%20y%3D%224998%22%20width%3D%22146%22%20height%3D%2284%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3E</span>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#77BBBB;strokeColor=#77BBBB;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-202.75" y="5120" width="146" height="84" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-133" value="<font face="Courier New">CLI</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#77BBBB;strokeColor=#77BBBB;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-202.75" y="5240" width="146" height="84" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-134" value="<font face="Courier New">Qt GUI</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#77BBBB;strokeColor=#77BBBB;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-202.75" y="5360" width="146" height="84" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-135" value="" style="points=[[0.35,0,0],[0.98,0.51,0],[1,0.71,0],[0.67,1,0],[0,0.795,0],[0,0.65,0]];verticalLabelPosition=bottom;sketch=0;html=1;verticalAlign=top;aspect=fixed;align=center;pointerEvents=1;shape=mxgraph.cisco19.user;fillColor=#77BBBB;strokeColor=#77BBBB;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-336.5" y="5154" width="50" height="50" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-137" value="<font face="Courier New">&lt;&lt;class&gt;&gt; Detector</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#77BBBB;strokeColor=#77BBBB;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="24.710000000000004" y="5239" width="196" height="84" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-138" value="Module 3" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#99CCFF;strokeColor=#99CCFF;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-61.06999999999997" y="5622" width="132" height="68" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-139" value="Module 2" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#88BBEE;strokeColor=#88BBEE;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-72.06999999999996" y="5615" width="132" height="68" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-140" value="Module 1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#77AADD;strokeColor=#77AADD;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-80.06999999999996" y="5607" width="132" height="68" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-141" value="Module (s)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#6699CC;strokeColor=#6699CC;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-87.77000000000001" y="5600" width="132" height="68" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-142" value="Module 3" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#99CCFF;strokeColor=#99CCFF;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="132.00000000000006" y="5622" width="132" height="68" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-143" value="Module 2" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#88BBEE;strokeColor=#88BBEE;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="121.00000000000006" y="5615" width="132" height="68" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-144" value="Module 1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#77AADD;strokeColor=#77AADD;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="113.00000000000006" y="5607" width="132" height="68" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-145" value="Receiver (s)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#6699CC;strokeColor=#6699CC;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="105.30000000000001" y="5600" width="132" height="68" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-150" value="" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeColor=#666666;" edge="1" parent="1" target="hmBfKhxy8mBhXzrh4bXw-131">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="-284" y="5189" as="sourcePoint" />
|
||||||
|
<mxPoint x="-234" y="5139" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-151" value="" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeColor=#666666;" edge="1" parent="1" target="hmBfKhxy8mBhXzrh4bXw-132">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="-284" y="5190" as="sourcePoint" />
|
||||||
|
<mxPoint x="-234" y="5140" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-152" value="" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeColor=#666666;" edge="1" parent="1" target="hmBfKhxy8mBhXzrh4bXw-133">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="-284" y="5190" as="sourcePoint" />
|
||||||
|
<mxPoint x="-234" y="5140" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-153" value="" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeColor=#666666;" edge="1" parent="1" target="hmBfKhxy8mBhXzrh4bXw-134">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="-284" y="5190" as="sourcePoint" />
|
||||||
|
<mxPoint x="-234" y="5140" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-154" value="" style="endArrow=classic;html=1;rounded=0;strokeColor=#666666;exitX=1;exitY=0.401;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-131" target="hmBfKhxy8mBhXzrh4bXw-137">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="-30.629999999999995" y="5028" as="sourcePoint" />
|
||||||
|
<mxPoint x="10" y="5010" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-155" value="" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeColor=#666666;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-132" target="hmBfKhxy8mBhXzrh4bXw-137">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="-53" y="5162" as="sourcePoint" />
|
||||||
|
<mxPoint x="28" y="5134" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-156" value="" style="endArrow=classic;html=1;rounded=0;strokeColor=#666666;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-133" target="hmBfKhxy8mBhXzrh4bXw-137">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="-40" y="5178" as="sourcePoint" />
|
||||||
|
<mxPoint x="20" y="5170" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-157" value="" style="endArrow=classic;html=1;rounded=0;strokeColor=#666666;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-134" target="hmBfKhxy8mBhXzrh4bXw-137">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="-50" y="5328" as="sourcePoint" />
|
||||||
|
<mxPoint x="10" y="5040" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-159" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#666666;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-137" target="hmBfKhxy8mBhXzrh4bXw-146">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="-10" y="5606" as="sourcePoint" />
|
||||||
|
<mxPoint x="71" y="5578" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-160" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#666666;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-146" target="hmBfKhxy8mBhXzrh4bXw-141">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="150" y="5518" as="sourcePoint" />
|
||||||
|
<mxPoint x="231" y="5490" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-161" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#666666;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-146" target="hmBfKhxy8mBhXzrh4bXw-145">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="123" y="5470" as="sourcePoint" />
|
||||||
|
<mxPoint x="341" y="5430" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-163" value="slsDetectorPackage<div>Client ( C++17 )</div>" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontSize=17;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-191" y="5478" width="160" height="50" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-165" value="CLIENT" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontSize=17;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="172.38" y="5083" width="80" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-166" value="<font face="Courier New">Shared Memory (s)</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#77BBBB;strokeColor=#77BBBB;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="250" y="5311" width="169" height="70" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-167" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#666666;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-137" target="hmBfKhxy8mBhXzrh4bXw-166">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="120" y="5350" as="sourcePoint" />
|
||||||
|
<mxPoint x="120" y="5408" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="hmBfKhxy8mBhXzrh4bXw-168" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;strokeColor=#666666;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-146" target="hmBfKhxy8mBhXzrh4bXw-166">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="260" y="5340" as="sourcePoint" />
|
||||||
|
<mxPoint x="260" y="5398" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="QgYz-w7MwsADk0cZRM1J-14" value="Assembled Data" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;rotation=40;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-271.5" y="2438" width="106" height="26" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="QgYz-w7MwsADk0cZRM1J-18" value="<pre style=""><span style="background-color: transparent;"><font style="">Receiver streaming out<br><font style="">rx_zmqport</font>&nbsp;= <font style=""><b style="">30001</b></font></font></span><br></pre>" style="text;html=1;align=left;verticalAlign=middle;resizable=1;points=[];autosize=1;strokeColor=#4A7B72;fillColor=default;fontColor=#4A7B72;movable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-130.5" y="2471.13" width="166" height="43.2" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="QgYz-w7MwsADk0cZRM1J-19" value="<font face="Comic Sans MS">Receiver</font><div><font face="Comic Sans MS">pc1234</font></div><div><span><font style="color: rgb(74, 123, 114);" face="Comic Sans MS">129.129.100.115</font></span></div>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#88BBEE;strokeColor=#88BBEE;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="46.5" y="2448" width="137" height="85" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="QgYz-w7MwsADk0cZRM1J-20" value="<font face="Courier New">Receiver</font><div>pc1234</div><div><span><font style="color: rgb(74, 123, 114);">129.129.100.115</font></span></div>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#88BBEE;strokeColor=#88BBEE;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;fontFamily=Helvetica;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="46.5" y="2549.1" width="137" height="85" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="QgYz-w7MwsADk0cZRM1J-21" value="<pre style=""><pre><span style="background-color: transparent;"><font style="">Receiver streaming out<br><font style="">rx_zmqport</font>&nbsp;= <font style=""><b style="">30002</b></font></font></span></pre></pre>" style="text;html=1;align=left;verticalAlign=middle;resizable=1;points=[];autosize=1;strokeColor=#4A7B72;fillColor=default;fontColor=#4A7B72;movable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-130.5" y="2563.1" width="166" height="44" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="QgYz-w7MwsADk0cZRM1J-24" value="<font face="Comic Sans MS">Client/ GUI</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#AAAAFF;strokeColor=#AAAAFF;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-498" y="2235" width="132" height="68" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="QgYz-w7MwsADk0cZRM1J-25" value="" style="points=[[0.35,0,0],[0.98,0.51,0],[1,0.71,0],[0.67,1,0],[0,0.795,0],[0,0.65,0]];verticalLabelPosition=bottom;sketch=0;html=1;verticalAlign=top;aspect=fixed;align=center;pointerEvents=1;shape=mxgraph.cisco19.user;fillColor=#AAAAFF;strokeColor=none;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-457.0000000000001" y="2185" width="50" height="50" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="QgYz-w7MwsADk0cZRM1J-26" value="<p><font face="Courier New" style="">Client listening to&nbsp;<br><font style="">zmqport</font> : <font style=""><b style="">30001</b></font><br><font style="">zmqip</font>&nbsp; &nbsp;: <font style=""><b style="">129.129.100.115</b></font></font></p>" style="text;html=1;align=left;verticalAlign=middle;resizable=1;points=[];autosize=1;strokeColor=#4A7B72;fillColor=default;fontColor=#4A7B72;movable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="-559" y="2319.63" width="187" height="56" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="kpcteDQP5Q-WdnKVJ5EM-2" value="<font style="font-size: 17px;" face="Comic Sans MS">Detector</font>" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#737373;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="499.15" y="71" width="77" height="32" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
</root>
|
||||||
|
</mxGraphModel>
|
||||||
|
</diagram>
|
||||||
|
</mxfile>
|
||||||
387
docs/src/binaryfileformat.rst
Normal file
@@ -0,0 +1,387 @@
|
|||||||
|
.. _binary file format:
|
||||||
|
|
||||||
|
Binary File Format
|
||||||
|
====================
|
||||||
|
|
||||||
|
This is the default file format that can be configured using command `fformat <commandline.html#term-fformat-binary-hdf5>`_.
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
sls_detector_put fformat binary
|
||||||
|
|
||||||
|
|
||||||
|
Master File
|
||||||
|
--------------
|
||||||
|
|
||||||
|
* File Name: [fpath]/[fname]_master_[findex].json :ref:`Details here<file name format>`
|
||||||
|
|
||||||
|
* It is in json format and created for every acquisition.
|
||||||
|
|
||||||
|
* It contains :ref:`attributes<master file attributes>` relevant to the acquisition. This can vary with detector type shown in :ref:`master json file examples <json master file examples>` here.
|
||||||
|
|
||||||
|
* It shows the :ref:`**SLS Receiver Header** <sls receiver header format>` format used in data files.
|
||||||
|
|
||||||
|
* Enabled/disabled using command `fmaster <commandline.html#term-fmaster-0-1>`_.
|
||||||
|
|
||||||
|
|
||||||
|
Data File
|
||||||
|
----------
|
||||||
|
|
||||||
|
* File Name: [fpath]/[fname]_dx_fy_[findex].raw :ref:`Details here<file name format>`
|
||||||
|
|
||||||
|
* It store multiple frames sequentially, with total number of frames determined by `rx_framesperfile <commandline.html#term-rx_framesperfile-n_frames>`_ parameter.
|
||||||
|
|
||||||
|
* Each frame includes a :ref:`**sls_receiver_header** <sls receiver header format>` structure, followed by the actual frame data.
|
||||||
|
|
||||||
|
* More details on :ref:`slsReceiverHeader<sls receiver header format>` and the actual image data is described in the :ref:`Detector Image Size and Format <data format>` section.
|
||||||
|
|
||||||
|
|
||||||
|
.. _json master file examples:
|
||||||
|
|
||||||
|
JSON Master File Examples
|
||||||
|
---------------------------------------------------
|
||||||
|
|
||||||
|
Eiger
|
||||||
|
^^^^^
|
||||||
|
|
||||||
|
.. code-block:: text
|
||||||
|
|
||||||
|
{
|
||||||
|
"Version": 7.2,
|
||||||
|
"Timestamp": "Wed Nov 13 15:46:30 2024",
|
||||||
|
"Detector Type": "Eiger",
|
||||||
|
"Timing Mode": "auto",
|
||||||
|
"Geometry": {
|
||||||
|
"x": 2,
|
||||||
|
"y": 1
|
||||||
|
},
|
||||||
|
"Image Size in bytes": 262144,
|
||||||
|
"Pixels": {
|
||||||
|
"x": 512,
|
||||||
|
"y": 256
|
||||||
|
},
|
||||||
|
"Max Frames Per File": 10000,
|
||||||
|
"Frame Discard Policy": "nodiscard",
|
||||||
|
"Frame Padding": 1,
|
||||||
|
"Scan Parameters": "[disabled]",
|
||||||
|
"Total Frames": 1,
|
||||||
|
"Receiver Roi": {
|
||||||
|
"xmin": 4294967295,
|
||||||
|
"xmax": 4294967295,
|
||||||
|
"ymin": 4294967295,
|
||||||
|
"ymax": 4294967295
|
||||||
|
},
|
||||||
|
"Dynamic Range": 16,
|
||||||
|
"Ten Giga": 0,
|
||||||
|
"Exptime": "1s",
|
||||||
|
"Period": "1s",
|
||||||
|
"Threshold Energy": -1,
|
||||||
|
"Sub Exptime": "2.62144ms",
|
||||||
|
"Sub Period": "2.62144ms",
|
||||||
|
"Quad": 0,
|
||||||
|
"Number of rows": 256,
|
||||||
|
"Rate Corrections": "[0]",
|
||||||
|
"Frames in File": 1,
|
||||||
|
"Frame Header Format": {
|
||||||
|
"Frame Number": "8 bytes",
|
||||||
|
"SubFrame Number/ExpLength": "4 bytes",
|
||||||
|
"Packet Number": "4 bytes",
|
||||||
|
"Bunch ID": "8 bytes",
|
||||||
|
"Timestamp": "8 bytes",
|
||||||
|
"Module Id": "2 bytes",
|
||||||
|
"Row": "2 bytes",
|
||||||
|
"Column": "2 bytes",
|
||||||
|
"Reserved": "2 bytes",
|
||||||
|
"Debug": "4 bytes",
|
||||||
|
"Round Robin Number": "2 bytes",
|
||||||
|
"Detector Type": "1 byte",
|
||||||
|
"Header Version": "1 byte",
|
||||||
|
"Packets Caught Mask": "64 bytes"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Jungfrau
|
||||||
|
^^^^^^^^
|
||||||
|
|
||||||
|
.. code-block:: text
|
||||||
|
|
||||||
|
{
|
||||||
|
"Version": 7.2,
|
||||||
|
"Timestamp": "Wed Nov 13 13:03:53 2024",
|
||||||
|
"Detector Type": "Jungfrau",
|
||||||
|
"Timing Mode": "auto",
|
||||||
|
"Geometry": {
|
||||||
|
"x": 1,
|
||||||
|
"y": 1
|
||||||
|
},
|
||||||
|
"Image Size in bytes": 1048576,
|
||||||
|
"Pixels": {
|
||||||
|
"x": 1024,
|
||||||
|
"y": 512
|
||||||
|
},
|
||||||
|
"Max Frames Per File": 10000,
|
||||||
|
"Frame Discard Policy": "nodiscard",
|
||||||
|
"Frame Padding": 1,
|
||||||
|
"Scan Parameters": "[disabled]",
|
||||||
|
"Total Frames": 1000,
|
||||||
|
"Receiver Roi": {
|
||||||
|
"xmin": 4294967295,
|
||||||
|
"xmax": 4294967295,
|
||||||
|
"ymin": 4294967295,
|
||||||
|
"ymax": 4294967295
|
||||||
|
},
|
||||||
|
"Exptime": "10us",
|
||||||
|
"Period": "2ms",
|
||||||
|
"Number of UDP Interfaces": 1,
|
||||||
|
"Number of rows": 512,
|
||||||
|
"Frames in File": 10,
|
||||||
|
"Frame Header Format": {
|
||||||
|
"Frame Number": "8 bytes",
|
||||||
|
"SubFrame Number/ExpLength": "4 bytes",
|
||||||
|
"Packet Number": "4 bytes",
|
||||||
|
"Bunch ID": "8 bytes",
|
||||||
|
"Timestamp": "8 bytes",
|
||||||
|
"Module Id": "2 bytes",
|
||||||
|
"Row": "2 bytes",
|
||||||
|
"Column": "2 bytes",
|
||||||
|
"Reserved": "2 bytes",
|
||||||
|
"Debug": "4 bytes",
|
||||||
|
"Round Robin Number": "2 bytes",
|
||||||
|
"Detector Type": "1 byte",
|
||||||
|
"Header Version": "1 byte",
|
||||||
|
"Packets Caught Mask": "64 bytes"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Gotthard2
|
||||||
|
^^^^^^^^^^^^
|
||||||
|
|
||||||
|
.. code-block:: text
|
||||||
|
|
||||||
|
{
|
||||||
|
"Version": 7.2,
|
||||||
|
"Timestamp": "Wed Nov 13 14:18:17 2024",
|
||||||
|
"Detector Type": "Gotthard2",
|
||||||
|
"Timing Mode": "auto",
|
||||||
|
"Geometry": {
|
||||||
|
"x": 1,
|
||||||
|
"y": 1
|
||||||
|
},
|
||||||
|
"Image Size in bytes": 2560,
|
||||||
|
"Pixels": {
|
||||||
|
"x": 1280,
|
||||||
|
"y": 1
|
||||||
|
},
|
||||||
|
"Max Frames Per File": 20000,
|
||||||
|
"Frame Discard Policy": "nodiscard",
|
||||||
|
"Frame Padding": 1,
|
||||||
|
"Scan Parameters": "[disabled]",
|
||||||
|
"Total Frames": 10,
|
||||||
|
"Receiver Roi": {
|
||||||
|
"xmin": 4294967295,
|
||||||
|
"xmax": 4294967295,
|
||||||
|
"ymin": 4294967295,
|
||||||
|
"ymax": 4294967295
|
||||||
|
},
|
||||||
|
"Exptime": "0ns",
|
||||||
|
"Period": "0ns",
|
||||||
|
"Burst Mode": "burst_internal",
|
||||||
|
"Frames in File": 10,
|
||||||
|
"Frame Header Format": {
|
||||||
|
"Frame Number": "8 bytes",
|
||||||
|
"SubFrame Number/ExpLength": "4 bytes",
|
||||||
|
"Packet Number": "4 bytes",
|
||||||
|
"Bunch ID": "8 bytes",
|
||||||
|
"Timestamp": "8 bytes",
|
||||||
|
"Module Id": "2 bytes",
|
||||||
|
"Row": "2 bytes",
|
||||||
|
"Column": "2 bytes",
|
||||||
|
"Reserved": "2 bytes",
|
||||||
|
"Debug": "4 bytes",
|
||||||
|
"Round Robin Number": "2 bytes",
|
||||||
|
"Detector Type": "1 byte",
|
||||||
|
"Header Version": "1 byte",
|
||||||
|
"Packets Caught Mask": "64 bytes"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Mythen3
|
||||||
|
^^^^^^^
|
||||||
|
|
||||||
|
.. code-block:: text
|
||||||
|
|
||||||
|
{
|
||||||
|
"Version": 7.2,
|
||||||
|
"Timestamp": "Wed Nov 13 14:39:14 2024",
|
||||||
|
"Detector Type": "Mythen3",
|
||||||
|
"Timing Mode": "auto",
|
||||||
|
"Geometry": {
|
||||||
|
"x": 1,
|
||||||
|
"y": 1
|
||||||
|
},
|
||||||
|
"Image Size in bytes": 15360,
|
||||||
|
"Pixels": {
|
||||||
|
"x": 3840,
|
||||||
|
"y": 1
|
||||||
|
},
|
||||||
|
"Max Frames Per File": 10000,
|
||||||
|
"Frame Discard Policy": "nodiscard",
|
||||||
|
"Frame Padding": 1,
|
||||||
|
"Scan Parameters": "[disabled]",
|
||||||
|
"Total Frames": 1,
|
||||||
|
"Receiver Roi": {
|
||||||
|
"xmin": 4294967295,
|
||||||
|
"xmax": 4294967295,
|
||||||
|
"ymin": 4294967295,
|
||||||
|
"ymax": 4294967295
|
||||||
|
},
|
||||||
|
"Dynamic Range": 32,
|
||||||
|
"Ten Giga": 1,
|
||||||
|
"Period": "2ms",
|
||||||
|
"Counter Mask": "0x7",
|
||||||
|
"Exptime1": "0.1s",
|
||||||
|
"Exptime2": "0.1s",
|
||||||
|
"Exptime3": "0.1s",
|
||||||
|
"GateDelay1": "0ns",
|
||||||
|
"GateDelay2": "0ns",
|
||||||
|
"GateDelay3": "0ns",
|
||||||
|
"Gates": 1,
|
||||||
|
"Threshold Energies": "[-1, -1, -1]",
|
||||||
|
"Frames in File": 1,
|
||||||
|
"Frame Header Format": {
|
||||||
|
"Frame Number": "8 bytes",
|
||||||
|
"SubFrame Number/ExpLength": "4 bytes",
|
||||||
|
"Packet Number": "4 bytes",
|
||||||
|
"Bunch ID": "8 bytes",
|
||||||
|
"Timestamp": "8 bytes",
|
||||||
|
"Module Id": "2 bytes",
|
||||||
|
"Row": "2 bytes",
|
||||||
|
"Column": "2 bytes",
|
||||||
|
"Reserved": "2 bytes",
|
||||||
|
"Debug": "4 bytes",
|
||||||
|
"Round Robin Number": "2 bytes",
|
||||||
|
"Detector Type": "1 byte",
|
||||||
|
"Header Version": "1 byte",
|
||||||
|
"Packets Caught Mask": "64 bytes"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Moench
|
||||||
|
^^^^^^
|
||||||
|
|
||||||
|
.. code-block:: text
|
||||||
|
|
||||||
|
{
|
||||||
|
"Version": 7.2,
|
||||||
|
"Timestamp": "Wed Nov 13 14:41:32 2024",
|
||||||
|
"Detector Type": "Moench",
|
||||||
|
"Timing Mode": "auto",
|
||||||
|
"Geometry": {
|
||||||
|
"x": 1,
|
||||||
|
"y": 1
|
||||||
|
},
|
||||||
|
"Image Size in bytes": 320000,
|
||||||
|
"Pixels": {
|
||||||
|
"x": 400,
|
||||||
|
"y": 400
|
||||||
|
},
|
||||||
|
"Max Frames Per File": 100000,
|
||||||
|
"Frame Discard Policy": "discardpartial",
|
||||||
|
"Frame Padding": 1,
|
||||||
|
"Scan Parameters": "[disabled]",
|
||||||
|
"Total Frames": 1,
|
||||||
|
"Receiver Roi": {
|
||||||
|
"xmin": 4294967295,
|
||||||
|
"xmax": 4294967295,
|
||||||
|
"ymin": 4294967295,
|
||||||
|
"ymax": 4294967295
|
||||||
|
},
|
||||||
|
"Exptime": "10us",
|
||||||
|
"Period": "2ms",
|
||||||
|
"Number of UDP Interfaces": 1,
|
||||||
|
"Number of rows": 400,
|
||||||
|
"Frames in File": 1,
|
||||||
|
"Frame Header Format": {
|
||||||
|
"Frame Number": "8 bytes",
|
||||||
|
"SubFrame Number/ExpLength": "4 bytes",
|
||||||
|
"Packet Number": "4 bytes",
|
||||||
|
"Bunch ID": "8 bytes",
|
||||||
|
"Timestamp": "8 bytes",
|
||||||
|
"Module Id": "2 bytes",
|
||||||
|
"Row": "2 bytes",
|
||||||
|
"Column": "2 bytes",
|
||||||
|
"Reserved": "2 bytes",
|
||||||
|
"Debug": "4 bytes",
|
||||||
|
"Round Robin Number": "2 bytes",
|
||||||
|
"Detector Type": "1 byte",
|
||||||
|
"Header Version": "1 byte",
|
||||||
|
"Packets Caught Mask": "64 bytes"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Chip Test Board
|
||||||
|
^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
.. code-block:: text
|
||||||
|
|
||||||
|
{
|
||||||
|
"Version": 7.2,
|
||||||
|
"Timestamp": "Wed Nov 13 15:32:59 2024",
|
||||||
|
"Detector Type": "ChipTestBoard",
|
||||||
|
"Timing Mode": "auto",
|
||||||
|
"Geometry": {
|
||||||
|
"x": 1,
|
||||||
|
"y": 1
|
||||||
|
},
|
||||||
|
"Image Size in bytes": 48018,
|
||||||
|
"Pixels": {
|
||||||
|
"x": 3,
|
||||||
|
"y": 1
|
||||||
|
},
|
||||||
|
"Max Frames Per File": 20000,
|
||||||
|
"Frame Discard Policy": "nodiscard",
|
||||||
|
"Frame Padding": 1,
|
||||||
|
"Scan Parameters": "[disabled]",
|
||||||
|
"Total Frames": 1,
|
||||||
|
"Receiver Roi": {
|
||||||
|
"xmin": 4294967295,
|
||||||
|
"xmax": 4294967295,
|
||||||
|
"ymin": 4294967295,
|
||||||
|
"ymax": 4294967295
|
||||||
|
},
|
||||||
|
"Exptime": "0ns",
|
||||||
|
"Period": "0.18s",
|
||||||
|
"Ten Giga": 0,
|
||||||
|
"ADC Mask": "0x2202",
|
||||||
|
"Analog Flag": 1,
|
||||||
|
"Analog Samples": 8003,
|
||||||
|
"Digital Flag": 0,
|
||||||
|
"Digital Samples": 1000,
|
||||||
|
"Dbit Offset": 0,
|
||||||
|
"Dbit Reorder": 1,
|
||||||
|
"Dbit Bitset": 0,
|
||||||
|
"Transceiver Mask": "0x3",
|
||||||
|
"Transceiver Flag": 0,
|
||||||
|
"Transceiver Samples": 1,
|
||||||
|
"Frames in File": 1,
|
||||||
|
"Frame Header Format": {
|
||||||
|
"Frame Number": "8 bytes",
|
||||||
|
"SubFrame Number/ExpLength": "4 bytes",
|
||||||
|
"Packet Number": "4 bytes",
|
||||||
|
"Bunch ID": "8 bytes",
|
||||||
|
"Timestamp": "8 bytes",
|
||||||
|
"Module Id": "2 bytes",
|
||||||
|
"Row": "2 bytes",
|
||||||
|
"Column": "2 bytes",
|
||||||
|
"Reserved": "2 bytes",
|
||||||
|
"Debug": "4 bytes",
|
||||||
|
"Round Robin Number": "2 bytes",
|
||||||
|
"Detector Type": "1 byte",
|
||||||
|
"Header Version": "1 byte",
|
||||||
|
"Packets Caught Mask": "64 bytes"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,11 +4,56 @@ Command line interface
|
|||||||
Usage
|
Usage
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
Commands can be used either with sls_detector_get or sls_detector_put
|
The syntax is *'[detector index]-[module index]:[command]'*, where the indices are by default '0', when not specified.
|
||||||
|
|
||||||
|
.. _cl-module-index-label:
|
||||||
|
|
||||||
|
Module index
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
Modules are indexed based on their order in the hostname command. They are used to configure a specific module within a detector and are followed by a ':' in syntax.
|
||||||
|
|
||||||
|
.. code-block::
|
||||||
|
|
||||||
|
# Applies to all modules of detector 0
|
||||||
|
sls_detector_put exptime 5s
|
||||||
|
|
||||||
|
# Applies to only the 4th module
|
||||||
|
sls_detector_put 3:exptime 5s
|
||||||
|
|
||||||
|
|
||||||
|
Detector index
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
This index is useful when configuring multiple detectors from a single host. Each detector uses a unique shared memory identified by a detector index, derived again from the hostname command. It is followed by a '-'.
|
||||||
|
|
||||||
|
.. code-block::
|
||||||
|
|
||||||
|
# For detector with index 2 in shared memory
|
||||||
|
sls_detector_put 2-hostname bchip133+bchip123+bchip456
|
||||||
|
|
||||||
|
# Without '-', the detector index defaults to 0
|
||||||
|
sls_detector_put hostname bchip133+bchip123+bchip456
|
||||||
|
|
||||||
|
# Accessing all modules with detector index 2
|
||||||
|
sls_detector_put 2-exptime
|
||||||
|
|
||||||
|
# Starting acquisition only for detector with index 2
|
||||||
|
sls_detector_put 2-start
|
||||||
|
|
||||||
|
# Applies only to the 2nd detector, 4th module
|
||||||
|
sls_detector_put 1-3:exptime 5s
|
||||||
|
|
||||||
|
|
||||||
|
Command Execution
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
Commands can be executed using:
|
||||||
|
|
||||||
|
* **sls_detector_put**: setting values
|
||||||
|
* **sls_detector_get**: getting values
|
||||||
|
* **sls_detector**: automatically infers based on the number of arguments.
|
||||||
|
* **sls_detector_help**: gets help on the specific command
|
||||||
|
* **sls_detector_acquire**: initiates acquisition with the detector. This command blocks until the entire acquisition process is completed.
|
||||||
|
|
||||||
.. code-block::
|
|
||||||
|
|
||||||
sls_detector_get vrf
|
|
||||||
|
|
||||||
Help
|
Help
|
||||||
--------
|
--------
|
||||||
@@ -25,6 +70,19 @@ Help
|
|||||||
sls_detector_get -h fpath
|
sls_detector_get -h fpath
|
||||||
sls_detector_help fpath
|
sls_detector_help fpath
|
||||||
|
|
||||||
|
# list of deprecated commands
|
||||||
|
list deprecated
|
||||||
|
|
||||||
|
|
||||||
|
Autocompletion
|
||||||
|
---------------
|
||||||
|
|
||||||
|
bash_autocomplete.sh or zsh_autocomplete.sh must be sourced from the main package folder to enable auto completion of commands and arguments for the command line on that shell.
|
||||||
|
|
||||||
|
.. code-block::
|
||||||
|
|
||||||
|
source bash_autocomplete.sh
|
||||||
|
|
||||||
|
|
||||||
Commands
|
Commands
|
||||||
-----------
|
-----------
|
||||||
@@ -32,14 +90,14 @@ Commands
|
|||||||
.. include:: ../commands.rst
|
.. include:: ../commands.rst
|
||||||
|
|
||||||
|
|
||||||
Depreciated commands
|
Deprecated commands
|
||||||
------------------------
|
------------------------
|
||||||
|
|
||||||
.. note ::
|
.. note ::
|
||||||
All the dac commands are preceded with the **dac** command. Use command **daclist** to get correct list of dac command arguments for current detector.
|
All the dac commands are preceded with the **dac** command. Use command **daclist** to get correct list of dac command arguments for current detector.
|
||||||
|
|
||||||
.. csv-table:: Depreciated commands
|
.. csv-table:: Deprecated commands
|
||||||
:file: ../depreciated.csv
|
:file: ../deprecated.csv
|
||||||
:widths: 35, 35
|
:widths: 35, 35
|
||||||
:header-rows: 1
|
:header-rows: 1
|
||||||
|
|
||||||
|
|||||||
242
docs/src/configcommands.rst
Normal file
@@ -0,0 +1,242 @@
|
|||||||
|
.. _setup commands:
|
||||||
|
|
||||||
|
Setup Commands
|
||||||
|
================================
|
||||||
|
|
||||||
|
|
||||||
|
Introduction
|
||||||
|
-------------
|
||||||
|
|
||||||
|
To connect to any device, one needs a unique combination of **IP address** (which identifies the device) and **port number** (which specifies the service).
|
||||||
|
|
||||||
|
This package typically deals with two types of network interfaces:
|
||||||
|
|
||||||
|
* **1 GbE public interface** - Accessible from anywhere on the network. Connectivity can be verified by pinging this interface from any PC.
|
||||||
|
|
||||||
|
* **10 GbE private interface** - Dedicated to high-speed data transfer with a specific PC. In addition to the 1 GbE public interface (MTU 1500), the device may include one or more private 10 GbE interfaces (MTU 9000), which are not accessible from other machines.
|
||||||
|
|
||||||
|
Client to Module
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
.. figure:: images/Client_module_commands.png
|
||||||
|
:target: _images/Client_module_commands.png
|
||||||
|
:width: 700px
|
||||||
|
:align: center
|
||||||
|
:alt: Client Module Commands
|
||||||
|
|
||||||
|
Client Module TCP Commands
|
||||||
|
|
||||||
|
The client configures and controls modules via the 1 GbE public TCP interface.
|
||||||
|
|
||||||
|
* Should be able to ping the module's hostname from any PC on the network.
|
||||||
|
* If one cannot ping, ensure that it is powered on.
|
||||||
|
* If the command cannot connect to the port (`hostname command <commandline.html#term-hostname>`_ failed), the onboard servers may not have started yet.
|
||||||
|
|
||||||
|
Each physical module has its own unique IP address. As the IPs are already different, all modules can share the same default ports:
|
||||||
|
|
||||||
|
* 1952 - Default Module TCP Control Port
|
||||||
|
* 1953 - Default Module TCP Stop port
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
# Therefore, one can use
|
||||||
|
hostname bchip100+bchip101+
|
||||||
|
# instead of
|
||||||
|
hostname bchip100:1952+bchip101:1954+
|
||||||
|
|
||||||
|
|
||||||
|
**Simulators**, however, usually run on the same PC. See `virtual servers <https://slsdetectorgroup.github.io/devdoc/virtualserver.html>`_ for more details. In that case, each instance must use a different port. By incrementing port numbers, you can also use the virtual command for convenience.
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
# Therefore, one can use
|
||||||
|
virtual 2 1952
|
||||||
|
# instead of
|
||||||
|
hostname localhost:1952+localhost:1954+
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Client to Receiver
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
.. figure:: images/Client_receiver_commands.png
|
||||||
|
:target: _images/Client_receiver_commands.png
|
||||||
|
:align: center
|
||||||
|
:alt: Client Receiver Commands
|
||||||
|
|
||||||
|
Client Receiver TCP Commands
|
||||||
|
|
||||||
|
Each module has a receiver, which can be either local or remote.
|
||||||
|
|
||||||
|
The client can configure and control receivers via the 1 GbE public TCP interface:
|
||||||
|
|
||||||
|
* Should be able to ping the receiver's hostname from any PC on the network.
|
||||||
|
* If one cannot ping, ensure that it is powered on.
|
||||||
|
* If the command cannot connect to the port (`rx_hostname command <commandline.html#term-rx_hostname-hostname-or-ip-address>`_ failed), the receivers may not have started yet.
|
||||||
|
|
||||||
|
|
||||||
|
Since multiple receiver processes typically run on the same PC, they share the same IP. Here, each receiver process must use a different TCP port for a unique connection.
|
||||||
|
|
||||||
|
* 1954 - Default Receiver TCP port
|
||||||
|
|
||||||
|
Configuring the receiver with the command `rx_hostname command <commandline.html#term-rx_hostname-hostname-or-ip-address>`_, sets up a receiver for every module in shared memory automatically ie. every module's receiver TCP port will automatically increment in shared memory. The starting port is defined by the command `rx_tcpport <commandline.html#term-rx_tcpport-port>`_ with the default being 1954.
|
||||||
|
|
||||||
|
|
||||||
|
A multi-module command (without colon or module index) sets incremental ports starting from the specified port number.
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
hostname bchip100+bchip101+bchip102+bchip103+
|
||||||
|
rx_tcport 2000 # sets the receiver port to 2000, 2001, 2002, 2003
|
||||||
|
|
||||||
|
|
||||||
|
For example, using default TCP ports (1954, 1955):
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
hostname bchip100+bchip101+
|
||||||
|
rx_hostname localhost
|
||||||
|
# Equivalent to:
|
||||||
|
rx_hostname localhost:1954+localhost:1955+
|
||||||
|
|
||||||
|
# or set to another set of ports (automatically incremented)
|
||||||
|
rx_tcpport 1984
|
||||||
|
rx_hostname localhost
|
||||||
|
# instead of
|
||||||
|
rx_hostname localhost:1984+localhost:1985+
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Module to Receiver
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
.. figure:: images/Module_receiver_commands.png
|
||||||
|
:target: _images/Module_receiver_commands.png
|
||||||
|
:align: center
|
||||||
|
:alt: Module Receiver Commands
|
||||||
|
|
||||||
|
Module Receiver UDP Commands
|
||||||
|
|
||||||
|
**10GbE Interface**
|
||||||
|
|
||||||
|
The module typically sends images to the receiver via a 10 GbE private interface on the receiver PC, which has an MTU of 9000 to support jumbo packets. The private interface is not reachable from other machines, so it cannot be pinged from anywhere.
|
||||||
|
|
||||||
|
**Multiple UDP Packets**
|
||||||
|
|
||||||
|
Images are split into UDP packets for transmission. Unlike TCP, UDP is connectionless and does not guarantee delivery. Therefore, the receiver PC must be tuned for reliable reception. See `Troubleshooting <https://slsdetectorgroup.github.io/devdoc/troubleshooting.html>`_.
|
||||||
|
|
||||||
|
**UDP Configuration**
|
||||||
|
|
||||||
|
Unlike TCP, the module (hardware) requires explicit configuration for sending images via UDP, including:
|
||||||
|
|
||||||
|
* Source and destination IPs
|
||||||
|
* Source and destination MAC addresses
|
||||||
|
* Source and destination ports
|
||||||
|
|
||||||
|
**UDP Destination**
|
||||||
|
|
||||||
|
Info on where to send the image from the module to.
|
||||||
|
|
||||||
|
**UDP Desination IP** - The IP of the receiver PC's 10 GbE interface, usually found via ``ifconfig``. Command: `udp_dstip <commandline.html#term-udp_dstip-x.x.x.x-or-auto>`_. For 1GbE interface and for this command, one can use 'auto' as an argument, which will pick up the IP from the `rx_hostname command <commandline.html#term-rx_hostname-hostname-or-ip-address>`_.
|
||||||
|
|
||||||
|
**UDP desintation MAC** - Also obtained from the interface using ``ifconfig``. For built-in receivers, the module configures this automatically from the ``UDP destination IP``. For custom receivers, it must be explicitly provided. Command: `udp_dstmac <commandline.html#term-udp_dstmac-x-x-x-x-x-x>`_
|
||||||
|
|
||||||
|
**UDP destination port** - Ensure uniqueness if multiple users share the interface. Command: `udp_dstport <commandline.html#term-udp_dstport-n>`_
|
||||||
|
|
||||||
|
* 50001 - Default Receiver UDP port
|
||||||
|
|
||||||
|
|
||||||
|
**UDP Source**
|
||||||
|
|
||||||
|
As it is a one-way communication (module to receiver with no reply or acknowledgements), info on the source of the image is more for debugging purposes and prevent packet rejection.
|
||||||
|
|
||||||
|
**UDP source IP** - Must be on the same subnet as the destination IP (same first three octets) to prevent packet rejection by the receiver interface. For 1GbE interface and for this command (except for Eiger), one can use ``auto`` as an argument, which will pick up the IP from the `hostname command <commandline.html#term-hostname>`_. Command: `udp_srcip <commandline.html#term-udp_srcip-x.x.x.x-or-auto>`_
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
# 10 GbE interface
|
||||||
|
hostname bchip100
|
||||||
|
udp_dstip 10.0.2.1
|
||||||
|
udp_srcip 10.0.2.19
|
||||||
|
rx_hostname localhost
|
||||||
|
|
||||||
|
# 1 GbE interface
|
||||||
|
hostname bchip100
|
||||||
|
rx_hostname localhost
|
||||||
|
udp_dstip auto # this command uses IP from rx_hostname. So, it comes after.
|
||||||
|
udp_srcip auto # this command uses IP from hostname
|
||||||
|
|
||||||
|
**UDP source MAC** - By default, it is set to ``aa:bb:cc:dd:xx:yy`` where ``xx`` and ``yy`` are module row and column indices to differentiate the modules while debugging. Command: `udp_srcmac <commandline.html#term-udp_srcmac-x-x-x-x-x-x>`_
|
||||||
|
|
||||||
|
|
||||||
|
**UDP source port** - This is hardcoded in every module to the same value in the detector server and cannot be changed.
|
||||||
|
|
||||||
|
Note: If there is a second UDP port on the module, use 'udp_dstport2' or 'udp_dstip2'etc. See `here <https://slsdetectorgroup.github.io/devdoc/dataformat.html>`_ for more detector specific info.
|
||||||
|
|
||||||
|
Receiver to GUI
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
.. figure:: images/Receiver_gui_commands.png
|
||||||
|
:target: _images/Receiver_gui_commands.png
|
||||||
|
:align: center
|
||||||
|
:alt: Receiver GUI Commands
|
||||||
|
|
||||||
|
Receiver GUI Commands
|
||||||
|
|
||||||
|
|
||||||
|
Enabling the GUI automatically streams images from the receiver via ZMQ sockets. Even without the GUI, streaming can be activated explicitly using the command `rx_zmqstream <commandline.html#term-rx_zmqstream-0-1>`_. ZMQ streaming uses TCP/IP, so the ports must be configured appropriately.
|
||||||
|
|
||||||
|
**Receiver ZMQ Port** - Port from which the receiver streams ZMQ packets. Command: `rx_zmqport <commandline.html#term-rx_zmqport-port>`_
|
||||||
|
|
||||||
|
* 30001 - Default Receiver ZMQ Port (stream out from)
|
||||||
|
|
||||||
|
**Client ZMQ Port** - Port that the client ZMQ socket listens to. Command: `zmqport <commandline.html#term-zmqport-port>`_
|
||||||
|
|
||||||
|
* 30001 - Default Client ZMQ Port (listens to)
|
||||||
|
|
||||||
|
**Client ZMQ IP** - IP address the client ZMQ socket listens to. Command: `zmqip <commandline.html#term-zmqip-x.x.x.x>`_. By default, this is set to the IP of ``rx_hostname``, but can be set to any IP address that the client can reach.
|
||||||
|
|
||||||
|
* Default: Receiver’s hostname (rx_hostname)
|
||||||
|
|
||||||
|
|
||||||
|
.. note ::
|
||||||
|
|
||||||
|
``zmqport`` and ``zmqip`` need to be set up in shared memory before starting up the Gui. If the Gui is already running, change it in the Advanced Tab directly in the Gui.
|
||||||
|
|
||||||
|
``rx_zmqstream`` is set to 1 when the GUI is started, but has to be manually set back to 0 to disable zmq streaming in the receiver for better performance when not using the Gui.
|
||||||
|
|
||||||
|
The GUI hwm (high water mark, which is like a measurement of the number of enqueued zmq packets) values are set to a low number (from library default of possibly 1000 to 2) to reduce the zmq buffer to display only some of the images. Resetting it back to -1 or 1000 should only matter if one plans to not use the Gui and still zmq stream without wanting to drop zmq images (eg. for external processing chain).
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Receiver to External Processing
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
|
.. figure:: images/Receiver_external_process_commands.png
|
||||||
|
:target: _images/Receiver_external_process_commands.png
|
||||||
|
:align: center
|
||||||
|
:alt: Click to zoom
|
||||||
|
|
||||||
|
Receiver External Process Commands
|
||||||
|
|
||||||
|
Images from the receiver can also be streamed to an external processing chain for further processing or storage. In this setup:
|
||||||
|
|
||||||
|
* The external processor listens to the ZMQ ports and IPs that the receiver streams from.
|
||||||
|
|
||||||
|
* The client ZMQ sockets now listen to the ports and IPs that the external processor streams from instead of the receiver.
|
||||||
|
|
||||||
|
**Receiver ZMQ Port** - Port from which the receiver streams ZMQ packets. Command: `rx_zmqport <commandline.html#term-rx_zmqport-port>`_
|
||||||
|
|
||||||
|
* 30001 - Default Receiver ZMQ Port (stream out from)
|
||||||
|
|
||||||
|
**Client ZMQ Port** - Port that the client ZMQ socket listens to. Command: `zmqport <commandline.html#term-zmqport-port>`_. In this set up, it should listen to the zmq port that the external process is streaming out from.
|
||||||
|
|
||||||
|
* 30001 - Default Client ZMQ Port (listens to)
|
||||||
|
|
||||||
|
**Client ZMQ IP** - IP address the client ZMQ socket listens to. Command: `zmqip <commandline.html#term-zmqip-x.x.x.x>`_. By default, this is set to the IP of ``rx_hostname``, but in this set up, it should listen to the zmq IP that the external process is streaming out from.
|
||||||
|
|
||||||
|
* Default: Receiver’s hostname (rx_hostname)
|
||||||
@@ -19,7 +19,7 @@ A minimal CMakeLists.txt could look like this:
|
|||||||
.. code-block:: cmake
|
.. code-block:: cmake
|
||||||
|
|
||||||
project(myDetectorIntegration)
|
project(myDetectorIntegration)
|
||||||
cmake_minimum_required(VERSION 3.12)
|
cmake_minimum_required(VERSION 3.14)
|
||||||
add_subdirectory(slsDetectorPackage)
|
add_subdirectory(slsDetectorPackage)
|
||||||
|
|
||||||
#Add your executable
|
#Add your executable
|
||||||
@@ -43,7 +43,7 @@ should be needed, otherwise specify cmake prefix path.
|
|||||||
|
|
||||||
.. code-block:: cmake
|
.. code-block:: cmake
|
||||||
|
|
||||||
cmake_minimum_required(VERSION 3.12)
|
cmake_minimum_required(VERSION 3.14)
|
||||||
project(myintegration)
|
project(myintegration)
|
||||||
|
|
||||||
find_package(slsDetectorPackage 5.0 REQUIRED)
|
find_package(slsDetectorPackage 5.0 REQUIRED)
|
||||||
|
|||||||
330
docs/src/dataformat.rst
Normal file
@@ -0,0 +1,330 @@
|
|||||||
|
.. _data format:
|
||||||
|
|
||||||
|
Detector Image Size and Format
|
||||||
|
================================
|
||||||
|
|
||||||
|
Each UDP port creates its own output file, which contains the data of the image transmitted over that port. More on number of files and naming for each file in the `File format <fileformat.html>`_ section.
|
||||||
|
|
||||||
|
Jungfrau
|
||||||
|
-------------
|
||||||
|
|
||||||
|
Single Port Configuration
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
.. image:: images/Jungfrau_module.png
|
||||||
|
:target: _images/Jungfrau_module.png
|
||||||
|
:width: 650px
|
||||||
|
:align: center
|
||||||
|
:alt: Jungfrau Module Single Port Configuration
|
||||||
|
|
||||||
|
By default, only the outer 10GbE interface is enabled, transmitting the full image over a single UDP port. This results in one file per module containing the complete image.
|
||||||
|
|
||||||
|
Total image size = 524,288 bytes
|
||||||
|
- 8 chips (2 x 4 grid)
|
||||||
|
- 256 x 256 pixels (chip size)
|
||||||
|
- 2 bytes (pixel width)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Double Port Configuration
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
.. image:: images/Jungfrau_two_port.png
|
||||||
|
:target: _images/Jungfrau_two_port.png
|
||||||
|
:width: 500px
|
||||||
|
:align: center
|
||||||
|
:alt: Jungfrau Module Two Port Configuration
|
||||||
|
|
||||||
|
If both interfaces are enabled using the `numinterfaces <commandline.html#term-numinterfaces-1-2>`_ command on compatible hardware and firmware, the image splits into top and bottom halves sent over two UDP ports:
|
||||||
|
|
||||||
|
- The top half transmits via the inner interface (`udp_dstport2 <commandline.html#term-udp_dstport2-n>`_ and `udp_dstip2 <commandline.html#term-udp_dstip2-x.x.x.x-or-auto>`_).
|
||||||
|
|
||||||
|
- The bottom half uses the outer interface(`udp_dstport <commandline.html#term-udp_dstport-n>`_ and `udp_dstip <commandline.html#term-udp_dstip-x.x.x.x-or-auto>`_).
|
||||||
|
|
||||||
|
The number of files per module equals the active UDP ports—two files per module when both interfaces are used.
|
||||||
|
|
||||||
|
Image size per UDP port or File = 262,144 bytes
|
||||||
|
- **Complete Image size / 2**
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Read Partial Rows
|
||||||
|
^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
.. image:: images/Jungfrau_read_rows.png
|
||||||
|
:target: _images/Jungfrau_read_rows.png
|
||||||
|
:width: 550px
|
||||||
|
:align: center
|
||||||
|
:alt: Jungfrau Module Read Partial Rows Configuration
|
||||||
|
|
||||||
|
|
||||||
|
The number of image rows per port can be adjusted using the `readnrows <commandline.html#term-readnrows>`_ command. By default, 512 rows are read, but a smaller value centers the readout vertically (e.g., 8 rows reads 4 above and 4 below the center). Increasing the value symmetrically expands the region toward the top and bottom. Permissible values are multiples of 8.
|
||||||
|
|
||||||
|
|
||||||
|
Total image size = 32,768 bytes
|
||||||
|
- 8 chips (2 x 4 grid)
|
||||||
|
- **8** x 256 pixels (chip size: **8 rows**)
|
||||||
|
- 2 bytes (pixel width)
|
||||||
|
|
||||||
|
Note: Still in prototype stage, writes complete image (padded or not depending on `rx_padding <commandline.html#term-rx_padding-0-1>`_ parameter) to file. Only the summary written to console in the receiver handles the `readnrows <commandline.html#term-readnrows>`_ to calculate to calculate complete images received. Only reduces network load, not file size. Use `rx_roi <commandline.html#term-rx_roi-xmin-xmax-ymin-ymax>`_ for file size.
|
||||||
|
|
||||||
|
Moench
|
||||||
|
-------------
|
||||||
|
|
||||||
|
Single Port Configuration
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
.. image:: images/Moench_module.png
|
||||||
|
:target: _images/Moench_module.png
|
||||||
|
:width: 550px
|
||||||
|
:align: center
|
||||||
|
:alt: Moench Module Single Port Configuration
|
||||||
|
|
||||||
|
By default, only the outer 10GbE interface is enabled, transmitting the full image over a single UDP port. This results in one file per module containing the complete image.
|
||||||
|
|
||||||
|
Total image size = 320,000 bytes
|
||||||
|
- 400 x 400 pixels (chip size)
|
||||||
|
- 2 bytes (pixel width)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Double Port Configuration
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
.. image:: images/Moench_two_port.png
|
||||||
|
:target: _images/Moench_two_port.png
|
||||||
|
:width: 400px
|
||||||
|
:align: center
|
||||||
|
:alt: Moench Module Two Port Configuration
|
||||||
|
|
||||||
|
If both interfaces are enabled using the `numinterfaces <commandline.html#term-numinterfaces-1-2>`_ command on compatible hardware and firmware, the image splits into top and bottom halves sent over two UDP ports:
|
||||||
|
|
||||||
|
- The top half transmits via the inner interface (`udp_dstport2 <commandline.html#term-udp_dstport2-n>`_ and `udp_dstip2 <commandline.html#term-udp_dstip2-x.x.x.x-or-auto>`_).
|
||||||
|
|
||||||
|
- The bottom half uses the outer interface(`udp_dstport <commandline.html#term-udp_dstport-n>`_ and `udp_dstip <commandline.html#term-udp_dstip-x.x.x.x-or-auto>`_).
|
||||||
|
|
||||||
|
The number of files per module equals the active UDP ports—two files per module when both interfaces are used.
|
||||||
|
|
||||||
|
Image size per UDP port or File = 160,000 bytes
|
||||||
|
- **Complete Image size / 2**
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Read Partial Rows
|
||||||
|
^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
.. image:: images/Moench_read_rows.png
|
||||||
|
:target: _images/Moench_read_rows.png
|
||||||
|
:width: 400px
|
||||||
|
:align: center
|
||||||
|
:alt: Moench Module Read Partial Rows Configuration
|
||||||
|
|
||||||
|
|
||||||
|
The number of image rows per port can be adjusted using the `readnrows <commandline.html#term-readnrows>`_ command. By default, 400 rows are read, but a smaller value centers the readout vertically (e.g., 16 rows reads 8 above and 8 below the center). Increasing the value symmetrically expands the region toward the top and bottom. Permissible values are multiples of 16.
|
||||||
|
|
||||||
|
|
||||||
|
Total image size = 12,800 bytes
|
||||||
|
- **16** x 400 pixels (chip size: **16 rows**)
|
||||||
|
- 2 bytes (pixel width)
|
||||||
|
|
||||||
|
Note: Still in prototype stage, writes complete image (padded or not depending on `rx_padding <commandline.html#term-rx_padding-0-1>`_ parameter) to file. Only the summary written to console in the receiver handles the read n rows to calculate complete images received. Only reduces network load, not file size. Use `rx_roi <commandline.html#term-rx_roi-xmin-xmax-ymin-ymax>`_ for file size.
|
||||||
|
|
||||||
|
Eiger
|
||||||
|
-------------
|
||||||
|
|
||||||
|
Default Configuration
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
.. image:: images/Eiger_module.png
|
||||||
|
:target: _images/Eiger_module.png
|
||||||
|
:width: 350px
|
||||||
|
:align: center
|
||||||
|
:alt: Eiger Module Default Configuration
|
||||||
|
|
||||||
|
|
||||||
|
Each Eiger module has two independent identical readout systems (other than firmware), each with its own control port and `hostname <commandline.html#term-hostname>`_ to be configured with. They are referred to as the 'top' and 'bottom' half modules. The bottom half module is flipped vertically.
|
||||||
|
|
||||||
|
Each half module has 2 parallel UDP ports for 2 chips each. The left UDP port is configured with `udp_dstport <commandline.html#term-udp_dstport-n>`_, while the right UDP port is configured with `udp_dstport2 <commandline.html#term-udp_dstport2-n>`_. This is vice versa for the bottom half module.
|
||||||
|
|
||||||
|
|
||||||
|
Image size per UDP port or File = 262,144 bytes
|
||||||
|
- 2 chips (1 x 2 grid)
|
||||||
|
- 256 x 256 pixels (chip size)
|
||||||
|
- 2 bytes (default pixel width)
|
||||||
|
|
||||||
|
|
||||||
|
The myth, the legend, the bottom ports: Demystifying them
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
|
||||||
|
.. figure:: images/Eiger_bottom_1.png
|
||||||
|
:target: _images/Eiger_bottom_1.png
|
||||||
|
:width: 350px
|
||||||
|
:align: center
|
||||||
|
:alt: Eiger Bottom as Firmware gets it
|
||||||
|
|
||||||
|
How the firmware gets the images
|
||||||
|
|
||||||
|
|
||||||
|
.. figure:: images/Eiger_bottom_2.png
|
||||||
|
:target: _images/Eiger_bottom_2.png
|
||||||
|
:width: 350px
|
||||||
|
:align: center
|
||||||
|
:alt: Eiger Bottom after the firmware flips it horizontally
|
||||||
|
|
||||||
|
After the firmware flips it horizontally
|
||||||
|
|
||||||
|
|
||||||
|
.. figure:: images/Eiger_bottom_3.png
|
||||||
|
:target: _images/Eiger_bottom_3.png
|
||||||
|
:width: 350px
|
||||||
|
:align: center
|
||||||
|
:alt: After the software swaps the udp ports
|
||||||
|
|
||||||
|
After the software swaps the udp ports
|
||||||
|
|
||||||
|
|
||||||
|
.. figure:: images/Eiger_bottom_4.png
|
||||||
|
:target: _images/Eiger_bottom_4.png
|
||||||
|
:width: 400px
|
||||||
|
:align: center
|
||||||
|
:alt: After the gui has flipped the bottom vertically
|
||||||
|
|
||||||
|
After the gui has flipped the bottom vertically
|
||||||
|
|
||||||
|
|
||||||
|
Note: The same process happens for the bottom 2 udp ports of the quad.
|
||||||
|
|
||||||
|
|
||||||
|
Pixel width
|
||||||
|
^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
The pixel width can be configured to 4, 8, 16 (default) or 32 bits using the command `dr <commandline.html#term-dr-value>`_. This affects image size per UDP port or file.
|
||||||
|
|
||||||
|
Flip rows
|
||||||
|
^^^^^^^^^^
|
||||||
|
|
||||||
|
One can use the command `fliprows <commandline.html#term-fliprows-0-1>`_ to flip the rows vertically for the bottom or top half module. It is sent out to the reciever, but does not flip rows in the output file itself, but rather streams out this info via the json header and thus instructs the GUI to display them correctly.
|
||||||
|
|
||||||
|
1GbE/ 10GbE Interfaces
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
Both UDP ports `udp_dstport <commandline.html#term-udp_dstport-n>`_ and `udp_dstport2 <commandline.html#term-udp_dstport2-n>`_ are used in Eiger as shows in the figure. Both of them can be set to use either the 1GbE or the 10GbE interface for data. The 1GbE interface is used also for control and configuration. For data, the 1GbE interface is enabled by default. It can be disabled by enabling the `tengiga <commandline.html#term-tengiga-0-1>`_ command and updating both the `udp_dstport <commandline.html#term-udp_dstport-n>`_ , `udp_dstport2 <commandline.html#term-udp_dstport2-n>`_ , `udp_dstip <commandline.html#term-udp_dstip-x.x.x.x-or-auto>`_ commands to match the 1GbE or 10GbE interface. This setting only affects packetsize and number of packets, but does not affect the total image size.
|
||||||
|
|
||||||
|
Reducing network load
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
**Activate**: By default, the `hostname <commandline.html#term-hostname>`_ command activates the respective half module it connects to, enabling all UDP ports. To deactivate an entire half module (i.e., both UDP ports), use the `activate <commandline.html#term-activate-0-1>`_ command. This disables both UDP ports for that half module, so no data is transmitted from it — only half of the module is read out. To specify which half module to activate or deactivate, use the module index (for Eiger, each half module has its own module index).
|
||||||
|
|
||||||
|
|
||||||
|
**Datastream**: The `datastream <commandline.html#term-datastream-left-right-0-1>`_ command with arguments to specify which port can be used to disable the data streaming from one or both the two UDP ports in a half module. This allows for more flexible configurations, such as reading only two chips or one UDP port of a half module. To specify which half module to activate or deactivate, use the module index (for Eiger, each half module has its own module index).
|
||||||
|
|
||||||
|
Note: Only the activated ports will write data as it does not make sense to write an empty file.
|
||||||
|
|
||||||
|
**Read Partial Rows**: The number of image rows per port can be adjusted using the `readnrows <commandline.html#term-readnrows>`_ command. By default, 256 rows are read, but a smaller value centers the readout vertically (e.g., 8 rows reads 4 above and 4 below the center). Increasing the value symmetrically expands the region toward the top and bottom. Permissible values depend on dynamic range and 10GbE enable.
|
||||||
|
|
||||||
|
.. image:: images/Eiger_read_rows.png
|
||||||
|
:target: _images/Eiger_read_rows.png
|
||||||
|
:width: 400px
|
||||||
|
:align: center
|
||||||
|
:alt: Eiger Module Read Partial Rows Configuration
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Total image size per UDP Port = 8,192 bytes
|
||||||
|
- 2 chips (1 x 2 grid)
|
||||||
|
- **8** x 256 pixels (chip size: **8 rows**)
|
||||||
|
- 2 bytes (default pixel width)
|
||||||
|
|
||||||
|
Note: Still in prototype stage, writes complete image (padded or not depending on `rx_padding <commandline.html#term-rx_padding-0-1>`_ parameter) to file. Only the summary written to console in the receiver handles the `readnrows <commandline.html#term-readnrows>`_ to calculate complete images received. Only reduces network load, not file size. Use `rx_roi <commandline.html#term-rx_roi-xmin-xmax-ymin-ymax>`_ for file size.
|
||||||
|
|
||||||
|
Quad
|
||||||
|
^^^^^^
|
||||||
|
|
||||||
|
The Eiger quad is a special hardware configuration that uses only the top half-module to create a quad layout. In this setup, the second half of the top module—normally associated with the right-side UDP port—is used to represent the inverted bottom half of the quad.
|
||||||
|
|
||||||
|
As with any standard half-module, it includes one control TCP port (with a hostname) and two UDP data ports (top and bottom). When the quad option is enabled, the firmware automatically flips the second UDP port vertically.
|
||||||
|
|
||||||
|
In this configuration, the fliprows command cannot be used to flip the entire half-module. Instead, the receiver automatically includes row-flipping information only for the second UDP port in the JSON header, so the GUI can apply the correct orientation during display
|
||||||
|
|
||||||
|
.. image:: images/Eiger_quad.png
|
||||||
|
:target: _images/Eiger_quad.png
|
||||||
|
:width: 300px
|
||||||
|
:align: center
|
||||||
|
:alt: Eiger Quad Configuration
|
||||||
|
|
||||||
|
Image size per UDP port = same as a normal Eiger UDP port
|
||||||
|
|
||||||
|
Mythen3
|
||||||
|
-------------
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Default Configuration
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
.. image:: images/Mythen3_module.png
|
||||||
|
:target: _images/Mythen3_module.png
|
||||||
|
:align: center
|
||||||
|
:alt: Mythen3 Module Default Configuration
|
||||||
|
|
||||||
|
Each Mythen3 module is a 1D detector with 10 chips, each with 128 channels. Each channel has 3 counters that are enabled by default.
|
||||||
|
|
||||||
|
Image size = 15,360 bytes
|
||||||
|
- 10 chips (1 x 10 grid)
|
||||||
|
- 128 channels
|
||||||
|
- 3 counters
|
||||||
|
- 4 bytes (default pixel width)
|
||||||
|
|
||||||
|
Counters
|
||||||
|
^^^^^^^^^^^
|
||||||
|
|
||||||
|
If all 3 counters are enabeld, the frame size for each channel is multiplied by 3. The counters are stored consecutively per channel. One can disable one or more of the counters using the `counters <commandline.html#term-counters-i0-i1-i2-...>`_ command. The frame size will then be reduced accordingly.
|
||||||
|
|
||||||
|
Image size = 10,240 bytes
|
||||||
|
- 10 chips (1 x 10 grid)
|
||||||
|
- 128 channels
|
||||||
|
- 2 counters (0, 1 enabled)
|
||||||
|
- 4 bytes (default pixel width)
|
||||||
|
|
||||||
|
Pixel width
|
||||||
|
^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
The pixel width can be configured to 8, 16 or 32 (default) bits using the command `dr <commandline.html#term-dr-value>`_. 32 bits is actually 24 bits in the chip. This setting does affect image size.
|
||||||
|
|
||||||
|
1GbE/ 10GbE Interfaces
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
|
||||||
|
The UDP port can be set to use either the 1GbE or the 10GbE interface for data. The 1GbE interface is used also for control and configuration. For data, the 10GbE interface is enabled by default. It can be disabled by using the `tengiga <commandline.html#term-tengiga-0-1>`_ command and updating the `udp_dstport <commandline.html#term-udp_dstport-n>`_ and `udp_dstip <commandline.html#term-udp_dstip-x.x.x.x-or-auto>`_ commands to match the 1GbE or 10GbE interface. This setting only affects packetsize and number of packets, but does not affect the total image size.
|
||||||
|
|
||||||
|
|
||||||
|
Gotthard2
|
||||||
|
-------------
|
||||||
|
|
||||||
|
|
||||||
|
Default Configuration
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
.. image:: images/Gotthard2_module.png
|
||||||
|
:target: _images/Gotthard2_module.png
|
||||||
|
:align: center
|
||||||
|
:alt: Gotthard2 Module Default Configuration
|
||||||
|
|
||||||
|
Each Gotthard2 module is a 1D detector with 10 chips, each with 128 channels.
|
||||||
|
|
||||||
|
Image size = 2,560 bytes
|
||||||
|
- 10 chips (1 x 10 grid)
|
||||||
|
- 128 channels
|
||||||
|
- 2 bytes (pixel width)
|
||||||
|
|
||||||
|
Veto Info
|
||||||
|
^^^^^^^^^^^
|
||||||
|
|
||||||
|
One can enable veto data in the chip of the Gotthard2 module using the `veto <commandline.html#term-veto-0-1>`_ command. By default, this is disabled. This does not affect the image size as veto information is not sent out through the same 10GbE interface.
|
||||||
|
|
||||||
|
One can either stream out the veto info through the low latency link (2.5 gbps) or for debugging purposes through another 10GbE interface.
|
||||||
|
|
||||||
|
For debugging purposes, the veto info can be enabled using the `numinterfaces <commandline.html#term-numinterfaces-1-2>`_ command and the following parameters are updated: `udp_dstport2 <commandline.html#term-udp_dstport2-n>`_ and `udp_dstip2 <commandline.html#term-udp_dstip2-x.x.x.x-or-auto>`_. The veto data from this port is of course written to a separate file and is not combined in the virtual HDF5 file mapping (complete image mapped).
|
||||||
|
|
||||||
|
|
||||||
@@ -13,24 +13,41 @@ To use the basic building blocks, meaning sls_detector_get/put and
|
|||||||
the shared libraries these are needed:
|
the shared libraries these are needed:
|
||||||
|
|
||||||
* Linux, preferably recent kernel (currently no cross platform support)
|
* Linux, preferably recent kernel (currently no cross platform support)
|
||||||
* CMake > 3.12
|
* CMake >= 3.14
|
||||||
* C++11 compatible compiler. (We test with gcc and clang)
|
* C++17 compatible compiler. (We test with gcc and clang)
|
||||||
* ZeroMQ version 4
|
|
||||||
|
.. note ::
|
||||||
|
|
||||||
|
For v9.x.x of slsDetectorPackage and older, C++11 compatible compiler.
|
||||||
|
|
||||||
|
|
||||||
|
-----------------------
|
||||||
|
Python bindings
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
* Python >= 3.8
|
||||||
|
* pybind11 2.13.6 (packaged in libs)
|
||||||
|
|
||||||
|
.. note ::
|
||||||
|
|
||||||
|
Refer :ref:`pybind11 notes. <pybind for different slsDetectorPackage versions>`
|
||||||
|
|
||||||
|
-----------------------
|
||||||
|
ZeroMQ
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
* Zeromq 4.3.4 (packaged in libs)
|
||||||
|
|
||||||
|
.. note ::
|
||||||
|
|
||||||
|
Refer :ref:`zeromq notes. <zeromq for different slsDetectorPackage versions>`
|
||||||
|
|
||||||
-----------------------
|
-----------------------
|
||||||
GUI
|
GUI
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
* Qt 5.9
|
* Qt 5.9
|
||||||
* Qwt 6.1.5 (packaged in libs/)
|
* Qwt 6.1.5 (packaged in libs)
|
||||||
|
|
||||||
-----------------------
|
|
||||||
Python bindings
|
|
||||||
-----------------------
|
|
||||||
|
|
||||||
* Python > 3.6
|
|
||||||
* pybind11 (packaged in libs/)
|
|
||||||
|
|
||||||
|
|
||||||
-----------------------
|
-----------------------
|
||||||
Moench executables
|
Moench executables
|
||||||
@@ -55,3 +72,5 @@ Packaged in libs/
|
|||||||
* catch2 (unit testing)
|
* catch2 (unit testing)
|
||||||
* rapidjson (streaming from receiver)
|
* rapidjson (streaming from receiver)
|
||||||
* pybind11 (python bindings)
|
* pybind11 (python bindings)
|
||||||
|
* qwt (gui plotting)
|
||||||
|
* libzmq (streaming to/from receiver)
|
||||||
@@ -1,15 +1,17 @@
|
|||||||
Detector
|
Detector
|
||||||
==============================================
|
==============================================
|
||||||
|
|
||||||
The sls::Detector is the new public API to control
|
The sls::Detector is the public API to control
|
||||||
detectors from C++. This API is also used internally
|
detectors from C++. This API is also used internally
|
||||||
for the Python bindings and the command line interface.
|
for the Python bindings and the command line interface.
|
||||||
If a receiver has been configured this is also controlled
|
If a receiver has been configured, this is also controlled
|
||||||
through this class.
|
through this class.
|
||||||
|
|
||||||
Most, if not all, functions are called in parallel
|
Most, if not all, functions are called in parallel
|
||||||
and the return value is a thin std::vector wrapper
|
and the return value is a thin std::vector wrapper
|
||||||
containing results from all modules. (Result<T>)
|
containing results from all modules. (:ref:`Result class<Result Class>`)
|
||||||
|
|
||||||
|
Here are some :ref:`examples <Cplusplus Api Examples>` on how to use the API.
|
||||||
|
|
||||||
.. doxygenclass:: sls::Detector
|
.. doxygenclass:: sls::Detector
|
||||||
:members:
|
:members:
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
.. _Cplusplus Api Examples:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -53,8 +54,8 @@ then set up the detector.
|
|||||||
|
|
||||||
jungfrauDetectorServer_virtual
|
jungfrauDetectorServer_virtual
|
||||||
|
|
||||||
This launches a virtual Jungfrau detector server. As default is uses port 1952 and 1953
|
This launches a virtual Jungfrau detector server. As default it uses port 1952 and 1953
|
||||||
for communication over TCP. Most commands go on 1952 and only stop and status on 1953.
|
for communication over TCP. Most commands go on 1952 and only a few such as stop and status on 1953.
|
||||||
|
|
||||||
**Run example to configure**
|
**Run example to configure**
|
||||||
|
|
||||||
@@ -90,7 +91,10 @@ std::vector.
|
|||||||
sls::Result<int> res1{1, 1, 1};
|
sls::Result<int> res1{1, 1, 1};
|
||||||
std::cout << "res1: " << res1 << '\n';
|
std::cout << "res1: " << res1 << '\n';
|
||||||
res1.squash();
|
res1.squash();
|
||||||
|
# return -1 if different
|
||||||
res1.squash(-1);
|
res1.squash(-1);
|
||||||
|
# throw exception with custom message if different
|
||||||
|
res1.tsquash("Values are different);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
75
docs/src/fileformat.rst
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
.. _file format:
|
||||||
|
|
||||||
|
File format
|
||||||
|
================================
|
||||||
|
|
||||||
|
If `fwrite <commandline.html#term-fwrite-0-1>`_ is enabled, the receiver will write data to files.
|
||||||
|
|
||||||
|
Number of Files
|
||||||
|
----------------
|
||||||
|
|
||||||
|
Every acquisition will create a master file and data files.
|
||||||
|
|
||||||
|
An acquisition can have multiple data files for a single frame. The number of files is determined by the number of UDP ports per module and the number of modules.
|
||||||
|
|
||||||
|
* Every modules has its own receiver process. Every receiver process can have 1 or 2 UDP ports.
|
||||||
|
* Each UDP port will create its own file. Therefore, each receiver can write 1 or 2 files.
|
||||||
|
* So, for example a detector with 4 modules with 2 UDP ports each will create a total of 8 files with file names containing UDP port index **'_d0'** to **'_d7'**.
|
||||||
|
|
||||||
|
A new file containing **'_f[file_index]'** in file name is also created when reaching the maximum frames per file. Configured using `rx_framesperfile <commandline.html#term-rx_framesperfile-n_frames>`_.
|
||||||
|
|
||||||
|
.. _file name format:
|
||||||
|
|
||||||
|
Naming
|
||||||
|
-------
|
||||||
|
| Master File Name: [fpath]/[fname]_master_[findex].[ext]
|
||||||
|
|
||||||
|
|
||||||
|
| Data File Name: [fpath]/[fname]_dx_fy_[findex].[ext]
|
||||||
|
|
||||||
|
* fpath: file path set using command `fpath <commandline.html#term-fpath-path>`_. Default: '/'
|
||||||
|
* fname: file name prefix using command `fname <commandline.html#term-fname-name>`_. Default: "run"
|
||||||
|
* findex: acquisition index using command `findex <commandline.html#term-findex-n_value>`_. Automatically incremented for every acquisition with `sls_detector_acquire <commandline.html#term-acquire>`_ (if `fwrite <commandline.html#term-fwrite-0-1>`_ enabled).
|
||||||
|
* x: unique udp port index. New file per UDP port.
|
||||||
|
* y: file index. New file created after reaching max frames per file.
|
||||||
|
* ext: file extension. Default: "raw"(data file) or "json"(master file)
|
||||||
|
|
||||||
|
|
||||||
|
Some file name examples:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
# first file
|
||||||
|
path-to-file/run_d0_f0_0.raw
|
||||||
|
|
||||||
|
# first file for second UDP port
|
||||||
|
path-to-file/run_d1_f0_0.raw
|
||||||
|
|
||||||
|
# second file after reaching max frames in first file
|
||||||
|
path-to-file/run_d0_f1_0.raw
|
||||||
|
|
||||||
|
# second acquisition, first file
|
||||||
|
path-to-file/run_d0_f0_1.raw
|
||||||
|
|
||||||
|
|
||||||
|
Formats
|
||||||
|
--------
|
||||||
|
|
||||||
|
There are 2 file formats supported by the receiver:
|
||||||
|
|
||||||
|
* Binary - extension .json (master file) or .raw (data files)
|
||||||
|
* HDF5 - extension .h5
|
||||||
|
|
||||||
|
The default is binary. HDF5 can be enabled by compiling the package with HDF5 option enabled. The file format is set using the command `fformat <commandline.html#term-fformat-binary-hdf5>`_.
|
||||||
|
|
||||||
|
|
||||||
|
Content
|
||||||
|
--------
|
||||||
|
|
||||||
|
| `Master File`: Contains the metadata of the acquisition. The content is described in :ref:`master file attributes <master file attributes>`.
|
||||||
|
|
||||||
|
|
||||||
|
| `Data File`: Contains the metadata for each image (:ref:`slsReceiverHeader<sls receiver header format>`) and the `data of the image` transmitted over that port. The image data is described in :ref:`Detector Image Size and Format <data format>` section.
|
||||||
|
|
||||||
|
|
||||||
|
| More content and examples are found in the :ref:`HDF5 file format <hdf5 file format>` and :ref:`Binary file format <binary file format>` sections.
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
.. _firmware upgrade:
|
||||||
|
|
||||||
Firmware Upgrade
|
Firmware Upgrade
|
||||||
=================
|
=================
|
||||||
|
|
||||||
@@ -98,7 +100,7 @@ Upgrade
|
|||||||
|
|
||||||
* 6.1.2 server has a fix for seamless fpga programming
|
* 6.1.2 server has a fix for seamless fpga programming
|
||||||
|
|
||||||
* We recommend first updating the on-board detector server to 6.1.2 (with client 6.1.x) using command 'updatedetectorserver' or 'copydetectorserver'.
|
* We recommend first updating the on-board detector server to 6.1.2 (with client 6.1.x) using command `updatedetectorserver <commandline.html#term-updatedetectorserver-server_name-with-full-path>`_.
|
||||||
|
|
||||||
* Then use command 'programfpga' to only update firmware or use command 'update' to update firmware and server to the latest release.
|
* Then use command 'programfpga' to only update firmware or use command 'update' to update firmware and server to the latest release.
|
||||||
|
|
||||||
@@ -120,7 +122,7 @@ Program from console
|
|||||||
# removes old server from respawn, sets up new lnked server to respawn
|
# removes old server from respawn, sets up new lnked server to respawn
|
||||||
# programs fpga, reboots
|
# programs fpga, reboots
|
||||||
|
|
||||||
# v5.0.0 - 6.0.0 (copies server from tftp folder of the pc)
|
# older versions: v5.0.0 - 6.0.0 using tftp from tftp folder of pc
|
||||||
sls_detector_put update jungfrauDetectorServervxxx pcxxx xx.pof
|
sls_detector_put update jungfrauDetectorServervxxx pcxxx xx.pof
|
||||||
|
|
||||||
# v6.1.1 - present (copies server from the full path provided)
|
# v6.1.1 - present (copies server from the full path provided)
|
||||||
@@ -131,42 +133,6 @@ Program from console
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
Gotthard I
|
|
||||||
-----------
|
|
||||||
|
|
||||||
Download
|
|
||||||
^^^^^^^^^^^^^
|
|
||||||
- detector server corresponding to package in slsDetectorPackage/serverBin
|
|
||||||
|
|
||||||
- `pof files <https://github.com/slsdetectorgroup/slsDetectorFirmware>`__
|
|
||||||
|
|
||||||
|
|
||||||
.. _firmware upgrade using blaster for blackfin:
|
|
||||||
|
|
||||||
Upgrade
|
|
||||||
^^^^^^^^
|
|
||||||
.. warning ::
|
|
||||||
| Gotthard firmware cannot be upgraded remotely and requires the use of USB-Blaster.
|
|
||||||
| It is generally updated by us.
|
|
||||||
|
|
||||||
#. Download `Altera Quartus software or Quartus programmer <https://fpgasoftware.intel.com/20.1/?edition=standard&platform=linux&product=qprogrammer#tabs-4>`__.
|
|
||||||
|
|
||||||
|
|
||||||
#. Start Quartus programmer, click on Hardware Setup. In the "Currently selected hardware" window, select USB-Blaster.
|
|
||||||
|
|
||||||
#. In the Mode combo box, select "Active Serial Programming".
|
|
||||||
|
|
||||||
#. Plug the end of your USB-Blaster with the adaptor provided to the connector 'AS config' on the Gotthard board.
|
|
||||||
|
|
||||||
#. Click on 'Add file'. Select programming (pof) file provided by us.
|
|
||||||
|
|
||||||
#. Check "Program/Configure" and "Verify". Push the start button. Wait until the programming process is finished.
|
|
||||||
|
|
||||||
#. In case of error messages, check the polarity of cable (that pin1 corresponds) and that the correct programming connector is selected.
|
|
||||||
|
|
||||||
#. Reboot the detector.
|
|
||||||
|
|
||||||
|
|
||||||
Mythen III
|
Mythen III
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
@@ -190,7 +156,7 @@ Program from console
|
|||||||
# removes old server from respawn, sets up new lnked server to respawn
|
# removes old server from respawn, sets up new lnked server to respawn
|
||||||
# programs fpga, reboots
|
# programs fpga, reboots
|
||||||
|
|
||||||
# v5.0.0 - 6.0.0 (copies server from tftp folder of the pc)
|
# older versions: v5.0.0 - 6.0.0 using tftp from tftp folder of pc
|
||||||
sls_detector_put update mythen3DetectorServervxxx pcxxx xxx.rbf
|
sls_detector_put update mythen3DetectorServervxxx pcxxx xxx.rbf
|
||||||
|
|
||||||
# v6.1.1 - present (copies server from the full path provided)
|
# v6.1.1 - present (copies server from the full path provided)
|
||||||
@@ -224,7 +190,7 @@ Program from console
|
|||||||
# removes old server from respawn, sets up new lnked server to respawn
|
# removes old server from respawn, sets up new lnked server to respawn
|
||||||
# programs fpga, reboots
|
# programs fpga, reboots
|
||||||
|
|
||||||
# v5.0.0 - 6.0.0 (copies server from tftp folder of the pc)
|
# older versions: v5.0.0 - 6.0.0 using tftp from tftp folder of pc
|
||||||
sls_detector_put update gotthard2DetectorServervxxx pcxxx xxx.rbf
|
sls_detector_put update gotthard2DetectorServervxxx pcxxx xxx.rbf
|
||||||
|
|
||||||
# v6.1.1 - present (copies server from the full path provided)
|
# v6.1.1 - present (copies server from the full path provided)
|
||||||
@@ -257,7 +223,7 @@ Upgrade
|
|||||||
|
|
||||||
* 6.1.2 server has a fix for seamless fpga programming
|
* 6.1.2 server has a fix for seamless fpga programming
|
||||||
|
|
||||||
* We recommend first updating the on-board detector server to 6.1.2 (with client 6.1.x) using command 'updatedetectorserver' or 'copydetectorserver'.
|
* We recommend first updating the on-board detector server to 6.1.2 (with client 6.1.x) using command `updatedetectorserver <commandline.html#term-updatedetectorserver-server_name-with-full-path>`_.
|
||||||
|
|
||||||
* Then use command 'programfpga' to only update firmware or use command 'update' to update firmware and server to the latest release.
|
* Then use command 'programfpga' to only update firmware or use command 'update' to update firmware and server to the latest release.
|
||||||
|
|
||||||
@@ -275,7 +241,7 @@ Program from console
|
|||||||
# removes old server from respawn, sets up new lnked server to respawn
|
# removes old server from respawn, sets up new lnked server to respawn
|
||||||
# programs fpga, reboots
|
# programs fpga, reboots
|
||||||
|
|
||||||
# v5.0.0 - 6.0.0 (copies server from tftp folder of the pc)
|
# older versions: v5.0.0 - 6.0.0 using tftp from tftp folder of pc
|
||||||
sls_detector_put update moenchDetectorServervxxx pcxxx xx.pof
|
sls_detector_put update moenchDetectorServervxxx pcxxx xx.pof
|
||||||
|
|
||||||
# v6.1.1 - present (copies server from the full path provided)
|
# v6.1.1 - present (copies server from the full path provided)
|
||||||
@@ -310,7 +276,7 @@ Program from console
|
|||||||
# removes old server from respawn, sets up new lnked server to respawn
|
# removes old server from respawn, sets up new lnked server to respawn
|
||||||
# programs fpga, reboots
|
# programs fpga, reboots
|
||||||
|
|
||||||
# v5.0.0 - 6.0.0 (copies server from tftp folder of the pc)
|
# older versions: v5.0.0 - 6.0.0 using tftp from tftp folder of pc
|
||||||
sls_detector_put update ctbDetectorServervxxx pcxxx xx.pof
|
sls_detector_put update ctbDetectorServervxxx pcxxx xx.pof
|
||||||
|
|
||||||
# v6.1.1 - present (copies server from the full path provided)
|
# v6.1.1 - present (copies server from the full path provided)
|
||||||
@@ -396,7 +362,3 @@ How to get back mtd3 drive remotely (udpating kernel)
|
|||||||
more /proc/mtd # verify mtd3 is listed
|
more /proc/mtd # verify mtd3 is listed
|
||||||
|
|
||||||
|
|
||||||
Last Resort using USB Blaster
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
If none of these steps work, the last resort might be physically upgrading the firmware using a USB blaster, which also requires opening up the detector. Instructions for all the blackfin detectors are the same as the one for :ref:`gotthard firmware upgrade <firmware upgrade using blaster for blackfin>`.
|
|
||||||
@@ -11,7 +11,7 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "CmdProxy.h"
|
#include "Caller.h"
|
||||||
#include "sls/Detector.h"
|
#include "sls/Detector.h"
|
||||||
#include "sls/sls_detector_defs.h"
|
#include "sls/sls_detector_defs.h"
|
||||||
|
|
||||||
@@ -37,8 +37,8 @@ int main() {
|
|||||||
|
|
||||||
std::cout << "Generating command line documentation!\n";
|
std::cout << "Generating command line documentation!\n";
|
||||||
|
|
||||||
sls::CmdProxy proxy(nullptr);
|
sls::Caller caller(nullptr);
|
||||||
auto commands = proxy.GetProxyCommands();
|
auto commands = caller.getAllCommands();
|
||||||
|
|
||||||
std::ofstream fs("commands.rst");
|
std::ofstream fs("commands.rst");
|
||||||
fs << ".. glossary::\n";
|
fs << ".. glossary::\n";
|
||||||
@@ -46,7 +46,7 @@ int main() {
|
|||||||
for (const auto &cmd : commands) {
|
for (const auto &cmd : commands) {
|
||||||
std::ostringstream os;
|
std::ostringstream os;
|
||||||
std::cout << cmd << '\n';
|
std::cout << cmd << '\n';
|
||||||
proxy.Call(cmd, {}, -1, slsDetectorDefs::HELP_ACTION, os);
|
caller.call(cmd, {}, -1, slsDetectorDefs::HELP_ACTION, os);
|
||||||
|
|
||||||
auto tmp = os.str().erase(0, cmd.size());
|
auto tmp = os.str().erase(0, cmd.size());
|
||||||
auto usage = tmp.substr(0, tmp.find_first_of('\n'));
|
auto usage = tmp.substr(0, tmp.find_first_of('\n'));
|
||||||
@@ -55,9 +55,9 @@ int main() {
|
|||||||
fs << '\t' << cmd << usage << help << "\n";
|
fs << '\t' << cmd << usage << help << "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
std::ofstream fs2("depreciated.csv");
|
std::ofstream fs2("deprecated.csv");
|
||||||
fs2 << "Old, New\n";
|
fs2 << "Old, New\n";
|
||||||
auto cmds = proxy.GetDepreciatedCommands();
|
auto cmds = caller.GetDeprecatedCommands();
|
||||||
for (auto it : cmds) {
|
for (auto it : cmds) {
|
||||||
fs2 << it.first << ", " << it.second << '\n';
|
fs2 << it.first << ", " << it.second << '\n';
|
||||||
}
|
}
|
||||||
|
|||||||
91
docs/src/hdf5fileformat.rst
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
.. _hdf5 file format:
|
||||||
|
|
||||||
|
HDF5 File Format
|
||||||
|
================================
|
||||||
|
|
||||||
|
Compilation
|
||||||
|
-------------
|
||||||
|
|
||||||
|
#. Compile the package with HDF5 option enabled
|
||||||
|
|
||||||
|
#. Using cmk script: ./cmk.sh -hj9 -d [path of hdf5 dir] (-d is optional and for custom installation folder)
|
||||||
|
|
||||||
|
#. Enable using cmake option **-DSLS_USE_HDF5=ON** and **-DCMAKE_INSTALL_PREFIX=/path/to/custom/hdf/installation** (optional).
|
||||||
|
|
||||||
|
|
||||||
|
Setup
|
||||||
|
-------
|
||||||
|
|
||||||
|
#. Start Receiver process
|
||||||
|
|
||||||
|
#. Load config file
|
||||||
|
|
||||||
|
#. Set file format using command `fformat <commandline.html#term-fformat-binary-hdf5>`_.
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
sls_detector_put fformat hdf5
|
||||||
|
|
||||||
|
|
||||||
|
Master File
|
||||||
|
-------------
|
||||||
|
|
||||||
|
* File Name: [fpath]/[fname]_master_[findex].h5 :ref:`Details here<file name format>`
|
||||||
|
|
||||||
|
* It contains :ref:`attributes<master file attributes>` relevant to the acquisition. This can vary with detector type.
|
||||||
|
|
||||||
|
.. code-block:: text
|
||||||
|
|
||||||
|
/ # Root level
|
||||||
|
|---> entry # entry group
|
||||||
|
| |---> data # data group
|
||||||
|
| |---> column # dataset of each sls_receiver_header member
|
||||||
|
| |---> data
|
||||||
|
| |---> detector header version
|
||||||
|
| |---> detector specific 1
|
||||||
|
| |---> detector specific 2
|
||||||
|
| |---> detector specific 3
|
||||||
|
| |---> detector specific 4
|
||||||
|
| |---> detector type
|
||||||
|
| |---> exp length or sub exposure time
|
||||||
|
| |---> frame number
|
||||||
|
| |---> mod id
|
||||||
|
| |---> packets caught
|
||||||
|
| |---> packets caught bit mask
|
||||||
|
| |---> row
|
||||||
|
| |---> timestamp
|
||||||
|
| |---> instrument # instrument group
|
||||||
|
| |---> beam # beam group
|
||||||
|
| |---> detector # detector group
|
||||||
|
| |---> Master File Attribute 1 # dataset of each master file attribute
|
||||||
|
| |---> Master File Attribute 2
|
||||||
|
| |---> Master File Attribute 3
|
||||||
|
| |---> Master File Attribute ..
|
||||||
|
| |---> sample # sample group
|
||||||
|
|
||||||
|
|
||||||
|
If more than 1 data file per frame:
|
||||||
|
* The dataset of each :ref:`**SLS Receiver Header** <sls receiver header format>` member is a virtual dataset.
|
||||||
|
* **data** dataset is a virtual dataset.
|
||||||
|
|
||||||
|
|
||||||
|
More details regarding master file attributes can be found :ref:`here<master file attributes>`.
|
||||||
|
|
||||||
|
Data File
|
||||||
|
-----------
|
||||||
|
|
||||||
|
* File Name: [fpath]/[fname]_dx_fy_[findex].h5 :ref:`Details here<file name format>`
|
||||||
|
|
||||||
|
* More details on :ref:`slsReceiverHeader<sls receiver header format>` and the actual image data is described in the :ref:`Detector Image Size and Format <data format>` section.
|
||||||
|
|
||||||
|
|
||||||
|
Virtual Data File
|
||||||
|
------------------
|
||||||
|
|
||||||
|
* File Name: [fpath]/[fname]_virtual_[findex].h5 :ref:`Details here<file name format>`
|
||||||
|
|
||||||
|
* For multiple modules, a virtual file linking data from all the modules is created. The individual files are expected to be present.
|
||||||
|
|
||||||
|
* It is linked in the master file.
|
||||||
|
|
||||||
|
|
||||||
BIN
docs/src/images/Client_architecture.png
Normal file
|
After Width: | Height: | Size: 111 KiB |
BIN
docs/src/images/Client_module_commands.png
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
docs/src/images/Client_receiver_commands.png
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
docs/src/images/Eiger_bottom_1.png
Normal file
|
After Width: | Height: | Size: 33 KiB |
BIN
docs/src/images/Eiger_bottom_2.png
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
docs/src/images/Eiger_bottom_3.png
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
docs/src/images/Eiger_bottom_4.png
Normal file
|
After Width: | Height: | Size: 34 KiB |
BIN
docs/src/images/Eiger_module.png
Normal file
|
After Width: | Height: | Size: 118 KiB |
BIN
docs/src/images/Eiger_quad.png
Normal file
|
After Width: | Height: | Size: 35 KiB |
BIN
docs/src/images/Eiger_read_rows.png
Normal file
|
After Width: | Height: | Size: 96 KiB |
BIN
docs/src/images/Gotthard2_module.png
Normal file
|
After Width: | Height: | Size: 47 KiB |
BIN
docs/src/images/Jungfrau_module.png
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
docs/src/images/Jungfrau_read_rows.png
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
docs/src/images/Jungfrau_two_port.png
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
docs/src/images/Module_architecture.png
Normal file
|
After Width: | Height: | Size: 73 KiB |
BIN
docs/src/images/Module_receiver_commands.png
Normal file
|
After Width: | Height: | Size: 88 KiB |
BIN
docs/src/images/Moench_module.png
Normal file
|
After Width: | Height: | Size: 34 KiB |
BIN
docs/src/images/Moench_read_rows.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
docs/src/images/Moench_two_port.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
docs/src/images/Mythen3_module.png
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
docs/src/images/Receiver_architecture.png
Normal file
|
After Width: | Height: | Size: 66 KiB |
BIN
docs/src/images/Receiver_external_process_commands.png
Normal file
|
After Width: | Height: | Size: 113 KiB |
BIN
docs/src/images/Receiver_gui_commands.png
Normal file
|
After Width: | Height: | Size: 95 KiB |