fmt:ASP_TRACE= typedef void ASP_TRACE;

fmt:*:asp=               /* root for "asp" format */
   typedef ASP_TRACE SEQUENCE;
   /* PREAMBLE not applicable */
   /* EPILOGUE not applicable */
fmt:*:cube=   typedef CUBE_TRACE SEQUENCE;
fmt:*:fcube=  typedef FCUBE_TRACE SEQUENCE;
fmt:*:fcubex= typedef FCUBEX_TRACE SEQUENCE;
fmt:*:dcube=  typedef DCUBE_TRACE SEQUENCE;
fmt:*:dcubex= typedef DCUBEX_TRACE SEQUENCE;
fmt:*:ccube=  typedef CCUBE_TRACE SEQUENCE;
fmt:*:ccubex= typedef CCUBEX_TRACE SEQUENCE;
fmt:*:icube=  typedef ICUBE_TRACE SEQUENCE;
fmt:*:icubex= typedef ICUBEX_TRACE SEQUENCE;
fmt:*:i2cube= typedef I2CUBE_TRACE SEQUENCE;
fmt:*:i2cubex=typedef I2CUBEX_TRACE SEQUENCE;
fmt:*:i1cube= typedef I1CUBE_TRACE SEQUENCE;
fmt:*:sep=    typedef SEP_TRACE SEQUENCE;

fmt:asp= typedef ASP_TRACE SEQUENCE;
fmt:cube=   typedef CUBE_TRACE SEQUENCE;
fmt:fcube=  typedef FCUBE_TRACE SEQUENCE;
fmt:fcubex= typedef FCUBEX_TRACE SEQUENCE;
fmt:dcube=  typedef DCUBE_TRACE SEQUENCE;
fmt:dcubex= typedef DCUBEX_TRACE SEQUENCE;
fmt:ccube=  typedef CCUBE_TRACE SEQUENCE;
fmt:ccubex= typedef CCUBEX_TRACE SEQUENCE;
fmt:icube=  typedef ICUBE_TRACE SEQUENCE;
fmt:icubex= typedef ICUBEX_TRACE SEQUENCE;
fmt:i2cube= typedef I2CUBE_TRACE SEQUENCE;
fmt:i2cubex=typedef I2CUBEX_TRACE SEQUENCE;
fmt:i1cube= typedef I1CUBE_TRACE SEQUENCE;
fmt:sep= typedef SEP_TRACE SEQUENCE;

fmt:*:asp.ASP_TRACE=           /* ASP_TRACE, given any other format */
   typedef struct {            /* structure for binary data */
         + SEQUENCE;           /* SEQUENCE members from previous format */
         - GREEN_PREFIX;
         - GREEN_SUFFIX;
         defn_value("default:","MOD_FIELD")  /* default changes */
         defn_value("par:","MOD_FIELD")      /* user changes */
         defn_value("override:","MOD_FIELD") /* override changes */
      } ASP_TRACE;             /* standard name for default "trace" */

fmt:usp:asp.ASP_TRACE=         /* ASP_TRACE, given usp format */
   typedef struct {            /* structure for binary data */
         + SEQUENCE;           /* SEQUENCE members from previous format */
         - GREEN_PREFIX;
         - GREEN_SUFFIX;
         defn_value("default:","MOD_FIELD")  /* default changes */
         defn_value("par:","MOD_FIELD")      /* user changes */
         defn_value("override:","MOD_FIELD") /* override changes */
         - int usp_trace_pad;  /* garbage */
      } ASP_TRACE;             /* standard name for default "trace" */

fmt:segy:asp.ASP_TRACE=        /* ASP_TRACE, given segy format */
   typedef struct {            /* structure for binary data */
         + SEQUENCE;           /* SEQUENCE members from previous format */
         - GREEN_PREFIX;
         - GREEN_SUFFIX;
         defn_value("default:","MOD_FIELD")  /* default changes */
         defn_value("par:","MOD_FIELD")      /* user changes */
         defn_value("override:","MOD_FIELD") /* override changes */
         - int segy_trace_pad; /* garbage */
      } ASP_TRACE;             /* standard name for default "trace" */

