CONSTRICTOR output file structure

The data are in an HDS (Hierarchical Data System [Starlink Project]) structure, somewhat analogous to a directory structure. It differs from a directory structure in that a “directory” can actually be an array. Each element of the array will have the same set of sub-directories. Since the structure is like a directory tree, the order of variables listed below is not meaningful. Furthermore, variables can be added or removed in the future. Therefore, this list amounts to a list of the data we think we want, and of the names we have agreed to give them.

In addition to the natural array dimensions such as spectral channel number, point number, etc., we use one more to label the real and imaginary parts of a complex number, indicated by “[R/I]”. The uncertainties for complex numbers have three components, which may be the major axis, minor axis, and position angle of the error ellipse.

For locations, we use three-element vectors with “East, North, Up” as the order of the elements

For directions, we use two-element vectors with the first element ($\theta$) being the angle from the zenith, and the second element ($\phi$) being the angle in the horizontal plane, measured from east through north.

We have not specified the units in the database description. For lengths, we will use meters. Time stamps are offsets from 0 h UT of DataSet.Date. For time stamps and sample intervals, we will use milliseconds. We use <_integer> (which is int*4, with a range of +/-2e9, or +/-68 days) for time stamps, and <_double> for times (e.g., start and stop times).

The format for the descriptions is:

VariableName [IndexLimit(source)][ ... ] <Data type>

So, for instance,

ComplexVis[NumPoint][NumBaseline(beam)][NumSpecChan(beam)][R/I]

under ScanData.PointData.OutputBeam[NumOutBeam] is a four-dimensional array, with the first dimension ranging from 0 to NumPoint - 1, the second from 0 to NumBaseline(beam) - 1 (where NumBaseline can differ from one beam combiner output beam to another), and the third ranging from 0 to NumSpecChan(beam) - 1. In the fourth index, 0 corresponds to the real part and 1 to the imaginary part. In this example, [NumPoint] could have been indicated as [NumPoint(scan)]; however, we suppress listing the source of the parameter if that source is in the same object as the indexed variable. In this example, the variable NumScan is in the ScanData object that contains ComplexVis, so the source for NumPoint is suppressed, but NumOutBeam is in the GenConfig object, so the source for NumBaseline is indicated.

We use the C convention, where the last index listed is the most rapidly varying.

Tables are not part of the HDS system, but they are easily implemented. A table, such as ScanData, is simply a structure like any other, containing a set of substructures, each of which is an array. What makes it a table is our agreement that the items (a primitive, a structure, or a sub-array) pointed to by the first index of each array correspond with one another, e.g., PointData[1] (where PointData[] is itself a complicated structure) was taken between StartTime[1] and StopTime[1] while we observed StarID[1], and so on.

We use two kinds of table here: <Table> and <ExtTable>. Both are slightly different from the table type described in the previous paragraph. Both types contain one integer scalar quantity giving the number of rows (e.g., NumData), followed by the contents of the table, i.e., one or more arrays of variables for which the first index runs from 1 to (NumData - 1). The <ExtTable> (extended table) type also allows array variables whose first index does not correspond with row number. However, the primitives that make up that variable must be array primitives whose first index does correspond with row number.

