{ "cells": [ { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "import pymongo\n", "import xarray_mongodb\n", "import bson\n", "import datetime\n", "\n", "# datetime.datetime.utcnow()" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "mongoClient = pymongo.MongoClient()\n", "mongoDB = mongoClient.testDB\n", "mongoCollection = mongoDB.testCollection" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Task executing\n", "\n", "Task2 executing \n", "\n", "Task done\n", "Task2 done\n", "\n", "\n" ] } ], "source": [ "from time import sleep\n", "from multiprocessing.pool import ThreadPool\n", " \n", "# task executed in a worker thread\n", "def task():\n", " # report a message\n", " print(f'Task executing\\n')\n", " # block for a moment\n", " sleep(1)\n", " # report a message\n", " print(f'Task done\\n')\n", " \n", "def task2():\n", " # report a message\n", " print(f'Task2 executing \\n')\n", " # block for a moment\n", " sleep(1)\n", " # report a message\n", " print(f'Task2 done\\n')\n", " \n", "# protect the entry point\n", "if __name__ == '__main__':\n", " # create and configure the thread pool\n", " pool = ThreadPool()\n", " # issue tasks to the thread pool\n", " pool.apply_async(task)\n", " pool.apply_async(task2)\n", " # close the thread pool\n", " pool.close()\n", " # wait for all tasks to finish\n", " pool.join()" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Import supporting package" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [], "source": [ "import xarray as xr\n", "import pandas as pd\n", "import numpy as np\n", "import copy\n", "\n", "import glob\n", "\n", "import xrft\n", "import finufft\n", "\n", "from uncertainties import ufloat\n", "from uncertainties import unumpy as unp\n", "from uncertainties import umath\n", "\n", "from datetime import datetime\n", "\n", "import matplotlib.pyplot as plt\n", "plt.rcParams['font.size'] = 18\n", "\n", "from DataContainer.ReadData import read_hdf5_file, read_hdf5_global, read_hdf5_run_time, read_csv_file\n", "from Analyser.ImagingAnalyser import ImageAnalyser\n", "from Analyser.FitAnalyser import FitAnalyser\n", "from Analyser.FitAnalyser import ThomasFermi2dModel, DensityProfileBEC2dModel, Polylog22dModel\n", "from Analyser.FFTAnalyser import fft, ifft, fft_nutou\n", "from ToolFunction.ToolFunction import *\n", "\n", "from ToolFunction.HomeMadeXarrayFunction import errorbar, dataarray_plot_errorbar\n", "xr.plot.dataarray_plot.errorbar = errorbar\n", "xr.plot.accessor.DataArrayPlotAccessor.errorbar = dataarray_plot_errorbar\n", "\n", "imageAnalyser = ImageAnalyser()" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Import supporting package" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "import xarray as xr\n", "import numpy as np\n", "\n", "from uncertainties import ufloat\n", "from uncertainties import unumpy as unp\n", "from uncertainties import umath\n", "\n", "import matplotlib.pyplot as plt\n", "\n", "from DataContainer.ReadData import read_hdf5_file\n", "from Analyser.ImagingAnalyser import ImageAnalyser\n", "from Analyser.FitAnalyser import FitAnalyser\n", "from Analyser.FitAnalyser import ThomasFermi2dModel, DensityProfileBEC2dModel, Polylog22dModel\n", "from Analyser.FitAnalyser import NewFitModel\n", "from ToolFunction.ToolFunction import *\n", "\n", "from ToolFunction.HomeMadeXarrayFunction import errorbar, dataarray_plot_errorbar\n", "xr.plot.dataarray_plot.errorbar = errorbar\n", "xr.plot.accessor.DataArrayPlotAccessor.errorbar = dataarray_plot_errorbar\n", "\n", "imageAnalyser = ImageAnalyser()" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Start a client for parallel computing" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\data\\AppData\\Roaming\\Python\\Python39\\site-packages\\distributed\\node.py:182: UserWarning: Port 8787 is already in use.\n", "Perhaps you already have a cluster running?\n", "Hosting the HTTP server on port 53497 instead\n", " warnings.warn(\n" ] }, { "data": { "text/html": [ "
\n", "
\n", "
\n", "

Client

\n", "

Client-f81d966f-fb10-11ed-96c4-80e82ce2fa8e

\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", "
Connection method: Cluster objectCluster type: distributed.LocalCluster
\n", " Dashboard: http://127.0.0.1:53497/status\n", "
\n", "\n", " \n", "\n", " \n", "
\n", "

Cluster Info

\n", "
\n", "
\n", "
\n", "
\n", "

LocalCluster

\n", "

68a73a45

\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", "\n", " \n", "
\n", " Dashboard: http://127.0.0.1:53497/status\n", " \n", " Workers: 6\n", "
\n", " Total threads: 60\n", " \n", " Total memory: 55.88 GiB\n", "
Status: runningUsing processes: True
\n", "\n", "
\n", " \n", "

Scheduler Info

\n", "
\n", "\n", "
\n", "
\n", "
\n", "
\n", "

Scheduler

\n", "

Scheduler-cea99f1c-444d-4f12-bd6b-5a8725df82cd

\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", " Comm: tcp://127.0.0.1:53498\n", " \n", " Workers: 6\n", "
\n", " Dashboard: http://127.0.0.1:53497/status\n", " \n", " Total threads: 60\n", "
\n", " Started: Just now\n", " \n", " Total memory: 55.88 GiB\n", "
\n", "
\n", "
\n", "\n", "
\n", " \n", "

Workers

\n", "
\n", "\n", " \n", "
\n", "
\n", "
\n", "
\n", " \n", "

Worker: 0

\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", " \n", "\n", " \n", "\n", "
\n", " Comm: tcp://127.0.0.1:53530\n", " \n", " Total threads: 10\n", "
\n", " Dashboard: http://127.0.0.1:53533/status\n", " \n", " Memory: 9.31 GiB\n", "
\n", " Nanny: tcp://127.0.0.1:53502\n", "
\n", " Local directory: C:\\Users\\data\\AppData\\Local\\Temp\\dask-worker-space\\worker-ph8qm9gw\n", "
\n", "
\n", "
\n", "
\n", " \n", "
\n", "
\n", "
\n", "
\n", " \n", "

Worker: 1

\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", " \n", "\n", " \n", "\n", "
\n", " Comm: tcp://127.0.0.1:53527\n", " \n", " Total threads: 10\n", "
\n", " Dashboard: http://127.0.0.1:53528/status\n", " \n", " Memory: 9.31 GiB\n", "
\n", " Nanny: tcp://127.0.0.1:53503\n", "
\n", " Local directory: C:\\Users\\data\\AppData\\Local\\Temp\\dask-worker-space\\worker-x4snfqwt\n", "
\n", "
\n", "
\n", "
\n", " \n", "
\n", "
\n", "
\n", "
\n", " \n", "

Worker: 2

\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", " \n", "\n", " \n", "\n", "
\n", " Comm: tcp://127.0.0.1:53539\n", " \n", " Total threads: 10\n", "
\n", " Dashboard: http://127.0.0.1:53540/status\n", " \n", " Memory: 9.31 GiB\n", "
\n", " Nanny: tcp://127.0.0.1:53504\n", "
\n", " Local directory: C:\\Users\\data\\AppData\\Local\\Temp\\dask-worker-space\\worker-yw4z2wi3\n", "
\n", "
\n", "
\n", "
\n", " \n", "
\n", "
\n", "
\n", "
\n", " \n", "

Worker: 3

\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", " \n", "\n", " \n", "\n", "
\n", " Comm: tcp://127.0.0.1:53542\n", " \n", " Total threads: 10\n", "
\n", " Dashboard: http://127.0.0.1:53543/status\n", " \n", " Memory: 9.31 GiB\n", "
\n", " Nanny: tcp://127.0.0.1:53505\n", "
\n", " Local directory: C:\\Users\\data\\AppData\\Local\\Temp\\dask-worker-space\\worker-jpmm633i\n", "
\n", "
\n", "
\n", "
\n", " \n", "
\n", "
\n", "
\n", "
\n", " \n", "

Worker: 4

\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", " \n", "\n", " \n", "\n", "
\n", " Comm: tcp://127.0.0.1:53531\n", " \n", " Total threads: 10\n", "
\n", " Dashboard: http://127.0.0.1:53532/status\n", " \n", " Memory: 9.31 GiB\n", "
\n", " Nanny: tcp://127.0.0.1:53506\n", "
\n", " Local directory: C:\\Users\\data\\AppData\\Local\\Temp\\dask-worker-space\\worker-_4j15kw6\n", "
\n", "
\n", "
\n", "
\n", " \n", "
\n", "
\n", "
\n", "
\n", " \n", "

Worker: 5

\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", " \n", "\n", " \n", "\n", "
\n", " Comm: tcp://127.0.0.1:53536\n", " \n", " Total threads: 10\n", "
\n", " Dashboard: http://127.0.0.1:53537/status\n", " \n", " Memory: 9.31 GiB\n", "
\n", " Nanny: tcp://127.0.0.1:53507\n", "
\n", " Local directory: C:\\Users\\data\\AppData\\Local\\Temp\\dask-worker-space\\worker-bmbg4f7j\n", "
\n", "
\n", "
\n", "
\n", " \n", "\n", "
\n", "
\n", "\n", "
\n", "
\n", "
\n", "
\n", " \n", "\n", "
\n", "
" ], "text/plain": [ "" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from dask.distributed import Client\n", "client = Client(n_workers=6, threads_per_worker=10, processes=True, memory_limit='10GB')\n", "client" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Set global path for experiment" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "# filepath = \"//DyLabNAS/Data/Evaporative_Cooling/2023/05/03/0043/*.h5\"\n", "# filepath = \"//DyLabNAS/Data/Evaporative_Cooling/2023/04/18/0003/2023-04-18_0003_Evaporative_Cooling_000.h5\"\n", "\n", "# filepath = \"//DyLabNAS/Data/Repetition_scan/2023/04/21/0002/*.h5\"\n", "\n", "# filepath = r\"./testData/0002/*.h5\"\n", "\n", "# filepath = r\"./testData/0002/2023-04-21_0002_Evaporative_Cooling_0.h5\"\n", "\n", "# filepath = r'd:/Jianshun Gao/Simulations/analyseScripts/testData/0002/2023-04-21_0002_Evaporative_Cooling_0.h5'\n", "\n", "# filepath = \"//DyLabNAS/Data/Evaporative_Cooling/2023/04/18/0003/*.h5\"\n", "\n", "# filepath = \"//DyLabNAS/Data/Evaporative_Cooling/2023/05/04/0000/*.h5\"\n", "\n", "filepath = './result_from_experiment/2023-04-24/0013/2023-04-24_0013_Evaporative_Cooling_08.h5'" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "groupList = [\n", " \"images/MOT_3D_Camera/in_situ_absorption\",\n", " \"images/ODT_1_Axis_Camera/in_situ_absorption\",\n", " \"images/ODT_2_Axis_Camera/in_situ_absorption\",\n", "]\n", "\n", "dskey = {\n", " \"images/MOT_3D_Camera/in_situ_absorption\": \"camera_1\",\n", " \"images/ODT_1_Axis_Camera/in_situ_absorption\": \"camera_2\",\n", " \"images/ODT_2_Axis_Camera/in_situ_absorption\": \"camera_3\",\n", "}\n" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "img_dir = '//DyLabNAS/Data/'\n", "SequenceName = \"Evaporative_Cooling\" + \"/\"\n", "folderPath = img_dir + SequenceName + '2023/05/23'# get_date()" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.Dataset>\n",
       "Dimensions:     (fileIndex: 1, index: 1201)\n",
       "Coordinates:\n",
       "  * index       (index) int64 0 1 2 3 4 5 6 ... 1195 1196 1197 1198 1199 1200\n",
       "Dimensions without coordinates: fileIndex\n",
       "Data variables:\n",
       "    X           (fileIndex, index) float64 nan 0.0 1.0 ... 1.198e+03 1.199e+03\n",
       "    CH1         (fileIndex, index) float64 nan -0.08 -0.08 ... 3.28 -5.52 9.68\n",
       "    CH2         (fileIndex, index) float64 nan 0.0 0.0 ... 0.008 -0.276 -0.128\n",
       "    Start       (fileIndex, index) float64 nan nan nan nan ... nan nan nan nan\n",
       "    Increment   (fileIndex, index) float64 nan nan nan nan ... nan nan nan nan\n",
       "    Unnamed: 5  (fileIndex, index) float64 nan nan nan nan ... nan nan nan nan
" ], "text/plain": [ "\n", "Dimensions: (fileIndex: 1, index: 1201)\n", "Coordinates:\n", " * index (index) int64 0 1 2 3 4 5 6 ... 1195 1196 1197 1198 1199 1200\n", "Dimensions without coordinates: fileIndex\n", "Data variables:\n", " X (fileIndex, index) float64 nan 0.0 1.0 ... 1.198e+03 1.199e+03\n", " CH1 (fileIndex, index) float64 nan -0.08 -0.08 ... 3.28 -5.52 9.68\n", " CH2 (fileIndex, index) float64 nan 0.0 0.0 ... 0.008 -0.276 -0.128\n", " Start (fileIndex, index) float64 nan nan nan nan ... nan nan nan nan\n", " Increment (fileIndex, index) float64 nan nan nan nan ... nan nan nan nan\n", " Unnamed: 5 (fileIndex, index) float64 nan nan nan nan ... nan nan nan nan" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "filePath = './NewFile.csv'\n", "data = read_csv_file(filePath)\n", "remove_bad_shots(data, index=0)\n", "data = data.astype(float)\n", "data" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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pIm55ZZbzPLly2vplYdWbm6u+ctf/mLGjBljunfvbpo1a2YcDoeJj483V155pZk0aZL55JNPKq3nxIkT5uGHHzadO3c2MTExplGjRub66683c+bMKXeI5lJWO+8eq1ev9r6n33333SqV4f1euZoEQmNC/37eunWrGTNmjGnTpo2JiooyLVq0MHfeeadZt25dIKehzlXnvF/6B05lX6+//nqpY6alpZmnn37a3H777eaKK64wjRo1Mg6HwyQnJ5t+/fqZX/3qV+bAgQNVan9tnXebMSGY/RAAAABhg7uMAQAALI5ACAAAYHEEQgAAAIsjEAIAAFgcgRAAAMDiCIQAAAAWRyAEAACwOAIhAACAxREIAQAALI5ACAAAYHEEQgC4xMSJE2Wz2TRx4sQ6P/bNN98sm82mGTNm1PmxAVgXgRAAAMDiCIQAcIlWrVqpa9euatWqVaibAgB1whHqBgBAuJk5c6ZmzpwZ6mYAQJ2hhxAAAMDiCIQAcAl/N5X43vBhjNGcOXN07bXXKjExUQkJCerfv7/efPPNCut2uVx68cUXdc011yguLk6NGzfWzTffrOXLl1e5fdu2bdOkSZN0xRVXyOl0Kj4+XldddZUee+wxnTlzptS+xhh997vflc1mU4cOHZSenl5unY8++qhsNpvi4+O1d+/eKrcFQMPAkDEABMjlcumuu+7SO++8I4fDIafTqaysLG3atEmbNm3SN998oyeeeKJMufz8fA0bNkyrV6+WJNntdkVFRek///mP/v3vf+tXv/pVpceePn26fve738kYI0lyOp0qLCzU9u3btX37dr322mt6//331bt3b0mSzWbTvHnz1KtXLx08eFD333+/li5dWqrONWvWaPbs2ZKkv/zlL+rSpUuNzg+A+oceQgAI0EsvvaQNGzZo7ty5yszMVEZGhg4fPqw77rhDkvTUU0/pm2++KVNu2rRpWr16tWw2m5566imdP39e58+f14kTJ/TAAw/o2Wef1RdffOH3uC+88IKefPJJxcfHa+bMmTp+/LhycnKUm5urLVu26Dvf+Y6OHz+u73//+8rOzvaWa9asmd544w3ZbDYtW7ZMc+bM8W47deqUxo8fL2OMRo0apR/+8IfBO1EA6g8DAChlwoQJRpKZMGFCqedvuukmI8lIMh999FGZcnl5eaZ169ZGknnqqadKbTt69KhxOBxGkvntb39b7nFHjx7trX/69Omltp0+fdo4nU5js9nM2rVryy1fWFho+vTpYySZ559/vsz2X/3qV0aScTqdZteuXcbtdpuhQ4caSaZDhw4mPT3d/0kB0KDRQwgAARowYIAGDhxY5vno6GjdeuutkqTt27eX2rZ8+XIVFRUpNjZWjzzySLn1VjQZ9YIFC5Sbm6u+fftq0KBB5e7jcDg0evRoSfIOS/t66qmndO211yo3N1ejRo3SM888o1WrVsnhcGjhwoVKSkrye3wADRvXEAJAgK699lq/21q3bi1JOnfuXKnnt2zZIknq27evEhMTyy3bpUsXtWnTRkePHi2z7ZNPPpEk7dixQy1btvR7/AsXLkiSDh48WGabw+HQokWLdPXVV3uvOZSKg2j//v391gmg4SMQAkCAEhIS/G5zOIo/VgsLC0s9f+rUKUlSmzZtKqy7bdu25QbCY8eOSSoOfJ7QV5Hc3Nxyn+/YsaOefvppTZkyRZLUv39/TZs2rdL6ADRsDBkDQB2y2WzVKudyuSRJP/nJT2SMqfQrLS2t3HoKCws1b9487//37t2rEydOVKtNABoOAiEA1IHmzZtLko4cOVLhfuX1DkryDhN/9dVXNWrHtGnTtGXLFsXHx6tjx446e/asxo0bJ7fbXaN6AdRvBEIAqAN9+/aVVHwtYVZWVrn7fPPNN34D44ABAyRJmzZtKvf6wKr48MMP9cc//lFS8dQ5S5cuVWRkpNavX69nn322WnUCaBgIhABQB4YPHy6Hw6ELFy7oueeeK3efJ5980m/5e++9V7GxsXK5XPrpT3/qHUIuj9vtLrMiyalTpzRhwgQZYzR69GiNHz9effv21dNPPy1Jevzxx7V58+bAXxiABoFACAB1oE2bNnrwwQclSb/73e80c+ZMb0/h6dOn9bOf/Uxvvvmm36lfWrZsqWeeeUaS9P777+uWW27Rxo0bvcHQGKM9e/boj3/8o3r27Kn33nvPW9YYo4kTJ+rEiRPq2LGjXnnlFe+2Rx55RLfccouKioo0evRoZWZm1srrBxDeCIQAUEeeffZZDR48WG63W7/+9a+VnJysxo0bq0WLFnrppZf0q1/9SldffbXf8g899JBmzZqliIgIrV+/Xtdff72cTqeaNm2q6OhodevWTb/85S+1e/fuUjevPP/88975BhcsWFBq2hubzab58+erWbNmSk1N1QMPPFCbpwBAmCIQAkAdiYmJ0apVq/SnP/1JV199taKiomSM0Q033KClS5d6ewArMnXqVO3Zs0cPP/ywevXqpZiYGKWnpys+Pl79+vXTo48+qk8//VRjxoyRJG3bts07rcz06dPLnW+wZcuWmjt3rmw2mxYuXFjqLmQA1mAzpmSFdAAAAFgSPYQAAAAWRyAEAACwOAIhAACAxREIAQAALI5ACAAAYHEEQgAAAIsjEAIAAFgcgRAAAMDiCIQAAAAWRyAEAACwOAIhAACAxREIAQAALI5ACAAAYHH/H93X7dWebmAOAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plt.figure()\n", "ax = fig.gca()\n", "\n", "data.isel(fileIndex=0).CH2.plot(ax=ax)\n", "plt.xlim()\n", "plt.xlim()\n", "\n", "plt.show()" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# An example for one experimental run" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Load the data" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "shotNum = \"0069\"\n", "filePath = folderPath + \"/\" + shotNum + \"/*.h5\"\n", "# filePath = \"//DyLabNAS/Data/Evaporative_Cooling/2023/05/12/0065/*.h5\"\n", "filePath = './result_from_experiment/2023-04-24/0013/2023-04-24_0013_Evaporative_Cooling_08.h5'\n", "\n", "dataSetDict = {\n", " dskey[groupList[i]]: read_hdf5_file(filePath, groupList[i])\n", " for i in [0] # range(len(groupList))\n", "}\n", "\n", "dataSet = dataSetDict[\"camera_1\"]\n", "dataSet = swap_xy(dataSet)\n", "\n", "scanAxis = get_scanAxis(dataSet)\n", "\n", "dataSet = auto_rechunk(dataSet)\n", "\n", "dataSet = imageAnalyser.get_absorption_images(dataSet)\n", "\n", "dataSet" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Calculate an plot OD images" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# imageAnalyser.center = (960, 1040)\n", "# imageAnalyser.span = (100, 100)\n", "# imageAnalyser.fraction = (0.1, 0.1)\n", "\n", "imageAnalyser.center = (960, 875)\n", "imageAnalyser.span = (300, 300)\n", "imageAnalyser.fraction = (0.1, 0.1)\n", "\n", "dataSet_cropOD = imageAnalyser.crop_image(dataSet.OD)\n", "dataSet_cropOD = imageAnalyser.substract_offset(dataSet_cropOD).load()\n", "\n", "dataSet_cropOD.plot.pcolormesh(cmap='jet', vmin=0, col=scanAxis[0], row=scanAxis[1])\n", "plt.show()" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Do a 2D two-peak gaussian fit to the OD images" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Do the fit" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from Analyser.FitAnalyser import ThomasFermi2dModel, DensityProfileBEC2dModel, polylog2_2d\n", "\n", "fitModel = DensityProfileBEC2dModel()\n", "# fitModel = ThomasFermi2dModel()\n", "\n", "fitAnalyser = FitAnalyser(fitModel, fitDim=2)\n", "\n", "# fitAnalyser = FitAnalyser(\"Gaussian-2D\", fitDim=2)\n", "\n", "# dataSet_cropOD = dataSet_cropOD.chunk((1,1,100,100))\n", "\n", "params = fitAnalyser.guess(dataSet_cropOD, guess_kwargs=dict(pureBECThreshold=0.3), dask=\"parallelized\")\n", "fitResult = fitAnalyser.fit(dataSet_cropOD, params).load()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "params.compute().item()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "fitCurve = fitAnalyser.eval(fitResult, x=np.arange(300), y=np.arange(300), dask=\"parallelized\").load()\n", "\n", "fitCurve.plot.pcolormesh(cmap='jet', vmin=0, col=scanAxis[0], row=scanAxis[1])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "fitModel2 = Polylog22dModel(prefix='thermal_')\n", "fitAnalyser2 = FitAnalyser(fitModel2, fitDim=2)\n", "fitCurve2 = fitAnalyser2.eval(fitResult, x=np.arange(100), y=np.arange(100), dask=\"parallelized\").load()\n", "\n", "fitModel3 = ThomasFermi2dModel(prefix='BEC_')\n", "fitAnalyser3 = FitAnalyser(fitModel3, fitDim=2)\n", "fitCurve3 = fitAnalyser3.eval(fitResult, x=np.arange(100), y=np.arange(100), dask=\"parallelized\").load()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "fig = plt.figure()\n", "ax = fig.gca()\n", "\n", "dataSet_cropOD.sum(dim='x').plot(ax=ax, col=scanAxis[0], row=scanAxis[1])\n", "fitCurve.sum(dim='x').plot(ax=ax, col=scanAxis[0], row=scanAxis[1])\n", "fitCurve2.sum(dim='x').plot(ax=ax, col=scanAxis[0], row=scanAxis[1])\n", "fitCurve3.sum(dim='x').plot(ax=ax, col=scanAxis[0], row=scanAxis[1])\n", "\n", "plt.show()\n", "\n", "fig = plt.figure()\n", "ax = fig.gca()\n", "\n", "dataSet_cropOD.sum(dim='y').plot(ax=ax, col=scanAxis[0], row=scanAxis[1])\n", "fitCurve.sum(dim='y').plot(ax=ax, col=scanAxis[0], row=scanAxis[1])\n", "fitCurve2.sum(dim='y').plot(ax=ax, col=scanAxis[0], row=scanAxis[1])\n", "fitCurve3.sum(dim='y').plot(ax=ax, col=scanAxis[0], row=scanAxis[1])\n", "\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "value = fitAnalyser.get_fit_full_result(fitResult)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "value" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "xdb = xarray_mongodb.XarrayMongoDB(mongoDB)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "value = fitAnalyser.get_fit_value(fitResult)\n", "value" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "dataSet_cropOD" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "dataSet_cropOD.attrs['name'] = 'name'" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "_id, _ = xdb.put(dataSet_cropOD)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "_id" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# _id = '646e3cbbdb91e17db4b4cbd2'" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "xdb.get(_id)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "c = bson.objectid.ObjectId('646e4919802812f029b385d7')\n", "c" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "xdb.get(c)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import datetime\n", "post = {\"author\": \"Mike\",\n", " \"data_id\": _id,\n", " \"tags\": [\"mongodb\", \"python\", \"pymongo\"],\n", " \"date\": datetime.datetime.utcnow()}" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "posts = mongoCollection\n", "post_id = posts.insert_one(post).inserted_id\n", "post_id" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ " for i in posts.find({'_id': bson.objectid.ObjectId('646e45a4802812f029b385d6')}):\n", " print(i)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import gridfs\n", "\n", "fs = gridfs.GridFS(mongoDB, 'xarray')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "fs.put(b\"hello world\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "c = bson.objectid.ObjectId('646e4919802812f029b385d7')\n", "\n", "fs.get(_id)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "np.sqrt(np.sum([0.061**2, 0.334**2, 0.447**2]))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "py39", "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.13" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 }