Documentation on ASCII gls (.ags) Level Scheme Files for RadWare


This documentation is for .ags file format version 1.0
D.C. Radford, August 1996
HTML version: April 1998

  1. Introduction.
  2. Format of the .ags files.
  3. Example of a short .ags file.
  4. Listing of the gls include file, GLS.CMN
  5. Listings of the subroutines to read and write the .ags files.

1. Introduction.

Since the original LEVELS file format (.lvl) is no longer heavily supported in RadWare, there is a need for a new type of ASCII file format so that level schemes can be copied between different computer systems without the need for file conversion, e-mailed to collaborators, etc. This need is now met by the .ags file format, standing for Ascii Graphical level Scheme. It is essentially a formatted version of the more usual (unformatted) .gls file. The .ags files can contain all the same information as .gls files, and can be read and written by all of the standard GLS programs (e.g. gls, escl8r_gls, xmlev, gls_conv, etc...). They can also be converted to/from .gls files using the gls_conv program.

The .ags files contain only standard ASCII text, and all lines are less than 80 characters long. The data fields within the files are strictly formatted, that is, unlike the .lvl files, the format of the fields is specified and use of any other format will generally make the file illegible by RadWare programs.

FORTRAN source code that could be used to write and read the .ags files is given in listings towards the end of this file. The equivalent C code can be found in the src/libs/gls directory, as subroutines read_write_gls and read_ascii_gls. The data fields written to the .ags and .gls files are declared in gls.h, or in GLS.CMN, which is also listed here.

2. Format of the .ags files.

An example of a short .ags file is given below.

The first five lines of a .ags file are reserved for a header comment; their contents are simply echoed to the output terminal of the reading program.

The sixth line specifies the format version to allow for future extensions, and must be set to:

