BNMR: frontend

From DaqWiki
Revision as of 13:36, 25 April 2022 by Bsmith (talk | contribs) (6 revisions imported)
Jump to navigation Jump to search

Links

Introduction

The frontend task (febnqr_vmic or febnmr_vmic runs on the VMIC frontend computer located in the VME crate (lxbnqr or lxbnmr). The VMIC is a 32-bit computer running linux. It has access to the same disk(s) as the Midas Host. It also has access to the other VME DAQ Modules in the VME crate.

The frontend task is a MIDAS frontend task, and the frontend user code is linked with the MIDAS system frontend code and the MIDAS library. The frontend user code discussed here was written specifically for the bnmr and bnqr experiments. Its underlying structure is that of the MIDAS example whose features are described in Frontend_user_code. The frontend code is ideally identical for the two experiments bnmr and bnqr with differences handled with "ifdef" statements. Its purpose is to initialize, set up and read out the DAQ hardware modules.

Recently new modes have been added specific to either bnqr or bnqr so that the frontend code is no longer identical. The intention is that the code will again be made identical where possible.

Frontend operation

Reading data from the ODB

The frontend obtains system data, experiment control parameters etc. from the ODB. It also writes information back into the ODB.

Reading data from the ODB is simplified because the frontend code is linked with the MIDAS header file experim.h which maps areas of the ODB structure to a C structure. This file must be re-created if the structure of the ODB is changed e.g. by adding or removing keys to the mapped subdirectories, or the structure will no longer match that of the ODB. Keys under /Equipment/Settings are among those mapped - see MIDAS experim.h. Linking with experiment.h allows easier access to the large number of keys required by the frontend. The frontend code checks that the current size of the structure in the ODB and in experim.h match. If not, the structure is recreated in the ODB according to the structure in experim.h. Once the structure size is checked, call(s) of the MIDAS db_get_record() function will populate the C structure in the frontend with the current values from the ODB. The MIDAS set_record_function() can be used to write the structure back to the ODB, if values have been updated.

The frontend uses ODB using db_get_record() to access areas of the ODB where numerous keys are needed. It also uses the MIDAS functions db_get_value and db_set_value to read and write individual keys where the c structure is not mapped.

Initialize hardware

When the frontend is started, the function frontend_init() is run. This function opens records to the ODB (see above) and may open some hotlinks. It also opens a connection to the VME crate, and performs initial initialization of the DAQ hardware modules (PPG,PSM,Scaler(s),VMEIO32).

Access to the functions of the VME Modules is provided by a software driver (program) specific to each module. The drivers are written such that they also double as a debug tool (see BNMR: Hardware Debugging#hardware debugging.


Begin-of-run

MIDAS allows clients to register to various transitions (e.g. START,STOP). However, many clients need to perform actions in a certain order. For example, in the bnmr and bnqr experiments, at begin-of-run, rf_config is required to check the input parameters, generate and write the ppg load file and any required PSM load files. This must be completed before the frontend attempts to load these files.

This is accomplished in MIDAS by the use of transition sequence numbers. rf_config and the frontend both register to the START transition, but rf_config is registered with a lower transition sequence number, so it runs a "prestart" routine before the frontend runs its "begin-of-run" routine. See [MIDAS doc #Run States and Transitions] for details.

At the begin-of-run transition, the function begin_of_run() is called. This function determines the Type of run (Type 1 (cf I-MUSR) or Type 2 (cf TD-MUSR)).

  • determine run type
  • determine beam control (single/dual channel)
    • check EPICS switches
  • set initial helicity state
  • clear scaler modules
  • setup scan (Type 1)
    • setup PSM (frequency scan) or
    • CAMP (camp scan) or
    • EPICS (epics scan)
  • or setup scan (Type 2)
    • setup PSM module
  • load PPG loadfile
  • initialize scaler and histogram structures
  • set beam control (continuous/pulsed)
  • start cycle (calls cycle_start() )
  • enable PPG external trigger for dual_channel mode


cycle_start

The cycle_start() routine

  • check if cycle is being skipped
  • if Type 1
    • clear histograms
    • increment the scan parameter (PSM/CAMP/EPICS)
  • if Type 2
    • flip helicity if needed
  • clear REAL cycle scalers
  • clear scaler sums (REAL scalers only)
  • clear gbl_bin_count
  • rereference thresholds if requested
  • clear scaler FIFO
  • clear and arm scalers
  • reset PSM
  • start PPG (single channel mode only)




While the PPG cycle is running, it checks for Scaler half-full, reading out the data from the scaler internal buffer when needed. At the end of the cycle, it processes the data, storing it as histograms (Type 2 (TD)), calculates scaler sums and adds data to the cumulative scalers. It sends out data banks (Type 1 only), scaler and information banks at the end of each cycle. It flips the helicity, increments the sweep device (if needed) and restarts the PPG for the next cycle. For Type 2 runs, it sends out the histogram data banks periodically.

At end-of-run, the frontend program sends out the final data and disables the DAQ hardware.

Note
the above describes the situation in single channel mode. In dual channel mode each cycle is started by an external signal to the PPG which occurs when the beam is switched between channels).


Polling in the frontend for end-of-cycle

The PPG produces a pulse train of "MCS next" output signals during each cycle. The number of pulses corresponds to the number of dwell times (number of bins). The MCS Next signals advance the Scaler to the next bin (connected to Scaler input "External Next"). This signal is called "Load Next Event" (LNE). The continuous operation of the frontend depends on the Scaler receiving the correct number of LNE i.e. MCS Next pulses. If too few are received, the PPG cycle will not be restarted, and the DAQ will appear to grind to a halt. If too many, the PPG will continue to cycle, but the data will be no good (overlapping cycles). The scaler counts the number of LNE pulses it receives, and this number can be read via the acquisition count register.

The frontend program polls the acquisition count register. When this number reaches the expected number of bins, the PPG cycle is complete, and the frontend goes into its end-of-cycle routine, reads out the final data from the scaler(s) and processes the data. It then restarts the PPG for the next cycle (single channel mode) or waits for an external start (dual channel mode).



To Build the frontend code

The frontend code is located in the experiment directory given by the Environment Variable MIDAS_EXPTAB. This directory is /home/<beamline>/online/<beamline>. The main frontend user code is called febnqr_vmic.c. For bnmr, a softlink febnmr_vmic.c points to this code. The Makefile in the main DAQ directory is identical for bnmr and bnqr experiments. The environment variable BEAMLINE is used to set up the definitions automatically to build the frontend for either bnmr or bnqr experiments.

The code runs on and must be built on the 32-bit VMIC computer. To build the code, log onto lxbnmr or lxbnqr as user bnmr or user bnqr respectively. Then type

cd  /home/<beamline>/online/<beamline>
make

The task will be called febn[mq]r_vmic.exe (see BNMR#Nomenclature).

To completely rebuild the frontend task, execute "make clean" before rebuilding.