{ "cells": [ { "cell_type": "markdown", "id": "8a7686b2-9a56-4a0d-9527-9439278a1b6f", "metadata": {}, "source": [ "# Parse Curated CubIXSS Line List\n", "\n", "Athiray curated a line list for both MOXSI and SASS. This notebook cleans up this line list a bit and builds it into a machine readable format.\n", "It also adds a few additional lines." ] }, { "cell_type": "code", "execution_count": 1, "id": "bf44d454-f463-4af2-95c6-0cdce8d7b8ad", "metadata": {}, "outputs": [], "source": [ "import fiasco\n", "import astropy.io.ascii\n", "import copy\n", "import numpy as np\n", "import astropy.units as u\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "id": "9870dd9e-2caa-4cbf-b44c-ea6a9c2ef11f", "metadata": {}, "source": [ "## Additional Lines" ] }, { "cell_type": "code", "execution_count": 2, "id": "eff43fed-6cff-4f90-8dd5-6f93df1a499b", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "WARNING: No proton data available for Si 14. Not including proton excitation and de-excitation in level populations calculation. [fiasco.ions]\n" ] } ], "source": [ "si14 = fiasco.Ion('Si XIV', np.logspace(6,8,10000)*u.K)\n", "goft_si14 = si14.contribution_function(1e9*u.cm**(-3))\n", "# I selected this particular transition from the more complete line list\n", "transition = 6.1803998947143555 * u.AA\n", "i_transition = np.argmin(np.fabs(si14.transitions.wavelength[~si14.transitions.is_twophoton] - transition))\n", "goft_si14_select = goft_si14[..., i_transition].squeeze()" ] }, { "cell_type": "code", "execution_count": 3, "id": "8d0cf414-8679-4fd5-9257-7b9a43cb09c4", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(1e-28, 1e-24)" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(si14.temperature, goft_si14_select)\n", "plt.xscale('log')\n", "plt.yscale('log')\n", "plt.ylim(1e-28,1e-24)" ] }, { "cell_type": "markdown", "id": "82914a56-e156-4666-8c62-9d46e740477c", "metadata": {}, "source": [ "## Parse Table" ] }, { "cell_type": "code", "execution_count": 4, "id": "fefa1d58-429d-49df-9716-a930976d0bba", "metadata": {}, "outputs": [], "source": [ "def parse_grid_table(text):\n", " import docutils.statemachine\n", " import docutils.parsers.rst.tableparser\n", " # Clean up the input: get rid of empty lines and strip all leading and\n", " # trailing whitespace.\n", " lines = filter(bool, (line.strip() for line in text.splitlines()))\n", " parser = docutils.parsers.rst.tableparser.GridTableParser()\n", " return parser.parse(docutils.statemachine.StringList(list(lines)))" ] }, { "cell_type": "code", "execution_count": 5, "id": "e1f60f1d-48b4-46ac-8e10-96be4917e5d2", "metadata": {}, "outputs": [], "source": [ "athiray_line_table = \"\"\"\n", "+------+---------------+-------+----------+--------+---------+-------+\n", "| **I | **Wavelength | **Di | **Inst** | **Peak | **Peak | **Sen |\n", "| on** | (A)** | agnos | | Emis | Emi | sitiv |\n", "| | | tic** | | sivity | ssivity | ity** |\n", "| | | | | Temp | Temp | |\n", "| | | | | (Maxw | (k=2)** | |\n", "| | | | | ell)** | | |\n", "+======+===============+=======+==========+========+=========+=======+\n", "| Fe | 1.86 | T | SASS | 7.5 | 7.5 | FL |\n", "| XXV | | | | | | |\n", "+------+---------------+-------+----------+--------+---------+-------+\n", "| Ca | 3.21 | T | SASS | 7.4 | 7.5 | FL |\n", "| XIX | | | | | | |\n", "+------+---------------+-------+----------+--------+---------+-------+\n", "| Si | 6.74 | T | SAS | 7. | 7.1 | FL |\n", "| XIII | | | S/MOXSI? | | | |\n", "+------+---------------+-------+----------+--------+---------+-------+\n", "| Mg | 8.419 | T | SAS | 7. | 7.2 | FL |\n", "| XII | | | S/MOXSI? | | | |\n", "+------+---------------+-------+----------+--------+---------+-------+\n", "| Mg | 9.169, 9.314 | T | MOXSI | 6.8 | 7.0 | FL/AR |\n", "| XI | | | | | | |\n", "+------+---------------+-------+----------+--------+---------+-------+\n", "| Fe | 11.2 | T, κ | MOXSI | 6.8 | 6.9 | FL/AR |\n", "| XVII | 5,15.015,15.2 | | | | | |\n", "| | 5,16.78,17.05 | | | | | |\n", "+------+---------------+-------+----------+--------+---------+-------+\n", "| Fe | 12.83 | T | MOXSI | 7 | 7.2 | FL |\n", "| XX | | | | | | |\n", "+------+---------------+-------+----------+--------+---------+-------+\n", "| Ne | 13.447,13.669 | T, κ | MOXSI | 6.6 | 6.7 | FL/AR |\n", "| IX | | | | | | |\n", "+------+---------------+-------+----------+--------+---------+-------+\n", "| Fe | 13.53 | T | MOXSI | 7. | 7.2 | FL |\n", "| XIX | | | | | | |\n", "+------+---------------+-------+----------+--------+---------+-------+\n", "| Fe | 14.204, | T, κ | MOXSI | 6.9 | 7. | FL/AR |\n", "| X | 17.621 | | | | | |\n", "| VIII | | | | | | |\n", "+------+---------------+-------+----------+--------+---------+-------+\n", "| O | 18.967, | T, κ, | MOXSI | 6.5 | 6.6 | FL/AR |\n", "| VIII | 16.006 | n | | | | |\n", "+------+---------------+-------+----------+--------+---------+-------+\n", "| O | 21.60, 21.81, | T, κ, | MOXSI | 6.3 | 6.4 | FL/AR |\n", "| VII | 22.10, 18.67 | n | | | | |\n", "+------+---------------+-------+----------+--------+---------+-------+\n", "| N | 24.77 | T | MOXSI | 6.3 | 6.5 | FL/AR |\n", "| VII | | | | | | |\n", "+------+---------------+-------+----------+--------+---------+-------+\n", "| C VI | 33.73 | T | MOXSI | 6.1 | 6.3 | AR |\n", "+------+---------------+-------+----------+--------+---------+-------+\n", "| C V | 40.27 | T | MOXSI | 6. | 6.1 | AR |\n", "+------+---------------+-------+----------+--------+---------+-------+\n", "| Si | 44.16 | T | MOXSI | 6.3 | 6.5 | FL/AR |\n", "| XII | | | | | | |\n", "+------+---------------+-------+----------+--------+---------+-------+\n", "| Si | 49.18 | T | MOXSI | 6.2 | 6.3 | AR |\n", "| XI | | | | | | |\n", "+------+---------------+-------+----------+--------+---------+-------+\n", "| Fe | 11.171 | T | SASS?/ | 7.3 | 7.5 | FL |\n", "| XXIV | | | MOXSI | | | |\n", "+------+---------------+-------+----------+--------+---------+-------+\n", "| Fe | 11.737 | T | SASS?/ | 7.2 | 7.5 | FL |\n", "| X | | | MOXSI | | | |\n", "| XIII | | | | | | |\n", "+------+---------------+-------+----------+--------+---------+-------+\n", "| Ne X | 12.137 | T | SASS?/ | 6.8 | 6.9 | FL/AR |\n", "| | | | MOXSI | | | |\n", "+------+---------------+-------+----------+--------+---------+-------+\n", "\n", "\"\"\"" ] }, { "cell_type": "code", "execution_count": 6, "id": "73250299-db1b-408d-a55c-51d70b6f09ee", "metadata": {}, "outputs": [], "source": [ "# This is parsed from an RST version of the table that was curated by Athiray\n", "parsed_rst = parse_grid_table(athiray_line_table)\n", "column_names = [''.join(col[-1]) for col in parsed_rst[1][0]]\n", "column_names = [n[2:-2] for n in column_names]\n", "rows = []\n", "for _row in parsed_rst[2]:\n", " row = [''.join(col[-1]) for col in _row]\n", " rows.append(row)\n", "line_table = astropy.table.QTable(rows=rows, names=column_names)\n", "# Split out rows with multiple transitions into a new table\n", "new_rows = []\n", "rows_to_remove = []\n", "for row in line_table:\n", " if len(wavelengths:=row['Wavelength(A)'].split(',')) > 1:\n", " for wave in wavelengths:\n", " new_row = copy.deepcopy(row)\n", " new_row['Wavelength(A)'] = wave\n", " new_rows.append(new_row)\n", " rows_to_remove.append(row.index)\n", "new_rows = astropy.table.vstack(new_rows)\n", "line_table.remove_rows(rows_to_remove)\n", "line_table = astropy.table.vstack([line_table, new_rows])\n", "line_table.rename_columns(\n", " ['Ion','Wavelength(A)', 'PeakEmissivityTemp(Maxwell)', 'PeakEmissivityTemp(k=2)'],\n", " ['ion name','wavelength', 'T_max (Maxwellian)', 'T_max (kappa=2)']\n", ")\n", "line_table = astropy.table.QTable(line_table,dtype=[str,float,str,str,float,float,str])\n", "# Fix inconsistent spacing in ion names\n", "def fix_ion_name_string(name):\n", " components = name.split(' ')\n", " if len(components) == 2:\n", " return name\n", " if name[1] == name[1].lower():\n", " i_sep = 2\n", " else:\n", " i_sep = 1\n", " return f'{name[:i_sep]} {name[i_sep:]}'\n", "line_table['ion name'] = list(map(fix_ion_name_string, line_table['ion name']))\n", "line_table['wavelength'].unit = 'Angstrom'\n", "line_table['T_max (Maxwellian)'] = 10**line_table['T_max (Maxwellian)'] * u.K\n", "line_table['T_max (kappa=2)'] = 10**line_table['T_max (kappa=2)'] * u.K\n", "# Split up Diagnostic column\n", "def does_row_contain(x, col):\n", " return list(map(lambda _x: x in _x, col))\n", "line_table['temperature diagnostic'] = does_row_contain('T', line_table['Diagnostic'])\n", "line_table['density diagnostic'] = does_row_contain('n', line_table['Diagnostic'])\n", "line_table['kappa diagnostic'] = does_row_contain('κ', line_table['Diagnostic'])\n", "# Split up Instrument column\n", "line_table['sass'] = does_row_contain('SASS', line_table['Inst'])\n", "line_table['moxsi'] = does_row_contain('MOXSI', line_table['Inst'])\n", "# Split up Sensitivity column\n", "line_table['flare line'] = does_row_contain('FL', line_table['Sensitivity'])\n", "line_table['active region line'] = does_row_contain('AR', line_table['Sensitivity'])\n", "# Remove all composite columns\n", "line_table.remove_columns(['Diagnostic', 'Inst', 'Sensitivity'])\n", "# Add additional columns here\n", "line_table.add_row({\n", " 'ion name': 'Si XIV',\n", " 'wavelength': si14.transitions.wavelength[~si14.transitions.is_twophoton][i_transition],\n", " 'T_max (Maxwellian)': si14.temperature[goft_si14_select.argmax()],\n", " 'T_max (kappa=2)': np.nan * u.K,\n", " 'temperature diagnostic': True,\n", " 'density diagnostic': False,\n", " 'kappa diagnostic': False,\n", " 'sass': True,\n", " 'moxsi': True,\n", " 'flare line': True,\n", " 'active region line': True,\n", "})\n", "# This should be done last\n", "line_table.sort('wavelength')\n", "# Add metadata\n", "line_table.meta['comment'] = \"This line list was originally curated by P.S. Athiray on 10/23, starting with the original line list from the CubIXSS. Determinations of Kappa sensitivity are based on Dudík et al. (2019); kappa temperatures are computed using the KAPPA database.\"" ] }, { "cell_type": "code", "execution_count": 7, "id": "7637c9ae-f5d9-4c37-a53f-affcc7ffe18f", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
QTable length=32\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
ion namewavelengthT_max (Maxwellian)T_max (kappa=2)temperature diagnosticdensity diagnostickappa diagnosticsassmoxsiflare lineactive region line
AngstromKK
str8float64float64float64boolboolboolboolboolboolbool
Fe XXV1.8631622776.6016837931622776.60168379TrueFalseFalseTrueFalseTrueFalse
Ca XIX3.2125118864.31509582331622776.60168379TrueFalseFalseTrueFalseTrueFalse
Si XIV6.180416185305.906356486nanTrueFalseFalseTrueTrueTrueTrue
Si XIII6.7410000000.012589254.117941663TrueFalseFalseTrueTrueTrueFalse
Mg XII8.41910000000.015848931.924611142TrueFalseFalseTrueTrueTrueFalse
Mg XI9.1696309573.4448019310000000.0TrueFalseFalseFalseTrueTrueTrue
Mg XI9.3146309573.4448019310000000.0TrueFalseFalseFalseTrueTrueTrue
Fe XXIV11.17119952623.14968878831622776.60168379TrueFalseFalseTrueTrueTrueFalse
Fe XVII11.256309573.444801937943282.347242822TrueFalseTrueFalseTrueTrueTrue
Fe XXIII11.73715848931.92461114231622776.60168379TrueFalseFalseTrueTrueTrueFalse
Ne X12.1376309573.444801937943282.347242822TrueFalseFalseTrueTrueTrueTrue
Fe XX12.8310000000.015848931.924611142TrueFalseFalseFalseTrueTrueFalse
Ne IX13.4473981071.70553496955011872.336272725TrueFalseTrueFalseTrueTrueTrue
Fe XIX13.5310000000.015848931.924611142TrueFalseFalseFalseTrueTrueFalse
Ne IX13.6693981071.70553496955011872.336272725TrueFalseTrueFalseTrueTrueTrue
Fe XVIII14.2047943282.34724282210000000.0TrueFalseTrueFalseTrueTrueTrue
Fe XVII15.0156309573.444801937943282.347242822TrueFalseTrueFalseTrueTrueTrue
Fe XVII15.256309573.444801937943282.347242822TrueFalseTrueFalseTrueTrueTrue
O VIII16.0063162277.66016837953981071.7055349695TrueTrueTrueFalseTrueTrueTrue
Fe XVII16.786309573.444801937943282.347242822TrueFalseTrueFalseTrueTrueTrue
Fe XVII17.056309573.444801937943282.347242822TrueFalseTrueFalseTrueTrueTrue
Fe XVIII17.6217943282.34724282210000000.0TrueFalseTrueFalseTrueTrueTrue
O VII18.671995262.31496887892511886.4315095823TrueTrueTrueFalseTrueTrueTrue
O VIII18.9673162277.66016837953981071.7055349695TrueTrueTrueFalseTrueTrueTrue
O VII21.61995262.31496887892511886.4315095823TrueTrueTrueFalseTrueTrueTrue
O VII21.811995262.31496887892511886.4315095823TrueTrueTrueFalseTrueTrueTrue
O VII22.11995262.31496887892511886.4315095823TrueTrueTrueFalseTrueTrueTrue
N VII24.771995262.31496887893162277.6601683795TrueFalseFalseFalseTrueTrueTrue
C VI33.731258925.4117941661995262.3149688789TrueFalseFalseFalseTrueFalseTrue
C V40.271000000.01258925.411794166TrueFalseFalseFalseTrueFalseTrue
Si XII44.161995262.31496887893162277.6601683795TrueFalseFalseFalseTrueTrueTrue
Si XI49.181584893.19246111411995262.3149688789TrueFalseFalseFalseTrueFalseTrue
" ], "text/plain": [ "\n", "ion name wavelength T_max (Maxwellian) T_max (kappa=2) temperature diagnostic density diagnostic kappa diagnostic sass moxsi flare line active region line\n", " Angstrom K K \n", " str8 float64 float64 float64 bool bool bool bool bool bool bool \n", "-------- ---------- ------------------ ------------------ ---------------------- ------------------ ---------------- ----- ----- ---------- ------------------\n", " Fe XXV 1.86 31622776.60168379 31622776.60168379 True False False True False True False\n", " Ca XIX 3.21 25118864.315095823 31622776.60168379 True False False True False True False\n", " Si XIV 6.1804 16185305.906356486 nan True False False True True True True\n", " Si XIII 6.74 10000000.0 12589254.117941663 True False False True True True False\n", " Mg XII 8.419 10000000.0 15848931.924611142 True False False True True True False\n", " Mg XI 9.169 6309573.44480193 10000000.0 True False False False True True True\n", " Mg XI 9.314 6309573.44480193 10000000.0 True False False False True True True\n", " Fe XXIV 11.171 19952623.149688788 31622776.60168379 True False False True True True False\n", " Fe XVII 11.25 6309573.44480193 7943282.347242822 True False True False True True True\n", "Fe XXIII 11.737 15848931.924611142 31622776.60168379 True False False True True True False\n", " Ne X 12.137 6309573.44480193 7943282.347242822 True False False True True True True\n", " Fe XX 12.83 10000000.0 15848931.924611142 True False False False True True False\n", " Ne IX 13.447 3981071.7055349695 5011872.336272725 True False True False True True True\n", " Fe XIX 13.53 10000000.0 15848931.924611142 True False False False True True False\n", " Ne IX 13.669 3981071.7055349695 5011872.336272725 True False True False True True True\n", "Fe XVIII 14.204 7943282.347242822 10000000.0 True False True False True True True\n", " Fe XVII 15.015 6309573.44480193 7943282.347242822 True False True False True True True\n", " Fe XVII 15.25 6309573.44480193 7943282.347242822 True False True False True True True\n", " O VIII 16.006 3162277.6601683795 3981071.7055349695 True True True False True True True\n", " Fe XVII 16.78 6309573.44480193 7943282.347242822 True False True False True True True\n", " Fe XVII 17.05 6309573.44480193 7943282.347242822 True False True False True True True\n", "Fe XVIII 17.621 7943282.347242822 10000000.0 True False True False True True True\n", " O VII 18.67 1995262.3149688789 2511886.4315095823 True True True False True True True\n", " O VIII 18.967 3162277.6601683795 3981071.7055349695 True True True False True True True\n", " O VII 21.6 1995262.3149688789 2511886.4315095823 True True True False True True True\n", " O VII 21.81 1995262.3149688789 2511886.4315095823 True True True False True True True\n", " O VII 22.1 1995262.3149688789 2511886.4315095823 True True True False True True True\n", " N VII 24.77 1995262.3149688789 3162277.6601683795 True False False False True True True\n", " C VI 33.73 1258925.411794166 1995262.3149688789 True False False False True False True\n", " C V 40.27 1000000.0 1258925.411794166 True False False False True False True\n", " Si XII 44.16 1995262.3149688789 3162277.6601683795 True False False False True True True\n", " Si XI 49.18 1584893.1924611141 1995262.3149688789 True False False False True False True" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "line_table" ] }, { "cell_type": "code", "execution_count": 8, "id": "09720add-154b-43f0-ba32-52f0bad17d6d", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "WARNING: UnitsWarning: The unit 'Angstrom' has been deprecated in the VOUnit standard. Suggested: 0.1nm. [astropy.units.format.utils]\n", "WARNING: UnitsWarning: The unit 'Angstrom' has been deprecated in the VOUnit standard. Suggested: 0.1nm. [astropy.units.format.utils]\n" ] } ], "source": [ "line_table.write('../data/line_lists/curated_line_list.asdf')" ] }, { "cell_type": "markdown", "id": "60b739ad-9f38-4268-aa1e-b74feae4f77e", "metadata": {}, "source": [ "TODO: augment this list with some of the lower-energy lines > 40 Angstroms, particularly those from Fe XIV, XV, XVI" ] }, { "cell_type": "code", "execution_count": null, "id": "460df3b3-b3ce-4686-84c9-82eab13e278e", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python [conda env:mocksipipeline-dev]", "language": "python", "name": "conda-env-mocksipipeline-dev-py" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.6" } }, "nbformat": 4, "nbformat_minor": 5 }