ASCII GLS file format version 1.0
Lines 7 through 12 specify fields such as the atomic number, numbers of levels, bands, gammas and text labels, default character sizes etc. Lines 7, 9 and 11 are simply comments that identify the fields contained in each of the following lines. The data are read with the following format:
55    FORMAT(/I5,4I8,3F10.2//F15.6,5F11.2//2F12.2,6F9.2)
Lines 13 and 14 are comments to specify the data fields for each level. They are followed by one or two lines of data for each level in the scheme. These contain, for example, the energy, spin, parity, number of the band to which the level belongs, etc. Optional fields, to do with modified positions of spin-parity and level energy labels, and altered left/right ends of the level drawn with respect to the boundaries of the band, are given in the second line. This second line is to be present if and only if the first line ends in the characters ' &', placed immediately after the last data field, i.e. in characters 76 and 77. If this is not the case, default values are used for the optional data fields.

Three integer flags at the end of the first level data line deserve special mention. In the file, these are called LevelFlag, LabelFlag and EnLabFlag; in GLS.CMN they are declared as:

      INTEGER          LEVEL_FLAG(MAXLEV)
      INTEGER          L_LABEL_FLAG(MAXLEV), L_E_LABEL_FLAG(MAXLEV)
These flags define the appearance of the level and its spin-parity and energy labels, as follows:
   LEVEL_FLAG = 0 for normal level
                1 for broken (tentative) level
                2 for thick (e.g. isomeric) level
   L_LABEL_FLAG = 0 for spin label =  Jpi
                  1 for spin label = (J)pi
                  2 for spin label = J(pi)
                  3 for spin label = (Jpi)
                  4 for spin label =   J
                  5 for spin label =  (J)
                  6 for no spin label
   L_E_LABEL_FLAG = 0 for no energy label
                    1 for energy label as nearest integer  e.g.   123
                    2 for tentative nearest integer        e.g.  (123)
                    3 for one decimal place                e.g.  123.4
                    4 for tentative, one decimal place     e.g. (123.4)
The level data lines are read with the following format:
65    FORMAT(6X,F11.3,F8.3,A8,A6,I6,3I10,A2)   (first line)
66    FORMAT(2X,6F10.2)                        (optional second line)
Following the level data, there is a single comment line followed by a line of data for each band defined in the level scheme. The data for each band include the band name, position and width of the band in the drawing, and optional fields to do with level spin-parity/energy label positions. Each band data line is read with the following format:
75    FORMAT(5X,1X,A8,6F10.2)
Next come three comment lines, identifying the gamma-ray data fields. Each gamma then has one, two or three lines of data. The second and third lines are optional; as for the level data lines, the second line must be present if and only if the first line ends in ' &' (in characters 63 and 64), and the third line must be present if and only if the second line is present and ends in ' &' (in characters 72 and 73).

The first gamma data line contains the energy and relative intensity, multipolarity, and initial and final level index numbers. It is read with the format:

85    FORMAT(6X,F11.3,F8.3,3X,A,I2,2I6,F11.4,F8.4,A2)
The optional second gamma data line contains the Conversion coefficient, branching ratio and mixing ratio. If it is not present, default values are taken for the conversion coefficient (from Hager-Seltzer ICC tables) and the mixing ratio (zero). The branching ratio is ignored in RadWare programs, since it is generally taken directly from the intensities of the transitions. It is provided only for compatibility with other types of level scheme data files. The second line is read with the format:
86    FORMAT(2X,3(E13.5,E10.3),A2)
The optional third gamma data line contains position information for the gamma ray and its energy label, if they are not to be drawn at their default positions. It is read with the format:
87    FORMAT(2X,4F10.2,2I10)
Two integer flags at the end of the third gamma data line deserve special mention. In the file, these are called GammaFlag and LabelFlag; in GLS.CMN they are declared as:
      INTEGER          GAMMA_FLAG(MAXGAM), G_LABEL_FLAG(MAXGAM)
These flags define the appearance of the gamma and its energy label, as follows:
    GAMMA_FLAG = 0 for normal gamma
                 1 for broken (tentative) gamma
    G_LABEL_FLAG = 0 for label as nearest integer      e.g.   123
                   1 for tentative nearest integer     e.g.  (123)
                   2 for no label
                   3 for one decimal place             e.g.  123.4
                   4 for tentative, one decimal place  e.g. (123.4)
Last in the file are the data on any text labels used in the level scheme. After an initial two-line comment, there are two lines of data for each label, containing the text, number of characters, character sizes, and label position. They are read with the format:
95    FORMAT(5X,2X,A40,I8/2X,4F10.2)

3. Sample .ags file.

Here is an example of a short .ags file.
The atomic number is 67 (Ho). It contains 18 levels in 4 bands, 36 gammas and 2 text labels.

** ASCII Graphical Level Scheme file.
** First five lines are reserved for comments.
** This file created 22-AUG-96 11:50:48  
** Program GLS,  author D.C. Radford
**
 ASCII GLS file format version 1.0
**  Z Nlevels Ngammas  Nbands Nlabels CharSizeX CharSizeY ArrowWidFact
   67      18      36       4       2     40.00     45.00      3.00
**  MaxArrowTan MaxArrowDX DefBandWid DefBandSep ArrowWidth ArrowLength
       0.267900     999.00     350.00     100.00      30.00      60.00
** ArrowBreak LevelBreak   LevCSX   LevCSY LevEnCSX LevEnCSY   GamCSX   GamCSY
       30.00       40.00    40.00    45.00    40.00    45.00    40.00    45.00
** Level   Energy +/- err     Jpi     K Band# LevelFlag LabelFlag EnLabFlag
++   LabelDX   LabelDY EnLabelDX EnLabelDY  LevelDX1  LevelDX2
     1      0.000   0.000    7/2-     0     1         0         0         0 &
++      0.00      0.00      0.00      0.00      0.00      0.00
     2    210.033   0.040   11/2-     0     1         0         0         0 &
++      0.00      0.00      0.00      0.00      0.00      0.00
     3    345.281   0.047   13/2-     0     2         0         0         0 &
++      0.00      0.00      0.00      0.00      0.00      0.00
     4    499.616   0.049   15/2-     0     1         0         0         0 &
++      0.00      0.00      0.00      0.00      0.00      0.00
     5    673.233   0.052   17/2-     0     2         0         0         0 &
++      0.00      0.00      0.00      0.00      0.00      0.00
     6    863.705   0.055   19/2-     0     1         0         0         0 &
++      0.00      0.00      0.00      0.00      0.00      0.00
     7     94.820   0.044    9/2-     0     2         0         0         0 &
++      0.00      0.00      0.00      0.00      0.00      0.00
     8   1072.905   0.058   21/2-     0     2         0         0         0 &
++      0.00      0.00      0.00      0.00      0.00      0.00
     9   1295.300   0.060   23/2-     0     1         0         0         0 &
++      0.00      0.00      0.00      0.00      0.00      0.00
    10   1786.367   0.067   27/2-     0     1         0         0         0 &
++      0.00      0.00      0.00      0.00      0.00      0.00
    11   1536.811   0.063   25/2-     0     2         0         0         0 &
++      0.00      0.00      0.00      0.00      0.00      0.00
    12   1136.881   0.337   17/2-     0     3         0         0         0 &
++      0.00      0.00      0.00      0.00      0.00      0.00
    13   1321.684   0.337   19/2-     0     4         0         0         0 &
++      0.00      0.00      0.00      0.00      0.00      0.00
    14   1523.316   0.337   21/2-     0     3         0         0         0 &
++      0.00      0.00      0.00      0.00      0.00      0.00
    15   1740.689   0.338   23/2-     0     4         0         0         0 &
++      0.00      0.00      0.00      0.00      0.00      0.00
    16    969.378   0.337   15/2-     0     4         0         0         0 &
++      0.00      0.00      0.00      0.00      0.00      0.00
    17    819.377   0.584   13/2-     0     3         0         0         0 &
++      0.00      0.00      0.00      0.00      0.00      0.00
    18    688.717   0.640   11/2-     0     4         0         0         0 &
++      0.00      0.00      0.00      0.00      0.00      0.00
** Band   Name        X0        NX   LabelDX   LabelDY EnLabelDX EnLabelDY
    1   ho165a  27916.40    450.00     72.92      0.00      0.00      0.00
    2   ho165b  28435.57    450.00    -71.66      0.00      0.00      0.00
    3   Ho165c  29432.87    350.00     39.95      0.00      0.00      0.00
    4   Ho165b  29832.90    350.00    -35.50      0.00      0.00      0.00
** Gamma   Energy +/- err  Mult  ILev  FLev  Intensity +/- err
++     ConvCoef +/- error      BrRatio +/- error     MixRatio +/- error
++   GammaX1  GammaX2  LabelDX  LabelDY GammaFlag LabelFlag
     1    209.996   0.034   E 2     2     1     4.0450  0.1492 &
++  0.20876E+00 0.000E+00  0.00000E+00 0.000E+00  0.00000E+00 0.000E+00 &
++      0.00  56282.80      0.00      0.00         0         0
     2    135.130   0.030   M 1     3     2    26.8236  0.8285 &
++  0.11301E+01 0.000E+00  0.00000E+00 0.000E+00  0.00000E+00 0.000E+00 &
++      0.00  56834.91      0.00      0.00         0         0
     3    154.294   0.030   M 1     4     3    28.6106  0.8686 &
++  0.77778E+00 0.000E+00  0.00000E+00 0.000E+00  0.00000E+00 0.000E+00 &
++      0.00  56774.15      0.00      0.00         0         0
     4    173.556   0.030   M 1     5     4    26.2193  0.7928 &
++  0.55987E+00 0.000E+00  0.00000E+00 0.000E+00  0.00000E+00 0.000E+00 &
++      0.00  56824.63      0.00      0.00         0         0
     5    190.425   0.030   M 1     6     5    22.3524  0.6751 &
++  0.43284E+00 0.000E+00  0.00000E+00 0.000E+00  0.00000E+00 0.000E+00 &
++      0.00  56783.83      0.00      0.00         0         0
     6    115.046   0.030   M 1     2     7    20.3988  0.7097 &
++  0.17879E+01 0.000E+00  0.00000E+00 0.000E+00  0.00000E+00 0.000E+00 &
++      0.00  56763.67      0.00      0.00         0         0
     7     94.634   0.030   M 1     7     1    20.0000  0.0100 &
++  0.31197E+01 0.000E+00  0.00000E+00 0.000E+00  0.00000E+00 0.000E+00 &
++      0.00  56845.74      0.00      0.00         0         0
     8    209.158   0.030   M 1     8     6    16.7276  0.5067 &
++  0.33412E+00 0.000E+00  0.00000E+00 0.000E+00  0.00000E+00 0.000E+00 &
++      0.00  56815.10      0.00      0.00         0         0
     9    222.365   0.030   M 1     9     8    12.7343  0.3858 &
++  0.28224E+00 0.000E+00  0.00000E+00 0.000E+00  0.00000E+00 0.000E+00 &
++      0.00  56792.38      0.00      0.00         0         0
    10    289.654   0.031   E 2     4     2    12.4140  0.3852 &
++  0.74864E-01 0.000E+00  0.00000E+00 0.000E+00  0.00000E+00 0.000E+00 &
++      0.00  56282.80      0.00      0.00         0         0
    11    364.139   0.030   E 2     6     4    16.1308  0.4902 &
++  0.37817E-01 0.000E+00  0.00000E+00 0.000E+00  0.00000E+00 0.000E+00 &
++      0.00  56282.80      0.00      0.00         0         0
    12    328.034   0.030   E 2     5     3    15.1664  0.4625 &
++  0.51333E-01 0.000E+00  0.00000E+00 0.000E+00  0.00000E+00 0.000E+00 &
++      0.00  57321.14      0.00      0.00         0         0
    13    250.452   0.031   E 2     3     7     9.3656  0.2972 &
++  0.11773E+00 0.000E+00  0.00000E+00 0.000E+00  0.00000E+00 0.000E+00 &
++      0.00  57321.14      0.00      0.00         0         0
    14    431.692   0.030   E 2     9     6    13.1524  0.3998 &
++  0.23493E-01 0.000E+00  0.00000E+00 0.000E+00  0.00000E+00 0.000E+00 &
++      0.00  56282.80      0.00      0.00         0         0
    15    399.775   0.030   E 2     8     5    14.8525  0.4512 &
++  0.29033E-01 0.000E+00  0.00000E+00 0.000E+00  0.00000E+00 0.000E+00 &
++      0.00  57321.14      0.00      0.00         0         0
    16    491.108   0.031   E 2    10     9     7.0650  0.2173 &
++  0.16640E-01 0.000E+00  0.00000E+00 0.000E+00  0.00000E+00 0.000E+00 &
++      0.00  56282.80      0.00      0.00         0         0
    17    463.970   0.031   E 2    11     8     9.8935  0.3020 &
++  0.19339E-01 0.000E+00  0.00000E+00 0.000E+00  0.00000E+00 0.000E+00 &
++      0.00  57321.14      0.00      0.00         0         0
    18    241.540   0.031   M 1    11     9     8.8071  0.2683 &
++  0.22506E+00 0.000E+00  0.00000E+00 0.000E+00  0.00000E+00 0.000E+00 &
++      0.00  56806.44      0.00      0.00         0         0
    19    249.386   0.032   M 1    10    11     5.1498  0.1600 &
++  0.20577E+00 0.000E+00  0.00000E+00 0.000E+00  0.00000E+00 0.000E+00 &
++      0.00  56799.66      0.00      0.00         0         0
    20    184.930   0.033   M 1    13    12     2.0907  0.0822 &
++  0.46903E+00 0.000E+00  0.00000E+00 0.000E+00  0.00000E+00 0.000E+00 &
++      0.00  59616.29      0.00      0.00         0         0
    21    201.531   0.034   M 1    14    13     1.9312  0.0746 &
++  0.36893E+00 0.000E+00  0.00000E+00 0.000E+00  0.00000E+00 0.000E+00 &
++      0.00  59615.77      0.00      0.00         0         0
    22    217.310   0.034   M 1    15    14     1.9424  0.0742 &
++  0.30012E+00 0.000E+00  0.00000E+00 0.000E+00  0.00000E+00 0.000E+00 &
++      0.00  59615.77      0.00      0.00         0         0
    23    386.379   0.039   E 2    14    12     1.5752  0.0724 &
++  0.31951E-01 0.000E+00  0.00000E+00 0.000E+00  0.00000E+00 0.000E+00 &
++      0.00  59215.74      0.00      0.00         0         0
    24    418.702   0.043   E 2    15    13     1.3541  0.0655 &
++  0.25469E-01 0.000E+00  0.00000E+00 0.000E+00  0.00000E+00 0.000E+00 &
++      0.00  60015.80      0.00      0.00         0         0
    25    352.525   0.043   E 2    13    16     1.2000  0.0552 &
++  0.41334E-01 0.000E+00  0.00000E+00 0.000E+00  0.00000E+00 0.000E+00 &
++      0.00  60015.80      0.00      0.00         0         0
    26    167.518   0.033   M 1    12    16     1.6000  0.0637 &
++  0.61698E+00 0.000E+00  0.00000E+00 0.000E+00  0.00000E+00 0.000E+00 &
++      0.00  59610.61      0.00      0.00         0         0
    27    317.059   0.049   E 2    12    17     0.6000  0.0303 &
++  0.56107E-01 0.000E+00  0.00000E+00 0.000E+00  0.00000E+00 0.000E+00 &
++      0.00  59215.74      0.00      0.00         0         0
    28    149.391   0.036   M 1    16    17     0.8000  0.0373 &
++  0.85138E+00 0.000E+00  0.00000E+00 0.000E+00  0.00000E+00 0.000E+00 &
++      0.00  59625.62      0.00      0.00         0         0
    29    280.294   0.123   E 2    16    18     0.1500  0.0172 &
++  0.82240E-01 0.000E+00  0.00000E+00 0.000E+00  0.00000E+00 0.000E+00 &
++      0.00  60015.80      0.00      0.00         0         0
    30    130.601   0.055   M 1    17    18     0.2100  0.0186 &
++  0.12653E+01 0.000E+00  0.00000E+00 0.000E+00  0.00000E+00 0.000E+00 &
++      0.00  59600.74      0.00      0.00         0         0
    31    759.235   0.049   E 2    16     2     1.0000  0.0590 &
++  0.58373E-02 0.000E+00  0.00000E+00 0.000E+00  0.00000E+00 0.000E+00 &
++  29335.57  29132.20      0.00      0.00         0         0
    32    724.915   0.046   E 2    17     7     1.0000  0.0786 &
++  0.64794E-02 0.000E+00  0.00000E+00 0.000E+00  0.00000E+00 0.000E+00 &
++  29610.32  29416.31      0.00      0.00         0         0
    33    791.657   0.053   E 2    12     3     0.8766  0.0522 &
++  0.53150E-02 0.000E+00  0.00000E+00 0.000E+00  0.00000E+00 0.000E+00 &
++  29241.61  29029.38      0.00      0.00         0         0
    34    689.002   0.066   E 2    18     1     0.3500161.3821 &
++  0.72799E-02 0.000E+00  0.00000E+00 0.000E+00  0.00000E+00 0.000E+00 &
++  30004.93  29820.61      0.00      0.00         0         0
    35    609.773   0.061   M 1    17     2     0.5500  0.0480 &
++  0.20021E-01 0.000E+00  0.00000E+00 0.000E+00  0.00000E+00 0.000E+00 &
++      0.00  58702.50      0.00      0.00         0         0
    36    594.500   1.000   M 1    18     7     0.1100  0.3084 &
++  0.21392E-01 0.000E+00  0.00000E+00 0.000E+00  0.00000E+00 0.000E+00 &
++      0.00  59506.70      0.00      0.00         0         0
** Label                                   text  NChars
++     SizeX     SizeY PositionX PositionY
    1  K=11/2 {gg}-vib                               15 &
++     60.00     65.00  29776.43   1956.54
    2  7/2{u-}[523]                                  12 &
++     60.00     65.00  28377.07   2021.91

End of .ags file example.

4. Listing of file GLS.CMN

Here is the gls include file, GLS.CMN, where the fields to be written to the .gls or .ags files are declared.

      INCLUDE      'LEVELS.PAR'
C      LEVELS.PAR defines the max. allowable number of levels, gammas
C      for example:
C      PARAMETER    (MAXLEV=600,MAXGAM=800,MAXEMIT=21)

C level definition-----------------
C levname=name of level
C levid=id number related to level spin
C levdata= 1)energy
C          2)energy error
C          3)spin
C          4)parity
C          5)K
      CHARACTER*8   LEVNAME(MAXLEV)
      INTEGER       LEVID(MAXLEV)
      REAL          LEVDATA(MAXLEV,5)

