{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import math,numpy\n", "import pandas\n", "from scipy import linalg\n", "import gaiaxpy\n", "import pyvo" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'1.1.4'" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "gaiaxpy.__version__" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Reconstruct XP covariance matrices" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "srv = pyvo.tap.TAPService(\"https://gaia.ari.uni-heidelberg.de/tap\")\n", "res = srv.run_sync(\n", " \"select * from gaiadr3.xp_continuous_mean_spectrum\"\n", " \" where source_id=6223408420864\").to_table()\n", "Data = res[0]" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# BP\n", "CoeffsBP = numpy.array(Data['bp_coefficients'], dtype=numpy.float)\n", "ErrorsBP = numpy.array(Data['bp_coefficient_errors'], dtype=numpy.float64)\n", "CorrelationsBP = numpy.array(Data['bp_coefficient_correlations'], dtype=numpy.float64)\n", "Ncoeffs = len(ErrorsBP)\n", "CovarBP = numpy.zeros([Ncoeffs,Ncoeffs])\n", "index = 0\n", "for j in range(Ncoeffs):\n", " CovarBP[j,j] = ErrorsBP[j]*ErrorsBP[j]\n", " for i in range(j):\n", " # upper triangular\n", " CovarBP[j,i] = CorrelationsBP[index]*ErrorsBP[j]*ErrorsBP[i]\n", " CovarBP[i,j] = CovarBP[j,i]\n", " index = index + 1\n", "# RP\n", "CoeffsRP = numpy.array(Data['rp_coefficients'], dtype=numpy.float)\n", "ErrorsRP = numpy.array(Data['rp_coefficient_errors'], dtype=numpy.float64)\n", "CorrelationsRP = numpy.array(Data['rp_coefficient_correlations'], dtype=numpy.float64)\n", "Ncoeffs = len(ErrorsRP)\n", "CovarRP = numpy.zeros([Ncoeffs,Ncoeffs])\n", "index = 0\n", "for j in range(Ncoeffs):\n", " CovarRP[j,j] = ErrorsRP[j]*ErrorsRP[j]\n", " for i in range(j):\n", " # upper triangular\n", " CovarRP[j,i] = CorrelationsRP[index]*ErrorsRP[j]*ErrorsRP[i]\n", " CovarRP[i,j] = CovarRP[j,i]\n", " index = index + 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Choleksy decomposition: $C=L\\cdot L^T$" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "LBP = linalg.cholesky(CovarBP)\n", "LRP = linalg.cholesky(CovarRP)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# MC sampling" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* normal random variate $u\\sim {\\rm Normal}(0,1)$\n", "* Cholesky decomposition $C=L\\cdot L^T$\n", "* random variate $x = L\\cdot u$\n", "* covariance of $x$: \n", "\\begin{equation}\n", "\\langle x\\cdot x^T\\rangle\n", "=\\langle L\\cdot u\\cdot u^T\\cdot L^T\\rangle\n", "=L\\cdot \\underbrace{\\langle u\\cdot u^T\\rangle}_{=I}\\cdot L^T\n", "=L\\cdot L^T = C\n", "\\end{equation}" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "# Number of Monte-Carlo samples\n", "N_SAMPLE = 100\n", "\n", "numpy.random.seed(1)\n", "\n", "bpLength, rpLength = len(CoeffsBP), len(CoeffsRP)\n", "\n", "recs = []\n", "for s in range(N_SAMPLE):\n", " newRec = dict(Data)\n", " newRec[\"bp_coefficients\"] = CoeffsBP + numpy.dot(\n", " LBP, numpy.random.normal(0, 1, bpLength)) \n", " newRec[\"rp_coefficients\"] = CoeffsRP + numpy.dot(\n", " LBP, numpy.random.normal(0, 1, rpLength))\n", " recs.append(newRec)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Compute sampled spectra for each noise realisation" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Processing data [1%]\r", " \r", "Processing data [2%]\r", " \r", "Processing data [3%]\r", " \r", "Processing data [4%]\r", " \r", "Processing data [5%]\r", " \r", "Processing data [6%]\r", " \r", "Processing data [7%]\r", " \r", "Processing data [8%]\r", " \r", "Processing data [9%]\r", " \r", "Processing data [10%]\r", " \r", "Processing data [11%]\r", " \r", "Processing data [12%]\r", " \r", "Processing data [13%]\r", " \r", "Processing data [14%]\r", " \r", "Processing data [15%]\r", " \r", "Processing data [16%]\r", " \r", "Processing data [17%]\r", " \r", "Processing data [18%]\r", " \r", "Processing data [19%]\r", " \r", "Processing data [20%]\r", " \r", "Processing data [21%]\r", " \r", "Processing data [22%]\r", " \r", "Processing data [23%]\r", " \r", "Processing data [24%]\r", " \r", "Processing data [25%]\r", " \r", "Processing data [26%]\r", " \r", "Processing data [27%]\r", " \r", "Processing data [28%]\r", " \r", "Processing data [29%]\r", " \r", "Processing data [30%]\r", " \r", "Processing data [31%]\r", " \r", "Processing data [32%]\r", " \r", "Processing data [33%]\r", " \r", "Processing data [34%]\r", " \r", "Processing data [35%]\r", " \r", "Processing data [36%]\r", " \r", "Processing data [37%]\r", " \r", "Processing data [38%]\r", " \r", "Processing data [39%]\r", " \r", "Processing data [40%]\r", " \r", "Processing data [41%]\r", " \r", "Processing data [42%]\r", " \r", "Processing data [43%]\r", " \r", "Processing data [44%]\r", " \r", "Processing data [45%]\r", " \r", "Processing data [46%]\r", " \r", "Processing data [47%]\r", " \r", "Processing data [48%]\r", " \r", "Processing data [49%]\r", " \r", "Processing data [50%]\r", " \r", "Processing data [51%]\r", " \r", "Processing data [52%]\r", " \r", "Processing data [53%]\r", " \r", "Processing data [54%]\r", " \r", "Processing data [55%]\r", " \r", "Processing data [56%]\r", " \r", "Processing data [57%]\r", " \r", "Processing data [58%]\r", " \r", "Processing data [59%]\r", " \r", "Processing data [60%]\r", " \r", "Processing data [61%]\r", " \r", "Processing data [62%]\r", " \r", "Processing data [63%]\r", " \r", "Processing data [64%]\r", " \r", "Processing data [65%]\r", " \r", "Processing data [66%]\r", " \r", "Processing data [67%]\r", " \r", "Processing data [68%]\r", " \r", "Processing data [69%]\r", " \r", "Processing data [70%]\r", " \r", "Processing data [71%]\r", " \r", "Processing data [72%]\r", " \r", "Processing data [73%]\r", " \r", "Processing data [74%]\r", " \r", "Processing data [75%]\r", " \r", "Processing data [76%]\r", " \r", "Processing data [77%]\r", " \r", "Processing data [78%]\r", " \r", "Processing data [79%]\r", " \r", "Processing data [80%]\r", " \r", "Processing data [81%]\r", " \r", "Processing data [82%]\r", " \r", "Processing data [83%]\r", " \r", "Processing data [84%]\r", " \r", "Processing data [85%]\r", " \r", "Processing data [86%]\r", " \r", "Processing data [87%]\r", " \r", "Processing data [88%]\r", " \r", "Processing data [89%]\r", " \r", "Processing data [90%]\r", " \r", "Processing data [91%]\r", " \r", "Processing data [92%]\r", " \r", "Processing data [93%]\r", " \r", "Processing data [94%]\r", " \r", "Processing data [95%]\r", " \r", "Processing data [96%]\r", " \r", "Processing data [97%]\r", " \r", "Processing data [98%]\r", " \r", "Processing data [99%]\r", " \r", "Processing data [100%]\r", " \r" ] } ], "source": [ "SPECTRAL_POINTS = numpy.array([400.+10*i for i in range(41)])\n", "calib = gaiaxpy.calibrator.calibrator.calibrate(\n", " pandas.DataFrame.from_records(recs),\n", " sampling=SPECTRAL_POINTS,\n", " truncation=True,\n", " save_file=False)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "spec = numpy.mean(calib[0][\"flux\"])" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from matplotlib import pyplot\n", "pyplot.plot(calib[1], spec)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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.9.2" } }, "nbformat": 4, "nbformat_minor": 2 }