(file) Return to g_analyze_scalers.f CVS log (file) (dir) Up to [HallC] / Analyzer / T20

  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           

Analyzer/Replay: Mark Jones, Documents: Stephen Wood
Powered by
ViewCVS 0.9.2-cvsgraph-1.4.0