C gamma definition------------------------
C gamid= 1)index pointer to initial level
C        2)index pointer to final level
C gamdata= 1)energy
C          2)energy error
C          3)intensity
C          4)intensity error
C          5)BR (branching ratio)
C          6)A (conversion coeffient)
C          7)D (mixing ratio)
C          8)delta A
C          9)delta D
C         10)delta BR
      INTEGER       GAMID(MAXGAM,2)
      CHARACTER     GAML(MAXGAM)
      REAL          GAMDATA(MAXGAM,10),GAMN(MAXGAM)

      INTEGER       LEVEL,GAMMA

      COMMON /L/ LEVNAME,LEVID,LEVDATA,LEVEL,
     +           GAMID,GAML,GAMDATA,GAMN,GAMMA


      PARAMETER     (MAXBAND=200)
      INTEGER       ATOMIC_NO, NBANDS, BAND(MAXLEV)
      REAL          GAMMA_X1(MAXGAM), GAMMA_X2(MAXGAM)
      REAL          BAND_X0(MAXBAND), BAND_NX(MAXBAND)
      CHARACTER*8   BAND_NAME(MAXBAND)
      COMMON /GLS/  ATOMIC_NO, GAMMA_X1, GAMMA_X2,
     +              NBANDS, BAND_NAME, BAND_X0, BAND_NX, BAND

      INTEGER       LEVEMIT(MAXLEV,MAXEMIT)
      COMMON /LEVEMIT/ LEVEMIT

