
# CRUSH: SOFIA/HAWC+

Author: Attila Kovacs <attila[AT]sigmyne.com>

Last updated: 28 October 2017


----------------------------------------------------------------------------

#### Table of Contents


1. __Introduction__
     - 1.1. A brief description of of what CRUSH does and how...

2. __Installation__
     - 2.1. Installation from tarball (POSIX/UNIX, incl. Mac OS X)
     - 2.2. Optional system-wide installation.
     - 2.3. Optional startup environment & Java configuration
     - 2.4. Optional automatic pipeline configuration (skyhawc)

3. __Quickstart guide__
     - 3.1. Locating scan data
     - 3.2. A few common options to use with SOFIA/HAWC+

4. __Technical details for expert users__
     - 4.1. HAWC+ specific pixel divisions
     - 4.2. Glossary of HAWC+ specific options
     - 4.3. HAWC+ specific log quantities

-----------------------------------------------------------------------------




## 1. Introduction


This document contains information specific to using CRUSH-2 with SOFIA/HAWC+. 

You may use it as a standalone quickstart guide, with instructions for 
installation and basic use, or in conjucntion with the main CRUSH-2 README. 
Either way, it is recommended that users also familiarize themselves with 
the contents of the main CRUSH-2 README, found inside the distribution 
directory, and its Section 1 (Getting Started) especially. 



### 1.1 A brief description of what CRUSH does and how...

CRUSH is a reduction pipeline, designed mainly to remove correlated signals 
(correlated noise) in the detector time-streams to arrive at clean & 
independent bolometer signals, which are then used to derive a model of the 
source (usually an image).

As such it is not an interactive reduction software (e.g. as opposed to e.g. 
BoA). The term _scripting_ in CRUSH mainly means defining configuration options
(in the command line or through configuration files) which are parsed in the 
order they are read.

During the reduction CRUSH aims to arrive at a consistent set of solutions for 
various correlated signals, the corresponding gains and the pixel weights, as 
well as tries to identify and flag problematic data, and applies appropriate 
spectral filtering.

This means a series of reduction steps, which are iterated a few times until 
the required self-consistent solutions are arrived at.

To learn more about the details please refer to Kovacs, A., "CRUSH: fast and 
scalable data reduction for imaging arrays," Proc. SPIE 7020, 45, (2008). If 
that does not satisfy your curiousity, then you can find yet more explanation 
in Kovacs, A., PhD thesis, Caltech (2006).





## 2. Installation


### 2.1. Installation from tarball (POSIX/UNIX, incl. Mac OS X)

#### Step 1.
    
  Install Java (if necessary), e.g. from www.java.com. If you already have 
  Java, check that it is version 1.6.0 (a.k.a. Java 6) or later, by typing:

    > java -version

  Note, that The GNU java a.k.a. `gij` (default on some older RedHat and Fedora 
  systems) is painfully slow and unreliable, and will not always run CRUSH 
  correctly. If you need Java, you can download the latest JRE from

  www.java.com

#### Step 2.
  
  Unpack the tarball in the desired location (e.g. under `~/astrotools/`):

    > cd ~/astrotools
    > tar xzf crush-2.xx-x.tar.gz
   

#### Step 3.
    
  Verify that CRUSH works:

    > cd crush
    > ./crush

  You should see a brief information screen on how to use CRUSH.



### 2.2. Optional system-wide installation

 To create system-wide access to the crush executables, you may optionally 
 wish to run `install.sh` (as root or with `sudo`). It will link the
 executables to `/usr/bin`, and install man pages.

    > cd crush
    > sudo bash install.sh

 You can check the success of the above optional step by typing:

    > man crush

 If all is in order, you should see the UNIX manual page on the crush. 