Session
    Format <_char>
    Date <_char>
    SystemID <_char>
    ObserverLog <_char>
    ConstrictorLog <_char>
    GeoParms
        Latitude <_double>
        Longitude <_double>
        Altitude <_double>
        EarthRadius <_double>
        J2 <_double>
        LeapSeconds <_integer>
        EarthRotation <_double>
    GenConfig
        InstrCohInt <_double>
        BeamCombinerID <_integer>
        NumLaserP2P <_integer>
        P2PLaunchPlate [NumLaserP2P] <_integer>
        P2PRetroPlate[NumLaserP2P] <_integer>
        MasterPlateID <_char*>
        NumPlate <_integer>
        Plate [NumPlate]
            NumCluster <_integer>
            PlateEmbedded <_integer>
            PlateID <_char*>
            PlateLoc [3] <_double>
            PlateLocErr [3] <_double>
        InputBeam <Table>
            NumSid <_integer>
            StationID [NumSid] <_char>
            SiderostatID [NumSid] <_integer>
            DelayLineID [NumSid] <_integer>
            BCInputID [NumSid] <_integer>
            StarTrackerID [NumSid] <_integer>
            StationCoord [NumSid][4] <_double> four coords incl delay
        OutputBeam <Table>
            NumOutBeam <_integer>
            SpectrometerID [NumOutBeam] <_char>
            NumBaseline [NumOutBeam] <_integer>
            NumSpecChan [NumOutBeam] <_integer>
            FringeMod [MaxNumBaseline][NumOutBeam] <_integer>
            BaselineID [MaxNumBaseline][NumOutBeam] <_char>
            Wavelength [MaxNumSpecChan][NumOutBeam] <_double>
            WavelengthErr [MaxNumSpecChan][NumOutBeam] <_double>
            ChanWidth [MaxNumSpecChan][NumOutBeam] <_double>
            ChanWidthErr [MaxNumSpecChan][NumOutBeam] <_double>
        Triple <Table>
            NumTriple <_integer>
            OutputBeam [NumTriple][3] <_integer>
            Baseline [NumTriple][3] <_integer>
            NumSpecChan [NumTriple] <_integer>
            SpecChan [NumTriple][3] <_integer>
    SidMetConfig [NumPlate]
        NumLaser <_integer>
        CountsPerWaveln <_integer>
        LaserWavelength <_double>
        SampleInterval <_integer>
        IFBox [NumLaser] <_integer>
        Channel [NumLaser] <_integer>
        Theta [NumLaser] <_integer>
        ThetaErr [NumLaser] <_integer>
        Phi [NumLaser] <_integer>
        PhiErr [NumLaser] <_integer>
        LaunchInfo [NumLaser]
            NumGlass <_integer>
            NumAirGap <_integer>
            Loc [3] <_double>
            LocErr [3] <_double>
            GlassThick [NumGlass] <_double>
            GlassThickErr [NumGlass] <_double>
            GlassCode [NumGlass] <_integer>
            ExFrac [NumGlass] <_double>
            ExFracErr [NumGlass] <_double>
            AirGapThick [NumAirGap] <_double>
            AirGapThickErr [NumAirGap] <_double>
        RetroInfo [NumLaser]
            NumGlass <_integer>
            NumAirGap <_integer>
            Loc [3] <_double>
            LocErr [3] <_double>
            GlassThick [NumGlass] <_double>
            GlassThickErr [NumGlass] <_double>
            GlassCode [NumGlass] <_integer>
            ExFrac [NumGlass] <_double>
            ExFracErr [NumGlass] <_double>
            AirGapThick [NumAirGap] <_double>
            AirGapThickErr [NumAirGap] <_double>
    OptAnchConfig [NumPlate][MaxNumCluster]
        NumLaser <_integer>
        CountsPerWaveln <_integer>
        LaserWavelength <_double>
        SampleInterval <_integer>
        IFBox [NumLaser] <_integer>
        Channel [NumLaser] <_integer>
        Theta [NumLaser] <_integer>
        ThetaErr [NumLaser] <_integer>
        Phi [NumLaser] <_integer>
        PhiErr [NumLaser] <_integer>
        LaunchInfo [NumLaser]
            NumGlass <_integer>
            NumAirGap <_integer>
            Loc [3] <_double>
            LocErr [3] <_double>
            GlassThick [NumGlass] <_double>
            GlassThickErr [NumGlass] <_double>
            GlassCode [NumGlass] <_integer>
            ExFrac [NumGlass] <_double>
            ExFracErr [NumGlass] <_double>
            AirGapThick [NumAirGap] <_double>
            AirGapThickErr [NumAirGap] <_double>
        RetroInfo [NumLaser]
            NumGlass <_integer>
            NumAirGap <_integer>
            Loc [3] <_double>
            LocErr [3] <_double>
            GlassThick [NumGlass] <_double>
            GlassThickErr [NumGlass] <_double>
            GlassCode [NumGlass] <_integer>
            ExFrac [NumGlass] <_double>
            ExFracErr [NumGlass] <_double>
            AirGapThick [NumAirGap] <_double>
            AirGapThickErr [NumAirGap] <_double>
    Pier2PierConfig
        NumLaser <_integer>
        CountsPerWaveln <_integer>
        LaserWavelength <_double>
        SampleInterval <_integer>
        IFBox [NumLaser] <_integer>
        Channel [NumLaser] <_integer>
        Theta [NumLaser] <_integer>
        ThetaErr [NumLaser] <_integer>
        Phi [NumLaser] <_integer>
        PhiErr [NumLaser] <_integer>
        LaunchInfo [NumLaser]
            NumGlass <_integer>
            NumAirGap <_integer>
            Loc [3] <_double>
            LocErr [3] <_double>
            GlassThick [NumGlass] <_double>
            GlassThickErr [NumGlass] <_double>
            GlassCode [NumGlass] <_integer>
            ExFrac [NumGlass] <_double>
            ExFracErr [NumGlass] <_double>
            AirGapThick [NumAirGap] <_double>
            AirGapThickErr [NumAirGap] <_double>
        RetroInfo [NumLaser]
            NumGlass <_integer>
            NumAirGap <_integer>
            Loc [3] <_double>
            LocErr [3] <_double>
            GlassThick [NumGlass] <_double>
            GlassThickErr [NumGlass] <_double>
            GlassCode [NumGlass] <_integer>
            ExFrac [NumGlass] <_double>
            ExFracErr [NumGlass] <_double>
            AirGapThick [NumAirGap] <_double>
            AirGapThickErr [NumAirGap] <_double>
    ExtCatEyeConfig [NumPlate]
        NumLaser <_integer>
        CountsPerWaveln <_integer>
        LaserWavelength <_double>
        SampleInterval <_integer>
        IFBox [NumLaser] <_integer>
        Channel [NumLaser] <_integer>
        Theta [NumLaser] <_integer>
        ThetaErr [NumLaser] <_integer>
        Phi [NumLaser] <_integer>
        PhiErr [NumLaser] <_integer>
        LaunchInfo [NumLaser]
            NumGlass <_integer>
            NumAirGap <_integer>
            Loc [3] <_double>
            LocErr [3] <_double>
            GlassThick [NumGlass] <_double>
            GlassThickErr [NumGlass] <_double>
            GlassCode [NumGlass] <_integer>
            ExFrac [NumGlass] <_double>
            ExFracErr [NumGlass] <_double>
            AirGapThick [NumAirGap] <_double>
            AirGapThickErr [NumAirGap] <_double>
        RetroInfo [NumLaser]
            NumGlass <_integer>
            NumAirGap <_integer>
            Loc [3] <_double>
            LocErr [3] <_double>
            GlassThick [NumGlass] <_double>
            GlassThickErr [NumGlass] <_double>
            GlassCode [NumGlass] <_integer>
            ExFrac [NumGlass] <_double>
            ExFracErr [NumGlass] <_double>
            AirGapThick [NumAirGap] <_double>
            AirGapThickErr [NumAirGap] <_double>
    PlateExpConfig [NumPlate]
        NumLaser <_integer>
        CountsPerWaveln <_integer>
        LaserWavelength <_double>
        SampleInterval <_integer>
        IFBox [NumLaser] <_integer>
        Channel [NumLaser] <_integer>
        Theta [NumLaser] <_integer>
        ThetaErr [NumLaser] <_integer>
        Phi [NumLaser] <_integer>
        PhiErr [NumLaser] <_integer>
        LaunchInfo [NumLaser]
            NumGlass <_integer>
            NumAirGap <_integer>
            Loc [3] <_double>
            LocErr [3] <_double>
            GlassThick [NumGlass] <_double>
            GlassThickErr [NumGlass] <_double>
            GlassCode [NumGlass] <_integer>
            ExFrac [NumGlass] <_double>
            ExFracErr [NumGlass] <_double>
            AirGapThick [NumAirGap] <_double>
            AirGapThickErr [NumAirGap] <_double>
        RetroInfo [NumLaser]
            NumGlass <_integer>
            NumAirGap <_integer>
            Loc [3] <_double>
            LocErr [3] <_double>
            GlassThick [NumGlass] <_double>
            GlassThickErr [NumGlass] <_double>
            GlassCode [NumGlass] <_integer>
            ExFrac [NumGlass] <_double>
            ExFracErr [NumGlass] <_double>
            AirGapThick [NumAirGap] <_double>
            AirGapThickErr [NumAirGap] <_double>
    MetAirTempConf [NumPlate]
        NumSensor <_integer>
        SampleInterval <_integer>
        Chain [NumSensor] <_integer>
        BRAD [NumSensor] <_integer>
        Offset [NumSensor] <_double>
        OffsetErr [NumSensor] <_double>
        Scale [NumSensor] <_double>
        ScaleErr [NumSensor] <_double>
        Cross [NumSensor] <_double>
        Loc [NumSensor][3] <_double>
        LocErr  [NumSensor][3] <_double>
    MetSolidTmpConf [NumPlate]
        NumSensor <_integer>
        SampleInterval <_integer>
        Chain [NumSensor] <_integer>
        BRAD [NumSensor] <_integer>
        Offset [NumSensor] <_double>
        OffsetErr [NumSensor] <_double>
        Scale [NumSensor] <_double>
        ScaleErr [NumSensor] <_double>
        Cross [NumSensor] <_double>
        Loc [NumSensor][3] <_double>
        LocErr  [NumSensor][3] <_double>
    MetPressConf [NumPlate]
        NumSensor <_integer>
        SampleInterval <_integer>
        Chain [NumSensor] <_integer>
        BRAD [NumSensor] <_integer>
        Offset [NumSensor] <_double>
        OffsetErr [NumSensor] <_double>
        Scale [NumSensor] <_double>
        ScaleErr [NumSensor] <_double>
        Cross [NumSensor] <_double>
        Loc [NumSensor][3] <_double>
        LocErr  [NumSensor][3] <_double>
    MetHumConf [NumPlate]
        NumSensor <_integer>
        SampleInterval <_integer>
        Chain [NumSensor] <_integer>
        BRAD [NumSensor] <_integer>
        Offset [NumSensor] <_double>
        OffsetErr [NumSensor] <_double>
        Scale [NumSensor] <_double>
        ScaleErr [NumSensor] <_double>
        Cross [NumSensor] <_double>
        Loc [NumSensor][3] <_double>
        LocErr  [NumSensor][3] <_double>
    LabAirTempConf
        NumSensor <_integer>
        SampleInterval <_integer>
        Chain [NumSensor] <_integer>
        BRAD [NumSensor] <_integer>
        Offset [NumSensor] <_double>
        OffsetErr [NumSensor] <_double>
        Scale [NumSensor] <_double>
        ScaleErr [NumSensor] <_double>
        Cross [NumSensor] <_double>
        Loc [NumSensor][3] <_double>
        LocErr  [NumSensor][3] <_double>
    LabSolidTmpConf
        NumSensor <_integer>
        SampleInterval <_integer>
        Chain [NumSensor] <_integer>
        BRAD [NumSensor] <_integer>
        Offset [NumSensor] <_double>
        OffsetErr [NumSensor] <_double>
        Scale [NumSensor] <_double>
        ScaleErr [NumSensor] <_double>
        Cross [NumSensor] <_double>
        Loc [NumSensor][3] <_double>
        LocErr  [NumSensor][3] <_double>
    LabPressConf
        NumSensor <_integer>
        SampleInterval <_integer>
        Chain [NumSensor] <_integer>
        BRAD [NumSensor] <_integer>
        Offset [NumSensor] <_double>
        OffsetErr [NumSensor] <_double>
        Scale [NumSensor] <_double>
        ScaleErr [NumSensor] <_double>
        Cross [NumSensor] <_double>
        Loc [NumSensor][3] <_double>
        LocErr  [NumSensor][3] <_double>
    LabHumConf
        NumSensor <_integer>
        SampleInterval <_integer>
        Chain [NumSensor] <_integer>
        BRAD [NumSensor] <_integer>
        Offset [NumSensor] <_double>
        OffsetErr [NumSensor] <_double>
        Scale [NumSensor] <_double>
        ScaleErr [NumSensor] <_double>
        Cross [NumSensor] <_double>
        Loc [NumSensor][3] <_double>
        LocErr  [NumSensor][3] <_double>
    DLPressConf
        NumSensor <_integer>
        SampleInterval <_integer>
        Chain [NumSensor] <_integer>
        BRAD [NumSensor] <_integer>
        Offset [NumSensor] <_double>
        OffsetErr [NumSensor] <_double>
        Scale [NumSensor] <_double>
        ScaleErr [NumSensor] <_double>
        Cross [NumSensor] <_double>
        Loc [NumSensor][3] <_double>
        LocErr  [NumSensor][3] <_double>
    FBPressConf
        NumSensor <_integer>
        SampleInterval <_integer>
        Chain [NumSensor] <_integer>
        BRAD [NumSensor] <_integer>
        Offset [NumSensor] <_double>
        OffsetErr [NumSensor] <_double>
        Scale [NumSensor] <_double>
        ScaleErr [NumSensor] <_double>
        Cross [NumSensor] <_double>
        Loc [NumSensor][3] <_double>
        LocErr  [NumSensor][3] <_double>
    WxAirTempConf
        NumSensor <_integer>
        SampleInterval <_integer>
        Chain [NumSensor] <_integer>
        BRAD [NumSensor] <_integer>
        Offset [NumSensor] <_double>
        OffsetErr [NumSensor] <_double>
        Scale [NumSensor] <_double>
        ScaleErr [NumSensor] <_double>
        Cross [NumSensor] <_double>
        Loc [NumSensor][3] <_double>
        LocErr  [NumSensor][3] <_double>
    WxPressConf
        NumSensor <_integer>
        SampleInterval <_integer>
        Chain [NumSensor] <_integer>
        BRAD [NumSensor] <_integer>
        Offset [NumSensor] <_double>
        OffsetErr [NumSensor] <_double>
        Scale [NumSensor] <_double>
        ScaleErr [NumSensor] <_double>
        Cross [NumSensor] <_double>
        Loc [NumSensor][3] <_double>
        LocErr  [NumSensor][3] <_double>
    WxHumConf
        NumSensor <_integer>
        SampleInterval <_integer>
        Chain [NumSensor] <_integer>
        BRAD [NumSensor] <_integer>
        Offset [NumSensor] <_double>
        OffsetErr [NumSensor] <_double>
        Scale [NumSensor] <_double>
        ScaleErr [NumSensor] <_double>
        Cross [NumSensor] <_double>
        Loc [NumSensor][3] <_double>
        LocErr  [NumSensor][3] <_double>
    WindSpeedConf
        NumSensor <_integer>
        SampleInterval <_integer>
        Chain [NumSensor] <_integer>
        BRAD [NumSensor] <_integer>
        Offset [NumSensor] <_double>
        OffsetErr [NumSensor] <_double>
        Scale [NumSensor] <_double>
        ScaleErr [NumSensor] <_double>
        Cross [NumSensor] <_double>
        Loc [NumSensor][3] <_double>
        LocErr  [NumSensor][3] <_double>
    WindDirConf
        NumSensor <_integer>
        SampleInterval <_integer>
        Chain [NumSensor] <_integer>
        BRAD [NumSensor] <_integer>
        Offset [NumSensor] <_double>
        OffsetErr [NumSensor] <_double>
        Scale [NumSensor] <_double>
        ScaleErr [NumSensor] <_double>
        Cross [NumSensor] <_double>
        Loc [NumSensor][3] <_double>
        LocErr  [NumSensor][3] <_double>
    BGScanData <ExtTable>
        NumBGScan <_integer>
        ScanID [NumBGScan] <_integer>
        Time [NumBGScan] <_double>
        RA [NumBGScan] <_double>
        Dec [NumBGScan] <_double>
        OutputBeam [NumOutBeam] <ExtColumn>
            Rate [NumBGScan][NumSpecChan(beam)] <_real>
    ScanData <Table>
        NumScan <_integer>
        ScanID [NumScan] <_integer>
        StartTime [NumScan] <_double>
        StopTime [NumScan] <_double>
        Code [NumScan] <_integer>
        NumPoint [NumScan] <_integer>
        StarID [NumScan] <_char>
        WASA_Image [NumScan] intensity and position(s) of stars in field
        NumCoh [NumScan] <_integer> instr. coh. int.s per CONSTRICTOR coh. int.
        NumIncoh [NumScan] <_integer>
        PointData [NumScan] <ExtTable>
            NumPoint <_integer>
            Time [NumPoint] <_double> time of mid-point
            SoftDelay [NumPoint][NumSid] <_double>
            InputBeam [NumSid]
                FDLPos [NumPoint] <_double>
                FDLPosErr [NumPoint] <_double>
                NATJitter [NumPoint] <_real>
                NATJitterErr [NumPoint] <_real>
            OutputBeam [NumOutBeam] <ExtColumn>
                SoftDelay [NumPoint][NumBaseline(beam)] <_real>
                SoftDelayErr [NumPoint][NumBaseline(beam)] <_real>
                DelayJitter [NumPoint][NumBaseline(beam)] <_real>
                VisSq [NumPoint][NumBaseline(beam)][NumSpecChan(beam)] <_real>
                VisSqErr [NumPoint][NumBaseline(beam)][NumSpecChan(beam)] <_real>
                ComplexVis [NumPoint][NumBaseline(beam)][NumSpecChan(beam)][R/I] <_real>
                ComplexVisErr [NumPoint][NumBaseline(beam)][NumSpecChan(beam)][A/B/C] <_real>
                PhotonRate [NumPoint][NumSpecChan(beam)] <_real>
                PhotonRateErr [NumPoint][NumSpecChan(beam)] <_real>
            Triple [NumTriple] <ExtColumn>
                ComplTriple [NumPoint][NumTripleChan][R/I] <_real>
                ComplTripleErr [NumPoint][NumTripleChan][R/I] <_real>
    SidMetData [NumPlate]
        NumData <_integer>
        TimeStamp [NumData] <_integer>
        Data [NumData][NumLaser(plate)] <_integer>
    OptAnchData [NumPlate][MaxNumCluster]
        NumData <_integer>
        TimeStamp [NumData] <_integer>
        Data [NumData][NumLaserMax(plate,cluster)] <_integer>
    Pier2PierData
        NumData <_integer>
        TimeStamp [NumData] <_integer>
        Data [NumData][NumLaser(plate)] <_integer>
    ExtCatEyeData [NumPlate]
        NumData <_integer>
        TimeStamp [NumData] <_integer>
        Data [NumData][NumLaser(plate)] <_integer>
    PlateExpData [NumPlate]
        NumData <_integer>
        TimeStamp [NumData] <_integer>
        Data [NumData][NumLaser(plate)] <_integer>
    MetAirTempData [NumPlate]
        NumData <_integer>
        TimeStamp [NumData] <_integer>
        Data [NumData][NumSensor(plate)] <_word>
    MetSolidTmpData [NumPlate]
        NumData <_integer>
        TimeStamp [NumData] <_integer>
        Data [NumData][NumSensor(plate)] <_word>
    MetPressureData [NumPlate]
        NumData <_integer>
        TimeStamp [NumData] <_integer>
        Data [NumData][NumSensor(plate)] <_word>
    MetHumidityData [NumPlate]
        NumData <_integer>
        TimeStamp [NumData] <_integer>
        Data [NumData][NumSensor(plate)] <_word>
    LabAirTempData
        NumData <_integer>
        TimeStamp [NumData] <_integer>
        Data [NumData][NumSensor] <_word>
    LabSolidTmpData
        NumData <_integer>
        TimeStamp [NumData] <_integer>
        Data [NumData][NumSensor] <_word>
    LabPressData
        NumData <_integer>
        TimeStamp [NumData] <_integer>
        Data [NumData][NumSensor] <_word>
    LabHumData
        NumData <_integer>
        TimeStamp [NumData] <_integer>
        Data [NumData][NumSensor] <_word>
    DLPressData
        NumData <_integer>
        TimeStamp [NumData] <_integer>
        Data [NumData][NumSensor] <_word>
    FBPressData
        NumData <_integer>
        TimeStamp [NumData] <_integer>
        Data [NumData][NumSensor] <_word>
    WxAirTempData
        NumData <_integer>
        TimeStamp [NumData] <_integer>
        Data [NumData][NumSensor] <_word>
    WxPressureData
        NumData <_integer>
        TimeStamp [NumData] <_integer>
        Data [NumData][NumSensor] <_word>
    WxHumidityData
        NumData <_integer>
        TimeStamp [NumData] <_integer>
        Data [NumData][NumSensor] <_word>
    WindSpeedData
        NumData <_integer>
        TimeStamp [NumData] <_integer>
        Data [NumData][NumSensor] <_word>
    WindDirData
        NumData <_integer>
        TimeStamp [NumData] <_integer>
        Data [NumData][NumSensor] <_word>