You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

434 lines
217 KiB

10 months ago
  1. {
  2. "cells": [
  3. {
  4. "cell_type": "code",
  5. "execution_count": 1,
  6. "metadata": {},
  7. "outputs": [],
  8. "source": [
  9. "import pandas as pd\n",
  10. "from pathlib import Path\n",
  11. "import numpy as np\n",
  12. "\n",
  13. "dataDir = Path('/scratch/guenther/MCParticleData')\n",
  14. "file = 'bsphiphi500.h5'\n",
  15. "zReference = 8520.\n",
  16. "zMagnetParams = [5212.38, 406.609, -1102.35, -498.039]\n",
  17. "xParams = [18.6195, -5.55793]\n",
  18. "xLayers = [0,3,4,7,8,11]\n",
  19. "uvLayers = [1,2,5,6,9,10]\n",
  20. "\n",
  21. "with pd.HDFStore(dataDir/file, mode='r') as eventData:\n",
  22. " tmp = []\n",
  23. " # event loop\n",
  24. " for iEvent in range(0, 500):\n",
  25. " hits = eventData[str(iEvent)]\n",
  26. " tmp.append(hits.copy())\n",
  27. " allHits = pd.concat(tmp, ignore_index=True)"
  28. ]
  29. },
  30. {
  31. "cell_type": "markdown",
  32. "metadata": {
  33. "slideshow": {
  34. "slide_type": "slide"
  35. }
  36. },
  37. "source": [
  38. "# Hough Histogram Studies\n",
  39. "## Occupancy of the Detector\n",
  40. "* data contains all x hits of 500 events in the range [-3000,3000]mm\n",
  41. "* the first plot shows the coarse distribution of these hits along x\n",
  42. "* the occupancy is higher in the central region than at the edges as expected\n",
  43. "\n",
  44. "## Hough Histogram Binning\n",
  45. "* the idea is to adjust the histogram's bin width along x such that every bin contains the same number of hits on average\n",
  46. "* two approaches have been tested, one of which is shown below\n",
  47. "1. in a **first attempt**, I fitted the (right) flank of the occupancy distribution with a 5th order polynomial to describe the occupancy for most of the range\n",
  48. " - to find regions of equal content, i.e. the desired bins, the culumative distribution must be calculated from which the quantiles (i.e. 500 quantiles for 500 bins) can (in theory) be calculated by $x_{Q}=F^{-1}(p)$ where $p$ is the \"probability\" given by $i_{bin}/N_{Bins}$\n",
  49. " - for polynomials of order higher than 3 this is, however, not analytically doable\n",
  50. " - other functions might be possible, but since there is an easier approach, I didn't look further into this\n",
  51. "2. the **second approach** numerically calculates the quantiles for the full occupancy distribution using `pandas.qcut` function\n",
  52. " - this function directly gives the bin edges containing an equal amount of x hits\n",
  53. " - the bin edges are then enumerated and this enumeration is plotted against the edges, which is shown for different number of bins below\n",
  54. " - the resulting distribution is fitted with $f(x)=p_0+\\frac{p_1\\cdot x}{1+|p_2\\cdot x|}$, which is chosen because it's computionally faster than e.g. a Sigmoid\n",
  55. " - the fitted function gives a direct mapping $x\\to i_{Bin}$ when downcasted to integer values\n",
  56. " - the resulting minimal and maximal width of the bins is shown in the table and the last plot below for different total numbers of bins\n",
  57. " - 1000 bins have minimal bin width of 1.625mm which is of the order of the Hough Projection's resolution for high momentum tracks\n",
  58. " - the parameters for this scenario are $p_0=505.675291$, $p_1=0.453316164$ and $p_2=5.57027462\\times 10^{-4}$\n",
  59. " - to avoid negative bin numbers arising from the imperfection of the parametrisation, the parameter $p_0$ can be shifted by +2.5 for 1000 bins\n",
  60. " - also because of the imperfection of the parametrisation, the real number of bins later on will be slightly higher, which is also shown in the table\n",
  61. " - the inverse. i.e. the mapping $i_{bin}\\to x$ is $x=\\frac{p_0-i_{Bin}}{p_0\\cdot p_2-p_1-p_2\\cdot i_{Bin}}$ for $i<p_0$ and $x=\\frac{p_0+i_{Bin}}{p_0\\cdot p_2+p_1-p_2\\cdot i_{Bin}}$ else"
  62. ]
  63. },
  64. {
  65. "cell_type": "code",
  66. "execution_count": 5,
  67. "metadata": {
  68. "slideshow": {
  69. "slide_type": "slide"
  70. }
  71. },
  72. "outputs": [
  73. {
  74. "name": "stdout",
  75. "output_type": "stream",
  76. "text": [
  77. "BINS=600\n",
  78. "shift=1.1\n",
  79. "[ 3.03414161e+02 2.71945159e-01 -5.56801117e-04]\n",
  80. "at -3000 = 0\n",
  81. "at 3000 = 610\n",
  82. "at -3000 = -0.9960452190164233\n",
  83. "at 3000 = 610.0243669660781\n",
  84. "\n",
  85. "BINS=700\n",
  86. "shift=1.5\n",
  87. "[ 3.53980141e+02 3.17291325e-01 -5.56893995e-04]\n",
  88. "at -3000 = 0\n",
  89. "at 3000 = 711\n",
  90. "at -3000 = -0.9359283090630584\n",
  91. "at 3000 = 711.8962100461829\n",
  92. "\n",
  93. "BINS=800\n",
  94. "shift=1.8\n",
  95. "[ 4.04541076e+02 3.62631197e-01 -5.56941658e-04]\n",
  96. "at -3000 = 0\n",
  97. "at 3000 = 813\n",
  98. "at -3000 = -0.9838529169481944\n",
  99. "at 3000 = 813.6660040895719\n",
  100. "\n",
  101. "BINS=900\n",
  102. "shift=2.2\n",
  103. "[4.55109246e+02 4.07977502e-01 5.56998216e-04]\n",
  104. "at -3000 = 0\n",
  105. "at 3000 = 915\n",
  106. "at -3000 = -0.9217380096175134\n",
  107. "at 3000 = 915.5402300772885\n",
  108. "\n",
  109. "BINS=1000\n",
  110. "shift=5.5\n",
  111. "[5.05675291e+02 4.53316164e-01 5.57027462e-04]\n",
  112. "at -3000 = 2\n",
  113. "at 3000 = 1020\n",
  114. "at -3000 = 2.037684447748063\n",
  115. "at 3000 = 1020.3128978501425\n",
  116. "\n",
  117. "BINS=1100\n",
  118. "shift=4.9\n",
  119. "[5.56237804e+02 4.98644231e-01 5.57020439e-04]\n",
  120. "at -3000 = 1\n",
  121. "at 3000 = 1121\n",
  122. "at -3000 = 1.0860058517370135\n",
  123. "at 3000 = 1121.1896027202529\n",
  124. "\n",
  125. "BINS=1200\n",
  126. "shift=3.2\n",
  127. "[6.06805431e+02 5.43977948e-01 5.57024839e-04]\n",
  128. "at -3000 = 0\n",
  129. "at 3000 = 1220\n",
  130. "at -3000 = -0.95986992994915\n",
  131. "at 3000 = 1220.9707309946493\n",
  132. "\n",
  133. "BINS=1300\n",
  134. "shift=3.6\n",
  135. "[ 6.57370222e+02 5.89309937e-01 -5.57035442e-04]\n",
  136. "at -3000 = 0\n",
  137. "at 3000 = 1322\n",
  138. "at -3000 = -0.9015253398330287\n",
  139. "at 3000 = 1322.841969580662\n",
  140. "\n",
  141. "BINS=1400\n",
  142. "shift=3.9\n",
  143. "[7.07935490e+02 6.34651601e-01 5.57051233e-04]\n",
  144. "at -3000 = 0\n",
  145. "at 3000 = 1424\n",
  146. "at -3000 = -0.9482046457474098\n",
  147. "at 3000 = 1424.6191845963053\n",
  148. "\n",
  149. "BINS=1500\n",
  150. "shift=4.2\n",
  151. "[ 7.58500798e+02 6.80003618e-01 -5.57081680e-04]\n",
  152. "at -3000 = 0\n",
  153. "at 3000 = 1526\n",
  154. "at -3000 = -0.992094855437017\n",
  155. "at 3000 = 1526.3936918183863\n",
  156. "\n"
  157. ]
  158. },
  159. {
  160. "data": {
  161. "text/html": [
  162. "<div>\n",
  163. "<style scoped>\n",
  164. " .dataframe tbody tr th:only-of-type {\n",
  165. " vertical-align: middle;\n",
  166. " }\n",
  167. "\n",
  168. " .dataframe tbody tr th {\n",
  169. " vertical-align: top;\n",
  170. " }\n",
  171. "\n",
  172. " .dataframe thead th {\n",
  173. " text-align: right;\n",
  174. " }\n",
  175. "</style>\n",
  176. "<table border=\"1\" class=\"dataframe\">\n",
  177. " <thead>\n",
  178. " <tr style=\"text-align: right;\">\n",
  179. " <th></th>\n",
  180. " <th>NBINS</th>\n",
  181. " <th>nBinsReal</th>\n",
  182. " <th>minBinWidth</th>\n",
  183. " <th>maxBinWidth</th>\n",
  184. " </tr>\n",
  185. " </thead>\n",
  186. " <tbody>\n",
  187. " <tr>\n",
  188. " <th>0</th>\n",
  189. " <td>600</td>\n",
  190. " <td>610</td>\n",
  191. " <td>2.750</td>\n",
  192. " <td>72.399902</td>\n",
  193. " </tr>\n",
  194. " <tr>\n",
  195. " <th>1</th>\n",
  196. " <td>700</td>\n",
  197. " <td>712</td>\n",
  198. " <td>2.375</td>\n",
  199. " <td>61.944386</td>\n",
  200. " </tr>\n",
  201. " <tr>\n",
  202. " <th>2</th>\n",
  203. " <td>800</td>\n",
  204. " <td>813</td>\n",
  205. " <td>2.000</td>\n",
  206. " <td>54.544922</td>\n",
  207. " </tr>\n",
  208. " <tr>\n",
  209. " <th>3</th>\n",
  210. " <td>900</td>\n",
  211. " <td>916</td>\n",
  212. " <td>1.750</td>\n",
  213. " <td>49.346866</td>\n",
  214. " </tr>\n",
  215. " <tr>\n",
  216. " <th>4</th>\n",
  217. " <td>1000</td>\n",
  218. " <td>1017</td>\n",
  219. " <td>1.625</td>\n",
  220. " <td>44.815297</td>\n",
  221. " </tr>\n",
  222. " <tr>\n",
  223. " <th>5</th>\n",
  224. " <td>1100</td>\n",
  225. " <td>1119</td>\n",
  226. " <td>1.375</td>\n",
  227. " <td>40.286656</td>\n",
  228. " </tr>\n",
  229. " <tr>\n",
  230. " <th>6</th>\n",
  231. " <td>1200</td>\n",
  232. " <td>1221</td>\n",
  233. " <td>1.375</td>\n",
  234. " <td>36.824951</td>\n",
  235. " </tr>\n",
  236. " <tr>\n",
  237. " <th>7</th>\n",
  238. " <td>1300</td>\n",
  239. " <td>1323</td>\n",
  240. " <td>1.250</td>\n",
  241. " <td>34.324951</td>\n",
  242. " </tr>\n",
  243. " <tr>\n",
  244. " <th>8</th>\n",
  245. " <td>1400</td>\n",
  246. " <td>1424</td>\n",
  247. " <td>1.125</td>\n",
  248. " <td>31.924148</td>\n",
  249. " </tr>\n",
  250. " <tr>\n",
  251. " <th>9</th>\n",
  252. " <td>1500</td>\n",
  253. " <td>1527</td>\n",
  254. " <td>1.000</td>\n",
  255. " <td>30.625244</td>\n",
  256. " </tr>\n",
  257. " </tbody>\n",
  258. "</table>\n",
  259. "</div>"
  260. ],
  261. "text/plain": [
  262. " NBINS nBinsReal minBinWidth maxBinWidth\n",
  263. "0 600 610 2.750 72.399902\n",
  264. "1 700 712 2.375 61.944386\n",
  265. "2 800 813 2.000 54.544922\n",
  266. "3 900 916 1.750 49.346866\n",
  267. "4 1000 1017 1.625 44.815297\n",
  268. "5 1100 1119 1.375 40.286656\n",
  269. "6 1200 1221 1.375 36.824951\n",
  270. "7 1300 1323 1.250 34.324951\n",
  271. "8 1400 1424 1.125 31.924148\n",
  272. "9 1500 1527 1.000 30.625244"
  273. ]
  274. },
  275. "execution_count": 5,
  276. "metadata": {},
  277. "output_type": "execute_result"
  278. },
  279. {
  280. "data": {
  281. "image/png": "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
  282. "text/plain": [
  283. "<Figure size 864x720 with 1 Axes>"
  284. ]
  285. },
  286. "metadata": {
  287. "needs_background": "light"
  288. },
  289. "output_type": "display_data"
  290. },
  291. {
  292. "data": {
  293. "image/png": "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
  294. "text/plain": [
  295. "<Figure size 1728x720 with 10 Axes>"
  296. ]
  297. },
  298. "metadata": {
  299. "needs_background": "light"
  300. },
  301. "output_type": "display_data"
  302. },
  303. {
  304. "data": {
  305. "image/png": "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
  306. "text/plain": [
  307. "<Figure size 432x288 with 1 Axes>"
  308. ]
  309. },
  310. "metadata": {
  311. "needs_background": "light"
  312. },
  313. "output_type": "display_data"
  314. }
  315. ],
  316. "source": [
  317. "from scipy.optimize import curve_fit\n",
  318. "import matplotlib.pyplot as plt\n",
  319. "\n",
  320. "\n",
  321. "data = allHits.loc[(allHits['pc'].isin(xLayers)) & (allHits['x']<=3200) & (allHits['x']>=-3200)]['x']\n",
  322. "\n",
  323. "urax = data.plot.hist(bins=25, title='Integrated SciFi Hit Distribution (X Layers)', figsize=(12,10), fontsize=20, edgecolor='black')\n",
  324. "urax.set_xlabel('x [mm]', fontsize=24)\n",
  325. "urax.set_ylabel('Count', fontsize=24)\n",
  326. "urax.title.set_size(24)\n",
  327. "#out_0,equal_bins_0 = pd.qcut(data, q=25, retbins=True)\n",
  328. "#urax0 = data.plot.hist(bins=equal_bins_0, title='Integrated SciFi Hit Distribution (X Layers)', figsize=(12,10), fontsize=20, edgecolor='black')\n",
  329. "#urax0.set_xlabel('x [mm]', fontsize=24)\n",
  330. "#urax0.set_ylabel('Count', fontsize=24)\n",
  331. "#urax0.title.set_size(24)\n",
  332. "def fit3(x, p0, p1, p2, p3, p4, p5, p6, p7):\n",
  333. " return p0 + p1 * x + p2 * x**2 + p3 * x**3 + p4 * x**4 + p5 * x**5 + p6 * x**6 + p7 * x**7\n",
  334. "\n",
  335. "def fitFastSigmoid(x, p0, p1, p2 ):\n",
  336. " return p0 + p1 * x / (1 + abs(x * p2) ) \n",
  337. "\n",
  338. "def FastSigmoidInverse(y, p0, p1, p2):\n",
  339. " return (y - p0) / (p0 * p2 + p1 - p2 * y)#(p0 - y) / (p0 * p2 - p1 - p2 * y)\n",
  340. "\n",
  341. "NBINS=[600, 700, 800, 900, 1000, 1100, 1200, 1300, 1400, 1500]\n",
  342. "SHIFTS = [1.1, 1.5, 1.8, 2.2, 5.5, 4.9, 3.2, 3.6, 3.9, 4.2]\n",
  343. "minBinWidths = []\n",
  344. "maxBinWidths = []\n",
  345. "nBinsReal = []\n",
  346. "fig, axes = plt.subplots(nrows=2, ncols=5, figsize=(24, 10))\n",
  347. "for i, BINS in enumerate(NBINS):\n",
  348. " out,equal_bins = pd.qcut(data, q=BINS, retbins=True)\n",
  349. " binWidths = np.array([ abs(equal_bins[i] - equal_bins[i+1]) for i in range(len(equal_bins)-1)])\n",
  350. " minBinWidths.append( binWidths.min() )\n",
  351. " maxBinWidths.append( binWidths.max() )\n",
  352. " #equal_bincenters = np.array([0.5 * ( equal_bins[i] + equal_bins[i+1] ) for i in range(len(equal_bins)-1)] ) \n",
  353. " popt, pcov = curve_fit( fitFastSigmoid, xdata=equal_bins[:-1], ydata=np.arange(0, BINS) )\n",
  354. " if i<5:\n",
  355. " axes[0,i].plot(equal_bins[:-1], np.arange(0, BINS), '.', label='data')\n",
  356. " axes[0,i].plot(equal_bins[:-1], fitFastSigmoid(equal_bins[:-1], *popt), label=f'p0={popt[0]}\\np1={popt[1]}\\np2={popt[2]}\\n')\n",
  357. " axes[0,i].legend()\n",
  358. " else:\n",
  359. " axes[1,i-5].plot(equal_bins[:-1], np.arange(0, BINS), '.', label='data')\n",
  360. " axes[1,i-5].plot(equal_bins[:-1], fitFastSigmoid(equal_bins[:-1], *popt), label=f'p0={popt[0]}\\np1={popt[1]}\\np2={popt[2]}\\n')\n",
  361. " axes[1,i-5].legend()\n",
  362. " nBinsReal.append(abs(int(fitFastSigmoid(-3000, popt[0], popt[1], popt[2])) - int(fitFastSigmoid(3000, popt[0], popt[1], popt[2]))))\n",
  363. " ###############33\n",
  364. " # SHIFT A BIT UPWARDS TO AVOID NEGATIVE INDICES p0+2.5\n",
  365. " ################################3#\n",
  366. " shift = SHIFTS[i]\n",
  367. " print(f'BINS={BINS}')\n",
  368. " print(f'shift={shift}')\n",
  369. " print(popt)\n",
  370. " print(f'at -3000 = {int(fitFastSigmoid(-3000., popt[0]+shift, popt[1], popt[2]))}')\n",
  371. " print(f'at 3000 = {int(fitFastSigmoid(3000., popt[0]+shift, popt[1], popt[2]))}')\n",
  372. " print(f'at -3000 = {fitFastSigmoid(-3000., popt[0]+shift, popt[1], popt[2])}')\n",
  373. " print(f'at 3000 = {fitFastSigmoid(3000., popt[0]+shift, popt[1], popt[2])}')\n",
  374. " #print(f'inv at 0 = {FastSigmoidInverse(506, popt[0]+shift, popt[1], popt[2])}')\n",
  375. " #print(f'inv at 1016 = {FastSigmoidInverse(1016, popt[0]+shift, popt[1], popt[2])}')\n",
  376. " print()\n",
  377. "binData = pd.DataFrame({'NBINS':NBINS, 'nBinsReal': nBinsReal,'minBinWidth':minBinWidths, 'maxBinWidth':maxBinWidths})\n",
  378. "ax = binData.plot(x='NBINS', y=['minBinWidth', 'maxBinWidth'], logy=True)\n",
  379. "binData\n",
  380. "#out,equal_bins = pd.qcut(data, q=1000, retbins=True)\n",
  381. "#fig, axis = plt.subplots(figsize=(12,10))\n",
  382. "#axis.set_title('Mapping Bin Number to x Position', fontsize=24)\n",
  383. "#axis.plot(equal_bins[:-1], np.arange(0,1000), '.' )\n",
  384. "#axis.set_xlabel('x [mm]', fontsize=24)\n",
  385. "#axis.set_ylabel('Bin Number', fontsize=24)\n",
  386. "#axis.tick_params(axis='both', which='major', labelsize=20)\n",
  387. "#axis.tick_params(axis='both', which='minor', labelsize=16)\n",
  388. "#popt, pcov = curve_fit( fitFastSigmoid, xdata=equal_bins[:-1], ydata=np.arange(0, 1000) )\n",
  389. "#axis.plot(equal_bins[:-1], fitFastSigmoid(equal_bins[:-1], *popt), label=f'p0={popt[0]}\\np1={popt[1]}\\np2={popt[2]}\\n', color='red', markersize=24)\n",
  390. "#axis.legend(fontsize=20)"
  391. ]
  392. },
  393. {
  394. "cell_type": "code",
  395. "execution_count": null,
  396. "metadata": {},
  397. "outputs": [],
  398. "source": []
  399. },
  400. {
  401. "cell_type": "code",
  402. "execution_count": null,
  403. "metadata": {},
  404. "outputs": [],
  405. "source": []
  406. }
  407. ],
  408. "metadata": {
  409. "kernelspec": {
  410. "display_name": "Python 3.10.6 (conda)",
  411. "language": "python",
  412. "name": "python3"
  413. },
  414. "language_info": {
  415. "codemirror_mode": {
  416. "name": "ipython",
  417. "version": 3
  418. },
  419. "file_extension": ".py",
  420. "mimetype": "text/x-python",
  421. "name": "python",
  422. "nbconvert_exporter": "python",
  423. "pygments_lexer": "ipython3",
  424. "version": "3.10.6"
  425. },
  426. "vscode": {
  427. "interpreter": {
  428. "hash": "a2eff8b4da8b8eebf5ee2e5f811f31a557e0a202b4d2f04f849b065340a6eda6"
  429. }
  430. }
  431. },
  432. "nbformat": 4,
  433. "nbformat_minor": 4
  434. }