add current code

This commit is contained in:
linarphy 2025-04-09 13:44:31 +02:00
commit 8caa4f227b
Signed by: linarphy
GPG key ID: 0CBF02E039B4FFFF
5 changed files with 2976 additions and 0 deletions

697
bad weather.ipynb Normal file

File diff suppressed because one or more lines are too long

582
main.ipynb Normal file
View file

@ -0,0 +1,582 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"id": "6c9023fe-f86d-428a-8072-4264ff672025",
"metadata": {},
"outputs": [],
"source": [
"from pathlib import Path\n",
"\n",
"from rich.console import Console\n",
"from rich.table import Table\n",
"\n",
"from numpy import loadtxt\n",
"\n",
"from numpy import float32, bool as np_bool\n",
"from numpy.typing import NDArray\n",
"from typing import Any\n",
"from collections.abc import Callable"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "2d82f94d-b69a-4ad0-b042-08d045925545",
"metadata": {},
"outputs": [],
"source": [
"from numpy import mean, diff, sqrt, pi, linspace\n",
"from numpy.random import default_rng\n",
"\n",
"from backscattering_analyzer.experiment import Experiment\n",
"from backscattering_analyzer.acquisition import AcquisitionType\n",
"\n",
"from matplotlib.pyplot import figure, show\n",
"\n",
"from science_signal import Signal\n",
"from science_signal.generator import sin as sin_gen"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "d91d36b8-28fb-40d8-a4e6-77b659839fbe",
"metadata": {},
"outputs": [],
"source": [
"from labellines import labelLines # from matplotlib-label-lines"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "62328640-6c4f-47a1-8461-9637a50f52e5",
"metadata": {},
"outputs": [],
"source": [
"def is_over(signal1: Signal, signal2: Signal) -> bool:\n",
" \"\"\"\n",
" True if signal1 is over signal2\n",
" \"\"\"\n",
" return not ((signal1 - signal2).y < 0).any()\n",
"\n",
"\n",
"def get_speed(signal: Signal) -> NDArray[float32]:\n",
" \"\"\"\n",
" get speed from position signal\n",
" \"\"\"\n",
" return 1 / mean(diff(signal.x)) * diff(signal.y)\n",
"\n",
"\n",
"def compute_rms(signal: NDArray[float32]) -> float:\n",
" \"\"\"\n",
" compute RMS of data\n",
" \"\"\"\n",
" return sqrt(mean(signal**2)) # pyright: ignore[reportAny]\n",
"\n",
"\n",
"def accelerate_timesignal(factor: float, signal: Signal) -> Signal:\n",
" \"\"\"\n",
" accelerate a signal by a factor\n",
" \"\"\"\n",
" return Signal(\n",
" signal.x[0] + (signal.x - signal.x[0]) * (1 / factor),\n",
" signal.y,\n",
" )\n",
"\n",
"\n",
"def generate_movement(max_speed: float, start: int, end: int) -> Signal:\n",
" \"\"\"\n",
" generate a sine movement with a given maximum speed\n",
" \"\"\"\n",
" amplitude: float = sqrt(max_speed / (2 * pi))\n",
" frequency: float = sqrt(max_speed / (2 * pi))\n",
" signal = sin_gen(end - start, 1000, frequency, amplitude)\n",
" return Signal(\n",
" start + signal.x,\n",
" signal.y,\n",
" )\n",
"\n",
"\n",
"def fit_value(\n",
" start: float,\n",
" end: float,\n",
" nb_loop: int,\n",
" experiment: Experiment,\n",
" reference: Signal,\n",
" generate: Callable[[float, Any], Signal],\n",
" condition: Callable[[Signal, Signal], np_bool | bool],\n",
" generate_args: list[Any],\n",
") -> float:\n",
" \"\"\"\n",
" find the value that is the closest to NOT respecting the condition function\n",
" Considering it start by not respecting the condition, and after some time, it will\n",
" \"\"\"\n",
" for _ in range(nb_loop):\n",
" values = linspace(start, end, 10, dtype=float32)\n",
" detected = False\n",
" for j in range(len(values)):\n",
" value = values[j]\n",
" experiment.reference_movement = generate(value, *generate_args)\n",
" experiment.projection_reference = experiment.compute_projection(\n",
" AcquisitionType.REFERENCE\n",
" )\n",
" if (\n",
" not condition(reference, experiment.projection_reference)\n",
" and not detected\n",
" ):\n",
" detected = True\n",
" end = value\n",
" start = values[j - 1]\n",
" if not detected:\n",
" raise Exception(\"not in range\")\n",
" return start + (end - start) / 2"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "587e2e3a-767b-4a6e-80df-188b6152bbb4",
"metadata": {},
"outputs": [],
"source": [
"console = Console()\n",
"o5_mat = (\n",
" Path(\"/home/demagny/data\")\n",
" / \"simulation\"\n",
" / \"optickle\"\n",
" / \"transfer_function\"\n",
" / \"O5.mat\"\n",
")\n",
"sensitivities: dict[str, Signal] = dict()\n",
"for name in [\"high\", \"low\"]:\n",
" data = loadtxt(\n",
" Path(\n",
" \"/home/demagny/data/sensitivity/O5/23932_O5{}SensASD.txt\".format(\n",
" name.capitalize()\n",
" )\n",
" ),\n",
" dtype=float32,\n",
" )\n",
" sensitivities[name] = Signal(\n",
" data[:, 0],\n",
" data[:, 1],\n",
" )\n",
"sensitivities[\"high\"].y /= 10"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "b7f534cc-0b50-4fc1-ba62-8a36747eb646",
"metadata": {},
"outputs": [],
"source": [
"C_BENCH = \"SDB1\"\n",
"C_COUPLING = \"../main_script_virgo/values-coupling.toml\""
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a72635ea-8395-4783-9be1-8a89e82b7e21",
"metadata": {},
"outputs": [],
"source": [
"base_experiment = Experiment(C_BENCH, \"2024_06_07\", C_COUPLING, 0.1)\n",
"temp_experiment = Experiment(C_BENCH, \"2024_06_07\", C_COUPLING, 0.1)\n",
"base_experiment.factors = {\"pre\": 2e-10 * 1e6, \"true\": 2e-10}\n",
"temp_experiment.factors = {\"pre\": 2e-10 * 1e6, \"true\": 2e-10}\n",
"base_experiment.modelisation_file = str(o5_mat)\n",
"temp_experiment.modelisation_file = str(o5_mat)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "850dd2af-2b7b-43b3-8758-6b36d9bced20",
"metadata": {},
"outputs": [],
"source": [
"factor = default_rng().random(1) * 10\n",
"# check if frequency is multiplied by the factor after going into accelerate_timesignal function\n",
"assert (\n",
" abs(\n",
" factor / mean(diff(base_experiment.reference_movement.x))\n",
" - 1\n",
" / mean(\n",
" diff(accelerate_timesignal(factor, base_experiment.reference_movement).x)\n",
" )\n",
" )\n",
" < 1e-1\n",
"), abs(\n",
" factor / mean(diff(base_experiment.reference_movement.x))\n",
" - 1\n",
" / mean(diff(accelerate_timesignal(factor, base_experiment.reference_movement).x))\n",
")\n",
"# check if amplitude is not modified after going into accelerate_timesignal function\n",
"assert (\n",
" base_experiment.reference_movement.y\n",
" == accelerate_timesignal(factor, base_experiment.reference_movement).y\n",
").all(), (\n",
" base_experiment.reference_movement.y\n",
" - accelerate_timesignal(factor, base_experiment.reference_movement).y\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "8dbb68d6-fba3-4488-b951-b5bf860152d2",
"metadata": {},
"outputs": [],
"source": [
"high_fitted_value = fit_value(\n",
" 1e-6,\n",
" 1e-5,\n",
" 5,\n",
" temp_experiment,\n",
" sensitivities[\"high\"],\n",
" generate_movement,\n",
" is_over,\n",
" [\n",
" base_experiment.reference_movement.x[0],\n",
" base_experiment.reference_movement.x[-1],\n",
" ],\n",
")\n",
"low_fitted_value = fit_value(\n",
" 1e-6,\n",
" 1e-5,\n",
" 5,\n",
" temp_experiment,\n",
" sensitivities[\"low\"],\n",
" generate_movement,\n",
" is_over,\n",
" [\n",
" base_experiment.reference_movement.x[0],\n",
" base_experiment.reference_movement.x[-1],\n",
" ],\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "132a82c5-b69b-402c-b278-c565ccf6e504",
"metadata": {},
"outputs": [],
"source": [
"high_movement = generate_movement(\n",
" high_fitted_value,\n",
" base_experiment.reference_movement.x[0],\n",
" base_experiment.reference_movement.x[-1],\n",
")\n",
"temp_experiment.reference_movement = high_movement\n",
"high_projection = temp_experiment.compute_projection(AcquisitionType.REFERENCE)\n",
"low_movement = generate_movement(\n",
" low_fitted_value,\n",
" base_experiment.reference_movement.x[0],\n",
" base_experiment.reference_movement.x[-1],\n",
")\n",
"temp_experiment.reference_movement = low_movement\n",
"low_projection = temp_experiment.compute_projection(AcquisitionType.REFERENCE)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "2966a38e-9020-4cdd-a186-70519afb85de",
"metadata": {},
"outputs": [],
"source": [
"Figure = figure()\n",
"_ = Figure.gca().loglog(\n",
" high_projection.x, high_projection.y, label=\"projection for high\"\n",
")\n",
"_ = Figure.gca().loglog(\n",
" sensitivities[\"high\"].x,\n",
" sensitivities[\"high\"].y,\n",
" label=\"one order below high sensitivity\",\n",
")\n",
"_ = Figure.gca().loglog(low_projection.x, low_projection.y, label=\"projection for low\")\n",
"_ = Figure.gca().loglog(\n",
" sensitivities[\"low\"].x, sensitivities[\"low\"].y, label=\"low sensitivity\"\n",
")\n",
"_ = Figure.gca().legend()\n",
"Figure.gca().grid(True, \"both\", \"both\")\n",
"show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "cf7aa342-1ffe-4262-80fd-e900acf590c0",
"metadata": {},
"outputs": [],
"source": [
"table = Table(title=\"Vérification des calculs: haute sensibilité\")\n",
"table.add_column(\"nom\")\n",
"table.add_column(\"RMS\")\n",
"table.add_column(\"vitesse max\")\n",
"\n",
"table.add_row(\n",
" \"calculé\",\n",
" \"{:.2E}\".format(high_fitted_value / sqrt(2)),\n",
" \"{:.2E}\".format(high_fitted_value),\n",
")\n",
"table.add_row(\n",
" \"mesuré\",\n",
" \"{:.2E}\".format(\n",
" compute_rms(get_speed(high_movement)),\n",
" ),\n",
" \"{:.2E}\".format(\n",
" max(get_speed(high_movement)),\n",
" ),\n",
")\n",
"\n",
"console.print(table)\n",
"\n",
"table = Table(title=\"Vérification des calculs: basse sensibilité\")\n",
"table.add_column(\"nom\")\n",
"table.add_column(\"RMS\")\n",
"table.add_column(\"vitesse max\")\n",
"\n",
"table.add_row(\n",
" \"calculé\",\n",
" \"{:.2E}\".format(low_fitted_value / sqrt(2)),\n",
" \"{:.2E}\".format(low_fitted_value),\n",
")\n",
"table.add_row(\n",
" \"mesuré\",\n",
" \"{:.2E}\".format(\n",
" compute_rms(get_speed(low_movement)),\n",
" ),\n",
" \"{:.2E}\".format(\n",
" max(get_speed(low_movement)),\n",
" ),\n",
")\n",
"\n",
"console.print(table)"
]
},
{
"cell_type": "markdown",
"id": "a7ca8aea-80f5-4306-916d-a4cb9240bd1b",
"metadata": {},
"source": [
"# Utilisation du mouvement réel du banc"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "c61da9e2-0339-4345-b601-395ef00b380c",
"metadata": {},
"outputs": [],
"source": [
"high_fitted_value = fit_value(\n",
" 1,\n",
" 3,\n",
" 5,\n",
" temp_experiment,\n",
" sensitivities[\"high\"],\n",
" accelerate_timesignal,\n",
" is_over,\n",
" [\n",
" base_experiment.reference_movement,\n",
" ],\n",
")\n",
"low_fitted_value = fit_value(\n",
" 1,\n",
" 6,\n",
" 5,\n",
" temp_experiment,\n",
" sensitivities[\"low\"],\n",
" accelerate_timesignal,\n",
" is_over,\n",
" [\n",
" base_experiment.reference_movement,\n",
" ],\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "13cbbcf4-4753-4cef-90a3-83477177a102",
"metadata": {},
"outputs": [],
"source": [
"high_movement = accelerate_timesignal(\n",
" high_fitted_value, base_experiment.reference_movement\n",
")\n",
"low_movement = accelerate_timesignal(\n",
" low_fitted_value, base_experiment.reference_movement\n",
")\n",
"temp_experiment.reference_movement = high_movement\n",
"high_projection = temp_experiment.compute_projection(AcquisitionType.REFERENCE)\n",
"temp_experiment.reference_movement = low_movement\n",
"low_projection = temp_experiment.compute_projection(AcquisitionType.REFERENCE)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "12b9b3ee-a882-4088-9705-5c8a4c38834c",
"metadata": {},
"outputs": [],
"source": [
"table = Table(title=\"Vérification des calculs: haute sensibilité\")\n",
"table.add_column(\"nom\")\n",
"table.add_column(\"RMS\")\n",
"table.add_column(\"vitesse max\")\n",
"\n",
"table.add_row(\n",
" \"calculé\",\n",
" \"{:.2E}\".format(\n",
" compute_rms(get_speed(base_experiment.reference_movement)) * high_fitted_value\n",
" ),\n",
" \"{:.2E}\".format(\n",
" max(get_speed(base_experiment.reference_movement)) * high_fitted_value\n",
" ),\n",
")\n",
"table.add_row(\n",
" \"mesuré\",\n",
" \"{:.2E}\".format(\n",
" compute_rms(get_speed(high_movement)),\n",
" ),\n",
" \"{:.2E}\".format(\n",
" max(get_speed(high_movement)),\n",
" ),\n",
")\n",
"\n",
"console.print(table)\n",
"\n",
"table = Table(title=\"Vérification des calculs: basse sensibilité\")\n",
"table.add_column(\"nom\")\n",
"table.add_column(\"RMS\")\n",
"table.add_column(\"vitesse max\")\n",
"\n",
"table.add_row(\n",
" \"calculé\",\n",
" \"{:.2E}\".format(\n",
" compute_rms(get_speed(base_experiment.reference_movement)) * low_fitted_value\n",
" ),\n",
" \"{:.2E}\".format(\n",
" max(get_speed(base_experiment.reference_movement)) * low_fitted_value\n",
" ),\n",
")\n",
"table.add_row(\n",
" \"mesuré\",\n",
" \"{:.2E}\".format(\n",
" compute_rms(get_speed(low_movement)),\n",
" ),\n",
" \"{:.2E}\".format(\n",
" max(get_speed(low_movement)),\n",
" ),\n",
")\n",
"\n",
"console.print(table)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5ff45ff8-8d0f-4f9a-a060-839700121e43",
"metadata": {},
"outputs": [],
"source": [
"Figure = figure(figsize=(8, 5))\n",
"_ = Figure.gca().loglog(\n",
" high_projection.x,\n",
" high_projection.y,\n",
" label=\"rms = {:.2E}, max = {:.2E}\".format(\n",
" compute_rms(get_speed(high_movement)), max(get_speed(high_movement))\n",
" ),\n",
")\n",
"_ = Figure.gca().loglog(\n",
" low_projection.x,\n",
" low_projection.y,\n",
" label=\"rms= {:.2E} max= {:.2E}\".format(\n",
" compute_rms(get_speed(low_movement)), max(get_speed(low_movement))\n",
" ),\n",
")\n",
"_ = Figure.gca().loglog(\n",
" sensitivities[\"low\"].x, sensitivities[\"low\"].y, label=\"low sensitivity\"\n",
")\n",
"_ = Figure.gca().loglog(\n",
" sensitivities[\"high\"].x,\n",
" sensitivities[\"high\"].y,\n",
" label=\"one order below high sensitivity\",\n",
")\n",
"\n",
"labelLines(Figure.gca().get_lines(), xvals=[9, 20, 50, 50], align=False)\n",
"\n",
"# _ = Figure.gca().legend(loc=\"upper right\")\n",
"_ = Figure.gca().set_xlim(5, 100)\n",
"_ = Figure.gca().set_ylim(1e-26, 1e-18)\n",
"_ = Figure.gca().set_xlabel(\"Frequencies Hz\")\n",
"_ = Figure.gca().set_ylabel(\"Sensitivity $\\\\frac { 1 } { \\\\sqrt{ Hz } }$\")\n",
"_ = Figure.gca().set_title(\"projection of noise from backscatterd light on SRB\")\n",
"Figure.gca().grid(True, \"both\", \"both\")\n",
"show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5e985e2c-ac0d-4ba7-8527-cadf16fcb22d",
"metadata": {},
"outputs": [],
"source": [
"console.print(\n",
" \"base rms: [repr.number]{:.2E}[/repr.number]\\nbase max speed: [repr.number]{:.2E}[/repr.number]\".format(\n",
" compute_rms(get_speed(base_experiment.reference_movement)),\n",
" max(get_speed(base_experiment.reference_movement)),\n",
" )\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5f447e42-d7a9-4c69-8721-d6c21ba0cf15",
"metadata": {},
"outputs": [],
"source": [
"console.print(high_fitted_value, low_fitted_value)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "9ef341b0-8d63-4130-81f7-82cdad1b0052",
"metadata": {},
"outputs": [],
"source": []
}
],
"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
}

5
mise.toml Normal file
View file

@ -0,0 +1,5 @@
[tools]
python = "3.13.2"
[env]
_.python.venv = { path = ".venv", create = true, uv_create_args = ["--seed"] }

22
pyproject.toml Normal file
View file

@ -0,0 +1,22 @@
[project]
name = "jupyter-speed"
version = "0.1.0"
description = "Jupyter work to compute and check maximum speed accepted on benches on Virgo"
authors = [{name = "augustin.demagny", email = "augustin.demagny@ligo.org"}]
readme = "README.md"
requires-python = ">=3.13"
dependencies = [
"backscattering-analyzer",
"basedpyright>=1.28.4",
"ipympl>=0.9.7",
"jupyter-lsp>=2.2.5",
"jupyterlab>=4.4.0",
"matplotlib-label-lines>=0.8.0",
"rich>=14.0.0",
"ruff>=0.11.4",
"science-signal",
]
[tool.uv.sources]
science-signal = { path = "../main_script_virgo/modules/science_signal" }
backscattering-analyzer = { path = "../main_script_virgo/modules/backscattering-analyzer" }

1670
uv.lock Normal file

File diff suppressed because it is too large Load diff