{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 123,
   "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 = \"rawdata3\"   # rawdataフォルダ名\n",
    "save_dir = \"data3\"     # 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": 126,
   "id": "e5e5748e-5b7e-45f0-9247-ff40c4719d7a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "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 = 6   # CSVの処理範囲．最初の行番号（1はカラムの名前）\n",
    "end_line   = 9 # 最後の行番号\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": 121,
   "id": "ede666e0-39b7-43e0-aa98-2687263d677c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "feebf2ad4dd84605823784c343efd236",
       "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": "441adeaa76a246e68b4910a0dfd94fce",
       "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": "af508042146e44249b6c0dc400a48a50",
       "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": "0fafced442ae4444a25eccb648c501d4",
       "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 = \"rawdata3\"   # 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_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[\"title\"])\n",
    "        print(f\"lambda={header['lambda']}, E={header['E']}\")\n",
    "        print(header[\"CEN\"])\n",
    "        print(header[\"MAX-y\"])\n",
    "        print(f\"a b c = {header['abc']}\")\n",
    "        print(f\"alpha beta gamma = {header['angles']}\")\n",
    "        print(header[\"datetime\"])\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": 122,
   "id": "18872707-8710-4105-95e8-fd6a56646df3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "c077fa6dbeaf4a20b268cad58c161a2a",
       "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": "e208e2b635224509a4c0539503c0dd13",
       "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": "6543ae3dcaed4ab9b23c272d8a70ab56",
       "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": "6248cc9d83aa43eeb500b0f5b9c999aa",
       "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": "cdc1b6b6e129467482704fa5a3d856e1",
       "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": "3f835efc1fad4021aab326c06655b267",
       "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": "883afbd3bd5a49ad806dd814b4af1c21",
       "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": "b3c31049b1b2436fa42bfecf1885b027",
       "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 = \"rawdata3\"  # 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
}
