#!/usr/bin/python
# $Id$
'''
Created on September 27th, 2012

@author: Denver Green
'''

USAGE = '''USAGE:

ET_minus_UT [options]

        Retrieves a file which reports the difference between Terrestrial Time (TT) 
        and Universal Time (UT1). It is a measure of the difference between a time 
        scale based on the rotation of the Earth (UT1) and an idealised uniform 
        timescale at the surface of the Earth (TT). TT is realised in practice by 
        TAI, International Atomic Time, where TT = TAI + 32.184 seconds. In order 
        to predict the circumstances of an event on the surface of the Earth such 
        as a solar eclipse, a prediction of Delta T must be made for that instant 
        of TT. 
'''
import logging
import optparse
import os.path
import re
import shutil
import sys
import tempfile 
import urllib2

import MOPS.Utilities as Utilities

class ETminusUT(object):
    
    #--------------------------------------------------------------------------   
    # Class variables.
    #--------------------------------------------------------------------------                  
    FAIL = 1
    SUCCESS = 0
    ETUT_SRC = "http://maia.usno.navy.mil/ser7/deltat.data"
    ETUT_NAME = "ET-UT.dat"
    
    #--------------------------------------------------------------------------   
    # Instance methods.
    #--------------------------------------------------------------------------              
    def __init__(self, workDir, logger=None):
        if (logger == None):
            self._logger = Utilities.getLogger()
        else:
            self._logger = logger
        # <-- end if

        self._workDir = workDir
    # <-- end __init__

    def get_etut(self):
        """
        Retrieves a file which reports the difference between Terrestrial Time (TT) 
        and Universal Time (UT1). It is a measure of the difference between a time 
        scale based on the rotation of the Earth (UT1) and an idealised uniform 
        timescale at the surface of the Earth (TT). TT is realised in practice by 
        TAI, International Atomic Time, where TT = TAI + 32.184 seconds. In order 
        to predict the circumstances of an event on the surface of the Earth such 
        as a solar eclipse, a prediction of Delta T must be made for that instant 
        of TT. 
        
        """
        out_fh = None
        in_fh = None  
        
        # get et-ut data file from http://maia.usno.navy.mil/ser7/deltat.data
        etut_file = self.get_file(ETminusUT.ETUT_SRC)
        if (etut_file == None): return None
        
        try:
            in_fh = open(etut_file, "r")
            lines = in_fh.readlines()
            out_fh = open(os.path.join(self._workDir, ETminusUT.ETUT_NAME), "w")
            
            # Add header lines to et-ut.dat
            out_fh.write("Values of DeltaT = ET - UT\n")
            out_fh.write("at 0h UT of the date (specified as day, month, year)\n")
            out_fh.write("from  The Astronomical Almanac 1999, pages K8-9 http://maia.usno.navy.mil/ser7/deltat.data\n")
            out_fh.write("----------------------------------------------\n")
            
            # Add entries for the period covering Jan 1, 1800 to Jan 1, 1973 as
            # this period is not included in the ET-UT.dat file downloaded from 
            # the USNO.
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1800", "13.7"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1801", "13.4"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1802", "13.1"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1803", "12.9"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1804", "12.7"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1805", "12.6"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1806", "12.5"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1816", "12.5"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1817", "12.4"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1818", "12.3"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1819", "12.2"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1820", "12.0"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1821", "11.7"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1822", "11.4"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1823", "11.1"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1824", "10.6"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1825", "10.2"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1826", "9.6"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1827", "9.1"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1828", "8.6"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1829", "8.0"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1830", "7.5"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1831", "7.0"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1832", "6.6"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1833", "6.3"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1834", "6.0"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1835", "5.8"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1836", "5.7"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1837", "5.6"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1838", "5.6"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1839", "5.6"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1840", "5.7"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1841", "5.8"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1842", "5.9"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1843", "6.1"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1844", "6.2"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1845", "6.3"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1846", "6.5"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1847", "6.6"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1848", "6.8"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1849", "6.9"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1850", "7.1"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1851", "7.2"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1852", "7.3"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1853", "7.4"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1854", "7.5"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1855", "7.6"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1856", "7.7"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1857", "7.7"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1858", "7.8"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1859", "7.8"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1860", "7.88"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1861", "7.82"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1862", "7.54"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1863", "6.97"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1864", "6.40"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1865", "6.02"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1866", "5.41"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1867", "4.10"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1868", "2.92"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1869", "1.82"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1870", "1.61"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1871", "0.10"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1872", "-1.02"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1873", "-1.28"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1874", "-2.69"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1875", "-3.24"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1876", "-3.64"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1877", "-4.54"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1878", "-4.71"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1879", "-5.11"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1880", "-5.40"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1881", "-5.42"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1882", "-5.20"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1883", "-5.46"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1884", "-5.46"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1885", "-5.79"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1886", "-5.63"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1887", "-5.64"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1888", "-5.80"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1889", "-5.66"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1890", "-5.87"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1891", "-6.01"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1892", "-6.19"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1893", "-6.64"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1894", "-6.44"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1895", "-6.47"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1896", "-6.09"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1897", "-5.76"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1898", "-4.66"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1899", "-3.74"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1900", "-2.72"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1901", "-1.54"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1902", "-0.02"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1903", "1.24"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1904", "2.64"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1905", "3.86"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1906", "5.37"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1907", "6.14"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1908", "7.75"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1909", "9.13"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1910", "10.46"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1911", "11.53"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1912", "13.36"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1913", "14.65"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1914", "16.01"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1915", "17.20"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1916", "18.24"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1917", "19.06"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1918", "20.25"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1919", "20.95"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1920", "21.16"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1921", "22.25"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1922", "22.41"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1923", "23.03"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1924", "23.49"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1925", "23.62"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1926", "23.86"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1927", "24.49"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1928", "24.34"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1929", "24.08"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1930", "24.02"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1931", "24.00"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1932", "23.87"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1933", "23.95"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1934", "23.86"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1935", "23.93"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1936", "23.73"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1937", "23.92"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1938", "23.96"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1939", "24.02"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1940", "24.33"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1941", "24.83"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1942", "25.30"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1943", "25.70"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1944", "26.24"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1945", "26.77"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1946", "27.28"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1947", "27.78"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1948", "28.25"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1949", "28.71"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1950", "29.15"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1951", "29.57"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1952", "29.97"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1953", "30.36"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1954", "30.72"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1955", "31.07"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1956", "31.35"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1957", "31.68"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1958", "32.18"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1959", "32.68"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1960", "33.15"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1961", "33.59"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1962", "34.00"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1963", "34.47"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1964", "35.03"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1965", "35.73"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1966", "36.54"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1967", "37.43"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1968", "38.29"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1969", "39.20"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1970", "40.18"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1971", "41.17"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1972", "42.23"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "1973", "43.37"))
    
            # Change the format of the date from year, month, day to day, month, year.
            for line in lines :
                year, month, day, deltaT = line.split()              
                out_fh.write("%s %s %s   %s\n" % (day, month.rjust(2), year, deltaT))
            # <-- end for
            
            # OORB requires that the ET-UT.dat file contains entries that covers all
            # epochs that can be processed. If the ET-UT.dat file does not contain
            # an entry that covers the epoch of the observation being processed then
            # you will get the following error.
            #
            # ***ERROR*** 19 Sep 2012 20:12:12UTC (Time / deltaT) TJM out of range
            # ***ERROR*** 19 Sep 2012 20:12:12UTC (Time / timescaleConversion) TRACE BACK (10)
            # ***ERROR*** 19 Sep 2012 20:12:12UTC (Time / getMJD) TRACE BACK (5)
            # ***ERROR*** 19 Sep 2012 20:12:12UTC (Observatories / getNutationAngles) TRACE BACK
            # ***ERROR*** 19 Sep 2012 20:12:12UTC (Observatories / equationOfEquinoxes) TRACE BACK
            # ***ERROR*** 19 Sep 2012 20:12:12UTC (Observatories / getGeocentricObservatoryCCoord) TRACE BACK (10)
            # ***ERROR*** 19 Sep 2012 20:12:12UTC (Observatories / getObservatoryCCoord) TRACE BACK (15)
            # ***ERROR*** 19 Sep 2012 20:12:12UTC (oorb / ephemeris) TRACE BACK (10)
            # To prevent this we will add lines that cover 2015 to 3000.
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "2015", "68.0"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "2020", "70.0"))        
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "2050", "114.0"))
            out_fh.write("%s %s %s   %s\n" % ("1", "1".rjust(2), "3000", "250.0"))
            self._logger.info("ET-UT: ET-UT.dat file creation complete.")
            return out_fh.name
        except Exception, e:
            self._logger.error("ET-UT: %s" % (str(e)))
            return None
        finally:
            if (out_fh): out_fh.close()
            if (in_fh): in_fh.close() 
            if (os.path.exists(etut_file)): os.remove(etut_file)      
        # <-- end try
    # <-- end def
    
    def get_file(self, file_url):  
        out_fh = None
        in_fh = None  
        
        # Strip off the file name portion of the file url.
        i = file_url.rfind('/')
        file_name = file_url[i+1:]
        out_file = os.path.join(self._workDir, file_name)
        self._logger.info("ET-UT: Downloading %s to %s." % (file_url, out_file))
        
        try: 
            # Retrieve file and save it to disk      
            in_fh = urllib2.urlopen(file_url)
    
            # Open file to which retrieved file will be written to    
            out_fh = open(out_file, 'w')
    
            for line in in_fh:
                out_fh.write(line)
            # <-- end for
            return out_fh.name
        except Exception, e:
            self._logger.error("ET-UT: %s" % (str(e)))
            return None
        finally:
            if (out_fh): out_fh.close()
            if (in_fh): in_fh.close()            
        # <-- end try   
    # <-- end def
