1 saw 1.1 subroutine g_analyze_scalers(event,ABORT,err)
2 *
3 *
4 * $Log:$
5 *
6 *
7 implicit none
8 save
9 integer*4 event(*)
10 *
11 character*17 here
12 parameter (here='g_analyze_scalers')
13 *
14 logical ABORT
15 character*(*) err
16 *
17 INCLUDE 'gen_scalers.cmn'
18 INCLUDE 'gen_run_info.cmn'
19 INCLUDE 'gen_filenames.cmn'
20 *
21 integer ind
22 saw 1.1 integer*4 cratenum ! 1=hms,2=sos
23 real*8 realscal
24 logical update_bcms
25 *
26 integer*4 jiand, jishft ! Declare to help f2c
27 *
28 * Scaler events have a header in from of each scaler. High 16 bits
29 * will contain the address (the switch settings). Address for hall C
30 * will be of the form DANN, where NN is the scaler number. The low 16
31 * bits will contain the number of scaler values to follow (this should
32 * be no larger than 16, but we will allow more.)
33 *
34 *
35 * NOTE that the variables gscaler(i) is REAL!!!!!
36 * this is so that we can record the correct value when the
37 * hardware scalers (32 bit <> I*4) overflow.
38 *
39
40 integer evtype, evnum, evlen, pointer
41 integer scalid, countinmod, address, counter
42 *
43 saw 1.1 * Temporary variables for beam current and charge calculations
44 *
45 real*8 ave_current_bcm1, ave_current_bcm2, ave_current_bcm3
46 real*8 ave_current_unser
47 real*8 delta_time
48 *
49 * Find if hms or sos scaler event (assumes first HMS scaler is DA01).
50 if (jiand(jishft(event(3),-16),'FFFF'X).eq.'DA01'X) then !first scaler
51 cratenum=1 !hms
52 else
53 cratenum=2 !sos
54 endif
55 *
56 evtype = jishft(event(2),-16)
57 evnum = jiand(event(2),'FF'x) ! last 2 bytes give event number (mod 256)
58 *
59 * evnum is mod(256), so must reset lastevnum for rollover
60 if (evnum.eq.0 .and. gscal_lastevnum(cratenum).gt.200) then
61 gscal_lastevnum(cratenum)=0
62 else if (evnum.le.gscal_lastevnum(cratenum)) then
63 write(6,*) 'STATUS: skipping outoforder scaler event:',
64 saw 1.1 & ' crate,oldevnum,newevnum=',cratenum,
65 & gscal_lastevnum(cratenum),evnum
66 return
67 endif
68 *
69 gscal_lastevnum(cratenum)=evnum
70 *
71 * Should check against list of known scaler events
72 *
73 evlen = event(1) + 1
74 update_bcms = .false.
75 if(evlen.gt.3) then ! We have a scaler bank
76 pointer = 3
77 *
78 do while(pointer.lt.evlen)
79 *
80 scalid = jiand(jishft(event(pointer),-16),'FF'x)
81 countinmod = jiand(event(pointer),'FFFF'x)
82 if(jiand(event(pointer),'FF000000'x).eq.'DA000000'x) then
83 c Old style header with scaler ID @ 00FF0000
84 scalid = jiand(jishft(event(pointer),-16),'FF'x)
85 saw 1.1 address = scalid*16
86 *
87 * Might want to check that count is not to big.
88 *
89 if(countinmod.ne.16) then
90 err = 'Scaler module header word has count<>16'
91 ABORT = .true.
92 call g_add_path(here,err)
93 return ! Safest action
94 endif
95 else
96 c
97 c New style header with scaler ID @ FFF?0000
98 c (If ? is non zero, it means we are starting in the middle of a scaler)
99 c Allows for non multiple of 16 address starts
100 c
101 address = jishft(event(pointer),-16)
102 *
103 * Might want to check that count is not to big.
104 *
105 if(countinmod.gt.16) then
106 saw 1.1 err = 'Scaler module header word has count >16'
107 ABORT = .true.
108 call g_add_path(here,err)
109 return ! Safest action
110 endif
111 endif
112 *
113 address = scalid*16
114 do counter = 1,countinmod
115 ind=address+counter
116 realscal=dfloat(event(pointer+counter))
117 if (ind.eq.gbcm1_index) update_bcms=.true. !assume bcms in same crate
118
119 * Save scaler value from previous scaler event:
120 gscaler_old(ind) = gscaler(ind)
121
122 if (realscal.lt.-0.5) then
123 realscal=realscal+4294967296.
124 endif
125 if ( (realscal+dfloat(gscaler_nroll(ind))*4294967296.) .ge.
126 & gscaler(ind) ) then ! 2**32 = 4.295e+9
127 saw 1.1 gscaler(ind) = realscal + gscaler_nroll(ind)*4294967296.
128 else !32 bit scaler rolled over.
129 gscaler_nroll(ind)=gscaler_nroll(ind)+1
130 gscaler(ind) = realscal + gscaler_nroll(ind)*4294967296.
131 endif
132 * Calculate difference between current scaler value and previous value:
133 gscaler_change(ind) = gscaler(ind) - gscaler_old(ind)
134 enddo
135 pointer = pointer + countinmod + 1 ! Add 17 to pointer
136 enddo
137 else
138 err = 'Event not big enough to contain scalers'
139 ABORT = .true.
140 call g_add_path(here,err)
141 return
142 endif
143
144 * calculate time of run (must not be zero to avoid div. by zero).
145 g_run_time = max(0.001D00,gscaler(gclock_index)/gclock_rate)
146
147 * Calculate beam current and charge between scaler events
148 saw 1.1
149 if (update_bcms) then ! can't assume in hms crate, moved for some runs
150
151 delta_time = max(gscaler_change(gclock_index)/gclock_rate,.0001D00)
152 *
153 if (gen_run_number.le.13000) then
154 ave_current_bcm1 = gbcm1_gain*sqrt(max(0.0D00,
155 & (gscaler_change(gbcm1_index)/delta_time)-gbcm1_offset))
156 else
157 ave_current_bcm1 = gbcm1_gain*((gscaler_change(gbcm1_index)
158 & /delta_time) - gbcm1_offset)
159 endif
160
161 ave_current_bcm3 = gbcm3_gain*((gscaler_change(gbcm3_index)
162 & /delta_time) - gbcm3_offset)
163 *
164 ave_current_unser = gunser_gain*((gscaler_change(gunser_index)
165 & /delta_time) - gunser_offset)
166
167 if (gen_run_number.le.6268) then
168 ave_current_bcm2 = gbcm2_gain*sqrt(max(0.0D00,
169 saw 1.1 & (gscaler_change(gbcm2_index)/delta_time)-gbcm2_offset))
170 else
171 ave_current_bcm2 = gbcm2_gain*((gscaler_change(gbcm2_index)
172 & /delta_time) - gbcm2_offset)
173 endif
174
175 if (delta_time.gt.0.0001) then
176 gbcm1_charge = gbcm1_charge + ave_current_bcm1*delta_time
177 gbcm2_charge = gbcm2_charge + ave_current_bcm2*delta_time
178 gbcm3_charge = gbcm3_charge + ave_current_bcm3*delta_time
179 gunser_charge = gunser_charge + ave_current_unser*delta_time
180
181 gscaler_event_num = gscaler_event_num + 1
182
183 * Write out pertinent charge scaler rates for each scaler event.
184
185 if (g_charge_scaler_filename.ne.' ') then
186 write(G_LUN_CHARGE_SCALER,1001) gscaler_event_num,!scaler event num
187 & gscaler_change(gunser_index)/delta_time, !scaler rate(Hz)
188 & gscaler_change(gbcm1_index)/delta_time, !scaler rate(Hz)
189 & gscaler_change(gbcm2_index)/delta_time, !scaler rate(Hz)
190 saw 1.1 & gscaler_change(gbcm3_index)/delta_time, !scaler rate(Hz)
191 & delta_time !time since last scaler event (sec)
192
193 endif
194 endif
195 endif
196
197 1001 format(i7,4f15.2,f14.6)
198 return
199 end
200
201
202
203
204
205
206
207
208
209
210
211 saw 1.1
212
213
|