### 2.3. Optional startup environment & Java configuration
   
 CRUSH ships with a default Java configuration. On the most common UNIX 
 platforms (Linux, Mac OS X, BSD, and Solaris), it will automatically attempt
 to set an optimal configuration. On other platforms, it comes with fail-safe
 default values (default java, 32-bit mode and 1GB of RAM use).

 To override the defaults on Windows, edit `wrapper.bat` directly.

 On all other platforms, you can override the defaults by placing your settings
 in arbitrary files under `/etc/crush2/startup` or `~/.crush2/startup`. (Any 
 settings in the user's home under `~/.crush2/startup` will override the 
 system-wide values in `/etc/crush2/startup`. If multiple config files exist in
 the same location, these will be parsed by the shell in non-specific order).

 E.g., placing the following lines in `~/.crush2/startup/java.conf` overrides
 all available settings: 

    JAVA="/usr/java/latest/bin/java"
    DATAMODEL="64"
    USEMB="4000"
    JVM="server"
    EXTRAOPTS="-Djava.awt.headless=true"

 Upon startup CRUSH will find and apply these settings, so it will use
 `/usr/java/latest/bin/java` to run CRUSH, in 64-bit mode, with 4GB of RAM, 
 using the HotSpot `server` VM, and in headless mode (without display, mouse 
 or keyboard).

 Below is a guide to the variables that you can override to set your own
 Java runtime configuration:

    JAVA           Set to the location of the Java executable you want to use. 
                   E.g. `java` to use the default Java, or
                   `/usr/java/latest/bin/java` to use the latest from Oracle or
                   OpenJDK.

    DATAMODEL      Set to `32` or `64`, to select 32 or 64-bit mode. To use 
                   64-bit mode you will need both a 64-bit OS and a 64-bit JRE 
                   (Java Runtime Environment) installation.

    USEMB          Set to the maximum amount of RAM (in MB) available to CRUSH.
                   E.g. `4000` for 4GB. Note, that when `DATAMODEL` is `32`, 
                   you this value must be somewhere below 2000. Thus, `1900` is
                   a good maximum value to use in 32-bit mode.  Due to the 
                   volume of full-rate HAWC+ data (> 500MB/min), you will need 
                   to configure Java with plenty of RAM.

    JVM            Usually set to `server` for Oracle or OpenJDK. If using 
                   IBM's Java, set it to "" (empty string). On ARM platforms, 
                   you probably get better performance using `jamvm` or 
                   `avian`. o see what VM options are available, run 
                   `java -help`. The VM options are listed near the top of the 
                   resulting help screen.

    EXTRAOPTS      Any other non-standard options you may want to pass to the 
                   Java VM should go here. Typically set to "".


 You can also specify environment variables, and add shell commands (bash),
 since these configuration files are in fact sourced as bash scripts before
 launching Java / CRUSH. For example you can add:

    CRUSH_NO_UPDATE_CHECK="1"
    CRUSH_NO_VM_CHECK="1" 

    echo "Will try to parse my own configuration now... "
	  
    if [ -f ~/mycrushconfig.sh ] ; then
        echo -n "OK"
        source ~/mycrushconfig.sh
    else
        echo -n "Not found"
    fi

 The above will disable update checking (not recommended!) and VM checking
 (also not recommended!) and will source the contents of  `~/mycrushconfig.sh` 
 if and when such a file exists.
 
   


### 2.4. Optional automatic pipeline configuration (skyhawc)

 Automatic pipeline reductions (such as in flight) should never hang if 
 possible.

 Unfortunately, there are two uncommon conditions that can cause CRUSH (Java, 
 really) to hang indefinitely. First, while trying to render a PNG output if 
 the X11 display connection had dropped unexpectedly. And second, while trying 
 to check for updates if the network had disconnected unexpectedly. 
   
 Both of these scenarios can be preemted by specifying appropriate runtime 
 options for running CRUSH reductions with limited scope.

 Simply (create and) edit a file: 

    ~/.crush2/startup/crush/autopipeline.conf

 (This will specify settings only for the `crush` executable, and will not
 affect other tools, like `imagetool` or `show`). Into this file add the 
 following lines:

    CRUSH_NO_UPDATE_CHECK="1"
    EXTRAOPTS="$EXTRAOPTS -Djava.awt.headless=true"

 The first will disable update checking (which can hang if the network 
 connection drops), while the second will run CRUSH in headless mode (assuming 
 no X11 rendering functionality), in addition to any startup options defined 
 for all programs, thereby avoiding hangs if and when PNG outputs are rendered. 

 Normal users, outside of the automatic pipeline, should probably not set these
 options. Update notification is a useful feature, letting users know if or 
 when improved CRUSH releases become available. And, while CRUSH does not 
 currently require on-screen rendering, it is possible that future releases may
 add graphical functionalities that users may want to access (but would not be 
 available in headless mode!). 


  


## 3. Quickstart guide

For SOFIA/HAWC+ CRUSH will be launched exclusively from the DRP pipeline. See 
the DRP documentation for details.

