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. */