The GSI Fragment Separator Website
Your portal to information about the FRS!
 People   Research   Meetings   Technical info 
You are in GSI » FRS » Technical » FRS data acquisition » FRS stand-alone system » FRS GO4 unpacking » FRS GOOSY unpacking

Unpacking of standard events


The following is a commented excerpt from a GOOSY unpacking
program file (FRS$ROOT:[profi.goosy.run113]x$anl.ppl) which
has been updated to accomodate the new VME-only data acquisition
of the FRS.

The file is NOT complete - only those parts necessary to
illustrate the unpacking of typical subevents has been
retained!!!

The event and subevent data are presumed to be in so-called
GOOSY (10,1)-format. This is a GSI standard which, together
with the structure of list mode data files and buffers, is
documented in the "GOOSY Buffer Structures" manual. (See
www-wnt.gsi.de/frs/technical/daq/manuals/goosy_buffers.ps)

==========================================================
==========================================================
/* The program starts with some declarations etc.   */

/* Structures for buffer, event, and subevent headers */
@INCLUDE $MACRO(sa$evhe);
@INCLUDE $MACRO(sa$event);
@INCLUDE $MACRO(sa$ve10_1);     /* VME event    */
@INCLUDE $MACRO(sa$ves10_1);        /* VME Subevent */

/* General declarations for event unpacking: */
DCL P_RAW_DATA          POINTER STATIC;

/* Variables to control the unpacking */
/* NOTE that sedata is defined as a union, making it easier */
/* to refer to the upper and lower word directly!           */
DCL 1 sedata(200) union,
    2 data      BIN FIXED(31),
    2 c(2)      BIN FIXED(15);
DCL (lword,len,vme_geo,vme_chn,vme_type,vme_nlw) bin fixed(15);
DCL (vme_data,vme0(1:20,0:31)) bin fixed(31);

/*  Event by event unpacking and analysis starts */

/*  [Here all raw data variables should be zero'ed!]   */

/*  Start reading!                                    */

P_SA$ve10_1 = P_RAW_DATA;   /*  pointer to the data  */

/*  Put the event header stuff into variables that can be  */
/*     displayed in GOOSY                                  */

/* examples of parameters that can be extracted  */
/* from the EVENT header:    */
frs.qlength = sa$ve10_1.la$ve10_1_dlen;
frs.qtype   = sa$ve10_1.ia$ve10_1_type;
frs.qsubtype    = sa$ve10_1.ia$ve10_1_subtype;
frs.qdummy  = sa$ve10_1.ia$ve10_1_dummy;
frs.qtrigger    = sa$ve10_1.ia$ve10_1_trigger;
frs.qevent_nr   = sa$ve10_1.la$ve10_1_count;
/* similar data can be obtained from the SUBevent headers   */


/* With the help of header information, check that the event */
/* (and later subevent) is OK                                */

/*  Check that the EVENT type and subtype are OK:  */

if ((sa$ve10_1.ia$ve10_1_type ^= 10)
 | (sa$ve10_1.ia$ve10_1_subtype ^= 1)) then do;
  signal condition(evtyp_err);
end;

/*  Check event length: if it's <= 4 it is empty or screwed up! */

IF (la$ve10_1_dlen < 4 | la$ve10_1_dlen = 4) then do;
  signal condition(evlen_err);
end;

/*  Event OK, now assign pointer to local subevent header! */

p_sa$ves10_1 = addr(sa$ve10_1.ia$ve10_1(1));

/* ***     Now let's loop over the local subevent                 */
/*         until the subevent pointer points to the next subevent */
/*         Go on until the end of the buffer or an error occurs...*/

do until ((P_sa$ves10_1 = addr(la$ve10_1_next)) | (err_flag = TRUE));

/*  Now select the processor ID                        */

  select(sa$ves10_1.ia$ves10_1_procid);

   when(10) do;   /* ProcID 10 = standard crate  */

