Jpp test-rotations-old
the software that should make you happy
Loading...
Searching...
No Matches
examples/scripts/gradient.sh
Go to the documentation of this file.
1#!/usr/bin/env zsh
2script=${0##*/}
3
4source $JPP_DIR/setenv.sh $JPP_DIR >& /dev/null
5source $JPP_BIN/gradient.sh
6
7set_variable: DEBUG SCRIPTS_DEBUG 3
8
9if do_usage $*; then
10 usage "$script [number of tests]"
11fi
12
13if (( $# == 1 )); then
14 set_variable NUMBER_OF_TESTS $1
15else
16 set_variable NUMBER_OF_TESTS 0
17fi
18
19#
20# User function.
21#
22# \param 1 x
23# \param 2 mean
24# \param 3 sigma
25# \param 4 signal
26# \param 5 background
27#
28function gauss()
29{
30 let "PI = acos(-1.0)"
31 let "u = ($1 - $2) / $3"
32
33 echo $(( $4 * exp(-0.5*u*u) / (sqrt(2.0*$PI) * $3) + $5 ))
34}
35
36
37#
38# User data.
39#
40typeset -A DATA # (x,y) values
41
42
43#
44# Generate random data according true parameters.
45#
46function generate
47{
48 DATA=()
49
50 for (( X = -5.0; $X <= +5.0; X += 0.5 )); do
51
52 let "Y = `gauss $X $TRUE_MEAN $TRUE_SIGMA $TRUE_SIGNAL $TRUE_BACKGROUND`"
53
54 DATA[$X]=`$JPP_DIR/examples/JMath/getPoisson -e $Y`
55 done
56}
57
58
59#
60# Get chi2.
61#
62# The function is evaluated using parameters MEAN, SIGMA, SIGNAL and BACKGROUND.
63#
64# \param 1 variable containing chi2 value on return
65# \param 2 option
66#
67function getChi2()
68{
69 let "SUM = 0.0"
70
71 for X Y in ${(kv)DATA}; do
72
73 let "F = `gauss $X $MEAN $SIGMA $SIGNAL $BACKGROUND`"
74 let "DY = ($F - $Y) * ($F - $Y)"
75
76 if (( $Y > 0 )); then
77 let "DY /= $Y"
78 else
79 let "DY = $F"
80 fi
81
82 let "SUM += $DY"
83
84 done
85
86 eval $1=$SUM
87}
88
89
90# True values.
91
92let "TRUE_MEAN = 0.0"
93let "TRUE_SIGMA = 1.0"
94let "TRUE_SIGNAL = 1000.0"
95let "TRUE_BACKGROUND = 10.0"
96
97
98#
99# Print parameters.
100#
101function typeout()
102{
103 for KEY in MEAN SIGMA SIGNAL BACKGROUND; do
104
105 set_variable P1 $KEY
106 set_variable P2 TRUE_$KEY
107
108 printf "%-12s %12.3f (fit) %12.3f (true)\n" $KEY ${(P)P1} ${(P)P2}
109 done
110}
111
112
113if (( $NUMBER_OF_TESTS == 0 )); then
114
115 DATA=(
116 -3.00000 16.00000
117 -2.50000 22.00000
118 -2.00000 70.00000
119 -1.50000 152.00000
120 -1.00000 261.00000
121 -0.50000 337.00000
122 0.00000 378.00000
123 0.50000 360.00000
124 1.00000 253.00000
125 1.50000 129.00000
126 2.00000 72.00000
127 2.50000 22.00000
128 3.00000 11.00000)
129
130 # Fit parameters.
131
132 PARAMETERS=()
133
134 PARAMETERS['let "MEAN += %"']=1.0e-2
135 PARAMETERS['let "SIGMA += %"']=1.0e-2
136 PARAMETERS['let "SIGNAL += %"']=5.0e-0
137 PARAMETERS['let "BACKGROUND += %"']=5.0e-1
138
139 # Start values.
140
141 let "MEAN = 0.5"
142 let "SIGMA = 0.5"
143 let "SIGNAL = 700.0"
144 let "BACKGROUND = 0.0"
145
146 gradient 0 Y1
147
148 printf "chi2/NDF %12.5f (fit) (gradient)\n" $(($Y1 / (${#DATA} - ${#PARAMETERS})))
149
150 simplex Y1
151
152 printf "chi2/NDF %12.5f (fit) (simplex) \n" $(($Y1 / (${#DATA} - ${#PARAMETERS})))
153
154 typeout
155
156 let "MEAN = $TRUE_MEAN"
157 let "SIGMA = $TRUE_SIGMA"
158 let "SIGNAL = $TRUE_SIGNAL"
159 let "BACKGROUND = $TRUE_BACKGROUND"
160
161 getChi2 Y2
162
163 printf "chi2/NDF %12.5f (fit) %12.5f (true)\n" $(($Y1 / (${#DATA} - ${#PARAMETERS}))) $(($Y2 / ${#DATA}))
164
165else
166
167 set_variable: DEBUG SCRIPTS_DEBUG 1
168
169 let "CHI2_FIT = 0.0"
170 let "CHI2_TRUE = 0.0"
171
172 for (( m = 0; $m != $NUMBER_OF_TESTS; ++m )); do
173
174 generate
175
176 # Fit parameters.
177
178 PARAMETERS=()
179
180 PARAMETERS['let "MEAN += %"']=1.0e-2
181 PARAMETERS['let "SIGMA += %"']=1.0e-2
182 PARAMETERS['let "SIGNAL += %"']=5.0e-0
183 PARAMETERS['let "BACKGROUND += %"']=5.0e-1
184
185 # Start values.
186
187 let "MEAN = 0.5"
188 let "SIGMA = 0.5"
189 let "SIGNAL = 700.0"
190 let "BACKGROUND = 0.0"
191
192 gradient 0 Y1
193
194 let "MEAN = $TRUE_MEAN"
195 let "SIGMA = $TRUE_SIGMA"
196 let "SIGNAL = $TRUE_SIGNAL"
197 let "BACKGROUND = $TRUE_BACKGROUND"
198
199 getChi2 Y2
200
201 printf "chi2/NDF %3d %12.5f (fit) %12.5f (true)\n" $m $(($Y1 / (${#DATA} - ${#PARAMETERS}))) $(($Y2 / ${#DATA}))
202
203 let "CHI2_FIT += $Y1 / (${#DATA} - ${#PARAMETERS})"
204 let "CHI2_TRUE += $Y2 / ${#DATA}"
205 done
206
207 printf "<> %12.5f (fit) %12.5f (true)\n" $(($CHI2_FIT / $NUMBER_OF_TESTS)) $(($CHI2_TRUE / $NUMBER_OF_TESTS))
208fi
209