From c14285f8a78e8df7436424bedd5976a29f8a1088 Mon Sep 17 00:00:00 2001 From: Nicholas Kamp <43788191+nickkamp1@users.noreply.github.com> Date: Tue, 9 Jan 2024 18:40:54 -0500 Subject: [PATCH] Feature/dark news table (#37) * reorganizing examples and earthparams files * starting to add fill interpolation method * Flush out fill table methods for LIDarkNews * Minor cleanup --- python/LIDarkNews.py | 112 +++++++--- resources/Examples/Example1/DIS_IceCube.py | 66 ++++++ .../Examples/Example2/DipolePortal_MINERvA.py | 82 ++++++++ .../Example2/DipolePortal_MiniBooNE.py | 37 +--- .../Examples/Example2/VisualizeOutput.ipynb | 192 ++++++++++++++++++ resources/earthparams/densities/CCM.dat | 47 ----- resources/earthparams/densities/MINERvA.dat | 56 +---- resources/earthparams/densities/MiniBooNE.dat | 46 ----- .../earthparams/densities/PREM_IceCube.dat | 19 ++ .../densities/{ => legacy}/PREM.dat | 0 .../densities/{ => legacy}/PREM_mmc.dat | 0 .../densities/{ => legacy}/mmc.dat | 0 resources/earthparams/materials/IceCube.dat | 24 +++ 13 files changed, 479 insertions(+), 202 deletions(-) create mode 100644 resources/Examples/Example1/DIS_IceCube.py create mode 100644 resources/Examples/Example2/DipolePortal_MINERvA.py create mode 100644 resources/Examples/Example2/VisualizeOutput.ipynb create mode 100644 resources/earthparams/densities/PREM_IceCube.dat rename resources/earthparams/densities/{ => legacy}/PREM.dat (100%) rename resources/earthparams/densities/{ => legacy}/PREM_mmc.dat (100%) rename resources/earthparams/densities/{ => legacy}/mmc.dat (100%) create mode 100644 resources/earthparams/materials/IceCube.dat diff --git a/python/LIDarkNews.py b/python/LIDarkNews.py index 7f1c58f9..4a4f4ac8 100644 --- a/python/LIDarkNews.py +++ b/python/LIDarkNews.py @@ -97,9 +97,16 @@ def __init__(self, self.decays.append(PyDarkNewsDecay(dec_case, table_dir = self.table_dir + table_subdirs)) - def SaveCrossSectionTables(self): + def SaveCrossSectionTables(self,fill_tables_at_exit=True): + if not fill_tables_at_exit: + print('WARNING: Saving tables without filling PyDarkNewsCrossSection interpolation tables. Future updates to DarkNews can lead to inconsistent behavior if new entries are ever added to this table') for cross_section in self.cross_sections: + if fill_tables_at_exit: + print('Filling cross section table at %s'%cross_section.table_dir) + num = cross_section.FillInterpolationTables() + print('Added %d points'%num) cross_section.SaveInterpolationTables() + @@ -112,7 +119,7 @@ def __init__(self, table_dir=None, # table to store tolerance=1e-6, # supposed to represent machine epsilon interp_tolerance=5e-2, # relative interpolation tolerance - interpolate_differential = False): + interpolate_differential=False): DarkNewsCrossSection.__init__(self) # C++ constructor @@ -170,23 +177,22 @@ def _redefine_interpolation_objects(self,total=False,diff=False): # If we only have two energy points, don't try to construct interpolator if len(np.unique(self.differential_cross_section_table[:,0])) <= 2: return self.differential_cross_section_interpolator = CloughTocher2DInterpolator(self.differential_cross_section_table[:,:2], - self.differential_cross_section_table[:,2], - rescale=True) + self.differential_cross_section_table[:,2], + rescale=True) # Check whether we have close-enough entries in the intrepolation tables - def _query_interpolation_table(self,inputs,mode): - # - # returns: - # 0 if we are not close enough to any points in the interpolation table - # otherwise, returns the desired interpolated value - + def _interpolation_flags(self,inputs,mode): + # + # returns UseSinglePoint,Interpolate,closest_idx + # UseSinglePoint: whether to use a single point in table + # Interpolate: whether to interpolate bewteen different points + # closest_idx: index of closest point in table (for UseSinglePoint) + # Determine which table we are using if mode=='total': interp_table = self.total_cross_section_table - interpolator = self.total_cross_section_interpolator elif mode=='differential': interp_table = self.differential_cross_section_table - interpolator = self.differential_cross_section_interpolator else: print('Invalid interpolation table mode %s'%mode) exit(0) @@ -197,20 +203,15 @@ def _query_interpolation_table(self,inputs,mode): # bools to keep track of whether to use a single point or interpolate UseSinglePoint = True Interpolate = True - prev_closest_idx = None + # First check whether we have a close-enough single point + closest_idx = np.argmin(np.sum(np.abs(interp_table[:,:-1] - inputs))) + diff = (interp_table[closest_idx,:-1] - inputs)/inputs + if np.all(np.abs(diff)= self.tolerance: - # We are not close enough to use one existing table point - UseSinglePoint = False - elif UseSinglePoint: - # Check whether the closest_idx found here is the same as the previous - if i>0 and closest_idx != prev_closest_idx: - UseSinglePoint = False - prev_closest_idx = closest_idx - # Now check if we are close enough to interpolate + # Check if we are close enough to interpolate if np.abs(diff) >= self.interp_tolerance: Interpolate = False else: @@ -239,6 +240,28 @@ def _query_interpolation_table(self,inputs,mode): # check if the node above is also within the interpolation tolerance if diff_above>=self.interp_tolerance: Interpolate = False + return UseSinglePoint, Interpolate, closest_idx + + # return entries in interpolation table if we have inputs + def _query_interpolation_table(self,inputs,mode): + # + # returns: + # 0 if we are not close enough to any points in the interpolation table + # otherwise, returns the desired interpolated value + + # Determine which table we are using + if mode=='total': + interp_table = self.total_cross_section_table + interpolator = self.total_cross_section_interpolator + elif mode=='differential': + interp_table = self.differential_cross_section_table + interpolator = self.differential_cross_section_interpolator + else: + print('Invalid interpolation table mode %s'%mode) + exit(0) + + UseSinglePoint, Interpolate, closest_idx = self._interpolation_flags(inputs,mode) + if UseSinglePoint: return interp_table[closest_idx,-1] elif Interpolate: @@ -246,6 +269,49 @@ def _query_interpolation_table(self,inputs,mode): else: return 0 + # Fills the total and differential cross section tables within interp_tolerance + def FillInterpolationTables(self,total=True,diff=True): + Emin = (1.0+self.tolerance)*self.ups_case.Ethreshold + Emax = np.max(self.total_cross_section_table[:,0]) + num_added_points = 0 + if total: + E = Emin + while E" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "162.66083680289623\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAigAAAGiCAYAAADNzj2mAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAknklEQVR4nO3dCZhU1YEv8MO+yaIoiwaQuGJciGAQMRklGDKuGKNxokYzjCYjYoBJVOKCGgQkLgwKGo0KGg3GTHAUDYooOkbcwzw0ihpccAHMKKAge73vnPeqp7ttg0h1c7r79/u+a3XdulV1OHXt+ve5Z2lQKBQKAQAgIw23dgEAACoTUACA7AgoAEB2BBQAIDsCCgCQHQEFAMiOgAIAZEdAAQCyI6AAANkRUACA2h9QHnvssXDUUUeFHXfcMTRo0CDcfffdFR6PM+dfdNFFoXPnzqFFixZhwIAB4dVXX61wzAcffBBOOumk0KZNm9CuXbswePDg8PHHH2/5vwYAqJ8BZeXKlWG//fYLkyZNqvLx8ePHh4kTJ4brr78+PPXUU6FVq1Zh4MCBYfXq1WXHxHDy4osvhlmzZoUZM2ak0HPGGWds2b8EAKgzGmzJYoGxBWX69Olh0KBB6X58qdiy8m//9m/hpz/9adq3fPny0LFjxzBlypRw4oknhpdeeinstdde4Zlnngm9e/dOx8ycOTMcfvjh4e23307PBwDqt8alfLHXX389LF68OF3WKWrbtm3o06dPmDt3bgoo8TZe1imGkyge37Bhw9Ticuyxx37qddesWZO2oo0bN6bLRO3bt08hCQDIX2zI+Oijj1JjRPzer7GAEsNJFFtMyov3i4/F2w4dOlQsROPGYbvttis7prKxY8eGSy65pJRFBQC2kkWLFoUvfelLNRdQqsvIkSPDiBEjyu7Hy0Zdu3ZN/8DY0bbkHrtyk4f87S/bbPKY7X/8oxIViLrsxv9z4yaPOXbanzZ5zPZjppSoRNTlcylyPrG1rFixInTp0iW0bt16k8eWNKB06tQp3S5ZsiSN4imK93v27Fl2zNKlSys8b/369emSTfH5lTVr1ixtlcVwUi0BpVXzTR6ypkWLTR5TLWWjzmmxzabPpdbNmmzyGOcbn+dccj6Rg8/TPaOk86B07949hYzZs2dXSEuxb0nfvn3T/Xi7bNmy8Nxzz5Ud8/DDD6d+JbGvCgDAZregxPlKXnvttQodY+fNm5f6kMTLLsOGDQujR48Ou+22WwosF154YeoMUxzp06NHj/Dtb387nH766Wko8rp168JZZ52VOtAawQMAfKGA8uyzz4ZDDz207H6xb8ipp56ahhKfc845aa6UOK9JbCk5+OCD0zDi5s3/97LJ7bffnkLJN7/5zdSL97jjjktzpwAAfKGAcsghh6RhQn/vutKll16ats8SW1vuuOMOnwAAX0j8Hor9Fzds2KAGM9KoUaM0MrcUU4DUilE8AFC0du3a8N5774VVq1aplAy1bNkyDZRp2rTpFr2OgAJArREHVMS+j/Ev9dhvMX4JmrAzn1atGB7ff//99BnFvqibmozt7xFQAKg14hdgDClxLo34lzp5iYsEN2nSJLz55pvpsyrf/3RzlXSYMQDUhC35y5za8dn4hAGA7AgoAEB29EEBoE64etYrNfZeww/bvcbeq77SggIAZEdAAQCyI6AAQA2IM7GfffbZaUmYOKN6XFz34osvTo+98cYbaT6XuLZd0bJly9K+OXPm1MvPR0ABgBoyderU0KpVq/DUU0+F8ePHp2VhZs2apf6roJMsANSQfffdN4waNSr9HGdavfbaa8Ps2bPTz1SkBQUAajCglBfXrFm6dKn6r4KAAgA1JE4DX17sYxKn7i/OvhrXsylat25dvf5cBBQA2Mp22GGHdBtXaS6aV67DbH2kDwoAZLDI3oEHHhjGjRsXunfvni77XHDBBaE+E1AAqBNq++yuN998cxg8eHDo1atX2GOPPdIon29961uhvhJQAKAGVDWfyd133132c48ePcITTzxR4fFCuT4p9Y0+KABAdgQUACA7AgoAkB0BBQDIjoACAGRHQAEAsiOgAADZEVAAgOwIKABAdswkC0Dd8MjYmnuvQ0fW3HvVU1pQAKAGnHbaaWHQoEFVToHfoEGDsGzZsrKfv/KVr4QNGzZUOK5du3ZhypQpZfd33nnnMGHChDr72QkoAJCZhQsXhltvvTXUZwIKAGRm6NChYdSoUWHNmjWhvhJQACAzw4YNC+vXrw/XXHNNqK90kgWAGjJjxoywzTbbVNhXua9J1LJly9SC8vOf/zycfvrpoW3btvXuM9KCAgA15NBDDw3z5s2rsP3617+u8tjBgweH9u3bh8svv7xefj5aUACghrRq1SrsuuuuFfa9/fbbVR7buHHjcNlll6XRP2eddVaob7SgAECmjj/++DTk+JJLLgn1jRYUAMjYuHHjwsCBA6t87J133kmXicrr1q1b2HbbbUNtJ6AAUDfU0dld+/fvn7YHH3zwU49dccUVaSvvtttuCyeffHKo7QQUAKgB5WeBLe+QQw4JhULhUz+X98ADD4TK3njjjVCX6YMCAGRHQAEAsiOgAADZEVAAgOwIKABAdgQUACA7AgoAkB0BBQDIjoACAGTHTLIA1AmT502usfc6s+eZNfZe9ZUWFACoIYsXLw4/+clPwq677hqaN28eOnbsGPr16xeuu+66sGrVKp9DOVpQAKAGLFy4MIWRdu3ahTFjxoR99tknNGvWLMyfPz/ccMMNYaeddgpHH320z+L/04ICADXgzDPPDI0bNw7PPvtsOOGEE0KPHj3Cl7/85XDMMceE++67Lxx11FHpuKuuuiqFl1atWoUuXbqk53388ccVFh2MIWfGjBlhjz32CC1btgzf/e53UwvM1KlTw8477xy23XbbcPbZZ4cNGzaUPS/uHz16dPjBD34Qttlmm9CtW7dwzz33hPfffz+VIe7bd999U/mK/ud//if80z/9UwpP8X1iuX7729/WyPkioABANYtf9A8++GAYMmRICh5VadCgwf/7Ym7YMEycODG8+OKLKXA8/PDD4ZxzzqlwbAwj8Zhp06aFmTNnhjlz5oRjjz023H///Wm77bbbwq9+9avw+9//vsLzrr766tSK8+c//zkcccQR4ZRTTkmB5eSTTw7PP/982GWXXdL94orKq1evDr169UoB6oUXXghnnHFGes7TTz8dqpuAAgDV7LXXXktf+rHFo7ztt98+tVzE7dxzz037hg0bFg499NDU4tG/f//U6vG73/2uwvPWrVuX+q189atfDd/4xjdSC8rjjz8ebrrpprDXXnuFI488Mr3GI488UuF5hx9+ePjRj34Udtttt3DRRReFFStWhAMOOCAcf/zxYffdd09leOmll8KSJUvS8bHl5Kc//Wno2bNnau0ZOnRo+Pa3v/2p8lQHfVAAYCuJLREbN24MJ510UlizZk3a99BDD4WxY8eGl19+OQWI9evXp5aM2GoSL7NE8Ta2dhTFzrYx0MSgU37f0qVLK7xfvIRT/vEoXrapvC8+r1OnTukSUewvEwPJO++8E9auXZvKWSxHddKCAgDVLI7aiZdwFixYUGF/bJWIj7Vo0SLdf+ONN1Lrx7777hv+4z/+Izz33HNh0qRJ6bEYDoqaNGlS4XXia1e1L4af8sofU7ykVNW+4vN++ctfhn//939PLSuxNWbevHlh4MCBFcpSXQQUAKhm7du3D4cddli49tprw8qVKz/zuBhIYji48sorw4EHHpguu7z77rtb7fP505/+lDrQxj4q++23XwpUr7zySo28t4ACADVg8uTJ6XJN7969w5133pn6esQWld/85jfpck6jRo1Sa0rsX3LNNdekYcmxs+v111+/1T6f2Fdl1qxZ4Yknnkjljf1Xiv1Tqps+KADUCbnP7hr7jMTRM7FPx8iRI8Pbb7+d5kGJnVpjR9Q4nDj27YjDjC+//PJ0TOwAG/ujxJE1W8MFF1yQglK8rBPLFkfxDBo0KCxfvrza37tBoTiWqBaJnYbatm2bKqhNmzalf4NHxm7ykPdfaL3JY3YYelaJCkR9n577+Nse3eQxO1x5Z4lKRF2f6r02n0+xs+jrr78eunfvnmZipXZ9Rpvz/e0SDwCQHQEFAMiOgAIA1P2AEid1ufDCC9O1pziuO3YK+sUvflE2bW4Uf44z2HXu3DkdM2DAgPDqq6+WuigAQC1V8oASex7H6XfjWO84JCneHz9+fBoyVRTvxzUE4tCpp556Kq1LEHsIx441AAAlH2Ycx0rHSV3iIkRRnHo3rnxYXFgotp5MmDAhDV2Kx0W33nprml737rvvDieeeKJPBQDquZK3oBx00EFh9uzZZTPN/fd//3dawOgf//Ef0/049Gjx4sXpsk5RHHLUp0+fMHfu3CpfM877H4cmld8AgLqr5C0o5513XgoQe+65Z5oVL/ZJueyyy9JCSFEMJ+UXJCqK94uPVRYnqbnkkktKXVQAoL60oMQVD2+//fZwxx13hOeffz5MnTo1XHHFFen2i4qz6cVJXYrbokWLSlpmAKCOt6D87Gc/S60oxb4kcRnnN998M7WCnHrqqWn55ijO5R9H8RTF+z179qzyNeNUwHEDgM/y/jXX1ljlmCm8FragrFq1KjRsWPFl46We4tLNcfhxDCmxn0pRvCQUR/P07du31MUBgCycdtppoUGDBmHcuHEV9scBInH/5vjggw/CsGHDQrdu3ULTpk3DjjvuGP75n/85vPXWW5tdrvjesQx1PqAcddRRqc/JfffdF954440wffr0tPDRscceW1YRsVJHjx4d7rnnnjB//vy0CFKs3LgAEQDUVXFtmjj9xocffviFX+ODDz4IBx54YHjooYfSdB2vvfZamDZtWro94IAD0uJ+dUHJA0qc7+S73/1uWpWxR48eaYXGuDxznKyt6JxzzglDhw5NqyLGyvz444/DzJkzLfwEQJ0WR7DGqwix20NVLr744k91d5gwYUKasqPo/PPPD++++24KKHGEbNeuXdOqxw888EBo0qRJGDJkSNmx8Xnx+eXF14/vU3w8io0IsQGh/PvUuYDSunXrVBmx38knn3wS/vrXv6bWktgEVRQr4dJLL02jduLkbLGSd99991IXBQCyErs8jBkzJv0x//bbb2/28zdu3JhaS+LI2GKfzqI4M3tsHIhBJbayfB7PPPNMur3lllvCe++9V3Y/B9biAYAaFFsrYivGqFGjNvu577//fli2bFm6QlGVuD9OiBov93weO+ywQ7pt165dCjzF+zkQUACghsV+KHH6jbgkzBdRKLe+XV0loABADYt9RuIadHGer/LiKNjK4WPdunVlP8cWjtja8VnBJu6P3Sh23XXXz/V6ORNQAGAriMON77333grLvMQAEvtnFsqFinnz5pX9HAPHCSeckCZDrTz7euz3OXny5BR8tttuu7LXi31Lyk/rEZecKS92rI2zvudGQAGArSBOZBo7u06cOLFs3yGHHJL6mYwfPz4NMpk0aVL44x//WOF5sZNt7C9y2GGHpcfi7OqPPfZYCiaxdSQ+p6h///7htttuC//1X/+VpvWIE6bGjrrlxZE7cW6yGHi2ZPhz9jPJAsDWUBtnd40jWu+8884KnVxjK8iYMWPS9BzHHXdcmq7jhhtuKDumffv24cknn0zPjdN4xGARW0zikOPf/OY3adhxUbyEFFtMjjzyyLQwb3zNyi0oV155ZRgxYkS48cYbw0477ZTmMMtBg0It7GkTm6hiRcd1edq0aVP6N3ik6vHp5b3/Qus6+T8LNW/yvMmbPOb42x7d5DE7XPm/v+Sonz7PuVTbz6c4NUX8go2zksdJz6hdn9HmfH+7xAMAZEdAAQCyI6AAANkRUACA7AgoANQ6tXB8R71RKNFnI6AAUGvEScWiVatWbe2i8BmKn03xs/qizIMCQK0RJxmLU70vXbo03W/ZsmWa2p08Wk5iOImfTfyMKk8It7kEFABq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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "w = weights * POT\n", + "fid_mask = np.sqrt(np.sum(vertex['decay']**2,axis=-1))<5\n", + "w[np.logical_not(fid_mask)] = 0\n", + "\n", + "# MB efficiency\n", + "w *= 0.29 - 0.12*four_momenta['Gamma'][:,0]\n", + "w *= four_momenta['Gamma'][:,0]>0.14\n", + "\n", + "bins = np.linspace(0,5,50)\n", + "for k,v in four_momenta.items():\n", + " #if k!='nu': continue\n", + " n,_,_ = plt.hist(four_momenta[k][:,0],bins=bins,alpha=0.5,weights=w,label=k)\n", + "plt.xlim(0,2)\n", + "plt.legend()\n", + "plt.show()\n", + "\n", + "\n", + "bins = np.linspace(0,1,50)\n", + "for k,v in four_momenta.items():\n", + " if k == 'HNL':\n", + " print(np.sqrt(np.sum(four_momenta[k][:,1:]**2)))\n", + " CosTheta = four_momenta[k][:,3] / np.sqrt(np.sum(four_momenta[k][:,1:]**2,axis=-1))\n", + " else:\n", + " CosTheta = four_momenta[k][:,3]/four_momenta[k][:,0]\n", + " plt.hist(CosTheta,bins=bins,alpha=0.5,weights=w,label=k)\n", + "plt.legend()\n", + "#plt.semilogy()\n", + "plt.ylim(0,100)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAisAAAGdCAYAAADT1TPdAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAZeUlEQVR4nO3de4xU9d348e8CsoDCCgoCZeVmqxI0WlAeLzVQiZfYWhND+gdVMfyoGKxa+VXZaL20lrVqrZFaqjaiaVWIbdXGu/FSkwrVotZiw1ZF6hYE9dHuItEF2fPknCe7DwuLXbCzfJx5vZLTdWbOzpn9dvbMmzPnO1uVZVmWAACC6rG7HwAAwKcRKwBAaGIFAAhNrAAAoYkVACA0sQIAhCZWAIDQxAoAEFqvFFhra2tau3Zt6t+/f6qqqtrdDwcA6IL882Y3bNiQhg8fnnr06FHesZKHSm1t7e5+GADALmhsbEwjRoxIZR0r+RGV3PBr61KPvn1298MBALqg9aOP09qL69tfx8s6Vtre+slDRawAwOfLf+oUDifYAgChiRUAIDSxAgCEJlYAgNDECgAQmlgBAEITKwBAaGIFAAhNrAAAoYkVACA0sQIAhCZWAIDQxAoAEJpYAQBCEysAQGhiBQAITawAAKGJFQAgNLECAFR2rKxZsyZ961vfSvvss0/q27dvOuSQQ9Kf//znUm8WACgTvUp55x988EE65phj0pQpU9IjjzySBg8enF577bU0cODAUm4WACgjJY2VH//4x6m2tjYtWrSo/brRo0eXcpMAQJkp6dtAv//979PEiRPTtGnT0pAhQ9Lhhx+ebrvtth2u39LSkpqbmzssAEBlK2msrFq1Ki1cuDB98YtfTI899lg699xz0/nnn5/uvPPOTtevr69PNTU17Ut+VAYAqGxVWZZlpbrz3r17F0dWnnvuufbr8lh54YUX0tKlSzs9spIvbfIjK3mwjFhwVerRt0+pHiYA8B/U+tHH6Z/fuSI1NTWlAQMGxD6yMmzYsDRu3LgO1x188MHprbfe6nT96urq4ofaegEAKltJYyWfCdTQ0NDhur///e9p5MiRpdwsAFBGShor3/3ud9OyZcvS/Pnz0+uvv57uvvvudOutt6Y5c+aUcrMAQBkpaawcccQR6b777kv33HNPGj9+fPrhD3+YbrzxxjR9+vRSbhYAKCMl/ZyV3Ne+9rViAQDYFf42EAAQmlgBAEITKwBAaGIFAAhNrAAAoYkVACA0sQIAhCZWAIDQxAoAEJpYAQBCEysAQGhiBQAITawAAKGJFQAgNLECAIQmVgCA0MQKABCaWAEAQhMrAEBoYgUACE2sAAChiRUAIDSxAgCEJlYAgNDECgAQmlgBAEITKwBAaGIFAAhNrAAAoYkVACA0sQIAhCZWAIDQxAoAEJpYAQBCEysAQGhiBQAITawAAKGJFQAgNLECAIQmVgCA0MQKABCaWAEAQuu2WLnmmmtSVVVVuvDCC7trkwBAGeiWWHnhhRfSLbfckg499NDu2BwAUEZKHisffvhhmj59errtttvSwIEDS705AKDMlDxW5syZk0455ZQ0derUf7tuS0tLam5u7rAAAJWtVynvfPHixenFF18s3gbqivr6+nTVVVeV8iEBAJ8zJTuy0tjYmC644IJ01113pT59+nTpe+rq6lJTU1P7kt8HAFDZSnZkZfny5emdd95JX/7yl9uv27JlS3r22WfTz372s+Itn549e3b4nurq6mIBACh5rBx//PHpr3/9a4frzj777HTQQQelSy65ZLtQAQDo1ljp379/Gj9+fIfr9txzz7TPPvtsdz0AwI74BFsAoHJnA23rmWee6c7NAQBlwJEVACA0sQIAhCZWAIDQxAoAEJpYAQBCEysAQGhiBQAITawAAKGJFQAgNLECAIQmVgCA0MQKABCaWAEAQhMrAEBoYgUACE2sAAChiRUAIDSxAgCEJlYAgNDECgAQmlgBAEITKwBAaGIFAAhNrAAAoYkVACA0sQIAhCZWAIDQxAoAEJpYAQBCEysAQGhiBQAITawAAKGJFQAgNLECAIQmVgCA0MQKABCaWAEAQhMrAEBoYgUACE2sAAChiRUAIDSxAgBUbqzU19enI444IvXv3z8NGTIknXbaaamhoaGUmwQAykxJY+UPf/hDmjNnTlq2bFl64okn0ubNm9MJJ5yQNm7cWMrNAgBlpFcp7/zRRx/tcPmOO+4ojrAsX748HXfccaXcNABQJkoaK9tqamoqvg4aNKjT21taWoqlTXNzc7c9NgCgwk+wbW1tTRdeeGE65phj0vjx43d4jktNTU37Ultb210PDwCo9FjJz11ZsWJFWrx48Q7XqaurK46+tC2NjY3d9fAAgEp+G+i8885LDz74YHr22WfT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1/HPygm2AEBoYgUACC10rFRXV6crrrii+Iqx8bzxO2V/Y18cideo7hub0LOBAABCH1kBABArAEBoYgUACE2sAAChhY6Vhx56KE2aNCn17ds3DRw4MJ122mkdbs8/2faUU05J/fr1S0OGDEnf+9730ieffJLK3ahRo1JVVVWH5ZprrumwziuvvJK+8pWvpD59+hSfdHvttdemStLS0pIOO+ywYmxefvnlDrdV6ticeuqpxSdK5j/3sGHD0hlnnJHWrl2bKn1sVq9enWbOnJlGjx5d7GvyP/GRz2LYtGlTqvSx+dGPfpSOPvroYh+79957d7pOpe6HczfffHOxP86fE/lr1fPPP58qzbPPPpu+/vWvp+HDhxf72/vvv7/D7fkcnssvv7zY5+S/X1OnTk2vvfbazm8oC+o3v/lNNnDgwGzhwoVZQ0ND9uqrr2ZLlixpv/2TTz7Jxo8fn02dOjV76aWXsocffjjbd999s7q6uqzcjRw5MvvBD36Qvf322+3Lhx9+2H57U1NTtt9++2XTp0/PVqxYkd1zzz1Z3759s1tuuSWrFOeff3528skn5zPdiudHm0oemxtuuCFbunRptnr16uyPf/xjdtRRRxVLpY/NI488ks2YMSN77LHHsjfeeCN74IEHsiFDhmRz587NKn1sLr/88uJ5c9FFF2U1NTXb3V7J++HFixdnvXv3zm6//fbi9WnWrFnZ3nvvna1fvz6rJA8//HB26aWXZr/73e+K/e19993X4fZrrrmmeO7cf//92V/+8pfs1FNPzUaPHp199NFHO7WdkLGyefPm7Atf+EL2y1/+8lMHqEePHtm6devar8vDZsCAAVlLS0tW7rHy05/+dIe3//znPy9Cb+txuOSSS7IDDzwwqwT5c+Oggw4qdiDbxkqlj83W8hflqqqqbNOmTcVlY/N/rr322mKH2qbSx2bRokWdxkol74ePPPLIbM6cOe2Xt2zZkg0fPjyrr6/PKlXaJlZaW1uzoUOHZtddd137df/617+y6urqIvh3Rsi3gV588cW0Zs2a4m8KHH744cXho5NPPjmtWLGifZ2lS5emQw45JO23337t15144onFH7F79dVXU7nL3/bZZ599ivG57rrrOhx2zcfmuOOOS7179+4wNg0NDemDDz5I5Wz9+vVp1qxZ6Ve/+lVxWHpblTw2W3v//ffTXXfdVRzi32OPPYrrjE3HP8K29R9gMzadq9T9cP4W4fLly4u3NNrkr1f55XxM+F9vvvlmWrduXYdxyv/WX/6W2c6OU8hYWbVqVfH1yiuvTJdddll68MEHi3NWJk+eXOxkc/kAbP0Lkmu7nN9Wzs4///y0ePHi9PTTT6dzzjknzZ8/P1188cXtt1fq2ORhP2PGjDR79uw0ceLETtep1LFpc8kll6Q999yzCN38XIMHHnig/bZKH5s2r7/+elqwYEHxu9XG2HSuUsflvffeS1u2bOn0Zy/nn3tntY3Ff2KcujVW5s2bt92JodsuK1euTK2trcX6l156aTr99NPThAkT0qJFi4rb77333lSOujo2uYsuuqgIt0MPPbR4Yf7JT35S7Fzzk0oreWzyMdiwYUOqq6tLlWJnnje5/OTHl156KT3++OOpZ8+e6cwzzywirxzt7Njk8iO6J510Upo2bVpxhK4c7cq4wO7Wqzs3Nnfu3OJfvp9mzJgx6e233y7+e9y4ce3X539fIL8t/9dgbujQodudeZ2/BdB22+dNV8emM/khtfxtoHxWw4EHHlj8/G1jUUlj89RTTxWHFrf9WxT5UZbp06enO++8s2LHps2+++5bLF/60pfSwQcfXMxqWbZsWTrqqKMqfmzymVFTpkwp3hq79dZbO4xhOT1vPsu+Zlvlth/uqvx3KI/9zp4T5fxz76y2scjHJT+do01+OZ+tGTZWBg8eXCz/Tn4kJX/Byc8jOPbYY4vrNm/eXLwYjxw5sric71zzaXXvvPNOMV0u98QTT6QBAwZ0iJzPi66OTWfyqbn5+6Vt45CPTX5UKh+ztvMR8rHJQyZ/O61cx+amm25KV199dYcXn/z98yVLlhRBV8lj05m2I5htR+QqeWzyIyp5qLQdxc1/n7ZWTmPzWZ4z2yq3/XBX5ee85c+VJ598sv0jNfLfp/zyeeedt7sfXhj5xwHkwZKPS1uc5Ocz/elPf0rnnnvuzt1ZFtQFF1xQzAjKpxOuXLkymzlzZjGd8P333+8wZe6EE07IXn755ezRRx/NBg8eXPZT5p577rliJlD+M+fTLH/9618XP/eZZ57Z4WzrfJrlGWecUUyzzKfY9evXr+ynWW7rzTff3G42UKWOzbJly7IFCxYUY5FPXX7yySezo48+Ohs7dmz28ccfV/TY/POf/8wOOOCA7Pjjjy/+e+uPBGhTqWPzj3/8o3jOXHXVVdlee+1V/He+bNiwoaL3w7n8OZDParnjjjuyv/3tb9m3v/3tYury1jOjKsGGDRvanxf5/jaf6p7/d/7caZu6nI9LPvvwlVdeyb7xjW+Uz9TlXD6dMv+cgzxQ+vfvX8zjz3cSW8t3uvlnaeSfd5DP7c/Xz6c9l7Ply5dnkyZNKqYR9unTJzv44IOz+fPnt7/gtMnnsx977LHFL1MeffkTptJ0FiuVOjb5TmLKlCnZoEGDip971KhR2ezZs4sX50ofm3xabv486Wyp9LE566yzOh2Xp59+uqL3w23yfwDsv//+xeet5FOZ838UVJqnn3660+dI/txpm778/e9/v4j9/Hcn/0dB/tlpO6sq/5/SHAACAPjsQk5dBgBoI1YAgNDECgAQmlgBAEITKwBAaGIFAAhNrAAAoYkVACA0sQIAhCZWAIDQxAoAEJpYAQBSZP8Dp3wmF8cXDEIAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAisAAAGdCAYAAADT1TPdAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAb9ElEQVR4nO3dC3BU5f038CcQCKAkgnItkZutyqAvFpR6qQOV8fK3VWcc2ulQFYeXioNVq1Mlo/XSC7FirVNqKdoRnVaFaqu0eB+UOv8K1aLUYgeqRUoKgtcm6NhwyXnnnL5JCTc3ups82f18Zg7J7h72nH04e/bLc57fs2VJkiQBACBSXTp6BwAA9kdYAQCiJqwAAFETVgCAqAkrAEDUhBUAIGrCCgAQNWEFAIhaeYhYU1NT2LRpU+jdu3coKyvr6N0BAHKQzje7devWMHjw4NClS5fiDitpUKmuru7o3QAAPoa6urowZMiQUNRhJe1RSZ0U/ieUh24dvTsAQA52hO3hf8OjLZ/jRR1Wmi/9pEGlvExYAYBO4f9/62C+hnAYYAsARE1YAQCiJqwAAFETVgCAqAkrAEDUhBUAIGrCCgAQNWEFAIiasAIARE1YAQCiJqwAAFETVgCAqAkrAEDUhBUAIGrCCgAQNWEFAIiasAIARE1YAQCiJqwAAKUdVjZu3Bi+9rWvhYMPPjj07NkzHHXUUeFPf/pToTcLABSJ8kI++XvvvRdOPPHEMHHixPDYY4+Ffv36hVdffTX06dOnkJsFAIpIQcPKD37wg1BdXR0WLFjQct/w4cMLuUkAoMgU9DLQb3/72zBu3LgwefLk0L9//3DMMceEO++8c5/rNzY2hoaGhlYLAFDaChpW1q1bF+bNmxc+/elPhyeeeCJcfPHF4dJLLw333HPPXtevra0NVVVVLUvaKwMAlLayJEmSQj159+7ds56V5557ruW+NKy88MILYfny5XvtWUmXZmnPShpYJoSzQ3lZt0LtJgCQRzuS7WFZWBzq6+tDZWVl3D0rgwYNCqNGjWp135FHHhk2bNiw1/UrKiqyF7XrAgCUtoKGlbQSaO3ata3u+9vf/haGDh1ayM0CAEWkoGHlm9/8ZlixYkWYPXt2eO2118J9990X7rjjjjBz5sxCbhYAKCIFDSvHHntseOihh8L9998fRo8eHb773e+G2267LUyZMqWQmwUAikhB51lJffGLX8wWAICPw3cDAQBRE1YAgKgJKwBA1IQVACBqwgoAEDVhBQCImrACAERNWAEAoiasAABRE1YAgKgJKwBA1IQVACBqwgoAEDVhBQCImrACAERNWAEAoiasAABRE1YAgKgJKwBA1IQVACBqwgoAEDVhBQCImrACAERNWAEAoiasAABRE1YAgKgJKwBA1IQVACBqwgoAEDVhBQCImrACAERNWAEAoiasAABRE1YAgKgJKwBA1IQVACBqwgoAEDVhBQCImrACAERNWAEAoiasAABRE1YAgKi1W1i56aabQllZWbj88svba5MAQBFol7DywgsvhPnz54ejjz66PTYHABSRgoeV999/P0yZMiXceeedoU+fPoXeHABQZAoeVmbOnBnOPPPMMGnSpI9ct7GxMTQ0NLRaAIDSVl7IJ1+4cGF48cUXs8tAuaitrQ033nhjIXcJAOhkCtazUldXFy677LJw7733hh49euT0d2pqakJ9fX3Lkj4HAFDaCtazsnLlyvDmm2+Gz372sy337dy5Mzz77LPhJz/5SXbJp2vXrq3+TkVFRbYAABQ8rJxyyinhL3/5S6v7LrzwwnDEEUeEq6++eo+gAgDQrmGld+/eYfTo0a3uO+CAA8LBBx+8x/0AAPtiBlsAoHSrgXa3bNmy9twcAFAE9KwAAFETVgCAqAkrAEDUhBUAIGrCCgAQNWEFAIiasAIARE1YAQCiJqwAAFETVgCAqAkrAEDUhBUAIGrCCgAQNWEFAIiasAIARE1YAQCiJqwAAFETVgCAqAkrAEDUhBUAIGrCCgAQNWEFAIiasAIARE1YAQCiJqwAAFETVgCAqAkrAEDUhBUAIGrCCgAQNWEFAIiasAIARE1YAQCiJqwAAFETVgCAqAkrAEDUhBUAIGrCCgAQNWEFAIiasAIARE1YAQCiJqwAAFETVgCA0g0rtbW14dhjjw29e/cO/fv3D+ecc05Yu3ZtITcJABSZgoaV3//+92HmzJlhxYoV4amnngrbt28Pp556avjggw8KuVkAoIiUF/LJH3/88Va377777qyHZeXKleHkk08u5KYBgCJR0LCyu/r6+uxn37599/p4Y2NjtjRraGhot30DAEp8gG1TU1O4/PLLw4knnhhGjx69zzEuVVVVLUt1dXV77R4AUOphJR27snr16rBw4cJ9rlNTU5P1vjQv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9tuz83F6TKSfVc8//3woNc8++2z40pe+FAYPHpydbx9++OFWj6c1PNddd112zknfX5MmTQqvvvpq2zeUROrBBx9M+vTpk8ybNy9Zu3Zt8sorrySLFi1qeXzHjh3J6NGjk0mTJiUvvfRS8uijjyaHHHJIUlNTkxS7oUOHJt/5zneSN954o2V5//33Wx6vr69PBgwYkEyZMiVZvXp1cv/99yc9e/ZM5s+fn5SKSy+9NDnjjDPSSrfs+GhWym1z6623JsuXL0/Wr1+f/OEPf0iOP/74bCn1tnnssceSqVOnJk888UTy97//PVm8eHHSv3//5Morr0xKvW2uu+667Li54oorkqqqqj0eL+Xz8MKFC5Pu3bsnd911V/b5NH369OSggw5KtmzZkpSSRx99NLnmmmuS3/zmN9n59qGHHmr1+E033ZQdOw8//HDy5z//OTnrrLOS4cOHJx9++GGbthNlWNm+fXvyqU99Kvn5z3++3wbq0qVLsnnz5pb70mBTWVmZNDY2JsUeVn70ox/t8/Gf/vSnWdDbtR2uvvrq5PDDD09KQXpsHHHEEdkJZPewUupts6v0Q7msrCzZtm1bdlvb/NfNN9+cnVCblXrbLFiwYK9hpZTPw8cdd1wyc+bMlts7d+5MBg8enNTW1ialKuwWVpqampKBAwcmc+bMabnvX//6V1JRUZEF/raI8jLQiy++GDZu3Jh9p8AxxxyTdR+dccYZYfXq1S3rLF++PBx11FFhwIABLfeddtpp2ZfYvfLKK6HYpZd9Dj744Kx95syZ06rbNW2bk08+OXTv3r1V26xduza89957oZht2bIlTJ8+PfziF7/IuqV3V8pts6t333033HvvvVkXf7du3bL7tE3rL2Hb9QvYtM3elep5OL1EuHLlyuySRrP08yq9nbYJ//H666+HzZs3t2qn9Lv+0ktmbW2nKMPKunXrsp833HBDuPbaa8OSJUuyMSsTJkzITrKptAF2fYOkmm+njxWzSy+9NCxcuDA888wz4aKLLgqzZ88OV111Vcvjpdo2abCfOnVqmDFjRhg3btxe1ynVtml29dVXhwMOOCALuulYg8WLF7c8Vupt0+y1114Lc+fOzd5bzbTN3pVqu7z99tth586de33txfy626q5LfLRTu0aVmbNmrXHwNDdlzVr1oSmpqZs/WuuuSace+65YezYsWHBggXZ4w888EAoRrm2TeqKK67IgtvRRx+dfTD/8Ic/zE6u6aDSUm6btA22bt0aampqQqloy3GTSgc/vvTSS+HJJ58MXbt2Deeff34W8opRW9smlfbonn766WHy5MlZD10x+jjtAh2tvD03duWVV2b/892fESNGhDfeeCP7fdSoUS33p98vkD6W/m8wNXDgwD1GXqeXAJof62xybZu9SbvU0stAaVXD4Ycfnr3+5rYopbZ5+umns67F3b+LIu1lmTJlSrjnnntKtm2aHXLIIdnymc98Jhx55JFZVcuKFSvC8ccfX/Jtk1ZGTZw4Mbs0dscdd7Rqw2I6bj7JuWZ3xXYezlX6HkrD/t6OiWJ+3W3V3BZpu6TDOZqlt9NqzWjDSr9+/bLlo6Q9KekHTjqO4KSTTsru2759e/ZhPHTo0Ox2enJNy+refPPNrFwu9dRTT4XKyspWIaezyLVt9iYtzU2vlza3Q9o2aa9U2mbN4xHStkmDTHo5rVjb5sc//nH43ve+1+rDJ71+vmjRoizQlXLb7E1zD2Zzj1wpt03ao5IGleZe3PT9tKtiaptPcszsrtjOw7lKx7ylx8rSpUtbptRI30/p7UsuuaSjdy8a6XQAaWBJ26U5nKTjmf74xz+Giy++uG1PlkTqsssuyyqC0nLCNWvWJNOmTcvKCd99991WJXOnnnpqsmrVquTxxx9P+vXrV/Qlc88991xWCZS+5rTM8pe//GX2us8///xWo63TMsvzzjsvK7NMS+x69epV9GWWu3v99df3qAYq1bZZsWJFMnfu3Kwt0tLlpUuXJieccEIycuTI5N///ndJt80///nP5LDDDktOOeWU7PddpwRoVqpt849//CM7Zm688cbkwAMPzH5Pl61bt5b0eTiVHgNpVcvdd9+d/PWvf02+/vWvZ6XLu1ZGlYKtW7e2HBfp+TYtdU9/T4+d5tLltF3S6sOXX345Ofvss4undDmVllOm8xykAaV3795ZHX96kthVetJN59JI5ztIa/vT9dOy52K2cuXKZPz48VkZYY8ePZIjjzwymT17dssHTrO0nv2kk07K3kxp6EsPmFKzt7BSqm2TniQmTpyY9O3bN3vdw4YNS2bMmJF9OJd626Rluelxsrel1Nvmggsu2Gu7PPPMMyV9Hm6W/gfg0EMPzeZbSUuZ0/8UlJpnnnlmr8dIeuw0ly9/+9vfzsJ++t5J/1OQzp3WVmXpH4XpAAIA+OSiLF0GAGgmrAAAURNWAICoCSsAQNSEFQAgasIKABA1YQUAiJqwAgBETVgBAKImrAAAURNWAICoCSsAQIjZ/wN70cEMuktjCgAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "Nbins = 50\n", + "zmin = -60\n", + "zmax = 10\n", + "xbound = 7\n", + "\n", + "zbins = np.linspace(zmin,zmax,Nbins)\n", + "xbins = np.linspace(-xbound,xbound,Nbins)\n", + "\n", + "plt.hist2d(vertex['upscattering'][:,2],vertex['upscattering'][:,0],bins=(zbins,xbins),weights=w)\n", + "plt.show()\n", + "\n", + "plt.hist2d(vertex['decay'][:,2],vertex['decay'][:,0],bins=(zbins,xbins))#,weights=w)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "lienv", + "language": "python", + "name": "lienv" + }, + "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.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/resources/earthparams/densities/CCM.dat b/resources/earthparams/densities/CCM.dat index f1576cde..e79103fc 100644 --- a/resources/earthparams/densities/CCM.dat +++ b/resources/earthparams/densities/CCM.dat @@ -1,50 +1,3 @@ -# -# crust model file -# PREM + mmc crust setup -# crust data is consistent with MMC mediadef. -# -# format as a context free grammar: -# [line] -> [entry] [comment] -# [comment] -> -# [comment] -> #(string comment) -# [entry] -> -# [entry] -> [object] -# [entry] -> [detector] -# [detector] -> detector (double x) (double y) (double z) -# [object] -> object [shape] [label] [material name] [density distribution] -# [shape] -> [sphere] -# [shape] -> [box] -# [sphere] -> sphere [shape coords] (double radius) -# [box] -> box [shape coords] (double dx) (double dy) (double dz) -# [shape coords] -> (double x) (double y) (double z) -# [label] -> (string label) -# [material name] -> (string material) -# [density distribution] -> [constant] -# [density distribution] -> [radial polynomial] -# [constant] -> constant (double density) -# [radial polynomial] -> radial_polynomial [axis coords] [polynomial] -# [axis coords] -> (double x) (double y) (double z) -# [polynomial] -> (int n_params) [polynomial {n_params}] -# [polynomial {n_params}] -> (double param_n) [polynomial {n_params-1}] -# [polynomial {1}] -> (double param_1) -# -# format notes: -# - no space before first column -# - delimiter must be whitespaces -# - for overlapping objects the object defined later in the file is given precidence -# - MediumType must be consistent with EarthModelService::MediumType -# - number_of_parameters is the number of params for polynominal density function -# - parameters : ex. -# for 3 parameters p0, p1, p2 and distance from Earth's center x : -# density = p0 + p1*x + p2*x*x -# -# CAUTION : the unit of density must be [g/cm3] (CGS unit) -# -# - lines start from '#' or whitespace are treated -# as comments -# - - # Detector Hall object box 0 0 0 0 0 0 100 100 100 surr_air AIR constant 0.001225 # 0.673atm x 1.205e-3(g/cm3 for 1atm) # adjust floor z pos if necessary: this is a guess diff --git a/resources/earthparams/densities/MINERvA.dat b/resources/earthparams/densities/MINERvA.dat index 944f8951..cc515459 100644 --- a/resources/earthparams/densities/MINERvA.dat +++ b/resources/earthparams/densities/MINERvA.dat @@ -1,49 +1,3 @@ -# -# crust model file -# PREM + mmc crust setup -# crust data is consistent with MMC mediadef. -# -# format as a context free grammar: -# [line] -> [entry] [comment] -# [comment] -> -# [comment] -> #(string comment) -# [entry] -> -# [entry] -> [object] -# [entry] -> [detector] -# [detector] -> detector (double x) (double y) (double z) -# [object] -> object [shape] [label] [material name] [density distribution] -# [shape] -> [sphere] -# [shape] -> [box] -# [sphere] -> sphere [shape coords] (double radius) -# [box] -> box [shape coords] (double dx) (double dy) (double dz) -# [shape coords] -> (double x) (double y) (double z) -# [label] -> (string label) -# [material name] -> (string material) -# [density distribution] -> [constant] -# [density distribution] -> [radial polynomial] -# [constant] -> constant (double density) -# [radial polynomial] -> radial_polynomial [axis coords] [polynomial] -# [axis coords] -> (double x) (double y) (double z) -# [polynomial] -> (int n_params) [polynomial {n_params}] -# [polynomial {n_params}] -> (double param_n) [polynomial {n_params-1}] -# [polynomial {1}] -> (double param_1) -# -# format notes: -# - no space before first column -# - delimiter must be whitespaces -# - for overlapping objects the object defined later in the file is given precidence -# - MediumType must be consistent with EarthModelService::MediumType -# - number_of_parameters is the number of params for polynominal density function -# - parameters : ex. -# for 3 parameters p0, p1, p2 and distance from Earth's center x : -# density = p0 + p1*x + p2*x*x -# -# CAUTION : the unit of density must be [g/cm3] (CGS unit) -# -# - lines start from '#' or whitespace are treated -# as comments -# - # Dirt object box 0 0 -100 0 0 0 100 100 300 surr_earth ROCK constant 2.900 @@ -54,12 +8,12 @@ object sphere 0 0 0 0 0 0 10 surr_air AIR object box 0 0 -1 0 0 0 2 2 0.075 veto_wall STEEL constant 7.83 # HCAL and ECAL -#object extr 0 0 2.0672 0 0 0 6 0.000 0.98150 0.85000 0.49075 0.85000 -0.49075 0.000 -0.98150 -0.85000 -0.49075 -0.85000 0.49075 2 -2.0672 0 0 1 2.0672 0 0 1 HCal PLANE constant 1.043 -#object extr 0 0 2.0672 0 0 0 6 0.000 1.23553 1.07000 0.61776 1.07000 -0.61776 0.000 -1.23553 -1.07000 -0.61776 -1.07000 0.61776 2 -2.0672 0 0 1 2.0672 0 0 1 Ecal ECAL constant 2.244 -object extr 0 0 2.0672 0 0 0 6 0.000 1.23553 1.07000 0.61776 1.07000 -0.61776 0.000 -1.23553 -1.07000 -0.61776 -1.07000 0.61776 2 -2.07 0 0 1 2.07 0 0 1 Ecal ECAL constant 2.244 +#object extr 0 0 2.0672 0 0 0 6 0.000 0.98150 0.85000 0.49075 0.85000 -0.49075 0.000 -0.98150 -0.85000 -0.49075 -0.85000 0.49075 2 -2.0672 0 0 1 2.0672 0 0 1 HCal PLANE constant 1.043 +#object extr 0 0 2.0672 0 0 0 6 0.000 1.23553 1.07000 0.61776 1.07000 -0.61776 0.000 -1.23553 -1.07000 -0.61776 -1.07000 0.61776 2 -2.0672 0 0 1 2.0672 0 0 1 Ecal ECAL constant 2.244 +object extr 0 0 2.0672 0 0 0 6 0.000 1.23553 1.07000 0.61776 1.07000 -0.61776 0.000 -1.23553 -1.07000 -0.61776 -1.07000 0.61776 2 -2.07 0 0 1 2.07 0 0 1 Ecal ECAL constant 2.244 # OLD 85 cm apothem -#object extr 0 0 2.0672 0 0 0 6 0.000 0.98150 0.85000 0.49075 0.85000 -0.49075 0.000 -0.98150 -0.85000 -0.49075 -0.85000 0.49075 2 -2.0672 0 0 1 2.0672 0 0 1 tracker PLANE constant 1.043 +#object extr 0 0 2.0672 0 0 0 6 0.000 0.98150 0.85000 0.49075 0.85000 -0.49075 0.000 -0.98150 -0.85000 -0.49075 -0.85000 0.49075 2 -2.0672 0 0 1 2.0672 0 0 1 tracker PLANE constant 1.043 #object extr 0 0 0.136 0 0 0 5 -0.2475 0.8386 0.6025 -0.6336 0.000 -0.98150 -0.85000 -0.49075 -0.85000 0.49075 2 0 0 0 1 0.02567 0 0 1 Fe1 STEEL constant 7.83 #object extr 0 0 0.136 0 0 0 5 0.6025 -0.6336 -0.2475 0.8386 0.000 0.98150 0.85000 0.49075 0.85000 -0.49075 2 0 0 0 1 0.02578 0 0 1 Pb1 LEAD constant 11.29 #object extr 0 0 0.313 0 0 0 5 -0.6025 -0.6336 0.2475 0.8386 0.85000 0.49075 0.85000 -0.49075 0.000 -0.98150 2 0 0 0 1 0.02563 0 0 1 Fe2 STEEL constant 7.83 @@ -68,7 +22,7 @@ object extr 0 0 2.0672 0 0 0 6 0.000 1.23553 1.07000 0.61776 1.070 #object extr 0 0 0.534 0 0 0 4 0.000 0.000 0.85000 0.49075 0.85000 -0.49075 0.000 -0.98150 2 0 0 0 1 0.02573 0 0 1 Fe3 STEEL constant 7.83 #object extr 0 0 0.534 0 0 0 3 0.000 0.000 0.000 -0.98150 -0.85000 -0.49075 2 0 0 0 1 0.02563 0 0 1 Pb3 LEAD constant 11.29 #object extr 0 0 0.895 0 0 0 6 0.000 0.98150 0.85000 0.49075 0.85000 -0.49075 0.000 -0.98150 -0.85000 -0.49075 -0.85000 0.49075 2 0 0 0 1 0.1806 0 0 1 water_target WATER constant 1.0 -#object extr 0 0 1.256 0 0 0 6 0.000 0.98150 0.85000 0.49075 0.85000 -0.49075 0.000 -0.98150 -0.85000 -0.49075 -0.85000 0.49075 2 0 0 0 1 0.00795 0 0 1 Pb4 LEAD constant 11.29 +#object extr 0 0 1.256 0 0 0 6 0.000 0.98150 0.85000 0.49075 0.85000 -0.49075 0.000 -0.98150 -0.85000 -0.49075 -0.85000 0.49075 2 0 0 0 1 0.00795 0 0 1 Pb4 LEAD constant 11.29 #object extr 0 0 1.389 0 0 0 5 -0.2475 0.8386 0.6025 -0.6336 0.000 -0.98150 -0.85000 -0.49075 -0.85000 0.49075 2 0 0 0 1 0.01289 0 0 1 Fe5 STEEL constant 7.83 #object extr 0 0 1.389 0 0 0 5 0.6025 -0.6336 -0.2475 0.8386 0.000 0.98150 0.85000 0.49075 0.85000 -0.49075 2 0 0 0 1 0.01317 0 0 1 Pb5 LEAD constant 11.29 diff --git a/resources/earthparams/densities/MiniBooNE.dat b/resources/earthparams/densities/MiniBooNE.dat index 4d2add8a..2d196dd9 100644 --- a/resources/earthparams/densities/MiniBooNE.dat +++ b/resources/earthparams/densities/MiniBooNE.dat @@ -1,49 +1,3 @@ -# -# crust model file -# PREM + mmc crust setup -# crust data is consistent with MMC mediadef. -# -# format as a context free grammar: -# [line] -> [entry] [comment] -# [comment] -> -# [comment] -> #(string comment) -# [entry] -> -# [entry] -> [object] -# [entry] -> [detector] -# [detector] -> detector (double x) (double y) (double z) -# [object] -> object [shape] [label] [material name] [density distribution] -# [shape] -> [sphere] -# [shape] -> [box] -# [sphere] -> sphere [shape coords] (double radius) -# [box] -> box [shape coords] (double dx) (double dy) (double dz) -# [shape coords] -> (double x) (double y) (double z) -# [label] -> (string label) -# [material name] -> (string material) -# [density distribution] -> [constant] -# [density distribution] -> [radial polynomial] -# [constant] -> constant (double density) -# [radial polynomial] -> radial_polynomial [axis coords] [polynomial] -# [axis coords] -> (double x) (double y) (double z) -# [polynomial] -> (int n_params) [polynomial {n_params}] -# [polynomial {n_params}] -> (double param_n) [polynomial {n_params-1}] -# [polynomial {1}] -> (double param_1) -# -# format notes: -# - no space before first column -# - delimiter must be whitespaces -# - for overlapping objects the object defined later in the file is given precidence -# - MediumType must be consistent with EarthModelService::MediumType -# - number_of_parameters is the number of params for polynominal density function -# - parameters : ex. -# for 3 parameters p0, p1, p2 and distance from Earth's center x : -# density = p0 + p1*x + p2*x*x -# -# CAUTION : the unit of density must be [g/cm3] (CGS unit) -# -# - lines start from '#' or whitespace are treated -# as comments -# - # Dirt object box 0 0 -250 0 0 0 100 100 600 surr_earth ROCK constant 2.900 diff --git a/resources/earthparams/densities/PREM_IceCube.dat b/resources/earthparams/densities/PREM_IceCube.dat new file mode 100644 index 00000000..d201eb0a --- /dev/null +++ b/resources/earthparams/densities/PREM_IceCube.dat @@ -0,0 +1,19 @@ +object sphere 0 0 0 0 0 0 6478000 atmo_radius AIR radial_polynomial 0 0 0 1 0.000811 # 0.673atm x 1.205e-3(g/cm3 for 1atm) +object sphere 0 0 0 0 0 0 6374134 iceair_boundary ICE radial_polynomial 0 0 0 1 0.762944 # surface of ice, 0.832 x 0.917 +object sphere 0 0 0 0 0 0 6373934 clearice_boundary ICE radial_polynomial 0 0 0 1 0.921585 # 200m below ice surface, 1.005 x 0.917 +object sphere 0 0 0 0 0 0 6371324 rockice_boundary ROCK radial_polynomial 0 0 0 1 2.650 # surface of bed rock, 1.0 x 2.65 +object sphere 0 0 0 0 0 0 6356000 inner_crust ROCK radial_polynomial 0 0 0 1 2.900 +object sphere 0 0 0 0 0 0 6346600 moho_boundary MANTLE radial_polynomial 0 0 0 2 2.691 1.08679956050855438e-07 # surface of mantle +object sphere 0 0 0 0 0 0 6151000 upper_transition MANTLE radial_polynomial 0 0 0 2 7.1089 -5.97159001726573544e-07 +object sphere 0 0 0 0 0 0 5971000 middle_transition MANTLE radial_polynomial 0 0 0 2 11.2494 -1.26036728927954783e-06 +object sphere 0 0 0 0 0 0 5771000 lower_transition MANTLE radial_polynomial 0 0 0 2 5.3197 -2.32867681682624407e-07 +object sphere 0 0 0 0 0 0 5701000 lowermantle_boundary MANTLE radial_polynomial 0 0 0 4 7.9565 -1.01649662533354259e-06 1.36199775701391389e-13 -1.19131495406828110e-20 +object sphere 0 0 0 0 0 0 3480000 coremantle_boundary OUTERCORE radial_polynomial 0 0 0 4 12.5815 -1.98367603202009108e-07 -8.97421093229181259e-14 -2.13773109929070169e-20 +object sphere 0 0 0 0 0 0 1221500 innercore_boundary INNERCORE radial_polynomial 0 0 0 3 13.0885 0 -2.17742748697875934e-13 + +# IceCube detector: 1km^3 cylinder of ice +object cylinder 0 0 6372184 0 0 0 564.19 0 1000 icecube ICE radial_polynomial 0 0 0 1 0.921585 # same as rockice + + +# center of detector at IceCube +detector 0 0 6372184 \ No newline at end of file diff --git a/resources/earthparams/densities/PREM.dat b/resources/earthparams/densities/legacy/PREM.dat similarity index 100% rename from resources/earthparams/densities/PREM.dat rename to resources/earthparams/densities/legacy/PREM.dat diff --git a/resources/earthparams/densities/PREM_mmc.dat b/resources/earthparams/densities/legacy/PREM_mmc.dat similarity index 100% rename from resources/earthparams/densities/PREM_mmc.dat rename to resources/earthparams/densities/legacy/PREM_mmc.dat diff --git a/resources/earthparams/densities/mmc.dat b/resources/earthparams/densities/legacy/mmc.dat similarity index 100% rename from resources/earthparams/densities/mmc.dat rename to resources/earthparams/densities/legacy/mmc.dat diff --git a/resources/earthparams/materials/IceCube.dat b/resources/earthparams/materials/IceCube.dat new file mode 100644 index 00000000..68ce603e --- /dev/null +++ b/resources/earthparams/materials/IceCube.dat @@ -0,0 +1,24 @@ +ICE 2 # H20 +1000080160 0.8881016 # 0, 88.8% in weight +1000010010 0.1118984 # 2H, 11% in weight + +ROCK 2 # SiO2 +1000140280 0.4674349 # Si, 33% +1000080160 0.5325651 # 20, 66% + +INNERCORE 1 # Fe +1000260560 1.0000000 # Fe56 100% + +OUTERCORE 1 # Fe +1000260560 1.0000000 # Fe56 100% + +MANTLE 2 # SiO2 +1000140280 0.4674349 # Si, 33% +1000080160 0.5325651 # 20, 66% + +AIR 2 # N2 + O2 +1000070140 0.7562326 # N2 78% in volume +1000080160 0.2437674 # O2 22% in volume + +VACUUM 1 # dummy, H +1000010010 1.0000000 # N2 78% in volume \ No newline at end of file