diff --git a/doc/_images/Laguerre-Gauss-ani/b_anim.js b/doc/_images/Laguerre-Gauss-ani/b_anim.js new file mode 100644 index 00000000..e5e2211e --- /dev/null +++ b/doc/_images/Laguerre-Gauss-ani/b_anim.js @@ -0,0 +1 @@ +b_timeline = [{"delay": 250, "blit": [[0, 0, 538, 420, 0, 0]]}, {"delay": 250, "blit": [[0, 7663, 242, 83, 79, 28], [0, 6980, 252, 252, 74, 117], [381, 4126, 83, 228, 332, 129]]}, {"delay": 250, "blit": [[242, 7658, 242, 83, 79, 28], [252, 6728, 252, 252, 74, 117], [381, 3898, 83, 228, 332, 129], [0, 0, 20, 13, 46, 107], [0, 0, 25, 13, 40, 364]]}, {"delay": 250, "blit": [[0, 7580, 242, 83, 79, 28], [478, 465, 20, 13, 46, 107], [0, 6728, 252, 252, 74, 117], [387, 3670, 83, 228, 332, 129], [498, 576, 25, 13, 40, 364]]}, {"delay": 250, "blit": [[242, 7575, 242, 83, 79, 28], [252, 6476, 252, 252, 74, 117], [387, 3442, 83, 228, 332, 129], [227, 6, 9, 13, 227, 6], [420, 209, 13, 9, 420, 209], [40, 268, 26, 13, 154, 379], [45, 171, 20, 13, 254, 379]]}, {"delay": 250, "blit": [[528, 845, 9, 13, 227, 6], [0, 7497, 242, 83, 79, 28], [0, 6476, 252, 252, 74, 117], [376, 3214, 83, 228, 332, 129], [498, 452, 13, 9, 420, 209], [472, 662, 58, 13, 122, 379], [472, 675, 52, 13, 254, 379], [72, 372, 344, 1, 72, 115], [72, 372, 344, 1, 72, 372]]}, {"delay": 250, "blit": [[248, 7490, 242, 85, 79, 27], [0, 3267, 376, 277, 40, 115], [35, 3531, 73, 13, 75, 379], [246, 3531, 52, 13, 286, 379], [511, 845, 26, 13, 210, 6], [6, 2998, 20, 110, 46, 107], [472, 894, 13, 26, 420, 209], [154, 378, 25, 14, 40, 267], [40, 299, 25, 14, 40, 299], [40, 331, 25, 14, 40, 331]]}, {"delay": 250, "blit": [[0, 2896, 288, 371, 40, 6], [302, 3798, 85, 2, 331, 115], [387, 2480, 85, 228, 331, 129], [472, 844, 13, 26, 420, 209], [302, 3552, 85, 2, 331, 371], [480, 1585, 57, 13, 59, 379], [5, 529, 21, 13, 317, 379]]}, {"delay": 250, "blit": [[263, 4841, 242, 83, 79, 28], [256, 4840, 256, 346, 72, 27], [382, 2252, 85, 228, 331, 129], [6, 529, 21, 13, 317, 379], [161, 6, 9, 13, 227, 6], [420, 259, 13, 9, 420, 209]]}, {"delay": 250, "blit": [[47, 203, 9, 13, 227, 6], [0, 4840, 256, 346, 72, 27], [297, 2252, 85, 228, 331, 129], [498, 489, 13, 9, 420, 209], [6, 941, 20, 14, 46, 108], [302, 1263, 85, 2, 331, 116], [461, 1568, 77, 30, 40, 362], [302, 1262, 85, 2, 331, 370], [46, 203, 20, 13, 222, 379], [244, 2603, 52, 13, 285, 379]]}, {"delay": 250, "blit": [[0, 2230, 297, 386, 40, 6], [6, 2332, 20, 110, 46, 108], [297, 2514, 85, 8, 331, 116], [376, 2024, 85, 228, 331, 129], [515, 881, 13, 26, 420, 209], [297, 2506, 85, 8, 331, 364]]}, {"delay": 250, "blit": [[0, 420, 376, 386, 40, 6], [502, 881, 13, 26, 420, 209]]}, {"delay": 250, "blit": [[288, 5702, 242, 106, 79, 6], [0, 5702, 288, 258, 40, 115], [297, 2524, 85, 1, 331, 123], [376, 1796, 85, 228, 331, 129], [485, 833, 13, 36, 420, 209], [297, 2523, 85, 1, 331, 364], [0, 7754, 264, 13, 66, 379]]}, {"delay": 250, "blit": [[485, 820, 36, 13, 200, 6], [293, 7405, 242, 85, 79, 27], [256, 6218, 256, 258, 72, 115], [478, 455, 20, 32, 46, 124], [376, 1568, 85, 228, 331, 129], [46, 166, 19, 22, 46, 180], [522, 809, 13, 36, 420, 209], [40, 296, 25, 22, 40, 282], [498, 567, 25, 32, 40, 328], [297, 2480, 90, 13, 75, 379], [297, 2493, 85, 13, 236, 379]]}, {"delay": 250, "blit": [[498, 907, 25, 13, 211, 6], [252, 6980, 252, 85, 74, 27], [0, 4582, 344, 258, 72, 115], [6, 496, 20, 55, 46, 110], [46, 167, 19, 22, 46, 185], [485, 894, 13, 25, 420, 209], [40, 295, 25, 22, 40, 277], [0, 761, 25, 55, 40, 319], [344, 4393, 109, 13, 61, 379], [344, 4432, 103, 13, 232, 379]]}, {"delay": 250, "blit": [[485, 807, 37, 13, 199, 6], [0, 1883, 376, 347, 40, 27], [472, 807, 13, 37, 420, 209], [387, 2859, 113, 13, 61, 379], [344, 4406, 107, 13, 228, 379]]}, {"delay": 250, "blit": [[485, 701, 37, 13, 199, 6], [0, 1536, 376, 347, 40, 27], [524, 772, 13, 37, 420, 209], [387, 2807, 116, 13, 61, 379], [344, 4380, 110, 13, 225, 379]]}, {"delay": 250, "blit": [[288, 3108, 242, 106, 79, 6], [0, 6218, 256, 258, 72, 115], [472, 420, 26, 242, 40, 121], [387, 654, 85, 230, 331, 129], [472, 844, 13, 26, 420, 209], [387, 2768, 121, 13, 59, 379], [387, 2846, 115, 13, 222, 379]]}, {"delay": 250, "blit": [[288, 3002, 242, 106, 79, 6], [256, 5960, 256, 258, 72, 115], [387, 1340, 85, 228, 331, 129], [11, 4121, 20, 48, 46, 131], [0, 0, 19, 13, 46, 201], [523, 907, 13, 21, 420, 225], [0, 0, 25, 13, 40, 270], [5, 4217, 25, 48, 40, 305], [387, 2755, 121, 13, 59, 379], [387, 2833, 115, 13, 222, 379]]}, {"delay": 250, "blit": [[498, 639, 37, 13, 199, 6], [293, 7320, 242, 85, 79, 27], [0, 5960, 256, 258, 72, 115], [376, 420, 85, 234, 331, 123], [1, 4139, 29, 20, 36, 155], [524, 735, 13, 37, 420, 209], [498, 619, 36, 20, 29, 309], [387, 2742, 121, 13, 59, 379], [387, 2820, 115, 13, 222, 379], [0, 0, 29, 13, 36, 115], [0, 0, 19, 13, 46, 195], [2, 218, 29, 52, 2, 218], [0, 0, 25, 13, 40, 276], [0, 0, 36, 13, 29, 356], [297, 2522, 85, 1, 331, 364]]}, {"delay": 250, "blit": [[387, 2725, 146, 17, 127, 6], [293, 7235, 242, 85, 79, 27], [0, 4066, 381, 258, 35, 115], [515, 420, 17, 144, 420, 173], [13, 218, 29, 52, 2, 218], [532, 420, 6, 69, 29, 297], [344, 4354, 111, 13, 61, 379], [344, 4419, 105, 13, 230, 379]]}, {"delay": 250, "blit": [[387, 2708, 146, 17, 127, 6], [0, 7412, 248, 85, 76, 27], [0, 3805, 381, 261, 35, 112], [498, 420, 17, 144, 420, 173], [461, 420, 6, 85, 29, 284], [387, 2794, 118, 13, 58, 379], [344, 4367, 110, 13, 227, 379]]}, {"delay": 250, "blit": [[472, 794, 46, 13, 195, 6], [252, 7065, 248, 85, 76, 27], [0, 3544, 387, 261, 29, 112], [511, 735, 13, 46, 420, 205], [242, 7741, 279, 13, 58, 379]]}, {"delay": 250, "blit": [[472, 881, 30, 13, 195, 6], [288, 5808, 248, 85, 76, 27], [0, 2616, 387, 280, 29, 112], [472, 748, 13, 31, 420, 220]]}, {"delay": 250, "blit": [[288, 2896, 242, 106, 79, 6], [0, 5444, 299, 258, 29, 115], [387, 1112, 85, 228, 331, 129], [498, 735, 13, 46, 420, 205], [0, 7767, 253, 13, 71, 379]]}, {"delay": 250, "blit": [[472, 781, 46, 13, 195, 6], [0, 7232, 293, 180, 35, 27], [0, 4324, 344, 258, 72, 115], [485, 735, 13, 46, 420, 205], [0, 2799, 36, 27, 29, 277], [498, 564, 36, 55, 29, 318], [387, 2781, 119, 13, 57, 379], [387, 2872, 112, 13, 226, 379]]}, {"delay": 250, "blit": [[485, 722, 47, 13, 194, 6], [0, 1171, 387, 365, 29, 27], [472, 701, 13, 47, 420, 205]]}, {"delay": 250, "blit": [[472, 688, 47, 13, 194, 6], [0, 806, 387, 365, 29, 27], [524, 675, 13, 47, 420, 205]]}, {"delay": 1000, "blit": [[498, 868, 35, 13, 206, 6], [293, 7150, 242, 85, 79, 27], [0, 5186, 299, 258, 29, 115], [387, 884, 85, 228, 331, 129], [498, 833, 13, 35, 420, 205], [264, 7754, 253, 13, 71, 379]]}, {"delay": 250, "blit": [[472, 688, 47, 13, 194, 6], [0, 806, 387, 365, 29, 27], [524, 675, 13, 47, 420, 205]]}, {"delay": 250, "blit": [[485, 722, 47, 13, 194, 6], [0, 1171, 387, 365, 29, 27], [472, 701, 13, 47, 420, 205]]}, {"delay": 250, "blit": [[472, 781, 46, 13, 195, 6], [0, 7232, 293, 180, 35, 27], [0, 4324, 344, 258, 72, 115], [485, 735, 13, 46, 420, 205], [0, 2799, 36, 27, 29, 277], [498, 564, 36, 55, 29, 318], [387, 2781, 119, 13, 57, 379], [387, 2872, 112, 13, 226, 379]]}, {"delay": 250, "blit": [[288, 2896, 242, 106, 79, 6], [0, 5444, 299, 258, 29, 115], [387, 1112, 85, 228, 331, 129], [498, 735, 13, 46, 420, 205], [0, 7767, 253, 13, 71, 379]]}, {"delay": 250, "blit": [[472, 881, 30, 13, 195, 6], [288, 5808, 248, 85, 76, 27], [0, 2616, 387, 280, 29, 112], [472, 748, 13, 31, 420, 220]]}, {"delay": 250, "blit": [[472, 794, 46, 13, 195, 6], [252, 7065, 248, 85, 76, 27], [0, 3544, 387, 261, 29, 112], [511, 735, 13, 46, 420, 205], [242, 7741, 279, 13, 58, 379]]}, {"delay": 250, "blit": [[387, 2708, 146, 17, 127, 6], [0, 7412, 248, 85, 76, 27], [0, 3805, 381, 261, 35, 112], [498, 420, 17, 144, 420, 173], [461, 420, 6, 85, 29, 284], [387, 2794, 118, 13, 58, 379], [344, 4367, 110, 13, 227, 379]]}, {"delay": 250, "blit": [[387, 2725, 146, 17, 127, 6], [293, 7235, 242, 85, 79, 27], [0, 4066, 381, 258, 35, 115], [515, 420, 17, 144, 420, 173], [13, 218, 29, 52, 2, 218], [532, 420, 6, 69, 29, 297], [344, 4354, 111, 13, 61, 379], [344, 4419, 105, 13, 230, 379]]}, {"delay": 250, "blit": [[498, 639, 37, 13, 199, 6], [293, 7320, 242, 85, 79, 27], [0, 5960, 256, 258, 72, 115], [376, 420, 85, 234, 331, 123], [1, 4139, 29, 20, 36, 155], [524, 735, 13, 37, 420, 209], [498, 619, 36, 20, 29, 309], [387, 2742, 121, 13, 59, 379], [387, 2820, 115, 13, 222, 379], [0, 0, 29, 13, 36, 115], [0, 0, 19, 13, 46, 195], [2, 218, 29, 52, 2, 218], [0, 0, 25, 13, 40, 276], [0, 0, 36, 13, 29, 356], [297, 2522, 85, 1, 331, 364]]}, {"delay": 250, "blit": [[288, 3002, 242, 106, 79, 6], [256, 5960, 256, 258, 72, 115], [387, 1340, 85, 228, 331, 129], [11, 4121, 20, 48, 46, 131], [0, 0, 19, 13, 46, 201], [523, 907, 13, 21, 420, 225], [0, 0, 25, 13, 40, 270], [5, 4217, 25, 48, 40, 305], [387, 2755, 121, 13, 59, 379], [387, 2833, 115, 13, 222, 379]]}, {"delay": 250, "blit": [[288, 3108, 242, 106, 79, 6], [0, 6218, 256, 258, 72, 115], [472, 420, 26, 242, 40, 121], [387, 654, 85, 230, 331, 129], [472, 844, 13, 26, 420, 209], [387, 2768, 121, 13, 59, 379], [387, 2846, 115, 13, 222, 379]]}, {"delay": 250, "blit": [[485, 701, 37, 13, 199, 6], [0, 1536, 376, 347, 40, 27], [524, 772, 13, 37, 420, 209], [387, 2807, 116, 13, 61, 379], [344, 4380, 110, 13, 225, 379]]}, {"delay": 250, "blit": [[485, 807, 37, 13, 199, 6], [0, 1883, 376, 347, 40, 27], [472, 807, 13, 37, 420, 209], [387, 2859, 113, 13, 61, 379], [344, 4406, 107, 13, 228, 379]]}, {"delay": 250, "blit": [[498, 907, 25, 13, 211, 6], [252, 6980, 252, 85, 74, 27], [0, 4582, 344, 258, 72, 115], [6, 496, 20, 55, 46, 110], [46, 167, 19, 22, 46, 185], [485, 894, 13, 25, 420, 209], [40, 295, 25, 22, 40, 277], [0, 761, 25, 55, 40, 319], [344, 4393, 109, 13, 61, 379], [344, 4432, 103, 13, 232, 379]]}, {"delay": 250, "blit": [[485, 820, 36, 13, 200, 6], [293, 7405, 242, 85, 79, 27], [256, 6218, 256, 258, 72, 115], [478, 455, 20, 32, 46, 124], [376, 1568, 85, 228, 331, 129], [46, 166, 19, 22, 46, 180], [522, 809, 13, 36, 420, 209], [40, 296, 25, 22, 40, 282], [498, 567, 25, 32, 40, 328], [297, 2480, 90, 13, 75, 379], [297, 2493, 85, 13, 236, 379]]}, {"delay": 250, "blit": [[288, 5702, 242, 106, 79, 6], [0, 5702, 288, 258, 40, 115], [297, 2524, 85, 1, 331, 123], [376, 1796, 85, 228, 331, 129], [485, 833, 13, 36, 420, 209], [297, 2523, 85, 1, 331, 364], [0, 7754, 264, 13, 66, 379]]}, {"delay": 250, "blit": [[0, 420, 376, 386, 40, 6], [502, 881, 13, 26, 420, 209]]}, {"delay": 250, "blit": [[0, 2230, 297, 386, 40, 6], [6, 2332, 20, 110, 46, 108], [297, 2514, 85, 8, 331, 116], [376, 2024, 85, 228, 331, 129], [515, 881, 13, 26, 420, 209], [297, 2506, 85, 8, 331, 364]]}, {"delay": 250, "blit": [[47, 203, 9, 13, 227, 6], [0, 4840, 256, 346, 72, 27], [297, 2252, 85, 228, 331, 129], [498, 489, 13, 9, 420, 209], [6, 941, 20, 14, 46, 108], [302, 1263, 85, 2, 331, 116], [461, 1568, 77, 30, 40, 362], [302, 1262, 85, 2, 331, 370], [46, 203, 20, 13, 222, 379], [244, 2603, 52, 13, 285, 379]]}, {"delay": 250, "blit": [[263, 4841, 242, 83, 79, 28], [256, 4840, 256, 346, 72, 27], [382, 2252, 85, 228, 331, 129], [6, 529, 21, 13, 317, 379], [161, 6, 9, 13, 227, 6], [420, 259, 13, 9, 420, 209]]}, {"delay": 250, "blit": [[0, 2896, 288, 371, 40, 6], [302, 3798, 85, 2, 331, 115], [387, 2480, 85, 228, 331, 129], [472, 844, 13, 26, 420, 209], [302, 3552, 85, 2, 331, 371], [480, 1585, 57, 13, 59, 379], [5, 529, 21, 13, 317, 379]]}, {"delay": 250, "blit": [[248, 7490, 242, 85, 79, 27], [0, 3267, 376, 277, 40, 115], [35, 3531, 73, 13, 75, 379], [246, 3531, 52, 13, 286, 379], [511, 845, 26, 13, 210, 6], [6, 2998, 20, 110, 46, 107], [472, 894, 13, 26, 420, 209], [154, 378, 25, 14, 40, 267], [40, 299, 25, 14, 40, 299], [40, 331, 25, 14, 40, 331]]}, {"delay": 250, "blit": [[528, 845, 9, 13, 227, 6], [0, 7497, 242, 83, 79, 28], [0, 6476, 252, 252, 74, 117], [376, 3214, 83, 228, 332, 129], [498, 452, 13, 9, 420, 209], [472, 662, 58, 13, 122, 379], [472, 675, 52, 13, 254, 379], [72, 372, 344, 1, 72, 115], [72, 372, 344, 1, 72, 372]]}, {"delay": 250, "blit": [[242, 7575, 242, 83, 79, 28], [252, 6476, 252, 252, 74, 117], [387, 3442, 83, 228, 332, 129], [227, 6, 9, 13, 227, 6], [420, 209, 13, 9, 420, 209], [40, 268, 26, 13, 154, 379], [45, 171, 20, 13, 254, 379]]}, {"delay": 250, "blit": [[0, 7580, 242, 83, 79, 28], [478, 465, 20, 13, 46, 107], [0, 6728, 252, 252, 74, 117], [387, 3670, 83, 228, 332, 129], [498, 576, 25, 13, 40, 364]]}, {"delay": 250, "blit": [[242, 7658, 242, 83, 79, 28], [252, 6728, 252, 252, 74, 117], [381, 3898, 83, 228, 332, 129], [0, 0, 20, 13, 46, 107], [0, 0, 25, 13, 40, 364]]}, {"delay": 250, "blit": [[0, 7663, 242, 83, 79, 28], [0, 6980, 252, 252, 74, 117], [381, 4126, 83, 228, 332, 129]]}, {"delay": 750, "blit": [[0, 0, 538, 420, 0, 0]]}] \ No newline at end of file diff --git a/doc/_images/Laguerre-Gauss-ani/b_packed.png b/doc/_images/Laguerre-Gauss-ani/b_packed.png new file mode 100644 index 00000000..dcc44500 Binary files /dev/null and b/doc/_images/Laguerre-Gauss-ani/b_packed.png differ diff --git a/doc/_images/Laguerre-Gauss-ani/s_anim.js b/doc/_images/Laguerre-Gauss-ani/s_anim.js new file mode 100644 index 00000000..b907e7d8 --- /dev/null +++ b/doc/_images/Laguerre-Gauss-ani/s_anim.js @@ -0,0 +1 @@ +s_timeline = [{"delay": 250, "blit": [[0, 0, 269, 210, 0, 0]]}, {"delay": 250, "blit": [[0, 5419, 172, 167, 38, 13]]}, {"delay": 250, "blit": [[0, 4483, 192, 178, 18, 13]]}, {"delay": 250, "blit": [[0, 4305, 192, 178, 18, 13]]}, {"delay": 250, "blit": [[0, 4661, 181, 167, 38, 13], [111, 3, 9, 8, 111, 3], [75, 188, 64, 10, 75, 188]]}, {"delay": 250, "blit": [[0, 3923, 183, 195, 36, 3]]}, {"delay": 250, "blit": [[0, 3559, 201, 185, 18, 13], [221, 210, 17, 11, 103, 1]]}, {"delay": 250, "blit": [[0, 3362, 201, 197, 18, 1]]}, {"delay": 250, "blit": [[0, 4118, 185, 187, 34, 11], [93, 1786, 9, 10, 111, 1]]}, {"delay": 250, "blit": [[0, 3165, 201, 197, 18, 1]]}, {"delay": 250, "blit": [[0, 2968, 201, 197, 18, 1]]}, {"delay": 250, "blit": [[0, 2771, 201, 197, 18, 1]]}, {"delay": 250, "blit": [[0, 2574, 201, 197, 18, 1]]}, {"delay": 250, "blit": [[0, 5222, 146, 197, 18, 1], [205, 838, 54, 117, 165, 63]]}, {"delay": 250, "blit": [[0, 2377, 201, 197, 18, 1]]}, {"delay": 250, "blit": [[0, 2180, 201, 197, 18, 1]]}, {"delay": 250, "blit": [[0, 1983, 201, 197, 18, 1]]}, {"delay": 250, "blit": [[0, 1786, 201, 197, 18, 1]]}, {"delay": 250, "blit": [[0, 3744, 201, 179, 18, 1], [0, 5586, 142, 16, 29, 182]]}, {"delay": 250, "blit": [[0, 407, 219, 197, 0, 1]]}, {"delay": 250, "blit": [[0, 210, 221, 197, 0, 1]]}, {"delay": 250, "blit": [[0, 604, 207, 197, 14, 1]]}, {"delay": 250, "blit": [[0, 1589, 205, 197, 14, 1]]}, {"delay": 250, "blit": [[0, 1392, 205, 197, 14, 1]]}, {"delay": 250, "blit": [[0, 5025, 150, 197, 14, 1], [207, 721, 54, 117, 165, 63]]}, {"delay": 250, "blit": [[0, 1195, 205, 197, 14, 1]]}, {"delay": 250, "blit": [[0, 998, 205, 197, 14, 1]]}, {"delay": 250, "blit": [[0, 801, 205, 197, 14, 1]]}, {"delay": 1000, "blit": [[0, 4828, 150, 197, 14, 1], [207, 604, 54, 117, 165, 63]]}, {"delay": 250, "blit": [[0, 801, 205, 197, 14, 1]]}, {"delay": 250, "blit": [[0, 998, 205, 197, 14, 1]]}, {"delay": 250, "blit": [[0, 1195, 205, 197, 14, 1]]}, {"delay": 250, "blit": [[0, 5025, 150, 197, 14, 1], [207, 721, 54, 117, 165, 63]]}, {"delay": 250, "blit": [[0, 1392, 205, 197, 14, 1]]}, {"delay": 250, "blit": [[0, 1589, 205, 197, 14, 1]]}, {"delay": 250, "blit": [[0, 604, 207, 197, 14, 1]]}, {"delay": 250, "blit": [[0, 210, 221, 197, 0, 1]]}, {"delay": 250, "blit": [[0, 407, 219, 197, 0, 1]]}, {"delay": 250, "blit": [[0, 3744, 201, 179, 18, 1], [0, 5586, 142, 16, 29, 182]]}, {"delay": 250, "blit": [[0, 1786, 201, 197, 18, 1]]}, {"delay": 250, "blit": [[0, 1983, 201, 197, 18, 1]]}, {"delay": 250, "blit": [[0, 2180, 201, 197, 18, 1]]}, {"delay": 250, "blit": [[0, 2377, 201, 197, 18, 1]]}, {"delay": 250, "blit": [[0, 5222, 146, 197, 18, 1], [205, 838, 54, 117, 165, 63]]}, {"delay": 250, "blit": [[0, 2574, 201, 197, 18, 1]]}, {"delay": 250, "blit": [[0, 2771, 201, 197, 18, 1]]}, {"delay": 250, "blit": [[0, 2968, 201, 197, 18, 1]]}, {"delay": 250, "blit": [[0, 3165, 201, 197, 18, 1]]}, {"delay": 250, "blit": [[0, 4118, 185, 187, 34, 11], [93, 1786, 9, 10, 111, 1]]}, {"delay": 250, "blit": [[0, 3362, 201, 197, 18, 1]]}, {"delay": 250, "blit": [[0, 3559, 201, 185, 18, 13], [221, 210, 17, 11, 103, 1]]}, {"delay": 250, "blit": [[0, 3923, 183, 195, 36, 3]]}, {"delay": 250, "blit": [[0, 4661, 181, 167, 38, 13], [111, 3, 9, 8, 111, 3], [75, 188, 64, 10, 75, 188]]}, {"delay": 250, "blit": [[0, 4305, 192, 178, 18, 13]]}, {"delay": 250, "blit": [[0, 4483, 192, 178, 18, 13]]}, {"delay": 250, "blit": [[0, 5419, 172, 167, 38, 13]]}, {"delay": 750, "blit": [[0, 0, 269, 210, 0, 0]]}] \ No newline at end of file diff --git a/doc/_images/Laguerre-Gauss-ani/s_packed.png b/doc/_images/Laguerre-Gauss-ani/s_packed.png new file mode 100644 index 00000000..fb1bba14 Binary files /dev/null and b/doc/_images/Laguerre-Gauss-ani/s_packed.png differ diff --git a/doc/_images/flux_BioNanoMAX.png b/doc/_images/flux_BioNanoMAX.png index 014ebfac..f64ccc27 100644 Binary files a/doc/_images/flux_BioNanoMAX.png and b/doc/_images/flux_BioNanoMAX.png differ diff --git a/doc/_images/mayavi_0em_2srw.png b/doc/_images/mayavi_0em_2srw.png new file mode 100644 index 00000000..24b9cac8 Binary files /dev/null and b/doc/_images/mayavi_0em_2srw.png differ diff --git a/doc/_images/mayavi_0em_3xrt.png b/doc/_images/mayavi_0em_3xrt.png new file mode 100644 index 00000000..e09690fa Binary files /dev/null and b/doc/_images/mayavi_0em_3xrt.png differ diff --git a/doc/_images/mayavi_non0em_2srw.png b/doc/_images/mayavi_non0em_2srw.png new file mode 100644 index 00000000..c69e9423 Binary files /dev/null and b/doc/_images/mayavi_non0em_2srw.png differ diff --git a/doc/_images/mayavi_non0em_3xrt.png b/doc/_images/mayavi_non0em_3xrt.png new file mode 100644 index 00000000..a9d1467a Binary files /dev/null and b/doc/_images/mayavi_non0em_3xrt.png differ diff --git a/doc/_images/mayavi_non0em_non0spread_2srw.png b/doc/_images/mayavi_non0em_non0spread_2srw.png new file mode 100644 index 00000000..84986357 Binary files /dev/null and b/doc/_images/mayavi_non0em_non0spread_2srw.png differ diff --git a/doc/_images/mayavi_non0em_non0spread_3xrt.png b/doc/_images/mayavi_non0em_non0spread_3xrt.png new file mode 100644 index 00000000..88e1b393 Binary files /dev/null and b/doc/_images/mayavi_non0em_non0spread_3xrt.png differ diff --git a/doc/_static/thumbnail.css b/doc/_static/thumbnail.css index ada89ce6..754eb14c 100644 --- a/doc/_static/thumbnail.css +++ b/doc/_static/thumbnail.css @@ -1,7 +1,7 @@ .thumbnail{ position: relative; z-index: 0; -cursor: pointer; +cursor: zoom-in; transition: 0.3s; } .thumbnail:hover{ @@ -29,7 +29,7 @@ visibility: visible; .thumbnailhover{ position: relative; z-index: 0; -cursor: pointer; +cursor: zoom-in; transition: 0.3s; } .thumbnailhover:hover{ diff --git a/doc/anim_encoder/anim_encoder.py b/doc/anim_encoder/anim_encoder.py index a4366a14..40cf10d7 100644 --- a/doc/anim_encoder/anim_encoder.py +++ b/doc/anim_encoder/anim_encoder.py @@ -474,15 +474,15 @@ def generate_animation(dirname, fname, time_factor=5, # fname = 'cxi-1D-2-hybr-1e6hor-0emit-0enSpread-monoE-08p-ExpFocusPhase*.png' # fname = 'cxi-1D-2-hybr-1e6hor-0emit-0enSpread-monoE-08pf-ExpFocusPhaseFront*.png' - dirName = r'c:\Ray-tracing\examples\withRaycing\44_SoftiCXI' -# fname = '1D-1-rays-hor-0emit-0enSpread-monoE-08e-ExpFocus*.png' - fname = '1D-2-hybr-hor-0emit-0enSpread-monoE-08e-ExpFocus*.png' -# fname = '1D-3-wave-hor-0emit-0enSpread-monoE-08e-ExpFocus*.png' -# fname = 'XXIDOC-1D-2-hybr-hor-0emit-0enSpread-monoE--*.png' -# fname = 'XXIDOC-1D-2-hybr-hor-non0e-0enSpread-monoE--*.png' - - generate_animation(dirName, "s_"+fname, time_factor=20, endFrameDelay=2000) - generate_animation(dirName, fname, time_factor=20, endFrameDelay=2000) +# dirName = r'c:\Ray-tracing\examples\withRaycing\44_SoftiCXI' +## fname = '1D-1-rays-hor-0emit-0enSpread-monoE-08e-ExpFocus*.png' +# fname = '1D-2-hybr-hor-0emit-0enSpread-monoE-08e-ExpFocus*.png' +## fname = '1D-3-wave-hor-0emit-0enSpread-monoE-08e-ExpFocus*.png' +## fname = 'XXIDOC-1D-2-hybr-hor-0emit-0enSpread-monoE--*.png' +## fname = 'XXIDOC-1D-2-hybr-hor-non0e-0enSpread-monoE--*.png' +# +# generate_animation(dirName, "s_"+fname, time_factor=20, endFrameDelay=2000) +# generate_animation(dirName, fname, time_factor=20, endFrameDelay=2000) # dirName = r'c:\Ray-tracing\examples\withRaycing\33_Warping' # fname = 'rays-perfect-*.png' @@ -503,3 +503,9 @@ def generate_animation(dirname, fname, time_factor=5, # # generate_animation(dirName, "s_"+fname, time_factor=10, endFrameDelay=1000) # generate_animation(dirName, fname, time_factor=10, endFrameDelay=1000) + + dirName = r'c:\Ray-tracing\tests\raycing' + fname = '_Laguerre-Gauss-*.png' + + generate_animation(dirName, "s_"+fname, endFrameDelay=1000) + generate_animation(dirName, fname, endFrameDelay=1000) diff --git a/doc/history.rst b/doc/history.rst index 8c594fe9..ff35dae1 100644 --- a/doc/history.rst +++ b/doc/history.rst @@ -3,15 +3,22 @@ Version history --------------- -1.2.1 (18 Aug 2016): +1.2.1 (18 Sep 2016): - Added SRW to some comparisons of synchrotron sources. See :ref:`here `. - - As the main browsers stop supporting flash animations, we have rebuilt - all our animations on the documentation pages. The images are animated in - JavaScript and feature on spot zooming by mouse click. The total size of - the images has become smaller at better image quality and bidirectional - animations (doubled number of frames). + - As the major browsers stop supporting flash animations, we have rebuilt + all our animations on the documentation pages. The images are now + animated in JavaScript and feature on spot zooming by mouse click (not in + IE though). The total size of the images has become smaller at better + image quality and bidirectional animations (doubled number of frames). + + - The development of Qt is such that its every new version requires changes + in imports and invoked methods. To make a program work with several Qt + versions requires proliferating conditional structures. We try to follow + the Qt development. xrtQook works fine with the Qt versions up to 5.6. + With the Qt versions 5.6+, the functionality of xrtQook help is somewhat + restricted (so far). - Minor bug fixes and updates. diff --git a/doc/make.bat b/doc/make.bat new file mode 100644 index 00000000..f8426098 --- /dev/null +++ b/doc/make.bat @@ -0,0 +1,192 @@ +@ECHO OFF + +REM Command file for Sphinx documentation + +set PATH=c:\WinPython-64bit-2.7.6.1\python-2.7.6.amd64\Scripts;%PATH% + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set BUILDDIR=_build +set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . +set I18NSPHINXOPTS=%SPHINXOPTS% . +if NOT "%PAPER%" == "" ( + set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% + set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% +) + +if "%1" == "" goto help + +if "%1" == "help" ( + :help + echo.Please use `make ^` where ^ is one of + echo. html to make standalone HTML files + echo. dirhtml to make HTML files named index.html in directories + echo. singlehtml to make a single large HTML file + echo. pickle to make pickle files + echo. json to make JSON files + echo. htmlhelp to make HTML files and a HTML help project + echo. qthelp to make HTML files and a qthelp project + echo. devhelp to make HTML files and a Devhelp project + echo. epub to make an epub + echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter + echo. text to make text files + echo. man to make manual pages + echo. texinfo to make Texinfo files + echo. gettext to make PO message catalogs + echo. changes to make an overview over all changed/added/deprecated items + echo. linkcheck to check all external links for integrity + echo. doctest to run all doctests embedded in the documentation if enabled + goto end +) + +if "%1" == "clean" ( + for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i + del /q /s %BUILDDIR%\* + goto end +) + +if "%1" == "html" ( + %SPHINXBUILD% -E -b html %ALLSPHINXOPTS% %BUILDDIR%/html + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/html. + goto end +) + +if "%1" == "dirhtml" ( + %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. + goto end +) + +if "%1" == "singlehtml" ( + %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. + goto end +) + +if "%1" == "pickle" ( + %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the pickle files. + goto end +) + +if "%1" == "json" ( + %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the JSON files. + goto end +) + +if "%1" == "htmlhelp" ( + %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run HTML Help Workshop with the ^ +.hhp project file in %BUILDDIR%/htmlhelp. + goto end +) + +if "%1" == "qthelp" ( + %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run "qcollectiongenerator" with the ^ +.qhcp project file in %BUILDDIR%/qthelp, like this: + echo.^> qcollectiongenerator %BUILDDIR%\qthelp\xrt.qhcp + echo.To view the help file: + echo.^> assistant -collectionFile %BUILDDIR%\qthelp\xrt.ghc + goto end +) + +if "%1" == "devhelp" ( + %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. + goto end +) + +if "%1" == "epub" ( + %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The epub file is in %BUILDDIR%/epub. + goto end +) + +if "%1" == "latex" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "text" ( + %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The text files are in %BUILDDIR%/text. + goto end +) + +if "%1" == "man" ( + %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The manual pages are in %BUILDDIR%/man. + goto end +) + +if "%1" == "texinfo" ( + %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. + goto end +) + +if "%1" == "gettext" ( + %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The message catalogs are in %BUILDDIR%/locale. + goto end +) + +if "%1" == "changes" ( + %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes + if errorlevel 1 exit /b 1 + echo. + echo.The overview file is in %BUILDDIR%/changes. + goto end +) + +if "%1" == "linkcheck" ( + %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck + if errorlevel 1 exit /b 1 + echo. + echo.Link check complete; look for any errors in the above output ^ +or in %BUILDDIR%/linkcheck/output.txt. + goto end +) + +if "%1" == "doctest" ( + %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest + if errorlevel 1 exit /b 1 + echo. + echo.Testing of doctests in the sources finished, look at the ^ +results in %BUILDDIR%/doctest/output.txt. + goto end +) + +:end diff --git a/doc/plans.rst b/doc/plans.rst index 7a47e360..9d979adb 100644 --- a/doc/plans.rst +++ b/doc/plans.rst @@ -3,6 +3,7 @@ Plans ----- +- comparison of wave propagation with SRW - scans and wave propagation in xrtQook - dynamical theory of x-ray diffraction for bent crystals -- TT theory - free electron lasers as sources diff --git a/examples/withRaycing/00_xRayCalculator/calc_bm.py b/examples/withRaycing/00_xRayCalculator/calc_bm.py index 70f6d303..e63d932c 100644 --- a/examples/withRaycing/00_xRayCalculator/calc_bm.py +++ b/examples/withRaycing/00_xRayCalculator/calc_bm.py @@ -22,7 +22,7 @@ def main(): source = rs.BendingMagnet(**kwargs) I0xrt = source.intensities_on_mesh(energy, theta, psi)[0] - print I0xrt.shape, I0xrt.max() + print(I0xrt.shape, I0xrt.max()) flux_xrt = I0xrt.sum(axis=(1, 2)) * dtheta * dpsi plt.plot(energy/1e3, flux_xrt, 'r', label='xrt', lw=5) @@ -36,7 +36,7 @@ def main(): I0ws = source.intensities_on_mesh()[0] I0ws = np.concatenate((I0ws[:, :0:-1, :], I0ws), axis=1) I0ws = np.concatenate((I0ws[:, :, :0:-1], I0ws), axis=2) - print I0ws.shape, I0ws.max() + print(I0ws.shape, I0ws.max()) dtheta = (theta[-1] - theta[0]) / 2 flux_ws = I0ws.sum(axis=(1, 2)) * dtheta * dpsi * 1e6 diff --git a/examples/withRaycing/00_xRayCalculator/calc_undulator.py b/examples/withRaycing/00_xRayCalculator/calc_undulator.py index 81eb2a5d..de6eb81d 100644 --- a/examples/withRaycing/00_xRayCalculator/calc_undulator.py +++ b/examples/withRaycing/00_xRayCalculator/calc_undulator.py @@ -104,8 +104,8 @@ def main(): I0 = np.concatenate((I0[:, :0:-1, :], I0), axis=1) I0 = np.concatenate((I0[:, :, :0:-1], I0), axis=2) -# flux_through_aperture(energy, theta, psi, I0) - intensity_in_transverse_plane(energy, theta, psi, I0) + flux_through_aperture(energy, theta, psi, I0) +# intensity_in_transverse_plane(energy, theta, psi, I0) # colored_intensity_in_transverse_plane(energy, theta, psi, I0) plt.show() diff --git a/examples/withRaycing/01_SynchrotronSources/MAX-IV-IDs-Flux.py b/examples/withRaycing/01_SynchrotronSources/MAX-IV-IDs-Flux.py index ce47a397..67ff9548 100644 --- a/examples/withRaycing/01_SynchrotronSources/MAX-IV-IDs-Flux.py +++ b/examples/withRaycing/01_SynchrotronSources/MAX-IV-IDs-Flux.py @@ -10,16 +10,23 @@ from xrt.backends.raycing.physconsts import SIE0 withUndulator = True -withUrgentUndulator = False -withSRWUndulator = False +#withUndulator = False +withUrgentUndulator = True +#withUrgentUndulator = False +withSRWUndulator = True +#withSRWUndulator = False def run(case): eMax = 200100. + eN = 201 thetaMax, psiMax = 500e-6, 500e-6 if case == 'Balder': Kmax = 8.446 +# Kmax = 3 thetaMax, psiMax = 200e-6, 50e-6 +# thetaMax, psiMax = 1130e-6/2, 1180e-6/2 # asked by Magnus + eMax, eN = 400100, 401 kwargs = dict(name='SoleilW50', eE=3.0, eI=0.5, eEpsilonX=0.263, eEpsilonZ=0.008, betaX=9., betaZ=2., period=50., n=39, K=Kmax, eMax=eMax, @@ -32,8 +39,8 @@ def run(case): period=18.5, n=108, K=Kmax, eMax=eMax, xPrimeMax=thetaMax*1e3, zPrimeMax=psiMax*1e3, distE='BW') elif case == 'Veritas' or case == 'Hippie': -# thetaMax, psiMax = 100e-6, 50e-6 - thetaMax, psiMax = 100e-6, 200e-6 # asked by Magnus + thetaMax, psiMax = 100e-6, 50e-6 +# thetaMax, psiMax = 100e-6, 200e-6 # asked by Magnus # thetaMax, psiMax = 500e-6, 500e-6 # asked by Magnus kwargs = dict(name='U48', eE=3.0, eI=0.5, eEpsilonX=0.263, eEpsilonZ=0.008, betaX=9., betaZ=2., @@ -48,9 +55,8 @@ def run(case): kwargs['n'] = 73 kwargs['K'] = 5.28 - sourceW = rs.Wiggler(**kwargs) - energy = np.linspace(100., eMax, 201) + energy = np.linspace(100., eMax, eN) theta = np.linspace(-1, 1, 101) * thetaMax psi = np.linspace(-1, 1, 101) * psiMax # theta = np.linspace(-1, 1, 15) * thetaMax @@ -89,8 +95,8 @@ def run(case): if withSRWUndulator: import pickle - with open('c:\Ray-tracing\srw\SRWres.pickle ', 'rb') as f: - energySRW, thetaSRW, psiSRW, I0SRW = pickle.load(f) + with open('c:\Ray-tracing\srw\SRWres.pickle', 'rb') as f: + energySRW, thetaSRW, psiSRW, I0SRW = pickle.load(f)[0:4] dtheta = thetaSRW[1] - thetaSRW[0] dpsi = psiSRW[1] - psiSRW[0] fluxSRWU = I0SRW.sum(axis=(1, 2)) * dtheta * dpsi @@ -107,8 +113,13 @@ def run(case): fig.suptitle(case, fontsize=14) rect2d1 = [0.12, 0.12, 0.85, 0.8] ax1 = fig.add_axes(rect2d1, aspect='auto') - rect2d2 = [0.2, 0.17, 0.3, 0.35] + rect2d2 = [0.22, 0.19, 0.33, 0.5] ax2 = fig.add_axes(rect2d2, aspect='auto') + ax2.spines['top'].set_visible(False) + ax2.spines['right'].set_visible(False) + ax2.xaxis.set_ticks_position('bottom') + ax2.yaxis.set_ticks_position('left') + ax2.patch.set_visible(False) for ax, lw in zip([ax1, ax2], [2, 2]): # plot = ax.plot plot = ax.semilogy @@ -123,7 +134,7 @@ def run(case): label='Urgent') if withSRWUndulator: plot(energySRW/1000., fluxSRWU, '-', lw=lw, alpha=0.7, - label='SRW') + label='SRW (zero emittance)') if case == 'BioMAX & NanoMAX': # Spectra results # fnames = ['bionano2.dc0', 'bionano3.dc0'] # labels = ['Spectra, accuracy {0}'.format(i) for i in [2, 3]] @@ -142,7 +153,7 @@ def run(case): else: ax1.set_ylim(1e3, None) ax2.set_xlim(1, 30) - ax2.set_ylim(1e12, None) + ax2.set_ylim(1e12, 2e15) if withUndulator: ax1.legend(loc='upper right') @@ -154,8 +165,10 @@ def run(case): ws.write(0, 0, u'energy (eV)') ws.write(0, 1, u'fluxW through {0:.0f}×{1:.0f} µrad² (ph/s/0.1%BW)'.format( theta[-1]*2e6, psi[-1]*2e6)) - ws.write(0, 2, u'fluxU through {0:.0f}×{1:.0f} µrad² (ph/s/0.1%BW)'.format( - theta[-1]*2e6, psi[-1]*2e6)) + if withUndulator: + ws.write(0, 2, + u'fluxU through {0:.0f}×{1:.0f} µrad² (ph/s/0.1%BW)'.format( + theta[-1]*2e6, psi[-1]*2e6)) for i, e in enumerate(energy): ws.write(i+1, 0, e) @@ -170,7 +183,6 @@ def run(case): if __name__ == '__main__': # run('Balder') -# run('BioMAX & NanoMAX') + run('BioMAX & NanoMAX') # run('Veritas') - run('Hippie') - +# run('Hippie') diff --git a/examples/withRaycing/01_SynchrotronSources/my_arbitrary_field_test.py b/examples/withRaycing/01_SynchrotronSources/my_arbitrary_field_test.py index 2eabff62..88b53186 100644 --- a/examples/withRaycing/01_SynchrotronSources/my_arbitrary_field_test.py +++ b/examples/withRaycing/01_SynchrotronSources/my_arbitrary_field_test.py @@ -19,28 +19,30 @@ # Integration grid (per period) nRKPoins = 30 -kwargs = dict(eE=1.5, period=84., n=36) -eEpsilonX = 6.0e-9 -eEpsilonZ = 0.06e-9 -betaX = 5.66 -betaZ = 2.85 -sigmaX = (eEpsilonX * betaX)**0.5 -sigmaXp = (eEpsilonX / betaX)**0.5 -print(u'sigmaX={} µm'.format(sigmaX*1e6)) -print(u'sigmaXp={} mrad'.format(sigmaXp*1e6)) -sigmaZ = (eEpsilonZ * betaZ)**0.5 -sigmaZp = (eEpsilonZ / betaZ)**0.5 -print(u'sigmaZ={} µm'.format(sigmaZ*1e6)) -print(u'sigmaZp={} mrad'.format(sigmaZp*1e6)) +#kwargs = dict(eE=1.5, period=84., n=36) +#eEpsilonX = 4e-9 +#eEpsilonZ = 0.04e-9 +#betaX = 5.66 +#betaZ = 2.85 +#sigmaX = (eEpsilonX * betaX)**0.5 +#sigmaXp = (eEpsilonX / betaX)**0.5 +#print(u'sigmaX={} µm'.format(sigmaX*1e6)) +#print(u'sigmaXp={} mrad'.format(sigmaXp*1e6)) +#sigmaZ = (eEpsilonZ * betaZ)**0.5 +#sigmaZp = (eEpsilonZ / betaZ)**0.5 +#print(u'sigmaZ={} µm'.format(sigmaZ*1e6)) +#print(u'sigmaZp={} mrad'.format(sigmaZp*1e6)) #sheet, prefix = 'EPU_HP_mode', '1' -sheet, prefix = 'QEPU_HP_mode', '2' +#sheet, prefix = 'QEPU_HP_mode', '2' #sheet, prefix = 'EPU_VP_mode', '3' #sheet, prefix = 'QEPU_VP_mode', '4' -customField = ['B-Hamed.xlsx', dict(sheetname=sheet, skiprows=0)] +#customField = ['B-Hamed.xlsx', dict(sheetname=sheet, skiprows=0)] #kwargs = dict(eE=3, period=18.5*3, n=108/3, targetE=[9000, 7]) -#customField = 20. +kwargs = dict(eE=2.739, period=20., n=98, K=1.7425) +#kwargs = dict(eE=2.739, period=20., n=98, targetE=[12700, 9]) +customField = 20. eE = kwargs['eE'] # [GeV] gamma = eE * 1e9 * SIE0 / (SIM0 * SIC**2) @@ -391,9 +393,9 @@ def iterate_rk(): dzgrid.append(dz) betaZav /= betaZpath - print "betaZav", betaZav, ", betam", betam + print("betaZav", betaZav, ", betam", betam) wuAv = 2. * np.pi * SIC * betaZav / Lu / E2W - print "wuAv", wuAv, ", wu", wu + print("wuAv", wuAv, ", wu", wu) # test of the integration: taking arbitrary direction norm_ref = np.array( @@ -478,24 +480,28 @@ def iterate_rk(): # plt.savefig("beta_z"+suffix+'.png') plt.figure(6) - plt.plot(z, np.array(xgrid[:-1]) / tgwmm * 1e3) + x = np.array(xgrid[:-1]) / tgwmm * 1e3 + plt.plot(z, x) if compare2reference: plt.plot(z, np.array(r_ref[0]) / tgwmm * wu * 1e3) plt.title("Trajectory, $x$ plane") plt.xlabel(r"z, mm") plt.ylabel(u"x, µm") plt.gca().set_xlim(z[0], z[-1]) - plt.gca().set_ylim(-60, 60) +# plt.gca().set_ylim(-60, 60) + plt.gca().set_ylim(x.min(), x.max()) plt.savefig("x"+suffix+'.png') plt.figure(7) - plt.plot(z, np.array(ygrid[:-1]) / tgwmm * 1e3) + y = np.array(ygrid[:-1]) / tgwmm * 1e3 + plt.plot(z, y) if compare2reference: plt.plot(z[:-1], np.array(r_ref[1]) / tgwmm * wu * 1e3) plt.title("Trajectory, $y$ plane") plt.xlabel(r"z, mm") plt.ylabel(u"y, µm") plt.gca().set_xlim(z[0], z[-1]) + plt.gca().set_ylim(y.min(), y.max()) plt.savefig("y"+suffix+'.png') plt.figure(8) diff --git a/examples/withRaycing/01_SynchrotronSources/synchrotronSources.py b/examples/withRaycing/01_SynchrotronSources/synchrotronSources.py index 7871f72f..11fbbdbc 100644 --- a/examples/withRaycing/01_SynchrotronSources/synchrotronSources.py +++ b/examples/withRaycing/01_SynchrotronSources/synchrotronSources.py @@ -118,25 +118,27 @@ meshes (not important in the new versions of xrt (>0.9), where there are no angular and energy meshes and the intensity is calculated *for each* ray). -.. imagezoom:: _images/I0_x'E_mode4-1-und-urgent.png -.. imagezoom:: _images/I0_z'E_mode4-1-und-urgent.png - :loc: upper-right-corner +| |I0_x'E| +| |I0_z'E| +| |IpPol| -.. imagezoom:: _images/IpPol +.. |I0_x'E| imagezoom:: _images/I0_x'E_mode4-1-und-urgent.png +.. |I0_z'E| imagezoom:: _images/I0_z'E_mode4-1-und-urgent.png +.. |IpPol| imagezoom:: _images/IpPol The ray traced images of an undulator source are feature-rich. The polarization is primarily horizontal. The off-plane radiation has non-zero projection to the vertical polarization plane. -+--------+----------------+----------------+----------------+----------------+ -| source | total flux | hor. pol. flux | ver. pol. flux | deg. of pol. | -+========+================+================+================+================+ -| using | | | | | -| Urgent | |uTotalUr| | |uHorizUr| | |uVertUr| | |uDegPolUr| | -+--------+----------------+----------------+----------------+----------------+ -|internal| | | | | -|xrt | |uTotalXRT| | |uHorizXRT| | |uVertXRT| | |uDegPolXRT| | -+--------+----------------+----------------+----------------+----------------+ ++---------+----------------+----------------+----------------+----------------+ +| source | total flux | hor. pol. flux | ver. pol. flux | deg. of pol. | ++=========+================+================+================+================+ +| using | | | | | +| Urgent | |uTotalUr| | |uHorizUr| | |uVertUr| | |uDegPolUr| | ++---------+----------------+----------------+----------------+----------------+ +| internal| | | | | +| xrt | |uTotalXRT| | |uHorizXRT| | |uVertXRT| | |uDegPolXRT| | ++---------+----------------+----------------+----------------+----------------+ .. |uTotalUr| imagezoom:: _images/1u_urgent3-n-monoE-1TotalFlux.png .. |uHorizUr| imagezoom:: _images/1u_urgent3-n-monoE-2horizFlux.png @@ -210,7 +212,7 @@ of the 3rd harmonic with the triple energy of the 1st harmonic. .. [Tarawneh] Quasi-periodic undulator field for ARPES beamline at - MAX IV 1.5 GeV ring, unpublished. + MAX IV 1.5 GeV ring, (2016) unpublished. .. note:: diff --git a/tests/raycing/laguerre_gaussian_beam.py b/tests/raycing/laguerre_gaussian_beam.py index 6f879bc3..36c2c966 100644 --- a/tests/raycing/laguerre_gaussian_beam.py +++ b/tests/raycing/laguerre_gaussian_beam.py @@ -179,9 +179,13 @@ maxFactor = 2. # factor that determines the screen limits as ±w*maxFactor maxFactor *= (abs(lVortex)+pVortex+1)**0.25 uniformRayDensity = True -ps = np.array([0, 0.5, 1, 2, 4, 8]) * 10000. +#ps = np.array([0, 0.5, 1, 2, 4, 8]) * 10000. +ps = np.array(range(10) + range(1, 11) + range(20, 101, 10)) * 1000. +ps[0:10] /= 10. +#print(ps) bins, ppb = 256, 1 +wantKirchhoff = False def build_beamline(): @@ -210,7 +214,7 @@ def run_process(beamLine): what = 'beamFSMg{0}'.format(ip) outDict[what] = waveOnFSMg - if p > 100: + if p > 100 and wantKirchhoff: wrepeats = 1 waveOnFSMk = beamLine.fsmFar.prepare_wave(beamLine.source, x, z) for r in range(wrepeats): @@ -238,12 +242,17 @@ def define_plots(beamLine): bins=bins, ppb=ppb)) plot.xaxis.limits = [-lim, lim] plot.yaxis.limits = [-lim, lim] - plot.title = '{0}{1}-beamFSMg-at{2:02.0f}m'.format( + plot.title = '{0}{1:02d}-beamFSMg-at{2:03.1f}m'.format( prefix, ip, p*1e-3) + tpf = '{0:2.1f} m' if p < 1000 else '{0:2.0f} m' + plot.textPanel = plot.ax2dHist.text( + 0.02, 0.98, tpf.format(p*1e-3), size=14, color='w', + transform=plot.ax2dHist.transAxes, + ha='left', va='top') plot.saveName = plot.title + '.png' plots.append(plot) - if p > 100: + if p > 100 and wantKirchhoff: plot = xrtp.XYCPlot( 'beamFSMk{0}'.format(ip), (1,), xaxis=xrtp.XYCAxis(r'$x$', u'µm', bins=bins, ppb=ppb), @@ -252,7 +261,11 @@ def define_plots(beamLine): bins=bins, ppb=ppb)) plot.xaxis.limits = [-lim, lim] plot.yaxis.limits = [-lim, lim] - plot.title = '{0}{1}-beamFSMk-at{2:02.0f}m'.format( + plot.textPanel = plot.ax2dHist.text( + 0.02, 0.98, tpf.format(p*1e-3), size=14, color='w', + transform=plot.ax2dHist.transAxes, + ha='left', va='top') + plot.title = '{0}{1:02d}-beamFSMk-at{2:03.1f}m'.format( prefix, ip, p*1e-3) plot.saveName = plot.title + '.png' plots.append(plot) diff --git a/tests/raycing/mock_surface.dat b/tests/raycing/mock_surface.dat new file mode 100644 index 00000000..2b6d5ea7 --- /dev/null +++ b/tests/raycing/mock_surface.dat @@ -0,0 +1,5512 @@ +# x [mm] y [mm] z [nm] +30.0 29.75 -31.498373 +30.5 29.75 -32.992258 +31.0 29.75 -33.864061 +31.5 29.75 -34.240630 +32.0 29.75 -34.397544 +32.5 29.75 -34.423695 +33.0 29.75 -34.261336 +33.5 29.75 -33.918157 +34.0 29.75 -33.571642 +34.5 29.75 -33.370290 +35.0 29.75 -33.291902 +35.5 29.75 -33.262407 +36.0 29.75 -33.281562 +36.5 29.75 -33.301435 +37.0 29.75 -33.190007 +37.5 29.75 -32.956264 +38.0 29.75 -32.798113 +38.5 29.75 -32.831611 +39.0 29.75 -32.948459 +39.5 29.75 -33.006265 +40.0 29.75 -33.055748 +40.5 29.75 -33.112107 +41.0 29.75 -33.046610 +41.5 29.75 -32.765363 +42.0 29.75 -32.347819 +42.5 29.75 -31.967419 +43.0 29.75 -31.621104 +43.5 29.75 -31.286985 +44.0 29.75 -31.003708 +44.5 29.75 -30.771015 +45.0 29.75 -30.416757 +45.5 29.75 -29.884608 +46.0 29.75 -29.427508 +46.5 29.75 -29.276596 +47.0 29.75 -29.318673 +47.5 29.75 -29.301527 +48.0 29.75 -29.224844 +48.5 29.75 -29.130651 +49.0 29.75 -28.866838 +49.5 29.75 -28.320437 +50.0 29.75 -27.608100 +50.5 29.75 -26.917301 +51.0 29.75 -26.258397 +51.5 29.75 -25.532398 +52.0 29.75 -24.753647 +52.5 29.75 -23.887834 +53.0 29.75 -22.866877 +53.5 29.75 -21.666277 +54.0 29.75 -20.524704 +54.5 29.75 -19.560702 +55.0 29.75 -18.657454 +55.5 29.75 -17.719157 +56.0 29.75 -16.768620 +56.5 29.75 -15.790295 +57.0 29.75 -14.542325 +57.5 29.75 -12.964071 +58.0 29.75 -11.369629 +58.5 29.75 -10.069151 +59.0 29.75 -9.060308 +59.5 29.75 -8.183823 +60.0 29.75 -7.415291 +60.5 29.75 -6.761584 +61.0 29.75 -6.047889 +61.5 29.75 -5.182200 +62.0 29.75 -4.422407 +62.5 29.75 -3.947199 +63.0 29.75 -3.652989 +63.5 29.75 -3.353580 +64.0 29.75 -3.003677 +64.5 29.75 -2.549346 +65.0 29.75 -1.774071 +65.5 29.75 -0.583009 +66.0 29.75 0.749446 +66.5 29.75 1.972563 +67.0 29.75 3.105322 +67.5 29.75 4.259817 +68.0 29.75 5.406917 +68.5 29.75 6.571441 +69.0 29.75 7.915543 +69.5 29.75 9.482310 +70.0 29.75 11.015185 +70.5 29.75 12.280083 +71.0 29.75 13.345584 +71.5 29.75 14.306090 +72.0 29.75 15.091963 +72.5 29.75 15.707180 +73.0 29.75 16.340548 +73.5 29.75 17.087616 +74.0 29.75 17.785611 +74.5 29.75 18.314468 +75.0 29.75 18.726067 +75.5 29.75 19.076212 +76.0 29.75 19.329537 +76.5 29.75 19.494131 +77.0 29.75 19.749577 +77.5 29.75 20.167605 +78.0 29.75 20.548304 +78.5 29.75 20.660517 +79.0 29.75 20.572539 +79.5 29.75 20.462370 +80.0 29.75 20.331547 +80.5 29.75 20.250903 +81.0 29.75 20.388689 +81.5 29.75 20.745697 +82.0 29.75 21.065886 +82.5 29.75 21.158107 +83.0 29.75 21.118820 +83.5 29.75 21.037576 +84.0 29.75 20.902977 +84.5 29.75 20.780239 +85.0 29.75 20.897642 +85.5 29.75 21.302157 +86.0 29.75 21.752905 +86.5 29.75 22.016374 +87.0 29.75 22.107825 +87.5 29.75 22.172246 +88.0 29.75 22.208260 +88.5 29.75 22.340245 +89.0 29.75 22.804007 +89.5 29.75 23.591209 +90.0 29.75 24.357884 +90.5 29.75 24.867612 +91.0 29.75 25.124371 +91.5 29.75 25.178841 +92.0 29.75 25.007394 +92.5 29.75 24.696050 +93.0 29.75 24.549638 +93.5 29.75 24.725198 +94.0 29.75 25.027595 +94.5 29.75 25.244473 +95.0 29.75 25.431778 +95.5 29.75 25.637105 +96.0 29.75 25.782747 +96.5 29.75 25.873244 +97.0 29.75 26.124990 +97.5 29.75 26.641344 +98.0 29.75 27.175018 +98.5 29.75 27.532396 +99.0 29.75 27.795420 +99.5 29.75 28.038796 +100.0 29.75 28.188439 +100.5 29.75 28.251221 +101.0 29.75 28.459126 +101.5 29.75 28.965666 +102.0 29.75 29.534609 +102.5 29.75 29.892234 +103.0 29.75 30.029382 +103.5 29.75 30.027543 +104.0 29.75 29.902381 +104.5 29.75 29.788000 +105.0 29.75 29.927192 +105.5 29.75 30.343721 +106.0 29.75 30.753185 +106.5 29.75 30.929695 +107.0 29.75 30.929428 +107.5 29.75 30.786001 +108.0 29.75 30.404909 +108.5 29.75 29.867206 +109.0 29.75 29.456510 +109.5 29.75 29.316584 +110.0 29.75 29.159121 +110.5 29.75 28.730069 +111.0 29.75 28.063617 +111.5 29.75 27.348155 +112.0 29.75 26.645174 +112.5 29.75 26.085284 +113.0 29.75 25.895611 +113.5 29.75 26.129189 +114.0 29.75 26.466723 +114.5 29.75 26.555024 +115.0 29.75 26.410693 +115.5 29.75 26.167026 +116.0 29.75 25.802796 +116.5 29.75 25.389090 +117.0 29.75 25.200524 +117.5 29.75 25.356548 +118.0 29.75 25.671910 +118.5 29.75 25.868952 +119.0 29.75 25.969118 +119.5 29.75 26.070242 +120.0 29.75 26.109163 +120.5 29.75 26.057196 +121.0 29.75 26.066701 +121.5 29.75 26.162338 +122.0 29.75 26.105464 +122.5 29.75 25.737541 +123.0 29.75 25.159567 +123.5 29.75 24.572225 +124.0 29.75 23.966593 +124.5 29.75 23.307520 +125.0 29.75 22.811245 +125.5 29.75 22.613217 +126.0 29.75 22.528732 +126.5 29.75 22.287369 +127.0 29.75 22.012396 +127.5 29.75 21.792138 +128.0 29.75 21.559946 +128.5 29.75 21.353959 +129.0 29.75 21.402067 +129.5 29.75 21.780041 +130.0 29.75 22.138399 +130.5 29.75 22.228691 +131.0 29.75 22.169476 +131.5 29.75 22.103960 +132.0 29.75 21.936611 +132.5 29.75 21.706551 +133.0 29.75 21.699856 +133.5 29.75 22.102545 +134.0 29.75 22.659296 +134.5 29.75 23.053306 +135.0 29.75 23.208868 +135.5 29.75 23.224060 +136.0 29.75 23.045379 +136.5 29.75 22.702870 +137.0 29.75 22.386735 +137.5 29.75 22.168812 +138.0 29.75 21.835563 +138.5 29.75 21.230529 +139.0 29.75 20.522146 +139.5 29.75 19.887977 +140.0 29.75 19.282185 +140.5 29.75 18.686395 +141.0 29.75 18.264833 +141.5 29.75 18.029933 +142.0 29.75 17.689317 +142.5 29.75 17.032006 +143.0 29.75 16.163176 +143.5 29.75 15.201732 +144.0 29.75 14.099068 +144.5 29.75 12.871940 +145.0 29.75 11.870708 +145.5 29.75 11.273956 +146.0 29.75 10.840121 +146.5 29.75 10.276440 +147.0 29.75 9.590726 +147.5 29.75 8.896105 +148.0 29.75 8.102057 +148.5 29.75 7.203017 +149.0 29.75 6.457545 +149.5 29.75 6.025789 +150.0 29.75 5.684498 +150.5 29.75 5.208824 +151.0 29.75 4.666861 +151.5 29.75 4.176977 +152.0 29.75 3.667998 +152.5 29.75 3.222306 +153.0 29.75 3.118140 +153.5 29.75 3.455045 +154.0 29.75 3.938464 +154.5 29.75 4.305049 +155.0 29.75 4.598689 +155.5 29.75 4.914017 +156.0 29.75 5.147383 +156.5 29.75 5.210848 +157.0 29.75 5.319457 +157.5 29.75 5.721179 +158.0 29.75 6.289042 +158.5 29.75 6.753915 +159.0 29.75 7.101315 +159.5 29.75 7.514512 +160.0 29.75 7.995051 +160.5 29.75 8.626191 +161.0 29.75 9.632424 +161.5 29.75 11.059371 +162.0 29.75 12.581990 +162.5 29.75 14.025939 +163.0 29.75 15.307061 +163.5 29.75 14.784018 +164.0 29.75 13.845926 +164.5 29.75 12.949007 +165.0 29.75 12.243884 +165.5 29.75 11.870037 +166.0 29.75 11.618752 +166.5 29.75 11.187318 +167.0 29.75 10.666624 +167.5 29.75 10.157629 +168.0 29.75 9.505454 +168.5 29.75 8.639362 +169.0 29.75 7.753639 +169.5 29.75 7.054834 +170.0 29.75 6.434021 +170.5 29.75 5.717902 +171.0 29.75 5.023457 +171.5 29.75 4.531512 +172.0 29.75 4.086787 +172.5 29.75 3.523900 +173.0 29.75 3.030823 +173.5 29.75 2.785357 +174.0 29.75 2.624824 +174.5 29.75 2.342466 +175.0 29.75 1.919018 +175.5 29.75 1.413627 +176.0 29.75 0.763474 +176.5 29.75 -0.001665 +177.0 29.75 -0.666726 +177.5 29.75 -1.126972 +178.0 29.75 -1.611836 +178.5 29.75 -2.375997 +179.0 29.75 -3.353406 +179.5 29.75 -4.328459 +180.0 29.75 -5.364742 +180.5 29.75 -6.500245 +181.0 29.75 -7.458528 +181.5 29.75 -7.959541 +182.0 29.75 -8.168506 +182.5 29.75 -8.329904 +183.0 29.75 -8.429724 +183.5 29.75 -8.304876 +184.0 29.75 -8.038926 +184.5 29.75 -7.803120 +185.0 29.75 -7.444015 +185.5 29.75 -6.843139 +186.0 29.75 -6.161601 +186.5 29.75 -5.558482 +187.0 29.75 -4.960935 +187.5 29.75 -4.408896 +188.0 29.75 -4.111038 +188.5 29.75 -4.151157 +189.0 29.75 -4.380484 +189.5 29.75 -4.517685 +190.0 29.75 -4.607102 +190.5 29.75 -4.809916 +191.0 29.75 -4.996011 +191.5 29.75 -5.034176 +192.0 29.75 -5.056408 +192.5 29.75 -5.090957 +193.0 29.75 -4.836583 +193.5 29.75 -4.166400 +194.0 29.75 -3.307210 +194.5 29.75 -2.460306 +195.0 29.75 -1.560422 +195.5 29.75 -0.571633 +196.0 29.75 0.302444 +196.5 29.75 0.934005 +197.0 29.75 1.588369 +197.5 29.75 2.477969 +198.0 29.75 3.474833 +198.5 29.75 4.381766 +199.0 29.75 5.248016 +199.5 29.75 6.159911 +200.0 29.75 6.984310 +200.5 29.75 7.688564 +201.0 29.75 8.497460 +201.5 29.75 9.619965 +202.0 29.75 10.840362 +202.5 29.75 11.854802 +203.0 29.75 12.661473 +203.5 29.75 13.330960 +204.0 29.75 13.718204 +204.5 29.75 13.630458 +205.0 29.75 13.242473 +205.5 29.75 12.886481 +206.0 29.75 12.575552 +206.5 29.75 12.145457 +207.0 29.75 11.620819 +207.5 29.75 11.188279 +208.0 29.75 10.876766 +208.5 29.75 10.624738 +209.0 29.75 10.581935 +209.5 29.75 10.835255 +210.0 29.75 11.148553 +210.5 29.75 11.316334 +211.0 29.75 11.440063 +211.5 29.75 11.672607 +212.0 29.75 11.914642 +212.5 29.75 12.022755 +213.0 29.75 12.166733 +213.5 29.75 12.647903 +214.0 29.75 13.312207 +214.5 29.75 13.906333 +215.0 29.75 14.429252 +215.5 29.75 14.982485 +216.0 29.75 15.443956 +216.5 29.75 15.627812 +217.0 29.75 15.704841 +217.5 29.75 15.985822 +218.0 29.75 16.511825 +218.5 29.75 17.063716 +219.0 29.75 17.561632 +219.5 29.75 17.914771 +220.0 29.75 17.919125 +220.5 29.75 17.508000 +221.0 29.75 16.907124 +221.5 29.75 16.538302 +222.0 29.75 16.488219 +222.5 29.75 16.514095 +223.0 29.75 16.523816 +223.5 29.75 16.553053 +224.0 29.75 16.498835 +224.5 29.75 16.327631 +225.0 29.75 16.373447 +225.5 29.75 16.938446 +226.0 29.75 17.838586 +226.5 29.75 18.675127 +227.0 29.75 19.268468 +227.5 29.75 19.644659 +228.0 29.75 19.805118 +228.5 29.75 19.704942 +229.0 29.75 19.529684 +229.5 29.75 19.519966 +230.0 29.75 19.682041 +230.5 29.75 19.864708 +231.0 29.75 20.030678 +231.5 29.75 20.206885 +232.0 29.75 20.283051 +232.5 29.75 20.149591 +233.0 29.75 19.923042 +233.5 29.75 19.795812 +234.0 29.75 19.746535 +234.5 29.75 19.591150 +235.0 29.75 19.330535 +235.5 29.75 19.041607 +236.0 29.75 18.634566 +236.5 29.75 17.973092 +237.0 29.75 17.212572 +237.5 29.75 16.681331 +238.0 29.75 16.440264 +238.5 29.75 16.315153 +239.0 29.75 16.187154 +239.5 29.75 16.011825 +240.0 29.75 15.696150 +240.5 29.75 15.146991 +241.0 29.75 14.557371 +241.5 29.75 14.216135 +242.0 29.75 14.102324 +242.5 29.75 14.012709 +243.0 29.75 13.869747 +243.5 29.75 13.645749 +244.0 29.75 13.220844 +244.5 29.75 12.575077 +245.0 29.75 11.997078 +245.5 29.75 11.828702 +246.0 29.75 12.000289 +246.5 29.75 12.260590 +247.0 29.75 12.597835 +247.5 29.75 13.010096 +248.0 29.75 13.263029 +248.5 29.75 13.219663 +249.0 29.75 13.145248 +249.5 29.75 13.420322 +250.0 29.75 13.961098 +250.5 29.75 14.448325 +251.0 29.75 14.741364 +251.5 29.75 14.812654 +252.0 29.75 14.539382 +252.5 29.75 13.857008 +253.0 29.75 13.048558 +253.5 29.75 12.475888 +254.0 29.75 12.119495 +254.5 29.75 11.668980 +255.0 29.75 11.118933 +255.5 29.75 10.582425 +256.0 29.75 10.004651 +256.5 29.75 9.360641 +257.0 29.75 8.819049 +257.5 29.75 8.658776 +258.0 29.75 8.788481 +258.5 29.75 8.866686 +259.0 29.75 8.715360 +259.5 29.75 8.370174 +260.0 29.75 7.776660 +260.5 29.75 6.943374 +261.0 29.75 6.114140 +261.5 29.75 5.573918 +262.0 29.75 5.289483 +262.5 29.75 5.031423 +263.0 29.75 4.814830 +263.5 29.75 4.661154 +264.0 29.75 4.389699 +264.5 29.75 3.860414 +265.0 29.75 3.261647 +265.5 29.75 2.823723 +266.0 29.75 2.563471 +266.5 29.75 2.324115 +267.0 29.75 2.129034 +267.5 29.75 2.070629 +268.0 29.75 2.081482 +268.5 29.75 2.005750 +269.0 29.75 1.998352 +269.5 29.75 2.267568 +270.0 29.75 2.814848 +270.5 29.75 3.399838 +271.0 29.75 3.886271 +271.5 29.75 4.283742 +272.0 29.75 4.563247 +272.5 29.75 4.771396 +273.0 29.75 5.197096 +273.5 29.75 6.061492 +274.0 29.75 7.174463 +274.5 29.75 8.211927 +275.0 29.75 9.100229 +275.5 29.75 9.949310 +276.0 29.75 10.704994 +276.5 29.75 11.276419 +277.0 29.75 11.896805 +277.5 29.75 12.905994 +278.0 29.75 14.264678 +278.5 29.75 15.662046 +279.0 29.75 17.001316 +279.5 29.75 18.410982 +280.0 29.75 19.781714 +30.0 30.75 -25.535772 +30.5 30.75 -26.996528 +31.0 30.75 -27.892275 +31.5 30.75 -28.334873 +32.0 30.75 -28.540599 +32.5 30.75 -28.605124 +33.0 30.75 -28.442164 +33.5 30.75 -28.104394 +34.0 30.75 -27.806323 +34.5 30.75 -27.714838 +35.0 30.75 -27.873502 +35.5 30.75 -28.171688 +36.0 30.75 -28.513956 +36.5 30.75 -28.787895 +37.0 30.75 -28.912106 +37.5 30.75 -28.898631 +38.0 30.75 -28.978212 +38.5 30.75 -29.296440 +39.0 30.75 -29.706898 +39.5 30.75 -30.102711 +40.0 30.75 -30.463424 +40.5 30.75 -30.784599 +41.0 30.75 -30.920926 +41.5 30.75 -30.790763 +42.0 30.75 -30.465798 +42.5 30.75 -30.131324 +43.0 30.75 -29.830630 +43.5 30.75 -29.556936 +44.0 30.75 -29.413980 +44.5 30.75 -29.370656 +45.0 30.75 -29.211872 +45.5 30.75 -28.862975 +46.0 30.75 -28.570239 +46.5 30.75 -28.506904 +47.0 30.75 -28.580895 +47.5 30.75 -28.620010 +48.0 30.75 -28.599825 +48.5 30.75 -28.521018 +49.0 30.75 -28.256436 +49.5 30.75 -27.709355 +50.0 30.75 -27.056747 +50.5 30.75 -26.414367 +51.0 30.75 -25.716311 +51.5 30.75 -24.918265 +52.0 30.75 -24.091289 +52.5 30.75 -23.240827 +53.0 30.75 -22.225645 +53.5 30.75 -20.976115 +54.0 30.75 -19.674300 +54.5 30.75 -18.471300 +55.0 30.75 -17.292495 +55.5 30.75 -16.083749 +56.0 30.75 -14.909115 +56.5 30.75 -13.756734 +57.0 30.75 -12.429229 +57.5 30.75 -10.948449 +58.0 30.75 -9.588706 +58.5 30.75 -8.566750 +59.0 30.75 -7.858921 +59.5 30.75 -7.331756 +60.0 30.75 -6.987364 +60.5 30.75 -6.765802 +61.0 30.75 -6.431178 +61.5 30.75 -5.873302 +62.0 30.75 -5.355514 +62.5 30.75 -5.085612 +63.0 30.75 -4.996427 +63.5 30.75 -4.901117 +64.0 30.75 -4.765615 +64.5 30.75 -4.502317 +65.0 30.75 -3.801172 +65.5 30.75 -2.610141 +66.0 30.75 -1.255695 +66.5 30.75 -0.013767 +67.0 30.75 1.092130 +67.5 30.75 2.121307 +68.0 30.75 3.072174 +68.5 30.75 3.990342 +69.0 30.75 5.068873 +69.5 30.75 6.382648 +70.0 30.75 7.702842 +70.5 30.75 8.778657 +71.0 30.75 9.627538 +71.5 30.75 10.344797 +72.0 30.75 10.903746 +72.5 30.75 11.353181 +73.0 30.75 11.865281 +73.5 30.75 12.537998 +74.0 30.75 13.173122 +74.5 30.75 13.609692 +75.0 30.75 13.902624 +75.5 30.75 14.157865 +76.0 30.75 14.345998 +76.5 30.75 14.504297 +77.0 30.75 14.784461 +77.5 30.75 15.264855 +78.0 30.75 15.733625 +78.5 30.75 16.010924 +79.0 30.75 16.160093 +79.5 30.75 16.268377 +80.0 30.75 16.301189 +80.5 30.75 16.328767 +81.0 30.75 16.484263 +81.5 30.75 16.835724 +82.0 30.75 17.159940 +82.5 30.75 17.252698 +83.0 30.75 17.128955 +83.5 30.75 16.917485 +84.0 30.75 16.591870 +84.5 30.75 16.266380 +85.0 30.75 16.278053 +85.5 30.75 16.695929 +86.0 30.75 17.218142 +86.5 30.75 17.584428 +87.0 30.75 17.842211 +87.5 30.75 18.099057 +88.0 30.75 18.381973 +88.5 30.75 18.803318 +89.0 30.75 19.525789 +89.5 30.75 20.500324 +90.0 30.75 21.401982 +90.5 30.75 21.959029 +91.0 30.75 22.215310 +91.5 30.75 22.243781 +92.0 30.75 22.002566 +92.5 30.75 21.632664 +93.0 30.75 21.455763 +93.5 30.75 21.612074 +94.0 30.75 21.884011 +94.5 30.75 22.064851 +95.0 30.75 22.163088 +95.5 30.75 22.282133 +96.0 30.75 22.393772 +96.5 30.75 22.528198 +97.0 30.75 22.882220 +97.5 30.75 23.431693 +98.0 30.75 23.927754 +98.5 30.75 24.271240 +99.0 30.75 24.571792 +99.5 30.75 24.905549 +100.0 30.75 25.167038 +100.5 30.75 25.356824 +101.0 30.75 25.743002 +101.5 30.75 26.426568 +102.0 30.75 27.164317 +102.5 30.75 27.648543 +103.0 30.75 27.844071 +103.5 30.75 27.845049 +104.0 30.75 27.660525 +104.5 30.75 27.457437 +105.0 30.75 27.503530 +105.5 30.75 27.821075 +106.0 30.75 28.139449 +106.5 30.75 28.233092 +107.0 30.75 28.085701 +107.5 30.75 27.766236 +108.0 30.75 27.185259 +108.5 30.75 26.435452 +109.0 30.75 25.805683 +109.5 30.75 25.449691 +110.0 30.75 25.147090 +110.5 30.75 24.634036 +111.0 30.75 23.943982 +111.5 30.75 23.315922 +112.0 30.75 22.761046 +112.5 30.75 22.333089 +113.0 30.75 22.242205 +113.5 30.75 22.491980 +114.0 30.75 22.746845 +114.5 30.75 22.725750 +115.0 30.75 22.535031 +115.5 30.75 22.271626 +116.0 30.75 21.914505 +116.5 30.75 21.488829 +117.0 30.75 21.248168 +117.5 30.75 21.394142 +118.0 30.75 21.693746 +118.5 30.75 21.920151 +119.0 30.75 22.076169 +119.5 30.75 22.245691 +120.0 30.75 22.336888 +120.5 30.75 22.356914 +121.0 30.75 22.471655 +121.5 30.75 22.634275 +122.0 30.75 22.654136 +122.5 30.75 22.374286 +123.0 30.75 21.915215 +123.5 30.75 21.444920 +124.0 30.75 20.914364 +124.5 30.75 20.347977 +125.0 30.75 19.959572 +125.5 30.75 19.892433 +126.0 30.75 19.916141 +126.5 30.75 19.798320 +127.0 30.75 19.554738 +127.5 30.75 19.310457 +128.0 30.75 19.076092 +128.5 30.75 18.887294 +129.0 30.75 18.943080 +129.5 30.75 19.320624 +130.0 30.75 19.678194 +130.5 30.75 19.744764 +131.0 30.75 19.659461 +131.5 30.75 19.548347 +132.0 30.75 19.324389 +132.5 30.75 18.998430 +133.0 30.75 18.864116 +133.5 30.75 19.121441 +134.0 30.75 19.539616 +134.5 30.75 19.791785 +135.0 30.75 19.860599 +135.5 30.75 19.821848 +136.0 30.75 19.578834 +136.5 30.75 19.169269 +137.0 30.75 18.796054 +137.5 30.75 18.623198 +138.0 30.75 18.426061 +138.5 30.75 18.033569 +139.0 30.75 17.571921 +139.5 30.75 17.229971 +140.0 30.75 16.922020 +140.5 30.75 16.641548 +141.0 30.75 16.539241 +141.5 30.75 16.634070 +142.0 30.75 16.620641 +142.5 30.75 16.257310 +143.0 30.75 15.510934 +143.5 30.75 14.515939 +144.0 30.75 13.284573 +144.5 30.75 11.951181 +145.0 30.75 10.835808 +145.5 30.75 10.151248 +146.0 30.75 9.662068 +146.5 30.75 9.133897 +147.0 30.75 8.552589 +147.5 30.75 8.018226 +148.0 30.75 7.401992 +148.5 30.75 6.708559 +149.0 30.75 6.174119 +149.5 30.75 5.914036 +150.0 30.75 5.705669 +150.5 30.75 5.325347 +151.0 30.75 4.822420 +151.5 30.75 4.337799 +152.0 30.75 3.891022 +152.5 30.75 3.509179 +153.0 30.75 3.422090 +153.5 30.75 3.732200 +154.0 30.75 4.151532 +154.5 30.75 4.427264 +155.0 30.75 4.682126 +155.5 30.75 5.037049 +156.0 30.75 5.324112 +156.5 30.75 5.420459 +157.0 30.75 5.509624 +157.5 30.75 5.845375 +158.0 30.75 6.341620 +158.5 30.75 6.791498 +159.0 30.75 7.201478 +159.5 30.75 7.655247 +160.0 30.75 8.157378 +160.5 30.75 8.719691 +161.0 30.75 9.615137 +161.5 30.75 10.917089 +162.0 30.75 12.378273 +162.5 30.75 13.777219 +163.0 30.75 15.030594 +163.5 30.75 14.520120 +164.0 30.75 13.601789 +164.5 30.75 12.735916 +165.0 30.75 12.146231 +165.5 30.75 11.974130 +166.0 30.75 11.955059 +166.5 30.75 11.764595 +167.0 30.75 11.359565 +167.5 30.75 10.807194 +168.0 30.75 10.015329 +168.5 30.75 9.003875 +169.0 30.75 7.992081 +169.5 30.75 7.187178 +170.0 30.75 6.442095 +170.5 30.75 5.615044 +171.0 30.75 4.870149 +171.5 30.75 4.371131 +172.0 30.75 3.972117 +172.5 30.75 3.524813 +173.0 30.75 3.211971 +173.5 30.75 3.197041 +174.0 30.75 3.255960 +174.5 30.75 3.118155 +175.0 30.75 2.719422 +175.5 30.75 2.212940 +176.0 30.75 1.536261 +176.5 30.75 0.687546 +177.0 30.75 -0.060555 +177.5 30.75 -0.529432 +178.0 30.75 -0.999853 +178.5 30.75 -1.713171 +179.0 30.75 -2.605065 +179.5 30.75 -3.521548 +180.0 30.75 -4.547577 +180.5 30.75 -5.725821 +181.0 30.75 -6.760141 +181.5 30.75 -7.334709 +182.0 30.75 -7.576512 +182.5 30.75 -7.740108 +183.0 30.75 -7.807697 +183.5 30.75 -7.701094 +184.0 30.75 -7.532810 +184.5 30.75 -7.374703 +185.0 30.75 -7.097990 +185.5 30.75 -6.552577 +186.0 30.75 -5.877730 +186.5 30.75 -5.289120 +187.0 30.75 -4.779158 +187.5 30.75 -4.315941 +188.0 30.75 -4.035342 +188.5 30.75 -4.090221 +189.0 30.75 -4.316075 +189.5 30.75 -4.489486 +190.0 30.75 -4.601782 +190.5 30.75 -4.777588 +191.0 30.75 -4.967445 +191.5 30.75 -5.063436 +192.0 30.75 -5.157432 +192.5 30.75 -5.287176 +193.0 30.75 -5.181356 +193.5 30.75 -4.646065 +194.0 30.75 -3.867667 +194.5 30.75 -3.072044 +195.0 30.75 -2.226462 +195.5 30.75 -1.293374 +196.0 30.75 -0.403735 +196.5 30.75 0.310276 +197.0 30.75 1.048383 +197.5 30.75 1.990350 +198.0 30.75 3.009090 +198.5 30.75 3.879051 +199.0 30.75 4.651635 +199.5 30.75 5.489932 +200.0 30.75 6.268265 +200.5 30.75 6.946476 +201.0 30.75 7.777984 +201.5 30.75 8.951850 +202.0 30.75 10.234826 +202.5 30.75 11.276712 +203.0 30.75 12.071414 +203.5 30.75 12.740316 +204.0 30.75 13.126906 +204.5 30.75 13.077817 +205.0 30.75 12.773815 +205.5 30.75 12.506720 +206.0 30.75 12.283810 +206.5 30.75 11.944847 +207.0 30.75 11.517236 +207.5 30.75 11.151568 +208.0 30.75 10.877173 +208.5 30.75 10.684392 +209.0 30.75 10.699404 +209.5 30.75 10.972676 +210.0 30.75 11.259770 +210.5 30.75 11.329953 +211.0 30.75 11.315964 +211.5 30.75 11.413484 +212.0 30.75 11.560906 +212.5 30.75 11.556818 +213.0 30.75 11.562264 +213.5 30.75 11.860066 +214.0 30.75 12.359835 +214.5 30.75 12.774150 +215.0 30.75 13.114545 +215.5 30.75 13.468740 +216.0 30.75 13.692685 +216.5 30.75 13.683930 +217.0 30.75 13.655207 +217.5 30.75 13.911509 +218.0 30.75 14.418730 +218.5 30.75 14.908935 +219.0 30.75 15.270598 +219.5 30.75 15.458608 +220.0 30.75 15.306072 +220.5 30.75 14.683157 +221.0 30.75 13.874811 +221.5 30.75 13.295179 +222.0 30.75 13.085433 +222.5 30.75 13.059412 +223.0 30.75 13.108633 +223.5 30.75 13.262797 +224.0 30.75 13.377585 +224.5 30.75 13.374468 +225.0 30.75 13.549950 +225.5 30.75 14.199192 +226.0 30.75 15.208564 +226.5 30.75 16.174870 +227.0 30.75 16.929243 +227.5 30.75 17.441455 +228.0 30.75 17.653848 +228.5 30.75 17.623107 +229.0 30.75 17.569931 +229.5 30.75 17.716913 +230.0 30.75 17.984602 +230.5 30.75 18.182786 +231.0 30.75 18.222386 +231.5 30.75 18.163122 +232.0 30.75 17.968880 +232.5 30.75 17.539993 +233.0 30.75 17.024571 +233.5 30.75 16.646494 +234.0 30.75 16.341570 +234.5 30.75 15.967150 +235.0 30.75 15.525158 +235.5 30.75 15.099595 +236.0 30.75 14.589448 +236.5 30.75 13.895297 +237.0 30.75 13.149521 +237.5 30.75 12.696665 +238.0 30.75 12.579828 +238.5 30.75 12.603910 +239.0 30.75 12.623947 +239.5 30.75 12.604232 +240.0 30.75 12.429489 +240.5 30.75 12.034548 +241.0 30.75 11.608714 +241.5 30.75 11.391363 +242.0 30.75 11.378075 +242.5 30.75 11.335257 +243.0 30.75 11.132548 +243.5 30.75 10.789219 +244.0 30.75 10.272339 +244.5 30.75 9.583655 +245.0 30.75 9.022585 +245.5 30.75 8.871378 +246.0 30.75 9.059658 +246.5 30.75 9.348573 +247.0 30.75 9.728510 +247.5 30.75 10.229071 +248.0 30.75 10.633623 +248.5 30.75 10.872601 +249.0 30.75 11.185248 +249.5 30.75 11.853353 +250.0 30.75 12.757346 +250.5 30.75 13.550561 +251.0 30.75 14.074086 +251.5 30.75 14.295976 +252.0 30.75 14.127224 +252.5 30.75 13.496185 +253.0 30.75 12.644405 +253.5 30.75 11.924555 +254.0 30.75 11.338457 +254.5 30.75 10.646052 +255.0 30.75 9.879142 +255.5 30.75 9.185410 +256.0 30.75 8.510010 +256.5 30.75 7.739457 +257.0 30.75 7.052863 +257.5 30.75 6.721519 +258.0 30.75 6.642697 +258.5 30.75 6.478149 +259.0 30.75 6.095701 +259.5 30.75 5.515721 +260.0 30.75 4.664962 +260.5 30.75 3.549282 +261.0 30.75 2.413379 +261.5 30.75 1.569025 +262.0 30.75 0.992636 +262.5 30.75 0.511002 +263.0 30.75 0.076217 +263.5 30.75 -0.270231 +264.0 30.75 -0.688386 +264.5 30.75 -1.308035 +265.0 30.75 -1.993610 +265.5 30.75 -2.473752 +266.0 30.75 -2.721423 +266.5 30.75 -2.982831 +267.0 30.75 -3.274288 +267.5 30.75 -3.480481 +268.0 30.75 -3.604998 +268.5 30.75 -3.728136 +269.0 30.75 -3.716740 +269.5 30.75 -3.338545 +270.0 30.75 -2.580001 +270.5 30.75 -1.691786 +271.0 30.75 -0.878329 +271.5 30.75 -0.198997 +272.0 30.75 0.313657 +272.5 30.75 0.714319 +273.0 30.75 1.271023 +273.5 30.75 2.184558 +274.0 30.75 3.336389 +274.5 30.75 4.558697 +275.0 30.75 5.750534 +275.5 30.75 6.877901 +276.0 30.75 7.851635 +276.5 30.75 8.587834 +277.0 30.75 9.287677 +277.5 30.75 10.271920 +278.0 30.75 11.504102 +278.5 30.75 12.710481 +279.0 30.75 13.795904 +279.5 30.75 14.832073 +280.0 30.75 15.812269 +30.0 31.75 -17.172545 +30.5 31.75 -18.660508 +31.0 31.75 -19.619074 +31.5 31.75 -20.155326 +32.0 31.75 -20.448017 +32.5 31.75 -20.513039 +33.0 31.75 -20.330145 +33.5 31.75 -19.978947 +34.0 31.75 -19.668956 +34.5 31.75 -19.636476 +35.0 31.75 -19.908771 +35.5 31.75 -20.354525 +36.0 31.75 -20.848124 +36.5 31.75 -21.225359 +37.0 31.75 -21.484464 +37.5 31.75 -21.642173 +38.0 31.75 -21.878079 +38.5 31.75 -22.353447 +39.0 31.75 -22.941093 +39.5 31.75 -23.494567 +40.0 31.75 -23.967871 +40.5 31.75 -24.325632 +41.0 31.75 -24.460658 +41.5 31.75 -24.342340 +42.0 31.75 -24.095871 +42.5 31.75 -23.889977 +43.0 31.75 -23.731821 +43.5 31.75 -23.607957 +44.0 31.75 -23.604847 +44.5 31.75 -23.750214 +45.0 31.75 -23.828434 +45.5 31.75 -23.709203 +46.0 31.75 -23.530655 +46.5 31.75 -23.517209 +47.0 31.75 -23.627509 +47.5 31.75 -23.679821 +48.0 31.75 -23.674900 +48.5 31.75 -23.622993 +49.0 31.75 -23.325876 +49.5 31.75 -22.718986 +50.0 31.75 -22.014070 +50.5 31.75 -21.372037 +51.0 31.75 -20.720018 +51.5 31.75 -20.000433 +52.0 31.75 -19.301633 +52.5 31.75 -18.576072 +53.0 31.75 -17.565596 +53.5 31.75 -16.208571 +54.0 31.75 -14.770960 +54.5 31.75 -13.404739 +55.0 31.75 -12.050125 +55.5 31.75 -10.627423 +56.0 31.75 -9.243199 +56.5 31.75 -7.971499 +57.0 31.75 -6.663448 +57.5 31.75 -5.271744 +58.0 31.75 -4.089004 +58.5 31.75 -3.319554 +59.0 31.75 -2.863227 +59.5 31.75 -2.600589 +60.0 31.75 -2.559600 +60.5 31.75 -2.691832 +61.0 31.75 -2.755002 +61.5 31.75 -2.530351 +62.0 31.75 -2.279025 +62.5 31.75 -2.196870 +63.0 31.75 -2.242885 +63.5 31.75 -2.317109 +64.0 31.75 -2.416784 +64.5 31.75 -2.285168 +65.0 31.75 -1.656816 +65.5 31.75 -0.548536 +66.0 31.75 0.720301 +66.5 31.75 1.878631 +67.0 31.75 2.919487 +67.5 31.75 3.881456 +68.0 31.75 4.714667 +68.5 31.75 5.496891 +69.0 31.75 6.396684 +69.5 31.75 7.457614 +70.0 31.75 8.498340 +70.5 31.75 9.282989 +71.0 31.75 9.769392 +71.5 31.75 10.047613 +72.0 31.75 10.153829 +72.5 31.75 10.182217 +73.0 31.75 10.327352 +73.5 31.75 10.738941 +74.0 31.75 11.225803 +74.5 31.75 11.513570 +75.0 31.75 11.619592 +75.5 31.75 11.677297 +76.0 31.75 11.647535 +76.5 31.75 11.600836 +77.0 31.75 11.747534 +77.5 31.75 12.167488 +78.0 31.75 12.598978 +78.5 31.75 12.842512 +79.0 31.75 12.961541 +79.5 31.75 13.046309 +80.0 31.75 13.057446 +80.5 31.75 13.064131 +81.0 31.75 13.242369 +81.5 31.75 13.620322 +82.0 31.75 13.942249 +82.5 31.75 14.030958 +83.0 31.75 13.902381 +83.5 31.75 13.670015 +84.0 31.75 13.326668 +84.5 31.75 12.995586 +85.0 31.75 12.968999 +85.5 31.75 13.334948 +86.0 31.75 13.841009 +86.5 31.75 14.241792 +87.0 31.75 14.533050 +87.5 31.75 14.818663 +88.0 31.75 15.141168 +88.5 31.75 15.571306 +89.0 31.75 16.313594 +89.5 31.75 17.388391 +90.0 31.75 18.441306 +90.5 31.75 19.153586 +91.0 31.75 19.498469 +91.5 31.75 19.558405 +92.0 31.75 19.293855 +92.5 31.75 18.902659 +93.0 31.75 18.804645 +93.5 31.75 19.100192 +94.0 31.75 19.526018 +94.5 31.75 19.746494 +95.0 31.75 19.772559 +95.5 31.75 19.731290 +96.0 31.75 19.713496 +96.5 31.75 19.766227 +97.0 31.75 20.064113 +97.5 31.75 20.586026 +98.0 31.75 21.091296 +98.5 31.75 21.414090 +99.0 31.75 21.631421 +99.5 31.75 21.831184 +100.0 31.75 21.975060 +100.5 31.75 22.110888 +101.0 31.75 22.566092 +101.5 31.75 23.346770 +102.0 31.75 24.119469 +102.5 31.75 24.564212 +103.0 31.75 24.732287 +103.5 31.75 24.738066 +104.0 31.75 24.506842 +104.5 31.75 24.125324 +105.0 31.75 23.910063 +105.5 31.75 23.970197 +106.0 31.75 24.100861 +106.5 31.75 24.045075 +107.0 31.75 23.741979 +107.5 31.75 23.250547 +108.0 31.75 22.538252 +108.5 31.75 21.720536 +109.0 31.75 21.106627 +109.5 31.75 20.806415 +110.0 31.75 20.576491 +110.5 31.75 20.163089 +111.0 31.75 19.584899 +111.5 31.75 19.045367 +112.0 31.75 18.596538 +112.5 31.75 18.272724 +113.0 31.75 18.269664 +113.5 31.75 18.571921 +114.0 31.75 18.861344 +114.5 31.75 18.866959 +115.0 31.75 18.666148 +115.5 31.75 18.380543 +116.0 31.75 17.989968 +116.5 31.75 17.553486 +117.0 31.75 17.345931 +117.5 31.75 17.582494 +118.0 31.75 17.972008 +118.5 31.75 18.220346 +119.0 31.75 18.328508 +119.5 31.75 18.348353 +120.0 31.75 18.313281 +120.5 31.75 18.330890 +121.0 31.75 18.544583 +121.5 31.75 18.943014 +122.0 31.75 19.231329 +122.5 31.75 19.181260 +123.0 31.75 18.886894 +123.5 31.75 18.495849 +124.0 31.75 17.992430 +124.5 31.75 17.451497 +125.0 31.75 17.119466 +125.5 31.75 17.107544 +126.0 31.75 17.135774 +126.5 31.75 16.979927 +127.0 31.75 16.650689 +127.5 31.75 16.261584 +128.0 31.75 15.816131 +128.5 31.75 15.412121 +129.0 31.75 15.368322 +129.5 31.75 15.743993 +130.0 31.75 16.150930 +130.5 31.75 16.277491 +131.0 31.75 16.191602 +131.5 31.75 16.017771 +132.0 31.75 15.738964 +132.5 31.75 15.350498 +133.0 31.75 15.147576 +133.5 31.75 15.327135 +134.0 31.75 15.678125 +134.5 31.75 15.894647 +135.0 31.75 15.919723 +135.5 31.75 15.815552 +136.0 31.75 15.453902 +136.5 31.75 14.898548 +137.0 31.75 14.452532 +137.5 31.75 14.291837 +138.0 31.75 14.226601 +138.5 31.75 14.037234 +139.0 31.75 13.763091 +139.5 31.75 13.563884 +140.0 31.75 13.363729 +140.5 31.75 13.150513 +141.0 31.75 13.087465 +141.5 31.75 13.296002 +142.0 31.75 13.461237 +142.5 31.75 13.217797 +143.0 31.75 12.506592 +143.5 31.75 11.479158 +144.0 31.75 10.184496 +144.5 31.75 8.814689 +145.0 31.75 7.671381 +145.5 31.75 7.007029 +146.0 31.75 6.540888 +146.5 31.75 6.022870 +147.0 31.75 5.491830 +147.5 31.75 5.011004 +148.0 31.75 4.496638 +148.5 31.75 3.957732 +149.0 31.75 3.574895 +149.5 31.75 3.462894 +150.0 31.75 3.394889 +150.5 31.75 3.084938 +151.0 31.75 2.639077 +151.5 31.75 2.210603 +152.0 31.75 1.802895 +152.5 31.75 1.458634 +153.0 31.75 1.360337 +153.5 31.75 1.590273 +154.0 31.75 1.919567 +154.5 31.75 2.123307 +155.0 31.75 2.301345 +155.5 31.75 2.580108 +156.0 31.75 2.873652 +156.5 31.75 3.050599 +157.0 31.75 3.229743 +157.5 31.75 3.556966 +158.0 31.75 3.901545 +158.5 31.75 4.121967 +159.0 31.75 4.219433 +159.5 31.75 4.365600 +160.0 31.75 4.583126 +160.5 31.75 4.891249 +161.0 31.75 5.524151 +161.5 31.75 6.514048 +162.0 31.75 7.684355 +162.5 31.75 8.836762 +163.0 31.75 9.892811 +163.5 31.75 9.310741 +164.0 31.75 8.489428 +164.5 31.75 7.765257 +165.0 31.75 7.324198 +165.5 31.75 7.370196 +166.0 31.75 7.602773 +166.5 31.75 7.648243 +167.0 31.75 7.425230 +167.5 31.75 6.991957 +168.0 31.75 6.288394 +168.5 31.75 5.324919 +169.0 31.75 4.404329 +169.5 31.75 3.712645 +170.0 31.75 3.076829 +170.5 31.75 2.336622 +171.0 31.75 1.607145 +171.5 31.75 1.099116 +172.0 31.75 0.703264 +172.5 31.75 0.302024 +173.0 31.75 0.067586 +173.5 31.75 0.123068 +174.0 31.75 0.238060 +174.5 31.75 0.080789 +175.0 31.75 -0.335444 +175.5 31.75 -0.888413 +176.0 31.75 -1.672704 +176.5 31.75 -2.653623 +177.0 31.75 -3.501142 +177.5 31.75 -4.034342 +178.0 31.75 -4.449888 +178.5 31.75 -4.996030 +179.0 31.75 -5.651214 +179.5 31.75 -6.376068 +180.0 31.75 -7.284830 +180.5 31.75 -8.403571 +181.0 31.75 -9.372746 +181.5 31.75 -9.844380 +182.0 31.75 -9.943076 +182.5 31.75 -9.959824 +183.0 31.75 -9.874167 +183.5 31.75 -9.633120 +184.0 31.75 -9.398479 +184.5 31.75 -9.262925 +185.0 31.75 -9.072702 +185.5 31.75 -8.660874 +186.0 31.75 -8.176277 +186.5 31.75 -7.788298 +187.0 31.75 -7.456887 +187.5 31.75 -7.109031 +188.0 31.75 -6.928749 +188.5 31.75 -7.073224 +189.0 31.75 -7.343284 +189.5 31.75 -7.511117 +190.0 31.75 -7.576765 +190.5 31.75 -7.663342 +191.0 31.75 -7.751614 +191.5 31.75 -7.796022 +192.0 31.75 -7.901308 +192.5 31.75 -8.150662 +193.0 31.75 -8.288778 +193.5 31.75 -8.019909 +194.0 31.75 -7.479467 +194.5 31.75 -6.824120 +195.0 31.75 -6.098972 +195.5 31.75 -5.306069 +196.0 31.75 -4.583403 +196.5 31.75 -3.971529 +197.0 31.75 -3.214717 +197.5 31.75 -2.148304 +198.0 31.75 -1.002190 +198.5 31.75 -0.023978 +199.0 31.75 0.850538 +199.5 31.75 1.719883 +200.0 31.75 2.478215 +200.5 31.75 3.095811 +201.0 31.75 3.805843 +201.5 31.75 4.820549 +202.0 31.75 5.989849 +202.5 31.75 7.012668 +203.0 31.75 7.831422 +203.5 31.75 8.516889 +204.0 31.75 8.941953 +204.5 31.75 9.012429 +205.0 31.75 8.914345 +205.5 31.75 8.869422 +206.0 31.75 8.842469 +206.5 31.75 8.640077 +207.0 31.75 8.364106 +207.5 31.75 8.184369 +208.0 31.75 8.054084 +208.5 31.75 7.924256 +209.0 31.75 7.919680 +209.5 31.75 8.126643 +210.0 31.75 8.394508 +210.5 31.75 8.444023 +211.0 31.75 8.379220 +211.5 31.75 8.338196 +212.0 31.75 8.291175 +212.5 31.75 8.157848 +213.0 31.75 8.089515 +213.5 31.75 8.293943 +214.0 31.75 8.674165 +214.5 31.75 9.004904 +215.0 31.75 9.246944 +215.5 31.75 9.417673 +216.0 31.75 9.422398 +216.5 31.75 9.170331 +217.0 31.75 8.940081 +217.5 31.75 9.067252 +218.0 31.75 9.500578 +218.5 31.75 9.892868 +219.0 31.75 10.140442 +219.5 31.75 10.183972 +220.0 31.75 9.843126 +220.5 31.75 9.057915 +221.0 31.75 8.170888 +221.5 31.75 7.636345 +222.0 31.75 7.519611 +222.5 31.75 7.646466 +223.0 31.75 7.948497 +223.5 31.75 8.422595 +224.0 31.75 8.910562 +224.5 31.75 9.291715 +225.0 31.75 9.675331 +225.5 31.75 10.302645 +226.0 31.75 11.156167 +226.5 31.75 11.985896 +227.0 31.75 12.664695 +227.5 31.75 13.181607 +228.0 31.75 13.474295 +228.5 31.75 13.553832 +229.0 31.75 13.600583 +229.5 31.75 13.879207 +230.0 31.75 14.293686 +230.5 31.75 14.572728 +231.0 31.75 14.629391 +231.5 31.75 14.523276 +232.0 31.75 14.217816 +232.5 31.75 13.705198 +233.0 31.75 13.187709 +233.5 31.75 12.878430 +234.0 31.75 12.660038 +234.5 31.75 12.319999 +235.0 31.75 11.860480 +235.5 31.75 11.432526 +236.0 31.75 10.994467 +236.5 31.75 10.441996 +237.0 31.75 9.913527 +237.5 31.75 9.672555 +238.0 31.75 9.721435 +238.5 31.75 9.851434 +239.0 31.75 9.954218 +239.5 31.75 10.044522 +240.0 31.75 10.051710 +240.5 31.75 9.923354 +241.0 31.75 9.752833 +241.5 31.75 9.725212 +242.0 31.75 9.804242 +242.5 31.75 9.741334 +243.0 31.75 9.430001 +243.5 31.75 8.978738 +244.0 31.75 8.376924 +244.5 31.75 7.646860 +245.0 31.75 7.069083 +245.5 31.75 6.931602 +246.0 31.75 7.212345 +246.5 31.75 7.630288 +247.0 31.75 8.082399 +247.5 31.75 8.679590 +248.0 31.75 9.329426 +248.5 31.75 9.866329 +249.0 31.75 10.431714 +249.5 31.75 11.284313 +250.0 31.75 12.287389 +250.5 31.75 13.119597 +251.0 31.75 13.679915 +251.5 31.75 14.016191 +252.0 31.75 13.969832 +252.5 31.75 13.431630 +253.0 31.75 12.636468 +253.5 31.75 11.895646 +254.0 31.75 11.184185 +254.5 31.75 10.339231 +255.0 31.75 9.435932 +255.5 31.75 8.623698 +256.0 31.75 7.808643 +256.5 31.75 6.893243 +257.0 31.75 6.023891 +257.5 31.75 5.451917 +258.0 31.75 5.140573 +258.5 31.75 4.834103 +259.0 31.75 4.399934 +259.5 31.75 3.824558 +260.0 31.75 2.985389 +260.5 31.75 1.821105 +261.0 31.75 0.596964 +261.5 31.75 -0.368733 +262.0 31.75 -1.081375 +262.5 31.75 -1.720825 +263.0 31.75 -2.285016 +263.5 31.75 -2.738299 +264.0 31.75 -3.218959 +264.5 31.75 -3.833605 +265.0 31.75 -4.439952 +265.5 31.75 -4.808970 +266.0 31.75 -4.984869 +266.5 31.75 -5.180839 +267.0 31.75 -5.358431 +267.5 31.75 -5.382572 +268.0 31.75 -5.322037 +268.5 31.75 -5.292603 +269.0 31.75 -5.185529 +269.5 31.75 -4.698194 +270.0 31.75 -3.808759 +270.5 31.75 -2.746486 +271.0 31.75 -1.734061 +271.5 31.75 -0.826924 +272.0 31.75 -0.113772 +272.5 31.75 0.380157 +273.0 31.75 0.938416 +273.5 31.75 1.833007 +274.0 31.75 3.030077 +274.5 31.75 4.358502 +275.0 31.75 5.670508 +275.5 31.75 6.898222 +276.0 31.75 7.859974 +276.5 31.75 8.482216 +277.0 31.75 9.015224 +277.5 31.75 9.724832 +278.0 31.75 10.718407 +278.5 31.75 11.751263 +279.0 31.75 12.640062 +279.5 31.75 13.467066 +280.0 31.75 14.268449 +30.0 32.75 -9.281240 +30.5 32.75 -10.837251 +31.0 32.75 -11.886271 +31.5 32.75 -12.521289 +32.0 32.75 -12.847707 +32.5 32.75 -12.880475 +33.0 32.75 -12.647412 +33.5 32.75 -12.247505 +34.0 32.75 -11.893059 +34.5 32.75 -11.760082 +35.0 32.75 -11.928967 +35.5 32.75 -12.318228 +36.0 32.75 -12.833223 +36.5 32.75 -13.388302 +37.0 32.75 -13.810820 +37.5 32.75 -14.098042 +38.0 32.75 -14.416433 +38.5 32.75 -14.932432 +39.0 32.75 -15.573686 +39.5 32.75 -16.232594 +40.0 32.75 -16.826990 +40.5 32.75 -17.300094 +41.0 32.75 -17.512601 +41.5 32.75 -17.448007 +42.0 32.75 -17.335657 +42.5 32.75 -17.351283 +43.0 32.75 -17.457324 +43.5 32.75 -17.616832 +44.0 32.75 -17.862226 +44.5 32.75 -18.126374 +45.0 32.75 -18.230224 +45.5 32.75 -18.115400 +46.0 32.75 -17.940102 +46.5 32.75 -17.844517 +47.0 32.75 -17.803223 +47.5 32.75 -17.720121 +48.0 32.75 -17.576689 +48.5 32.75 -17.368540 +49.0 32.75 -16.975003 +49.5 32.75 -16.317252 +50.0 32.75 -15.569814 +50.5 32.75 -14.927703 +51.0 32.75 -14.360081 +51.5 32.75 -13.837415 +52.0 32.75 -13.407021 +52.5 32.75 -12.931935 +53.0 32.75 -12.147105 +53.5 32.75 -10.975879 +54.0 32.75 -9.702855 +54.5 32.75 -8.514945 +55.0 32.75 -7.360523 +55.5 32.75 -6.145510 +56.0 32.75 -4.982467 +56.5 32.75 -3.929609 +57.0 32.75 -2.790384 +57.5 32.75 -1.489705 +58.0 32.75 -0.358388 +58.5 32.75 0.326415 +59.0 32.75 0.632362 +59.5 32.75 0.731049 +60.0 32.75 0.582652 +60.5 32.75 0.231311 +61.0 32.75 -0.046694 +61.5 32.75 -0.005887 +62.0 32.75 0.200365 +62.5 32.75 0.258717 +63.0 32.75 0.139668 +63.5 32.75 -0.042279 +64.0 32.75 -0.238025 +64.5 32.75 -0.243455 +65.0 32.75 0.224931 +65.5 32.75 1.159913 +66.0 32.75 2.245985 +66.5 32.75 3.242595 +67.0 32.75 4.102999 +67.5 32.75 4.906190 +68.0 32.75 5.597934 +68.5 32.75 6.179299 +69.0 32.75 6.823075 +69.5 32.75 7.649236 +70.0 32.75 8.492513 +70.5 32.75 9.107316 +71.0 32.75 9.401841 +71.5 32.75 9.422625 +72.0 32.75 9.174017 +72.5 32.75 8.837996 +73.0 32.75 8.728312 +73.5 32.75 8.971181 +74.0 32.75 9.371406 +74.5 32.75 9.639833 +75.0 32.75 9.716607 +75.5 32.75 9.706846 +76.0 32.75 9.599520 +76.5 32.75 9.473350 +77.0 32.75 9.527004 +77.5 32.75 9.813021 +78.0 32.75 10.049350 +78.5 32.75 10.088073 +79.0 32.75 9.995547 +79.5 32.75 9.850676 +80.0 32.75 9.613345 +80.5 32.75 9.392680 +81.0 32.75 9.425887 +81.5 32.75 9.774100 +82.0 32.75 10.228841 +82.5 32.75 10.516487 +83.0 32.75 10.570144 +83.5 32.75 10.412343 +84.0 32.75 10.057077 +84.5 32.75 9.665698 +85.0 32.75 9.536748 +85.5 32.75 9.797967 +86.0 32.75 10.241843 +86.5 32.75 10.618367 +87.0 32.75 10.908043 +87.5 32.75 11.164390 +88.0 32.75 11.395337 +88.5 32.75 11.719659 +89.0 32.75 12.390443 +89.5 32.75 13.438991 +90.0 32.75 14.516900 +90.5 32.75 15.283771 +91.0 32.75 15.713947 +91.5 32.75 15.886498 +92.0 32.75 15.786789 +92.5 32.75 15.583178 +93.0 32.75 15.629416 +93.5 32.75 16.046140 +94.0 32.75 16.615873 +94.5 32.75 16.974499 +95.0 32.75 17.064575 +95.5 32.75 17.010711 +96.0 32.75 16.836742 +96.5 32.75 16.621960 +97.0 32.75 16.643696 +97.5 32.75 16.963386 +98.0 32.75 17.340572 +98.5 32.75 17.592034 +99.0 32.75 17.745121 +99.5 32.75 17.888682 +100.0 32.75 17.965442 +100.5 32.75 18.027858 +101.0 32.75 18.337471 +101.5 32.75 18.957537 +102.0 32.75 19.564715 +102.5 32.75 19.891011 +103.0 32.75 19.939362 +103.5 32.75 19.802473 +104.0 32.75 19.437602 +104.5 32.75 18.941194 +105.0 32.75 18.627185 +105.5 32.75 18.598757 +106.0 32.75 18.558660 +106.5 32.75 18.235875 +107.0 32.75 17.686071 +107.5 32.75 17.054086 +108.0 32.75 16.319006 +108.5 32.75 15.554812 +109.0 32.75 15.047635 +109.5 32.75 14.925280 +110.0 32.75 14.922248 +110.5 32.75 14.749462 +111.0 32.75 14.362186 +111.5 32.75 13.949167 +112.0 32.75 13.547115 +112.5 32.75 13.282335 +113.0 32.75 13.342594 +113.5 32.75 13.764791 +114.0 32.75 14.219592 +114.5 32.75 14.419973 +115.0 32.75 14.364415 +115.5 32.75 14.146243 +116.0 32.75 13.775867 +116.5 32.75 13.376435 +117.0 32.75 13.291399 +117.5 32.75 13.656716 +118.0 32.75 14.153777 +118.5 32.75 14.461929 +119.0 32.75 14.562991 +119.5 32.75 14.575681 +120.0 32.75 14.536313 +120.5 32.75 14.500474 +121.0 32.75 14.695498 +121.5 32.75 15.168956 +122.0 32.75 15.613319 +122.5 32.75 15.711961 +123.0 32.75 15.476406 +123.5 32.75 15.125542 +124.0 32.75 14.703010 +124.5 32.75 14.298474 +125.0 32.75 14.071366 +125.5 32.75 14.083549 +126.0 32.75 14.067084 +126.5 32.75 13.772547 +127.0 32.75 13.290282 +127.5 32.75 12.762032 +128.0 32.75 12.245906 +128.5 32.75 11.831879 +129.0 32.75 11.773322 +129.5 32.75 12.127623 +130.0 32.75 12.560998 +130.5 32.75 12.727692 +131.0 32.75 12.676840 +131.5 32.75 12.557203 +132.0 32.75 12.371482 +132.5 32.75 12.174233 +133.0 32.75 12.210222 +133.5 32.75 12.594269 +134.0 32.75 13.081338 +134.5 32.75 13.303022 +135.0 32.75 13.231010 +135.5 32.75 12.968955 +136.0 32.75 12.493132 +136.5 32.75 11.846107 +137.0 32.75 11.314665 +137.5 32.75 11.092515 +138.0 32.75 11.026530 +138.5 32.75 10.936485 +139.0 32.75 10.806647 +139.5 32.75 10.705836 +140.0 32.75 10.549360 +140.5 32.75 10.347435 +141.0 32.75 10.304396 +141.5 32.75 10.523726 +142.0 32.75 10.686981 +142.5 32.75 10.457849 +143.0 32.75 9.741641 +143.5 32.75 8.661154 +144.0 32.75 7.293491 +144.5 32.75 5.838606 +145.0 32.75 4.699740 +145.5 32.75 4.089708 +146.0 32.75 3.693846 +146.5 32.75 3.257210 +147.0 32.75 2.809834 +147.5 32.75 2.436656 +148.0 32.75 2.010631 +148.5 32.75 1.544374 +149.0 32.75 1.230870 +149.5 32.75 1.173293 +150.0 32.75 1.220909 +150.5 32.75 1.087509 +151.0 32.75 0.817142 +151.5 32.75 0.569913 +152.0 32.75 0.306209 +152.5 32.75 0.029895 +153.0 32.75 -0.021588 +153.5 32.75 0.307535 +154.0 32.75 0.783836 +154.5 32.75 1.118613 +155.0 32.75 1.360221 +155.5 32.75 1.668030 +156.0 32.75 1.920810 +156.5 32.75 2.046398 +157.0 32.75 2.234249 +157.5 32.75 2.594531 +158.0 32.75 2.898727 +158.5 32.75 2.946021 +159.0 32.75 2.796570 +159.5 32.75 2.661988 +160.0 32.75 2.569864 +160.5 32.75 2.548187 +161.0 32.75 2.824713 +161.5 32.75 3.474249 +162.0 32.75 4.294808 +162.5 32.75 5.082443 +163.0 32.75 5.812625 +163.5 32.75 5.149484 +164.0 32.75 4.465276 +164.5 32.75 3.914052 +165.0 32.75 3.647060 +165.5 32.75 3.819308 +166.0 32.75 4.183932 +166.5 32.75 4.360754 +167.0 32.75 4.285347 +167.5 32.75 4.001446 +168.0 32.75 3.425308 +168.5 32.75 2.575329 +169.0 32.75 1.709015 +169.5 32.75 1.069077 +170.0 32.75 0.514927 +170.5 32.75 -0.141458 +171.0 32.75 -0.836229 +171.5 32.75 -1.384994 +172.0 32.75 -1.833454 +172.5 32.75 -2.278258 +173.0 32.75 -2.570348 +173.5 32.75 -2.635786 +174.0 32.75 -2.674097 +174.5 32.75 -2.885785 +175.0 32.75 -3.258535 +175.5 32.75 -3.770354 +176.0 32.75 -4.553645 +176.5 32.75 -5.626259 +177.0 32.75 -6.592428 +177.5 32.75 -7.219918 +178.0 32.75 -7.611183 +178.5 32.75 -7.993011 +179.0 32.75 -8.419262 +179.5 32.75 -8.905628 +180.0 32.75 -9.591654 +180.5 32.75 -10.496733 +181.0 32.75 -11.243307 +181.5 32.75 -11.526329 +182.0 32.75 -11.484583 +182.5 32.75 -11.374478 +183.0 32.75 -11.208251 +183.5 32.75 -10.904644 +184.0 32.75 -10.627618 +184.5 32.75 -10.552344 +185.0 32.75 -10.552012 +185.5 32.75 -10.414159 +186.0 32.75 -10.199224 +186.5 32.75 -10.036154 +187.0 32.75 -9.901727 +187.5 32.75 -9.708335 +188.0 32.75 -9.642012 +188.5 32.75 -9.837532 +189.0 32.75 -10.074632 +189.5 32.75 -10.099977 +190.0 32.75 -10.008177 +190.5 32.75 -10.011775 +191.0 32.75 -10.088030 +191.5 32.75 -10.132850 +192.0 32.75 -10.272524 +192.5 32.75 -10.604222 +193.0 32.75 -10.907135 +193.5 32.75 -10.876987 +194.0 32.75 -10.538588 +194.5 32.75 -10.110511 +195.0 32.75 -9.649162 +195.5 32.75 -9.136453 +196.0 32.75 -8.631876 +196.5 32.75 -8.141586 +197.0 32.75 -7.446461 +197.5 32.75 -6.387016 +198.0 32.75 -5.164780 +198.5 32.75 -4.079179 +199.0 32.75 -3.139267 +199.5 32.75 -2.254699 +200.0 32.75 -1.555875 +200.5 32.75 -1.078431 +201.0 32.75 -0.534602 +201.5 32.75 0.377350 +202.0 32.75 1.516376 +202.5 32.75 2.557024 +203.0 32.75 3.433735 +203.5 32.75 4.177616 +204.0 32.75 4.643945 +204.5 32.75 4.701008 +205.0 32.75 4.611569 +205.5 32.75 4.667631 +206.0 32.75 4.810244 +206.5 32.75 4.853775 +207.0 32.75 4.808461 +207.5 32.75 4.796861 +208.0 32.75 4.781284 +208.5 32.75 4.747381 +209.0 32.75 4.857561 +209.5 32.75 5.230333 +210.0 32.75 5.657273 +210.5 32.75 5.823679 +211.0 32.75 5.775447 +211.5 32.75 5.728305 +212.0 32.75 5.657652 +212.5 32.75 5.506448 +213.0 32.75 5.404101 +213.5 32.75 5.541313 +214.0 32.75 5.819781 +214.5 32.75 5.943935 +215.0 32.75 5.902434 +215.5 32.75 5.782455 +216.0 32.75 5.475868 +216.5 32.75 4.922874 +217.0 32.75 4.431905 +217.5 32.75 4.319114 +218.0 32.75 4.498863 +218.5 32.75 4.641767 +219.0 32.75 4.603537 +219.5 32.75 4.365521 +220.0 32.75 3.830267 +220.5 32.75 2.951086 +221.0 32.75 2.051961 +221.5 32.75 1.552073 +222.0 32.75 1.498582 +222.5 32.75 1.722474 +223.0 32.75 2.161530 +223.5 32.75 2.820914 +224.0 32.75 3.438916 +224.5 32.75 3.849000 +225.0 32.75 4.180100 +225.5 32.75 4.720741 +226.0 32.75 5.461934 +226.5 32.75 6.147595 +227.0 32.75 6.647224 +227.5 32.75 6.974037 +228.0 32.75 7.120402 +228.5 32.75 7.136824 +229.0 32.75 7.240099 +229.5 32.75 7.601368 +230.0 32.75 8.117374 +230.5 32.75 8.530415 +231.0 32.75 8.751402 +231.5 32.75 8.826252 +232.0 32.75 8.694797 +232.5 32.75 8.355581 +233.0 32.75 7.987097 +233.5 32.75 7.831808 +234.0 32.75 7.799549 +234.5 32.75 7.636146 +235.0 32.75 7.354019 +235.5 32.75 7.069322 +236.0 32.75 6.732685 +236.5 32.75 6.302263 +237.0 32.75 5.939443 +237.5 32.75 5.907966 +238.0 32.75 6.172606 +238.5 32.75 6.495046 +239.0 32.75 6.722875 +239.5 32.75 6.859646 +240.0 32.75 6.839996 +240.5 32.75 6.660662 +241.0 32.75 6.502554 +241.5 32.75 6.594720 +242.0 32.75 6.761886 +242.5 32.75 6.719746 +243.0 32.75 6.393022 +243.5 32.75 5.891121 +244.0 32.75 5.229897 +244.5 32.75 4.459136 +245.0 32.75 3.875975 +245.5 32.75 3.795371 +246.0 32.75 4.170291 +246.5 32.75 4.677350 +247.0 32.75 5.163449 +247.5 32.75 5.727123 +248.0 32.75 6.326100 +248.5 32.75 6.864716 +249.0 32.75 7.509204 +249.5 32.75 8.424148 +250.0 32.75 9.408691 +250.5 32.75 10.195466 +251.0 32.75 10.716976 +251.5 32.75 11.011052 +252.0 32.75 10.908793 +252.5 32.75 10.327364 +253.0 32.75 9.526000 +253.5 32.75 8.827640 +254.0 32.75 8.232292 +254.5 32.75 7.594088 +255.0 32.75 6.938156 +255.5 32.75 6.327610 +256.0 32.75 5.589359 +256.5 32.75 4.616363 +257.0 32.75 3.616542 +257.5 32.75 2.929468 +258.0 32.75 2.558436 +258.5 32.75 2.247236 +259.0 32.75 1.842286 +259.5 32.75 1.300111 +260.0 32.75 0.503848 +260.5 32.75 -0.600018 +261.0 32.75 -1.746726 +261.5 32.75 -2.627407 +262.0 32.75 -3.286930 +262.5 32.75 -3.914832 +263.0 32.75 -4.507444 +263.5 32.75 -5.012056 +264.0 32.75 -5.521817 +264.5 32.75 -6.143074 +265.0 32.75 -6.800557 +265.5 32.75 -7.233709 +266.0 32.75 -7.402054 +266.5 32.75 -7.481935 +267.0 32.75 -7.504821 +267.5 32.75 -7.388834 +268.0 32.75 -7.204348 +268.5 32.75 -7.044847 +269.0 32.75 -6.803951 +269.5 32.75 -6.211880 +270.0 32.75 -5.215062 +270.5 32.75 -4.001838 +271.0 32.75 -2.750411 +271.5 32.75 -1.587779 +272.0 32.75 -0.639707 +272.5 32.75 0.044795 +273.0 32.75 0.685760 +273.5 32.75 1.589121 +274.0 32.75 2.777673 +274.5 32.75 3.999146 +275.0 32.75 5.166471 +275.5 32.75 6.209536 +276.0 32.75 6.910949 +276.5 32.75 7.270814 +277.0 32.75 7.503481 +277.5 32.75 7.924115 +278.0 32.75 8.651016 +278.5 32.75 9.537339 +279.0 32.75 10.424738 +279.5 32.75 11.288628 +280.0 32.75 12.121726 +30.0 33.75 -4.353111 +30.5 33.75 -5.973796 +31.0 33.75 -7.109031 +31.5 33.75 -7.802592 +32.0 33.75 -8.149917 +32.5 33.75 -8.198379 +33.0 33.75 -7.944794 +33.5 33.75 -7.501848 +34.0 33.75 -7.070282 +34.5 33.75 -6.886934 +35.0 33.75 -7.009127 +35.5 33.75 -7.401288 +36.0 33.75 -7.985524 +36.5 33.75 -8.618788 +37.0 33.75 -9.130199 +37.5 33.75 -9.466174 +38.0 33.75 -9.813008 +38.5 33.75 -10.296486 +39.0 33.75 -10.854274 +39.5 33.75 -11.434467 +40.0 33.75 -11.981032 +40.5 33.75 -12.410044 +41.0 33.75 -12.557982 +41.5 33.75 -12.499758 +42.0 33.75 -12.471291 +42.5 33.75 -12.659202 +43.0 33.75 -13.037397 +43.5 33.75 -13.472024 +44.0 33.75 -13.925990 +44.5 33.75 -14.354875 +45.0 33.75 -14.591287 +45.5 33.75 -14.560020 +46.0 33.75 -14.369446 +46.5 33.75 -14.164413 +47.0 33.75 -13.952422 +47.5 33.75 -13.671961 +48.0 33.75 -13.371070 +48.5 33.75 -13.002613 +49.0 33.75 -12.377609 +49.5 33.75 -11.470256 +50.0 33.75 -10.573376 +50.5 33.75 -9.921885 +51.0 33.75 -9.509537 +51.5 33.75 -9.250324 +52.0 33.75 -9.123856 +52.5 33.75 -9.008847 +53.0 33.75 -8.612089 +53.5 33.75 -7.866585 +54.0 33.75 -6.992587 +54.5 33.75 -6.163183 +55.0 33.75 -5.344488 +55.5 33.75 -4.506751 +56.0 33.75 -3.714235 +56.5 33.75 -2.925420 +57.0 33.75 -1.926380 +57.5 33.75 -0.694289 +58.0 33.75 0.440496 +58.5 33.75 1.168717 +59.0 33.75 1.455496 +59.5 33.75 1.448468 +60.0 33.75 1.152861 +60.5 33.75 0.663459 +61.0 33.75 0.283932 +61.5 33.75 0.296807 +62.0 33.75 0.528463 +62.5 33.75 0.635860 +63.0 33.75 0.558462 +63.5 33.75 0.352074 +64.0 33.75 0.172133 +64.5 33.75 0.208025 +65.0 33.75 0.697146 +65.5 33.75 1.637934 +66.0 33.75 2.705833 +66.5 33.75 3.589554 +67.0 33.75 4.309740 +67.5 33.75 4.958905 +68.0 33.75 5.514655 +68.5 33.75 6.011505 +69.0 33.75 6.623010 +69.5 33.75 7.410280 +70.0 33.75 8.203689 +70.5 33.75 8.756356 +71.0 33.75 8.966137 +71.5 33.75 8.875913 +72.0 33.75 8.510265 +72.5 33.75 8.041922 +73.0 33.75 7.796888 +73.5 33.75 7.946942 +74.0 33.75 8.267332 +74.5 33.75 8.458922 +75.0 33.75 8.453091 +75.5 33.75 8.304228 +76.0 33.75 7.970399 +76.5 33.75 7.572759 +77.0 33.75 7.414895 +77.5 33.75 7.563981 +78.0 33.75 7.694594 +78.5 33.75 7.528008 +79.0 33.75 7.102155 +79.5 33.75 6.604837 +80.0 33.75 6.092593 +80.5 33.75 5.608026 +81.0 33.75 5.420848 +81.5 33.75 5.654192 +82.0 33.75 6.148129 +82.5 33.75 6.592841 +83.0 33.75 6.789538 +83.5 33.75 6.747136 +84.0 33.75 6.506962 +84.5 33.75 6.213320 +85.0 33.75 6.161177 +85.5 33.75 6.479066 +86.0 33.75 6.952984 +86.5 33.75 7.305558 +87.0 33.75 7.502230 +87.5 33.75 7.561283 +88.0 33.75 7.508367 +88.5 33.75 7.591055 +89.0 33.75 8.108324 +89.5 33.75 9.144821 +90.0 33.75 10.342328 +90.5 33.75 11.302584 +91.0 33.75 11.906069 +91.5 33.75 12.190391 +92.0 33.75 12.217254 +92.5 33.75 12.162868 +93.0 33.75 12.335753 +93.5 33.75 12.888949 +94.0 33.75 13.564517 +94.5 33.75 14.069313 +95.0 33.75 14.320717 +95.5 33.75 14.362588 +96.0 33.75 14.195200 +96.5 33.75 13.887614 +97.0 33.75 13.663421 +97.5 33.75 13.715988 +98.0 33.75 13.901035 +98.5 33.75 14.007516 +99.0 33.75 14.045877 +99.5 33.75 14.028104 +100.0 33.75 13.904072 +100.5 33.75 13.702241 +101.0 33.75 13.675221 +101.5 33.75 13.975653 +102.0 33.75 14.306170 +102.5 33.75 14.480417 +103.0 33.75 14.473835 +103.5 33.75 14.333246 +104.0 33.75 14.000138 +104.5 33.75 13.500387 +105.0 33.75 13.121922 +105.5 33.75 13.012734 +106.0 33.75 12.901045 +106.5 33.75 12.557156 +107.0 33.75 12.023727 +107.5 33.75 11.422467 +108.0 33.75 10.792434 +108.5 33.75 10.194733 +109.0 33.75 9.896234 +109.5 33.75 10.014549 +110.0 33.75 10.233489 +110.5 33.75 10.223460 +111.0 33.75 9.946271 +111.5 33.75 9.589390 +112.0 33.75 9.183106 +112.5 33.75 8.835994 +113.0 33.75 8.841152 +113.5 33.75 9.296627 +114.0 33.75 9.926058 +114.5 33.75 10.368678 +115.0 33.75 10.493914 +115.5 33.75 10.399109 +116.0 33.75 10.154432 +116.5 33.75 9.915814 +117.0 33.75 9.944370 +117.5 33.75 10.368837 +118.0 33.75 10.857431 +118.5 33.75 11.028406 +119.0 33.75 10.925410 +119.5 33.75 10.707253 +120.0 33.75 10.449874 +120.5 33.75 10.285988 +121.0 33.75 10.441529 +121.5 33.75 10.902737 +122.0 33.75 11.319262 +122.5 33.75 11.384443 +123.0 33.75 11.148895 +123.5 33.75 10.827613 +124.0 33.75 10.471036 +124.5 33.75 10.118597 +125.0 33.75 9.936113 +125.5 33.75 9.978927 +126.0 33.75 9.948130 +126.5 33.75 9.601418 +127.0 33.75 9.059392 +127.5 33.75 8.525710 +128.0 33.75 8.066797 +128.5 33.75 7.747640 +129.0 33.75 7.777190 +129.5 33.75 8.168224 +130.0 33.75 8.620377 +130.5 33.75 8.814674 +131.0 33.75 8.812596 +131.5 33.75 8.777868 +132.0 33.75 8.735590 +132.5 33.75 8.750408 +133.0 33.75 9.016942 +133.5 33.75 9.573248 +134.0 33.75 10.127012 +134.5 33.75 10.349871 +135.0 33.75 10.220701 +135.5 33.75 9.845296 +136.0 33.75 9.241769 +136.5 33.75 8.513411 +137.0 33.75 7.912177 +137.5 33.75 7.588254 +138.0 33.75 7.431954 +138.5 33.75 7.254799 +139.0 33.75 7.092072 +139.5 33.75 6.998902 +140.0 33.75 6.822847 +140.5 33.75 6.571567 +141.0 33.75 6.452628 +141.5 33.75 6.639747 +142.0 33.75 6.800036 +142.5 33.75 6.544945 +143.0 33.75 5.791693 +143.5 33.75 4.652403 +144.0 33.75 3.210664 +144.5 33.75 1.692878 +145.0 33.75 0.503989 +145.5 33.75 -0.192610 +146.0 33.75 -0.598637 +146.5 33.75 -0.990775 +147.0 33.75 -1.404831 +147.5 33.75 -1.761321 +148.0 33.75 -2.150010 +148.5 33.75 -2.577285 +149.0 33.75 -2.848189 +149.5 33.75 -2.774017 +150.0 33.75 -2.564249 +150.5 33.75 -2.507690 +151.0 33.75 -2.612065 +151.5 33.75 -2.772977 +152.0 33.75 -2.978079 +152.5 33.75 -3.183896 +153.0 33.75 -3.125451 +153.5 33.75 -2.644824 +154.0 33.75 -1.942265 +154.5 33.75 -1.348155 +155.0 33.75 -0.884065 +155.5 33.75 -0.458717 +156.0 33.75 -0.144444 +156.5 33.75 0.050278 +157.0 33.75 0.324714 +157.5 33.75 0.788681 +158.0 33.75 1.212685 +158.5 33.75 1.329654 +159.0 33.75 1.169929 +159.5 33.75 0.914733 +160.0 33.75 0.620414 +160.5 33.75 0.352122 +161.0 33.75 0.332185 +161.5 33.75 0.729919 +162.0 33.75 1.327854 +162.5 33.75 1.895639 +163.0 33.75 2.430197 +163.5 33.75 1.698094 +164.0 33.75 1.153150 +164.5 33.75 0.752512 +165.0 33.75 0.616158 +165.5 33.75 0.842974 +166.0 33.75 1.260304 +166.5 33.75 1.560542 +167.0 33.75 1.676198 +167.5 33.75 1.617666 +168.0 33.75 1.256258 +168.5 33.75 0.550341 +169.0 33.75 -0.185234 +169.5 33.75 -0.723432 +170.0 33.75 -1.243064 +170.5 33.75 -1.915705 +171.0 33.75 -2.649650 +171.5 33.75 -3.217862 +172.0 33.75 -3.615871 +172.5 33.75 -4.003383 +173.0 33.75 -4.274268 +173.5 33.75 -4.324468 +174.0 33.75 -4.309086 +174.5 33.75 -4.446794 +175.0 33.75 -4.762822 +175.5 33.75 -5.235233 +176.0 33.75 -6.002782 +176.5 33.75 -7.065166 +177.0 33.75 -8.055359 +177.5 33.75 -8.633544 +178.0 33.75 -8.906463 +178.5 33.75 -9.117603 +179.0 33.75 -9.356007 +179.5 33.75 -9.615839 +180.0 33.75 -10.063986 +180.5 33.75 -10.732163 +181.0 33.75 -11.283892 +181.5 33.75 -11.427300 +182.0 33.75 -11.295972 +182.5 33.75 -11.155865 +183.0 33.75 -10.965499 +183.5 33.75 -10.680088 +184.0 33.75 -10.485126 +184.5 33.75 -10.525966 +185.0 33.75 -10.665280 +185.5 33.75 -10.697222 +186.0 33.75 -10.631218 +186.5 33.75 -10.602653 +187.0 33.75 -10.533408 +187.5 33.75 -10.376266 +188.0 33.75 -10.321811 +188.5 33.75 -10.455557 +189.0 33.75 -10.537684 +189.5 33.75 -10.352097 +190.0 33.75 -9.983199 +190.5 33.75 -9.667385 +191.0 33.75 -9.465607 +191.5 33.75 -9.342471 +192.0 33.75 -9.460555 +192.5 33.75 -9.988966 +193.0 33.75 -10.611327 +193.5 33.75 -10.904625 +194.0 33.75 -10.886836 +194.5 33.75 -10.694310 +195.0 33.75 -10.378639 +195.5 33.75 -9.952700 +196.0 33.75 -9.547634 +196.5 33.75 -9.181692 +197.0 33.75 -8.605846 +197.5 33.75 -7.630097 +198.0 33.75 -6.458163 +198.5 33.75 -5.395634 +199.0 33.75 -4.485598 +199.5 33.75 -3.667902 +200.0 33.75 -3.095088 +200.5 33.75 -2.811045 +201.0 33.75 -2.498984 +201.5 33.75 -1.773361 +202.0 33.75 -0.735753 +202.5 33.75 0.306951 +203.0 33.75 1.228962 +203.5 33.75 2.012380 +204.0 33.75 2.495355 +204.5 33.75 2.566458 +205.0 33.75 2.507933 +205.5 33.75 2.638979 +206.0 33.75 2.920805 +206.5 33.75 3.137527 +207.0 33.75 3.319964 +207.5 33.75 3.510300 +208.0 33.75 3.617257 +208.5 33.75 3.672147 +209.0 33.75 3.884275 +209.5 33.75 4.451046 +210.0 33.75 5.119161 +210.5 33.75 5.569743 +211.0 33.75 5.791045 +211.5 33.75 5.886261 +212.0 33.75 5.840183 +212.5 33.75 5.649537 +213.0 33.75 5.547927 +213.5 33.75 5.692957 +214.0 33.75 5.901726 +214.5 33.75 5.929655 +215.0 33.75 5.798173 +215.5 33.75 5.567568 +216.0 33.75 5.196120 +216.5 33.75 4.628492 +217.0 33.75 4.106136 +217.5 33.75 3.943019 +218.0 33.75 4.022754 +218.5 33.75 4.026683 +219.0 33.75 3.799444 +219.5 33.75 3.321408 +220.0 33.75 2.523440 +220.5 33.75 1.445820 +221.0 33.75 0.441789 +221.5 33.75 -0.076838 +222.0 33.75 -0.063339 +222.5 33.75 0.272664 +223.0 33.75 0.797675 +223.5 33.75 1.411056 +224.0 33.75 1.903060 +224.5 33.75 2.127013 +225.0 33.75 2.295632 +225.5 33.75 2.641100 +226.0 33.75 3.168213 +226.5 33.75 3.627103 +227.0 33.75 3.947977 +227.5 33.75 4.142764 +228.0 33.75 4.221672 +228.5 33.75 4.271102 +229.0 33.75 4.500694 +229.5 33.75 5.062387 +230.0 33.75 5.846278 +230.5 33.75 6.581339 +231.0 33.75 7.166189 +231.5 33.75 7.565924 +232.0 33.75 7.657869 +232.5 33.75 7.396846 +233.0 33.75 7.071982 +233.5 33.75 6.988315 +234.0 33.75 7.109816 +234.5 33.75 7.189780 +235.0 33.75 7.128721 +235.5 33.75 7.016567 +236.0 33.75 6.790071 +236.5 33.75 6.398342 +237.0 33.75 6.047074 +237.5 33.75 6.033181 +238.0 33.75 6.339601 +238.5 33.75 6.709578 +239.0 33.75 6.956904 +239.5 33.75 7.043979 +240.0 33.75 6.878021 +240.5 33.75 6.458469 +241.0 33.75 6.057099 +241.5 33.75 5.943027 +242.0 33.75 5.971509 +242.5 33.75 5.766675 +243.0 33.75 5.274104 +243.5 33.75 4.628711 +244.0 33.75 3.857252 +244.5 33.75 2.976330 +245.0 33.75 2.308703 +245.5 33.75 2.176951 +246.0 33.75 2.519301 +246.5 33.75 3.003549 +247.0 33.75 3.482543 +247.5 33.75 3.977286 +248.0 33.75 4.482904 +248.5 33.75 4.919806 +249.0 33.75 5.437549 +249.5 33.75 6.259104 +250.0 33.75 7.204840 +250.5 33.75 7.910137 +251.0 33.75 8.255762 +251.5 33.75 8.304925 +252.0 33.75 7.970066 +252.5 33.75 7.217307 +253.0 33.75 6.310911 +253.5 33.75 5.595515 +254.0 33.75 5.138089 +254.5 33.75 4.764554 +255.0 33.75 4.385351 +255.5 33.75 3.980024 +256.0 33.75 3.417570 +256.5 33.75 2.599416 +257.0 33.75 1.760606 +257.5 33.75 1.231174 +258.0 33.75 1.048598 +258.5 33.75 0.938391 +259.0 33.75 0.705474 +259.5 33.75 0.263291 +260.0 33.75 -0.541025 +260.5 33.75 -1.720409 +261.0 33.75 -2.979106 +261.5 33.75 -3.896232 +262.0 33.75 -4.483318 +262.5 33.75 -5.009535 +263.0 33.75 -5.579735 +263.5 33.75 -6.136840 +264.0 33.75 -6.758219 +264.5 33.75 -7.490859 +265.0 33.75 -8.168553 +265.5 33.75 -8.568505 +266.0 33.75 -8.684531 +266.5 33.75 -8.693372 +267.0 33.75 -8.665215 +267.5 33.75 -8.547987 +268.0 33.75 -8.449483 +268.5 33.75 -8.418431 +269.0 33.75 -8.294520 +269.5 33.75 -7.779597 +270.0 33.75 -6.812577 +270.5 33.75 -5.644125 +271.0 33.75 -4.445493 +271.5 33.75 -3.305861 +272.0 33.75 -2.370723 +272.5 33.75 -1.749414 +273.0 33.75 -1.205740 +273.5 33.75 -0.432804 +274.0 33.75 0.560286 +274.5 33.75 1.550872 +275.0 33.75 2.384613 +275.5 33.75 3.005068 +276.0 33.75 3.331645 +276.5 33.75 3.286130 +277.0 33.75 3.161158 +277.5 33.75 3.242453 +278.0 33.75 3.690924 +278.5 33.75 4.378601 +279.0 33.75 5.180382 +279.5 33.75 6.086120 +280.0 33.75 6.986472 +30.0 34.75 -4.452459 +30.5 34.75 -5.956787 +31.0 34.75 -6.995436 +31.5 34.75 -7.678594 +32.0 34.75 -8.141236 +32.5 34.75 -8.396647 +33.0 34.75 -8.377666 +33.5 34.75 -8.100860 +34.0 34.75 -7.786876 +34.5 34.75 -7.725675 +35.0 34.75 -8.004938 +35.5 34.75 -8.549931 +36.0 34.75 -9.253957 +36.5 34.75 -9.962717 +37.0 34.75 -10.501084 +37.5 34.75 -10.795670 +38.0 34.75 -10.978961 +38.5 34.75 -11.202848 +39.0 34.75 -11.462422 +39.5 34.75 -11.754140 +40.0 34.75 -12.103863 +40.5 34.75 -12.468568 +41.0 34.75 -12.706175 +41.5 34.75 -12.743588 +42.0 34.75 -12.788284 +42.5 34.75 -13.037405 +43.0 34.75 -13.472087 +43.5 34.75 -13.980496 +44.0 34.75 -14.574430 +44.5 34.75 -15.197954 +45.0 34.75 -15.644385 +45.5 34.75 -15.748448 +46.0 34.75 -15.611446 +46.5 34.75 -15.396565 +47.0 34.75 -15.092101 +47.5 34.75 -14.655530 +48.0 34.75 -14.137786 +48.5 34.75 -13.516626 +49.0 34.75 -12.670601 +49.5 34.75 -11.600393 +50.0 34.75 -10.597552 +50.5 34.75 -9.873787 +51.0 34.75 -9.487481 +51.5 34.75 -9.362721 +52.0 34.75 -9.429824 +52.5 34.75 -9.548169 +53.0 34.75 -9.447768 +53.5 34.75 -8.996754 +54.0 34.75 -8.392012 +54.5 34.75 -7.828097 +55.0 34.75 -7.290210 +55.5 34.75 -6.656322 +56.0 34.75 -5.985614 +56.5 34.75 -5.302257 +57.0 34.75 -4.405494 +57.5 34.75 -3.224243 +58.0 34.75 -2.072633 +58.5 34.75 -1.276476 +59.0 34.75 -0.864126 +59.5 34.75 -0.742901 +60.0 34.75 -0.929514 +60.5 34.75 -1.307987 +61.0 34.75 -1.509960 +61.5 34.75 -1.295386 +62.0 34.75 -0.855464 +62.5 34.75 -0.533562 +63.0 34.75 -0.413489 +63.5 34.75 -0.380210 +64.0 34.75 -0.318984 +64.5 34.75 -0.102515 +65.0 34.75 0.496414 +65.5 34.75 1.539855 +66.0 34.75 2.724275 +66.5 34.75 3.761192 +67.0 34.75 4.606810 +67.5 34.75 5.333194 +68.0 34.75 5.873630 +68.5 34.75 6.267048 +69.0 34.75 6.739739 +69.5 34.75 7.415666 +70.0 34.75 8.107453 +70.5 34.75 8.556037 +71.0 34.75 8.691174 +71.5 34.75 8.535368 +72.0 34.75 8.102588 +72.5 34.75 7.629387 +73.0 34.75 7.480098 +73.5 34.75 7.758954 +74.0 34.75 8.163524 +74.5 34.75 8.369770 +75.0 34.75 8.288030 +75.5 34.75 7.923988 +76.0 34.75 7.336014 +76.5 34.75 6.737904 +77.0 34.75 6.393993 +77.5 34.75 6.399869 +78.0 34.75 6.489225 +78.5 34.75 6.317735 +79.0 34.75 5.814422 +79.5 34.75 5.150443 +80.0 34.75 4.425262 +80.5 34.75 3.771885 +81.0 34.75 3.441424 +81.5 34.75 3.580272 +82.0 34.75 3.980205 +82.5 34.75 4.320224 +83.0 34.75 4.479512 +83.5 34.75 4.458520 +84.0 34.75 4.299952 +84.5 34.75 4.172502 +85.0 34.75 4.316397 +85.5 34.75 4.795983 +86.0 34.75 5.332899 +86.5 34.75 5.654015 +87.0 34.75 5.744381 +87.5 34.75 5.667997 +88.0 34.75 5.469227 +88.5 34.75 5.400401 +89.0 34.75 5.818514 +89.5 34.75 6.784945 +90.0 34.75 7.943224 +90.5 34.75 8.920221 +91.0 34.75 9.605051 +91.5 34.75 10.081052 +92.0 34.75 10.337227 +92.5 34.75 10.475009 +93.0 34.75 10.743088 +93.5 34.75 11.266471 +94.0 34.75 11.829939 +94.5 34.75 12.226412 +95.0 34.75 12.427330 +95.5 34.75 12.474164 +96.0 34.75 12.326581 +96.5 34.75 11.994432 +97.0 34.75 11.681363 +97.5 34.75 11.565120 +98.0 34.75 11.498098 +98.5 34.75 11.314857 +99.0 34.75 11.079428 +99.5 34.75 10.813705 +100.0 34.75 10.447161 +100.5 34.75 10.068406 +101.0 34.75 9.908538 +101.5 34.75 10.072068 +102.0 34.75 10.343383 +102.5 34.75 10.473444 +103.0 34.75 10.467996 +103.5 34.75 10.314929 +104.0 34.75 9.908174 +104.5 34.75 9.374091 +105.0 34.75 9.031964 +105.5 34.75 9.064562 +106.0 34.75 9.216917 +106.5 34.75 9.141121 +107.0 34.75 8.828685 +107.5 34.75 8.429774 +108.0 34.75 7.997901 +108.5 34.75 7.597895 +109.0 34.75 7.424381 +109.5 34.75 7.529148 +110.0 34.75 7.623741 +110.5 34.75 7.482163 +111.0 34.75 7.161839 +111.5 34.75 6.762000 +112.0 34.75 6.285408 +112.5 34.75 5.840080 +113.0 34.75 5.767250 +113.5 34.75 6.255981 +114.0 34.75 6.980292 +114.5 34.75 7.525249 +115.0 34.75 7.751005 +115.5 34.75 7.763405 +116.0 34.75 7.658686 +116.5 34.75 7.551512 +117.0 34.75 7.652757 +117.5 34.75 8.038481 +118.0 34.75 8.401617 +118.5 34.75 8.412145 +119.0 34.75 8.122654 +119.5 34.75 7.725814 +120.0 34.75 7.284185 +120.5 34.75 6.913600 +121.0 34.75 6.847394 +121.5 34.75 7.108461 +122.0 34.75 7.324307 +122.5 34.75 7.205876 +123.0 34.75 6.825654 +123.5 34.75 6.409523 +124.0 34.75 5.977702 +124.5 34.75 5.543378 +125.0 34.75 5.292516 +125.5 34.75 5.272727 +126.0 34.75 5.235918 +126.5 34.75 4.952936 +127.0 34.75 4.535596 +127.5 34.75 4.154302 +128.0 34.75 3.852173 +128.5 34.75 3.694937 +129.0 34.75 3.857225 +129.5 34.75 4.362057 +130.0 34.75 4.883293 +130.5 34.75 5.168109 +131.0 34.75 5.254551 +131.5 34.75 5.335491 +132.0 34.75 5.395615 +132.5 34.75 5.487525 +133.0 34.75 5.802386 +133.5 34.75 6.372847 +134.0 34.75 6.909988 +134.5 34.75 7.175161 +135.0 34.75 7.120035 +135.5 34.75 6.810693 +136.0 34.75 6.237402 +136.5 34.75 5.473027 +137.0 34.75 4.829703 +137.5 34.75 4.469205 +138.0 34.75 4.265952 +138.5 34.75 4.085390 +139.0 34.75 3.917122 +139.5 34.75 3.756120 +140.0 34.75 3.479077 +140.5 34.75 3.091448 +141.0 34.75 2.892529 +141.5 34.75 3.002694 +142.0 34.75 3.093674 +142.5 34.75 2.730820 +143.0 34.75 1.824087 +143.5 34.75 0.502648 +144.0 34.75 -1.120397 +144.5 34.75 -2.812968 +145.0 34.75 -4.157228 +145.5 34.75 -4.947673 +146.0 34.75 -5.373748 +146.5 34.75 -5.768361 +147.0 34.75 -6.170722 +147.5 34.75 -6.503762 +148.0 34.75 -6.845913 +148.5 34.75 -7.199539 +149.0 34.75 -7.334851 +149.5 34.75 -7.099071 +150.0 34.75 -6.717239 +150.5 34.75 -6.497608 +151.0 34.75 -6.517589 +151.5 34.75 -6.692885 +152.0 34.75 -7.002262 +152.5 34.75 -7.311961 +153.0 34.75 -7.251304 +153.5 34.75 -6.569114 +154.0 34.75 -5.558670 +154.5 34.75 -4.659268 +155.0 34.75 -3.984163 +155.5 34.75 -3.487719 +156.0 34.75 -3.181052 +156.5 34.75 -3.011302 +157.0 34.75 -2.674145 +157.5 34.75 -2.016692 +158.0 34.75 -1.306091 +158.5 34.75 -0.910075 +159.0 34.75 -0.859160 +159.5 34.75 -1.037819 +160.0 34.75 -1.389098 +160.5 34.75 -1.774145 +161.0 34.75 -1.882032 +161.5 34.75 -1.536079 +162.0 34.75 -0.968596 +162.5 34.75 -0.439859 +163.0 34.75 0.014778 +163.5 34.75 -0.751160 +164.0 34.75 -1.238120 +164.5 34.75 -1.588527 +165.0 34.75 -1.625777 +165.5 34.75 -1.231433 +166.0 34.75 -0.619896 +166.5 34.75 -0.130703 +167.0 34.75 0.183922 +167.5 34.75 0.352445 +168.0 34.75 0.203812 +168.5 34.75 -0.324914 +169.0 34.75 -0.958223 +169.5 34.75 -1.426358 +170.0 34.75 -1.846273 +170.5 34.75 -2.467185 +171.0 34.75 -3.203171 +171.5 34.75 -3.804976 +172.0 34.75 -4.296754 +172.5 34.75 -4.731450 +173.0 34.75 -4.993442 +173.5 34.75 -4.976164 +174.0 34.75 -4.819309 +174.5 34.75 -4.787318 +175.0 34.75 -4.921186 +175.5 34.75 -5.235575 +176.0 34.75 -5.854485 +176.5 34.75 -6.722897 +177.0 34.75 -7.513778 +177.5 34.75 -7.928882 +178.0 34.75 -8.020076 +178.5 34.75 -8.060818 +179.0 34.75 -8.146626 +179.5 34.75 -8.264270 +180.0 34.75 -8.587123 +180.5 34.75 -9.121588 +181.0 34.75 -9.582141 +181.5 34.75 -9.686950 +182.0 34.75 -9.541066 +182.5 34.75 -9.396654 +183.0 34.75 -9.296509 +183.5 34.75 -9.204021 +184.0 34.75 -9.235452 +184.5 34.75 -9.492293 +185.0 34.75 -9.749107 +185.5 34.75 -9.756120 +186.0 34.75 -9.582855 +186.5 34.75 -9.373531 +187.0 34.75 -9.077374 +187.5 34.75 -8.692600 +188.0 34.75 -8.414775 +188.5 34.75 -8.353061 +189.0 34.75 -8.264520 +189.5 34.75 -7.859145 +190.0 34.75 -7.247750 +190.5 34.75 -6.707704 +191.0 34.75 -6.310757 +191.5 34.75 -6.090968 +192.0 34.75 -6.266067 +192.5 34.75 -6.899958 +193.0 34.75 -7.656844 +193.5 34.75 -8.165459 +194.0 34.75 -8.392109 +194.5 34.75 -8.427688 +195.0 34.75 -8.296045 +195.5 34.75 -8.035770 +196.0 34.75 -7.814043 +196.5 34.75 -7.623769 +197.0 34.75 -7.165095 +197.5 34.75 -6.179187 +198.0 34.75 -4.912463 +198.5 34.75 -3.727582 +199.0 34.75 -2.698747 +199.5 34.75 -1.837483 +200.0 34.75 -1.282663 +200.5 34.75 -1.044435 +201.0 34.75 -0.794489 +201.5 34.75 -0.201688 +202.0 34.75 0.645129 +202.5 34.75 1.484239 +203.0 34.75 2.259661 +203.5 34.75 2.973018 +204.0 34.75 3.401692 +204.5 34.75 3.388779 +205.0 34.75 3.208838 +205.5 34.75 3.262490 +206.0 34.75 3.558480 +206.5 34.75 3.878478 +207.0 34.75 4.137713 +207.5 34.75 4.385661 +208.0 34.75 4.541084 +208.5 34.75 4.611710 +209.0 34.75 4.867084 +209.5 34.75 5.494525 +210.0 34.75 6.317924 +210.5 34.75 7.005429 +211.0 34.75 7.464559 +211.5 34.75 7.745556 +212.0 34.75 7.793716 +212.5 34.75 7.627759 +213.0 34.75 7.540792 +213.5 34.75 7.731778 +214.0 34.75 8.008604 +214.5 34.75 8.127497 +215.0 34.75 8.128393 +215.5 34.75 8.107387 +216.0 34.75 7.945102 +216.5 34.75 7.571100 +217.0 34.75 7.220675 +217.5 34.75 7.145194 +218.0 34.75 7.212260 +218.5 34.75 7.121469 +219.0 34.75 6.755689 +219.5 34.75 6.168158 +220.0 34.75 5.298422 +220.5 34.75 4.172536 +221.0 34.75 3.113576 +221.5 34.75 2.519594 +222.0 34.75 2.463725 +222.5 34.75 2.724465 +223.0 34.75 3.157538 +223.5 34.75 3.660695 +224.0 34.75 3.984521 +224.5 34.75 3.979427 +225.0 34.75 3.895074 +225.5 34.75 4.032009 +226.0 34.75 4.362866 +226.5 34.75 4.650624 +227.0 34.75 4.812847 +227.5 34.75 4.906612 +228.0 34.75 4.902310 +228.5 34.75 4.807225 +229.0 34.75 4.889961 +229.5 34.75 5.427069 +230.0 34.75 6.314091 +230.5 34.75 7.266506 +231.0 34.75 8.098096 +231.5 34.75 8.677601 +232.0 34.75 8.855065 +232.5 34.75 8.665414 +233.0 34.75 8.415120 +233.5 34.75 8.409550 +234.0 34.75 8.631548 +234.5 34.75 8.838637 +235.0 34.75 8.916850 +235.5 34.75 8.861068 +236.0 34.75 8.628595 +236.5 34.75 8.209900 +237.0 34.75 7.807496 +237.5 34.75 7.744643 +238.0 34.75 8.025601 +238.5 34.75 8.328713 +239.0 34.75 8.422511 +239.5 34.75 8.254411 +240.0 34.75 7.784180 +240.5 34.75 7.079184 +241.0 34.75 6.433853 +241.5 34.75 6.090046 +242.0 34.75 5.903011 +242.5 34.75 5.553618 +243.0 34.75 4.935351 +243.5 34.75 4.132267 +244.0 34.75 3.165749 +244.5 34.75 2.099684 +245.0 34.75 1.258090 +245.5 34.75 0.962573 +246.0 34.75 1.113352 +246.5 34.75 1.375418 +247.0 34.75 1.613389 +247.5 34.75 1.860011 +248.0 34.75 2.070319 +248.5 34.75 2.190627 +249.0 34.75 2.429913 +249.5 34.75 2.974265 +250.0 34.75 3.624921 +250.5 34.75 4.015799 +251.0 34.75 4.031991 +251.5 34.75 3.747958 +252.0 34.75 3.116668 +252.5 34.75 2.124744 +253.0 34.75 1.076991 +253.5 34.75 0.361978 +254.0 34.75 -0.020435 +254.5 34.75 -0.318327 +255.0 34.75 -0.615811 +255.5 34.75 -0.939341 +256.0 34.75 -1.447655 +256.5 34.75 -2.177569 +257.0 34.75 -2.858049 +257.5 34.75 -3.172544 +258.0 34.75 -3.169497 +258.5 34.75 -3.164477 +259.0 34.75 -3.358057 +259.5 34.75 -3.843397 +260.0 34.75 -4.768138 +260.5 34.75 -6.125297 +261.0 34.75 -7.603954 +261.5 34.75 -8.714475 +262.0 34.75 -9.404776 +262.5 34.75 -9.938047 +263.0 34.75 -10.480948 +263.5 34.75 -11.059334 +264.0 34.75 -11.737169 +264.5 34.75 -12.555057 +265.0 34.75 -13.309829 +265.5 34.75 -13.759582 +266.0 34.75 -13.941854 +266.5 34.75 -14.058622 +267.0 34.75 -14.172462 +267.5 34.75 -14.248292 +268.0 34.75 -14.353091 +268.5 34.75 -14.533637 +269.0 34.75 -14.591301 +269.5 34.75 -14.253493 +270.0 34.75 -13.539704 +270.5 34.75 -12.652611 +271.0 34.75 -11.761640 +271.5 34.75 -10.943797 +272.0 34.75 -10.289501 +272.5 34.75 -9.870450 +273.0 34.75 -9.470464 +273.5 34.75 -8.835869 +274.0 34.75 -8.024028 +274.5 34.75 -7.290140 +275.0 34.75 -6.780978 +275.5 34.75 -6.552094 +276.0 34.75 -6.656324 +276.5 34.75 -7.002983 +277.0 34.75 -7.288816 +277.5 34.75 -7.193589 +278.0 34.75 -6.711665 +278.5 34.75 -6.082265 +279.0 34.75 -5.346410 +279.5 34.75 -4.408467 +280.0 34.75 -3.347810 +30.0 35.75 4.570993 +30.5 35.75 2.866748 +31.0 35.75 1.610224 +31.5 35.75 0.672661 +32.0 35.75 -0.139330 +32.5 35.75 -0.849698 +33.0 35.75 -1.364637 +33.5 35.75 -1.618643 +34.0 35.75 -1.784043 +34.5 35.75 -2.125687 +35.0 35.75 -2.730672 +35.5 35.75 -3.508697 +36.0 35.75 -4.382125 +36.5 35.75 -5.260299 +37.0 35.75 -5.957613 +37.5 35.75 -6.324150 +38.0 35.75 -6.548943 +38.5 35.75 -6.779825 +39.0 35.75 -7.035224 +39.5 35.75 -7.288569 +40.0 35.75 -7.569285 +40.5 35.75 -7.904279 +41.0 35.75 -8.190622 +41.5 35.75 -8.395135 +42.0 35.75 -8.595965 +42.5 35.75 -8.974337 +43.0 35.75 -9.516645 +43.5 35.75 -10.198920 +44.0 35.75 -11.036398 +44.5 35.75 -11.965691 +45.0 35.75 -12.758543 +45.5 35.75 -13.253904 +46.0 35.75 -13.501253 +46.5 35.75 -13.635213 +47.0 35.75 -13.672699 +47.5 35.75 -13.518543 +48.0 35.75 -13.213768 +48.5 35.75 -12.784975 +49.0 35.75 -12.171551 +49.5 35.75 -11.322050 +50.0 35.75 -10.494400 +50.5 35.75 -9.992730 +51.0 35.75 -9.784760 +51.5 35.75 -9.818377 +52.0 35.75 -10.093416 +52.5 35.75 -10.452405 +53.0 35.75 -10.623622 +53.5 35.75 -10.445527 +54.0 35.75 -10.130716 +54.5 35.75 -9.840722 +55.0 35.75 -9.508069 +55.5 35.75 -9.065962 +56.0 35.75 -8.580089 +56.5 35.75 -8.055015 +57.0 35.75 -7.280009 +57.5 35.75 -6.178493 +58.0 35.75 -5.062564 +58.5 35.75 -4.207079 +59.0 35.75 -3.673812 +59.5 35.75 -3.411224 +60.0 35.75 -3.378456 +60.5 35.75 -3.519144 +61.0 35.75 -3.505893 +61.5 35.75 -3.126285 +62.0 35.75 -2.614401 +62.5 35.75 -2.290224 +63.0 35.75 -2.139762 +63.5 35.75 -2.038854 +64.0 35.75 -1.934465 +64.5 35.75 -1.732811 +65.0 35.75 -1.162228 +65.5 35.75 -0.190916 +66.0 35.75 0.949438 +66.5 35.75 2.020639 +67.0 35.75 2.925842 +67.5 35.75 3.629231 +68.0 35.75 4.037611 +68.5 35.75 4.245867 +69.0 35.75 4.548846 +69.5 35.75 5.091918 +70.0 35.75 5.667776 +70.5 35.75 6.018707 +71.0 35.75 6.028388 +71.5 35.75 5.721325 +72.0 35.75 5.150371 +72.5 35.75 4.474005 +73.0 35.75 4.071318 +73.5 35.75 4.160066 +74.0 35.75 4.470199 +74.5 35.75 4.643404 +75.0 35.75 4.559919 +75.5 35.75 4.213704 +76.0 35.75 3.597334 +76.5 35.75 2.875734 +77.0 35.75 2.415097 +77.5 35.75 2.329012 +78.0 35.75 2.314316 +78.5 35.75 2.085360 +79.0 35.75 1.575292 +79.5 35.75 0.899310 +80.0 35.75 0.100869 +80.5 35.75 -0.681008 +81.0 35.75 -1.137435 +81.5 35.75 -1.111269 +82.0 35.75 -0.899145 +82.5 35.75 -0.706930 +83.0 35.75 -0.687441 +83.5 35.75 -0.761223 +84.0 35.75 -0.847072 +84.5 35.75 -0.791375 +85.0 35.75 -0.435267 +85.5 35.75 0.254457 +86.0 35.75 0.965581 +86.5 35.75 1.412809 +87.0 35.75 1.561169 +87.5 35.75 1.499178 +88.0 35.75 1.305193 +88.5 35.75 1.198811 +89.0 35.75 1.485274 +89.5 35.75 2.311265 +90.0 35.75 3.328478 +90.5 35.75 4.152523 +91.0 35.75 4.695065 +91.5 35.75 5.156952 +92.0 35.75 5.483098 +92.5 35.75 5.700172 +93.0 35.75 6.020789 +93.5 35.75 6.526142 +94.0 35.75 7.036231 +94.5 35.75 7.318625 +95.0 35.75 7.376663 +95.5 35.75 7.285952 +96.0 35.75 6.981534 +96.5 35.75 6.486623 +97.0 35.75 6.069482 +97.5 35.75 5.829090 +98.0 35.75 5.603451 +98.5 35.75 5.189091 +99.0 35.75 4.626226 +99.5 35.75 3.998282 +100.0 35.75 3.304085 +100.5 35.75 2.630982 +101.0 35.75 2.304893 +101.5 35.75 2.440383 +102.0 35.75 2.780961 +102.5 35.75 3.058347 +103.0 35.75 3.170675 +103.5 35.75 3.090580 +104.0 35.75 2.725921 +104.5 35.75 2.202466 +105.0 35.75 1.921615 +105.5 35.75 2.088943 +106.0 35.75 2.496235 +106.5 35.75 2.748954 +107.0 35.75 2.720865 +107.5 35.75 2.564233 +108.0 35.75 2.354824 +108.5 35.75 2.157089 +109.0 35.75 2.157877 +109.5 35.75 2.346619 +110.0 35.75 2.514728 +110.5 35.75 2.394079 +111.0 35.75 2.046237 +111.5 35.75 1.649620 +112.0 35.75 1.216584 +112.5 35.75 0.777423 +113.0 35.75 0.647866 +113.5 35.75 1.014175 +114.0 35.75 1.646086 +114.5 35.75 2.139755 +115.0 35.75 2.328494 +115.5 35.75 2.309116 +116.0 35.75 2.185535 +116.5 35.75 2.052409 +117.0 35.75 2.110012 +117.5 35.75 2.379890 +118.0 35.75 2.548757 +118.5 35.75 2.367884 +119.0 35.75 1.956846 +119.5 35.75 1.485777 +120.0 35.75 0.958616 +120.5 35.75 0.395147 +121.0 35.75 0.097562 +121.5 35.75 0.187875 +122.0 35.75 0.300117 +122.5 35.75 0.086367 +123.0 35.75 -0.456928 +123.5 35.75 -1.101990 +124.0 35.75 -1.811591 +124.5 35.75 -2.469457 +125.0 35.75 -2.817091 +125.5 35.75 -2.813356 +126.0 35.75 -2.723411 +126.5 35.75 -2.800102 +127.0 35.75 -3.012306 +127.5 35.75 -3.265815 +128.0 35.75 -3.499991 +128.5 35.75 -3.641370 +129.0 35.75 -3.494344 +129.5 35.75 -2.988716 +130.0 35.75 -2.440981 +130.5 35.75 -2.082267 +131.0 35.75 -1.851225 +131.5 35.75 -1.590403 +132.0 35.75 -1.343865 +132.5 35.75 -1.072113 +133.0 35.75 -0.678207 +133.5 35.75 -0.074201 +134.0 35.75 0.554950 +134.5 35.75 0.913876 +135.0 35.75 0.981892 +135.5 35.75 0.829981 +136.0 35.75 0.317699 +136.5 35.75 -0.484183 +137.0 35.75 -1.222989 +137.5 35.75 -1.602935 +138.0 35.75 -1.790666 +138.5 35.75 -1.979194 +139.0 35.75 -2.189980 +139.5 35.75 -2.423774 +140.0 35.75 -2.784942 +140.5 35.75 -3.270883 +141.0 35.75 -3.566887 +141.5 35.75 -3.502935 +142.0 35.75 -3.406155 +142.5 35.75 -3.717824 +143.0 35.75 -4.557145 +143.5 35.75 -5.822547 +144.0 35.75 -7.425721 +144.5 35.75 -9.119534 +145.0 35.75 -10.491839 +145.5 35.75 -11.280166 +146.0 35.75 -11.694323 +146.5 35.75 -12.071048 +147.0 35.75 -12.450538 +147.5 35.75 -12.777349 +148.0 35.75 -13.098428 +148.5 35.75 -13.360899 +149.0 35.75 -13.353074 +149.5 35.75 -12.951612 +150.0 35.75 -12.442129 +150.5 35.75 -12.175354 +151.0 35.75 -12.191778 +151.5 35.75 -12.402509 +152.0 35.75 -12.784778 +152.5 35.75 -13.127766 +153.0 35.75 -12.993447 +153.5 35.75 -12.178870 +154.0 35.75 -11.006392 +154.5 35.75 -9.936466 +155.0 35.75 -9.143254 +155.5 35.75 -8.554995 +156.0 35.75 -8.206010 +156.5 35.75 -7.988363 +157.0 35.75 -7.515776 +157.5 35.75 -6.573400 +158.0 35.75 -5.418247 +158.5 35.75 -4.501032 +159.0 35.75 -3.994722 +159.5 35.75 -3.857690 +160.0 35.75 -4.072685 +160.5 35.75 -4.420125 +161.0 35.75 -4.494508 +161.5 35.75 -4.087868 +162.0 35.75 -3.454613 +162.5 35.75 -2.937463 +163.0 35.75 -2.591281 +163.5 35.75 -3.629884 +164.0 35.75 -4.242988 +164.5 35.75 -4.689873 +165.0 35.75 -4.803240 +165.5 35.75 -4.427224 +166.0 35.75 -3.813875 +166.5 35.75 -3.283128 +167.0 35.75 -2.957099 +167.5 35.75 -2.803190 +168.0 35.75 -2.907668 +168.5 35.75 -3.350832 +169.0 35.75 -3.867297 +169.5 35.75 -4.200252 +170.0 35.75 -4.498068 +170.5 35.75 -5.005441 +171.0 35.75 -5.664815 +171.5 35.75 -6.264096 +172.0 35.75 -6.831778 +172.5 35.75 -7.386916 +173.0 35.75 -7.701380 +173.5 35.75 -7.584254 +174.0 35.75 -7.258316 +174.5 35.75 -7.060667 +175.0 35.75 -7.067522 +175.5 35.75 -7.190085 +176.0 35.75 -7.562113 +176.5 35.75 -8.167721 +177.0 35.75 -8.691805 +177.5 35.75 -8.908361 +178.0 35.75 -8.996319 +178.5 35.75 -9.085347 +179.0 35.75 -9.219161 +179.5 35.75 -9.411342 +180.0 35.75 -9.784664 +180.5 35.75 -10.344515 +181.0 35.75 -10.818032 +181.5 35.75 -10.953018 +182.0 35.75 -10.840731 +182.5 35.75 -10.727920 +183.0 35.75 -10.731846 +183.5 35.75 -10.875894 +184.0 35.75 -11.192779 +184.5 35.75 -11.626323 +185.0 35.75 -11.890953 +185.5 35.75 -11.731429 +186.0 35.75 -11.178870 +186.5 35.75 -10.489575 +187.0 35.75 -9.747881 +187.5 35.75 -8.961459 +188.0 35.75 -8.388143 +188.5 35.75 -8.077466 +189.0 35.75 -7.777914 +189.5 35.75 -7.257626 +190.0 35.75 -6.622914 +190.5 35.75 -6.130007 +191.0 35.75 -5.779866 +191.5 35.75 -5.564186 +192.0 35.75 -5.690736 +192.5 35.75 -6.290715 +193.0 35.75 -7.030870 +193.5 35.75 -7.518241 +194.0 35.75 -7.732793 +194.5 35.75 -7.835643 +195.0 35.75 -7.818953 +195.5 35.75 -7.724847 +196.0 35.75 -7.727433 +196.5 35.75 -7.754178 +197.0 35.75 -7.450642 +197.5 35.75 -6.585085 +198.0 35.75 -5.362701 +198.5 35.75 -4.164102 +199.0 35.75 -3.111485 +199.5 35.75 -2.256346 +200.0 35.75 -1.735525 +200.5 35.75 -1.562883 +201.0 35.75 -1.421496 +201.5 35.75 -1.007206 +202.0 35.75 -0.335846 +202.5 35.75 0.368400 +203.0 35.75 1.084227 +203.5 35.75 1.748563 +204.0 35.75 2.094668 +204.5 35.75 2.057379 +205.0 35.75 1.981763 +205.5 35.75 2.182457 +206.0 35.75 2.593294 +206.5 35.75 2.950137 +207.0 35.75 3.215223 +207.5 35.75 3.476671 +208.0 35.75 3.665941 +208.5 35.75 3.752599 +209.0 35.75 4.036497 +209.5 35.75 4.801236 +210.0 35.75 5.860765 +210.5 35.75 6.840787 +211.0 35.75 7.679289 +211.5 35.75 8.285589 +212.0 35.75 8.552460 +212.5 35.75 8.520227 +213.0 35.75 8.570796 +213.5 35.75 8.930218 +214.0 35.75 9.481537 +214.5 35.75 9.944988 +215.0 35.75 10.264620 +215.5 35.75 10.532294 +216.0 35.75 10.608523 +216.5 35.75 10.420273 +217.0 35.75 10.236325 +217.5 35.75 10.288995 +218.0 35.75 10.471027 +218.5 35.75 10.494147 +219.0 35.75 10.300065 +219.5 35.75 9.945100 +220.0 35.75 9.297663 +220.5 35.75 8.381858 +221.0 35.75 7.495839 +221.5 35.75 7.059955 +222.0 35.75 7.086765 +222.5 35.75 7.341619 +223.0 35.75 7.654017 +223.5 35.75 7.960217 +224.0 35.75 8.079048 +224.5 35.75 7.885538 +225.0 35.75 7.600149 +225.5 35.75 7.555259 +226.0 35.75 7.769090 +226.5 35.75 8.043248 +227.0 35.75 8.243129 +227.5 35.75 8.316947 +228.0 35.75 8.171110 +228.5 35.75 7.934390 +229.0 35.75 7.880629 +229.5 35.75 8.341123 +230.0 35.75 9.238997 +230.5 35.75 10.173639 +231.0 35.75 10.926895 +231.5 35.75 11.450540 +232.0 35.75 11.624880 +232.5 35.75 11.495806 +233.0 35.75 11.325685 +233.5 35.75 11.436890 +234.0 35.75 11.796787 +234.5 35.75 12.134765 +235.0 35.75 12.301597 +235.5 35.75 12.303511 +236.0 35.75 12.092598 +236.5 35.75 11.692941 +237.0 35.75 11.355832 +237.5 35.75 11.405875 +238.0 35.75 11.763986 +238.5 35.75 12.067034 +239.0 35.75 12.105859 +239.5 35.75 11.814433 +240.0 35.75 11.161818 +240.5 35.75 10.265721 +241.0 35.75 9.427288 +241.5 35.75 8.912843 +242.0 35.75 8.647960 +242.5 35.75 8.305052 +243.0 35.75 7.673303 +243.5 35.75 6.830907 +244.0 35.75 5.797830 +244.5 35.75 4.656830 +245.0 35.75 3.725459 +245.5 35.75 3.346252 +246.0 35.75 3.435189 +246.5 35.75 3.601240 +247.0 35.75 3.698667 +247.5 35.75 3.777766 +248.0 35.75 3.769080 +248.5 35.75 3.614360 +249.0 35.75 3.490484 +249.5 35.75 3.609805 +250.0 35.75 3.825845 +250.5 35.75 3.822653 +251.0 35.75 3.535437 +251.5 35.75 2.974567 +252.0 35.75 2.097534 +252.5 35.75 0.898506 +253.0 35.75 -0.314740 +253.5 35.75 -1.162411 +254.0 35.75 -1.581868 +254.5 35.75 -1.789860 +255.0 35.75 -1.893959 +255.5 35.75 -2.018312 +256.0 35.75 -2.353435 +256.5 35.75 -2.906789 +257.0 35.75 -3.387974 +257.5 35.75 -3.466084 +258.0 35.75 -3.248125 +258.5 35.75 -3.081434 +259.0 35.75 -3.173769 +259.5 35.75 -3.545088 +260.0 35.75 -4.321603 +260.5 35.75 -5.542423 +261.0 35.75 -6.911538 +261.5 35.75 -7.966365 +262.0 35.75 -8.599162 +262.5 35.75 -9.049546 +263.0 35.75 -9.509499 +263.5 35.75 -10.042639 +264.0 35.75 -10.756038 +264.5 35.75 -11.618235 +265.0 35.75 -12.367858 +265.5 35.75 -12.785048 +266.0 35.75 -12.953577 +266.5 35.75 -13.113914 +267.0 35.75 -13.320080 +267.5 35.75 -13.516319 +268.0 35.75 -13.741172 +268.5 35.75 -14.042992 +269.0 35.75 -14.243635 +269.5 35.75 -14.139214 +270.0 35.75 -13.719368 +270.5 35.75 -13.154673 +271.0 35.75 -12.554559 +271.5 35.75 -11.973755 +272.0 35.75 -11.512999 +272.5 35.75 -11.241270 +273.0 35.75 -11.008437 +273.5 35.75 -10.542103 +274.0 35.75 -9.936126 +274.5 35.75 -9.412817 +275.0 35.75 -9.058858 +275.5 35.75 -8.922477 +276.0 35.75 -9.060081 +276.5 35.75 -9.367152 +277.0 35.75 -9.557136 +277.5 35.75 -9.330152 +278.0 35.75 -8.697934 +278.5 35.75 -7.912823 +279.0 35.75 -7.026285 +279.5 35.75 -5.820702 +280.0 35.75 -4.379937 +30.0 36.75 4.080548 +30.5 36.75 2.173051 +31.0 36.75 0.667788 +31.5 36.75 -0.475898 +32.0 36.75 -1.468445 +32.5 36.75 -2.389099 +33.0 36.75 -3.170282 +33.5 36.75 -3.744082 +34.0 36.75 -4.293485 +34.5 36.75 -4.996674 +35.0 36.75 -5.826192 +35.5 36.75 -6.724999 +36.0 36.75 -7.684581 +36.5 36.75 -8.574194 +37.0 36.75 -9.230572 +37.5 36.75 -9.615921 +38.0 36.75 -9.907848 +38.5 36.75 -10.204982 +39.0 36.75 -10.489585 +39.5 36.75 -10.712701 +40.0 36.75 -10.921319 +40.5 36.75 -11.144891 +41.0 36.75 -11.304781 +41.5 36.75 -11.390183 +42.0 36.75 -11.561589 +42.5 36.75 -11.954842 +43.0 36.75 -12.538307 +43.5 36.75 -13.262093 +44.0 36.75 -14.204222 +44.5 36.75 -15.314356 +45.0 36.75 -16.277568 +45.5 36.75 -16.943306 +46.0 36.75 -17.444370 +46.5 36.75 -17.914446 +47.0 36.75 -18.306798 +47.5 36.75 -18.475297 +48.0 36.75 -18.478013 +48.5 36.75 -18.330371 +49.0 36.75 -17.930378 +49.5 36.75 -17.324729 +50.0 36.75 -16.762793 +50.5 36.75 -16.458046 +51.0 36.75 -16.431397 +51.5 36.75 -16.580689 +52.0 36.75 -16.850834 +52.5 36.75 -17.133941 +53.0 36.75 -17.204619 +53.5 36.75 -16.989573 +54.0 36.75 -16.649675 +54.5 36.75 -16.381829 +55.0 36.75 -16.151933 +55.5 36.75 -15.834516 +56.0 36.75 -15.414337 +56.5 36.75 -14.903713 +57.0 36.75 -14.132030 +57.5 36.75 -13.004410 +58.0 36.75 -11.756538 +58.5 36.75 -10.646450 +59.0 36.75 -9.788839 +59.5 36.75 -9.193136 +60.0 36.75 -8.904205 +60.5 36.75 -8.772387 +61.0 36.75 -8.478826 +61.5 36.75 -7.842358 +62.0 36.75 -7.156417 +62.5 36.75 -6.708820 +63.0 36.75 -6.394996 +63.5 36.75 -6.082873 +64.0 36.75 -5.772495 +64.5 36.75 -5.344791 +65.0 36.75 -4.593014 +65.5 36.75 -3.498269 +66.0 36.75 -2.293845 +66.5 36.75 -1.190552 +67.0 36.75 -0.254963 +67.5 36.75 0.434169 +68.0 36.75 0.778566 +68.5 36.75 0.915530 +69.0 36.75 1.165864 +69.5 36.75 1.649139 +70.0 36.75 2.184308 +70.5 36.75 2.513140 +71.0 36.75 2.535935 +71.5 36.75 2.240538 +72.0 36.75 1.612392 +72.5 36.75 0.824720 +73.0 36.75 0.225113 +73.5 36.75 0.053288 +74.0 36.75 0.150828 +74.5 36.75 0.241348 +75.0 36.75 0.225315 +75.5 36.75 0.074614 +76.0 36.75 -0.266020 +76.5 36.75 -0.690978 +77.0 36.75 -0.986148 +77.5 36.75 -1.074182 +78.0 36.75 -1.164364 +78.5 36.75 -1.475146 +79.0 36.75 -1.991491 +79.5 36.75 -2.618063 +80.0 36.75 -3.383659 +80.5 36.75 -4.116917 +81.0 36.75 -4.500825 +81.5 36.75 -4.462876 +82.0 36.75 -4.225581 +82.5 36.75 -4.054290 +83.0 36.75 -4.009807 +83.5 36.75 -4.009297 +84.0 36.75 -3.962224 +84.5 36.75 -3.794066 +85.0 36.75 -3.362107 +85.5 36.75 -2.583488 +86.0 36.75 -1.733026 +86.5 36.75 -1.101534 +87.0 36.75 -0.774404 +87.5 36.75 -0.711042 +88.0 36.75 -0.869089 +88.5 36.75 -1.023449 +89.0 36.75 -0.833101 +89.5 36.75 -0.129062 +90.0 36.75 0.764649 +90.5 36.75 1.463046 +91.0 36.75 1.951310 +91.5 36.75 2.314924 +92.0 36.75 2.539276 +92.5 36.75 2.692700 +93.0 36.75 2.974653 +93.5 36.75 3.419463 +94.0 36.75 3.839203 +94.5 36.75 4.046590 +95.0 36.75 4.074517 +95.5 36.75 3.938377 +96.0 36.75 3.567907 +96.5 36.75 3.022043 +97.0 36.75 2.625236 +97.5 36.75 2.499487 +98.0 36.75 2.336286 +98.5 36.75 1.930503 +99.0 36.75 1.374549 +99.5 36.75 0.755595 +100.0 36.75 0.081645 +100.5 36.75 -0.533055 +101.0 36.75 -0.806351 +101.5 36.75 -0.591570 +102.0 36.75 -0.133203 +102.5 36.75 0.282161 +103.0 36.75 0.540022 +103.5 36.75 0.604713 +104.0 36.75 0.385094 +104.5 36.75 -0.033227 +105.0 36.75 -0.269762 +105.5 36.75 -0.058884 +106.0 36.75 0.440747 +106.5 36.75 0.915641 +107.0 36.75 1.241909 +107.5 36.75 1.463961 +108.0 36.75 1.584645 +108.5 36.75 1.703739 +109.0 36.75 2.065931 +109.5 36.75 2.697294 +110.0 36.75 3.325083 +110.5 36.75 3.652743 +111.0 36.75 3.670412 +111.5 36.75 3.550970 +112.0 36.75 3.267409 +112.5 36.75 2.890523 +113.0 36.75 2.765372 +113.5 36.75 3.029241 +114.0 36.75 3.458537 +114.5 36.75 3.702389 +115.0 36.75 3.730887 +115.5 36.75 3.689223 +116.0 36.75 3.573628 +116.5 36.75 3.422673 +117.0 36.75 3.428339 +117.5 36.75 3.623368 +118.0 36.75 3.722412 +118.5 36.75 3.450279 +119.0 36.75 2.921215 +119.5 36.75 2.310755 +120.0 36.75 1.618540 +120.5 36.75 0.891159 +121.0 36.75 0.396391 +121.5 36.75 0.263575 +122.0 36.75 0.227526 +122.5 36.75 -0.029622 +123.0 36.75 -0.547497 +123.5 36.75 -1.141407 +124.0 36.75 -1.780458 +124.5 36.75 -2.378209 +125.0 36.75 -2.675389 +125.5 36.75 -2.619310 +126.0 36.75 -2.466656 +126.5 36.75 -2.497951 +127.0 36.75 -2.702146 +127.5 36.75 -3.031425 +128.0 36.75 -3.484258 +128.5 36.75 -3.866942 +129.0 36.75 -3.854678 +129.5 36.75 -3.395764 +130.0 36.75 -2.834134 +130.5 36.75 -2.455735 +131.0 36.75 -2.171082 +131.5 36.75 -1.893721 +132.0 36.75 -1.650121 +132.5 36.75 -1.427009 +133.0 36.75 -1.084903 +133.5 36.75 -0.496156 +134.0 36.75 0.131637 +134.5 36.75 0.543183 +135.0 36.75 0.685825 +135.5 36.75 0.568892 +136.0 36.75 0.076309 +136.5 36.75 -0.694376 +137.0 36.75 -1.382805 +137.5 36.75 -1.728271 +138.0 36.75 -1.943239 +138.5 36.75 -2.260265 +139.0 36.75 -2.643615 +139.5 36.75 -3.015839 +140.0 36.75 -3.481978 +140.5 36.75 -3.984676 +141.0 36.75 -4.284462 +141.5 36.75 -4.228144 +142.0 36.75 -4.114034 +142.5 36.75 -4.368523 +143.0 36.75 -5.099092 +143.5 36.75 -6.230411 +144.0 36.75 -7.693606 +144.5 36.75 -9.288554 +145.0 36.75 -10.647906 +145.5 36.75 -11.481108 +146.0 36.75 -11.938138 +146.5 36.75 -12.270640 +147.0 36.75 -12.551812 +147.5 36.75 -12.755111 +148.0 36.75 -12.977114 +148.5 36.75 -13.208255 +149.0 36.75 -13.190337 +149.5 36.75 -12.787492 +150.0 36.75 -12.337760 +150.5 36.75 -12.171532 +151.0 36.75 -12.304043 +151.5 36.75 -12.571449 +152.0 36.75 -12.939762 +152.5 36.75 -13.227301 +153.0 36.75 -13.019020 +153.5 36.75 -12.154946 +154.0 36.75 -10.997099 +154.5 36.75 -9.989059 +155.0 36.75 -9.222339 +155.5 36.75 -8.623867 +156.0 36.75 -8.209869 +156.5 36.75 -7.901905 +157.0 36.75 -7.329036 +157.5 36.75 -6.250698 +158.0 36.75 -4.869773 +158.5 36.75 -3.613251 +159.0 36.75 -2.740820 +159.5 36.75 -2.271791 +160.0 36.75 -2.191496 +160.5 36.75 -2.330594 +161.0 36.75 -2.280497 +161.5 36.75 -1.774300 +162.0 36.75 -1.078265 +162.5 36.75 -0.631949 +163.0 36.75 -0.468285 +163.5 36.75 -1.711198 +164.0 36.75 -2.415301 +164.5 36.75 -2.860510 +165.0 36.75 -2.941793 +165.5 36.75 -2.578705 +166.0 36.75 -2.059053 +166.5 36.75 -1.721118 +167.0 36.75 -1.612916 +167.5 36.75 -1.599912 +168.0 36.75 -1.787315 +168.5 36.75 -2.301960 +169.0 36.75 -2.886598 +169.5 36.75 -3.237175 +170.0 36.75 -3.466599 +170.5 36.75 -3.835433 +171.0 36.75 -4.329365 +171.5 36.75 -4.787335 +172.0 36.75 -5.291152 +172.5 36.75 -5.850081 +173.0 36.75 -6.177225 +173.5 36.75 -6.062038 +174.0 36.75 -5.739075 +174.5 36.75 -5.552042 +175.0 36.75 -5.578370 +175.5 36.75 -5.665821 +176.0 36.75 -5.839424 +176.5 36.75 -6.145105 +177.0 36.75 -6.381090 +177.5 36.75 -6.390063 +178.0 36.75 -6.341566 +178.5 36.75 -6.408985 +179.0 36.75 -6.553980 +179.5 36.75 -6.737426 +180.0 36.75 -7.083989 +180.5 36.75 -7.699265 +181.0 36.75 -8.273065 +181.5 36.75 -8.442550 +182.0 36.75 -8.302776 +182.5 36.75 -8.206468 +183.0 36.75 -8.273953 +183.5 36.75 -8.442964 +184.0 36.75 -8.736951 +184.5 36.75 -9.116276 +185.0 36.75 -9.304964 +185.5 36.75 -9.034864 +186.0 36.75 -8.371388 +186.5 36.75 -7.553192 +187.0 36.75 -6.652673 +187.5 36.75 -5.777441 +188.0 36.75 -5.112088 +188.5 36.75 -4.646539 +189.0 36.75 -4.153665 +189.5 36.75 -3.425592 +190.0 36.75 -2.637629 +190.5 36.75 -2.033778 +191.0 36.75 -1.602514 +191.5 36.75 -1.378834 +192.0 36.75 -1.526053 +192.5 36.75 -2.114664 +193.0 36.75 -2.792975 +193.5 36.75 -3.168905 +194.0 36.75 -3.272720 +194.5 36.75 -3.327916 +195.0 36.75 -3.342397 +195.5 36.75 -3.278995 +196.0 36.75 -3.265599 +196.5 36.75 -3.324819 +197.0 36.75 -3.124481 +197.5 36.75 -2.401048 +198.0 36.75 -1.329157 +198.5 36.75 -0.332355 +199.0 36.75 0.440360 +199.5 36.75 1.033466 +200.0 36.75 1.294436 +200.5 36.75 1.199802 +201.0 36.75 1.116465 +201.5 36.75 1.352690 +202.0 36.75 1.888180 +202.5 36.75 2.502209 +203.0 36.75 3.086127 +203.5 36.75 3.639957 +204.0 36.75 3.984115 +204.5 36.75 4.028273 +205.0 36.75 4.064511 +205.5 36.75 4.383969 +206.0 36.75 4.854257 +206.5 36.75 5.203263 +207.0 36.75 5.430580 +207.5 36.75 5.626611 +208.0 36.75 5.710532 +208.5 36.75 5.690796 +209.0 36.75 5.880261 +209.5 36.75 6.543321 +210.0 36.75 7.536341 +210.5 36.75 8.513995 +211.0 36.75 9.366254 +211.5 36.75 10.036472 +212.0 36.75 10.449579 +212.5 36.75 10.588670 +213.0 36.75 10.743178 +213.5 36.75 11.240319 +214.0 36.75 11.951774 +214.5 36.75 12.523999 +215.0 36.75 12.876190 +215.5 36.75 13.089725 +216.0 36.75 13.117775 +216.5 36.75 12.960839 +217.0 36.75 12.850078 +217.5 36.75 12.975415 +218.0 36.75 13.283541 +218.5 36.75 13.493884 +219.0 36.75 13.498302 +219.5 36.75 13.300624 +220.0 36.75 12.784506 +220.5 36.75 11.931681 +221.0 36.75 11.102656 +221.5 36.75 10.715653 +222.0 36.75 10.775884 +222.5 36.75 11.010091 +223.0 36.75 11.230709 +223.5 36.75 11.368956 +224.0 36.75 11.268944 +224.5 36.75 10.883926 +225.0 36.75 10.457115 +225.5 36.75 10.312936 +226.0 36.75 10.455964 +226.5 36.75 10.625777 +227.0 36.75 10.679553 +227.5 36.75 10.566632 +228.0 36.75 10.208201 +228.5 36.75 9.690129 +229.0 36.75 9.363433 +229.5 36.75 9.570524 +230.0 36.75 10.202031 +230.5 36.75 10.875588 +231.0 36.75 11.388475 +231.5 36.75 11.730078 +232.0 36.75 11.825063 +232.5 36.75 11.639039 +233.0 36.75 11.468304 +233.5 36.75 11.591647 +234.0 36.75 11.961883 +234.5 36.75 12.306551 +235.0 36.75 12.437851 +235.5 36.75 12.330605 +236.0 36.75 12.000497 +236.5 36.75 11.497593 +237.0 36.75 11.077193 +237.5 36.75 11.001897 +238.0 36.75 11.216001 +238.5 36.75 11.422935 +239.0 36.75 11.347269 +239.5 36.75 10.914846 +240.0 36.75 10.106022 +240.5 36.75 9.019883 +241.0 36.75 7.981047 +241.5 36.75 7.251791 +242.0 36.75 6.798183 +242.5 36.75 6.281086 +243.0 36.75 5.496597 +243.5 36.75 4.470421 +244.0 36.75 3.255159 +244.5 36.75 1.922201 +245.0 36.75 0.779549 +245.5 36.75 0.169259 +246.0 36.75 0.051865 +246.5 36.75 0.059407 +247.0 36.75 -0.022487 +247.5 36.75 -0.161278 +248.0 36.75 -0.421900 +248.5 36.75 -0.940061 +249.0 36.75 -1.544441 +249.5 36.75 -1.969783 +250.0 36.75 -2.296977 +250.5 36.75 -2.745013 +251.0 36.75 -3.449931 +251.5 36.75 -4.373032 +252.0 36.75 -5.548306 +252.5 36.75 -6.993163 +253.0 36.75 -8.442867 +253.5 36.75 -9.511522 +254.0 36.75 -10.115362 +254.5 36.75 -10.483804 +255.0 36.75 -10.724799 +255.5 36.75 -10.936359 +256.0 36.75 -11.356603 +256.5 36.75 -12.045476 +257.0 36.75 -12.654955 +257.5 36.75 -12.877437 +258.0 36.75 -12.799743 +258.5 36.75 -12.782272 +259.0 36.75 -12.945196 +259.5 36.75 -13.329085 +260.0 36.75 -14.053659 +260.5 36.75 -15.167025 +261.0 36.75 -16.408651 +261.5 36.75 -17.354686 +262.0 36.75 -17.928110 +262.5 36.75 -18.385977 +263.0 36.75 -18.934072 +263.5 36.75 -19.571168 +264.0 36.75 -20.385830 +264.5 36.75 -21.362387 +265.0 36.75 -22.239710 +265.5 36.75 -22.721946 +266.0 36.75 -22.872956 +266.5 36.75 -23.018706 +267.0 36.75 -23.260390 +267.5 36.75 -23.519999 +268.0 36.75 -23.824413 +268.5 36.75 -24.274565 +269.0 36.75 -24.725371 +269.5 36.75 -24.917307 +270.0 36.75 -24.789349 +270.5 36.75 -24.515969 +271.0 36.75 -24.203357 +271.5 36.75 -23.851753 +272.0 36.75 -23.528827 +272.5 36.75 -23.345561 +273.0 36.75 -23.183352 +273.5 36.75 -22.846866 +274.0 36.75 -22.372559 +274.5 36.75 -21.978921 +275.0 36.75 -21.739559 +275.5 36.75 -21.606804 +276.0 36.75 -21.625938 +276.5 36.75 -21.794121 +277.0 36.75 -21.881107 +277.5 36.75 -21.607271 +278.0 36.75 -20.911318 +278.5 36.75 -19.938520 +279.0 36.75 -18.682010 +279.5 36.75 -16.965385 +280.0 36.75 -14.989069 +30.0 37.75 2.256239 +30.5 37.75 0.109323 +31.0 37.75 -1.633353 +31.5 37.75 -2.980643 +32.0 37.75 -4.137918 +32.5 37.75 -5.147706 +33.0 37.75 -6.019033 +33.5 37.75 -6.766928 +34.0 37.75 -7.546509 +34.5 37.75 -8.504617 +35.0 37.75 -9.548539 +35.5 37.75 -10.586351 +36.0 37.75 -11.593072 +36.5 37.75 -12.575581 +37.0 37.75 -13.399462 +37.5 37.75 -13.943513 +38.0 37.75 -14.336422 +38.5 37.75 -14.721350 +39.0 37.75 -15.107263 +39.5 37.75 -15.420238 +40.0 37.75 -15.654493 +40.5 37.75 -15.869898 +41.0 37.75 -16.034824 +41.5 37.75 -16.044250 +42.0 37.75 -16.109367 +42.5 37.75 -16.374380 +43.0 37.75 -16.881000 +43.5 37.75 -17.607409 +44.0 37.75 -18.551419 +44.5 37.75 -19.661865 +45.0 37.75 -20.661027 +45.5 37.75 -21.392579 +46.0 37.75 -21.992915 +46.5 37.75 -22.673812 +47.0 37.75 -23.342075 +47.5 37.75 -23.853583 +48.0 37.75 -24.186135 +48.5 37.75 -24.357943 +49.0 37.75 -24.288285 +49.5 37.75 -23.973376 +50.0 37.75 -23.605775 +50.5 37.75 -23.472616 +51.0 37.75 -23.559252 +51.5 37.75 -23.714389 +52.0 37.75 -23.921874 +52.5 37.75 -24.125879 +53.0 37.75 -24.131242 +53.5 37.75 -23.818520 +54.0 37.75 -23.384220 +54.5 37.75 -23.026880 +55.0 37.75 -22.738794 +55.5 37.75 -22.395619 +56.0 37.75 -22.036957 +56.5 37.75 -21.562551 +57.0 37.75 -20.797988 +57.5 37.75 -19.668475 +58.0 37.75 -18.394254 +58.5 37.75 -17.232329 +59.0 37.75 -16.309439 +59.5 37.75 -15.626913 +60.0 37.75 -15.177516 +60.5 37.75 -14.818361 +61.0 37.75 -14.255497 +61.5 37.75 -13.378228 +62.0 37.75 -12.483318 +62.5 37.75 -11.844993 +63.0 37.75 -11.390644 +63.5 37.75 -10.944528 +64.0 37.75 -10.518525 +64.5 37.75 -10.074541 +65.0 37.75 -9.369036 +65.5 37.75 -8.319524 +66.0 37.75 -7.199660 +66.5 37.75 -6.240302 +67.0 37.75 -5.454491 +67.5 37.75 -4.816700 +68.0 37.75 -4.422095 +68.5 37.75 -4.199603 +69.0 37.75 -3.835635 +69.5 37.75 -3.247867 +70.0 37.75 -2.625402 +70.5 37.75 -2.192873 +71.0 37.75 -2.039242 +71.5 37.75 -2.172404 +72.0 37.75 -2.640559 +72.5 37.75 -3.360365 +73.0 37.75 -3.998488 +73.5 37.75 -4.309205 +74.0 37.75 -4.361467 +74.5 37.75 -4.378081 +75.0 37.75 -4.439411 +75.5 37.75 -4.555335 +76.0 37.75 -4.747818 +76.5 37.75 -4.971487 +77.0 37.75 -5.071614 +77.5 37.75 -4.996861 +78.0 37.75 -4.944872 +78.5 37.75 -5.133151 +79.0 37.75 -5.537500 +79.5 37.75 -6.077166 +80.0 37.75 -6.705961 +80.5 37.75 -7.338709 +81.0 37.75 -7.682817 +81.5 37.75 -7.567335 +82.0 37.75 -7.221986 +82.5 37.75 -6.918339 +83.0 37.75 -6.729240 +83.5 37.75 -6.523788 +84.0 37.75 -6.247862 +84.5 37.75 -5.850706 +85.0 37.75 -5.177132 +85.5 37.75 -4.186917 +86.0 37.75 -3.201000 +86.5 37.75 -2.465889 +87.0 37.75 -2.051345 +87.5 37.75 -1.931760 +88.0 37.75 -2.076340 +88.5 37.75 -2.299282 +89.0 37.75 -2.266194 +89.5 37.75 -1.830354 +90.0 37.75 -1.218047 +90.5 37.75 -0.707275 +91.0 37.75 -0.339574 +91.5 37.75 -0.078015 +92.0 37.75 0.083281 +92.5 37.75 0.167962 +93.0 37.75 0.426979 +93.5 37.75 0.918974 +94.0 37.75 1.432441 +94.5 37.75 1.753497 +95.0 37.75 1.884781 +95.5 37.75 1.811959 +96.0 37.75 1.536749 +96.5 37.75 1.198578 +97.0 37.75 1.068839 +97.5 37.75 1.181688 +98.0 37.75 1.257666 +98.5 37.75 1.121139 +99.0 37.75 0.807682 +99.5 37.75 0.411525 +100.0 37.75 -0.031690 +100.5 37.75 -0.380397 +101.0 37.75 -0.354231 +101.5 37.75 0.136049 +102.0 37.75 0.785092 +102.5 37.75 1.271126 +103.0 37.75 1.511508 +103.5 37.75 1.514533 +104.0 37.75 1.233433 +104.5 37.75 0.818904 +105.0 37.75 0.662171 +105.5 37.75 0.992399 +106.0 37.75 1.589799 +106.5 37.75 2.136638 +107.0 37.75 2.589486 +107.5 37.75 2.999035 +108.0 37.75 3.330956 +108.5 37.75 3.712195 +109.0 37.75 4.435120 +109.5 37.75 5.504939 +110.0 37.75 6.600015 +110.5 37.75 7.370678 +111.0 37.75 7.794261 +111.5 37.75 8.032694 +112.0 37.75 8.070373 +112.5 37.75 7.980693 +113.0 37.75 8.041047 +113.5 37.75 8.376431 +114.0 37.75 8.801095 +114.5 37.75 8.998382 +115.0 37.75 8.919153 +115.5 37.75 8.719947 +116.0 37.75 8.457302 +116.5 37.75 8.254191 +117.0 37.75 8.256727 +117.5 37.75 8.454206 +118.0 37.75 8.565285 +118.5 37.75 8.292465 +119.0 37.75 7.694645 +119.5 37.75 6.938119 +120.0 37.75 6.026870 +120.5 37.75 5.048851 +121.0 37.75 4.256197 +121.5 37.75 3.862758 +122.0 37.75 3.669732 +122.5 37.75 3.373537 +123.0 37.75 2.927880 +123.5 37.75 2.491766 +124.0 37.75 2.018645 +124.5 37.75 1.540675 +125.0 37.75 1.310195 +125.5 37.75 1.404929 +126.0 37.75 1.527504 +126.5 37.75 1.371888 +127.0 37.75 0.945781 +127.5 37.75 0.389341 +128.0 37.75 -0.203364 +128.5 37.75 -0.712191 +129.0 37.75 -0.827596 +129.5 37.75 -0.444090 +130.0 37.75 0.080166 +130.5 37.75 0.478530 +131.0 37.75 0.802710 +131.5 37.75 1.158964 +132.0 37.75 1.460028 +132.5 37.75 1.684485 +133.0 37.75 2.002652 +133.5 37.75 2.542954 +134.0 37.75 3.109895 +134.5 37.75 3.432693 +135.0 37.75 3.455123 +135.5 37.75 3.255862 +136.0 37.75 2.745373 +136.5 37.75 2.001543 +137.0 37.75 1.373295 +137.5 37.75 1.025171 +138.0 37.75 0.732447 +138.5 37.75 0.268061 +139.0 37.75 -0.333766 +139.5 37.75 -0.929112 +140.0 37.75 -1.524982 +140.5 37.75 -2.128375 +141.0 37.75 -2.456500 +141.5 37.75 -2.395562 +142.0 37.75 -2.267002 +142.5 37.75 -2.420331 +143.0 37.75 -2.908257 +143.5 37.75 -3.716044 +144.0 37.75 -4.884723 +144.5 37.75 -6.279434 +145.0 37.75 -7.551040 +145.5 37.75 -8.396432 +146.0 37.75 -8.910896 +146.5 37.75 -9.302516 +147.0 37.75 -9.583436 +147.5 37.75 -9.752588 +148.0 37.75 -9.977300 +148.5 37.75 -10.228912 +149.0 37.75 -10.255900 +149.5 37.75 -9.935166 +150.0 37.75 -9.513787 +150.5 37.75 -9.358846 +151.0 37.75 -9.506158 +151.5 37.75 -9.778371 +152.0 37.75 -10.157663 +152.5 37.75 -10.423089 +153.0 37.75 -10.178806 +153.5 37.75 -9.326268 +154.0 37.75 -8.262476 +154.5 37.75 -7.378148 +155.0 37.75 -6.731935 +155.5 37.75 -6.212294 +156.0 37.75 -5.796198 +156.5 37.75 -5.419294 +157.0 37.75 -4.749925 +157.5 37.75 -3.588421 +158.0 37.75 -2.185035 +158.5 37.75 -0.933215 +159.0 37.75 -0.019365 +159.5 37.75 0.549764 +160.0 37.75 0.734868 +160.5 37.75 0.691615 +161.0 37.75 0.875936 +161.5 37.75 1.495269 +162.0 37.75 2.229874 +162.5 37.75 2.678047 +163.0 37.75 2.825510 +163.5 37.75 1.533421 +164.0 37.75 0.831157 +164.5 37.75 0.370218 +165.0 37.75 0.227960 +165.5 37.75 0.496893 +166.0 37.75 0.855188 +166.5 37.75 0.955072 +167.0 37.75 0.806359 +167.5 37.75 0.591533 +168.0 37.75 0.289142 +168.5 37.75 -0.212683 +169.0 37.75 -0.722897 +169.5 37.75 -0.928276 +170.0 37.75 -0.921235 +170.5 37.75 -1.011417 +171.0 37.75 -1.256093 +171.5 37.75 -1.582734 +172.0 37.75 -2.022211 +172.5 37.75 -2.504754 +173.0 37.75 -2.738572 +173.5 37.75 -2.538373 +174.0 37.75 -2.156756 +174.5 37.75 -1.942687 +175.0 37.75 -1.893954 +175.5 37.75 -1.831088 +176.0 37.75 -1.863681 +176.5 37.75 -2.024187 +177.0 37.75 -2.101551 +177.5 37.75 -1.977694 +178.0 37.75 -1.864239 +178.5 37.75 -1.957504 +179.0 37.75 -2.178542 +179.5 37.75 -2.410863 +180.0 37.75 -2.831492 +180.5 37.75 -3.486030 +181.0 37.75 -4.047392 +181.5 37.75 -4.167173 +182.0 37.75 -4.043758 +182.5 37.75 -3.941494 +183.0 37.75 -3.902033 +183.5 37.75 -3.917720 +184.0 37.75 -4.071728 +184.5 37.75 -4.373383 +185.0 37.75 -4.558350 +185.5 37.75 -4.308561 +186.0 37.75 -3.707869 +186.5 37.75 -2.983298 +187.0 37.75 -2.165074 +187.5 37.75 -1.300294 +188.0 37.75 -0.603927 +188.5 37.75 -0.060359 +189.0 37.75 0.603211 +189.5 37.75 1.516535 +190.0 37.75 2.447346 +190.5 37.75 3.199009 +191.0 37.75 3.710650 +191.5 37.75 3.921362 +192.0 37.75 3.731817 +192.5 37.75 3.092766 +193.0 37.75 2.360813 +193.5 37.75 1.917893 +194.0 37.75 1.803394 +194.5 37.75 1.821905 +195.0 37.75 1.877590 +195.5 37.75 1.951626 +196.0 37.75 1.972002 +196.5 37.75 1.905593 +197.0 37.75 1.990804 +197.5 37.75 2.485363 +198.0 37.75 3.262789 +198.5 37.75 3.984900 +199.0 37.75 4.537142 +199.5 37.75 4.913746 +200.0 37.75 4.986329 +200.5 37.75 4.740941 +201.0 37.75 4.479862 +201.5 37.75 4.620895 +202.0 37.75 5.186710 +202.5 37.75 5.903307 +203.0 37.75 6.622984 +203.5 37.75 7.276347 +204.0 37.75 7.705885 +204.5 37.75 7.838510 +205.0 37.75 7.972007 +205.5 37.75 8.388029 +206.0 37.75 8.942406 +206.5 37.75 9.337582 +207.0 37.75 9.550404 +207.5 37.75 9.698671 +208.0 37.75 9.688405 +208.5 37.75 9.464820 +209.0 37.75 9.327094 +209.5 37.75 9.640949 +210.0 37.75 10.357176 +210.5 37.75 11.159984 +211.0 37.75 11.882177 +211.5 37.75 12.445628 +212.0 37.75 12.764228 +212.5 37.75 12.883281 +213.0 37.75 13.043003 +213.5 37.75 13.494195 +214.0 37.75 14.135535 +214.5 37.75 14.621336 +215.0 37.75 14.835884 +215.5 37.75 14.852733 +216.0 37.75 14.679120 +216.5 37.75 14.328267 +217.0 37.75 14.018119 +217.5 37.75 14.043060 +218.0 37.75 14.361396 +218.5 37.75 14.613711 +219.0 37.75 14.650011 +219.5 37.75 14.430953 +220.0 37.75 13.903500 +220.5 37.75 13.088971 +221.0 37.75 12.295426 +221.5 37.75 11.912367 +222.0 37.75 11.927929 +222.5 37.75 12.088116 +223.0 37.75 12.186444 +223.5 37.75 12.192856 +224.0 37.75 11.975504 +224.5 37.75 11.425121 +225.0 37.75 10.767009 +225.5 37.75 10.388871 +226.0 37.75 10.310673 +226.5 37.75 10.275718 +227.0 37.75 10.084912 +227.5 37.75 9.701757 +228.0 37.75 9.075318 +228.5 37.75 8.311127 +229.0 37.75 7.767543 +229.5 37.75 7.778597 +230.0 37.75 8.235217 +230.5 37.75 8.731480 +231.0 37.75 9.101425 +231.5 37.75 9.296510 +232.0 37.75 9.280251 +232.5 37.75 8.977558 +233.0 37.75 8.612929 +233.5 37.75 8.502602 +234.0 37.75 8.672477 +234.5 37.75 8.890345 +235.0 37.75 8.963557 +235.5 37.75 8.830892 +236.0 37.75 8.432486 +236.5 37.75 7.815204 +237.0 37.75 7.251405 +237.5 37.75 7.016726 +238.0 37.75 7.049611 +238.5 37.75 7.051092 +239.0 37.75 6.823908 +239.5 37.75 6.356925 +240.0 37.75 5.566446 +240.5 37.75 4.467326 +241.0 37.75 3.328511 +241.5 37.75 2.492114 +242.0 37.75 1.946938 +242.5 37.75 1.322623 +243.0 37.75 0.445999 +243.5 37.75 -0.666319 +244.0 37.75 -1.997623 +244.5 37.75 -3.490808 +245.0 37.75 -4.807750 +245.5 37.75 -5.592587 +246.0 37.75 -5.932487 +246.5 37.75 -6.174944 +247.0 37.75 -6.535558 +247.5 37.75 -6.982305 +248.0 37.75 -7.576949 +248.5 37.75 -8.440333 +249.0 37.75 -9.413757 +249.5 37.75 -10.194459 +250.0 37.75 -10.828672 +250.5 37.75 -11.543822 +251.0 37.75 -12.469746 +251.5 37.75 -13.618080 +252.0 37.75 -15.023055 +252.5 37.75 -16.644032 +253.0 37.75 -18.188382 +253.5 37.75 -19.314828 +254.0 37.75 -19.997483 +254.5 37.75 -20.481420 +255.0 37.75 -20.972121 +255.5 37.75 -21.546266 +256.0 37.75 -22.362907 +256.5 37.75 -23.371566 +257.0 37.75 -24.266530 +257.5 37.75 -24.718418 +258.0 37.75 -24.826129 +258.5 37.75 -24.960763 +259.0 37.75 -25.291553 +259.5 37.75 -25.794902 +260.0 37.75 -26.546978 +260.5 37.75 -27.604749 +261.0 37.75 -28.758418 +261.5 37.75 -29.669815 +262.0 37.75 -30.316442 +262.5 37.75 -30.905818 +263.0 37.75 -31.582100 +263.5 37.75 -32.350932 +264.0 37.75 -33.280804 +264.5 37.75 -34.423472 +265.0 37.75 -35.431051 +265.5 37.75 -35.979748 +266.0 37.75 -36.163742 +266.5 37.75 -36.294687 +267.0 37.75 -36.545010 +267.5 37.75 -36.914682 +268.0 37.75 -37.406424 +268.5 37.75 -38.032188 +269.0 37.75 -38.617326 +269.5 37.75 -38.881401 +270.0 37.75 -38.832465 +270.5 37.75 -38.691200 +271.0 37.75 -38.545581 +271.5 37.75 -38.386241 +272.0 37.75 -38.223992 +272.5 37.75 -38.097488 +273.0 37.75 -37.900411 +273.5 37.75 -37.510293 +274.0 37.75 -37.067921 +274.5 37.75 -36.761788 +275.0 37.75 -36.513921 +275.5 37.75 -36.259639 +276.0 37.75 -36.116746 +276.5 37.75 -36.169407 +277.0 37.75 -36.177077 +277.5 37.75 -35.783948 +278.0 37.75 -34.866790 +278.5 37.75 -33.555332 +279.0 37.75 -31.824917 +279.5 37.75 -29.488201 +280.0 37.75 -26.906770 +30.0 38.75 3.026742 +30.5 38.75 0.631655 +31.0 38.75 -1.372237 +31.5 38.75 -2.990088 +32.0 38.75 -4.438432 +32.5 38.75 -5.771710 +33.0 38.75 -6.896555 +33.5 38.75 -7.849675 +34.0 38.75 -8.823160 +34.5 38.75 -9.939045 +35.0 38.75 -11.138004 +35.5 38.75 -12.308246 +36.0 38.75 -13.497505 +36.5 38.75 -14.665943 +37.0 38.75 -15.684759 +37.5 38.75 -16.449600 +38.0 38.75 -17.065111 +38.5 38.75 -17.670721 +39.0 38.75 -18.312224 +39.5 38.75 -18.933601 +40.0 38.75 -19.538752 +40.5 38.75 -20.050620 +41.0 38.75 -20.306353 +41.5 38.75 -20.292798 +42.0 38.75 -20.210561 +42.5 38.75 -20.278785 +43.0 38.75 -20.542901 +43.5 38.75 -21.018364 +44.0 38.75 -21.747500 +44.5 38.75 -22.669948 +45.0 38.75 -23.582728 +45.5 38.75 -24.355758 +46.0 38.75 -25.114334 +46.5 38.75 -25.972515 +47.0 38.75 -26.794212 +47.5 38.75 -27.440298 +48.0 38.75 -27.913891 +48.5 38.75 -28.216624 +49.0 38.75 -28.279547 +49.5 38.75 -28.066567 +50.0 38.75 -27.788709 +50.5 38.75 -27.716059 +51.0 38.75 -27.835284 +51.5 38.75 -28.011937 +52.0 38.75 -28.145560 +52.5 38.75 -28.189886 +53.0 38.75 -28.013225 +53.5 38.75 -27.590493 +54.0 38.75 -27.087437 +54.5 38.75 -26.709724 +55.0 38.75 -26.463266 +55.5 38.75 -26.295169 +56.0 38.75 -26.188058 +56.5 38.75 -26.011674 +57.0 38.75 -25.475981 +57.5 38.75 -24.500909 +58.0 38.75 -23.365005 +58.5 38.75 -22.377698 +59.0 38.75 -21.593304 +59.5 38.75 -20.911138 +60.0 38.75 -20.361888 +60.5 38.75 -19.844227 +61.0 38.75 -19.152958 +61.5 38.75 -18.182335 +62.0 38.75 -17.165059 +62.5 38.75 -16.298314 +63.0 38.75 -15.616702 +63.5 38.75 -15.006640 +64.0 38.75 -14.484573 +64.5 38.75 -14.036908 +65.0 38.75 -13.443024 +65.5 38.75 -12.587918 +66.0 38.75 -11.670150 +66.5 38.75 -10.909818 +67.0 38.75 -10.288660 +67.5 38.75 -9.718605 +68.0 38.75 -9.285148 +68.5 38.75 -8.972473 +69.0 38.75 -8.515792 +69.5 38.75 -7.804773 +70.0 38.75 -7.069861 +70.5 38.75 -6.596496 +71.0 38.75 -6.390986 +71.5 38.75 -6.407328 +72.0 38.75 -6.692808 +72.5 38.75 -7.214476 +73.0 38.75 -7.732175 +73.5 38.75 -8.086304 +74.0 38.75 -8.329333 +74.5 38.75 -8.533828 +75.0 38.75 -8.646393 +75.5 38.75 -8.622435 +76.0 38.75 -8.565105 +76.5 38.75 -8.528507 +77.0 38.75 -8.456510 +77.5 38.75 -8.239233 +78.0 38.75 -8.036210 +78.5 38.75 -8.078659 +79.0 38.75 -8.407533 +79.5 38.75 -8.926275 +80.0 38.75 -9.579171 +80.5 38.75 -10.250144 +81.0 38.75 -10.613895 +81.5 38.75 -10.498452 +82.0 38.75 -10.113090 +82.5 38.75 -9.754381 +83.0 38.75 -9.514242 +83.5 38.75 -9.314433 +84.0 38.75 -9.065853 +84.5 38.75 -8.667535 +85.0 38.75 -7.968836 +85.5 38.75 -7.011721 +86.0 38.75 -6.049165 +86.5 38.75 -5.317259 +87.0 38.75 -4.876725 +87.5 38.75 -4.739206 +88.0 38.75 -4.964314 +88.5 38.75 -5.402304 +89.0 38.75 -5.620716 +89.5 38.75 -5.408637 +90.0 38.75 -4.997124 +90.5 38.75 -4.694707 +91.0 38.75 -4.520724 +91.5 38.75 -4.348588 +92.0 38.75 -4.211600 +92.5 38.75 -4.126215 +93.0 38.75 -3.914786 +93.5 38.75 -3.516848 +94.0 38.75 -3.080580 +94.5 38.75 -2.785425 +95.0 38.75 -2.623384 +95.5 38.75 -2.588196 +96.0 38.75 -2.735792 +96.5 38.75 -2.972776 +97.0 38.75 -2.981750 +97.5 38.75 -2.683193 +98.0 38.75 -2.379605 +98.5 38.75 -2.249072 +99.0 38.75 -2.247712 +99.5 38.75 -2.301917 +100.0 38.75 -2.386495 +100.5 38.75 -2.360824 +101.0 38.75 -1.982834 +101.5 38.75 -1.215725 +102.0 38.75 -0.390728 +102.5 38.75 0.163032 +103.0 38.75 0.380848 +103.5 38.75 0.281513 +104.0 38.75 0.008332 +104.5 38.75 -0.272123 +105.0 38.75 -0.232051 +105.5 38.75 0.249151 +106.0 38.75 0.849655 +106.5 38.75 1.317532 +107.0 38.75 1.640393 +107.5 38.75 1.922793 +108.0 38.75 2.250742 +108.5 38.75 2.769311 +109.0 38.75 3.790011 +109.5 38.75 5.252921 +110.0 38.75 6.761474 +110.5 38.75 7.960013 +111.0 38.75 8.734198 +111.5 38.75 9.252606 +112.0 38.75 9.521630 +112.5 38.75 9.618190 +113.0 38.75 9.814074 +113.5 38.75 10.285815 +114.0 38.75 10.798245 +114.5 38.75 11.039468 +115.0 38.75 11.004341 +115.5 38.75 10.827868 +116.0 38.75 10.557486 +116.5 38.75 10.340884 +117.0 38.75 10.391934 +117.5 38.75 10.727933 +118.0 38.75 10.994385 +118.5 38.75 10.893643 +119.0 38.75 10.427919 +119.5 38.75 9.751294 +120.0 38.75 8.827472 +120.5 38.75 7.769200 +121.0 38.75 6.858287 +121.5 38.75 6.332785 +122.0 38.75 6.011646 +122.5 38.75 5.720623 +123.0 38.75 5.383642 +123.5 38.75 5.055100 +124.0 38.75 4.711415 +124.5 38.75 4.377378 +125.0 38.75 4.265653 +125.5 38.75 4.406302 +126.0 38.75 4.530441 +126.5 38.75 4.309148 +127.0 38.75 3.796534 +127.5 38.75 3.188860 +128.0 38.75 2.589790 +128.5 38.75 2.151979 +129.0 38.75 2.148308 +129.5 38.75 2.583639 +130.0 38.75 3.155716 +130.5 38.75 3.537825 +131.0 38.75 3.753029 +131.5 38.75 3.930590 +132.0 38.75 4.037943 +132.5 38.75 4.121897 +133.0 38.75 4.359831 +133.5 38.75 4.833776 +134.0 38.75 5.258843 +134.5 38.75 5.365027 +135.0 38.75 5.148596 +135.5 38.75 4.707634 +136.0 38.75 4.051657 +136.5 38.75 3.298989 +137.0 38.75 2.757377 +137.5 38.75 2.542923 +138.0 38.75 2.408190 +138.5 38.75 2.074818 +139.0 38.75 1.617568 +139.5 38.75 1.154621 +140.0 38.75 0.664070 +140.5 38.75 0.137922 +141.0 38.75 -0.094812 +141.5 38.75 0.008055 +142.0 38.75 0.144585 +142.5 38.75 0.020351 +143.0 38.75 -0.351837 +143.5 38.75 -0.951956 +144.0 38.75 -1.855193 +144.5 38.75 -2.982964 +145.0 38.75 -4.005996 +145.5 38.75 -4.671959 +146.0 38.75 -5.109316 +146.5 38.75 -5.527474 +147.0 38.75 -5.895395 +147.5 38.75 -6.222171 +148.0 38.75 -6.536489 +148.5 38.75 -6.809653 +149.0 38.75 -6.844795 +149.5 38.75 -6.519815 +150.0 38.75 -6.090953 +150.5 38.75 -5.895699 +151.0 38.75 -5.922862 +151.5 38.75 -6.027156 +152.0 38.75 -6.233715 +152.5 38.75 -6.388163 +153.0 38.75 -6.143616 +153.5 38.75 -5.285823 +154.0 38.75 -4.225583 +154.5 38.75 -3.386758 +155.0 38.75 -2.770090 +155.5 38.75 -2.240868 +156.0 38.75 -1.758539 +156.5 38.75 -1.324072 +157.0 38.75 -0.668431 +157.5 38.75 0.369242 +158.0 38.75 1.565642 +158.5 38.75 2.609003 +159.0 38.75 3.386280 +159.5 38.75 3.923301 +160.0 38.75 4.162562 +160.5 38.75 4.240758 +161.0 38.75 4.498756 +161.5 38.75 5.136526 +162.0 38.75 5.941479 +162.5 38.75 6.584108 +163.0 38.75 6.946395 +163.5 38.75 5.818840 +164.0 38.75 5.132516 +164.5 38.75 4.604645 +165.0 38.75 4.409824 +165.5 38.75 4.592808 +166.0 38.75 4.850900 +166.5 38.75 4.857498 +167.0 38.75 4.587406 +167.5 38.75 4.260590 +168.0 38.75 3.903448 +168.5 38.75 3.415209 +169.0 38.75 2.982172 +169.5 38.75 2.853234 +170.0 38.75 2.904407 +170.5 38.75 2.803046 +171.0 38.75 2.552617 +171.5 38.75 2.233157 +172.0 38.75 1.799244 +172.5 38.75 1.281315 +173.0 38.75 0.964741 +173.5 38.75 1.053728 +174.0 38.75 1.382070 +174.5 38.75 1.681960 +175.0 38.75 1.917487 +175.5 38.75 2.146369 +176.0 38.75 2.196542 +176.5 38.75 2.051009 +177.0 38.75 1.954174 +177.5 38.75 2.070977 +178.0 38.75 2.247776 +178.5 38.75 2.247484 +179.0 38.75 2.079669 +179.5 38.75 1.808975 +180.0 38.75 1.300781 +180.5 38.75 0.548097 +181.0 38.75 -0.095941 +181.5 38.75 -0.339538 +182.0 38.75 -0.301873 +182.5 38.75 -0.274708 +183.0 38.75 -0.289660 +183.5 38.75 -0.270256 +184.0 38.75 -0.328535 +184.5 38.75 -0.585612 +185.0 38.75 -0.756314 +185.5 38.75 -0.588861 +186.0 38.75 -0.176694 +186.5 38.75 0.268320 +187.0 38.75 0.743926 +187.5 38.75 1.310601 +188.0 38.75 1.888913 +188.5 38.75 2.432526 +189.0 38.75 3.089943 +189.5 38.75 4.001588 +190.0 38.75 4.997897 +190.5 38.75 5.794460 +191.0 38.75 6.246517 +191.5 38.75 6.421396 +192.0 38.75 6.216272 +192.5 38.75 5.598759 +193.0 38.75 4.931120 +193.5 38.75 4.609680 +194.0 38.75 4.614892 +194.5 38.75 4.753300 +195.0 38.75 4.907831 +195.5 38.75 5.050451 +196.0 38.75 5.055326 +196.5 38.75 4.883447 +197.0 38.75 4.809471 +197.5 38.75 5.110293 +198.0 38.75 5.640795 +198.5 38.75 6.171481 +199.0 38.75 6.568223 +199.5 38.75 6.778252 +200.0 38.75 6.674161 +200.5 38.75 6.281218 +201.0 38.75 5.948117 +201.5 38.75 6.092642 +202.0 38.75 6.734591 +202.5 38.75 7.528784 +203.0 38.75 8.341005 +203.5 38.75 9.101223 +204.0 38.75 9.678692 +204.5 38.75 9.984404 +205.0 38.75 10.225219 +205.5 38.75 10.676502 +206.0 38.75 11.250612 +206.5 38.75 11.680348 +207.0 38.75 11.926898 +207.5 38.75 12.045131 +208.0 38.75 11.947418 +208.5 38.75 11.597114 +209.0 38.75 11.260564 +209.5 38.75 11.329442 +210.0 38.75 11.807116 +210.5 38.75 12.404664 +211.0 38.75 12.925099 +211.5 38.75 13.316305 +212.0 38.75 13.495393 +212.5 38.75 13.449890 +213.0 38.75 13.439430 +213.5 38.75 13.709093 +214.0 38.75 14.153700 +214.5 38.75 14.467682 +215.0 38.75 14.557982 +215.5 38.75 14.477696 +216.0 38.75 14.201692 +216.5 38.75 13.729300 +217.0 38.75 13.308574 +217.5 38.75 13.144801 +218.0 38.75 13.158152 +218.5 38.75 13.113179 +219.0 38.75 12.895883 +219.5 38.75 12.493925 +220.0 38.75 11.799406 +220.5 38.75 10.809084 +221.0 38.75 9.867068 +221.5 38.75 9.377727 +222.0 38.75 9.321257 +222.5 38.75 9.338963 +223.0 38.75 9.266215 +223.5 38.75 9.099651 +224.0 38.75 8.727933 +224.5 38.75 8.125751 +225.0 38.75 7.509997 +225.5 38.75 7.154341 +226.0 38.75 7.035656 +226.5 38.75 6.881715 +227.0 38.75 6.582573 +227.5 38.75 6.106804 +228.0 38.75 5.431043 +228.5 38.75 4.627506 +229.0 38.75 4.008155 +229.5 38.75 3.874487 +230.0 38.75 4.209677 +230.5 38.75 4.707545 +231.0 38.75 5.115451 +231.5 38.75 5.298108 +232.0 38.75 5.182618 +232.5 38.75 4.720048 +233.0 38.75 4.138186 +233.5 38.75 3.788811 +234.0 38.75 3.717457 +234.5 38.75 3.735570 +235.0 38.75 3.706453 +235.5 38.75 3.586414 +236.0 38.75 3.263836 +236.5 38.75 2.686707 +237.0 38.75 2.073973 +237.5 38.75 1.734179 +238.0 38.75 1.671288 +238.5 38.75 1.585732 +239.0 38.75 1.316351 +239.5 38.75 0.822832 +240.0 38.75 0.029890 +240.5 38.75 -1.063862 +241.0 38.75 -2.165252 +241.5 38.75 -3.016261 +242.0 38.75 -3.633479 +242.5 38.75 -4.319850 +243.0 38.75 -5.284607 +243.5 38.75 -6.514366 +244.0 38.75 -8.025428 +244.5 38.75 -9.701992 +245.0 38.75 -11.203941 +245.5 38.75 -12.194399 +246.0 38.75 -12.764035 +246.5 38.75 -13.271928 +247.0 38.75 -13.906359 +247.5 38.75 -14.658878 +248.0 38.75 -15.538478 +248.5 38.75 -16.596121 +249.0 38.75 -17.681064 +249.5 38.75 -18.507106 +250.0 38.75 -19.122798 +250.5 38.75 -19.835586 +251.0 38.75 -20.777238 +251.5 38.75 -21.916628 +252.0 38.75 -23.263619 +252.5 38.75 -24.790607 +253.0 38.75 -26.202397 +253.5 38.75 -27.167784 +254.0 38.75 -27.751924 +254.5 38.75 -28.347106 +255.0 38.75 -29.134686 +255.5 38.75 -30.071718 +256.0 38.75 -31.206372 +256.5 38.75 -32.542441 +257.0 38.75 -33.780235 +257.5 38.75 -34.584361 +258.0 38.75 -35.008428 +258.5 38.75 -35.425550 +259.0 38.75 -35.959833 +259.5 38.75 -36.619491 +260.0 38.75 -37.465146 +260.5 38.75 -38.574268 +261.0 38.75 -39.738767 +261.5 38.75 -40.665444 +262.0 38.75 -41.356176 +262.5 38.75 -42.048649 +263.0 38.75 -42.844342 +263.5 38.75 -43.694197 +264.0 38.75 -44.660548 +264.5 38.75 -45.772345 +265.0 38.75 -46.778712 +265.5 38.75 -47.384941 +266.0 38.75 -47.620336 +266.5 38.75 -47.793526 +267.0 38.75 -48.068697 +267.5 38.75 -48.451389 +268.0 38.75 -48.992451 +268.5 38.75 -49.695602 +269.0 38.75 -50.327746 +269.5 38.75 -50.578131 +270.0 38.75 -50.431115 +270.5 38.75 -50.193684 +271.0 38.75 -50.026977 +271.5 38.75 -49.853890 +272.0 38.75 -49.692108 +272.5 38.75 -49.600362 +273.0 38.75 -49.480327 +273.5 38.75 -49.150673 +274.0 38.75 -48.726061 +274.5 38.75 -48.399685 +275.0 38.75 -48.159947 +275.5 38.75 -47.932986 +276.0 38.75 -47.760230 +276.5 38.75 -47.759020 +277.0 38.75 -47.724573 +277.5 38.75 -47.221023 +278.0 38.75 -46.069747 +278.5 38.75 -44.407395 +279.0 38.75 -42.216184 +279.5 38.75 -39.298753 +280.0 38.75 -36.180701 +30.0 39.75 -6.771020 +30.5 39.75 -9.236035 +31.0 39.75 -11.316338 +31.5 39.75 -13.011875 +32.0 39.75 -14.532459 +32.5 39.75 -15.921485 +33.0 39.75 -17.122800 +33.5 39.75 -18.101826 +34.0 39.75 -18.981796 +34.5 39.75 -19.939063 +35.0 39.75 -20.986526 +35.5 39.75 -22.067690 +36.0 39.75 -23.183719 +36.5 39.75 -24.342102 +37.0 39.75 -25.383386 +37.5 39.75 -26.161955 +38.0 39.75 -26.823737 +38.5 39.75 -27.561355 +39.0 39.75 -28.412649 +39.5 39.75 -29.318379 +40.0 39.75 -30.188320 +40.5 39.75 -30.884903 +41.0 39.75 -31.212248 +41.5 39.75 -31.144638 +42.0 39.75 -30.945695 +42.5 39.75 -30.821919 +43.0 39.75 -30.832053 +43.5 39.75 -31.016524 +44.0 39.75 -31.423838 +44.5 39.75 -31.988142 +45.0 39.75 -32.565450 +45.5 39.75 -33.082034 +46.0 39.75 -33.670718 +46.5 39.75 -34.414438 +47.0 39.75 -35.229000 +47.5 39.75 -35.897903 +48.0 39.75 -36.380567 +48.5 39.75 -36.715669 +49.0 39.75 -36.771013 +49.5 39.75 -36.513149 +50.0 39.75 -36.176752 +50.5 39.75 -35.975254 +51.0 39.75 -35.910685 +51.5 39.75 -35.868989 +52.0 39.75 -35.850399 +52.5 39.75 -35.790780 +53.0 39.75 -35.503321 +53.5 39.75 -34.920622 +54.0 39.75 -34.296206 +54.5 39.75 -33.881576 +55.0 39.75 -33.662742 +55.5 39.75 -33.585730 +56.0 39.75 -33.580564 +56.5 39.75 -33.537877 +57.0 39.75 -33.207785 +57.5 39.75 -32.498629 +58.0 39.75 -31.640293 +58.5 39.75 -30.890420 +59.0 39.75 -30.273989 +59.5 39.75 -29.682562 +60.0 39.75 -29.128124 +60.5 39.75 -28.588718 +61.0 39.75 -27.830864 +61.5 39.75 -26.759694 +62.0 39.75 -25.577108 +62.5 39.75 -24.555490 +63.0 39.75 -23.713441 +63.5 39.75 -22.977343 +64.0 39.75 -22.380718 +64.5 39.75 -21.829446 +65.0 39.75 -21.117074 +65.5 39.75 -20.167867 +66.0 39.75 -19.191186 +66.5 39.75 -18.363103 +67.0 39.75 -17.638431 +67.5 39.75 -16.989116 +68.0 39.75 -16.491081 +68.5 39.75 -16.113410 +69.0 39.75 -15.642622 +69.5 39.75 -14.953135 +70.0 39.75 -14.241327 +70.5 39.75 -13.770066 +71.0 39.75 -13.581887 +71.5 39.75 -13.601481 +72.0 39.75 -13.881105 +72.5 39.75 -14.378246 +73.0 39.75 -14.823738 +73.5 39.75 -15.070948 +74.0 39.75 -15.256870 +74.5 39.75 -15.479201 +75.0 39.75 -15.659789 +75.5 39.75 -15.702794 +76.0 39.75 -15.659726 +76.5 39.75 -15.607653 +77.0 39.75 -15.434267 +77.5 39.75 -15.045376 +78.0 39.75 -14.637180 +78.5 39.75 -14.454241 +79.0 39.75 -14.559623 +79.5 39.75 -14.897502 +80.0 39.75 -15.371358 +80.5 39.75 -15.876564 +81.0 39.75 -16.127254 +81.5 39.75 -15.896088 +82.0 39.75 -15.325517 +82.5 39.75 -14.722675 +83.0 39.75 -14.242150 +83.5 39.75 -13.879833 +84.0 39.75 -13.599858 +84.5 39.75 -13.233786 +85.0 39.75 -12.570241 +85.5 39.75 -11.588930 +86.0 39.75 -10.567899 +86.5 39.75 -9.777911 +87.0 39.75 -9.267144 +87.5 39.75 -9.050271 +88.0 39.75 -9.167190 +88.5 39.75 -9.468178 +89.0 39.75 -9.593222 +89.5 39.75 -9.383766 +90.0 39.75 -9.015289 +90.5 39.75 -8.684437 +91.0 39.75 -8.406737 +91.5 39.75 -8.134745 +92.0 39.75 -7.917409 +92.5 39.75 -7.792608 +93.0 39.75 -7.603436 +93.5 39.75 -7.206248 +94.0 39.75 -6.786445 +94.5 39.75 -6.481411 +95.0 39.75 -6.306022 +95.5 39.75 -6.265170 +96.0 39.75 -6.390918 +96.5 39.75 -6.538813 +97.0 39.75 -6.412977 +97.5 39.75 -5.923933 +98.0 39.75 -5.359055 +98.5 39.75 -4.989230 +99.0 39.75 -4.749405 +99.5 39.75 -4.521578 +100.0 39.75 -4.311629 +100.5 39.75 -4.007409 +101.0 39.75 -3.378436 +101.5 39.75 -2.387280 +102.0 39.75 -1.309420 +102.5 39.75 -0.488988 +103.0 39.75 -0.023586 +103.5 39.75 0.185789 +104.0 39.75 0.223801 +104.5 39.75 0.236674 +105.0 39.75 0.507308 +105.5 39.75 1.109792 +106.0 39.75 1.777545 +106.5 39.75 2.236134 +107.0 39.75 2.530484 +107.5 39.75 2.775317 +108.0 39.75 3.033243 +108.5 39.75 3.490134 +109.0 39.75 4.443223 +109.5 39.75 5.904317 +110.0 39.75 7.467220 +110.5 39.75 8.729414 +111.0 39.75 9.636882 +111.5 39.75 10.297361 +112.0 39.75 10.669778 +112.5 39.75 10.846829 +113.0 39.75 11.162448 +113.5 39.75 11.841509 +114.0 39.75 12.677955 +114.5 39.75 13.289777 +115.0 39.75 13.529816 +115.5 39.75 13.499703 +116.0 39.75 13.297844 +116.5 39.75 13.088554 +117.0 39.75 13.182120 +117.5 39.75 13.638032 +118.0 39.75 14.091961 +118.5 39.75 14.225740 +119.0 39.75 14.020214 +119.5 39.75 13.585565 +120.0 39.75 12.898469 +120.5 39.75 12.049576 +121.0 39.75 11.306680 +121.5 39.75 10.866576 +122.0 39.75 10.585733 +122.5 39.75 10.283679 +123.0 39.75 10.001718 +123.5 39.75 9.793947 +124.0 39.75 9.598278 +124.5 39.75 9.375558 +125.0 39.75 9.295747 +125.5 39.75 9.471033 +126.0 39.75 9.663115 +126.5 39.75 9.589287 +127.0 39.75 9.264614 +127.5 39.75 8.847129 +128.0 39.75 8.433906 +128.5 39.75 8.197017 +129.0 39.75 8.393202 +129.5 39.75 9.034349 +130.0 39.75 9.764136 +130.5 39.75 10.232205 +131.0 39.75 10.450590 +131.5 39.75 10.551468 +132.0 39.75 10.468607 +132.5 39.75 10.289427 +133.0 39.75 10.301307 +133.5 39.75 10.637810 +134.0 39.75 11.029885 +134.5 39.75 11.150709 +135.0 39.75 10.941756 +135.5 39.75 10.506636 +136.0 39.75 9.864573 +136.5 39.75 9.134759 +137.0 39.75 8.687176 +137.5 39.75 8.630828 +138.0 39.75 8.690777 +138.5 39.75 8.573916 +139.0 39.75 8.337037 +139.5 39.75 8.139355 +140.0 39.75 7.912402 +140.5 39.75 7.642256 +141.0 39.75 7.559940 +141.5 39.75 7.779048 +142.0 39.75 8.017686 +142.5 39.75 7.970194 +143.0 39.75 7.634650 +143.5 39.75 7.082920 +144.0 39.75 6.306186 +144.5 39.75 5.415591 +145.0 39.75 4.680480 +145.5 39.75 4.267592 +146.0 39.75 4.048187 +146.5 39.75 3.769485 +147.0 39.75 3.409392 +147.5 39.75 3.030391 +148.0 39.75 2.622766 +148.5 39.75 2.231152 +149.0 39.75 2.119168 +149.5 39.75 2.384120 +150.0 39.75 2.751521 +150.5 39.75 2.981448 +151.0 39.75 3.113471 +151.5 39.75 3.248425 +152.0 39.75 3.280174 +152.5 39.75 3.285688 +153.0 39.75 3.633808 +153.5 39.75 4.496837 +154.0 39.75 5.553980 +154.5 39.75 6.390948 +155.0 39.75 6.981193 +155.5 39.75 7.397518 +156.0 39.75 7.717201 +156.5 39.75 8.034515 +157.0 39.75 8.569375 +157.5 39.75 9.411274 +158.0 39.75 10.323789 +158.5 39.75 11.074282 +159.0 39.75 11.620946 +159.5 39.75 12.084182 +160.0 39.75 12.414024 +160.5 39.75 12.682913 +161.0 39.75 13.138372 +161.5 39.75 13.943953 +162.0 39.75 14.903632 +162.5 39.75 15.739799 +163.0 39.75 16.320819 +163.5 39.75 15.267065 +164.0 39.75 14.433018 +164.5 39.75 13.721892 +165.0 39.75 13.352356 +165.5 39.75 13.409239 +166.0 39.75 13.633667 +166.5 39.75 13.693631 +167.0 39.75 13.551143 +167.5 39.75 13.320809 +168.0 39.75 12.982528 +168.5 39.75 12.516343 +169.0 39.75 12.143874 +169.5 39.75 12.018061 +170.0 39.75 11.968026 +170.5 39.75 11.737657 +171.0 39.75 11.334833 +171.5 39.75 10.961737 +172.0 39.75 10.560702 +172.5 39.75 10.083816 +173.0 39.75 9.784866 +173.5 39.75 9.884839 +174.0 39.75 10.267060 +174.5 39.75 10.632456 +175.0 39.75 10.933312 +175.5 39.75 11.185704 +176.0 39.75 11.221377 +176.5 39.75 11.029395 +177.0 39.75 10.903345 +177.5 39.75 11.039728 +178.0 39.75 11.254572 +178.5 39.75 11.252767 +179.0 39.75 11.018518 +179.5 39.75 10.649791 +180.0 39.75 10.048129 +180.5 39.75 9.233395 +181.0 39.75 8.540425 +181.5 39.75 8.189253 +182.0 39.75 8.090131 +182.5 39.75 8.021528 +183.0 39.75 8.011445 +183.5 39.75 8.127466 +184.0 39.75 8.185382 +184.5 39.75 8.039849 +185.0 39.75 7.943533 +185.5 39.75 8.169382 +186.0 39.75 8.599292 +186.5 39.75 8.992548 +187.0 39.75 9.356676 +187.5 39.75 9.744728 +188.0 39.75 10.101251 +188.5 39.75 10.386093 +189.0 39.75 10.741594 +189.5 39.75 11.377579 +190.0 39.75 12.179046 +190.5 39.75 12.799334 +191.0 39.75 13.144392 +191.5 39.75 13.252594 +192.0 39.75 13.004375 +192.5 39.75 12.385642 +193.0 39.75 11.788164 +193.5 39.75 11.627474 +194.0 39.75 11.839483 +194.5 39.75 12.105116 +195.0 39.75 12.246046 +195.5 39.75 12.195068 +196.0 39.75 11.870509 +196.5 39.75 11.363137 +197.0 39.75 11.011325 +197.5 39.75 11.114779 +198.0 39.75 11.537713 +198.5 39.75 11.908169 +199.0 39.75 12.069427 +199.5 39.75 12.026927 +200.0 39.75 11.739548 +200.5 39.75 11.274581 +201.0 39.75 11.027292 +201.5 39.75 11.312950 +202.0 39.75 12.045488 +202.5 39.75 12.871145 +203.0 39.75 13.649834 +203.5 39.75 14.351199 +204.0 39.75 14.857484 +204.5 39.75 15.093868 +205.0 39.75 15.250232 +205.5 39.75 15.525934 +206.0 39.75 15.849376 +206.5 39.75 16.042943 +207.0 39.75 16.092866 +207.5 39.75 16.057669 +208.0 39.75 15.836502 +208.5 39.75 15.362352 +209.0 39.75 14.903874 +209.5 39.75 14.789061 +210.0 39.75 15.055339 +210.5 39.75 15.467674 +211.0 39.75 15.848625 +211.5 39.75 16.117495 +212.0 39.75 16.117013 +212.5 39.75 15.844790 +213.0 39.75 15.573304 +213.5 39.75 15.578943 +214.0 39.75 15.793503 +214.5 39.75 15.940882 +215.0 39.75 15.917684 +215.5 39.75 15.711704 +216.0 39.75 15.244248 +216.5 39.75 14.498831 +217.0 39.75 13.719500 +217.5 39.75 13.173239 +218.0 39.75 12.783051 +218.5 39.75 12.316782 +219.0 39.75 11.644358 +219.5 39.75 10.794257 +220.0 39.75 9.688716 +220.5 39.75 8.353749 +221.0 39.75 7.105544 +221.5 39.75 6.283800 +222.0 39.75 5.896486 +222.5 39.75 5.632565 +223.0 39.75 5.346277 +223.5 39.75 5.024505 +224.0 39.75 4.579725 +224.5 39.75 3.959684 +225.0 39.75 3.375740 +225.5 39.75 3.068567 +226.0 39.75 2.958841 +226.5 39.75 2.748731 +227.0 39.75 2.331016 +227.5 39.75 1.752919 +228.0 39.75 1.025683 +228.5 39.75 0.154371 +229.0 39.75 -0.600590 +229.5 39.75 -0.924789 +230.0 39.75 -0.846597 +230.5 39.75 -0.656323 +231.0 39.75 -0.539320 +231.5 39.75 -0.612270 +232.0 39.75 -1.030064 +232.5 39.75 -1.824058 +233.0 39.75 -2.653944 +233.5 39.75 -3.138847 +234.0 39.75 -3.278147 +234.5 39.75 -3.321585 +235.0 39.75 -3.398303 +235.5 39.75 -3.547535 +236.0 39.75 -3.900141 +236.5 39.75 -4.533293 +237.0 39.75 -5.204926 +237.5 39.75 -5.564790 +238.0 39.75 -5.602842 +238.5 39.75 -5.629141 +239.0 39.75 -5.804529 +239.5 39.75 -6.245958 +240.0 39.75 -7.050655 +240.5 39.75 -8.172382 +241.0 39.75 -9.379226 +241.5 39.75 -10.354953 +242.0 39.75 -11.098427 +242.5 39.75 -11.930706 +243.0 39.75 -13.040746 +243.5 39.75 -14.456376 +244.0 39.75 -16.170302 +244.5 39.75 -18.103638 +245.0 39.75 -19.889029 +245.5 39.75 -21.174005 +246.0 39.75 -21.970370 +246.5 39.75 -22.646976 +247.0 39.75 -23.465425 +247.5 39.75 -24.431987 +248.0 39.75 -25.586808 +248.5 39.75 -26.943423 +249.0 39.75 -28.228827 +249.5 39.75 -29.173747 +250.0 39.75 -29.841585 +250.5 39.75 -30.559600 +251.0 39.75 -31.485000 +251.5 39.75 -32.580126 +252.0 39.75 -33.847845 +252.5 39.75 -35.254976 +253.0 39.75 -36.571660 +253.5 39.75 -37.554560 +254.0 39.75 -38.279875 +254.5 39.75 -39.093947 +255.0 39.75 -40.122866 +255.5 39.75 -41.328283 +256.0 39.75 -42.719193 +256.5 39.75 -44.294139 +257.0 39.75 -45.800644 +257.5 39.75 -46.930942 +258.0 39.75 -47.723747 +258.5 39.75 -48.491980 +259.0 39.75 -49.384337 +259.5 39.75 -50.360697 +260.0 39.75 -51.497259 +260.5 39.75 -52.884016 +261.0 39.75 -54.334294 +261.5 39.75 -55.520099 +262.0 39.75 -56.430275 +262.5 39.75 -57.287087 +263.0 39.75 -58.205809 +263.5 39.75 -59.178247 +264.0 39.75 -60.264710 +264.5 39.75 -61.495719 +265.0 39.75 -62.679791 +265.5 39.75 -63.496738 +266.0 39.75 -63.955487 +266.5 39.75 -64.328972 +267.0 39.75 -64.790707 +267.5 39.75 -65.361247 +268.0 39.75 -66.061985 +268.5 39.75 -66.909771 +269.0 39.75 -67.649574 +269.5 39.75 -67.924451 +270.0 39.75 -67.731406 +270.5 39.75 -67.389720 +271.0 39.75 -67.103104 +271.5 39.75 -66.902580 +272.0 39.75 -66.849451 +272.5 39.75 -66.998356 +273.0 39.75 -67.207440 +273.5 39.75 -67.220791 +274.0 39.75 -67.119606 +274.5 39.75 -67.104631 +275.0 39.75 -67.168442 +275.5 39.75 -67.251563 +276.0 39.75 -67.412617 +276.5 39.75 -67.670019 +277.0 39.75 -67.746939 +277.5 39.75 -67.223709 +278.0 39.75 -66.016150 +278.5 39.75 -64.264254 +279.0 39.75 -62.000802 +279.5 39.75 -59.037184 +280.0 39.75 -55.956992 diff --git a/tests/raycing/test_sources.py b/tests/raycing/test_sources.py index 62974935..e49e6b23 100644 --- a/tests/raycing/test_sources.py +++ b/tests/raycing/test_sources.py @@ -13,7 +13,7 @@ import matplotlib.pyplot as plt import os, sys; sys.path.append(os.path.join('..', '..')) # analysis:ignore -import xrt.backends.raycing as raycing +#import xrt.backends.raycing as raycing import xrt.backends.raycing.sources as rs @@ -63,7 +63,8 @@ def one_fig(what, ts, tChar, otherChar): zs = source.zs xSlice = 0 zSlice = 0 - if 'xrt' in source.prefix_save_name(): + if 'xrt' in source.prefix_save_name() or\ + 'srw' in source.prefix_save_name(): pass else: data = np.concatenate((data[:, :0:-1, :], data), axis=1) @@ -135,14 +136,19 @@ def anim(data, ipwX): # 'mayavi' is always defined on the interpreter. scene = mayavi.new_scene() # analysis:ignore scene.scene.background = (0, 0, 0) + print(source.prefix_save_name()) src = ArraySource(transpose_input_array=True) - if 'xrt' in source.prefix_save_name(): - sh = data.shape - src.scalar_data = data[:, :sh[1]//2, :sh[2]//2].copy() + sh = data.shape +# print(sh) + if 'xrt' in source.prefix_save_name() or\ + 'srw' in source.prefix_save_name(): + src.scalar_data = data[:, :sh[1]//2+1, :sh[2]//2+1].copy() else: src.scalar_data = data[:, ::-1, ::-1].copy() - src.spacing = np.array([-0.05, 1, 1]) +# src.spacing = np.array([-0.05, 1, 1]) +# src.spacing = np.array([-0.25, 1, 1]) + src.spacing = np.array([-0.25, 0.25, 0.25]) mayavi.add_source(src) # analysis:ignore # Visualize the data. # o = Outline() @@ -166,14 +172,19 @@ def anim(data, ipwX): # ipwZ.ipw.slice_index /= int(2) ipwZ.ipw.left_button_action = 0 - if 'xrt' in source.prefix_save_name(): + if 'xrt' in source.prefix_save_name() or\ + 'srw' in source.prefix_save_name(): pass else: data = np.concatenate((data[:, :0:-1, :], data), axis=1) data = np.concatenate((data[:, :, :0:-1], data), axis=2) + sh = data.shape + print(sh) src = ArraySource(transpose_input_array=True) src.scalar_data = data.copy() - src.spacing = np.array([-0.05, 1, 1]) +# src.spacing = np.array([-0.05, 1, 1]) +# src.spacing = np.array([-0.25, 1, 1]) + src.spacing = np.array([-0.25, 0.25, 0.25]) mayavi.add_source(src) # analysis:ignore ipwX = ImagePlaneWidget() @@ -186,7 +197,8 @@ def anim(data, ipwX): labelE = Text3D() mayavi.add_module(labelE) # analysis:ignore - labelE.position = 1, data.shape[1]*0.73, data.shape[2]*0.85 + labelE.position = (1, data.shape[1]*0.73*src.spacing[1], + data.shape[2]*0.85*src.spacing[2]) labelE.orientation = 90, 0, 90 labelE.text = 'Energy' labelE.scale = 3, 3, 1 @@ -195,7 +207,12 @@ def anim(data, ipwX): labelE.text = set_labelE(0) view(45, 70, 200) - anim(data, ipwX) + wantToAnimate = False + if wantToAnimate: + anim(data, ipwX) + else: + ipwX.ipw.slice_index = data.shape[0]-1 + move_view(None, None) data[data < 1e-7] = 1e-7 dataMax = np.max(data) @@ -205,10 +222,25 @@ def anim(data, ipwX): def test_synchrotron_source(SourceClass, **kwargs): tstart = time.time() - beamLine = raycing.BeamLine() - source = SourceClass(beamLine, **kwargs) + source = SourceClass(**kwargs) + +# if source.prefix_save_name().startswith('srw'): +# import pickle +# pickleName = 'srw-und-non0em.pickle' +# with open(pickleName, 'rb') as f: +# I0, l1, l2, l3 = pickle.load(f)[0:4] I0, l1, l2, l3 = source.intensities_on_mesh() + print('finished') + tstop = time.time() + print('calculations took {0:.1f} s'.format(tstop - tstart)) + +##for long calculations like srw: +# if source.prefix_save_name().startswith('srw'): +# import pickle +# pickleName = source.prefix_save_name()+'.pickle' +# with open(pickleName, 'wb') as f: +# pickle.dump((I0, l1, l2, l3, tstop-tstart), f, protocol=2) ##visualize in 2D: # visualize(source, I0, r'$I_0$', 'I0') @@ -222,14 +254,12 @@ def test_synchrotron_source(SourceClass, **kwargs): # visualize(source, I0*l3/2., r'$\Im{I_{\sigma\pi}}$', 'IspIm', sign=sign) ##select only one visualize3D at a time: -# visualize3D(source, I0, isZplane=False, saveName='Itot') - visualize3D(source, I0*(1-l1)/2., isZplane=False, saveName='IpPol') + visualize3D(source, I0, isZplane=False, saveName='Itot') +# visualize3D(source, I0*(1+l1)/2., isZplane=False, saveName='IsPol') +# visualize3D(source, I0*(1-l1)/2., isZplane=False, saveName='IpPol') # visualize3D(source, I0*l2/2., saveName='IspRe') # visualize3D(source, I0*l3/2., saveName='IspIm') # - print('finished') - print('calculations took {0:.1f} s'.format(time.time() - tstart)) - if __name__ == '__main__': """Uncomment the block you want to test.""" @@ -264,16 +294,39 @@ def test_synchrotron_source(SourceClass, **kwargs): # eMin=1500, eMax=31500, eN=1000, nx=40, nz=4, # xPrimeMax=thetaMax*1e3, zPrimeMax=psiMax*1e3, distE='BW') kwargs = dict( - period=31.4, K=2.7, n=63, eE=6.08, xPrimeMax=0.3, zPrimeMax=0.15, -# eSigmaX=134.2, eSigmaZ=6.325, eEpsilonX=1., eEpsilonZ=0.01, - eMin=1500, eMax=31500, eN=3000, nx=40, nz=20) -#by Urgent: - Source = rs.UndulatorUrgent -##by xrt: -# kwargs['distE'] = 'BW' -# kwargs['xPrimeMaxAutoReduce'] = False -# kwargs['zPrimeMaxAutoReduce'] = False -# Source = rs.Undulator + period=31.4, K=2.7, n=63, eE=6.08, eI=0.5, xPrimeMax=0.3, zPrimeMax=0.15, + eSigmaX=134.2, eSigmaZ=6.325, eEpsilonX=1., eEpsilonZ=0.01, +# eMin=1500, eMax=31500, eN=3000, nx=40, nz=20) + eMin=1500, eMax=4500, eN=300, nx=40*4, nz=20*4) +##by Urgent: +## kwargs['icalc'] = 3 # 0 emittance +# Source = rs.UndulatorUrgent +###by SRW: +# import srw.xrtSRW as xrtSRW +# kwargs['R0'] = 50000 +## 974 s - single electron +## 65501 s - zero spread +## 66180 s -nonzero spread +# kwargs['eSigmaX'] = 0 +# kwargs['eSigmaZ'] = 0 +# kwargs['eEpsilonX'] = 0 +# kwargs['eEpsilonZ'] = 0 +## kwargs['eEspread'] = 1e-3 +# kwargs['harmonicStart'] = 1 +# kwargs['harmonicFin'] = 4 +# Source = xrtSRW.UndulatorSRW +#by xrt: + kwargs['R0'] = 50000 + kwargs['eSigmaX'] = 0 + kwargs['eSigmaZ'] = 0 + kwargs['eEpsilonX'] = 0 + kwargs['eEpsilonZ'] = 0 +# kwargs['eEspread'] = 1e-3 + kwargs['distE'] = 'BW' + kwargs['xPrimeMaxAutoReduce'] = False + kwargs['zPrimeMaxAutoReduce'] = False +# kwargs['filamentBeam'] = True + Source = rs.Undulator ##*** helical undulator ************** # kwargs = dict( diff --git a/xrt/__init__.py b/xrt/__init__.py index 51adb053..8f7097f7 100644 --- a/xrt/__init__.py +++ b/xrt/__init__.py @@ -4,24 +4,19 @@ synchrotron sources, beamlines and beamline elements. Includes a GUI tool for creating scripts. -+-----------+-----------+-----------+-----------+ -| |IpPol| | |MontelM| | |vcmSi-P| | |VortexB| | -+-----------+-----------+-----------+-----------+ ++-------------------+---------------+-----------+ +| |IpPol| | |vcmSi-P| | |VortexB| | ++-------------------+---------------+-----------+ .. |IpPol| animation:: _images/IpPol :alt:  Intensity of vertically polarized undulator radiation on a transverse flat screen. The long axis is energy. -.. |MontelM| imagezoom:: _images/Montel_par_exit_n.png - :alt:  Screen image downstream of a Montel mirror. Colored by number - of reflections. .. |vcmSi-P| animation:: _images/vcmSi-FootprintP :alt:  Absorbed power and power density on a mirror at varying pitch angle. :loc: upper-right-corner -.. |VortexB| imagezoom:: _images/Laguerre-Gauss-3-beamFSMk-at20m-cut.png - :alt:  Vortex beam calculated by Kirchhoff diffraction integral of - Laguerre-Gaussian beam waist with l=1 and p=1. - Colored by phase. +.. |VortexB| animation:: _images/Laguerre-Gauss-ani + :alt:  Vortex beam with l=1 and p=1. Colored by phase. :loc: upper-right-corner xrtQook -- a GUI for creating scripts @@ -146,8 +141,8 @@ :mod:`numpy`, :mod:`scipy` and :mod:`matplotlib` are required. If you use OpenCL for calculations on GPU or CPU, you need AMD/NVIDIA drivers, ``Intel CPU only OpenCL runtime`` (these are search key words), :mod:`pytools` -and :mod:`pyopencl`. :mod:`Spiderlib` is highly recommended for nicer view of -xrtQook. +and :mod:`pyopencl`. :mod:`Spyderlib` (the foundation of Spyder IDE) is highly +recommended for nicer view of xrtQook. Python 2 and 3 -------------- diff --git a/xrt/backends/raycing/sources.py b/xrt/backends/raycing/sources.py index 4ed57e26..eeb39c44 100644 --- a/xrt/backends/raycing/sources.py +++ b/xrt/backends/raycing/sources.py @@ -244,18 +244,58 @@ Undulator spectrum at very high energies ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The codes Urgent [Urgent]_, SRW [SRW]_ and SPECTRA [SPECTRA]_ result in -saturation or failure at high energies (see the image below) thus leading to a -divergent total power integral. The false radiation has a circular off-axis -shape. To the contrary, xrt flux at high energies vanishes and follows the -wiggler approximation. More discussion will follow in a future journal article -about xrt. +The codes Urgent [Urgent]_ and SPECTRA [SPECTRA]_ result in saturation at high +energies (see the image below) thus leading to a divergent total power +integral. The false radiation has a circular off-axis shape. To the contrary, +xrt and SRW [SRW]_ flux at high energies vanishes and follows the wiggler +approximation. More discussion will follow in a future journal article about +xrt. + +.. imagezoom:: _images/flux_BioNanoMAX.png + +Single-electron and multi-electron undulator radiation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Here we compare single-electron and multi-electron (i.e. with a finite electron +beam size and energy spread) undulator radiation, as calculated by xrt and SRW +[SRW]_. The calculations are done on a 3D mesh of energy (the long axis on the +images below) and two transverse angles. Notice also the duration of execution +given below each image. The 3D mesh was the following: theta = 321 point, -0.3 +to +0.3 mrad, psi = 161 point, -0.15 to +0.15 mrad, energy: 301 point 1.5 to +4.5 keV. .. [SRW] O. Chubar, P. Elleaume, *Accurate And Efficient Computation Of Synchrotron Radiation In The Near Field Region*, proc. of the EPAC98 Conference, 22-26 June 1998, p.1177-1179. -.. imagezoom:: _images/flux_BioNanoMAX.png ++-------------+------------------------+------------------------+ +| | SRW | xrt | ++=============+========================+========================+ +| single | |srw_single| | |xrt_single| | +| electron +------------------------+------------------------+ +| | execution time 974 s | execution time 17.4 s | ++-------------+------------------------+------------------------+ +| non-zero | |srw_non0em| | |xrt_non0em| | +| emittance +------------------------+------------------------+ +| | execution time 65501 s | execution time 18.6 s | +| | (*sic*) | | ++-------------+------------------------+------------------------+ +| non-zero | |srw_non0emsp| | |xrt_non0emsp| | +| emittance, +------------------------+------------------------+ +| non-zero | execution time 66180 s | execution time 216 s | +| energy | (*sic*) | | +| spread | | | ++-------------+------------------------+------------------------+ + +.. |srw_single| imagezoom:: _images/mayavi_0em_2srw.png +.. |srw_non0em| imagezoom:: _images/mayavi_non0em_2srw.png +.. |srw_non0emsp| imagezoom:: _images/mayavi_non0em_non0spread_2srw.png +.. |xrt_single| imagezoom:: _images/mayavi_0em_3xrt.png + :loc: upper-right-corner +.. |xrt_non0em| imagezoom:: _images/mayavi_non0em_3xrt.png + :loc: upper-right-corner +.. |xrt_non0emsp| imagezoom:: _images/mayavi_non0em_non0spread_3xrt.png + :loc: upper-right-corner .. _tapering_comparison: @@ -304,15 +344,15 @@ ... and transversal distribution at a fixed energy: -+----------------+--------------------+-------------+ -| | SPECTRA [SPECTRA]_ | xrt | -+================+====================+=============+ -| *E* = 4850 eV | | | -| (3rd harmonic) | |spectra_lowE| | |xrt_lowE| | -+----------------+--------------------+-------------+ -| *E* = 11350 eV | | | -| (7th harmonic) | |spectra_highE| | |xrt_highE| | -+----------------+--------------------+-------------+ ++----------------+--------------------+--------------------+ +| | SPECTRA | xrt | ++================+====================+====================+ +| *E* = 4850 eV | | | +| (3rd harmonic) | |spectra_lowE| | |xrt_lowE| | ++----------------+--------------------+--------------------+ +| *E* = 11350 eV | | | +| (7th harmonic) | |spectra_highE| | |xrt_highE| | ++----------------+--------------------+--------------------+ .. |spectra_lowE| imagezoom:: _images/undulator-E=04850eV-spectra.* .. |spectra_highE| imagezoom:: _images/undulator-E=11350eV-spectra.* @@ -354,21 +394,21 @@ Notice that on the following pictures the p-polarized flux is only ~6% of the total flux. -+------------------------+--------------------+----------------+ -| at 5 m | SPECTRA [SPECTRA]_ | xrt | -+========================+====================+================+ -| far field at 5 m, | | | -| full flux | |spectra_f05m0| | |xrt_f05m0| | -+------------------------+--------------------+----------------+ -| far field at 5 m, | | | -| p-polarized | |spectra_f05mP| | |xrt_f05mP| | -+------------------------+--------------------+----------------+ -| near field at 5 m, | | | -| full flux | |spectra_n05m0| | |xrt_n05m0| | -+------------------------+--------------------+----------------+ -| near field at 5 m, | | | -| p-polarized | |spectra_n05mP| | |xrt_n05mP| | -+------------------------+--------------------+----------------+ ++------------------------+--------------------+--------------------+ +| at 5 m | SPECTRA | xrt | ++========================+====================+====================+ +| far field at 5 m, | | | +| full flux | |spectra_f05m0| | |xrt_f05m0| | ++------------------------+--------------------+--------------------+ +| far field at 5 m, | | | +| p-polarized | |spectra_f05mP| | |xrt_f05mP| | ++------------------------+--------------------+--------------------+ +| near field at 5 m, | | | +| full flux | |spectra_n05m0| | |xrt_n05m0| | ++------------------------+--------------------+--------------------+ +| near field at 5 m, | | | +| p-polarized | |spectra_n05mP| | |xrt_n05mP| | ++------------------------+--------------------+--------------------+ .. |spectra_f05m0| imagezoom:: _images/spectra-05m-far.png .. |spectra_f05mP| imagezoom:: _images/spectra-05m-far_p.png @@ -384,21 +424,21 @@ .. |xrt_n05mP| imagezoom:: _images/xrt-near05m3vertFlux-rays.png :loc: upper-right-corner -+------------------------+--------------------+----------------+ -| at 25 m | SPECTRA [SPECTRA]_ | xrt | -+========================+====================+================+ -| far field at 25 m, | | | -| full flux | |spectra_f25m0| | |xrt_f25m0| | -+------------------------+--------------------+----------------+ -| far field at 25 m, | | | -| p-polarized | |spectra_f25mP| | |xrt_f25mP| | -+------------------------+--------------------+----------------+ -| near field at 25 m | | | -| full flux | |spectra_n25m0| | |xrt_n25m0| | -+------------------------+--------------------+----------------+ -| near field at 25 m, | | | -| p-polarized | |spectra_n25mP| | |xrt_n25mP| | -+------------------------+--------------------+----------------+ ++------------------------+--------------------+--------------------+ +| at 25 m | SPECTRA | xrt | ++========================+====================+====================+ +| far field at 25 m, | | | +| full flux | |spectra_f25m0| | |xrt_f25m0| | ++------------------------+--------------------+--------------------+ +| far field at 25 m, | | | +| p-polarized | |spectra_f25mP| | |xrt_f25mP| | ++------------------------+--------------------+--------------------+ +| near field at 25 m | | | +| full flux | |spectra_n25m0| | |xrt_n25m0| | ++------------------------+--------------------+--------------------+ +| near field at 25 m, | | | +| p-polarized | |spectra_n25mP| | |xrt_n25mP| | ++------------------------+--------------------+--------------------+ .. |spectra_f25m0| imagezoom:: _images/spectra-25m-far.png .. |spectra_f25mP| imagezoom:: _images/spectra-25m-far_p.png @@ -422,7 +462,7 @@ color=phase) is not by SRW and SPECTRA but was done by us. +--------------------+--------------------+--------------------+ -| SRW [SRW]_ | SPECTRA [SPECTRA]_ | xrt | +| SRW [SRW]_ | SPECTRA | xrt | +====================+====================+====================+ | |srw_ps| | |spectra_ps| | |xrt_ps| | +--------------------+--------------------+--------------------+ diff --git a/xrt/backends/raycing/sources_legacy.py b/xrt/backends/raycing/sources_legacy.py index ae4b1d66..0eea4cff 100644 --- a/xrt/backends/raycing/sources_legacy.py +++ b/xrt/backends/raycing/sources_legacy.py @@ -199,7 +199,7 @@ class UndulatorUrgent. *mode* = 4 is by far most preferable. *processes*: int or any other type as 'auto' the number of worker processes to use. If the type is not int then - the number returned by multiprocessing.cpu_count() is used. + the number returned by multiprocessing.cpu_count()/2 is used. """ @@ -248,7 +248,7 @@ class UndulatorUrgent. *mode* = 4 is by far most preferable. pp = processes else: self.processes = None - pp = cpu_count() + pp = cpu_count() // 2 if _DEBUG: print('{0} process{1} will be requested'.format( pp, ('' if pp == 1 else 'es'))) diff --git a/xrt/backends/raycing/sources_synchr.py b/xrt/backends/raycing/sources_synchr.py index 8c83519b..149cd23d 100644 --- a/xrt/backends/raycing/sources_synchr.py +++ b/xrt/backends/raycing/sources_synchr.py @@ -623,7 +623,7 @@ def __init__(self, bl=None, name='und', center=(0, 0, 0), eMin=5000., eMax=15000., eN=51, distE='eV', xPrimeMax=0.5, zPrimeMax=0.5, nx=25, nz=25, xPrimeMaxAutoReduce=True, zPrimeMaxAutoReduce=True, - gp=1e-2, gIntervals=1, nRK=30, fullLength=False, + gp=1e-2, gIntervals=1, nRK=30, uniformRayDensity=False, filamentBeam=False, targetOpenCL='auto', precisionOpenCL='auto', pitch=0, yaw=0): u""" @@ -833,6 +833,7 @@ def __init__(self, bl=None, name='und', center=(0, 0, 0), self.R0 = R0 if R0 is None else R0 + self.L0*0.25 self.nRK = nRK self.trajectory = None + fullLength = False # NOTE maybe a future input parameter self.full = fullLength if fullLength: #self.filamentBeam = True @@ -861,11 +862,11 @@ def __init__(self, bl=None, name='und', center=(0, 0, 0), if (self.dx is None) and (self.betaX is not None): self.dx = np.sqrt(self.eEpsilonX*self.betaX) elif (self.dx is None) and (self.betaX is None): - print("Set either dx or mean_betaX!") + print("Set either dx or betaX!") if (self.dz is None) and (self.betaZ is not None): self.dz = np.sqrt(self.eEpsilonZ*self.betaZ) elif (self.dz is None) and (self.betaZ is None): - print("Set either dz or mean_betaZ!") + print("Set either dz or betaZ!") dxprime, dzprime = None, None if dxprime: self.dxprime = dxprime @@ -1059,7 +1060,7 @@ def reset(self): m += 1 self.quadm = int(1.5**m) if self.cl_ctx is not None: -# sE = np.linspace(self.E_min, self.E_max, self.eN) + #sE = np.linspace(self.E_min, self.E_max, self.eN) sE = self.E_max * np.ones(3) sTheta_max = self.Theta_max * np.ones(3) sPsi_max = self.Psi_max * np.ones(3) @@ -1180,36 +1181,72 @@ def power_vs_K(self, energy, theta, psi, harmonics, Ks): def intensities_on_mesh(self, energy='auto', theta='auto', psi='auto', harmonic=None): - if isinstance(energy, str): + if isinstance(energy, str): # i.e. if 'auto' energy = np.mgrid[self.E_min:self.E_max + 0.5*self.dE:self.dE] + if isinstance(theta, str): theta = np.mgrid[ self.Theta_min:self.Theta_max + 0.5*self.dTheta:self.dTheta] + if isinstance(psi, str): psi = np.mgrid[self.Psi_min:self.Psi_max + 0.5*self.dPsi:self.dPsi] + + tomesh = energy, theta, psi if harmonic is None: - xE, xTheta, xPsi = np.meshgrid(energy, theta, psi, indexing='ij') xH = None else: - xE, xTheta, xPsi, xH = np.meshgrid(energy, theta, psi, harmonic, - indexing='ij') - xH = xH.flatten() -# linear arrays for OpenCL: - sh = xE.shape - res = self.build_I_map(xE.flatten(), xTheta.flatten(), xPsi.flatten(), - xH) -# restore the shape: - self.Itotal = res[0].reshape(sh) - self.Is = res[1].reshape(sh) - self.Ip = res[2].reshape(sh) - - s0 = (self.Is*np.conj(self.Is) + self.Ip*np.conj(self.Ip)).real - s1 = (self.Is*np.conj(self.Is) - self.Ip*np.conj(self.Ip)).real - s2 = 2. * np.real(self.Is * np.conj(self.Ip)) - s3 = -2. * np.imag(self.Is * np.conj(self.Ip)) + tomesh.append(harmonic) + mesh = np.meshgrid(*tomesh, indexing='ij') + xE, xTheta, xPsi = mesh[0].ravel(), mesh[1].ravel(), mesh[2].ravel() + if harmonic is not None: + xH = mesh[3].ravel() + + if self.eEspread > 0: + spreads = np.linspace(-3, 3, 13) + wspreads = np.exp(-0.5 * spreads**2) + wspreads /= wspreads.sum() + else: + spreads = [0] + wspreads = [1] + + sh = len(energy), len(theta), len(psi) + self.Is = np.zeros(sh, dtype=float) + self.Ip = np.zeros(sh, dtype=float) + self.Isp = np.zeros(sh, dtype=complex) + for spread, wspread in zip(spreads, wspreads): + dgamma = self.gamma * spread * self.eEspread + res = self.build_I_map(xE, xTheta, xPsi, xH, dgamma) + Es = res[1] + Ep = res[2] + Is = (Es*np.conj(Es)).real + Ip = (Ep*np.conj(Ep)).real + Isp = Es*np.conj(Ep) + self.Is += Is.reshape(sh) * wspread + self.Ip += Ip.reshape(sh) * wspread + self.Isp += Isp.reshape(sh) * wspread + + s0 = (self.Is + self.Ip) * wspread + s1 = (self.Is - self.Ip) * wspread + s2 = (2. * np.real(self.Isp)) * wspread + s3 = (-2. * np.imag(self.Isp)) * wspread + +# convolution with the angular size: + if self.dx > 0 or self.dz > 0: + from scipy.ndimage.filters import gaussian_filter + dxP = theta[1] - theta[0] + dzP = psi[1] - psi[0] + for ie, ee in enumerate(energy): + #sigma_rP2 = CHeVcm/ee*10 / (self.L0*self.Np) + sigma_rP2 = 0. + Sx = ((self.dxprime**2 + sigma_rP2)**0.5) / dxP + Sz = ((self.dzprime**2 + sigma_rP2)**0.5) / dzP + s0[ie, :, :] = gaussian_filter(s0[ie, :, :], [Sx, Sz]) + s1[ie, :, :] = gaussian_filter(s1[ie, :, :], [Sx, Sz]) + s2[ie, :, :] = gaussian_filter(s2[ie, :, :], [Sx, Sz]) + s3[ie, :, :] = gaussian_filter(s3[ie, :, :], [Sx, Sz]) with np.errstate(divide='ignore'): - return (self.Itotal, + return (s0, np.where(s0, s1 / s0, s0), np.where(s0, s2 / s0, s0), np.where(s0, s3 / s0, s0)) @@ -1293,19 +1330,19 @@ def _sp(self, dim, x, ww1, w, wu, gamma, ddphi, ddpsi): return ((nz*(betaPx*bnz - betaPz*bnx) + ddpsiS*primexy) * eucos, (nz*(betaPy*bnz - betaPz*bny) - ddphiS*primexy) * eucos) - def build_I_map(self, w, ddtheta, ddpsi, harmonic=None): + def build_I_map(self, w, ddtheta, ddpsi, harmonic=None, dg=0): useCL = False if isinstance(w, np.ndarray): if w.shape[0] > 2: useCL = True if (self.cl_ctx is None) or not useCL: - return self._build_I_map_conv(w, ddtheta, ddpsi, harmonic) + return self._build_I_map_conv(w, ddtheta, ddpsi, harmonic, dg) elif self.customField is not None: - return self._build_I_map_custom(w, ddtheta, ddpsi, harmonic) + return self._build_I_map_custom(w, ddtheta, ddpsi, harmonic, dg) else: - return self._build_I_map_CL(w, ddtheta, ddpsi, harmonic) + return self._build_I_map_CL(w, ddtheta, ddpsi, harmonic, dg) - def _build_I_map_conv(self, w, ddtheta, ddpsi, harmonic): + def _build_I_map_conv(self, w, ddtheta, ddpsi, harmonic, dgamma=0): # np.seterr(invalid='ignore') # np.seterr(divide='ignore') gamma = self.gamma @@ -1316,9 +1353,7 @@ def _build_I_map_conv(self, w, ddtheta, ddpsi, harmonic): gamma += gamma * self.eEspread * np.ones_like(w) *\ np.random.standard_normal() else: - gamma += np.random.normal(0, - gamma*self.eEspread, - w.shape) + gamma += dgamma * np.ones_like(w) gamma2 = gamma**2 wu = PI * C * 10 / self.L0 / gamma2 * \ (2*gamma2 - 1 - 0.5*self.Kx**2 - 0.5*self.Ky**2) / E2W @@ -1341,8 +1376,8 @@ def _build_I_map_conv(self, w, ddtheta, ddpsi, harmonic): dstep = 2 * PI / float(self.gIntervals) dI = np.arange(-PI + 0.5 * dstep, PI, dstep) - tg = (dI[:, None] + 0.5*dstep*tg_n).flatten() # + PI/2 - ag = (dI[:, None]*0 + ag_n).flatten() + tg = (dI[:, None] + 0.5*dstep*tg_n).ravel() # + PI/2 + ag = (dI[:, None]*0 + ag_n).ravel() # Bsr = np.zeros_like(w, dtype='complex') # Bpr = np.zeros_like(w, dtype='complex') dim = len(np.array(w).shape) @@ -1366,7 +1401,7 @@ def _build_I_map_conv(self, w, ddtheta, ddpsi, harmonic): np.sqrt(Amp2Flux) * AB * Bsr, np.sqrt(Amp2Flux) * AB * Bpr) - def _build_I_map_custom(self, w, ddtheta, ddpsi, harmonic): + def _build_I_map_custom(self, w, ddtheta, ddpsi, harmonic, dgamma=0): # time1 = time.time() gamma = self.gamma if self.eEspread > 0: @@ -1377,9 +1412,8 @@ def _build_I_map_custom(self, w, ddtheta, ddpsi, harmonic): np.ones_like(w, dtype=self.cl_precisionF) *\ np.random.standard_normal() else: - gamma += np.random.normal(0, - gamma*self.eEspread, - w.shape) + gamma += dgamma * \ + np.ones_like(w, dtype=self.cl_precisionF) gamma2 = gamma**2 wu = PI * C * 10 / self.L0 / gamma2 * \ (2*gamma2 - 1. - 0.5*self.Kx**2 - 0.5*self.Ky**2) / E2W @@ -1407,10 +1441,9 @@ def _build_I_map_custom(self, w, ddtheta, ddpsi, harmonic): tg = np.array([-PI*Np + PI/2.]) ag = [0] tg = self.cl_precisionF( - np.concatenate((tg, (dI[:, None]+0.5*dstep*tg_n).flatten() + - PI/2.))) + np.concatenate((tg, (dI[:, None]+0.5*dstep*tg_n).ravel() + PI/2.))) ag = self.cl_precisionF(np.concatenate( - (ag, (dI[:, None]*0+ag_n).flatten()))) + (ag, (dI[:, None]*0+ag_n).ravel()))) nwt = self.nRK wtGrid = [] @@ -1529,7 +1562,7 @@ def _build_I_map_custom(self, w, ddtheta, ddpsi, harmonic): np.sqrt(Amp2Flux) * Is_local * ab * 0.5 * dstep, np.sqrt(Amp2Flux) * Ip_local * ab * 0.5 * dstep) - def _build_I_map_CL(self, w, ddtheta, ddpsi, harmonic): + def _build_I_map_CL(self, w, ddtheta, ddpsi, harmonic, dgamma=0): # time1 = time.time() gamma = self.gamma if self.eEspread > 0: @@ -1540,9 +1573,8 @@ def _build_I_map_CL(self, w, ddtheta, ddpsi, harmonic): np.ones_like(w, dtype=self.cl_precisionF) *\ np.random.standard_normal() else: - gamma += np.random.normal(0, - gamma*self.eEspread, - w.shape) + gamma += dgamma * \ + np.ones_like(w, dtype=self.cl_precisionF) gamma2 = gamma**2 wu = PI * C * 10 / self.L0 / gamma2 * \ (2*gamma2 - 1 - 0.5*self.Kx**2 - 0.5*self.Ky**2) / E2W @@ -1579,8 +1611,8 @@ def _build_I_map_CL(self, w, ddtheta, ddpsi, harmonic): dI = np.arange(-PI + 0.5*dstep, PI, dstep) extra = PI/2*0 - tg = self.cl_precisionF((dI[:, None]+0.5*dstep*tg_n).flatten()) + extra - ag = self.cl_precisionF((dI[:, None]*0+ag_n).flatten()) + tg = self.cl_precisionF((dI[:, None]+0.5*dstep*tg_n).ravel()) + extra + ag = self.cl_precisionF((dI[:, None]*0+ag_n).ravel()) scalarArgs.extend([self.cl_precisionF(self.Kx), # Kx self.cl_precisionF(self.Ky), # Ky diff --git a/xrt/xrtQook/__init__.py b/xrt/xrtQook/__init__.py index 8e0f8264..b0dedeca 100644 --- a/xrt/xrtQook/__init__.py +++ b/xrt/xrtQook/__init__.py @@ -112,7 +112,7 @@ generate_context) isSphinx = True except (ImportError, TypeError): - sphinxify = sphinx_version = None # analysis:ignore + sphinxify = None isSphinx = False if not isSphinx: try: @@ -120,6 +120,7 @@ generate_context) # analysis:ignore isSphinx = True except (ImportError, TypeError): + raise pass try: @@ -139,6 +140,7 @@ from PyQt5 import QtGui, QtCore import PyQt5.QtWidgets as myQtGUI import PyQt5.QtWebKitWidgets as myQtWeb +# import PyQt5.QtWebEngineWidgets as myQtWeb elif 'pyqt4' in qt_compat.QT_API.lower(): # also 'PyQt4v2' QtName = "PyQt4" from PyQt4 import QtGui, QtCore @@ -161,6 +163,10 @@ QIcon, QFont, QKeySequence, QStandardItemModel, QStandardItem, QPixmap =\ (QtGui.QIcon, QtGui.QFont, QtGui.QKeySequence, QtGui.QStandardItemModel, QtGui.QStandardItem, QtGui.QPixmap) + +#if QtName in ["PyQt5"]: +# QWebView = myQtWeb.QWebEngineView +#else: QWebView = myQtWeb.QWebView sys.path.append(os.path.join('..', '..')) @@ -295,15 +301,24 @@ def __init__(self): self.xrtModules = ['rsources', 'rscreens', 'rmats', 'roes', 'rapts', 'rrun', 'raycing', 'xrtplot', 'xrtrun'] - self.objectFlag = QtCore.Qt.ItemFlags(-33) - self.paramFlag = QtCore.Qt.ItemFlags(QtCore.Qt.ItemIsEnabled | ~ - QtCore.Qt.ItemIsEditable | +# self.objectFlag = QtCore.Qt.ItemFlags(-33) +# self.paramFlag = QtCore.Qt.ItemFlags(QtCore.Qt.ItemIsEnabled | +# QtCore.Qt.ItemIsEditable | ~ +# QtCore.Qt.ItemIsSelectable) +# self.valueFlag = QtCore.Qt.ItemFlags(QtCore.Qt.ItemIsEnabled | +# QtCore.Qt.ItemIsEditable | +# QtCore.Qt.ItemIsSelectable) +# self.checkFlag = QtCore.Qt.ItemFlags(QtCore.Qt.ItemIsEnabled | ~ +# QtCore.Qt.ItemIsEditable | +# QtCore.Qt.ItemIsUserCheckable | +# QtCore.Qt.ItemIsSelectable) + self.objectFlag = QtCore.Qt.ItemFlags(0) + self.paramFlag = QtCore.Qt.ItemFlags(QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable) self.valueFlag = QtCore.Qt.ItemFlags(QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsSelectable) - self.checkFlag = QtCore.Qt.ItemFlags(QtCore.Qt.ItemIsEnabled | ~ - QtCore.Qt.ItemIsEditable | + self.checkFlag = QtCore.Qt.ItemFlags(QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsSelectable) @@ -412,6 +427,7 @@ def __init__(self): canvasSplitter.addWidget(mainWidget) canvasSplitter.addWidget(docWidget) self.setLayout(canvasBox) + self.initAllModels() self.initAllTrees() @@ -442,17 +458,26 @@ def zoomDoc(self, factor): """Zoom in/out/reset""" try: textSize = self.webHelp.textSizeMultiplier() - if factor == 0: - textSize = 1. - elif factor == 1: - if textSize < 2: - textSize += 0.1 - elif textSize > 0.1: - textSize -= 0.1 + zoomtype = 'textSizeMultiplier' + except AttributeError: + try: + textSize = self.webHelp.zoomFactor() + zoomtype = 'zoomFactor' + except AttributeError: + return + if factor == 0: + textSize = 1. + elif factor == 1: + if textSize < 2: + textSize += 0.1 + elif textSize > 0.1: + textSize -= 0.1 + + if zoomtype == 'textSizeMultiplier': self.webHelp.setTextSizeMultiplier(textSize) - except AttributeError: - pass + elif zoomtype == 'zoomFactor': + self.webHelp.setZoomFactor(textSize) def initAllTrees(self): # runTree view @@ -460,6 +485,7 @@ def initAllTrees(self): self.runTree.setAlternatingRowColors(True) self.runTree.setSortingEnabled(False) self.runTree.setHeaderHidden(False) + self.runTree.setAnimated(True) self.runTree.setSelectionBehavior(QAbstractItemView.SelectItems) self.runTree.model().setHorizontalHeaderLabels(['Parameter', 'Value']) for name, obj in inspect.getmembers(xrtrun): @@ -476,8 +502,9 @@ def initAllTrees(self): argVal = self.rootBLItem.text() self.addParam(self.rootRunItem, arg, argVal) self.addCombo(self.runTree, self.rootRunItem) - self.runTree.expand(self.rootRunItem.index()) self.runTree.setColumnWidth(0, int(self.runTree.width()/3)) + index = self.runModel.indexFromItem(self.rootRunItem) + self.runTree.setExpanded(index, True) # plotTree view self.plotTree.setModel(self.plotModel) @@ -682,9 +709,7 @@ def initAllModels(self): self.plotModel.invisibleRootItem().setText("plots") self.runModel = QStandardItemModel() - self.addProp(self.runModel.invisibleRootItem(), - "run_ray_tracing()") - # self.runModel.appendRow(QStandardItem("RayTracingParameters")) + self.addProp(self.runModel.invisibleRootItem(), "run_ray_tracing()") self.runModel.itemChanged.connect(self.colorizeChangedParam) self.rootRunItem = self.runModel.item(0, 0) @@ -840,7 +865,8 @@ def showObjHelp(self, obj): sbsPath = re.sub('img_name', 'attr', re.sub('\\\\', '/', html2)) - sbsPath = re.sub('return \'', 'return \'file:///', sbsPath) + if 'file://' not in sbsPath: + sbsPath = re.sub('return \'', 'return \'file:///', sbsPath) new_html = re.sub(' {4}return.*', sbsPath, html_text, 1) else: spyder_crutch = "\n" + new_html = re.sub('', spyder_crutch, html_text, 1) + self.webHelp.setHtml(new_html, QtCore.QUrl(CSS_PATH)) + else: + argDocStr = u'{0}\nDefiniiton: {1}\n\nType: {2}\n\n\n'.format( + nameStr.upper(), argSpecStr, noteStr) + argDocStr + self.webHelp.setText(textwrap.dedent(argDocStr)) + self.webHelp.setReadOnly(True) + + def updateDescription(self): + self.fileDescription = self.descrEdit.toPlainText() + img_path = __file__ if self.layoutFileName == "" else\ + self.layoutFileName + self.showTutorial(self.fileDescription, + "Description", + os.path.dirname(os.path.abspath(img_path))) + + def showWelcomeScreen(self): + argDescr = r""" + + .. image:: _images/qookSplashSmall_ani.gif + + xrtQook is a qt-based GUI for using xrt without having to write python + scripts. See a short startup `tutorial `_. + + """ + self.showTutorial(argDescr, + "xrtQook", + os.path.dirname(os.path.abspath(__file__)), + delegateLink=True) + + def showDescrByTab(self, tab): + if tab == 4: + self.updateDescription() + + def showTutorial(self, argDocStr, name, img_path, delegateLink=False): + if isSphinx: + err = None + try: + cntx = generate_context( + name=name, + argspec="", + note="", + img_path=img_path, + math=True) + except TypeError as err: + cntx = generate_context( + name=name, + argspec="", + note="", + math=True) + argDocStr = argDocStr.replace('imagezoom::', 'image::') + html_text = sphinxify(textwrap.dedent(argDocStr), cntx) + if err is None: + html2 = re.findall(' {4}return.*', html_text)[0] + sbsPath = re.sub('img_name', + 'attr', + re.sub('\\\\', '/', html2)) + if 'file://' not in sbsPath: + sbsPath = re.sub('return \'', 'return \'file:///', sbsPath) + new_html = re.sub(' {4}return.*', sbsPath, html_text, 1) + else: + spyder_crutch = "\n" + new_html = re.sub('', spyder_crutch, html_text, 1) + self.webHelp.setHtml(new_html, QtCore.QUrl(CSS_PATH)) + if delegateLink: + self.webHelp.page().setLinkDelegationPolicy(1) + self.webHelp.page().linkClicked.connect(partial( + self.showTutorial, + __doc__[229:], + "Using xrtQook for script generation", + self.xrtQookDir)) + else: + self.webHelp.page().setLinkDelegationPolicy(0) + self.curObj = None + + def showOCLinfo(self): + argDocStr = "" + for iplatform, platform in enumerate(cl.get_platforms()): + argDocStr += '=' * 25 + '\n' + argDocStr += 'Platform {0}: {1}\n'.format(iplatform, platform.name) + argDocStr += '=' * 25 + '\n' + argDocStr += '**Vendor**: {0}\n\n'.format(platform.vendor) + argDocStr += '**Version**: {0}\n\n'.format(platform.version) + # argDocStr += '**Extensions**: {0}\n\n'.format( + # platform.extensions) + for idevice, device in enumerate(platform.get_devices()): + maxFNLen = 0 + maxFVLen = 0 + argDocStr += '{0}**DEVICE {1}**: {2}\n\n'.format( + myTab, idevice, device.name) + fNames = ['*Type*', + '*Max Clock Speed*', + '*Compute Units*', + '*Local Memory*', + '*Constant Memory*', + '*Global Memory*', + '*FP64 Support*'] + fVals = [cl.device_type.to_string(device.type), + str(device.max_clock_frequency) + ' MHz', + str(device.max_compute_units), + str(int(device.local_mem_size/1024)) + ' kB', + str(int( + device.max_constant_buffer_size/1024)) + ' kB', + '{0:.2f}'.format( + device.global_mem_size/1073741824.) + ' GB', + str(bool(int(device.double_fp_config/63)))] + for fieldName, fieldVal in zip(fNames, fVals): + if len(fieldName) > maxFNLen: + maxFNLen = len(fieldName) + if len(fieldVal) > maxFVLen: + maxFVLen = len(fieldVal) + spacerH = '{0}+{1}+{2}+\n'.format( + myTab, (maxFNLen + 2) * '-', (maxFVLen + 2) * '-') + argDocStr += spacerH + for fName, fVal in zip(fNames, fVals): + argDocStr += '{0}| {1} | {2} |\n'.format( + myTab, + fName + (maxFNLen - len(fName)) * ' ', + fVal + (maxFVLen - len(fVal)) * ' ') + argDocStr += spacerH + argDocStr += '\n' + self.webHelp.page().setLinkDelegationPolicy(0) + if isSphinx: + cntx = generate_context( + name="OpenCL Platforms and Devices", + argspec="", + note="", + math=True) + argDocStr = argDocStr.replace('imagezoom::', 'image::') + html_text = sphinxify(textwrap.dedent(argDocStr), cntx) + self.webHelp.setHtml(html_text, QtCore.QUrl(CSS_PATH)) + else: + argDocStr = "OpenCL Platforms and Devices\n\n" + argDocStr + self.webHelp.setText(textwrap.dedent(argDocStr)) + self.webHelp.setReadOnly(True) + + def addObject(self, view, parent, obj): + child0 = QStandardItem('_object') + child1 = QStandardItem(str(obj)) + child0.setFlags(self.objectFlag) + child1.setFlags(self.objectFlag) + child0.setDropEnabled(False) + child0.setDragEnabled(False) + child1.setDropEnabled(False) + child1.setDragEnabled(False) + parent.appendRow([child0, child1]) + view.setRowHidden(child0.index().row(), parent.index(), True) + return child0, child1 + + def addParam(self, parent, paramName, value, source=None): + """Add a pair of Parameter-Value Items""" + toolTip = None + child0 = QStandardItem(str(paramName)) + child0.setFlags(self.paramFlag) + child1 = QStandardItem(str(value)) + child1.setFlags(self.valueFlag) + if str(paramName) == "center": + toolTip = '\"x\" and \"z\" can be set to "auto"\ + for automatic alignment if \"y\" is known' +# if str(paramName) == "pitch": +# toolTip = 'For single OEs \"pitch\" can be set to "auto"\ +# for automatic alignment with known \"roll\", \"yaw\"' + child0.setDropEnabled(False) + child0.setDragEnabled(False) + if toolTip is not None: + child1.setToolTip(toolTip) + # self.setIItalic(child0) + if source is None: + parent.appendRow([child0, child1]) + else: + parent.insertRow(source.row() + 1, [child0, child1]) + return child0, child1 + + def addProp(self, parent, propName): + """Add non-editable Item""" + child0 = QStandardItem(str(propName)) + child0.setFlags(self.paramFlag) + child1 = QStandardItem() + child1.setFlags(self.paramFlag) + child0.setDropEnabled(False) + child0.setDragEnabled(False) + parent.appendRow([child0, child1]) + return child0 + + def addValue(self, parent, value, source=None): + """Add editable Item""" + child0 = QStandardItem(str(value)) + child0.setFlags(self.valueFlag) + child1 = QStandardItem() + child1.setFlags(self.paramFlag) + child0.setDropEnabled(False) + child0.setDragEnabled(False) + if source is None: + parent.appendRow([child0, child1]) + else: + parent.insertRow(source.row() + 1, [child0, child1]) + return child0 + + def objToInstance(self, obj): + instanceStr = '' + if obj is not None: + instanceStr = 'Instance of {0}'.format(obj.split('.')[-1]) + return instanceStr + + def classNameToStr(self, name): + className = str(name) + if len(className) > 2: + return '{0}{1}'.format(className[:2].lower(), className[2:]) + else: + return className.lower() + + def addElement(self, name, obj, copyFrom=None): + if copyFrom is not None: + for i in range(copyFrom.rowCount()): + if str(copyFrom.child(i, 0).text()) == '_object': + obj = self.getVal(copyFrom.child(i, 1).text()) + name = obj.__name__ + obj = "{0}.{1}".format(obj.__module__, name) + break + + for i in range(99): + elementName = self.classNameToStr(name) + '{:02d}'.format(i+1) + dupl = False + for ibm in range(self.rootBLItem.rowCount()): + if str(self.rootBLItem.child(ibm, 0).text()) ==\ + str(elementName): + dupl = True + if not dupl: + break + + elementItem, elementClass = self.addParam(self.rootBLItem, + elementName, + self.objToInstance(obj), + source=copyFrom) + elementClass.setFlags(self.objectFlag) + elementItem.setFlags(self.valueFlag) + if copyFrom is not None: + self.cpChLevel = 0 + self.copyChildren(elementItem, copyFrom) + else: + elementItem.setDragEnabled(True) + elprops = self.addProp(elementItem, 'properties') + self.addObject(self.tree, elementItem, obj) + for arg, argVal in self.getParams(obj): + self.addParam(elprops, arg, argVal) + self.showDoc(elementItem.index()) + self.addCombo(self.tree, elementItem) + self.tree.expand(self.rootBLItem.index()) + self.capitalize(self.tree, elementItem) + self.isEmpty = False + + def getParams(self, obj): + args = [] + argVals = [] + objRef = eval(str(obj)) + if inspect.isclass(objRef): + for parent in (inspect.getmro(objRef))[:-1]: + for namef, objf in inspect.getmembers(parent): + if inspect.ismethod(objf) or inspect.isfunction(objf): + if namef == "__init__" and\ + inspect.getargspec(objf)[3] is not None: + for arg, argVal in zip( + inspect.getargspec(objf)[0][1:], + inspect.getargspec(objf)[3]): + if arg == 'bl': + argVal = self.rootBLItem.text() + if arg not in args: + args.append(arg) + argVals.append(argVal) + if namef == "__init__" or namef.endswith("pop_kwargs"): + kwa = re.findall("(?<=kwargs\.pop).*?\)", + inspect.getsource(objf), + re.S) + if len(kwa) > 0: + kwa = [re.split( + ",", kwline.strip("\n ()"), + maxsplit=1) for kwline in kwa] + for kwline in kwa: + arg = kwline[0].strip("\' ") + if len(kwline) > 1: + argVal = kwline[1].strip("\' ") + else: + argVal = "None" + if arg not in args: + args.append(arg) + argVals.append(argVal) +# elif inspect.ismethod(objRef): +# argList = inspect.getargspec(objRef) +# if argList[3] is not None: +# args = argList[0][1:] +# argVals = argList[3] +# else: +# argList = inspect.getargspec(objRef) +# if argList[3] is not None: +# args = argList[0] +# argVals = argList[3] + elif inspect.ismethod(objRef) or inspect.isfunction(objRef): + argList = inspect.getargspec(objRef) + if argList[3] is not None: + if objRef.__name__ == 'run_ray_tracing': + args = argList[0] + argVals = argList[3] + else: + args = argList[0][1:] + argVals = argList[3] + return zip(args, argVals) + + def colorizeChangedParam(self, item): + parent = item.parent() + if parent is not None and\ + item.column() == 1 and\ + item.isEnabled(): + itemRow = item.row() + obj = None + for i in range(parent.rowCount()): + if str(parent.child(i, 0).text()) == '_object': + obj = str(parent.child(i, 1).text()) + break + if obj is None: + grandparent = parent.parent() + if grandparent is not None: + for i in range(grandparent.rowCount()): + if str(grandparent.child(i, 0).text()) == '_object': + obj = str(grandparent.child(i, 1).text()) + break + if obj is not None and str(parent.text()) != 'output': + if str(parent.child(itemRow, 0).text()) == 'beam': + color = None + if str(item.text()) == 'None': + color = QtCore.Qt.red + counter = 1 + elif parent.child(itemRow, 0).foreground().color() ==\ + QtCore.Qt.red: + color = QtCore.Qt.black + counter = -1 + else: + counter = 0 + if item.model() == self.beamLineModel: + self.blColorCounter += counter + else: + self.pltColorCounter += counter + self.colorizeTabText(item) + if color is not None: + self.setIFontColor(parent.child(itemRow, 0), color) + if parent.parent() != self.rootPlotItem: + self.setIFontColor(parent.parent(), color) + if parent.child(itemRow, 0).foreground().color() !=\ + QtCore.Qt.red: + for defArg, defArgVal in self.getParams(obj): + if str(defArg) == str(parent.child(itemRow, 0).text()): + if str(defArgVal) != str(item.text()): + color = QtCore.Qt.blue + else: + color = QtCore.Qt.black + self.setIFontColor(parent.child(itemRow, 0), color) + break + + def colorizeTabText(self, item): + if item.model() == self.beamLineModel: + color = QtCore.Qt.red if self.blColorCounter > 0 else\ + QtCore.Qt.black + self.tabs.tabBar().setTabTextColor(0, color) + elif item.model() == self.plotModel: + color = QtCore.Qt.red if self.pltColorCounter > 0 else\ + QtCore.Qt.black + self.tabs.tabBar().setTabTextColor(2, color) + + def addMethod(self, name, parentItem, fdoc): + elstr = str(parentItem.text()) + fdoc = fdoc[0].replace("Returned values: ", '').split(',') + + methodItem = self.addProp(parentItem, name.split('.')[-1] + '()') + self.setIItalic(methodItem) + methodProps = self.addProp(methodItem, 'parameters') + self.addObject(self.tree, methodItem, name) + + for arg, argVal in self.getParams(name): + if arg == 'bl': + argVal = self.rootBLItem.text() + child0, child1 = self.addParam(methodProps, arg, argVal) + + methodOut = self.addProp(methodItem, 'output') + for outstr in fdoc: + outval = outstr.strip() + + for i in range(99): + beamName = '{0}{1}{2:02d}'.format(elstr, outval, i+1) + dupl = False + for ibm in range(self.beamModel.rowCount()): + if str(self.beamModel.index(ibm, 0).data(0)) ==\ + str(beamName): + dupl = True + if not dupl: + break + + child0, child1 = self.addParam(methodOut, outval, beamName) + self.beamModel.appendRow(QStandardItem(beamName)) + + self.showDoc(methodItem.index()) + self.addCombo(self.tree, methodItem) + self.tree.expand(methodItem.index()) + self.tree.expand(methodOut.index()) + self.tree.expand(methodProps.index()) + self.tree.setCurrentIndex(methodProps.index()) + self.tree.setColumnWidth(0, int(self.tree.width()/3)) + self.isEmpty = False + + def addPlot(self, copyFrom=None): + for i in range(99): + plotName = 'plot{:02d}'.format(i+1) + dupl = False + for ibm in range(self.rootPlotItem.rowCount()): + if str(self.rootPlotItem.child(ibm, 0).text()) ==\ + str(plotName): + dupl = True + if not dupl: + break + + plotItem = self.addValue(self.rootPlotItem, plotName, source=copyFrom) + + if copyFrom is not None: + self.cpChLevel = 0 + self.copyChildren(plotItem, copyFrom) + else: + for name, obj in inspect.getmembers(xrtplot): + if name == "XYCPlot" and inspect.isclass(obj): + self.addObject(self.plotTree, plotItem, + '{0}.{1}'.format(xrtplot.__name__, name)) + for namef, objf in inspect.getmembers(obj): + if inspect.ismethod(objf) or inspect.isfunction(objf): + if namef == "__init__" and\ + inspect.getargspec(objf)[3] is not None: + for arg, arg_def in zip( + inspect.getargspec(objf)[0][1:], + inspect.getargspec(objf)[3]): + # child0 = QStandardItem(str(arg)) + # child0.setFlags(self.paramFlag) + if len(re.findall("axis", + arg.lower())) > 0: + child0 = self.addProp(plotItem, + str(arg)) + for name2, obj2 in\ + inspect.getmembers(xrtplot): + if name2 == "XYCAxis" and\ + inspect.isclass(obj2): + self.addObject(self.plotTree, + child0, + '{0}.{1}'.format( # analysis:ignore + xrtplot.__name__, # analysis:ignore + name2)) + for namef2, objf2 in\ + inspect.getmembers( + obj2): + if (inspect.ismethod( + objf2) or + inspect.isfunction( + objf2)): + argsList =\ + inspect.getargspec( + objf2) + if namef2 ==\ + "__init__" and\ + argsList[3] is\ + not None: + for arg2, arg_def2\ + in zip( + argsList[0][1:], # analysis:ignore + argsList[3]): # analysis:ignore + if str(arg) == 'caxis' and str(arg2) == 'unit': # analysis:ignore + arg_def2 = 'eV' # analysis:ignore + self.addParam(child0, arg2, arg_def2) # analysis:ignore + else: + if str(arg) == 'title': + arg_value = plotItem.text() + else: + arg_value = arg_def + self.addParam(plotItem, arg, arg_value) + self.showDoc(plotItem.index()) + self.addCombo(self.plotTree, plotItem) + self.capitalize(self.plotTree, plotItem) + self.plotTree.expand(self.rootPlotItem.index()) + self.plotTree.setColumnWidth(0, int(self.plotTree.width()/3)) + self.isEmpty = False + + def addPlotBeam(self, beamName): + self.addPlot() + tItem = self.rootPlotItem.child(self.rootPlotItem.rowCount() - 1, 0) + for ie in range(tItem.rowCount()): + if tItem.child(ie, 0).text() == 'beam': + child1 = tItem.child(ie, 1) + if child1 is not None: + child1.setText(beamName) + iWidget = self.plotTree.indexWidget(child1.index()) + if iWidget is not None: + iWidget.setCurrentIndex(iWidget.findText(beamName)) + break + + def getArgDescr(self, obj): + argDescName = [] + argDescValue = [] + objRef = eval(obj) + + def parseDescr(obji): + fdoc = obji.__doc__ + if fdoc is not None: + fdocRec = re.findall("\*.*?\n\n(?= *\*|\n)", fdoc, re.S | re.U) + if len(fdocRec) > 0: + descs = [re.split( + "\*\:", + fdc.rstrip("\n")) for fdc in fdocRec] + for desc in descs: + if len(desc) == 2: + descName = desc[0] + descBody = desc[1].strip("\* ") + if descName not in argDescName: + argDescName.append(descName) + argDescValue.append(descBody) + + if inspect.isclass(objRef): + for parent in inspect.getmro(objRef)[:-1]: + for namef, objf in inspect.getmembers(parent): + if (inspect.ismethod(objf) or inspect.isfunction(objf)): + if namef == "__init__" or namef.endswith("pop_kwargs"): + parseDescr(objf) + else: + parseDescr(objRef) + + return argDescName, argDescValue + + def addMaterial(self, name, obj): + for i in range(99): + matName = self.classNameToStr(name) + '{:02d}'.format(i+1) + dupl = False + for ibm in range(self.rootMatItem.rowCount()): + if str(self.rootMatItem.child(ibm, 0).text()) == str(matName): + dupl = True + if not dupl: + break + + matItem, matClass = self.addParam(self.rootMatItem, + matName, + self.objToInstance(obj)) + matClass.setFlags(self.objectFlag) + matItem.setFlags(self.valueFlag) + matProps = self.addProp(matItem, 'properties') + self.addObject(self.matTree, matItem, obj) + + for arg, argVal in self.getParams(obj): + self.addParam(matProps, arg, argVal) + self.showDoc(matItem.index()) + self.addCombo(self.matTree, matItem) + self.capitalize(self.matTree, matItem) + self.isEmpty = False + + def moveItem(self, mvDir, view, item): + oldRowNumber = item.index().row() + statusExpanded = view.isExpanded(item.index()) + parent = item.parent() + self.flattenElement(view, item) + newItem = parent.takeRow(oldRowNumber) + parent.insertRow(oldRowNumber + mvDir, newItem) + self.addCombo(view, newItem[0]) + view.setExpanded(newItem[0].index(), statusExpanded) + + def copyChildren(self, itemTo, itemFrom): + if itemFrom.hasChildren(): + self.cpChLevel += 1 + for ii in range(itemFrom.rowCount()): + child0 = itemFrom.child(ii, 0) + if itemFrom.model() == self.beamLineModel and\ + str(child0.text()) != 'properties' and\ + str(child0.text()) != '_object' and\ + self.cpChLevel == 1: + pass + else: + child1 = itemFrom.child(ii, 1) + child0n = QStandardItem(child0.text()) + child0n.setFlags(child0.flags()) + child0n.setForeground(child0.foreground()) + if child1 is not None: + child1n = QStandardItem(child1.text()) + child1n.setFlags(child1.flags()) + itemTo.appendRow([child0n, child1n]) + else: + itemTo.appendRow(child0n) + self.copyChildren(child0n, child0) + self.cpChLevel -= 1 + else: + pass + + def deleteElement(self, view, item): + while item.hasChildren(): + iItem = item.child(0, 0) + if item.child(0, 1) is not None: + if str(iItem.text()) == 'beam' and\ + str(item.child(0, 1).text()) == 'None': + if iItem.model() == self.beamLineModel: + self.blColorCounter -= 1 + elif iItem.model() == self.plotModel: + self.pltColorCounter -= 1 + iWidget = view.indexWidget(item.child(0, 1).index()) + if iWidget is not None: + if item.text() == "output" and\ + iWidget.model() == self.beamModel: + self.beamModel.takeRow(iWidget.currentIndex()) + self.deleteElement(view, iItem) + else: + self.colorizeTabText(item) + if item.parent() is not None: + item.parent().removeRow(item.index().row()) + else: + item.model().invisibleRootItem().removeRow(item.index().row()) + + def exportLayout(self): + saveStatus = False + if self.layoutFileName == "": + saveDialog = QFileDialog() + saveDialog.setFileMode(QFileDialog.AnyFile) + saveDialog.setAcceptMode(QFileDialog.AcceptSave) + saveDialog.setNameFilter("XML files (*.xml)") + if (saveDialog.exec_()): + self.layoutFileName = saveDialog.selectedFiles()[0] + if self.layoutFileName != "": + self.confText = "\n" + self.confText += "\n" + for item, view in zip([self.rootBeamItem, + self.rootMatItem, + self.rootBLItem, + self.rootPlotItem, + self.rootRunItem], + [None, + self.matTree, + self.tree, + self.plotTree, + self.runTree]): + self.flattenElement(view, item) + if item == self.rootPlotItem and\ + self.rootPlotItem.rowCount() == 0: + item = self.plotModel.invisibleRootItem() + item.setEditable(True) + self.exportModel(item) + self.confText += '\n{0}\n\n'.format( + self.fileDescription) + self.confText += "\n" + if not str(self.layoutFileName).endswith('.xml'): + self.layoutFileName += '.xml' + try: + fileObject = open(self.layoutFileName, 'w') + fileObject.write(self.confText) + fileObject.close + saveStatus = True + self.setWindowTitle(self.layoutFileName + " - xrtQook") + messageStr = 'Layout saved to {}'.format( + os.path.basename(str(self.layoutFileName))) + except (IOError, OSError) as errs: + messageStr = 'Failed to save layout to {0}, {1}'.format( + os.path.basename(str(self.layoutFileName)), str(errs)) + self.statusBar.showMessage(messageStr, 3000) + return saveStatus + + def exportLayoutAs(self): + tmpName = self.layoutFileName + self.layoutFileName = "" + if not self.exportLayout(): + self.statusBar.showMessage( + 'Failed saving to {}'.format( + os.path.basename(str(self.layoutFileName))), 3000) + self.layoutFileName = tmpName + + def exportModel(self, item): + flatModel = False + if item.model() in [self.beamModel]: + flatModel = True + if item.hasChildren(): + self.prefixtab = self.ntab * '\t' + if item.isEditable(): + itemType = "value" + else: + itemType = "prop" + self.confText += '{0}<{1} type=\"{2}\">\n'.format( + self.prefixtab, str(item.text()).strip('()'), itemType) + self.ntab += 1 + self.prefixtab = self.ntab * '\t' + for ii in range(item.rowCount()): + child0 = item.child(ii, 0) + self.exportModel(child0) + child1 = item.child(ii, 1) + if child1 is not None: + if child1.flags() != self.paramFlag: + if child1.isEnabled(): + itemType = "param" + else: + itemType = "object" + if int(child1.isEnabled()) == int(child0.isEnabled()): + self.confText +=\ + '{0}<{1} type=\"{3}\">{2}\n'.format( + self.prefixtab, + child0.text(), + child1.text(), + itemType) + elif flatModel: + self.confText +=\ + '{0}<{1} type=\"flat\">\n'.format( + self.prefixtab, child0.text()) + + self.ntab -= 1 + self.prefixtab = self.ntab * '\t' + self.confText += '{0}\n'.format( + self.prefixtab, str(item.text()).strip('()')) + else: + pass + + def importLayout(self): + if not self.isEmpty: + msgBox = QMessageBox() + if msgBox.warning(self, + 'Warning', + 'Current layout will be overwritten. Continue?', + buttons=QMessageBox.Yes | + QMessageBox.No, + defaultButton=QMessageBox.No)\ + == QMessageBox.Yes: + self.isEmpty = True + if self.isEmpty: + self.initAllModels() + self.initAllTrees() + openFileName = "" + openDialog = QFileDialog() + openDialog.setFileMode(QFileDialog.ExistingFile) + openDialog.setAcceptMode(QFileDialog.AcceptOpen) + openDialog.setNameFilter("XML files (*.xml)") + if (openDialog.exec_()): + openFileName = openDialog.selectedFiles()[0] + ldMsg = 'Loading layout from {}'.format( + os.path.basename(str(openFileName))) + parseOK = False + try: + treeImport = ET.parse(openFileName) + parseOK = True + except (IOError, OSError, ET.ParseError) as errStr: + ldMsg = str(errStr) + if parseOK: + root = treeImport.getroot() + self.ntab = 0 + for (i, rootModel), tree in zip(enumerate( + [self.rootBeamItem, + self.rootMatItem, + self.rootBLItem, + self.rootPlotItem, + self.rootRunItem]), + [None, + self.matTree, + self.tree, + self.plotTree, + self.runTree]): + for ie in range(rootModel.rowCount()): + rootModel.removeRow(0) + if rootModel == self.rootMatItem: + self.addProp( + self.materialsModel.invisibleRootItem(), + "None") + if rootModel in [self.rootBLItem, self.rootPlotItem]: + rootModel.setText(root[i].tag) + self.iterateImport(tree, rootModel, root[i]) + if tree is not None: + self.checkDefaults(None, rootModel) + tmpBlColor = self.blColorCounter + tmpPltColor = self.pltColorCounter + self.addCombo(tree, rootModel) + self.blColorCounter = tmpBlColor + self.pltColorCounter = tmpPltColor + self.colorizeTabText(rootModel) + msgStr = " {0:d} percent done.".format(int(i*100/5)) + self.statusBar.showMessage(ldMsg + msgStr) + self.layoutFileName = openFileName + self.fileDescription = root[5].text if\ + len(root) > 5 else "" + self.descrEdit.setText(self.fileDescription) + self.showTutorial( + self.fileDescription, + "Descriprion", + os.path.dirname(os.path.abspath(self.layoutFileName))) + self.setWindowTitle(self.layoutFileName + " - xrtQook") + self.writeCodeBox("") + self.plotTree.expand(self.rootPlotItem.index()) + self.plotTree.setColumnWidth( + 0, int(self.plotTree.width()/3)) + self.tabs.setCurrentWidget(self.tree) + self.statusBar.showMessage( + 'Loaded layout from {}'.format( + os.path.basename(str(self.layoutFileName))), 3000) + self.isEmpty = False + else: + self.statusBar.showMessage(ldMsg) + + def iterateImport(self, view, rootModel, rootImport): + if ET.iselement(rootImport): + self.ntab += 1 + for childImport in rootImport: + itemType = str(childImport.attrib['type']) + itemTag = str(childImport.tag) + itemText = str(childImport.text) + child0 = QStandardItem(itemTag) + if itemType == "flat": + child0 = rootModel.appendRow(QStandardItem(itemTag)) + elif itemType == "value": + child0 = self.addValue(rootModel, itemTag) + if self.ntab == 1: + self.capitalize(view, child0) + elif itemType == "prop": + child0 = self.addProp(rootModel, itemTag) + elif itemType == "object": + child0, child1 = self.addObject(view, + rootModel, + itemText) + elif itemType == "param": + child0, child1 = self.addParam(rootModel, + itemTag, + itemText) + self.iterateImport(view, child0, childImport) + self.ntab -= 1 + else: + pass + + def checkDefaults(self, obj, item): + if item.hasChildren(): + paraProp = -1 + for ii in range(item.rowCount()): + if item.child(ii, 0).text() == '_object': + obj = item.child(ii, 1).text() + if item.parent() is not None and\ + item.model() != self.plotModel: + neighbour = item.parent().child(item.row(), 1) + if item.isEditable(): # Beamline Element or Material + neighbour.setText(self.objToInstance(obj)) + else: # Beamline Element Method + item.setText(item.text()+'()') + self.setIItalic(item) + neighbour.setFlags(self.objectFlag) + elif item.model() == self.materialsModel: + neighbour = self.rootMatItem.child(item.row(), 1) + neighbour.setText(self.objToInstance(obj)) + neighbour.setFlags(self.objectFlag) + if item.child(ii, 0).text() in ['properties', 'parameters']: + paraProp = ii + if paraProp >= 0: + for ii in range(item.rowCount()): + self.checkDefaults(obj, item.child(ii, 0)) + else: + if obj is not None and str(item.text()) != 'output': + loadedParams = [] + for ii in range(item.rowCount()): + loadedParams.extend([[item.child(ii, 0).text(), + item.child(ii, 1).text(), + item.child(ii, 0).hasChildren()]]) + counter = -1 + for argName, argVal in self.getParams(obj): + if counter < len(loadedParams) - 1: + counter += 1 + if counter < len(loadedParams) - 1 and\ + str(loadedParams[counter][0]) == '_object': + counter += 1 + child0 = item.child(counter, 0) + child1 = item.child(counter, 1) + if str(argName) == str(loadedParams[counter][0]): + if str(argVal) != str( + loadedParams[counter][1]) and\ + not loadedParams[counter][2]: + self.setIFontColor(child0, + QtCore.Qt.blue) + else: + for ix in range(len(loadedParams)): + if str(argName) == str( + loadedParams[ix][0]): + if str(argVal) != str( + loadedParams[ix][1]) and\ + not loadedParams[ix][2]: + argVal = loadedParams[ix][1] + self.setIFontColor( + child0, + QtCore.Qt.blue) + break + child0.setText(str(argName)) + child0.setFlags(self.paramFlag) + child1.setText(str(argVal)) + child1.setFlags(self.valueFlag) + else: + counter += 1 + child0, child1 = self.addParam(item, + argName, + argVal) + if str(child0.text()) == 'beam' and\ + str(child1.text()) == 'None': + if child0.model() == self.beamLineModel: + self.blColorCounter += 1 + elif child0.model() == self.plotModel: + self.pltColorCounter += 1 + if item.rowCount() > counter + 1: + item.removeRows(counter + 1, item.rowCount()-counter-1) + for ii in range(item.rowCount()): + if item.child(ii, 0).hasChildren(): + self.checkDefaults(obj, item.child(ii, 0)) + else: + pass + + def flattenElement(self, view, item): + if item.hasChildren(): + for ii in range(item.rowCount()): + iItem = item.child(ii, 0) + if item.child(ii, 1) is not None: + iWidget = view.indexWidget(item.child(ii, 1).index()) + if iWidget is not None: + if iWidget.staticMetaObject.className() == 'QComboBox': + if str(iItem.text()) == "targetOpenCL": + chItemText = self.OCLModel.item( + iWidget.currentIndex(), 1).text() + else: + chItemText = iWidget.currentText() + elif iWidget.staticMetaObject.className() ==\ + 'QListWidget': + chItemText = "(" + for rState in range(iWidget.count()): + if int(iWidget.item(rState).checkState()) == 2: + chItemText += str(rState+1) + "," + else: + chItemText += ")" + item.child(ii, 1).setText(chItemText) + self.flattenElement(view, iItem) + else: + pass + + def addCombo(self, view, item): + if item.hasChildren(): + itemTxt = str(item.text()) + for ii in range(item.rowCount()): + child0 = item.child(ii, 0) + child1 = item.child(ii, 1) + if str(child0.text()) == '_object': + view.setRowHidden(child0.index().row(), item.index(), True) + if child1 is not None and not child0.isEditable(): + value = child1.text() + paramName = str(child0.text()) + iWidget = view.indexWidget(child1.index()) + if iWidget is None: + combo = None + if isinstance(self.getVal(value), bool): + combo = self.addStandardCombo( + self.boolModel, value) + view.setIndexWidget(child1.index(), combo) + if len(re.findall("beam", paramName.lower())) > 0\ + and paramName.lower() != 'beamline'\ + and paramName.lower() != 'filamentbeam': + combo = self.addStandardCombo( + self.beamModel, value) + view.setIndexWidget(child1.index(), combo) + self.colorizeChangedParam(child1) + if itemTxt.lower() == "output": + combo.setEditable(True) + combo.setInsertPolicy(2) + elif paramName == "bl" or\ + paramName == "beamLine": + combo = self.addEditableCombo( + self.beamLineModel, value) + combo.setInsertPolicy(2) + view.setIndexWidget(child1.index(), combo) + elif paramName == "plots": + combo = self.addEditableCombo( + self.plotModel, value) + combo.setInsertPolicy(2) + view.setIndexWidget(child1.index(), combo) + elif len(re.findall("material", + paramName.lower())) > 0: + combo = self.addStandardCombo( + self.materialsModel, value) + view.setIndexWidget(child1.index(), combo) + elif len(re.findall( + "density", paramName)) > 0 and\ + paramName != 'uniformRayDensity': + combo = self.addStandardCombo( + self.densityModel, value) + view.setIndexWidget(child1.index(), combo) + elif len(re.findall("polarization", + paramName.lower())) > 0: + combo = self.addEditableCombo( + self.polarizationsModel, value) + view.setIndexWidget(child1.index(), combo) + elif len(re.findall("shape", + paramName.lower())) > 0: + combo = self.addEditableCombo( + self.shapeModel, value) + view.setIndexWidget(child1.index(), combo) + elif len(re.findall("table", + paramName.lower())) > 0: + combo = self.addStandardCombo( + self.matTableModel, value) + view.setIndexWidget(child1.index(), combo) + elif len(re.findall("data", + paramName.lower())) > 0 and\ + len(re.findall("axis", + itemTxt.lower())) > 0: + combo = self.addStandardCombo( + self.fluxDataModel, value) + view.setIndexWidget(child1.index(), combo) + elif len(re.findall("label", + paramName.lower())) > 0 and\ + len(re.findall("axis", + itemTxt.lower())) > 0: + if value == '': + if itemTxt.lower() == "xaxis": + value = "x" + elif itemTxt.lower() == "yaxis": + value = "z" + else: + value = "energy" + combo = self.addEditableCombo( + self.plotAxisModel, value) + view.setIndexWidget(child1.index(), combo) + elif len(re.findall("fluxkind", + paramName.lower())) > 0: + combo = self.addStandardCombo( + self.fluxKindModel, value) + view.setIndexWidget(child1.index(), combo) + elif view == self.matTree and len( + re.findall("kind", paramName.lower())) > 0: + combo = self.addStandardCombo( + self.matKindModel, value) + view.setIndexWidget(child1.index(), combo) + elif len(re.findall("distE", + paramName)) > 0: + combo = QComboBox() + for icd in range(item.parent().rowCount()): + if item.parent().child(icd, + 0).text() == '_object': + if len(re.findall('Source', + item.parent().child( + icd, 1).text())) > 0: + combo.setModel(self.distEModelG) + else: + combo.setModel(self.distEModelS) + combo.setCurrentIndex(combo.findText(value)) + view.setIndexWidget(child1.index(), combo) + elif len(re.findall("geom", paramName.lower())) > 0: + combo = self.addStandardCombo( + self.matGeomModel, value) + view.setIndexWidget(child1.index(), combo) + elif len(re.findall("aspect", + paramName.lower())) > 0: + combo = self.addEditableCombo( + self.aspectModel, value) + view.setIndexWidget(child1.index(), combo) + elif len(re.findall("rayflag", + paramName.lower())) > 0: + combo = QListWidget() + for iray, ray in enumerate(['Good', + 'Out', + 'Over', + 'Alive']): + rayItem = QListWidgetItem(str(ray)) + if len(re.findall(str(iray + 1), + str(value))) > 0: + rayItem.setCheckState(QtCore.Qt.Checked) + else: + rayItem.setCheckState(QtCore.Qt.Unchecked) + combo.addItem(rayItem) + combo.setMaximumHeight(( + combo.sizeHintForRow(1) + 1) * + self.rayModel.rowCount()) + view.setIndexWidget(child1.index(), combo) + elif len(re.findall("targetopencl", + paramName.lower())) > 0: + combo = QComboBox() + combo.setModel(self.OCLModel) + oclInd = self.OCLModel.findItems( + value, flags=QtCore.Qt.MatchExactly, column=1) + if len(oclInd) > 0: + oclInd = oclInd[0].row() + else: + oclInd = 1 + combo.setCurrentIndex(oclInd) + view.setIndexWidget(child1.index(), combo) + elif len(re.findall("precisionopencl", + paramName.lower())) > 0: + combo = self.addStandardCombo( + self.oclPrecnModel, value) + view.setIndexWidget(child1.index(), combo) + if combo is not None: + if combo.staticMetaObject.className() ==\ + 'QListWidget': + combo.clicked.connect( + partial(self.processListWidget, child1)) + elif combo.staticMetaObject.className() ==\ + 'QComboBox': + combo.currentIndexChanged['QString'].connect( + child1.setText) + self.addCombo(view, child0) + else: + pass + + def processListWidget(self, item): + iWidget = self.sender() + chItemText = "(" + for rState in range(iWidget.count()): + if int(iWidget.item(rState).checkState()) == 2: + chItemText += str(rState+1) + "," + else: + chItemText += ")" + item.setText(chItemText) + + def addEditableCombo(self, model, value): + combo = QComboBox() + combo.setModel(model) + if combo.findText(value) < 0: + newItem = QStandardItem(value) + model.appendRow(newItem) + combo.setCurrentIndex(combo.findText(value)) + combo.setEditable(True) + combo.setInsertPolicy(1) + return combo + + def addStandardCombo(self, model, value): + combo = QComboBox() + combo.setModel(model) + combo.setCurrentIndex(combo.findText(value)) + return combo + + def openMenu(self, position): + indexes = self.tree.selectedIndexes() + + level = 100 + if len(indexes) > 0: + level = 0 + selIndex = indexes[0] + index = indexes[0] + selectedItem = self.beamLineModel.itemFromIndex(selIndex) + selText = selectedItem.text() + + while index.parent().isValid(): + index = index.parent() + level += 1 + + menu = QMenu() + if level == 0 or level == 100: + menu.addAction("Load Layout", self.importLayout) + menu.addAction("Save Layout", self.exportLayout) + menu.addSeparator() + menusrc = menu.addMenu(self.tr("Add Source")) + menuoe = menu.addMenu(self.tr("Add OE")) + menuapt = menu.addMenu(self.tr("Add Aperture")) + menuscr = menu.addMenu(self.tr("Add Screen")) + for tsubmenu, tmodule in zip([menusrc, menuoe, menuapt, menuscr], + [rsources, roes, rapts, rscreens]): + for elname in tmodule.__all__: + objName = '{0}.{1}'.format(tmodule.__name__, elname) + elAction = QAction(self) + elAction.setText(elname) + elAction.hovered.connect(partial(self.showObjHelp, + objName)) + elAction.triggered.connect( + partial(self.addElement, elname, objName, None)) + tsubmenu.addAction(elAction) + elif level == 1 and selText != "properties": + tsubmenu = menu.addMenu(self.tr("Add method")) + menu.addSeparator() + menu.addAction("Duplicate " + str(selectedItem.text()), + partial(self.addElement, None, None, selectedItem)) + menu.addSeparator() + if selIndex.row() > 2: + menu.addAction("Move Up", partial(self.moveItem, -1, + self.tree, + selectedItem)) + if selIndex.row() < selectedItem.parent().rowCount()-1: + menu.addAction("Move Down", partial(self.moveItem, 1, + self.tree, + selectedItem)) + menu.addSeparator() + deleteActionName = "Remove " + str(selectedItem.text()) + menu.addAction(deleteActionName, partial(self.deleteElement, + self.tree, + selectedItem)) + + for ic in range(selectedItem.rowCount()): + if selectedItem.child(ic, 0).text() == "_object": + elstr = str(selectedItem.child(ic, 1).text()) + break + elcls = eval(elstr) + for namef, objf in inspect.getmembers(elcls): + if (inspect.ismethod(objf) or inspect.isfunction(objf)) and\ + not str(namef).startswith("_"): + fdoc = objf.__doc__ + if fdoc is not None: + objfNm = '{0}.{1}'.format(elstr, + objf.__name__) + fdoc = re.findall(r"Returned values:.*", fdoc) + if len(fdoc) > 0: + methAction = QAction(self) + methAction.setText(namef + '()') + methAction.hovered.connect( + partial(self.showObjHelp, objfNm)) + methAction.triggered.connect( + partial(self.addMethod, objfNm, + selectedItem, fdoc)) + tsubmenu.addAction(methAction) + elif level == 2 and selText != "properties": + deleteActionName = "Remove " + str(selText) + menu.addAction(deleteActionName, partial(self.deleteElement, + self.tree, + selectedItem)) + elif level == 4: + selParent = selectedItem.parent() + selRow = selectedItem.row() + child0 = selParent.child(selRow, 0) + child1 = selParent.child(selRow, 1) + if str(child0.text()).lower().startswith('beam') and\ + str(selParent.text()).lower().startswith('output') and\ + not str(child1.text()).lower().startswith('none') and\ + self.tree.indexWidget(child1.index()) is not None: + menu.addAction(self.tr("Plot " + child1.text()), + partial(self.addPlotBeam, child1.text())) + + menu.exec_(self.tree.viewport().mapToGlobal(position)) + + def plotMenu(self, position): + indexes = self.plotTree.selectedIndexes() + level = 100 + if len(indexes) > 0: + level = 0 + index = indexes[0] + selectedItem = self.plotModel.itemFromIndex(index) + while index.parent().isValid(): + index = index.parent() + level += 1 + + menu = QMenu() + + if level == 0 or level == 100: + menu.addAction(self.tr("Add Plot"), self.addPlot) + elif level == 1: + copyActionName = "Duplicate " + str(selectedItem.text()) + menu.addAction(copyActionName, partial(self.addPlot, + selectedItem)) + deleteActionName = "Remove " + str(selectedItem.text()) + menu.addAction(deleteActionName, partial(self.deleteElement, + self.plotTree, + selectedItem)) + else: + pass + + menu.exec_(self.plotTree.viewport().mapToGlobal(position)) + + def matMenu(self, position): + indexes = self.matTree.selectedIndexes() + level = 100 + if len(indexes) > 0: + level = 0 + index = indexes[0] + selectedItem = self.materialsModel.itemFromIndex(index) + while index.parent().isValid(): + index = index.parent() + level += 1 + + menu = QMenu() + + matMenu = menu.addMenu(self.tr("Add Material")) + for mName in rmats.__all__: + objName = '{0}.{1}'.format(rmats.__name__, mName) + matAction = QAction(self) + matAction.setText(mName) + matAction.hovered.connect(partial(self.showObjHelp, objName)) + matAction.triggered.connect(partial(self.addMaterial, mName, + objName)) + matMenu.addAction(matAction) + + if level == 0 and selectedItem.text() != "None": + menu.addSeparator() + deleteActionName = "Remove " + str(selectedItem.text()) + menu.addAction(deleteActionName, partial(self.deleteElement, + self.matTree, + selectedItem)) + else: + pass + + menu.exec_(self.matTree.viewport().mapToGlobal(position)) + + def getVal(self, value): + try: + return eval(str(value)) + except: + return str(value) + + def quotize(self, value): + try: + dummy = unicode # test for Python3 compatibility analysis:ignore + except NameError: + unicode = str + if isinstance(self.getVal(value), (str, unicode)): + if 'np.' not in value and\ + (str(self.rootBLItem.text())+'.') not in value: + value = 'r\"{}\"'.format(value) + if str(value) == 'round': + value = 'r\"{}\"'.format(value) + if isinstance(self.getVal(value), tuple): + value = list(self.getVal(value)) + return str(value) + + def quotizeAll(self, value): + return str('r\"{}\"'.format(value)) + + def whichCrystal(self, matName): + material = self.materialsModel.findItems(matName)[0] + rtype = "None" + if material.text() != "None": + for i in range(material.rowCount()): + if material.child(i, 0).text() == '_object': + mstr = str(material.child(i, 1).text()) + break + for parent in (inspect.getmro(eval(mstr)))[:-1]: + pname = str(parent.__name__) + if len(re.findall("crystal", str.lower(pname))) > 0: + rtype = "crystal" + break + elif len(re.findall("multilayer", str.lower(pname))) > 0: + rtype = "mlayer" + break + return rtype + + def generateCode(self): + self.flattenElement(self.tree, self.rootBLItem) + self.flattenElement(self.matTree, self.rootMatItem) + self.flattenElement(self.plotTree, self.rootPlotItem) + self.flattenElement(self.runTree, self.rootRunItem) + + BLName = str(self.rootBLItem.text()) + e0str = "{}E0 = 5000\n".format(myTab) + fullCode = "" + codeHeader = """# -*- coding: utf-8 -*-\n\"\"\"\n +__author__ = \"Konstantin Klementiev\", \"Roman Chernikov\" +__date__ = \"{0}\"\n\nCreated with xrtQook\n\n\n{2}\n\n"\"\"\n +import numpy as np\nimport sys\nsys.path.append(r\"{1}\")\n""".format( + str(date.today()), path_to_xrt, self.fileDescription) + codeDeclarations = """\n""" + codeBuildBeamline = "\ndef build_beamline():\n" + codeBuildBeamline += '{2}{0} = {1}.BeamLine('.format( + BLName, raycing.__name__, myTab) + for ib in range(self.rootBLItem.rowCount()): + if self.rootBLItem.child(ib, 0).text() == '_object': + blstr = str(self.rootBLItem.child(ib, 1).text()) + break + for ib in range(self.rootBLItem.rowCount()): + if self.rootBLItem.child(ib, 0).text() == 'properties': + blPropItem = self.rootBLItem.child(ib, 0) + for iep, arg_def in zip(range( + blPropItem.rowCount()), + list(zip(*self.getParams(blstr)))[1]): + paraname = str(blPropItem.child(iep, 0).text()) + paravalue = str(blPropItem.child(iep, 1).text()) + if paravalue != str(arg_def): + paravalue = self.quotize(paravalue) + codeBuildBeamline += '\n{2}{0}={1},'.format( + paraname, paravalue, myTab*2) + codeBuildBeamline = codeBuildBeamline.rstrip(',') + ')\n\n' + + codeRunProcess = '\ndef run_process({}):\n'.format(BLName) + codeAlignBL = "" + codeMain = "\ndef main():\n" + codeMain += '{0}{1} = build_beamline()\n'.format(myTab, BLName) + + codeFooter = """\n +if __name__ == '__main__': + main()\n""" + for ie in range(self.rootMatItem.rowCount()): + if str(self.rootMatItem.child(ie, 0).text()) != "None": + matItem = self.rootMatItem.child(ie, 0) + ieinit = "" + for ieph in range(matItem.rowCount()): + if matItem.child(ieph, 0).text() == '_object': + elstr = str(matItem.child(ieph, 1).text()) + ieinit = elstr + "(" + ieinit + break + for ieph in range(matItem.rowCount()): + if matItem.child(ieph, 0).text() != '_object': + if matItem.child(ieph, 0).text() == 'properties': + pItem = matItem.child(ieph, 0) + for iep, arg_def in zip(range( + pItem.rowCount()), + list(zip(*self.getParams(elstr)))[1]): + paraname = str(pItem.child(iep, 0).text()) + paravalue = str(pItem.child(iep, 1).text()) + if paravalue != str(arg_def) or\ + paravalue == 'bl': + paravalue = self.quotize(paravalue) + ieinit += '\n{2}{0}={1},'.format( + paraname, paravalue, myTab) + codeDeclarations += '{0} = {1})\n\n'.format( + matItem.text(), str.rstrip(ieinit, ",")) + + for ie in range(self.rootBLItem.rowCount()): + if self.rootBLItem.child(ie, 0).text() != "properties" and\ + self.rootBLItem.child(ie, 0).text() != "_object": + tItem = self.rootBLItem.child(ie, 0) + ieinit = "" + ierun = "" + autoX = False + autoZ = False + autoPitch = False + autoBragg = False + matType = 'None' + for ieph in range(tItem.rowCount()): + if tItem.child(ieph, 0).text() == '_object': + elstr = str(tItem.child(ieph, 1).text()) + ieinit = elstr + "(" + ieinit + + for ieph in range(tItem.rowCount()): + if tItem.child(ieph, 0).text() == 'properties': + pItem = tItem.child(ieph, 0) + for iep, arg_def in zip(range( + pItem.rowCount()), + list(zip(*self.getParams(elstr)))[1]): + paraname = str(pItem.child(iep, 0).text()) + paravalue = str(pItem.child(iep, 1).text()) + if paraname == 'center': + if paravalue.startswith('['): + paravalue = re.findall('\[(.*)\]', + paravalue)[0] + elif paravalue.startswith('('): + paravalue = re.findall('\((.*)\)', + paravalue)[0] + cCoord = [self.getVal(c.strip()) for c in + str.split(paravalue, ',')] + if 'auto' in str(cCoord[0]): + autoX = True + cCoord[0] = '0.0' + if 'auto' in str(cCoord[2]): + autoZ = True + cCoord[2] = '0.0' + paravalue = re.sub('\'', '', str( + [self.getVal(c) for c in cCoord])) + # if paraname == "yaw" and paravalue == "auto": + # autoYaw = True + # paravalue = '0.0' + if paraname == "pitch" and ('auto' in paravalue): + autoPitch = True + paravalue = '0.0' + if paraname == "bragg" and ('auto' in paravalue): + autoBragg = True + paravalue = '0.0' + if paraname == "material": + matType = self.whichCrystal(paravalue) + matName = paravalue + if BLName in paravalue and paraname != 'bl': + codeAlignBL += '{0}{1}.{2}.{3}={4}\n'.format( + myTab, BLName, tItem.text(), paraname, + paravalue) + if paravalue != str(arg_def) or\ + paraname == 'bl': + if paraname not in ['bl', + 'material', + 'material2']: + paravalue = self.quotize(paravalue) + ieinit += '\n{2}{0}={1},'.format( + paraname, paravalue, myTab*2) + for ieph in range(tItem.rowCount()): + if tItem.child(ieph, 0).text() != '_object' and\ + tItem.child(ieph, 0).text() != 'properties': + pItem = tItem.child(ieph, 0) + tmpBeamName = "" + tmpSourceName = "" + for namef, objf in inspect.getmembers(eval(elstr)): + if (inspect.ismethod(objf) or + inspect.isfunction(objf)) and\ + namef == str(pItem.text()).strip('()'): + methodObj = objf + for imet in range(pItem.rowCount()): + if str(pItem.child(imet, 0).text()) ==\ + 'parameters': + mItem = pItem.child(imet, 0) + for iep, arg_def in\ + zip(range(mItem.rowCount()), + inspect.getargspec(methodObj)[3]): + paraname = str(mItem.child(iep, 0).text()) + paravalue = str(mItem.child(iep, 1).text()) + if paravalue != str(arg_def): + ierun += '\n{2}{0}={1},'.format( + paraname, paravalue, myTab*2) + if len(re.findall( + "beam", paraname.lower())) > 0: + tmpBeamName = paravalue + elif pItem.child(imet, 0).text() == 'output': + mItem = pItem.child(imet, 0) + paraOutput = "" + for iep in range(mItem.rowCount()): + paravalue = mItem.child(iep, 1).text() + paraOutput += str(paravalue)+", " + if len(re.findall('sources', elstr)) > 0\ + and tmpSourceName == "": + tmpSourceName = str(paravalue) + if len(re.findall('Source', + elstr)) > 0: + e0str = '{2}E0 = list({0}.{1}.energies)[0]\n'.format( # analysis:ignore + BLName, tItem.text(), myTab) + else: + e0str = '{2}E0 = 0.5 * ({0}.{1}.eMin +\n{3}{0}.{1}.eMax)\n'.format( # analysis:ignore + BLName, tItem.text(), myTab, + myTab*4) + codeRunProcess += '{5}{0} = {1}.{2}.{3}({4})\n\n'.format( # analysis:ignore + paraOutput.rstrip(', '), BLName, tItem.text(), + str(pItem.text()).strip('()'), + ierun.rstrip(','), myTab) + if len(re.findall('sources', elstr)) > 0: + codeAlignBL += '{3}{0} = {1}.{2}\n'.format( + tmpSourceName, + rsources.__name__, + 'Beam(nrays=2)', myTab) + codeAlignBL += '{1}{0}.a[:] = 0\n{1}{0}.b[:] = 1\n{1}{0}.c[:] = 0\n\ +{1}{0}.x[:] = 0\n{1}{0}.y[:] = 0\n{1}{0}.z[:] = 0\n{1}{0}.state[:] = 1\n\n'.format(tmpSourceName, myTab) # analysis:ignore + else: + codeAlignBL += '{2}tmpy = {0}.{1}.center[1]\n'.format(BLName, tItem.text(), myTab) # analysis:ignore + if autoX: + codeAlignBL += '{1}newx = {0}.x[0] +\\\n{1}{1}{0}.a[0] * (tmpy - {0}.y[0]) /\\\n{1}{1}{0}.b[0]\n'.format(tmpBeamName, myTab) # analysis:ignore + else: + codeAlignBL += '{2}newx = {0}.{1}.center[0]\n'.format(BLName, tItem.text(), myTab) # analysis:ignore + if autoZ: + codeAlignBL += '{1}newz = {0}.z[0] +\\\n{1}{1}{0}.c[0] * (tmpy - {0}.y[0]) /\\\n{1}{1}{0}.b[0]\n'.format(tmpBeamName, myTab) # analysis:ignore + else: + codeAlignBL += '{2}newz = {0}.{1}.center[2]\n'.format(BLName, tItem.text(), myTab) # analysis:ignore + codeAlignBL += '{2}{0}.{1}.center = (newx, tmpy, newz)\n'.format( # analysis:ignore + BLName, tItem.text(), myTab) + codeAlignBL += '{2}print(\"{1}.center:\", {0}.{1}.center)\n\n'.format( # analysis:ignore + BLName, tItem.text(), myTab) + if autoPitch or autoBragg: + if matType != 'None': + codeAlignBL += '{1}braggT = {0}.get_Bragg_angle(energy)\n'.format( # analysis:ignore + matName, myTab) + codeAlignBL += '{2}alphaT = 0 if {0}.{1}.alpha is None else {0}.{1}.alpha\n'.format( # analysis:ignore + BLName, tItem.text(), myTab) + codeAlignBL += '{0}lauePitch = 0\n'.format( # analysis:ignore + myTab) + codeAlignBL += '{2}print(\"bragg, alpha:\", np.degrees(braggT), np.degrees(alphaT), \"degrees\")\n\n'.format( # analysis:ignore + BLName, tItem.text(), myTab) + if matType == 'crystal': + codeAlignBL += '{1}braggT += -{0}.get_dtheta(energy, alphaT)\n'.format( # analysis:ignore + matName, myTab) + codeAlignBL += '{1}if {0}.geom.startswith(\'Laue\'):\n{1}{1}lauePitch = 0.5 * np.pi\n'.format( # analysis:ignore + matName, myTab) + codeAlignBL += '{2}print(\"braggT:\", np.degrees(braggT), \"degrees\")\n\n'.format( # analysis:ignore + BLName, tItem.text(), myTab) + if matType != 'None': + codeAlignBL += '{1}loBeam = rsources.Beam(copyFrom={0})\n'.format( # analysis:ignore + tmpBeamName, myTab) + codeAlignBL += '{3}raycing.global_to_virgin_local(\n{3}{3}{0},\n{3}{3}{1},\n{3}{3}loBeam,\n{3}{3}center={0}.{2}.center)\n'.format( # analysis:ignore + BLName, tmpBeamName, + tItem.text(), myTab) + codeAlignBL += '{2}raycing.rotate_beam(\n{2}{2}loBeam,\n{2}{2}roll=-({0}.{1}.positionRoll + {0}.{1}.roll),\n{2}{2}yaw=-{0}.{1}.yaw,\n{2}{2}pitch=0)\n'.format( # analysis:ignore + BLName, tItem.text(), myTab) + codeAlignBL += '{0}theta0 = np.arctan2(-loBeam.c[0], loBeam.b[0])\n'.format(myTab) # analysis:ignore + codeAlignBL += '{0}th2pitch = np.sqrt(1. - loBeam.a[0]**2)\n'.format(myTab) # analysis:ignore + codeAlignBL += '{0}targetPitch = np.arcsin(np.sin(braggT) / th2pitch) -\\\n{0}{0}theta0\n'.format(myTab) # analysis:ignore + codeAlignBL += '{0}targetPitch += alphaT + lauePitch\n'.format(myTab) # analysis:ignore + if autoBragg: + strPitch = 'bragg' + addPitch = '-{0}.{1}.pitch'.format( + BLName, tItem.text()) + else: + strPitch = 'pitch' + addPitch = '' + codeAlignBL += '{2}{0}.{1}.{3} = targetPitch{4}\n'.format( # analysis:ignore + BLName, tItem.text(), myTab, + strPitch, addPitch) + codeAlignBL += '{2}print(\"{1}.{3}:\", np.degrees({0}.{1}.{3}), \"degrees\")\n\n'.format( # analysis:ignore + BLName, tItem.text(), myTab, strPitch) + codeAlignBL += '{5}{0} = {1}.{2}.{3}({4})\n'.format( # analysis:ignore + paraOutput.rstrip(', '), + BLName, tItem.text(), + str(pItem.text()).strip('()'), + ierun.rstrip(','), myTab) + codeBuildBeamline += '{3}{0}.{1} = {2})\n\n'.format( + BLName, str(tItem.text()), ieinit.rstrip(','), myTab) + codeBuildBeamline += "{0}return {1}\n\n".format(myTab, BLName) + codeRunProcess += r"{0}outDict = ".format(myTab) + "{" + codeAlignBL = 'def align_beamline({0}, energy):\n'.format(BLName) +\ + codeAlignBL + "{}\n".format( + myTab + "pass" if codeAlignBL == '' else '') + + for ibm in range(self.beamModel.rowCount()): + beamName = str(self.beamModel.item(ibm, 0).text()) + if beamName != "None": + codeRunProcess += '\n{1}{1}\'{0}\': {0},'.format( + beamName, myTab) + codeRunProcess = codeRunProcess.rstrip(',') + "}\n" + codeRunProcess += "{0}return outDict\n\n\n".format(myTab) + codeRunProcess +=\ + '{}.run_process = run_process\n\n\n'.format(rrun.__name__) + + codeMain += e0str + codeMain += '{1}align_beamline({0}, E0)\n'.format(BLName, myTab) + codeMain += '{0}{1} = define_plots()\n'.format( + myTab, self.rootPlotItem.text()) + codePlots = '\ndef define_plots():\n{0}{1} = []\n'.format( + myTab, self.rootPlotItem.text()) + + plotNames = [] + for ie in range(self.rootPlotItem.rowCount()): + tItem = self.rootPlotItem.child(ie, 0) + ieinit = "\n{0}{1} = ".format(myTab, tItem.text()) + plotNames.append(str(tItem.text())) + for ieph in range(tItem.rowCount()): + if tItem.child(ieph, 0).text() == '_object': + elstr = str(tItem.child(ieph, 1).text()) + ieinit += elstr + "(" + for parent in (inspect.getmro(eval(elstr)))[:-1]: + for namef, objf in inspect.getmembers(parent): + if (inspect.ismethod(objf) or + inspect.isfunction(objf)): + if namef == "__init__" and\ + inspect.getargspec( + objf)[3] is not None: + obj = objf + for iepm, arg_def in zip(range(tItem.rowCount()-1), + inspect.getargspec(obj)[3]): + iep = iepm + 1 + if tItem.child(iep, 0).text() != '_object': + pItem = tItem.child(iep, 0) + if pItem.hasChildren(): + for ieax in range(pItem.rowCount()): + if pItem.child(ieax, 0).text() == '_object': + axstr = str(pItem.child(ieax, 1).text()) + # ieinit = ieinit.rstrip("\n\t\t") + ieinit += "\n{2}{0}={1}(".format( + str(tItem.child(iep, 0).text()), axstr, + myTab*2) + for parentAx in\ + (inspect.getmro(eval(axstr)))[:-1]: + for namefAx, objfAx in\ + inspect.getmembers(parentAx): + if (inspect.ismethod(objfAx) or + inspect.isfunction(objfAx)): + if namefAx == "__init__" and\ + inspect.getargspec( + objfAx)[3] is not None: + objAx = objfAx + for ieaxm, arg_defAx in zip( + range(pItem.rowCount()-1), + inspect.getargspec(objAx)[3]): + ieax = ieaxm + 1 + paraname = pItem.child(ieax, 0).text() + paravalue = pItem.child(ieax, 1).text() + if paraname == "data" and paravalue != "auto": + paravalue = '{0}.get_{1}'.format( + raycing.__name__, paravalue) + ieinit += '\n{2}{0}={1},'.format( + paraname, paravalue, myTab*3) + elif str(paravalue) != str(arg_defAx): + tmpParavalue = paravalue * 2 + while any(str(pltName + '.') in paravalue for + pltName in plotNames) and\ + tmpParavalue != paravalue: + tmpParavalue = paravalue + for ipn in range( + self.rootPlotItem.rowCount()): + ipnItem = self.rootPlotItem.child(ipn, + 0) + for ipp in range(ipnItem.rowCount()): + ippItem = ipnItem.child(ipp, 0) + if ippItem.hasChildren(): + for ipx in range( + ippItem.rowCount()): + paravalue = re.sub( + '{0}.{1}.{2}'.format( + ipnItem.text(), + ippItem.text(), + ippItem.child( + ipx, + 0).text()), + '{}'.format( + ippItem.child( + ipx, + 1).text()), + paravalue) + + ieinit += '\n{2}{0}={1},'.format( + paraname, self.quotize(paravalue), myTab*3) + ieinit = ieinit.rstrip(",") + ")," + else: + paraname = str(tItem.child(iep, 0).text()) + paravalue = tItem.child(iep, 1).text() + if str(paravalue) != str(arg_def): + if paraname == "fluxKind": + ieinit += '\n{2}{0}={1},'.format( + paraname, self.quotizeAll(paravalue), + myTab*2) + else: + tmpParavalue = paravalue * 2 + while any(str(pltName + '.') in paravalue for + pltName in plotNames) and\ + tmpParavalue != paravalue: + tmpParavalue = paravalue + for ipn in range( + self.rootPlotItem.rowCount()): + ipnItem = self.rootPlotItem.child(ipn, + 0) + for ipp in range(ipnItem.rowCount()): + paravalue = re.sub( + '{0}.{1}'.format( + ipnItem.text(), + ipnItem.child(ipp, + 0).text()), + '{}'.format( + ipnItem.child(ipp, + 1).text()), + paravalue) + ieinit += '\n{2}{0}={1},'.format( + paraname, self.quotize(paravalue), myTab*2) + codePlots += ieinit.rstrip(",") + ")\n" + codePlots += "{0}{2}.append({1})\n".format( + myTab, tItem.text(), self.rootPlotItem.text()) + codePlots += "{0}return {1}\n\n".format( + myTab, self.rootPlotItem.text()) + + for ie in range(self.rootRunItem.rowCount()): + if self.rootRunItem.child(ie, 0).text() == '_object': + elstr = str(self.rootRunItem.child(ie, 1).text()) + codeMain += "{0}{1}(\n".format(myTab, elstr) + objrr = eval(elstr) + break + + ieinit = "" + for iem, argVal in zip(range(self.rootRunItem.rowCount()-1), + inspect.getargspec(objrr)[3]): + ie = iem + 1 + if self.rootRunItem.child(ie, 0).text() != '_object': + paraname = self.rootRunItem.child(ie, 0).text() + paravalue = self.rootRunItem.child(ie, 1).text() + if paraname == "plots": + paravalue = self.rootPlotItem.text() + if paraname == "backend": + paravalue = 'r\"{0}\"'.format(paravalue) + if str(paravalue) != str(argVal): + ieinit += "{0}{1}={2},\n".format( + myTab*2, paraname, paravalue) + + codeMain += ieinit.rstrip(",\n") + ")\n" + + fullCode = codeDeclarations + codeBuildBeamline +\ + codeRunProcess + codeAlignBL + codePlots + codeMain + codeFooter + for xrtAlias in self.xrtModules: + fullModName = (eval(xrtAlias)).__name__ + fullCode = fullCode.replace(fullModName, xrtAlias) + codeHeader += 'import {0} as {1}\n'.format(fullModName, xrtAlias) + fullCode = codeHeader + fullCode + if isSpyderlib: + self.codeEdit.set_text(fullCode) + else: + self.codeEdit.setText(fullCode) + self.tabs.setCurrentWidget(self.codeEdit) + self.statusBar.showMessage('Python code successfully generated', 5000) + + def saveCode(self): + saveStatus = False + if self.saveFileName == "": + saveDialog = QFileDialog() + saveDialog.setFileMode(QFileDialog.AnyFile) + saveDialog.setAcceptMode(QFileDialog.AcceptSave) + saveDialog.setNameFilter("Python files (*.py)") + if (saveDialog.exec_()): + self.saveFileName = saveDialog.selectedFiles()[0] + if self.saveFileName != "": + if not str(self.saveFileName).endswith('.py'): + self.saveFileName += '.py' + try: + fileObject = open(self.saveFileName, 'w') + fileObject.write(self.codeEdit.toPlainText()) + fileObject.close + saveStatus = True + saveMsg = 'Script saved to {}'.format( + os.path.basename(str(self.saveFileName))) + self.tabs.setTabText( + 5, os.path.basename(str(self.saveFileName))) + if isSpyderConsole: + self.codeConsole.wdir = os.path.dirname( + str(self.saveFileName)) + else: + self.qprocess.setWorkingDirectory( + os.path.dirname(str(self.saveFileName))) + except (OSError, IOError) as errStr: + saveMsg = str(errStr) + self.statusBar.showMessage(saveMsg, 5000) + return saveStatus + + def saveCodeAs(self): + tmpName = self.saveFileName + self.saveFileName = "" + if not self.saveCode(): + self.statusBar.showMessage( + 'Failed saving code to {}'.format( + os.path.basename(str(self.saveFileName))), 5000) + self.saveFileName = tmpName + + def execCode(self): + self.saveCode() + self.tabs.setCurrentWidget(self.codeConsole) + if isSpyderConsole: + self.codeConsole.fname = str(self.saveFileName) + self.codeConsole.create_process() + else: + self.codeConsole.clear() + self.codeConsole.append('Starting {}\n\n'.format( + os.path.basename(str(self.saveFileName)))) + self.codeConsole.append('Press Ctrl+X to terminate process\n\n') + self.qprocess.start("python", ['-u', str(self.saveFileName)]) + + def aboutCode(self): + import platform + if use_pyside: + Qt_version = QtCore.__version__ + PyQt_version = PySide.__version__ + else: + Qt_version = QtCore.QT_VERSION_STR + PyQt_version = QtCore.PYQT_VERSION_STR + msgBox = QMessageBox() + msgBox.setWindowIcon(QIcon( + os.path.join(self.xrtQookDir, '_icons', 'xrQt1.ico'))) + msgBox.setWindowTitle("About xrtQook") + msgBox.setIconPixmap(QPixmap( + os.path.join(self.xrtQookDir, '_icons', 'logo-xrtQt.png'))) + msgBox.setTextFormat(QtCore.Qt.RichText) + msgBox.setText("Beamline layout manipulation and automated code\ + generation tool for the xrt ray tracing\ + package.\nFor a quick start see this short \ + tutorial.") + locos = platform.platform(terse=True) + if 'Linux' in locos: + locos = " ".join(platform.linux_distribution()) + infText = """Created by:\ +\nRoman Chernikov (DESY Photon Science)\ +\nKonstantin Klementiev (MAX IV Laboratory)\ +\nLicensed under the terms of the MIT License\nMarch 2016\ +\n\nYour system:\n{0}\nPython {1}\nQt {2}\n{3} {4}""".format( + locos, platform.python_version(), + Qt_version, QtName, PyQt_version) + infText += '\npyopencl {}'.format( + cl.VERSION if isOpenCL else 'not found') + infText += '\nxrt {0} in {1}'.format( + xrt.__version__, path_to_xrt) + msgBox.setInformativeText(infText) + msgBox.setStandardButtons(QMessageBox.Ok) + msgBox.exec_() + + +if __name__ == '__main__': + app = QApplication(sys.argv) + ex = XrtQook() + ex.setWindowTitle("xrtQook") + ex.show() + sys.exit(app.exec_())