/*  Check the SUBevent type and subtype!             */

    if (frs.B_subehdump) then call subevhead_dump();

    if ((sa$ves10_1.ia$ves10_1_type ^= 10)
     | (sa$ves10_1.ia$ves10_1_subtype ^= 1)) then do;
      signal condition(frssubevtyp_err);
    end;

/*    Now select subcrate number:  */
    select(sa$ves10_1.HA$VES10_1_subcrate);

     when(0) do;   /* ProcID 10, Subcrate 0  */


/* prepare to deal with the subevent data block; during the */
/* formatting of events in the DAQ event builder process,   */
/* the data is "word-swapped" with reference to the actual  */
/* readout stream, and this must be corrected for!          */

/* zero the temporary storage arrays used for unpacking:  */
      sts$value=u$zeros(addr(sedata),size(sedata));

/* now read the data - but note that the length reported */
/* in the subevent header is off by 2 words...           */
      do i=1 TO (SA$ves10_1.LA$ves10_1_dlen + 1)/2;
/* here we word-swap                                     */
       sedata(i).c(1) = sa$ves10_1.ia$ves10_1(2*i-1);
       sedata(i).c(2) = sa$ves10_1.ia$ves10_1(2*i);
      end;

/* The GSI MBS system makes it possible to user-define 13 */
/* distinct readout functions, selectable by a bit register /*
/* input on the GSI trigger module front panel.  */
/* The data structure can thus differ inbetween trigger types */
/* and the unpacking must take this into account!  */

/* extract trigger type from the event header  */
      select(sa$ve10_1.ia$ve10_1_trigger);
/* and decide what to do next based on the value */

/* all-of-FRS readout trigger:                    */
       when(1) goto id10tr1;

/* 1Hz clock "keep daq alive":                    */
       when(9) goto id10tr9;

/* start of extraction (accelerator event):       */
       when(10) goto id10tr10;

/* end of extraction (accelerator event):         */
       when(11) goto id10tr11;

/* start of acquisition (vme system):             */
       when(14) goto id10tr14;

/* stop of acquisition (vme system):              */
       when(15) goto id10tr15;

       otherwise signal condition(ID10triggtyp_err);

      end; /* ProcID 10, Subcrate 0, trigger type selection   */

/*    trigger 1 = full FRS readout (setup & diagnostics)      */
id10tr1:;

/* The data will be unpacked in two steps. */
/* Every datum (except those from 'special' units like the scaler */
/* and timestamp unit) is tagged with the geometrical address */
/* (=slot where the unit sits) and corresponding channel number */
/* of the module (ADC,TDC,QDC) from where it comes.   */
/* This makes it possible to first fill the "raw data" array */
/* called vme0(slot,channel). Up to here, the unpacking is */
/* completely independent of the experiment-specific cabling. */
/* In a second experiment-specific step, the assignment of */
/* raw-data parameters (energies, times) is made.  */


/*  zero the vme array for each event... */
      do i = 1 to 20;
       do j = 0 to 31;
        vme0(i,j) = 0;
       end;
      end;

/* zero the longword counters...   */
      lword = 0;
      len = 0;

/* special: TIME STAMP module data (4 longwords)   */
/*   no header or end-of-block info, we must hardwire GEO = 20... */

      vme_geo = 20;
      vme_chn = -1;
      vme_nlw = 4;
      do i = 0 to (vme_nlw - 1);
       lword = lword + 1;
       vme_chn = vme_chn + 1;
       vme_data = posint(sedata(lword).data,1,16);
       vme0(vme_geo,vme_chn) = vme_data;
       vme_chn = vme_chn + 1;
       vme_data = posint(sedata(lword).data,17,16);
       vme0(vme_geo,vme_chn) = vme_data;
      end;

      len = len + 4;

/* special: SCALER module data (1 longword per channel)   */
/*   sequential readout: NO chn-nr contained in the data longwords! */

