Welcome | spec | C-PLOT | Support | Users | Contact
 
Contents -> STANDARD MACRO GUIDE -> Counting Macros
spec Manual


3.6. - Counting Macros



    ct [time]               # Count, then show_cnts
    count [time]            # Count for time
    show_cnts               # Count, then display results
    uct [time]              # Updated counting
    


When time is positive, counting is to seconds. When time is negative, counting is to monitor counts. If the counting macros are invoked without an argument, the count time used is that contained in the global variable COUNT.

Counting in spec combines timing generators and scalers. Three scaler channels are normally used in the standard macros. The first channel takes an accurate clock input (normally at 1 KHz), the second takes the monitor input, and the third takes the detector.

The scaler channels identifying the various inputs are determined by the values of the global constants, sec, mon and det. Their default values are 0, 1 and 2, respectively, matching the recommended hardware cabling. If you do not connect your counting sources to the default scaler channels, you must explicitly assign new values to sec, mon and det for the standard counting macros to work properly.

The additional global variables MON and DET are then set to the channels that are to be treated as the monitor and detector for particular scans, normally mon and det. If, while doing a line-up scan of a motor on which the monitor is mounted, you would want the monitor counts to be plotted as a function of the motor position, enter DET=mon before doing the scan. Do not forget to reassign DET=det at the end of the scan.

The global variable COUNT is set to a default count time (normally 1 second). If the macro ct is invoked without arguments, counting will last for the duration given by COUNT.
    # A user calls "ct" to count for some interval and display results
    def ct '{
          rdef cleanup \'
                  undef cleanup
                  onp; show_cnts; offp
          \'
          waitmove
          count_em $*
          waitcount
          undef cleanup
          onp; show_cnts; offp
    }'
    

    # "count" is the basic macro to count to monitor or to time.
    # It runs the clock and reads the scalers.
    def count '{
          waitmove
          if ($1) for (;;) {
                  count_em $1
                  waitcount
                  get_counts
                  chk_beam
          }
          if (S[sec] && MON >= 0)
                  MON_RATE = S[MON]/S[sec]
    }'
    # The macro "show_cnts" reads the scalers and displays the results.
    def show_cnts '{
          local   i
    
          get_counts
          printf("\n%s\n\n", date())
          for (i=0;i<COUNTERS;i++)
                  if (cnt_name(i) != "unused")
                          printf("%12s = %g%s\n", cnt_name(i), S[i], \
                     i != sec && S[sec]? sprintf(" (%g/s)", S[i] / S[sec]):")
    }'
    


Updated counting is done with the uct macro,
    def uct '{
          waitmove
          count_em $*
          if (chk_count) {
                  local i
                  printf("\n")
                  for (i=0;i<COUNTERS;i++)
                          if (cnt_name(i) != "unused")
                                  printf("%12.12s ",cnt_name(i))
                  printf("\n")
                  while (chk_count) {
                          get_counts
                          for (i=0;i<COUNTERS;i++)
                                  if (cnt_name(i) != "unused")
                                          printf("%12g ",S[i])
                          printf("\r")
                          sleep(UPDATE)
                  }
                  get_counts
                  for (i=0;i<COUNTERS;i++)
                          if (cnt_name(i) != "unused")
                                  printf("%12g ",S[i])
                  printf("\n")
          }
    }'
    



  Top
  Prev | Next