mirror of
https://github.com/c-sooyoung/lemon-sandbox.git
synced 2026-11-16 04:07:59 +09:00
260708
This commit is contained in:
1 parent
346b9cb2d0
commit
0716fe4b6a
1 file changed
+739
@@ -0,0 +1,739 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"id": "530e707b-cc48-4464-85d8-914e74dbffb2",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import os\n",
|
||||
"import numpy as np\n",
|
||||
"# import abtem\n",
|
||||
"# from ase.build import bulk, surface\n",
|
||||
"# from scipy.special import erf\n",
|
||||
"from scipy.ndimage import gaussian_filter\n",
|
||||
"# import skimage\n",
|
||||
"# from tifffile import imread\n",
|
||||
"import kemstem\n",
|
||||
"import tifffile\n",
|
||||
"from scipy.spatial import cKDTree\n",
|
||||
"from matplotlib import pyplot as plt, colors, colormaps, cm\n",
|
||||
"from mpl_toolkits.axes_grid1.anchored_artists import AnchoredSizeBar\n",
|
||||
"# from sklearn.cluster import KMeans\n",
|
||||
"# from scipy.optimize import linear_sum_assigAent\n",
|
||||
"# from scipy.spatial.distance import cdist\n",
|
||||
"# from scipy.interpolate import griddata\n",
|
||||
"# import imageio.v3 as iio\n",
|
||||
"# %matplotlib inline\n",
|
||||
"\n",
|
||||
"plt.rcParams['font.family'] = 'monospace'"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"id": "0e02178a",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"['f_410_1_obj_phase_roi_Niter100.tiff',\n",
|
||||
" 'f_410_2_obj_phase_roi_Niter100.tiff',\n",
|
||||
" 'f_410_3_obj_phase_roi_Niter100.tiff',\n",
|
||||
" 'f_410_4_obj_phase_roi_Niter100.tiff',\n",
|
||||
" 'f_420_1_obj_phase_roi_Niter120.tiff',\n",
|
||||
" 'f_420_2_obj_phase_roi_Niter120.tiff',\n",
|
||||
" 'f_420_3_obj_phase_roi_Niter120.tiff',\n",
|
||||
" 'f_420_4_obj_phase_roi_Niter120.tiff',\n",
|
||||
" 'f_430_1_obj_phase_roi_Niter80.tiff',\n",
|
||||
" 'f_430_2_obj_phase_roi_Niter80.tiff',\n",
|
||||
" 'f_430_3_obj_phase_roi_Niter80.tiff',\n",
|
||||
" 'f_430_4_obj_phase_roi_Niter80.tiff',\n",
|
||||
" 'f_450_1_obj_phase_roi_Niter90.tiff',\n",
|
||||
" 'f_450_2_obj_phase_roi_Niter90.tiff',\n",
|
||||
" 'f_450_3_obj_phase_roi_Niter90.tiff',\n",
|
||||
" 'f_450_4_obj_phase_roi_Niter90.tiff',\n",
|
||||
" 'f_471_1_obj_phase_roi_Niter50.tiff',\n",
|
||||
" 'f_471_2_obj_phase_roi_Niter50.tiff',\n",
|
||||
" 'f_471_3_obj_phase_roi_Niter50.tiff',\n",
|
||||
" 'f_471_4_obj_phase_roi_Niter50.tiff',\n",
|
||||
" 'f_471_5_obj_phase_roi_Niter230.tiff',\n",
|
||||
" 'f_471_6_obj_phase_roi_Niter230.tiff',\n",
|
||||
" 'f_471_7_obj_phase_roi_Niter230.tiff',\n",
|
||||
" 'f_472_1_obj_phase_roi_Niter50.tiff',\n",
|
||||
" 'f_472_2_obj_phase_roi_Niter50.tiff',\n",
|
||||
" 'f_472_3_obj_phase_roi_Niter50.tiff',\n",
|
||||
" 'f_472_4_obj_phase_roi_Niter50.tiff']"
|
||||
]
|
||||
},
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"basedir = \"/home/swim/Si_project/260707_BCAT_tif_file\"\n",
|
||||
"os.listdir(basedir)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"id": "f2b2c969-2f85-4443-961e-89e82d87fed1",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Shape : (379, 379)\n",
|
||||
"Dtype : uint8\n",
|
||||
"H × W : 379 × 379\n",
|
||||
"Pixel Size : 0.24 A/px\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 700x700 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"tiff = 'f_410_3_obj_phase_roi_Niter100.tiff'\n",
|
||||
"image_file = os.path.join(basedir, tiff)\n",
|
||||
"layer = 16\n",
|
||||
"image = tifffile.imread(image_file)[layer]\n",
|
||||
"\n",
|
||||
"roi_A = 92\n",
|
||||
"A_per_px = roi_A / image.shape[0] # A/pixel\n",
|
||||
"Si_distance_px = 1.358 / A_per_px\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"print(f\"Shape : {image.shape}\")\n",
|
||||
"print(f\"Dtype : {image.dtype}\")\n",
|
||||
"print(f\"H × W : {image.shape[0]} × {image.shape[1]}\")\n",
|
||||
"print(f\"Pixel Size : {A_per_px:.2f} A/px\")\n",
|
||||
"\n",
|
||||
"fig, ax = plt.subplots(figsize=(7, 7))\n",
|
||||
"ax.imshow(image, cmap='gray')\n",
|
||||
"# ax.set_title(f\"Raw Image ({image.shape[0]} × {image.shape[1]} px)\")\n",
|
||||
"# ax.axis('on') # 픽셀 좌표 눈금 표시\n",
|
||||
"plt.tight_layout()\n",
|
||||
"plt.show()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"id": "332955ec-b461-4452-a51d-ac02663a20af",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"1036 columns found\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 700x700 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# gaussian_filter는 find_columns 보조용으로만, refine은 image로\n",
|
||||
"blurred_image = gaussian_filter(image, 1)\n",
|
||||
"distance = 2 # 원자 간격 픽셀의 절반 정도로 조정\n",
|
||||
"threshold = 0.5\n",
|
||||
"\n",
|
||||
"c0 = kemstem.find_columns(blurred_image, distance=distance, threshold=threshold)\n",
|
||||
"\n",
|
||||
"fig, ax = plt.subplots(1, 1, constrained_layout=True, figsize=(7, 7))\n",
|
||||
"ax.imshow(image, cmap='gray') # matshow → imshow 통일\n",
|
||||
"ax.axis('off')\n",
|
||||
"ax.plot(c0[:, 1], c0[:, 0], 'r.', markersize=5)\n",
|
||||
"print(f'{c0.shape[0]} columns found')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 8,
|
||||
"id": "df33d2f5-352d-49b4-8177-6b2ea4357ed0",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# # 1. 반드시 widget 모드로 설정 (VS Code/Jupyter Lab 권장)\n",
|
||||
"# %matplotlib widget \n",
|
||||
"# import matplotlib.pyplot as plt\n",
|
||||
"# import numpy as np\n",
|
||||
"\n",
|
||||
"# # 만약 widget 모드가 지원되지 않는 환경이라면 에러가 날 수 있습니다.\n",
|
||||
"# # 그럴 경우 다시 알려주세요.\n",
|
||||
"\n",
|
||||
"# class AtomEditor:\n",
|
||||
"# def __init__(self, img, coords):\n",
|
||||
"# self.img = img\n",
|
||||
"# self.coords = list(coords)\n",
|
||||
"# self.fig, self.ax = plt.subplots(figsize=(7, 7))\n",
|
||||
"# self.ax.imshow(self.img, cmap='gray')\n",
|
||||
" \n",
|
||||
"# # 초기 원자 표시 (데이터가 없을 경우를 대비해 빈 리스트 처리)\n",
|
||||
"# x_init = [c[1] for c in self.coords] if self.coords else []\n",
|
||||
"# y_init = [c[0] for c in self.coords] if self.coords else []\n",
|
||||
"# self.points, = self.ax.plot(x_init, y_init, 'r.', markersize=3)\n",
|
||||
" \n",
|
||||
"# self.ax.set_title(\"Left Click: Add (+) | Right Click: Remove (-)\")\n",
|
||||
" \n",
|
||||
"# # 클릭 이벤트 연결\n",
|
||||
"# self.fig.canvas.mpl_connect('button_press_event', self.on_click)\n",
|
||||
"\n",
|
||||
"# def on_click(self, event):\n",
|
||||
"# # 마우스가 이미지 안에 있지 않으면 무시\n",
|
||||
"# if event.inaxes != self.ax: return\n",
|
||||
" \n",
|
||||
"# if event.button == 1: # 왼쪽 클릭: 추가\n",
|
||||
"# self.coords.append([event.ydata, event.xdata])\n",
|
||||
" \n",
|
||||
"# elif event.button == 3: # 오른쪽 클릭: 삭제\n",
|
||||
"# if len(self.coords) == 0: return\n",
|
||||
"# # 클릭한 지점에서 가장 가까운 원자 찾기\n",
|
||||
"# dists = np.sqrt([(c[0]-event.ydata)**2 + (c[1]-event.xdata)**2 for c in self.coords])\n",
|
||||
"# closest_idx = np.argmin(dists)\n",
|
||||
"# if dists[closest_idx] < 15: # 15픽셀 이내일 때만 삭제 (너무 멀면 실수 방지)\n",
|
||||
"# self.coords.pop(closest_idx)\n",
|
||||
"\n",
|
||||
"# self.update_plot()\n",
|
||||
"\n",
|
||||
"# def update_plot(self):\n",
|
||||
"# # 좌표 업데이트 후 즉시 다시 그리기\n",
|
||||
"# if len(self.coords) > 0:\n",
|
||||
"# y, x = zip(*self.coords)\n",
|
||||
"# self.points.set_data(x, y)\n",
|
||||
"# else:\n",
|
||||
"# self.points.set_data([], [])\n",
|
||||
" \n",
|
||||
"# # 화면 강제 갱신\n",
|
||||
"# self.fig.canvas.draw_idle()\n",
|
||||
"\n",
|
||||
"# # 실행 (기존에 찾은 원자 좌표 c0 전달)\n",
|
||||
"# editor = AtomEditor(blurred_image, c0)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 9,
|
||||
"id": "7b967516-44b1-4efb-be83-a9b326f33ee7",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# # 에디터 객체(editor) 내부에 저장된 리스트를 numpy 배열로 변환하여 c0에 덮어쓰기\n",
|
||||
"# c0 = np.array(editor.coords)\n",
|
||||
"\n",
|
||||
"# print(f\"✅ 수동 수정 후 c0 개수: {len(c0)}개\")\n",
|
||||
"# %matplotlib inline\n",
|
||||
"# plt.close()\n",
|
||||
"# # 여기서 개수가 늘어난 것을 확인했다면 성공입니다."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 10,
|
||||
"id": "7ee2de7a-4596-483b-abc5-a7a574170120",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"100%|██████████| 1/1 [00:00<00:00, 104.77it/s]\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 640x480 with 4 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"test_it = 100\n",
|
||||
"window_dim = 5\n",
|
||||
"cf,errs,opts,data_fits = kemstem.refine_columns(blurred_image,c0[test_it,:],window_dim)\n",
|
||||
"\n",
|
||||
"visualization_window = 5*window_dim\n",
|
||||
"fig,ax = plt.subplots(2,2,constrained_layout=True)\n",
|
||||
"ax[0,0].matshow(data_fits[:,:,0,0],cmap='gray')\n",
|
||||
"ax[0,1].matshow(data_fits[:,:,0,1],cmap='gray')\n",
|
||||
"ax[1,0].matshow(blurred_image,cmap='gray')\n",
|
||||
"ax[1,0].plot(c0[test_it,1],c0[test_it,0],'b.') # original unfit position shown in blue\n",
|
||||
"ax[1,0].plot(cf[0,1],cf[0,0],'r.') # fit position shown in red\n",
|
||||
"ax[1,0].set_xlim([c0[test_it,1]-visualization_window,c0[test_it,1]+visualization_window])\n",
|
||||
"ax[1,0].set_ylim([c0[test_it,0]+visualization_window,c0[test_it,0]-visualization_window])\n",
|
||||
"ax[1,1].matshow(data_fits[:,:,0,0]-data_fits[:,:,0,1],cmap='gray',vmin=-.1,vmax=.1) # fit residual\n",
|
||||
"_ = [tax.axis('off') for tax in ax.ravel()]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 11,
|
||||
"id": "35cd1839-ca56-4d18-863b-ef0caa98491a",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"100%|██████████| 1036/1036 [00:03<00:00, 302.79it/s]\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"cf, errs, opts, data_fits = kemstem.refine_columns(image, c0, window_dim)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 12,
|
||||
"id": "8535f556-3833-4a5c-b62b-ef7e53a1f17d",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 700x700 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"fig, ax = plt.subplots(1, 1, constrained_layout=True, figsize=(7, 7))\n",
|
||||
"ax.imshow(image, cmap='gray') # matshow → imshow\n",
|
||||
"ax.plot(cf[:, 1], cf[:, 0], 'r.', markersize=3)\n",
|
||||
"ax.axis('off')\n",
|
||||
"plt.show()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 13,
|
||||
"id": "7fedabac-340a-4164-a29c-3d5231fd0ad1",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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ou4hjMC6UaNGKTs72+PweJnc3FwlJSWpQYMGHsOCBQtUUlKiU6dOVWldWVlZ5f4gXugPZGBgoMdzb29v/fTTT+Wmq2iZJSUlOn78uCTp5MmTFa7H5XLpxIkTla6/ImFhYTWaX/r5MHlwcLBHW00CTtOmTbVx40aFh4dr0qRJ6tKli1q2bHneazcu5uWXX9bIkSMVFRWlFStWaPv27dq+fbuaN29e4etxsdctNzdXkhQaGnrB9db2/lfZ+iqrtvu5svtpVd9H0oX306q8vmXXz3h5eXk8luQO/6h/uJsG1oWEhGjIkCF67bXX5Ovr6zHO5XIpMjJSzz//fIXzNm3atErratWqlfuDqMwvn1dHWeg497mPj49cLpekn7/NVbSe3Nxc97c7SWrQoIEklft2+8MPP5x33ed+k6+uli1bKi8vz6Ptl9tUVdddd53WrFkjY4zS09M1efJkPf7444qNjdW1115bpWW9++676tu3r5YsWeJuKy4urnaQK3tdjhw5ctHpanP/+zXUZj9Xdj+tzvvoQvtpbb++qH84MoI6Ydy4cfriiy+0b98+j/abb75ZmZmZCg8PV3R0dLmhqh/EPXv2VFJSkscFnp988kmN6//00089nn/22WeKioqSt7e3JOk3v/mNMjMzdejQIfc0J06c0NatW9WrVy93W8uWLSV5fkgePny4VgLThURHR+vvf/+7fvzxR3dbbfSL9PM32aioKE2ZMkWSPPqgTNmRgtOnT593Gf7+/h5tZRdXVkfv3r0VEBCgpUuXlht37jJre//7NdVGP1d2P63t91Ftv76of+rOOwlXtD59+qh79+7KyMjwOJz77LPP6pNPPlHfvn312GOPKSwsTMeOHVNycrIKCgrc36S+++47fffdd+7HkjzOcZf9IZ02bZpWrVqluLg4xcfH69ixY5o1a1aN63/11VfVpEkTde/eXe+88452796tNWvWuMc/9thjevvttzVo0CDNmDFDDRo00IsvvqiioiKP2zB79eqlpk2b6s9//rMWL16ss2fPasKECR7Xcvwapk2bpoSEBN1xxx169NFH9d1331X4z7Eq28/r16/XG2+8ocGDB6tDhw7Ky8vTc889577+4JfKvsE/9dRTGjFihBo2bCiXy+U+gjFo0CA999xzeuGFF9SzZ0+lpKRo3rx5Ht/Wq6JJkyaaNWuWHn30UQ0cOFAjRoxQ48aNlZKSon379mnZsmWSKr//1TZb/VzZ/bS230e1/fqiHrJ6+SyuWGV305zr9ddfN5I87qYxxphDhw6ZESNGmFatWpkGDRqY1q1bm7i4OLN69Wr3NGV3CZxvONfatWtN165dja+vr+nWrZv57LPPjCQzf/589zSVvaulbLoPP/zQXHvttcbX19d06tSpwrsb/vnPf5qbbrrJ+Pv7m0aNGpmYmBizadOmctN99tlnplu3bsbpdJpu3bqZVatWXfBumvPd7VJVa9asMd26dTO+vr4mPDzcfPLJJ+WWX9l+3rt3r7nrrrtM+/btjdPpNCEhIWbQoEEmNTX1vOufMWOGCQ0NNV5eXuXWW1hYaOLj402rVq1Mw4YNzfXXX2+Sk5NNp06dPPajqt6NtHr1atOnTx8TEBBgAgICTK9evcyqVas8pqnM/ldZla3PVj8bU/n9tDLvozIX208r8/qW3U3z5ZdfGmOMeeCBB0xsbGyF41D/OIyp4SXuQD23Y8cO9ejRQxs2bNCAAQNslwPUS7yPUBOEEVxxHnzwQfXr109hYWHKzs7Wc889Jx8fH6WmprqvygdwYbyPUJu4ZgRXnLNnz+qpp57SsWPH1KpVK91444164YUX+AMKVAHvI9QmjowAAACriLAAAMAqwggAALCKMAIAAKy6oi9gLS0t1ffff6/GjRu7f+MAAABcnDFGp0+fVmhoaI0vXL6iw8j333+vtm3b2i4DAIB66/Dhw2rTpk2NlnFFh5HGjRtL+rkjy36CGgAAXFx+fr7atm3r/iytiSs6jJSdmmnSpAlhBACAaqiNyxy4gBUAAFhFGAEAAFYRRgAAgFWEEQAAYBVhBAAAWEUYAQAAVhFGAACAVYQRAABgFWEEAABYRRgBAABWEUYAAIBVV/Rv0wAALm/tp37sfnzwhYEWK8GFcGQEAABYRRgBAABWEUYAAIBVhBEAAGAVYQQAAFhFGAEAAFYRRgAAgFWEEQAAYBVhBAAAWEUYAQAAVhFGAACAVYQRAABgFWEEAABYRRgBAABWEUYAAIBVhBEAAGAVYQQAAFhFGAEAAFYRRgAAgFWEEQAAYJXVMPLggw/K4XB4DE8//bR7fGJioiIjI+V0OhUZGamkpCSP+U+cOKF77rlHAQEBCgkJ0YwZMy7xFgAAgJrysV1A//799c4777ifBwQESJKys7MVFxenhx56SB988IEWLlyouLg47du3T82bN5ckjR49WpmZmUpMTNSRI0c0bNgwtW7dWmPGjLGyLQAAoOqsn6ZxOp1q2bKleygLI8uXL5efn5/mzZunrl27av78+WrQoIGWL18uScrNzVVCQoJmz56t6Oho3XbbbRo9erQWLlxoc3MAAEAVWQ8Line truncated
|
||||
"text/plain": [
|
||||
"<Figure size 600x400 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"atoms_xy = cf[:,::-1]\n",
|
||||
"\n",
|
||||
"tree = cKDTree(atoms_xy)\n",
|
||||
"\n",
|
||||
"dists, inds = tree.query(atoms_xy, k=7)\n",
|
||||
"\n",
|
||||
"nearest_distances = dists[:, 1:].ravel()\n",
|
||||
"\n",
|
||||
"plt.figure(figsize=(6, 4))\n",
|
||||
"plt.hist(nearest_distances[nearest_distances < 12], bins=80)\n",
|
||||
"plt.xlim(0, 12)\n",
|
||||
"plt.xlabel(\"peak-to-peak distance [pixels]\")\n",
|
||||
"plt.ylabel(\"count\")\n",
|
||||
"plt.title(\"Neighbour distance histogram\")\n",
|
||||
"plt.show()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 14,
|
||||
"id": "822fd5f1",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"499"
|
||||
]
|
||||
},
|
||||
"execution_count": 14,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# Cell 7\n",
|
||||
"# Choose a dumbbell-pairing distance window in pixels.\n",
|
||||
"# For a real image, inspect the histogram above and set these manually.\n",
|
||||
"\n",
|
||||
"d_min = 4\n",
|
||||
"d_max = 6\n",
|
||||
"\n",
|
||||
"# Cell 8\n",
|
||||
"# Make all candidate close pairs within the dumbbell distance window.\n",
|
||||
"\n",
|
||||
"pairs = []\n",
|
||||
"\n",
|
||||
"for i, p in enumerate(atoms_xy):\n",
|
||||
" neighbours = tree.query_ball_point(p, r=d_max)\n",
|
||||
"\n",
|
||||
" for j in neighbours:\n",
|
||||
" if j <= i:\n",
|
||||
" continue\n",
|
||||
"\n",
|
||||
" q = atoms_xy[j]\n",
|
||||
" d = np.linalg.norm(q - p)\n",
|
||||
"\n",
|
||||
" if d_min <= d <= d_max:\n",
|
||||
" pairs.append((i, j, d))\n",
|
||||
"\n",
|
||||
"pairs = np.array(pairs, dtype=float)\n",
|
||||
"len(pairs)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 15,
|
||||
"id": "48b9cafd",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"499"
|
||||
]
|
||||
},
|
||||
"execution_count": 15,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# Cell 9\n",
|
||||
"# Greedy pairing:\n",
|
||||
"# sort candidate pairs by distance and assign each atom to at most one dumbbell.\n",
|
||||
"\n",
|
||||
"pairs_sorted = pairs[np.argsort(pairs[:, 2])]\n",
|
||||
"\n",
|
||||
"used = set()\n",
|
||||
"dumbbells = []\n",
|
||||
"\n",
|
||||
"for i, j, d in pairs_sorted:\n",
|
||||
" i = int(i)\n",
|
||||
" j = int(j)\n",
|
||||
"\n",
|
||||
" if i in used or j in used:\n",
|
||||
" continue\n",
|
||||
"\n",
|
||||
" dumbbells.append((i, j, d))\n",
|
||||
" used.add(i)\n",
|
||||
" used.add(j)\n",
|
||||
"\n",
|
||||
"dumbbells = np.array(dumbbells, dtype=float)\n",
|
||||
"\n",
|
||||
"len(dumbbells)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 16,
|
||||
"id": "a11bae0f",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Cell 10\n",
|
||||
"# Extract dumbbell geometry:\n",
|
||||
"# center, vector, length, and angle.\n",
|
||||
"\n",
|
||||
"dumbbell_centers = []\n",
|
||||
"dumbbell_vectors = []\n",
|
||||
"dumbbell_lengths = []\n",
|
||||
"dumbbell_angles = []\n",
|
||||
"\n",
|
||||
"for i, j, d in dumbbells:\n",
|
||||
" i = int(i)\n",
|
||||
" j = int(j)\n",
|
||||
"\n",
|
||||
" p = cf[i]\n",
|
||||
" q = cf[j]\n",
|
||||
"\n",
|
||||
" center = 0.5 * (p + q)\n",
|
||||
" vector = q - p\n",
|
||||
" length = np.linalg.norm(vector)\n",
|
||||
" angle = np.degrees(np.arctan2(vector[1], vector[0]))\n",
|
||||
"\n",
|
||||
" dumbbell_centers.append(center)\n",
|
||||
" dumbbell_vectors.append(vector)\n",
|
||||
" dumbbell_lengths.append(length)\n",
|
||||
" dumbbell_angles.append(angle)\n",
|
||||
"\n",
|
||||
"dumbbell_centers = np.array(dumbbell_centers)\n",
|
||||
"dumbbell_vectors = np.array(dumbbell_vectors)\n",
|
||||
"dumbbell_lengths = np.array(dumbbell_lengths)\n",
|
||||
"dumbbell_angles = np.array(dumbbell_angles)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 17,
|
||||
"id": "d2d185d6",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAi4AAAJDCAYAAAAsIJ9bAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjYsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvq6yFwwAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzs/XeYZNd53ou+VdXVlau6e6YnB2RgMEMQAJEjkUFSlEQqW7ZkKvpIFiUq0JR8bck6lC1dW9Y91tG1JVqijqxkMQEgiBxJkEiDDIIAiDSY3DlXdVfY94+u3+53rykADZISxatez1PPTFftsNa3vvB+Ya2ViqIo0lpba2ttra21tbbW1tp3QEt/uzuw1tbaWltra22trbW1ttq2BlzW2lpba2ttra21tfYd09aAy1pba2ttra21tbbWvmPaGnBZa2ttra21tbbW1tp3TFsDLmttra21tbbW1tpa+45pa8Blra21tbbW1tpaW2vfMW0NuKy1tbbW1tpaW2tr7TumrQGXtbbW1tpaW2trba19x7Q14LLW1tpaW2trba2tte+YtgZc1to/WPvzP/9zpVKp+FMqlbR792795m/+pmZnZ7+pZ//Wb/2WUqnUt6in31hLpVL6rd/6rW/o3ocffljvfe97tWnTJpVKJe3atUs/+ZM/qf379/e8/ls53vvuuy8xL3v37j3mmv/0n/6Trr/+eg0NDSmVSunP//zPez5rtdcdOXJEP/IjP6KBgQFVKhV9z/d8j1577bVjrtu7d2+ib/fdd983PtA3aN/MvK2mwfe9xveNXLfa9sM//MOrot1qr1tra+0fS1sDLmvtH7z9z//5P/Xggw/qhhtu0NVXX63f/u3f1nXXXadv5vSJn/qpn9KDDz74LezlP1y78847dfHFF6vT6ei///f/rhtuuEE/+7M/q8cff1wvv/xyz3v+Psb7R3/0R3rwwQe1a9euY377wz/8Qy0sLOg973nPmz5jNde1Wi1dd911euCBB/SJT3xCf/VXf6UXX3xRV155pebn5xPX7tq1Sw8++KD+6I/+6Bsb1D/h9vGPf3xVtFvtdWttrf1jaX3f7g6stX96bffu3brgggskSddcc43Gx8f1V3/1V3rwwQd10UUXfUPP3LZtm7Zt2/at7OY/WPu93/s97dixQzfffLP6+pZF8pprrtEv/dIvaWlpqec9fx/jPf300+N5Cdv+/fuVyWS0d+9e/fVf//UbPmM1133qU5/S008/rdtuu03XXXedJGnHjh0666yz9Kd/+qf68Ic/HF9bKpV0wQUXqNFofBMj+6fZTjrpJJ100klvSbvVXrfW1to/lrYWcVlr3/Z24YUXSlIcIh8dHdXP/dzPadeuXSqVSqpUKrrssst05513HnPvSSedlAhzv1kjJfDJT35Sp512mnK5nHbs2KGbbropvmbfvn36F//iX2jDhg3K5XI666yz9PnPf/6YZ91www3as2ePcrmcTj/9dN12223f8PgPHjyo9evXx6DFW39/f+LvtzPeb2XLZDLfsutuvfVWVatVXXPNNfF3Z555pk466STdcsst33AfV9NWM29vlLI57rjj9C//5b+UtMyrqVRKH/7wh7Vlyxadcsopuv3223XGGWdoaGhIv//7v3/Mc/fu3atzzz1X+XxeJ554ov74j/+4Zx9Xc91q+fRb3R577DFdf/31Wr9+vYrFok477TR99KMf/Xt/71pba97WgMta+7a3l156SZK0YcMGSdLIyIgmJyf10Y9+VJ///Of16U9/Wscff7ze85736KGHHkrc++lPf1oPPvigfvInf3JV7/rCF76g3/3d39XHPvYx3XLLLfrwhz+subk5ScvRgvPPP18PPPCA/vN//s+66aabdMYZZ+h7v/d7dccdd8TPePTRR/V93/d92r59uz73uc/pF3/xF/WhD33oGx7/2WefrUcffVT//t//e+3bt+9Nr3274/3H2J5//nmdcsopSqfTWlpaij39U089VV/72tf+3t77rZ43SXr11Vf1iU98QhMTE/ru7/5u/fqv/7r+2T/7Z/qN3/gNLSwsJK79mZ/5Gf3QD/2QbrzxRl100UX6V//qX+mzn/3sMc98q+tWy6ff6jY/P6/rrrtOR48e1Z/8yZ/o5ptv1i/90i+9Jc+utbX2LW/RWltr/0Dtk5/8ZCQpeuCBB6JmsxlNTExEf/EXfxHlcrlo586dUaPR6Hlfq9WKlpaWooGBgeinf/qne17zm7/5m9FbsbOkqFarRWNjYz1//9CHPhT19/dHX//61xPfn3322dGFF14Y//2BD3wgGhoaiur1evzdn/zJn0SSot/8zd980z70avv374/OPvvsSFIkKdq5c2f04Q9/OHrxxRff8J7VjHe17d57740kRffee+9bXvvoo49GkqJPfvKT3/B1J510UnT11VdHURRFu3fvjjZv3hzNz89HP/qjPxpVKpVvuo9v1FY7b/Dpq6++mrh/586d0Y//+I9HURRFr776aiQp+uxnPxtFURR9z/d8T3TGGWdEURRFTzzxRCQpeuqppxLP+3f/7t8lnrd79+7orLPOOua9b3XdavmUtlravdV1zOknPvGJN33OWltrf99tLeKy1v7B2yWXXKJsNquhoSH92I/9mM4991zddtttyuVy8TV/9md/pnPOOUe1Wk19fX3q7+/X1NSUDh8+/E29+/3vf7/WrVvX87dbb71VF1xwgY477ji1Wq34c8kll+iRRx6J600ee+wxXXrppcrn8/G973vf+77hPm3btk2PPPKI7r77bn3kIx/RunXr9N/+23/TmWeeqfvvv/8bfu53Qlu3bp0GBgaUyWQURdHfa/rrWz1vkjQwMCBJqlarif9L0szMTOLasGD5uuuu09NPP61Wq/W2rlstn36r24knnqhKpaL/8l/+i/78z/9cL7744jdVUL/W1to32taKc9faP3j75Cc/qT179qi/v1/btm3T0NBQ4vf/+l//q37lV35FP/VTP6WPf/zjWr9+vSTpve99r5rN5jf17p07d77hb2NjYzpy5Iiy2WzP36enpzU8PKyRkZFj+vxGYGi1LZPJ6Morr9SVV14paTmtceWVV+o3fuM39OUvf/mbevY/tjYwMKCpqSlJSgCz6enp2Pj/fbS/j3kDaKXT6cT/JR0DSMJ3rVu3Tu12W+Pj49q4ceOqr1stn36r2+DgoO6++279zu/8jj7ykY9oampKGzZs0Mc+9jF95CMf+Za/b62ttTdqa8Blrf2Dt9NOO03nnHPOG/7+l3/5l7rsssv0iU98Iv6u1WppcnLym353rwJY2vr163XGGWfod37nd3r+Pjg4KEnatGmTJiYmEr+Nj49/033zdu655+raa6/Vvffe+y197j+GtmvXLt10003HRFheeOGFnkuxv1VttfMGIAijCeFS7bfbwneNj4+rr68vBuarvW61fEpbbRRrNdede+65uuGGGxRFkZ588kl99KMf1S//8i/r8ssv19lnn72q96y1tfbNtrVU0Vr7R9fYnM7b3/zN3xzjwX6r2/XXX6/nnnsuBlbhB9Bzzjnn6Etf+lJi+eitt976Db/3yJEjx3zX6XT08ssvxwXL///Urr/+ek1PT+uuu+6Kv3v66af10ksv6b3vfe/f23tXO2+bNm2StLzai7Z//36NjY19U++//fbbE3/fcccdOuuss45ZifVW162WT2lEcEZHR9+0f6u9TlqW0bPOOkv/5t/8G0nS66+//pb3rLW19q1qaxGXtfaPrn3Xd32XPv7xj+t3f/d3dd5552nv3r36gz/4g2PSCAcOHNCBAwfi/0tKrDp6oz1J3qj99m//tm699VZddtll+sVf/EXt3LlTIyMjevDBBzU3NxdHgH79139dn/3sZ/WBD3xAv/ALv6ADBw7oP/yH//ANj/cnfuInlE6n9f3f//064YQTNDExoT/7sz/TU089ldgU7Fs93rfT7r//fo2OjuqVV16RtLxkt1wuS5K+//u//21d94M/+IP6vd/7Pf3UT/2Ufv/3f1/9/f362Mc+puOPP/7vdbXUauftggsu0ODgoP7jf/yP+pM/+RPV63V9+MMfTtTGfCPtD//wD1WtVrVnzx79r//1v/Tss8/qhhtueNvXrZZPaaeccop27Nih3/3d39Xg4KDK5bKOO+64GKCt9rqbb75Z/+N//A998IMf1PHHH6+JiQl9/OMf1+Dg4De8/9JaW2vfUPu2lgavtX9SjVUTDz744Jtet7i4GP3Kr/xKtHnz5iifz0cXXXRR9OCDD0YnnnhidN1118XXsbLmjT5h0ypW/bz++uvRhz70oWjz5s1RNpuNtm7dGr3//e+PPve5zyWuu+GGG6Ldu3dH/f390WmnnRbdeuut3/CqohtuuCH6wAc+EO3cuTPK5XLRhg0bossuu+yYd77d8a62rWbVyeWXX76q9672usOHD0c/9EM/FFWr1ahcLkfvf//7o1deeeWb6uNq2mrn7Y477oh2794d5XK5aPfu3dFnPvOZnquK6M+P//iPR5dffnnP3+D7T33qU9HZZ58d9ff3RyeeeOIxq3NWe10UrZ5PaY888kh07rnnRv39/ZGk6A/+4A/e9nXPP/989IM/+IPRcccdF/Ppd33Xd0WPPfbYm5F8ra21b3lLRdFaWfhaW2v/lNt9992nK664QnfddZcuv/zyN60D+na0Vqul+++/X1dffbXuvfdevfvd7/52d2mtrbW19m1sazUua22trTVJ0tVXX61sNtvzkMVvV9u7d6+y2ayuvvrqb3dX1tpaW2v/SNpaxGWtrbV/4m12dlYvvPBC/Pfpp5+uYrH4bezRSltYWNBzzz0X/33qqaeqUql8G3u01tbaWvt2tzXgstbW2lpba2ttra2175i2lipaa2ttra21tbbW1tp3TFsDLmttra21tbbW1tpa+45pa8Blra21tbbW1tpaW2vfMW0NuKy1tbbW1tpaW2tr7TuLine truncated
|
||||
"text/plain": [
|
||||
"<Figure size 700x700 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# Cell 11\n",
|
||||
"plt.figure(figsize=(7, 7))\n",
|
||||
"plt.imshow(image, cmap=\"gray\")\n",
|
||||
"\n",
|
||||
"# plt.scatter(\n",
|
||||
"# atoms_xy[:, 0],\n",
|
||||
"# atoms_xy[:, 1],\n",
|
||||
"# s=20,\n",
|
||||
"# facecolors=\"none\",\n",
|
||||
"# edgecolors=\"r\"\n",
|
||||
"# )\n",
|
||||
"\n",
|
||||
"for i, j, d in dumbbells:\n",
|
||||
" i = int(i)\n",
|
||||
" j = int(j)\n",
|
||||
"\n",
|
||||
" p = atoms_xy[i]\n",
|
||||
" q = atoms_xy[j]\n",
|
||||
"\n",
|
||||
" plt.plot(\n",
|
||||
" [p[0], q[0]],\n",
|
||||
" [p[1], q[1]],\n",
|
||||
" 'ro-',\n",
|
||||
" linewidth=1,\n",
|
||||
" markersize=2\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
"plt.axis(\"off\")\n",
|
||||
"plt.title(\"Paired Si [110] dumbbells\")\n",
|
||||
"plt.show()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 18,
|
||||
"id": "03a04040",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 600x400 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# Cell 11\n",
|
||||
"# Histogram of dumbbell distances.\n",
|
||||
"# Inspect this plot, then choose vmin and vmax manually in the next cell.\n",
|
||||
"\n",
|
||||
"dumbbell_distances = dumbbells[:, 2]\n",
|
||||
"\n",
|
||||
"plt.figure(figsize=(6, 4), dpi=100)\n",
|
||||
"plt.hist(dumbbell_distances, bins=30, color='#aaa')\n",
|
||||
"# xticks, xticklabels = plt.xticks()\n",
|
||||
"# plt.xticks(xticks, np.round(xticks * A_per_px, 2))\n",
|
||||
"plt.xlabel(\"dumbbell distance [px]\")\n",
|
||||
"plt.ylabel(\"count\")\n",
|
||||
"# plt.title(\"Histogram of Si [110] dumbbell distances\")\n",
|
||||
"\n",
|
||||
"vmin = 5.2\n",
|
||||
"vmax = 5.8\n",
|
||||
"\n",
|
||||
"plt.axvline(vmin, color='k', linestyle='--', label=f'vmin = {vmin:.2f}')\n",
|
||||
"plt.axvline(vmax, color='k', linestyle='--', label=f'vmax = {vmax:.2f}')\n",
|
||||
"plt.axvline(Si_distance_px, color='red', linestyle='-', label=f'vmax = {vmax:.2f}')\n",
|
||||
"\n",
|
||||
"plt.show()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 19,
|
||||
"id": "248d4472",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# plt.figure(figsize=(4, 4), dpi=100)\n",
|
||||
"# plt.hist(dumbbell_distances, bins=30, color='#aaa')\n",
|
||||
"# xticks, xticklabels = plt.xticks()\n",
|
||||
"# plt.xticks(xticks, np.round(xticks * A_per_px, 2))\n",
|
||||
"# plt.xlabel(\"dumbbell distance [Å]\")\n",
|
||||
"# plt.ylabel(\"count\")\n",
|
||||
"# plt.axvline(vmin, color=plt.cm.viridis.colors[0], linestyle='--', label=f'vmin = {vmin:.2f}')\n",
|
||||
"# plt.axvline(vmax, color=plt.cm.viridis.colors[-1], linestyle='--', label=f'vmax = {vmax:.2f}')\n",
|
||||
"# plt.axvline(Si_distance_px, color='red', linestyle='-', label=f'vmax = {vmax:.2f}')\n",
|
||||
"\n",
|
||||
"# plt.show()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 27,
|
||||
"id": "c2636688",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAz0AAATLCAYAAACwBNn/AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjYsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvq6yFwwAAAAlwSFlzAAAuIwAALiMBeKU/dgABAABJREFUeJzs/VeXJOd1LYrOiEhfrr1Do+EaaO8AAgSNJBqJlHS0taV97rgv9z/sf7F/wzkv93nfLUMnit5JpEiCQHcDDQ8QQPuu7uryNrMyIu5DYUbNmPllwujccW5jxBqjRmZFRnxmfcvMtT4TUZ7nOSqqqKKKKqqooooqqqiiij6jFP/f3YCKKqqooooqqqiiiiqqqKL/X1IV9FRUUUUVVVRRRRVVVFFFn2mqgp6KKqqooooqqqiiiiqq6DNNVdBTUUUVVVRRRRVVVFFFFX2mqQp6KqqooooqqqiiiiqqqKLPNFVBT0UVVVRRRRVVVFFFFVX0maYq6KmooooqqqiiiiqqqKKKPtNUBT0VVVRRRRVVVFFFFVVU0WeaqqCnoooqqqiiiiqqqKKKKvpMUxX0VFRRRRVVVFFFFVVUUUWfaaqCnooqqqiiiiqqqKKKKqroM01V0FNRRRVVVFFFFVVUUUUVfaapCnoqqqiiiiqqqKKKKqqoos80VUFPRRVVVFFFFVVUUUUVVfSZpiroqaiiiiqqqKKKKqqoooo+01QFPRVVVFFFFVVUUUUVVVTRZ5qqoKeiiiqqqKKKKqqooooq+kxTFfRUVFFFFVVUUUUVVVRRRZ9pqoKeiiqqqKKKKqqooooqqugzTVXQU1FFFVVUUUUVVVRRRRV9pqkKeiqqqKKKKqqooooqqqiizzRVQU9FFVVUUUUVVVRRRRVV9JmmKuipqKKKKqqooooqqqiiij7TVAU9FVVUUUUVVVRRRRVVVNFnmqqgp6KKKqqooooqqqiiiir6TFMV9FRUUUUVVVRRRRVVVFFFn2mqgp6KKqqooooqqqiiiiqq6DNNVdBTUUUVVVRRRRVVVFFFFX2mqQp6KqqooooqqqiiiiqqqKLPNNX+725ARZ+c/vt//+/o9/vY2NhAkiRIkgTNZhNRFAEA6vU6arUaJicn0d4RYeLhLpJWiu4qMP3mJlbnUmxubiLLMuR5jjRNkec5ACCKIsRxXPxNTk6iXq+j2Wxic3MT/X6/uD+KImRZhs3NTayvr6Pf76Pb7QJA8XwURdjc3EQURUiSBPV6HUmSFM9HUYQ8z5HneVF2r9dDHMdFewAU7WSboyhCvV4HAKRpiiRJEMcxarUakiRBrVYr/lqtFlbzZdzovoel7iJacQeHkkfQyjrodrvI87woFwCyLCv40G630Wg0sGfPnqLtS0tLWF9fx/r6OqIoKnhDPuR5jiRJSmPG9rON9XodcRwjTdOCX5ubm0Ufte9sU5Zl6Pf7pfHhPVmWlcal3W4XfKjX6zhwrIGjf1JHJGmOLAP++O893H5zoxhbjgEANJtNJEmCRqOBVquFRqOBycnJYszW19fR7XaxsLCAfr+Pzc3N4FjyGvnHNikf2BfyROVSvytPyCO2F0BRJsczy7Ki7EajgVqthl27dqHVamFiYgIrKytYW1vD0tISer0e1tfXi7Fk+eQD/1hGo9FAs9nE3NwcVldXi7GnzHMcsyxDr9creFKr1Qp9YP/4XKvVKvSC8qD3swyWzb6pnvAPABqNRmEfyMdOp1PodK1WK/oHAIuLi9jY2MDy8nIhEywXQNF/8nJiYqJUL/u6ubmJbrdb8IH3NxoNpGla2C+1PSyffVVZ0f4pf+M4LskbdY/3uz5R3mi7aL/YfrazVqsV/SHRJml5tVrZhaqMsn1xHBd1xXFc9L3f7yPLsmJ82b5arVbcz3qTJCnkQdtDu6dyRkrTtGgj+6f8JVHm1CeQ1tfXS33Xse73+4W91XHQPvAa28r6tR6165TVbreLbreLfr8/0AfafZZLe6Rj3Gq10O12C36p3YiiCJ1OB3meY2Njo5BXlVHXI/JX5YE+N8/zgj9qr3i/2jEdZ/I3juOSHaTcqe6p/CsfeY33s7/sn14bHx8f0CeOOe03ZTKOY7RarZItJM9JlFvKGdsVx3HBm5Ce0c5TpnmN/SC/yA/aPfV/jUajsG3r6+sln9VsNotrKnuql8QqrVYL9XodjUaj4IeOHcefNoHjtrm5WYx5t9tFlmWFjWX5xBHsL/nbbDZRr9cxNjZW8LLT6SCKokLfAGBlZaXwScQx7PP/+B//AxV9OqqCngeQ1Ei12220220A2wa32Wyi3W7jwPE6pk7Ol4DunmMxPvgNcO2VLXDX6/VKBoEK2ul00Gq1sHPnzsLAENitr68Xxp9GQUEvgxsFsqRarVY4fnV6CuYcrLpxp2Gt1+tFGSHnStB0u38Nv57+CTJsO6w38TI+N/Vl7KkdKgEmtpHtYn8mJyfRarVKwSWNnRpHDeI0qHPH7I4N2Da43W63BNLp8Gns1ZkywOHvDpSSJMHEnvpAwLN1D3D0T+q4d20FS9PbYJ9AA9gGRAx8du3aVQCdubk5LC8vY2VlpRgv7wtBmAZq2m8N3AgWPDgAUAQIClAV7BGwUpZZD2WFjrjRaGDHjh1otVrodDpFkE7go3LGcUvTtAhY2+128UkHu7i4WPSZbeUfZYRtYh894Oe4ra2tFc7VgzzKOHnHMhVEKNAhANXntU7yUIMetoVBiwbZWj7r1fJ7vV4BvHu9HtbW1kogiOPFtrEfOkYaLPIax1UBmtqOzc1NbGxsFGPG/pDfLIuyokGL2ydNnrAuB5l+H/tOOVEiYFd7SUBJwE19S5KkkDPylwkg1qU6TpnTPhNIKYCkDhKAkhRk53mObrdbshsASgEY+0/+U0dpZ1X2VK+TJClkijrCYI+BdxRFhd0j33Wc1Q+wrl6vV/CXvoP6xrKBrcAiSRK0Wq2i7xwrglO2U4NCT0SpzdWxV/1m0oYBlwevmuhR+8RP7ScTBB4wUIeZTNREAtvC8dHkQKPRKNqnvs39NceI+IA2kqS2Q22V2kyOGeVF7T39FeWE9+p9vJeyxbHUpGq/3y/ax3JbrRZarVahS5p0Y5JFZZvjx3JVx9k28lXbq+NK21Ov10t2EwCmpqYGgnz+Rt2OoggbGxsFDzjG5AftKtvtCdWKPhlVQc8DSFTyHTt2YHx8HM1ms3CeNISdndFAwAMAcQI89uUYc7fqWJrZDi4AlAxZu91Gp9PB1NRUARAJPqi0Cq5onGn4SQ60NPutv/EZBVf8v2i7ZU0VUOk9ahQWN+fx69lywAMAGTK8tPgbfKnzTXSi8dLsgAYZ6pTq9To6nQ4mJiZKWULN4mvQpsGP9kWzj+yPZsuYdSraKkBFHZpmwlk3gRGdGADsPZoMyMG2PEQ4eKKJezeXijIUoDMjRnBLZ54kCTY2NoqMNZ9VmWAgotlN9lfHks6VfHaAyPs8806e8jpnPskDd1AEsHQkeb41W0VnqPVqZp7OjuPU7/exurpaZOEItNh2BYgOFAEUmVbVC7ZZwZPKD3/TQDCUEFA98xkhAlQGIARFa2trA3qmOuCZZgUs3W63SIpo0oGZSe2/thNAqQ7+RjnzIIt81dkDDTCYlaYNTNO0FJB51lXHhONcr9eL2Ugdb7aN49Xtdotsrespy+RsAknHkt+p62oPFHTxGgNJ9l2Boo4HfyPQ1fu1T+S9yiB5qNl5XtcMu/bFEzeqY7RlKqsOiDmOIR5xPNweKfDXAE37QTvD+0P6ocE1bSj9htoitenqW0Jjpb5N26g2izzi7wxEWJcGFLQTbv9J7CPlnTY2SRK02+2Sn9b2KT80IFLd0HFVf+SBnNo7tbsaUFCPdKZfZ5HZbg02hz2rSSi3AXyGSRCdtVKd0RkZ8pOBG30bx0NxDXWWAQnlQgNTlSm141qu2xjKKMeK13Smn/rqgWFFn5yqoOcBpF6vVwQinPJ0gDP1SH8E0AUOHK9hZbZfWp5B5aZicsao3W5jfHy8APgEjgquNCNH0mse9DjwdwesxkAdpoM8Glj9Te+5uvHuQMBT9BcZbm5+gKfqZ0pZYXWybJvOHHHWo1arFSBLQYb+adZzWGZQ+8f/3Rj6dw1w6Ih1uYkCgeZY2Tk7tSbiAedOHtL5bW5uIkmSAnzFcVzMjuizBNJsr2Ywta3aT5U9J/Ke97D/HG/2UUFxmqZFIKx16AwDnacuwfKxc6CkDozPMRuvQIf1DdMFnYXgdY6l992Bos84jJIRBXx8lsA+juNiKZ/X53xXYEGeMMDjbJLKjIIezW4qyNLxU/ugS280wHeQRUCiANkBLeXNgSPbqPaIbeY4hOSAMqOzP2qv9M+DbrVXvKa67/rvY6JA05NKGpyxbI6rBgb6XChbrAE1+a5lKql90MCQY6KzmSpXHjjprDLLJa9V1kMAUe2nluuzfFq+yo4CVJ3ppK3TsWM5DNTV32hgo/czsaB6rLKkgYLyU2VBv3Pc9B7yUO0t5RhAETjqGKoc6Ngpr8gHLlUMjT3vo9/heLgMa+DiPk/L5G/Oe2037YMugfa6mNRS+aUs6RiqToVmsfk873Md0raRlyG/pzaTdsZ/80SyztwpP1VuK/p0VAU9DyCtrq4WypNlWQm48VrczEeWUe9sGzx1HGpImQWmEq6urpZmN5gh12UOQNlwOmhTQ0YQpsCI7XFnzra5EWbZvvSD19fT1ZF82MjWCqDO59SwEdguLi4WMzpc5kcArdPf7B+NrK5F18yWOzP2UcGI8k6Ns2bXaPjzPC8tnVDQ21sbyQJsLGelJS2slxk+gqg8z3H//v3CeayurhZT+coHjpMbdgfx6ggYVCi/dOkMSWejOG6UEV2LrzzlfZSPubm5or/r6+uFPHuQq4Cassp2Ly0tlcZJZZ3LbTguKrcakGoQx/v5TJZlRb0626ikSyHZTl7XtnL82A7yUOtTh63ZRpL+r6CP5QLbS7xCWU4FsiyLine truncated
|
||||
"text/plain": [
|
||||
"<Figure size 1920x1440 with 2 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# 1. Create the figure and axes\n",
|
||||
"fig, axs = plt.subplots(2, 1, dpi=300)\n",
|
||||
"ax1, ax2 = axs\n",
|
||||
"\n",
|
||||
"norm = colors.Normalize(vmin=vmin, vmax=vmax, clip=True)\n",
|
||||
"cmap = colormaps['PiYG']\n",
|
||||
"sm = plt.cm.ScalarMappable(cmap=cmap, norm=norm)\n",
|
||||
"sm.set_array([])\n",
|
||||
"\n",
|
||||
"# Keep the original 1:1 aspect ratio for the image\n",
|
||||
"ax1.imshow(image, cmap=\"gray\", alpha=.7)\n",
|
||||
"ax1.axis('off')\n",
|
||||
"\n",
|
||||
"for i, j, d in dumbbells:\n",
|
||||
" i, j = int(i), int(j)\n",
|
||||
" p, q = atoms_xy[i], atoms_xy[j]\n",
|
||||
" ax1.plot([p[0], q[0]], [p[1], q[1]], 'o-', linewidth=.5, markersize=1, color=cmap(norm(d)))\n",
|
||||
"\n",
|
||||
"# Plot the histogram\n",
|
||||
"ax2.hist(dumbbell_distances, bins=50, color='#bbb')\n",
|
||||
"ax2.axvline(Si_distance_px, color='k', linewidth=1)\n",
|
||||
"ax2.set_xlim(vmin, vmax)\n",
|
||||
"# Turn off the histogram's x-axis ticks/labels since the colorbar replaces it\n",
|
||||
"ax2.tick_params(axis='x', which='both', bottom=False, labelbottom=False)\n",
|
||||
"\n",
|
||||
"# 2. Force layout geometry matching\n",
|
||||
"plt.tight_layout() # Initial pass to establish image bounds based on 1:1 aspect\n",
|
||||
"fig.canvas.draw() # Evaluate positions\n",
|
||||
"\n",
|
||||
"# Get the physical layout position of the image channel\n",
|
||||
"pos1 = ax1.get_position()\n",
|
||||
"pos2 = ax2.get_position()\n",
|
||||
"\n",
|
||||
"# Adjust the histogram height here (e.g., matching 60% of its original height)\n",
|
||||
"new_hist_height = pos2.height * 0.5\n",
|
||||
"\n",
|
||||
"# Update ax2 to match ax1's horizontal span exactly, with your custom height\n",
|
||||
"ax2.set_position([pos1.x0, pos2.y0 + (pos2.height - new_hist_height), pos1.width, new_hist_height])\n",
|
||||
"\n",
|
||||
"# 3. Add the colorbar exactly flush beneath the modified histogram\n",
|
||||
"# [left, bottom, width, height] relative to ax2\n",
|
||||
"cax = ax2.inset_axes([0, -0.1, 1, 0.1], transform=ax2.transAxes)\n",
|
||||
"cbar = fig.colorbar(sm, cax=cax, orientation='horizontal')\n",
|
||||
"cbar.set_ticks(cbar.get_ticks()) # type: ignore\n",
|
||||
"cbar.set_ticklabels(np.round(A_per_px * cbar.get_ticks(), 2))\n",
|
||||
"cbar.ax.axvline(Si_distance_px, color='k', linewidth=1)\n",
|
||||
"cbar.ax.set_xlabel('Dumbbell distance [Å]')\n",
|
||||
"cbar.ax.set_xlim(vmin, vmax)\n",
|
||||
"\n",
|
||||
"sbar_length_A = 10\n",
|
||||
"\n",
|
||||
"sbar_length_px = sbar_length_A // A_per_px\n",
|
||||
"\n",
|
||||
"scalebar = AnchoredSizeBar(\n",
|
||||
" ax1.transData,\n",
|
||||
" sbar_length_px, # Size of the scale bar in data units (pixels)\n",
|
||||
" f'{sbar_length_A} Å', # Text label\n",
|
||||
" loc='lower right', # Position (e.g., 'lower right', 'lower left')\n",
|
||||
" pad=1, # Padding inside the box\n",
|
||||
" color='white', # Color of the bar and text\n",
|
||||
" frameon=False, # Remove background box boundary\n",
|
||||
" size_vertical=sbar_length_px * 0.1, # Thickness of the scale bar line\n",
|
||||
" label_top=True,\n",
|
||||
" fontproperties={'weight': 'normal', 'size': 8} # Optional: fine-tune text style/size\n",
|
||||
")\n",
|
||||
"ax1.add_artist(scalebar)\n",
|
||||
"\n",
|
||||
"# scale_bar_A = 10\n",
|
||||
"# scale_bar_px = scale_bar_A // A_per_px\n",
|
||||
"\n",
|
||||
"# scale_bar_start_px = 30\n",
|
||||
"# scale_bar_x = [scale_bar_start_px, scale_bar_start_px+scale_bar_px]\n",
|
||||
"# scale_bar_y = [350] * 2\n",
|
||||
"# sbar = ax1.plot(scale_bar_x, scale_bar_y, color='black', linewidth=4)\n",
|
||||
"# sbar.text(scale_bar_start_px, 340, \"10 Å\", size=10)\n",
|
||||
"\n",
|
||||
"plt.show()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "9bc64079",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "lemon",
|
||||
"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.12.12"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 5
|
||||
}
|
||||
Reference in new issue
Block a user