/* read the header longword and extract slot, type & length  */
      lword = lword + 1;
      vme_geo = posint(sedata(lword).c(2),12,5);
      vme_type = posint(sedata(lword).c(2),9,3);
      vme_nlw =  posint(sedata(lword).c(1),1,6);
      vme_chn =  -1;
      len = len + 1;

/* read the data */
      if (vme_nlw > 0) then do;
       do i = 1 to vme_nlw;
        lword = lword + 1;
        vme_chn = vme_chn + 1;
        vme_data = posint(sedata(lword).data,1,32);
        vme0(vme_geo,vme_chn) = vme_data;
        len = len + 1;
       end;

/* read the expected "end-of-block" longword (ignore)   */
       lword = lword + 1;
       vme_geo = posint(sedata(lword).c(2),12,5);
       vme_type = posint(sedata(lword).c(2),9,3);
       vme_data =  posint(sedata(lword).c(1),12,5);
       len = len + 1;

      end;

/*  now start with the REST of the unpacking...       */

      do while (len < (SA$ves10_1.LA$ves10_1_dlen - 2)/2);

       vme_chn = -1;

/* read the header longword and extract slot, type & length  */
       lword = lword + 1;
       vme_geo = posint(sedata(lword).c(2),12,5);
       vme_type = posint(sedata(lword).c(2),9,3);
       vme_nlw =  posint(sedata(lword).c(1),1,6);
       len = len + 1;

/* read the data */
       if (vme_type = 2 & vme_nlw > 0) then do;
        do i = 1 to vme_nlw;
         lword = lword + 1;
         vme_geo = posint(sedata(lword).c(2),12,5);
         vme_type = posint(sedata(lword).c(2),9,3);
         vme_chn = posint(sedata(lword).c(2),1,5);
         vme_data = posint(sedata(lword).c(1),1,16);
         vme0(vme_geo,vme_chn) = vme_data;
         len = len + 1;
        end;

/* read the expected "end-of-block" longword (ignore)   */
        lword = lword + 1;
        vme_geo = posint(sedata(lword).c(2),12,5);
        vme_type = posint(sedata(lword).c(2),9,3);
        vme_data =  sedata(lword).c(1);
        len = len + 1;

       end;

      end;  /* of the do while... loop  */

/* now we can assign the parameters according to cabling:  */
/* the following corresponds to a "standard" FRS readout */

/* ### timestamp: */
      mon.ts_id = vme0(20,0);
      mon.ts_word(1) = vme0(20,2);
      mon.ts_word(2) = vme0(20,4);
      mon.ts_word(3) = vme0(20,6);

/* ### scalers:  */
/* these are treated as 32-bit integers directly  */
      mon.sc_long(1) = vme0(6,0);
      mon.sc_long(2) = vme0(6,1);
      mon.sc_long(3) = vme0(6,2);
      mon.sc_long(4) = vme0(6,3);
      mon.sc_long(5) = vme0(6,4);
      mon.sc_long(6) = vme0(6,5);
      mon.sc_long(7) = vme0(6,6);
      mon.sc_long(8) = vme0(6,7);
      mon.sc_long(9) = vme0(6,8);
      mon.sc_long(10) = vme0(6,9);
      mon.sc_long(11) = vme0(6,10);
      mon.sc_long(12) = vme0(6,11);
      mon.sc_long(13) = vme0(6,12);
      mon.sc_long(14) = vme0(6,13);
      mon.sc_long(15) = vme0(6,14);
      mon.sc_long(16) = vme0(6,15);

/* ### MW anodes:  */

      mw.an(1) = posint(vme0(8,0),1,12);
      mw.an(2) = posint(vme0(8,1),1,12);
      mw.an(3) = posint(vme0(8,2),1,12);
      mw.an(4) = posint(vme0(8,3),1,12);
      mw.an(5) = posint(vme0(8,4),1,12);
      mw.an(6) = posint(vme0(8,5),1,12);
      mw.an(7) = posint(vme0(8,6),1,12);
      mw.an(8) = posint(vme0(8,7),1,12);
      mw.an(9) = posint(vme0(8,8),1,12);
      mw.an(10) = posint(vme0(8,9),1,12);
      mw.an(11) = posint(vme0(8,10),1,12);
      mw.an(12) = posint(vme0(8,11),1,12);
      mw.an(13) = posint(vme0(8,12),1,12);