# <-- end class 

#------------------------------------------------------------------------------
# Entry point.
#------------------------------------------------------------------------------
def main(args=sys.argv[1:]):

    parser = optparse.OptionParser(USAGE)

    parser.add_option('--dir',
                      action='store',
                      dest='workDir',
                      type='string',
                      default="/export/mops02.0/MOPS_DATA/ET-UT",
                      help="Directory to create updated ET-UT.dat file in.\n")
    parser.add_option('-v',
                      action='store_true',
                      dest='verbose',
                      default=False,
                      help="Prints extra information to log file.\n")                    
    
    # Get the command line options and also whatever is passed on STDIN.
    (options, args) = parser.parse_args()
    
    # Get logger and set logging level. Typically set level to info.
    # Add null handler to logger to avoid the No handlers could be found
    # for logger XXX error if a handler is not found in a higher level logger
    logger = Utilities.getLogger()
    if (options.verbose):
        logger.setLevel(logging.DEBUG)
    else:
        logger.setLevel(logging.INFO)
    # <-- end if
     
    logger.info("ET-UT: Starting ET-UT creation process.")
    etut = ETminusUT(options.workDir, logger)    
    dest = etut.get_etut()
    
    logger.info("ET-UT: ET-UT file was written to %s" % (dest))
# <-- end def

if __name__ == '__main__':
    sys.exit(main())
# <-- end if    