{"action":"created","comment":{"url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/pulls/comments/51487200","id":51487200,"diff_hunk":"@@ -0,0 +1,787 @@\n+/*****************************************************************************\n+FILE: create_angle_bands\n+\n+PURPOSE: Creates the Landsat 8 solar and view/satellite per-pixel angles.\n+Both the zenith and azimuth angles are created for each angle type for each\n+Landsat band or for the average of the Landsat reflective bands.\n+\n+PROJECT:  Land Satellites Data System Science Research and Development (LSRD)\n+at the USGS EROS\n+\n+LICENSE TYPE:  NASA Open Source Agreement Version 1.3\n+\n+NOTES:\n+*****************************************************************************/\n+#include <getopt.h>\n+#include <stdlib.h>\n+#include <stdio.h>\n+#include <string.h>\n+#include <time.h>\n+\n+#include \"error_handler.h\"\n+#include \"envi_header.h\"\n+#include \"parse_metadata.h\"\n+#include \"write_metadata.h\"\n+#include \"l8_angles.h\"\n+\n+/* Define the band information for each of the instruments.  Currently the\n+   maximum number of input bands is the number of bands for L8. */\n+#define MAX_NBANDS L8_NBANDS\n+#define L45_NBANDS 7\n+#define L7_NBANDS 8\n+\n+/* Define the solar/sensor angle band indices */\n+typedef enum\n+{\n+    SOLAR_ZEN = 0,\n+    SOLAR_AZ,\n+    SENSOR_ZEN,\n+    SENSOR_AZ,\n+    NANGLE_BANDS\n+} Angle_band_t;\n+\n+/******************************************************************************\n+MODULE: usage\n+\n+PURPOSE: Prints the usage information for this application.\n+\n+RETURN VALUE:\n+Type = None\n+\n+NOTES:\n+******************************************************************************/\n+void usage ()\n+{\n+    printf (\"create_angle_bands creates the Landsat solar and view \"\n+            \"(satellite) per-pixel angles for each band or for an average of \"\n+            \"the reflective bands.  Both the zenith and azimuth angles are \"\n+            \"created for each angle.  Values are written in degrees and scaled \"\n+            \"by 100.\\n\\n\");\n+    printf (\"usage: create_angle_bands \"\n+            \"--xml=input_metadata_filename\\n\"\n+            \"{--average}\");\n+\n+    printf (\"\\nwhere the following parameters are required:\\n\");\n+    printf (\"    -xml: name of the input XML metadata file wich follows the \"\n+            \"ESPA internal raw binary schema\\n\");\n+    printf (\"    -average: write the reflectance band averages instead of \"\n+            \"writing each of the band angles.\\n\\n\");\n+\n+    printf (\"\\nExample: create_angle_bands \"\n+            \"--xml=LC80470272013287LGN00.xml\\n\");\n+    printf (\"This writes a single band file for each of the bands for the \"\n+            \"solar azimuth/zenith and the satellite azimuth/zenith angles.\\n\");\n+\n+    printf (\"\\nExample: create_angle_bands \"\n+            \"--xml=LC80470272013287LGN00.xml --average\\n\");\n+    printf (\"This writes an average band file for the solar azimuth/zenith \"\n+            \"and the satellite azimuth/zenith angles.\\n\");\n+}\n+\n+\n+/******************************************************************************\n+MODULE:  get_args\n+\n+PURPOSE:  Gets the command-line arguments and validates that the required\n+arguments were specified.\n+\n+RETURN VALUE:\n+Type = int\n+Value           Description\n+-----           -----------\n+ERROR           Error getting the command-line arguments or a command-line\n+                argument and associated value were not specified\n+SUCCESS         No errors encountered\n+\n+NOTES:\n+  1. Memory is allocated for the input and output files.  All of these should\n+     be character pointers set to NULL on input.  The caller is responsible\n+     for freeing the allocated memory upon successful return.\n+******************************************************************************/\n+short get_args\n+(\n+    int argc,             /* I: number of cmd-line args */\n+    char *argv[],         /* I: string of cmd-line args */\n+    char **xml_infile,    /* O: address of input XML filename */\n+    bool *band_avg        /* O: should the reflectance band average be\n+                                processed? */\n+)\n+{\n+    int c;                           /* current argument index */\n+    int option_index;                /* index for the command-line option */\n+    static int avg_flag = 0;         /* flag to indicate if the band average\n+                                        should be processed */\n+    char errmsg[STR_SIZE];           /* error message */\n+    char FUNC_NAME[] = \"get_args\";   /* function name */\n+    static struct option long_options[] =\n+    {\n+        {\"average\", no_argument, &avg_flag, 1},\n+        {\"xml\", required_argument, 0, 'i'},\n+        {\"help\", no_argument, 0, 'h'},\n+        {0, 0, 0, 0}\n+    };\n+\n+    /* Loop through all the cmd-line options */\n+    opterr = 0;   /* turn off getopt_long error msgs as we'll print our own */\n+    while (1)\n+    {\n+        /* optstring in call to getopt_long is empty since we will only\n+           support the long options */\n+        c = getopt_long (argc, argv, \"\", long_options, &option_index);\n+        if (c == -1)\n+        {   /* Out of cmd-line options */\n+            break;\n+        }\n+\n+        switch (c)\n+        {\n+            case 0:\n+                /* If this option set a flag, do nothing else now. */\n+                if (long_options[option_index].flag != 0)\n+                    break;\n+     \n+            case 'h':  /* help */\n+                usage ();\n+                return (ERROR);\n+                break;\n+\n+            case 'i':  /* XML file */\n+                *xml_infile = strdup (optarg);\n+                break;\n+     \n+            case '?':\n+            default:\n+                sprintf (errmsg, \"Unknown option %s\", argv[optind-1]);\n+                error_handler (true, FUNC_NAME, errmsg);\n+                usage ();\n+                return (ERROR);\n+                break;\n+        }\n+    }\n+\n+    /* Make sure the infiles and outfiles were specified */\n+    if (*xml_infile == NULL)\n+    {\n+        sprintf (errmsg, \"Input XML file is a required argument\");\n+        error_handler (true, FUNC_NAME, errmsg);\n+        usage ();\n+        return (ERROR);\n+    }\n+\n+    /* Check the band average flag */\n+    if (avg_flag)\n+        *band_avg = true;\n+\n+    return (SUCCESS);\n+}\n+\n+\n+#define MAX_DATE_LEN 28\n+/******************************************************************************\n+MODULE:  main\n+\n+PURPOSE: Creates the Landsat solar and view/satellite per-pixel angles.  Both\n+the zenith and azimuth angles are created for each angle type for each\n+band.  An option is supported to write the average of the reflectance bands for\n+each angle instead of writing the angle for each band.\n+\n+RETURN VALUE:\n+Type = int\n+Value           Description\n+-----           -----------\n+ERROR           Error creating the angle bands\n+SUCCESS         No errors encountered\n+\n+NOTES:\n+1. Angles are written in degrees and scaled by 100.\n+2. There are 4 bands written per input band (or average): solar zenith, solar\n+   azimuth, sensor zenith, sensor azimuth.\n+3. Note this is a memory hog.  The goal here was to have an application to\n+   be able to write out the per-pixel angle bands for testing the per-pixel\n+   angles.  In order to make this a less memory hog, then break it down to\n+   process the solar angles, write the solar angles, process the\n+   satellite/sensor/view angles, and write the satellite/sensor/view angles.\n+******************************************************************************/\n+int main (int argc, char** argv)\n+{\n+    char FUNC_NAME[] = \"create_angle_bands\";  /* function name */\n+    char errmsg[STR_SIZE];       /* error message */\n+    char tmpstr[STR_SIZE];       /* temporary string */\n+    char tmpfile[STR_SIZE];      /* temporary filename */\n+    char ang_infile[STR_SIZE];   /* input angle coefficient filename */\n+    char outfile[STR_SIZE];      /* output base filename for angle bands */\n+    char production_date[MAX_DATE_LEN+1]; /* current date/year for production */\n+    char band_angle[NANGLE_BANDS][STR_SIZE] = {\"solar zenith\", \"solar azimuth\",\n+                                    \"sensor zenith\", \"sensor azimuth\"};\n+    char *cptr = NULL;           /* pointer to file extension */\n+    char *xml_infile = NULL;     /* input XML filename */\n+    bool band_avg = false;       /* should the reflectance band average be\n+                                    processed? */\n+    bool process_l8 = false;     /* are we processing L8 vs. L4-7 */\n+    bool process_l7 = false;     /* are we processing L7 vs. L4-5 or L8 */\n+    bool process_l45 = false;    /* are we processing L4-5 vs. L7 or L8 */\n+    int i;                       /* looping variable for bands */\n+    int count;                   /* number of chars copied in snprintf */\n+    int curr_band;               /* current input band number */\n+    int curr_bndx;               /* index of current input band */\n+    int nbands;                  /* number of input bands to be read */\n+    int out_nbands;              /* number of output bands to be written */\n+    int nlines[MAX_NBANDS];      /* number of lines for each band */\n+    int nsamps[MAX_NBANDS];      /* number of samples for each band */\n+    int avg_nlines;              /* number of lines for band average */\n+    int avg_nsamps;              /* number of samples for band average */\n+    int l7_bands[] = {1, 2, 3, 4, 5, 61, 62, 7, 8}; /* Landsat 7 band numbers */\n+    Angle_band_t ang;            /* looping variable for solar/senor angle */\n+    ANGLES_FRAME frame[MAX_NBANDS];   /* image frame info for each band */\n+    short *solar_zenith[MAX_NBANDS];  /* array of pointers for the solar zenith\n+                                         angle array, one per band */\n+    short *solar_azimuth[MAX_NBANDS]; /* array of pointers for the solar azimuth\n+                                         angle array, one per band */\n+    short *sat_zenith[MAX_NBANDS];    /* array of pointers for the satellite\n+                                         zenith angle array, one per band */\n+    short *sat_azimuth[MAX_NBANDS];   /* array of pointers for the satellite\n+                                         azimuth angle array, one per band */\n+    short *curr_angle = NULL;      /* pointer to the current angle array */\n+    ANGLES_FRAME avg_frame;        /* image frame info for band average */\n+    short *avg_solar_zenith=NULL;  /* array for solar zenith angle average */\n+    short *avg_solar_azimuth=NULL; /* array for solar azimuth angle average */\n+    short *avg_sat_zenith=NULL;    /* array for satellite zenith angle avg */\n+    short *avg_sat_azimuth=NULL;   /* array for satellite azimuth angle avg */\n+    time_t tp;                     /* time structure */\n+    struct tm *tm = NULL;          /* time structure for UTC time */\n+    FILE *fptr=NULL;               /* file pointer */\n+    Envi_header_t envi_hdr;        /* output ENVI header information */\n+    Espa_internal_meta_t xml_metadata;\n+                                   /* XML metadata structure to be populated by\n+                                      reading the input XML metadata file */\n+    Espa_band_meta_t *bmeta=NULL;    /* pointer to array of bands metadata */\n+    Espa_global_meta_t *gmeta=NULL;  /* pointer to the global metadata struct */\n+    Espa_band_meta_t *out_bmeta = NULL; /* band metadata for angle bands */\n+    Espa_internal_meta_t out_meta;      /* output metadata for angle bands */\n+\n+    /* Read the command-line arguments */\n+    if (get_args (argc, argv, &xml_infile, &band_avg) != SUCCESS)\n+    {   /* get_args already printed the error message */\n+        exit (ERROR);\n+    }\n+\n+    /* Validate the input metadata file */\n+    if (validate_xml_file (xml_infile) != SUCCESS)\n+    {  /* Error messages already written */\n+        return (ERROR);\n+    }\n+\n+    /* Initialize the metadata structure */\n+    init_metadata_struct (&xml_metadata);\n+\n+    /* Parse the metadata file into our internal metadata structure; also\n+       allocates space as needed for various pointers in the global and band\n+       metadata */\n+    if (parse_metadata (xml_infile, &xml_metadata) != SUCCESS)\n+    {  /* Error messages already written */\n+        return (ERROR);\n+    }\n+    bmeta = xml_metadata.band;\n+    gmeta = &xml_metadata.global;\n+\n+    /* Determine if L8 is being processed */\n+    if (!strncmp (gmeta->instrument, \"OLI\", 3))\n+        process_l8 = true;\n+    else if (!strncmp (gmeta->instrument, \"ETM\", 3))\n+        process_l7 = true;\n+    else\n+        process_l45 = true;\n+\n+    /* Determine the angle coefficient filename and the output file basename */\n+    strcpy (ang_infile, xml_infile);\n+    cptr = strchr (ang_infile, '.');\n+    strcpy (cptr, \"_ANG.txt\");\n+\n+    strcpy (outfile, xml_infile);\n+    cptr = strchr (outfile, '.');\n+    *cptr = '\\0';\n+\n+    /* Initialize the output metadata structure.  The global metadata will\n+       not be used and will not be valid. */\n+    init_metadata_struct (&out_meta);\n+\n+    /* Determine the number of input bands */\n+    if (process_l8)\n+        nbands = L8_NBANDS;\n+    else if (process_l7)\n+        nbands = L7_NBANDS;\n+    else\n+        nbands = L45_NBANDS;\n+\n+    /* Determine the number of output bands */\n+    if (band_avg)\n+        out_nbands = NANGLE_BANDS;\n+    else if (process_l8)\n+        out_nbands = L8_NBANDS * NANGLE_BANDS;\n+    else if (process_l7)\n+        out_nbands = L7_NBANDS * NANGLE_BANDS;\n+    else\n+        out_nbands = L45_NBANDS * NANGLE_BANDS;\n+\n+    /* Allocate memory for the output bands */\n+    if (allocate_band_metadata (&out_meta, out_nbands) != SUCCESS)\n+    {\n+        sprintf (errmsg, \"Cannot allocate memory for the %d angle bands\",\n+            out_nbands);\n+        error_handler (true, FUNC_NAME, errmsg);\n+        exit (ERROR);\n+    }\n+\n+    /* Get the current date/time (UTC) for the production date of each band */\n+    if (time (&tp) == -1)\n+    {\n+        sprintf (errmsg, \"Unable to obtain the current time.\");\n+        error_handler (true, FUNC_NAME, errmsg);\n+        exit (ERROR);\n+    }\n+\n+    tm = gmtime (&tp);\n+    if (tm == NULL)\n+    {\n+        sprintf (errmsg, \"Converting time to UTC.\");\n+        error_handler (true, FUNC_NAME, errmsg);\n+        exit (ERROR);\n+    }\n+\n+    if (strftime (production_date, MAX_DATE_LEN, \"%Y-%m-%dT%H:%M:%SZ\", tm) == 0)\n+    {\n+        sprintf (errmsg, \"Formatting the production date/time.\");\n+        error_handler (true, FUNC_NAME, errmsg);\n+        exit (ERROR);\n+    }\n+\n+    /* Process the solar/sensor angle bands */\n+    if (!band_avg)\n+    {\n+        /* Create the Landsat angle bands for all bands.  Create a full\n+           resolution product with a fill value of -9999 to match the Landsat\n+           image data. */\n+        if (process_l8)\n+        {  /* Landsat 8 */\n+            if (l8_per_pixel_angles (ang_infile, 1, -9999, \"ALL\", frame,\n+                solar_zenith, solar_azimuth, sat_zenith, sat_azimuth, nlines,\n+                nsamps) != SUCCESS)\n+            {  /* Error messages already written */\n+                exit (ERROR);\n+            }\n+        }\n+        else\n+        {  /* Landsat 4-7 */\n+           /* GAIL HANDLE THIS */\n+            sprintf (errmsg, \"Only Landsat 8 is currently supported\");\n+            error_handler (true, FUNC_NAME, errmsg);\n+            return (ERROR);\n+        }\n+\n+        /* Setup the XML file for these bands */\n+        for (i = 0; i < out_nbands; i++)\n+        {\n+            /* Set up the band metadata for the current band */\n+            out_bmeta = &out_meta.band[i];\n+            strcpy (out_bmeta->product, \"intermediate_data\");\n+            strcpy (out_bmeta->source, \"level1\");\n+            strcpy (out_bmeta->category, \"image\");\n+\n+            /* Setup filename-related items for all four bands: solar zenith,\n+               solar azimuth, sensor zenith, sensor azimuth.  L4-5 and L8 band\n+               numbers follow a normal numbering scheme.  L7 band numbering\n+               needs a little help to get it correct. */\n+            curr_band = i / NANGLE_BANDS + 1;  /* current input band number */\n+            curr_bndx = curr_band - 1;   /* index of current input band */\n+            if (process_l7)\n+                curr_band = l7_bands[curr_bndx];\n+            switch (i % NANGLE_BANDS)\n+            {\n+                case (SOLAR_ZEN):  /* solar zenith */\n+                    /* Determine the output file for the solar zenith band */\n+                    count = snprintf (tmpfile, sizeof (tmpfile),\n+                        \"%s_B%d_solar_zenith.img\", outfile, curr_band);\n+                    if (count < 0 || count >= sizeof (tmpfile))\n+                    {\n+                        sprintf (errmsg, \"Overflow of tmpfile\");\n+                        error_handler (true, FUNC_NAME, errmsg);\n+                        return (ERROR);\n+                    }\n+                    strcpy (out_bmeta->file_name, tmpfile);\n+                    sprintf (out_bmeta->name, \"solar_zenith_band%d\", curr_band);\n+                    strncpy (tmpstr, bmeta->short_name, 3);\n+                    sprintf (out_bmeta->short_name, \"%sSOLZEN\", tmpstr);\n+                    sprintf (out_bmeta->long_name,\n+                        \"band %d solar zenith angles\", curr_band);\n+                    break;\n+\n+                case (SOLAR_AZ):  /* solar azimuth */\n+                    /* Determine the output file for the solar azimuth band */\n+                    count = snprintf (tmpfile, sizeof (tmpfile),\n+                        \"%s_B%d_solar_azimuth.img\", outfile, curr_band);\n+                    if (count < 0 || count >= sizeof (tmpfile))\n+                    {\n+                        sprintf (errmsg, \"Overflow of tmpfile\");\n+                        error_handler (true, FUNC_NAME, errmsg);\n+                        return (ERROR);\n+                    }\n+                    strcpy (out_bmeta->file_name, tmpfile);\n+                    sprintf (out_bmeta->name, \"solar_azimuth_band%d\",\n+                        curr_band);\n+                    strncpy (tmpstr, bmeta->short_name, 3);\n+                    sprintf (out_bmeta->short_name, \"%sSOLAZ\", tmpstr);\n+                    sprintf (out_bmeta->long_name,\n+                        \"band %d solar azimuth angles\", curr_band);\n+                    break;\n+\n+                case (SENSOR_ZEN):  /* sensor zenith */\n+                    /* Determine the output file for the sensor zenith band */\n+                    count = snprintf (tmpfile, sizeof (tmpfile),\n+                        \"%s_B%d_sensor_zenith.img\", outfile, curr_band);\n+                    if (count < 0 || count >= sizeof (tmpfile))\n+                    {\n+                        sprintf (errmsg, \"Overflow of tmpfile\");\n+                        error_handler (true, FUNC_NAME, errmsg);\n+                        return (ERROR);\n+                    }\n+                    strcpy (out_bmeta->file_name, tmpfile);\n+                    sprintf (out_bmeta->name, \"sensor_zenith_band%d\",\n+                        curr_band);\n+                    strncpy (tmpstr, bmeta->short_name, 3);\n+                    sprintf (out_bmeta->short_name, \"%sSENZEN\", tmpstr);\n+                    sprintf (out_bmeta->long_name,\n+                        \"band %d sensor zenith angles\", curr_band);\n+                    break;\n+\n+                case (SENSOR_AZ):  /* sensor azimuth */\n+                    /* Determine the output file for the sensor azimuth band */\n+                    count = snprintf (tmpfile, sizeof (tmpfile),\n+                        \"%s_B%d_sensor_azimuth.img\", outfile, curr_band);\n+                    if (count < 0 || count >= sizeof (tmpfile))\n+                    {\n+                        sprintf (errmsg, \"Overflow of tmpfile\");\n+                        error_handler (true, FUNC_NAME, errmsg);\n+                        return (ERROR);\n+                    }\n+                    strcpy (out_bmeta->file_name, tmpfile);\n+                    sprintf (out_bmeta->name, \"sensor_azimuth_band%d\",\n+                        curr_band);\n+                    strncpy (tmpstr, bmeta->short_name, 3);\n+                    sprintf (out_bmeta->short_name, \"%sSENAZ\", tmpstr);\n+                    sprintf (out_bmeta->long_name,\n+                        \"band %d sensor azimuth angles\", curr_band);\n+                    break;\n+            }\n+\n+            out_bmeta->data_type = ESPA_INT16;\n+            out_bmeta->fill_value = -9999;\n+            out_bmeta->scale_factor = 0.01;","path":"raw_binary/tools/create_angle_bands.c","position":478,"original_position":478,"commit_id":"fea679c750f15b480d176e0365be2e9d783fd0af","original_commit_id":"fea679c750f15b480d176e0365be2e9d783fd0af","user":{"login":"gschmidt-usgs","id":12549375,"avatar_url":"https://avatars.githubusercontent.com/u/12549375?v=3","gravatar_id":"","url":"https://api.github.com/users/gschmidt-usgs","html_url":"https://github.com/gschmidt-usgs","followers_url":"https://api.github.com/users/gschmidt-usgs/followers","following_url":"https://api.github.com/users/gschmidt-usgs/following{/other_user}","gists_url":"https://api.github.com/users/gschmidt-usgs/gists{/gist_id}","starred_url":"https://api.github.com/users/gschmidt-usgs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gschmidt-usgs/subscriptions","organizations_url":"https://api.github.com/users/gschmidt-usgs/orgs","repos_url":"https://api.github.com/users/gschmidt-usgs/repos","events_url":"https://api.github.com/users/gschmidt-usgs/events{/privacy}","received_events_url":"https://api.github.com/users/gschmidt-usgs/received_events","type":"User","site_admin":false},"body":"Created #defines","created_at":"2016-02-01T21:54:25Z","updated_at":"2016-02-01T21:54:25Z","html_url":"https://github.com/USGS-EROS/espa-product-formatter/pull/25#discussion_r51487200","pull_request_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/pulls/25","_links":{"self":{"href":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/pulls/comments/51487200"},"html":{"href":"https://github.com/USGS-EROS/espa-product-formatter/pull/25#discussion_r51487200"},"pull_request":{"href":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/pulls/25"}}},"pull_request":{"url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/pulls/25","id":57558576,"html_url":"https://github.com/USGS-EROS/espa-product-formatter/pull/25","diff_url":"https://github.com/USGS-EROS/espa-product-formatter/pull/25.diff","patch_url":"https://github.com/USGS-EROS/espa-product-formatter/pull/25.patch","issue_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/issues/25","number":25,"state":"open","locked":false,"title":"Dev v1.6.0","user":{"login":"gschmidt-usgs","id":12549375,"avatar_url":"https://avatars.githubusercontent.com/u/12549375?v=3","gravatar_id":"","url":"https://api.github.com/users/gschmidt-usgs","html_url":"https://github.com/gschmidt-usgs","followers_url":"https://api.github.com/users/gschmidt-usgs/followers","following_url":"https://api.github.com/users/gschmidt-usgs/following{/other_user}","gists_url":"https://api.github.com/users/gschmidt-usgs/gists{/gist_id}","starred_url":"https://api.github.com/users/gschmidt-usgs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gschmidt-usgs/subscriptions","organizations_url":"https://api.github.com/users/gschmidt-usgs/orgs","repos_url":"https://api.github.com/users/gschmidt-usgs/repos","events_url":"https://api.github.com/users/gschmidt-usgs/events{/privacy}","received_events_url":"https://api.github.com/users/gschmidt-usgs/received_events","type":"User","site_admin":false},"body":"Ready for peer review","created_at":"2016-01-28T20:12:23Z","updated_at":"2016-02-01T21:54:25Z","closed_at":null,"merged_at":null,"merge_commit_sha":"4323630aa37c38518bbaff2a52cde480fba05f2c","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/pulls/25/commits","review_comments_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/pulls/25/comments","review_comment_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/pulls/comments{/number}","comments_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/issues/25/comments","statuses_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/statuses/fea679c750f15b480d176e0365be2e9d783fd0af","head":{"label":"USGS-EROS:dev_v1.6.0","ref":"dev_v1.6.0","sha":"fea679c750f15b480d176e0365be2e9d783fd0af","user":{"login":"USGS-EROS","id":12549192,"avatar_url":"https://avatars.githubusercontent.com/u/12549192?v=3","gravatar_id":"","url":"https://api.github.com/users/USGS-EROS","html_url":"https://github.com/USGS-EROS","followers_url":"https://api.github.com/users/USGS-EROS/followers","following_url":"https://api.github.com/users/USGS-EROS/following{/other_user}","gists_url":"https://api.github.com/users/USGS-EROS/gists{/gist_id}","starred_url":"https://api.github.com/users/USGS-EROS/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/USGS-EROS/subscriptions","organizations_url":"https://api.github.com/users/USGS-EROS/orgs","repos_url":"https://api.github.com/users/USGS-EROS/repos","events_url":"https://api.github.com/users/USGS-EROS/events{/privacy}","received_events_url":"https://api.github.com/users/USGS-EROS/received_events","type":"Organization","site_admin":false},"repo":{"id":36518318,"name":"espa-product-formatter","full_name":"USGS-EROS/espa-product-formatter","owner":{"login":"USGS-EROS","id":12549192,"avatar_url":"https://avatars.githubusercontent.com/u/12549192?v=3","gravatar_id":"","url":"https://api.github.com/users/USGS-EROS","html_url":"https://github.com/USGS-EROS","followers_url":"https://api.github.com/users/USGS-EROS/followers","following_url":"https://api.github.com/users/USGS-EROS/following{/other_user}","gists_url":"https://api.github.com/users/USGS-EROS/gists{/gist_id}","starred_url":"https://api.github.com/users/USGS-EROS/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/USGS-EROS/subscriptions","organizations_url":"https://api.github.com/users/USGS-EROS/orgs","repos_url":"https://api.github.com/users/USGS-EROS/repos","events_url":"https://api.github.com/users/USGS-EROS/events{/privacy}","received_events_url":"https://api.github.com/users/USGS-EROS/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/USGS-EROS/espa-product-formatter","description":"ESPA module for product formatting","fork":false,"url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter","forks_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/forks","keys_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/keys{/key_id}","collaborators_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/teams","hooks_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/hooks","issue_events_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/issues/events{/number}","events_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/events","assignees_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/assignees{/user}","branches_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/branches{/branch}","tags_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/tags","blobs_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/git/refs{/sha}","trees_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/git/trees{/sha}","statuses_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/statuses/{sha}","languages_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/languages","stargazers_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/stargazers","contributors_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/contributors","subscribers_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/subscribers","subscription_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/subscription","commits_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/commits{/sha}","git_commits_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/git/commits{/sha}","comments_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/comments{/number}","issue_comment_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/issues/comments{/number}","contents_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/contents/{+path}","compare_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/compare/{base}...{head}","merges_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/merges","archive_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/downloads","issues_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/issues{/number}","pulls_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/pulls{/number}","milestones_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/milestones{/number}","notifications_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/labels{/name}","releases_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/releases{/id}","deployments_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/deployments","created_at":"2015-05-29T17:15:13Z","updated_at":"2016-01-25T20:24:23Z","pushed_at":"2016-02-01T14:24:44Z","git_url":"git://github.com/USGS-EROS/espa-product-formatter.git","ssh_url":"git@github.com:USGS-EROS/espa-product-formatter.git","clone_url":"https://github.com/USGS-EROS/espa-product-formatter.git","svn_url":"https://github.com/USGS-EROS/espa-product-formatter","homepage":null,"size":814,"stargazers_count":3,"watchers_count":3,"language":"C","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":10,"mirror_url":null,"open_issues_count":6,"forks":10,"open_issues":6,"watchers":3,"default_branch":"master"}},"base":{"label":"USGS-EROS:master","ref":"master","sha":"d2a3cbae5dfdf69147fc1f5426dcad3657f10b08","user":{"login":"USGS-EROS","id":12549192,"avatar_url":"https://avatars.githubusercontent.com/u/12549192?v=3","gravatar_id":"","url":"https://api.github.com/users/USGS-EROS","html_url":"https://github.com/USGS-EROS","followers_url":"https://api.github.com/users/USGS-EROS/followers","following_url":"https://api.github.com/users/USGS-EROS/following{/other_user}","gists_url":"https://api.github.com/users/USGS-EROS/gists{/gist_id}","starred_url":"https://api.github.com/users/USGS-EROS/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/USGS-EROS/subscriptions","organizations_url":"https://api.github.com/users/USGS-EROS/orgs","repos_url":"https://api.github.com/users/USGS-EROS/repos","events_url":"https://api.github.com/users/USGS-EROS/events{/privacy}","received_events_url":"https://api.github.com/users/USGS-EROS/received_events","type":"Organization","site_admin":false},"repo":{"id":36518318,"name":"espa-product-formatter","full_name":"USGS-EROS/espa-product-formatter","owner":{"login":"USGS-EROS","id":12549192,"avatar_url":"https://avatars.githubusercontent.com/u/12549192?v=3","gravatar_id":"","url":"https://api.github.com/users/USGS-EROS","html_url":"https://github.com/USGS-EROS","followers_url":"https://api.github.com/users/USGS-EROS/followers","following_url":"https://api.github.com/users/USGS-EROS/following{/other_user}","gists_url":"https://api.github.com/users/USGS-EROS/gists{/gist_id}","starred_url":"https://api.github.com/users/USGS-EROS/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/USGS-EROS/subscriptions","organizations_url":"https://api.github.com/users/USGS-EROS/orgs","repos_url":"https://api.github.com/users/USGS-EROS/repos","events_url":"https://api.github.com/users/USGS-EROS/events{/privacy}","received_events_url":"https://api.github.com/users/USGS-EROS/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/USGS-EROS/espa-product-formatter","description":"ESPA module for product formatting","fork":false,"url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter","forks_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/forks","keys_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/keys{/key_id}","collaborators_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/teams","hooks_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/hooks","issue_events_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/issues/events{/number}","events_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/events","assignees_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/assignees{/user}","branches_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/branches{/branch}","tags_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/tags","blobs_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/git/refs{/sha}","trees_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/git/trees{/sha}","statuses_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/statuses/{sha}","languages_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/languages","stargazers_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/stargazers","contributors_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/contributors","subscribers_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/subscribers","subscription_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/subscription","commits_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/commits{/sha}","git_commits_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/git/commits{/sha}","comments_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/comments{/number}","issue_comment_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/issues/comments{/number}","contents_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/contents/{+path}","compare_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/compare/{base}...{head}","merges_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/merges","archive_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/downloads","issues_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/issues{/number}","pulls_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/pulls{/number}","milestones_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/milestones{/number}","notifications_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/labels{/name}","releases_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/releases{/id}","deployments_url":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/deployments","created_at":"2015-05-29T17:15:13Z","updated_at":"2016-01-25T20:24:23Z","pushed_at":"2016-02-01T14:24:44Z","git_url":"git://github.com/USGS-EROS/espa-product-formatter.git","ssh_url":"git@github.com:USGS-EROS/espa-product-formatter.git","clone_url":"https://github.com/USGS-EROS/espa-product-formatter.git","svn_url":"https://github.com/USGS-EROS/espa-product-formatter","homepage":null,"size":814,"stargazers_count":3,"watchers_count":3,"language":"C","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":10,"mirror_url":null,"open_issues_count":6,"forks":10,"open_issues":6,"watchers":3,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/pulls/25"},"html":{"href":"https://github.com/USGS-EROS/espa-product-formatter/pull/25"},"issue":{"href":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/issues/25"},"comments":{"href":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/issues/25/comments"},"review_comments":{"href":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/pulls/25/comments"},"review_comment":{"href":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/pulls/25/commits"},"statuses":{"href":"https://api.github.com/repos/USGS-EROS/espa-product-formatter/statuses/fea679c750f15b480d176e0365be2e9d783fd0af"}}}}