/* ### MW cathodes:  */

/* ----- MW 11 (No. 1) ----- */
      mw.xr(1) = posint(vme0(8,16),1,12);
      mw.xl(1) = posint(vme0(8,17),1,12);
      mw.yu(1) = posint(vme0(8,18),1,12);
      mw.yd(1) = posint(vme0(8,19),1,12);

/* ----- MW 31 (No. 4) ----- */
      mw.xr(4) = posint(vme0(8,20),1,12);
      mw.xl(4) = posint(vme0(8,21),1,12);
      mw.yu(4) = posint(vme0(8,22),1,12);
      mw.yd(4) = posint(vme0(8,23),1,12);

/* ----- MW 21 (No. 2) ----- */
      mw.xr(2) = posint(vme0(8,24),1,12);
      mw.xl(2) = posint(vme0(8,25),1,12);
      mw.yu(2) = posint(vme0(8,26),1,12);
      mw.yd(2) = posint(vme0(8,27),1,12);

/* ----- MW 22 (No. 3) ----- */
      mw.xr(3) = posint(vme0(8,28),1,12);
      mw.xl(3) = posint(vme0(8,29),1,12);
      mw.yu(3) = posint(vme0(8,30),1,12);
      mw.yd(3) = posint(vme0(8,31),1,12);

/* ----- MW 41 (No. 5) ----- */
      mw.xr(5) = posint(vme0(9,0),1,12);
      mw.xl(5) = posint(vme0(9,1),1,12);
      mw.yu(5) = posint(vme0(9,2),1,12);
      mw.yd(5) = posint(vme0(9,3),1,12);

/* ----- MW 42 (No. 6) ----- */
      mw.xr(6) = posint(vme0(9,4),1,12);
      mw.xl(6) = posint(vme0(9,5),1,12);
      mw.yu(6) = posint(vme0(9,6),1,12);
      mw.yd(6) = posint(vme0(9,7),1,12);

/* ----- MW 51 (No. 7) ----- */
      mw.xr(7) = posint(vme0(9,8),1,12);
      mw.xl(7) = posint(vme0(9,9),1,12);
      mw.yu(7) = posint(vme0(9,10),1,12);
      mw.yd(7) = posint(vme0(9,11),1,12);

/* ----- MW 61 (No. 1) ----- */
/*  not included in readout! */
      mw.xr(8) = 0.;
      mw.xl(8) = 0.;
      mw.yu(8) = 0.;
      mw.yd(8) = 0.;

/* ----- MW 71 (No. 9) ----- */
      mw.xr(9) = posint(vme0(9,12),1,12);
      mw.xl(9) = posint(vme0(9,13),1,12);
      mw.yu(9) = posint(vme0(9,14),1,12);
      mw.yd(9) = posint(vme0(9,15),1,12);

/* ----- MW 81 (No. 10) ----- */
      mw.xr(10) = posint(vme0(9,16),1,12);
      mw.xl(10) = posint(vme0(9,17),1,12);
      mw.yu(10) = posint(vme0(9,18),1,12);
      mw.yd(10) = posint(vme0(9,19),1,12);

/* ----- MW 82 (No. 11) ----- */
      mw.xr(11) = posint(vme0(9,20),1,12);
      mw.xl(11) = posint(vme0(9,21),1,12);
      mw.yu(11) = posint(vme0(9,22),1,12);
      mw.yd(11) = posint(vme0(9,23),1,12);