However, if you wish to run CRUSH manually, you may easily do so from the 
command-line with `hawc+` as your instrument. E.g.:

    ./crush hawc+ [...]

See the main README for more details.  



### 3.1. Locating scan data


#### By file name/path
  The default method of locating files is by file name, which may specify 
  either an absolute path, e.g.:

    > crush hawc+ /data/hawc+/F0004_HC_IMA_0_HAWC_HWPC_RAW_105.fits

  or it can be filename/path relative to `datapath`
 
    > crush hawc+ F0004_HC_IMA_0_HAWC_HWPC_RAW_105.fits

  The two are equilalent assuming that `datapath` is set to `/data/hawc+` in 
  the second case, e.g. in the user configuration file 
  `~/.crush2/hawc+/default.cfg`, or on the command-line.


#### By flight and scan numbers
   
  Often the simpler way of locating input files is by a combination of flight
  and scan numbers. This is often shorter, and allows to specify multiple scans
  and ranges with more ease.

  Scan lookup by flight and scan number requires you to set `datapath` to point
  to the data directory. E.g., by placing the line in the user configuration 
  for HAWC+ (`~/.crush2/hawc+/default.cfg`):

    datapath /data/hawc+

  Now, you may simply reduce scan 105 from flight 4 as:

    > crush hawc+ -flight=4 105

  You can also reduce multiple scans, from multiple flight together. E.g.:

    > crush hawc+ -flight=4 104-105 129 -flight=5 13 16 33-35

  The above will co-reduce 3 scans (104, 105, 129) from flight #4 with 5 scans
  (13, 16, 33, 34, 35) from flight #5.


 

### 3.2. A few common options to use with SOFIA/HAWC+

 The DRP interface to CRUSH allows manually specifying reduction options, which
 are passed to CRUSH verbetum as a single line. Each option in the line begins 
 with a dash `-`, and should not contain white spaces, unless these are 
 enclosed in quotes. E.g. below is a valid option line, with three options, one
 of which contains a white-space characters:

    -faint -name="My HAWC+ image.fits" -projection=TAN

 Below is a brief guide to a few useful options, grouped by functionality.


#### HAWC+ specific options

    -subarray=<list>    Restrict imaging to specific subarrays only. The 
                        argument is a comma separated list of subarray IDs
                        (R0, R1, T0, T1). E.g.:

                          > crush hawc+ -subarray=R0,T0 ...
   

#### Source type options
   
  The default reduction is generally OK for sources smaller than the field of 
  view (<FoV/2) with S/N in the 10--1000 range. Outside this range, the 
  following options can be used to obtain better results:


    -bright             Reduce very bright sources (S/N > 1000).

    -faint              Reduce faint sources (S/N < 30).

    -deep               Optimized for the extraction of deep-field point 
                        sources. It is similar to `-faint` (above) but it also 
                        spatially filters the map, removing all signals above a
                        few beam scales. Use only for very faint point sources.
    
    -extended           Reduce extended sources (>FoV/2). The retention of
                        scales larger than ~FoV/2 come at a price of increased 
                        map noise (on those scales). See Section 2.4 of the 
                        main README on the 'Recovery of Extended Emission'. Can
                        be used on its own (assuming the default brightness 
                        setting) or together with `-faint` or `-bright`.

     -sourcesize=X      Can be used together with `-extended` (above), to
                        tweak just how extended the source is expected to be.
                        The argument is an approximate source diameter in
                        arcseconds. E.g. `-sourcesize=300.0`. 

     -source.sign=Z     By default, CRUSH assumes that sources are seen in
                        emission (+), and biases the reduction as such to 
                        produce images without filter bowls or other negative 
                        reduction artifatcs. However, your object may contain 
                        absorption features, for which you may want ot bias in 
                        the opposite direction (-), or not bias at all (0).
                        Set the sign accordingly to +, -, or 0. E.g.
                        `-source.sign=+`