C           all figure distance units are in keV....
C           gamma arrow widths = intensity*aspect_ratio (keV)...

      REAL             X0, HIX, Y0, HIY, TX0, THIX, TY0, THIY
      REAL             CSX, CSY, ASPECT_RATIO, MAX_TANGENT, MAX_DIST
      REAL             DEFAULT_WIDTH, DEFAULT_SEP
      REAL             ARROW_WIDTH, ARROW_LENGTH
      REAL             GAMMA_X(10,MAXGAM), GAMMA_Y(10,MAXGAM)
      INTEGER          GAMMA_NP(MAXGAM)
      CHARACTER*10     G_LABEL(MAXGAM)
      REAL             G_LABEL_X(MAXGAM), G_LABEL_Y(MAXGAM)
      INTEGER          G_LABEL_NC(MAXGAM)
      REAL             LEVEL_X(4,MAXLEV), LEVEL_Y(MAXLEV)
      REAL             L_LABEL_X(MAXLEV), L_LABEL_Y(MAXLEV)
      CHARACTER*12     L_LABEL(MAXLEV)
      INTEGER          L_LABEL_NC(MAXLEV)
      LOGICAL          B_LABEL_L(MAXBAND)
      REAL             B_LABEL_DX(MAXBAND)
      REAL             G_LABEL_DX(MAXGAM), G_LABEL_DY(MAXGAM)
      REAL             L_LABEL_DX(MAXLEV)
      COMMON /GLS_FIG/ X0, HIX, Y0, HIY, TX0, THIX, TY0, THIY,
     +                 CSX, CSY, ASPECT_RATIO, MAX_TANGENT, MAX_DIST,
     +                 DEFAULT_WIDTH, DEFAULT_SEP,
     +                 ARROW_WIDTH, ARROW_LENGTH,
     +                 GAMMA_X, GAMMA_Y, GAMMA_NP,
     +                 G_LABEL, G_LABEL_X, G_LABEL_Y, G_LABEL_NC,
     +                 LEVEL_X, LEVEL_Y,
     +                 L_LABEL, L_LABEL_X, L_LABEL_Y, L_LABEL_NC,
     +                 B_LABEL_L, B_LABEL_DX, G_LABEL_DX, G_LABEL_DY,
     +                 L_LABEL_DX

