Initial snark14m import
[snark14.git] / src / snark / errfac.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/errfac.cpp $
5  $LastChangedRevision: 85 $
6  $Date: 2014-07-02 16:07:08 -0400 (Wed, 02 Jul 2014) $
7  $Author: agulati $
8  ***********************************************************
9
10  THIS ROUTINE ESTIMATES THE VARIANCE IN THE PROJECTION DATA
11  */
12
13 #include <cstdio>
14 #include <cmath>
15
16 #include "blkdta.h"
17 #include "err.h"
18
19 #include "errfac.h"
20
21 REAL errfac(REAL prdta, REAL rinc, REAL rinc2)
22 {
23         REAL errfac_tmp;
24         REAL temp;
25
26         if (Err.errtyp == 0)
27         {
28                 return Err.minprd;
29         }
30
31         switch (Err.errtyp)
32         {
33
34         // ADDITIVE NOISE ONLY
35         case 1:
36                 errfac_tmp = Err.afactr;
37                 break;
38
39                 // MULTIPLICATIVE NOISE ONLY
40         case 2:
41                 errfac_tmp = Err.mfactr * prdta * prdta;
42                 break;
43
44                 // ADDITIVE AND MULTIPLICATIVE NOISE
45         case 3:
46                 errfac_tmp = Err.mfactr * prdta * prdta + Err.afactr;
47                 break;
48
49                 // QUANTUM NOISE (LINE)
50         case 4:
51                 errfac_tmp = Err.af + Err.bf * (REAL) exp(prdta);
52                 break;
53
54                 // QUANTUM (LINE) AND ADDITIVE NOISE
55         case 5:
56                 errfac_tmp = Err.af + Err.bf * (REAL) exp(prdta) + Err.afactr;
57                 break;
58
59                 // QUANTUM (LINE) AND MULTIPLICATIVE NOISE
60         case 6:
61                 errfac_tmp = Err.af + Err.bf * (REAL) exp(prdta);
62                 errfac_tmp = errfac_tmp + Err.mfactr * prdta * prdta;
63                 break;
64
65                 // QUANTUM (LINE) MULTIPLICATIVE AND ADDITIVE NOISE
66         case 7:
67                 errfac_tmp = Err.af + Err.bf * (REAL) exp(prdta);
68                 errfac_tmp = errfac_tmp + Err.mfactr * prdta * prdta + Err.afactr;
69                 break;
70
71                 // QUANTUM (STRIP) NOISE
72         case 8:
73                 prdta = prdta / rinc;
74                 errfac_tmp = (Err.af + Err.bf * (REAL) exp(prdta)) * rinc2;
75                 break;
76
77                 // QUANTUM (STRIP) AND ADDITIVE NOISE
78         case 9:
79                 prdta = prdta / rinc;
80                 errfac_tmp = (Err.af + Err.bf * (REAL) exp(prdta)) * rinc2 + Err.afactr;
81                 break;
82
83                 // QUANTUM (STRIP) AND MULTIPLICATIVE NOISE
84         case 10:
85                 temp = prdta / rinc;
86                 errfac_tmp = (Err.af + Err.bf * (REAL) exp(temp)) * rinc2
87                                 + Err.mfactr * prdta * prdta;
88                 break;
89
90                 // QUANTUM (STRIP) MULTIPLICATIVE AND ADDITIVE NOISE
91         case 11:
92                 temp = prdta / rinc;
93                 errfac_tmp = (Err.af + Err.bf * (REAL) exp(temp)) * rinc2
94                                 + Err.mfactr * prdta * prdta + Err.afactr;
95                 break;
96         }
97
98         return MAX0(errfac_tmp, Err.minprd);;
99 }