fmt:segy:asp.ASP_TRACE=
   typedef struct {
      + int
         SGRNum,     /* SGR number */
         SGRAmp,     /* SGR PreAmp Gain, Filter */
         FlReFN,     /* Field Record File Number */
         FlStNm,     /* SGR Field Station Number */
         PREPIn,     /* PREP Initiation Static */
         InStUn,     /* Initiation Static Unapplied */
         InStAp,     /* Initiation Static Applied */
         PREPRc,     /* PREP Reception Static */
         RcStUn,     /* Reception Static Unapplied */
         RcStAp,     /* Reception Static Applied */
         ToStAp,     /* Total Static Applied */
         ToTmAA,     /* Total Timing Adjust Applied */
         ToStUn,     /* Total Static Unapplied */
         ToTmAU,     /* Total Timing Adjust Unapplied */
         SrComp,     /* Source component xyz code */
         RcComp,     /* Receiver component xyz code */
         SrStat,     /* Source floating datum static */
         RcStat,     /* Receiver floating datum static */
         TrHdID,     /* Trace Header Identifier */
         SrRcAz,     /* Source-to-Receiver Azimuth */
         SrPtXC,     /* Src Point X-Coordinate 3D */
         SrPtYC,     /* Src Point Y-Coordinate 3D */
         RcPtXC,     /* Rec Point X-Coordinate 3D */
         RcPtYC,     /* Rec Point Y-Coordinate 3D */
         SrRcMX,     /* Src Rec Midpoint X 3D */
         SrRcMY,     /* Src Rec Midpoint Y 3D */
         CDPBCX,     /* CDP Bin Center X Coordinate */
         CDPBCY,     /* CDP Bin Center Y Coordinate */
         InTrCn,     /* Incremental Trace Counter */
         FlDtEl,     /* Floating Datum Elev this CDP */
         MulSkw,     /* Multiplex Skew (ms*1000) */
         PerSPO,     /* Perpendicular Src Pt Off y */
         InlSPO,     /* Inline Src Pt Off x */
         TiLiIx[6],  /* Tie Line Indicator 1-6 */
         TVPT01,     /* Time of Time-Vel Pair */
         TVPV01,     /* Velocity of Time-Vel Pair */
         TVPT02, TVPV02, TVPT03, TVPV03, TVPT04, TVPV04,
         TVPT05, TVPV05, TVPT06, TVPV06, TVPT07, TVPV07,
         TVPT08, TVPV08, TVPT09, TVPV09, TVPT10, TVPV10,
         TVPT11, TVPV11, TVPT12, TVPV12, TVPT13, TVPV13,
         TVPT14, TVPV14, TVPT15, TVPV15, TVPT16, TVPV16,
         TVPT17, TVPV17, TVPT18, TVPV18, TVPT19, TVPV19,
         TVPT20, TVPV20,
         RedVel,     /* Reduction Velocity for vred */
         RedTim,     /* Time of first sample for vred */
         VPick1,     /* Auto Static Pick 1 */
         VPick2,     /* Auto Static Pick 2 */
         LRcCDP,     /* Last Record CDP */
         CabDep,     /* Cable Depth */
         WDepDP,     /* Water Depth Above Depth Point */
         DPOPer,     /* Depth Point Offset Perpendicular */
         ShtDep,     /* shot depth */
         UphlTm,     /* uphole time in ms */
         DpPtLt,     /* depth pt lat (deg* 10^5) */
         DpPtLn,     /* depth pt lon (deg* 10^5) */
         FoldNm,     /* fold */
         RecNum,     /* record number */
         TrcNum,     /* trace number */
         SrcPnt,     /* src point above this depth pt */
         SrcLoc,     /* src location ind mult by 10 */
         PrRcNm,     /* permanent record number PRI */
         PrTrNm,     /* permanent trace number PTI */
         SrPtEl,     /* source point elevation */
         SrPrLt,     /* source point lat (deg* 10^5) */
         SrPrLn,     /* source point lon (deg* 10^5) */
         DstUsg,     /* unsigned trace distance */
         RecInd,     /* rec location index	GI */
         DstSgn,     /* signed trace distance */
         GrpElv,     /* group elevation */
         LinInd,     /* line index 3D */
         DphInd,     /* depth index */
         DePtEl,     /* depth point elevation */
         RfSrEl,     /* reference surface elevation */
         StaCor,     /* static correction, dead 30000 */
         DatShf,     /* datum shift */
         SoPtNm;     /* source point number */
      + SAMPLE_TYPE Samples[axis_size(1)]; /* time series */
         defn_value("default:","MOD_FIELD")  /* default changes */
         defn_value("par:","MOD_FIELD")      /* user changes */
         defn_value("override:","MOD_FIELD") /* override changes */
   } ASP_TRACE;

$fmt:segy1:asp.ASP_TRACE=fmt:segy:asp.ASP_TRACE /* ASP_TRACE, given segy1 format */

$fmt:su:asp.ASP_TRACE= fmt:segy:asp.ASP_TRACE   /* ASP_TRACE, given su format */

