예제 #1
0
def schdefs(file_type):
    if file_type not in file_type_defaults:
        s.putout("SCHFILES: Unrecognized file type: {}".format(file_type))
        s.error("Programming problem")
        return ""
    default = file_type_defaults[file_type]
    return os.path.join(get_catalog_dir(), default)
예제 #2
0
def stmsg():
    s.schcon.readlog = False
    logfile = "sched.runlog"
    s.schsco.logfile = util.resize_string(logfile, s.schsco.logfile.itemsize,
                                          "logfile")
    open_stat = "OLD" if os.path.exists(logfile) else "NEW"
    error_msg, error_code = s.openwrap(parameter.ilog, logfile, "TEXT",
                                       open_stat)
    if error_code != 1:
        s.wlog(1, f"STMSG: CANNOT OPEN LOG FILE {logfile}")
        s.wlog(1, f"       Error text: {error_msg}")
        s.error(" Check why log file cannot be opened")

    s.wlog(1, " ")
    s.wlog(1, f"    Welcome to pySCHED version {pysched_version} " "based on ")
    s.wlog(
        1, f"    SCHED version: {s.vern.vernum:.6} "
        f"{util.f2str(s.verc.version)}")
    s.wlog(1, " ")
    s.wlog(
        1, "The manual is at http://www.aoc.nrao.edu/software/sched/"
        "index.html")
    s.wlog(
        1, "Bug reports, feature requests and other discussions can be "
        "posted on the GitHub page:")
    s.wlog(1, "    https://github.com/jive-vlbi/sched")
    s.wlog(
        1, f"pySCHED will use the catalogs under {checkout_dir} unless "
        "$SCHED is set.")
    s.wlog(1, f"Most run time messages will be in {logfile}")

    s.schsco.freqver = util.resize_string("None used",
                                          s.schsco.freqver.itemsize, "freqver")

    s.wlog(1, " ")
    s.wlog(1, f"Check 'sched.py -h' for command line paramters.")
    s.wlog(1, "Some useful commands to give now if running interactively:")
    s.wlog(1, "   SCHedule=<filename>    :  Specify input file.")
    s.wlog(
        1, "   PLOT                   :  Invokes uv, xy, rd, and uptime "
        "plotting.")
    s.wlog(
        1, "   FREQLIST=lowF,highF    :  Make frequency list (MHz).  "
        "Then exit.")
    s.wlog(1, "   EXIT                   :  Leave program.")
    s.wlog(
        1, "   /                      :  End of inputs - run program "
        "(or EXIT).")
    s.wlog(1, " ")

    if s.rdcatn.srcvel.shape[0] < s.schn2b.freq.shape[0]:
        s.errlog("STMSG: Programming error.  MVEL .LT. MAXCHN")
예제 #3
0
def srread_open(filename, stdin, select, thiscat):
    if select and s.schsou.msrc > 0:
        gotall = s.srcflg()
    else:
        gotall = False
    
    if ((filename.upper() == "NONE") or (gotall and not s.schcon.plot)):
        return

    try:
        f = open(filename, "r")
    except Exception as e:
        s.putout(str(e))
        s.error("Source catalog: {} not opened".format(filename))
    with f:
        return srread(key.KeyfileLister(f), stdin, select, thiscat)
예제 #4
0
def getsta(stdin, values, index, gotvex, mjd1):
    global last_station_file

    maxsta = StationCatalog.maxcat

    if s.schcon.debug and (index < 2):
        s.wlog(1, "GETSTA: starting.")
    if index == 0:
        last_station_file = ""

    station_file = util.expand_file_name(values["stafile"])
    s.schcst.stafile = util.resize_string(station_file,
                                          s.schcst.stafile.itemsize, "stafile")
    s.schcst.locafile = util.resize_string(
        util.expand_file_name(values["locfile"]), s.schcst.locafile.itemsize,
        "locfile")
    if (station_file.upper() != "NONE") and (station_file !=
                                             last_station_file):
        try:
            f = open(station_file, "r")
        except Exception as e:
            s.putout(str(e))
            s.error("Station catalog: {} not opened".format(station_file))
        else:
            with f:
                input_iterator = key.KeyfileLister(f)
                stread(input_iterator, stdin, mjd1)

    last_station_file = station_file

    if (index == 0) and (len(values["stations"]) == 0):
        s.errlog("GETSTA: No stations specified!")
    elif len(values["stations"]) == 0:
        s.schn2a.stascn[index] = s.schn2a.stascn[index - 1]
    else:
        s.schn2a.stascn[index] = False
        for station in values["stations"]:
            ksta, ista, doit = s.stano(station)
            if doit:
                if ksta == 0:
                    s.wlog(1, "GETSTA: Station {} not found in catalogs".\
                           format(station))
                    s.errlog("GETSTA: Note -- specify station catalog "
                             "before end of first scan input")

                if ista == 0:
                    s.schn1.nsta += 1
                    if s.schn1.nsta > maxsta:
                        s.errlog("'SCHIN: Too many stations!")
                    ista = s.schn1.nsta
                    s.schc1.staname[ista - 1] = s.schcst.station[ksta - 1]

                    s.schn1.stanum[ista - 1] = ksta
                    s.schsta.ischsta[ksta - 1] = ista

                    control = bytes(s.schcst.control[s.schn1.stanum[ista-1]]).\
                       decode().strip()
                    if control == "VEX ":
                        gotvex = True

                    if control == "VSOP":
                        s.schcon.dovsop = True

                    if s.schc1.staname[ista - 1][:4] != b"VLBA":
                        s.schn5.allvlba = False
                    else:
                        s.schn1.gotvlba = True

                s.schn2a.stascn[index][ista - 1] = True

    return gotvex
