def parse(file_path, convert_neg_666=True, rid=None, cid=None,
          ridx=None, cidx=None, row_meta_only=False, col_meta_only=False, make_multiindex=False):
    """
    The main method.

    Args:
        - file_path (string): full path to gct(x) file you want to parse
        - convert_neg_666 (bool): whether to convert -666 values to numpy.nan
            (see Note below for more details). Default = False.
        - rid (list of strings): list of row ids to specifically keep from gct. Default=None.
        - cid (list of strings): list of col ids to specifically keep from gct. Default=None.
        - ridx (list of integers): only read the rows corresponding to this
            list of integer ids. Default=None.
        - cidx (list of integers): only read the columns corresponding to this
            list of integer ids. Default=None.
        - row_meta_only (bool): Whether to load data + metadata (if False), or
            just row metadata (if True) as pandas DataFrame
        - col_meta_only (bool): Whether to load data + metadata (if False), or
            just col metadata (if True) as pandas DataFrame
        - make_multiindex (bool): whether to create a multi-index df combining
            the 3 component dfs

    Returns:
        - myGCToo (GCToo object): A GCToo instance containing content of
            parsed gct file ** OR **
        - row_metadata (pandas df) ** OR ** col_metadata (pandas df)

    Note: why is convert_neg_666 even a thing?
        In CMap--for somewhat obscure historical reasons--we use "-666" as our null value
        for metadata. However (so that users can take full advantage of pandas' methods,
        including those for filtering nan's etc) we provide the option of converting these
        into numpy.nan values, the pandas default.

    """
    assert sum([row_meta_only, col_meta_only]) <= 1, (
        "row_meta_only and col_meta_only cannot both be requested.")

    nan_values = [
        "#N/A", "N/A", "NA", "#NA", "NULL", "NaN", "-NaN",
        "nan", "-nan", "#N/A!", "na", "NA", "None", "#VALUE!"]

    # Add "-666" to the list of NaN values
    if convert_neg_666:
        nan_values.append("-666")

    # Verify that the gct path exists
    if not os.path.exists(file_path):
        err_msg = "The given path to the gct file cannot be found. gct_path: {}"
        logger.error(err_msg.format(file_path))
        raise Exception(err_msg.format(file_path))
    logger.info("Reading GCT: {}".format(file_path))

    # Read version and dimensions
    (version, num_data_rows, num_data_cols,
     num_row_metadata, num_col_metadata) = read_version_and_dims(file_path)

    # Read in metadata and data
    (row_metadata, col_metadata, data) = parse_into_3_df(
        file_path, num_data_rows, num_data_cols,
        num_row_metadata, num_col_metadata, nan_values)

    # Create the gctoo object and assemble 3 component dataframes
    # Not the most efficient if only metadata requested (i.e. creating the
    # whole GCToo just to return the metadata df), but simplest
    myGCToo = create_gctoo_obj(file_path, version, row_metadata, col_metadata,
                               data, make_multiindex)
    # Subset if requested
    if (rid is not None) or (ridx is not None) or (cid is not None) or (cidx is not None):
        logger.info("Subsetting GCT... (note that there are no speed gains when subsetting GCTs)")
        myGCToo = sg.subset_gctoo(myGCToo, rid=rid, cid=cid, ridx=ridx, cidx=cidx)

    if row_meta_only:
        return myGCToo.row_metadata_df

    elif col_meta_only:
        return myGCToo.col_metadata_df

    else:
        return myGCToo
The main method.

    Args:
        - file_path (string): full path to gct(x) file you want to parse
        - convert_neg_666 (bool): whether to convert -666 values to numpy.nan
            (see Note below for more details). Default = False.
        - rid (list of strings): list of row ids to specifically keep from gct. Default=None.
        - cid (list of strings): list of col ids to specifically keep from gct. Default=None.
        - ridx (list of integers): only read the rows corresponding to this
            list of integer ids. Default=None.
        - cidx (list of integers): only read the columns corresponding to this
            list of integer ids. Default=None.
        - row_meta_only (bool): Whether to load data + metadata (if False), or
            just row metadata (if True) as pandas DataFrame
        - col_meta_only (bool): Whether to load data + metadata (if False), or
            just col metadata (if True) as pandas DataFrame
        - make_multiindex (bool): whether to create a multi-index df combining
            the 3 component dfs

    Returns:
        - myGCToo (GCToo object): A GCToo instance containing content of
            parsed gct file ** OR **
        - row_metadata (pandas df) ** OR ** col_metadata (pandas df)

    Note: why is convert_neg_666 even a thing?
        In CMap--for somewhat obscure historical reasons--we use "-666" as our null value
        for metadata. However (so that users can take full advantage of pandas' methods,
        including those for filtering nan's etc) we provide the option of converting these
        into numpy.nan values, the pandas default.