From: Kevin M. Rosenberg Date: Sat, 2 Sep 2000 05:17:29 +0000 (+0000) Subject: r187: *** empty log message *** X-Git-Tag: debian-4.5.3-3~830 X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=commitdiff_plain;h=bfcc769cf8019eabc8c65c07257c8dbee4b4c977 r187: *** empty log message *** --- diff --git a/ChangeLog b/ChangeLog index e77b594..a14122f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,9 +1,15 @@ -2.0.0-b11 - 8/31/00 - Added reconstruction for Equilinear and Equiangular geometries - Changed theta to be -PI/2 to make compliant with Kak-Slaney formulas +2.0.0-b11 - 9/1/00 ctsim: Added projection graph to animation of projection collection ctsim: Added single stepping to projection collection animation ctsim: improved File/Properties display for projection files + ctsim: Added progress dialog for reconstructions + ctsim: Added file labels for projection and reconstruction images + ctsim: Made File/Properties bring up modal dialogs + Added reconstruction for Equilinear and Equiangular geometries + Changed theta to be -PI/2 to make compliant with Kak-Slaney formulas + Separated reconstruction into Reconstructor class + Fixed center of detector adjustment for even number of detectors + Added --enable-static to generate statically linked programs 2.0.0-b10 - 8/25/00 ctsim: Added animation of projection collection processs diff --git a/TODO b/TODO index 46eec6e..71a56a6 100644 --- a/TODO +++ b/TODO @@ -2,9 +2,7 @@ Fix BUGS -- see BUGS file Convert pol to C++ object. -Adding animation of X-ray projection collection - -Add animation of filtering & backprojections +Add divergent filtering to frequency/direct filtering FFT filtering requires FFTW library. Add a public domain FFT routine. diff --git a/configure b/configure index 299bf43..056984c 100755 --- a/configure +++ b/configure @@ -16,6 +16,9 @@ ac_help="$ac_help ac_help="$ac_help --enable-verbose-warnings Enable verbose compiler warnings." +ac_help="$ac_help + --enable-static + Enable static executables." ac_help="$ac_help --with-lam[=PATH] Set path of LAM MPI " ac_help="$ac_help @@ -573,7 +576,7 @@ ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 -echo "configure:577: checking for a BSD compatible install" >&5 +echo "configure:580: checking for a BSD compatible install" >&5 if test -z "$INSTALL"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -626,7 +629,7 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6 -echo "configure:630: checking whether build environment is sane" >&5 +echo "configure:633: checking whether build environment is sane" >&5 # Just in case sleep 1 echo timestamp > conftestfile @@ -683,7 +686,7 @@ test "$program_suffix" != NONE && test "$program_transform_name" = "" && program_transform_name="s,x,x," echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 -echo "configure:687: checking whether ${MAKE-make} sets \${MAKE}" >&5 +echo "configure:690: checking whether ${MAKE-make} sets \${MAKE}" >&5 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -729,7 +732,7 @@ EOF missing_dir=`cd $ac_aux_dir && pwd` echo $ac_n "checking for working aclocal""... $ac_c" 1>&6 -echo "configure:733: checking for working aclocal" >&5 +echo "configure:736: checking for working aclocal" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. @@ -742,7 +745,7 @@ else fi echo $ac_n "checking for working autoconf""... $ac_c" 1>&6 -echo "configure:746: checking for working autoconf" >&5 +echo "configure:749: checking for working autoconf" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. @@ -755,7 +758,7 @@ else fi echo $ac_n "checking for working automake""... $ac_c" 1>&6 -echo "configure:759: checking for working automake" >&5 +echo "configure:762: checking for working automake" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. @@ -768,7 +771,7 @@ else fi echo $ac_n "checking for working autoheader""... $ac_c" 1>&6 -echo "configure:772: checking for working autoheader" >&5 +echo "configure:775: checking for working autoheader" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. @@ -781,7 +784,7 @@ else fi echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6 -echo "configure:785: checking for working makeinfo" >&5 +echo "configure:788: checking for working makeinfo" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. @@ -803,7 +806,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:807: checking for $ac_word" >&5 +echo "configure:810: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_AWK'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -844,7 +847,7 @@ done # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 -echo "configure:848: checking for a BSD compatible install" >&5 +echo "configure:851: checking for a BSD compatible install" >&5 if test -z "$INSTALL"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -897,7 +900,7 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 -echo "configure:901: checking whether ${MAKE-make} sets \${MAKE}" >&5 +echo "configure:904: checking whether ${MAKE-make} sets \${MAKE}" >&5 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -926,7 +929,7 @@ fi # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:930: checking for $ac_word" >&5 +echo "configure:933: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -956,7 +959,7 @@ fi # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:960: checking for $ac_word" >&5 +echo "configure:963: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -986,7 +989,7 @@ if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:990: checking for $ac_word" >&5 +echo "configure:993: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1037,7 +1040,7 @@ fi # Extract the first word of "cl", so it can be a program name with args. set dummy cl; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1041: checking for $ac_word" >&5 +echo "configure:1044: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1069,7 +1072,7 @@ fi fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:1073: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 +echo "configure:1076: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. @@ -1080,12 +1083,12 @@ cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext << EOF -#line 1084 "configure" +#line 1087 "configure" #include "confdefs.h" main(){return(0);} EOF -if { (eval echo configure:1089: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1092: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ac_cv_prog_cc_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then @@ -1111,12 +1114,12 @@ if test $ac_cv_prog_cc_works = no; then { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:1115: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "configure:1118: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 cross_compiling=$ac_cv_prog_cc_cross echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 -echo "configure:1120: checking whether we are using GNU C" >&5 +echo "configure:1123: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1125,7 +1128,7 @@ else yes; #endif EOF -if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1129: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then +if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1132: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no @@ -1144,7 +1147,7 @@ ac_test_CFLAGS="${CFLAGS+set}" ac_save_CFLAGS="$CFLAGS" CFLAGS= echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 -echo "configure:1148: checking whether ${CC-cc} accepts -g" >&5 +echo "configure:1151: checking whether ${CC-cc} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1180,7 +1183,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1184: checking for $ac_word" >&5 +echo "configure:1187: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1212,7 +1215,7 @@ test -n "$CXX" || CXX="gcc" echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:1216: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5 +echo "configure:1219: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5 ac_ext=C # CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. @@ -1223,12 +1226,12 @@ cross_compiling=$ac_cv_prog_cxx_cross cat > conftest.$ac_ext << EOF -#line 1227 "configure" +#line 1230 "configure" #include "confdefs.h" int main(){return(0);} EOF -if { (eval echo configure:1232: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1235: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ac_cv_prog_cxx_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then @@ -1254,12 +1257,12 @@ if test $ac_cv_prog_cxx_works = no; then { echo "configure: error: installation or configuration problem: C++ compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:1258: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "configure:1261: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cxx_cross" 1>&6 cross_compiling=$ac_cv_prog_cxx_cross echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6 -echo "configure:1263: checking whether we are using GNU C++" >&5 +echo "configure:1266: checking whether we are using GNU C++" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1268,7 +1271,7 @@ else yes; #endif EOF -if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:1272: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then +if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:1275: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gxx=yes else ac_cv_prog_gxx=no @@ -1287,7 +1290,7 @@ ac_test_CXXFLAGS="${CXXFLAGS+set}" ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS= echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6 -echo "configure:1291: checking whether ${CXX-g++} accepts -g" >&5 +echo "configure:1294: checking whether ${CXX-g++} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1321,7 +1324,7 @@ fi # Extract the first word of "wx-config", so it can be a program name with args. set dummy wx-config; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1325: checking for $ac_word" >&5 +echo "configure:1328: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_wxconfig'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1362,7 +1365,7 @@ else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; } fi echo $ac_n "checking host system type""... $ac_c" 1>&6 -echo "configure:1366: checking host system type" >&5 +echo "configure:1369: checking host system type" >&5 host_alias=$host case "$host_alias" in @@ -1383,21 +1386,21 @@ host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` echo "$ac_t""$host" 1>&6 echo $ac_n "checking for inline""... $ac_c" 1>&6 -echo "configure:1387: checking for inline" >&5 +echo "configure:1390: checking for inline" >&5 if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1404: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_inline=$ac_kw; break else @@ -1423,7 +1426,7 @@ EOF esac echo $ac_n "checking size of short""... $ac_c" 1>&6 -echo "configure:1427: checking size of short" >&5 +echo "configure:1430: checking size of short" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_short'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1431,7 +1434,7 @@ else ac_cv_sizeof_short=2 else cat > conftest.$ac_ext < main() @@ -1442,7 +1445,7 @@ main() exit(0); } EOF -if { (eval echo configure:1446: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:1449: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_sizeof_short=`cat conftestval` else @@ -1462,7 +1465,7 @@ EOF echo $ac_n "checking size of int""... $ac_c" 1>&6 -echo "configure:1466: checking size of int" >&5 +echo "configure:1469: checking size of int" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_int'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1470,7 +1473,7 @@ else ac_cv_sizeof_int=4 else cat > conftest.$ac_ext < main() @@ -1481,7 +1484,7 @@ main() exit(0); } EOF -if { (eval echo configure:1485: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:1488: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_sizeof_int=`cat conftestval` else @@ -1501,7 +1504,7 @@ EOF echo $ac_n "checking size of long""... $ac_c" 1>&6 -echo "configure:1505: checking size of long" >&5 +echo "configure:1508: checking size of long" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_long'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1509,7 +1512,7 @@ else ac_cv_sizeof_long=4 else cat > conftest.$ac_ext < main() @@ -1520,7 +1523,7 @@ main() exit(0); } EOF -if { (eval echo configure:1524: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:1527: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_sizeof_long=`cat conftestval` else @@ -1540,7 +1543,7 @@ EOF echo $ac_n "checking size of float""... $ac_c" 1>&6 -echo "configure:1544: checking size of float" >&5 +echo "configure:1547: checking size of float" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_float'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1548,7 +1551,7 @@ else ac_cv_sizeof_float=4 else cat > conftest.$ac_ext < main() @@ -1559,7 +1562,7 @@ main() exit(0); } EOF -if { (eval echo configure:1563: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:1566: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_sizeof_float=`cat conftestval` else @@ -1579,7 +1582,7 @@ EOF echo $ac_n "checking size of double""... $ac_c" 1>&6 -echo "configure:1583: checking size of double" >&5 +echo "configure:1586: checking size of double" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_double'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1587,7 +1590,7 @@ else ac_cv_sizeof_double=8 else cat > conftest.$ac_ext < main() @@ -1598,7 +1601,7 @@ main() exit(0); } EOF -if { (eval echo configure:1602: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:1605: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_sizeof_double=`cat conftestval` else @@ -1622,14 +1625,14 @@ EOF echo $ac_n "checking whether byte ordering is bigendian""... $ac_c" 1>&6 -echo "configure:1626: checking whether byte ordering is bigendian" >&5 +echo "configure:1629: checking whether byte ordering is bigendian" >&5 if eval "test \"`echo '$''{'ac_cv_c_bigendian'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_cv_c_bigendian=unknown # See if sys/param.h defines the BYTE_ORDER macro. cat > conftest.$ac_ext < #include @@ -1640,11 +1643,11 @@ int main() { #endif ; return 0; } EOF -if { (eval echo configure:1644: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1647: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* # It does; now see whether it defined to BIG_ENDIAN or not. cat > conftest.$ac_ext < #include @@ -1655,7 +1658,7 @@ int main() { #endif ; return 0; } EOF -if { (eval echo configure:1659: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1662: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_bigendian=yes else @@ -1675,7 +1678,7 @@ if test "$cross_compiling" = yes; then ac_cv_c_bigendian=unknown else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:1695: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_c_bigendian=no else @@ -1718,7 +1721,7 @@ fi echo $ac_n "checking for main in -lz""... $ac_c" 1>&6 -echo "configure:1722: checking for main in -lz" >&5 +echo "configure:1725: checking for main in -lz" >&5 ac_lib_var=`echo z'_'main | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1726,14 +1729,14 @@ else ac_save_LIBS="$LIBS" LIBS="-lz $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1740: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -1755,7 +1758,7 @@ else fi echo $ac_n "checking for main in -lm""... $ac_c" 1>&6 -echo "configure:1759: checking for main in -lm" >&5 +echo "configure:1762: checking for main in -lm" >&5 ac_lib_var=`echo m'_'main | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1763,14 +1766,14 @@ else ac_save_LIBS="$LIBS" LIBS="-lm $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1777: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -1798,7 +1801,7 @@ else fi echo $ac_n "checking for main in -lcurses""... $ac_c" 1>&6 -echo "configure:1802: checking for main in -lcurses" >&5 +echo "configure:1805: checking for main in -lcurses" >&5 ac_lib_var=`echo curses'_'main | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1806,14 +1809,14 @@ else ac_save_LIBS="$LIBS" LIBS="-lcurses $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1820: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -1835,7 +1838,7 @@ curses=false fi echo $ac_n "checking for main in -lncurses""... $ac_c" 1>&6 -echo "configure:1839: checking for main in -lncurses" >&5 +echo "configure:1842: checking for main in -lncurses" >&5 ac_lib_var=`echo ncurses'_'main | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1843,14 +1846,14 @@ else ac_save_LIBS="$LIBS" LIBS="-lncurses $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1857: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -1872,7 +1875,7 @@ ncurses=false fi echo $ac_n "checking for main in -lg2""... $ac_c" 1>&6 -echo "configure:1876: checking for main in -lg2" >&5 +echo "configure:1879: checking for main in -lg2" >&5 ac_lib_var=`echo g2'_'main | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1880,14 +1883,14 @@ else ac_save_LIBS="$LIBS" LIBS="-lg2 $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1894: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -1910,7 +1913,7 @@ fi wxwin=false echo $ac_n "checking for main in -lwx_gtk""... $ac_c" 1>&6 -echo "configure:1914: checking for main in -lwx_gtk" >&5 +echo "configure:1917: checking for main in -lwx_gtk" >&5 ac_lib_var=`echo wx_gtk'_'main | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1918,14 +1921,14 @@ else ac_save_LIBS="$LIBS" LIBS="-lwx_gtk $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1932: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -1949,7 +1952,7 @@ else fi echo $ac_n "checking for main in -lwx_msw""... $ac_c" 1>&6 -echo "configure:1953: checking for main in -lwx_msw" >&5 +echo "configure:1956: checking for main in -lwx_msw" >&5 ac_lib_var=`echo wx_msw'_'main | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1957,14 +1960,14 @@ else ac_save_LIBS="$LIBS" LIBS="-lwx_msw $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1971: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -1988,7 +1991,7 @@ else fi echo $ac_n "checking for main in -lhdf5""... $ac_c" 1>&6 -echo "configure:1992: checking for main in -lhdf5" >&5 +echo "configure:1995: checking for main in -lhdf5" >&5 ac_lib_var=`echo hdf5'_'main | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1996,14 +1999,14 @@ else ac_save_LIBS="$LIBS" LIBS="-lhdf5 -lz $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2010: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -2025,7 +2028,7 @@ hdf5=false fi echo $ac_n "checking for main in -lfftw""... $ac_c" 1>&6 -echo "configure:2029: checking for main in -lfftw" >&5 +echo "configure:2032: checking for main in -lfftw" >&5 ac_lib_var=`echo fftw'_'main | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -2033,14 +2036,14 @@ else ac_save_LIBS="$LIBS" LIBS="-lfftw $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2047: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -2067,7 +2070,7 @@ fi if test "$zlib" = "true" ; then echo $ac_n "checking for main in -lpng""... $ac_c" 1>&6 -echo "configure:2071: checking for main in -lpng" >&5 +echo "configure:2074: checking for main in -lpng" >&5 ac_lib_var=`echo png'_'main | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -2075,14 +2078,14 @@ else ac_save_LIBS="$LIBS" LIBS="-lpng $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2089: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -2109,7 +2112,7 @@ fi fi echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 -echo "configure:2113: checking how to run the C preprocessor" >&5 +echo "configure:2116: checking how to run the C preprocessor" >&5 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= @@ -2124,13 +2127,13 @@ else # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2134: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2137: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : @@ -2141,13 +2144,13 @@ else rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2151: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2154: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : @@ -2158,13 +2161,13 @@ else rm -rf conftest* CPP="${CC-cc} -nologo -E" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2168: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2171: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : @@ -2189,12 +2192,12 @@ fi echo "$ac_t""$CPP" 1>&6 echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 -echo "configure:2193: checking for ANSI C header files" >&5 +echo "configure:2196: checking for ANSI C header files" >&5 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -2202,7 +2205,7 @@ else #include EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2206: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2209: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -2219,7 +2222,7 @@ rm -f conftest* if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat > conftest.$ac_ext < EOF @@ -2237,7 +2240,7 @@ fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat > conftest.$ac_ext < EOF @@ -2258,7 +2261,7 @@ if test "$cross_compiling" = yes; then : else cat > conftest.$ac_ext < #define ISLOWER(c) ('a' <= (c) && (c) <= 'z') @@ -2269,7 +2272,7 @@ if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); exit (0); } EOF -if { (eval echo configure:2273: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:2276: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then : else @@ -2296,17 +2299,17 @@ for ac_hdr in fcntl.h unistd.h getopt.h sys/fcntl.h setjmp.h stdarg.h stddef.h s do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:2300: checking for $ac_hdr" >&5 +echo "configure:2303: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2310: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2313: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -2334,12 +2337,12 @@ done echo $ac_n "checking for working const""... $ac_c" 1>&6 -echo "configure:2338: checking for working const" >&5 +echo "configure:2341: checking for working const" >&5 if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:2395: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_const=yes else @@ -2409,12 +2412,12 @@ EOF fi echo $ac_n "checking for off_t""... $ac_c" 1>&6 -echo "configure:2413: checking for off_t" >&5 +echo "configure:2416: checking for off_t" >&5 if eval "test \"`echo '$''{'ac_cv_type_off_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS @@ -2442,12 +2445,12 @@ EOF fi echo $ac_n "checking for size_t""... $ac_c" 1>&6 -echo "configure:2446: checking for size_t" >&5 +echo "configure:2449: checking for size_t" >&5 if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS @@ -2475,12 +2478,12 @@ EOF fi echo $ac_n "checking whether struct tm is in sys/time.h or time.h""... $ac_c" 1>&6 -echo "configure:2479: checking whether struct tm is in sys/time.h or time.h" >&5 +echo "configure:2482: checking whether struct tm is in sys/time.h or time.h" >&5 if eval "test \"`echo '$''{'ac_cv_struct_tm'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -2488,7 +2491,7 @@ int main() { struct tm *tp; tp->tm_sec; ; return 0; } EOF -if { (eval echo configure:2492: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:2495: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_struct_tm=time.h else @@ -2510,12 +2513,12 @@ fi echo $ac_n "checking for vprintf""... $ac_c" 1>&6 -echo "configure:2514: checking for vprintf" >&5 +echo "configure:2517: checking for vprintf" >&5 if eval "test \"`echo '$''{'ac_cv_func_vprintf'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2545: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_vprintf=yes" else @@ -2562,12 +2565,12 @@ fi if test "$ac_cv_func_vprintf" != yes; then echo $ac_n "checking for _doprnt""... $ac_c" 1>&6 -echo "configure:2566: checking for _doprnt" >&5 +echo "configure:2569: checking for _doprnt" >&5 if eval "test \"`echo '$''{'ac_cv_func__doprnt'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2597: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func__doprnt=yes" else @@ -2617,12 +2620,12 @@ fi for ac_func in strtod strtol snprintf htonl usleep do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:2621: checking for $ac_func" >&5 +echo "configure:2624: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2652: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -2670,12 +2673,12 @@ fi done echo $ac_n "checking for basename""... $ac_c" 1>&6 -echo "configure:2674: checking for basename" >&5 +echo "configure:2677: checking for basename" >&5 if eval "test \"`echo '$''{'ac_cv_func_basename'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2705: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_basename=yes" else @@ -2718,12 +2721,12 @@ else fi echo $ac_n "checking for setjmp""... $ac_c" 1>&6 -echo "configure:2722: checking for setjmp" >&5 +echo "configure:2725: checking for setjmp" >&5 if eval "test \"`echo '$''{'ac_cv_func_setjmp'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2753: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_setjmp=yes" else @@ -2769,12 +2772,12 @@ if test "${OSTYPE}" = "cygwin" ; then getopt_long=false else echo $ac_n "checking for getopt_long""... $ac_c" 1>&6 -echo "configure:2773: checking for getopt_long" >&5 +echo "configure:2776: checking for getopt_long" >&5 if eval "test \"`echo '$''{'ac_cv_func_getopt_long'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2804: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_getopt_long=yes" else @@ -2838,7 +2841,7 @@ fi fi echo $ac_n "checking debug""... $ac_c" 1>&6 -echo "configure:2842: checking debug" >&5 +echo "configure:2845: checking debug" >&5 # Check whether --enable-debug or --disable-debug was given. if test "${enable_debug+set}" = set; then enableval="$enable_debug" @@ -2887,7 +2890,7 @@ fi fi echo $ac_n "checking whether to enable verbose warnings""... $ac_c" 1>&6 -echo "configure:2891: checking whether to enable verbose warnings" >&5 +echo "configure:2894: checking whether to enable verbose warnings" >&5 # Check whether --enable-verbose-warnings or --disable-verbose-warnings was given. if test "${enable_verbose_warnings+set}" = set; then enableval="$enable_verbose_warnings" @@ -2936,6 +2939,30 @@ else fi +echo $ac_n "checking static executables""... $ac_c" 1>&6 +echo "configure:2944: checking static executables" >&5 +# Check whether --enable-static or --disable-static was given. +if test "${enable_static+set}" = set; then + enableval="$enable_static" + case "$enableval" in + yes) + echo "$ac_t""yes" 1>&6 + + if test -n "$GCC"; then + CFLAGS="$CFLAGS --static" + fi + + ;; + *) + echo "$ac_t""no" 1>&6 + ;; + esac +else + echo "$ac_t""no" 1>&6 + +fi + + # Check whether --with-lam or --without-lam was given. if test "${with_lam+set}" = set; then withval="$with_lam" @@ -2952,7 +2979,7 @@ if test "$withval" != "no" ; then fi echo $ac_n "checking for LAM MPI installation""... $ac_c" 1>&6 -echo "configure:2956: checking for LAM MPI installation" >&5 +echo "configure:2983: checking for LAM MPI installation" >&5 for testlamdir in "." $trylamdir /usr/local /usr/local/lam /usr /usr/lam /opt /opt/lam ; do if test -x "$testlamdir/bin/hcc" ; then LDFLAGS="$LDFLAGS -L$testlamdir/lib" @@ -2970,7 +2997,7 @@ else fi echo $ac_n "checking for web access""... $ac_c" 1>&6 -echo "configure:2974: checking for web access" >&5 +echo "configure:3001: checking for web access" >&5 # Check whether --with-cgibin-dir or --without-cgibin-dir was given. if test "${with_cgibin_dir+set}" = set; then withval="$with_cgibin_dir" @@ -3060,7 +3087,7 @@ fi # Uses ac_ vars as temps to allow command line to override cache and checks. # --without-x overrides everything else, but does not touch the cache. echo $ac_n "checking for X""... $ac_c" 1>&6 -echo "configure:3064: checking for X" >&5 +echo "configure:3091: checking for X" >&5 # Check whether --with-x or --without-x was given. if test "${with_x+set}" = set; then @@ -3122,12 +3149,12 @@ if test "$ac_x_includes" = NO; then # First, try using that file with no special directory specified. cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:3131: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:3158: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -3196,14 +3223,14 @@ if test "$ac_x_libraries" = NO; then ac_save_LIBS="$LIBS" LIBS="-l$x_direct_test_library $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3234: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* LIBS="$ac_save_LIBS" # We can link X programs with no special library path. @@ -3309,17 +3336,17 @@ else case "`(uname -sr) 2>/dev/null`" in "SunOS 5"*) echo $ac_n "checking whether -R must be followed by a space""... $ac_c" 1>&6 -echo "configure:3313: checking whether -R must be followed by a space" >&5 +echo "configure:3340: checking whether -R must be followed by a space" >&5 ac_xsave_LIBS="$LIBS"; LIBS="$LIBS -R$x_libraries" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3350: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_R_nospace=yes else @@ -3335,14 +3362,14 @@ rm -f conftest* else LIBS="$ac_xsave_LIBS -R $x_libraries" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3373: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_R_space=yes else @@ -3374,7 +3401,7 @@ rm -f conftest* # libraries were built with DECnet support. And karl@cs.umb.edu says # the Alpha needs dnet_stub (dnet does not exist). echo $ac_n "checking for dnet_ntoa in -ldnet""... $ac_c" 1>&6 -echo "configure:3378: checking for dnet_ntoa in -ldnet" >&5 +echo "configure:3405: checking for dnet_ntoa in -ldnet" >&5 ac_lib_var=`echo dnet'_'dnet_ntoa | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -3382,7 +3409,7 @@ else ac_save_LIBS="$LIBS" LIBS="-ldnet $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3424: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3415,7 +3442,7 @@ fi if test $ac_cv_lib_dnet_dnet_ntoa = no; then echo $ac_n "checking for dnet_ntoa in -ldnet_stub""... $ac_c" 1>&6 -echo "configure:3419: checking for dnet_ntoa in -ldnet_stub" >&5 +echo "configure:3446: checking for dnet_ntoa in -ldnet_stub" >&5 ac_lib_var=`echo dnet_stub'_'dnet_ntoa | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -3423,7 +3450,7 @@ else ac_save_LIBS="$LIBS" LIBS="-ldnet_stub $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3465: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3463,12 +3490,12 @@ fi # The nsl library prevents programs from opening the X display # on Irix 5.2, according to dickey@clark.net. echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6 -echo "configure:3467: checking for gethostbyname" >&5 +echo "configure:3494: checking for gethostbyname" >&5 if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3522: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_gethostbyname=yes" else @@ -3512,7 +3539,7 @@ fi if test $ac_cv_func_gethostbyname = no; then echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6 -echo "configure:3516: checking for gethostbyname in -lnsl" >&5 +echo "configure:3543: checking for gethostbyname in -lnsl" >&5 ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -3520,7 +3547,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lnsl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3562: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3561,12 +3588,12 @@ fi # -lsocket must be given before -lnsl if both are needed. # We assume that if connect needs -lnsl, so does gethostbyname. echo $ac_n "checking for connect""... $ac_c" 1>&6 -echo "configure:3565: checking for connect" >&5 +echo "configure:3592: checking for connect" >&5 if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3620: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_connect=yes" else @@ -3610,7 +3637,7 @@ fi if test $ac_cv_func_connect = no; then echo $ac_n "checking for connect in -lsocket""... $ac_c" 1>&6 -echo "configure:3614: checking for connect in -lsocket" >&5 +echo "configure:3641: checking for connect in -lsocket" >&5 ac_lib_var=`echo socket'_'connect | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -3618,7 +3645,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lsocket $X_EXTRA_LIBS $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3660: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3653,12 +3680,12 @@ fi # gomez@mi.uni-erlangen.de says -lposix is necessary on A/UX. echo $ac_n "checking for remove""... $ac_c" 1>&6 -echo "configure:3657: checking for remove" >&5 +echo "configure:3684: checking for remove" >&5 if eval "test \"`echo '$''{'ac_cv_func_remove'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3712: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_remove=yes" else @@ -3702,7 +3729,7 @@ fi if test $ac_cv_func_remove = no; then echo $ac_n "checking for remove in -lposix""... $ac_c" 1>&6 -echo "configure:3706: checking for remove in -lposix" >&5 +echo "configure:3733: checking for remove in -lposix" >&5 ac_lib_var=`echo posix'_'remove | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -3710,7 +3737,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lposix $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3752: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3745,12 +3772,12 @@ fi # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. echo $ac_n "checking for shmat""... $ac_c" 1>&6 -echo "configure:3749: checking for shmat" >&5 +echo "configure:3776: checking for shmat" >&5 if eval "test \"`echo '$''{'ac_cv_func_shmat'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3804: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_shmat=yes" else @@ -3794,7 +3821,7 @@ fi if test $ac_cv_func_shmat = no; then echo $ac_n "checking for shmat in -lipc""... $ac_c" 1>&6 -echo "configure:3798: checking for shmat in -lipc" >&5 +echo "configure:3825: checking for shmat in -lipc" >&5 ac_lib_var=`echo ipc'_'shmat | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -3802,7 +3829,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lipc $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3844: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3846,7 +3873,7 @@ fi # libraries we check for below, so use a different variable. # --interran@uluru.Stanford.EDU, kb@cs.umb.edu. echo $ac_n "checking for IceConnectionNumber in -lICE""... $ac_c" 1>&6 -echo "configure:3850: checking for IceConnectionNumber in -lICE" >&5 +echo "configure:3877: checking for IceConnectionNumber in -lICE" >&5 ac_lib_var=`echo ICE'_'IceConnectionNumber | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -3854,7 +3881,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lICE $X_EXTRA_LIBS $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3896: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3902,7 +3929,7 @@ X_BASIC_LIBS="-lXext -lX11" our_saved_LDFLAGS="$LDFLAGS" LDFLAGS="$X_LIBS $LDFLAGS" echo $ac_n "checking for XtToolkitThreadInitialize in -lXt""... $ac_c" 1>&6 -echo "configure:3906: checking for XtToolkitThreadInitialize in -lXt" >&5 +echo "configure:3933: checking for XtToolkitThreadInitialize in -lXt" >&5 ac_lib_var=`echo Xt'_'XtToolkitThreadInitialize | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -3910,7 +3937,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lXt $X_PRE_LIBS $X_BASIC_LIBS $X_EXTRA_LIBS $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3952: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3949,7 +3976,7 @@ LDFLAGS="$our_saved_LDFLAGS" our_saved_LDFLAGS="$LDFLAGS" LDFLAGS="$X_LIBS $LDFLAGS" echo $ac_n "checking for XdbeQueryExtension in -lXext""... $ac_c" 1>&6 -echo "configure:3953: checking for XdbeQueryExtension in -lXext" >&5 +echo "configure:3980: checking for XdbeQueryExtension in -lXext" >&5 ac_lib_var=`echo Xext'_'XdbeQueryExtension | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -3957,7 +3984,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lXext -lX11 "$X_EXTRA_LIBS" $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3999: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3992,7 +4019,7 @@ else fi echo $ac_n "checking for XmbufQueryExtension in -lXext""... $ac_c" 1>&6 -echo "configure:3996: checking for XmbufQueryExtension in -lXext" >&5 +echo "configure:4023: checking for XmbufQueryExtension in -lXext" >&5 ac_lib_var=`echo Xext'_'XmbufQueryExtension | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -4000,7 +4027,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lXext -lX11 "$X_EXTRA_LIBS" $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:4042: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -4041,17 +4068,17 @@ for ac_hdr in X11/extensions/Xdbe.h X11/extensions/multibuf.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:4045: checking for $ac_hdr" >&5 +echo "configure:4072: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:4055: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:4082: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -4093,7 +4120,7 @@ my_includes="$my_includes -I../include -I.." echo $ac_n "checking interactive graphics""... $ac_c" 1>&6 -echo "configure:4097: checking interactive graphics" >&5 +echo "configure:4124: checking interactive graphics" >&5 if test "$no_x" != "yes" ; then cat >> confdefs.h <<\EOF #define HAVE_X11 1 @@ -4113,8 +4140,12 @@ else HAVE_SGP_FALSE= fi LDFLAGS="$LDFLAGS -L../libctgraphics -L/usr/X11R6/lib" - ctlibs_graphics="$ctlibs_base -lctgraphics $X_BASIC_LIBS $X_TOOLKIT_LIBS" + ctlibs_graphics="$ctlibs_base -lctgraphics" echo "$ac_t""yes" 1>&6 + if test "$g2" = "true" ; then + ctlibs_graphics="$ctlibs_graphics -lg2" + fi + ctlibs_graphics="$ctlibs_graphics $X_BASIC_LIBS $X_TOOLKIT_LIBS" else echo "$ac_t""no" 1>&6 fi @@ -4125,16 +4156,12 @@ fi if test "$zlib" = "true" ; then ctlibs_tools="$ctlibs_tools -lz" fi -if test "$g2" = "true" ; then - ctlibs_tools="$ctlibs_tools -lg2" -fi - if test "$fftw" = "true" ; then ctlibs_tools="$ctlibs_tools -lrfftw -lfftw" fi echo $ac_n "checking for main in -ldmallocxx""... $ac_c" 1>&6 -echo "configure:4138: checking for main in -ldmallocxx" >&5 +echo "configure:4165: checking for main in -ldmallocxx" >&5 ac_lib_var=`echo dmallocxx'_'main | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -4142,14 +4169,14 @@ else ac_save_LIBS="$LIBS" LIBS="-ldmallocxx $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:4180: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -4171,7 +4198,7 @@ dmallocxx=false fi echo $ac_n "checking for enable-dmalloc""... $ac_c" 1>&6 -echo "configure:4175: checking for enable-dmalloc" >&5 +echo "configure:4202: checking for enable-dmalloc" >&5 # Check whether --enable-dmalloc or --disable-dmalloc was given. if test "${enable_dmalloc+set}" = set; then enableval="$enable_dmalloc" diff --git a/configure.in b/configure.in index 0b5e270..262f928 100644 --- a/configure.in +++ b/configure.in @@ -165,6 +165,21 @@ AC_ARG_ENABLE(verbose-warnings, esac ], AC_MSG_RESULT(no) ) +AC_MSG_CHECKING(static executables) +AC_ARG_ENABLE(static, +[ --enable-static + Enable static executables.], +[ case "$enableval" in + yes) + AC_MSG_RESULT(yes) + AC_ADD_GCC_CFLAGS([--static]) + ;; + *) + AC_MSG_RESULT(no) + ;; + esac ], AC_MSG_RESULT(no) +) + dnl Set LAM path AC_ARG_WITH(lam, [ --with-lam[=PATH] Set path of LAM MPI ], @@ -300,8 +315,12 @@ if test "$no_x" != "yes" ; then AC_DEFINE(HAVE_SGP) AM_CONDITIONAL(HAVE_SGP, test 1==1) LDFLAGS="$LDFLAGS -L../libctgraphics -L/usr/X11R6/lib" - ctlibs_graphics="$ctlibs_base -lctgraphics $X_BASIC_LIBS $X_TOOLKIT_LIBS" + ctlibs_graphics="$ctlibs_base -lctgraphics" AC_MSG_RESULT(yes) + if test "$g2" = "true" ; then + ctlibs_graphics="$ctlibs_graphics -lg2" + fi + ctlibs_graphics="$ctlibs_graphics $X_BASIC_LIBS $X_TOOLKIT_LIBS" else AC_MSG_RESULT(no) fi @@ -312,10 +331,6 @@ fi if test "$zlib" = "true" ; then ctlibs_tools="$ctlibs_tools -lz" fi -if test "$g2" = "true" ; then - ctlibs_tools="$ctlibs_tools -lg2" -fi - if test "$fftw" = "true" ; then ctlibs_tools="$ctlibs_tools -lrfftw -lfftw" fi diff --git a/include/Makefile.am b/include/Makefile.am index a7f4ddf..bf978a6 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -1,4 +1,5 @@ -noinst_HEADERS=ct.h ezplot.h pol.h sgp.h array2d.h imagefile.h backprojectors.h mpiworld.h fnetorderstream.h phantom.h timer.h sstream scanner.h projections.h ctsupport.h filter.h array2dfile.h trace.h transformmatrix.h procsignal.h +noinst_HEADERS=ct.h ezplot.h pol.h sgp.h array2d.h imagefile.h backprojectors.h mpiworld.h fnetorderstream.h phantom.h timer.h sstream scanner.h projections.h ctsupport.h filter.h array2dfile.h trace.h transformmatrix.h procsignal.h reconstruct.h + diff --git a/include/array2d.h b/include/array2d.h index 73f3909..8c323f4 100644 --- a/include/array2d.h +++ b/include/array2d.h @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: array2d.h,v 1.7 2000/07/13 07:03:21 kevin Exp $ +** $Id: array2d.h,v 1.8 2000/09/02 05:10:39 kevin Exp $ ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License (version 2) as @@ -35,13 +35,13 @@ template class Array2d { public: Array2d (unsigned int x, unsigned int y) - : nx(x), ny(y), array_data(0) + : m_nx(x), m_ny(y), array_data(0) { allocArray(); } - Array2d (void) - : nx(0), ny(0), array_data(0) + Array2d () + : m_nx(0), m_ny(0), array_data(0) {} ~Array2d () @@ -51,13 +51,13 @@ class Array2d { void initSetSize (unsigned int x, unsigned int y) { - nx = x; - ny = y; + m_nx = x; + m_ny = y; deleteArray(); allocArray(); } - T** getArray (void) const + T** getArray () const { return array_data; } T* getColumn (unsigned int x) const @@ -66,35 +66,39 @@ class Array2d { T getPoint (unsigned int x, unsigned int y) const { return (array_data ? array_data[x][y] : NULL); } - unsigned int sizeofPixel (void) const + unsigned int sizeofPixel () const { return sizeof(T); } - unsigned int sizeofColumn (void) const - { return (sizeof(T) * ny); } + unsigned int sizeofColumn () const + { return (sizeof(T) * m_ny); } - unsigned int sizeofArray (void) const - { return (sizeof(T) * nx * ny); } + unsigned int sizeofArray () const + { return (sizeof(T) * m_nx * m_ny); } private: - unsigned int nx; - unsigned int ny; + unsigned int m_nx; + unsigned int m_ny; T** array_data; - void allocArray (void) + void allocArray () { - array_data = new T*[nx]; + if (array_data) + deleteArray(); + + array_data = new T*[m_nx]; - for (unsigned int i = 0; i < nx; i++) - array_data[i] = new T[ny]; + for (unsigned int i = 0; i < m_nx; i++) + array_data[i] = new T[m_ny]; } - void deleteArray (void) + void deleteArray () { if (array_data) { - for (unsigned int i = 0; i < nx; i++) - delete array_data[i]; + for (unsigned int i = 0; i < m_nx; i++) + delete array_data [i]; delete array_data; + array_data = NULL; } } diff --git a/include/backprojectors.h b/include/backprojectors.h index b36dfb8..ef70d05 100644 --- a/include/backprojectors.h +++ b/include/backprojectors.h @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: backprojectors.h,v 1.14 2000/08/31 08:38:58 kevin Exp $ +** $Id: backprojectors.h,v 1.15 2000/09/02 05:10:39 kevin Exp $ ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License (version 2) as @@ -155,7 +155,7 @@ class BackprojectTable : public Backproject { public: BackprojectTable (const Projections& proj, ImageFile& im, int interpID, const int interpFactor); - ~BackprojectTable (); + virtual ~BackprojectTable (); void BackprojectView (const double* const t, double view_angle); @@ -220,6 +220,9 @@ class BackprojectEquilinear : public BackprojectTable {} void BackprojectView (const double* const t, double view_angle); + + virtual ~BackprojectEquilinear() + {} }; class BackprojectEquiangular : public BackprojectTable @@ -230,6 +233,9 @@ class BackprojectEquiangular : public BackprojectTable {} void BackprojectView (const double* const t, double view_angle); + + virtual ~BackprojectEquiangular() + {} }; diff --git a/include/ct.h b/include/ct.h index a0383af..0653809 100644 --- a/include/ct.h +++ b/include/ct.h @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: ct.h,v 1.31 2000/08/19 22:59:06 kevin Exp $ +** $Id: ct.h,v 1.32 2000/09/02 05:10:39 kevin Exp $ ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License (version 2) as @@ -157,6 +157,7 @@ using namespace std; #include "filter.h" #include "procsignal.h" #include "projections.h" +#include "reconstruct.h" #include "trace.h" diff --git a/include/procsignal.h b/include/procsignal.h index ad28581..94548a8 100644 --- a/include/procsignal.h +++ b/include/procsignal.h @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: procsignal.h,v 1.4 2000/08/31 08:38:58 kevin Exp $ +** $Id: procsignal.h,v 1.5 2000/09/02 05:10:39 kevin Exp $ ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License (version 2) as @@ -41,6 +41,7 @@ class SignalFilter; +class SGP; class ProcessSignal { public: @@ -58,7 +59,7 @@ class ProcessSignal { static const int FILTER_GENERATION_DIRECT; static const int FILTER_GENERATION_INVERSE_FOURIER; - ProcessSignal (const char* szFilterName, const char* szFilterMethodName,double bw, double signalIncrement, int n, double param, const char* szDomainName, const char* szFilterGenerationName, const int zeropad = 0, const int preinterpolationFactor = 1, const int iTraceLevel = Trace::TRACE_NONE, int iGeometry = Scanner::GEOMETRY_PARALLEL, double dFocalLength = 1.); + ProcessSignal (const char* szFilterName, const char* szFilterMethodName,double bw, double signalIncrement, int n, double param, const char* szDomainName, const char* szFilterGenerationName, const int zeropad = 0, const int preinterpolationFactor = 1, const int iTraceLevel = Trace::TRACE_NONE, int iGeometry = Scanner::GEOMETRY_PARALLEL, double dFocalLength = 1., SGP* pSGP = NULL); ~ProcessSignal(); @@ -149,7 +150,7 @@ class ProcessSignal { fftw_plan m_complexPlanForward, m_complexPlanBackward; #endif - void init (const int idFilter, int idFilterMethod, double dBandwidth, double dSignalIncrement, int nSignalPoints, double dFilterParam, const int idDomain, int idFilterGeneration, const int iZeropad, const int iPreinterpolationFactor, const int iTraceLevel, const int iGeometry, double dFocalLength); + void init (const int idFilter, int idFilterMethod, double dBandwidth, double dSignalIncrement, int nSignalPoints, double dFilterParam, const int idDomain, int idFilterGeneration, const int iZeropad, const int iPreinterpolationFactor, const int iTraceLevel, const int iGeometry, double dFocalLength, SGP* pSGP); // transforms that use precalculated trig tables, therefore don't // require number of data points (n) as an argument diff --git a/include/projections.h b/include/projections.h index 8a91616..eb1e853 100644 --- a/include/projections.h +++ b/include/projections.h @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: projections.h,v 1.13 2000/08/31 08:38:58 kevin Exp $ +** $Id: projections.h,v 1.14 2000/09/02 05:10:39 kevin Exp $ ** ** ** This program is free software; you can redistribute it and/or modify @@ -62,8 +62,8 @@ class Projections void setDetInc (double detInc) { m_detInc = detInc;} void setPhmLen (double phmLen) { m_phmLen = phmLen;} void setCalcTime (double calcTime) {m_calcTime = calcTime;} - void setRemark (const char* remark) {m_remark = remark;} - void setRemark (const string& remark) {m_remark = remark;} + void setRemark (const char* remark) {m_remark = remark; m_label.setLabelString(remark);} + void setRemark (const string& remark) {setRemark(remark.c_str());} double detStart() const {return m_detStart;} double rotStart() const {return m_rotStart;} diff --git a/include/reconstruct.h b/include/reconstruct.h new file mode 100644 index 0000000..422b6c9 --- /dev/null +++ b/include/reconstruct.h @@ -0,0 +1,68 @@ +/***************************************************************************** +** FILE IDENTIFICATION +** +** Name: reconstruct.h Header file for Reconstruction class +** Programmer: Kevin Rosenberg +** Date Started: Aug 84 +** +** This is part of the CTSim program +** Copyright (C) 1983-2000 Kevin Rosenberg +** +** $Id: reconstruct.h,v 1.1 2000/09/02 05:13:57 kevin Exp $ +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License (version 2) as +** published by the Free Software Foundation. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +******************************************************************************/ + +#ifndef __RECONSTRUCT_H +#define __RECONSTRUCT_H + + +class Projections; +class ImageFile; +class Backprojector; +class ProcessSignal; + +#include + +class Reconstructor +{ +public: + Reconstructor (const Projections& rProj, ImageFile& rIF, const char* const filterName, double filt_param, const char* const filterMethodName, const int zeropad, const char* filterGenerationName, const char* const interpName, int interpFactor, const char* const backprojectName, const int trace, SGP* pSGP = NULL); + + ~Reconstructor (); + + bool fail() const {return m_bFail;} + const string& failMessage() const {return m_strFailMessage;} + + void plotFilter (SGP* pSGP = NULL); + + void reconstructAllViews (); + + void reconstructView (int iStartView = 0, int iViewCount = -1, SGP* pSGP = NULL); + + private: + const Projections& m_rProj; + ImageFile& m_rImagefile; + ProcessSignal* m_pProcessSignal; + Backprojector* m_pBackprojector; + int m_nFilteredProjections; + int m_iTrace; + + bool m_bFail; + string m_strFailMessage; + + double* m_adPlotXAxis; +}; + +#endif diff --git a/include/scanner.h b/include/scanner.h index 7f8f95e..8911976 100644 --- a/include/scanner.h +++ b/include/scanner.h @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: scanner.h,v 1.14 2000/08/31 08:38:58 kevin Exp $ +** $Id: scanner.h,v 1.15 2000/09/02 05:10:39 kevin Exp $ ** ** ** This program is free software; you can redistribute it and/or modify @@ -159,17 +159,15 @@ class Scanner }; -const static int PROJECTION_TRACE_ROW_TITLE=0; -const static int PROJECTION_TRACE_ROW_TITLE2=1; -const static int PROJECTION_TRACE_ROW_PHANT_ID=3; -const static int PROJECTION_TRACE_ROW_GEOMETRY=4; -const static int PROJECTION_TRACE_ROW_FOCAL_LENGTH=5; -const static int PROJECTION_TRACE_ROW_FIELD_OF_VIEW=6; -const static int PROJECTION_TRACE_ROW_NDET=7; -const static int PROJECTION_TRACE_ROW_NVIEW=8; -const static int PROJECTION_TRACE_ROW_SAMPLES=9; -const static int PROJECTION_TRACE_ROW_CURR_VIEW=10; -const static int PROJECTION_TRACE_ROW_ATTEN=11; +const static int PROJECTION_TRACE_ROW_PHANT_ID=0; +const static int PROJECTION_TRACE_ROW_GEOMETRY=1; +const static int PROJECTION_TRACE_ROW_FOCAL_LENGTH=2; +const static int PROJECTION_TRACE_ROW_FIELD_OF_VIEW=3; +const static int PROJECTION_TRACE_ROW_NDET=4; +const static int PROJECTION_TRACE_ROW_NVIEW=5; +const static int PROJECTION_TRACE_ROW_SAMPLES=6; +const static int PROJECTION_TRACE_ROW_CURR_VIEW=7; +const static int PROJECTION_TRACE_ROW_ATTEN=8; diff --git a/include/sgp.h b/include/sgp.h index b026cdc..a873d18 100644 --- a/include/sgp.h +++ b/include/sgp.h @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: sgp.h,v 1.16 2000/08/31 08:38:58 kevin Exp $ +** $Id: sgp.h,v 1.17 2000/09/02 05:10:39 kevin Exp $ ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License (version 2) as @@ -202,7 +202,8 @@ public: void setMarker (int idMarker, int color); void setRasterOp (int ro); - void getViewport (double &xmin, double &ymin, double& xmax, double& ymax); + void getWindow (double& xmin, double& ymin, double& xmax, double& ymax); + void getViewport (double& xmin, double& ymin, double& xmax, double& ymax); void getTextExtent (const char *szText, double* x, double* y); double getCharHeight (); diff --git a/libctgraphics/ezplot.cpp b/libctgraphics/ezplot.cpp index c295757..fb823b5 100644 --- a/libctgraphics/ezplot.cpp +++ b/libctgraphics/ezplot.cpp @@ -6,7 +6,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: ezplot.cpp,v 1.12 2000/08/31 08:38:58 kevin Exp $ +** $Id: ezplot.cpp,v 1.13 2000/09/02 05:10:39 kevin Exp $ ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License (version 2) as @@ -333,7 +333,7 @@ EZPlot::plot () /* adjust frame for title */ if (c_title.length() > 0) ya_max -= 2.5 * charheight; - title_row = ya_max + 0.5 * charheight; + title_row = ya_max + charheight; /* calculate legend box boundaries */ int max_leg = 0; /* longest legend in characters */ @@ -587,7 +587,9 @@ EZPlot::drawAxes(void) rSGP.setViewport (xp_min, yp_min, xp_max, yp_max); if (c_title.length() > 0) { - rSGP.moveAbs (xa_min + (xa_max-xa_min)/2 - c_title.length()*charwidth, title_row); + double wText, hText; + rSGP.getTextExtent (c_title.c_str(), &wText, &hText); + rSGP.moveAbs (xa_min + (xa_max-xa_min)/2 - wText/2, title_row); rSGP.setTextSize (charheight * 2.0); rSGP.setTextColor (clr_title, -1); rSGP.drawText (c_title); diff --git a/libctgraphics/sgp.cpp b/libctgraphics/sgp.cpp index c1004d6..e96f29d 100644 --- a/libctgraphics/sgp.cpp +++ b/libctgraphics/sgp.cpp @@ -7,7 +7,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: sgp.cpp,v 1.12 2000/08/31 08:38:58 kevin Exp $ +** $Id: sgp.cpp,v 1.13 2000/09/02 05:10:39 kevin Exp $ ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License (version 2) as @@ -206,6 +206,15 @@ SGP::getViewport (double& xmin, double& ymin, double& xmax, double& ymax) ymax = yv_max; } +void +SGP::getWindow (double& xmin, double& ymin, double& xmax, double& ymax) +{ + xmin = xw_min; + ymin = yw_min; + xmax = xw_max; + ymax = yw_max; +} + // NAME // frameViewport draw box around viewport diff --git a/libctsim/Makefile.am b/libctsim/Makefile.am index 3138c01..28b3173 100644 --- a/libctsim/Makefile.am +++ b/libctsim/Makefile.am @@ -1,5 +1,5 @@ noinst_LIBRARIES = libctsim.a -libctsim_a_SOURCES = filter.cpp scanner.cpp projections.cpp phantom.cpp imagefile.cpp backprojectors.cpp array2dfile.cpp trace.cpp procsignal.cpp +libctsim_a_SOURCES = filter.cpp scanner.cpp projections.cpp phantom.cpp imagefile.cpp backprojectors.cpp array2dfile.cpp trace.cpp procsignal.cpp reconstruct.cpp INCLUDES=@my_includes@ EXTRA_DIST=Makefile.nt diff --git a/libctsim/backprojectors.cpp b/libctsim/backprojectors.cpp index 0bcd407..8c785ac 100644 --- a/libctsim/backprojectors.cpp +++ b/libctsim/backprojectors.cpp @@ -8,7 +8,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: backprojectors.cpp,v 1.13 2000/08/31 08:38:58 kevin Exp $ +** $Id: backprojectors.cpp,v 1.14 2000/09/02 05:10:39 kevin Exp $ ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License (version 2) as @@ -261,7 +261,7 @@ Backproject::Backproject (const Projections& proj, ImageFile& im, const int inte { detInc = proj.detInc(); nDet = proj.nDet(); - iDetCenter = nDet / 2; // index refering to L=0 projection + iDetCenter = (nDet - 1) / 2; // index refering to L=0 projection rotInc = proj.rotInc(); v = im.getArray(); @@ -360,8 +360,8 @@ BackprojectTrig::BackprojectView (const double* const filteredProj, const double BackprojectTable::BackprojectTable (const Projections& proj, ImageFile& im, int interpType, const int interpFactor) : Backproject::Backproject (proj, im, interpType, interpFactor) { - arrayR.initSetSize (nx, ny); - arrayPhi.initSetSize (nx, ny); + arrayR.initSetSize (im.nx(), im.ny()); + arrayPhi.initSetSize (im.nx(), im.ny()); r = arrayR.getArray(); phi = arrayPhi.getArray(); @@ -665,7 +665,7 @@ BackprojectEquiangular::BackprojectView (const double* const filteredProj, const if (iDetPos < 0 || iDetPos >= nDet - 1) { ; // errorIndexOutsideDetector (ix, iy, beta, r[ix][iy], phi[ix][iy], gamma, iDetPos); } else - pImCol[iy] += (((1-frac) * filteredProj[iDetPos] + frac * filteredProj[iDetPos+1])) / dL2; + pImCol[iy] += (filteredProj[iDetPos] + frac * (filteredProj[iDetPos+1] - filteredProj[iDetPos])) / dL2; } } // end for y } // end for x @@ -705,7 +705,7 @@ BackprojectEquilinear::BackprojectView (const double* const filteredProj, const if (iDetPos < 0 || iDetPos >= nDet - 1) ; // errorIndexOutsideDetector (ix, iy, beta, r[ix][iy], phi[ix][iy], dDetPos, iDetPos); else - pImCol[iy] += (((1-frac) * filteredProj[iDetPos] + frac * filteredProj[iDetPos+1])) / (dU * dU); + pImCol[iy] += (filteredProj[iDetPos] + frac * (filteredProj[iDetPos+1] - filteredProj[iDetPos])) / (dU * dU); } } // end for y } // end for x diff --git a/libctsim/procsignal.cpp b/libctsim/procsignal.cpp index 5c10c9e..a9ab2c7 100644 --- a/libctsim/procsignal.cpp +++ b/libctsim/procsignal.cpp @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: procsignal.cpp,v 1.5 2000/08/31 08:38:58 kevin Exp $ +** $Id: procsignal.cpp,v 1.6 2000/09/02 05:10:39 kevin Exp $ ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License (version 2) as @@ -77,7 +77,7 @@ const int ProcessSignal::s_iFilterGenerationCount = sizeof(s_aszFilterGeneration // CLASS IDENTIFICATION // ProcessSignal // -ProcessSignal::ProcessSignal (const char* szFilterName, const char* szFilterMethodName, double dBandwidth, double dSignalIncrement, int nSignalPoints, double dFilterParam, const char* szDomainName, const char* szFilterGenerationName, int iZeropad, int iPreinterpolationFactor, int iTraceLevel, int iGeometry, double dFocalLength) +ProcessSignal::ProcessSignal (const char* szFilterName, const char* szFilterMethodName, double dBandwidth, double dSignalIncrement, int nSignalPoints, double dFilterParam, const char* szDomainName, const char* szFilterGenerationName, int iZeropad, int iPreinterpolationFactor, int iTraceLevel, int iGeometry, double dFocalLength, SGP* pSGP) : m_adFourierCosTable(NULL), m_adFourierSinTable(NULL), m_adFilter(NULL), m_fail(false) { m_idFilterMethod = convertFilterMethodNameToID (szFilterMethodName); @@ -109,12 +109,12 @@ ProcessSignal::ProcessSignal (const char* szFilterName, const char* szFilterMeth return; } - init (m_idFilter, m_idFilterMethod, dBandwidth, dSignalIncrement, nSignalPoints, dFilterParam, m_idDomain, m_idFilterGeneration, iZeropad, iPreinterpolationFactor, iTraceLevel, iGeometry, dFocalLength); + init (m_idFilter, m_idFilterMethod, dBandwidth, dSignalIncrement, nSignalPoints, dFilterParam, m_idDomain, m_idFilterGeneration, iZeropad, iPreinterpolationFactor, iTraceLevel, iGeometry, dFocalLength, pSGP); } void -ProcessSignal::init (const int idFilter, const int idFilterMethod, double dBandwidth, double dSignalIncrement, int nSignalPoints, double dFilterParam, const int idDomain, const int idFilterGeneration, const int iZeropad, const int iPreinterpolationFactor, int iTraceLevel, int iGeometry, double dFocalLength) +ProcessSignal::init (const int idFilter, const int idFilterMethod, double dBandwidth, double dSignalIncrement, int nSignalPoints, double dFilterParam, const int idDomain, const int idFilterGeneration, const int iZeropad, const int iPreinterpolationFactor, int iTraceLevel, int iGeometry, double dFocalLength, SGP* pSGP) { m_idFilter = idFilter; m_idDomain = idDomain; @@ -178,53 +178,39 @@ ProcessSignal::init (const int idFilter, const int idFilterMethod, double dBandw m_adFilter = new double[ m_nFilterPoints ]; double adFrequencyFilter [m_nFilterPoints]; filter.copyFilterData (adFrequencyFilter, 0, m_nFilterPoints); - if (m_traceLevel >= Trace::TRACE_PLOT) { - SGPDriver sgpDriver ("Frequency Filter: Natural Order"); - SGP sgp (sgpDriver); - EZPlot ezplot (sgp); - - ezplot.ezset ("title Filter Response: Natural Order"); - ezplot.addCurve (adFrequencyFilter, m_nFilterPoints); - ezplot.plot(); - cio_put_str ("Press any key to continue"); - cio_kb_getc (); + EZPlot* pEZPlot = NULL; + if (pSGP && m_traceLevel >= Trace::TRACE_PLOT) { + pEZPlot = new EZPlot (*pSGP); + pEZPlot->ezset ("title Filter Response: Natural Order"); + pEZPlot->ezset ("ylength 0.25"); + pEZPlot->addCurve (adFrequencyFilter, m_nFilterPoints); + pEZPlot->plot(); } shuffleNaturalToFourierOrder (adFrequencyFilter, m_nFilterPoints); - if (m_traceLevel >= Trace::TRACE_PLOT) { - SGPDriver sgpDriver ("Frequency Filter: Fourier Order"); - SGP sgp (sgpDriver); - EZPlot ezplot (sgp); - - ezplot.ezset ("title Filter Response: Fourier Order"); - ezplot.addCurve (adFrequencyFilter, m_nFilterPoints); - ezplot.plot(); - cio_put_str ("Press any key to continue"); - cio_kb_getc (); + if (pEZPlot && m_traceLevel >= Trace::TRACE_PLOT) { + pEZPlot->ezset ("title Filter Response: Fourier Order"); + pEZPlot->ezset ("ylength 0.25"); + pEZPlot->ezset ("yporigin 0.25"); + pEZPlot->addCurve (adFrequencyFilter, m_nFilterPoints); + pEZPlot->plot(); } ProcessSignal::finiteFourierTransform (adFrequencyFilter, m_adFilter, m_nFilterPoints, -1); - if (m_traceLevel >= Trace::TRACE_PLOT) { - SGPDriver sgpDriver ("Inverse Fourier Frequency: Fourier Order"); - SGP sgp (sgpDriver); - EZPlot ezplot (sgp); - - ezplot.ezset ("title Inverse Fourier Frequency: Fourier Order"); - ezplot.addCurve (m_adFilter, m_nFilterPoints); - ezplot.plot(); - cio_put_str ("Press any key to continue"); - cio_kb_getc (); + if (pEZPlot && m_traceLevel >= Trace::TRACE_PLOT) { + pEZPlot->ezset ("title Inverse Fourier Frequency: Fourier Order"); + pEZPlot->ezset ("ylength 0.25"); + pEZPlot->ezset ("yporigin 0.50"); + pEZPlot->addCurve (m_adFilter, m_nFilterPoints); + pEZPlot->plot(); } shuffleFourierToNaturalOrder (m_adFilter, m_nFilterPoints); - if (m_traceLevel >= Trace::TRACE_PLOT) { - SGPDriver sgpDriver ("Inverse Fourier Frequency: Natural Order"); - SGP sgp (sgpDriver); - EZPlot ezplot (sgp); - - ezplot.ezset ("title Inverse Fourier Frequency: Natural Order"); - ezplot.addCurve (m_adFilter, m_nFilterPoints); - ezplot.plot(); - cio_put_str ("Press any key to continue"); - cio_kb_getc (); + if (pEZPlot && m_traceLevel >= Trace::TRACE_PLOT) { + pEZPlot->ezset ("title Inverse Fourier Frequency: Natural Order"); + pEZPlot->ezset ("ylength 0.25"); + pEZPlot->ezset ("yporigin 0.75"); + pEZPlot->addCurve (m_adFilter, m_nFilterPoints); + pEZPlot->plot(); + delete pEZPlot; } for (int i = 0; i < m_nFilterPoints; i++) { m_adFilter[i] /= m_dSignalInc; @@ -259,8 +245,10 @@ ProcessSignal::init (const int idFilter, const int idFilterMethod, double dBandw nextPowerOf2++; nextPowerOf2 += (m_iZeropad - 1); m_nFilterPoints = 1 << nextPowerOf2; +#ifdef DEBUG if (m_traceLevel >= Trace::TRACE_CONSOLE) - cout << "nFilterPoints = " << m_nFilterPoints << endl; + cout << "nFilterPoints = " << m_nFilterPoints << endl; +#endif } m_nOutputPoints = m_nFilterPoints * m_iPreinterpolationFactor; @@ -294,29 +282,24 @@ ProcessSignal::init (const int idFilter, const int idFilterMethod, double dBandw // m_adFilter[i] *= dScale; } } - if (m_traceLevel >= Trace::TRACE_PLOT) { - SGPDriver sgpDriver ("Frequency Filter: Natural Order"); - SGP sgp (sgpDriver); - EZPlot ezplot (sgp); - - ezplot.ezset ("title Filter Filter: Natural Order"); - ezplot.addCurve (m_adFilter, m_nFilterPoints); - ezplot.plot(); - cio_put_str ("Press any key to continue"); - cio_kb_getc (); + EZPlot* pEZPlot = NULL; + if (pSGP && m_traceLevel >= Trace::TRACE_PLOT) { + pEZPlot = new EZPlot (*pSGP); + pEZPlot->ezset ("title Filter Filter: Natural Order"); + pEZPlot->ezset ("ylength 0.50"); + pEZPlot->ezset ("yporigin 0.00"); + pEZPlot->addCurve (m_adFilter, m_nFilterPoints); + pEZPlot->plot(); } shuffleNaturalToFourierOrder (m_adFilter, m_nFilterPoints); - if (m_traceLevel >= Trace::TRACE_PLOT) { - SGPDriver sgpDriver ("Frequency Filter: Fourier Order"); - SGP sgp (sgpDriver); - EZPlot ezplot (sgp); - - ezplot.ezset ("title Filter Filter: Fourier Order"); - ezplot.addCurve (m_adFilter, m_nFilterPoints); - ezplot.plot(); - cio_put_str ("Press any key to continue"); - cio_kb_getc (); - } + if (pEZPlot && m_traceLevel >= Trace::TRACE_PLOT) { + pEZPlot->ezset ("title Filter Filter: Fourier Order"); + pEZPlot->ezset ("ylength 0.50"); + pEZPlot->ezset ("yporigin 0.50"); + pEZPlot->addCurve (m_adFilter, m_nFilterPoints); + pEZPlot->plot(); + delete pEZPlot; + } } else if (m_idFilterGeneration == FILTER_GENERATION_INVERSE_FOURIER) { // calculate number of filter points with zeropadding int nSpatialPoints = 2 * (m_nSignalPoints - 1) + 1; @@ -333,21 +316,22 @@ ProcessSignal::init (const int idFilter, const int idFilterMethod, double dBandw m_nFilterPoints = 1 << nextPowerOf2; } m_nOutputPoints = m_nFilterPoints * m_iPreinterpolationFactor; +#ifdef DEBUG if (m_traceLevel >= Trace::TRACE_CONSOLE) cout << "nFilterPoints = " << m_nFilterPoints << endl; +#endif double adSpatialFilter [m_nFilterPoints]; SignalFilter filter (m_idFilter, m_dFilterMin, m_dFilterMax, nSpatialPoints, m_dBandwidth, m_dFilterParam, SignalFilter::DOMAIN_SPATIAL); filter.copyFilterData (adSpatialFilter, 0, nSpatialPoints); - if (m_traceLevel >= Trace::TRACE_PLOT) { - SGPDriver sgpDriver ("Spatial Filter: Natural Order"); - SGP sgp (sgpDriver); - EZPlot ezplot (sgp); - - ezplot.ezset ("title Spatial Filter: Natural Order"); - ezplot.addCurve (adSpatialFilter, nSpatialPoints); - ezplot.plot(); - cio_put_str ("Press any key to continue"); - cio_kb_getc (); + EZPlot* pEZPlot = NULL; + if (pSGP && m_traceLevel >= Trace::TRACE_PLOT) { + pEZPlot = new EZPlot (*pSGP); + pEZPlot->ezset ("title Spatial Filter: Natural Order"); + pEZPlot->ezset ("ylength 0.50"); + pEZPlot->ezset ("yporigin 0.00"); + pEZPlot->addCurve (adSpatialFilter, nSpatialPoints); + pEZPlot->plot(); + delete pEZPlot; } if (m_idGeometry == Scanner::GEOMETRY_EQUILINEAR) { for (int i = 0; i < m_nFilterPoints; i++) @@ -372,16 +356,13 @@ ProcessSignal::init (const int idFilter, const int idFilterMethod, double dBandw finiteFourierTransform (adSpatialFilter, acInverseFilter, m_nFilterPoints, 1); for (int i = 0; i < m_nFilterPoints; i++) m_adFilter[i] = abs(acInverseFilter[i]) * m_dSignalInc; - if (m_traceLevel >= Trace::TRACE_PLOT) { - SGPDriver sgpDriver ("Spatial Filter: Inverse"); - SGP sgp (sgpDriver); - EZPlot ezplot (sgp); - - ezplot.ezset ("title Spatial Filter: Inverse"); - ezplot.addCurve (m_adFilter, m_nFilterPoints); - ezplot.plot(); - cio_put_str ("Press any key to continue"); - cio_kb_getc (); + if (pEZPlot && m_traceLevel >= Trace::TRACE_PLOT) { + pEZPlot->ezset ("title Spatial Filter: Inverse"); + pEZPlot->ezset ("ylength 0.50"); + pEZPlot->ezset ("yporigin 0.50"); + pEZPlot->addCurve (m_adFilter, m_nFilterPoints); + pEZPlot->plot(); + delete pEZPlot; } } } diff --git a/libctsim/projections.cpp b/libctsim/projections.cpp index be8e829..fb24e0d 100644 --- a/libctsim/projections.cpp +++ b/libctsim/projections.cpp @@ -8,7 +8,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: projections.cpp,v 1.24 2000/08/31 08:38:58 kevin Exp $ +** $Id: projections.cpp,v 1.25 2000/09/02 05:10:39 kevin Exp $ ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License (version 2) as @@ -66,6 +66,7 @@ Projections::~Projections (void) void Projections::init (const int nView, const int nDet) { + m_label.setLabelType (Array2dFileLabel::L_HISTORY); m_nView = nView; m_nDet = nDet; newProjData (); @@ -74,6 +75,7 @@ Projections::init (const int nView, const int nDet) void Projections::initFromScanner (const Scanner& scanner) { + m_label.setLabelType (Array2dFileLabel::L_HISTORY); deleteProjData(); init (scanner.nView(), scanner.nDet()); @@ -452,11 +454,10 @@ Projections::detarrayWrite (fnetorderstream& fs, const DetectorArray& darray, co } /* NAME - * prt_projections Print projections data + * printProjectionData Print projections data * * SYNOPSIS - * prt_projections (proj) - * Projections& proj Projection data to be printed + * printProjectionData () */ void @@ -498,149 +499,3 @@ Projections::printScanInfo (ostringstream& os) const -/* NAME - * Projections::reconstruct Reconstruct Image from Projections - * - * SYNOPSIS - * im = proj.reconstruct (im, filt_type, filt_param, interp_type) - * IMAGE *im Output image - * int filt_type Type of convolution filter to use - * double filt_param Filter specific parameter - * Currently, used only with Hamming filters - * int interp_type Type of interpolation method to use - * - * ALGORITHM - * - * Calculate one-dimensional filter in spatial domain - * Allocate & clear (zero) the 2d output image array - * For each projection view - * Convolve raysum array with filter - * Backproject raysums and add (summate) to image array - * end - */ - -bool -Projections::reconstruct (ImageFile& im, const char* const filterName, double filt_param, const char* const filterMethodName, const int zeropad, const char* filterGenerationName, const char* const interpName, int interpFactor, const char* const backprojectName, const int trace) const -{ - double detInc = m_detInc; - int n_filteredProj = m_nDet * interpFactor; - double filteredProj [n_filteredProj]; // filtered projections - -#ifdef HAVE_BSPLINE_INTERP - int spline_order = 0, zoom_factor = 0; - if (interp_type == I_BSPLINE) { - zoom_factor = interpFactor; - spline_order = 3; - zoom_factor = 3; - n_filteredProj = (m_nDet - 1) * (zoom_factor + 1) + 1; - } -#endif - - double filterBW = 1. / detInc; - ProcessSignal processSignal (filterName, filterMethodName, filterBW, m_detInc, m_nDet, filt_param, "spatial", filterGenerationName, zeropad, interpFactor, trace, m_geometry, m_focalLength); - - if (processSignal.fail()) { - sys_error (ERR_SEVERE, "%s [Projections::reconstruct]", processSignal.failMessage().c_str()); - return false; - } - - if (trace) - cout << "Reconstruct: filter="<= Trace::TRACE_CONSOLE) { - printf ("nview=%d, ndet=%d, det_start=%.4f, detInc=%.4f\n", m_nView, m_nDet, m_detStart, m_detInc); - } -#endif //HAVE_SGP - - Backprojector bj (*this, im, backprojectName, interpName, interpFactor); - if (bj.fail()) { - sys_error (ERR_SEVERE, "%s [Projections::reconstruct]", bj.failMessage().c_str()); - return false; - } - - for (int iview = 0; iview < m_nView; iview++) { - if (trace >= Trace::TRACE_CONSOLE) - cout <<"Reconstructing view " << iview << "(last = " << m_nView - 1 << ")\n"; - - const DetectorArray& darray = getDetectorArray (iview); - const DetectorValue* detval = darray.detValues(); - - processSignal.filterSignal (detval, filteredProj); - -#ifdef HAVE_BSPLINE_INTERP - if (interp_type == I_BSPLINE) - bspline (m_nDet, zoom_factor, spline_order, filteredProj, filteredProj); - -#ifdef HAVE_SGP - if (trace >= Trace::TRACE_PLOT && interp_type == I_BSPLINE) { - bspline (m_nDet, zoom_factor, spline_order, filteredProj, filteredProj); - ezplot_1d (filteredProj, n_filteredProj); - } -#endif -#endif - - bj.BackprojectView (filteredProj, darray.viewAngle()); - -#ifdef HAVE_SGP - if (trace >= Trace::TRACE_PLOT) { - SGPDriver sgpDriverProj ("Projection"); - SGP sgpProj (sgpDriverProj); - EZPlot ezplotProj (sgpProj); - - ezplotProj.ezset ("clear"); - ezplotProj.ezset ("title Filtered Projection"); - ezplotProj.ezset ("xticks major 5."); - ezplotProj.ezset ("xlabel "); - ezplotProj.ezset ("ylabel "); - ezplotProj.ezset ("yporigin .5."); - ezplotProj.ezset ("ylength .5."); - ezplotProj.ezset ("box."); - ezplotProj.ezset ("grid."); - ezplotProj.addCurve (plot_xaxis, detval, m_nDet); - ezplotProj.plot(); - ezplotProj.ezset ("clear"); - ezplotProj.ezset ("xticks major 5."); - ezplotProj.ezset ("xlabel "); - ezplotProj.ezset ("ylabel "); - ezplotProj.ezset ("ylength .5."); - ezplotProj.ezset ("box"); - ezplotProj.ezset ("grid"); - ezplotProj.addCurve (plot_xaxis, filteredProj, n_filteredProj); - ezplotProj.plot(); - - cout << "Do you want to exit with current pic (y/n)? " << flush; - char str[256]; - fgets(str, sizeof(str), stdin); - if (tolower(str[0]) == 'y') { - break; - } - } -#endif //HAVE_SGP - } - - return true; -} - diff --git a/libctsim/reconstruct.cpp b/libctsim/reconstruct.cpp new file mode 100644 index 0000000..8e09a16 --- /dev/null +++ b/libctsim/reconstruct.cpp @@ -0,0 +1,199 @@ +/***************************************************************************** +** FILE IDENTIFICATION +** +** Name: reconstruct.cpp Reconstruction class +** Programmer: Kevin Rosenberg +** Date Started: Aug 84 +** +** This is part of the CTSim program +** Copyright (C) 1983-2000 Kevin Rosenberg +** +** $Id: reconstruct.cpp,v 1.1 2000/09/02 05:13:57 kevin Exp $ +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License (version 2) as +** published by the Free Software Foundation. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +******************************************************************************/ + +#include "ct.h" + + +/* NAME + * Reconstructor::Reconstructor Reconstruct Image from Projections + * + * SYNOPSIS + * im = proj.reconstruct (im, filt_type, filt_param, interp_type) + * IMAGE *im Output image + * int filt_type Type of convolution filter to use + * double filt_param Filter specific parameter + * Currently, used only with Hamming filters + * int interp_type Type of interpolation method to use + * + * ALGORITHM + * + * Calculate one-dimensional filter in spatial domain + * Allocate & clear (zero) the 2d output image array + * For each projection view + * Convolve raysum array with filter + * Backproject raysums and add (summate) to image array + * end + */ + + +Reconstructor::Reconstructor (const Projections& rProj, ImageFile& rIF, const char* const filterName, double filt_param, const char* const filterMethodName, const int zeropad, const char* filterGenerationName, const char* const interpName, int interpFactor, const char* const backprojectName, const int iTrace, SGP* pSGP) + : m_rProj(rProj), m_rImagefile(rIF), m_pProcessSignal(0), m_pBackprojector(0), m_iTrace(iTrace), m_bFail(false), m_adPlotXAxis(0) +{ + m_nFilteredProjections = m_rProj.nDet() * interpFactor; + +#ifdef HAVE_BSPLINE_INTERP + int spline_order = 0, zoom_factor = 0; + if (interp_type == I_BSPLINE) { + zoom_factor = interpFactor; + spline_order = 3; + zoom_factor = 3; + m_nFilteredProjections = (m_nDet - 1) * (zoom_factor + 1) + 1; + } +#endif + + double filterBW = 1. / m_rProj.detInc(); + m_pProcessSignal = new ProcessSignal (filterName, filterMethodName, filterBW, m_rProj.detInc(), m_rProj.nDet(), filt_param, "spatial", filterGenerationName, zeropad, interpFactor, iTrace, m_rProj.geometry(), m_rProj.focalLength(), pSGP); + + if (m_pProcessSignal->fail()) { + m_bFail = true; + m_strFailMessage = "Error creating ProcessSignal: "; + m_strFailMessage += m_pProcessSignal->failMessage(); + delete m_pProcessSignal; m_pProcessSignal = NULL; + return; + } + + m_pBackprojector = new Backprojector (m_rProj, m_rImagefile, backprojectName, interpName, interpFactor); + if (m_pBackprojector->fail()) { + m_bFail = true; + m_strFailMessage = "Error creating backprojector: "; + m_strFailMessage += m_pBackprojector->failMessage(); + delete m_pBackprojector; m_pBackprojector = NULL; + delete m_pProcessSignal; m_pProcessSignal = NULL; + return; + } + +#if HAVE_SGP + m_adPlotXAxis = new double [m_rProj.nDet()]; + double x = - ((m_rProj.nDet() - 1) / 2) * m_rProj.detInc(); + double xInc = m_rProj.detInc(); + + for (int i = 0; i < m_rProj.nDet(); i++, x += xInc) + m_adPlotXAxis[i] = x; +#endif +} + +Reconstructor::~Reconstructor () +{ + delete m_pBackprojector; + delete m_pProcessSignal; + delete m_adPlotXAxis; +} + + +void +Reconstructor::plotFilter (SGP* pSGP) +{ +#if HAVE_SGP + int nVecFilter = m_pProcessSignal->getNFilterPoints(); + double adPlotXAxis [nVecFilter]; + + if (nVecFilter > 0 && pSGP) { + double f = m_pProcessSignal->getFilterMin(); + double filterInc = m_pProcessSignal->getFilterIncrement(); + for (int i = 0; i < nVecFilter; i++, f += filterInc) + adPlotXAxis[i] = f; + + if (m_pProcessSignal->getFilter()) { + EZPlot ezplot (*pSGP); + + ezplot.ezset ("title Filter Response"); + ezplot.addCurve (adPlotXAxis, m_pProcessSignal->getFilter(), nVecFilter); + ezplot.plot(); + } + } +#endif +} + + +void +Reconstructor::reconstructAllViews () +{ + reconstructView (0, m_rProj.nView()); + delete m_pBackprojector; m_pBackprojector = NULL; +} + + +void +Reconstructor::reconstructView (int iStartView, int iViewCount, SGP* pSGP) +{ + double adFilteredProj [m_nFilteredProjections]; // filtered projections + + if (iViewCount <= 0) + iViewCount = m_rProj.nView() - iStartView; + + for (int iView = iStartView; iView < (iStartView + iViewCount); iView++) { + if (m_iTrace == Trace::TRACE_CONSOLE) + cout <<"Reconstructing view " << iView << " (last = " << m_rProj.nView() - 1 << ")\n"; + + const DetectorArray& rDetArray = m_rProj.getDetectorArray (iView); + const DetectorValue* detval = rDetArray.detValues(); + + m_pProcessSignal->filterSignal (detval, adFilteredProj); + +#ifdef HAVE_BSPLINE_INTERP + if (interp_type == I_BSPLINE) + bspline (m_rProj.nDet(), zoom_factor, spline_order, adFilteredProj, adFilteredProj); + +#ifdef HAVE_SGP + if (trace >= Trace::TRACE_PLOT && interp_type == I_BSPLINE && pSGP) { + bspline (m_rProj.nDet(), zoom_factor, spline_order, adFilteredProj, adFilteredProj); + ezplot_1d (adFilteredProj, m_nFilteredProjections); + } +#endif +#endif + + m_pBackprojector->BackprojectView (adFilteredProj, rDetArray.viewAngle()); + +#ifdef HAVE_SGP + if (m_iTrace >= Trace::TRACE_PLOT && pSGP) { + EZPlot ezplotProj (*pSGP); + + ezplotProj.ezset ("clear"); + ezplotProj.ezset ("title Raw Projection"); + ezplotProj.ezset ("xticks major 5"); + ezplotProj.ezset ("xlabel "); + ezplotProj.ezset ("ylabel "); + ezplotProj.ezset ("yporigin .5"); + ezplotProj.ezset ("ylength .5"); + ezplotProj.ezset ("box."); + ezplotProj.ezset ("grid."); + ezplotProj.addCurve (m_adPlotXAxis, detval, m_rProj.nDet()); + ezplotProj.plot(); + ezplotProj.ezset ("clear"); + ezplotProj.ezset ("title Filtered Projection"); + ezplotProj.ezset ("xticks major 5"); + ezplotProj.ezset ("xlabel "); + ezplotProj.ezset ("ylabel "); + ezplotProj.ezset ("ylength .5"); + ezplotProj.ezset ("box"); + ezplotProj.ezset ("grid"); + ezplotProj.addCurve (m_adPlotXAxis, adFilteredProj, m_nFilteredProjections); + ezplotProj.plot(); + } +#endif //HAVE_SGP + } +} + diff --git a/libctsim/scanner.cpp b/libctsim/scanner.cpp index ef72c5b..7d95afd 100644 --- a/libctsim/scanner.cpp +++ b/libctsim/scanner.cpp @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: scanner.cpp,v 1.13 2000/08/31 08:38:58 kevin Exp $ +** $Id: scanner.cpp,v 1.14 2000/09/02 05:10:39 kevin Exp $ ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License (version 2) as @@ -95,12 +95,13 @@ Scanner::Scanner (const Phantom& phm, const char* const geometryName, int nDet, return; } - if (nView < 1) - nView = 1; + if (nView < 1 || nDet < 1) { + m_fail = true; + m_failMessage = "nView & nDet must be greater than 0"; + return; + } if (nSample < 1) m_nSample = 1; - if (nDet < 1) - nDet = 1; m_nDet = nDet; m_nView = nView; @@ -117,16 +118,18 @@ Scanner::Scanner (const Phantom& phm, const char* const geometryName, int nDet, if (m_idGeometry == GEOMETRY_PARALLEL) { m_detLen = m_dFieldOfView; m_detInc = m_detLen / m_nDet; + if (m_nDet % 2 == 0) // Adjust for Even number of detectors + m_detInc = m_detLen / (m_nDet - 1); // center detector = (nDet/2)-1 double dHalfDetLen = m_detLen / 2; - m_initPos.xs1 = m_dXCenter - m_dFocalLength; - m_initPos.ys1 = m_dYCenter + dHalfDetLen; - m_initPos.xs2 = m_dXCenter + m_dFocalLength; - m_initPos.ys2 = m_dYCenter + dHalfDetLen; - m_initPos.xd1 = m_dXCenter - m_dFocalLength; - m_initPos.yd1 = m_dYCenter - dHalfDetLen; - m_initPos.xd2 = m_dXCenter + m_dFocalLength; - m_initPos.yd2 = m_dYCenter - dHalfDetLen; + m_initPos.xs1 = m_dXCenter - dHalfDetLen; + m_initPos.ys1 = m_dYCenter + m_dFocalLength; + m_initPos.xs2 = m_dXCenter + dHalfDetLen; + m_initPos.ys2 = m_dYCenter + m_dFocalLength; + m_initPos.xd1 = m_dXCenter - dHalfDetLen; + m_initPos.yd1 = m_dYCenter - m_dFocalLength; + m_initPos.xd2 = m_dXCenter + dHalfDetLen; + m_initPos.yd2 = m_dYCenter - m_dFocalLength; m_initPos.angle = 0.0; } else if (m_idGeometry == GEOMETRY_EQUILINEAR) { #if 0 @@ -145,6 +148,8 @@ Scanner::Scanner (const Phantom& phm, const char* const geometryName, int nDet, m_detLen = dHalfDetLen * 2; m_detInc = m_detLen / m_nDet; + if (m_nDet % 2 == 0) // Adjust for Even number of detectors + m_detInc = m_detLen / (m_nDet - 1); // center detector = (nDet/2)-1 m_initPos.angle = 0.0; m_initPos.xs1 = m_dXCenter; @@ -171,7 +176,8 @@ Scanner::Scanner (const Phantom& phm, const char* const geometryName, int nDet, #endif m_detLen = 2 * dAngle; m_detInc = m_detLen / m_nDet; - + if (m_nDet % 2 == 0) // Adjust for Even number of detectors + m_detInc = m_detLen / (m_nDet - 1); // center detector = (nDet/2)-1 m_dAngularDetIncrement = m_detInc * 2; // Angular Position 2x gamma angle m_dAngularDetLen = m_detLen * 2; m_initPos.dAngularDet = -m_dAngularDetLen / 2; @@ -317,8 +323,6 @@ Scanner::collectProjections (Projections& proj, const Phantom& phm, const int iS phm.draw (*m_pSGP); m_dTextHeight = m_pSGP->getCharHeight (); - traceShowParam ("Projection Collector", "%s", PROJECTION_TRACE_ROW_TITLE, C_BLACK, " "); - traceShowParam ("________________", "%s", PROJECTION_TRACE_ROW_TITLE2, C_LTGRAY, " "); traceShowParam ("Phantom:", "%s", PROJECTION_TRACE_ROW_PHANT_ID, C_BLACK, phm.name().c_str()); traceShowParam ("Geometry:", "%s", PROJECTION_TRACE_ROW_GEOMETRY, C_BLUE, convertGeometryIDToName(m_idGeometry)); traceShowParam ("Focal Length Ratio:", "%.2f", PROJECTION_TRACE_ROW_FOCAL_LENGTH, C_BLUE, m_dFocalLengthRatio); @@ -468,10 +472,10 @@ Scanner::projectSingleView (const Phantom& phm, DetectorArray& detArray, const d sum += projectSingleLine (phm, xd, yd, xs, ys); #ifdef HAVE_SGP - if (m_trace >= Trace::TRACE_CLIPPING) { - traceShowParam ("Attenuation:", "%s", PROJECTION_TRACE_ROW_ATTEN, C_LTMAGENTA, " "); - traceShowParam ("Attenuation:", "%.3f", PROJECTION_TRACE_ROW_ATTEN, C_LTMAGENTA, sum); - } + // if (m_trace >= Trace::TRACE_CLIPPING) { + // traceShowParam ("Attenuation:", "%s", PROJECTION_TRACE_ROW_ATTEN, C_LTMAGENTA, " "); + // traceShowParam ("Attenuation:", "%.3f", PROJECTION_TRACE_ROW_ATTEN, C_LTMAGENTA, sum); + // } #endif if (m_idGeometry == GEOMETRY_EQUIANGULAR) dAngle += dAngleSampleInc; @@ -530,7 +534,7 @@ Scanner::traceShowParamRasterOp (int iRasterOp, const char *szLabel, const char m_pSGP->moveAbs (m_dXMinWin, dYPos); m_pSGP->setTextColor (color, -1); m_pSGP->drawText (szLabel); - double dValueOffset = (m_dXMaxWin - m_dXMinWin) / 5; + double dValueOffset = (m_dXMaxWin - m_dXMinWin) / 4; m_pSGP->moveAbs (m_dXMinWin + dValueOffset, dYPos); m_pSGP->drawText (szValue); } else { diff --git a/rpm/ctsim-2.0.0b9-1.spec b/rpm/ctsim-2.0.0b9-1.spec index 948cf19..c731b0a 100644 --- a/rpm/ctsim-2.0.0b9-1.spec +++ b/rpm/ctsim-2.0.0b9-1.spec @@ -18,7 +18,7 @@ CTSim is a Computed Tomography Simulator. %build CFLAGS="$RPM_OPT_FLAGS" \ - ./configure --prefix=/usr/local + ./configure --prefix=/usr/local --enable-static make %install diff --git a/src/Makefile.am b/src/Makefile.am index 6d252c1..86b5667 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,6 +1,6 @@ bin_PROGRAMS=ctsim -ctsim_SOURCES=ctsim.cpp docs.cpp views.cpp dialogs.cpp ctsim.h docs.h views.h dialogs.h dlgprojections.cpp dlgprojections.h +ctsim_SOURCES=ctsim.cpp docs.cpp views.cpp dialogs.cpp ctsim.h docs.h views.h dialogs.h dlgprojections.cpp dlgprojections.h dlgreconstruct.cpp dlgreconstruct.h ctsim_DEPENDENCIES=../libctgraphics/libctgraphics.a ../libctsupport/libctsupport.a ../libctsim/libctsim.a ../include/ct.h ctsim_LDADD=-L../libctgraphics -L../libctsupport -L../libctsim @ctlibs@ diff --git a/src/dialogs.cpp b/src/dialogs.cpp index 57c95f8..3035244 100644 --- a/src/dialogs.cpp +++ b/src/dialogs.cpp @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: dialogs.cpp,v 1.11 2000/08/31 08:38:58 kevin Exp $ +** $Id: dialogs.cpp,v 1.12 2000/09/02 05:10:39 kevin Exp $ ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License (version 2) as @@ -280,7 +280,7 @@ DialogGetRasterParameters::getNSamples (void) ///////////////////////////////////////////////////////////////////// -DialogGetProjectionParameters::DialogGetProjectionParameters (wxFrame* pParent, int iDefaultNDet = 0, int iDefaultNView = 0, int iDefaultNSamples = 1, double dDefaultRotAngle = 1., double dDefaultFocalLength = 1, double dDefaultFieldOfView = 1., int iDefaultGeometry = Scanner::GEOMETRY_PARALLEL, int iDefaultTrace = Trace::TRACE_NONE) +DialogGetProjectionParameters::DialogGetProjectionParameters (wxFrame* pParent, int iDefaultNDet, int iDefaultNView, int iDefaultNSamples, double dDefaultRotAngle, double dDefaultFocalLength, double dDefaultFieldOfView, int iDefaultGeometry, int iDefaultTrace) : wxDialog (pParent, -1, "Set Projection Parameters", wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxCAPTION) { wxBoxSizer* pTopSizer = new wxBoxSizer (wxVERTICAL); @@ -292,13 +292,15 @@ DialogGetProjectionParameters::DialogGetProjectionParameters (wxFrame* pParent, m_iDefaultNView = iDefaultNView; m_iDefaultNDet = iDefaultNDet; m_iDefaultTrace = iDefaultTrace; + m_iDefaultGeometry = iDefaultGeometry; + pTopSizer->Add (new wxStaticText (this, -1, "Set Projection Parameters"), 0, wxALIGN_CENTER | wxTOP | wxLEFT | wxRIGHT, 5); pTopSizer->Add (new wxStaticLine (this, -1, wxDefaultPosition, wxSize(3,3), wxHORIZONTAL), 0, wxEXPAND | wxALL, 5); m_pListBoxGeometry = new StringValueAndTitleListBox (this, Scanner::getGeometryCount(), Scanner::getGeometryTitleArray(), Scanner::getGeometryNameArray()); - m_pListBoxGeometry->SetSelection (iDefaultGeometry); + m_pListBoxGeometry->SetSelection (iDefaultGeometry, true); ostringstream os; os << iDefaultNDet; @@ -456,7 +458,7 @@ DialogGetProjectionParameters::getTrace (void) ///////////////////////////////////////////////////////////////////// -DialogGetReconstructionParameters::DialogGetReconstructionParameters (wxFrame* pParent, int iDefaultXSize = 0, int iDefaultYSize = 0, int iDefaultFilterID = SignalFilter::FILTER_ABS_BANDLIMIT, double dDefaultFilterParam = 1., int iDefaultFilterMethodID = ProcessSignal::FILTER_METHOD_CONVOLUTION, int iDefaultFilterGenerationID = ProcessSignal::FILTER_GENERATION_INVALID, int iDefaultZeropad = 3, int iDefaultInterpID = Backprojector::INTERP_LINEAR, int iDefaultInterpParam = 1, int iDefaultBackprojectID = Backprojector::BPROJ_IDIFF3) +DialogGetReconstructionParameters::DialogGetReconstructionParameters (wxFrame* pParent, int iDefaultXSize, int iDefaultYSize, int iDefaultFilterID, double dDefaultFilterParam, int iDefaultFilterMethodID, int iDefaultFilterGenerationID, int iDefaultZeropad, int iDefaultInterpID, int iDefaultInterpParam, int iDefaultBackprojectID, int iTrace) : wxDialog (pParent, -1, "Set Reconstruction Parameters", wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxCAPTION) { wxBoxSizer* pTopSizer = new wxBoxSizer (wxVERTICAL); @@ -521,6 +523,10 @@ DialogGetReconstructionParameters::DialogGetReconstructionParameters (wxFrame* p pGridSizer->Add (m_pTextCtrlInterpParam, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL); pTopSizer->Add (pGridSizer, 1, wxALL, 3); + m_pListBoxTrace = new StringValueAndTitleListBox (this, Trace::getTraceCount(), Trace::getTraceTitleArray(), Trace::getTraceNameArray()); + m_pListBoxTrace->SetSelection (iTrace); + pTopSizer->Add (m_pListBoxTrace); + pTopSizer->Add (new wxStaticLine (this, -1, wxDefaultPosition, wxSize(3,3), wxHORIZONTAL), 0, wxEXPAND | wxALL, 5); wxBoxSizer* pButtonSizer = new wxBoxSizer (wxHORIZONTAL); @@ -617,6 +623,12 @@ DialogGetReconstructionParameters::getInterpName (void) return m_pListBoxInterp->getSelectionStringValue(); } +int +DialogGetReconstructionParameters::getTrace (void) +{ + return Trace::convertTraceNameToID(m_pListBoxTrace->getSelectionStringValue()); +} + const char* DialogGetReconstructionParameters::getBackprojectName (void) { diff --git a/src/dialogs.h b/src/dialogs.h index 7271339..1cd86e3 100644 --- a/src/dialogs.h +++ b/src/dialogs.h @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: dialogs.h,v 1.12 2000/08/31 08:38:58 kevin Exp $ +** $Id: dialogs.h,v 1.13 2000/09/02 05:10:39 kevin Exp $ ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License (version 2) as @@ -47,7 +47,7 @@ class StringValueAndTitleListBox : public wxListBox public: StringValueAndTitleListBox (wxDialog* pParent, int nChoices, const char* aszTitle[], const char* aszValue[]); - const char* getSelectionStringValue (void) const; + const char* getSelectionStringValue () const; private: const char** m_ppszValues; @@ -58,9 +58,9 @@ class DialogGetPhantom : public wxDialog { public: DialogGetPhantom (wxFrame* pParent, int iDefaultPhantom = Phantom::PHM_HERMAN); - virtual ~DialogGetPhantom (void) {} + virtual ~DialogGetPhantom () {} - const char* getPhantom (void); + const char* getPhantom (); private: StringValueAndTitleListBox* m_pListBoxPhantom; @@ -72,10 +72,10 @@ class DialogGetImageMinMax : public wxDialog { public: DialogGetImageMinMax (wxFrame* pParent, const ImageFile& rImagefile, double dDefaultMin = 0., double dDefaultMax = 0.); - virtual ~DialogGetImageMinMax (void); + virtual ~DialogGetImageMinMax (); - double getMinimum (void); - double getMaximum (void); + double getMinimum (); + double getMaximum (); private: wxTextCtrl* m_pTextCtrlMin; @@ -90,11 +90,11 @@ class DialogGetRasterParameters : public wxDialog { public: DialogGetRasterParameters (wxFrame* pParent, int iDefaultXSize = 0, int iDefaultYSize = 0, int iDefaultNSamples = 1); - virtual ~DialogGetRasterParameters (void); + virtual ~DialogGetRasterParameters (); - unsigned int getXSize (void); - unsigned int getYSize (void); - unsigned int getNSamples (void); + unsigned int getXSize (); + unsigned int getYSize (); + unsigned int getNSamples (); private: wxTextCtrl* m_pTextCtrlXSize; @@ -111,17 +111,17 @@ class DialogGetProjectionParameters : public wxDialog { public: DialogGetProjectionParameters (wxFrame* pParent, int iDefaultNDet = 0, int iDefaultNView = 0, int iDefaultNSamples = 1, double dDefaultRotAngle = 1., double dDefaultFocalLength = 1, double dDefaultFieldOfView = 1., int iDefaultGeometry = Scanner::GEOMETRY_PARALLEL, int iDefaultTrace = Trace::TRACE_NONE); - ~DialogGetProjectionParameters (void); + ~DialogGetProjectionParameters (); - unsigned int getNDet (void); - unsigned int getNView (void); - unsigned int getNSamples (void); - int getTrace (void); + unsigned int getNDet (); + unsigned int getNView (); + unsigned int getNSamples (); + int getTrace (); - double getRotAngle (void); - double getFieldOfViewRatio (void); - double getFocalLengthRatio (void); - const char* getGeometry(void); + double getRotAngle (); + double getFieldOfViewRatio (); + double getFocalLengthRatio (); + const char* getGeometry(); private: wxTextCtrl* m_pTextCtrlNDet; @@ -138,6 +138,7 @@ class DialogGetProjectionParameters : public wxDialog int m_iDefaultNView; int m_iDefaultNSamples; int m_iDefaultTrace; + int m_iDefaultGeometry; double m_dDefaultRotAngle; double m_dDefaultFocalLength; double m_dDefaultFieldOfView; @@ -148,19 +149,20 @@ class DialogGetProjectionParameters : public wxDialog class DialogGetReconstructionParameters : public wxDialog { public: - DialogGetReconstructionParameters (wxFrame* pParent, int iDefaultXSize = 0, int iDefaultYSize = 0, int iDefaultFilterID = SignalFilter::FILTER_ABS_BANDLIMIT, double dDefaultFilterParam = 1., int iDefaultFilterMethodID = ProcessSignal::FILTER_METHOD_CONVOLUTION, int iDefaultFilterGeneration = ProcessSignal::FILTER_GENERATION_INVALID, int iDefaultZeropad = 3, int iDefaultInterpID = Backprojector::INTERP_LINEAR, int iDefaultInterpParam = 1, int iDefaultBackprojectID = Backprojector::BPROJ_IDIFF3); - virtual ~DialogGetReconstructionParameters (void); - - unsigned int getXSize(void); - unsigned int getYSize(void); - const char* getFilterName(void); - double getFilterParam(void); - const char* getFilterMethodName(void); - unsigned int getZeropad(void); - const char* getFilterGenerationName(void); - const char* getInterpName(void); - unsigned int getInterpParam(void); - const char* getBackprojectName(void); + DialogGetReconstructionParameters (wxFrame* pParent, int iDefaultXSize = 0, int iDefaultYSize = 0, int iDefaultFilterID = SignalFilter::FILTER_ABS_BANDLIMIT, double dDefaultFilterParam = 1., int iDefaultFilterMethodID = ProcessSignal::FILTER_METHOD_CONVOLUTION, int iDefaultFilterGeneration = ProcessSignal::FILTER_GENERATION_INVALID, int iDefaultZeropad = 3, int iDefaultInterpID = Backprojector::INTERP_LINEAR, int iDefaultInterpParam = 1, int iDefaultBackprojectID = Backprojector::BPROJ_IDIFF3, int iDefaultTrace = Trace::TRACE_NONE); + virtual ~DialogGetReconstructionParameters (); + + unsigned int getXSize(); + unsigned int getYSize(); + const char* getFilterName(); + double getFilterParam(); + const char* getFilterMethodName(); + unsigned int getZeropad(); + const char* getFilterGenerationName(); + const char* getInterpName(); + unsigned int getInterpParam(); + const char* getBackprojectName(); + int getTrace (); private: wxTextCtrl* m_pTextCtrlXSize; @@ -174,12 +176,14 @@ class DialogGetReconstructionParameters : public wxDialog StringValueAndTitleListBox* m_pListBoxFilterGeneration; StringValueAndTitleListBox* m_pListBoxInterp; StringValueAndTitleListBox* m_pListBoxBackproject; + StringValueAndTitleListBox* m_pListBoxTrace; int m_iDefaultXSize; int m_iDefaultYSize; double m_dDefaultFilterParam; int m_iDefaultZeropad; int m_iDefaultInterpParam; + int m_iDefaultTrace; }; class DialogAutoScaleParameters : public wxDialog diff --git a/src/dlgprojections.cpp b/src/dlgprojections.cpp index 4f79334..53b15cf 100644 --- a/src/dlgprojections.cpp +++ b/src/dlgprojections.cpp @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: dlgprojections.cpp,v 1.2 2000/08/31 08:38:58 kevin Exp $ +** $Id: dlgprojections.cpp,v 1.3 2000/09/02 05:10:39 kevin Exp $ ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License (version 2) as @@ -106,13 +106,13 @@ ProjectionsDialog::ProjectionsDialog (Scanner& rScanner, Projections& rProj, con SetAutoLayout(TRUE); Layout(); - wxSize sizeDlg (600,600); + wxSize sizeDlg (500,500); if (sizeDlg.x != sizeDlg.y) { sizeDlg.x = max(sizeDlg.x,sizeDlg.y); sizeDlg.y = max(sizeDlg.x,sizeDlg.y); } if (m_iTrace >= Trace::TRACE_PLOT) - sizeDlg.x += 200; + sizeDlg.x += 250; m_iClientX = sizeDlg.x; m_iClientY = sizeDlg.y; @@ -148,7 +148,7 @@ ProjectionsDialog::showView (int iViewNumber) wxYield(); // update the display m_iLastView = iViewNumber; if (m_iTrace >= Trace::TRACE_PLOT) - m_pSGP->setViewport (0, 0, 0.75, 1); + m_pSGP->setViewport (0, 0, 0.66, 1); m_rScanner.collectProjections (m_rProjections, m_rPhantom, iViewNumber, 1, true, m_iTrace, m_pSGP); if (m_iTrace >= Trace::TRACE_PLOT) { const DetectorArray& detArray = m_rProjections.getDetectorArray (iViewNumber); @@ -157,9 +157,9 @@ ProjectionsDialog::showView (int iViewNumber) for (int i = 0; i < detArray.nDet(); i++) detPos[i] = i; EZPlot ezplot (*m_pSGP); - ezplot.ezset("xporigin 0.75"); + ezplot.ezset("xporigin 0.66"); ezplot.ezset("yporigin 0.10"); - ezplot.ezset("xlength 0.25"); + ezplot.ezset("xlength 0.34"); ezplot.ezset("ylength 0.90"); ezplot.ezset("grid"); ezplot.ezset("box"); diff --git a/src/dlgreconstruct.cpp b/src/dlgreconstruct.cpp new file mode 100644 index 0000000..e8e01e2 --- /dev/null +++ b/src/dlgreconstruct.cpp @@ -0,0 +1,278 @@ +/***************************************************************************** +** FILE IDENTIFICATION +** +** Name: dlgreconstruct.cpp +** Purpose: Projection Collection Animation Dialog +** Programmer: Kevin Rosenberg +** Date Started: August 2000 +** +** This is part of the CTSim program +** Copyright (C) 1983-2000 Kevin Rosenberg +** +** $Id: dlgreconstruct.cpp,v 1.1 2000/09/02 05:13:57 kevin Exp $ +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License (version 2) as +** published by the Free Software Foundation. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +******************************************************************************/ + +#ifdef __GNUG__ + #pragma implementation "dlgreconstruct.h" +#endif + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP + #include "wx/utils.h" + #include "wx/frame.h" + #include "wx/button.h" + #include "wx/stattext.h" + #include "wx/layout.h" + #include "wx/event.h" + #include "wx/intl.h" + #include "wx/settings.h" + #include "wx/dcclient.h" + #include "wx/timer.h" +#endif + +#include "dlgreconstruct.h" +#include "ct.h" + + +static const int LAYOUT_X_MARGIN = 4; +static const int LAYOUT_Y_MARGIN = 4; + +BEGIN_EVENT_TABLE(ReconstructDialog, wxDialog) + EVT_BUTTON(wxID_CANCEL, ReconstructDialog::OnCancel) + EVT_BUTTON(ID_BTN_PAUSE, ReconstructDialog::OnPause) + EVT_BUTTON(ID_BTN_STEP, ReconstructDialog::OnStep) + EVT_CLOSE(ReconstructDialog::OnClose) + EVT_PAINT(ReconstructDialog::OnPaint) +END_EVENT_TABLE() + +IMPLEMENT_CLASS(ReconstructDialog, wxDialog) + + +ReconstructDialog::ReconstructDialog (Reconstructor& rReconstruct, const Projections& rProj, ImageFile& rIF, const int iTrace, wxWindow *parent) + : wxDialog(parent, -1, "Collect Projections"), m_rReconstructor(rReconstruct), m_rProjections(rProj), m_rImageFile(rIF), m_pSGPDriver(NULL), m_pSGP(NULL), m_iTrace(iTrace), m_pDC(NULL), m_btnAbort(0), m_btnPause(0), m_btnStep(0) +{ + m_state = Continue; + m_iLastView = -1; + m_parentTop = parent; + while ( m_parentTop && m_parentTop->GetParent() ) + m_parentTop = m_parentTop->GetParent(); + + m_btnAbort = new wxButton(this, wxID_CANCEL, _("Cancel")); + wxLayoutConstraints* c = new wxLayoutConstraints; + c->right.SameAs(this, wxRight, 2*LAYOUT_X_MARGIN); + c->bottom.SameAs(this, wxBottom, 2*LAYOUT_Y_MARGIN); + + wxSize sizeBtn = wxButton::GetDefaultSize(); + c->width.Absolute(sizeBtn.x); + c->height.Absolute(sizeBtn.y); + + m_btnAbort->SetConstraints(c); + + m_btnPause = new wxButton (this, ID_BTN_PAUSE, wxString("Pause")); + wxLayoutConstraints* cPause = new wxLayoutConstraints; + cPause->right.SameAs(this, wxRight, 3*LAYOUT_X_MARGIN + sizeBtn.x); + cPause->bottom.SameAs(this, wxBottom, 2*LAYOUT_Y_MARGIN); + cPause->width.Absolute(sizeBtn.x); + cPause->height.Absolute(sizeBtn.y); + m_btnPause->SetConstraints(cPause); + + m_btnStep = new wxButton (this, ID_BTN_STEP, wxString("Step")); + wxLayoutConstraints* cStep = new wxLayoutConstraints; + cStep->right.SameAs(this, wxRight, 5*LAYOUT_X_MARGIN + sizeBtn.x * 2); + cStep->bottom.SameAs(this, wxBottom, 2*LAYOUT_Y_MARGIN); + cStep->width.Absolute(sizeBtn.x); + cStep->height.Absolute(sizeBtn.y); + m_btnStep->SetConstraints(cStep); + + SetAutoLayout(TRUE); + Layout(); + + wxSize sizeDlg (700,500); + if (sizeDlg.x != sizeDlg.y) { + sizeDlg.x = max(sizeDlg.x,sizeDlg.y); + sizeDlg.y = max(sizeDlg.x,sizeDlg.y); + } + + m_iClientX = sizeDlg.x; + m_iClientY = sizeDlg.y; + SetClientSize(sizeDlg); + + m_bitmap.Create (m_iClientX, m_iClientY); // save a copy of screen + m_pDC = new wxMemoryDC; + m_pDC->SelectObject (m_bitmap); // in memoryDC + m_pDC->SetFont (*wxSWISS_FONT); + int x, y; + this->GetClientSize(&x, &y); + m_pSGPDriver = new SGPDriver (dynamic_cast(m_pDC), x, y); + m_pSGP = new SGP (*m_pSGPDriver); + + Centre(wxCENTER_FRAME | wxBOTH); + + if ( m_parentTop ) + m_parentTop->Enable(FALSE); + + Show(TRUE); + Enable(TRUE); // enable this window + + wxYield(); // Update the display + + m_pSGPDriver->idWX()->SetFont(*wxSWISS_FONT); +#ifdef __WXMAC__ + MacUpdateImmediately(); +#endif +} + +void +ReconstructDialog::showView (int iViewNumber) +{ + if ( iViewNumber < m_rProjections.nView() ) { + wxYield(); // update the display + m_iLastView = iViewNumber; + m_pSGP->eraseWindow(); + if (m_iTrace >= Trace::TRACE_PLOT) + m_pSGP->setViewport (0, 0, 1, 1); + char szProgress [256]; + snprintf (szProgress, sizeof(szProgress), "Reconstructing View %d (%.1f%%)", iViewNumber, 100 * iViewNumber / static_cast(m_rProjections.nView())); + double wText, hText; + m_pSGP->setTextColor (C_LTRED, -1); + m_pSGP->getTextExtent (szProgress, &wText, &hText); + double xw_max, xw_min, yw_max, yw_min; + m_pSGP->getWindow (xw_min, yw_min, xw_max, yw_max); + m_pSGP->moveAbs ((xw_max - xw_min) / 2 + xw_min - wText / 2, yw_max - hText); + m_pSGP->drawText (szProgress); + if (m_iTrace >= Trace::TRACE_PLOT) + m_pSGP->setViewport (0, .1, 0.66, 1); + m_rReconstructor.reconstructView (iViewNumber, 1, m_pSGP); + + ::wxYield(); + m_pDC->SelectObject (wxNullBitmap); + Refresh(); + m_pDC->SelectObject (m_bitmap); + ::wxYield(); + } +} + +bool +ReconstructDialog::reconstructView (int iViewNumber) +{ + showView (iViewNumber); + wxYield(); // update the display + if (m_iTrace >= Trace::TRACE_PLOT) + sleep(1); + else { + m_state = Finished; // so that we return TRUE below and + } // that [Cancel] handler knew what to do + +#ifdef __WXMAC__ + MacUpdateImmediately(); +#endif + + return m_state != Cancelled; +} + + +// EVENT HANDLERS + +void ReconstructDialog::OnCancel (wxCommandEvent& event) +{ + if ( m_state == Finished ) { + // this means that the count down is already finished and we're being + // shown as a modal dialog - so just let the default handler do the job + event.Skip(); + } else { + // request to cancel was received, the next time Update() is called we + // will handle it + m_state = Cancelled; + + // update the button state immediately so that the user knows that the + // request has been noticed + m_btnAbort->Disable(); + } +} + + +void +ReconstructDialog::OnPause (wxCommandEvent& event) +{ + if ( m_state == Finished ) { + // this means that the count down is already finished and we're being + // shown as a modal dialog - so just let the default handler do the job + event.Skip(); + } else { + if (m_state == Continue) { + m_state = Paused; + m_btnPause->SetLabel (wxString("Resume")); + } else if (m_state == Paused) { + m_state = Continue; + m_btnPause->SetLabel (wxString("Pause")); + } + } +} + +void +ReconstructDialog::OnStep (wxCommandEvent& event) +{ + if ( m_state == Finished ) { + event.Skip(); + } else { + if (m_state == Continue) { + m_state = Paused; + m_btnPause->SetLabel (wxString("Resume")); + } else if (m_state == Paused) { + reconstructView (m_iLastView + 1); + } + } +} + +void ReconstructDialog::OnClose(wxCloseEvent& event) +{ + if ( m_state == Uncancellable ) + event.Veto(TRUE); // can't close this dialog + else if ( m_state == Finished ) + event.Skip(); // let the default handler close the window as we already terminated + else + m_state = Cancelled; // next Update() will notice it +} + +void +ReconstructDialog::OnPaint (wxPaintEvent& event) +{ + wxPaintDC paintDC (this); + if (m_state == Paused) { + paintDC.DrawBitmap(m_bitmap, 0, 0, false); + } +} + + +///////////////////////////////////////////////////// +// destruction + +ReconstructDialog::~ReconstructDialog() +{ + if ( m_parentTop ) + m_parentTop->Enable(TRUE); + + delete m_pSGP; + delete m_pSGPDriver; + delete m_pDC; +} + diff --git a/src/dlgreconstruct.h b/src/dlgreconstruct.h new file mode 100644 index 0000000..b73cf09 --- /dev/null +++ b/src/dlgreconstruct.h @@ -0,0 +1,121 @@ +/***************************************************************************** +** FILE IDENTIFICATION +** +** Name: dlgreconstruct.h +** Purpose: Headers for Projection Collection Animation Dialog +** Programmer: Kevin Rosenberg +** Date Started: August 2000 +** +** This is part of the CTSim program +** Copyright (C) 1983-2000 Kevin Rosenberg +** +** $Id: dlgreconstruct.h,v 1.1 2000/09/02 05:13:57 kevin Exp $ +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License (version 2) as +** published by the Free Software Foundation. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +******************************************************************************/ + +#ifndef __DLGRECONSTRUCT_H_ +#define __DLGRECONSTRUCT_H_ + +#ifdef __GNUG__ +#pragma interface "dlgreconstruct.h" +#endif + +#include "wx/setup.h" +#include "wx/dialog.h" +#include "wx/dcmemory.h" + +class wxButton; +class wxStaticText; +class Projections; +class ImageFile; +class SGP; +class SGPDriver; +class Reconstructor; + +class ReconstructDialog : public wxDialog +{ + DECLARE_DYNAMIC_CLASS(ReconstructDialog) + +public: + ReconstructDialog (Reconstructor& rReconstruct, const Projections& rProj, ImageFile& rIF, const int iTrace, wxWindow *parent); + + ~ReconstructDialog(); + + /* Perform projection on view number + return true if ABORT button has not been pressed + */ + bool reconstructView (int iViewNumber); + + /* Can be called to continue after the cancel button has been pressed, but + the program decided to continue the operation (e.g., user didn't + confirm it) + */ + void Resume() { m_state = Continue; } + + // implementation from now on + // callback for optional abort button + void OnCancel(wxCommandEvent& event); + // callback to disable "hard" window closing + void OnClose(wxCloseEvent& event); + void OnPaint(wxPaintEvent& event); + + void OnPause(wxCommandEvent& event); + void OnStep(wxCommandEvent& event); + + bool isPaused() const {return m_state == Paused;} + + bool isCancelled() const {return m_state == Cancelled;} + +private: + // parent top level window (may be NULL) + wxWindow *m_parentTop; + int m_iLastView; + int m_iClientX; // size of client window + int m_iClientY; + + Reconstructor& m_rReconstructor; + const Projections& m_rProjections; + ImageFile& m_rImageFile; + SGPDriver* m_pSGPDriver; + SGP* m_pSGP; + const int m_iTrace; + wxMemoryDC* m_pDC; + + wxButton *m_btnAbort; // the abort button (or NULL if none) + wxButton *m_btnPause; + wxButton *m_btnStep; + + wxMemoryDC m_memoryDC; // for restoring image on OnPaint + wxBitmap m_bitmap; + + // continue processing or not (return value for Update()) + enum + { + Uncancellable = -1, // dialog can't be canceled + Paused, + Cancelled, // can be cancelled and, in fact, was + Continue, // can be cancelled but wasn't + Finished // finished, waiting to be removed from screen + } m_state; + + const static int ID_BTN_PAUSE = 19998; + const static int ID_BTN_STEP = 19999; + + void showView (int iViewNumber); + + DECLARE_EVENT_TABLE() +}; +#endif + diff --git a/src/views.cpp b/src/views.cpp index 3df51fa..d60515b 100644 --- a/src/views.cpp +++ b/src/views.cpp @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: views.cpp,v 1.18 2000/08/31 08:38:58 kevin Exp $ +** $Id: views.cpp,v 1.19 2000/09/02 05:10:39 kevin Exp $ ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License (version 2) as @@ -45,6 +45,7 @@ #endif #include "wx/image.h" +#include "wx/progdlg.h" #include "ct.h" #include "ctsim.h" @@ -52,8 +53,11 @@ #include "views.h" #include "dialogs.h" #include "dlgprojections.h" +#include "dlgreconstruct.h" #include #include "backprojectors.h" +#include "reconstruct.h" +#include "timer.h" // ImageFileCanvas @@ -135,16 +139,8 @@ ImageFileView::OnProperties (wxCommandEvent& event) ostringstream os; os << "file: " << rFilename << "\nmin: "<getLog() << os.str().c_str(); - - int xSize, ySize; - ostringstream osSize; - m_frame->GetSize (&xSize, &ySize); - osSize << "Frame size: (" << xSize << "," << ySize << ")\n"; - m_frame->GetClientSize (&xSize, &ySize); - osSize << "Frame Client size: (" << xSize << "," << ySize << ")\n"; - m_canvas->GetSize (&xSize, &ySize); - osSize << "Canvas size: (" << xSize << "," << ySize << ")\n"; - *theApp->getLog() << osSize.str().c_str(); + wxMessageDialog dialogMsg (m_frame, os.str().c_str(), "Imagefile Properties", wxOK | wxICON_INFORMATION); + dialogMsg.ShowModal(); } } @@ -382,6 +378,14 @@ END_EVENT_TABLE() PhantomView::PhantomView(void) : wxView(), m_canvas(NULL), m_frame(NULL) { + m_iDefaultNDet = 367; + m_iDefaultNView = 320; + m_iDefaultNSample = 2; + m_dDefaultRotation = 2; + m_dDefaultFocalLength = 2; + m_dDefaultFieldOfView = 1; + m_iDefaultGeometry = Scanner::GEOMETRY_PARALLEL; + m_iDefaultTrace = Trace::TRACE_NONE; } PhantomView::~PhantomView(void) @@ -406,31 +410,33 @@ PhantomView::OnProperties (wxCommandEvent& event) void PhantomView::OnProjections (wxCommandEvent& event) { - DialogGetProjectionParameters dialogProjection (m_frame, 367, 320, 1, 1., 1., 1., Scanner::GEOMETRY_PARALLEL, Trace::TRACE_NONE); + DialogGetProjectionParameters dialogProjection (m_frame, m_iDefaultNDet, m_iDefaultNView, m_iDefaultNSample, m_dDefaultRotation, m_dDefaultFocalLength, m_dDefaultFieldOfView, m_iDefaultGeometry, m_iDefaultTrace); int retVal = dialogProjection.ShowModal(); if (retVal == wxID_OK) { - int nDet = dialogProjection.getNDet(); - int nView = dialogProjection.getNView(); - int nSamples = dialogProjection.getNSamples(); - int iTrace = dialogProjection.getTrace(); - double dRotAngle = dialogProjection.getRotAngle(); - double dFocalLengthRatio = dialogProjection.getFocalLengthRatio(); - double dFieldOfViewRatio = dialogProjection.getFieldOfViewRatio(); - + m_iDefaultNDet = dialogProjection.getNDet(); + m_iDefaultNView = dialogProjection.getNView(); + m_iDefaultNSample = dialogProjection.getNSamples(); + m_iDefaultTrace = dialogProjection.getTrace(); + m_dDefaultRotation = dialogProjection.getRotAngle(); + m_dDefaultFocalLength = dialogProjection.getFocalLengthRatio(); + m_dDefaultFieldOfView = dialogProjection.getFieldOfViewRatio(); wxString sGeometry = dialogProjection.getGeometry(); - if (nDet > 0 && nView > 0 && sGeometry != "") { + m_iDefaultGeometry = Scanner::convertGeometryNameToID (sGeometry.c_str()); + + if (m_iDefaultNDet > 0 && m_iDefaultNView > 0 && sGeometry != "") { const Phantom& rPhantom = GetDocument()->getPhantom(); ProjectionFileDocument* pProjectionDoc = dynamic_cast(theApp->getDocManager()->CreateDocument("untitled.pj", wxDOC_SILENT)); Projections& rProj = pProjectionDoc->getProjections(); - Scanner theScanner (rPhantom, sGeometry.c_str(), nDet, nView, nSamples, dRotAngle, dFocalLengthRatio, dFieldOfViewRatio); + Scanner theScanner (rPhantom, sGeometry.c_str(), m_iDefaultNDet, m_iDefaultNView, m_iDefaultNSample, m_dDefaultRotation, m_dDefaultFocalLength, m_dDefaultFieldOfView); if (theScanner.fail()) { *theApp->getLog() << "Failed making scanner: " << theScanner.failMessage().c_str() << "\n"; return; } rProj.initFromScanner (theScanner); + m_dDefaultRotation /= PI; // convert back to PI units - if (iTrace > Trace::TRACE_CONSOLE) { - ProjectionsDialog dialogProjections (theScanner, rProj, rPhantom, iTrace, dynamic_cast(m_frame)); + if (m_iDefaultTrace > Trace::TRACE_CONSOLE) { + ProjectionsDialog dialogProjections (theScanner, rProj, rPhantom, m_iDefaultTrace, dynamic_cast(m_frame)); for (int iView = 0; iView < rProj.nView(); iView++) { ::wxYield(); ::wxYield(); @@ -445,19 +451,32 @@ PhantomView::OnProjections (wxCommandEvent& event) ::wxUsleep(50); } } - } else - theScanner.collectProjections (rProj, rPhantom, iTrace); + } else { + wxProgressDialog dlgProgress (wxString("Projection"), wxString("Projection Progress"), rProj.nView() + 1, m_frame, wxPD_CAN_ABORT); + for (int i = 0; i < rProj.nView(); i++) { + theScanner.collectProjections (rProj, rPhantom, i, 1, true, m_iDefaultTrace); + if (! dlgProgress.Update (i+1)) { + pProjectionDoc->DeleteAllViews(); + return; + } + } + } + ostringstream os; + os << "Projections for " << rPhantom.name() << ": nDet=" << m_iDefaultNDet << ", nView=" << m_iDefaultNView << ", nSamples=" << m_iDefaultNSample << ", RotAngle=" << m_dDefaultRotation << ", FocalLengthRatio=" << m_dDefaultFocalLength << ", FieldOfViewRatio=" << m_dDefaultFieldOfView << ", Geometry=" << sGeometry.c_str() << "\n"; + rProj.setRemark (os.str()); + *theApp->getLog() << os.str().c_str(); + + ::wxYield(); pProjectionDoc->Modify(true); pProjectionDoc->UpdateAllViews(this); + ::wxYield(); if (wxView* pView = pProjectionDoc->GetFirstView()) if (wxFrame* pFrame = pView->GetFrame()) { pFrame->SetFocus(); + pFrame->Raise(); } - ostringstream os; - os << "Projections for " << rPhantom.name() << ": nDet=" << nDet << ", nView=" << nView << ", nSamples=" << nSamples << ", RotAngle=" << dRotAngle << ", FocalLengthRatio=" << dFocalLengthRatio << ", FieldOfViewRatio=" << dFieldOfViewRatio << ", Geometry=" << sGeometry.c_str() << "\n"; - rProj.setRemark (os.str()); - *theApp->getLog() << os.str().c_str(); + m_frame->Lower(); } } } @@ -654,6 +673,8 @@ ProjectionFileView::OnProperties (wxCommandEvent& event) ostringstream os; rProj.printScanInfo(os); *theApp->getLog() << os.str().c_str(); + wxMessageDialog dialogMsg (m_frame, os.str().c_str(), "Projection File Properties", wxOK | wxICON_INFORMATION); + dialogMsg.ShowModal(); } @@ -677,17 +698,51 @@ ProjectionFileView::OnReconstruct (wxCommandEvent& event) wxString optInterpName = dialogReconstruction.getInterpName(); int optInterpParam = dialogReconstruction.getInterpParam(); wxString optBackprojectName = dialogReconstruction.getBackprojectName(); + int iTrace = dialogReconstruction.getTrace(); if (xSize > 0 && ySize > 0) { ImageFileDocument* pReconDoc = dynamic_cast(theApp->getDocManager()->CreateDocument("untitled.if", wxDOC_SILENT)); ImageFile& imageFile = pReconDoc->getImageFile(); const Projections& rProj = GetDocument()->getProjections(); imageFile.setArraySize (xSize, ySize); - rProj.reconstruct (imageFile, optFilterName.c_str(), optFilterParam, optFilterMethodName.c_str(), optZeropad, optFilterGenerationName.c_str(), optInterpName.c_str(), optInterpParam, optBackprojectName.c_str(), Trace::TRACE_NONE); + Timer timerRecon; + + Reconstructor* pReconstruct = new Reconstructor (rProj, imageFile, optFilterName.c_str(), optFilterParam, optFilterMethodName.c_str(), optZeropad, optFilterGenerationName.c_str(), optInterpName.c_str(), optInterpParam, optBackprojectName.c_str(), iTrace); + if (iTrace > Trace::TRACE_CONSOLE) { + ReconstructDialog* pDlgReconstruct = new ReconstructDialog (*pReconstruct, rProj, imageFile, iTrace, m_frame); + for (int iView = 0; iView < rProj.nView(); iView++) { + ::wxYield(); + ::wxYield(); + if (pDlgReconstruct->isCancelled() || ! pDlgReconstruct->reconstructView (iView)) { + delete pDlgReconstruct; + delete pReconstruct; + pReconDoc->DeleteAllViews(); + return; + } + ::wxYield(); + ::wxYield(); + while (pDlgReconstruct->isPaused()) { + ::wxYield(); + ::wxUsleep(50); + } + } + } else { + wxProgressDialog dlgProgress (wxString("Reconstruction"), wxString("Reconstruction Progress"), rProj.nView() + 1, m_frame, wxPD_CAN_ABORT); + for (int i = 0; i < rProj.nView(); i++) { + pReconstruct->reconstructView (i, 1); + if (! dlgProgress.Update(i + 1)) { + delete pReconstruct; + pReconDoc->DeleteAllViews(); + return; + } + } + } pReconDoc->Modify(true); pReconDoc->UpdateAllViews(this); ostringstream os; os << "Reconstruct " << rProj.getFilename() << ": xSize=" << xSize << ", ySize=" << ySize << ", Filter=" << optFilterName.c_str() << ", FilterParam=" << optFilterParam << ", FilterMethod=" << optFilterMethodName.c_str() << ", FilterGeneration=" << optFilterGenerationName.c_str() << ", Zeropad=" << optZeropad << ", Interpolation=" << optInterpName.c_str() << ", InterpolationParam=" << optInterpParam << ", Backprojection=" << optBackprojectName.c_str() << "\n"; *theApp->getLog() << os.str().c_str(); + imageFile.labelAdd (rProj.getLabel()); + imageFile.labelAdd (Array2dFileLabel::L_HISTORY, os.str().c_str(), timerRecon.timerEnd()); } } } diff --git a/src/views.h b/src/views.h index 71efce2..f82d506 100644 --- a/src/views.h +++ b/src/views.h @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: views.h,v 1.8 2000/08/31 08:38:58 kevin Exp $ +** $Id: views.h,v 1.9 2000/09/02 05:10:39 kevin Exp $ ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License (version 2) as @@ -140,6 +140,15 @@ private: PhantomCanvas *m_canvas; wxFrame *m_frame; + int m_iDefaultNDet; + int m_iDefaultNView; + int m_iDefaultNSample; + int m_iDefaultGeometry; + int m_iDefaultTrace; + double m_dDefaultRotation; + double m_dDefaultFocalLength; + double m_dDefaultFieldOfView; + public: PhantomView(void); virtual ~PhantomView(void); diff --git a/tools/pjinfo.cpp b/tools/pjinfo.cpp new file mode 100644 index 0000000..0ca578c --- /dev/null +++ b/tools/pjinfo.cpp @@ -0,0 +1,141 @@ +/***************************************************************************** +** FILE IDENTIFICATION +** +** Name: pjfinfo.cpp +** Purpose: Convert an projection data file to an image file +** Programmer: Kevin Rosenberg +** Date Started: April 2000 +** +** This is part of the CTSim program +** Copyright (C) 1983-2000 Kevin Rosenberg +** +** $Id: pjinfo.cpp,v 1.1 2000/09/02 05:17:29 kevin Exp $ +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License (version 2) as +** published by the Free Software Foundation. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +******************************************************************************/ + +/* FILE + * pjfinfo.c Convert Raysum to image + * + * DATE + * August 2000 + */ + +#include "ct.h" +#include "timer.h" + + +enum { O_DUMP, O_HELP, O_VERSION }; + +static struct option my_options[] = +{ + {"dump", 0, 0, O_DUMP}, + {"help", 0, 0, O_HELP}, + {"version", 0, 0, O_VERSION}, + {0, 0, 0, 0} +}; + +static const char* g_szIdStr = "$Id: pjinfo.cpp,v 1.1 2000/09/02 05:17:29 kevin Exp $"; + +void +pjfinfo_usage (const char *program) +{ + cout << "usage: " << fileBasename(program) << " proj-file [OPTIONS]" << endl; + cout << "Display projection file information" << endl; + cout << endl; + cout << " --dump Dump all scan data" << endl; + cout << " --version Print version" << endl; + cout << " --help Print this help message" << endl; +} + + + +int +pjfinfo_main (const int argc, char *const argv[]) +{ + string pj_name; + bool optDump = false; + extern int optind; + Timer timerProgram; + + while (1) + { + int c = getopt_long (argc, argv, "", my_options, NULL); + if (c == -1) + break; + + switch (c) + { + case O_DUMP: + optDump = true; + break; + case O_VERSION: +#ifdef VERSION + cout << "Version " << VERSION << endl << g_szIdStr << endl; +#else + cout << "Unknown version number" << endl; +#endif + return (0); + case O_HELP: + case '?': + pjfinfo_usage(argv[0]); + return (0); + default: + pjfinfo_usage(argv[0]); + return (1); + } + } + + if (argc - optind != 1) { + pjfinfo_usage(argv[0]); + return (1); + } + + pj_name = argv[optind]; + + Projections pj; + if (! pj.read (pj_name)) { + sys_error (ERR_SEVERE, "Can not open projection file %s", pj_name.c_str()); + return (1); + } + + if (optDump) + pj.printProjectionData(); + else { + ostringstream os; + pj.printScanInfo (os); + cout << os.str(); + } + + return(0); +} + + +#ifndef NO_MAIN +int +main (const int argc, char *const argv[]) +{ + int retval = 1; + + try { + retval = pjfinfo_main(argc, argv); + } catch (exception e) { + cerr << "Exception: " << e.what() << endl; + } catch (...) { + cerr << "Unknown exception" << endl; + } + + return (retval); +} +#endif diff --git a/tools/pjrec.cpp b/tools/pjrec.cpp index 9fcb890..33fe7d3 100644 --- a/tools/pjrec.cpp +++ b/tools/pjrec.cpp @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: pjrec.cpp,v 1.16 2000/08/31 08:38:58 kevin Exp $ +** $Id: pjrec.cpp,v 1.17 2000/09/02 05:10:39 kevin Exp $ ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License (version 2) as @@ -49,7 +49,7 @@ static struct option my_options[] = {0, 0, 0, 0} }; -static const char* g_szIdStr = "$Id: pjrec.cpp,v 1.16 2000/08/31 08:38:58 kevin Exp $"; +static const char* g_szIdStr = "$Id: pjrec.cpp,v 1.17 2000/09/02 05:10:39 kevin Exp $"; void pjrec_usage (const char *program) @@ -324,7 +324,14 @@ pjrec_main (int argc, char * argv[]) #ifdef HAVE_MPI TimerCollectiveMPI timerReconstruct (mpiWorld.getComm()); - projLocal.reconstruct (*imLocal, sOptFilterName.c_str(), dOptFilterParam, sOptFilterMethodName.c_str(), iOptZeropad, sOptFilterGenerationName.c_str(), sOptInterpName.c_str(), iOptPreinterpolationFactor, sOptBackprojectName.c_str(), optTrace); + + Reconstructor reconstruct (projLocal, *imLocal, sOptFilterName.c_str(), dOptFilterParam, sOptFilterMethodName.c_str(), iOptZeropad, sOptFilterGenerationName.c_str(), sOptInterpName.c_str(), iOptPreinterpolationFactor, sOptBackprojectName.c_str(), optTrace); + if (reconstruct.fail()) { + cout << reconstruct.failMessage(); + return (1); + } + reconstruct.reconstructAllViews(); + if (bOptVerbose) timerReconstruct.timerEndAndReport ("Time to reconstruct"); @@ -333,7 +340,12 @@ pjrec_main (int argc, char * argv[]) if (bOptVerbose) timerReduce.timerEndAndReport ("Time to reduce image"); #else - projGlobal.reconstruct (*imGlobal, sOptFilterName.c_str(), dOptFilterParam, sOptFilterMethodName.c_str(), iOptZeropad, sOptFilterGenerationName.c_str(), sOptInterpName.c_str(), iOptPreinterpolationFactor, sOptBackprojectName.c_str(), optTrace); + Reconstructor reconstruct (projGlobal, *imGlobal, sOptFilterName.c_str(), dOptFilterParam, sOptFilterMethodName.c_str(), iOptZeropad, sOptFilterGenerationName.c_str(), sOptInterpName.c_str(), iOptPreinterpolationFactor, sOptBackprojectName.c_str(), optTrace); + if (reconstruct.fail()) { + cout << reconstruct.failMessage(); + return (1); + } + reconstruct.reconstructAllViews(); #endif #ifdef HAVE_MPI