fmt:CUBE_TRACE=
   typedef struct { SAMPLE_TYPE Samples[axis_size(1)];} CUBE_TRACE;
fmt:FCUBE_TRACE=
   typedef struct { SAMPLE_TYPE Samples[axis_size(1)];} FCUBE_TRACE;
fmt:FCUBEX_TRACE=
   typedef struct { SAMPLE_TYPE Samples[axis_size(1)];} FCUBEX_TRACE;
fmt:DCUBE_TRACE=
   typedef struct { SAMPLE_TYPE Samples[axis_size(1)];} DCUBE_TRACE;
fmt:DCUBEX_TRACE=
   typedef struct { SAMPLE_TYPE Samples[axis_size(1)];} DCUBEX_TRACE;
fmt:CCUBE_TRACE=
   typedef struct { SAMPLE_TYPE Samples[axis_size(1)];} CCUBE_TRACE;
fmt:CCUBEX_TRACE=
   typedef struct { SAMPLE_TYPE Samples[axis_size(1)];} CCUBEX_TRACE;
fmt:ICUBE_TRACE=
   typedef struct { SAMPLE_TYPE Samples[axis_size(1)];} ICUBE_TRACE;
fmt:ICUBEX_TRACE=
   typedef struct { SAMPLE_TYPE Samples[axis_size(1)];} ICUBEX_TRACE;
fmt:I2CUBE_TRACE=
   typedef struct { SAMPLE_TYPE Samples[axis_size(1)];} I2CUBE_TRACE;
fmt:I2CUBEX_TRACE=
   typedef struct { SAMPLE_TYPE Samples[axis_size(1)];} I2CUBEX_TRACE;
fmt:I1CUBE_TRACE=
   typedef struct { SAMPLE_TYPE Samples[axis_size(1)];} I1CUBE_TRACE;
fmt:SEP_TRACE=
   typedef struct { SAMPLE_TYPE Samples[axis_size(1)];} SEP_TRACE;

fmt:*:*.CUBE_TRACE=
   typedef struct { + SAMPLE_TYPE Samples[axis_size(1)];} CUBE_TRACE;
fmt:*:*.FCUBE_TRACE=
   typedef struct { + SAMPLE_TYPE Samples[axis_size(1)];} FCUBE_TRACE;
fmt:*:*.FCUBEX_TRACE=
   typedef struct { + SAMPLE_TYPE Samples[axis_size(1)];} FCUBEX_TRACE;
fmt:*:*.DCUBE_TRACE=
   typedef struct { + SAMPLE_TYPE Samples[axis_size(1)];} DCUBE_TRACE;
fmt:*:*.DCUBEX_TRACE=
   typedef struct { + SAMPLE_TYPE Samples[axis_size(1)];} DCUBEX_TRACE;
fmt:*:*.CCUBE_TRACE=
   typedef struct { + SAMPLE_TYPE Samples[axis_size(1)];} CCUBE_TRACE;
fmt:*:*.CCUBEX_TRACE=
   typedef struct { + SAMPLE_TYPE Samples[axis_size(1)];} CCUBEX_TRACE;
fmt:*:*.ICUBE_TRACE=
   typedef struct { + SAMPLE_TYPE Samples[axis_size(1)];} ICUBE_TRACE;
fmt:*:*.ICUBEX_TRACE=
   typedef struct { + SAMPLE_TYPE Samples[axis_size(1)];} ICUBEX_TRACE;
fmt:*:*.I2CUBE_TRACE=
   typedef struct { + SAMPLE_TYPE Samples[axis_size(1)];} I2CUBE_TRACE;
fmt:*:*.I2CUBEX_TRACE=
   typedef struct { + SAMPLE_TYPE Samples[axis_size(1)];} I2CUBEX_TRACE;
fmt:*:*.I1CUBE_TRACE=
   typedef struct { + SAMPLE_TYPE Samples[axis_size(1)];} I1CUBE_TRACE;
fmt:*:*.SEP_TRACE=
   typedef struct { + SAMPLE_TYPE Samples[axis_size(1)];} SEP_TRACE;

fmt:SEQUENCE= typedef ASP_TRACE SEQUENCE;
fmt:GREEN_PREFIX= typedef int GREEN_PREFIX;
fmt:GREEN_SUFFIX= typedef int GREEN_SUFFIX;

