Skip to content
Snippets Groups Projects
Socet2ISIS.ipynb 11.4 KiB
Newer Older
  • Learn to ignore specific revisions
  •    "execution_count": null,
    
       "outputs": [],
    
        "import sys\n",
        "from functools import singledispatch\n",
    
        "import warnings\n",
    
        "\n",
        "import pandas as pd\n",
    
    Tyler Thatcher's avatar
    Tyler Thatcher committed
        "sys.path.insert(0, \"/home/tthatcher/Desktop/Projects/Plio/plio\")\n",
        "\n",
    
        "from plio.examples import get_path\n",
    
    Tyler Thatcher's avatar
    Tyler Thatcher committed
        "from plio.io.io_bae import read_gpf, read_ipf"
    
       ]
      },
      {
       "cell_type": "code",
    
       "execution_count": null,
    
       "metadata": {},
       "outputs": [],
       "source": [
    
        "# Reads a .atf file and outputs all of the \n",
        "# .ipf, .gpf, .sup, .prj, and path to locate the \n",
        "# .apf file (should be the same as all others) \n",
        "def read_atf(atf_file):\n",
        "    with open(atf_file) as f:\n",
        "\n",
        "        files = []\n",
        "        ipf = []\n",
        "        sup = []\n",
        "        files_dict = []\n",
        "        \n",
        "        # Grabs every PRJ, GPF, SUP, and IPF image from the ATF file\n",
        "        for line in f:\n",
        "            if line[-4:-1] == 'prj' or line[-4:-1] == 'gpf' or line[-4:-1] == 'sup' or line[-4:-1] == 'ipf' or line[-4:-1] == 'atf':\n",
        "                files.append(line)\n",
        "        \n",
        "        files = np.array(files)\n",
        "        \n",
        "        # Creates appropriate arrays for certain files in the right format\n",
        "        for file in files:\n",
        "            file = file.strip()\n",
        "            file = file.split(' ')\n",
        "\n",
        "            # Grabs all the IPF files\n",
        "            if file[1].endswith('.ipf'):\n",
        "                ipf.append(file[1])\n",
        "\n",
        "            # Grabs all the SUP files\n",
        "            if file[1].endswith('.sup'):\n",
        "                sup.append(file[1])\n",
        "\n",
        "            files_dict.append(file)\n",
        "\n",
        "        # Creates a dict out of file lists for GPF, PRJ, IPF, and ATF\n",
        "        files_dict = (dict(files_dict))\n",
        "        \n",
        "        # Sets the value of IMAGE_IPF to all IPF images\n",
        "        files_dict['IMAGE_IPF'] = ipf\n",
        "        \n",
        "        # Sets the value of IMAGE_SUP to all SUP images\n",
        "        files_dict['IMAGE_SUP'] = sup\n",
        "        \n",
        "        # Sets the value of PATH to the path of the ATF file\n",
        "        files_dict['PATH'] = os.path.dirname(os.path.abspath(atf_file))\n",
        "        \n",
    
    Tyler Thatcher's avatar
    Tyler Thatcher committed
        "        return files_dict"
    
       "execution_count": null,
    
    Tyler Thatcher's avatar
    Tyler Thatcher committed
       "metadata": {
        "scrolled": false
       },
    
       "outputs": [],
    
    Tyler Thatcher's avatar
    Tyler Thatcher committed
       "source": [
        "atf_dict = read_atf(get_path('CTX_Athabasca_Middle_step0.atf'))\n",
        "\n",
        "gpf_file = os.path.join(atf_dict['PATH'], atf_dict['GP_FILE']);\n",
        "ipf_list = [os.path.join(atf_dict['PATH'], i) for i in atf_dict['IMAGE_IPF']]\n",
        "\n",
        "gpf_df = read_gpf(gpf_file).set_index('point_id')\n",
        "ipf_df = read_ipf(ipf_list).set_index('pt_id')\n",
        "\n",
        "point_diff = ipf_df.index.difference(gpf_df.index)\n",
        "\n",
        "if len(point_diff) != 0:\n",
        "    warnings.warn(\"The following points found in ipf files missing from gpf file: \\n\\n{}. \\\n",
        "                  \\n\\nContinuing, but these points will be missing from the control network\".format(list(point_diff)))\n",
        "\n",
    
        "new_df = ipf_df.merge(gpf_df, left_index=True, right_index=True)"
    
    Tyler Thatcher's avatar
    Tyler Thatcher committed
       ]
      },
      {
       "cell_type": "code",
    
       "execution_count": null,
    
    Tyler Thatcher's avatar
    Tyler Thatcher committed
       "metadata": {},
    
    Tyler Thatcher's avatar
    Tyler Thatcher committed
       "outputs": [],
    
       "source": [
    
        "import math\n",
        "import pyproj\n",
    
        "\n",
    
        "# converts columns l. and s. to isis\n",
        "def line_sample_size(record):\n",
    
    Tyler Thatcher's avatar
    Tyler Thatcher committed
        "    with open(atf_dict['PATH'] + '/' + record['ipf_file'] + '.sup') as f:\n",
        "        for i, line in enumerate(f):\n",
        "            if i == 3:\n",
    
        "                line_size = line.split(' ')\n",
        "                line_size = line_size[-1].strip()\n",
        "                assert int(line_size) > 0, \"Line number {} from {} is a negative number: Invalid Data\".format(line_size, record['ipf_file'])\n",
        "                \n",
        "            if i == 4:\n",
        "                sample_size = line.split(' ')\n",
        "                sample_size = sample_size[-1].strip()\n",
        "                assert int(sample_size) > 0, \"Sample number {} from {} is a negative number: Invalid Data\".format(sample_size, record['ipf_file'])\n",
    
    Tyler Thatcher's avatar
    Tyler Thatcher committed
        "                break\n",
    
        "                \n",
        "        \n",
        "        line_size = int(line_size)/2.0 + record['l.'] + 1\n",
        "        sample_size = int(sample_size)/2.0 + record['s.'] + 1\n",
        "        return sample_size, line_size\n",
        "    \n",
        "# converts known to ISIS keywords\n",
    
    Tyler Thatcher's avatar
    Tyler Thatcher committed
        "def known(record):\n",
        "    if record['known'] == 0:\n",
        "        return 'Free'\n",
        "    \n",
        "    elif record['known'] == 1 or record['known'] == 2 or record['known'] == 3:\n",
        "        return 'Constrained'\n",
        "    \n",
        "# converts +/- 180 system to 0 - 360 system\n",
        "def to_360(num):\n",
        "    return num % 360\n",
        "\n",
        "# ocentric to ographic latitudes\n",
        "def oc2og(dlat, dMajorRadius, dMinorRadius):\n",
        "    try:    \n",
        "        dlat = math.radians(dlat)\n",
        "        dlat = math.atan(((dMajorRadius / dMinorRadius)**2) * (math.tan(dlat)))\n",
        "        dlat = math.degrees(dlat)\n",
        "    except:\n",
        "        print (\"Error in oc2og conversion\")\n",
        "    return dlat\n",
        "\n",
        "# ographic to ocentric latitudes\n",
        "def og2oc(dlat, dMajorRadius, dMinorRadius):\n",
        "    try:\n",
        "        dlat = math.radians(dlat)\n",
        "        dlat = math.atan((math.tan(dlat) / ((dMajorRadius / dMinorRadius)**2)))\n",
        "        dlat = math.degrees(dlat)\n",
        "    except:\n",
        "        print (\"Error in og2oc conversion\")\n",
        "    return dlat\n",
        "\n",
    
        "# gets eRadius and pRadius from a .prj file\n",
        "def get_axis(file):\n",
        "    with open(atf_dict['PATH'] + '/' + file) as f:\n",
    
    Tyler Thatcher's avatar
    Tyler Thatcher committed
        "        from collections import defaultdict\n",
        "\n",
        "        files = defaultdict(list)\n",
        "        \n",
        "        for line in f:\n",
        "            \n",
        "            ext = line.strip().split(' ')\n",
        "            files[ext[0]].append(ext[-1])\n",
        "            \n",
        "        eRadius = float(files['A_EARTH'][0])\n",
        "        pRadius = eRadius * (1 - float(files['E_EARTH'][0]))\n",
        "        \n",
        "        return eRadius, pRadius\n",
        "    \n",
        "# function to convert lat_Y_North to ISIS_lat\n",
    
        "def lat_ISIS_coord(record, semi_major, semi_minor):\n",
        "        ocentric_coord = og2oc(record['lat_Y_North'], semi_major, semi_minor)\n",
    
    Tyler Thatcher's avatar
    Tyler Thatcher committed
        "        coord_360 = to_360(ocentric_coord)\n",
        "        return coord_360\n",
        "\n",
        "# function to convert long_X_East to ISIS_lon\n",
    
        "def lon_ISIS_coord(record, semi_major, semi_minor):\n",
        "        ocentric_coord = og2oc(record['long_X_East'], semi_major, semi_minor)\n",
    
    Tyler Thatcher's avatar
    Tyler Thatcher committed
        "        coord_360 = to_360(ocentric_coord)\n",
        "        return coord_360\n",
        "\n",
    
        "def body_fix(record, semi_major, semi_minor):\n",
    
    Tyler Thatcher's avatar
    Tyler Thatcher committed
        "    ecef = pyproj.Proj(proj='geocent', a=semi_major, b=semi_minor)\n",
        "    lla = pyproj.Proj(proj='latlon', a=semi_major, b=semi_minor)\n",
        "    lon, lat, height = pyproj.transform(lla, ecef, record['long_X_East'], record['lat_Y_North'], record['ht'])\n",
    
        "    return lon, lat, height\n",
    
    Tyler Thatcher's avatar
    Tyler Thatcher committed
        "\n",
    
        "def socet2isis(prj_file):\n",
        "    eRadius, pRadius = get_axis(prj_file)\n",
        "    new_df['s.'], new_df['l.'] = (zip(*new_df.apply(sample_size, axis=1)))\n",
        "    new_df['known'] = new_df.apply(known, axis=1)\n",
        "    new_df['lat_Y_North'] = new_df.apply(lat_ISIS_coord, semi_major = eRadius, semi_minor = pRadius, axis=1)\n",
        "    new_df['long_X_East'] = new_df.apply(lon_ISIS_coord, semi_major = eRadius, semi_minor = pRadius, axis=1)\n",
        "    new_df['long_X_East'], new_df['lat_Y_North'], new_df['ht'] = zip(*new_df.apply(body_fix, semi_major = eRadius, semi_minor = pRadius, axis = 1))\n",
    
    Tyler Thatcher's avatar
    Tyler Thatcher committed
        "\n",
    
        "socet2isis('CTX_Athabasca_Middle.prj')"
       ]
      },
      {
       "cell_type": "code",
    
       "execution_count": null,
    
       "metadata": {},
    
       "outputs": [],
    
       "source": [
        "new_df"
    
    Tyler Thatcher's avatar
    Tyler Thatcher committed
       ]
      },
      {
       "cell_type": "code",
       "execution_count": null,
       "metadata": {},
       "outputs": [],
       "source": [
        "@singledispatch\n",
        "def read_ipf(arg):\n",
        "    return str(arg)\n",
        "# new_df['known'] = new_df.apply(known, axis=1)\n",
        "\n",
        "@read_ipf.register(str)\n",
        "def read_ipf_str(input_data):\n",
        "    \"\"\"\n",
        "    Read a socet ipf file into a pandas data frame\n",
        "\n",
        "    Parameters\n",
        "    ----------\n",
        "    input_data : str\n",
        "                 path to the an input data file\n",
        "\n",
        "    Returns\n",
        "    -------\n",
        "    df : pd.DataFrame\n",
        "         containing the ipf data with appropriate column names and indices\n",
        "    \"\"\"\n",
        "\n",
        "    # Check that the number of rows is matching the expected number\n",
        "    with open(input_data, 'r') as f:\n",
        "        for i, l in enumerate(f):\n",
        "            if i == 1:\n",
        "                cnt = int(l)\n",
        "            elif i == 2:\n",
        "                col = l\n",
        "                break\n",
        "                \n",
        "    columns = np.genfromtxt(input_data, skip_header=2, dtype='unicode',\n",
        "                            max_rows = 1, delimiter = ',')\n",
        "\n",
        "    # TODO: Add unicode conversion\n",
        "    d = [line.split() for line in open(input_data, 'r')]\n",
        "    d = np.hstack(np.array(d[3:]))\n",
        "    \n",
        "    d = d.reshape(-1, 12)\n",
        "    \n",
        "    df = pd.DataFrame(d, columns=columns)\n",
        "    file = os.path.split(os.path.splitext(input_data)[0])[1]\n",
        "    df['ipf_file'] = pd.Series(np.full((len(df['pt_id'])), file), index = df.index)\n",
        "\n",
        "    assert int(cnt) == len(df), 'Dataframe length {} does not match point length {}.'.format(int(cnt), len(df))\n",
        "    \n",
        "    # Soft conversion of numeric types to numerics, allows str in first col for point_id\n",
        "    df = df.apply(pd.to_numeric, errors='ignore')\n",
        "\n",
        "    return df\n",
        "\n",
        "@read_ipf.register(list)\n",
        "def read_ipf_list(input_data_list):\n",
        "    \"\"\"\n",
        "    Read a socet ipf file into a pandas data frame\n",
        "\n",
        "    Parameters\n",
        "    ----------\n",
        "    input_data_list : list\n",
        "                      list of paths to the a set of input data files\n",
        "\n",
        "    Returns\n",
        "    -------\n",
        "    df : pd.DataFrame\n",
        "         containing the ipf data with appropriate column names and indices\n",
        "    \"\"\"\n",
        "    frames = []\n",
        "\n",
        "    for input_file in input_data_list:\n",
        "        frames.append(read_ipf(input_file))\n",
        "\n",
        "    df = pd.concat(frames)\n",
        "\n",
        "    return df"
       ]
    
      }
     ],
     "metadata": {
      "kernelspec": {
       "display_name": "Python 3",
       "language": "python",
       "name": "python3"
      },
      "language_info": {
       "codemirror_mode": {
        "name": "ipython",
        "version": 3
       },
       "file_extension": ".py",
       "mimetype": "text/x-python",
       "name": "python",
       "nbconvert_exporter": "python",
       "pygments_lexer": "ipython3",
    
    Tyler Thatcher's avatar
    Tyler Thatcher committed
       "version": "3.6.4"