C                    break distance in kev for tentative gammas, levels....
      REAL             ARROW_BREAK, LEVEL_BREAK
C                    character sizes for j(pi), level energy, gamma energy....
      REAL             L_CSX, L_CSY, L_E_CSX, L_E_CSY, G_CSX, G_CSY
C                    flags for tentative gammas, gamma energies....
      INTEGER          GAMMA_FLAG(MAXGAM), G_LABEL_FLAG(MAXGAM)
C                    flags for tentative levels....
      INTEGER          LEVEL_FLAG(MAXLEV)
C                    flags for tentative j(pi)'s, level energies....
      INTEGER          L_LABEL_FLAG(MAXLEV), L_E_LABEL_FLAG(MAXLEV)
      CHARACTER*10     L_E_LABEL(MAXLEV)
      INTEGER          L_E_LABEL_NC(MAXLEV)
C                    horizontal offsets for stretching/shrinking levels....
      REAL             LEVEL_DX(2,MAXLEV)
C                    vertical offset for j(pi)....
      REAL             L_LABEL_DY(MAXLEV)
C                    horiz., vert. offsets, positions for level energies....
      REAL             L_E_LABEL_DX(MAXLEV), L_E_LABEL_DY(MAXLEV)
      REAL             L_E_LABEL_X(MAXLEV), L_E_LABEL_Y(MAXLEV)
C                    vertical offset for j(pi)
      REAL             B_LABEL_DY(MAXBAND)
C                    horizontal, vertical offsets for level energies....
      REAL             B_E_LABEL_DX(MAXBAND), B_E_LABEL_DY(MAXBAND)
C                    general purpose text labels....
      INTEGER          NTLABEL, TLABEL_NC(100)
      CHARACTER*40     TLABEL(100)
      REAL             TCSX(100), TCSY(100)
      REAL             TLABEL_X(100), TLABEL_Y(100)

      COMMON /GLS2/    ARROW_BREAK, LEVEL_BREAK, L_CSX, L_CSY, L_E_CSX,
     +                 L_E_CSY, G_CSX, G_CSY, GAMMA_FLAG, G_LABEL_FLAG,
     +                 LEVEL_FLAG, L_LABEL_FLAG, L_E_LABEL_FLAG,
     +                 L_E_LABEL, L_E_LABEL_NC, LEVEL_DX, L_LABEL_DY,
     +                 L_E_LABEL_DX, L_E_LABEL_DY, L_E_LABEL_X,
     +                 L_E_LABEL_Y, B_LABEL_DY, B_E_LABEL_DX, 
     +                 B_E_LABEL_DY, NTLABEL, TLABEL_NC, TLABEL, 
     +                 TCSX, TCSY, TLABEL_X, TLABEL_Y

      COMMON /LUS/    IR,IW,IP,IG

********* End of GLS.CMN

5. Subroutines to read and write .ags files.

Here are listings of two subroutines from the gls programs, to read and write the ASCII gls (.ags) files.
The two subroutines listed here are READ_WRITE_GLS and READ_ASCII_GLS.
      SUBROUTINE READ_WRITE_GLS(COMMAND)

      INCLUDE         'GLS.CMN'
      CHARACTER*(*)   COMMAND
      CHARACTER*40    FILNAM
      CHARACTER*20    DATTIM
      CHARACTER*8     JPI
      CHARACTER*6     KAY


C       ask for and open level scheme file....

20    IF (COMMAND.EQ.'WRITE' .OR.
     +    COMMAND.EQ.'WRITE_AGS') THEN

         WRITE(IW,*)' Name for new GLS level scheme file = ?'

         IF (COMMAND.EQ.'WRITE_AGS') THEN
            CALL CASK('     (default .EXT = .gls, rtn to quit)',
     +                 FILNAM,NC)
            IF (NC.EQ.0) RETURN
            CALL SETEXT(FILNAM,'.gls',JEXT)
         ELSE
            CALL CASK('     (default .EXT = .gls, rtn to quit)',
     +                 FILNAM,NC)
            IF (NC.EQ.0) RETURN
            CALL SETEXT(FILNAM,'.gls',JEXT)
         ENDIF

         IF (COMMAND.EQ.'WRITE_AGS' .OR.
     +       FILNAM(JEXT:JEXT+3).EQ.'.AGS' .OR.
     +       FILNAM(JEXT:JEXT+3).EQ.'.ags') THEN

