{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 141,
   "id": "458826ca-9c28-48a4-b72f-39419ac83ab5",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 最初に実行\n",
    "import numpy as np\n",
    "import os\n",
    "import csv\n",
    "import matplotlib.pyplot as plt\n",
    "import time\n",
    "from IPython.display import display, clear_output\n",
    "\n",
    "raw_dir = \"rawdata4\"   # rawdataフォルダ名\n",
    "save_dir = \"data4\"     # data 保存フォルダ名\n",
    "os.makedirs(save_dir, exist_ok=True)\n",
    "\n",
    "def load_file(filepath):\n",
    "    data = []\n",
    "    with open(filepath, 'r') as f:\n",
    "        for line in f:\n",
    "            if line.startswith(\"#\"):\n",
    "                \n",
    "                continue\n",
    "            parts = line.split()\n",
    "            if len(parts) > 0:\n",
    "                data.append([float(x) for x in parts])\n",
    "    return np.array(data)\n",
    "\n",
    "def bindata(xx0, yy0, err0, cnts0, mon0, dxmin):\n",
    "\n",
    "    while True:\n",
    "        dx0 = np.abs(xx0[1:] - xx0[:-1])\n",
    "        dx0 = np.append(dx0, dx0[-1])\n",
    "\n",
    "        if np.min(dx0) >= dxmin:\n",
    "            break\n",
    "\n",
    "        ii = 0\n",
    "        while ii < len(xx0) - 1:\n",
    "            dx = abs(xx0[ii+1] - xx0[ii])\n",
    "\n",
    "            if dx < dxmin:\n",
    "                xx0[ii+1] = (xx0[ii] + xx0[ii+1]) / 2\n",
    "                yy0[ii+1] = (yy0[ii] + yy0[ii+1]) / 2\n",
    "                err0[ii+1] = np.sqrt(err0[ii]**2 + err0[ii+1]**2) / 2\n",
    "                cnts0[ii+1] = cnts0[ii] + cnts0[ii+1]\n",
    "                mon0[ii+1] = mon0[ii] + mon0[ii+1]\n",
    "\n",
    "                xx0 = np.delete(xx0, ii)\n",
    "                yy0 = np.delete(yy0, ii)\n",
    "                err0 = np.delete(err0, ii)\n",
    "                cnts0 = np.delete(cnts0, ii)\n",
    "                mon0 = np.delete(mon0, ii)\n",
    "\n",
    "                ii += 1\n",
    "            else:\n",
    "                ii += 1\n",
    "\n",
    "    return xx0, yy0, err0, cnts0, mon0\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 140,
   "id": "35f4d9e5-f101-4ce0-bfed-ec3989e4c8e1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjEAAAGxCAYAAACTN+exAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjYsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvq6yFwwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAOXdJREFUeJzt3Xt4VNW9//HP5EISMAwESCYpqFERiUErIBCwQuUirUB7PFYESe0PREUQU7Ugp8cD2JYIbZG2sSjqKVak+JxzpIVWU2OhqQgYBFIJ4A0DgiQESTIJkAsk+/dHOhuG3GaSSWZmz/v1PHkke6+ZWbOFzCdrr+9aNsMwDAEAAASZMH93AAAAoC0IMQAAICgRYgAAQFAixAAAgKBEiAEAAEGJEAMAAIISIQYAAAQlQgwAAAhKhBgAABCUCDEALOfYsWPKyMjQ6NGj1aNHD9lsNq1du7bVx1VVVenaa6+VzWbTL37xixbbvvPOO7LZbLLZbPrqq6981HMA3iDEALCczz77TK+99pq6dOmib3/72x4/7qmnntKZM2dabXf69GnNnj1bSUlJ7ekmgHYixACwnFtvvVUnT55UTk6OHnvsMY8ek5eXp9/85jf61a9+1WrbJ598Uj179tTMmTPb21UA7UCIAdCqkydP6oEHHlC/fv0UFRWlPn36aNSoUXrnnXfc2mVnZ2vs2LGy2+3q2rWrBg4cqMzMTPP8Bx98oHvuuUdXXnmlYmJidOWVV2ratGk6cuSI2/OsXbtWNptNW7du1Zw5c9S7d2/16tVLd955p44fP95qf8PCvPvRVltbq5kzZ2ru3LkaOnRoi23fffddrVmzRi+99JLCw8O9eh0AvhXh7w4ACHzp6enas2ePfvazn+naa69VeXm59uzZo1OnTpltXn75Zc2ePVujR4/W888/r/j4eH3yyScqKCgw2xw+fFgDBgzQPffco7i4OBUVFWn16tW6+eabdeDAAfXu3dvtde+//37dcccdWr9+vY4ePaof/ehHmjFjhrZs2eLT9/f000/rzJkz+slPfqKTJ082266qqkqzZs1SRkaGBg8erE2bNvm0HwC8Q4gB0Kr33ntP999/v2bPnm0e+853vmP++fTp03rsscc0atQobdmyRTabTZI0duxYt+e56667dNddd5nf19XVadKkSUpISND69es1f/58t/YTJ07Ur3/9a/P70tJSLViwQMXFxXI4HD55b/n5+VqxYoU2b96sbt26tRhinnrqKdXV1Wnp0qU+eW0A7cPtJACtGjZsmNauXauf/vSn2rlzp86dO+d2fvv27aqoqNDDDz9sBpimnD59WgsXLtQ111yjiIgIRURE6LLLLtOZM2d08ODBRu2nTJni9v0NN9wgSY1uP7XV+fPnNXPmTE2dOlW33357i23z8vK0atUqvfDCC4qJifHJ6wNoH0IMgFa9/vrruu+++/TSSy8pLS1NcXFx+v73v6/i4mJJMkcv+vbt2+LzTJ8+XVlZWbr//vv117/+VXl5edq1a5f69OmjqqqqRu179erl9n1UVJQkNdm2LVatWqXPP/9cixcvVnl5ucrLy1VRUSFJqq6uVnl5uerq6iRJM2fO1J133qmhQ4eabaurqyVJFRUVqqys9EmfAHiO20kAWtW7d2+tWrVKq1at0hdffKFNmzbpySefVElJibKzs9WnTx9JDeuzNMfpdOrPf/6zFi9erCeffNI8XlNTo9LS0g5/D00pKCiQ0+lU//79G5176qmn9NRTT2nv3r36+te/rv3792v//v36n//5n0Ztr776at14443Kz8/vhF4DcCHEAPDK5Zdfrnnz5ulvf/ub3nvvPUnSyJEjZbfb9fzzz+uee+5p8paSzWaTYRjmaIrLSy+9ZI52dLYnn3xSP/jBD9yOFRcXa9q0aXrooYc0depUXXPNNZKkrVu3Nnr82rVr9corr+iPf/yjvva1r3VGlwFchBADoEVOp1Pf/OY3NX36dF133XWKjY3Vrl27lJ2drTvvvFOSdNlll+mXv/yl7r//fo0bN06zZ89WQkKCPvvsM/3zn/9UVlaWunfvrltvvVU///nP1bt3b1155ZXKzc3Vyy+/rB49evi83//7v/8rSfr8888lNZR3X3bZZZJkTi6+7rrrdN1117k97vDhw5IaRlfGjBljHr/4zy5///vfJUmjRo1qVFkFoOMRYgC0KDo6WsOHD9err76qw4cP69y5c7r88su1cOFCLViwwGw3a9YsJSUlafny5br//vtlGIauvPJK3XfffWab9evX69FHH9WCBQt0/vx5jRo1Sjk5Obrjjjt83u/vfe97bt8/99xzeu655yRJhmH4/PUAdD6bwb9mAAAQhKhOAgAAQYkQAwAAghIhBgAABCVCDAAACEqEGAAA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13/+538qOTlZMTExuuqqq/T000+rvr7ebGMYhpYsWaKkpCTFxMRozJgx2r9/v9vz1NTU6JFHHlHv3r3VrVs3TZkyRceOHXNrU1ZWpvT0dNntdtntdqWnp6u8vLzt7xQIUBNTE7Vt4W36w+wR+n7aFR49hk0iAcDLELN8+XI9//zzysrK0sGDB7VixQr9/Oc/129+8xuzzYoVK7Ry5UplZWVp165dcjgcGj9+vCorK802GRkZ2rhxozZs2KBt27bp9OnTmjRpkurq6sw206dPV35+vrKzs5Wdna38/Hylp6f74C0Dgce1A/a3PJy0++mJ09px6BS3lQCENK9W7J00aZISEhL08ssvm8f+/d//XV27dtWrr74qwzCUlJSkjIwMLVy4UFLDqEtCQoKWL1+uBx98UE6nU3369NGrr76qqVOnSpKOHz+ufv366c0339Ttt9+ugwcPKiUlRTt37tTw4cMlSTt37lRaWpo++ugjDRgwoNW+smIvglFdvaFblm9RsbO60d5KTaFiCYDVdNiKvbfccov+9re/6ZNPPpEk/fOf/9S2bdv07W9/W5JUWFio4uJiTZgwwXxMVFSURo8ere3bt0uSdu/erXPnzrm1SUpKUmpqqtlmx44dstvtZoCRpBEjRshut5ttLlVTU6OKigq3LyDYeDvZt9hZrYfW7dGv3vlEf8r/ktEZACHFq3ViFi5cKKfTqeuuu07h4eGqq6vTz372M02bNk2SVFzcsIR6QkKC2+MSEhJ05MgRs02XLl3Us2fPRm1cjy8uLlZ8fHyj14+PjzfbXCozM1NLly715u0AAck12be1TSKlCxVLz77zqXmM0RkAocKrkZjXX39d69at0/r167Vnzx698sor+sUvfqFXXnnFrZ3N5v47pGEYjY5d6tI2TbVv6XkWLVokp9Npfh09etTTtwUEnIsn+8775tVePZb1ZACECq9GYn70ox/pySef1D333CNJGjRokI4cOaLMzEzdd999cjgckhpGUhITL/wWWFJSYo7OOBwO1dbWqqyszG00pqSkRCNHjjTbnDhxotHrnzx5stEoj0tUVJSioqK8eTtAQHNN9vW2EslQw62opZsPaHyKg60KAFiWVyMxZ8+eVViY+0PCw8PNEuvk5GQ5HA7l5OSY52tra5Wbm2sGlCFDhigyMtKtTVFRkQoKCsw2aWlpcjqdysvL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bTsO17bzWXZiLwAAsDZGYgAAQFAixAAAgKBEiAEAAEGJEAMAAIISIQYAAAQlQowF/OMf/9DkyZOVlJQkm82mP/7xj27nDcPQkiVLlJSUpJiYGI0ZM0b79+/3T2eDSGZmpm6++WbFxsYqPj5e3/3ud/Xxxx+7teHatt3q1at1ww03mKubpqWl6a233jLPc219JzMzUzabTRkZGeYxrm/bLFmyRDabze3L4XCY57munYsQYwFnzpzRjTfeqKysrCbPr1ixQitXrlRWVpZ27dolh8Oh8ePHm5tkomm5ubmaO3eudu7cqZycHJ0/f14TJkzQmTNnzDZc27br27evnnnmGX3wwQf64IMPdNttt+k73/mO+QOfa+sbu3bt0po1a3TDDTe4Hef6tt3111+voqIi82vfvn3mOa5rJzNgKZKMjRs3mt/X19cbDofDeOaZZ8xj1dXVht1uN55//nk/9DB4lZSUGJKM3NxcwzC4th2hZ8+exksvvcS19ZHKykqjf//+Rk5OjjF69Gjj0UcfNQyDv7vtsXjxYuPGG29s8hzXtfMxEmNxhYWFKi4u1oQJE8xjUVFRGj16tLZv3+7HngUfp9MpSYqLi5PEtfWluro6bdiwQWfOnFFaWhrX1kfmzp2rO+64Q+PGjXM7zvVtn08//VRJSUlKTk7WPffco88//1wS19UfLLuLNRoUFxdLkhISEtyOJyQk6MiRI/7oUlAyDEOPPfaYbrnlFqWmpkri2vrCvn37lJaWpurqal122WXauHGjUlJSzB/4XNu227Bhg/bs2aNdu3Y1Osff3bYbPny4fv/73+vaa6/ViRMn9NOf/lQjR47U/v37ua5+QIgJETabze17wzAaHUPz5s2bpw8//FDbtm1rdI5r23YDBgxQfn6+ysvL9X//93+67777lJuba57n2rbN0aNH9eijj+rtt99WdHR0s+24vt771re+Zf550KBBSktL09VXX61XXnlFI0aMkMR17UzcTrI416x5128ILiUlJY1+W0DTHnnkEW3atElbt25V3759zeNc2/br0qWLrrnmGg0dOlSZmZm68cYb9atf/Ypr2067d+9WSUmJhgwZooiICEVERCg3N1e//vWvFRERYV5Drm/7devWTYMGDdKnn37K31s/IMRYXHJyshwOh3JycsxjtbW1ys3N1ciRI/3Ys8BnGIbmzZunN954Q1u2bFFycrLbea6t7xmGoZqaGq5tO40dO1b79u1Tfn6++TV06FDde++9ys/P11VXXcX19ZGamhodPHhQiYmJ/L31B//NKYavVFZWGnv37jX27t1rSDJWrlxp7N271zhy5IhhGIbxzDPPGHa73XjjjTeMffv2GdOmTTMSExONiooKP/c8sM2ZM8ew2+3G3//+d6OoqMj8Onv2rNmGa9t2ixYtMv7xj38YhYWFxocffmj8x3/8hxEWFma8/fbbhmFwbX3t4uokw+D6ttXjjz9u/P3vfzc+//xzY+fOncakSZOM2NhY4/Dhw4ZhcF07GyHGArZu3WpIavR13333GYbRUPa3ePFiw+FwGFFRUcatt95q7Nu3z7+dDgJNXVNJxu9+9zuzDde27WbOnGlcccUVRpcuXYw+ffoYY8eONQOMYXBtfe3SEMP1bZupU6caiYmJRmRkpJGUlGTceeedxv79+83zXNfOZTMMw/DPGBAAAEDbMScGAAAEJUIMAAAISoQYAAAQlAgxAAAgKBFiAABAUCLEAACAoESIAQAAQYkQAwAAghIhBgAABCVCDAAACEqEGAAAEJT+P0CQlw0H9RMgAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdin",
     "output_type": "stream",
     "text": [
      "Press Enter to continue (Ctrl+C to quit) \n"
     ]
    }
   ],
   "source": [
    "start_line = 91   # CSVの処理範囲．最初の行番号（1はカラムの名前）\n",
    "end_line   = 91 # 最後の行番号\n",
    "\n",
    "plt.ion()\n",
    "#fig, ax = plt.subplots()\n",
    "plt.close('all')   # ← 余計な空図を全部消す\n",
    "\n",
    "with open(\"scanlist3.csv\", newline='', encoding='utf-8-sig') as f:  # CSV filename\n",
    "    reader = csv.reader(f)\n",
    "    header = [h.strip() for h in next(reader)]\n",
    "\n",
    "    for lineno, row_values in enumerate(reader, start=2):  \n",
    "\n",
    "        if lineno < start_line:\n",
    "            continue\n",
    "        if lineno > end_line:\n",
    "            break\n",
    "\n",
    "        row = dict(zip(header, row_values))\n",
    "\n",
    "        scan_numbers = [int(row[f\"scan{i}\"]) for i in range(1, 8)]\n",
    "        scan_numbers = [s for s in scan_numbers if s != 0]\n",
    "\n",
    "        xcol = int(row[\"xcol\"])\n",
    "        moncol = int(row[\"moncol\"])\n",
    "        datcol = int(row[\"datcol\"])\n",
    "        mon1s = float(row[\"mon1s\"])\n",
    "        bindx = float(row[\"bindx\"])\n",
    "\n",
    "        # --- データ処理 ---\n",
    "        xx0, yy0, err0, cnts0, mon0 = [], [], [], [], []\n",
    "\n",
    "        for i, scn in enumerate(scan_numbers):\n",
    "            data = load_file(os.path.join(raw_dir, f\"{scn}.txt\"))\n",
    "\n",
    "            x = data[:, xcol - 1]\n",
    "            cnts = data[:, datcol]\n",
    "            mon = data[:, moncol]\n",
    "\n",
    "            y = cnts / mon * mon1s\n",
    "            err = np.sqrt(cnts) / mon * mon1s\n",
    "\n",
    "            if i == 0:\n",
    "                xx0, yy0, err0, cnts0, mon0 = x, y, err, cnts, mon\n",
    "            else:\n",
    "                xx0 = np.concatenate([xx0, x])\n",
    "                yy0 = np.concatenate([yy0, y])\n",
    "                err0 = np.concatenate([err0, err])\n",
    "                cnts0 = np.concatenate([cnts0, cnts])\n",
    "                mon0 = np.concatenate([mon0, mon])\n",
    "\n",
    "        idx = np.argsort(xx0)\n",
    "        xx0, yy0, err0, cnts0, mon0 = xx0[idx], yy0[idx], err0[idx], cnts0[idx], mon0[idx]\n",
    "\n",
    "        xx0, yy0, err0, cnts0, mon0 = bindata(xx0, yy0, err0, cnts0, mon0, bindx)\n",
    "\n",
    "        yy0 = cnts0 / mon0 * mon1s\n",
    "        err0 = np.sqrt(cnts0) / mon0 * mon1s\n",
    "\n",
    "        outfile = os.path.join(save_dir, f\"scan{scan_numbers[0]}.dat\")\n",
    "        np.savetxt(outfile, np.column_stack([xx0, yy0, err0]), fmt=\"%.7g\")\n",
    "\n",
    "        # --- 図更新 ---\n",
    "        clear_output(wait=True)\n",
    "\n",
    "        plt.figure()\n",
    "        plt.errorbar(xx0, yy0, yerr=err0, fmt='o-')\n",
    "        plt.title(f\"scan {scan_numbers[0]}\")\n",
    "\n",
    "        plt.show()\n",
    "\n",
    "        input(\"Press Enter to continue (Ctrl+C to quit)\")\n",
    "        plt.close()\n",
    "\n",
    "plt.ioff()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 145,
   "id": "ede666e0-39b7-43e0-aa98-2687263d677c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "feb3834029ba44d0b516d5df255a57df",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "IntText(value=1, description='Scan:')"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "827e31b3b31b40d3b8b3d50b8930b2c6",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "IntText(value=0, description='X col:')"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "d90648345eb84c20b21f1337a5b8bdb6",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "IntText(value=-1, description='Y col:')"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "115a4e86da8849549f7b04d2b47771c8",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 指定したスキャン番号のrawdata表示（1つずつ）\n",
    "import numpy as np\n",
    "import os\n",
    "import ipywidgets as widgets\n",
    "import matplotlib.pyplot as plt\n",
    "from IPython.display import display, clear_output\n",
    "\n",
    "raw_dir = \"rawdata4\"   # rawdata フォルダ名\n",
    "\n",
    "# ===== ファイル読み込み＋ヘッダ抽出 =====\n",
    "def load_scan(scnum):\n",
    "    filepath = os.path.join(raw_dir, f\"{scnum}.txt\")\n",
    "\n",
    "    header = {\n",
    "        \"scan\": \"-\", \"title\": \"-\", \"lambda\": \"-\", \"E\": \"-\",\n",
    "        \"CEN\": \"-\", \"MAX\": \"-\", \"FWHM\": \"-\", \"MAX-y\": \"-\",\n",
    "        \"abc\": \"-\",\"Q\": \"-\", \"slits\": \"-\", \"datetime\": \"-\"\n",
    "    }\n",
    "\n",
    "    data_lines = []\n",
    "    with open(filepath, \"r\") as f:\n",
    "        for line in f:\n",
    "            line = line.strip()\n",
    "\n",
    "            if line.startswith(\"#S\"):\n",
    "                header[\"scan\"] = line\n",
    "            elif line.startswith(\"#D\"):\n",
    "                header[\"datetime\"] = line[3:]\n",
    "            elif line.startswith(\"#G1\"):\n",
    "                parts = line.split()\n",
    "                header[\"abc\"] = \" \".join(parts[1:7])\n",
    "            elif line.startswith(\"#G4\"):\n",
    "                parts = line.split()\n",
    "                lam = float(parts[4])\n",
    "                header[\"lambda\"] = lam\n",
    "                header[\"E\"] = 12.39842 / lam\n",
    "            elif line.startswith(\"#L\"):\n",
    "                header[\"title\"] = line[3:]\n",
    "            elif line.startswith(\"#Q\"):\n",
    "                header[\"Q\"] = line[3:]\n",
    "            elif line.startswith(\"#Tail1\"):\n",
    "                header[\"CEN\"] = line\n",
    "            elif line.startswith(\"#Tail2\"):\n",
    "                header[\"MAX-y\"] = line\n",
    "            elif line.startswith(\"# Slit1(v*h):\"):\n",
    "                header[\"slits\"] = line\n",
    "            elif not line.startswith(\"#\") and len(line) > 0:\n",
    "                data_lines.append([float(x) for x in line.split()])\n",
    "\n",
    "    data = np.array(data_lines)\n",
    "    return header, data\n",
    "\n",
    "\n",
    "# ===== GUI =====\n",
    "scan_box = widgets.IntText(value=1, description=\"Scan:\")\n",
    "xcol_box = widgets.IntText(value=0, description=\"X col:\")\n",
    "ycol_box = widgets.IntText(value=-1, description=\"Y col:\")\n",
    "\n",
    "output = widgets.Output()\n",
    "\n",
    "def update(change=None):\n",
    "    with output:\n",
    "        clear_output(wait=True)\n",
    "\n",
    "        scnum = scan_box.value\n",
    "        xcol = xcol_box.value\n",
    "        ycol = ycol_box.value\n",
    "\n",
    "        header, data = load_scan(scnum)\n",
    "\n",
    "        # 負のインデックス対応\n",
    "        if xcol < 0:\n",
    "            xcol = data.shape[1] + xcol\n",
    "        if ycol < 0:\n",
    "            ycol = data.shape[1] + ycol\n",
    "\n",
    "        x = data[:, xcol]\n",
    "        y = data[:, ycol]\n",
    "        err = np.sqrt(y)\n",
    "\n",
    "        # ===== プロット =====\n",
    "        plt.figure(figsize=(5,4))\n",
    "        plt.errorbar(x, y, yerr=err, fmt='o-')\n",
    "        plt.title(f\"Scan {scnum}\")\n",
    "        plt.xlabel(f\"col {xcol}\")\n",
    "        plt.ylabel(f\"col {ycol}\")\n",
    "        plt.grid()\n",
    "        plt.show()\n",
    "\n",
    "        # ===== 情報表示 =====\n",
    "        print(header[\"scan\"])\n",
    "        print(header[\"datetime\"])\n",
    "        print(header[\"title\"])\n",
    "        print(f\"Q={header['Q']},lambda={header['lambda']}, E={header['E']}\")\n",
    "        print(f\"lattice params = {header['abc']}\")\n",
    "        print(header[\"CEN\"])\n",
    "        print(header[\"MAX-y\"])\n",
    "        print(header[\"slits\"])\n",
    "\n",
    "\n",
    "# ===== イベント登録 =====\n",
    "scan_box.observe(update, names='value')\n",
    "xcol_box.observe(update, names='value')\n",
    "ycol_box.observe(update, names='value')\n",
    "\n",
    "display(scan_box, xcol_box, ycol_box, output)\n",
    "\n",
    "update()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 143,
   "id": "18872707-8710-4105-95e8-fd6a56646df3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "fe7875606814473ab0e23eb6b0321ed5",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "IntText(value=1, description='Scan1:')"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "c30a1ccf53034250bc8fcec8982f7c83",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(Checkbox(value=False, description='Use 2'), IntText(value=0, description='Scan2:')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "3217d2d6f1ea4d2a80b090278d862019",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(Checkbox(value=False, description='Use 3'), IntText(value=0, description='Scan3:')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "d8a4931d628d4f788ec2f11928258cbc",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "IntText(value=0, description='X col:')"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "69e431f9d6fe4054aaed0a788514ce46",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "IntText(value=-1, description='Y col:')"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "2030132923ed4bf3ba996da1c197a299",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "IntText(value=-2, description='Mon col:')"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "c2b385e4739744a48c4ff8e5d6d3eaa4",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "FloatText(value=1.0, description='Scale:')"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "1f75f4a5afb747c682ec86128b98da81",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 指定したスキャン番号のrawdata表示（3つまで重ねて表示可能）\n",
    "import numpy as np\n",
    "import os\n",
    "import ipywidgets as widgets\n",
    "import matplotlib.pyplot as plt\n",
    "from IPython.display import display, clear_output\n",
    "\n",
    "raw_dir = \"rawdata4\"  # rawdata フォルダ名\n",
    "\n",
    "# ===== ファイル読み込み＋ヘッダ抽出 =====\n",
    "def load_scan(scnum):\n",
    "    filepath = os.path.join(raw_dir, f\"{scnum}.txt\")\n",
    "\n",
    "    header = {\n",
    "        \"scan\": \"-\", \"title\": \"-\", \"lambda\": \"-\", \"E\": \"-\",\n",
    "        \"CEN\": \"-\", \"MAX\": \"-\", \"FWHM\": \"-\", \"MAX-y\": \"-\",\n",
    "        \"abc\": \"-\", \"angles\": \"-\", \"datetime\": \"-\"\n",
    "    }\n",
    "\n",
    "    data_lines = []\n",
    "    with open(filepath, \"r\") as f:\n",
    "        for line in f:\n",
    "            line = line.strip()\n",
    "\n",
    "            if line.startswith(\"#S\"):\n",
    "                header[\"scan\"] = line\n",
    "            elif line.startswith(\"#D\"):\n",
    "                header[\"datetime\"] = line[3:]\n",
    "            elif line.startswith(\"#G1\"):\n",
    "                parts = line.split()\n",
    "                header[\"abc\"] = \" \".join(parts[1:4])\n",
    "                header[\"angles\"] = \" \".join(parts[4:7])\n",
    "            elif line.startswith(\"#G4\"):\n",
    "                parts = line.split()\n",
    "                lam = float(parts[4])\n",
    "                header[\"lambda\"] = lam\n",
    "                header[\"E\"] = 12.39842 / lam\n",
    "            elif line.startswith(\"#L\"):\n",
    "                header[\"title\"] = line[3:]\n",
    "            elif line.startswith(\"#Tail1\"):\n",
    "                header[\"CEN\"] = line\n",
    "            elif line.startswith(\"#Tail2\"):\n",
    "                header[\"MAX-y\"] = line\n",
    "            elif not line.startswith(\"#\") and len(line) > 0:\n",
    "                data_lines.append([float(x) for x in line.split()])\n",
    "\n",
    "    data = np.array(data_lines)\n",
    "    return header, data\n",
    "\n",
    "\n",
    "# ===== GUI =====\n",
    "scan_box1 = widgets.IntText(value=1, description=\"Scan1:\")\n",
    "scan_box2 = widgets.IntText(value=0, description=\"Scan2:\")\n",
    "scan_box3 = widgets.IntText(value=0, description=\"Scan3:\")\n",
    "moncol_box = widgets.IntText(value=-2, description=\"Mon col:\")\n",
    "scale_box = widgets.FloatText(value=1.0, description=\"Scale:\")\n",
    "\n",
    "use2 = widgets.Checkbox(value=False, description=\"Use 2\")\n",
    "use3 = widgets.Checkbox(value=False, description=\"Use 3\")\n",
    "\n",
    "#scan_box = widgets.IntText(value=1, description=\"Scan:\")\n",
    "xcol_box = widgets.IntText(value=0, description=\"X col:\")\n",
    "ycol_box = widgets.IntText(value=-1, description=\"Y col:\")\n",
    "\n",
    "output = widgets.Output()\n",
    "\n",
    "def update(change=None):\n",
    "    with output:\n",
    "        clear_output(wait=True)\n",
    "\n",
    "        scans = [scan_box1.value]\n",
    "\n",
    "        if use2.value:\n",
    "            scans.append(scan_box2.value)\n",
    "        if use3.value:\n",
    "            scans.append(scan_box3.value)\n",
    "\n",
    "        xcol = xcol_box.value\n",
    "        ycol = ycol_box.value\n",
    "        moncol = moncol_box.value\n",
    "        scale = scale_box.value\n",
    "\n",
    "        plt.figure(figsize=(5,4))\n",
    "\n",
    "        for scnum in scans:\n",
    "            header, data = load_scan(scnum)\n",
    "\n",
    "            xc = xcol if xcol >= 0 else data.shape[1] + xcol\n",
    "            yc = ycol if ycol >= 0 else data.shape[1] + ycol\n",
    "\n",
    "            x = data[:, xc]\n",
    "#            y = data[:, yc]\n",
    "#            err = np.sqrt(y)\n",
    "\n",
    "            mc = moncol if moncol >= 0 else data.shape[1] + moncol\n",
    "\n",
    "            y_raw = data[:, yc]\n",
    "            mon = data[:, mc]\n",
    "\n",
    "            # ゼロ割り防止\n",
    "            mask = mon > 0\n",
    "\n",
    "            x = x[mask]\n",
    "            y_raw = y_raw[mask]\n",
    "            mon = mon[mask]\n",
    "\n",
    "            y = y_raw / mon * scale\n",
    "            err = np.sqrt(y_raw) / mon * scale\n",
    "\n",
    "            plt.errorbar(x, y, yerr=err, fmt='o-', label=f\"{scnum}\")\n",
    "\n",
    "        plt.title(\"Overlay Scans\")\n",
    "        plt.xlabel(f\"col {xcol}\")\n",
    "        plt.ylabel(f\"col {ycol}\")\n",
    "        plt.legend()\n",
    "        plt.grid()\n",
    "        plt.show()\n",
    "\n",
    "        # --- 情報表示（1つ目だけでOKなら） ---\n",
    "        header, data = load_scan(scans[0])   \n",
    "        print(header[\"scan\"])\n",
    "        print(header[\"title\"])\n",
    "\n",
    "# ===== rawデータ表示 =====\n",
    "        for i in range(min(3, data.shape[0])):\n",
    "          row = data[i]\n",
    "          print(\" \".join(f\"{v:.6g}\" for v in row))\n",
    "\n",
    "# ===== イベント登録 =====\n",
    "scan_box1.observe(update, names='value')\n",
    "scan_box2.observe(update, names='value')\n",
    "scan_box3.observe(update, names='value')\n",
    "use2.observe(update, names='value')\n",
    "use3.observe(update, names='value')\n",
    "\n",
    "#scan_box.observe(update, names='value')\n",
    "xcol_box.observe(update, names='value')\n",
    "ycol_box.observe(update, names='value')\n",
    "\n",
    "display(scan_box1, \n",
    "        widgets.HBox([use2, scan_box2]),\n",
    "        widgets.HBox([use3, scan_box3]),\n",
    "        xcol_box, ycol_box, moncol_box, scale_box, output)\n",
    "\n",
    "update()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "fbf4d2f4-6269-43c5-9d39-a6e7e6f32613",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python (rexs2025)",
   "language": "python",
   "name": "rexs2025"
  },
  "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.11.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
