Macros

Home ] Up ] General ] Short ] Syntax ] Postscript ] Hints ] Cursor ] DSN ] Arithmetik ] Line Modes ] Colours ] Polar ] 2Dim ] 3Dim ] Analyzers ] Library ] Types ] Text ] Graphic ] Inbed ] Fit ] Presentation ] Extend ] Concepts ] Dynamic ] Listmode ] [ Macros ] Goosydata ] Online ] Commands (List) ] Commands (Details) ] Install ] MSWindows ] Problems ]

GSI
FRS

 

 

SATAN Help
 
LIST OF MACROS AND PROCEDURES TO BE USED IN USER-SUPPLIED PROGRAMS  
Conventions:
In the text below the following conventions are used:
 I7, BIN FIXED(7), I15 = BIN FIXED(15), I31 = BIN FIXED(31),
 R6 = DEC FLOAT(6), R15 = DEC FLOAT(15),
 CV = CHARACTER VARYING.                                        

In the macros AGET, ANAL, and ASET defined by $EXTENSIONS.PLI, 
the parameter C_ANALYZER is interpreted as a character-string variable:
==> C_ANALYZER = 'Mass';
==> ANAL(C_ANALYZER,I_A);
To specify a character string directly, the parameter C_ANALYZER
has to be put in quotes:
==> ANAL('A_MASS',I_A);

In the macros AGEN, ACDEF, AGET, ANAL, ASET, and AC defined by 
$MACROS.PLI, the parameter C_ANALYZER is interpreted as a 
character string directly.
==> ANAL(A_MASS,I_A);

Macros and procedures for any user-supplied program
provided by  %INCLUDE '\FRSTOOLS\TRI\SATAN\$EXTENSIONS.PLI';

R6 = PRN;                        [RETURNS(DEC FLOAT(6))]
   uniform random generator (between 0 and 1)

R6 = PGAUSS(R6_mean,R6_sigma);   [RETURNS(DEC FLOAT(6))]
   Gaussian random generator

R6 = PEXP(R6_tau);   [RETURNS(DEC FLOAT(6))]
   exponential random generator

R = AGET(C_ANALYZER,I_CHANNEL1,{I_CHANNEL2});
   get the content of a channel of an analyzer
ANAL(C_ANALYZER,I_CHANNEL1,(I_CHANNEL2)) INCR(R6_INCR);
   increment the content of a channel of an analyzer by R6_INCR
or
ANAL(C_ANALYZER,I_CHANNEL1,(I_CHANNEL2)) VALUE(R6_VALUE); 
   set the content of a channel of an analyzer to R6_VALUE

