spec

Software for Diffraction

1.3.6. - Macro Facility



One of spec's most powerful features is its provision for defining macros. Through macros, you can simplify use of the diffractometer as well as determine the style and format of the data output. Through the macro facility, you can customize the environment to include any enhancements or specialized requirements for your experiment. Standard macro sets included in the spec package support conventional two-circle, four-circle and z-axis diffractometers along with some specialized liquid surface diffractometers. These macros control the measurement and the recording of experimental data and establish a standard format for ASCII data files.


An example of a simple macro that can be used to record a comment on the printer is
1.FOURC> def com '
2.quot> on(PRINTER)
3.quot> printf("$*\n")
4.quot> off(PRINTER)
5.quot> '
6.FOURC>

Notice the prompt shows the program is expecting the quote to be closed. The variable PRINTER contains a string naming the printer device used to document the diffractometer operation. To use the above macro, type:
1.FOURC> com This is a comment.
This is a comment. 2.FOURC>

The text This is a comment is substituted in the printf() function for the symbol $* and is printed on both the screen and the printer.

Each argument following a macro call is available to the macro using $1, $2, ..., where $1 refers to the first argument, and so on. Up to 25 arguments may be used. An argument is a string of characters separated by white space (spaces and tabs) or enclosed in single or double quotes, $* represents all the arguments, and $# is the number of arguments.

When a macro definition contains argument substitution, and you invoke that macro with more arguments than needed, the extra arguments you typed up to the next ;, } or newline disappear. However, if the macro does not use argument substitution in its definition, text typed following the macro invocation is not thrown away.

To see what a macro contains, use the command prdef to print out the macro definition.
1.FOURC> prdef com
def com ' on(PRINTER) printf("$*\n") off(PRINTER) ' 2.FOURC>

Notice that the form of the definition, if written to a file, would be suitable for reading back in as a macro definition.


The standard macro library is read automatically the first time you run spec or when you start the program with the -f flag. You can get a listing of all the currently defined macros with the command lsdef.
1.FOURC> lsdef
ALPHA (4) bug (275) hklscan (1639) qdo (10) AZIMUTH (4) ca (182) hkradial (334) rplot (10) BETA (4) calcA (7) hlcircle (339) rplot_res (112) CEN (10) calcE (7) hlradial (333) save (432) Escan (1448) calcG (7) hscan (139) savegeo (1121) F_ALPHA (4) calcHKL (7) initdw (42) saveslits (99) F_AZIMUTH (5) calcL (8) initfx (39) saveusr (0) F_BETA (4) calcM (7) initnec (44) savmac (118) F_OMEGA (5) calcZ (7) initoki (39) scan_head (5) F_PHI (5) cat (14) inittemp (33) scan_loop (5) Fheader (0) cd (11) klcircle (339) scan_move (5) Flabel (2) ci (177) klradial (333) scan_on (192) Fout (2) cl (22) kscan (139) scan_plot (0) Ftail (0) com (12) l (16) scan_tail (5) H (4) comment (184) less (15) set (344) K (4) config (109) lm (539) set_E (314) L (4) count (6) lp_plot (674) set_dial (649) LAMBDA (4) ct (47) ls (13) set_lm (349) OMEGA (4) cuts (764) lscan (139) setaz (448) Pheader (0) cz (177) lup (419) setlat (764) Plabel (2) d (12) mail (16) setmode (927) Pout (2) d2scan (564) measuretemp (1) setmono (368) RtoT_0 (162) d3scan (688) mesh (1221) setplot (1119) RtoT_1 (162) debug (212) mk (175) setpowder (867) RtoT_2 (161) do (9) move_E (208) setscans (67) RtoT_3 (163) dscan (95) move_em (8) setsector (1341) TtoR_0 (160) dtscan (143) mv (175) setslit (464) TtoR_1 (160) dumbplot (334) mvd (192) setslits (469) TtoR_2 (159) end_reflex (131) mvr (191) settemp (217) TtoR_3 (161) freeze (456) mz (268) show_cnts (327) _check0 (240) g_aa (4) ned (14) showslits (114) _chk_lim (266) g_al (4) newfile (1165) showtemp (133) _cleanup2 (0) g_bb (4) newmac (270) splot (8) _cleanup3 (0) g_be (4) offd (13) splot_res (150) _count (158) g_cc (4) offp (12) startgeo (45) _do (479) g_chi0 (5) offsim (126) starttemp (225) _getcut (8) g_chi1 (5) offt (10) startup (245) _head (1363) g_frz (4) ond (12) te (105) _hkl_lim (84) g_ga (4) onp (11) teramp (458) _hklline (1254) g_h0 (5) onsim (127) th2th (141) _hklmesh (638) g_h1 (5) ont (9) tscan (732) _loop (413) g_haz (5) or0 (549) tw (742) _mo_loop (175) g_k0 (5) or1 (551) u (10) _mot (124) g_k1 (5) or_swap (320) uan (23) _move (37) g_kaz (5) p (8) ubr (31) _pcount (132) g_l0 (5) pa (1301) uct (364) _plot_scale (392) g_l1 (5) pl (176) umk (31) _pmove (131) g_laz (5) pl_CFWHM (10) umv (19) _scanabort (102) g_mo_d (5) pl_COM (10) umvr (20) _setcut (8) g_mo_s (5) pl_FWHM (10) unfreeze (39) _settemp (1) g_mode (4) pl_LHMX (10) upl (24) _tail (83) g_om0 (4) pl_MAX (10) uwm (694) _update1 (204) g_om1 (5) pl_MAXX (10) vi (13) _update2 (255) g_phi0 (5) pl_MIN (10) vt52_rplot (1190) _update4 (370) g_phi1 (5) pl_MINX (10) vt52plot (914) _var (171) g_sect (4) pl_SUM (10) w (12) a2scan (1172) get_E (74) pl_SUMSQ (11) wa (231) a3scan (1439) getvar (65) pl_UHMX (10) waitall (7) add_reflex (408) gpset (123) pl_xMAX (11) waitcount (7) an (173) gt101_rplot(1190) pl_xMIN (11) waitmove (7) ansi_rplot (1196) gt101plot (915) plot (40) wh (48) ansiplot (933) h (4) plot_res (435) whats (744) ascan (865) help (24) prcmd (42) wm (1232) beep (12) hi (7) pts (87) yesno (162) beg_reflex (283) hkcircle (339) pwd (11) br (175) hklmesh (1095) qcomment (176) 2.FOURC>

Each macro is listed as well as the number of characters in its definition. Some macros have zero length -- their definitions are assigned during the course of an experiment. In the standard library, macros that are only used within other macros (and not meant to be referenced directly by the user) begin with an underscore.

Another macro handling command allows you to remove a macro definition.
1.FOURC> undef com
2.FOURC> prdef com
com: undefined. 3.FOURC>



There are several special macro names. If a macro named cleanup is defined, it will be automatically invoked whenever there is an error or ^C interrupt. This macro can be defined to print a message, update a file, return motors to a starting position, etc. For example, in the standard macro library, something like the following is defined for the duration of a scan:
def cleanup '
      comment "Scan aborted after %g points." NPTS
      undef cleanup
'
Similarly, a macro named cleanup1 can be defined, which behaves the same way. However, if cleanup exists, it will be run first.

Also begin_mac, end_mac and prompt_mac have special meaning. (text forthcoming ...)