{ "cells": [ { "cell_type": "markdown", "id": "a6ba3eb0-8f27-4ebd-b407-3f25f449c6bf", "metadata": {}, "source": [ "# Imports" ] }, { "cell_type": "code", "execution_count": null, "id": "bd9299aa-a531-468c-b04b-798b06315f41", "metadata": {}, "outputs": [], "source": [ "# pyright: reportUnknownArgumentType=false, reportCallIssue=false, reportAttributeAccessIssue=false, reportOptionalSubscript=false, reportArgumentType=false\n", "from rich.console import Console\n", "from rich.table import Table\n", "from rich.theme import Theme\n", "\n", "from finesse.model import Model\n", "from finesse.analysis.actions.axes import Noxaxis, Xaxis\n", "from finesse.solutions import SeriesSolution\n", "from finesse.analysis.actions import (\n", " TemporaryParameters,\n", " Change,\n", " Maximize,\n", " Minimize,\n", " Series,\n", " FrequencyResponse,\n", ")\n", "from finesse.components import Mirror, SignalGenerator\n", "from finesse.detectors import QuantumNoiseDetector\n", "\n", "from pathlib import Path\n", "from typing import NamedTuple\n", "import re\n", "\n", "from matplotlib.axes import Axes\n", "from matplotlib.pyplot import figure, show\n", "\n", "\n", "from numpy import linspace, geomspace, pi, angle, where, diff, mean, loadtxt, load\n", "from scipy.io.matlab import loadmat\n", "\n", "from science_signal import Signal" ] }, { "cell_type": "code", "execution_count": null, "id": "4c038d40-1d01-49cb-9182-a9a0e94d0d40", "metadata": {}, "outputs": [], "source": [ "from gettext import install\n", "from logging import getLogger" ] }, { "cell_type": "code", "execution_count": null, "id": "5d4f2612-c5ea-4b21-a326-7074022966bc", "metadata": {}, "outputs": [], "source": [ "install(__name__)\n", "logger = getLogger(__name__)\n", "theme = Theme(\n", " {\n", " \"strong\": \"cyan underline\",\n", " \"result\": \"red bold\",\n", " }\n", ")\n", "console = Console(theme=theme)" ] }, { "cell_type": "markdown", "id": "eb7d2340-c817-4309-9599-6d58070ff4ab", "metadata": {}, "source": [ "## Paramètres généraux" ] }, { "cell_type": "code", "execution_count": null, "id": "8fc23eea-145e-4641-93e9-6f8989edca96", "metadata": {}, "outputs": [], "source": [ "C_POWER = 25 # en Whatt\n", "C_DARK_FRINGE = 8e-3 # en Whatt" ] }, { "cell_type": "markdown", "id": "3052aa2b-350e-4eb3-b31c-a4204ab84dac", "metadata": {}, "source": [ "## Modèle simplifié de Virgo" ] }, { "cell_type": "code", "execution_count": null, "id": "d32480d0-8525-478a-9af5-b1a1c8b30f1d", "metadata": {}, "outputs": [], "source": [ "%matplotlib ipympl\n", "model_file = Path(\"model.kat\")\n", "model = Model()\n", "model.phase_config(zero_k00=False, zero_tem00_gouy=True)\n", "model.modes(modes=\"off\") # pyright: ignore[reportUnusedCallResult]\n", "model.parse(model_file.read_text())\n", "model.lambda0 = model.get(\"wavelength\")\n", "model.laser.P = C_POWER\n", "model.plot_graph() # pyright: ignore[reportUnusedCallResult]\n", "show()" ] }, { "cell_type": "code", "execution_count": null, "id": "b742cd14-2149-437b-9194-249cf40849b1", "metadata": {}, "outputs": [], "source": [ "result = model.run(\n", " TemporaryParameters(\n", " Series(\n", " Change(\n", " {\n", " \"SR.misaligned\": True,\n", " \"PR.misaligned\": True,\n", " \"eom1.midx\": 0,\n", " \"eom2.midx\": 0,\n", " \"eom3.midx\": 0,\n", " \"eom4.midx\": 0,\n", " }\n", " ),\n", " Maximize(\n", " model.get(\"NE_p1\"),\n", " model.get(\"NORTH_ARM.DC\"),\n", " bounds=[-180, 180],\n", " tol=1e-14,\n", " ),\n", " Maximize(\n", " model.get(\"WE_p1\"),\n", " model.get(\"WEST_ARM.DC\"),\n", " bounds=[-180, 180],\n", " tol=1e-14,\n", " ),\n", " Minimize(\n", " model.get(\"SR_p2\"), model.get(\"MICH.DC\"), bounds=[-180, 180], tol=1e-14\n", " ),\n", " Change(\n", " {\n", " \"PR.misaligned\": False,\n", " }\n", " ),\n", " Maximize(\n", " model.get(\"PR_p2\"), model.get(\"PRCL.DC\"), bounds=[-180, 180], tol=1e-14\n", " ),\n", " Change(\n", " {\n", " \"SR.misaligned\": False,\n", " }\n", " ),\n", " Maximize(\n", " model.get(\"B1_DC\"), model.get(\"SRCL.DC\"), bounds=[-180, 180], tol=1e-14\n", " ),\n", " Change(\n", " {\n", " \"SRCL.DC\": -90,\n", " },\n", " relative=True,\n", " ),\n", " ),\n", " exclude=[\n", " \"NE.phi\",\n", " \"NI.phi\",\n", " \"WE.phi\",\n", " \"WI.phi\",\n", " \"SR.phi\",\n", " \"PR.phi\",\n", " \"NORTH_ARM.DC\",\n", " \"WEST_ARM.DC\",\n", " \"DARM.DC\",\n", " \"MICH.DC\",\n", " \"PRCL.DC\",\n", " \"SRCL.DC\",\n", " \"SR.misaligned\",\n", " \"eom1.midx\",\n", " \"eom2.midx\",\n", " \"eom3.midx\",\n", " \"eom4.midx\",\n", " ],\n", " ),\n", ")" ] }, { "cell_type": "code", "execution_count": null, "id": "fbc0d68f-9b01-4d52-866c-18d49aedff32", "metadata": {}, "outputs": [], "source": [ "def compute_solutions(\n", " model: Model, DOF: str, padding: float, nb: int = 10000\n", ") -> SeriesSolution:\n", " return model.run(\n", " Xaxis(\n", " model.get(DOF).DC,\n", " \"lin\",\n", " model.get(DOF).DC - padding,\n", " model.get(DOF).DC + padding,\n", " nb,\n", " )\n", " )\n", "\n", "\n", "def display_ax(\n", " ax: Axes,\n", " solution: SeriesSolution,\n", " model: Model,\n", " DOF: str,\n", " padding: float,\n", " nb: int = 10000,\n", ") -> Axes:\n", " x = linspace(model.get(DOF).DC - padding, model.get(DOF).DC + padding, nb + 1)\n", " _ = ax.semilogy(x, solution[\"SR_p2\"], label=\"dark fringe\")\n", " _ = ax.semilogy(x, solution[\"NE_p1\"], label=\"north cavity\")\n", " _ = ax.semilogy(x, solution[\"WE_p1\"], label=\"west cavity\")\n", " _ = ax.vlines(\n", " [model.get(DOF).DC],\n", " min(solution[\"SR_p2\"]),\n", " max(solution[\"NE_p1\"]),\n", " colors=\"red\",\n", " )\n", " _ = ax.set_ylabel(\"power (W)\")\n", " ax.grid()\n", " _ = ax.legend()\n", " return ax\n", "\n", "\n", "class DisplayData(NamedTuple):\n", " DOF: str\n", " padding: float\n", "\n", "\n", "data: list[DisplayData] = [\n", " DisplayData(\"NORTH_ARM\", 10),\n", " DisplayData(\"WEST_ARM\", 10),\n", " DisplayData(\"PRCL\", 10),\n", " DisplayData(\"MICH\", 10),\n", " DisplayData(\"DARM\", 10),\n", " DisplayData(\"CARM\", 10),\n", "]\n", "\n", "Figure = figure(figsize=(13, 10))\n", "nb = int(1e4)\n", "\n", "for i in range(len(data)):\n", " element: DisplayData = data[i]\n", " ax = Figure.add_subplot(3, 2, i + 1)\n", " solution = compute_solutions(model, element.DOF, element.padding, nb)\n", " _ = display_ax(ax, solution, model, element.DOF, element.padding, nb).set_xlabel(\n", " \"{} value\".format(element.DOF)\n", " )\n", "show()\n", "\n", "solution = model.run(Noxaxis())\n", "result = solution[\"B1_DC\"]\n", "start, stop, nb = 0, 1, 0\n", "while (abs(result - C_DARK_FRINGE) > 1e-4) and (nb < 100):\n", " nb += 1\n", " temp = start + (stop - start) / 2\n", "\n", " model.DARM.DC = temp\n", " solution = model.run(Noxaxis())\n", " result = solution[\"B1_DC\"]\n", " if result > C_DARK_FRINGE:\n", " stop = temp\n", " else:\n", " start = temp\n", "console.print(\n", " \"Degré de liberté [result]{dof}[/result] trouvé en [strong]{nb} pas[/strong] pour avoir une puissance de [result]{result} W[/result] sur B1\".format(\n", " nb=nb, dof=model.DARM.DC, result=result\n", " )\n", ")" ] }, { "cell_type": "code", "execution_count": null, "id": "66c9be03-cedc-4d07-acbd-3269f3143cd4", "metadata": {}, "outputs": [], "source": [ "solution = model.run(Noxaxis())\n", "console = Console()\n", "table = Table(title=\"Puissances dans l'interferomètre\")\n", "table.add_column(\"position\", justify=\"left\", style=\"white\")\n", "table.add_column(\"puissance (W)\", justify=\"left\", style=\"cyan\")\n", "\n", "table.add_row(\"Injection\", str(model.get(\"laser\").P.eval()))\n", "table.add_row(\"PR\", str(solution[\"PR_p1\"]))\n", "table.add_row(\"cavité de recyclage de puissance\", str(solution[\"PR_p2\"]))\n", "table.add_row(\"cavité ouest\", str(solution[\"WE_p1\"]))\n", "table.add_row(\"cavité nord\", str(solution[\"NE_p1\"]))\n", "table.add_row(\"frange noire\", str(solution[\"SR_p2\"]))\n", "table.add_row(\"SNEB\", str(solution[\"SNEB_DC\"]))\n", "table.add_row(\"SWEB\", str(solution[\"SWEB_DC\"]))\n", "table.add_row(\"SDB1\", str(solution[\"SDB1_DC\"]))\n", "\n", "console.print(table)\n", "\n", "table = Table(title=\"DOF dans l'interferomètre\")\n", "table.add_column(\"nom\", justify=\"left\", style=\"white\")\n", "table.add_column(\"valeur\", justify=\"left\", style=\"magenta\")\n", "\n", "table.add_row(\"Bras nord\", str(model.get(\"NORTH_ARM.DC\")))\n", "table.add_row(\"Bras ouest\", str(model.get(\"WEST_ARM.DC\")))\n", "table.add_row(\"PR\", str(model.get(\"PRCL.DC\")))\n", "table.add_row(\"SR\", str(model.get(\"SRCL.DC\")))\n", "table.add_row(\"MICH\", str(model.get(\"MICH.DC\")))\n", "\n", "console.print(table)\n", "\n", "console = Console(theme=theme)\n", "table = Table(title=\"\")\n", "table.add_column(\"nom\", justify=\"left\", style=\"white\")\n", "table.add_column(\"valeur\", justify=\"left\", style=\"cyan\")\n", "for i in range(1, model.west_arm.info_parameter_table().table.shape[0]):\n", " table.add_row(\n", " str(model.west_arm.info_parameter_table().table[i, 0]),\n", " str(model.west_arm.info_parameter_table().table[i, 1]),\n", " )\n", "console.print(table)" ] }, { "cell_type": "code", "execution_count": null, "id": "7fde067a-52b7-4798-8bd6-0890e27f33e2", "metadata": {}, "outputs": [], "source": [ "def get_QNLS(\n", " model: Model, start: int = 5, stop: int = 1000, nb: int = 100\n", ") -> SeriesSolution:\n", " new_model = model.deepcopy()\n", " new_model.fsig.f = 1\n", " new_model.add(SignalGenerator(\"darmx\", new_model.space_NI_NE.h, 1, 0))\n", " new_model.add(SignalGenerator(\"darmy\", new_model.space_WI_WE.h, 1, 180))\n", " new_model.add(QuantumNoiseDetector(\"NSR_with_RP\", new_model.SR.p2.o, True))\n", " return new_model.run(Xaxis(new_model.get(\"fsig.f\"), \"log\", start, stop, nb))\n", "\n", "\n", "model._settings.phase_config.zero_k00 = False\n", "\n", "solution = get_QNLS(model, 5, 5000, 10000)\n", "\n", "\n", "def dumb_parse(value: str = \"\"):\n", " regex = re.compile(\"\\\\((\\\\d+\\\\.\\\\d+e[+-]\\\\d{2})([+-]\\\\d+\\\\.\\\\d+e[+-]\\\\d{2})j\\\\)\")\n", " result = re.search(regex, value)\n", " if result:\n", " return float(result.groups()[0]) + 1j * float(result.groups()[1])\n", " raise Exception(value)\n", "\n", "\n", "QNLS = load(\"sensitivities/finesse-virgo.npy\")\n", "current_O4_sensitivity_ASD = loadtxt(\"sensitivities/O4_nominal_reference.txt\")\n", "\n", "Figure = figure(figsize=(14, 5))\n", "_ = Figure.gca().loglog(\n", " solution.x1, abs(solution[\"NSR_with_RP\"]), label=\"this lock process\"\n", ")\n", "_ = Figure.gca().loglog(\n", " QNLS[0],\n", " QNLS[1],\n", " label=\"packaged lock process\",\n", ")\n", "_ = Figure.gca().loglog(\n", " current_O4_sensitivity_ASD[0],\n", " abs(current_O4_sensitivity_ASD[1]),\n", " label=\"current nominal sensitivity during O4\",\n", ")\n", "_ = Figure.gca().legend()\n", "Figure.gca().grid(True, \"both\", \"both\")\n", "show()\n", "\n", "solution = model.run(FrequencyResponse(geomspace(5, 10000, 1000), [\"DARM\"], [\"B1.I\"]))\n", "maximum_amplitude_step: float = max(abs(diff(angle(solution[\"B1.I\", \"DARM\"]))))\n", "pole_index = round(\n", " mean(\n", " where(\n", " abs(angle(solution[\"B1.I\", \"DARM\"]) + pi / 4) < maximum_amplitude_step * 2\n", " )\n", " )\n", ") # find the index where the curve is the closest to -45°\n", "console.print(\n", " \"Le [strong]pôle[/strong] de la fonction de transfert [strong]DARM[/strong] est à [result]{:.1f}[/result] Hz\".format(\n", " solution.f[pole_index]\n", " )\n", ")\n", "\n", "table = Table(title=\"Position des différents miroirs\")\n", "table.add_column(\"miroir\", justify=\"left\", style=\"white\")\n", "table.add_column(\"offset (°)\", justify=\"left\", style=\"white\")\n", "table.add_column(\"offset (m)\", justify=\"left\", style=\"white\")\n", "\n", "for name in [\n", " \"NE\",\n", " \"NE_AR\",\n", " \"NI\",\n", " \"NI_AR\",\n", " \"WE\",\n", " \"WE_AR\",\n", " \"WI\",\n", " \"WI_AR\",\n", " \"PR\",\n", " \"PR_AR\",\n", " \"SR\",\n", " \"SR_AR\",\n", "]:\n", " element: Mirror = model.get(name)\n", " table.add_row(\n", " str(element.name),\n", " str(element.phi.eval()),\n", " str(element.phi.eval() * model.lambda0 / 180),\n", " )\n", "\n", "console.print(table)" ] }, { "cell_type": "markdown", "id": "fd5ff122-8d97-43f2-982a-084ee984b827", "metadata": {}, "source": [ "## Comparaison avec Optickle" ] }, { "cell_type": "code", "execution_count": null, "id": "fd3b1078-0fd6-4e1b-9e55-b231d9464bdf", "metadata": {}, "outputs": [], "source": [ "model.SNEB.phi = model.NE.phi - 45\n", "model.SWEB.phi = model.WE.phi - 45\n", "model.SDB1.phi = model.SR.phi + 45\n", "\n", "B1_detector = \"B1.I\"\n", "\n", "quad_tf: dict[str, SeriesSolution] = dict()\n", "in_tf: dict[str, SeriesSolution] = dict()\n", "\n", "for bench_name in [\"SNEB\", \"SWEB\", \"SDB1\"]:\n", " quad_tf[bench_name] = model.run(\n", " FrequencyResponse(\n", " geomspace(5, 10000, 1000), [\"{}_z\".format(bench_name)], [B1_detector]\n", " )\n", " )\n", "\n", "quad_tf[\"DARM\"] = model.run(\n", " FrequencyResponse(geomspace(5, 10000, 1000), [\"DARM\"], [B1_detector])\n", ")\n", "\n", "model.SNEB.phi = model.NE.phi\n", "model.SWEB.phi = model.WE.phi\n", "model.SDB1.phi = model.SR.phi\n", "\n", "for bench_name in [\"SNEB\", \"SWEB\", \"SDB1\"]:\n", " in_tf[bench_name] = model.run(\n", " FrequencyResponse(\n", " geomspace(5, 10000, 1000), [\"{}_z\".format(bench_name)], [B1_detector]\n", " )\n", " )\n", "\n", "in_tf[\"DARM\"] = model.run(\n", " FrequencyResponse(geomspace(5, 10000, 1000), [\"DARM\"], [B1_detector])\n", ")\n", "\n", "modelisation_file = Path(\"optickle.mat\")\n", "\n", "modelisation_data = loadmat(modelisation_file)\n", "coupling_data: dict[str, list[Signal]] = dict()\n", "old_couplings = [\"SNEB\", \"SWEB\", \"SDB1\"]\n", "for coupling in old_couplings:\n", " coupling_data[coupling] = [\n", " Signal(\n", " modelisation_data[\"freq\"][0],\n", " abs(values),\n", " )\n", " for values in modelisation_data[\"{}coupling\".format(coupling)]\n", " ]\n", "DARMcoupling = Signal(\n", " modelisation_data[\"freq\"][0],\n", " modelisation_data[\"DARMmat\"][0],\n", ")" ] }, { "cell_type": "markdown", "id": "be43f8b2-eddf-4dfc-a342-a54017b571f6", "metadata": {}, "source": [ "### En fonction de la phase" ] }, { "cell_type": "code", "execution_count": null, "id": "61c3d4e0-b8bc-48e0-83cd-5675c62feba1", "metadata": {}, "outputs": [], "source": [ "Figure = figure(figsize=(14, 5))\n", "_ = Figure.suptitle(\"Comparaison du module des fonctions de transfert pour DARM\")\n", "ax = Figure.add_subplot(1, 2, 1)\n", "_ = ax.loglog(\n", " quad_tf[\"DARM\"].f, abs(quad_tf[\"DARM\"][B1_detector, \"DARM\"]), label=\"Finesse\"\n", ")\n", "_ = ax.loglog(DARMcoupling.x, abs(DARMcoupling.y), label=\"Optickle\")\n", "_ = ax.set_title(\"En quadrature de phase\")\n", "_ = ax.legend()\n", "ax.grid(True, \"both\", \"both\")\n", "ax = Figure.add_subplot(1, 2, 2)\n", "_ = ax.loglog(in_tf[\"DARM\"].f, abs(in_tf[\"DARM\"][B1_detector, \"DARM\"]), label=\"Finesse\")\n", "_ = ax.loglog(DARMcoupling.x, abs(DARMcoupling.y), label=\"Optickle\")\n", "_ = ax.set_title(\"En phase\")\n", "_ = ax.legend()\n", "ax.grid(True, \"both\", \"both\")\n", "\n", "Figure = figure(figsize=(14, 5))\n", "_ = Figure.suptitle(\"Comparaison de la phase des fonctions de transfert pour DARM\")\n", "ax = Figure.add_subplot(1, 2, 1)\n", "_ = ax.semilogx(\n", " quad_tf[\"DARM\"].f,\n", " angle(quad_tf[\"DARM\"][B1_detector, \"DARM\"]) * 180 / pi,\n", " label=\"Finesse\",\n", ")\n", "_ = ax.semilogx(\n", " DARMcoupling.x, angle(DARMcoupling.y) * 180 / pi - 180, label=\"Optickle\"\n", ")\n", "_ = ax.set_title(\"En quadrature de phase\")\n", "_ = ax.hlines([-45], min(quad_tf[\"DARM\"].f), max(quad_tf[\"DARM\"].f), colors=\"red\")\n", "_ = ax.legend()\n", "ax.grid(True, \"both\", \"both\")\n", "ax = Figure.add_subplot(1, 2, 2)\n", "_ = ax.semilogx(\n", " in_tf[\"DARM\"].f,\n", " angle(in_tf[\"DARM\"][B1_detector, \"DARM\"]) * 180 / pi,\n", " label=\"Finesse\",\n", ")\n", "_ = ax.semilogx(\n", " DARMcoupling.x, angle(DARMcoupling.y) * 180 / pi - 180, label=\"Optickle\"\n", ")\n", "_ = ax.set_title(\"En phase\")\n", "_ = ax.hlines([-45], min(quad_tf[\"DARM\"].f), max(quad_tf[\"DARM\"].f), colors=\"red\")\n", "_ = ax.legend()\n", "ax.grid(True, \"both\", \"both\")\n", "\n", "for bench_name in [\"SNEB\", \"SWEB\", \"SDB1\"]:\n", " in_index = 0\n", " if bench_name == \"SDB1\":\n", " in_index = 0\n", " quad_index = (1 + in_index) % 2\n", " Figure = figure(figsize=(14, 5))\n", " _ = Figure.suptitle(\n", " \"Comparaison du module des fonctions de transfert pour {}\".format(bench_name)\n", " )\n", " ax = Figure.add_subplot(1, 2, 1)\n", " _ = ax.loglog(\n", " quad_tf[bench_name].f,\n", " abs(quad_tf[bench_name][B1_detector, \"{}_z\".format(bench_name)])\n", " / abs(quad_tf[\"DARM\"][B1_detector, \"DARM\"])\n", " / model.space_NI_NE.L.eval(),\n", " label=\"Finesse\",\n", " )\n", " _ = ax.loglog(\n", " coupling_data[bench_name][quad_index].x,\n", " abs(coupling_data[bench_name][quad_index].y),\n", " label=\"Optickle\",\n", " )\n", " _ = ax.set_title(\"En Quadrature de phase\")\n", " _ = ax.legend()\n", " ax.grid(True, \"both\", \"both\")\n", " ax = Figure.add_subplot(1, 2, 2)\n", " _ = ax.loglog(\n", " in_tf[bench_name].f,\n", " abs(in_tf[bench_name][B1_detector, \"{}_z\".format(bench_name)])\n", " / abs(in_tf[\"DARM\"][B1_detector, \"DARM\"])\n", " / model.space_NI_NE.L.eval(),\n", " label=\"Finesse\",\n", " )\n", " _ = ax.loglog(\n", " coupling_data[bench_name][in_index].x,\n", " abs(coupling_data[bench_name][in_index].y),\n", " label=\"Optickle\",\n", " )\n", " _ = ax.set_title(\"En phase\")\n", " _ = ax.legend()\n", " ax.grid(True, \"both\", \"both\")\n", " console.print()" ] }, { "cell_type": "markdown", "id": "11606546-2606-404c-a75e-6e434d19084b", "metadata": {}, "source": [ "### En fonction de la simulation" ] }, { "cell_type": "code", "execution_count": null, "id": "88002141-6a42-4ae0-a614-4c2b8dd336ac", "metadata": {}, "outputs": [], "source": [ "for bench_name in [\"SNEB\", \"SWEB\", \"SDB1\"]:\n", " in_index = 0\n", " if bench_name == \"SDB1\":\n", " in_index = 0\n", " quad_index = (1 + in_index) % 2\n", " Figure = figure(figsize=(14, 5))\n", " _ = Figure.suptitle(\n", " \"Comparaison des fonctions de transfert pour {}\".format(bench_name)\n", " )\n", " ax = Figure.add_subplot(1, 2, 1)\n", " _ = ax.loglog(\n", " quad_tf[bench_name].f,\n", " abs(quad_tf[bench_name][B1_detector, \"{}_z\".format(bench_name)])\n", " / abs(quad_tf[\"DARM\"][B1_detector, \"DARM\"])\n", " / model.space_NI_NE.L.eval(),\n", " label=\"Quadrature de phase\",\n", " )\n", " _ = ax.loglog(\n", " in_tf[bench_name].f,\n", " abs(in_tf[bench_name][B1_detector, \"{}_z\".format(bench_name)])\n", " / abs(in_tf[\"DARM\"][B1_detector, \"DARM\"])\n", " / model.space_NI_NE.L.eval(),\n", " label=\"En phase\",\n", " )\n", " _ = ax.set_title(\"Finesse\")\n", " _ = ax.legend()\n", " ax.grid(True, \"both\", \"both\")\n", " ax = Figure.add_subplot(1, 2, 2)\n", " _ = ax.loglog(\n", " coupling_data[bench_name][quad_index].x,\n", " abs(coupling_data[bench_name][quad_index].y),\n", " label=\"Quadrature de phase\",\n", " )\n", " _ = ax.loglog(\n", " coupling_data[bench_name][in_index].x,\n", " abs(coupling_data[bench_name][in_index].y),\n", " label=\"En phase\",\n", " )\n", " _ = ax.set_title(\"Optickle\")\n", " _ = ax.legend()\n", " ax.grid(True, \"both\", \"both\")\n", " show()" ] }, { "cell_type": "markdown", "id": "0c70d12b-b5ae-44b7-b0d3-6f054b697300", "metadata": {}, "source": [ "### En fonction du module/phase" ] }, { "cell_type": "code", "execution_count": null, "id": "cb1fd40c-83bb-4dc3-b259-7dd3a08d3b6b", "metadata": {}, "outputs": [], "source": [ "for bench_name in [\"SNEB\", \"SWEB\", \"SDB1\"]:\n", " Figure = figure(figsize=(14, 5))\n", " _ = Figure.suptitle(\n", " \"Comparaison des fonctions de transfert pour {}\".format(bench_name)\n", " )\n", " ax = Figure.add_subplot(1, 2, 1)\n", " _ = ax.loglog(\n", " quad_tf[bench_name].f,\n", " abs(quad_tf[bench_name][B1_detector, \"{}_z\".format(bench_name)])\n", " / abs(quad_tf[\"DARM\"][B1_detector, \"DARM\"])\n", " / model.space_NI_NE.L.eval(),\n", " label=\"Quadrature de phase\",\n", " )\n", " _ = ax.loglog(\n", " in_tf[bench_name].f,\n", " abs(in_tf[bench_name][B1_detector, \"{}_z\".format(bench_name)])\n", " / abs(in_tf[\"DARM\"][B1_detector, \"DARM\"])\n", " / model.space_NI_NE.L.eval(),\n", " label=\"En phase\",\n", " )\n", " _ = ax.set_title(\"Module\")\n", " _ = ax.legend()\n", " ax.grid(True, \"both\", \"both\")\n", " ax = Figure.add_subplot(1, 2, 2)\n", " _ = ax.semilogx(\n", " quad_tf[bench_name].f,\n", " angle(quad_tf[bench_name][B1_detector, \"{}_z\".format(bench_name)]) * 180 / pi,\n", " label=\"Quadrature de phase\",\n", " )\n", " _ = ax.semilogx(\n", " in_tf[bench_name].f,\n", " angle(in_tf[bench_name][B1_detector, \"{}_z\".format(bench_name)]) * 180 / pi,\n", " label=\"En phase\",\n", " )\n", " _ = ax.set_title(\"Finesse\")\n", " _ = ax.legend()\n", " ax.grid(True, \"both\", \"both\")\n", " show()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.13.2" } }, "nbformat": 4, "nbformat_minor": 5 }