C   write out ascii version of gls file (.ags file).....
            CALL OPEN_PR_FILE(25,FILNAM)
            CALL DATETIME(DATTIM)
            WRITE (25,50) DATTIM
            WRITE (25,55) ATOMIC_NO, LEVEL, GAMMA, NBANDS, NTLABEL,
     +               CSX, CSY, ASPECT_RATIO, MAX_TANGENT, MAX_DIST,
     +               DEFAULT_WIDTH, DEFAULT_SEP, ARROW_WIDTH,
     +               ARROW_LENGTH, ARROW_BREAK, LEVEL_BREAK,
     +               L_CSX, L_CSY, L_E_CSX, L_E_CSY, G_CSX, G_CSY
            WRITE (25,60)
            DO J = 1, LEVEL
               J2 = NINT(2.0*LEVDATA(J,3))
               J1 = J2/2
               IF (J2.EQ.2*J1) THEN
                  WRITE(JPI,'(I7)') J1
               ELSE
                  WRITE(JPI,'(I5)') J2
                  JPI(6:7) = '/2'
               ENDIF
               IF (LEVDATA(J,4).LT.0.0) THEN
                  JPI(8:8) = '-'
               ELSE
                  JPI(8:8) = '+'
               ENDIF
               J2 = NINT(2.0*LEVDATA(J,5))
               J1 = J2/2
               IF (J2.EQ.2*J1) THEN
                  WRITE(KAY,'(I6)') J1
               ELSE
                  WRITE(KAY,'(I4)') J2
                  KAY(5:6) = '/2'
               ENDIF
               WRITE (25,65) J, (LEVDATA(J,K),K=1,2), JPI, KAY, BAND(J),
     +               LEVEL_FLAG(J), L_LABEL_FLAG(J), L_E_LABEL_FLAG(J),
     +               L_LABEL_DX(J), L_LABEL_DY(J),
     +               L_E_LABEL_DX(J), L_E_LABEL_DY(J),
     +               LEVEL_DX(1,J), LEVEL_DX(2,J)
            ENDDO
            WRITE (25,70)
            DO J = 1, NBANDS
               WRITE (25,75) J, BAND_NAME(J), BAND_X0(J), BAND_NX(J),
     +               B_LABEL_DX(J), B_LABEL_DY(J),
     +               B_E_LABEL_DX(J), B_E_LABEL_DY(J)
            ENDDO
            WRITE (25,80)
            DO J = 1, GAMMA
               WRITE (25,85) J, GAMDATA(J,1), GAMDATA(J,2), GAML(J),
     +               NINT(GAMN(J)), (GAMID(J,K),K=1,2), 
     +               GAMDATA(J,3), GAMDATA(J,4),
     +               GAMDATA(J,6), GAMDATA(J,8), GAMDATA(J,5), 
     +               GAMDATA(J,10), GAMDATA(J,7), GAMDATA(J,9), 
     +               GAMMA_X1(J), GAMMA_X2(J),
     +               G_LABEL_DX(J), G_LABEL_DY(J),
     +               GAMMA_FLAG(J), G_LABEL_FLAG(J)
            ENDDO
            WRITE (25,90)
            DO J = 1, NTLABEL
               WRITE (25,95) J, TLABEL(J), TLABEL_NC(J),
     +               TCSX(J), TCSY(J), TLABEL_X(J), TLABEL_Y(J)
            ENDDO

50    FORMAT('** ASCII Graphical Level Scheme file.'/
     +       '** First five lines are reserved for comments.'/
     +       '** This file created ',A/
     +       '** Program GLS,  author D.C. Radford'/
     +       '**'/
     +       ' ASCII GLS file format version 1.0')
55    FORMAT(
     + '**  Z Nlevels Ngammas  Nbands Nlabels CharSizeX CharSizeY',
     + ' ArrowWidFact'/
     + I5,4I8,3F10.2/
     + '**  MaxArrowTan MaxArrowDX DefBandWid DefBandSep ArrowWidth',
     + ' ArrowLength'/
     + F15.6,5F11.2/
     + '** ArrowBreak LevelBreak   LevCSX   LevCSY LevEnCSX LevEnCSY',
     + '   GamCSX   GamCSY'/
     +  2F12.2, 6F9.2)
60    FORMAT('** Level   Energy +/- err     Jpi     K Band#',
     + ' LevelFlag LabelFlag EnLabFlag'/
     + '++   LabelDX   LabelDY EnLabelDX EnLabelDY  LevelDX1  LevelDX2')
65    FORMAT(I6,F11.3,F8.3,A8,A6,I6,3I10,' &'/'++',6F10.2)
70    FORMAT('** Band   Name        X0        NX',
     +       '   LabelDX   LabelDY EnLabelDX EnLabelDY')
75    FORMAT(I5,1X,A8,6F10.2)
80    FORMAT(
     + '** Gamma   Energy +/- err  Mult  ILev  FLev  Intensity +/- err'/
     + '++     ConvCoef +/- error      BrRatio +/- error',
     + '     MixRatio +/- error'/
     + '++   GammaX1  GammaX2  LabelDX  LabelDY GammaFlag LabelFlag')
85    FORMAT(I6,F11.3,F8.3,3X,A,I2,2I6,F11.4,F8.4,' &'/
     +       '++',3(E13.5,E10.3),' &'/
     +       '++',4F10.2,2I10)
90    FORMAT(
     + '** Label                                   text  NChars'/
     + '++     SizeX     SizeY PositionX PositionY')
95    FORMAT(I5,2X,A40,I8,' &'/'++',4F10.2)

         ELSE

