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.
- catsim_test-0.0.5.dist-info/METADATA +5 -0
- catsim_test-0.0.5.dist-info/RECORD +1235 -0
- catsim_test-0.0.5.dist-info/WHEEL +5 -0
- catsim_test-0.0.5.dist-info/licenses/LICENSE +29 -0
- catsim_test-0.0.5.dist-info/sboms/auditwheel.cdx.json +1 -0
- catsim_test-0.0.5.dist-info/top_level.txt +2 -0
- catsim_test.libs/libgomp-98b21ff3.so.1.0.0 +0 -0
- dummy.cpython-313-x86_64-linux-gnu.so +0 -0
- gecatsim/__init__.py +20 -0
- gecatsim/bowtie/large.txt +891 -0
- gecatsim/bowtie/medium.txt +891 -0
- gecatsim/bowtie/small.txt +891 -0
- gecatsim/cfg/Phantom_Default.cfg +7 -0
- gecatsim/cfg/Physics_Default.cfg +38 -0
- gecatsim/cfg/Protocol_Default.cfg +33 -0
- gecatsim/cfg/Recon_Default.cfg +22 -0
- gecatsim/cfg/Scanner_Default.cfg +31 -0
- gecatsim/clib_build/BuildLinux64 +6 -0
- gecatsim/clib_build/BuildWin64.bat +17 -0
- gecatsim/clib_build/MakeMacOS +48 -0
- gecatsim/clib_build/MakeVariables_1 +19 -0
- gecatsim/clib_build/MakeVariables_2 +5 -0
- gecatsim/clib_build/MakeVariables_3 +33 -0
- gecatsim/clib_build/MakeVariables_3.1 +32 -0
- gecatsim/clib_build/MakeWindows64 +45 -0
- gecatsim/clib_build/Makefile +41 -0
- gecatsim/clib_build/readme.md +13 -0
- gecatsim/clib_build/src/BaseObject.cpp +144 -0
- gecatsim/clib_build/src/BaseObject.h +74 -0
- gecatsim/clib_build/src/ClipPlane.cpp +83 -0
- gecatsim/clib_build/src/ClipPlane.h +28 -0
- gecatsim/clib_build/src/CrossSection.cpp +179 -0
- gecatsim/clib_build/src/CrossSection.hpp +27 -0
- gecatsim/clib_build/src/CrossSectionHandler.cpp +160 -0
- gecatsim/clib_build/src/CrossSectionHandler.hpp +72 -0
- gecatsim/clib_build/src/Cube.cpp +144 -0
- gecatsim/clib_build/src/Cube.h +26 -0
- gecatsim/clib_build/src/Cylinder.cpp +156 -0
- gecatsim/clib_build/src/Cylinder.h +25 -0
- gecatsim/clib_build/src/DD2Back.c +332 -0
- gecatsim/clib_build/src/DD2ParProj.c +377 -0
- gecatsim/clib_build/src/DD2Proj.c +333 -0
- gecatsim/clib_build/src/DD2WBack.c +350 -0
- gecatsim/clib_build/src/DD3.hpp +423 -0
- gecatsim/clib_build/src/DD3Proj.cpp +519 -0
- gecatsim/clib_build/src/DD3Proj_roi_notrans_mm.cpp +585 -0
- gecatsim/clib_build/src/DD3WBack.c +491 -0
- gecatsim/clib_build/src/DD3_roi_notrans_mm.hpp +272 -0
- gecatsim/clib_build/src/Detector.cpp +389 -0
- gecatsim/clib_build/src/Detector.hpp +134 -0
- gecatsim/clib_build/src/Interpolate.cpp +58 -0
- gecatsim/clib_build/src/Intersection.cpp +198 -0
- gecatsim/clib_build/src/Intersection.h +36 -0
- gecatsim/clib_build/src/MatVec.cpp +262 -0
- gecatsim/clib_build/src/MatVec.h +68 -0
- gecatsim/clib_build/src/Objects.cpp +23 -0
- gecatsim/clib_build/src/Objects.hpp +90 -0
- gecatsim/clib_build/src/Phantom.cpp +169 -0
- gecatsim/clib_build/src/Phantom.hpp +43 -0
- gecatsim/clib_build/src/Photon.cpp +168 -0
- gecatsim/clib_build/src/Photon.hpp +56 -0
- gecatsim/clib_build/src/RD3Back.cpp +357 -0
- gecatsim/clib_build/src/RD3Intersections.cpp +154 -0
- gecatsim/clib_build/src/RD3bench.cpp +505 -0
- gecatsim/clib_build/src/Sphere.cpp +43 -0
- gecatsim/clib_build/src/Sphere.h +25 -0
- gecatsim/clib_build/src/Transformation.cpp +104 -0
- gecatsim/clib_build/src/Transformation.h +37 -0
- gecatsim/clib_build/src/TreePhantom.cpp +138 -0
- gecatsim/clib_build/src/TreePhantom.h +27 -0
- gecatsim/clib_build/src/Volume.cpp +101 -0
- gecatsim/clib_build/src/Volume.hpp +28 -0
- gecatsim/clib_build/src/analytic_projector.c +2433 -0
- gecatsim/clib_build/src/analytic_projector.h +235 -0
- gecatsim/clib_build/src/compt.cpp +400 -0
- gecatsim/clib_build/src/compt2.cpp +558 -0
- gecatsim/clib_build/src/compt3.cpp +607 -0
- gecatsim/clib_build/src/ct_nurbs.h +214 -0
- gecatsim/clib_build/src/extractsino.c +42 -0
- gecatsim/clib_build/src/fm_gethostid.c +23 -0
- gecatsim/clib_build/src/fm_getrandpid.c +31 -0
- gecatsim/clib_build/src/gemsfilt.c +1084 -0
- gecatsim/clib_build/src/getMemorySize.cpp +105 -0
- gecatsim/clib_build/src/getMemorySize.h +5 -0
- gecatsim/clib_build/src/hull2.c +77 -0
- gecatsim/clib_build/src/intersections.c +131 -0
- gecatsim/clib_build/src/label.h +10 -0
- gecatsim/clib_build/src/main.cpp +609 -0
- gecatsim/clib_build/src/make_volume.c +573 -0
- gecatsim/clib_build/src/nCAT_main.c +6343 -0
- gecatsim/clib_build/src/negative_log.cpp +233 -0
- gecatsim/clib_build/src/negative_log.h +23 -0
- gecatsim/clib_build/src/pd2dbpcurved.c +98 -0
- gecatsim/clib_build/src/pd2dbpflat.c +101 -0
- gecatsim/clib_build/src/pd3dbpsemi.c +177 -0
- gecatsim/clib_build/src/phantom.l +72 -0
- gecatsim/clib_build/src/phantom.lex.c +1770 -0
- gecatsim/clib_build/src/phantom.tab.cpp +2126 -0
- gecatsim/clib_build/src/phantom.tab.hpp +126 -0
- gecatsim/clib_build/src/phantom.y +624 -0
- gecatsim/clib_build/src/rndpoi.c +793 -0
- gecatsim/clib_build/src/spline.c +81 -0
- gecatsim/clib_build/src/spline.h +6 -0
- gecatsim/clib_build/src/timer.c +64 -0
- gecatsim/clib_build/src/viewshift.c +25 -0
- gecatsim/clib_build/src/voxelized_projector.cpp +683 -0
- gecatsim/clib_build/src/xybowtie.c +76 -0
- gecatsim/dose/data/dosereconkernel_mthd4.mat +0 -0
- gecatsim/dose/data/scatter_E_loss_fraction.mat +0 -0
- gecatsim/dose/data/weighted_scatter_energy_by_spec.mat +0 -0
- gecatsim/dose/examples/dose_doserecon.cfg +16 -0
- gecatsim/dose/examples/dose_phantom.cfg +6 -0
- gecatsim/dose/examples/dose_physics.cfg +18 -0
- gecatsim/dose/examples/dose_protocol.cfg +15 -0
- gecatsim/dose/examples/dose_recon.cfg +9 -0
- gecatsim/dose/examples/dose_scanner.cfg +29 -0
- gecatsim/dose/examples/run.py +37 -0
- gecatsim/dose/lib/Dose_Recon_Library_Linux64.so +0 -0
- gecatsim/dose/lib/Dose_Recon_Library_Windows64.dll +0 -0
- gecatsim/dose/pyfiles/C_DD3Dose.py +84 -0
- gecatsim/dose/pyfiles/Combine_Spectrum_Bowtie_FlatFilter.py +15 -0
- gecatsim/dose/pyfiles/DoseConv.py +87 -0
- gecatsim/dose/pyfiles/GetMuByProcess.py +57 -0
- gecatsim/dose/pyfiles/__init__.py +0 -0
- gecatsim/dose/pyfiles/brconvol_matlab.py +67 -0
- gecatsim/dose/pyfiles/calcDetectorFlux.py +54 -0
- gecatsim/dose/pyfiles/catdoserecon.py +225 -0
- gecatsim/dose/pyfiles/doseconvol.py +52 -0
- gecatsim/dose/pyfiles/get_voxel_stopping_power.py +35 -0
- gecatsim/dose/pyfiles/img2vol.py +57 -0
- gecatsim/dose/pyfiles/xyfovimg.py +30 -0
- gecatsim/dose/readme.md +4 -0
- gecatsim/dose/src/DD3.hpp +371 -0
- gecatsim/dose/src/DD3Dose.cpp +787 -0
- gecatsim/dose/src/DD3Dose.hpp +22 -0
- gecatsim/dose/src/DD3Dose.i +23 -0
- gecatsim/dose/src/DD3Energy_clean.cpp +1464 -0
- gecatsim/dose/src/DD3Proj.cpp +504 -0
- gecatsim/dose/src/DD3Proj.hpp +20 -0
- gecatsim/dose/src/DD3Proj_mm.cpp +561 -0
- gecatsim/dose/src/DD3Proj_mm.hpp +21 -0
- gecatsim/dose/src/Win32_Build.bat +17 -0
- gecatsim/dose/src/Win64_Build.bat +20 -0
- gecatsim/examples/Catvoxel_Sample.py +53 -0
- gecatsim/examples/DD3Proj_mm_Sample.py +60 -0
- gecatsim/examples/GetMu_Sample.py +24 -0
- gecatsim/examples/Sim_Recon_Sample.py +45 -0
- gecatsim/examples/Sim_Recon_Sample_PCCT.py +69 -0
- gecatsim/examples/Sim_Sample.py +32 -0
- gecatsim/examples/Sim_Sample_Analyic.py +44 -0
- gecatsim/examples/Sim_Sample_Helical.py +32 -0
- gecatsim/examples/Sim_Sample_Hybrid.py +42 -0
- gecatsim/examples/Sim_Sample_PCCT.py +72 -0
- gecatsim/examples/Sim_Sample_Polygonal.py +47 -0
- gecatsim/examples/Sim_Sample_Scatter.py +38 -0
- gecatsim/examples/Sim_Sample_XCAT.py +50 -0
- gecatsim/examples/cfg/Phantom_Sample.cfg +6 -0
- gecatsim/examples/cfg/Phantom_Sample_Analytic.cfg +6 -0
- gecatsim/examples/cfg/Phantom_Sample_Hybrid.cfg +7 -0
- gecatsim/examples/cfg/Phantom_Sample_Polygonal.cfg +6 -0
- gecatsim/examples/cfg/Phantom_Sample_XCAT.cfg +6 -0
- gecatsim/examples/cfg/Physics_Sample.cfg +41 -0
- gecatsim/examples/cfg/Protocol_Sample_Helical.cfg +33 -0
- gecatsim/examples/cfg/Protocol_Sample_axial.cfg +33 -0
- gecatsim/examples/cfg/Recon_Sample_2d.cfg +6 -0
- gecatsim/examples/cfg/Recon_Sample_Helical.cfg +8 -0
- gecatsim/examples/cfg/Scanner_PCCT.cfg +30 -0
- gecatsim/examples/cfg/Scanner_Sample_generic.cfg +29 -0
- gecatsim/examples/vct_examples/Phantom_Sample_Analytic.cfg +6 -0
- gecatsim/examples/vct_examples/Physics_Sample.cfg +41 -0
- gecatsim/examples/vct_examples/Protocol_Sample_axial.cfg +33 -0
- gecatsim/examples/vct_examples/Recon_Sample_2d.cfg +6 -0
- gecatsim/examples/vct_examples/Scanner_Sample_generic.cfg +31 -0
- gecatsim/examples/vct_examples/read.md +1 -0
- gecatsim/focal_spot/readme.md +31 -0
- gecatsim/focal_spot/vct_large_fs.npz +0 -0
- gecatsim/focal_spot/vct_small_fs.npz +0 -0
- gecatsim/lib/libcatsim.so +0 -0
- gecatsim/lib/libcatsim64.dll +0 -0
- gecatsim/lib/libcatsim_macos.so +0 -0
- gecatsim/lib/pthreadGC2_x64.dll +0 -0
- gecatsim/lib/pthreads-2-9-1-release.zip +0 -0
- gecatsim/material/Ac +11 -0
- gecatsim/material/Ag +11 -0
- gecatsim/material/Al +11 -0
- gecatsim/material/Ar +11 -0
- gecatsim/material/As +11 -0
- gecatsim/material/At +11 -0
- gecatsim/material/Au +11 -0
- gecatsim/material/B +11 -0
- gecatsim/material/Ba +11 -0
- gecatsim/material/Be +11 -0
- gecatsim/material/Bi +11 -0
- gecatsim/material/Br +11 -0
- gecatsim/material/C +11 -0
- gecatsim/material/CIRS_adipose_adult2 +20 -0
- gecatsim/material/CIRS_adipose_adult3 +20 -0
- gecatsim/material/CIRS_bone_10yo +21 -0
- gecatsim/material/CIRS_bone_1yo +21 -0
- gecatsim/material/CIRS_bone_5yo +21 -0
- gecatsim/material/CIRS_bone_adult_and_15yo +21 -0
- gecatsim/material/CIRS_bone_newborn +21 -0
- gecatsim/material/CIRS_liver_adult +20 -0
- gecatsim/material/CIRS_lung_inhale +20 -0
- gecatsim/material/CIRS_plastic_water_LR +20 -0
- gecatsim/material/CIRS_spinal_cord +20 -0
- gecatsim/material/CZT +5 -0
- gecatsim/material/Ca +11 -0
- gecatsim/material/Cd +11 -0
- gecatsim/material/Ce +11 -0
- gecatsim/material/Cl +11 -0
- gecatsim/material/Co +11 -0
- gecatsim/material/Copyright.txt +7 -0
- gecatsim/material/Cr +11 -0
- gecatsim/material/Cs +11 -0
- gecatsim/material/CsI +16 -0
- gecatsim/material/Cu +11 -0
- gecatsim/material/Dy +11 -0
- gecatsim/material/Er +11 -0
- gecatsim/material/Eu +11 -0
- gecatsim/material/F +11 -0
- gecatsim/material/Fe +11 -0
- gecatsim/material/Fr +11 -0
- gecatsim/material/GOS +19 -0
- gecatsim/material/Ga +11 -0
- gecatsim/material/Gd +11 -0
- gecatsim/material/Ge +11 -0
- gecatsim/material/H +11 -0
- gecatsim/material/He +11 -0
- gecatsim/material/Hf +11 -0
- gecatsim/material/Hg +11 -0
- gecatsim/material/Ho +11 -0
- gecatsim/material/I +11 -0
- gecatsim/material/ICRU_adipose_adult2 +21 -0
- gecatsim/material/ICRU_blood_adult +24 -0
- gecatsim/material/ICRU_brain_adult +26 -0
- gecatsim/material/ICRU_breast_adult2 +22 -0
- gecatsim/material/ICRU_eye_lens_adult +22 -0
- gecatsim/material/ICRU_kidney_adult +24 -0
- gecatsim/material/ICRU_liver_adult +23 -0
- gecatsim/material/ICRU_lung_adult_healthy +23 -0
- gecatsim/material/ICRU_muscle_adult +23 -0
- gecatsim/material/ICRU_pancreas_adult +23 -0
- gecatsim/material/ICRU_skeleton_cortical_bone_adult +23 -0
- gecatsim/material/ICRU_skin_adult +23 -0
- gecatsim/material/ICRU_spleen_adult +23 -0
- gecatsim/material/ICRU_testis_adult +23 -0
- gecatsim/material/In +11 -0
- gecatsim/material/Ir +11 -0
- gecatsim/material/K +11 -0
- gecatsim/material/Kr +11 -0
- gecatsim/material/La +11 -0
- gecatsim/material/Li +11 -0
- gecatsim/material/Lu +11 -0
- gecatsim/material/Lumex +18 -0
- gecatsim/material/Mg +11 -0
- gecatsim/material/Mn +11 -0
- gecatsim/material/Mo +11 -0
- gecatsim/material/N +11 -0
- gecatsim/material/Na +11 -0
- gecatsim/material/NaCl +16 -0
- gecatsim/material/Nb +11 -0
- gecatsim/material/Nd +11 -0
- gecatsim/material/Ne +11 -0
- gecatsim/material/Ni +11 -0
- gecatsim/material/O +11 -0
- gecatsim/material/Os +11 -0
- gecatsim/material/P +11 -0
- gecatsim/material/PMMA +20 -0
- gecatsim/material/PVC_flexible +20 -0
- gecatsim/material/PVC_rigid +20 -0
- gecatsim/material/Pa +11 -0
- gecatsim/material/Pb +11 -0
- gecatsim/material/Pd +11 -0
- gecatsim/material/Pm +11 -0
- gecatsim/material/Po +11 -0
- gecatsim/material/Pr +11 -0
- gecatsim/material/Pt +11 -0
- gecatsim/material/Ra +11 -0
- gecatsim/material/Rb +11 -0
- gecatsim/material/Re +11 -0
- gecatsim/material/Rh +11 -0
- gecatsim/material/Rn +11 -0
- gecatsim/material/Ru +11 -0
- gecatsim/material/S +11 -0
- gecatsim/material/Sb +11 -0
- gecatsim/material/Sc +11 -0
- gecatsim/material/Se +11 -0
- gecatsim/material/Si +11 -0
- gecatsim/material/Sm +11 -0
- gecatsim/material/Sn +11 -0
- gecatsim/material/Sr +11 -0
- gecatsim/material/Ta +11 -0
- gecatsim/material/Tb +11 -0
- gecatsim/material/Tc +11 -0
- gecatsim/material/Te +11 -0
- gecatsim/material/Th +11 -0
- gecatsim/material/Ti +11 -0
- gecatsim/material/Tl +11 -0
- gecatsim/material/Tm +11 -0
- gecatsim/material/U +11 -0
- gecatsim/material/V +11 -0
- gecatsim/material/W +11 -0
- gecatsim/material/Xe +11 -0
- gecatsim/material/Y +11 -0
- gecatsim/material/Yb +11 -0
- gecatsim/material/Zn +11 -0
- gecatsim/material/Zr +11 -0
- gecatsim/material/air +24 -0
- gecatsim/material/bone +25 -0
- gecatsim/material/brass +18 -0
- gecatsim/material/diamond +13 -0
- gecatsim/material/edlp/comp/ce-cs-1.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-10.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-100.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-11.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-12.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-13.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-14.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-15.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-16.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-17.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-18.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-19.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-2.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-20.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-21.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-22.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-23.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-24.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-25.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-26.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-27.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-28.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-29.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-3.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-30.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-31.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-32.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-33.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-34.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-35.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-36.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-37.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-38.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-39.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-4.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-40.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-41.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-42.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-43.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-44.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-45.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-46.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-47.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-48.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-49.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-5.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-50.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-51.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-52.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-53.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-54.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-55.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-56.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-57.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-58.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-59.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-6.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-60.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-61.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-62.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-63.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-64.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-65.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-66.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-67.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-68.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-69.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-7.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-70.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-71.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-72.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-73.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-74.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-75.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-76.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-77.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-78.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-79.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-8.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-80.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-81.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-82.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-83.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-84.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-85.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-86.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-87.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-88.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-89.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-9.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-90.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-91.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-92.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-93.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-94.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-95.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-96.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-97.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-98.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-99.dat +124 -0
- gecatsim/material/edlp/comp/ce-cs-all.dat +0 -0
- gecatsim/material/edlp/comp/ce-sf-1.dat +107 -0
- gecatsim/material/edlp/comp/ce-sf-10.dat +179 -0
- gecatsim/material/edlp/comp/ce-sf-100.dat +150 -0
- gecatsim/material/edlp/comp/ce-sf-11.dat +187 -0
- gecatsim/material/edlp/comp/ce-sf-12.dat +180 -0
- gecatsim/material/edlp/comp/ce-sf-13.dat +166 -0
- gecatsim/material/edlp/comp/ce-sf-14.dat +170 -0
- gecatsim/material/edlp/comp/ce-sf-15.dat +166 -0
- gecatsim/material/edlp/comp/ce-sf-16.dat +165 -0
- gecatsim/material/edlp/comp/ce-sf-17.dat +169 -0
- gecatsim/material/edlp/comp/ce-sf-18.dat +161 -0
- gecatsim/material/edlp/comp/ce-sf-19.dat +167 -0
- gecatsim/material/edlp/comp/ce-sf-2.dat +144 -0
- gecatsim/material/edlp/comp/ce-sf-20.dat +168 -0
- gecatsim/material/edlp/comp/ce-sf-21.dat +162 -0
- gecatsim/material/edlp/comp/ce-sf-22.dat +163 -0
- gecatsim/material/edlp/comp/ce-sf-23.dat +162 -0
- gecatsim/material/edlp/comp/ce-sf-24.dat +169 -0
- gecatsim/material/edlp/comp/ce-sf-25.dat +164 -0
- gecatsim/material/edlp/comp/ce-sf-26.dat +167 -0
- gecatsim/material/edlp/comp/ce-sf-27.dat +165 -0
- gecatsim/material/edlp/comp/ce-sf-28.dat +173 -0
- gecatsim/material/edlp/comp/ce-sf-29.dat +167 -0
- gecatsim/material/edlp/comp/ce-sf-3.dat +149 -0
- gecatsim/material/edlp/comp/ce-sf-30.dat +168 -0
- gecatsim/material/edlp/comp/ce-sf-31.dat +166 -0
- gecatsim/material/edlp/comp/ce-sf-32.dat +168 -0
- gecatsim/material/edlp/comp/ce-sf-33.dat +167 -0
- gecatsim/material/edlp/comp/ce-sf-34.dat +169 -0
- gecatsim/material/edlp/comp/ce-sf-35.dat +167 -0
- gecatsim/material/edlp/comp/ce-sf-36.dat +158 -0
- gecatsim/material/edlp/comp/ce-sf-37.dat +160 -0
- gecatsim/material/edlp/comp/ce-sf-38.dat +161 -0
- gecatsim/material/edlp/comp/ce-sf-39.dat +161 -0
- gecatsim/material/edlp/comp/ce-sf-4.dat +151 -0
- gecatsim/material/edlp/comp/ce-sf-40.dat +170 -0
- gecatsim/material/edlp/comp/ce-sf-41.dat +172 -0
- gecatsim/material/edlp/comp/ce-sf-42.dat +167 -0
- gecatsim/material/edlp/comp/ce-sf-43.dat +164 -0
- gecatsim/material/edlp/comp/ce-sf-44.dat +160 -0
- gecatsim/material/edlp/comp/ce-sf-45.dat +160 -0
- gecatsim/material/edlp/comp/ce-sf-46.dat +162 -0
- gecatsim/material/edlp/comp/ce-sf-47.dat +162 -0
- gecatsim/material/edlp/comp/ce-sf-48.dat +164 -0
- gecatsim/material/edlp/comp/ce-sf-49.dat +165 -0
- gecatsim/material/edlp/comp/ce-sf-5.dat +148 -0
- gecatsim/material/edlp/comp/ce-sf-50.dat +158 -0
- gecatsim/material/edlp/comp/ce-sf-51.dat +156 -0
- gecatsim/material/edlp/comp/ce-sf-52.dat +158 -0
- gecatsim/material/edlp/comp/ce-sf-53.dat +163 -0
- gecatsim/material/edlp/comp/ce-sf-54.dat +163 -0
- gecatsim/material/edlp/comp/ce-sf-55.dat +158 -0
- gecatsim/material/edlp/comp/ce-sf-56.dat +161 -0
- gecatsim/material/edlp/comp/ce-sf-57.dat +168 -0
- gecatsim/material/edlp/comp/ce-sf-58.dat +167 -0
- gecatsim/material/edlp/comp/ce-sf-59.dat +162 -0
- gecatsim/material/edlp/comp/ce-sf-6.dat +155 -0
- gecatsim/material/edlp/comp/ce-sf-60.dat +157 -0
- gecatsim/material/edlp/comp/ce-sf-61.dat +169 -0
- gecatsim/material/edlp/comp/ce-sf-62.dat +169 -0
- gecatsim/material/edlp/comp/ce-sf-63.dat +160 -0
- gecatsim/material/edlp/comp/ce-sf-64.dat +166 -0
- gecatsim/material/edlp/comp/ce-sf-65.dat +163 -0
- gecatsim/material/edlp/comp/ce-sf-66.dat +158 -0
- gecatsim/material/edlp/comp/ce-sf-67.dat +168 -0
- gecatsim/material/edlp/comp/ce-sf-68.dat +159 -0
- gecatsim/material/edlp/comp/ce-sf-69.dat +164 -0
- gecatsim/material/edlp/comp/ce-sf-7.dat +174 -0
- gecatsim/material/edlp/comp/ce-sf-70.dat +169 -0
- gecatsim/material/edlp/comp/ce-sf-71.dat +162 -0
- gecatsim/material/edlp/comp/ce-sf-72.dat +163 -0
- gecatsim/material/edlp/comp/ce-sf-73.dat +165 -0
- gecatsim/material/edlp/comp/ce-sf-74.dat +164 -0
- gecatsim/material/edlp/comp/ce-sf-75.dat +161 -0
- gecatsim/material/edlp/comp/ce-sf-76.dat +155 -0
- gecatsim/material/edlp/comp/ce-sf-77.dat +152 -0
- gecatsim/material/edlp/comp/ce-sf-78.dat +150 -0
- gecatsim/material/edlp/comp/ce-sf-79.dat +148 -0
- gecatsim/material/edlp/comp/ce-sf-8.dat +176 -0
- gecatsim/material/edlp/comp/ce-sf-80.dat +153 -0
- gecatsim/material/edlp/comp/ce-sf-81.dat +158 -0
- gecatsim/material/edlp/comp/ce-sf-82.dat +154 -0
- gecatsim/material/edlp/comp/ce-sf-83.dat +159 -0
- gecatsim/material/edlp/comp/ce-sf-84.dat +156 -0
- gecatsim/material/edlp/comp/ce-sf-85.dat +162 -0
- gecatsim/material/edlp/comp/ce-sf-86.dat +154 -0
- gecatsim/material/edlp/comp/ce-sf-87.dat +154 -0
- gecatsim/material/edlp/comp/ce-sf-88.dat +153 -0
- gecatsim/material/edlp/comp/ce-sf-89.dat +151 -0
- gecatsim/material/edlp/comp/ce-sf-9.dat +184 -0
- gecatsim/material/edlp/comp/ce-sf-90.dat +153 -0
- gecatsim/material/edlp/comp/ce-sf-91.dat +151 -0
- gecatsim/material/edlp/comp/ce-sf-92.dat +157 -0
- gecatsim/material/edlp/comp/ce-sf-93.dat +152 -0
- gecatsim/material/edlp/comp/ce-sf-94.dat +154 -0
- gecatsim/material/edlp/comp/ce-sf-95.dat +151 -0
- gecatsim/material/edlp/comp/ce-sf-96.dat +151 -0
- gecatsim/material/edlp/comp/ce-sf-97.dat +150 -0
- gecatsim/material/edlp/comp/ce-sf-98.dat +152 -0
- gecatsim/material/edlp/comp/ce-sf-99.dat +152 -0
- gecatsim/material/edlp/comp/ce-sf-all.dat +0 -0
- gecatsim/material/edlp/pair/pp-cs-1.dat +96 -0
- gecatsim/material/edlp/pair/pp-cs-10.dat +110 -0
- gecatsim/material/edlp/pair/pp-cs-100.dat +126 -0
- gecatsim/material/edlp/pair/pp-cs-11.dat +112 -0
- gecatsim/material/edlp/pair/pp-cs-12.dat +111 -0
- gecatsim/material/edlp/pair/pp-cs-13.dat +112 -0
- gecatsim/material/edlp/pair/pp-cs-14.dat +113 -0
- gecatsim/material/edlp/pair/pp-cs-15.dat +113 -0
- gecatsim/material/edlp/pair/pp-cs-16.dat +114 -0
- gecatsim/material/edlp/pair/pp-cs-17.dat +112 -0
- gecatsim/material/edlp/pair/pp-cs-18.dat +113 -0
- gecatsim/material/edlp/pair/pp-cs-19.dat +113 -0
- gecatsim/material/edlp/pair/pp-cs-2.dat +100 -0
- gecatsim/material/edlp/pair/pp-cs-20.dat +114 -0
- gecatsim/material/edlp/pair/pp-cs-21.dat +115 -0
- gecatsim/material/edlp/pair/pp-cs-22.dat +115 -0
- gecatsim/material/edlp/pair/pp-cs-23.dat +116 -0
- gecatsim/material/edlp/pair/pp-cs-24.dat +115 -0
- gecatsim/material/edlp/pair/pp-cs-25.dat +115 -0
- gecatsim/material/edlp/pair/pp-cs-26.dat +116 -0
- gecatsim/material/edlp/pair/pp-cs-27.dat +117 -0
- gecatsim/material/edlp/pair/pp-cs-28.dat +117 -0
- gecatsim/material/edlp/pair/pp-cs-29.dat +117 -0
- gecatsim/material/edlp/pair/pp-cs-3.dat +104 -0
- gecatsim/material/edlp/pair/pp-cs-30.dat +117 -0
- gecatsim/material/edlp/pair/pp-cs-31.dat +118 -0
- gecatsim/material/edlp/pair/pp-cs-32.dat +118 -0
- gecatsim/material/edlp/pair/pp-cs-33.dat +118 -0
- gecatsim/material/edlp/pair/pp-cs-34.dat +119 -0
- gecatsim/material/edlp/pair/pp-cs-35.dat +119 -0
- gecatsim/material/edlp/pair/pp-cs-36.dat +119 -0
- gecatsim/material/edlp/pair/pp-cs-37.dat +118 -0
- gecatsim/material/edlp/pair/pp-cs-38.dat +119 -0
- gecatsim/material/edlp/pair/pp-cs-39.dat +119 -0
- gecatsim/material/edlp/pair/pp-cs-4.dat +105 -0
- gecatsim/material/edlp/pair/pp-cs-40.dat +119 -0
- gecatsim/material/edlp/pair/pp-cs-41.dat +119 -0
- gecatsim/material/edlp/pair/pp-cs-42.dat +119 -0
- gecatsim/material/edlp/pair/pp-cs-43.dat +119 -0
- gecatsim/material/edlp/pair/pp-cs-44.dat +119 -0
- gecatsim/material/edlp/pair/pp-cs-45.dat +119 -0
- gecatsim/material/edlp/pair/pp-cs-46.dat +119 -0
- gecatsim/material/edlp/pair/pp-cs-47.dat +120 -0
- gecatsim/material/edlp/pair/pp-cs-48.dat +120 -0
- gecatsim/material/edlp/pair/pp-cs-49.dat +120 -0
- gecatsim/material/edlp/pair/pp-cs-5.dat +106 -0
- gecatsim/material/edlp/pair/pp-cs-50.dat +120 -0
- gecatsim/material/edlp/pair/pp-cs-51.dat +120 -0
- gecatsim/material/edlp/pair/pp-cs-52.dat +120 -0
- gecatsim/material/edlp/pair/pp-cs-53.dat +121 -0
- gecatsim/material/edlp/pair/pp-cs-54.dat +121 -0
- gecatsim/material/edlp/pair/pp-cs-55.dat +121 -0
- gecatsim/material/edlp/pair/pp-cs-56.dat +121 -0
- gecatsim/material/edlp/pair/pp-cs-57.dat +122 -0
- gecatsim/material/edlp/pair/pp-cs-58.dat +122 -0
- gecatsim/material/edlp/pair/pp-cs-59.dat +122 -0
- gecatsim/material/edlp/pair/pp-cs-6.dat +107 -0
- gecatsim/material/edlp/pair/pp-cs-60.dat +122 -0
- gecatsim/material/edlp/pair/pp-cs-61.dat +122 -0
- gecatsim/material/edlp/pair/pp-cs-62.dat +123 -0
- gecatsim/material/edlp/pair/pp-cs-63.dat +123 -0
- gecatsim/material/edlp/pair/pp-cs-64.dat +123 -0
- gecatsim/material/edlp/pair/pp-cs-65.dat +124 -0
- gecatsim/material/edlp/pair/pp-cs-66.dat +124 -0
- gecatsim/material/edlp/pair/pp-cs-67.dat +124 -0
- gecatsim/material/edlp/pair/pp-cs-68.dat +124 -0
- gecatsim/material/edlp/pair/pp-cs-69.dat +124 -0
- gecatsim/material/edlp/pair/pp-cs-7.dat +108 -0
- gecatsim/material/edlp/pair/pp-cs-70.dat +124 -0
- gecatsim/material/edlp/pair/pp-cs-71.dat +124 -0
- gecatsim/material/edlp/pair/pp-cs-72.dat +124 -0
- gecatsim/material/edlp/pair/pp-cs-73.dat +125 -0
- gecatsim/material/edlp/pair/pp-cs-74.dat +125 -0
- gecatsim/material/edlp/pair/pp-cs-75.dat +126 -0
- gecatsim/material/edlp/pair/pp-cs-76.dat +126 -0
- gecatsim/material/edlp/pair/pp-cs-77.dat +126 -0
- gecatsim/material/edlp/pair/pp-cs-78.dat +125 -0
- gecatsim/material/edlp/pair/pp-cs-79.dat +125 -0
- gecatsim/material/edlp/pair/pp-cs-8.dat +109 -0
- gecatsim/material/edlp/pair/pp-cs-80.dat +125 -0
- gecatsim/material/edlp/pair/pp-cs-81.dat +126 -0
- gecatsim/material/edlp/pair/pp-cs-82.dat +126 -0
- gecatsim/material/edlp/pair/pp-cs-83.dat +126 -0
- gecatsim/material/edlp/pair/pp-cs-84.dat +126 -0
- gecatsim/material/edlp/pair/pp-cs-85.dat +126 -0
- gecatsim/material/edlp/pair/pp-cs-86.dat +126 -0
- gecatsim/material/edlp/pair/pp-cs-87.dat +126 -0
- gecatsim/material/edlp/pair/pp-cs-88.dat +126 -0
- gecatsim/material/edlp/pair/pp-cs-89.dat +127 -0
- gecatsim/material/edlp/pair/pp-cs-9.dat +109 -0
- gecatsim/material/edlp/pair/pp-cs-90.dat +127 -0
- gecatsim/material/edlp/pair/pp-cs-91.dat +127 -0
- gecatsim/material/edlp/pair/pp-cs-92.dat +127 -0
- gecatsim/material/edlp/pair/pp-cs-93.dat +127 -0
- gecatsim/material/edlp/pair/pp-cs-94.dat +126 -0
- gecatsim/material/edlp/pair/pp-cs-95.dat +126 -0
- gecatsim/material/edlp/pair/pp-cs-96.dat +126 -0
- gecatsim/material/edlp/pair/pp-cs-97.dat +126 -0
- gecatsim/material/edlp/pair/pp-cs-98.dat +126 -0
- gecatsim/material/edlp/pair/pp-cs-99.dat +126 -0
- gecatsim/material/edlp/pair/pp-cs-all.dat +0 -0
- gecatsim/material/edlp/phot/pe-cs-1.dat +87 -0
- gecatsim/material/edlp/phot/pe-cs-10.dat +388 -0
- gecatsim/material/edlp/phot/pe-cs-100.dat +1513 -0
- gecatsim/material/edlp/phot/pe-cs-11.dat +603 -0
- gecatsim/material/edlp/phot/pe-cs-12.dat +535 -0
- gecatsim/material/edlp/phot/pe-cs-13.dat +819 -0
- gecatsim/material/edlp/phot/pe-cs-14.dat +759 -0
- gecatsim/material/edlp/phot/pe-cs-15.dat +663 -0
- gecatsim/material/edlp/phot/pe-cs-16.dat +659 -0
- gecatsim/material/edlp/phot/pe-cs-17.dat +701 -0
- gecatsim/material/edlp/phot/pe-cs-18.dat +651 -0
- gecatsim/material/edlp/phot/pe-cs-19.dat +795 -0
- gecatsim/material/edlp/phot/pe-cs-2.dat +97 -0
- gecatsim/material/edlp/phot/pe-cs-20.dat +765 -0
- gecatsim/material/edlp/phot/pe-cs-21.dat +912 -0
- gecatsim/material/edlp/phot/pe-cs-22.dat +948 -0
- gecatsim/material/edlp/phot/pe-cs-23.dat +944 -0
- gecatsim/material/edlp/phot/pe-cs-24.dat +904 -0
- gecatsim/material/edlp/phot/pe-cs-25.dat +905 -0
- gecatsim/material/edlp/phot/pe-cs-26.dat +923 -0
- gecatsim/material/edlp/phot/pe-cs-27.dat +863 -0
- gecatsim/material/edlp/phot/pe-cs-28.dat +931 -0
- gecatsim/material/edlp/phot/pe-cs-29.dat +883 -0
- gecatsim/material/edlp/phot/pe-cs-3.dat +193 -0
- gecatsim/material/edlp/phot/pe-cs-30.dat +883 -0
- gecatsim/material/edlp/phot/pe-cs-31.dat +1018 -0
- gecatsim/material/edlp/phot/pe-cs-32.dat +1039 -0
- gecatsim/material/edlp/phot/pe-cs-33.dat +980 -0
- gecatsim/material/edlp/phot/pe-cs-34.dat +973 -0
- gecatsim/material/edlp/phot/pe-cs-35.dat +996 -0
- gecatsim/material/edlp/phot/pe-cs-36.dat +981 -0
- gecatsim/material/edlp/phot/pe-cs-37.dat +1047 -0
- gecatsim/material/edlp/phot/pe-cs-38.dat +975 -0
- gecatsim/material/edlp/phot/pe-cs-39.dat +1181 -0
- gecatsim/material/edlp/phot/pe-cs-4.dat +188 -0
- gecatsim/material/edlp/phot/pe-cs-40.dat +1169 -0
- gecatsim/material/edlp/phot/pe-cs-41.dat +1202 -0
- gecatsim/material/edlp/phot/pe-cs-42.dat +1181 -0
- gecatsim/material/edlp/phot/pe-cs-43.dat +1192 -0
- gecatsim/material/edlp/phot/pe-cs-44.dat +1217 -0
- gecatsim/material/edlp/phot/pe-cs-45.dat +1218 -0
- gecatsim/material/edlp/phot/pe-cs-46.dat +1070 -0
- gecatsim/material/edlp/phot/pe-cs-47.dat +1209 -0
- gecatsim/material/edlp/phot/pe-cs-48.dat +1202 -0
- gecatsim/material/edlp/phot/pe-cs-49.dat +1334 -0
- gecatsim/material/edlp/phot/pe-cs-5.dat +365 -0
- gecatsim/material/edlp/phot/pe-cs-50.dat +1234 -0
- gecatsim/material/edlp/phot/pe-cs-51.dat +1262 -0
- gecatsim/material/edlp/phot/pe-cs-52.dat +1166 -0
- gecatsim/material/edlp/phot/pe-cs-53.dat +1224 -0
- gecatsim/material/edlp/phot/pe-cs-54.dat +1139 -0
- gecatsim/material/edlp/phot/pe-cs-55.dat +1117 -0
- gecatsim/material/edlp/phot/pe-cs-56.dat +1068 -0
- gecatsim/material/edlp/phot/pe-cs-57.dat +1213 -0
- gecatsim/material/edlp/phot/pe-cs-58.dat +1230 -0
- gecatsim/material/edlp/phot/pe-cs-59.dat +1173 -0
- gecatsim/material/edlp/phot/pe-cs-6.dat +369 -0
- gecatsim/material/edlp/phot/pe-cs-60.dat +1237 -0
- gecatsim/material/edlp/phot/pe-cs-61.dat +1196 -0
- gecatsim/material/edlp/phot/pe-cs-62.dat +1210 -0
- gecatsim/material/edlp/phot/pe-cs-63.dat +1167 -0
- gecatsim/material/edlp/phot/pe-cs-64.dat +1309 -0
- gecatsim/material/edlp/phot/pe-cs-65.dat +1140 -0
- gecatsim/material/edlp/phot/pe-cs-66.dat +1172 -0
- gecatsim/material/edlp/phot/pe-cs-67.dat +1175 -0
- gecatsim/material/edlp/phot/pe-cs-68.dat +1168 -0
- gecatsim/material/edlp/phot/pe-cs-69.dat +1222 -0
- gecatsim/material/edlp/phot/pe-cs-7.dat +367 -0
- gecatsim/material/edlp/phot/pe-cs-70.dat +1217 -0
- gecatsim/material/edlp/phot/pe-cs-71.dat +1341 -0
- gecatsim/material/edlp/phot/pe-cs-72.dat +1317 -0
- gecatsim/material/edlp/phot/pe-cs-73.dat +1270 -0
- gecatsim/material/edlp/phot/pe-cs-74.dat +1295 -0
- gecatsim/material/edlp/phot/pe-cs-75.dat +1257 -0
- gecatsim/material/edlp/phot/pe-cs-76.dat +1295 -0
- gecatsim/material/edlp/phot/pe-cs-77.dat +1196 -0
- gecatsim/material/edlp/phot/pe-cs-78.dat +1198 -0
- gecatsim/material/edlp/phot/pe-cs-79.dat +1276 -0
- gecatsim/material/edlp/phot/pe-cs-8.dat +396 -0
- gecatsim/material/edlp/phot/pe-cs-80.dat +1205 -0
- gecatsim/material/edlp/phot/pe-cs-81.dat +1380 -0
- gecatsim/material/edlp/phot/pe-cs-82.dat +1355 -0
- gecatsim/material/edlp/phot/pe-cs-83.dat +1386 -0
- gecatsim/material/edlp/phot/pe-cs-84.dat +1366 -0
- gecatsim/material/edlp/phot/pe-cs-85.dat +1379 -0
- gecatsim/material/edlp/phot/pe-cs-86.dat +1342 -0
- gecatsim/material/edlp/phot/pe-cs-87.dat +1390 -0
- gecatsim/material/edlp/phot/pe-cs-88.dat +1248 -0
- gecatsim/material/edlp/phot/pe-cs-89.dat +1288 -0
- gecatsim/material/edlp/phot/pe-cs-9.dat +384 -0
- gecatsim/material/edlp/phot/pe-cs-90.dat +1400 -0
- gecatsim/material/edlp/phot/pe-cs-91.dat +1517 -0
- gecatsim/material/edlp/phot/pe-cs-92.dat +1571 -0
- gecatsim/material/edlp/phot/pe-cs-93.dat +1602 -0
- gecatsim/material/edlp/phot/pe-cs-94.dat +1432 -0
- gecatsim/material/edlp/phot/pe-cs-95.dat +1456 -0
- gecatsim/material/edlp/phot/pe-cs-96.dat +1494 -0
- gecatsim/material/edlp/phot/pe-cs-97.dat +1522 -0
- gecatsim/material/edlp/phot/pe-cs-98.dat +1498 -0
- gecatsim/material/edlp/phot/pe-cs-99.dat +1573 -0
- gecatsim/material/edlp/phot/pe-cs-all.dat +0 -0
- gecatsim/material/edlp/phot/pe-ss-cs-1.dat +88 -0
- gecatsim/material/edlp/phot/pe-ss-cs-10.dat +474 -0
- gecatsim/material/edlp/phot/pe-ss-cs-100.dat +2821 -0
- gecatsim/material/edlp/phot/pe-ss-cs-11.dat +717 -0
- gecatsim/material/edlp/phot/pe-ss-cs-12.dat +693 -0
- gecatsim/material/edlp/phot/pe-ss-cs-13.dat +978 -0
- gecatsim/material/edlp/phot/pe-ss-cs-14.dat +941 -0
- gecatsim/material/edlp/phot/pe-ss-cs-15.dat +884 -0
- gecatsim/material/edlp/phot/pe-ss-cs-16.dat +861 -0
- gecatsim/material/edlp/phot/pe-ss-cs-17.dat +870 -0
- gecatsim/material/edlp/phot/pe-ss-cs-18.dat +853 -0
- gecatsim/material/edlp/phot/pe-ss-cs-19.dat +993 -0
- gecatsim/material/edlp/phot/pe-ss-cs-2.dat +98 -0
- gecatsim/material/edlp/phot/pe-ss-cs-20.dat +959 -0
- gecatsim/material/edlp/phot/pe-ss-cs-21.dat +1233 -0
- gecatsim/material/edlp/phot/pe-ss-cs-22.dat +1227 -0
- gecatsim/material/edlp/phot/pe-ss-cs-23.dat +1225 -0
- gecatsim/material/edlp/phot/pe-ss-cs-24.dat +1250 -0
- gecatsim/material/edlp/phot/pe-ss-cs-25.dat +1209 -0
- gecatsim/material/edlp/phot/pe-ss-cs-26.dat +1209 -0
- gecatsim/material/edlp/phot/pe-ss-cs-27.dat +1200 -0
- gecatsim/material/edlp/phot/pe-ss-cs-28.dat +1198 -0
- gecatsim/material/edlp/phot/pe-ss-cs-29.dat +1204 -0
- gecatsim/material/edlp/phot/pe-ss-cs-3.dat +207 -0
- gecatsim/material/edlp/phot/pe-ss-cs-30.dat +1199 -0
- gecatsim/material/edlp/phot/pe-ss-cs-31.dat +1471 -0
- gecatsim/material/edlp/phot/pe-ss-cs-32.dat +1456 -0
- gecatsim/material/edlp/phot/pe-ss-cs-33.dat +1419 -0
- gecatsim/material/edlp/phot/pe-ss-cs-34.dat +1425 -0
- gecatsim/material/edlp/phot/pe-ss-cs-35.dat +1392 -0
- gecatsim/material/edlp/phot/pe-ss-cs-36.dat +1395 -0
- gecatsim/material/edlp/phot/pe-ss-cs-37.dat +1460 -0
- gecatsim/material/edlp/phot/pe-ss-cs-38.dat +1407 -0
- gecatsim/material/edlp/phot/pe-ss-cs-39.dat +1819 -0
- gecatsim/material/edlp/phot/pe-ss-cs-4.dat +211 -0
- gecatsim/material/edlp/phot/pe-ss-cs-40.dat +1807 -0
- gecatsim/material/edlp/phot/pe-ss-cs-41.dat +1811 -0
- gecatsim/material/edlp/phot/pe-ss-cs-42.dat +1818 -0
- gecatsim/material/edlp/phot/pe-ss-cs-43.dat +1792 -0
- gecatsim/material/edlp/phot/pe-ss-cs-44.dat +1781 -0
- gecatsim/material/edlp/phot/pe-ss-cs-45.dat +1788 -0
- gecatsim/material/edlp/phot/pe-ss-cs-46.dat +1611 -0
- gecatsim/material/edlp/phot/pe-ss-cs-47.dat +1771 -0
- gecatsim/material/edlp/phot/pe-ss-cs-48.dat +1782 -0
- gecatsim/material/edlp/phot/pe-ss-cs-49.dat +2033 -0
- gecatsim/material/edlp/phot/pe-ss-cs-5.dat +431 -0
- gecatsim/material/edlp/phot/pe-ss-cs-50.dat +1943 -0
- gecatsim/material/edlp/phot/pe-ss-cs-51.dat +1918 -0
- gecatsim/material/edlp/phot/pe-ss-cs-52.dat +1879 -0
- gecatsim/material/edlp/phot/pe-ss-cs-53.dat +1861 -0
- gecatsim/material/edlp/phot/pe-ss-cs-54.dat +1782 -0
- gecatsim/material/edlp/phot/pe-ss-cs-55.dat +1855 -0
- gecatsim/material/edlp/phot/pe-ss-cs-56.dat +1813 -0
- gecatsim/material/edlp/phot/pe-ss-cs-57.dat +2144 -0
- gecatsim/material/edlp/phot/pe-ss-cs-58.dat +2090 -0
- gecatsim/material/edlp/phot/pe-ss-cs-59.dat +2071 -0
- gecatsim/material/edlp/phot/pe-ss-cs-6.dat +436 -0
- gecatsim/material/edlp/phot/pe-ss-cs-60.dat +2066 -0
- gecatsim/material/edlp/phot/pe-ss-cs-61.dat +2064 -0
- gecatsim/material/edlp/phot/pe-ss-cs-62.dat +2063 -0
- gecatsim/material/edlp/phot/pe-ss-cs-63.dat +2043 -0
- gecatsim/material/edlp/phot/pe-ss-cs-64.dat +2405 -0
- gecatsim/material/edlp/phot/pe-ss-cs-65.dat +2035 -0
- gecatsim/material/edlp/phot/pe-ss-cs-66.dat +2023 -0
- gecatsim/material/edlp/phot/pe-ss-cs-67.dat +2026 -0
- gecatsim/material/edlp/phot/pe-ss-cs-68.dat +2029 -0
- gecatsim/material/edlp/phot/pe-ss-cs-69.dat +2018 -0
- gecatsim/material/edlp/phot/pe-ss-cs-7.dat +440 -0
- gecatsim/material/edlp/phot/pe-ss-cs-70.dat +2048 -0
- gecatsim/material/edlp/phot/pe-ss-cs-71.dat +2348 -0
- gecatsim/material/edlp/phot/pe-ss-cs-72.dat +2333 -0
- gecatsim/material/edlp/phot/pe-ss-cs-73.dat +2320 -0
- gecatsim/material/edlp/phot/pe-ss-cs-74.dat +2313 -0
- gecatsim/material/edlp/phot/pe-ss-cs-75.dat +2290 -0
- gecatsim/material/edlp/phot/pe-ss-cs-76.dat +2280 -0
- gecatsim/material/edlp/phot/pe-ss-cs-77.dat +2145 -0
- gecatsim/material/edlp/phot/pe-ss-cs-78.dat +2268 -0
- gecatsim/material/edlp/phot/pe-ss-cs-79.dat +2262 -0
- gecatsim/material/edlp/phot/pe-ss-cs-8.dat +445 -0
- gecatsim/material/edlp/phot/pe-ss-cs-80.dat +2271 -0
- gecatsim/material/edlp/phot/pe-ss-cs-81.dat +2497 -0
- gecatsim/material/edlp/phot/pe-ss-cs-82.dat +2494 -0
- gecatsim/material/edlp/phot/pe-ss-cs-83.dat +2467 -0
- gecatsim/material/edlp/phot/pe-ss-cs-84.dat +2453 -0
- gecatsim/material/edlp/phot/pe-ss-cs-85.dat +2423 -0
- gecatsim/material/edlp/phot/pe-ss-cs-86.dat +2379 -0
- gecatsim/material/edlp/phot/pe-ss-cs-87.dat +2451 -0
- gecatsim/material/edlp/phot/pe-ss-cs-88.dat +2367 -0
- gecatsim/material/edlp/phot/pe-ss-cs-89.dat +2696 -0
- gecatsim/material/edlp/phot/pe-ss-cs-9.dat +457 -0
- gecatsim/material/edlp/phot/pe-ss-cs-90.dat +2694 -0
- gecatsim/material/edlp/phot/pe-ss-cs-91.dat +3131 -0
- gecatsim/material/edlp/phot/pe-ss-cs-92.dat +3130 -0
- gecatsim/material/edlp/phot/pe-ss-cs-93.dat +3142 -0
- gecatsim/material/edlp/phot/pe-ss-cs-94.dat +2794 -0
- gecatsim/material/edlp/phot/pe-ss-cs-95.dat +2810 -0
- gecatsim/material/edlp/phot/pe-ss-cs-96.dat +3103 -0
- gecatsim/material/edlp/phot/pe-ss-cs-97.dat +3126 -0
- gecatsim/material/edlp/phot/pe-ss-cs-98.dat +2835 -0
- gecatsim/material/edlp/phot/pe-ss-cs-99.dat +2851 -0
- gecatsim/material/edlp/rayl/re-cs-1.dat +375 -0
- gecatsim/material/edlp/rayl/re-cs-10.dat +453 -0
- gecatsim/material/edlp/rayl/re-cs-100.dat +1555 -0
- gecatsim/material/edlp/rayl/re-cs-11.dat +607 -0
- gecatsim/material/edlp/rayl/re-cs-12.dat +561 -0
- gecatsim/material/edlp/rayl/re-cs-13.dat +903 -0
- gecatsim/material/edlp/rayl/re-cs-14.dat +830 -0
- gecatsim/material/edlp/rayl/re-cs-15.dat +745 -0
- gecatsim/material/edlp/rayl/re-cs-16.dat +698 -0
- gecatsim/material/edlp/rayl/re-cs-17.dat +666 -0
- gecatsim/material/edlp/rayl/re-cs-18.dat +597 -0
- gecatsim/material/edlp/rayl/re-cs-19.dat +760 -0
- gecatsim/material/edlp/rayl/re-cs-2.dat +343 -0
- gecatsim/material/edlp/rayl/re-cs-20.dat +796 -0
- gecatsim/material/edlp/rayl/re-cs-21.dat +869 -0
- gecatsim/material/edlp/rayl/re-cs-22.dat +869 -0
- gecatsim/material/edlp/rayl/re-cs-23.dat +839 -0
- gecatsim/material/edlp/rayl/re-cs-24.dat +826 -0
- gecatsim/material/edlp/rayl/re-cs-25.dat +914 -0
- gecatsim/material/edlp/rayl/re-cs-26.dat +913 -0
- gecatsim/material/edlp/rayl/re-cs-27.dat +901 -0
- gecatsim/material/edlp/rayl/re-cs-28.dat +888 -0
- gecatsim/material/edlp/rayl/re-cs-29.dat +844 -0
- gecatsim/material/edlp/rayl/re-cs-3.dat +517 -0
- gecatsim/material/edlp/rayl/re-cs-30.dat +801 -0
- gecatsim/material/edlp/rayl/re-cs-31.dat +1202 -0
- gecatsim/material/edlp/rayl/re-cs-32.dat +1113 -0
- gecatsim/material/edlp/rayl/re-cs-33.dat +1010 -0
- gecatsim/material/edlp/rayl/re-cs-34.dat +928 -0
- gecatsim/material/edlp/rayl/re-cs-35.dat +894 -0
- gecatsim/material/edlp/rayl/re-cs-36.dat +719 -0
- gecatsim/material/edlp/rayl/re-cs-37.dat +892 -0
- gecatsim/material/edlp/rayl/re-cs-38.dat +891 -0
- gecatsim/material/edlp/rayl/re-cs-39.dat +906 -0
- gecatsim/material/edlp/rayl/re-cs-4.dat +493 -0
- gecatsim/material/edlp/rayl/re-cs-40.dat +930 -0
- gecatsim/material/edlp/rayl/re-cs-41.dat +918 -0
- gecatsim/material/edlp/rayl/re-cs-42.dat +1068 -0
- gecatsim/material/edlp/rayl/re-cs-43.dat +1085 -0
- gecatsim/material/edlp/rayl/re-cs-44.dat +1085 -0
- gecatsim/material/edlp/rayl/re-cs-45.dat +1124 -0
- gecatsim/material/edlp/rayl/re-cs-46.dat +853 -0
- gecatsim/material/edlp/rayl/re-cs-47.dat +1087 -0
- gecatsim/material/edlp/rayl/re-cs-48.dat +1001 -0
- gecatsim/material/edlp/rayl/re-cs-49.dat +1508 -0
- gecatsim/material/edlp/rayl/re-cs-5.dat +619 -0
- gecatsim/material/edlp/rayl/re-cs-50.dat +1370 -0
- gecatsim/material/edlp/rayl/re-cs-51.dat +1234 -0
- gecatsim/material/edlp/rayl/re-cs-52.dat +1138 -0
- gecatsim/material/edlp/rayl/re-cs-53.dat +1062 -0
- gecatsim/material/edlp/rayl/re-cs-54.dat +925 -0
- gecatsim/material/edlp/rayl/re-cs-55.dat +1130 -0
- gecatsim/material/edlp/rayl/re-cs-56.dat +1176 -0
- gecatsim/material/edlp/rayl/re-cs-57.dat +1172 -0
- gecatsim/material/edlp/rayl/re-cs-58.dat +1243 -0
- gecatsim/material/edlp/rayl/re-cs-59.dat +1232 -0
- gecatsim/material/edlp/rayl/re-cs-6.dat +647 -0
- gecatsim/material/edlp/rayl/re-cs-60.dat +1195 -0
- gecatsim/material/edlp/rayl/re-cs-61.dat +1229 -0
- gecatsim/material/edlp/rayl/re-cs-62.dat +1297 -0
- gecatsim/material/edlp/rayl/re-cs-63.dat +1324 -0
- gecatsim/material/edlp/rayl/re-cs-64.dat +1384 -0
- gecatsim/material/edlp/rayl/re-cs-65.dat +1356 -0
- gecatsim/material/edlp/rayl/re-cs-66.dat +1401 -0
- gecatsim/material/edlp/rayl/re-cs-67.dat +1374 -0
- gecatsim/material/edlp/rayl/re-cs-68.dat +1264 -0
- gecatsim/material/edlp/rayl/re-cs-69.dat +1327 -0
- gecatsim/material/edlp/rayl/re-cs-7.dat +669 -0
- gecatsim/material/edlp/rayl/re-cs-70.dat +1243 -0
- gecatsim/material/edlp/rayl/re-cs-71.dat +1384 -0
- gecatsim/material/edlp/rayl/re-cs-72.dat +1338 -0
- gecatsim/material/edlp/rayl/re-cs-73.dat +1181 -0
- gecatsim/material/edlp/rayl/re-cs-74.dat +1009 -0
- gecatsim/material/edlp/rayl/re-cs-75.dat +1138 -0
- gecatsim/material/edlp/rayl/re-cs-76.dat +1106 -0
- gecatsim/material/edlp/rayl/re-cs-77.dat +1040 -0
- gecatsim/material/edlp/rayl/re-cs-78.dat +1176 -0
- gecatsim/material/edlp/rayl/re-cs-79.dat +1123 -0
- gecatsim/material/edlp/rayl/re-cs-8.dat +662 -0
- gecatsim/material/edlp/rayl/re-cs-80.dat +1126 -0
- gecatsim/material/edlp/rayl/re-cs-81.dat +1668 -0
- gecatsim/material/edlp/rayl/re-cs-82.dat +1641 -0
- gecatsim/material/edlp/rayl/re-cs-83.dat +1448 -0
- gecatsim/material/edlp/rayl/re-cs-84.dat +1338 -0
- gecatsim/material/edlp/rayl/re-cs-85.dat +1236 -0
- gecatsim/material/edlp/rayl/re-cs-86.dat +1099 -0
- gecatsim/material/edlp/rayl/re-cs-87.dat +1368 -0
- gecatsim/material/edlp/rayl/re-cs-88.dat +1448 -0
- gecatsim/material/edlp/rayl/re-cs-89.dat +1592 -0
- gecatsim/material/edlp/rayl/re-cs-9.dat +584 -0
- gecatsim/material/edlp/rayl/re-cs-90.dat +1504 -0
- gecatsim/material/edlp/rayl/re-cs-91.dat +1547 -0
- gecatsim/material/edlp/rayl/re-cs-92.dat +1633 -0
- gecatsim/material/edlp/rayl/re-cs-93.dat +1625 -0
- gecatsim/material/edlp/rayl/re-cs-94.dat +1427 -0
- gecatsim/material/edlp/rayl/re-cs-95.dat +1465 -0
- gecatsim/material/edlp/rayl/re-cs-96.dat +1794 -0
- gecatsim/material/edlp/rayl/re-cs-97.dat +1638 -0
- gecatsim/material/edlp/rayl/re-cs-98.dat +1554 -0
- gecatsim/material/edlp/rayl/re-cs-99.dat +1528 -0
- gecatsim/material/edlp/rayl/re-cs-all.dat +0 -0
- gecatsim/material/edlp/rayl/re-ff-1.dat +103 -0
- gecatsim/material/edlp/rayl/re-ff-10.dat +175 -0
- gecatsim/material/edlp/rayl/re-ff-100.dat +146 -0
- gecatsim/material/edlp/rayl/re-ff-11.dat +183 -0
- gecatsim/material/edlp/rayl/re-ff-12.dat +176 -0
- gecatsim/material/edlp/rayl/re-ff-13.dat +162 -0
- gecatsim/material/edlp/rayl/re-ff-14.dat +166 -0
- gecatsim/material/edlp/rayl/re-ff-15.dat +162 -0
- gecatsim/material/edlp/rayl/re-ff-16.dat +161 -0
- gecatsim/material/edlp/rayl/re-ff-17.dat +165 -0
- gecatsim/material/edlp/rayl/re-ff-18.dat +157 -0
- gecatsim/material/edlp/rayl/re-ff-19.dat +163 -0
- gecatsim/material/edlp/rayl/re-ff-2.dat +140 -0
- gecatsim/material/edlp/rayl/re-ff-20.dat +164 -0
- gecatsim/material/edlp/rayl/re-ff-21.dat +158 -0
- gecatsim/material/edlp/rayl/re-ff-22.dat +159 -0
- gecatsim/material/edlp/rayl/re-ff-23.dat +158 -0
- gecatsim/material/edlp/rayl/re-ff-24.dat +165 -0
- gecatsim/material/edlp/rayl/re-ff-25.dat +160 -0
- gecatsim/material/edlp/rayl/re-ff-26.dat +163 -0
- gecatsim/material/edlp/rayl/re-ff-27.dat +161 -0
- gecatsim/material/edlp/rayl/re-ff-28.dat +169 -0
- gecatsim/material/edlp/rayl/re-ff-29.dat +163 -0
- gecatsim/material/edlp/rayl/re-ff-3.dat +145 -0
- gecatsim/material/edlp/rayl/re-ff-30.dat +164 -0
- gecatsim/material/edlp/rayl/re-ff-31.dat +162 -0
- gecatsim/material/edlp/rayl/re-ff-32.dat +164 -0
- gecatsim/material/edlp/rayl/re-ff-33.dat +163 -0
- gecatsim/material/edlp/rayl/re-ff-34.dat +165 -0
- gecatsim/material/edlp/rayl/re-ff-35.dat +163 -0
- gecatsim/material/edlp/rayl/re-ff-36.dat +154 -0
- gecatsim/material/edlp/rayl/re-ff-37.dat +156 -0
- gecatsim/material/edlp/rayl/re-ff-38.dat +157 -0
- gecatsim/material/edlp/rayl/re-ff-39.dat +157 -0
- gecatsim/material/edlp/rayl/re-ff-4.dat +147 -0
- gecatsim/material/edlp/rayl/re-ff-40.dat +166 -0
- gecatsim/material/edlp/rayl/re-ff-41.dat +168 -0
- gecatsim/material/edlp/rayl/re-ff-42.dat +163 -0
- gecatsim/material/edlp/rayl/re-ff-43.dat +160 -0
- gecatsim/material/edlp/rayl/re-ff-44.dat +156 -0
- gecatsim/material/edlp/rayl/re-ff-45.dat +156 -0
- gecatsim/material/edlp/rayl/re-ff-46.dat +158 -0
- gecatsim/material/edlp/rayl/re-ff-47.dat +158 -0
- gecatsim/material/edlp/rayl/re-ff-48.dat +160 -0
- gecatsim/material/edlp/rayl/re-ff-49.dat +161 -0
- gecatsim/material/edlp/rayl/re-ff-5.dat +144 -0
- gecatsim/material/edlp/rayl/re-ff-50.dat +154 -0
- gecatsim/material/edlp/rayl/re-ff-51.dat +152 -0
- gecatsim/material/edlp/rayl/re-ff-52.dat +154 -0
- gecatsim/material/edlp/rayl/re-ff-53.dat +159 -0
- gecatsim/material/edlp/rayl/re-ff-54.dat +159 -0
- gecatsim/material/edlp/rayl/re-ff-55.dat +154 -0
- gecatsim/material/edlp/rayl/re-ff-56.dat +157 -0
- gecatsim/material/edlp/rayl/re-ff-57.dat +164 -0
- gecatsim/material/edlp/rayl/re-ff-58.dat +163 -0
- gecatsim/material/edlp/rayl/re-ff-59.dat +158 -0
- gecatsim/material/edlp/rayl/re-ff-6.dat +151 -0
- gecatsim/material/edlp/rayl/re-ff-60.dat +153 -0
- gecatsim/material/edlp/rayl/re-ff-61.dat +165 -0
- gecatsim/material/edlp/rayl/re-ff-62.dat +165 -0
- gecatsim/material/edlp/rayl/re-ff-63.dat +156 -0
- gecatsim/material/edlp/rayl/re-ff-64.dat +162 -0
- gecatsim/material/edlp/rayl/re-ff-65.dat +159 -0
- gecatsim/material/edlp/rayl/re-ff-66.dat +154 -0
- gecatsim/material/edlp/rayl/re-ff-67.dat +164 -0
- gecatsim/material/edlp/rayl/re-ff-68.dat +155 -0
- gecatsim/material/edlp/rayl/re-ff-69.dat +160 -0
- gecatsim/material/edlp/rayl/re-ff-7.dat +170 -0
- gecatsim/material/edlp/rayl/re-ff-70.dat +165 -0
- gecatsim/material/edlp/rayl/re-ff-71.dat +158 -0
- gecatsim/material/edlp/rayl/re-ff-72.dat +159 -0
- gecatsim/material/edlp/rayl/re-ff-73.dat +161 -0
- gecatsim/material/edlp/rayl/re-ff-74.dat +160 -0
- gecatsim/material/edlp/rayl/re-ff-75.dat +157 -0
- gecatsim/material/edlp/rayl/re-ff-76.dat +151 -0
- gecatsim/material/edlp/rayl/re-ff-77.dat +148 -0
- gecatsim/material/edlp/rayl/re-ff-78.dat +146 -0
- gecatsim/material/edlp/rayl/re-ff-79.dat +144 -0
- gecatsim/material/edlp/rayl/re-ff-8.dat +172 -0
- gecatsim/material/edlp/rayl/re-ff-80.dat +149 -0
- gecatsim/material/edlp/rayl/re-ff-81.dat +154 -0
- gecatsim/material/edlp/rayl/re-ff-82.dat +150 -0
- gecatsim/material/edlp/rayl/re-ff-83.dat +155 -0
- gecatsim/material/edlp/rayl/re-ff-84.dat +152 -0
- gecatsim/material/edlp/rayl/re-ff-85.dat +158 -0
- gecatsim/material/edlp/rayl/re-ff-86.dat +150 -0
- gecatsim/material/edlp/rayl/re-ff-87.dat +150 -0
- gecatsim/material/edlp/rayl/re-ff-88.dat +149 -0
- gecatsim/material/edlp/rayl/re-ff-89.dat +147 -0
- gecatsim/material/edlp/rayl/re-ff-9.dat +180 -0
- gecatsim/material/edlp/rayl/re-ff-90.dat +149 -0
- gecatsim/material/edlp/rayl/re-ff-91.dat +147 -0
- gecatsim/material/edlp/rayl/re-ff-92.dat +153 -0
- gecatsim/material/edlp/rayl/re-ff-93.dat +148 -0
- gecatsim/material/edlp/rayl/re-ff-94.dat +150 -0
- gecatsim/material/edlp/rayl/re-ff-95.dat +147 -0
- gecatsim/material/edlp/rayl/re-ff-96.dat +147 -0
- gecatsim/material/edlp/rayl/re-ff-97.dat +146 -0
- gecatsim/material/edlp/rayl/re-ff-98.dat +148 -0
- gecatsim/material/edlp/rayl/re-ff-99.dat +148 -0
- gecatsim/material/edlp/rayl/re-ff-all.dat +0 -0
- gecatsim/material/graphite +13 -0
- gecatsim/material/ncat_adipose +19 -0
- gecatsim/material/ncat_air +18 -0
- gecatsim/material/ncat_aluminum +14 -0
- gecatsim/material/ncat_bladder +23 -0
- gecatsim/material/ncat_blood +24 -0
- gecatsim/material/ncat_blood_with_0_7pct_iodine +25 -0
- gecatsim/material/ncat_blood_with_0_8pct_iodine +25 -0
- gecatsim/material/ncat_blood_with_0_9pct_iodine +25 -0
- gecatsim/material/ncat_blood_with_1_0pct_iodine +25 -0
- gecatsim/material/ncat_blood_with_1_1pct_iodine +25 -0
- gecatsim/material/ncat_blood_with_2_0pct_iodine +25 -0
- gecatsim/material/ncat_blood_with_3_0pct_iodine +25 -0
- gecatsim/material/ncat_brain +23 -0
- gecatsim/material/ncat_breast_mammary +22 -0
- gecatsim/material/ncat_cartilage +22 -0
- gecatsim/material/ncat_dry_rib +23 -0
- gecatsim/material/ncat_dry_spine +24 -0
- gecatsim/material/ncat_eye_lens +22 -0
- gecatsim/material/ncat_graphite +14 -0
- gecatsim/material/ncat_heart +23 -0
- gecatsim/material/ncat_intestine +23 -0
- gecatsim/material/ncat_iodine +14 -0
- gecatsim/material/ncat_iodine_blood +25 -0
- gecatsim/material/ncat_iron +14 -0
- gecatsim/material/ncat_kidney +24 -0
- gecatsim/material/ncat_lead +14 -0
- gecatsim/material/ncat_liver +23 -0
- gecatsim/material/ncat_lung +23 -0
- gecatsim/material/ncat_lymph +21 -0
- gecatsim/material/ncat_muscle +23 -0
- gecatsim/material/ncat_ovary +23 -0
- gecatsim/material/ncat_pancreas +23 -0
- gecatsim/material/ncat_pmma +17 -0
- gecatsim/material/ncat_red_marrow +23 -0
- gecatsim/material/ncat_skin +23 -0
- gecatsim/material/ncat_skull +23 -0
- gecatsim/material/ncat_spleen +23 -0
- gecatsim/material/ncat_testis +23 -0
- gecatsim/material/ncat_thyroid +24 -0
- gecatsim/material/ncat_titanium +14 -0
- gecatsim/material/ncat_water +16 -0
- gecatsim/material/ncat_yellow_marrow +21 -0
- gecatsim/material/plexi +21 -0
- gecatsim/material/polyethylene +14 -0
- gecatsim/material/polyethylene_HDPE +16 -0
- gecatsim/material/polyethylene_LDPE +16 -0
- gecatsim/material/polyethylene_MDPE +16 -0
- gecatsim/material/polyethylene_legacy +20 -0
- gecatsim/material/polystyrene +18 -0
- gecatsim/material/polystyrene_legacy +21 -0
- gecatsim/material/pvc_legacy +22 -0
- gecatsim/material/water +16 -0
- gecatsim/material/water_20C +16 -0
- gecatsim/material/water_20C_NaCl_0p9_pct +18 -0
- gecatsim/material/water_20C_iodine_100mg +17 -0
- gecatsim/material/water_20C_iodine_10mg +17 -0
- gecatsim/material/water_20C_iodine_15mg +17 -0
- gecatsim/material/water_20C_iodine_1mg +17 -0
- gecatsim/material/water_20C_iodine_20mg +17 -0
- gecatsim/material/water_20C_iodine_2mg +17 -0
- gecatsim/material/water_20C_iodine_30mg +17 -0
- gecatsim/material/water_20C_iodine_40mg +17 -0
- gecatsim/material/water_20C_iodine_50mg +17 -0
- gecatsim/material/water_20C_iodine_5mg +17 -0
- gecatsim/material/water_37C +16 -0
- gecatsim/phantom/CTDI_16cm_WaterAirPEBoneChambers.ppm +62 -0
- gecatsim/phantom/CatSimLogo_1024/CatSimLogo_1024_128mmZ.json +51 -0
- gecatsim/phantom/CatSimLogo_1024/CatSim_logo_1024.json +51 -0
- gecatsim/phantom/CatSimLogo_1024/CatSim_logo_1024_bone_1024x1024x1.raw +0 -0
- gecatsim/phantom/CatSimLogo_1024/CatSim_logo_1024_water_1024x1024x1.raw +0 -0
- gecatsim/phantom/W20.ppm +22 -0
- gecatsim/phantom/W30.ppm +22 -0
- gecatsim/phantom/W35.ppm +22 -0
- gecatsim/phantom/analyticArtifactPhantom.ppm +41 -0
- gecatsim/phantom/female_adult_average_lung_lesions_reduced.nrb +49874 -0
- gecatsim/phantom/poly_bin/poly10 +0 -0
- gecatsim/phantom/poly_bin/poly100 +0 -0
- gecatsim/phantom/poly_bin/poly12 +0 -0
- gecatsim/phantom/poly_bin/poly14 +0 -0
- gecatsim/phantom/poly_bin/poly17 +0 -0
- gecatsim/phantom/poly_bin/poly20 +0 -0
- gecatsim/phantom/poly_bin/poly21 +0 -0
- gecatsim/phantom/poly_bin/poly22 +0 -0
- gecatsim/phantom/poly_bin/poly23 +0 -0
- gecatsim/phantom/poly_bin/poly24 +0 -0
- gecatsim/phantom/poly_bin/poly25 +0 -0
- gecatsim/phantom/poly_bin/poly26 +0 -0
- gecatsim/phantom/poly_bin/poly28 +0 -0
- gecatsim/phantom/poly_bin/poly32 +0 -0
- gecatsim/phantom/poly_bin/poly33 +0 -0
- gecatsim/phantom/poly_bin/poly34 +0 -0
- gecatsim/phantom/poly_bin/poly36 +0 -0
- gecatsim/phantom/poly_bin/poly38 +0 -0
- gecatsim/phantom/poly_bin/poly4 +0 -0
- gecatsim/phantom/poly_bin/poly40 +0 -0
- gecatsim/phantom/poly_bin/poly41 +0 -0
- gecatsim/phantom/poly_bin/poly44 +0 -0
- gecatsim/phantom/poly_bin/poly49 +0 -0
- gecatsim/phantom/poly_bin/poly5 +0 -0
- gecatsim/phantom/poly_bin/poly50 +0 -0
- gecatsim/phantom/poly_bin/poly52 +0 -0
- gecatsim/phantom/poly_bin/poly55 +0 -0
- gecatsim/phantom/poly_bin/poly58 +0 -0
- gecatsim/phantom/poly_bin/poly6 +0 -0
- gecatsim/phantom/poly_bin/poly60 +0 -0
- gecatsim/phantom/poly_bin/poly62 +0 -0
- gecatsim/phantom/poly_bin/poly66 +0 -0
- gecatsim/phantom/poly_bin/poly68 +0 -0
- gecatsim/phantom/poly_bin/poly7 +0 -0
- gecatsim/phantom/poly_bin/poly71 +0 -0
- gecatsim/phantom/poly_bin/poly75 +0 -0
- gecatsim/phantom/poly_bin/poly77 +0 -0
- gecatsim/phantom/poly_bin/poly79 +0 -0
- gecatsim/phantom/poly_bin/poly86 +0 -0
- gecatsim/phantom/poly_bin/poly9 +0 -0
- gecatsim/phantom/poly_bin/poly92 +0 -0
- gecatsim/phantom/poly_bin/poly96 +0 -0
- gecatsim/phantom/tungsten_wire.ppm +12 -0
- gecatsim/phantom/vmale50_chest_less_surfaces.nrb +41545 -0
- gecatsim/pyfiles/C_DD3Proj.py +57 -0
- gecatsim/pyfiles/C_DD3Proj_mm.py +64 -0
- gecatsim/pyfiles/C_Materials_CrossSectionDB_Initialize.py +18 -0
- gecatsim/pyfiles/C_Materials_CrossSectionMAC_ByProc_Get.py +25 -0
- gecatsim/pyfiles/C_Phantom_Analytic_FORBILD_to_tmp.py +13 -0
- gecatsim/pyfiles/C_Projector_Analytic.py +62 -0
- gecatsim/pyfiles/C_Projector_NCAT.py +66 -0
- gecatsim/pyfiles/C_Projector_Polygon.py +60 -0
- gecatsim/pyfiles/C_Projector_SetData.py +166 -0
- gecatsim/pyfiles/C_Projector_Voxelized.py +75 -0
- gecatsim/pyfiles/C_Source_Analytic_Set.py +17 -0
- gecatsim/pyfiles/C_Source_NCAT_Set.py +17 -0
- gecatsim/pyfiles/C_Source_Voxelized_Set.py +17 -0
- gecatsim/pyfiles/C_Volume_Get.py +24 -0
- gecatsim/pyfiles/C_Volume_NCAT_Get.py +24 -0
- gecatsim/pyfiles/C_Volume_Poly_Get.py +24 -0
- gecatsim/pyfiles/CalcCrossTalk.py +42 -0
- gecatsim/pyfiles/CalcOptCrossTalk.py +39 -0
- gecatsim/pyfiles/CatSim.py +88 -0
- gecatsim/pyfiles/CheckModules.py +59 -0
- gecatsim/pyfiles/Check_Replace_Old_Names.py +85 -0
- gecatsim/pyfiles/CommonTools.py +445 -0
- gecatsim/pyfiles/Detection_DAS.py +25 -0
- gecatsim/pyfiles/Detection_EI.py +84 -0
- gecatsim/pyfiles/Detection_Flux.py +47 -0
- gecatsim/pyfiles/Detection_Lag.py +28 -0
- gecatsim/pyfiles/Detection_PC.py +120 -0
- gecatsim/pyfiles/Detection_prefilter.py +35 -0
- gecatsim/pyfiles/Detector_RayAngles_2D.py +86 -0
- gecatsim/pyfiles/Detector_ThirdgenCurved.py +119 -0
- gecatsim/pyfiles/FlatPanel/Detection_DAS_FlatPanel.py +101 -0
- gecatsim/pyfiles/FlatPanel/Detection_OpticalCrosstalk_FlatPanel.py +39 -0
- gecatsim/pyfiles/FlatPanel/Detector_FlatPanel.py +120 -0
- gecatsim/pyfiles/Gantry_Helical.py +56 -0
- gecatsim/pyfiles/GetMu.py +68 -0
- gecatsim/pyfiles/LowSignalCorr.py +32 -0
- gecatsim/pyfiles/OneScan.py +144 -0
- gecatsim/pyfiles/PhantomProjectorWrapper.py +65 -0
- gecatsim/pyfiles/Phantom_Analytic.py +936 -0
- gecatsim/pyfiles/Phantom_CAD_to_Polygonal.py +82 -0
- gecatsim/pyfiles/Phantom_NCAT.py +96 -0
- gecatsim/pyfiles/Phantom_Polygonal.py +122 -0
- gecatsim/pyfiles/Phantom_Polygonal_ReadPolygon.py +58 -0
- gecatsim/pyfiles/Phantom_Voxelized.py +120 -0
- gecatsim/pyfiles/PrepView.py +56 -0
- gecatsim/pyfiles/Prep_BHC_Accurate.py +69 -0
- gecatsim/pyfiles/ReadMaterialFile.py +29 -0
- gecatsim/pyfiles/Scatter_ConvolutionModel.py +44 -0
- gecatsim/pyfiles/Scatter_Correction.py +52 -0
- gecatsim/pyfiles/SetFocalspot.py +239 -0
- gecatsim/pyfiles/Spectrum.py +130 -0
- gecatsim/pyfiles/Spectrum_heel.py +146 -0
- gecatsim/pyfiles/WriteRawView.py +32 -0
- gecatsim/pyfiles/WriteRawViewChunk.py +40 -0
- gecatsim/pyfiles/Xray_Filter.py +93 -0
- gecatsim/pyfiles/__init__.py +0 -0
- gecatsim/pyfiles/catvoxel.py +161 -0
- gecatsim/pyfiles/randpf.py +27 -0
- gecatsim/reconstruction/lib/fdk_equiAngle.dll +0 -0
- gecatsim/reconstruction/lib/fdk_equiAngle.so +0 -0
- gecatsim/reconstruction/lib/fdk_equiAngle_macos.so +0 -0
- gecatsim/reconstruction/lib/helicalrecon.dll +0 -0
- gecatsim/reconstruction/lib/helicalrecon.so +0 -0
- gecatsim/reconstruction/lib/readme.md +20 -0
- gecatsim/reconstruction/pyfiles/createHSP.py +81 -0
- gecatsim/reconstruction/pyfiles/fdk_equiAngle.py +245 -0
- gecatsim/reconstruction/pyfiles/helical_equiAngle.py +284 -0
- gecatsim/reconstruction/pyfiles/mapConfigVariablesToFDK.py +38 -0
- gecatsim/reconstruction/pyfiles/mapConfigVariablesToHelical.py +50 -0
- gecatsim/reconstruction/pyfiles/recon.py +172 -0
- gecatsim/reconstruction/src/Parallel_FDK_Helical_3DWeighting.c +211 -0
- gecatsim/reconstruction/src/interface_fdk_angle.c +162 -0
- gecatsim/response_matrix/PC_spectral_response_CZT0.25x0.25x1.6.mat +0 -0
- gecatsim/scatter/scatter_kernel.dat +0 -0
- gecatsim/spectrum/XCISTspectrum.m +262 -0
- gecatsim/spectrum/convert.py +21 -0
- gecatsim/spectrum/readme.md +17 -0
- gecatsim/spectrum/tungsten_tar10.0_100_filt.dat +201 -0
- gecatsim/spectrum/tungsten_tar10.0_110_filt.dat +221 -0
- gecatsim/spectrum/tungsten_tar10.0_120_filt.dat +241 -0
- gecatsim/spectrum/tungsten_tar10.0_130_filt.dat +261 -0
- gecatsim/spectrum/tungsten_tar10.0_140_filt.dat +281 -0
- gecatsim/spectrum/tungsten_tar10.0_70_filt.dat +141 -0
- gecatsim/spectrum/tungsten_tar10.0_80_filt.dat +161 -0
- gecatsim/spectrum/tungsten_tar10.0_90_filt.dat +181 -0
- gecatsim/spectrum/tungsten_tar7.0_100_filt.dat +201 -0
- gecatsim/spectrum/tungsten_tar7.0_110_filt.dat +221 -0
- gecatsim/spectrum/tungsten_tar7.0_120_filt.dat +241 -0
- gecatsim/spectrum/tungsten_tar7.0_130_filt.dat +261 -0
- gecatsim/spectrum/tungsten_tar7.0_140_filt.dat +281 -0
- gecatsim/spectrum/tungsten_tar7.0_70_filt.dat +141 -0
- gecatsim/spectrum/tungsten_tar7.0_80_filt.dat +161 -0
- gecatsim/spectrum/tungsten_tar7.0_90_filt.dat +181 -0
- gecatsim/spectrum/xcist_kVp100_tar7_bin1.dat +103 -0
- gecatsim/spectrum/xcist_kVp120_tar7_bin1.dat +123 -0
- gecatsim/spectrum/xcist_kVp140_tar7_bin1.dat +143 -0
- 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
|
+
//**********************************************************************************************************************
|