comment=
*********************************************************************
********  asp or cube formats must already be defined or ************
********  it must be explicitly defined by the program.  ************
*********************************************************************
fmt:*:fcube.SAMPLE_TYPE=  typedef float4 SAMPLE_TYPE;
fmt:*:fcubex.SAMPLE_TYPE= typedef float4x SAMPLE_TYPE;
fmt:*:dcube.SAMPLE_TYPE=  typedef float8 SAMPLE_TYPE;
fmt:*:dcubex.SAMPLE_TYPE= typedef float8x SAMPLE_TYPE;
fmt:*:ccube.SAMPLE_TYPE=  typedef complex8 SAMPLE_TYPE;
fmt:*:ccubex.SAMPLE_TYPE= typedef complex8x SAMPLE_TYPE;
fmt:*:icube.SAMPLE_TYPE=  typedef integer4 SAMPLE_TYPE;
fmt:*:icubex.SAMPLE_TYPE= typedef integer4x SAMPLE_TYPE;
fmt:*:i2cube.SAMPLE_TYPE= typedef integer2 SAMPLE_TYPE;
fmt:*:i2cubex.SAMPLE_TYPE=typedef integer2x SAMPLE_TYPE;
fmt:*:i1cube.SAMPLE_TYPE= typedef integer1 SAMPLE_TYPE;
fmt:*:sep.SAMPLE_TYPE=    typedef float4 SAMPLE_TYPE;

comment=
*********************************************************************
********  SURFER'S  GUIDE  TO  STRUCT/UNION  ENHANCEMENTS  **********
*********************************************************************

comment= SUMMARY of STRUCT/UNION MEMBER OPERATORS

   struct {+ aaa; - bbb; * ccc; -+ ddd; *+ eee;} xyz;
          ^^^    ^^^    ^^^    ^^^^    ^^^^
      +,  append member, if name is unique
      -,  delete member, if it exists
      *,  replace member, if it exists
      -+, delete and append member
      *+, replace or append member

   Members are composed from left, to right.  Example:
      given:
         typedef struct {int   a, b, c;}  old_xyz;
         typedef struct {float d, e, f;}  add_xyz;
         typedef struct {void  b, e;}     drop_xyz;
      compose:
         typedef struct {+ old_xyz; + add_xyz; - drop_xyz} xyz;
      results:
         typedef struct {int a,   c; float d,   f;} xyz;

comment=
*********************************************************************

comment= default sort field translation
 
sort:old_fmt.old_sort_field:new_fmt= new_sort_field
 
sort:segy.FieldRecNum:asp= PrRcNm
sort:segy.Spare.Hdr.RecNum:asp= RecNum
sort:segy.CdpTrcNum:asp= TrcNum
sort:segy.FieldTrcNum:asp= PrTrNm
sort:segy.Spare.Hdr.SoPtNm:asp= SoPtNm
sort:segy.Spare.Hdr.RecInd:asp= RecInd
sort:segy.Spare.Hdr.SrcPnt:asp= SrcPnt
sort:segy.CdpNum:asp= DphInd
sort:segy.SrcX:asp= SrPtXC
sort:segy.SrcY:asp= SrPtYC
sort:segy.GrpX:asp= RcPtXC
sort:segy.GrpY:asp= RcPtYC
sort:segy.DstSgn:asp= DstSgn
 
sort:segy1.FieldRecNum:asp= PrRcNm
sort:segy1.Spare1.Hdr.RecNum:asp= RecNum
sort:segy1.CdpTrcNum:asp= TrcNum
sort:segy1.FieldTrcNum:asp= PrTrNm
sort:segy1.Spare1.Hdr.SoPtNm:asp= SoPtNm
sort:segy1.Spare1.Hdr.RecInd:asp= RecInd
sort:segy1.Spare1.Hdr.SrcPnt:asp= SrcPnt
sort:segy1.CdpNum:asp= DphInd
sort:segy1.SrcX:asp= SrPtXC
sort:segy1.SrcY:asp= SrPtYC
sort:segy1.GrpX:asp= RcPtXC
sort:segy1.GrpY:asp= RcPtYC
sort:segy1.DstSgn:asp= DstSgn
 
sort:su.FieldRecNum:asp= PrRcNm
sort:su.Spare.Hdr.RecNum:asp= RecNum
sort:su.CdpTrcNum:asp= TrcNum
sort:su.FieldTrcNum:asp= PrTrNm
sort:su.Spare.Hdr.SoPtNm:asp= SoPtNm
sort:su.Spare.Hdr.RecInd:asp= RecInd
sort:su.Spare.Hdr.SrcPnt:asp= SrcPnt
sort:su.CdpNum:asp= DphInd
sort:su.SrcX:asp= SrPtXC
sort:su.SrcY:asp= SrPtYC
sort:su.GrpX:asp= RcPtXC
sort:su.GrpY:asp= RcPtYC
sort:su.DstSgn:asp= DstSgn