diff --git a/debug/project.ipynb b/debug/project.ipynb index 294a0fc..c70686e 100644 --- a/debug/project.ipynb +++ b/debug/project.ipynb @@ -7,7 +7,8 @@ "metadata": {}, "outputs": [], "source": [ - "from babyyoda import project, rebin, yoda" + "import babyyoda.grogu as yoda\n", + "from babyyoda import project, rebin" ] }, { @@ -114,7 +115,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Warning: is not allowed to get flow bins, flow bin option set to None\n" + "Warning: is not allowed to get flow bins, flow bin option set to None\n" ] }, { @@ -134,19 +135,21 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 9, "id": "ac742424-5487-4241-85ca-eff16f709db1", "metadata": {}, "outputs": [ { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" + "ename": "AttributeError", + "evalue": "'GROGU_HISTO2D_V3' object has no attribute 'rebinYTo'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[9], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mh\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m:\u001b[49m\u001b[43m]\u001b[49m\n", + "File \u001b[0;32m~/.local/lib/python3.12/site-packages/babyyoda/histo2d.py:292\u001b[0m, in \u001b[0;36mUHIHisto2D.__getitem__\u001b[0;34m(self, slices)\u001b[0m\n\u001b[1;32m 290\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ystop \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 291\u001b[0m ystop \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;241m1\u001b[39m\n\u001b[0;32m--> 292\u001b[0m \u001b[43msc\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrebinYTo\u001b[49m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39myEdges()[ystart:ystop])\n\u001b[1;32m 294\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(xstep, rebin):\n\u001b[1;32m 295\u001b[0m \u001b[38;5;66;03m# weird yoda default\u001b[39;00m\n\u001b[1;32m 296\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m xstart \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", + "\u001b[0;31mAttributeError\u001b[0m: 'GROGU_HISTO2D_V3' object has no attribute 'rebinYTo'" + ] } ], "source": [ @@ -155,126 +158,60 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": null, "id": "b98d9529-8c2c-4242-9605-f459246e273e", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.0" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "h[0, 0].sumWY()" ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "c8a91c2e-3b38-4263-9adf-8655e0b7f71e", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjEAAAGdCAYAAADjWSL8AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAmX0lEQVR4nO3df1DU953H8dcG2BUY2Ageu+4EEzLDNRpoYiG1ElvtgNhWpRnnSlMS60281IzGhKr1x2lT4iSQ2As6JxdTMploYy3540JqfxkxzWEdkooY2qhpvEw5xURKe0cWELLLj+/9kfN7XTEqyS7LZ3k+Zr4zfL/73i/v3US+r/18P/v9OizLsgQAAGCY66LdAAAAwCdBiAEAAEYixAAAACMRYgAAgJEIMQAAwEiEGAAAYCRCDAAAMBIhBgAAGCk+2g1EyvDwsN5//32lpKTI4XBEux0AAHANLMtST0+PfD6frrvuymMtMRti3n//fWVmZka7DQAA8Am0t7frhhtuuGJNzIaYlJQUSR+9CampqVHuBgAAXIvu7m5lZmbax/EridkQc/EUUmpqKiEGAADDXMtUECb2AgAAIxFiAACAkQgxAADASIQYAABgJEIMAAAwEiEGAAAYiRADAACMRIgBAABGIsQAAAAjEWIAAICRCDEAAMBIhBgAAGAkQgwAADASIQYAABiJEAMA/6cvOKibNv5SN238pfqCg9FuB8BVEGIAAICRCDEAAMBIhBgAAGAkQgwAADASIQYAABiJEAMAAIxEiAEAAEYixAAAACMRYgAAgJEIMQAAwEiEGAAAYCRCDAAAMBIhBgAAGIkQAwAAjESIAQAARiLEAAAAI406xBw+fFiLFy+Wz+eTw+HQyy+/bD82MDCgDRs2KDc3V8nJyfL5fPr2t7+t999/P2QfgUBAq1ev1pQpU5ScnKySkhKdO3cupKarq0tLly6V2+2W2+3W0qVL9cEHH3yiFwkAAGLPqEPMhQsXdNttt6mmpmbEY319fTp+/Li+//3v6/jx43rppZd0+vRplZSUhNSVl5ervr5edXV1OnLkiHp7e7Vo0SINDQ3ZNWVlZWptbdWBAwd04MABtba2aunSpZ/gJQIAgFjksCzL+sRPdjhUX1+vu+6662Nrmpub9fnPf15nzpzRtGnT5Pf79Xd/93d64YUX9M1vflOS9P777yszM1O/+tWvtGDBAr399tuaMWOG3njjDc2aNUuS9MYbb2j27Nn64x//qM985jNX7a27u1tut1t+v1+pqamf9CUCmED6goOa8cgrkqRTWxcoyRkf5Y6AiWc0x++Iz4nx+/1yOBy6/vrrJUktLS0aGBhQcXGxXePz+ZSTk6OmpiZJ0uuvvy63220HGEn6whe+ILfbbddcKhAIqLu7O2QBAACxK6Ih5sMPP9TGjRtVVlZmp6mOjg45nU5Nnjw5pNbj8aijo8OuycjIGLG/jIwMu+ZSVVVV9vwZt9utzMzMML8aAAAwnkQsxAwMDOjuu+/W8PCwnn766avWW5Ylh8Nhr//tzx9X87c2bdokv99vL+3t7Z+8eQAAMO5FJMQMDAyotLRUbW1tamhoCDmn5fV6FQwG1dXVFfKczs5OeTweu+bPf/7ziP3+5S9/sWsu5XK5lJqaGrIAAIDYFfYQczHA/Od//qcOHTqk9PT0kMfz8vKUkJCghoYGe9v58+d14sQJFRQUSJJmz54tv9+vo0eP2jW/+93v5Pf77RoAADCxjXrqfW9vr9599117va2tTa2trUpLS5PP59M//MM/6Pjx4/rFL36hoaEhew5LWlqanE6n3G63li9frrVr1yo9PV1paWlat26dcnNzVVRUJEmaPn26vvKVr+j+++/Xj370I0nSd77zHS1atOiavpkEAABi36hDzLFjx/TlL3/ZXl+zZo0kadmyZaqoqND+/fslSbfffnvI81577TXNmzdPkrR9+3bFx8ertLRU/f39Kiws1O7duxUXF2fX/+QnP9FDDz1kf4uppKTkstemAQAAE9Onuk7MeMZ1YgCMFteJAaJvXF0nBgAAIBIIMQAAwEiEGAAAYCRCDAAAMBIhBgAAGIkQAwAAjESIAQAARiLEAAAAIxFiAACAkQgxAADASIQYAABgJEIMAAAwEiEGAAAYiRADAACMRIgBAABGIsQAAAAjEWIAAICRCDEAAMBIhBgAAGAkQgwAADASIQYAABiJEAMAAIxEiAEAAEYixAAAACMRYgAAgJEIMQAAwEiEGAAAYCRCDAAAMBIhBgAAGIkQAwAAjESIAQAARiLEAAAAIxFiAACAkQgxAADASIQYAABgJEIMAAAwEiEGAAAYiRADAACMRIgBAABGIsQAAAAjEWIAAICRCDEAAMBIhBgAAGAkQgwAADDSqEPM4cOHtXjxYvl8PjkcDr388sshj1uWpYqKCvl8PiUmJmrevHk6efJkSE0gENDq1as1ZcoUJScnq6SkROfOnQup6erq0tKlS+V2u+V2u7V06VJ98MEHo36BAAAgNo06xFy4cEG33XabampqLvv4tm3bVF1drZqaGjU3N8vr9Wr+/Pnq6emxa8rLy1VfX6+6ujodOXJEvb29WrRokYaGhuyasrIytba26sCBAzpw4IBaW1u1dOnST/ASAQBATLI+BUlWfX29vT48PGx5vV7riSeesLd9+OGHltvttp555hnLsizrgw8+sBISEqy6ujq75r333rOuu+4668CBA5ZlWdapU6csSdYbb7xh17z++uuWJOuPf/zjNfXm9/stSZbf7/80LxHABHIhMGDduOEX1o0bfmFdCAxEux1gQhrN8Tusc2La2trU0dGh4uJie5vL5dLcuXPV1NQkSWppadHAwEBIjc/nU05Ojl3z+uuvy+12a9asWXbNF77wBbndbrvmUoFAQN3d3SELAACIXWENMR0dHZIkj8cTst3j8diPdXR0yOl0avLkyVesycjIGLH/jIwMu+ZSVVVV9vwZt9utzMzMT/16AADA+BWRbyc5HI6QdcuyRmy71KU1l6u/0n42bdokv99vL+3t7Z+gcwAAYIqwhhiv1ytJI0ZLOjs77dEZr9erYDCorq6uK9b8+c9/HrH/v/zlLyNGeS5yuVxKTU0NWQAAQOwKa4jJysqS1+tVQ0ODvS0YDKqxsVEFBQWSpLy8PCUkJITUnD9/XidOnLBrZs+eLb/fr6NHj9o1v/vd7+T3++0aAAAwscWP9gm9vb1699137fW2tja1trYqLS1N06ZNU3l5uSorK5Wdna3s7GxVVlYqKSlJZWVlkiS3263ly5dr7dq1Sk9PV1pamtatW6fc3FwVFRVJkqZPn66vfOUruv/++/WjH/1IkvSd73xHixYt0mc+85lwvG4AAGC4UYeYY8eO6ctf/rK9vmbNGknSsmXLtHv3bq1fv179/f1auXKlurq6NGvWLB08eFApKSn2c7Zv3674+HiVlpaqv79fhYWF2r17t+Li4uyan/zkJ3rooYfsbzGVlJR87LVpAADAxOOwLMuKdhOR0N3dLbfbLb/fz/wYANekLzioGY+8Ikk6tXWBkpyj/pwH4FMazfGbeycBAAAjEWIAAICRCDEAAMBIhBgAAGAk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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "h.projectX()" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "id": "eda1ea36-208e-411c-bbc2-f5220014487c", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "h.projectY()" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "id": "ee7157e9-4292-431d-9c06-ae2ae5f95098", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "h[0:5:project, 0:5:project]" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "id": "fdfe2d93-d7c0-4571-9b91-dfac1ed6e74c", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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u3btUl9fH5GygsbGxvSd73xHZ86c0apVq2I9TsKqqamx/11UVKTS0lJ98pOf1KlTp7Rv376bPg+BIikvL09JSUlLjpZMTk4uOaoCxJO6ujq98MILevXVV7V27dpYj5OQUlNT9alPfUqStHHjRg0MDOiHP/yh/umf/inGkyWOwcFBTU5Oqri42N63uLioV199Va2trQqFQkpKSorhhIkpMzNTRUVFeuONN2Ly/TkHRe//gCkuLlZPT0/E/p6eHpWVlcVoKmD5LMvS448/rh//+Mf62c9+pvz8/FiPdMuwLEuhUCjWYySUiooKDQ8Pa2hoyN42btyohx9+WENDQ8TJDRIKhfTrX/9ad9xxR0y+P0dQ/mDfvn165JFHtHHjRpWWlurEiRO6ePGiHnvssViPllBmZ2f1m9/8xr48OjqqoaEh5eTk6M4774zhZIll79696uzs1E9+8hNlZWXZRwedTqfS09NjPF3i+O53v6uamhp5vV7NzMyoq6tLr7zyik6fPh3r0RJKVlbWkvOnMjMzlZuby3lVK6i+vl5bt27VnXfeqcnJSR06dEjT09PatWtXTOYhUP7g61//ut59910dPHhQExMTKiws1E9/+lPdddddsR4toZw/f15f/vKX7csfvK65a9cutbe3x2iqxPPB2+XLy8sj9p88eVKPPvrozR8oQb399tt65JFHNDExIafTqfXr1+v06dOqqqqK9WhA1MbHx/XNb35T77zzjm6//XZ97nOf07lz52L2PMjfQQEAAMbhHBQAAGAcAgUAABiHQAEAAMYhUAAAgHEIFAAAYBwCBQAAGIdAAQAAxiFQAACAcQgUAABgHAIFAAAYh0ABAADGIVAAAIBx/g/KoNPh5UJQAgAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "h[0:5:project, 0:5]" ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "id": "80d48a32-5e05-43bf-b5af-3d9da0ab0800", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "h[0:5, 0:5:project]" ] diff --git a/src/babyyoda/grogu/histo2d_v2.py b/src/babyyoda/grogu/histo2d_v2.py index 93e2df8..221da78 100644 --- a/src/babyyoda/grogu/histo2d_v2.py +++ b/src/babyyoda/grogu/histo2d_v2.py @@ -117,6 +117,12 @@ def xMin(self): def xMax(self): return self.d_xmax + def xMid(self): + return (self.d_xmin + self.d_xmax) / 2 + + def yMid(self): + return (self.d_ymin + self.d_ymax) / 2 + def yMin(self): return self.d_ymin @@ -154,6 +160,23 @@ def crossTerm(self, x, y): def numEntries(self): return self.d_numentries + def __add__(self, other): + assert isinstance(other, GROGU_HISTO2D_V2.Bin) + return GROGU_HISTO2D_V2.Bin( + d_xmin=self.d_xmin, + d_xmax=self.d_xmax, + d_ymin=self.d_ymin, + d_ymax=self.d_ymax, + d_sumw=self.d_sumw + other.d_sumw, + d_sumw2=self.d_sumw2 + other.d_sumw2, + d_sumwx=self.d_sumwx + other.d_sumwx, + d_sumwx2=self.d_sumwx2 + other.d_sumwx2, + d_sumwy=self.d_sumwy + other.d_sumwy, + d_sumwy2=self.d_sumwy2 + other.d_sumwy2, + d_sumwxy=self.d_sumwxy + other.d_sumwxy, + d_numentries=self.d_numentries + other.d_numentries, + ) + def to_string(self, label=None) -> str: if label is None: return ( @@ -239,6 +262,45 @@ def binAt(self, x, y): return b return None + def rebinXYTo(self, xedges: list[float], yedges: list[float]): + own_xedges = self.xEdges() + for e in xedges: + assert e in own_xedges, f"Edge {e} not found in own edges {own_xedges}" + own_yedges = self.yEdges() + for e in yedges: + assert e in own_yedges, f"Edge {e} not found in own edges {own_yedges}" + + new_bins = [] + for j in range(len(yedges) - 1): + for i in range(len(xedges) - 1): + new_bins.append( + GROGU_HISTO2D_V2.Bin( + d_xmin=xedges[i], + d_xmax=xedges[i + 1], + d_ymin=yedges[j], + d_ymax=yedges[j + 1], + ) + ) + for b in self.bins(): + for j in range(len(yedges) - 1): + for i in range(len(xedges) - 1): + if ( + xedges[i] <= b.xMid() + and b.xMid() <= xedges[i + 1] + and yedges[j] <= b.yMid() + and b.yMid() <= yedges[j + 1] + ): + new_bins[i + j * (len(xedges) - 1)] += b + self.d_bins = new_bins + + assert len(self.d_bins) == (len(self.xEdges()) - 1) * (len(self.yEdges()) - 1) + + def rebinXTo(self, xedges: list[float]): + self.rebinXYTo(xedges, self.yEdges()) + + def rebinYTo(self, yedges: list[float]): + self.rebinXYTo(self.xEdges(), yedges) + def get_projector(self): return Histo1D_v2 diff --git a/src/babyyoda/grogu/histo2d_v3.py b/src/babyyoda/grogu/histo2d_v3.py index 7d4dc11..4d8abea 100644 --- a/src/babyyoda/grogu/histo2d_v3.py +++ b/src/babyyoda/grogu/histo2d_v3.py @@ -6,9 +6,26 @@ import numpy as np from babyyoda.grogu.analysis_object import GROGU_ANALYSIS_OBJECT +from babyyoda.grogu.histo1d_v3 import Histo1D_v3 from babyyoda.histo2d import UHIHisto2D +def to_index(x, y, xedges, yedges): + # get ix and iy to map to correct bin + fix = None + for ix, xEdge in enumerate([*xedges, sys.float_info.max]): + fix = ix + if x < xEdge: + break + fiy = None + for iy, yEdge in enumerate([*yedges, sys.float_info.max]): + fiy = iy + if y < yEdge: + break + # Also fill overflow bins + return fiy * (len(xedges) + 1) + fix + + def Histo2D_v3( nxbins: int, xstart: float, @@ -126,6 +143,19 @@ def crossTerm(self, x, y): def numEntries(self): return self.d_numentries + def __add__(self, other: "GROGU_HISTO2D_V3.Bin") -> "GROGU_HISTO2D_V3.Bin": + assert isinstance(other, GROGU_HISTO2D_V3.Bin) + return GROGU_HISTO2D_V3.Bin( + d_sumw=self.d_sumw + other.d_sumw, + d_sumw2=self.d_sumw2 + other.d_sumw2, + d_sumwx=self.d_sumwx + other.d_sumwx, + d_sumwx2=self.d_sumwx2 + other.d_sumwx2, + d_sumwy=self.d_sumwy + other.d_sumwy, + d_sumwy2=self.d_sumwy2 + other.d_sumwy2, + d_sumwxy=self.d_sumwxy + other.d_sumwxy, + d_numentries=self.d_numentries + other.d_numentries, + ) + def to_string(self) -> str: return ( f"{self.d_sumw:<13.6e}\t{self.d_sumw2:<13.6e}\t{self.d_sumwx:<13.6e}\t{self.d_sumwx2:<13.6e}\t" @@ -171,19 +201,8 @@ def yEdges(self): return self.d_edges[1] def fill(self, x, y, weight=1.0, fraction=1.0): - # get ix and iy to map to correct bin - fix = None - for ix, xEdge in enumerate([*self.xEdges(), sys.float_info.max]): - fix = ix - if x < xEdge: - break - fiy = None - for iy, yEdge in enumerate([*self.yEdges(), sys.float_info.max]): - fiy = iy - if y < yEdge: - break # Also fill overflow bins - self.bins(True)[fiy * (len(self.xEdges()) + 1) + fix].fill( + self.bins(True)[to_index(x, y, self.xEdges(), self.yEdges())].fill( x, y, weight, fraction ) @@ -213,6 +232,72 @@ def bins(self, includeOverflows=False): .flatten() ) + def rebinXYTo(self, xedges: list[float], yedges: list[float]): + own_xedges = self.xEdges() + for e in xedges: + assert e in own_xedges, f"Edge {e} not found in own edges {own_xedges}" + own_yedges = self.yEdges() + for e in yedges: + assert e in own_yedges, f"Edge {e} not found in own edges {own_yedges}" + + # new bins inclusive of overflow and underflow + new_bins = [] + for _ in range((len(xedges) + 1) * (len(yedges) + 1)): + new_bins.append(GROGU_HISTO2D_V3.Bin()) + new_hist = np.array(new_bins).reshape((len(yedges) + 1, len(xedges) + 1)) + old_hist = np.array(self.d_bins).reshape( + (len(self.yEdges()) + 1, len(self.xEdges()) + 1) + ) + old_xedges = np.array(self.xEdges()) + old_yedges = np.array(self.yEdges()) + new_xedges = np.array(xedges) + new_yedges = np.array(yedges) + + for i in range(len(xedges) + 1): + for j in range(len(yedges) + 1): + if i == 0: + x_mask = old_xedges <= new_xedges[0] + x_mask = np.concatenate((x_mask, [False])) # skip overflow + elif i == len(xedges): + x_mask = old_xedges > new_xedges[-1] + x_mask = np.concatenate((x_mask, [True])) # keep underflow + # x_mask = x_mask + [True] # keep overflow + else: + x_mask = (old_xedges > new_xedges[i - 1]) & ( + old_xedges <= new_xedges[i] + ) + x_mask = np.concatenate((x_mask, [False])) # skip overflow + # x_mask = x_mask + [False] # skip overflow + if j == 0: + y_mask = old_yedges <= new_yedges[0] + y_mask = np.concatenate((y_mask, [False])) # skip overflow + # y_mask = y_mask + [False] # skip overflow + elif j == len(yedges): + y_mask = old_yedges > new_yedges[-1] + y_mask = np.concatenate((y_mask, [True])) # keep underflow + # y_mask = y_mask + [True] # keep overflow + else: + y_mask = (old_yedges > new_yedges[j - 1]) & ( + old_yedges <= new_yedges[j] + ) + y_mask = np.concatenate((y_mask, [False])) # skip overflow + # y_mask = y_mask + [False] # skip overflow + new_hist[j, i] = old_hist[y_mask, :][:, x_mask].sum() + + self.d_bins = new_hist.flatten() + self.d_edges = [xedges, yedges] + + assert len(self.d_bins) == (len(xedges) + 1) * (len(yedges) + 1) + + def rebinXTo(self, xedges: list[float]): + self.rebinXYTo(xedges, self.yEdges()) + + def rebinYTo(self, yedges: list[float]): + self.rebinXYTo(self.xEdges(), yedges) + + def get_projector(self): + return Histo1D_v3 + def to_string(self) -> str: """Convert a YODA_HISTO2D_V3 object to a formatted string.""" header = ( diff --git a/src/babyyoda/histo1d.py b/src/babyyoda/histo1d.py index 61de4be..9917204 100644 --- a/src/babyyoda/histo1d.py +++ b/src/babyyoda/histo1d.py @@ -5,7 +5,7 @@ from babyyoda.analysisobject import UHIAnalysisObject from babyyoda.counter import UHICounter -from babyyoda.util import loc, overflow, project, rebin, underflow +from babyyoda.util import loc, overflow, project, rebin, rebinBy_to_rebinTo, underflow def set_bin1d(target, source): @@ -160,42 +160,8 @@ def integral(self, includeOverflows=True): return sum(b.sumW() for b in self.bins(includeOverflows=includeOverflows)) def rebinXBy(self, factor: int, begin=1, end=sys.maxsize): - # Just compute the new edges and call rebinXTo - start = begin - 1 - stop = end - if start is None: - start = 0 - stop = len(self.bins()) if stop >= sys.maxsize else stop - 1 - new_edges = [] - # new_bins = [] - # new_bins += [self.underflow()] - for i in range(start): - # new_bins.append(self.bins()[i].clone()) - new_edges.append(self.xEdges()[i]) - new_edges.append(self.xEdges()[i + 1]) - last = None - for i in range(start, stop, factor): - if i + factor <= len(self.bins()): - xmin = self.xEdges()[i] - xmax = self.xEdges()[i + 1] - # nb = GROGU_HISTO1D_V3.Bin() - for j in range(factor): - last = i + j - # nb += self.bins()[i + j] - xmin = min(xmin, self.xEdges()[i + j]) - xmax = max(xmax, self.xEdges()[i + j + 1]) - # new_bins.append(nb) - # add both edges - new_edges.append(xmin) - new_edges.append(xmax) - for j in range(last + 1, len(self.bins())): - # new_bins.append(self.bins()[j].clone()) - new_edges.append(self.xEdges()[j]) - new_edges.append(self.xEdges()[j + 1]) - # new_bins += [self.overflow()] - # self.d_bins = new_bins - # drop duplicate edges - self.rebinXTo(list(set(new_edges))) + new_edges = rebinBy_to_rebinTo(self.xEdges(), factor, begin, end) + self.rebinXTo(new_edges) def rebinBy(self, *args, **kwargs): self.rebinXBy(*args, **kwargs) diff --git a/src/babyyoda/histo2d.py b/src/babyyoda/histo2d.py index 4493441..da18275 100644 --- a/src/babyyoda/histo2d.py +++ b/src/babyyoda/histo2d.py @@ -4,7 +4,7 @@ import numpy as np from babyyoda.analysisobject import UHIAnalysisObject -from babyyoda.util import loc, overflow, project, rebin, underflow +from babyyoda.util import loc, overflow, project, rebin, rebinBy_to_rebinTo, underflow def set_bin2d(target, source): @@ -161,6 +161,24 @@ def yMean(self, includeOverflows=True): def integral(self, includeOverflows=True): return sum(b.sumW() for b in self.bins(includeOverflows=includeOverflows)) + def rebinXBy(self, factor: int, begin=1, end=sys.maxsize): + new_edges = rebinBy_to_rebinTo(self.xEdges(), factor, begin, end) + self.rebinXTo(new_edges) + + def rebinYBy(self, factor: int, begin=1, end=sys.maxsize): + new_edges = rebinBy_to_rebinTo(self.yEdges(), factor, begin, end) + self.rebinYTo(new_edges) + + def dVols(self): + ret = [] + for iy in range(len(self.yMins())): + for ix in range(len(self.xMins())): + ret.append( + (self.xMaxs()[ix] - self.xMins()[ix]) + * (self.yMaxs()[iy] - self.yMins()[iy]) + ) + return np.array(ret) + ######################################################## # Generic UHI code ######################################################## @@ -359,7 +377,9 @@ def plot(self, *args, binwnorm=True, **kwargs): def temp_values(): return ( - np.array([b.sumW() / b.dVol() for b in self.bins()]) + np.array( + [b.sumW() / vol for b, vol in zip(self.bins(), self.dVols())] + ) .reshape((len(self.axes[1]), len(self.axes[0]))) .T ) diff --git a/src/babyyoda/test.py b/src/babyyoda/test.py index cca902a..c2ad4bf 100644 --- a/src/babyyoda/test.py +++ b/src/babyyoda/test.py @@ -111,7 +111,7 @@ def assert_bin2d(gb, yb): def assert_value2d(gb, yb): - assert gb.sumW() == yb.sumW() + assert gb.sumW() == yb.sumW(), f"{gb.sumW()} != {yb.sumW()}" assert gb.sumW2() == yb.sumW2() assert gb.sumWX() == yb.sumWX(), f"{gb.sumWX()} != {yb.sumWX()}" assert gb.sumWX2() == yb.sumWX2() diff --git a/src/babyyoda/util.py b/src/babyyoda/util.py index 783e769..e17d7ba 100644 --- a/src/babyyoda/util.py +++ b/src/babyyoda/util.py @@ -1,5 +1,6 @@ import gzip import inspect +import sys class loc: @@ -78,3 +79,40 @@ def has_own_method(cls, method_name): # Compare the underlying function (__func__) if both exist return cls_method.__func__ is not parent_method.__func__ + + +def rebinBy_to_rebinTo(edges: list[float], factor: int, begin=1, end=sys.maxsize): + # Just compute the new edges and call rebinXTo + start = begin - 1 + stop = end + if start is None: + start = 0 + stop = (len(edges) - 1) if stop >= sys.maxsize else stop - 1 + new_edges = [] + # new_bins = [] + # new_bins += [self.underflow()] + for i in range(start): + # new_bins.append(self.bins()[i].clone()) + new_edges.append(edges[i]) + new_edges.append(edges[i + 1]) + last = None + for i in range(start, stop, factor): + if i + factor <= (len(edges) - 1): + xmin = edges[i] + xmax = edges[i + 1] + # nb = GROGU_HISTO1D_V3.Bin() + for j in range(factor): + last = i + j + # nb += self.bins()[i + j] + xmin = min(xmin, edges[i + j]) + xmax = max(xmax, edges[i + j + 1]) + # new_bins.append(nb) + # add both edges + new_edges.append(xmin) + new_edges.append(xmax) + for j in range(last + 1, (len(edges) - 1)): + # new_bins.append(self.bins()[j].clone()) + new_edges.append(edges[j]) + new_edges.append(edges[j + 1]) + # no duplicates + return list(set(new_edges)) diff --git a/tests/babyyoda/test_histo2d_rebin.py b/tests/babyyoda/test_histo2d_rebin.py new file mode 100644 index 0000000..55a62ad --- /dev/null +++ b/tests/babyyoda/test_histo2d_rebin.py @@ -0,0 +1,143 @@ +import pytest + +from babyyoda import grogu +from babyyoda.test import assert_histo2d + +# YODA1 does not support histo2d overflows +pytest.importorskip("yoda", minversion="2.0.0") + +try: + from babyyoda import yoda + + yoda_available = True + # version dependence possible here +except ImportError: + import babyyoda.grogu as yoda + + yoda_available = False + + +# TODO use metafunction fixtures instead fo many pytest.mark + + +def create_histo(backend): + h = backend(10, 0, 10, 20, 0, 20, title="test") + w = 0 + for i in range(-10, 22): + for j in range(-10, 22): + w += 1 + h.fill(i, j, w) + # do we already want to use HISTO1D here? + return h + + +@pytest.mark.parametrize( + "factory1", [grogu.Histo2D, grogu.Histo2D_v2, grogu.Histo2D_v3, yoda.Histo2D] +) +@pytest.mark.parametrize( + "factory2", [grogu.Histo2D, grogu.Histo2D_v2, grogu.Histo2D_v3, yoda.Histo2D] +) +def test_histos_rebinXBy(factory1, factory2): + h1 = create_histo(factory1) + h2 = create_histo(factory2) + + h1.rebinXBy(2) + h2.rebinXBy(2) + + assert_histo2d(h1, h2, includeFlow=False) + + +@pytest.mark.parametrize( + "factory1", [grogu.Histo2D, grogu.Histo2D_v2, grogu.Histo2D_v3, yoda.Histo2D] +) +@pytest.mark.parametrize( + "factory2", [grogu.Histo2D, grogu.Histo2D_v2, grogu.Histo2D_v3, yoda.Histo2D] +) +def test_histos_rebinXByRange(factory1, factory2): + h1 = create_histo(factory1) + h2 = create_histo(factory2) + h1.rebinXBy(3, 5, 11) + h2.rebinXBy(3, 5, 11) + + assert_histo2d(h1, h2, includeFlow=False) + + +@pytest.mark.parametrize( + "factory1", [grogu.Histo2D, grogu.Histo2D_v2, grogu.Histo2D_v3, yoda.Histo2D] +) +@pytest.mark.parametrize( + "factory2", [grogu.Histo2D, grogu.Histo2D_v2, grogu.Histo2D_v3, yoda.Histo2D] +) +def test_histos_rebinYBy(factory1, factory2): + h1 = create_histo(factory1) + h2 = create_histo(factory2) + + h1.rebinYBy(3) + h2.rebinYBy(3) + + assert_histo2d(h1, h2, includeFlow=False) + + +@pytest.mark.parametrize( + "factory1", [grogu.Histo2D, grogu.Histo2D_v2, grogu.Histo2D_v3, yoda.Histo2D] +) +@pytest.mark.parametrize( + "factory2", [grogu.Histo2D, grogu.Histo2D_v2, grogu.Histo2D_v3, yoda.Histo2D] +) +def test_histos_rebinYByRange(factory1, factory2): + h1 = create_histo(factory1) + h2 = create_histo(factory2) + h1.rebinYBy(3, 5, 11) + h2.rebinYBy(3, 5, 11) + + assert_histo2d(h1, h2, includeFlow=False) + + # + # Flow section + # + + +@pytest.mark.parametrize("factory1", [grogu.Histo2D, grogu.Histo2D_v3, yoda.Histo2D]) +@pytest.mark.parametrize("factory2", [grogu.Histo2D, grogu.Histo2D_v3, yoda.Histo2D]) +def test_histos_rebinYByFlow(factory1, factory2): + h1 = create_histo(factory1) + h2 = create_histo(factory2) + + h1.rebinYBy(2) + h2.rebinYBy(2) + + assert_histo2d(h1, h2, includeFlow=True) + + +@pytest.mark.parametrize("factory1", [grogu.Histo2D, grogu.Histo2D_v3, yoda.Histo2D]) +@pytest.mark.parametrize("factory2", [grogu.Histo2D, grogu.Histo2D_v3, yoda.Histo2D]) +def test_histos_rebinYByRangeFlow(factory1, factory2): + h1 = create_histo(factory1) + h2 = create_histo(factory2) + h1.rebinYBy(3, 5, 11) + h2.rebinYBy(3, 5, 11) + + assert_histo2d(h1, h2, includeFlow=True) + + +@pytest.mark.parametrize("factory1", [grogu.Histo2D, grogu.Histo2D_v3, yoda.Histo2D]) +@pytest.mark.parametrize("factory2", [grogu.Histo2D, grogu.Histo2D_v3, yoda.Histo2D]) +def test_histos_rebinXByFlow(factory1, factory2): + h1 = create_histo(factory1) + h2 = create_histo(factory2) + + h1.rebinXBy(4) + h2.rebinXBy(4) + + assert_histo2d(h1, h2, includeFlow=True) + + +@pytest.mark.parametrize("factory1", [grogu.Histo2D, grogu.Histo2D_v3, yoda.Histo2D]) +@pytest.mark.parametrize("factory2", [grogu.Histo2D, grogu.Histo2D_v3, yoda.Histo2D]) +def test_histos_rebinXByRangeFlow(factory1, factory2): + h1 = create_histo(factory1) + h2 = create_histo(factory2) + h1.rebinXBy(3, 5, 7) + h2.rebinXBy(3, 5, 7) + + assert_histo2d(h1, h2, includeFlow=True)