#### Output map options
  These options change how the output FITS image will be constructed. All 
  these options have reasonable default values, and so you should only use them
  to override those if needed.


    -grid=X             Set the pixelization of the map to X arcseconds. (The 
                        default pixelization is chosen to be be around 1/5th of
                        a beam for each HAWC+ band).

    -projection=XXX     Change the WCS spherical projection. The following
                        projections are supported:

                                SFL  --  Sanson-Flamsteed
                                SIN  --  Slant Orthographic
                                TAN  --  Gnomonic
                                ZEA  --  Zenithal Equal Area
                                MER  --  Mercator
                                CAR  --  Plate-Carree
                                AIT  --  Hammer-Aitoff
                                GLS  --  Global Sinusoidal
                                STG  --  Stereographic
                                ARC  --  Zenithal Equidistant

                        The default is SFL (Sanson-Flamsteed). E.g. 
                        `-projection=TAN`.

    -ecliptic           Produce maps in ecliptic coordinates, instead of the
                        default equatorial (same as `-system=ecliptic`).

    -galactic           Produce maps in galactic coordinates, instead of the
                        default equatorial (same as `-system=galactic`).

    -supergalactic      Produce maps in super-galactic coordinates, instead of 
                        the default equatorial (same as 
                        `-system=supergalactic`).

    -horizontal         Produce maps in horizontal coordinates, instead of
                        the default equatorial (same as `-system=horizontal`).

    -focalplane         Produce maps in focal-plane coordinates, instead of the
                        default equatorial (same as `-system=focalplane`).

    -final:smooth=X     Smooth the final map by a Gaussian with X arcsec FWHM.
                        Alternatively, X can be one of `minimal`, `halfbeam`
			`2/3beam` or `beam`. E.g. `-smooth=8.0` or 
			`-smooth=2/3beam`. To turn smoothing off completely
			use `-final:forget=smooth`.






## 4. Technical details for expert users

From this point on, the documentation is of more technical nature, intended
for expert users only.


### 4.1. HAWC+ specific pixel divisions

 For a general overview of channel divisions, please consult Section 3.
 (Correlated Signals) in the main README document.


    polarrays   Pixels of the the R and T polarization arrays, respectively.
		
    subarrays   Pixels of each of the 4 HAWC+ subarrays (40x32). Each subarray
                may contain correlated signals to themselves, e.g. do to
                correlated thermal fluctuations on their wafers.

    bias        Grouping of pixels by TES bias line. Each subarray has 20
                bias lines, each applied to two consecutive detectors rows.

    mux         A grouping of pixels based on their SQUID multiplexing scheme
                Each 4x8 pixel quadrant of the array is read out through the
                same SQUID amplifier. Therefore, it is not suprizing that 
                correlated signals are present on these quadrants. The
                decorrelating on `mux` groups is default in HAWC+ reductions

    rows        The HAWC+ multiplexing scheme is implemented in the time-domain
                Thus, the first channels of each SQUID are read out at the same
                time, followed by the second channel in each group etc. Thus,
                if there is any pickup of high-frequency signals in the
                multiplexing scheme, one could expect some correlated signals
                to be present on these multiplexer address lines. There
                is little evidence for these, but the reduction of very faint
                compact sources may benefit from the additional decorrelation
                on these groups.
                For HAWC+, these SQUID address lines are effectively the
                detectors rows, hence the naming.

    series      The grouping of pixels based on the series array through which
                they are read out.



