catsim-test 0.0.5__cp313-cp313-manylinux_2_31_x86_64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1235) hide show
  1. catsim_test-0.0.5.dist-info/METADATA +5 -0
  2. catsim_test-0.0.5.dist-info/RECORD +1235 -0
  3. catsim_test-0.0.5.dist-info/WHEEL +5 -0
  4. catsim_test-0.0.5.dist-info/licenses/LICENSE +29 -0
  5. catsim_test-0.0.5.dist-info/sboms/auditwheel.cdx.json +1 -0
  6. catsim_test-0.0.5.dist-info/top_level.txt +2 -0
  7. catsim_test.libs/libgomp-98b21ff3.so.1.0.0 +0 -0
  8. dummy.cpython-313-x86_64-linux-gnu.so +0 -0
  9. gecatsim/__init__.py +20 -0
  10. gecatsim/bowtie/large.txt +891 -0
  11. gecatsim/bowtie/medium.txt +891 -0
  12. gecatsim/bowtie/small.txt +891 -0
  13. gecatsim/cfg/Phantom_Default.cfg +7 -0
  14. gecatsim/cfg/Physics_Default.cfg +38 -0
  15. gecatsim/cfg/Protocol_Default.cfg +33 -0
  16. gecatsim/cfg/Recon_Default.cfg +22 -0
  17. gecatsim/cfg/Scanner_Default.cfg +31 -0
  18. gecatsim/clib_build/BuildLinux64 +6 -0
  19. gecatsim/clib_build/BuildWin64.bat +17 -0
  20. gecatsim/clib_build/MakeMacOS +48 -0
  21. gecatsim/clib_build/MakeVariables_1 +19 -0
  22. gecatsim/clib_build/MakeVariables_2 +5 -0
  23. gecatsim/clib_build/MakeVariables_3 +33 -0
  24. gecatsim/clib_build/MakeVariables_3.1 +32 -0
  25. gecatsim/clib_build/MakeWindows64 +45 -0
  26. gecatsim/clib_build/Makefile +41 -0
  27. gecatsim/clib_build/readme.md +13 -0
  28. gecatsim/clib_build/src/BaseObject.cpp +144 -0
  29. gecatsim/clib_build/src/BaseObject.h +74 -0
  30. gecatsim/clib_build/src/ClipPlane.cpp +83 -0
  31. gecatsim/clib_build/src/ClipPlane.h +28 -0
  32. gecatsim/clib_build/src/CrossSection.cpp +179 -0
  33. gecatsim/clib_build/src/CrossSection.hpp +27 -0
  34. gecatsim/clib_build/src/CrossSectionHandler.cpp +160 -0
  35. gecatsim/clib_build/src/CrossSectionHandler.hpp +72 -0
  36. gecatsim/clib_build/src/Cube.cpp +144 -0
  37. gecatsim/clib_build/src/Cube.h +26 -0
  38. gecatsim/clib_build/src/Cylinder.cpp +156 -0
  39. gecatsim/clib_build/src/Cylinder.h +25 -0
  40. gecatsim/clib_build/src/DD2Back.c +332 -0
  41. gecatsim/clib_build/src/DD2ParProj.c +377 -0
  42. gecatsim/clib_build/src/DD2Proj.c +333 -0
  43. gecatsim/clib_build/src/DD2WBack.c +350 -0
  44. gecatsim/clib_build/src/DD3.hpp +423 -0
  45. gecatsim/clib_build/src/DD3Proj.cpp +519 -0
  46. gecatsim/clib_build/src/DD3Proj_roi_notrans_mm.cpp +585 -0
  47. gecatsim/clib_build/src/DD3WBack.c +491 -0
  48. gecatsim/clib_build/src/DD3_roi_notrans_mm.hpp +272 -0
  49. gecatsim/clib_build/src/Detector.cpp +389 -0
  50. gecatsim/clib_build/src/Detector.hpp +134 -0
  51. gecatsim/clib_build/src/Interpolate.cpp +58 -0
  52. gecatsim/clib_build/src/Intersection.cpp +198 -0
  53. gecatsim/clib_build/src/Intersection.h +36 -0
  54. gecatsim/clib_build/src/MatVec.cpp +262 -0
  55. gecatsim/clib_build/src/MatVec.h +68 -0
  56. gecatsim/clib_build/src/Objects.cpp +23 -0
  57. gecatsim/clib_build/src/Objects.hpp +90 -0
  58. gecatsim/clib_build/src/Phantom.cpp +169 -0
  59. gecatsim/clib_build/src/Phantom.hpp +43 -0
  60. gecatsim/clib_build/src/Photon.cpp +168 -0
  61. gecatsim/clib_build/src/Photon.hpp +56 -0
  62. gecatsim/clib_build/src/RD3Back.cpp +357 -0
  63. gecatsim/clib_build/src/RD3Intersections.cpp +154 -0
  64. gecatsim/clib_build/src/RD3bench.cpp +505 -0
  65. gecatsim/clib_build/src/Sphere.cpp +43 -0
  66. gecatsim/clib_build/src/Sphere.h +25 -0
  67. gecatsim/clib_build/src/Transformation.cpp +104 -0
  68. gecatsim/clib_build/src/Transformation.h +37 -0
  69. gecatsim/clib_build/src/TreePhantom.cpp +138 -0
  70. gecatsim/clib_build/src/TreePhantom.h +27 -0
  71. gecatsim/clib_build/src/Volume.cpp +101 -0
  72. gecatsim/clib_build/src/Volume.hpp +28 -0
  73. gecatsim/clib_build/src/analytic_projector.c +2433 -0
  74. gecatsim/clib_build/src/analytic_projector.h +235 -0
  75. gecatsim/clib_build/src/compt.cpp +400 -0
  76. gecatsim/clib_build/src/compt2.cpp +558 -0
  77. gecatsim/clib_build/src/compt3.cpp +607 -0
  78. gecatsim/clib_build/src/ct_nurbs.h +214 -0
  79. gecatsim/clib_build/src/extractsino.c +42 -0
  80. gecatsim/clib_build/src/fm_gethostid.c +23 -0
  81. gecatsim/clib_build/src/fm_getrandpid.c +31 -0
  82. gecatsim/clib_build/src/gemsfilt.c +1084 -0
  83. gecatsim/clib_build/src/getMemorySize.cpp +105 -0
  84. gecatsim/clib_build/src/getMemorySize.h +5 -0
  85. gecatsim/clib_build/src/hull2.c +77 -0
  86. gecatsim/clib_build/src/intersections.c +131 -0
  87. gecatsim/clib_build/src/label.h +10 -0
  88. gecatsim/clib_build/src/main.cpp +609 -0
  89. gecatsim/clib_build/src/make_volume.c +573 -0
  90. gecatsim/clib_build/src/nCAT_main.c +6343 -0
  91. gecatsim/clib_build/src/negative_log.cpp +233 -0
  92. gecatsim/clib_build/src/negative_log.h +23 -0
  93. gecatsim/clib_build/src/pd2dbpcurved.c +98 -0
  94. gecatsim/clib_build/src/pd2dbpflat.c +101 -0
  95. gecatsim/clib_build/src/pd3dbpsemi.c +177 -0
  96. gecatsim/clib_build/src/phantom.l +72 -0
  97. gecatsim/clib_build/src/phantom.lex.c +1770 -0
  98. gecatsim/clib_build/src/phantom.tab.cpp +2126 -0
  99. gecatsim/clib_build/src/phantom.tab.hpp +126 -0
  100. gecatsim/clib_build/src/phantom.y +624 -0
  101. gecatsim/clib_build/src/rndpoi.c +793 -0
  102. gecatsim/clib_build/src/spline.c +81 -0
  103. gecatsim/clib_build/src/spline.h +6 -0
  104. gecatsim/clib_build/src/timer.c +64 -0
  105. gecatsim/clib_build/src/viewshift.c +25 -0
  106. gecatsim/clib_build/src/voxelized_projector.cpp +683 -0
  107. gecatsim/clib_build/src/xybowtie.c +76 -0
  108. gecatsim/dose/data/dosereconkernel_mthd4.mat +0 -0
  109. gecatsim/dose/data/scatter_E_loss_fraction.mat +0 -0
  110. gecatsim/dose/data/weighted_scatter_energy_by_spec.mat +0 -0
  111. gecatsim/dose/examples/dose_doserecon.cfg +16 -0
  112. gecatsim/dose/examples/dose_phantom.cfg +6 -0
  113. gecatsim/dose/examples/dose_physics.cfg +18 -0
  114. gecatsim/dose/examples/dose_protocol.cfg +15 -0
  115. gecatsim/dose/examples/dose_recon.cfg +9 -0
  116. gecatsim/dose/examples/dose_scanner.cfg +29 -0
  117. gecatsim/dose/examples/run.py +37 -0
  118. gecatsim/dose/lib/Dose_Recon_Library_Linux64.so +0 -0
  119. gecatsim/dose/lib/Dose_Recon_Library_Windows64.dll +0 -0
  120. gecatsim/dose/pyfiles/C_DD3Dose.py +84 -0
  121. gecatsim/dose/pyfiles/Combine_Spectrum_Bowtie_FlatFilter.py +15 -0
  122. gecatsim/dose/pyfiles/DoseConv.py +87 -0
  123. gecatsim/dose/pyfiles/GetMuByProcess.py +57 -0
  124. gecatsim/dose/pyfiles/__init__.py +0 -0
  125. gecatsim/dose/pyfiles/brconvol_matlab.py +67 -0
  126. gecatsim/dose/pyfiles/calcDetectorFlux.py +54 -0
  127. gecatsim/dose/pyfiles/catdoserecon.py +225 -0
  128. gecatsim/dose/pyfiles/doseconvol.py +52 -0
  129. gecatsim/dose/pyfiles/get_voxel_stopping_power.py +35 -0
  130. gecatsim/dose/pyfiles/img2vol.py +57 -0
  131. gecatsim/dose/pyfiles/xyfovimg.py +30 -0
  132. gecatsim/dose/readme.md +4 -0
  133. gecatsim/dose/src/DD3.hpp +371 -0
  134. gecatsim/dose/src/DD3Dose.cpp +787 -0
  135. gecatsim/dose/src/DD3Dose.hpp +22 -0
  136. gecatsim/dose/src/DD3Dose.i +23 -0
  137. gecatsim/dose/src/DD3Energy_clean.cpp +1464 -0
  138. gecatsim/dose/src/DD3Proj.cpp +504 -0
  139. gecatsim/dose/src/DD3Proj.hpp +20 -0
  140. gecatsim/dose/src/DD3Proj_mm.cpp +561 -0
  141. gecatsim/dose/src/DD3Proj_mm.hpp +21 -0
  142. gecatsim/dose/src/Win32_Build.bat +17 -0
  143. gecatsim/dose/src/Win64_Build.bat +20 -0
  144. gecatsim/examples/Catvoxel_Sample.py +53 -0
  145. gecatsim/examples/DD3Proj_mm_Sample.py +60 -0
  146. gecatsim/examples/GetMu_Sample.py +24 -0
  147. gecatsim/examples/Sim_Recon_Sample.py +45 -0
  148. gecatsim/examples/Sim_Recon_Sample_PCCT.py +69 -0
  149. gecatsim/examples/Sim_Sample.py +32 -0
  150. gecatsim/examples/Sim_Sample_Analyic.py +44 -0
  151. gecatsim/examples/Sim_Sample_Helical.py +32 -0
  152. gecatsim/examples/Sim_Sample_Hybrid.py +42 -0
  153. gecatsim/examples/Sim_Sample_PCCT.py +72 -0
  154. gecatsim/examples/Sim_Sample_Polygonal.py +47 -0
  155. gecatsim/examples/Sim_Sample_Scatter.py +38 -0
  156. gecatsim/examples/Sim_Sample_XCAT.py +50 -0
  157. gecatsim/examples/cfg/Phantom_Sample.cfg +6 -0
  158. gecatsim/examples/cfg/Phantom_Sample_Analytic.cfg +6 -0
  159. gecatsim/examples/cfg/Phantom_Sample_Hybrid.cfg +7 -0
  160. gecatsim/examples/cfg/Phantom_Sample_Polygonal.cfg +6 -0
  161. gecatsim/examples/cfg/Phantom_Sample_XCAT.cfg +6 -0
  162. gecatsim/examples/cfg/Physics_Sample.cfg +41 -0
  163. gecatsim/examples/cfg/Protocol_Sample_Helical.cfg +33 -0
  164. gecatsim/examples/cfg/Protocol_Sample_axial.cfg +33 -0
  165. gecatsim/examples/cfg/Recon_Sample_2d.cfg +6 -0
  166. gecatsim/examples/cfg/Recon_Sample_Helical.cfg +8 -0
  167. gecatsim/examples/cfg/Scanner_PCCT.cfg +30 -0
  168. gecatsim/examples/cfg/Scanner_Sample_generic.cfg +29 -0
  169. gecatsim/examples/vct_examples/Phantom_Sample_Analytic.cfg +6 -0
  170. gecatsim/examples/vct_examples/Physics_Sample.cfg +41 -0
  171. gecatsim/examples/vct_examples/Protocol_Sample_axial.cfg +33 -0
  172. gecatsim/examples/vct_examples/Recon_Sample_2d.cfg +6 -0
  173. gecatsim/examples/vct_examples/Scanner_Sample_generic.cfg +31 -0
  174. gecatsim/examples/vct_examples/read.md +1 -0
  175. gecatsim/focal_spot/readme.md +31 -0
  176. gecatsim/focal_spot/vct_large_fs.npz +0 -0
  177. gecatsim/focal_spot/vct_small_fs.npz +0 -0
  178. gecatsim/lib/libcatsim.so +0 -0
  179. gecatsim/lib/libcatsim64.dll +0 -0
  180. gecatsim/lib/libcatsim_macos.so +0 -0
  181. gecatsim/lib/pthreadGC2_x64.dll +0 -0
  182. gecatsim/lib/pthreads-2-9-1-release.zip +0 -0
  183. gecatsim/material/Ac +11 -0
  184. gecatsim/material/Ag +11 -0
  185. gecatsim/material/Al +11 -0
  186. gecatsim/material/Ar +11 -0
  187. gecatsim/material/As +11 -0
  188. gecatsim/material/At +11 -0
  189. gecatsim/material/Au +11 -0
  190. gecatsim/material/B +11 -0
  191. gecatsim/material/Ba +11 -0
  192. gecatsim/material/Be +11 -0
  193. gecatsim/material/Bi +11 -0
  194. gecatsim/material/Br +11 -0
  195. gecatsim/material/C +11 -0
  196. gecatsim/material/CIRS_adipose_adult2 +20 -0
  197. gecatsim/material/CIRS_adipose_adult3 +20 -0
  198. gecatsim/material/CIRS_bone_10yo +21 -0
  199. gecatsim/material/CIRS_bone_1yo +21 -0
  200. gecatsim/material/CIRS_bone_5yo +21 -0
  201. gecatsim/material/CIRS_bone_adult_and_15yo +21 -0
  202. gecatsim/material/CIRS_bone_newborn +21 -0
  203. gecatsim/material/CIRS_liver_adult +20 -0
  204. gecatsim/material/CIRS_lung_inhale +20 -0
  205. gecatsim/material/CIRS_plastic_water_LR +20 -0
  206. gecatsim/material/CIRS_spinal_cord +20 -0
  207. gecatsim/material/CZT +5 -0
  208. gecatsim/material/Ca +11 -0
  209. gecatsim/material/Cd +11 -0
  210. gecatsim/material/Ce +11 -0
  211. gecatsim/material/Cl +11 -0
  212. gecatsim/material/Co +11 -0
  213. gecatsim/material/Copyright.txt +7 -0
  214. gecatsim/material/Cr +11 -0
  215. gecatsim/material/Cs +11 -0
  216. gecatsim/material/CsI +16 -0
  217. gecatsim/material/Cu +11 -0
  218. gecatsim/material/Dy +11 -0
  219. gecatsim/material/Er +11 -0
  220. gecatsim/material/Eu +11 -0
  221. gecatsim/material/F +11 -0
  222. gecatsim/material/Fe +11 -0
  223. gecatsim/material/Fr +11 -0
  224. gecatsim/material/GOS +19 -0
  225. gecatsim/material/Ga +11 -0
  226. gecatsim/material/Gd +11 -0
  227. gecatsim/material/Ge +11 -0
  228. gecatsim/material/H +11 -0
  229. gecatsim/material/He +11 -0
  230. gecatsim/material/Hf +11 -0
  231. gecatsim/material/Hg +11 -0
  232. gecatsim/material/Ho +11 -0
  233. gecatsim/material/I +11 -0
  234. gecatsim/material/ICRU_adipose_adult2 +21 -0
  235. gecatsim/material/ICRU_blood_adult +24 -0
  236. gecatsim/material/ICRU_brain_adult +26 -0
  237. gecatsim/material/ICRU_breast_adult2 +22 -0
  238. gecatsim/material/ICRU_eye_lens_adult +22 -0
  239. gecatsim/material/ICRU_kidney_adult +24 -0
  240. gecatsim/material/ICRU_liver_adult +23 -0
  241. gecatsim/material/ICRU_lung_adult_healthy +23 -0
  242. gecatsim/material/ICRU_muscle_adult +23 -0
  243. gecatsim/material/ICRU_pancreas_adult +23 -0
  244. gecatsim/material/ICRU_skeleton_cortical_bone_adult +23 -0
  245. gecatsim/material/ICRU_skin_adult +23 -0
  246. gecatsim/material/ICRU_spleen_adult +23 -0
  247. gecatsim/material/ICRU_testis_adult +23 -0
  248. gecatsim/material/In +11 -0
  249. gecatsim/material/Ir +11 -0
  250. gecatsim/material/K +11 -0
  251. gecatsim/material/Kr +11 -0
  252. gecatsim/material/La +11 -0
  253. gecatsim/material/Li +11 -0
  254. gecatsim/material/Lu +11 -0
  255. gecatsim/material/Lumex +18 -0
  256. gecatsim/material/Mg +11 -0
  257. gecatsim/material/Mn +11 -0
  258. gecatsim/material/Mo +11 -0
  259. gecatsim/material/N +11 -0
  260. gecatsim/material/Na +11 -0
  261. gecatsim/material/NaCl +16 -0
  262. gecatsim/material/Nb +11 -0
  263. gecatsim/material/Nd +11 -0
  264. gecatsim/material/Ne +11 -0
  265. gecatsim/material/Ni +11 -0
  266. gecatsim/material/O +11 -0
  267. gecatsim/material/Os +11 -0
  268. gecatsim/material/P +11 -0
  269. gecatsim/material/PMMA +20 -0
  270. gecatsim/material/PVC_flexible +20 -0
  271. gecatsim/material/PVC_rigid +20 -0
  272. gecatsim/material/Pa +11 -0
  273. gecatsim/material/Pb +11 -0
  274. gecatsim/material/Pd +11 -0
  275. gecatsim/material/Pm +11 -0
  276. gecatsim/material/Po +11 -0
  277. gecatsim/material/Pr +11 -0
  278. gecatsim/material/Pt +11 -0
  279. gecatsim/material/Ra +11 -0
  280. gecatsim/material/Rb +11 -0
  281. gecatsim/material/Re +11 -0
  282. gecatsim/material/Rh +11 -0
  283. gecatsim/material/Rn +11 -0
  284. gecatsim/material/Ru +11 -0
  285. gecatsim/material/S +11 -0
  286. gecatsim/material/Sb +11 -0
  287. gecatsim/material/Sc +11 -0
  288. gecatsim/material/Se +11 -0
  289. gecatsim/material/Si +11 -0
  290. gecatsim/material/Sm +11 -0
  291. gecatsim/material/Sn +11 -0
  292. gecatsim/material/Sr +11 -0
  293. gecatsim/material/Ta +11 -0
  294. gecatsim/material/Tb +11 -0
  295. gecatsim/material/Tc +11 -0
  296. gecatsim/material/Te +11 -0
  297. gecatsim/material/Th +11 -0
  298. gecatsim/material/Ti +11 -0
  299. gecatsim/material/Tl +11 -0
  300. gecatsim/material/Tm +11 -0
  301. gecatsim/material/U +11 -0
  302. gecatsim/material/V +11 -0
  303. gecatsim/material/W +11 -0
  304. gecatsim/material/Xe +11 -0
  305. gecatsim/material/Y +11 -0
  306. gecatsim/material/Yb +11 -0
  307. gecatsim/material/Zn +11 -0
  308. gecatsim/material/Zr +11 -0
  309. gecatsim/material/air +24 -0
  310. gecatsim/material/bone +25 -0
  311. gecatsim/material/brass +18 -0
  312. gecatsim/material/diamond +13 -0
  313. gecatsim/material/edlp/comp/ce-cs-1.dat +124 -0
  314. gecatsim/material/edlp/comp/ce-cs-10.dat +124 -0
  315. gecatsim/material/edlp/comp/ce-cs-100.dat +124 -0
  316. gecatsim/material/edlp/comp/ce-cs-11.dat +124 -0
  317. gecatsim/material/edlp/comp/ce-cs-12.dat +124 -0
  318. gecatsim/material/edlp/comp/ce-cs-13.dat +124 -0
  319. gecatsim/material/edlp/comp/ce-cs-14.dat +124 -0
  320. gecatsim/material/edlp/comp/ce-cs-15.dat +124 -0
  321. gecatsim/material/edlp/comp/ce-cs-16.dat +124 -0
  322. gecatsim/material/edlp/comp/ce-cs-17.dat +124 -0
  323. gecatsim/material/edlp/comp/ce-cs-18.dat +124 -0
  324. gecatsim/material/edlp/comp/ce-cs-19.dat +124 -0
  325. gecatsim/material/edlp/comp/ce-cs-2.dat +124 -0
  326. gecatsim/material/edlp/comp/ce-cs-20.dat +124 -0
  327. gecatsim/material/edlp/comp/ce-cs-21.dat +124 -0
  328. gecatsim/material/edlp/comp/ce-cs-22.dat +124 -0
  329. gecatsim/material/edlp/comp/ce-cs-23.dat +124 -0
  330. gecatsim/material/edlp/comp/ce-cs-24.dat +124 -0
  331. gecatsim/material/edlp/comp/ce-cs-25.dat +124 -0
  332. gecatsim/material/edlp/comp/ce-cs-26.dat +124 -0
  333. gecatsim/material/edlp/comp/ce-cs-27.dat +124 -0
  334. gecatsim/material/edlp/comp/ce-cs-28.dat +124 -0
  335. gecatsim/material/edlp/comp/ce-cs-29.dat +124 -0
  336. gecatsim/material/edlp/comp/ce-cs-3.dat +124 -0
  337. gecatsim/material/edlp/comp/ce-cs-30.dat +124 -0
  338. gecatsim/material/edlp/comp/ce-cs-31.dat +124 -0
  339. gecatsim/material/edlp/comp/ce-cs-32.dat +124 -0
  340. gecatsim/material/edlp/comp/ce-cs-33.dat +124 -0
  341. gecatsim/material/edlp/comp/ce-cs-34.dat +124 -0
  342. gecatsim/material/edlp/comp/ce-cs-35.dat +124 -0
  343. gecatsim/material/edlp/comp/ce-cs-36.dat +124 -0
  344. gecatsim/material/edlp/comp/ce-cs-37.dat +124 -0
  345. gecatsim/material/edlp/comp/ce-cs-38.dat +124 -0
  346. gecatsim/material/edlp/comp/ce-cs-39.dat +124 -0
  347. gecatsim/material/edlp/comp/ce-cs-4.dat +124 -0
  348. gecatsim/material/edlp/comp/ce-cs-40.dat +124 -0
  349. gecatsim/material/edlp/comp/ce-cs-41.dat +124 -0
  350. gecatsim/material/edlp/comp/ce-cs-42.dat +124 -0
  351. gecatsim/material/edlp/comp/ce-cs-43.dat +124 -0
  352. gecatsim/material/edlp/comp/ce-cs-44.dat +124 -0
  353. gecatsim/material/edlp/comp/ce-cs-45.dat +124 -0
  354. gecatsim/material/edlp/comp/ce-cs-46.dat +124 -0
  355. gecatsim/material/edlp/comp/ce-cs-47.dat +124 -0
  356. gecatsim/material/edlp/comp/ce-cs-48.dat +124 -0
  357. gecatsim/material/edlp/comp/ce-cs-49.dat +124 -0
  358. gecatsim/material/edlp/comp/ce-cs-5.dat +124 -0
  359. gecatsim/material/edlp/comp/ce-cs-50.dat +124 -0
  360. gecatsim/material/edlp/comp/ce-cs-51.dat +124 -0
  361. gecatsim/material/edlp/comp/ce-cs-52.dat +124 -0
  362. gecatsim/material/edlp/comp/ce-cs-53.dat +124 -0
  363. gecatsim/material/edlp/comp/ce-cs-54.dat +124 -0
  364. gecatsim/material/edlp/comp/ce-cs-55.dat +124 -0
  365. gecatsim/material/edlp/comp/ce-cs-56.dat +124 -0
  366. gecatsim/material/edlp/comp/ce-cs-57.dat +124 -0
  367. gecatsim/material/edlp/comp/ce-cs-58.dat +124 -0
  368. gecatsim/material/edlp/comp/ce-cs-59.dat +124 -0
  369. gecatsim/material/edlp/comp/ce-cs-6.dat +124 -0
  370. gecatsim/material/edlp/comp/ce-cs-60.dat +124 -0
  371. gecatsim/material/edlp/comp/ce-cs-61.dat +124 -0
  372. gecatsim/material/edlp/comp/ce-cs-62.dat +124 -0
  373. gecatsim/material/edlp/comp/ce-cs-63.dat +124 -0
  374. gecatsim/material/edlp/comp/ce-cs-64.dat +124 -0
  375. gecatsim/material/edlp/comp/ce-cs-65.dat +124 -0
  376. gecatsim/material/edlp/comp/ce-cs-66.dat +124 -0
  377. gecatsim/material/edlp/comp/ce-cs-67.dat +124 -0
  378. gecatsim/material/edlp/comp/ce-cs-68.dat +124 -0
  379. gecatsim/material/edlp/comp/ce-cs-69.dat +124 -0
  380. gecatsim/material/edlp/comp/ce-cs-7.dat +124 -0
  381. gecatsim/material/edlp/comp/ce-cs-70.dat +124 -0
  382. gecatsim/material/edlp/comp/ce-cs-71.dat +124 -0
  383. gecatsim/material/edlp/comp/ce-cs-72.dat +124 -0
  384. gecatsim/material/edlp/comp/ce-cs-73.dat +124 -0
  385. gecatsim/material/edlp/comp/ce-cs-74.dat +124 -0
  386. gecatsim/material/edlp/comp/ce-cs-75.dat +124 -0
  387. gecatsim/material/edlp/comp/ce-cs-76.dat +124 -0
  388. gecatsim/material/edlp/comp/ce-cs-77.dat +124 -0
  389. gecatsim/material/edlp/comp/ce-cs-78.dat +124 -0
  390. gecatsim/material/edlp/comp/ce-cs-79.dat +124 -0
  391. gecatsim/material/edlp/comp/ce-cs-8.dat +124 -0
  392. gecatsim/material/edlp/comp/ce-cs-80.dat +124 -0
  393. gecatsim/material/edlp/comp/ce-cs-81.dat +124 -0
  394. gecatsim/material/edlp/comp/ce-cs-82.dat +124 -0
  395. gecatsim/material/edlp/comp/ce-cs-83.dat +124 -0
  396. gecatsim/material/edlp/comp/ce-cs-84.dat +124 -0
  397. gecatsim/material/edlp/comp/ce-cs-85.dat +124 -0
  398. gecatsim/material/edlp/comp/ce-cs-86.dat +124 -0
  399. gecatsim/material/edlp/comp/ce-cs-87.dat +124 -0
  400. gecatsim/material/edlp/comp/ce-cs-88.dat +124 -0
  401. gecatsim/material/edlp/comp/ce-cs-89.dat +124 -0
  402. gecatsim/material/edlp/comp/ce-cs-9.dat +124 -0
  403. gecatsim/material/edlp/comp/ce-cs-90.dat +124 -0
  404. gecatsim/material/edlp/comp/ce-cs-91.dat +124 -0
  405. gecatsim/material/edlp/comp/ce-cs-92.dat +124 -0
  406. gecatsim/material/edlp/comp/ce-cs-93.dat +124 -0
  407. gecatsim/material/edlp/comp/ce-cs-94.dat +124 -0
  408. gecatsim/material/edlp/comp/ce-cs-95.dat +124 -0
  409. gecatsim/material/edlp/comp/ce-cs-96.dat +124 -0
  410. gecatsim/material/edlp/comp/ce-cs-97.dat +124 -0
  411. gecatsim/material/edlp/comp/ce-cs-98.dat +124 -0
  412. gecatsim/material/edlp/comp/ce-cs-99.dat +124 -0
  413. gecatsim/material/edlp/comp/ce-cs-all.dat +0 -0
  414. gecatsim/material/edlp/comp/ce-sf-1.dat +107 -0
  415. gecatsim/material/edlp/comp/ce-sf-10.dat +179 -0
  416. gecatsim/material/edlp/comp/ce-sf-100.dat +150 -0
  417. gecatsim/material/edlp/comp/ce-sf-11.dat +187 -0
  418. gecatsim/material/edlp/comp/ce-sf-12.dat +180 -0
  419. gecatsim/material/edlp/comp/ce-sf-13.dat +166 -0
  420. gecatsim/material/edlp/comp/ce-sf-14.dat +170 -0
  421. gecatsim/material/edlp/comp/ce-sf-15.dat +166 -0
  422. gecatsim/material/edlp/comp/ce-sf-16.dat +165 -0
  423. gecatsim/material/edlp/comp/ce-sf-17.dat +169 -0
  424. gecatsim/material/edlp/comp/ce-sf-18.dat +161 -0
  425. gecatsim/material/edlp/comp/ce-sf-19.dat +167 -0
  426. gecatsim/material/edlp/comp/ce-sf-2.dat +144 -0
  427. gecatsim/material/edlp/comp/ce-sf-20.dat +168 -0
  428. gecatsim/material/edlp/comp/ce-sf-21.dat +162 -0
  429. gecatsim/material/edlp/comp/ce-sf-22.dat +163 -0
  430. gecatsim/material/edlp/comp/ce-sf-23.dat +162 -0
  431. gecatsim/material/edlp/comp/ce-sf-24.dat +169 -0
  432. gecatsim/material/edlp/comp/ce-sf-25.dat +164 -0
  433. gecatsim/material/edlp/comp/ce-sf-26.dat +167 -0
  434. gecatsim/material/edlp/comp/ce-sf-27.dat +165 -0
  435. gecatsim/material/edlp/comp/ce-sf-28.dat +173 -0
  436. gecatsim/material/edlp/comp/ce-sf-29.dat +167 -0
  437. gecatsim/material/edlp/comp/ce-sf-3.dat +149 -0
  438. gecatsim/material/edlp/comp/ce-sf-30.dat +168 -0
  439. gecatsim/material/edlp/comp/ce-sf-31.dat +166 -0
  440. gecatsim/material/edlp/comp/ce-sf-32.dat +168 -0
  441. gecatsim/material/edlp/comp/ce-sf-33.dat +167 -0
  442. gecatsim/material/edlp/comp/ce-sf-34.dat +169 -0
  443. gecatsim/material/edlp/comp/ce-sf-35.dat +167 -0
  444. gecatsim/material/edlp/comp/ce-sf-36.dat +158 -0
  445. gecatsim/material/edlp/comp/ce-sf-37.dat +160 -0
  446. gecatsim/material/edlp/comp/ce-sf-38.dat +161 -0
  447. gecatsim/material/edlp/comp/ce-sf-39.dat +161 -0
  448. gecatsim/material/edlp/comp/ce-sf-4.dat +151 -0
  449. gecatsim/material/edlp/comp/ce-sf-40.dat +170 -0
  450. gecatsim/material/edlp/comp/ce-sf-41.dat +172 -0
  451. gecatsim/material/edlp/comp/ce-sf-42.dat +167 -0
  452. gecatsim/material/edlp/comp/ce-sf-43.dat +164 -0
  453. gecatsim/material/edlp/comp/ce-sf-44.dat +160 -0
  454. gecatsim/material/edlp/comp/ce-sf-45.dat +160 -0
  455. gecatsim/material/edlp/comp/ce-sf-46.dat +162 -0
  456. gecatsim/material/edlp/comp/ce-sf-47.dat +162 -0
  457. gecatsim/material/edlp/comp/ce-sf-48.dat +164 -0
  458. gecatsim/material/edlp/comp/ce-sf-49.dat +165 -0
  459. gecatsim/material/edlp/comp/ce-sf-5.dat +148 -0
  460. gecatsim/material/edlp/comp/ce-sf-50.dat +158 -0
  461. gecatsim/material/edlp/comp/ce-sf-51.dat +156 -0
  462. gecatsim/material/edlp/comp/ce-sf-52.dat +158 -0
  463. gecatsim/material/edlp/comp/ce-sf-53.dat +163 -0
  464. gecatsim/material/edlp/comp/ce-sf-54.dat +163 -0
  465. gecatsim/material/edlp/comp/ce-sf-55.dat +158 -0
  466. gecatsim/material/edlp/comp/ce-sf-56.dat +161 -0
  467. gecatsim/material/edlp/comp/ce-sf-57.dat +168 -0
  468. gecatsim/material/edlp/comp/ce-sf-58.dat +167 -0
  469. gecatsim/material/edlp/comp/ce-sf-59.dat +162 -0
  470. gecatsim/material/edlp/comp/ce-sf-6.dat +155 -0
  471. gecatsim/material/edlp/comp/ce-sf-60.dat +157 -0
  472. gecatsim/material/edlp/comp/ce-sf-61.dat +169 -0
  473. gecatsim/material/edlp/comp/ce-sf-62.dat +169 -0
  474. gecatsim/material/edlp/comp/ce-sf-63.dat +160 -0
  475. gecatsim/material/edlp/comp/ce-sf-64.dat +166 -0
  476. gecatsim/material/edlp/comp/ce-sf-65.dat +163 -0
  477. gecatsim/material/edlp/comp/ce-sf-66.dat +158 -0
  478. gecatsim/material/edlp/comp/ce-sf-67.dat +168 -0
  479. gecatsim/material/edlp/comp/ce-sf-68.dat +159 -0
  480. gecatsim/material/edlp/comp/ce-sf-69.dat +164 -0
  481. gecatsim/material/edlp/comp/ce-sf-7.dat +174 -0
  482. gecatsim/material/edlp/comp/ce-sf-70.dat +169 -0
  483. gecatsim/material/edlp/comp/ce-sf-71.dat +162 -0
  484. gecatsim/material/edlp/comp/ce-sf-72.dat +163 -0
  485. gecatsim/material/edlp/comp/ce-sf-73.dat +165 -0
  486. gecatsim/material/edlp/comp/ce-sf-74.dat +164 -0
  487. gecatsim/material/edlp/comp/ce-sf-75.dat +161 -0
  488. gecatsim/material/edlp/comp/ce-sf-76.dat +155 -0
  489. gecatsim/material/edlp/comp/ce-sf-77.dat +152 -0
  490. gecatsim/material/edlp/comp/ce-sf-78.dat +150 -0
  491. gecatsim/material/edlp/comp/ce-sf-79.dat +148 -0
  492. gecatsim/material/edlp/comp/ce-sf-8.dat +176 -0
  493. gecatsim/material/edlp/comp/ce-sf-80.dat +153 -0
  494. gecatsim/material/edlp/comp/ce-sf-81.dat +158 -0
  495. gecatsim/material/edlp/comp/ce-sf-82.dat +154 -0
  496. gecatsim/material/edlp/comp/ce-sf-83.dat +159 -0
  497. gecatsim/material/edlp/comp/ce-sf-84.dat +156 -0
  498. gecatsim/material/edlp/comp/ce-sf-85.dat +162 -0
  499. gecatsim/material/edlp/comp/ce-sf-86.dat +154 -0
  500. gecatsim/material/edlp/comp/ce-sf-87.dat +154 -0
  501. gecatsim/material/edlp/comp/ce-sf-88.dat +153 -0
  502. gecatsim/material/edlp/comp/ce-sf-89.dat +151 -0
  503. gecatsim/material/edlp/comp/ce-sf-9.dat +184 -0
  504. gecatsim/material/edlp/comp/ce-sf-90.dat +153 -0
  505. gecatsim/material/edlp/comp/ce-sf-91.dat +151 -0
  506. gecatsim/material/edlp/comp/ce-sf-92.dat +157 -0
  507. gecatsim/material/edlp/comp/ce-sf-93.dat +152 -0
  508. gecatsim/material/edlp/comp/ce-sf-94.dat +154 -0
  509. gecatsim/material/edlp/comp/ce-sf-95.dat +151 -0
  510. gecatsim/material/edlp/comp/ce-sf-96.dat +151 -0
  511. gecatsim/material/edlp/comp/ce-sf-97.dat +150 -0
  512. gecatsim/material/edlp/comp/ce-sf-98.dat +152 -0
  513. gecatsim/material/edlp/comp/ce-sf-99.dat +152 -0
  514. gecatsim/material/edlp/comp/ce-sf-all.dat +0 -0
  515. gecatsim/material/edlp/pair/pp-cs-1.dat +96 -0
  516. gecatsim/material/edlp/pair/pp-cs-10.dat +110 -0
  517. gecatsim/material/edlp/pair/pp-cs-100.dat +126 -0
  518. gecatsim/material/edlp/pair/pp-cs-11.dat +112 -0
  519. gecatsim/material/edlp/pair/pp-cs-12.dat +111 -0
  520. gecatsim/material/edlp/pair/pp-cs-13.dat +112 -0
  521. gecatsim/material/edlp/pair/pp-cs-14.dat +113 -0
  522. gecatsim/material/edlp/pair/pp-cs-15.dat +113 -0
  523. gecatsim/material/edlp/pair/pp-cs-16.dat +114 -0
  524. gecatsim/material/edlp/pair/pp-cs-17.dat +112 -0
  525. gecatsim/material/edlp/pair/pp-cs-18.dat +113 -0
  526. gecatsim/material/edlp/pair/pp-cs-19.dat +113 -0
  527. gecatsim/material/edlp/pair/pp-cs-2.dat +100 -0
  528. gecatsim/material/edlp/pair/pp-cs-20.dat +114 -0
  529. gecatsim/material/edlp/pair/pp-cs-21.dat +115 -0
  530. gecatsim/material/edlp/pair/pp-cs-22.dat +115 -0
  531. gecatsim/material/edlp/pair/pp-cs-23.dat +116 -0
  532. gecatsim/material/edlp/pair/pp-cs-24.dat +115 -0
  533. gecatsim/material/edlp/pair/pp-cs-25.dat +115 -0
  534. gecatsim/material/edlp/pair/pp-cs-26.dat +116 -0
  535. gecatsim/material/edlp/pair/pp-cs-27.dat +117 -0
  536. gecatsim/material/edlp/pair/pp-cs-28.dat +117 -0
  537. gecatsim/material/edlp/pair/pp-cs-29.dat +117 -0
  538. gecatsim/material/edlp/pair/pp-cs-3.dat +104 -0
  539. gecatsim/material/edlp/pair/pp-cs-30.dat +117 -0
  540. gecatsim/material/edlp/pair/pp-cs-31.dat +118 -0
  541. gecatsim/material/edlp/pair/pp-cs-32.dat +118 -0
  542. gecatsim/material/edlp/pair/pp-cs-33.dat +118 -0
  543. gecatsim/material/edlp/pair/pp-cs-34.dat +119 -0
  544. gecatsim/material/edlp/pair/pp-cs-35.dat +119 -0
  545. gecatsim/material/edlp/pair/pp-cs-36.dat +119 -0
  546. gecatsim/material/edlp/pair/pp-cs-37.dat +118 -0
  547. gecatsim/material/edlp/pair/pp-cs-38.dat +119 -0
  548. gecatsim/material/edlp/pair/pp-cs-39.dat +119 -0
  549. gecatsim/material/edlp/pair/pp-cs-4.dat +105 -0
  550. gecatsim/material/edlp/pair/pp-cs-40.dat +119 -0
  551. gecatsim/material/edlp/pair/pp-cs-41.dat +119 -0
  552. gecatsim/material/edlp/pair/pp-cs-42.dat +119 -0
  553. gecatsim/material/edlp/pair/pp-cs-43.dat +119 -0
  554. gecatsim/material/edlp/pair/pp-cs-44.dat +119 -0
  555. gecatsim/material/edlp/pair/pp-cs-45.dat +119 -0
  556. gecatsim/material/edlp/pair/pp-cs-46.dat +119 -0
  557. gecatsim/material/edlp/pair/pp-cs-47.dat +120 -0
  558. gecatsim/material/edlp/pair/pp-cs-48.dat +120 -0
  559. gecatsim/material/edlp/pair/pp-cs-49.dat +120 -0
  560. gecatsim/material/edlp/pair/pp-cs-5.dat +106 -0
  561. gecatsim/material/edlp/pair/pp-cs-50.dat +120 -0
  562. gecatsim/material/edlp/pair/pp-cs-51.dat +120 -0
  563. gecatsim/material/edlp/pair/pp-cs-52.dat +120 -0
  564. gecatsim/material/edlp/pair/pp-cs-53.dat +121 -0
  565. gecatsim/material/edlp/pair/pp-cs-54.dat +121 -0
  566. gecatsim/material/edlp/pair/pp-cs-55.dat +121 -0
  567. gecatsim/material/edlp/pair/pp-cs-56.dat +121 -0
  568. gecatsim/material/edlp/pair/pp-cs-57.dat +122 -0
  569. gecatsim/material/edlp/pair/pp-cs-58.dat +122 -0
  570. gecatsim/material/edlp/pair/pp-cs-59.dat +122 -0
  571. gecatsim/material/edlp/pair/pp-cs-6.dat +107 -0
  572. gecatsim/material/edlp/pair/pp-cs-60.dat +122 -0
  573. gecatsim/material/edlp/pair/pp-cs-61.dat +122 -0
  574. gecatsim/material/edlp/pair/pp-cs-62.dat +123 -0
  575. gecatsim/material/edlp/pair/pp-cs-63.dat +123 -0
  576. gecatsim/material/edlp/pair/pp-cs-64.dat +123 -0
  577. gecatsim/material/edlp/pair/pp-cs-65.dat +124 -0
  578. gecatsim/material/edlp/pair/pp-cs-66.dat +124 -0
  579. gecatsim/material/edlp/pair/pp-cs-67.dat +124 -0
  580. gecatsim/material/edlp/pair/pp-cs-68.dat +124 -0
  581. gecatsim/material/edlp/pair/pp-cs-69.dat +124 -0
  582. gecatsim/material/edlp/pair/pp-cs-7.dat +108 -0
  583. gecatsim/material/edlp/pair/pp-cs-70.dat +124 -0
  584. gecatsim/material/edlp/pair/pp-cs-71.dat +124 -0
  585. gecatsim/material/edlp/pair/pp-cs-72.dat +124 -0
  586. gecatsim/material/edlp/pair/pp-cs-73.dat +125 -0
  587. gecatsim/material/edlp/pair/pp-cs-74.dat +125 -0
  588. gecatsim/material/edlp/pair/pp-cs-75.dat +126 -0
  589. gecatsim/material/edlp/pair/pp-cs-76.dat +126 -0
  590. gecatsim/material/edlp/pair/pp-cs-77.dat +126 -0
  591. gecatsim/material/edlp/pair/pp-cs-78.dat +125 -0
  592. gecatsim/material/edlp/pair/pp-cs-79.dat +125 -0
  593. gecatsim/material/edlp/pair/pp-cs-8.dat +109 -0
  594. gecatsim/material/edlp/pair/pp-cs-80.dat +125 -0
  595. gecatsim/material/edlp/pair/pp-cs-81.dat +126 -0
  596. gecatsim/material/edlp/pair/pp-cs-82.dat +126 -0
  597. gecatsim/material/edlp/pair/pp-cs-83.dat +126 -0
  598. gecatsim/material/edlp/pair/pp-cs-84.dat +126 -0
  599. gecatsim/material/edlp/pair/pp-cs-85.dat +126 -0
  600. gecatsim/material/edlp/pair/pp-cs-86.dat +126 -0
  601. gecatsim/material/edlp/pair/pp-cs-87.dat +126 -0
  602. gecatsim/material/edlp/pair/pp-cs-88.dat +126 -0
  603. gecatsim/material/edlp/pair/pp-cs-89.dat +127 -0
  604. gecatsim/material/edlp/pair/pp-cs-9.dat +109 -0
  605. gecatsim/material/edlp/pair/pp-cs-90.dat +127 -0
  606. gecatsim/material/edlp/pair/pp-cs-91.dat +127 -0
  607. gecatsim/material/edlp/pair/pp-cs-92.dat +127 -0
  608. gecatsim/material/edlp/pair/pp-cs-93.dat +127 -0
  609. gecatsim/material/edlp/pair/pp-cs-94.dat +126 -0
  610. gecatsim/material/edlp/pair/pp-cs-95.dat +126 -0
  611. gecatsim/material/edlp/pair/pp-cs-96.dat +126 -0
  612. gecatsim/material/edlp/pair/pp-cs-97.dat +126 -0
  613. gecatsim/material/edlp/pair/pp-cs-98.dat +126 -0
  614. gecatsim/material/edlp/pair/pp-cs-99.dat +126 -0
  615. gecatsim/material/edlp/pair/pp-cs-all.dat +0 -0
  616. gecatsim/material/edlp/phot/pe-cs-1.dat +87 -0
  617. gecatsim/material/edlp/phot/pe-cs-10.dat +388 -0
  618. gecatsim/material/edlp/phot/pe-cs-100.dat +1513 -0
  619. gecatsim/material/edlp/phot/pe-cs-11.dat +603 -0
  620. gecatsim/material/edlp/phot/pe-cs-12.dat +535 -0
  621. gecatsim/material/edlp/phot/pe-cs-13.dat +819 -0
  622. gecatsim/material/edlp/phot/pe-cs-14.dat +759 -0
  623. gecatsim/material/edlp/phot/pe-cs-15.dat +663 -0
  624. gecatsim/material/edlp/phot/pe-cs-16.dat +659 -0
  625. gecatsim/material/edlp/phot/pe-cs-17.dat +701 -0
  626. gecatsim/material/edlp/phot/pe-cs-18.dat +651 -0
  627. gecatsim/material/edlp/phot/pe-cs-19.dat +795 -0
  628. gecatsim/material/edlp/phot/pe-cs-2.dat +97 -0
  629. gecatsim/material/edlp/phot/pe-cs-20.dat +765 -0
  630. gecatsim/material/edlp/phot/pe-cs-21.dat +912 -0
  631. gecatsim/material/edlp/phot/pe-cs-22.dat +948 -0
  632. gecatsim/material/edlp/phot/pe-cs-23.dat +944 -0
  633. gecatsim/material/edlp/phot/pe-cs-24.dat +904 -0
  634. gecatsim/material/edlp/phot/pe-cs-25.dat +905 -0
  635. gecatsim/material/edlp/phot/pe-cs-26.dat +923 -0
  636. gecatsim/material/edlp/phot/pe-cs-27.dat +863 -0
  637. gecatsim/material/edlp/phot/pe-cs-28.dat +931 -0
  638. gecatsim/material/edlp/phot/pe-cs-29.dat +883 -0
  639. gecatsim/material/edlp/phot/pe-cs-3.dat +193 -0
  640. gecatsim/material/edlp/phot/pe-cs-30.dat +883 -0
  641. gecatsim/material/edlp/phot/pe-cs-31.dat +1018 -0
  642. gecatsim/material/edlp/phot/pe-cs-32.dat +1039 -0
  643. gecatsim/material/edlp/phot/pe-cs-33.dat +980 -0
  644. gecatsim/material/edlp/phot/pe-cs-34.dat +973 -0
  645. gecatsim/material/edlp/phot/pe-cs-35.dat +996 -0
  646. gecatsim/material/edlp/phot/pe-cs-36.dat +981 -0
  647. gecatsim/material/edlp/phot/pe-cs-37.dat +1047 -0
  648. gecatsim/material/edlp/phot/pe-cs-38.dat +975 -0
  649. gecatsim/material/edlp/phot/pe-cs-39.dat +1181 -0
  650. gecatsim/material/edlp/phot/pe-cs-4.dat +188 -0
  651. gecatsim/material/edlp/phot/pe-cs-40.dat +1169 -0
  652. gecatsim/material/edlp/phot/pe-cs-41.dat +1202 -0
  653. gecatsim/material/edlp/phot/pe-cs-42.dat +1181 -0
  654. gecatsim/material/edlp/phot/pe-cs-43.dat +1192 -0
  655. gecatsim/material/edlp/phot/pe-cs-44.dat +1217 -0
  656. gecatsim/material/edlp/phot/pe-cs-45.dat +1218 -0
  657. gecatsim/material/edlp/phot/pe-cs-46.dat +1070 -0
  658. gecatsim/material/edlp/phot/pe-cs-47.dat +1209 -0
  659. gecatsim/material/edlp/phot/pe-cs-48.dat +1202 -0
  660. gecatsim/material/edlp/phot/pe-cs-49.dat +1334 -0
  661. gecatsim/material/edlp/phot/pe-cs-5.dat +365 -0
  662. gecatsim/material/edlp/phot/pe-cs-50.dat +1234 -0
  663. gecatsim/material/edlp/phot/pe-cs-51.dat +1262 -0
  664. gecatsim/material/edlp/phot/pe-cs-52.dat +1166 -0
  665. gecatsim/material/edlp/phot/pe-cs-53.dat +1224 -0
  666. gecatsim/material/edlp/phot/pe-cs-54.dat +1139 -0
  667. gecatsim/material/edlp/phot/pe-cs-55.dat +1117 -0
  668. gecatsim/material/edlp/phot/pe-cs-56.dat +1068 -0
  669. gecatsim/material/edlp/phot/pe-cs-57.dat +1213 -0
  670. gecatsim/material/edlp/phot/pe-cs-58.dat +1230 -0
  671. gecatsim/material/edlp/phot/pe-cs-59.dat +1173 -0
  672. gecatsim/material/edlp/phot/pe-cs-6.dat +369 -0
  673. gecatsim/material/edlp/phot/pe-cs-60.dat +1237 -0
  674. gecatsim/material/edlp/phot/pe-cs-61.dat +1196 -0
  675. gecatsim/material/edlp/phot/pe-cs-62.dat +1210 -0
  676. gecatsim/material/edlp/phot/pe-cs-63.dat +1167 -0
  677. gecatsim/material/edlp/phot/pe-cs-64.dat +1309 -0
  678. gecatsim/material/edlp/phot/pe-cs-65.dat +1140 -0
  679. gecatsim/material/edlp/phot/pe-cs-66.dat +1172 -0
  680. gecatsim/material/edlp/phot/pe-cs-67.dat +1175 -0
  681. gecatsim/material/edlp/phot/pe-cs-68.dat +1168 -0
  682. gecatsim/material/edlp/phot/pe-cs-69.dat +1222 -0
  683. gecatsim/material/edlp/phot/pe-cs-7.dat +367 -0
  684. gecatsim/material/edlp/phot/pe-cs-70.dat +1217 -0
  685. gecatsim/material/edlp/phot/pe-cs-71.dat +1341 -0
  686. gecatsim/material/edlp/phot/pe-cs-72.dat +1317 -0
  687. gecatsim/material/edlp/phot/pe-cs-73.dat +1270 -0
  688. gecatsim/material/edlp/phot/pe-cs-74.dat +1295 -0
  689. gecatsim/material/edlp/phot/pe-cs-75.dat +1257 -0
  690. gecatsim/material/edlp/phot/pe-cs-76.dat +1295 -0
  691. gecatsim/material/edlp/phot/pe-cs-77.dat +1196 -0
  692. gecatsim/material/edlp/phot/pe-cs-78.dat +1198 -0
  693. gecatsim/material/edlp/phot/pe-cs-79.dat +1276 -0
  694. gecatsim/material/edlp/phot/pe-cs-8.dat +396 -0
  695. gecatsim/material/edlp/phot/pe-cs-80.dat +1205 -0
  696. gecatsim/material/edlp/phot/pe-cs-81.dat +1380 -0
  697. gecatsim/material/edlp/phot/pe-cs-82.dat +1355 -0
  698. gecatsim/material/edlp/phot/pe-cs-83.dat +1386 -0
  699. gecatsim/material/edlp/phot/pe-cs-84.dat +1366 -0
  700. gecatsim/material/edlp/phot/pe-cs-85.dat +1379 -0
  701. gecatsim/material/edlp/phot/pe-cs-86.dat +1342 -0
  702. gecatsim/material/edlp/phot/pe-cs-87.dat +1390 -0
  703. gecatsim/material/edlp/phot/pe-cs-88.dat +1248 -0
  704. gecatsim/material/edlp/phot/pe-cs-89.dat +1288 -0
  705. gecatsim/material/edlp/phot/pe-cs-9.dat +384 -0
  706. gecatsim/material/edlp/phot/pe-cs-90.dat +1400 -0
  707. gecatsim/material/edlp/phot/pe-cs-91.dat +1517 -0
  708. gecatsim/material/edlp/phot/pe-cs-92.dat +1571 -0
  709. gecatsim/material/edlp/phot/pe-cs-93.dat +1602 -0
  710. gecatsim/material/edlp/phot/pe-cs-94.dat +1432 -0
  711. gecatsim/material/edlp/phot/pe-cs-95.dat +1456 -0
  712. gecatsim/material/edlp/phot/pe-cs-96.dat +1494 -0
  713. gecatsim/material/edlp/phot/pe-cs-97.dat +1522 -0
  714. gecatsim/material/edlp/phot/pe-cs-98.dat +1498 -0
  715. gecatsim/material/edlp/phot/pe-cs-99.dat +1573 -0
  716. gecatsim/material/edlp/phot/pe-cs-all.dat +0 -0
  717. gecatsim/material/edlp/phot/pe-ss-cs-1.dat +88 -0
  718. gecatsim/material/edlp/phot/pe-ss-cs-10.dat +474 -0
  719. gecatsim/material/edlp/phot/pe-ss-cs-100.dat +2821 -0
  720. gecatsim/material/edlp/phot/pe-ss-cs-11.dat +717 -0
  721. gecatsim/material/edlp/phot/pe-ss-cs-12.dat +693 -0
  722. gecatsim/material/edlp/phot/pe-ss-cs-13.dat +978 -0
  723. gecatsim/material/edlp/phot/pe-ss-cs-14.dat +941 -0
  724. gecatsim/material/edlp/phot/pe-ss-cs-15.dat +884 -0
  725. gecatsim/material/edlp/phot/pe-ss-cs-16.dat +861 -0
  726. gecatsim/material/edlp/phot/pe-ss-cs-17.dat +870 -0
  727. gecatsim/material/edlp/phot/pe-ss-cs-18.dat +853 -0
  728. gecatsim/material/edlp/phot/pe-ss-cs-19.dat +993 -0
  729. gecatsim/material/edlp/phot/pe-ss-cs-2.dat +98 -0
  730. gecatsim/material/edlp/phot/pe-ss-cs-20.dat +959 -0
  731. gecatsim/material/edlp/phot/pe-ss-cs-21.dat +1233 -0
  732. gecatsim/material/edlp/phot/pe-ss-cs-22.dat +1227 -0
  733. gecatsim/material/edlp/phot/pe-ss-cs-23.dat +1225 -0
  734. gecatsim/material/edlp/phot/pe-ss-cs-24.dat +1250 -0
  735. gecatsim/material/edlp/phot/pe-ss-cs-25.dat +1209 -0
  736. gecatsim/material/edlp/phot/pe-ss-cs-26.dat +1209 -0
  737. gecatsim/material/edlp/phot/pe-ss-cs-27.dat +1200 -0
  738. gecatsim/material/edlp/phot/pe-ss-cs-28.dat +1198 -0
  739. gecatsim/material/edlp/phot/pe-ss-cs-29.dat +1204 -0
  740. gecatsim/material/edlp/phot/pe-ss-cs-3.dat +207 -0
  741. gecatsim/material/edlp/phot/pe-ss-cs-30.dat +1199 -0
  742. gecatsim/material/edlp/phot/pe-ss-cs-31.dat +1471 -0
  743. gecatsim/material/edlp/phot/pe-ss-cs-32.dat +1456 -0
  744. gecatsim/material/edlp/phot/pe-ss-cs-33.dat +1419 -0
  745. gecatsim/material/edlp/phot/pe-ss-cs-34.dat +1425 -0
  746. gecatsim/material/edlp/phot/pe-ss-cs-35.dat +1392 -0
  747. gecatsim/material/edlp/phot/pe-ss-cs-36.dat +1395 -0
  748. gecatsim/material/edlp/phot/pe-ss-cs-37.dat +1460 -0
  749. gecatsim/material/edlp/phot/pe-ss-cs-38.dat +1407 -0
  750. gecatsim/material/edlp/phot/pe-ss-cs-39.dat +1819 -0
  751. gecatsim/material/edlp/phot/pe-ss-cs-4.dat +211 -0
  752. gecatsim/material/edlp/phot/pe-ss-cs-40.dat +1807 -0
  753. gecatsim/material/edlp/phot/pe-ss-cs-41.dat +1811 -0
  754. gecatsim/material/edlp/phot/pe-ss-cs-42.dat +1818 -0
  755. gecatsim/material/edlp/phot/pe-ss-cs-43.dat +1792 -0
  756. gecatsim/material/edlp/phot/pe-ss-cs-44.dat +1781 -0
  757. gecatsim/material/edlp/phot/pe-ss-cs-45.dat +1788 -0
  758. gecatsim/material/edlp/phot/pe-ss-cs-46.dat +1611 -0
  759. gecatsim/material/edlp/phot/pe-ss-cs-47.dat +1771 -0
  760. gecatsim/material/edlp/phot/pe-ss-cs-48.dat +1782 -0
  761. gecatsim/material/edlp/phot/pe-ss-cs-49.dat +2033 -0
  762. gecatsim/material/edlp/phot/pe-ss-cs-5.dat +431 -0
  763. gecatsim/material/edlp/phot/pe-ss-cs-50.dat +1943 -0
  764. gecatsim/material/edlp/phot/pe-ss-cs-51.dat +1918 -0
  765. gecatsim/material/edlp/phot/pe-ss-cs-52.dat +1879 -0
  766. gecatsim/material/edlp/phot/pe-ss-cs-53.dat +1861 -0
  767. gecatsim/material/edlp/phot/pe-ss-cs-54.dat +1782 -0
  768. gecatsim/material/edlp/phot/pe-ss-cs-55.dat +1855 -0
  769. gecatsim/material/edlp/phot/pe-ss-cs-56.dat +1813 -0
  770. gecatsim/material/edlp/phot/pe-ss-cs-57.dat +2144 -0
  771. gecatsim/material/edlp/phot/pe-ss-cs-58.dat +2090 -0
  772. gecatsim/material/edlp/phot/pe-ss-cs-59.dat +2071 -0
  773. gecatsim/material/edlp/phot/pe-ss-cs-6.dat +436 -0
  774. gecatsim/material/edlp/phot/pe-ss-cs-60.dat +2066 -0
  775. gecatsim/material/edlp/phot/pe-ss-cs-61.dat +2064 -0
  776. gecatsim/material/edlp/phot/pe-ss-cs-62.dat +2063 -0
  777. gecatsim/material/edlp/phot/pe-ss-cs-63.dat +2043 -0
  778. gecatsim/material/edlp/phot/pe-ss-cs-64.dat +2405 -0
  779. gecatsim/material/edlp/phot/pe-ss-cs-65.dat +2035 -0
  780. gecatsim/material/edlp/phot/pe-ss-cs-66.dat +2023 -0
  781. gecatsim/material/edlp/phot/pe-ss-cs-67.dat +2026 -0
  782. gecatsim/material/edlp/phot/pe-ss-cs-68.dat +2029 -0
  783. gecatsim/material/edlp/phot/pe-ss-cs-69.dat +2018 -0
  784. gecatsim/material/edlp/phot/pe-ss-cs-7.dat +440 -0
  785. gecatsim/material/edlp/phot/pe-ss-cs-70.dat +2048 -0
  786. gecatsim/material/edlp/phot/pe-ss-cs-71.dat +2348 -0
  787. gecatsim/material/edlp/phot/pe-ss-cs-72.dat +2333 -0
  788. gecatsim/material/edlp/phot/pe-ss-cs-73.dat +2320 -0
  789. gecatsim/material/edlp/phot/pe-ss-cs-74.dat +2313 -0
  790. gecatsim/material/edlp/phot/pe-ss-cs-75.dat +2290 -0
  791. gecatsim/material/edlp/phot/pe-ss-cs-76.dat +2280 -0
  792. gecatsim/material/edlp/phot/pe-ss-cs-77.dat +2145 -0
  793. gecatsim/material/edlp/phot/pe-ss-cs-78.dat +2268 -0
  794. gecatsim/material/edlp/phot/pe-ss-cs-79.dat +2262 -0
  795. gecatsim/material/edlp/phot/pe-ss-cs-8.dat +445 -0
  796. gecatsim/material/edlp/phot/pe-ss-cs-80.dat +2271 -0
  797. gecatsim/material/edlp/phot/pe-ss-cs-81.dat +2497 -0
  798. gecatsim/material/edlp/phot/pe-ss-cs-82.dat +2494 -0
  799. gecatsim/material/edlp/phot/pe-ss-cs-83.dat +2467 -0
  800. gecatsim/material/edlp/phot/pe-ss-cs-84.dat +2453 -0
  801. gecatsim/material/edlp/phot/pe-ss-cs-85.dat +2423 -0
  802. gecatsim/material/edlp/phot/pe-ss-cs-86.dat +2379 -0
  803. gecatsim/material/edlp/phot/pe-ss-cs-87.dat +2451 -0
  804. gecatsim/material/edlp/phot/pe-ss-cs-88.dat +2367 -0
  805. gecatsim/material/edlp/phot/pe-ss-cs-89.dat +2696 -0
  806. gecatsim/material/edlp/phot/pe-ss-cs-9.dat +457 -0
  807. gecatsim/material/edlp/phot/pe-ss-cs-90.dat +2694 -0
  808. gecatsim/material/edlp/phot/pe-ss-cs-91.dat +3131 -0
  809. gecatsim/material/edlp/phot/pe-ss-cs-92.dat +3130 -0
  810. gecatsim/material/edlp/phot/pe-ss-cs-93.dat +3142 -0
  811. gecatsim/material/edlp/phot/pe-ss-cs-94.dat +2794 -0
  812. gecatsim/material/edlp/phot/pe-ss-cs-95.dat +2810 -0
  813. gecatsim/material/edlp/phot/pe-ss-cs-96.dat +3103 -0
  814. gecatsim/material/edlp/phot/pe-ss-cs-97.dat +3126 -0
  815. gecatsim/material/edlp/phot/pe-ss-cs-98.dat +2835 -0
  816. gecatsim/material/edlp/phot/pe-ss-cs-99.dat +2851 -0
  817. gecatsim/material/edlp/rayl/re-cs-1.dat +375 -0
  818. gecatsim/material/edlp/rayl/re-cs-10.dat +453 -0
  819. gecatsim/material/edlp/rayl/re-cs-100.dat +1555 -0
  820. gecatsim/material/edlp/rayl/re-cs-11.dat +607 -0
  821. gecatsim/material/edlp/rayl/re-cs-12.dat +561 -0
  822. gecatsim/material/edlp/rayl/re-cs-13.dat +903 -0
  823. gecatsim/material/edlp/rayl/re-cs-14.dat +830 -0
  824. gecatsim/material/edlp/rayl/re-cs-15.dat +745 -0
  825. gecatsim/material/edlp/rayl/re-cs-16.dat +698 -0
  826. gecatsim/material/edlp/rayl/re-cs-17.dat +666 -0
  827. gecatsim/material/edlp/rayl/re-cs-18.dat +597 -0
  828. gecatsim/material/edlp/rayl/re-cs-19.dat +760 -0
  829. gecatsim/material/edlp/rayl/re-cs-2.dat +343 -0
  830. gecatsim/material/edlp/rayl/re-cs-20.dat +796 -0
  831. gecatsim/material/edlp/rayl/re-cs-21.dat +869 -0
  832. gecatsim/material/edlp/rayl/re-cs-22.dat +869 -0
  833. gecatsim/material/edlp/rayl/re-cs-23.dat +839 -0
  834. gecatsim/material/edlp/rayl/re-cs-24.dat +826 -0
  835. gecatsim/material/edlp/rayl/re-cs-25.dat +914 -0
  836. gecatsim/material/edlp/rayl/re-cs-26.dat +913 -0
  837. gecatsim/material/edlp/rayl/re-cs-27.dat +901 -0
  838. gecatsim/material/edlp/rayl/re-cs-28.dat +888 -0
  839. gecatsim/material/edlp/rayl/re-cs-29.dat +844 -0
  840. gecatsim/material/edlp/rayl/re-cs-3.dat +517 -0
  841. gecatsim/material/edlp/rayl/re-cs-30.dat +801 -0
  842. gecatsim/material/edlp/rayl/re-cs-31.dat +1202 -0
  843. gecatsim/material/edlp/rayl/re-cs-32.dat +1113 -0
  844. gecatsim/material/edlp/rayl/re-cs-33.dat +1010 -0
  845. gecatsim/material/edlp/rayl/re-cs-34.dat +928 -0
  846. gecatsim/material/edlp/rayl/re-cs-35.dat +894 -0
  847. gecatsim/material/edlp/rayl/re-cs-36.dat +719 -0
  848. gecatsim/material/edlp/rayl/re-cs-37.dat +892 -0
  849. gecatsim/material/edlp/rayl/re-cs-38.dat +891 -0
  850. gecatsim/material/edlp/rayl/re-cs-39.dat +906 -0
  851. gecatsim/material/edlp/rayl/re-cs-4.dat +493 -0
  852. gecatsim/material/edlp/rayl/re-cs-40.dat +930 -0
  853. gecatsim/material/edlp/rayl/re-cs-41.dat +918 -0
  854. gecatsim/material/edlp/rayl/re-cs-42.dat +1068 -0
  855. gecatsim/material/edlp/rayl/re-cs-43.dat +1085 -0
  856. gecatsim/material/edlp/rayl/re-cs-44.dat +1085 -0
  857. gecatsim/material/edlp/rayl/re-cs-45.dat +1124 -0
  858. gecatsim/material/edlp/rayl/re-cs-46.dat +853 -0
  859. gecatsim/material/edlp/rayl/re-cs-47.dat +1087 -0
  860. gecatsim/material/edlp/rayl/re-cs-48.dat +1001 -0
  861. gecatsim/material/edlp/rayl/re-cs-49.dat +1508 -0
  862. gecatsim/material/edlp/rayl/re-cs-5.dat +619 -0
  863. gecatsim/material/edlp/rayl/re-cs-50.dat +1370 -0
  864. gecatsim/material/edlp/rayl/re-cs-51.dat +1234 -0
  865. gecatsim/material/edlp/rayl/re-cs-52.dat +1138 -0
  866. gecatsim/material/edlp/rayl/re-cs-53.dat +1062 -0
  867. gecatsim/material/edlp/rayl/re-cs-54.dat +925 -0
  868. gecatsim/material/edlp/rayl/re-cs-55.dat +1130 -0
  869. gecatsim/material/edlp/rayl/re-cs-56.dat +1176 -0
  870. gecatsim/material/edlp/rayl/re-cs-57.dat +1172 -0
  871. gecatsim/material/edlp/rayl/re-cs-58.dat +1243 -0
  872. gecatsim/material/edlp/rayl/re-cs-59.dat +1232 -0
  873. gecatsim/material/edlp/rayl/re-cs-6.dat +647 -0
  874. gecatsim/material/edlp/rayl/re-cs-60.dat +1195 -0
  875. gecatsim/material/edlp/rayl/re-cs-61.dat +1229 -0
  876. gecatsim/material/edlp/rayl/re-cs-62.dat +1297 -0
  877. gecatsim/material/edlp/rayl/re-cs-63.dat +1324 -0
  878. gecatsim/material/edlp/rayl/re-cs-64.dat +1384 -0
  879. gecatsim/material/edlp/rayl/re-cs-65.dat +1356 -0
  880. gecatsim/material/edlp/rayl/re-cs-66.dat +1401 -0
  881. gecatsim/material/edlp/rayl/re-cs-67.dat +1374 -0
  882. gecatsim/material/edlp/rayl/re-cs-68.dat +1264 -0
  883. gecatsim/material/edlp/rayl/re-cs-69.dat +1327 -0
  884. gecatsim/material/edlp/rayl/re-cs-7.dat +669 -0
  885. gecatsim/material/edlp/rayl/re-cs-70.dat +1243 -0
  886. gecatsim/material/edlp/rayl/re-cs-71.dat +1384 -0
  887. gecatsim/material/edlp/rayl/re-cs-72.dat +1338 -0
  888. gecatsim/material/edlp/rayl/re-cs-73.dat +1181 -0
  889. gecatsim/material/edlp/rayl/re-cs-74.dat +1009 -0
  890. gecatsim/material/edlp/rayl/re-cs-75.dat +1138 -0
  891. gecatsim/material/edlp/rayl/re-cs-76.dat +1106 -0
  892. gecatsim/material/edlp/rayl/re-cs-77.dat +1040 -0
  893. gecatsim/material/edlp/rayl/re-cs-78.dat +1176 -0
  894. gecatsim/material/edlp/rayl/re-cs-79.dat +1123 -0
  895. gecatsim/material/edlp/rayl/re-cs-8.dat +662 -0
  896. gecatsim/material/edlp/rayl/re-cs-80.dat +1126 -0
  897. gecatsim/material/edlp/rayl/re-cs-81.dat +1668 -0
  898. gecatsim/material/edlp/rayl/re-cs-82.dat +1641 -0
  899. gecatsim/material/edlp/rayl/re-cs-83.dat +1448 -0
  900. gecatsim/material/edlp/rayl/re-cs-84.dat +1338 -0
  901. gecatsim/material/edlp/rayl/re-cs-85.dat +1236 -0
  902. gecatsim/material/edlp/rayl/re-cs-86.dat +1099 -0
  903. gecatsim/material/edlp/rayl/re-cs-87.dat +1368 -0
  904. gecatsim/material/edlp/rayl/re-cs-88.dat +1448 -0
  905. gecatsim/material/edlp/rayl/re-cs-89.dat +1592 -0
  906. gecatsim/material/edlp/rayl/re-cs-9.dat +584 -0
  907. gecatsim/material/edlp/rayl/re-cs-90.dat +1504 -0
  908. gecatsim/material/edlp/rayl/re-cs-91.dat +1547 -0
  909. gecatsim/material/edlp/rayl/re-cs-92.dat +1633 -0
  910. gecatsim/material/edlp/rayl/re-cs-93.dat +1625 -0
  911. gecatsim/material/edlp/rayl/re-cs-94.dat +1427 -0
  912. gecatsim/material/edlp/rayl/re-cs-95.dat +1465 -0
  913. gecatsim/material/edlp/rayl/re-cs-96.dat +1794 -0
  914. gecatsim/material/edlp/rayl/re-cs-97.dat +1638 -0
  915. gecatsim/material/edlp/rayl/re-cs-98.dat +1554 -0
  916. gecatsim/material/edlp/rayl/re-cs-99.dat +1528 -0
  917. gecatsim/material/edlp/rayl/re-cs-all.dat +0 -0
  918. gecatsim/material/edlp/rayl/re-ff-1.dat +103 -0
  919. gecatsim/material/edlp/rayl/re-ff-10.dat +175 -0
  920. gecatsim/material/edlp/rayl/re-ff-100.dat +146 -0
  921. gecatsim/material/edlp/rayl/re-ff-11.dat +183 -0
  922. gecatsim/material/edlp/rayl/re-ff-12.dat +176 -0
  923. gecatsim/material/edlp/rayl/re-ff-13.dat +162 -0
  924. gecatsim/material/edlp/rayl/re-ff-14.dat +166 -0
  925. gecatsim/material/edlp/rayl/re-ff-15.dat +162 -0
  926. gecatsim/material/edlp/rayl/re-ff-16.dat +161 -0
  927. gecatsim/material/edlp/rayl/re-ff-17.dat +165 -0
  928. gecatsim/material/edlp/rayl/re-ff-18.dat +157 -0
  929. gecatsim/material/edlp/rayl/re-ff-19.dat +163 -0
  930. gecatsim/material/edlp/rayl/re-ff-2.dat +140 -0
  931. gecatsim/material/edlp/rayl/re-ff-20.dat +164 -0
  932. gecatsim/material/edlp/rayl/re-ff-21.dat +158 -0
  933. gecatsim/material/edlp/rayl/re-ff-22.dat +159 -0
  934. gecatsim/material/edlp/rayl/re-ff-23.dat +158 -0
  935. gecatsim/material/edlp/rayl/re-ff-24.dat +165 -0
  936. gecatsim/material/edlp/rayl/re-ff-25.dat +160 -0
  937. gecatsim/material/edlp/rayl/re-ff-26.dat +163 -0
  938. gecatsim/material/edlp/rayl/re-ff-27.dat +161 -0
  939. gecatsim/material/edlp/rayl/re-ff-28.dat +169 -0
  940. gecatsim/material/edlp/rayl/re-ff-29.dat +163 -0
  941. gecatsim/material/edlp/rayl/re-ff-3.dat +145 -0
  942. gecatsim/material/edlp/rayl/re-ff-30.dat +164 -0
  943. gecatsim/material/edlp/rayl/re-ff-31.dat +162 -0
  944. gecatsim/material/edlp/rayl/re-ff-32.dat +164 -0
  945. gecatsim/material/edlp/rayl/re-ff-33.dat +163 -0
  946. gecatsim/material/edlp/rayl/re-ff-34.dat +165 -0
  947. gecatsim/material/edlp/rayl/re-ff-35.dat +163 -0
  948. gecatsim/material/edlp/rayl/re-ff-36.dat +154 -0
  949. gecatsim/material/edlp/rayl/re-ff-37.dat +156 -0
  950. gecatsim/material/edlp/rayl/re-ff-38.dat +157 -0
  951. gecatsim/material/edlp/rayl/re-ff-39.dat +157 -0
  952. gecatsim/material/edlp/rayl/re-ff-4.dat +147 -0
  953. gecatsim/material/edlp/rayl/re-ff-40.dat +166 -0
  954. gecatsim/material/edlp/rayl/re-ff-41.dat +168 -0
  955. gecatsim/material/edlp/rayl/re-ff-42.dat +163 -0
  956. gecatsim/material/edlp/rayl/re-ff-43.dat +160 -0
  957. gecatsim/material/edlp/rayl/re-ff-44.dat +156 -0
  958. gecatsim/material/edlp/rayl/re-ff-45.dat +156 -0
  959. gecatsim/material/edlp/rayl/re-ff-46.dat +158 -0
  960. gecatsim/material/edlp/rayl/re-ff-47.dat +158 -0
  961. gecatsim/material/edlp/rayl/re-ff-48.dat +160 -0
  962. gecatsim/material/edlp/rayl/re-ff-49.dat +161 -0
  963. gecatsim/material/edlp/rayl/re-ff-5.dat +144 -0
  964. gecatsim/material/edlp/rayl/re-ff-50.dat +154 -0
  965. gecatsim/material/edlp/rayl/re-ff-51.dat +152 -0
  966. gecatsim/material/edlp/rayl/re-ff-52.dat +154 -0
  967. gecatsim/material/edlp/rayl/re-ff-53.dat +159 -0
  968. gecatsim/material/edlp/rayl/re-ff-54.dat +159 -0
  969. gecatsim/material/edlp/rayl/re-ff-55.dat +154 -0
  970. gecatsim/material/edlp/rayl/re-ff-56.dat +157 -0
  971. gecatsim/material/edlp/rayl/re-ff-57.dat +164 -0
  972. gecatsim/material/edlp/rayl/re-ff-58.dat +163 -0
  973. gecatsim/material/edlp/rayl/re-ff-59.dat +158 -0
  974. gecatsim/material/edlp/rayl/re-ff-6.dat +151 -0
  975. gecatsim/material/edlp/rayl/re-ff-60.dat +153 -0
  976. gecatsim/material/edlp/rayl/re-ff-61.dat +165 -0
  977. gecatsim/material/edlp/rayl/re-ff-62.dat +165 -0
  978. gecatsim/material/edlp/rayl/re-ff-63.dat +156 -0
  979. gecatsim/material/edlp/rayl/re-ff-64.dat +162 -0
  980. gecatsim/material/edlp/rayl/re-ff-65.dat +159 -0
  981. gecatsim/material/edlp/rayl/re-ff-66.dat +154 -0
  982. gecatsim/material/edlp/rayl/re-ff-67.dat +164 -0
  983. gecatsim/material/edlp/rayl/re-ff-68.dat +155 -0
  984. gecatsim/material/edlp/rayl/re-ff-69.dat +160 -0
  985. gecatsim/material/edlp/rayl/re-ff-7.dat +170 -0
  986. gecatsim/material/edlp/rayl/re-ff-70.dat +165 -0
  987. gecatsim/material/edlp/rayl/re-ff-71.dat +158 -0
  988. gecatsim/material/edlp/rayl/re-ff-72.dat +159 -0
  989. gecatsim/material/edlp/rayl/re-ff-73.dat +161 -0
  990. gecatsim/material/edlp/rayl/re-ff-74.dat +160 -0
  991. gecatsim/material/edlp/rayl/re-ff-75.dat +157 -0
  992. gecatsim/material/edlp/rayl/re-ff-76.dat +151 -0
  993. gecatsim/material/edlp/rayl/re-ff-77.dat +148 -0
  994. gecatsim/material/edlp/rayl/re-ff-78.dat +146 -0
  995. gecatsim/material/edlp/rayl/re-ff-79.dat +144 -0
  996. gecatsim/material/edlp/rayl/re-ff-8.dat +172 -0
  997. gecatsim/material/edlp/rayl/re-ff-80.dat +149 -0
  998. gecatsim/material/edlp/rayl/re-ff-81.dat +154 -0
  999. gecatsim/material/edlp/rayl/re-ff-82.dat +150 -0
  1000. gecatsim/material/edlp/rayl/re-ff-83.dat +155 -0
  1001. gecatsim/material/edlp/rayl/re-ff-84.dat +152 -0
  1002. gecatsim/material/edlp/rayl/re-ff-85.dat +158 -0
  1003. gecatsim/material/edlp/rayl/re-ff-86.dat +150 -0
  1004. gecatsim/material/edlp/rayl/re-ff-87.dat +150 -0
  1005. gecatsim/material/edlp/rayl/re-ff-88.dat +149 -0
  1006. gecatsim/material/edlp/rayl/re-ff-89.dat +147 -0
  1007. gecatsim/material/edlp/rayl/re-ff-9.dat +180 -0
  1008. gecatsim/material/edlp/rayl/re-ff-90.dat +149 -0
  1009. gecatsim/material/edlp/rayl/re-ff-91.dat +147 -0
  1010. gecatsim/material/edlp/rayl/re-ff-92.dat +153 -0
  1011. gecatsim/material/edlp/rayl/re-ff-93.dat +148 -0
  1012. gecatsim/material/edlp/rayl/re-ff-94.dat +150 -0
  1013. gecatsim/material/edlp/rayl/re-ff-95.dat +147 -0
  1014. gecatsim/material/edlp/rayl/re-ff-96.dat +147 -0
  1015. gecatsim/material/edlp/rayl/re-ff-97.dat +146 -0
  1016. gecatsim/material/edlp/rayl/re-ff-98.dat +148 -0
  1017. gecatsim/material/edlp/rayl/re-ff-99.dat +148 -0
  1018. gecatsim/material/edlp/rayl/re-ff-all.dat +0 -0
  1019. gecatsim/material/graphite +13 -0
  1020. gecatsim/material/ncat_adipose +19 -0
  1021. gecatsim/material/ncat_air +18 -0
  1022. gecatsim/material/ncat_aluminum +14 -0
  1023. gecatsim/material/ncat_bladder +23 -0
  1024. gecatsim/material/ncat_blood +24 -0
  1025. gecatsim/material/ncat_blood_with_0_7pct_iodine +25 -0
  1026. gecatsim/material/ncat_blood_with_0_8pct_iodine +25 -0
  1027. gecatsim/material/ncat_blood_with_0_9pct_iodine +25 -0
  1028. gecatsim/material/ncat_blood_with_1_0pct_iodine +25 -0
  1029. gecatsim/material/ncat_blood_with_1_1pct_iodine +25 -0
  1030. gecatsim/material/ncat_blood_with_2_0pct_iodine +25 -0
  1031. gecatsim/material/ncat_blood_with_3_0pct_iodine +25 -0
  1032. gecatsim/material/ncat_brain +23 -0
  1033. gecatsim/material/ncat_breast_mammary +22 -0
  1034. gecatsim/material/ncat_cartilage +22 -0
  1035. gecatsim/material/ncat_dry_rib +23 -0
  1036. gecatsim/material/ncat_dry_spine +24 -0
  1037. gecatsim/material/ncat_eye_lens +22 -0
  1038. gecatsim/material/ncat_graphite +14 -0
  1039. gecatsim/material/ncat_heart +23 -0
  1040. gecatsim/material/ncat_intestine +23 -0
  1041. gecatsim/material/ncat_iodine +14 -0
  1042. gecatsim/material/ncat_iodine_blood +25 -0
  1043. gecatsim/material/ncat_iron +14 -0
  1044. gecatsim/material/ncat_kidney +24 -0
  1045. gecatsim/material/ncat_lead +14 -0
  1046. gecatsim/material/ncat_liver +23 -0
  1047. gecatsim/material/ncat_lung +23 -0
  1048. gecatsim/material/ncat_lymph +21 -0
  1049. gecatsim/material/ncat_muscle +23 -0
  1050. gecatsim/material/ncat_ovary +23 -0
  1051. gecatsim/material/ncat_pancreas +23 -0
  1052. gecatsim/material/ncat_pmma +17 -0
  1053. gecatsim/material/ncat_red_marrow +23 -0
  1054. gecatsim/material/ncat_skin +23 -0
  1055. gecatsim/material/ncat_skull +23 -0
  1056. gecatsim/material/ncat_spleen +23 -0
  1057. gecatsim/material/ncat_testis +23 -0
  1058. gecatsim/material/ncat_thyroid +24 -0
  1059. gecatsim/material/ncat_titanium +14 -0
  1060. gecatsim/material/ncat_water +16 -0
  1061. gecatsim/material/ncat_yellow_marrow +21 -0
  1062. gecatsim/material/plexi +21 -0
  1063. gecatsim/material/polyethylene +14 -0
  1064. gecatsim/material/polyethylene_HDPE +16 -0
  1065. gecatsim/material/polyethylene_LDPE +16 -0
  1066. gecatsim/material/polyethylene_MDPE +16 -0
  1067. gecatsim/material/polyethylene_legacy +20 -0
  1068. gecatsim/material/polystyrene +18 -0
  1069. gecatsim/material/polystyrene_legacy +21 -0
  1070. gecatsim/material/pvc_legacy +22 -0
  1071. gecatsim/material/water +16 -0
  1072. gecatsim/material/water_20C +16 -0
  1073. gecatsim/material/water_20C_NaCl_0p9_pct +18 -0
  1074. gecatsim/material/water_20C_iodine_100mg +17 -0
  1075. gecatsim/material/water_20C_iodine_10mg +17 -0
  1076. gecatsim/material/water_20C_iodine_15mg +17 -0
  1077. gecatsim/material/water_20C_iodine_1mg +17 -0
  1078. gecatsim/material/water_20C_iodine_20mg +17 -0
  1079. gecatsim/material/water_20C_iodine_2mg +17 -0
  1080. gecatsim/material/water_20C_iodine_30mg +17 -0
  1081. gecatsim/material/water_20C_iodine_40mg +17 -0
  1082. gecatsim/material/water_20C_iodine_50mg +17 -0
  1083. gecatsim/material/water_20C_iodine_5mg +17 -0
  1084. gecatsim/material/water_37C +16 -0
  1085. gecatsim/phantom/CTDI_16cm_WaterAirPEBoneChambers.ppm +62 -0
  1086. gecatsim/phantom/CatSimLogo_1024/CatSimLogo_1024_128mmZ.json +51 -0
  1087. gecatsim/phantom/CatSimLogo_1024/CatSim_logo_1024.json +51 -0
  1088. gecatsim/phantom/CatSimLogo_1024/CatSim_logo_1024_bone_1024x1024x1.raw +0 -0
  1089. gecatsim/phantom/CatSimLogo_1024/CatSim_logo_1024_water_1024x1024x1.raw +0 -0
  1090. gecatsim/phantom/W20.ppm +22 -0
  1091. gecatsim/phantom/W30.ppm +22 -0
  1092. gecatsim/phantom/W35.ppm +22 -0
  1093. gecatsim/phantom/analyticArtifactPhantom.ppm +41 -0
  1094. gecatsim/phantom/female_adult_average_lung_lesions_reduced.nrb +49874 -0
  1095. gecatsim/phantom/poly_bin/poly10 +0 -0
  1096. gecatsim/phantom/poly_bin/poly100 +0 -0
  1097. gecatsim/phantom/poly_bin/poly12 +0 -0
  1098. gecatsim/phantom/poly_bin/poly14 +0 -0
  1099. gecatsim/phantom/poly_bin/poly17 +0 -0
  1100. gecatsim/phantom/poly_bin/poly20 +0 -0
  1101. gecatsim/phantom/poly_bin/poly21 +0 -0
  1102. gecatsim/phantom/poly_bin/poly22 +0 -0
  1103. gecatsim/phantom/poly_bin/poly23 +0 -0
  1104. gecatsim/phantom/poly_bin/poly24 +0 -0
  1105. gecatsim/phantom/poly_bin/poly25 +0 -0
  1106. gecatsim/phantom/poly_bin/poly26 +0 -0
  1107. gecatsim/phantom/poly_bin/poly28 +0 -0
  1108. gecatsim/phantom/poly_bin/poly32 +0 -0
  1109. gecatsim/phantom/poly_bin/poly33 +0 -0
  1110. gecatsim/phantom/poly_bin/poly34 +0 -0
  1111. gecatsim/phantom/poly_bin/poly36 +0 -0
  1112. gecatsim/phantom/poly_bin/poly38 +0 -0
  1113. gecatsim/phantom/poly_bin/poly4 +0 -0
  1114. gecatsim/phantom/poly_bin/poly40 +0 -0
  1115. gecatsim/phantom/poly_bin/poly41 +0 -0
  1116. gecatsim/phantom/poly_bin/poly44 +0 -0
  1117. gecatsim/phantom/poly_bin/poly49 +0 -0
  1118. gecatsim/phantom/poly_bin/poly5 +0 -0
  1119. gecatsim/phantom/poly_bin/poly50 +0 -0
  1120. gecatsim/phantom/poly_bin/poly52 +0 -0
  1121. gecatsim/phantom/poly_bin/poly55 +0 -0
  1122. gecatsim/phantom/poly_bin/poly58 +0 -0
  1123. gecatsim/phantom/poly_bin/poly6 +0 -0
  1124. gecatsim/phantom/poly_bin/poly60 +0 -0
  1125. gecatsim/phantom/poly_bin/poly62 +0 -0
  1126. gecatsim/phantom/poly_bin/poly66 +0 -0
  1127. gecatsim/phantom/poly_bin/poly68 +0 -0
  1128. gecatsim/phantom/poly_bin/poly7 +0 -0
  1129. gecatsim/phantom/poly_bin/poly71 +0 -0
  1130. gecatsim/phantom/poly_bin/poly75 +0 -0
  1131. gecatsim/phantom/poly_bin/poly77 +0 -0
  1132. gecatsim/phantom/poly_bin/poly79 +0 -0
  1133. gecatsim/phantom/poly_bin/poly86 +0 -0
  1134. gecatsim/phantom/poly_bin/poly9 +0 -0
  1135. gecatsim/phantom/poly_bin/poly92 +0 -0
  1136. gecatsim/phantom/poly_bin/poly96 +0 -0
  1137. gecatsim/phantom/tungsten_wire.ppm +12 -0
  1138. gecatsim/phantom/vmale50_chest_less_surfaces.nrb +41545 -0
  1139. gecatsim/pyfiles/C_DD3Proj.py +57 -0
  1140. gecatsim/pyfiles/C_DD3Proj_mm.py +64 -0
  1141. gecatsim/pyfiles/C_Materials_CrossSectionDB_Initialize.py +18 -0
  1142. gecatsim/pyfiles/C_Materials_CrossSectionMAC_ByProc_Get.py +25 -0
  1143. gecatsim/pyfiles/C_Phantom_Analytic_FORBILD_to_tmp.py +13 -0
  1144. gecatsim/pyfiles/C_Projector_Analytic.py +62 -0
  1145. gecatsim/pyfiles/C_Projector_NCAT.py +66 -0
  1146. gecatsim/pyfiles/C_Projector_Polygon.py +60 -0
  1147. gecatsim/pyfiles/C_Projector_SetData.py +166 -0
  1148. gecatsim/pyfiles/C_Projector_Voxelized.py +75 -0
  1149. gecatsim/pyfiles/C_Source_Analytic_Set.py +17 -0
  1150. gecatsim/pyfiles/C_Source_NCAT_Set.py +17 -0
  1151. gecatsim/pyfiles/C_Source_Voxelized_Set.py +17 -0
  1152. gecatsim/pyfiles/C_Volume_Get.py +24 -0
  1153. gecatsim/pyfiles/C_Volume_NCAT_Get.py +24 -0
  1154. gecatsim/pyfiles/C_Volume_Poly_Get.py +24 -0
  1155. gecatsim/pyfiles/CalcCrossTalk.py +42 -0
  1156. gecatsim/pyfiles/CalcOptCrossTalk.py +39 -0
  1157. gecatsim/pyfiles/CatSim.py +88 -0
  1158. gecatsim/pyfiles/CheckModules.py +59 -0
  1159. gecatsim/pyfiles/Check_Replace_Old_Names.py +85 -0
  1160. gecatsim/pyfiles/CommonTools.py +445 -0
  1161. gecatsim/pyfiles/Detection_DAS.py +25 -0
  1162. gecatsim/pyfiles/Detection_EI.py +84 -0
  1163. gecatsim/pyfiles/Detection_Flux.py +47 -0
  1164. gecatsim/pyfiles/Detection_Lag.py +28 -0
  1165. gecatsim/pyfiles/Detection_PC.py +120 -0
  1166. gecatsim/pyfiles/Detection_prefilter.py +35 -0
  1167. gecatsim/pyfiles/Detector_RayAngles_2D.py +86 -0
  1168. gecatsim/pyfiles/Detector_ThirdgenCurved.py +119 -0
  1169. gecatsim/pyfiles/FlatPanel/Detection_DAS_FlatPanel.py +101 -0
  1170. gecatsim/pyfiles/FlatPanel/Detection_OpticalCrosstalk_FlatPanel.py +39 -0
  1171. gecatsim/pyfiles/FlatPanel/Detector_FlatPanel.py +120 -0
  1172. gecatsim/pyfiles/Gantry_Helical.py +56 -0
  1173. gecatsim/pyfiles/GetMu.py +68 -0
  1174. gecatsim/pyfiles/LowSignalCorr.py +32 -0
  1175. gecatsim/pyfiles/OneScan.py +144 -0
  1176. gecatsim/pyfiles/PhantomProjectorWrapper.py +65 -0
  1177. gecatsim/pyfiles/Phantom_Analytic.py +936 -0
  1178. gecatsim/pyfiles/Phantom_CAD_to_Polygonal.py +82 -0
  1179. gecatsim/pyfiles/Phantom_NCAT.py +96 -0
  1180. gecatsim/pyfiles/Phantom_Polygonal.py +122 -0
  1181. gecatsim/pyfiles/Phantom_Polygonal_ReadPolygon.py +58 -0
  1182. gecatsim/pyfiles/Phantom_Voxelized.py +120 -0
  1183. gecatsim/pyfiles/PrepView.py +56 -0
  1184. gecatsim/pyfiles/Prep_BHC_Accurate.py +69 -0
  1185. gecatsim/pyfiles/ReadMaterialFile.py +29 -0
  1186. gecatsim/pyfiles/Scatter_ConvolutionModel.py +44 -0
  1187. gecatsim/pyfiles/Scatter_Correction.py +52 -0
  1188. gecatsim/pyfiles/SetFocalspot.py +239 -0
  1189. gecatsim/pyfiles/Spectrum.py +130 -0
  1190. gecatsim/pyfiles/Spectrum_heel.py +146 -0
  1191. gecatsim/pyfiles/WriteRawView.py +32 -0
  1192. gecatsim/pyfiles/WriteRawViewChunk.py +40 -0
  1193. gecatsim/pyfiles/Xray_Filter.py +93 -0
  1194. gecatsim/pyfiles/__init__.py +0 -0
  1195. gecatsim/pyfiles/catvoxel.py +161 -0
  1196. gecatsim/pyfiles/randpf.py +27 -0
  1197. gecatsim/reconstruction/lib/fdk_equiAngle.dll +0 -0
  1198. gecatsim/reconstruction/lib/fdk_equiAngle.so +0 -0
  1199. gecatsim/reconstruction/lib/fdk_equiAngle_macos.so +0 -0
  1200. gecatsim/reconstruction/lib/helicalrecon.dll +0 -0
  1201. gecatsim/reconstruction/lib/helicalrecon.so +0 -0
  1202. gecatsim/reconstruction/lib/readme.md +20 -0
  1203. gecatsim/reconstruction/pyfiles/createHSP.py +81 -0
  1204. gecatsim/reconstruction/pyfiles/fdk_equiAngle.py +245 -0
  1205. gecatsim/reconstruction/pyfiles/helical_equiAngle.py +284 -0
  1206. gecatsim/reconstruction/pyfiles/mapConfigVariablesToFDK.py +38 -0
  1207. gecatsim/reconstruction/pyfiles/mapConfigVariablesToHelical.py +50 -0
  1208. gecatsim/reconstruction/pyfiles/recon.py +172 -0
  1209. gecatsim/reconstruction/src/Parallel_FDK_Helical_3DWeighting.c +211 -0
  1210. gecatsim/reconstruction/src/interface_fdk_angle.c +162 -0
  1211. gecatsim/response_matrix/PC_spectral_response_CZT0.25x0.25x1.6.mat +0 -0
  1212. gecatsim/scatter/scatter_kernel.dat +0 -0
  1213. gecatsim/spectrum/XCISTspectrum.m +262 -0
  1214. gecatsim/spectrum/convert.py +21 -0
  1215. gecatsim/spectrum/readme.md +17 -0
  1216. gecatsim/spectrum/tungsten_tar10.0_100_filt.dat +201 -0
  1217. gecatsim/spectrum/tungsten_tar10.0_110_filt.dat +221 -0
  1218. gecatsim/spectrum/tungsten_tar10.0_120_filt.dat +241 -0
  1219. gecatsim/spectrum/tungsten_tar10.0_130_filt.dat +261 -0
  1220. gecatsim/spectrum/tungsten_tar10.0_140_filt.dat +281 -0
  1221. gecatsim/spectrum/tungsten_tar10.0_70_filt.dat +141 -0
  1222. gecatsim/spectrum/tungsten_tar10.0_80_filt.dat +161 -0
  1223. gecatsim/spectrum/tungsten_tar10.0_90_filt.dat +181 -0
  1224. gecatsim/spectrum/tungsten_tar7.0_100_filt.dat +201 -0
  1225. gecatsim/spectrum/tungsten_tar7.0_110_filt.dat +221 -0
  1226. gecatsim/spectrum/tungsten_tar7.0_120_filt.dat +241 -0
  1227. gecatsim/spectrum/tungsten_tar7.0_130_filt.dat +261 -0
  1228. gecatsim/spectrum/tungsten_tar7.0_140_filt.dat +281 -0
  1229. gecatsim/spectrum/tungsten_tar7.0_70_filt.dat +141 -0
  1230. gecatsim/spectrum/tungsten_tar7.0_80_filt.dat +161 -0
  1231. gecatsim/spectrum/tungsten_tar7.0_90_filt.dat +181 -0
  1232. gecatsim/spectrum/xcist_kVp100_tar7_bin1.dat +103 -0
  1233. gecatsim/spectrum/xcist_kVp120_tar7_bin1.dat +123 -0
  1234. gecatsim/spectrum/xcist_kVp140_tar7_bin1.dat +143 -0
  1235. gecatsim/spectrum/xcist_kVp80_tar7_bin1.dat +83 -0