C   write out standard unformatted version of gls file.....
            CALL OPEN_NEW_UNF(25,FILNAM,0,0)
            WRITE (25) ATOMIC_NO, LEVEL, GAMMA, NBANDS,
     +            CSX, CSY, ASPECT_RATIO, MAX_TANGENT, MAX_DIST,
     +            DEFAULT_WIDTH, DEFAULT_SEP,
     +            ARROW_WIDTH, ARROW_LENGTH
            WRITE (25) ((LEVDATA(J,K),K=1,5), BAND(J), J=1,LEVEL), 
     +            ((GAMID(J,K),K=1,2), GAML(J),
     +            (GAMDATA(J,K),K=1,10), GAMN(J),
     +            GAMMA_X1(J), GAMMA_X2(J), J=1,GAMMA),
     +            (BAND_NAME(J), BAND_X0(J), BAND_NX(J), J=1,NBANDS)
            WRITE (25) (B_LABEL_DX(J), J=1,NBANDS),
     +            (G_LABEL_DX(J), G_LABEL_DY(J), J=1,GAMMA),
     +            (L_LABEL_DX(J), J=1,LEVEL)
   
            WRITE (25) ARROW_BREAK, LEVEL_BREAK, L_CSX, L_CSY,
     +            L_E_CSX, L_E_CSY, G_CSX, G_CSY, NTLABEL
            WRITE (25) (GAMMA_FLAG(J), G_LABEL_FLAG(J), J=1,GAMMA),
     +            (LEVEL_FLAG(J), L_LABEL_FLAG(J), L_E_LABEL_FLAG(J),
     +            LEVEL_DX(1,J), LEVEL_DX(2,J), L_LABEL_DY(J),
     +            L_E_LABEL_DX(J), L_E_LABEL_DY(J), J=1,LEVEL),
     +            (B_LABEL_DY(J), B_E_LABEL_DX(J), B_E_LABEL_DY(J),
     +            J=1,NBANDS)
            WRITE (25) (TLABEL(J), TLABEL_NC(J), TCSX(J), TCSY(J),
     +            TLABEL_X(J), TLABEL_Y(J), J=1,NTLABEL)

         ENDIF
      ELSEIF (COMMAND.EQ.'OPEN_READ') THEN

         WRITE(IW,*)' Name of GLS level scheme file = ?'
         CALL CASK( ' (default .EXT = .gls, rtn to quit)'
     +              ,FILNAM,NC)
         IF (NC.EQ.0) RETURN

         CALL SETEXT(FILNAM,'.gls',JEXT)
         IF (FILNAM(JEXT:JEXT+3).EQ.'.AGS' .OR.
     +       FILNAM(JEXT:JEXT+3).EQ.'.ags') THEN
            OPEN (25,FILE=FILNAM,STATUS='OLD',ERR=900)
            CALL READ_ASCII_GLS
            RETURN
         ENDIF

         OPEN (25,FILE=FILNAM,FORM='UNFORMATTED',STATUS='OLD',ERR=900)
         READ (25)  ATOMIC_NO, LEVEL, GAMMA, NBANDS,
     +              CSX, CSY, ASPECT_RATIO, MAX_TANGENT, MAX_DIST,
     +              DEFAULT_WIDTH, DEFAULT_SEP,
     +              ARROW_WIDTH, ARROW_LENGTH
         READ (25)  ((LEVDATA(J,K),K=1,5), BAND(J), J=1,LEVEL), 
     +              ((GAMID(J,K),K=1,2), GAML(J),
     +               (GAMDATA(J,K),K=1,10), GAMN(J),
     +               GAMMA_X1(J), GAMMA_X2(J), J=1,GAMMA),
     +              (BAND_NAME(J), BAND_X0(J), BAND_NX(J), J=1,NBANDS)
         READ (25)  (B_LABEL_DX(J), J=1,NBANDS),
     +              (G_LABEL_DX(J), G_LABEL_DY(J), J=1,GAMMA),
     +              (L_LABEL_DX(J), J=1,LEVEL)

         READ (25, END=100) ARROW_BREAK, LEVEL_BREAK, L_CSX, L_CSY,
     +              L_E_CSX, L_E_CSY, G_CSX, G_CSY, NTLABEL
         READ (25)  (GAMMA_FLAG(J), G_LABEL_FLAG(J), J=1,GAMMA),
     +              (LEVEL_FLAG(J), L_LABEL_FLAG(J), L_E_LABEL_FLAG(J),
     +               LEVEL_DX(1,J), LEVEL_DX(2,J), L_LABEL_DY(J),
     +               L_E_LABEL_DX(J), L_E_LABEL_DY(J), J=1,LEVEL),
     +              (B_LABEL_DY(J), B_E_LABEL_DX(J), B_E_LABEL_DY(J),
     +               J=1,NBANDS)
         READ (25)  (TLABEL(J), TLABEL_NC(J), TCSX(J), TCSY(J),
     +               TLABEL_X(J), TLABEL_Y(J), J=1,NTLABEL)

      ELSEIF (COMMAND.EQ.'READ') THEN

         READ (25)  ATOMIC_NO, LEVEL, GAMMA, NBANDS,
     +              CSX, CSY, ASPECT_RATIO, MAX_TANGENT, MAX_DIST,
     +              DEFAULT_WIDTH, DEFAULT_SEP,
     +              ARROW_WIDTH, ARROW_LENGTH
         READ (25)  ((LEVDATA(J,K),K=1,5), BAND(J), J=1,LEVEL), 
     +              ((GAMID(J,K),K=1,2), GAML(J),
     +               (GAMDATA(J,K),K=1,10), GAMN(J),
     +               GAMMA_X1(J), GAMMA_X2(J), J=1,GAMMA),
     +              (BAND_NAME(J), BAND_X0(J), BAND_NX(J), J=1,NBANDS)
         READ (25)  (B_LABEL_DX(J), J=1,NBANDS),
     +              (G_LABEL_DX(J), G_LABEL_DY(J), J=1,GAMMA),
     +              (L_LABEL_DX(J), J=1,LEVEL)

         READ (25, END=100) ARROW_BREAK, LEVEL_BREAK, L_CSX, L_CSY,
     +              L_E_CSX, L_E_CSY, G_CSX, G_CSY, NTLABEL
         READ (25)  (GAMMA_FLAG(J), G_LABEL_FLAG(J), J=1,GAMMA),
     +              (LEVEL_FLAG(J), L_LABEL_FLAG(J), L_E_LABEL_FLAG(J),
     +               LEVEL_DX(1,J), LEVEL_DX(2,J), L_LABEL_DY(J),
     +               L_E_LABEL_DX(J), L_E_LABEL_DY(J), J=1,LEVEL),
     +              (B_LABEL_DY(J), B_E_LABEL_DX(J), B_E_LABEL_DY(J),
     +               J=1,NBANDS)
         READ (25)  (TLABEL(J), TLABEL_NC(J), TCSX(J), TCSY(J),
     +               TLABEL_X(J), TLABEL_Y(J), J=1,NTLABEL)

      ENDIF

      CLOSE(25)
      RETURN

100   ARROW_BREAK = ARROW_WIDTH*0.75
      LEVEL_BREAK = ARROW_WIDTH
      L_CSX = CSX
      L_CSY = CSY
      L_E_CSX = CSX
      L_E_CSY = CSY
      G_CSX = CSX
      G_CSY = CSY
      NTLABEL = 0
      DO J = 1, GAMMA
         GAMMA_FLAG(J) = 0
         G_LABEL_FLAG(J) = 0
      ENDDO
      DO J = 1, LEVEL
         LEVEL_FLAG(J) = 0
         L_LABEL_FLAG(J) = 0
         L_E_LABEL_FLAG(J) = 0
         LEVEL_DX(1,J) = 0.0
         LEVEL_DX(2,J) = 0.0
         L_LABEL_DY(J) = 0.0
         L_E_LABEL_DX(J) = 0.0
         L_E_LABEL_DY(J) = 0.0
      ENDDO
      DO J = 1, NBANDS
         B_LABEL_DY(J) = 0.0
         B_E_LABEL_DX(J) = 0.0
         B_E_LABEL_DY(J) = 0.0
      ENDDO

      CLOSE(25)
      RETURN