### 4.2. Glossary of HAWC+ specific options

    band=X              Set the observing band to A, B, C, D, or E. Normally,
                        the band setting is automatic through the SPECTEL1
                        fits keyword. However, setting the band manually may
                        be useful for polling band specific settings. E.g.

                          > crush hawc+ -band=A -poll=beam

                        The above line will report the Gaussian FWHM beam size
                        (in arcsec) used when reducing band A (53um) data.
   
    biaslines           @Alias: 'correlated.bias'
                        @Expert
                        Decorrelate TES bias lines. All correlated modality 
                        suboptions apply.
                        @See: 'correlated.<?>'


    calibrated          Set this option when the reduction includes the final
                        calibration (opacities and other calibration
                        corrections) to produce Level 3 data. Otherwise, CRUSH
                        will produce Level 2 output.

    filter=<wavelength> @Expert
                        Sets the filter band to one of:

                          53um, 62um, 89um, 155um, or 216um

                        Normally, the filter is set automatically to the 
                        correct value based on the 'SPECTEL1' SOFIA header key.
                        For this reason, it is not recommended, nor trivial
                        for the user to override this automatic behaviour.
                        Rather, the setting of this option is useful for
                        setting conditional settings, which depend on the
                        HAWC+ waveband.

    fixjumps            @Expert
                        Enables ficing timestream blocks around flux jumps
                        in such a way that these will not cause problems.
                        @See: 'jumpdata'

    flight=N            Set the flight number for locating data files using
                        scan numbers only. Remember to set 'datapath' also to
                        specify the folder where scan files are stored.
                        @See: 'datapath'

    gyrocorrect         @Telescope: SOFIA
                        @Since: 2.41
                        @Advanced
                        Correct for gyro drifts based on guide-star relock
                        data stored in the scan headers. This isn't normally
                        needed when the gyros funtion properly. But,
                        occasionally, they drift a fair bit, and this option
                        can activate the correction scheme on demand.

    jumpdata=<path>     @Expert
                        @Since: 2.40
                        Specify the file containing the residual pixel jump
                        counts when flux jumps occur. The input file follows
                        the format by Darren with 3 columns: (1) The character 
                        'C' specifying that the value is per column, (2)
                        the column index (starting from 0), and (3) the
                        residual flux jump in readout counts.
                        @See: 'fixjumps'

    los                 @Alias: 'correlated.los'
                        @Since: 2.41
                        @Expert
                        Remove correlations with the second-derivative to the
                        telescope line-of-sight (LOS) angle. It's a good proxy
                        for removing pitch-type acceleration response from the
                        detector timestreams.
                        @See: 'correlated.<?>'

    mux                 @Alias: 'correlated.mux'
                        @Expert
                        Decorrelate on SQUID muxes. All correlated modality
                        suboptions apply.
                        @See: 'correlated.<?>'

    offset.R1=dx,dy
    offset.R2=dx,dy
    offset.T1=dx,dy
    offset.T2=dx,dy     @Expert
                        Specify the subarray offset (as dx,dy arcseconds in
                        the focal plane) from their nominal positions, for
                        both the first and second subarrays of the R and T
                        polarization arrays. For example, specifying zero
                        offsets for all (default) describes the focal plane
                        where R and T are perfectly aligned relative to
                        one another, and the two subarrays of each form a 
                        single seamless polarization array.

    peakflux            @Since: 2.41
                        Switch to peak-flux calibration instead of the default
			aperture flux calibration. Recommended for point 
			sources only.

    pixelsize=<a>[,<b>] @Expert
                        Specify the size of the pixels for calculating pixel 
                        positions based on a regular grid. A better way of 
                        setting the pixel positions is through the 'rcp' 
                        option. 
                        The argument can be either a lateral size (in arcsec) 
                        for square pixels, or two comma separated sizes for 
                        rectangular pixels.
                        @See: 'rcp', 'rotation', 'pcenter'

    pols                @Alias: 'correlated.polarrays'
                        @Expert
                        Decorrelate each polarization array separately. All 
                        correlated modality sub-options apply.
                        @See: 'correlated.<?>'

    roll                @Alias: 'correlated.roll'
                        @Since: 2.41
                        @Expert
                        Remove correlations with the second-derivative of the
                        aircraft roll angle (roll-type accelerations).
                        @See: 'correlated.<?>'

    rotation=<deg>      @Expert
                        Specify the array rotation (in degrees), when pixel 
                        positions are calculated from a regular grid. A better 
                        way is to specify pixel positions via the 'rcp' option 
                        their rotation via 'rcp.rotate'.
                        @See: 'rcp', 'rcp.rotate', 'pixelsize'

    rotation.T=<deg>    @Expert
                        Specify the rotation of the T polarization subarray
                        relative to the R subarray.

    rows                @Alias: 'correlated.rows'
                        @Expert
                        Decorrelate along the 'row' direction of the arrays,
                        the same as SQUID address lines. All correlated 
                        modality sub-options apply.
                        @See: 'correlated.<?>'

    rtoc                @Expert
                        @Since: 2.33
                        Instruct crush to reference maps to Real-Time Object 
                        Coordinates (RTOC) for sidereal and non-sidereal
                        sources alike. Normally, sidereal object coordinates
                        are determined via the header keywords OBSRA/OBSDEC or
                        OBJRA/OBJDEC. However, these were not always filled
                        correctly during the 2016 October flights, so this
                        option provides a workaround for those scans.

    series              @Alias: 'correlated.series'
                        @Expert
                        Decorrelate on the series arrays. It seems that the
                        series array (at 4K) is sensitive to some level of
                        thermal fluctuation, and enabling decorrelation on
                        these can improve imaging quality.

    subarray=<list>     @Expert
                        Restrict the reduction only to the subarrays listed.
                        The argument is a comma-separated list of subarray 
                        codes: R1, R2, T1, T2 or R (= R1,R2) or T (= T1,T2). 
                     
                          > crush hawc+ -subarray=R1,T1 [...]

    write.flatfield[=path]      @Expert
                                Write a DRP flatfield FITS file, to be used by
                        the chop-nod pipeline. The optional argument can 
                        specify the FITS file's name. Otherwise, a default
                        name is used, containing the scan's ID, and placed in
                        the the directory specified by 'outpath'.
                        The file format is specified by Marc Berthoud.
                        @See: 'outpath'


