def parse_ligo_lw(file_contents, graceid):
    """Parse LIGO_LW XML and extract fields to store in the database."""
    fileobj = file_contents
    xmldoc = ligolw_utils.load_fileobj(fileobj, contenthandler=LIGOLWContentHandler)
    coinc_table_row = lsctables.CoincTable.get_table(xmldoc)[0]
    coinc_inspiral_row = lsctables.CoincInspiralTable.get_table(xmldoc)[0]
    sngl_inspiral_table = lsctables.SnglInspiralTable.get_table(xmldoc)
    extra_event_info = {
        k: getattr(coinc_table_row, k) for k in ("instruments", "likelihood")
    }
    extra_event_info.update(
        {
            k: getattr(coinc_inspiral_row, k)
            for k in ("combined_far", "ifos", "snr", "mchirp", "mass")
        }
    )
    fields = []
    for n, row in enumerate(sngl_inspiral_table):
        if n == 0:
            fields.append((graceid, "mass1", row.mass1))
            fields.append((graceid, "mass2", row.mass2))
            fields.append((graceid, "spin1z", row.spin1z))
            fields.append((graceid, "spin2z", row.spin2z))
        fields.append((graceid, "%s snr" % row.ifo, row.snr))
        fields.append((graceid, "%s chisq" % row.ifo, row.chisq))
        fields.append((graceid, "%s time" % row.ifo, float(row.end)))
    return fields, extra_event_info, xmldoc