{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "\n", "# The Spinning Effective One-Body Factorized Modes\n", "\n", "## Author: Tyler Knowles\n", "\n", "## This module documents the reduced spinning effective one-body factorized modes as numerically implemented in LALSuite's SEOBNRv3 gravitational waveform approximant. That is, we follow the appendix of of [Taracchini, et. al. (2012)](https://arxiv.org/abs/1202.0790).\n", "\n", "\n", "**Notebook Status:** In progress \n", "\n", "**Validation Notes:** This module is under active development -- do ***not*** use the resulting code for scientific applications. In the future, this module will be validated against the LALSuite [SEOBNRv3/SEOBNRv3_opt code]( https://git.ligo.org/lscsoft/lalsuite.) that was reviewed and approved for LIGO parameter estimation by the LIGO Scientific Collaboration.\n", "\n", "\n", "## Introduction\n", "### The Physical System of Interest\n", "\n", "Consider two compact objects (e.g. black holes or neutron stars) with masses $m_{1}$, $m_{2}$ (in solar masses) and spin angular momenta ${\\bf S}_{1}$, ${\\bf S}_{2}$ in a binary system. The spinning effective one-body (\"SEOB\") Hamiltonian $H_{\\rm real}$ (see [BB2010](https://arxiv.org/abs/0912.3517) Equation (5.69)) describes the dynamics of this system. We seek to computed the factorized modes for this system, as described in the appendix of [T2012](https://arxiv.org/abs/1202.0790).\n", "\n", "This routine takes as input\n", "1. the masses $m_{1}$, $m_{2}$,\n", "1. the symmetic mass ratio $\\eta$ and Kerr spin parameter $a$, and\n", "1. dimensionless spin parameters $\\chi_{A}$, $\\chi_{S}$.\n", "\n", "### Citations\n", "Throughout this module, we will refer to\n", "* [Taracchini, et. al. (2012)](https://arxiv.org/abs/1202.0790) as T2012." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "# Table of Contents\n", "$$\\label{toc}$$\n", "\n", "This notebook is organized as follows:\n", "\n", "1. [Step 0](#outputcreation): Creating the output directory for SEOBNR\n", "1. [Step 1](#commonterms): Common terms\n", "1. [Step 2](#fmodes): Factorized modes\n", "1. [Step 3](#validation): Validation\n", "1. [Step 4](#latex_pdf_output): Output this notebook to $\\LaTeX$-formatted PDF file" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "# Step 0: Creating the output directory for SEOBNR \\[Back to [top](#toc)\\]\n", "$$\\label{outputcreation}$$\n", "\n", "First we create the output directory for SEOBNR (if it does not already exist):" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# Get cmdline_helper; remove when this notebook is finalized and removed from in_progress\n", "import sys\n", "# insert at 1, 0 is the script path (or '' in REPL)\n", "sys.path.insert(1, '../')\n", "\n", "import cmdline_helper as cmd # NRPy+: Multi-platform Python command-line interface\n", "\n", "# Create C code output directory:\n", "Ccodesdir = \"SEOBNR\"\n", "# Then create an output directory in case it does not exist\n", "cmd.mkdir(Ccodesdir)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "# Step 1: Common terms \\[Back to [top](#toc)\\]\n", "$$\\label{commonterms}$$\n", "\n", "We define the following terms that are used repeatedly in the factorized modes. From [T2012](https://arxiv.org/abs/1202.0790) Equation (A7a):\n", "\n", "\\begin{equation*}\n", " \\delta m = \\frac{ m_{1} - m_{2} }{ m_{1} + m_{2} }.\n", "\\end{equation*}" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Overwriting SEOBNR/Factorized_modes-expressions.txt\n" ] } ], "source": [ "%%writefile $Ccodesdir/Factorized_modes-expressions.txt\n", "deltam = (m1 - m2)/(m1 + m2)\n", "deltam2 = deltam*deltam\n", "\n", "a2 = a*a\n", "a3 = a2*a\n", "a4 = a3*a\n", "a5 = a4*a\n", "a6 = a5*a\n", "a7 = a6*a\n", "\n", "eta2 = eta*eta\n", "eta3 = eta2*eta\n", "eta4 = eta3*eta\n", "\n", "m1p3eta = -1 + 3*eta" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "# Step 2: The factorized modes \\[Back to [top](#toc)\\]\n", "$$\\label{fmodes}$$\n", "\n", "We will write the coefficient (on each power of $v$) separately, following the formulation in [T2012](https://arxiv.org/abs/1202.0790) Equation (A8a):\n", "\n", "Need to find a reference for the 1./2. * (chiS + chiA * deltam) term in rho22v4, the term rho22v5, the (89. * a * a)/252. term of rho22v6 (and why we don't include 428 * eulerlog2(v2)/105 as in T2012)... these terms are not properly documented in the LALSuite code." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Appending to SEOBNR/Factorized_modes-expressions.txt\n" ] } ], "source": [ "%%writefile -a $Ccodesdir/Factorized_modes-expressions.txt\n", "\n", "rho22v2 = 55.*eta/84. - 43./42\n", "rho22v3 = -2.*(chiS*(1 - eta) + chiA*deltam)/3.\n", "rho22v4 = 1./2.*(chiS + chiA*deltam)*(chiS + chiA*deltam) + 19583.*eta2/42336. - 33025.*eta/21168. - 20555./10584.\n", "rho22v5 = -34.*a/21.\n", "rho22v6 = (1556919113./122245200. + (89.*a2)/252. - (48993925.*eta)/9779616. - (6292061.*eta2)/3259872.\n", " + (10620745.*eta3)/39118464. + (41.*eta*sp.pi*sp.pi)/192.)\n", "rho22v6l = -428./105.\n", "rho22v7 = (18733.*a)/15876. + a3/3.\n", "rho22v8 = -387216563023./160190110080. + (18353.*a2)/21168. - a*4/8.\n", "rho22v8l = 9202./2205.\n", "rho22v10 = -16094530514677./533967033600.\n", "rho22v10l = 439877./55566.\n", "\n", "rho21v1 = 0.\n", "rho21v2 = -59./56. + (23.*eta)/84.\n", "rho21v3 = 0.\n", "rho21v4 = -47009./56448. - (865.*a2)/1792. - (405.*a4)/2048. - (10993.*eta)/14112. + (617.*eta2)/4704.\n", "rho21v5 = (-98635.*a)/75264. + (2031.*a3)/7168. - (1701.*a5)/8192.\n", "rho21v6 = 7613184941./2607897600. + (9032393.*a2)/1806336. + (3897.*a4)/16384. - (15309.*a6)/65536.\n", "rho21v6l = -107./105.\n", "rho21v7 = (-3859374457.*a)/1159065600. - (55169.*a3)/16384. + (18603.*a5)/65536. - (72171.*a7)/262144.\n", "rho21v7l = 107.*a/140.\n", "rho21v8 = -1168617463883./911303737344.\n", "rho21v8l = 6313./5880.\n", "rho21v10 = -63735873771463./16569158860800.\n", "rho21v10l = 5029963./5927040.\n", "\n", "f21v1 = (-3.*(chiS + chiA/deltam))/2.\n", "f21v3 = (chiS*deltam*(427. + 79.*eta) + chiA*(147. + 280.*deltam2 + 1251.*eta))/84./deltam\n", "\n", "rho33v2 = -7./6. + (2.*eta)/3.\n", "rho33v3 = 0.\n", "rho33v4 = -6719./3960. + a2/2. - (1861.*eta)/990. + (149.*eta2)/330.\n", "rho33v5 = (-4.*a)/3.\n", "rho33v6 = 3203101567./227026800. + (5.*a2)/36.\n", "rho33v6l = -26./7.\n", "rho33v7 = (5297.*a)/2970. + a3/3.\n", "rho33v8 = -57566572157./8562153600.\n", "rho33v8l = 13./3.\n", "\n", "f33v3 = (chiS*deltam*(-4. + 5.*eta) + chiA*(-4. + 19.*eta))/(2.*deltam)\n", "\n", "rho32v = (4.*chiS*eta)/(-3.*m1p3eta)\n", "rho32v2 = (-4.*a2*eta2)/(9.*m1p3eta*m1p3eta) + (328. - 1115.*eta + 320.*eta2)/(270.*m1p3eta)\n", "rho32v3 = 2./9.*a\n", "rho32v4 = a2/3. + (-1444528. + 8050045.*eta - 4725605.*eta2 - 20338960.*eta3\n", " + 3085640.*eta4)/(1603800.*m1p3eta*m1p3eta)\n", "rho32v5 = (-2788.*a)/1215.\n", "rho32v6 = 5849948554./940355325. + (488.*a2)/405.\n", "rho32v6l = -104./63.\n", "rho32v8 = -10607269449358./3072140846775.\n", "rho32v8l = 17056./8505.\n", "\n", "rho31v2 = -13./18. - (2.*eta)/9.\n", "rho31v3 = 0.0\n", "rho31v4 = 101./7128. - (5.*a2)/6. - (1685.*eta)/1782. - (829.*eta2)/1782.\n", "rho31v5 = (4.*a)/9.\n", "rho31v6 = 11706720301./6129723600. - (49.*a2)/108.\n", "rho31v6l = -26./63.\n", "rho31v7 = (-2579.*a)/5346. + a3/9.\n", "rho31v8 = 2606097992581./4854741091200.\n", "rho31v8l = 169./567.\n", "\n", "f31v3 = (chiA * (-4. + 11.*eta) + chiS*deltam*(-4. + 13.*eta))/(2.*deltam)\n", "\n", "rho44v2 = (1614. - 5870.*eta + 2625.*eta2)/(1320.*m1p3eta)\n", "rho44v3 = (chiA * (10. - 39.*eta)*deltam + chiS * (10. - 41.*eta + 42.*eta2)) / (15.*m1p3eta)\n", "rho44v4 = a2/2. + (-511573572. + 2338945704.*eta - 313857376.*eta2 - 6733146000. * eta3 +\n", " 1252563795.*eta4)/(317116800.*np.power(m1p3eta,2))\n", "rho44v5 = (-69.*a)/55.\n", "rho44v6 = 16600939332793./1098809712000. + (217.*a2)/3960.\n", "rho44v6l = -12568./3465.\n", "\n", "rho43v = 0.\n", "rho43v2 = (222. - 547.*eta + 160.*eta2)/(176.*(-1. + 2.*eta))\n", "rho43v4 = -6894273./7047040. + (3.*a2)/8.\n", "rho43v5 = (-12113.*a)/6160.\n", "rho43v6 = 1664224207351./195343948800.\n", "rho43v6l = -1571./770.\n", "\n", "f43v = (5.*(chiA - chiS*deltam)*eta)/(2.*deltam*(-1. + 2.*eta))\n", "\n", "rho42v2 = (1146. - 3530.*eta + 285.*eta2)/(1320.*m1p3eta)\n", "rho42v3 = (chiA * (10. - 21.*eta)*deltam + chiS*(10. - 59.*eta + 78.*eta2))/(15.*m1p3eta)\n", "rho42v4 = a2/2. + (-114859044. + 295834536.*eta + 1204388696.*eta2 - 3047981160.*eta3\n", " - 379526805.*eta4)/(317116800.*m1p3eta*m1p3eta)\n", "rho42v5 = (-7.*a)/110.\n", "rho42v6 = 848238724511./219761942400. + (2323.*a2)/3960.\n", "rho42v6l = -3142. / 3465.\n", "\n", "rho41v = 0.0\n", "rho41v2 = (602. - 1385.*eta + 288.*eta2)/(528.*(-1. + 2.*eta))\n", "rho41v4 = -7775491./21141120. + (3.* a2)/8.\n", "rho41v5 = (-20033.*a)/55440. - (5*a3)/6.\n", "rho41v6 = 1227423222031./1758095539200.\n", "rho41v6l = -1571. / 6930.\n", "\n", "f41v = (5.*(chiA - chiS*deltam)*eta)/(2.*deltam*(-1. + 2.*eta))\n", "\n", "rho55v2 = (487. - 1298.*eta + 512.*eta2)/(390.*(-1. + 2.*eta))\n", "rho55v3 = (-2.*a)/3.\n", "rho55v4 = -3353747./2129400. + a2/2.\n", "rho55v5 = -241.*a/195.\n", "\n", "rho54v2 = (-17448. + 96019.*eta - 127610.*eta2 + 33320.*eta3)/(13650.*(1. - 5.*eta + 5.*eta2))\n", "rho54v3 = (-2.*a)/15.\n", "rho54v4 = -16213384./15526875. + (2.*a2)/5.\n", "\n", "rho53v2 = (375. - 850.*eta + 176.*eta2)/(390.*(-1. + 2.*eta))\n", "rho53v3 = (-2.*a)/3.\n", "rho53v4 = -410833./709800. + a2/2.\n", "rho53v5 = -103.*a/325.\n", "\n", "rho52v2 = (-15828. + 84679.*eta - 104930.*eta2 + 21980.*eta3)/(13650.*(1. - 5.*eta + 5.*eta2))\n", "rho52v3 = (-2.*a)/15.\n", "rho52v4 = -7187914./15526875. + (2.*a2)/5.\n", "\n", "rho51v2 = (319. - 626.*eta + 8.*eta2)/(390.*(-1. + 2.*eta))\n", "rho51v3 = (-2.*a)/3.\n", "rho51v4 = -31877./304200. + a2/2.\n", "rho51v5 = 139.*a/975.\n", "\n", "rho66v2 = (-106. + 602.*eta - 861.*eta2 + 273.*eta3)/(84.*(1. - 5.*eta + 5.*eta2))\n", "rho66v3 = (-2.*a)/3.\n", "rho66v4 = -1025435./659736. + a2/2.\n", "\n", "rho65v2 = (-185. + 838.*eta - 910.*eta2 + 220.*eta3)/(144.*(deltam2 + 3.*eta2))\n", "rho65v3 = -2.*a/9.\n", "\n", "rho64v2 = (-86. + 462.*eta - 581.*eta2 + 133.*eta3)/(84.*(1. - 5.*eta + 5.*eta2))\n", "rho64v3 = (-2.*a)/3.\n", "rho64v4 = -476887./659736. + a2/2.\n", "\n", "rho63v2 = (-169. + 742.*eta - 750.*eta2 + 156.*eta3)/(144.*(deltam2 + 3.*eta2))\n", "rho63v3 = -2.*a/9.\n", "\n", "rho62v2 = (-74. + 378.*eta - 413.*eta2 + 49.*eta3)/(84.*(1. - 5.*eta + 5.*eta2))\n", "rho62v3 = (-2.*a)/3.\n", "rho62v4 = -817991./3298680. + a2/2.\n", "\n", "rho61v2 = (-161. + 694.*eta - 670.*eta2 + 124.*eta3)/(144.*(deltam2 + 3.*eta2))\n", "rho61v3 = -2.*a/9.\n", "\n", "rho77v2 = (-906. + 4246.*eta - 4963.*eta2 + 1380.*eta3)/(714.*(deltam2 + 3.*eta2))\n", "rho77v3 = -2.*a/3.\n", "\n", "rho76v2 = (2144. - 16185.*eta + 37828.*eta2 - 29351.*eta3 + 6104.*eta4)/(1666.*(-1 + 7*eta - 14*eta2 + 7 * eta3))\n", "\n", "rho75v2 = (-762. + 3382.*eta - 3523.*eta2 + 804.*eta3)/(714.*(deltam2 + 3.*eta2))\n", "rho75v3 = -2.*a/3.\n", "\n", "rho74v2 = (17756. - 131805.*eta + 298872.*eta2 - 217959.*eta3\n", " + 41076.*eta4)/(14994.*(-1. + 7.*eta - 14.*eta2 + 7. * eta3))\n", "\n", "rho73v2 = (-666. + 2806.*eta - 2563.*eta2 + 420.*eta3)/(714.*(deltam2 + 3.*eta2))\n", "rho73v3 = -2.*a/3.\n", "\n", "rho72v2 = (16832. - 123489.*eta + 273924.*eta2 - 190239.*eta3\n", " + 32760.*eta4)/(14994.*(-1. + 7.*eta - 14.*eta2 + 7.*eta3))\n", "\n", "rho71v2 = (-618. + 2518.*eta - 2083.*eta2 + 228.*eta3)/(714.*(deltam*deltam + 3.*eta2))\n", "rho71v3 = -2.*a/3.\n", "\n", "rho88v2 = (3482. - 26778.*eta + 64659.*eta2 - 53445.*eta3 + 12243.*eta4)/(2736.*(-1. + 7.*eta - 14.*eta2 + 7.*eta3))\n", "\n", "rho87v2 = (23478. - 154099.*eta + 309498.*eta2 - 207550.*eta3 + 38920*eta4)/(18240.*(-1 + 6*eta - 10*eta2 + 4*eta3))\n", "\n", "rho86v2 = (1002. - 7498.*eta + 17269.*eta2 - 13055.*eta3 + 2653.*eta4)/(912.*(-1. + 7.*eta - 14.*eta2 + 7.*eta3))\n", "\n", "rho85v2 = (4350. - 28055.*eta + 54642.*eta2 - 34598.*eta3 + 6056.*eta4)/(3648.*(-1. + 6.*eta - 10.*eta2 + 4.*eta3))\n", "\n", "rho84v2 = (2666. - 19434.*eta + 42627.*eta2 - 28965.*eta3 + 4899.*eta4)/(2736.*(-1. + 7.*eta - 14.*eta2 + 7.*eta3))\n", "\n", "rho83v2 = (20598. - 131059.*eta + 249018.*eta2 - 149950.*eta3 + 24520.*eta4)/(18240.*(-1. + 6.*eta - 10.*eta2\n", " + 4.*eta3))\n", "\n", "rho82v2 = (2462. - 17598.*eta + 37119.*eta2 - 22845.*eta3 + 3063.*eta4)/(2736.*(-1. + 7.*eta - 14.*eta2 + 7.*eta3))\n", "\n", "rho81v2 = (20022.-126451.*eta+236922.*eta2 - 138430.*eta3 + 21640.*eta4)/(18240.*(-1. + 6.*eta - 10.*eta2 + 4.*eta3))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "# Step 3: Validation \\[Back to [top](#toc)\\]\n", "$$\\label{validation}$$\n", "\n", "The following code cell reverses the order of the expressions output to SEOBNR/Hamiltonian_on_top.txt and creates a Python function to validate the value of $H_{\\rm real}$ against the SEOBNRv3 Hamiltonian value computed in LALSuite git commit bba40f21e9 for command-line input parameters\n", "\n", "-f 20 -M 23 -m 10 -f 20 -X 0.01 -Y 0.02 -Z -0.03 -x 0.04 -y -0.05 -z 0.06." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Printing difference between notebook output and a trusted list of expressions...\n", "Checking file Factorized_modes-one_line_expressions.txt-VALIDATION\n", "No difference. TEST PASSED!\n" ] } ], "source": [ "import numpy as np\n", "import difflib, os\n", "\n", "# The modes are sometimes written on more than one line for readability in this Jupyter notebook.\n", "# We first create a file of one-line expressions, SEOBNR-one_line_factorized_modes.txt.\n", "with open(os.path.join(Ccodesdir,\"Factorized_modes-one_line_expressions.txt-VALIDATION\"), \"w\") as output:\n", " count = 0\n", " # Read output of this notebook\n", " for line in list(open(os.path.join(Ccodesdir,\"Factorized_modes-expressions.txt\"))):\n", " # Read the first line\n", " if count == 0:\n", " prevline=line\n", " #Check if prevline is a complete expression\n", " elif \"=\" in prevline and \"=\" in line:\n", " output.write(\"%s\\n\" % prevline.strip('\\n'))\n", " prevline=line\n", " # Check if line needs to be adjoined to prevline\n", " elif \"=\" in prevline and not \"=\" in line:\n", " prevline = prevline.strip('\\n')\n", " prevline = (prevline+line).replace(\" \",\"\")\n", " # Be sure to print the last line.\n", " if count == len(list(open(os.path.join(Ccodesdir,\"Factorized_modes-expressions.txt\"))))-1:\n", " if not \"=\" in line:\n", " print(\"ERROR. Algorithm not robust if there is no equals sign on the final line. Sorry.\")\n", " sys.exit(1)\n", " else:\n", " output.write(\"%s\" % line)\n", " count = count + 1\n", "\n", "# Now write the expressions in a function\n", "# We want to return each mode, so we will store them in a dictionary\n", "with open(os.path.join(Ccodesdir,\"Factorized_modes.py\"), \"w\") as output:\n", " output.write(\"import numpy as np\\ndef compute_modes(m1=23., m2=10., a=-9.086823027135883e-03, eta=2.112029384756657e-01, chiA=-4.516044029838846e-02, chiS=1.506880542362110e-02):\\n\\tmodes={}\\n\")\n", " for line in list(open(os.path.join(Ccodesdir,\"Factorized_modes-one_line_expressions.txt\"))):\n", " # To prevent storing common terms in the dictionary, sort expressions by those containing 'v'\n", " if 'v' in line:\n", " # Split the line so that the mode name can be used to create a dictionary entry\n", " name, expression = line.split('=') # Should not be more than one '=' per line!\n", " output.write(\"\\tmodes['%s'] = %s\\n\" % (name.strip(),expression.rstrip().replace(\"sp.pi\",\"np.pi\")))\n", " else:\n", " # For expressions not in the dictionary, just print the expression as-is\n", " output.write(\"\\t%s\\n\" % line.rstrip().replace(\"sp.pi\",\"np.pi\"))\n", " output.write(\"\\treturn modes\")\n", " # For testing\n", " output.write(\"\\ntest=compute_modes()\\n\")\n", " output.write(\"for key, value in test.items():\\n\\tprint(\\\"%s = %.15e\\\" % (key,value))\")\n", "\n", "\n", "# Check that expressions have not been altered\n", "print(\"Printing difference between notebook output and a trusted list of expressions...\")\n", "# Open the files to compare\n", "file = \"Factorized_modes-one_line_expressions.txt\"\n", "outfile = \"Factorized_modes-one_line_expressions.txt-VALIDATION\"\n", "\n", "print(\"Checking file \" + outfile)\n", "with open(os.path.join(Ccodesdir,file), \"r\") as file1, open(os.path.join(Ccodesdir,outfile), \"r\") as file2:\n", " # Read the lines of each file\n", " file1_lines=[]\n", " file2_lines=[]\n", " for line in file1.readlines():\n", " file1_lines.append(line.replace(\" \", \"\"))\n", " for line in file2.readlines():\n", " file2_lines.append(line.replace(\" \", \"\"))\n", " num_diffs = 0\n", " for line in difflib.unified_diff(file1_lines, file2_lines, fromfile=os.path.join(Ccodesdir,file), tofile=os.path.join(Ccodesdir,outfile)):\n", " sys.stdout.writelines(line)\n", " num_diffs = num_diffs + 1\n", " if num_diffs == 0:\n", " print(\"No difference. TEST PASSED!\")\n", " else:\n", " print(\"ERROR: Disagreement found with the trusted file. See differences above.\")\n", " sys.exit(1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "# Output this notebook to $\\LaTeX$-formatted PDF file \\[Back to [top](#toc)\\]\n", "$$\\label{latex_pdf_output}$$\n", "\n", "The following code cell converts this Jupyter notebook into a proper, clickable $\\LaTeX$-formatted PDF file. After the cell is successfully run, the generated PDF may be found in the root NRPy+ tutorial directory, with filename\n", "[Tutorial-SEOBNR_Factorized_Modes.pdf](Tutorial-SEOBNR_Factorized_Modes.pdf) (Note that clicking on this link may not work; you may need to open the PDF file through another means.)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Created Tutorial-SEOBNR_Factorized_Modes.tex, and compiled LaTeX file to PDF file Tutorial-SEOBNR_Factorized_Modes.pdf\n" ] } ], "source": [ "cmd.output_Jupyter_notebook_to_LaTeXed_PDF(\"Tutorial-SEOBNR_Factorized_Modes\")" ] } ], "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", "version": "3.8.3" } }, "nbformat": 4, "nbformat_minor": 2 }