### 4.3. HAWC+ specific log quantities


    ac.airspeed         (km/h) Airspeed.
    ac.alt              (m) Altitude.
    ac.altkft           (kft) Altitude.
    ac.dir              (deg) Direction of heading.
    ac.gndspeed         (km/h) Groundspeed
    ac.lat              (rad) Geodetic latitude
    ac.latd             (deg) Geodetic latitude
    ac.lon              (ra) Geodetic longitude
    ac.lond             (deg) Geodetic longitude
    ac.trkangle         (rad) Tracking angle

    array.angle
    array.ave
    array.sibsx         
    array.sibsy

    chop.amp            (arcsec) Chop amplitude
    chop.angle		
    chop.flag           'C' if chopping or '-' if not
    chop.frequency
    chop.func
    chop.mode
    chop.profile
    chop.src
    chop.sys
    chop.tilt
    chop.tip

    env.tamb
    env.pwv             (um) Precipitable Water Vapor level
    env.sect            (C) Secondary mirror temperature.
    env.t1              (C) T1 temperature of the primary.
    env.t2              (C) T2 temperature of the primary.
    env.t2              (c) T3 temperature of the primary.
    
    inst.bw		Instrument bandwidth
    inst.cfg            Instrument configuration
    inst.datatype
    inst.exp
    inst.hwver          Hardware version
    inst.inttime
    inst.mode
    inst.slit
    inst.spec1          First spectral element (from SPECTEL1)
    inst.spec2          Second spectral element (from SPECTEL2)
    inst.swver          Software version
    inst.wave

    mssn.id             SOFIA Mission ID.
    mssn.leg            Flight leg number
    mssn.plan           Flight plan ID.

    nod.amp             (arcsec) Nod amplitude
    nod.angle
    nod.dwell
    nod.dx
    nod.dy
    nod.n
    nod.pattern
    nod.pos
    nod.settle
    nod.style
    nod.sys

    obs.aor             SOFIA AOR ID
    obs.aot		SOFIA AOT ID
    obs.dict            FITS keyword dictionary version ID.
    obs.err
    obs.fgid            File group ID.
    obs.imgid           Image ID
    obs.lst             (s) LST seconds.
    obs.lsth            (h) LST hours
    obs.mjd             (day) Modified Julian Date
    obs.obj             Object name
    obs.objtype         Object type
    obs.obsid           Observation ID.
    obs.serial
    obs.src

    orig.creator
    orig.file
    orig.observer       Name(s) of observer(s) or PI(s).
    orig.operator       Name(s) of the operator(s).
  
    pnt.dSIBSX          (pixels) SIBS pointing increment in X
    pnt.dSIBSY		(pixels) SIBS pointinh increment in Y 

    proc.head
    proc.level
    proc.nspec
    proc.product
    proc.q
    proc.quality

    tel.focus           (um) Telescope z-focus value
    tel.bdec            Boresight declination
    tel.bra             Boresight RA
    tel.cfg             
    tel.el              Telescope elevation
    tel.epoch           Epoch for equatorial coordinates (e.g. 2000.0)
    tel.fbc
    tel.los             Telescope line-of-sight angle
    tel.moonang         Angular distnce to the Moon
    tel.rdec            Requested declination
    tel.rew             
    tel.rra             Requested RA
    tel.sunang          Angular distance to the Sun
    tel.trkerr
    tel.trkmode
    tel.vhelio          Radial velocity relative to the Sun.
    tel.vlsr            LSR velocity
    tel.vpa             Vertical position angle (i.e. parallactic angle)
    tel.xel             Telescope cross-elevation angle
    tel.za              Telescope zenith angle

------------------------------------------------------------------------------
Copyright (C)2018 -- Attila Kovacs <attila[AT]sigmyne.com>