C         error messages....
900   WRITE(IW,*) 'File ',FILNAM,' does not exist.'
      GO TO 20

      END

C=======================================================================

      SUBROUTINE READ_ASCII_GLS

      INCLUDE         'GLS.CMN'
      CHARACTER*80    JUNK
      CHARACTER*8     JPI
      CHARACTER*6     KAY
      CHARACTER*2     EOL


C           read comments (first five lines of file) ....
      WRITE (IW,*) 'Level Scheme File header:'
      DO J = 1, 5
         READ (25,50) JUNK
         WRITE (IW,*) JUNK
      ENDDO

      READ (25,50) JUNK
      IF (JUNK.NE.' ASCII GLS file format version 1.0') GO TO 900

C           read data....
      READ (25,55,ERR=900) ATOMIC_NO, LEVEL, GAMMA, NBANDS, NTLABEL,
     +               CSX, CSY, ASPECT_RATIO, MAX_TANGENT, MAX_DIST,
     +               DEFAULT_WIDTH, DEFAULT_SEP, ARROW_WIDTH,
     +               ARROW_LENGTH, ARROW_BREAK, LEVEL_BREAK,
     +               L_CSX, L_CSY, L_E_CSX, L_E_CSY, G_CSX, G_CSY
      READ (25,50) JUNK
      READ (25,50) JUNK
      DO J = 1, LEVEL
         READ (25,65,ERR=900) (LEVDATA(J,K),K=1,2), JPI, KAY,
     +               BAND(J), LEVEL_FLAG(J), L_LABEL_FLAG(J),
     +               L_E_LABEL_FLAG(J), EOL

         IF (EOL.EQ.' &') THEN
            READ (25,66,ERR=900) L_LABEL_DX(J), L_LABEL_DY(J),
     +               L_E_LABEL_DX(J), L_E_LABEL_DY(J),
     +               LEVEL_DX(1,J), LEVEL_DX(2,J)
         ELSE
            L_LABEL_DX(J)   = 0.0
            L_LABEL_DY(J)   = 0.0
            L_E_LABEL_DX(J) = 0.0
            L_E_LABEL_DY(J) = 0.0
            LEVEL_DX(1,J)   = 0.0
            LEVEL_DX(2,J)   = 0.0
         ENDIF
         IF (JPI(6:7).EQ.'/2') THEN
            READ(JPI,'(I5)') J1
            LEVDATA(J,3) = FLOAT(J1)/2.0
         ELSE
            READ(JPI,'(I7)') J1
            LEVDATA(J,3) = FLOAT(J1)
         ENDIF
         IF (JPI(8:8).EQ.'-') THEN
            LEVDATA(J,4) = -1.0
         ELSE
            LEVDATA(J,4) = 1.0
         ENDIF
         IF (KAY(5:6).EQ.'/2') THEN
            READ(KAY,'(I4)') J1
            LEVDATA(J,5) = FLOAT(J1)/2.0
         ELSE
            READ(KAY,'(I6)') J1
            LEVDATA(J,5) = FLOAT(J1)
         ENDIF
      ENDDO

      READ (25,50) JUNK
      DO J = 1, NBANDS
         READ (25,75,ERR=900) BAND_NAME(J), BAND_X0(J), BAND_NX(J),
     +               B_LABEL_DX(J), B_LABEL_DY(J),
     +               B_E_LABEL_DX(J), B_E_LABEL_DY(J)
      ENDDO

      READ (25,50) JUNK
      READ (25,50) JUNK
      READ (25,50) JUNK
      DO J = 1, GAMMA
         READ (25,85,ERR=900) GAMDATA(J,1), GAMDATA(J,2), GAML(J), J1,
     +               (GAMID(J,K),K=1,2), GAMDATA(J,3), GAMDATA(J,4), EOL
         GAMN(J) = J1
         IF (EOL.EQ.' &') THEN
            READ (25,86,ERR=900)
     +               GAMDATA(J,6), GAMDATA(J,8), GAMDATA(J,5), 
     +               GAMDATA(J,10), GAMDATA(J,7), GAMDATA(J,9), EOL
         ELSE
            DO K = 5, 10
               GAMDATA(J,K) = 0.0
            ENDDO
            CALL CALC_ALPHA(J)
         ENDIF
         IF (EOL.EQ.' &') THEN
            READ (25,87,ERR=900)
     +               GAMMA_X1(J), GAMMA_X2(J),
     +               G_LABEL_DX(J), G_LABEL_DY(J),
     +               GAMMA_FLAG(J), G_LABEL_FLAG(J)
         ELSE
            GAMMA_X1(J) = 0.0
            GAMMA_X2(J) = 0.0
            G_LABEL_DX(J) = 0.0
            G_LABEL_DY(J) = 0.0
            GAMMA_FLAG(J) = 0
            G_LABEL_FLAG(J) = 0
         ENDIF
      ENDDO

      READ (25,50) JUNK
      READ (25,50) JUNK
      DO J = 1, NTLABEL
         READ (25,95,ERR=900) TLABEL(J), TLABEL_NC(J),
     +               TCSX(J), TCSY(J), TLABEL_X(J), TLABEL_Y(J)
      ENDDO

      CLOSE(25)
      RETURN

50    FORMAT(A)
55    FORMAT(/I5,4I8,3F10.2//F15.6,5F11.2//2F12.2,6F9.2)
65    FORMAT(6X,F11.3,F8.3,A8,A6,I6,3I10,A2)
66    FORMAT(2X,6F10.2)
75    FORMAT(5X,1X,A8,6F10.2)
85    FORMAT(6X,F11.3,F8.3,3X,A,I2,2I6,F11.4,F8.4,A2)
86    FORMAT(2X,3(E13.5,E10.3),A2)
87    FORMAT(2X,4F10.2,2I10)
95    FORMAT(5X,2X,A40,I8/2X,4F10.2)

C         error messages....
900   WRITE(IW,*) 'ERROR - cannot read ASCII gls file.'
      RETURN
      END

********* End of GLS read/write subroutines