ASET(C_ANALYZER,I_CHANNEL1,(I_CHANNEL2)) VALUE(R6_VALUE); 
   set the content of a channel of an analyzer to R6_VALUE 
   (ASET(..) VALUE(..) is identical to ANAL(..) VALUE(..)

EXCMD(C_COMMAND);
   excecute a SATAN command

Ixx = $FIXED(value,xx);
   convert any value of a any numeric variable into BIN FIXED(xx) 
   format
    (xx = 7, 15 or 31 are supported; 
     the conversion is protected against FIXEDOVERFLOW)

R6 = $IPARVAL(CV_name);
   get value of the dynamic parameter CV_name

CALL $PROMPT(CV,any);        
   prompt a variable  

CALL $PROMPTO(CV,any);
   propose and prompt a variable   
   "any" may be  DEC FLOAT(6),
                 DEC FLOAT(15),
                 BIN FIXED(15),
                 BIN FIXED(31),
                 (*) DEC FLOAT(6),
                 (*) DEC FLOAT(15),
                 (*) BIN FIXED(15),
                 (*) BIN FIXED(31),
                 BIT(1) ALIGNED.


Macros and procedures for the analysis of list-mode data:  
provided by  %INCLUDE '\FRSTOOLS\TRI\SATAN\$MACROS.PLI';
   General remarks for syntax  and use of macros: 
   Macros are specified with positional and keyword arguments.
   In "AGEN(TEST) LIMITS(1,100)", TEST is a positional argument,
   "1,100" is a keyword argument with the keyword "LIMITS".
   Positional arguments must appear in sequence, keyword arguments may 
   appear in any order.
   The macros given below may only be used in the user-supplied
   analysis procedure!       
   The language-sensitive editor provided with the PL/I compiler
   for WINDOWS can be modified to recognize the SATAN macros
   (see HELP MSWINDOWS). However, for this purpose the macros have
   to be used without a leading "$" sign! The compiler supports
   both versions.
LISTPROC;
   begin of analysis program      
DEBUG;
   activate debug option      
LIST(p1,p2,p3,p4, ...);
   list a series of numerical variables (integer or real) and text.
   p1,p2,... may be a numerical variable, a text variable or a text. 
   ==> LIST('Program Version: ',i_version);
-----------------------------------------------------------------------
|    Syntax of LIST (list character strings and numerical variables)
|      Positional arguments: numerical variable {BIN FIXED(15), 
|      BIN FIXED(31), DEC FLOAT(6), DEC FLOAT(15)}, CHAR(x) VAR, text.
-----------------------------------------------------------------------       
PARDCL(SLOPE) INIT(8.79) COMMENT('SLOPE OF TIME CALIBRATION');
PARDCL(A0,A1) INIT('0.5,27.3') COMMENT('SHIFT,FACTOR');
PARDCL(X(5)) INIT('7,3,5,9,3.5') COMMENT('X-ARRAY');
   declare global parameters
-----------------------------------------------------------------------
|    Syntax of PARDCL (only DEC FLOAT(6) data type; 1-dim arrays 
|           or a list of variable names supported)
|      1. argument: variable name(s),
|         ==> "PARDCL(SLOPE)" defines one parameter,
|         ==> "PARDCL(OFFSET,SLOPE)" defines two parameter,
|         ==> "PARDCL(OFFS(3))" defines an array of 3 parameter,
|         ==> "PARDCL(OFFS(-2:3))" defines an array of 6 parameter,
|      INIT    keyword: value (optional; default = 0),
|      COMMENT keyword: comment (optional; default = '').
|    For arrays, the INIT and COMMENT keywords are assigned to the
|      different elements in sequence. Missing values are
|      repeated from the last given value.
|    For a list of variable names, the INIT and COMMENT keywords may
|      contain a list of names.
|    Arrays and lists of variables cannot be mixed in one PARDCL.
|    PARDCL appears in the analysis routine. A global parameter may
|      be used in the analysis routine like a normal variable declared 
|      by   DECLARE "name" DEC FLOAT(6) STATIC INIT(..); .*/
-----------------------------------------------------------------------       
AGEN(C_ANALYZER) TYPE(C_TYPE) LIMITS(x1,x2{,y1,y2}) BINS(bx{,by}) 
   NCND(I) CXAXIS(C) CYAXIS(C) TITLE(C) COMMENT(C) FCAL(r1{,r2})
   LINESYMBOL(C);
   generate an analyzer or an array of analyzers 
   (Arrays of analyzers up to 5 dimensions are supported.)
-----------------------------------------------------------------------
|    Syntax of AGEN (1-dimensional analyzer) 
|      1. argument: analyzer name or array of analyzer names,
|         ==> "AGEN(MUSIC)" defines one analyzer,
|         ==> "AGEN(ATAR(3))" defines an array of three analyzers,
|         ==> "AGEN(Z_RESPONSE(80:92))" defines an array of 13 
|                            analyzers.
|         ==> "AGEN(TEST(5:9,27:37))" defines a 2-dim. array of 
|                            analyzers.
|      TYPE  keyword: FIXED or FLOAT (optional; default = FIXED),
|                      and PROTECTED (against ACLR)  
|         ==> "AGEN(TEST) TYPE(FLOAT,PROTECTED)"
|      MODE     keyword: ANALOG or DIGITAL (optional; default = ANALOG),
|      LIMITS   keyword: list of limits (2 values),
|      BINS     keyword: binsize (optional; default = 1),
|      NCND     keyword: number of conditions (optional; default = 0),
|      CXAXIS   keyword: description of x axis (optional; default =
|                                                      Channel),
|      CYAXIS   keyword: description of y axis (optional; default =
|                                                      Counts),
|      TITLE    keyword: title of analyzer (optional; default =
|            analyzer name),
|      COMMENT  keyword: comment of analyzer (optional; default = '').
|      FCAL     keyword: calibration factor.
|      LINESYMBOL keyword: line and symbol (==> LTR11 , default is HT0)
|      In CXAXIS,CYAXIS,TITLE and COMMENT, & is a placeholder for the
|       element number of an array of analyzers.
-----------------------------------------------------------------------
|    Syntax of AGEN (2-dimensional analyzer)
|      1. argument: analyzer name or array of analyzer names 
|                   (see above),
|      TYPE  keyword: FIXED or FLOAT (optional; default = FIXED),
|                      and PROTECTED (against ACLR)  
|         ==> "AGEN(TEST) TYPE(FLOAT,PROTECTED)"
|      LIMITS keyword: list of limits (4 values),
|      BINS  keyword: binsizes (optional; default = 1,1),
|      NCND  keyword: number of conditions (optional, default = 0),
|      CXAXIS  keyword: description of x axis (optional; default =
|                                           Dimension 1),
|      CYAXIS  keyword: description of y axis (optional; default =
|                                           Dimension 2),
|      TITLE   keyword: title of analyzer (optional; default =
|            analyzer name),
|      COMMENT keyword: comment of analyzer (optional; default = '').
|      FCAL    keyword: calibration factors.
|      In CXAXIS,CYAXIS,TITLE and COMMENT, & is a placeholder for the
|       element number of an array of analyzers.
-----------------------------------------------------------------------       
ACDEF(C_ANALYZER,I_CONDITION) ID(C) LIMITS(x1,x2{,y1,y2});
   define name (ID) and limits of condition      
SCAN GOOREAD(I1) 
     {TIMESTAMP, PATTERN(IP), SCALERS(IS), ADC(IA), TDC(IT), QDC(IQ)}
     SLOT(IS); 
   attribute data channels on VME slots to GOOREAD data arrays
----------------------------------------------------------------------- 
|The SCAN macro is only needed for data format VMEFRS (see macro EVENT).
|    Syntax of SCAN
|      One SCAN macro refers to one slot of the VME crate. 
|      The SCAN macro must appear before the ANTRY macro in the 
|      declaration part of the user analysis programme.
|      GOOREAD  keyword: defines to which GOOREAD macro the actual SCAN
|          macro refers. (First GOOREAD: I1 = 1, second GOOREAD: I1 = 2 ...)
|          (Instead of GOOREAD, also CONTROL or PROCID of the 
|           corresponding subevent may be specified.)
|      TIMESTAMP, PATTERN, SCALERS, ADC, TDC, QDC keywords:
|          One of these keywords defines the kind and the number of data  
|          in the corresponding VME slot. 
|      SLOT keyword: denotes the slot of the VME crate.
|          (GEO is also accepted as an alias for SLOT.) 
-----------------------------------------------------------------------       
ANTRY;
   end of declaration part of analyzer program      

EVENT DATA(I1,I2,I3,...) FORMAT({FIXED,FLOAT,GOOSY,ASCII,CAMDA,..});
   begin of event loop
-----------------------------------------------------------------------
|    EVENT defines the names and the nature of the list-mode data.
|      Syntax of EVENT:
|      DATA keyword defines the names of the event variables
|         (e.g. DATA(IA(3),I4,IB(20)) defines 24 event variables.)
|         The event variables are already declared by the EVENT macro.
|      FORMAT keyword defines the nature of the list-mode data
|         FIXED: standard SATAN format, 2 byte integers (= default),
|         FIXED LONG: SATAN format, 4 byte integers (= default),
|         FLOAT: SATAN format, 4 byte reals, 
|         FLOAT LONG: SATAN format, 8 byte reals, 
|         GOOSY: data in GOOSY format 
|           (needs additional macros GOOREAD, see HELP GOOSYDATA)
|           The data are available as BIN FIXED(31) variables 
|           (4-byte integers) in the analysis procedure.
|         FRS2003: FRS standard data format.
|           (A special GOOSY format, containing a time stamp,
|            bit pattern, unpacked 32-bit scaler data and packed
|            16 bit ADC data. See HELP GOOSYDATA for details)
|         VMEFRS: FRS data format for VME crates.
|           (A special GOOSY format, containing a time stamp,
|            bit pattern, unpacked 32-bit scaler data and packed
|            16 bit ADC data. See HELP GOOSYDATA for details)
|         ASCII: data in ASCII format, numbers may be integers or 
|           reals, divided by at least one blank.
|           The data are available as DEC FLOAT(6) variables 
|           (4-byte reals) in the analysis procedure.
|           One or more events per line are allowed.
|           Lines beginning with  *   are considered as comment lines.
|         IN2P3: Standard data format of IN2P3 (France). Presently,
|           only EVENTD and EVENTDB data types of 2-byte integers
|           with WORDC (word-count) structure and a record size of 
|           16384 bytes are supported. The number of variables provided
|           in the EVENT DATA macro is not critical for synchronizing 
|           consecutive events, since the length of each event is coded 
|              in the WORDC value. However, EVENT parameters exceeding the 
|           number of input parameter have unpredictable values! 
|           The first two EVENT parameters contain the total number of 
|           parameters read in the actual event (= WORDC value) and the 
|           running event number.
|         CAMDA: CAMDA data format
|           Records of 2048 bytes length
|            1. record:  5 bytes:  M1 (ASCII)
|                        M1 bytes: CAMC list file
|                        5 bytes:  M2 (ASCII)
|                        M2 bytes: comment
|                        5 bytes:  number of parameters per event
|                        5 bytes:  total # of parameters (not relevant)
|                        5 bytes:  number of events per record
|                        6 bytes:  number of histogramm channels
|                        8 bytes:  date
|                        8 bytes:  time
|            Following records: Data (2-byte numbers)              
-----------------------------------------------------------------------
                                                    
ANAL(C_ANALYZER,I_CHANNEL1{,I_CHANNEL2}) INCR(amount of increment);
   accumulate into an analyzer (INCR(1) can be omitted)
or
ANAL(C_ANALYZER,I_CHANNEL1{,I_CHANNEL2}) VALUE(value to set);
   fill a value into an analyzer
-----------------------------------------------------------------------
|    Syntax of ANAL (for 1-dimensional analyzer)
|      1. argument: analyzer name,
|      2. argument: channel number,
|      INCR keyword: increment (optional; default = 1) or
|      VALUE keyword: set value (INCR and VALUE are exclusive).
|     Analyzers used in ANAL must be created by the macro AGEN.
-----------------------------------------------------------------------
|    Syntax of ANAL (for 2-dimensional analyzer)
|      1. argument: analyzer name,
|      2. argument: channel number 1. dimension,
|      3. argument: channel number 2. dimension,
|      INCR keyword: increment (optional; default = 1) or
|      VALUE keyword: set value (INCR and VALUE are exclusive).
|      The value of the INCR() or VALUE() parameter may be any real 
|      number.
|     Analyzers used in ANAL must be created by the macro AGEN.
|----------------------------------------------------------------------   
AGET(C_ANALYZER,I_CHANNEL1,{I_CHANNEL2});  [RETURNS(DEC FLOAT(15))]
   get the content of a channel of an analyzer
   (For analog-type analyzers:
    If the channel does (resp. the channels do) not coincide with the 
    lower limit of a bin, an interpolated value is returned. Zero is 
    returned for channel numbers outside the range of the analyzer 
    limits.)
-----------------------------------------------------------------------
|    Syntax of AGET (for 1-dimensional analyzer)
|      1. argument: analyzer name,
|      2. argument: channel number,
|     AGET returns the content of the analyzer channel.
|    Analyzers used in AGET must have been created by AGEN.
-----------------------------------------------------------------------
|    Syntax of AGET (for 2-dimensional analyzer)
|      1. argument: analyzer name,
|      2. argument: channel number 1. dimension,
|      3. argument: channel number 2. dimension,
|     AGET returns the content of the analyzer channel.
|    Analyzers used in AGET must have been created by AGEN.
-----------------------------------------------------------------------  
AC(C_ANALYZER,I_CONDITION);       [RETURNS(BIT(1))]
   check the condition of an analyzer
-----------------------------------------------------------------------
|    Syntax of AC (for 1-dim. and 2-dim. analyzers)
|      1. argument: analyzer name,
|      2. argument: condition number or condition ID.
|                    (character string or variable beginning with "C" 
|                      is interpreted as condition ID, number or any 
|                      other variable is interpreted as condition 
|                      number)                         
|          ==> "IF AC(TOF,3) THEN ..."            condition number 
|          ==> "IF AC(TOF,I_WIN) THEN ..."        condition number
|          ==> "IF AC(TOF,'FRAGMENTS') THEN ..."  condition ID
|          ==> "IF AC(TOF,C_FIRST) THEN ..."      condition ID
|    AC yields always true for conditions which are not set (= open)!
|    AC yields always false for conditions which are closed.
-----------------------------------------------------------------------  
EXCMD(C_COMMAND);
   execute a SATAN command
-----------------------------------------------------------------------
|    Syntax of EXCMD 
|      One positional argument: command text.
|     ==> EXCMD('HALT');
-----------------------------------------------------------------------  
In the following the following conventions are used:
I15 = BIN FIXED(15), I31 = BIN FIXED(31),
R6 = DEC FLOAT(6), R15 = DEC FLOAT(15),
CV = CHARACTER VARYING.                                               
LOUT DATA(array) N(number) DSN(output dataset) FORMAT(format);
   write list-mode data on file
-----------------------------------------------------------------------
|    Syntax of LOUT
|      DATA keyword:   array of data elements to be written
|      (The data array may be I15, I31, R6 or R15.)
|      N keyword:      number of data elements to be written
|      DSN keyword:    dataset name for output (optional)
|      (The dataset may also be specified by the command LOUTPUT.)
|      FORMAT keyword: output formats ( E(x,y) and F(x,y) are supported )
|      (If the FORMAT keyword is specified, the data are written in
|       ASCII format. Otherwise, the data are written in SATAN format.)
-----------------------------------------------------------------------
                                              
R15 = $2FIX16FLOL(I15_low,I15_high);        [RETURNS(DEC FLOAT(15))]
   combine and convert two unsigned 16-bit numbers provided in
   two BIN FIXED(15) variables to one DEC FLOAT(15) variable.       
R15 = $2FIXL24FLOL(I31_low,I31_high);        [RETURNS(DEC FLOAT(15))]
   combine and convert two unsigned 24-bit numbers provided in 
   two BIN FIXED(31) variables to one DEC FLOAT(15) variable.       
R15 = $2FIXL16FLOL(I31_low,I31_high);        [RETURNS(DEC FLOAT(15))]
   combine and convert two unsigned 16-bit numbers provided in
   two BIN FIXED(31) variables to one DEC FLOAT(15) variable.       
Ixx = $FIXED(value,xx);
   convert any value of a any numeric variable into BIN FIXED(xx) 
   format
    (xx = 7, 15 or 31 are supported; 
     the conversion is protected against FIXEDOVERFLOW)       
I31 = NEVENT; 
   event counter 
    (Value is 1 for the first event after INPUT, ICONNECT or START.)       
ENDEVT;
   end of event loop      
CONDITION_CHECK();
   check on unused conditions (must be placed directly after ENDEVT)
   (Unused conditions make unnecessary long object codes and increase 
    the analysis time.)       
ENDANL;
   end of analysis program
 
Special macros for Monte-Carlo simulations:
provided by  %INCLUDE '\FRSTOOLS\TRI\SATAN\$MACROS.PLI';

START;
   entry for START command

LOOP;          /* or LOOP(N); for loop over N events */
   event loop 

R6 = PRN;                        [RETURNS(DEC FLOAT(6))]
   uniform random generator (between 0 and 1)

R6 = PGAUSS(R6_mean,R6_sigma);   [RETURNS(DEC FLOAT(6))]
   Gaussian random generator
    Provides events according to the distribution
    f(x) = norm. * exp(-(x-R6_mean)**2/(2*R6_sigma**2))

R6 = PEXP(R6_tau);   [RETURNS(DEC FLOAT(6))]
   exponential random generator
    Provides events according to the distribution 
    f(x) = 1 / ABS(R6_tau) * exp(- x / R6_tau)
    in the range [0 <= x <= +infinity] for R6_tau > 0 and
    in the range [-infinity <= x <= 0] for R6_tau < 0.

R6 = PMAXWELL(R6_T);   [RETURNS(DEC FLOAT(6))]
   Maxwellian random generator
    Provides events according to the distribution
    f(x) = norm. * x * (exp - x/R6_T)
    in the range 0 <= x <= + infinity. R6_T must be > 0.
   Algorithm (exact): R6 = -R6_T * (LOG(PRN) + LOG(PRN)) 
R6 = PGAUSSTAIL(R6_mean,R6_sigma,R6_tau) [RETURNS(DEC FLOAT(6))]
   random generator of Gaussian (PGAUSS(R6_mean-R6Tau,R6_sigma))
    f1(x) = norm. * exp(-(x-R6_mean+R6_tau)**2/(2*R6_sigma**2))
   convoluted with an exponential (PEXP(R6_tau))
    f2(x) = 1 / ABS(R6_tau) * exp(- x / R6_tau).
   R6_mean is the mean value of the convoluted function.
   R6_sigma is the standard deviation of the Gaussian.
   R6_tau is the decay constant of the exponential.
    R6_tau > 0: The function has a tail to positive x values.
    R6_tau < 0: The function has a tail to negative x values. 

NEXT;
   end of event loop


Additional procedures:

R6 = $IPARVAL(CV_name);
   get value of the dynamic parameter CV (Normally not necessary in
    the analysis procedure, there ,the dynamic parameter is 
    directly accessible as a variable.)
   Declaration: DCL $IPARVAL ENTRY(CHAR(*) VAR) RETURNS(DEC FLOAT(6));

CALL $PRTCL(CV,I15);
   list character string 
         on protocol and screen     (I15 = 1)
         on screen only             (I15 = 11)
         on screen without linefeed (I15 = 12)
         on protocol only           (I15 = 0)
   Declaration: DCL $PRTCL ENTRY(CHAR(*) VAR, BIN FIXED(15));

CALL $PROMPT(CV,any);        
   prompt a variable  

CALL $PROMPTO(CV,any);
   propose and prompt a variable   
   any may be  DEC FLOAT(6),
               DEC FLOAT(15),
               BIN FIXED(15),
               BIN FIXED(31),
               (*) DEC FLOAT(6),
               (*) DEC FLOAT(15),
               (*) BIN FIXED(15),
               (*) BIN FIXED(31),
               BIT(1) ALIGNED.

CV256 = GEDIT(R15,Cformat)
   transform a DEC FLOAT(15) number into a character string with a 
   format defined by Cformat 
   ==> CV256 = GEDIT(R15,'F9,3'); gives 9 digits with 3 digits 
   behind the decimal point.
   Declaration: DCL GPEDIT ENTRY(DEC FLOAT(15), CHAR(*) VAR) 
                     RETURNS(CHAR(256) VAR);

CV256 = GPEDIT(R15,I15) 
   transform a DEC FLOAT(15) number into a character string with given 
   precision. The length of the characterstring is variable. 
   Declaration: DCL GPEDIT ENTRY(DEC FLOAT(15), BIN FIXED(15)) 
                     RETURNS(CHAR(256) VAR);

CV256 = GPEDFL(R15,I15)
   transform a DEC FLOAT(15) number into a character string with 
   minimum length I15.
   Declaration: DCL GPEDFL ENTRY(DEC FLOAT(15), BIN FIXED(15)) 
                     RETURNS(CHAR(256) VAR);

-----------------------------------------------
See "HELP GOOSYDATA" for macros needed for reading GOOSY (MBS) data.