/* ----- MW B1 (No. 12) ----- */
      mw.xr(12) = posint(vme0(9,24),1,12);
      mw.xl(12) = posint(vme0(9,25),1,12);
      mw.yu(12) = posint(vme0(9,26),1,12);
      mw.yd(12) = posint(vme0(9,27),1,12);

/* ----- MW B2 (No. 13) ----- */
      mw.xr(13) = posint(vme0(9,28),1,12);
      mw.xl(13) = posint(vme0(9,29),1,12);
      mw.yu(13) = posint(vme0(9,30),1,12);
      mw.yd(13) = posint(vme0(9,31),1,12);

/* ### SCI dE:  */

      sci.de_21l = posint(vme0(11,0),1,12);
      sci.de_21r = posint(vme0(11,1),1,12);
      sci.de_41l = posint(vme0(11,2),1,12);
      sci.de_41r = posint(vme0(11,3),1,12);
      sci.de_41u = posint(vme0(11,4),1,12);
      sci.de_41d = posint(vme0(11,5),1,12);
      sci.de_81l = posint(vme0(11,6),1,12);
      sci.de_81r = posint(vme0(11,7),1,12);

      sci.de_sc22(1) = posint(vme0(11,16),1,12);
      sci.de_sc22(2) = posint(vme0(11,17),1,12);
      sci.de_sc22(3) = posint(vme0(11,18),1,12);
      sci.de_sc22(4) = posint(vme0(11,19),1,12);
      sci.de_sc22(5) = posint(vme0(11,20),1,12);
      sci.de_sc22(6) = posint(vme0(11,21),1,12);
      sci.de_sc22(7) = posint(vme0(11,22),1,12);
      sci.de_sc22(8) = posint(vme0(11,23),1,12);
      sci.de_sc22(9) = posint(vme0(11,24),1,12);
      sci.de_sc22(10) = posint(vme0(11,25),1,12);
      sci.de_sc22(11) = posint(vme0(11,26),1,12);
      sci.de_sc22(12) = posint(vme0(11,27),1,12);
      sci.de_sc22(13) = posint(vme0(11,28),1,12);
      sci.de_sc22(14) = posint(vme0(11,29),1,12);
      sci.de_sc22(15) = posint(vme0(11,30),1,12);

/* ### SCI times:  */

      sci.dt_21l_21r = posint(vme0(13,0),1,12);
      sci.dt_41l_41r = posint(vme0(13,1),1,12);
      sci.dt_21l_41l = posint(vme0(13,2),1,12);
      sci.dt_21r_41r = posint(vme0(13,3),1,12);
      sci.dt_81l_81r = posint(vme0(13,4),1,12);
      sci.dt_21l_81l = posint(vme0(13,5),1,12);
      sci.dt_21r_81r = posint(vme0(13,6),1,12);
      sci.dt_41u_41d = posint(vme0(13,7),1,12);

/* ### MUSIC times:  */
/*  presently not included in readout! */
      music.t1(1) = 0. ;
      music.t1(2) = 0. ;
      music.t1(3) = 0. ;
      music.t1(4) = 0. ;
      music.t1(5) = 0. ;
      music.t1(6) = 0. ;
      music.t1(7) = 0. ;
      music.t1(8) = 0. ;

/* ### MUSIC dE:  */
      music.e1(1) = posint(vme0(13,8),1,12);
      music.e1(2) = posint(vme0(13,9),1,12);
      music.e1(3) = posint(vme0(13,10),1,12);
      music.e1(4) = posint(vme0(13,11),1,12);
      music.e1(5) = posint(vme0(13,12),1,12);
      music.e1(6) = posint(vme0(13,13),1,12);
      music.e1(7) = posint(vme0(13,14),1,12);
      music.e1(8) = posint(vme0(13,15),1,12);

/* ### MUSIC temp & pressure:  */
/*  presently not included in readout! */
      music.pres(1) = 0.;
      music.temp(1) = 0.;