예제 #5
0
def stread(input_iterator, stdin, mjd1):

    if input_iterator.input_ is stdin:
        infile = "Program_input"
        locfile = "NOLOC"
    else:
        infile = input_iterator.input_.name
        locfile = util.f2str(s.schcst.locafile)

    # 100 - 25: magic number copied from stread.f
    s.wlog(0,
           "STREAD:  Reading station catalog: {}".format(infile[-(100 - 25):]))
    s.wlog(0, "STREAD:  Reading locations file:  {}".format(locfile))

    if locfile.upper not in ("NONE", "NOLOC"):
        try:
            f = open(locfile, "r")
        except Exception as e:
            noloc = True
        else:
            with f:
                location_keyin_data = key.read_keyfile(f)
            noloc = False
    else:
        noloc = True

    mdb = s.rdcatn.dbx.shape[0]
    if (not noloc) and (len(location_keyin_data) > mdb):
        s.error(
            "RDLOC: Too many stations in location file. Max: {}".format(mdb))

    station_state_defaults = {
        "version": ["", util.noop],
    }
    station_record_defaults = {
        "station": ["NONAME", util.upper],
        "stcode": ["XX", util.noop],
        "dbname": ["", util.noop],
        "dbcode": ["", util.noop],
        "frame": ["XX", util.noop],
        "elev": [0., util.noop],
        "lat": [0., util.multiply_by(parameter.raddeg / 3600.)],
        "long": [0., util.multiply_by(parameter.raddeg / 3600.)],
        "zalim": [None, util.noop],
        "x": [0., util.noop],
        "y": [0., util.noop],
        "z": [0., util.noop],
        "dxdt": [0., util.noop],
        "dydt": [0., util.noop],
        "dzdt": [0., util.noop],
        "epoch": [0., util.noop],
        "descrip": ["", util.noop],
        "control": ["NONE", util.upper],
        "dar": ["NONE", util.noop],
        "recorder": ["NONE", util.noop],
        "ndrives": [2., util.noop],
        "nheads": [1., util.noop],
        "disk": ["", util.noop],
        # two spellings, disk has preference over disc
        "disc": ["NONE", util.noop],
        "disk": ["NONE", util.noop],
        "mediadef": ["NONE", util.noop],
        "nbbc": [8., util.noop],
        "dbbcver": ["ASTRO", util.noop],
        "hor_az": [[], util.noop],
        "hor_el": [[], util.noop],
        "ax1lim": [[-90., 450.], util.noop],
        "ax2lim": [[2., 90.], util.noop],
        "ax1rate": [1000., util.noop],
        "ax2rate": [1000., util.noop],
        "ax1acc": [[1000., 0], util.noop],
        "ax2acc": [[1000., 0], util.noop],
        "mount": ["ALTAZ", util.noop],
        "axistype": [0., util.noop],
        "axisoff": [0., util.noop],
        "tsettle": [0., util.noop],
        "minsetup": [0., util.noop],
        "tscal": ["GAP", util.upper],
        "maxsrchr": [1e6, util.noop],
        "tlevset": [0., util.noop],
        "endcat": [0., util.noop],
    }
    input_iterator.set_defaults(station_record_defaults,
                                station_state_defaults)

    location_state_defaults = {
        "version": ["Not known", util.noop],
    }

    location_record_defaults = {
        "dbname": ["", util.noop],
        "dbcode": ["", util.noop],
        "frame": ["", util.noop],
        "axistype": ["", util.noop],
        "axisoff": [0., util.noop],
        "x": [0., util.noop],
        "y": [0., util.noop],
        "z": [0., util.noop],
        "dxdt": [0., util.noop],
        "dydt": [0., util.noop],
        "dzdt": [0., util.noop],
        "epoch": [0., util.noop],
        "begin": [0., util.noop],
        "end": [1e5, util.noop],
    }

    locations = collections.defaultdict(list)
    if not noloc:
        for loc in location_keyin_data:
            values, present = util.merge_record_with_defaults(
                loc, location_record_defaults, location_state_defaults)
            locations[values["dbname"]].append(values)

    # warn about location close together with time overlap
    # don't warn about known cases
    compare_locations = [
        loc for loc in sum(locations.values(), []) if loc["dbname"] not in (
            "MIAMI20", "SINTOTU") and not loc["dbname"].startswith("VLA")
    ]
    for loc_a, loc_b in itertools.combinations(compare_locations, 2):
        separation = math.sqrt(sum([(loc_a[d] - loc_b[d])**2 for d in "xyz"]))
        time_overlap = (min(loc_a["end"], loc_b["end"]) > max(
            loc_a["begin"], loc_b["begin"]))
        if (separation < 10.) and time_overlap:
            s.wlog(
                0, "RDLOC:  Locations.dat stations {}   and {}   appear to "
                "be the same (time and position).  Sep (m):{:10.2f}".format(
                    loc_a["dbname"], loc_b["dbname"], separation))

    # update the station values with station and location file catalog values
    station_catalog = StationCatalog()

    warnxyz = True
    locwarn = True
    # map from station catalog entry attributes to keyin keywords
    attribute_to_key = dict(
        zip(station_catalog.attributes, station_catalog.attributes))
    attribute_to_key.update({
        "long_bn": "long",
        "horaz": "hor_az",
        "horel": "hor_el",
        "xpos": "x",
        "ypos": "y",
        "zpos": "z",
        "dxpos": "dxdt",
        "dypos": "dydt",
        "dzpos": "dzdt",
        "mjdrate": "epoch",
        "axoff": "axisoff",
        "stndriv": "ndrives"
    })

    start = int(s.schsta.msta)
    index = start
    seen = set(entry.station for entry in station_catalog.entries[:index])
    for record in input_iterator:
        station_values, present = util.merge_record_with_defaults(
            record, station_record_defaults, station_state_defaults)
        if "endcat" in present:
            break

        if index >= len(station_catalog.entries):
            s.errlog(" STREAD: Too many stations in catalog, max {} "
                     " Last station: {}".format(
                         len(station_catalog.entries),
                         station_catalog.entries[-1].station))

        if station_values["station"] in seen:
            s.wlog(0, "STREAD:  Ignoring extra station catalog entry for {}".\
                   format(station_values["station"]))
            continue
        else:
            seen.add(station_values["station"])

        # disc/disk confusion cases
        if "disk" not in present:
            station_values["disk"] = station_values["disc"]
        if station_values["mediadef"] == "DISC":
            station_values["mediadef"] = "DISK"

        # copy all values to the common block placeholder
        entry = station_catalog.entries[index]
        entry.set_keyin_values(station_values, attribute_to_key)

        entry.stcodeu = entry.stcode.upper()

        # fill in x, y, z from elev, lat, long (or reverse)
        gotxyz = ((entry.xpos, entry.ypos, entry.zpos) != (0., 0., 0.))
        gotllh = ((entry.elev, entry.lat, entry.long_bn) != (0., 0., 0.))
        if gotxyz and gotllh and warnxyz:
            s.putout("RDSTA: Both XYZ and Lat/Long coordinates given for some "
                     "stations.")
            s.putout("       There is nothing to insure they agree.")
            warnxyz = False

        conversion_mode = None  # 0: llh -> xyz, 1: xyz -> llh
        if gotxyz and (not gotllh or (entry.elev > 1e6)):
            conversion_mode = 1
        elif gotllh and not gotxyz:
            conversion_mode = 0
        elif not gotllh and not gotxyz:
            if noloc or (len(locations) == 0):
                if locwarn:
                    if locfile.upper() == "NOLOC":
                        s.putout("RDSTA: **Cannot use locations catalog with "
                                 "in-line stations catalog.")
                    elif locfile.upper() != "NONE":
                        s.putout("RDSTA:  Could not open locations catalog: "
                                 "{}".format(locfile))
                    locwarn = False
                s.putout("RDSTA:   No coordinates for {}".format(
                    station_values["station"]))
            else:
                # get xyz from locations catalog
                station_locations = locations.get(station_values["dbname"])
                if station_locations is not None:
                    for location in station_locations:
                        if location["begin"] <= mjd1 < location["end"]:
                            for attribute in [
                                    "xpos", "ypos", "zpos", "dxpos", "dypos",
                                    "dzpos", "mjdrate", "axoff"
                            ]:
                                setattr(entry, attribute,
                                        location[attribute_to_key[attribute]])
                            conversion_mode = 1
                            break
                if conversion_mode is None:
                    s.putout("RDSTA: No coordinates in stations or locations "
                             "file for {} dbname: {}".format(
                                 station_values["station"],
                                 station_values["dbname"]))
                    s.putout("RDSTA: Check date range in addition to names.")

        if conversion_mode is not None:
            (entry.long_bn, entry.lat, entry.elev,
             entry.xpos, entry.ypos, entry.zpos, ier) = \
                s.geoxyz(conversion_mode,
                         entry.long_bn, entry.lat, entry.elev,
                         entry.xpos, entry.ypos, entry.zpos)
            if ier != 0:
                s.putout("RDSTA: Problem with coordinate conversions for {}".\
                         format(station_values["station"]))

        if entry.ax1acc[1] == 0:
            entry.ax1acc[1] = entry.ax1acc[0]
        if entry.ax2acc[1] == 0:
            entry.ax2acc[1] = entry.ax2acc[0]

        entry.naxlim = min(len(entry.ax1lim), len(entry.ax2lim)) // 2

        if "zalim" not in present:
            if entry.mount == "ALTAZ":
                entry.zalim = 90. - entry.ax2lim[0]
            else:
                entry.zalim = 90.

        control = station_values["control"]
        entry.vlbadar = ((len(control) >= 5) and (control[4] == 'V'))

        dar = station_values["dar"]
        entry.useonsrc = ((dar.startswith("RDBE")
                           and control.startswith("VLBA"))
                          or ((dar == "WIDAR") and (control == "VEX")))

        def check(value, allowed, not_supported, station, element_type):
            if value not in allowed:
                s.errlog("STREAD: Invalid {} type {} for {}".format(
                    element_type, value, station))
            if value in not_supported:
                s.errlog("STREAD: {} type {} no longer supported by "
                         "SCHED.  Station: {}".format(
                             element_type[0].upper() + element_type[1:], value,
                             station))

        check(entry.control, ("VLA", "VLBA", "NRAO", "NRAOV", "SNAP", "VEX",
                              "SN50", "VSOP", "NONE"), ("SNAP", "SN50"),
              entry.station, "control")
        if entry.control.startswith("VLA"):
            s.errlog("STREAD: Control type VLA (old system card images) no "
                     "longer supported.  Use VEX.")

        check(entry.dar,
              ("VLBA", "RDBE", "RDBE2", "DBBC", "DBBC3", "VLBAG", "MKIV",
               "MKIII", "S2", "K4", "K5", "VERA", "VSOP", "VLBA4", "LBA",
               "R1002", "WIDAR", "CDAS", "eMERL", "NONE"), ("MKIII", "S2"),
              entry.station, "DAR")

        check(entry.recorder,
              ("VLBA", "MKIV", "VLBA4", "MKIII", "S2", "K4", "K5", "VERA",
               "VSOP", "MARK5A", "MARK5B", "MARK5C", "NONE"), ("MKIII", "S2"),
              entry.station, "recorder")

        check(entry.disk, ("MARK5A", "MARK5B", "MARK5C", "LBADR", "NONE"),
              tuple(), entry.station, "DISK")

        check(entry.mediadef, ("TAPE", "DISK", "NONE"), tuple(), entry.station,
              "MEDIADEF")

        if (entry.xpos, entry.ypos, entry.zpos) == (0., 0., 0.):
            s.errlog("STREAD: Location required for {}: infile={}, locfile={}".\
                     format(entry.station, infile, locfile))

        if entry.tscal not in ("CONT", "GAP"):
            s.errlog("STREAD: Unknown TSCAL for {}:  {}".format(
                entry.station, entry.tscal))

        index += 1

    s.schsta.msta = index

    s.schcst.stver = util.resize_string(station_state_defaults["version"][0],
                                        s.schcst.stver.itemsize, "version")
    s.schcst.locaver = util.resize_string(
        location_state_defaults["version"][0], s.schcst.locaver.itemsize,
        "version")

    station_catalog.write(range(start, index))