Initial snark14m import
[snark14.git] / src / snark / art_bkproj.cpp
1 /*
2  ***********************************************************
3  $SNARK_Header: S N A R K  1 4 - A PICTURE RECONSTRUCTION PROGRAM $
4  $HeadURL: svn://dig.cs.gc.cuny.edu/snark/trunk/src/snark/art_bkproj.cpp $
5  $LastChangedRevision: 85 $
6  $Date: 2014-07-02 16:07:08 -0400 (Wed, 02 Jul 2014) $
7  $Author: agulati $
8  ***********************************************************
9
10  CALCULATE BACKPROJECTIONS
11  */
12
13 #include <cstdio>
14 #include <cmath>
15
16 #include "blkdta.h"
17 #include "uiod.h"
18 #include "geom.h"
19
20 #ifdef FFCOMPARE
21 #include "geom.h"
22 #endif
23
24 #include "art.h"
25
26 void art_class::bkproj(REAL* recon, REAL diff,REAL abdiff,REAL* ibase, INTEGER np, INTEGER nr, INTEGER* list, REAL* weight, INTEGER numb, REAL snorm)
27 {
28         REAL change;
29         REAL dual; //wei, bug 266
30         REAL a;
31         REAL b;
32         REAL factor;
33
34
35         if (ArtIn.bayef)
36         {
37                 // BAYESIAN
38                 //index = indexd(np, nr); //Ran, bug 266
39                 dual = ArtIn.totalRays[np * GeoPar.nrays + nr];
40                 change = diff - dual;  //wei, bug 266
41                 snorm = (REAL) 1.0 + snorm * ArtIn.snr2;
42         }
43         else if (ArtIn.art4f)
44         {
45                 // ART4
46                 // index = indexd(np, nr); //Ran, bug 266
47                 dual = ArtIn.totalRays[np * GeoPar.nrays + nr]; //wei, bug 266
48                 a = diff + ArtIn.toler;
49                 b = diff - ArtIn.toler;
50
51                 change = MAX0(MIN0(a, dual), b);
52                 ArtIn.totalRays[np * GeoPar.nrays + nr] -= change * ArtIn.relax; //wei, bug 266
53         }
54
55         // ART3
56         else
57         {
58                 if (abdiff <= ArtIn.toler)
59                 {
60                         return;
61                 }
62
63                 if (abdiff >= ArtIn.toler + ArtIn.toler)
64                 {
65                         change = diff;
66                 }
67                 else
68                 {
69                         // REFLECTION
70                         if (diff < 0)
71                                 change = (REAL) 2.0 * (diff + ArtIn.toler); //  -2*toler < diff <-toler
72                         else
73                                 change = (REAL) 2.0 * (diff - ArtIn.toler); //  toler < diff < 2* toler      by wei, 8/2005
74                 }
75         }
76         // ADJUST RECONSTRUCTED PICTURE
77
78         factor = ArtIn.relax * change / snorm;
79
80 #ifdef FFCOMPARE
81
82 #endif  
83
84         if (ArtIn.bayef)
85         {
86                 ArtIn.totalRays[np * GeoPar.nrays + nr] += factor;  //wei, bug 266
87                 factor *= ArtIn.snr2;
88         }
89
90         ////////// dump recon ////////////
91 #ifdef FFCOMPARE
92
93 #endif
94         //////////////////////////////////
95
96
97         artbck(recon, factor, list, weight, numb, ArtIn.thrlo, ArtIn.thrup,
98                         ArtIn.cr, ArtIn.bartf, ArtIn.halfwy, ArtIn.thtol, ArtIn.art2f);
99
100         return;
101 }
102