/*  some raw signal diagnostics...   */
      do i = 0 to 31;
       $accu1(L,DB,$SPECTRUM,vme0_8,i,1,1,posint(vme0(8,i),1,12));
       $accu1(L,DB,$SPECTRUM,vme0_9,i,1,1,posint(vme0(9,i),1,12));
       $accu1(L,DB,$SPECTRUM,vme0_11,i,1,1,posint(vme0(11,i),1,12));
       $accu1(L,DB,$SPECTRUM,vme0_12,i,1,1,posint(vme0(12,i),1,12));
       $accu1(L,DB,$SPECTRUM,vme0_13,i,1,1,posint(vme0(13,i),1,12));
       $accu1(L,DB,$SPECTRUM,vme0_15,i,1,1,posint(vme0(15,i),1,12));
       $accu1(L,DB,$SPECTRUM,vme0_16,i,1,1,posint(vme0(16,i),1,12));
       $accu1(L,DB,$SPECTRUM,vme0_18,i,1,1,posint(vme0(18,i),1,12));
      end;

      goto G_next_subevent;

id10tr9:;

/*  zero the vme array for each event... */
      do i = 1 to 20;
       do j = 0 to 31;
        vme0(i,j) = 0;
       end;
      end;

/* zero the longword counters...   */
      lword = 0;
      len = 0;

/* special: TIME STAMP module data (4 longwords)   */
/*   no header or end-of-block info, we must hardwire GEO = 20... */

      vme_geo = 20;
      vme_chn = -1;
      vme_nlw = 4;
      do i = 0 to (vme_nlw - 1);
       lword = lword + 1;
       vme_chn = vme_chn + 1;
       vme_data = posint(sedata(lword).data,1,16);
       vme0(vme_geo,vme_chn) = vme_data;
       vme_chn = vme_chn + 1;
       vme_data = posint(sedata(lword).data,17,16);
       vme0(vme_geo,vme_chn) = vme_data;
      end;

      len = len + 4;

/* now we can assign the parameters according to cabling:  */

/* ### timestamp: */
      mon.ts_id = vme0(20,0);
      mon.ts_word(1) = vme0(20,2);
      mon.ts_word(2) = vme0(20,4);
      mon.ts_word(3) = vme0(20,6);

      goto G_next_subevent;

id10tr10:;

/*  zero the vme array for each event... */
      do i = 1 to 20;
       do j = 0 to 31;
        vme0(i,j) = 0;
       end;
      end;

/* zero the longword counters...   */
      lword = 0;
      len = 0;

/* special: TIME STAMP module data (4 longwords)   */
/*   no header or end-of-block info, we must hardwire GEO = 20... */

      vme_geo = 20;
      vme_chn = -1;
      vme_nlw = 4;
      do i = 0 to (vme_nlw - 1);
       lword = lword + 1;
       vme_chn = vme_chn + 1;
       vme_data = posint(sedata(lword).data,1,16);
       vme0(vme_geo,vme_chn) = vme_data;
       vme_chn = vme_chn + 1;
       vme_data = posint(sedata(lword).data,17,16);
       vme0(vme_geo,vme_chn) = vme_data;
      end;

      len = len + 4;

/* now we can assign the parameters according to cabling:  */

/* ### timestamp: */
      mon.ts_id = vme0(20,0);
      mon.ts_word(1) = vme0(20,2);
      mon.ts_word(2) = vme0(20,4);
      mon.ts_word(3) = vme0(20,6);

      goto G_next_subevent;

id10tr11:;

/*  zero the vme array for each event... */
      do i = 1 to 20;
       do j = 0 to 31;
        vme0(i,j) = 0;
       end;
      end;

/* zero the longword counters...   */
      lword = 0;
      len = 0;