@@ -0,0 +1,1464 @@
1
+ // GE Proprietary
2
+ // last revision: Bruno De Man, Jun 21, 2004
3
+
4
+ #include <math.h> // fabs(), sqrt(), sin(), cos()
5
+ #include <stdlib.h> // malloc(), free()
6
+ #include <iostream.h>
7
+
8
+ extern "C"{
9
+ #include "PBDE.hpp"
10
+ }
11
+
12
+ #ifdef WIN32
13
+ #define EXPORT __declspec(dllexport)
14
+ #else
15
+ #define EXPORT
16
+ #endif
17
+
18
+ #define DETECTOR 0
19
+ #define VOLUME 1
20
+
21
+ //**********************************************************************************************************************
22
+ //Selectively comment these out to disable debug output ****************************************************************
23
+
24
+ // #define DEBUG
25
+
26
+ #if defined(DEBUG)
27
+
28
+ char OutputString[10000];
29
+ int PrintDebug = 1;
30
+
31
+
32
+ #define Report(x) if (PrintDebug) {cout << x; cout.flush();}
33
+
34
+ #endif
35
+
36
+ //**********************************************************************************************************************
37
+ //**********************************************************************************************************************
38
+ //**********************************************************************************************************************
39
+
40
+ // NOTES:
41
+ // 1. All components in the CT system are located by a 3D coordinate system, with the Z-axis at the center of rotation,
42
+ // and the X- and Y-axes in the plane perpendicular to the Z-axis and intersecting the X-ray source
43
+ // when the X-ray source's position is at Z=0.
44
+
45
+ // 2. All coordinates and distances are in units of mm.
46
+
47
+ // 3. Parameters related to the X-ray source are named beginning with "Source".
48
+
49
+ // 4. "Source" parameter names are modified with "X", "Y", and "Z", referring to the above coordinate system.
50
+
51
+ // 5. Parameters related to the projection domain (projection images are a 2D matrix) are named beginning with
52
+ // "Detector". Some of these parameters relate to system effects which are calculated for each detector pixel,
53
+ // and are named beginning with Detector ase a reminder of the array size and orientation.
54
+
55
+ // 6. Some "Detector" parameter names are modified with
56
+ // "Col" to refer to columns of detector pixels across the width of the detector (i.e. in the XY plane),
57
+ // or "Row" to refer to rows of detector pixels along the depth of the detector (i.e. in the Z direction).
58
+
59
+ // 7. Other "Detector" parameters refer to the absolute position of the detector pixels, within the system.
60
+ // Names of these parameters are modified with "X", "Y", and "Z", referring to the above coordinate system.
61
+
62
+ // 8. All other parameters relate to the image domain (a 3D volume). These are named beginning with "Volume".
63
+
64
+ // 9. "Volume" parameter names are modified with "X", "Y", and "Z", referring to the above coordinate system.
65
+
66
+ // 10. All detector pixels and image volume voxels get projected to the "XZ-plane", i.e. the plane in the image volume
67
+ // where Y = 0.
68
+
69
+ // 11. Parameters related to the projection (of pixels and voxels) onto the XZ-plane have "Projected" in their names.
70
+
71
+ // 12. Parameters related to the projection (of pixels and voxels) onto the XZ-plane which pertain to the overlap
72
+ // between detector pixels and image volume voxels are named beginning with "Combined".
73
+
74
+ //**********************************************************************************************************************
75
+ //**********************************************************************************************************************
76
+ //**********************************************************************************************************************
77
+
78
+ #if defined(DEBUG)
79
+
80
+ void PrintArray(char *TitleString,
81
+ float *ArrayData_ptr,
82
+ float DataThreshold,
83
+ int RowMajor_flag, // If true, the X dimension of Array is changing fastest
84
+ int ArraySize_X,
85
+ int ArraySize_Y,
86
+ int IncrementDirection)
87
+ {
88
+ char PixelCharacter;
89
+ int Counter_X;
90
+ int Counter_Y;
91
+ int Counter_X_Last;
92
+ int Counter_Y_Last;
93
+ float *Datum_Current_ptr;
94
+
95
+ Report(TitleString);
96
+ sprintf(OutputString, "DataThreshold = % 8.3e, RowMajor_flag = % 3i, ArraySize_X = % 3i, ArraySize_Y = % 3i, IncrementDirection = % 3i\n",
97
+ DataThreshold, RowMajor_flag, ArraySize_X, ArraySize_Y, IncrementDirection);
98
+ Report(OutputString);
99
+
100
+ Counter_X_Last = ArraySize_X - 1;
101
+ Counter_Y_Last = ArraySize_Y - 1;
102
+ OutputString[Counter_X_Last + 1] = 0x0A;
103
+ OutputString[Counter_X_Last + 2] = 0x00;
104
+
105
+ if (RowMajor_flag)
106
+ {
107
+ Datum_Current_ptr = ArrayData_ptr;
108
+ for (Counter_Y = 0; Counter_Y <= Counter_Y_Last; Counter_Y++)
109
+ {
110
+ for (Counter_X = 0; Counter_X <= Counter_X_Last; Counter_X++)
111
+ {
112
+ if (*Datum_Current_ptr <= DataThreshold)
113
+ PixelCharacter = '.';
114
+ else
115
+ PixelCharacter = '*';
116
+ OutputString[Counter_X] = PixelCharacter;
117
+ Datum_Current_ptr += IncrementDirection;
118
+ }
119
+ Report(OutputString);
120
+ }
121
+ Report("\n");
122
+ }
123
+ else
124
+ {
125
+ for (Counter_Y = 0; Counter_Y <= Counter_Y_Last; Counter_Y++)
126
+ {
127
+ Datum_Current_ptr = ArrayData_ptr + Counter_Y * IncrementDirection;
128
+ for (Counter_X = 0; Counter_X <= Counter_X_Last; Counter_X++)
129
+ {
130
+ if (*Datum_Current_ptr <= DataThreshold)
131
+ PixelCharacter = '.';
132
+ else
133
+ PixelCharacter = '*';
134
+ OutputString[Counter_X] = PixelCharacter;
135
+ Datum_Current_ptr += ArraySize_Y * IncrementDirection;
136
+ }
137
+ Report(OutputString);
138
+ }
139
+ Report("\n");
140
+ }
141
+ }
142
+
143
+ #endif
144
+
145
+ //**********************************************************************************************************************
146
+ //**********************************************************************************************************************
147
+ //**********************************************************************************************************************
148
+
149
+ // This function populates a vector of pixel boundary coordinates based on a vector of pixel center coordinates.
150
+
151
+ void DD3Boundaries(int NumBoundaries, // Input: Scalar
152
+ float *CenterCoords_ptr, // Input: [NumBoundaries - 1]
153
+ float *BoundaryCoords_ptr) // Output: [NumBoundaries]
154
+ {
155
+ int BoundaryCounter;
156
+
157
+ if (NumBoundaries >= 3)
158
+ {
159
+ // The first edge of the first pixel
160
+ *BoundaryCoords_ptr++ = 1.5 * *CenterCoords_ptr - 0.5 * *(CenterCoords_ptr+1);
161
+ for (BoundaryCounter=1 ; BoundaryCounter<=(NumBoundaries-2) ; BoundaryCounter++)
162
+ {
163
+ // Intermediate edges
164
+ *BoundaryCoords_ptr++ = 0.5 * *CenterCoords_ptr + 0.5 * *(CenterCoords_ptr+1);
165
+ CenterCoords_ptr++;
166
+ }
167
+ // The second edge of the last pixel
168
+ *BoundaryCoords_ptr = 1.5 * *CenterCoords_ptr - 0.5 * *(CenterCoords_ptr-1);
169
+ }
170
+ else
171
+ {
172
+ *(BoundaryCoords_ptr ) = *CenterCoords_ptr-0.5;
173
+ *(BoundaryCoords_ptr+1) = *CenterCoords_ptr+0.5;
174
+ }
175
+ }
176
+
177
+ //**********************************************************************************************************************
178
+ //**********************************************************************************************************************
179
+ //**********************************************************************************************************************
180
+
181
+ // This function transposes the first volume, and adds it to the second (untransposed) volume, which is then returned.
182
+
183
+ void DD3AddTranspose(int Volume_NumX, // Input: Scalar
184
+ int Volume_NumY, // Input: Scalar
185
+ int Volume_NumZ, // Input: Scalar
186
+ float *VolumeToBeTransposed_ptr, // Input: [Volume_NumZ * Volume_NumX * Volume_NumY]
187
+ float *Volume_NotTransposed_ptr) // Input & Output: [Volume_NumZ * Volume_NumX * Volume_NumY]
188
+ {
189
+ int Counter_X, Counter_Y, Counter_Z;
190
+
191
+ for (Counter_Y=0 ; Counter_Y<=(Volume_NumY-1) ; Counter_Y++)
192
+ {
193
+ for (Counter_X=0 ; Counter_X<=(Volume_NumX-1) ; Counter_X++)
194
+ {
195
+ for (Counter_Z=0 ; Counter_Z<=(Volume_NumZ-1) ; Counter_Z++)
196
+ {
197
+ *Volume_NotTransposed_ptr++ += *VolumeToBeTransposed_ptr++;
198
+ }
199
+ Volume_NotTransposed_ptr += Volume_NumZ * (Volume_NumY-1);
200
+ }
201
+ Volume_NotTransposed_ptr += Volume_NumZ * (1 - Volume_NumX*Volume_NumY);
202
+ }
203
+ }
204
+
205
+ //**********************************************************************************************************************
206
+ //**********************************************************************************************************************
207
+ //**********************************************************************************************************************
208
+
209
+ // Distribute one view of the detector data (as projected to the XZ plane at Y = 0)
210
+ // into one row of the image volume (a aingle XZ slab of the volume, projected onto the XZ plane at Y = 0).
211
+
212
+ void DD3EnergyRow(float VolumeVoxelBoundaryCoordProjected_X_Initial, // Input: Scalar
213
+ float VolumeVoxelBoundaryCoordProjected_X_Step, // Input: Scalar
214
+ int Volume_NumX, // Input: Scalar
215
+ float VolumeVoxelBoundaryCoordProjected_Z_Initial, // Input: Scalar
216
+ float VolumeVoxelBoundaryCoordProjected_Z_Step, // Input: Scalar
217
+ int Volume_NumZ, // Input: Scalar
218
+ float *Volume_Mu_XZSlab_ptr, // Input: [Volume_NumX][Volume_NumZ]
219
+ float *Volume_Energy_XZSlab_ptr, // Output: [Volume_NumX][Volume_NumZ]
220
+ float *DetectorPixelBoundaryCoordsProjected_X_ptr, // Input: [Detector_NumCols + 3] 1 sentinal each end
221
+ int Detector_IncrementDirection, // Input: Scalar (+1 or -1)
222
+ float *DetectorPixelBoundaryCoordsShifted_Z_ptr, // Input: [Detector_NumRows + 3] 2 sentinals back end
223
+ float *DetectorMagnificationFactors_ptr, // Input: [Detector_NumCols + 2] 1 sentinal each end
224
+ float SourceCoord_Z, // Input: Scalar
225
+ float *Detector_IncidentEnergyViewData_ptr, // In&Output: [Detector_NumCols ][Detector_NumRows ]
226
+ float *Detector_AbsorbedEnergyViewData_ptr, // In&Output: [Detector_NumCols ][Detector_NumRows ]
227
+ float *Detector_PathLengths_ptr, // Input: [Detector_NumCols ][Detector_NumRows ]
228
+ int Detector_NumCols, // Input: Scalar
229
+ int Detector_NumRows) // Input: Scalar
230
+ {
231
+ int FirstActiveBoundary;
232
+ int JumpCount;
233
+ int Volume_StayInThisZStack_flag;
234
+ int DetectorPixelCounter_Col;
235
+ int DetectorPixelCounter_Col_First;
236
+ int DetectorPixelCounter_Col_Last;
237
+ int DetectorPixelCounter_Row;
238
+ int DetectorPixelCounter_Row_First;
239
+ int DetectorPixelCounter_Row_Last;
240
+ int Detector_RowsToMove;
241
+ float Voxel_XZ_Projected_Area;
242
+ float Voxel_XZ_Projected_OverlapArea;
243
+ float Voxel_XZ_Projected_OverlapFraction;
244
+ float Detector_AbsorbedEnergy_FullVoxel;
245
+ float Detector_AbsorbedEnergy_OverlapVoxel;
246
+ float ActiveBoundaryCoordProjected_X;
247
+ float ActiveBoundaryCoordProjected_Z;
248
+ float BoundaryCoordProjected_X_Overlap;
249
+ float BoundaryCoordProjected_Z_Overlap;
250
+ float *DetectorMagnificationFactor_Current_ptr;
251
+ float *DetectorPixelBoundaryCoordProjected_X_Next_ptr;
252
+ float *DetectorPixelBoundaryCoordShifted_Z_Next_ptr;
253
+ float DetectorPixelBoundaryCoordProjected_Z_Next;
254
+ float *Detector_PathLength_Current_ptr;
255
+ float *Detector_IncidentEnergyViewDatum_Current_ptr;
256
+ float *Detector_AbsorbedEnergyViewDatum_Current_ptr;
257
+ int VolumeVoxelCounter_X;
258
+ int VolumeVoxelCounter_X_First;
259
+ int VolumeVoxelCounter_X_Last;
260
+ int VolumeVoxelCounter_Z;
261
+ int VolumeVoxelCounter_Z_First;
262
+ int VolumeVoxelCounter_Z_Last;
263
+ int Volume_ZVoxelsToMove;
264
+ float VolumeVoxelBoundaryCoordProjected_X_Next;
265
+ float VolumeVoxelBoundaryCoordProjected_Z_Next;
266
+ float *Volume_Mu_CurrentVoxel_ptr;
267
+ float *Volume_Energy_CurrentVoxel_ptr;
268
+
269
+
270
+ Voxel_XZ_Projected_Area = VolumeVoxelBoundaryCoordProjected_X_Step
271
+ * VolumeVoxelBoundaryCoordProjected_Z_Step;
272
+
273
+ // Point to the data associated with the first detector pixel and first voxel in the XZ slab.
274
+ DetectorMagnificationFactor_Current_ptr = DetectorMagnificationFactors_ptr;
275
+ Detector_IncidentEnergyViewDatum_Current_ptr = Detector_IncidentEnergyViewData_ptr;
276
+ Detector_AbsorbedEnergyViewDatum_Current_ptr = Detector_AbsorbedEnergyViewData_ptr;
277
+ Detector_PathLength_Current_ptr = Detector_PathLengths_ptr;
278
+ Volume_Mu_CurrentVoxel_ptr = Volume_Mu_XZSlab_ptr;
279
+ Volume_Energy_CurrentVoxel_ptr = Volume_Energy_XZSlab_ptr;
280
+
281
+ //********************************************************************************************************************
282
+ // Note that Y is constant; we're dealing with one XZ slab.
283
+ //********************************************************************************************************************
284
+ // Initialize in the X direction:
285
+
286
+ if (VolumeVoxelBoundaryCoordProjected_X_Initial > *DetectorPixelBoundaryCoordsProjected_X_ptr)
287
+ {
288
+ FirstActiveBoundary = VOLUME;
289
+ VolumeVoxelCounter_X_First = 0;
290
+ ActiveBoundaryCoordProjected_X = VolumeVoxelBoundaryCoordProjected_X_Initial;
291
+ DetectorPixelBoundaryCoordProjected_X_Next_ptr = DetectorPixelBoundaryCoordsProjected_X_ptr;
292
+ VolumeVoxelBoundaryCoordProjected_X_Next = VolumeVoxelBoundaryCoordProjected_X_Initial
293
+ + VolumeVoxelBoundaryCoordProjected_X_Step;
294
+ }
295
+ else
296
+ {
297
+ FirstActiveBoundary = DETECTOR;
298
+ DetectorPixelCounter_Col_First = 0;
299
+ ActiveBoundaryCoordProjected_X = *DetectorPixelBoundaryCoordsProjected_X_ptr;
300
+ DetectorPixelBoundaryCoordProjected_X_Next_ptr = ++DetectorPixelBoundaryCoordsProjected_X_ptr;
301
+ VolumeVoxelBoundaryCoordProjected_X_Next = VolumeVoxelBoundaryCoordProjected_X_Initial;
302
+
303
+ }
304
+
305
+
306
+ JumpCount = -1; // We are guaranteed at least one jump. If only one, we don't want to advance any of the pointers.
307
+ // Looking along the X direction (parallel to the detector rows),
308
+ if (FirstActiveBoundary == VOLUME)
309
+ {
310
+ // find the first place where a projected detector pixel boundary coordinate
311
+ // exceeds the first projected volume voxel boundary coordinate.
312
+ // It might be that it takes a number of detector boundaries before that happens
313
+ // (if the edge of the detector is outside the reconstructed FOV,
314
+ // or if detector pixels are small and the volume voxels are large).
315
+
316
+ while (*DetectorPixelBoundaryCoordProjected_X_Next_ptr <= ActiveBoundaryCoordProjected_X)
317
+ {
318
+ DetectorPixelBoundaryCoordProjected_X_Next_ptr += Detector_IncrementDirection;
319
+ JumpCount++;
320
+ }
321
+
322
+ // Synchronize other pointers associated with the detector.
323
+ DetectorPixelCounter_Col_First = JumpCount;
324
+ JumpCount *= Detector_IncrementDirection;
325
+ DetectorMagnificationFactor_Current_ptr += JumpCount;
326
+ JumpCount *= Detector_NumRows;
327
+ Detector_IncidentEnergyViewDatum_Current_ptr += JumpCount;
328
+ Detector_AbsorbedEnergyViewDatum_Current_ptr += JumpCount;
329
+ Detector_PathLength_Current_ptr += JumpCount;
330
+ }
331
+ else
332
+ {
333
+ // find the first place where a projected volume voxel boundary coordinate
334
+ // exceeds the first projected detector pixel boundary coordinate.
335
+ // It might be that it takes a number of volume boundaries before that happens
336
+ // (if the edge of the volume is outside the fan beam,
337
+ // or if voxels are small and the detector pixels are large).
338
+
339
+ while (VolumeVoxelBoundaryCoordProjected_X_Next <= ActiveBoundaryCoordProjected_X)
340
+ {
341
+ VolumeVoxelBoundaryCoordProjected_X_Next += VolumeVoxelBoundaryCoordProjected_X_Step;
342
+ JumpCount++;
343
+ }
344
+
345
+ // Synchronize other pointers associated with the volume.
346
+ VolumeVoxelCounter_X_First = JumpCount;
347
+ Volume_Energy_CurrentVoxel_ptr += JumpCount * Volume_NumZ;
348
+ Volume_Mu_CurrentVoxel_ptr += JumpCount * Volume_NumZ;
349
+ }
350
+
351
+ // X direction initialized.
352
+ //********************************************************************************************************************
353
+
354
+ //********************************************************************************************************************
355
+ // Loop in the X directon over each stack of voxels (stacked in the Z direction).
356
+
357
+
358
+ DetectorPixelCounter_Col = DetectorPixelCounter_Col_First;
359
+ VolumeVoxelCounter_X = VolumeVoxelCounter_X_First;
360
+ while ((DetectorPixelCounter_Col <= DetectorPixelCounter_Col_Last)
361
+ && ( VolumeVoxelCounter_X <= VolumeVoxelCounter_X_Last))
362
+ {
363
+ // The volume voxel counter in the X direction is only conditionally incremented...
364
+ // sometimes this loop is repeated when the detector pixel counter in the X direction is incremented
365
+ // but the volume voxel counter in the X direction is not.
366
+
367
+
368
+ //******************************************************************************************************************
369
+ // Initialize the Z direction:
370
+
371
+ DetectorPixelBoundaryCoordShifted_Z_Next_ptr = DetectorPixelBoundaryCoordsShifted_Z_ptr;
372
+ DetectorPixelBoundaryCoordProjected_Z_Next = SourceCoord_Z
373
+ + *DetectorPixelBoundaryCoordShifted_Z_Next_ptr++
374
+ * *DetectorMagnificationFactor_Current_ptr;
375
+
376
+ if (VolumeVoxelBoundaryCoordProjected_Z_Initial > DetectorPixelBoundaryCoordProjected_Z_Next)
377
+ {
378
+ FirstActiveBoundary = VOLUME;
379
+ VolumeVoxelCounter_Z_First = 0;
380
+ ActiveBoundaryCoordProjected_Z = VolumeVoxelBoundaryCoordProjected_Z_Initial;
381
+ VolumeVoxelBoundaryCoordProjected_Z_Next = VolumeVoxelBoundaryCoordProjected_Z_Initial
382
+ + VolumeVoxelBoundaryCoordProjected_Z_Step;
383
+ }
384
+ else
385
+ {
386
+ FirstActiveBoundary = DETECTOR;
387
+ DetectorPixelCounter_Row_First = 0;
388
+ ActiveBoundaryCoordProjected_Z = DetectorPixelBoundaryCoordProjected_Z_Next;
389
+ DetectorPixelBoundaryCoordProjected_Z_Next = SourceCoord_Z
390
+ + *DetectorPixelBoundaryCoordShifted_Z_Next_ptr++
391
+ * *DetectorMagnificationFactor_Current_ptr;
392
+ VolumeVoxelBoundaryCoordProjected_Z_Next = VolumeVoxelBoundaryCoordProjected_Z_Initial;
393
+
394
+ }
395
+
396
+
397
+ JumpCount = -1; // We are guaranteed at least one jump. If only one, we don't want to advance any of the pointers.
398
+ // Looking along the Z direction (parallel to the detector columns),
399
+ if (FirstActiveBoundary == VOLUME)
400
+ {
401
+ // find the first place where a projected detector pixel boundary coordinate
402
+ // exceeds the first projected volume voxel boundary coordinate.
403
+ // It might be that it takes a number of detector boundaries before that happens
404
+ // (if the detector pixels are small and the volume voxels are large).
405
+
406
+ while (DetectorPixelBoundaryCoordProjected_Z_Next <= ActiveBoundaryCoordProjected_Z)
407
+ {
408
+ DetectorPixelBoundaryCoordProjected_Z_Next = SourceCoord_Z
409
+ + *DetectorPixelBoundaryCoordShifted_Z_Next_ptr++
410
+ * *DetectorMagnificationFactor_Current_ptr;
411
+ JumpCount++;
412
+ }
413
+
414
+ // Synchronize other variables associated with the detector.
415
+
416
+ DetectorPixelCounter_Row_First = JumpCount;
417
+ JumpCount *= Detector_IncrementDirection;
418
+ Detector_IncidentEnergyViewDatum_Current_ptr += JumpCount;
419
+ Detector_AbsorbedEnergyViewDatum_Current_ptr += JumpCount;
420
+ Detector_PathLength_Current_ptr += JumpCount;
421
+ }
422
+ else
423
+ {
424
+ // find the first place where a projected volume voxel boundary coordinate
425
+ // exceeds the first projected detector pixel boundary coordinate.
426
+ // It might be that it takes a number of volume boundaries before that happens
427
+ // (if the edge of the volume is outside the cone beam,
428
+ // or if voxels are small and the detector pixels are large).
429
+
430
+ while (VolumeVoxelBoundaryCoordProjected_Z_Next <= ActiveBoundaryCoordProjected_Z)
431
+ {
432
+ VolumeVoxelBoundaryCoordProjected_Z_Next += VolumeVoxelBoundaryCoordProjected_Z_Step;
433
+ JumpCount++;
434
+ }
435
+
436
+ // Synchronize other variables associated with the volume.
437
+ VolumeVoxelCounter_Z_First = JumpCount;
438
+ Volume_Energy_CurrentVoxel_ptr += JumpCount;
439
+ Volume_Mu_CurrentVoxel_ptr += JumpCount;
440
+ }
441
+
442
+ // Z direction initialized.
443
+ //******************************************************************************************************************
444
+
445
+ //******************************************************************************************************************
446
+ // Looking along the X direction (parallel to the detector rows),
447
+ // find the amount of X-overlap between the boundary currently under consideration, and the next boundary.
448
+
449
+ if (VolumeVoxelBoundaryCoordProjected_X_Next <= *DetectorPixelBoundaryCoordProjected_X_Next_ptr)
450
+ {
451
+ // Next X boundary is a volume boundary. Calculate the X overlap.
452
+
453
+ BoundaryCoordProjected_X_Overlap = VolumeVoxelBoundaryCoordProjected_X_Next
454
+ - ActiveBoundaryCoordProjected_X;
455
+
456
+ // Next time through, we'll move to the next Z-stack in the XZ slab.
457
+
458
+ Volume_StayInThisZStack_flag = 0;
459
+
460
+ // Increment to the next volume voxel (in the X direction).
461
+
462
+ VolumeVoxelCounter_X++;
463
+ ActiveBoundaryCoordProjected_X = VolumeVoxelBoundaryCoordProjected_X_Next;
464
+ VolumeVoxelBoundaryCoordProjected_X_Next += VolumeVoxelBoundaryCoordProjected_X_Step;
465
+
466
+ }
467
+ else
468
+ {
469
+ // Next X boundary is a detector boundary. Calculate the X overlap.
470
+
471
+ BoundaryCoordProjected_X_Overlap = *DetectorPixelBoundaryCoordProjected_X_Next_ptr
472
+ - ActiveBoundaryCoordProjected_X;
473
+
474
+ // Next time through, we'll stay in this Z-stack in the XZ slab, to go through it again with the
475
+ // next column of detector pixels, at least part of which overlaps with with this Z-stack in the XZ slab.
476
+
477
+ Volume_StayInThisZStack_flag = 1;
478
+
479
+ // Increment to the next detector pixel (in the X direction).
480
+
481
+ DetectorPixelCounter_Col++;
482
+ ActiveBoundaryCoordProjected_X = *DetectorPixelBoundaryCoordProjected_X_Next_ptr;
483
+ DetectorPixelBoundaryCoordProjected_X_Next_ptr += Detector_IncrementDirection;
484
+ DetectorMagnificationFactor_Current_ptr += Detector_IncrementDirection;
485
+
486
+ }
487
+
488
+ // X-overlap found.
489
+ //******************************************************************************************************************
490
+
491
+ //******************************************************************************************************************
492
+ // Note that both Y and X are now constant; we're dealing with one Z-stack (voxels stacked in the Z direction).
493
+ // Looking along the Z direction (parallel to the detector columns),
494
+ // find the amount of Z-overlap between the boundary currently under consideration, and the next boundary.
495
+
496
+ // Then, based on the Z-overlap and the X-overlap (previously found), project a fraction of the current detector
497
+ // pixel data into the current image volume voxel.
498
+
499
+ VolumeVoxelCounter_Z = VolumeVoxelCounter_Z_First;
500
+ DetectorPixelCounter_Row = DetectorPixelCounter_Row_First;
501
+
502
+
503
+ while (( VolumeVoxelCounter_Z <= VolumeVoxelCounter_Z_Last)
504
+ && (DetectorPixelCounter_Row <= DetectorPixelCounter_Row_Last))
505
+ {
506
+ // The volume voxel counter in the Z direction is only conditionally incremented...
507
+ // sometimes this loop is repeated when the detector pixel counter in the Z direction is incremented
508
+ // but the volume voxel counter in the Z direction is not.
509
+
510
+ if (VolumeVoxelBoundaryCoordProjected_Z_Next <= DetectorPixelBoundaryCoordProjected_Z_Next)
511
+ {
512
+ // Next Z boundary is a volume boundary. Calculate the Z overlap.
513
+
514
+ BoundaryCoordProjected_Z_Overlap = VolumeVoxelBoundaryCoordProjected_Z_Next
515
+ - ActiveBoundaryCoordProjected_Z;
516
+ }
517
+ else
518
+ {
519
+ // Next Z boundary is a detector boundary. Calculate the Z overlap,
520
+
521
+ BoundaryCoordProjected_Z_Overlap = DetectorPixelBoundaryCoordProjected_Z_Next
522
+ - ActiveBoundaryCoordProjected_Z;
523
+ }
524
+
525
+ // Calculate the overlap area,
526
+ Voxel_XZ_Projected_OverlapArea = BoundaryCoordProjected_X_Overlap
527
+ * BoundaryCoordProjected_Z_Overlap;
528
+
529
+ Voxel_XZ_Projected_OverlapFraction = Voxel_XZ_Projected_OverlapArea
530
+ / Voxel_XZ_Projected_Area;
531
+
532
+ // the energy associated with the full voxel area,
533
+ Detector_AbsorbedEnergy_FullVoxel = *Detector_IncidentEnergyViewDatum_Current_ptr * (1 - exp(-*Volume_Mu_CurrentVoxel_ptr * *Detector_PathLength_Current_ptr));
534
+
535
+ // and the energy associated with the overlap area.
536
+ Detector_AbsorbedEnergy_OverlapVoxel = Detector_AbsorbedEnergy_FullVoxel * Voxel_XZ_Projected_OverlapFraction;
537
+
538
+ // Add that energy to the absorbed energy volume, as well as the detector array
539
+ // (to be subtracted from the incident energy detector array later).
540
+ *Volume_Energy_CurrentVoxel_ptr += Detector_AbsorbedEnergy_OverlapVoxel;
541
+ *Detector_AbsorbedEnergyViewDatum_Current_ptr += Detector_AbsorbedEnergy_OverlapVoxel;
542
+
543
+
544
+ if (VolumeVoxelBoundaryCoordProjected_Z_Next <= DetectorPixelBoundaryCoordProjected_Z_Next)
545
+ {
546
+ // Next Z boundary is a volume boundary. Increment to the next volume voxel (in the Z direction).
547
+
548
+ VolumeVoxelCounter_Z++;
549
+ ActiveBoundaryCoordProjected_Z = VolumeVoxelBoundaryCoordProjected_Z_Next;
550
+ VolumeVoxelBoundaryCoordProjected_Z_Next += VolumeVoxelBoundaryCoordProjected_Z_Step;
551
+ Volume_Mu_CurrentVoxel_ptr++;
552
+ Volume_Energy_CurrentVoxel_ptr++;
553
+
554
+ #if defined(DEBUG_29) || defined(DEBUG_39) || defined(DEBUG_40)
555
+ if (PrintZInfo)
556
+ {
557
+ sprintf(OutputString, " Moving to the next Z voxel in the stack: DetectorPixelCounter_Row = %3i, VolumeVoxelCounter_Z = %3i\n", DetectorPixelCounter_Row, VolumeVoxelCounter_Z);
558
+ Report(OutputString);
559
+ }
560
+ #endif
561
+ }
562
+ else
563
+ {
564
+ // Next Z boundary is a detector boundary. Increment to the next detector pixel (in the Z direction).
565
+
566
+ DetectorPixelCounter_Row++;
567
+ ActiveBoundaryCoordProjected_Z = DetectorPixelBoundaryCoordProjected_Z_Next;
568
+ DetectorPixelBoundaryCoordProjected_Z_Next = SourceCoord_Z
569
+ + *(++DetectorPixelBoundaryCoordShifted_Z_Next_ptr)
570
+ * *DetectorMagnificationFactor_Current_ptr;
571
+ Detector_IncidentEnergyViewDatum_Current_ptr += Detector_IncrementDirection;
572
+ Detector_AbsorbedEnergyViewDatum_Current_ptr += Detector_IncrementDirection;
573
+ Detector_PathLength_Current_ptr += Detector_IncrementDirection;
574
+
575
+ #if defined(DEBUG_29) || defined(DEBUG_39) || defined(DEBUG_40)
576
+ if (PrintZInfo)
577
+ {
578
+ sprintf(OutputString, " Moving to the next Z pixel in the detector: DetectorPixelCounter_Row = %3i, VolumeVoxelCounter_Z = %3i\n", DetectorPixelCounter_Row, VolumeVoxelCounter_Z);
579
+ Report(OutputString);
580
+ }
581
+ #endif
582
+ }
583
+ } // End Z-loop.
584
+ //****************************************************************************************************************
585
+
586
+ if (Volume_StayInThisZStack_flag)
587
+ {
588
+ // Continue on to the next detector column
589
+ Detector_RowsToMove = (Detector_NumRows - DetectorPixelCounter_Row) * Detector_IncrementDirection;
590
+ Detector_IncidentEnergyViewDatum_Current_ptr += Detector_RowsToMove;
591
+ Detector_AbsorbedEnergyViewDatum_Current_ptr += Detector_RowsToMove;
592
+ Detector_PathLength_Current_ptr += Detector_RowsToMove;
593
+
594
+ // but go back to the beginning of this Z-stack in the XZ slab.
595
+ Volume_ZVoxelsToMove = VolumeVoxelCounter_Z;
596
+ Volume_Energy_CurrentVoxel_ptr -= Volume_ZVoxelsToMove;
597
+ Volume_Mu_CurrentVoxel_ptr -= Volume_ZVoxelsToMove;
598
+
599
+ #if defined(DEBUG_29) || defined(DEBUG_35) || defined(DEBUG_39) || defined(DEBUG_40)
600
+ sprintf(OutputString, "Moving to the next detector column. Moving forward %3i detector rows.\n", Detector_RowsToMove * Detector_IncrementDirection);
601
+ Report(OutputString);
602
+ sprintf(OutputString, "Staying in the current Z-stack in the XZ slab. Moving backward %3i voxels.\n", Volume_ZVoxelsToMove);
603
+ Report(OutputString);
604
+ #endif
605
+ }
606
+ else
607
+ {
608
+ // Continue on to the next Z-stack in the XZ slab,
609
+ Volume_ZVoxelsToMove = Volume_NumZ - VolumeVoxelCounter_Z;
610
+ Volume_Energy_CurrentVoxel_ptr += Volume_ZVoxelsToMove;
611
+ Volume_Mu_CurrentVoxel_ptr += Volume_ZVoxelsToMove;
612
+
613
+ // but go back to the beginning of this detector column.
614
+ Detector_RowsToMove = DetectorPixelCounter_Row*Detector_IncrementDirection;
615
+ Detector_IncidentEnergyViewDatum_Current_ptr -= Detector_RowsToMove;
616
+ Detector_AbsorbedEnergyViewDatum_Current_ptr -= Detector_RowsToMove;
617
+ Detector_PathLength_Current_ptr -= Detector_RowsToMove;
618
+
619
+ #if defined(DEBUG_29) || defined(DEBUG_35) || defined(DEBUG_39) || defined(DEBUG_40)
620
+ sprintf(OutputString, "Moving to the next Z-stack in the XZ slab. Moving forward %3i voxels.\n", Volume_ZVoxelsToMove);
621
+ Report(OutputString);
622
+ sprintf(OutputString, "Staying in the current detector column. Moving backward %3i detector rows.\n", Detector_RowsToMove * Detector_IncrementDirection);
623
+ Report(OutputString);
624
+ #endif
625
+ }
626
+
627
+ } // End X-loop.
628
+ //******************************************************************************************************************
629
+
630
+ // Subtract the energy absorbed by this XZ slab from the what remains of the incident energy.
631
+
632
+ #if defined(DEBUG_29) || defined(DEBUG_40)
633
+ Report("Subtract the energy absorbed by this XZ slab from the what remains of the incident energy.\n");
634
+ #endif
635
+
636
+ int DetectorPixelCounter;
637
+ int DetectorPixelCounter_Last;
638
+
639
+ DetectorPixelCounter_Last = Detector_NumCols * Detector_NumRows - 1;
640
+
641
+ Detector_IncidentEnergyViewDatum_Current_ptr = Detector_IncidentEnergyViewData_ptr;
642
+ Detector_AbsorbedEnergyViewDatum_Current_ptr = Detector_AbsorbedEnergyViewData_ptr;
643
+
644
+ for (DetectorPixelCounter = 0; DetectorPixelCounter <= DetectorPixelCounter_Last; DetectorPixelCounter++)
645
+ {
646
+ *Detector_IncidentEnergyViewDatum_Current_ptr -= *Detector_AbsorbedEnergyViewDatum_Current_ptr;
647
+ Detector_IncidentEnergyViewDatum_Current_ptr += Detector_IncrementDirection;
648
+ Detector_AbsorbedEnergyViewDatum_Current_ptr += Detector_IncrementDirection;
649
+ }
650
+ }
651
+
652
+ //**********************************************************************************************************************
653
+ //**********************************************************************************************************************
654
+ //**********************************************************************************************************************
655
+
656
+ void DD3EnergyView(float SourceCoord_X, // Input: Scalar
657
+ float SourceCoord_Y, // Input: Scalar
658
+ float SourceCoord_Z, // Input: Scalar
659
+ int Detector_NumCols, // Input: Scalar
660
+ int Detector_NumRows, // Input: Scalar
661
+ int ProjectionVertical_flag, // Input: Scalar
662
+ float *DetectorPixelBoundaryCoordsRotated_X_ptr, // Input: [Detector_NumCols + 1]
663
+ float *DetectorPixelBoundaryCoordsRotated_Y_ptr, // Input: [Detector_NumRows + 1]
664
+ float *DetectorPixelBoundaryCoordsProjected_X_ptr, // Output: [Detector_NumCols + 3] 1 sentinal each end
665
+ float *DetectorPixelBoundaryCoordsShifted_Z_ptr, // Input: [Detector_NumRows + 3] 2 sentinals back end
666
+ float *DetectorMagnificationFactors_ptr, // Output: [Detector_NumCols + 2] 1 sentinal each end
667
+ float DetectorPixelAspectRatio_Z_X, // Input: Scalar
668
+ float *Detector_IncidentEnergyViewData_ptr, // Input: [Detector_NumCols ][Detector_NumRows ]
669
+ float *Detector_AbsorbedEnergyViewData_ptr, // Output: [Detector_NumCols ][Detector_NumRows ]
670
+ float *Detector_PathLengths_ptr, // Output: [Detector_NumCols ][Detector_NumRows ]
671
+ int Volume_NumX, // Input: Scalar
672
+ int Volume_NumY, // Input: Scalar
673
+ int Volume_NumZ, // Input: Scalar
674
+ float Volume_VoxelSize_X, // Input: Scalar
675
+ float Volume_VoxelSize_Y, // Input: Scalar
676
+ float Volume_VoxelSize_Z, // Input: Scalar
677
+ float *Volume_Mu_Untransposed_ptr, // Input: [Volume_NumY][Volume_NumX][Volume_NumZ]
678
+ float *Volume_Mu_Transposed_ptr, // Input: [Volume_NumY][Volume_NumX][Volume_NumZ]
679
+ float *Volume_Energy_Untransposed_ptr, // Output: [Volume_NumY][Volume_NumX][Volume_NumZ]
680
+ float *Volume_Energy_Transposed_ptr) // Output: [Volume_NumY][Volume_NumX][Volume_NumZ]
681
+ {
682
+ int Temp_int;
683
+ int Counter;
684
+ float Temp_float;
685
+ float CosineFactor;
686
+ int Detector_NumPixels;
687
+ int Detector_NumPixelBoundaries_XY;
688
+ int DetectorCounter_Row;
689
+ int DetectorCounter_Row_Last;
690
+ int DetectorCounter_Col;
691
+ int DetectorCounter_Col_Last;
692
+ int DetectorPixelBoundaryCounter_XY_Last;
693
+ int Detector_IncrementDirection;
694
+ float *DetectorMagnificationFactor_Current_ptr;
695
+ float *DetectorPixelBoundaryCoordRotated_X_Current_ptr;
696
+ float *DetectorPixelBoundaryCoordRotated_Y_Current_ptr;
697
+ float *DetectorPixelBoundaryCoordsProjected_X_Initial_ptr;
698
+ float *DetectorPixelBoundaryCoordProjected_X_Current_ptr;
699
+ float *DetectorPixelBoundaryCoordShifted_Z_Current_ptr;
700
+ float DetectorPixelBoundaryCoordsProjected_X_Midpoint;
701
+ float DetectorPixelBoundaryCoordsProjected_X_Step;
702
+ float DetectorPixelBoundaryCoordsShifted_Z_Midpoint;
703
+ float DetectorPixelBoundaryCoordsShifted_Z_Step;
704
+ float *Detector_PathLength_Current_ptr;
705
+ float *Detector_IncidentEnergyViewData_Current_ptr;
706
+ float *Detector_AbsorbedEnergyViewData_Current_ptr;
707
+ int Volume_NumVoxels_XZSlab;
708
+ int VolumeCounter_Y;
709
+ int VolumeCounter_Y_First;
710
+ int VolumeCounter_Y_Last;
711
+ int VolumeCounter_Y_BeyondLast;
712
+ int VolumeCounter_Y_IncrementDirection;
713
+ float VolumeVoxelBoundaryCoordProjected_X_Initial;
714
+ float VolumeVoxelBoundaryCoordProjected_X_Step;
715
+ float VolumeVoxelBoundaryCoordProjected_Z_Initial;
716
+ float VolumeVoxelBoundaryCoordProjected_Z_Step;
717
+ float VolumeXZSlab_Y_Current;
718
+ float VolumeXZSlabMagnificationFactor_Current;
719
+ float *Volume_Mu_Active_ptr;
720
+ float *Volume_Mu_XZSlab_Current_ptr;
721
+ float *Volume_Energy_Active_ptr;
722
+ float *Volume_Energy_XZSlab_Current_ptr;
723
+
724
+ Detector_NumPixels = Detector_NumCols * Detector_NumRows;
725
+ Volume_NumVoxels_XZSlab = Volume_NumX * Volume_NumZ;
726
+
727
+ // C array referencing 0 -> n-1
728
+ DetectorCounter_Col_Last = Detector_NumCols - 1;
729
+ DetectorCounter_Row_Last = Detector_NumRows - 1;
730
+
731
+ // 1 more boundary than pixels
732
+ Detector_NumPixelBoundaries_XY = Detector_NumCols + 1;
733
+ // C array referencing 0 -> n-1
734
+ DetectorPixelBoundaryCounter_XY_Last = Detector_NumPixelBoundaries_XY - 1;
735
+
736
+ #if defined(DEBUG_50)
737
+ PrintArray("\nIncident energy projection:\n", Detector_IncidentEnergyViewData_ptr, 1e-4, 0, Detector_NumCols, Detector_NumRows, 1);
738
+
739
+ PrintArray("\nAbsorbed energy projection:\n", Detector_AbsorbedEnergyViewData_ptr, 0.0, 0, Detector_NumCols, Detector_NumRows, 1);
740
+
741
+ for (VolumeCounter_Y = 0; VolumeCounter_Y < Volume_NumY/2; VolumeCounter_Y++)
742
+ {
743
+ sprintf(OutputString, "\nMu Volume XZ slab %3i:\n", VolumeCounter_Y);
744
+ PrintArray(OutputString, Volume_Mu_Untransposed_ptr + VolumeCounter_Y * Volume_NumVoxels_XZSlab, 0.0, 0, Volume_NumX, Volume_NumZ, 1);
745
+ }
746
+
747
+ for (VolumeCounter_Y = 0; VolumeCounter_Y < Volume_NumY/2; VolumeCounter_Y++)
748
+ {
749
+ sprintf(OutputString, "\nEnergy Volume XZ slab %3i:\n", VolumeCounter_Y);
750
+ PrintArray(OutputString, Volume_Energy_Untransposed_ptr + VolumeCounter_Y * Volume_NumVoxels_XZSlab, 0.0, 0, Volume_NumX, Volume_NumZ, 1);
751
+ }
752
+ #endif
753
+
754
+ // *******************************************************************************************************************
755
+ // Project the X coordinates of the detector pixel boundaries onto the X axis.
756
+
757
+ #if defined(DEBUG_00)
758
+ Report("Project the X coordinates of the detector pixel boundaries onto the X axis.\n");
759
+ #endif
760
+ // Initialize:
761
+ // Pointers to the first X-boundary coordinate,
762
+ DetectorPixelBoundaryCoordRotated_X_Current_ptr = DetectorPixelBoundaryCoordsRotated_X_ptr;
763
+ DetectorPixelBoundaryCoordRotated_Y_Current_ptr = DetectorPixelBoundaryCoordsRotated_Y_ptr;
764
+ // and pointer to the associated magnification factor.
765
+ DetectorMagnificationFactor_Current_ptr = DetectorMagnificationFactors_ptr + 1; // +1 to skip the sentinal.
766
+
767
+ DetectorPixelBoundaryCoordProjected_X_Current_ptr = DetectorPixelBoundaryCoordsProjected_X_ptr + 1; // +1 to skip the sentinal.
768
+ if (ProjectionVertical_flag)
769
+ {
770
+ // We'll be doing a vertical backprojection.
771
+
772
+ for (Counter=0 ; Counter <= DetectorPixelBoundaryCounter_XY_Last; Counter++)
773
+ {
774
+ // Calculate the X coordinate.
775
+
776
+ *DetectorPixelBoundaryCoordProjected_X_Current_ptr++ = (SourceCoord_X * *DetectorPixelBoundaryCoordRotated_Y_Current_ptr
777
+ - SourceCoord_Y * *DetectorPixelBoundaryCoordRotated_X_Current_ptr)
778
+ / (*DetectorPixelBoundaryCoordRotated_Y_Current_ptr - SourceCoord_Y);
779
+ *DetectorMagnificationFactor_Current_ptr++ = SourceCoord_Y
780
+ /(SourceCoord_Y - *DetectorPixelBoundaryCoordRotated_Y_Current_ptr);
781
+ DetectorPixelBoundaryCoordRotated_Y_Current_ptr++;
782
+ DetectorPixelBoundaryCoordRotated_X_Current_ptr++;
783
+ }
784
+
785
+ // We will work with the "untransposed" volume arrays.
786
+
787
+ Volume_Mu_Active_ptr = Volume_Mu_Untransposed_ptr;
788
+ Volume_Energy_Active_ptr = Volume_Energy_Untransposed_ptr;
789
+ }
790
+ else
791
+ {
792
+ // We'll be doing a horizontal backprojection.
793
+
794
+ for (Counter=0 ; Counter <= DetectorPixelBoundaryCounter_XY_Last ; Counter++)
795
+ {
796
+ // Calculate the y-intercept in the row direction: i.e. negative y-axis, so after transpose = positive x-axis.
797
+
798
+ *DetectorPixelBoundaryCoordProjected_X_Current_ptr++ = -(SourceCoord_Y * *DetectorPixelBoundaryCoordRotated_X_Current_ptr
799
+ - SourceCoord_X * *DetectorPixelBoundaryCoordRotated_Y_Current_ptr)
800
+ / (*DetectorPixelBoundaryCoordRotated_X_Current_ptr - SourceCoord_X);
801
+ // Calculate the magnification factor.
802
+
803
+ *DetectorMagnificationFactor_Current_ptr++ = SourceCoord_X
804
+ /(SourceCoord_X - *DetectorPixelBoundaryCoordRotated_X_Current_ptr);
805
+ DetectorPixelBoundaryCoordRotated_X_Current_ptr++;
806
+ DetectorPixelBoundaryCoordRotated_Y_Current_ptr++;
807
+ }
808
+
809
+ // We will work with the "transposed" volume arrays.
810
+
811
+ Volume_Mu_Active_ptr = Volume_Mu_Transposed_ptr;
812
+ Volume_Energy_Active_ptr = Volume_Energy_Transposed_ptr;
813
+
814
+ // We also need to transpose a few related variables.
815
+
816
+ Temp_int = Volume_NumY;
817
+ Volume_NumY = Volume_NumX;
818
+ Volume_NumX = Temp_int;
819
+ Temp_float = SourceCoord_Y;
820
+ SourceCoord_Y = -SourceCoord_X;
821
+ SourceCoord_X = -Temp_float;
822
+ }
823
+
824
+ // Done projecting the X coordinates of the detector pixel boundaries onto the X axis.
825
+ // *******************************************************************************************************************
826
+ // *******************************************************************************************************************
827
+ // Seems like this is adjusting the magnification factors values by averaging each with the next.
828
+ // Not sure why this needs to happen - because the calculation of these factors was based on edges, not centers?
829
+
830
+ // Copy the 2nd element (the 1st "real" value) into the 1st element (the 1st sentinel).
831
+ *DetectorMagnificationFactors_ptr = *(DetectorMagnificationFactors_ptr + 1);
832
+ // Starting with the 2nd element (the 1st "real" value),
833
+ // ending with the 2nd-to-last element (the last "real" value),
834
+ // average each value with the next.
835
+ for (DetectorMagnificationFactor_Current_ptr = DetectorMagnificationFactors_ptr + 1;
836
+ DetectorMagnificationFactor_Current_ptr <= DetectorMagnificationFactors_ptr + Detector_NumCols;
837
+ DetectorMagnificationFactor_Current_ptr++)
838
+ {
839
+ *DetectorMagnificationFactor_Current_ptr = (*(DetectorMagnificationFactor_Current_ptr )
840
+ + *(DetectorMagnificationFactor_Current_ptr + 1))
841
+ /2.;
842
+ }
843
+
844
+ // Done averaging the magnification factors.
845
+ // *******************************************************************************************************************
846
+ // *******************************************************************************************************************
847
+ // Calculate the path length through a voxel slab, on a line from from the source to each detector pixel.
848
+ // These are independent of volume XZ slab.
849
+
850
+ #if defined(DEBUG_00)
851
+ Report("Calculate the path length through a voxel slab, on a line from from the source to each detector pixel.\n");
852
+ Report("These are independent of volume XZ slab.\n");
853
+ #endif
854
+
855
+ // Initialize:
856
+ // Pointer to the first path length,
857
+
858
+ Detector_PathLength_Current_ptr = Detector_PathLengths_ptr;
859
+
860
+ // pointer to the X coordinate of the first boundary of the first "real" pixel in the detector,
861
+
862
+ DetectorPixelBoundaryCoordProjected_X_Current_ptr = DetectorPixelBoundaryCoordsProjected_X_ptr + 1; // +1 for the sentinal.
863
+
864
+ // and pointer to the associated magnification factor.
865
+
866
+ DetectorMagnificationFactor_Current_ptr = DetectorMagnificationFactors_ptr + 1; // +1 for the sentinal.
867
+
868
+ for (DetectorCounter_Col=0 ; DetectorCounter_Col<=DetectorCounter_Col_Last ; DetectorCounter_Col++)
869
+ {
870
+ // Some things are the same for all rows in the column.
871
+
872
+ // Find the X coordinate of the midpoint between the current and the next column.
873
+
874
+ DetectorPixelBoundaryCoordsProjected_X_Midpoint = (*(DetectorPixelBoundaryCoordProjected_X_Current_ptr )
875
+ + *(DetectorPixelBoundaryCoordProjected_X_Current_ptr+1))
876
+ /2.
877
+ - SourceCoord_X;
878
+
879
+ // Find the X distance between the current and the next column.
880
+
881
+ DetectorPixelBoundaryCoordsProjected_X_Step = fabs(*(DetectorPixelBoundaryCoordProjected_X_Current_ptr+1)
882
+ - *(DetectorPixelBoundaryCoordProjected_X_Current_ptr ));
883
+
884
+ // The Z coordinates are the same for all columns but vary by row. Initialize to the first row.
885
+
886
+ DetectorPixelBoundaryCoordShifted_Z_Current_ptr = DetectorPixelBoundaryCoordsShifted_Z_ptr;
887
+
888
+ for (DetectorCounter_Row=0 ; DetectorCounter_Row<=DetectorCounter_Row_Last ; DetectorCounter_Row++)
889
+ {
890
+ // Find the Z coordinate of the midpoint between the current row boundary and the next row boundary.
891
+
892
+ DetectorPixelBoundaryCoordsShifted_Z_Midpoint = *DetectorMagnificationFactor_Current_ptr
893
+ * (*(DetectorPixelBoundaryCoordShifted_Z_Current_ptr )
894
+ + *(DetectorPixelBoundaryCoordShifted_Z_Current_ptr+1))
895
+ /2.;
896
+
897
+ // Find the Z distance between the current row boundary and the next row boundary.
898
+
899
+ DetectorPixelBoundaryCoordsShifted_Z_Step = *DetectorMagnificationFactor_Current_ptr
900
+ * fabs(*(DetectorPixelBoundaryCoordShifted_Z_Current_ptr+1)
901
+ - *(DetectorPixelBoundaryCoordShifted_Z_Current_ptr ));
902
+ // Calculate the path length.
903
+
904
+ CosineFactor = fabs(SourceCoord_Y) // adjacent
905
+ // hypotenuse by 3D pythagoreum:
906
+ / sqrt((SourceCoord_Y // adjacent^2
907
+ * SourceCoord_Y)
908
+ + (DetectorPixelBoundaryCoordsProjected_X_Midpoint // opposite^2
909
+ * DetectorPixelBoundaryCoordsProjected_X_Midpoint)
910
+ // the other opposite^2
911
+ + (DetectorPixelBoundaryCoordsShifted_Z_Midpoint * DetectorPixelAspectRatio_Z_X
912
+ * DetectorPixelBoundaryCoordsShifted_Z_Midpoint * DetectorPixelAspectRatio_Z_X));
913
+
914
+ *Detector_PathLength_Current_ptr++ = Volume_VoxelSize_Y / CosineFactor;
915
+
916
+ DetectorPixelBoundaryCoordShifted_Z_Current_ptr++;
917
+
918
+ #if defined(DEBUG_05)
919
+ if ((DetectorCounter_Col == DetectorCounter_Col_Last/2) && (DetectorCounter_Row == DetectorCounter_Row_Last/2))
920
+ {
921
+ sprintf(OutputString, "DetectorCounter_Col = %3i, DetectorCounter_Row = %3i, Detector_PathLength_Current = % 8.2f\n",
922
+ DetectorCounter_Col, DetectorCounter_Row, *(Detector_PathLength_Current_ptr-1));
923
+ Report(OutputString);
924
+ }
925
+ #endif
926
+ } // end detector row loop
927
+
928
+ DetectorPixelBoundaryCoordProjected_X_Current_ptr++;
929
+ DetectorMagnificationFactor_Current_ptr++;
930
+
931
+ } // end detector column loop
932
+
933
+ // Set the sentinels.
934
+
935
+ *(DetectorPixelBoundaryCoordsProjected_X_ptr ) // First sentinel
936
+ = *(DetectorPixelBoundaryCoordsProjected_X_ptr + 1); // = first "real" value.
937
+
938
+ *(DetectorPixelBoundaryCoordsProjected_X_ptr + Detector_NumCols+1 + 1) // Last sentinel
939
+ = *(DetectorPixelBoundaryCoordsProjected_X_ptr + Detector_NumCols+1 ); // = last "real" value.
940
+
941
+ // Done projecting view onto the XZ plane.
942
+ // *******************************************************************************************************************
943
+ // *******************************************************************************************************************
944
+ // Initialize direction to progress in the X direction.
945
+
946
+ #if defined(DEBUG_00)
947
+ Report("Initialize direction to progress in the X direction.\n");
948
+ #endif
949
+
950
+ if (*(DetectorPixelBoundaryCoordsProjected_X_ptr+2)
951
+ > *(DetectorPixelBoundaryCoordsProjected_X_ptr+1))
952
+ {
953
+ // Go forward.
954
+
955
+ Detector_IncrementDirection = 1;
956
+
957
+ // Point to the first element of the arrays.
958
+
959
+ #if defined(DEBUG_19)
960
+ DetectorPixelBoundaryCoordRotated_X_Current_ptr = DetectorPixelBoundaryCoordsRotated_X_ptr;
961
+ DetectorPixelBoundaryCoordRotated_Y_Current_ptr = DetectorPixelBoundaryCoordsRotated_Y_ptr;
962
+ #endif
963
+ DetectorPixelBoundaryCoordsProjected_X_Initial_ptr = DetectorPixelBoundaryCoordsProjected_X_ptr + 1; // skip the sentinel
964
+ DetectorMagnificationFactor_Current_ptr = DetectorMagnificationFactors_ptr;
965
+ Detector_PathLength_Current_ptr = Detector_PathLengths_ptr;
966
+ Detector_IncidentEnergyViewData_Current_ptr = Detector_IncidentEnergyViewData_ptr;
967
+ Detector_AbsorbedEnergyViewData_Current_ptr = Detector_AbsorbedEnergyViewData_ptr;
968
+ }
969
+ else
970
+ {
971
+ // Go backward.
972
+
973
+ Detector_IncrementDirection = -1;
974
+
975
+ // Point to the last element of the arrays.
976
+ // POINTER ARITHMETIC NOTES: +1 for one more boundary than pixels,
977
+ // +1 or +2 for sentinals,
978
+ // -1 to get back to last element,
979
+ // -2 to skip the last sentinal (get back to last "real" value)
980
+ #if defined(DEBUG_19)
981
+ DetectorPixelBoundaryCoordRotated_X_Current_ptr = DetectorPixelBoundaryCoordsRotated_X_ptr + (Detector_NumCols+1 ) - 1;
982
+ DetectorPixelBoundaryCoordRotated_Y_Current_ptr = DetectorPixelBoundaryCoordsRotated_Y_ptr + (Detector_NumCols+1 ) - 1;
983
+ #endif
984
+ DetectorPixelBoundaryCoordsProjected_X_Initial_ptr = DetectorPixelBoundaryCoordsProjected_X_ptr + (Detector_NumCols+1 + 2) - 2;
985
+ DetectorMagnificationFactor_Current_ptr = DetectorMagnificationFactors_ptr + (Detector_NumCols + 2) - 1;
986
+ Detector_PathLength_Current_ptr = Detector_PathLengths_ptr + (Detector_NumCols )*(Detector_NumRows ) - 1;
987
+ Detector_IncidentEnergyViewData_Current_ptr = Detector_IncidentEnergyViewData_ptr + (Detector_NumCols )*(Detector_NumRows ) - 1;
988
+ Detector_AbsorbedEnergyViewData_Current_ptr = Detector_AbsorbedEnergyViewData_ptr + (Detector_NumCols )*(Detector_NumRows ) - 1;
989
+ }
990
+ // Done initializing direction to progress in the X direction.
991
+ // *******************************************************************************************************************
992
+ // *******************************************************************************************************************
993
+ // Initialize direction to progress in the Y direction.
994
+
995
+ if (SourceCoord_Y > 0)
996
+ {
997
+ VolumeCounter_Y_First = 0;
998
+ #if defined(DEBUG_15)
999
+ VolumeCounter_Y_Last = 0;
1000
+ #else
1001
+ VolumeCounter_Y_Last = Volume_NumY - 1;
1002
+ #endif
1003
+ VolumeCounter_Y_IncrementDirection = 1;
1004
+
1005
+ Volume_Mu_XZSlab_Current_ptr = Volume_Mu_Active_ptr;
1006
+ Volume_Energy_XZSlab_Current_ptr = Volume_Energy_Active_ptr;
1007
+ }
1008
+ else
1009
+ {
1010
+ VolumeCounter_Y_First = Volume_NumY - 1;
1011
+ #if defined(DEBUG_15)
1012
+ VolumeCounter_Y_Last = Volume_NumY - 1;
1013
+ #else
1014
+ VolumeCounter_Y_Last = 0;
1015
+ #endif
1016
+ VolumeCounter_Y_IncrementDirection = -1;
1017
+
1018
+ Volume_Mu_XZSlab_Current_ptr = Volume_Mu_Active_ptr + Volume_NumVoxels_XZSlab*(Volume_NumY - 1);
1019
+ Volume_Energy_XZSlab_Current_ptr = Volume_Energy_Active_ptr + Volume_NumVoxels_XZSlab*(Volume_NumY - 1);
1020
+ }
1021
+
1022
+ // Done initializing direction to progress in the Y direction.
1023
+ // *******************************************************************************************************************
1024
+ // *******************************************************************************************************************
1025
+ // For each row in the image volume (i.e. XZ slab at constant Y), project the X and Z coordinates of the image volume
1026
+ // voxel boundaries onto the XZ plane (at Y = 0), and project the incident energy view into that voxel slab.
1027
+
1028
+ #if defined(DEBUG_00)
1029
+ Report("For each row in the image volume (i.e. XZ slab at constant Y), project the X and Z coordinates of the image volume\n");
1030
+ Report("voxel boundaries onto the XZ plane (at Y = 0), and backproject the current 2D view into that voxel slab.\n");
1031
+ #endif
1032
+
1033
+ VolumeCounter_Y_BeyondLast = VolumeCounter_Y_Last + VolumeCounter_Y_IncrementDirection;
1034
+ for (VolumeCounter_Y = VolumeCounter_Y_First;
1035
+ VolumeCounter_Y != VolumeCounter_Y_BeyondLast;
1036
+ VolumeCounter_Y += VolumeCounter_Y_IncrementDirection)
1037
+ {
1038
+ // The position of the center of the current XZ slab relative to the volume center:
1039
+ VolumeXZSlab_Y_Current = Volume_VoxelSize_Y*(Volume_NumY/2 - VolumeCounter_Y - 1/2.);
1040
+ VolumeXZSlabMagnificationFactor_Current = SourceCoord_Y/(SourceCoord_Y - VolumeXZSlab_Y_Current);
1041
+
1042
+ // Initialize image parameters.
1043
+ VolumeVoxelBoundaryCoordProjected_X_Step = Volume_VoxelSize_X * VolumeXZSlabMagnificationFactor_Current;
1044
+ VolumeVoxelBoundaryCoordProjected_Z_Step = Volume_VoxelSize_Z * VolumeXZSlabMagnificationFactor_Current;
1045
+
1046
+ VolumeVoxelBoundaryCoordProjected_X_Initial = SourceCoord_X - (Volume_NumX/2. + SourceCoord_X)*VolumeVoxelBoundaryCoordProjected_X_Step;
1047
+
1048
+ VolumeVoxelBoundaryCoordProjected_Z_Initial = SourceCoord_Z * (VolumeXZSlabMagnificationFactor_Current - 1)
1049
+ - VolumeVoxelBoundaryCoordProjected_Z_Step * Volume_NumZ/2.;
1050
+
1051
+ // Detector_AbsorbedEnergyViewData needs to be cleared for each slab. Note that the un-reversed (not _Current) pointer is correct.
1052
+ memset(Detector_AbsorbedEnergyViewData_ptr, 0, Detector_NumPixels*sizeof(float));
1053
+
1054
+ #if defined(DEBUG_16)
1055
+ sprintf(OutputString, "Backprojecting a volume XZ slab at VolumeCounter_Y = % 3i, from SourceCoord_X = % 8.2f, SourceCoord_Y = % 8.2f, SourceCoord_Z = % 8.2f\n",
1056
+ VolumeCounter_Y, SourceCoord_X, SourceCoord_Y, SourceCoord_Z);
1057
+ Report(OutputString);
1058
+ #endif
1059
+ #if defined(DEBUG_17)
1060
+ sprintf(OutputString, "Detector_NumCols = %3i, Detector_NumRows = %3i, Detector_IncrementDirection = % 3i\n",
1061
+ Detector_NumCols, Detector_NumRows, Detector_IncrementDirection);
1062
+ Report(OutputString);
1063
+ #endif
1064
+ #if defined(DEBUG_18)
1065
+ sprintf(OutputString, "VolumeCounter_Y_First = %3i, VolumeCounter_Y_Last = %3i, VolumeCounter_Y_IncrementDirection = % 3i\n",
1066
+ VolumeCounter_Y_First, VolumeCounter_Y_Last, VolumeCounter_Y_IncrementDirection);
1067
+ Report(OutputString);
1068
+ sprintf(OutputString, "Volume_VoxelSize_X = % 8.2f, Volume_VoxelSize_Y = % 8.2f, Volume_VoxelSize_Z = % 8.2f\n",
1069
+ Volume_VoxelSize_X, Volume_VoxelSize_Y, Volume_VoxelSize_Z);
1070
+ Report(OutputString);
1071
+ sprintf(OutputString, "VolumeXZSlab_Y_Current = % 8.2f, VolumeXZSlabMagnificationFactor_Current = % 8.2f\n",
1072
+ VolumeXZSlab_Y_Current, VolumeXZSlabMagnificationFactor_Current);
1073
+ Report(OutputString);
1074
+ #endif
1075
+ #if defined(DEBUG_19)
1076
+ sprintf(OutputString, "DetectorPixelBoundaryCoordRotated_X = % 8.2f, DetectorPixelBoundaryCoordRotated_X (center) = % 8.2f, DetectorPixelBoundaryCoordRotated_X (last) = % 8.2f\n",
1077
+ *(DetectorPixelBoundaryCoordRotated_X_Current_ptr ),
1078
+ *(DetectorPixelBoundaryCoordRotated_X_Current_ptr + Detector_IncrementDirection*Detector_NumCols/2 ),
1079
+ *(DetectorPixelBoundaryCoordRotated_X_Current_ptr + Detector_IncrementDirection*Detector_NumCols ));
1080
+ Report(OutputString);
1081
+ sprintf(OutputString, "DetectorPixelBoundaryCoordRotated_Y = % 8.2f, DetectorPixelBoundaryCoordRotated_Y (center) = % 8.2f, DetectorPixelBoundaryCoordRotated_Y (last) = % 8.2f\n",
1082
+ *(DetectorPixelBoundaryCoordRotated_Y_Current_ptr ),
1083
+ *(DetectorPixelBoundaryCoordRotated_Y_Current_ptr + Detector_IncrementDirection*Detector_NumCols/2 ),
1084
+ *(DetectorPixelBoundaryCoordRotated_Y_Current_ptr + Detector_IncrementDirection*Detector_NumCols ));
1085
+ Report(OutputString);
1086
+ sprintf(OutputString, "DetectorPixelBoundaryCoordsShifted_Z = % 8.2f, DetectorPixelBoundaryCoordsShifted_Z (center) = % 8.2f, DetectorPixelBoundaryCoordsShifted_Z (last) = % 8.2f\n",
1087
+ *(DetectorPixelBoundaryCoordsShifted_Z_ptr ),
1088
+ *(DetectorPixelBoundaryCoordsShifted_Z_ptr + Detector_NumRows/2 ),
1089
+ *(DetectorPixelBoundaryCoordsShifted_Z_ptr + Detector_NumRows ));
1090
+ Report(OutputString);
1091
+ sprintf(OutputString, "DetectorMagnificationFactor_Current = % 8.2f, DetectorMagnificationFactor (center-ish) = % 8.2f, DetectorMagnificationFactor (last) = % 8.2f, DetectorMagnificationFactor (sentinal) = % 8.2f\n",
1092
+ *(DetectorMagnificationFactor_Current_ptr ),
1093
+ *(DetectorMagnificationFactor_Current_ptr + Detector_IncrementDirection*Detector_NumCols/2 ),
1094
+ *(DetectorMagnificationFactor_Current_ptr + Detector_IncrementDirection*Detector_NumCols ),
1095
+ *(DetectorMagnificationFactor_Current_ptr + Detector_IncrementDirection*Detector_NumCols + 1));
1096
+ Report(OutputString);
1097
+ sprintf(OutputString, "DetectorPixelBoundaryCoordsProjected_X_Initial = % 8.2f, DetectorPixelBoundaryCoordsProjected_X (center) = % 8.2f, DetectorPixelBoundaryCoordsProjected_X (last) = % 8.2f, DetectorPixelBoundaryCoordsProjected_X (sentinal) = % 8.2f\n",
1098
+ *(DetectorPixelBoundaryCoordsProjected_X_Initial_ptr ),
1099
+ *(DetectorPixelBoundaryCoordsProjected_X_Initial_ptr + Detector_IncrementDirection*Detector_NumCols/2 + 1),
1100
+ *(DetectorPixelBoundaryCoordsProjected_X_Initial_ptr + Detector_IncrementDirection*Detector_NumCols ),
1101
+ *(DetectorPixelBoundaryCoordsProjected_X_Initial_ptr + Detector_IncrementDirection*Detector_NumCols + 1));
1102
+ Report(OutputString);
1103
+ #endif
1104
+ #if defined(DEBUG_20)
1105
+ sprintf(OutputString, "VolumeVoxelBoundaryCoordProjected_X_Step = % 8.2f, Volume_NumX = % 3i\n",
1106
+ VolumeVoxelBoundaryCoordProjected_X_Step, Volume_NumX);
1107
+ Report(OutputString);
1108
+ sprintf(OutputString, "VolumeVoxelBoundaryCoordProjected_Z_Step = % 8.2f, Volume_NumZ = % 3i\n",
1109
+ VolumeVoxelBoundaryCoordProjected_Z_Step, Volume_NumZ);
1110
+ Report(OutputString);
1111
+ sprintf(OutputString, "VolumeVoxelBoundaryCoordProjected_X_Initial = % 8.2f, VolumeVoxelBoundaryCoordProjected_X (center) = % 8.2f, VolumeVoxelBoundaryCoordProjected_X (last) = % 8.2f\n",
1112
+ VolumeVoxelBoundaryCoordProjected_X_Initial,
1113
+ VolumeVoxelBoundaryCoordProjected_X_Initial + VolumeVoxelBoundaryCoordProjected_X_Step*Volume_NumX/2,
1114
+ VolumeVoxelBoundaryCoordProjected_X_Initial + VolumeVoxelBoundaryCoordProjected_X_Step*Volume_NumX );
1115
+ Report(OutputString);
1116
+ sprintf(OutputString, "VolumeVoxelBoundaryCoordProjected_Z_Initial = % 8.2f, VolumeVoxelBoundaryCoordProjected_Z (center) = % 8.2f, VolumeVoxelBoundaryCoordProjected_Z (last) = % 8.2f\n",
1117
+ VolumeVoxelBoundaryCoordProjected_Z_Initial,
1118
+ VolumeVoxelBoundaryCoordProjected_Z_Initial + VolumeVoxelBoundaryCoordProjected_Z_Step*Volume_NumZ/2,
1119
+ VolumeVoxelBoundaryCoordProjected_Z_Initial + VolumeVoxelBoundaryCoordProjected_Z_Step*Volume_NumZ );
1120
+ Report(OutputString);
1121
+ #endif
1122
+ #if defined(DEBUG_21)
1123
+ sprintf(OutputString, "Detector_IncidentEnergyViewData (center-ish) = % 8.3g, Volume_Mu_XZSlab (center-ish) = % 8.3g, Volume_Energy_XZSlab (center-ish) (before projection of this XZ slab) = % 8.3g\n",
1124
+ *(Detector_IncidentEnergyViewData_ptr + Detector_IncrementDirection*Detector_NumPixels/2 + Detector_IncrementDirection*Detector_NumRows/2),
1125
+ // beginning of projection + halfway through the projection (to the beginning of a detector column)
1126
+ // + halfway across along that column
1127
+ *(Volume_Mu_XZSlab_Current_ptr + Volume_NumVoxels_XZSlab/2 + Volume_NumZ/2),
1128
+ // beginning of XZ slab + halfway through the slab (to the beginning of the 1st Z-stack of voxels in the 2nd half of the slab)
1129
+ // + halfway along that Z-stack
1130
+ *(Volume_Energy_XZSlab_Current_ptr + Volume_NumVoxels_XZSlab/2 + Volume_NumZ/2));
1131
+ // same arithmetic as Volume_Mu_XZSlab_Current
1132
+ Report(OutputString);
1133
+ #endif
1134
+
1135
+ #if defined(DEBUG_51)
1136
+ sprintf(OutputString, "\nBefore projecting a volume XZ slab at VolumeCounter_Y = % 3i\n", VolumeCounter_Y);
1137
+ Report(OutputString);
1138
+ PrintArray("\nIncident energy projection:\n", Detector_IncidentEnergyViewData_Current_ptr, 1e-4, 0, Detector_NumCols, Detector_NumRows, Detector_IncrementDirection);
1139
+ PrintArray("\nAbsorbed energy projection:\n", Detector_AbsorbedEnergyViewData_Current_ptr, 0.0, 0, Detector_NumCols, Detector_NumRows, Detector_IncrementDirection);
1140
+ PrintArray("\nMu Volume XZ slab:\n", Volume_Mu_XZSlab_Current_ptr, 0.0, 0, Volume_NumX, Volume_NumZ, 1);
1141
+ PrintArray("\nEnergy Volume XZ slab:\n", Volume_Energy_XZSlab_Current_ptr, 0.0, 0, Volume_NumX, Volume_NumZ, 1);
1142
+ #endif
1143
+
1144
+ DD3EnergyRow(VolumeVoxelBoundaryCoordProjected_X_Initial, VolumeVoxelBoundaryCoordProjected_X_Step, Volume_NumX,
1145
+ VolumeVoxelBoundaryCoordProjected_Z_Initial, VolumeVoxelBoundaryCoordProjected_Z_Step, Volume_NumZ,
1146
+ Volume_Mu_XZSlab_Current_ptr, Volume_Energy_XZSlab_Current_ptr,
1147
+ DetectorPixelBoundaryCoordsProjected_X_Initial_ptr, Detector_IncrementDirection,
1148
+ DetectorPixelBoundaryCoordsShifted_Z_ptr, DetectorMagnificationFactor_Current_ptr, SourceCoord_Z,
1149
+ Detector_IncidentEnergyViewData_Current_ptr, Detector_AbsorbedEnergyViewData_Current_ptr, Detector_PathLength_Current_ptr,
1150
+ Detector_NumCols, Detector_NumRows);
1151
+
1152
+ #if defined(DEBUG_52)
1153
+ sprintf(OutputString, "\n After projecting a volume XZ slab at VolumeCounter_Y = % 3i\n", VolumeCounter_Y);
1154
+ Report(OutputString);
1155
+ PrintArray("\nIncident energy projection:\n", Detector_IncidentEnergyViewData_Current_ptr, 1e-4, 0, Detector_NumCols, Detector_NumRows, Detector_IncrementDirection);
1156
+ PrintArray("\nAbsorbed energy projection:\n", Detector_AbsorbedEnergyViewData_Current_ptr, 0.0, 0, Detector_NumCols, Detector_NumRows, Detector_IncrementDirection);
1157
+ PrintArray("\nMu Volume XZ slab:\n", Volume_Mu_XZSlab_Current_ptr, 0.0, 0, Volume_NumX, Volume_NumZ, 1);
1158
+ PrintArray("\nEnergy Volume XZ slab:\n", Volume_Energy_XZSlab_Current_ptr, 0.0, 0, Volume_NumX, Volume_NumZ, 1);
1159
+ #endif
1160
+
1161
+ #if defined(DEBUG_23)
1162
+ sprintf(OutputString, "Detector_IncidentEnergyViewData (center-ish) = % 8.3g, Volume_Mu_XZSlab (center-ish) = % 8.3g, Volume_Energy_XZSlab (center-ish) (after projection of this XZ slab) = % 8.3g\n",
1163
+ *(Detector_IncidentEnergyViewData_ptr + Detector_IncrementDirection*Detector_NumPixels/2 + Detector_IncrementDirection*Detector_NumRows/2),
1164
+ *(Volume_Mu_XZSlab_Current_ptr + Volume_NumVoxels_XZSlab/2 + Volume_NumZ/2),
1165
+ *(Volume_Energy_XZSlab_Current_ptr + Volume_NumVoxels_XZSlab/2 + Volume_NumZ/2));
1166
+ Report(OutputString);
1167
+ #endif
1168
+
1169
+ #if defined(DEBUG_24)
1170
+ if ((VolumeCounter_Y == 0)
1171
+ || (VolumeCounter_Y == (1*Volume_NumY/10))
1172
+ || (VolumeCounter_Y == (2*Volume_NumY/10))
1173
+ || (VolumeCounter_Y == (3*Volume_NumY/10))
1174
+ || (VolumeCounter_Y == (4*Volume_NumY/10))
1175
+ || (VolumeCounter_Y == (5*Volume_NumY/10))
1176
+ || (VolumeCounter_Y == (6*Volume_NumY/10))
1177
+ || (VolumeCounter_Y == (7*Volume_NumY/10))
1178
+ || (VolumeCounter_Y == (8*Volume_NumY/10))
1179
+ || (VolumeCounter_Y == (9*Volume_NumY/10))
1180
+ || (VolumeCounter_Y == VolumeCounter_Y_Last))
1181
+ {
1182
+ sprintf(OutputString, "\n After projecting a volume XZ slab at VolumeCounter_Y = % 3i\n", VolumeCounter_Y);
1183
+ Report(OutputString);
1184
+
1185
+ int Counter_X, Counter_Y, Counter_Z;
1186
+
1187
+ for (Counter_Z=Volume_NumZ/2 ; Counter_Z <= (Volume_NumZ-1) ; Counter_Z+=Volume_NumZ)
1188
+ {
1189
+ sprintf(OutputString, "Slice % 3i\n", Counter_Z);
1190
+ Report(OutputString);
1191
+ for (Counter_Y=0 ; Counter_Y <= (Volume_NumY-1) ; Counter_Y+=Volume_NumY/10)
1192
+ {
1193
+ for (Counter_X=0 ; Counter_X <= (Volume_NumX-1) ; Counter_X+=Volume_NumX/10)
1194
+ {
1195
+ sprintf(OutputString, "%10.5f ", *(Volume_Energy_Active_ptr + Volume_NumVoxels_XZSlab*Counter_Y + Volume_NumZ*Counter_X + Counter_Z));
1196
+ Report(OutputString);
1197
+ }
1198
+ sprintf(OutputString, "\n");
1199
+ Report(OutputString);
1200
+ }
1201
+ }
1202
+ }
1203
+ #endif
1204
+
1205
+ // Done projecting XZ slab.
1206
+ // *******************************************************************************************************************
1207
+ // *******************************************************************************************************************
1208
+ // Increment to the next XZ slab in the volume.
1209
+
1210
+ #if defined(DEBUG_00)
1211
+ Report("Increment to the next XZ slab in the volume.\n");
1212
+ #endif
1213
+ Volume_Mu_XZSlab_Current_ptr += VolumeCounter_Y_IncrementDirection * Volume_NumVoxels_XZSlab;
1214
+ Volume_Energy_XZSlab_Current_ptr += VolumeCounter_Y_IncrementDirection * Volume_NumVoxels_XZSlab;
1215
+
1216
+ } // end volume Y (i.e. XZ-slab) loop
1217
+ // Done projecting the view onto each XZ slab in the volume.
1218
+ // *******************************************************************************************************************
1219
+
1220
+ }
1221
+
1222
+ //**********************************************************************************************************************
1223
+ //**********************************************************************************************************************
1224
+ //**********************************************************************************************************************
1225
+
1226
+ // This function performs a distance-driven ptojection of a 3D sinogram of incident energy into a 3D volume of Mu values,
1227
+ // to produce a 3D volume of deposited energies.
1228
+ // NOTE: View-by-view depositied energy is SUBTRACTED from the input sinogram containing incident energy. Therefore, on
1229
+ // exit, the input sinogram contains the energy that was NOT absorbed, therefore this should be DETECTED energy.
1230
+
1231
+ extern "C" {
1232
+ EXPORT
1233
+ void DD3Energy(float SourceCoord_X, // Input: scalar
1234
+ float SourceCoord_Y, // Input: scalar
1235
+ float SourceCoord_Z, // Input: scalar
1236
+ int Detector_NumCols, // Input: scalar
1237
+ int Detector_NumRows, // Input: scalar
1238
+ float *DetectorPixelCenterCoords_X_ptr, // Input: [Detector_NumCols]
1239
+ float *DetectorPixelCenterCoords_Y_ptr, // Input: [Detector_NumCols]
1240
+ float *DetectorPixelCenterCoords_Z_ptr, // Input: [Detector_NumRows]
1241
+ float DetectorPixelAspectRatio_Z_X, // Input: scalar
1242
+ float VolumeOffset_X, // Input: scalar
1243
+ float VolumeOffset_Y, // Input: scalar
1244
+ float VolumeOffset_Z, // Input: scalar
1245
+ float *ViewAngles_ptr, // Input: [NumViews]
1246
+ float *Shifts_Z_EachView_ptr, // Input: [NumViews]
1247
+ int NumViews, // Input: scalar
1248
+ float *Detector_IncidentEnergySinogramData_ptr, // Input: [NumViews][Detector_NumCols][Detector_NumRows]
1249
+ int Volume_NumX, // Input: scalar
1250
+ int Volume_NumY, // Input: scalar
1251
+ int Volume_NumZ, // Input: scalar
1252
+ float Volume_VoxelSize_X, // Input: scalar
1253
+ float Volume_VoxelSize_Y, // Input: scalar
1254
+ float Volume_VoxelSize_Z, // Input: scalar
1255
+ float *Volume_Mu_Untransposed_ptr, // Input: [Volume_NumY][Volume_NumX][Volume_NumZ]
1256
+ float *Volume_Energy_Untransposed_ptr) // Output: [Volume_NumY][Volume_NumX][Volume_NumZ]
1257
+ {
1258
+ int Detector_NumPixels;
1259
+ int Detector_NumPixelBoundaries_XY;
1260
+ int Detector_NumPixelBoundaries_Z;
1261
+ int Counter;
1262
+ int ViewCounter;
1263
+ int ViewCounter_Last;
1264
+ int ProjectionVertical_flag;
1265
+ float sinViewAngle;
1266
+ float cosViewAngle;
1267
+ float SourceCoordRotated_X;
1268
+ float SourceCoordRotated_Y;
1269
+ float SourceCoordShifted_Z;
1270
+ float *DetectorPixelBoundaryCoords_X_ptr;
1271
+ float *DetectorPixelBoundaryCoords_Y_ptr;
1272
+ float *DetectorPixelBoundaryCoords_Z_ptr;
1273
+ float *DetectorPixelBoundaryCoord_X_Current_ptr;
1274
+ float *DetectorPixelBoundaryCoord_Y_Current_ptr;
1275
+ float *DetectorPixelBoundaryCoord_Z_Current_ptr;
1276
+ float *DetectorPixelBoundaryCoordsRotated_X_ptr;
1277
+ float *DetectorPixelBoundaryCoordsRotated_Y_ptr;
1278
+ float *DetectorPixelBoundaryCoordsShifted_Z_ptr;
1279
+ float *DetectorPixelBoundaryCoordRotated_X_Current_ptr;
1280
+ float *DetectorPixelBoundaryCoordRotated_Y_Current_ptr;
1281
+ float *DetectorPixelBoundaryCoordShifted_Z_Current_ptr;
1282
+ float *DetectorPixelBoundaryCoordsProjected_X_ptr;
1283
+ float *DetectorMagnificationFactors_ptr;
1284
+ float *ViewAngle_Current_ptr;
1285
+ float *Detector_PathLengths_ptr;
1286
+ float *Detector_IncidentEnergyViewData_Current_ptr;
1287
+ float *Detector_AbsorbedEnergyViewData_Current_ptr;
1288
+ float *Volume_Mu_Transposed_ptr;
1289
+ float *Volume_Energy_Transposed_ptr;
1290
+
1291
+ #if defined(DEBUG_00)
1292
+ sprintf(OutputString, "Running DD3Energy\n");
1293
+ Report(OutputString);
1294
+ #endif
1295
+
1296
+ #if defined(DEBUG_10)
1297
+ int ViewCounter_First;
1298
+
1299
+ ViewCounter_First = 0;
1300
+ ViewCounter_Last = 0;
1301
+ #else
1302
+ ViewCounter_Last = NumViews - 1;
1303
+ #endif
1304
+
1305
+ Detector_NumPixels = Detector_NumCols * Detector_NumRows;
1306
+ Detector_NumPixelBoundaries_XY = Detector_NumCols+1;
1307
+ Detector_NumPixelBoundaries_Z = Detector_NumRows+1;
1308
+
1309
+ // Allocate memory for detector boundaries
1310
+ DetectorPixelBoundaryCoords_X_ptr = (float*)malloc((Detector_NumPixelBoundaries_XY ) * sizeof(float));
1311
+ DetectorPixelBoundaryCoords_Y_ptr = (float*)malloc((Detector_NumPixelBoundaries_XY ) * sizeof(float));
1312
+ DetectorPixelBoundaryCoords_Z_ptr = (float*)malloc((Detector_NumPixelBoundaries_Z ) * sizeof(float));
1313
+ DetectorPixelBoundaryCoordsRotated_X_ptr = (float*)malloc((Detector_NumPixelBoundaries_XY ) * sizeof(float));
1314
+ DetectorPixelBoundaryCoordsRotated_Y_ptr = (float*)malloc((Detector_NumPixelBoundaries_XY ) * sizeof(float));
1315
+ DetectorPixelBoundaryCoordsShifted_Z_ptr = (float*)malloc((Detector_NumPixelBoundaries_Z + 2) * sizeof(float)); // 2 sentinels
1316
+
1317
+ // Allocate memory for transposed volumes.
1318
+ Volume_Mu_Transposed_ptr = (float*)calloc(Volume_NumX*Volume_NumY*Volume_NumZ,sizeof(float));
1319
+ Volume_Energy_Transposed_ptr = (float*)calloc(Volume_NumX*Volume_NumY*Volume_NumZ,sizeof(float));
1320
+
1321
+ // The "vertical" projections need Volume_Mu_Untransposed (the input), whereas
1322
+ // the "horizontal" projections need Volume_Mu_Transposed.
1323
+ // So we need to make a transposed copy of Volume_Mu_Untransposed.
1324
+ DD3AddTranspose(Volume_NumY, Volume_NumX, Volume_NumZ, Volume_Mu_Untransposed_ptr, Volume_Mu_Transposed_ptr);
1325
+
1326
+ // The next four arrays are passed to a called function for use there.
1327
+ // The could be allocated in that function, but they are allocated here for efficiency.
1328
+
1329
+ DetectorMagnificationFactors_ptr = (float*)malloc((Detector_NumCols + 2) * sizeof(float)); // 2 sentinels
1330
+ DetectorPixelBoundaryCoordsProjected_X_ptr = (float*)malloc((Detector_NumPixelBoundaries_XY + 2) * sizeof(float)); // 2 sentinels
1331
+ Detector_PathLengths_ptr = (float*)calloc((Detector_NumPixels ), sizeof(float));
1332
+ Detector_AbsorbedEnergyViewData_Current_ptr = (float*)calloc((Detector_NumPixels ), sizeof(float));
1333
+
1334
+ // Calculate detector boundaries
1335
+ DD3Boundaries(Detector_NumPixelBoundaries_XY, DetectorPixelCenterCoords_X_ptr, DetectorPixelBoundaryCoords_X_ptr);
1336
+ DD3Boundaries(Detector_NumPixelBoundaries_XY, DetectorPixelCenterCoords_Y_ptr, DetectorPixelBoundaryCoords_Y_ptr);
1337
+ DD3Boundaries(Detector_NumPixelBoundaries_Z, DetectorPixelCenterCoords_Z_ptr, DetectorPixelBoundaryCoords_Z_ptr);
1338
+
1339
+ // Translate the Z position of each boundary by the Z position of the source.
1340
+ for (Counter=0 ; Counter <= (Detector_NumPixelBoundaries_Z-1) ; Counter++)
1341
+ *(DetectorPixelBoundaryCoords_Z_ptr + Counter) -= SourceCoord_Z;
1342
+
1343
+ // Translate the Z position of the source by the specified Z offset.
1344
+ SourceCoord_Z -= VolumeOffset_Z;
1345
+
1346
+ // *******************************************************************************************************************
1347
+ // Loop through all views.
1348
+
1349
+ #if defined(DEBUG_00)
1350
+ Report("Loop through all views.\n");
1351
+ #endif
1352
+
1353
+ Detector_IncidentEnergyViewData_Current_ptr = Detector_IncidentEnergySinogramData_ptr;
1354
+ ViewAngle_Current_ptr = ViewAngles_ptr;
1355
+
1356
+ for (ViewCounter = 0 ; ViewCounter <= ViewCounter_Last ; ViewCounter++)
1357
+ {
1358
+ #if defined(DEBUG_10)
1359
+ if ((ViewCounter == 0) && (ViewCounter_First > 0))
1360
+ {
1361
+ Detector_IncidentEnergyViewData_Current_ptr += (ViewCounter_First * Detector_NumPixels);
1362
+ ViewAngle_Current_ptr += ViewCounter_First;
1363
+ Shifts_Z_EachView_ptr += ViewCounter_First;
1364
+ ViewCounter = ViewCounter_First;
1365
+ }
1366
+
1367
+ if (ViewCounter == ViewCounter_Last)
1368
+ PrintDebug = 1;
1369
+ else
1370
+ PrintDebug = 0;
1371
+ #endif
1372
+
1373
+ sinViewAngle = (float)sin(*ViewAngle_Current_ptr);
1374
+ cosViewAngle = (float)cos(*ViewAngle_Current_ptr);
1375
+
1376
+ DetectorPixelBoundaryCoord_X_Current_ptr = DetectorPixelBoundaryCoords_X_ptr;
1377
+ DetectorPixelBoundaryCoord_Y_Current_ptr = DetectorPixelBoundaryCoords_Y_ptr;
1378
+ DetectorPixelBoundaryCoordRotated_X_Current_ptr = DetectorPixelBoundaryCoordsRotated_X_ptr;
1379
+ DetectorPixelBoundaryCoordRotated_Y_Current_ptr = DetectorPixelBoundaryCoordsRotated_Y_ptr;
1380
+
1381
+ for (Counter=0 ; Counter<=(Detector_NumPixelBoundaries_XY-1) ; Counter++)
1382
+ {
1383
+ // Rotate detector pixel X coordinate.
1384
+ *DetectorPixelBoundaryCoordRotated_X_Current_ptr++ = *DetectorPixelBoundaryCoord_X_Current_ptr * cosViewAngle
1385
+ - *DetectorPixelBoundaryCoord_Y_Current_ptr * sinViewAngle
1386
+ - VolumeOffset_X;
1387
+ // Rotate detector pixel Y coordinates.
1388
+ *DetectorPixelBoundaryCoordRotated_Y_Current_ptr++ = *DetectorPixelBoundaryCoord_Y_Current_ptr++ * cosViewAngle
1389
+ + *DetectorPixelBoundaryCoord_X_Current_ptr++ * sinViewAngle
1390
+ - VolumeOffset_Y;
1391
+ }
1392
+
1393
+ SourceCoordRotated_X = SourceCoord_X * cosViewAngle - SourceCoord_Y * sinViewAngle;
1394
+ SourceCoordRotated_Y = SourceCoord_Y * cosViewAngle + SourceCoord_X * sinViewAngle;
1395
+ ProjectionVertical_flag = (fabs(SourceCoordRotated_Y) >= fabs(SourceCoordRotated_X));
1396
+ SourceCoordRotated_X -= VolumeOffset_X;
1397
+ SourceCoordRotated_Y -= VolumeOffset_Y;
1398
+
1399
+ // Shift z coordinates
1400
+ DetectorPixelBoundaryCoord_Z_Current_ptr = DetectorPixelBoundaryCoords_Z_ptr;
1401
+ DetectorPixelBoundaryCoordShifted_Z_Current_ptr = DetectorPixelBoundaryCoordsShifted_Z_ptr;
1402
+
1403
+ for (Counter=0 ; Counter<=(Detector_NumPixelBoundaries_Z-1) ; Counter++)
1404
+ *DetectorPixelBoundaryCoordShifted_Z_Current_ptr++ = *DetectorPixelBoundaryCoord_Z_Current_ptr++; // + *Shifts_Z_EachView_ptr;
1405
+
1406
+ *(DetectorPixelBoundaryCoordsShifted_Z_ptr + Detector_NumPixelBoundaries_Z )
1407
+ = *(DetectorPixelBoundaryCoordsShifted_Z_ptr + Detector_NumPixelBoundaries_Z - 1);
1408
+ // *(DetectorPixelBoundaryCoordsShifted_Z_ptr + Detector_NumPixelBoundaries_Z ) = 1.0e12; // sentinel in shifted array
1409
+ // *(DetectorPixelBoundaryCoordsShifted_Z_ptr + Detector_NumPixelBoundaries_Z + 1) = 1.5e12; // sentinel in shifted array
1410
+ SourceCoordShifted_Z = SourceCoord_Z + *Shifts_Z_EachView_ptr;
1411
+
1412
+ #if defined(DEBUG_05) || defined(DEBUG_16) || defined(DEBUG_17) || defined(DEBUG_18) || defined(DEBUG_19) || defined(DEBUG_20) || defined(DEBUG_21) || defined(DEBUG_22) || defined(DEBUG_23) || defined(DEBUG_24)
1413
+ sprintf(OutputString, "\nBackprojecting a view: ViewCounter = % 3i, ViewAngle_Current = % 8.2f (% 3.1f degrees), ProjectionVertical_flag = % 3i\n",
1414
+ ViewCounter, *ViewAngle_Current_ptr, *ViewAngle_Current_ptr*180./3.141592, ProjectionVertical_flag);
1415
+ Report(OutputString);
1416
+ #endif
1417
+
1418
+ DD3EnergyView(SourceCoordRotated_X, SourceCoordRotated_Y, SourceCoordShifted_Z,
1419
+ Detector_NumCols, Detector_NumRows,
1420
+ ProjectionVertical_flag,
1421
+ DetectorPixelBoundaryCoordsRotated_X_ptr,
1422
+ DetectorPixelBoundaryCoordsRotated_Y_ptr,
1423
+ DetectorPixelBoundaryCoordsProjected_X_ptr,
1424
+ DetectorPixelBoundaryCoordsShifted_Z_ptr,
1425
+ DetectorMagnificationFactors_ptr, DetectorPixelAspectRatio_Z_X,
1426
+ Detector_IncidentEnergyViewData_Current_ptr, Detector_AbsorbedEnergyViewData_Current_ptr, Detector_PathLengths_ptr,
1427
+ Volume_NumX, Volume_NumY, Volume_NumZ,
1428
+ Volume_VoxelSize_X, Volume_VoxelSize_Y, Volume_VoxelSize_Z,
1429
+ Volume_Mu_Untransposed_ptr, Volume_Mu_Transposed_ptr,
1430
+ Volume_Energy_Untransposed_ptr, Volume_Energy_Transposed_ptr);
1431
+
1432
+ // Move to the next view.
1433
+ Detector_IncidentEnergyViewData_Current_ptr += Detector_NumPixels;
1434
+ ++Shifts_Z_EachView_ptr;
1435
+ ++ViewAngle_Current_ptr;
1436
+
1437
+ }
1438
+ // end of view loop
1439
+
1440
+ // Results from the "vertical" backprojections got written into Volume_Energy_Untransposed, whereas
1441
+ // results from the "horizontal" backprojections got written into Volume_Energy_Transposed.
1442
+ // So we need to transpose the transposed volume, and add that to the un-transposed volume.
1443
+ DD3AddTranspose(Volume_NumY, Volume_NumX, Volume_NumZ, Volume_Energy_Transposed_ptr, Volume_Energy_Untransposed_ptr);
1444
+
1445
+ // Clean up memory
1446
+ free(DetectorPixelBoundaryCoords_X_ptr);
1447
+ free(DetectorPixelBoundaryCoords_Y_ptr);
1448
+ free(DetectorPixelBoundaryCoords_Z_ptr);
1449
+ free(DetectorPixelBoundaryCoordsRotated_X_ptr);
1450
+ free(DetectorPixelBoundaryCoordsRotated_Y_ptr);
1451
+ free(DetectorPixelBoundaryCoordsShifted_Z_ptr);
1452
+ free(Volume_Mu_Transposed_ptr);
1453
+ free(Volume_Energy_Transposed_ptr);
1454
+ free(DetectorMagnificationFactors_ptr);
1455
+ free(DetectorPixelBoundaryCoordsProjected_X_ptr);
1456
+ free(Detector_PathLengths_ptr);
1457
+ free(Detector_AbsorbedEnergyViewData_Current_ptr);
1458
+
1459
+ } // end of function
1460
+ } // end of extern
1461
+
1462
+ //**********************************************************************************************************************
1463
+ //**********************************************************************************************************************
1464
+ //**********************************************************************************************************************