/* special: TIME STAMP module data (4 longwords)   */
/*   no header or end-of-block info, we must hardwire GEO = 20... */

      vme_geo = 20;
      vme_chn = -1;
      vme_nlw = 4;
      do i = 0 to (vme_nlw - 1);
       lword = lword + 1;
       vme_chn = vme_chn + 1;
       vme_data = posint(sedata(lword).data,1,16);
       vme0(vme_geo,vme_chn) = vme_data;
       vme_chn = vme_chn + 1;
       vme_data = posint(sedata(lword).data,17,16);
       vme0(vme_geo,vme_chn) = vme_data;
      end;

      len = len + 4;

/* now we can assign the parameters according to cabling:  */

/* ### timestamp: */
      mon.ts_id = vme0(20,0);
      mon.ts_word(1) = vme0(20,2);
      mon.ts_word(2) = vme0(20,4);
      mon.ts_word(3) = vme0(20,6);

      goto G_next_subevent;

id10tr14:;

/*  zero the vme array for each event... */
      do i = 1 to 20;
       do j = 0 to 31;
        vme0(i,j) = 0;
       end;
      end;

/* zero the longword counters...   */
      lword = 0;
      len = 0;

/* special: TIME STAMP module data (4 longwords)   */
/*   no header or end-of-block info, we must hardwire GEO = 20... */

      vme_geo = 20;
      vme_chn = -1;
      vme_nlw = 4;
      do i = 0 to (vme_nlw - 1);
       lword = lword + 1;
       vme_chn = vme_chn + 1;
       vme_data = posint(sedata(lword).data,1,16);
       vme0(vme_geo,vme_chn) = vme_data;
       vme_chn = vme_chn + 1;
       vme_data = posint(sedata(lword).data,17,16);
       vme0(vme_geo,vme_chn) = vme_data;
      end;

      len = len + 4;

/* now we can assign the parameters according to cabling:  */

/* ### timestamp: */
      mon.ts_id = vme0(20,0);
      mon.ts_word(1) = vme0(20,2);
      mon.ts_word(2) = vme0(20,4);
      mon.ts_word(3) = vme0(20,6);

      goto G_next_subevent;

id10tr15:;

/*  zero the vme array for each event... */
      do i = 1 to 20;
       do j = 0 to 31;
        vme0(i,j) = 0;
       end;
      end;

/* zero the longword counters...   */
      lword = 0;
      len = 0;

/* special: TIME STAMP module data (4 longwords)   */
/*   no header or end-of-block info, we must hardwire GEO = 20... */

      vme_geo = 20;
      vme_chn = -1;
      vme_nlw = 4;
      do i = 0 to (vme_nlw - 1);
       lword = lword + 1;
       vme_chn = vme_chn + 1;
       vme_data = posint(sedata(lword).data,1,16);
       vme0(vme_geo,vme_chn) = vme_data;
       vme_chn = vme_chn + 1;
       vme_data = posint(sedata(lword).data,17,16);
       vme0(vme_geo,vme_chn) = vme_data;
      end;

      len = len + 4;

/* now we can assign the parameters according to cabling:  */

/* ### timestamp: */
      mon.ts_id = vme0(20,0);
      mon.ts_word(1) = vme0(20,2);
      mon.ts_word(2) = vme0(20,4);
      mon.ts_word(3) = vme0(20,6);

      goto G_next_subevent;

     end;   /*  ProcID 10, Subcrate 0  */

     otherwise signal condition(ID10subcrate_err);

    end;   /* select subcrate  */

   end;   /*  ProcID 10  */

   otherwise  signal condition(procid_err);

  end;  /* Select ProcID  */

G_next_subevent:;

/*  Point to the NEXT subevent: */
  p_sa$VES10_1 = ADDR(sa$ves10_1.la$ves10_1_next);

end;   /* do until... loop over `local' subevent  */

sts$value = 1;

G_EXIT:;

/* This is then the end of the unpacking - the actual */
/* GOOSY file continues with various package-specific */
/* code sequences.   */

 
Comments? Questions? Error reports? Please contact the webmaster!
The FRS web pages have been accessed 27006 times since October 27, 2003!
Script file last updated on July 21, 2006.