diff --git a/notebooks/interactive_triangle_shapes.ipynb b/notebooks/interactive_triangle_shapes.ipynb index 56c1116..e0f5bd3 100644 --- a/notebooks/interactive_triangle_shapes.ipynb +++ b/notebooks/interactive_triangle_shapes.ipynb @@ -4,14 +4,306 @@ "cell_type": "code", "execution_count": 1, "metadata": { - "collapsed": false + "collapsed": true }, "outputs": [], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "from ipywidgets import interact, interactive, fixed\n", - "import numpy as np" + "import numpy as np\n", + "import palettable" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "10\n" + ] + } + ], + "source": [ + "colors = palettable.colorbrewer.qualitative.Paired_10.hex_colors\n", + "print len(colors)" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def drawTriangleScatter(min_r,max_r,min_u,max_u,min_v,max_v,color=0,num=20):\n", + " test = np.array(np.meshgrid(np.linspace(min_r,max_r,num=num),\n", + " np.linspace(min_u,max_u,num=num),\n", + " np.linspace(min_v,max_v,num=10*num),))\n", + " d2 = test[0,:,:,:]\n", + " d3 = test[0,:,:,:]*test[1,:,:,:]\n", + " d1 = np.abs(test[2,:,:,:])*d3+d2 \n", + " cosine = (d2**2 + d3**2 - d1**2)/(2*d2*d3+1e-9)\n", + " sine = np.sqrt(1-cosine**2)\n", + " points = d3*cosine,d3*sine\n", + " plt.scatter(np.array(points).reshape(2,-1)[0,:],np.array(points).reshape(2,-1)[1,:],color=colors[color],alpha=.1,marker='.')\n", + " #plt.plot([0,1],[0,0],color='k')\n", + " #plt.plot([0,-.2,1],[0,.6,0],color='k',linestyle='--')\n", + " plt.plot(1,0,color='r',marker='s')\n", + " plt.xlim(-1.5,1.1)\n", + " plt.ylim(-.2,1.5)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "drawTriangleScatter(.99,1.01,.3,1,0,.2, color=0,num=20)\n", + "drawTriangleScatter(.99,1.01,.3,1,.2,.4,color=1,num=20)\n", + "drawTriangleScatter(.99,1.01,.3,1,.4,.6,color=2,num=20)\n", + "drawTriangleScatter(.99,1.01,.3,1,.6,.8,color=3,num=20)\n", + "drawTriangleScatter(.99,1.01,.3,1,.8,1, color=4,num=100)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\nAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "drawTriangleScatter(.8,1.2,.3,1,0,.2, color=0,num=20)\n", + "drawTriangleScatter(.8,1.2,.3,1,.2,.4,color=1,num=20)\n", + "drawTriangleScatter(.8,1.2,.3,1,.4,.6,color=2,num=20)\n", + "drawTriangleScatter(.8,1.2,.3,1,.6,.8,color=3,num=20)\n", + "drawTriangleScatter(.8,1.2,.3,1,.8,1, color=4,num=100)" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 49, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\nFCx/AAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "drawTriangleScatter(.8,1.2,.3,1,0,.2, color=0,num=20)\n", + "drawTriangleScatter(.8,1.2,.3,1,.2,.4,color=1,num=20)\n", + "drawTriangleScatter(.8,1.2,.3,1,.4,.6,color=2,num=20)\n", + "drawTriangleScatter(.8,1.2,.3,1,.6,.8,color=3,num=20)\n", + "drawTriangleScatter(.8,1.2,.3,1,.8,1, color=4,num=100)\n", + "plt.plot([.2,1],[0,0],color='k')\n", + "plt.plot([-.2,.2],[0,0],color='Grey',linestyle=':')\n", + "plt.plot([-.2,-.05,1],[0,.75,0],color='k',linestyle='--')\n", + "plt.plot([.2,-.05,1],[0,.75,0],color='k',linestyle='--')\n", + "plt.plot(0,0,marker='.',color='Grey')\n", + "# drawTriangleScatter(.8,1.2,.3,1,.6,.8,color=3,num=20)\n", + "# drawTriangleScatter(.8,1.2,.3,1,.4,.6,color=2,num=20)\n", + "# drawTriangleScatter(.8,1.2,.3,1,.2,.4,color=1,num=20)\n", + "# drawTriangleScatter(.8,1.2,.3,1,0,.2, color=0,num=20)" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 52, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n3QAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "drawTriangleScatter(.8,1.2,.3,1,0,.2, color=0,num=20)\n", + "drawTriangleScatter(.8,1.2,.3,1,.2,.4,color=1,num=20)\n", + "drawTriangleScatter(.8,1.2,.3,1,.4,.6,color=2,num=20)\n", + "drawTriangleScatter(.8,1.2,.3,1,.6,.8,color=3,num=20)\n", + "drawTriangleScatter(.8,1.2,.3,1,.8,1, color=4,num=100)\n", + "plt.plot([0,1],[0,0],color='k')\n", + "plt.plot([0,-1,1],[0,.1,0],color='k')\n", + "plt.plot([0,.25,1],[0,.8,0],color='k')\n", + "plt.plot(0,0,marker='.',color='k')\n", + "# drawTriangleScatter(.8,1.2,.3,1,.6,.8,color=3,num=20)\n", + "# drawTriangleScatter(.8,1.2,.3,1,.4,.6,color=2,num=20)\n", + "# drawTriangleScatter(.8,1.2,.3,1,.2,.4,color=1,num=20)\n", + "# drawTriangleScatter(.8,1.2,.3,1,0,.2, color=0,num=20)" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\nlmNchB8AAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "drawTriangleScatter(.8,1.2,.3,1,0,.2,color=0)\n", + "drawTriangleScatter(.8,1.2,.3,1,.2,.4,color=1)\n", + "drawTriangleScatter(.8,1.2,.3,1,.4,.6,color=2)\n", + "drawTriangleScatter(.8,1.2,.3,1,.6,.8,color=3)\n", + "drawTriangleScatter(.8,1.2,.3,1,.8,1,color=4)\n", + "drawTriangleScatter(1.6,2.4,.8,1,0,.2,color=5)\n", + "drawTriangleScatter(1.6,2.4,.8,1,.2,.4,color=6)\n", + "drawTriangleScatter(1.6,2.4,.8,1,.4,.6,color=7)\n", + "drawTriangleScatter(1.6,2.4,.8,1,.6,.8,color=8)\n", + "drawTriangleScatter(1.6,2.4,.8,1,.8,1,color=9)" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def drawTriangleBins(min_r,max_r,min_u,max_u,min_v,max_v):\n", + " points = []\n", + " def getPoint(r,u,v):\n", + " d2 = float(r)\n", + " d3 = u*r\n", + " d1 = np.abs(v)*d3+d2 \n", + " cosine = (d2**2 + d3**2 - d1**2)/(2*d2*d3+1e-9)\n", + " sine = np.sqrt(1-cosine**2)\n", + " points.append([d3*cosine,d3*sine])\n", + " #getPoint(min_u,max_r,max_v)\n", + " #getPoint(min_u,min_r,min_v)\n", + " #getPoint(max_u,min_r,min_v)\n", + " #getPoint(max_u,max_r,max_v)\n", + " getPoint(min_u,min_r,min_v)\n", + " getPoint(min_u,min_r,max_v)\n", + " getPoint(min_u,max_r,min_v)\n", + " getPoint(max_u,min_r,min_v)\n", + " getPoint(min_u,max_r,max_v)\n", + " getPoint(max_u,max_r,min_v)\n", + " getPoint(max_u,min_r,max_v)\n", + " getPoint(max_u,max_r,max_v)\n", + " #print points\n", + " p = plt.Polygon(points,closed=False)\n", + " ax = plt.gca()\n", + " ax.add_patch(p)\n", + " plt.xlim(-1,1.1)\n", + " plt.ylim(-.6,1.6)" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYYAAAD8CAYAAABzTgP2AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAH05JREFUeJzt3X2QHPV95/H3Z1crCUkrgaSVhCVkQSzLEYnB3B5xfFQM\nseMCykT2Jc7B+Rzi2KUiBY5x+WxDkrId+yrnSyp+whgiOwRyZwQOCFt2BAQRHJ4M0upZAgktQiAJ\nPawe0NNqn7/3x/TK06t9mN3pmdldfV5VU9vT/fv1fDUz2s9296+7FRGYmZl1q6p0AWZmNrw4GMzM\nLMXBYGZmKQ4GMzNLcTCYmVmKg8HMzFIcDGZmluJgMDOzFAeDmZmljKl0AUMxffr0mDdvXqXLMDMb\nUdasWXMwIuoGajcig2HevHk0NDRUugwzsxFF0uuFtPOuJDMzS3EwmJlZioPBzMxSHAxmZpbiYDAz\ns5RMgkHSPZIOSNrcx/IrJR2VtD55fDlv2dWStklqlHRbFvWYmdnQZbXFcC9w9QBtnomIS5PH1wAk\nVQN3AtcAC4EbJC3MqCYzMxuCTIIhIp4GDg+h6+VAY0TsiIg24AFgURY1mZnZ0JTzGMP7JG2U9Kik\ni5N5s4FdeW12J/POIGmxpAZJDU1NTaWu1czsrFWuYFgLzI2IdwN3AD8Z7AoiYklE1EdEfV3dgGd0\nm5nZEJUlGCLiWEScSKZXADWSpgN7gAvyms5J5pmZWYWUJRgkzZKkZPry5HUPAauB+ZIulDQWuB5Y\nXo6azMysd5lcRE/SUuBKYLqk3cBXgBqAiLgb+EPgzyR1AKeA6yMigA5JtwCPA9XAPRGxJYuazMxs\naJT7/Tyy1NfXh6+uamY2OJLWRET9QO185rOZmaU4GMzMLMXBYGZmKQ4GMzNLcTCYmVmKg8HMzFIc\nDGZmluJgMDOzFAeDmZmlOBjMzCzFwWBmZikOBjMzS3EwmJlZioPBzMxSHAxmZpaSSTBIukfSAUmb\n+1j+cUkbJW2S9LykS/KW7Uzmr5fkmyyYmVVYVlsM9wJX97P8NeD9EfGbwNeBJT2WXxURlxZyAwkz\nMyutTG7tGRFPS5rXz/Ln856+AMzJ4nXNzCx7lTjG8Cng0bznAayUtEbS4grUY2ZmeTLZYiiUpKvI\nBcMVebOviIg9kmYAT0jaGhFP99J3MbAYYO7cuWWp18zsbFS2LQZJ7wZ+CCyKiEPd8yNiT/LzAPAI\ncHlv/SNiSUTUR0R9XV1dOUo2MzsrlSUYJM0FlgGfiIhX8uZPlFTbPQ18COh1ZJOZmZVHJruSJC0F\nrgSmS9oNfAWoAYiIu4EvA9OA70sC6EhGIM0EHknmjQHuj4jHsqjJzMyGJqtRSTcMsPzTwKd7mb8D\nuOTMHmZmVik+89nMzFIcDGZmluJgMDOzFAeDmZmlOBjMzCzFwWBmZikOBjMzS3EwmJlZioPBzMxS\nHAxmZpbiYDAzsxQHg5mZpTgYzMwsxcFgZmYpDgYzM0txMJiZWUomwSDpHkkHJPV6W07lfFdSo6SN\nki7LW3a1pG3JstuyqMfMzIYuqy2Ge4Gr+1l+DTA/eSwG7gKQVA3cmSxfCNwgaWFGNZmZ2RBkEgwR\n8TRwuJ8mi4B/jpwXgHMlnQ9cDjRGxI6IaAMeSNqamVmFlOsYw2xgV97z3cm8vuabmVmFjJiDz5IW\nS2qQ1NDU1FTpcszMRq1yBcMe4IK853OSeX3NP0NELImI+oior6urK1mhZmZnu3IFw3Lgj5PRSe8F\njkbEXmA1MF/ShZLGAtcnbc3MrELGZLESSUuBK4HpknYDXwFqACLibmAFcC3QCDQDn0yWdUi6BXgc\nqAbuiYgtWdRkZmZDk0kwRMQNAywP4OY+lq0gFxxmZjYMjJiDz2ZmVh4OBjMzS3EwmJlZioPBzMxS\nHAxmZpbiYDAzsxQHg5mZpTgYzMwsxcFgZmYpDgYzM0txMJiZWYqDwczMUhwMZmaW4mAwM7MUB4OZ\nmaU4GIa5O57czvb9xytdhpmdRTIJBklXS9omqVHSbb0s/4Kk9cljs6ROSVOTZTslbUqWNWRRz2jx\nXONBvrXyFb748EY6OrsqXY6ZnSWKDgZJ1cCdwDXAQuAGSQvz20TE30XEpRFxKXA78B8RcTivyVXJ\n8vpi6xktmo63cuuD6+kKWPfGW9z64HpeevNYpcsys7NAFlsMlwONEbEjItqAB4BF/bS/AViaweuO\nWl1dweceXE/T8dbT8558+QBfengjD63ZXcHKzOxskEUwzAZ25T3fncw7g6QJwNXAw3mzA1gpaY2k\nxX29iKTFkhokNTQ1NWVQ9vB151ONPNt4MDXvVHsnJ1o7+OryLdy+bBOtHZ0Vqs7MRrtyH3y+Dniu\nx26kK5JdTNcAN0v6nd46RsSSiKiPiPq6urpy1FoRq147zLef3N7rstcOnmTe9AksXfUGf3T3L9nz\n1qkyV2dmZ4MsgmEPcEHe8znJvN5cT4/dSBGxJ/l5AHiE3K6ps9Lhk238+dJ1dHZFn212Hmxm3rQJ\nbNh9lA9/9xme2T66t57MrPyyCIbVwHxJF0oaS+6X//KejSRNAd4P/DRv3kRJtd3TwIeAzRnUNOJE\nBJ//8Xr2HWvpt92J1g6qJMbXVHGkuZ0b71nFHU9uJ6LvMDEzG4yigyEiOoBbgMeBl4EfR8QWSTdJ\nuimv6UeBf4uIk3nzZgLPStoArAL+NSIeK7amkegHz+zgqW2F/fW/4+BJLpw+CYCugL9/4hU+fV8D\nR0+1l7JEMztLaCT+pVlfXx8NDaPnlIe1bxzhv/3DL2nvLPyzqB0/hsnja1LHGeZOncBd/+MyLn7b\nlFKUaWYjnKQ1hZwW4DOfK+zoqXY+c/+6QYUCwPGWDsbXVDG2+lcf4RuHm/mDu57nXxp29dPTzKx/\nDoYK++JDG4Y8uujVppNcVDcxNa+lvYsvPLTRQ1rNbMgcDBV073Ov8fiW/UWtY9+xFmZOHnfG/KWr\n3uBjHtJqZkPgYKiQzXuO8jePbi16PW81t1M7vobqKp2xbGMypPXpVzyk1cwK52CogOMt7dx8/1ra\nOrK5MF7jgRP8Wo9dSt2ONLfzJ/+0iu96SKuZFcjBUAG3L9vE64eaM13nwRNtTJ80ttdlXQHffOIV\nPnVfA0ebPaTVzPrnYCiz+198g59v3Jv5eg+fbOPcCWPRmXuUTvv3rQf48PeeYcubRzN/fTMbPRwM\nZbR13zG+9vMtJVv/q00nuGh677uUuu06fIr/+n0PaTWzvjkYyqS5rYObf7SWlvbS3XAnIndexLkT\navpt19rhIa1m1jcHQ5n81U8282rTyYEbFungiTamTez9WENPHtJqZr1xMJTBQ2t2s2xtXxeczd7O\nQ7krsBbCQ1rNrCcHQ4k1HjjBl39a3gvGdnYFJ9s6qR0/pqD2HtJqZvkcDCXU0t7JLfevpbmt/Pvx\nm463UjfpzDOi++IhrWbWzcFQQn/9s5fYuu94xV5/15Fm5px3zqD6eEirmTkYSmT5hjdZuuqNitbQ\n3hm0dXQxYWz1oPp1D2n9sYe0mp2VMgkGSVdL2iapUdJtvSy/UtJRSeuTx5cL7TsS7Tx4kr9YtqnS\nZQBw4HgrM2oL36XUrbWjiy8+tJHbl230kFazs0zRwSCpGrgTuAZYCNwgaWEvTZ+JiEuTx9cG2XfE\naOvo4palaznR2lHpUk5782gL508ZP6S+S1ft4mN3/5LdR7K9hIeZDV9ZbDFcDjRGxI6IaAMeABaV\noe+w9DcrXmbznmOVLiOlraOLrgjGjRnax71x91Guu+NZ/sNDWs3OClkEw2wgf2f07mReT++TtFHS\no5IuHmTfEeGxzfu49/mdlS6jV/uPtTJz8tC2GiA3pPWT/7SK76z0kFaz0a5cB5/XAnMj4t3AHcBP\nBrsCSYslNUhqaGoafn+57jrczBcf2lDpMvp14HgLdUM43tCtK+BbK1/hT+9d7SGtZqNYFsGwB7gg\n7/mcZN5pEXEsIk4k0yuAGknTC+mbt44lEVEfEfV1dXUZlJ2d9s4uPrN0Hcdahs9xhd60tHdRJaip\n7ucSrAV4alsTH/7eM2ze4yGtZqNRFsGwGpgv6UJJY4HrgeX5DSTNknIXhJZ0efK6hwrpOxL83ePb\nWL/rrUqXUZD9x1qZUTv0XUrddh0+xR/c5SGtZqNRYddM6EdEdEi6BXgcqAbuiYgtkm5Klt8N/CHw\nZ5I6gFPA9ZHbUd1r32JrKqenth7gB8/sqHQZg3KkuY2pE8dy+GRbUevpHtK67o0jfPX3L2bcmMGd\nL2Fmw5NG4oHE+vr6aGhoqHQZ7DvawrXffaboX7CVMGvyeJpOtNLZlc3n/+45U/j+xy9jznmFXbzP\nzMpP0pqIqB+onc98HqLOruDPl64bkaEAsO9YC7OKGKXUk4e0mo0eDoYh+tYTr7Bq5+FKl1GUt5rb\nmHJO/zf1GQwPaTUbHRwMQ/Ds9oN8/xeNlS6jaCfbOjmnprrf+0QPloe0mo18DoZBajreyq0Priej\nXfMVt+9YCzMzGKXUk4e0mo1cDoZB6OoKbn1wHQdPtFa6lEydaO1g0riiB6id4fSQ1tUe0mo2kjgY\nBuHOpxp5rvFQpcvI3InWDiaOK81Q09aOLr748EZue9hXaTUbKRwMBXpxxyG+/eT2SpdRMrkT34Z+\nuYyBPLB6F394l6/SajYSOBgKcPhkG599YH1mY/6Hq1NtnYO+qc9gbNpzlA/f8Sy/2HagZK9hZsVz\nMAwgIvj8j9ez71hLpUspueOtHUwswbGGfG81t/On967m2ytf8ZBWs2HKwTCAJU/v4KltZ89JW4dO\ntDJt4tiSvkZXwLdXbueTHtJqNiw5GPqx9o0j/N3j2ypdRll1Re7GPkO9qc9g/MJDWs2GJQdDH442\nt/OZ+9fRMcqPK/TmeGsHteNLu0upm4e0mg0/DoY+fOGhDex561Sly6iYI83tnDshu8tl9Kd7SOuX\nHtpIS7uHtJpVmoOhF//03Gv820v7K11GRXV2BZ1dwdjq8n1FHmzYxcfu/iW7DntIq1klORh62LT7\nKP97xdZKlzEsHG/pYFKZdil127TnKNd9z0NazSrJwZDneEs7tyxdS1tnV6VLGTaOnWov2/GGbh7S\nalZZmQSDpKslbZPUKOm2XpZ/XNJGSZskPS/pkrxlO5P56yVV9O47ty/bxOuHvBsjX/fB9zFVGV6C\ntQD5Q1rfah6Z97wwG6mKDgZJ1cCdwDXAQuAGSQt7NHsNeH9E/CbwdWBJj+VXRcSlhdxZqFR+9OLr\n/Hzj3kq9/LBWiV1K3X6xrYkP3/Gsh7SalVEWWwyXA40RsSMi2oAHgEX5DSLi+Yg4kjx9AZiTwetm\nZuu+Y3ztZy9Vuoxh7WRrBxNLeLmM/uw+khvS+uDqNyry+mZnmyyCYTaQPwh9dzKvL58CHs17HsBK\nSWskLc6gnkFpbuvg5h+tpbXDxxX6094ZVEmUeY/Saa0dXXzp4U0e0mpWBmU9+CzpKnLB8KW82VdE\nxKXkdkXdLOl3+ui7WFKDpIampuwuUfFXP9nMq00nM1vfaFaOaykNxENazUovi2DYA1yQ93xOMi9F\n0ruBHwKLIuL0TQ0iYk/y8wDwCLldU2eIiCURUR8R9XV1dRmUDf/SsItla88o1frR0t7J+JrKDWab\nck4N0yeNpcujlcxKJos//1YD8yVdSC4Qrgf+e34DSXOBZcAnIuKVvPkTgaqIOJ5Mfwj4WgY1Dajx\nwHG+snxLOV5qVGnvDMaNqUbqopS/m8eNqeIdMyaxYFYt75pVy4JZk1kws5ZZU8Zz+7KNHG/pKN2L\nm53lig6GiOiQdAvwOFAN3BMRWyTdlCy/G/gyMA34vnJ3nu9IRiDNBB5J5o0B7o+Ix4qtaSAt7Z3c\ncv86mtu8r3ooTrR2UDtuDMdbi//lXCV4+7SJLJhZyztPh0At86ZNpLqXAxr/0rCL91xwHr8xe0rR\nr21mvctkh3FErABW9Jh3d970p4FP99JvB3BJz/ml9tc/28LWfcfL/bKjSmtHF2PHVNE2iIP2M2rH\nsWBWLQtm1iZbApOZP3MS42sKG+20ff9xXtp7jK9cd/FQyzazAlT2SGIFLN/wJktX+UqexWrr7GLi\n2Gp6O/Vs0rgxvHPmpGT3T+7nu2bVcl4R93k41dbJPzy9g//1kd8YetFmVpCzKhh2HjzJXyzbVOky\nRo22zi4um3suc86bkHcsoJbZ555DsnswM995cjuf/cD8grcuzGzozppgaO3o5Ob713Iig/3iZxsJ\nZp97zulf/N0Hgi+qm0hXBEKMLeGNfX624U1++9emccHUCSV7DTP7lbMmGP7mX19my5vHKl3GsDd1\n4tjTxwC6H++cWcukfs5faG7rYGyJTol57eBJDhxv5bpL3laS9ZvZmc6KYHhs8z7u++XrlS5jWDmn\nppr5MyelDgS/c9YkZtSOH9K6TrV1ck7Gl8xoae9k2drdfO6D78x0vWbWv1EfDLsON/PFhzZUuoyK\nqa4S86ZN4F2zJp/+6/9ds2qZO3UCVRld30IS1VWivbOLmgxv7PP/XnidT19xUWZ1mllhRnUwtHd2\n8Zml6zh2lpwMdf6U8anhoAtm1fKOGZMYN6b0B2zHjqmipb2TrI4NP7X1AL/9a9OYUqbbi5rZr4zq\nYPjbx7ayftdblS4jc5PHj8k7BpA7ELxgZm3Ff4mOS8Kh2JFDuw43097ZxcVv80lsZpUwaoPh37fu\n54fPvlbpMooydkwV76ibxLtm5c4K7h4Sev6UcypdWq+6dyl1dkWvZy0Xoq2ji1/uOMQf1V8wcGMz\nK4lRGQz7jrbw+R9vKOm1fLJUJZg7dcLp/f8LZk1mwaxJzJs2kTEZ7rMvh5rqKlo7OqmuGtpWw7+9\ntI9Fl3oEklkljbpg6OwK/nzpOo40t1e6lF5NnzTuV+cDzPzVcNCsR/RUUk1V7lIZgz23Yd0bR/hP\nbz+vLMdEzKxvoy4YvvnENlbtPFzpMpg4tjq3+yfvQPC7Zk1mahGXhRgpqqqEIujqioJHFO0/1kJN\nddWw3U1mdjYZVcHwzPYm7vrFq2V9zZpqceH0iaevB9S9O2jOedlfFmIkqamuor2ziyoGfg86OrvY\nefAkv3XRtDJUZmYDGTXBcOB4C597cANdJTyu0H1ZiPzLQ180fVJJLwcxko0p8ED0pj1H+c/zppap\nKjMbyKgIhq6u4HMPrufgidZM1nfehJoeB4JreefMSdSO95j6wZAEEUREn1tPuw43844Zk3wSm9kw\nMiqC4XtPNfJc46GBG/YwvqaK+TNqe9wjoJYZkwd/WQjr3enhq7383j/W0s74mmoHrtkwk0kwSLoa\n+A65O7j9MCK+0WO5kuXXAs3An0TE2kL6DuSFHYf4zpPb+21TXSXePm1C6pf/glmTeXuGl4WwvlWJ\nMw5Ed3YFp9o6mekQNht2ig4GSdXAncDvAbuB1ZKWR8RLec2uAeYnj98C7gJ+q8C+fTp8so3PPrCO\nzrwDCzMnjzt9ILg7CN4xo/C7hFn2JBE9dikdO9XuUDAbprLYYrgcaExu04mkB4BFQP4v90XAP0dE\nAC9IOlfS+cC8Avr26nhLO/e/+Dof+PWZqRA4d8LoHw46ElVV5cIBcvfGmHyOdx+ZDVdZBMNsIP9e\nmbvJbRUM1GZ2gX0BkLQYWAwwfdZsVr68n1t+d35xlVtZdW8tjK2uOquH8poNdyNmnGVELImI+oio\nf/vsWXz0PXMqXZINkUPBbHjLYothD5B/xbM5ybxC2tQU0NfMzMooiy2G1cB8SRdKGgtcDyzv0WY5\n8MfKeS9wNCL2FtjXzMzKqOgthojokHQL8Di5Iaf3RMQWSTcly+8GVpAbqtpIbrjqJ/vrW2xNZmY2\ndIqRcm3qPPX19dHQ0FDpMszMRhRJayKifqB2I+bgs5mZlYeDwczMUhwMZmaW4mAwM7MUB4OZmaU4\nGMzMLMXBYGZmKQ4GMzNLcTCYmVmKg8HMzFIcDGZmluJgMDOzFAeDmZmlOBjMzCzFwWBmZikOBjMz\nSykqGCRNlfSEpO3Jz/N6aXOBpKckvSRpi6TP5i37qqQ9ktYnj2uLqcfMzIpX7BbDbcCTETEfeDJ5\n3lMH8PmIWAi8F7hZ0sK85d+KiEuTx4oi6zEzsyIVGwyLgPuS6fuAj/RsEBF7I2JtMn0ceBmYXeTr\nmplZiRQbDDMjYm8yvQ+Y2V9jSfOA9wAv5s3+jKSNku7pbVdUXt/FkhokNTQ1NRVZtpmZ9WXAYJC0\nUtLmXh6L8ttFRADRz3omAQ8Dt0bEsWT2XcBFwKXAXuDv++ofEUsioj4i6uvq6gb+l5mZ2ZCMGahB\nRHywr2WS9ks6PyL2SjofONBHuxpyofCjiFiWt+79eW1+APx8MMWbmVn2it2VtBy4MZm+EfhpzwaS\nBPwj8HJEfLPHsvPznn4U2FxkPWZmVqRig+EbwO9J2g58MHmOpLdJ6h5h9F+ATwC/28uw1L+VtEnS\nRuAq4HNF1mNmZkUacFdSfyLiEPCBXua/CVybTD8LqI/+nyjm9c3MLHs+89nMzFIcDGZmluJgMDOz\nFAeDmZmlOBjMzCzFwWBmZikOBjMzS3EwmJlZioPBzMxSHAxmZpbiYDAzsxQHg5mZpTgYzMwsxcFg\nZmYpDgYzM0spKhgkTZX0hKTtyc/z+mi3M7khz3pJDYPtb2Zm5VPsFsNtwJMRMR94Mnnel6si4tKI\nqB9ifzMzK4Nig2ERcF8yfR/wkTL3NzOzjBUbDDMjYm8yvQ+Y2Ue7AFZKWiNp8RD6m5lZmQx4z2dJ\nK4FZvSz6y/wnERGSoo/VXBEReyTNAJ6QtDUinh5Ef5JAWQwwd+7cgco2M7MhGjAYIuKDfS2TtF/S\n+RGxV9L5wIE+1rEn+XlA0iPA5cDTQEH9k75LgCUA9fX1fQaImZkVp9hdScuBG5PpG4Gf9mwgaaKk\n2u5p4EPA5kL7m5lZeRUbDN8Afk/SduCDyXMkvU3SiqTNTOBZSRuAVcC/RsRj/fU3M7PKGXBXUn8i\n4hDwgV7mvwlcm0zvAC4ZTH8zM6scn/lsZmYpDgYzM0txMJiZWYqDwczMUhwMZmaWooiRd66YpOPA\ntkrX0Y/pwMFKF9EP1zd0w7k2cH3FGu31vT0i6gZqVNRw1Qra1uMqrcOKpAbXN3TDub7hXBu4vmK5\nvhzvSjIzsxQHg5mZpYzUYFhS6QIG4PqKM5zrG861gesrlutjhB58NjOz0hmpWwxmZlYiwzYYJH1M\n0hZJXZL6PAov6WpJ2yQ1Srotb/5USU9I2p78PC/j+gZcv6QFktbnPY5JujVZ9lVJe/KWXVvO2pJ2\nOyVtSl6/YbD9S1mfpAskPSXppeR78Nm8ZSV57/r6LuUtl6TvJss3Srqs0L5lqu/jSV2bJD0v6ZK8\nZb1+1mWu70pJR/M+ty8X2rcMtX0hr67NkjolTU2WleO9u0fSAUmb+1he3u9eRAzLB/DrwALgF0B9\nH22qgVeBi4CxwAZgYbLsb4HbkunbgP+TcX2DWn9S6z5y44gBvgr8zxK9dwXVBuwEphf7bytFfcD5\nwGXJdC3wSt5nm/l71993Ka/NtcCjgID3Ai8W2rdM9b0POC+Zvqa7vv4+6zLXdyXw86H0LXVtPdpf\nB/x7ud675DV+B7gM2NzH8rJ+94btFkNEvBwRA53EdjnQGBE7IqINeABYlCxbBNyXTN8HfCTjEge7\n/g8Ar0bE6xnX0Zti/+0Vf+8iYm9ErE2mjwMvA7MzriNff9+lbouAf46cF4BzlbvzYCF9S15fRDwf\nEUeSpy8AczKuoaj6StS3FOu/AVia4esPKHK3Oj7cT5OyfveGbTAUaDawK+/5bn71y2NmROxNpveR\nu2FQlga7/us588v2mWSz8J6Md9cUWlsAKyWtUe6e2oPtX+r6AJA0D3gP8GLe7Kzfu/6+SwO1KaRv\nOerL9ylyf2F26+uzLnd970s+t0clXTzIvqWuDUkTgKuBh/Nml/q9K0RZv3sVPfNZ0kpgVi+L/jIi\nMrvNZ0SEpEEPv+qvvsGsX9JY4PeB2/Nm3wV8ndyX7uvA3wN/WubaroiIPZJmAE9I2pr85VJo/1LX\nh6RJ5P6T3hoRx5LZRb13o52kq8gFwxV5swf8rMtgLTA3Ik4kx4V+Aswvcw0DuQ54LiLy/3ofDu9d\nWVU0GCLig0WuYg9wQd7zOck8gP2Szo+Ivckm14Es65M0mPVfA6yNiP156z49LekHwM/LXVtE7El+\nHpD0CLnN0qcZJu+dpBpyofCjiFiWt+6i3rs+9PddGqhNTQF9y1Efkt4N/BC4JnJ3SAT6/azLVl9e\nsBMRKyR9X9L0QvqWurY8Z2zZl+G9K0RZv3sjfVfSamC+pAuTv8qvB5Yny5YDNybTNwKZbYEMYf1n\n7LNMfiF2+yjQ62iEUtUmaaKk2u5p4EN5NVT8vZMk4B+BlyPimz2WleK96++7lF/3HycjRN4LHE12\niRXSt+T1SZoLLAM+ERGv5M3v77MuZ32zks8VSZeT+/1zqJC+pa4tqWkK8H7yvo9leu8KUd7vXtZH\n17N6kPsPvxtoBfYDjyfz3wasyGt3LbkRK6+S2wXVPX8a8CSwHVgJTM24vl7X30t9E8l9+af06P9/\ngU3AxuSDPL+ctZEbxbAheWwZbu8dud0gkbw/65PHtaV873r7LgE3ATcl0wLuTJZvIm+0XF/fw4zf\nt4Hq+yFwJO/9ahjosy5zfbckr7+B3MHx95Xr/RuotuT5nwAP9OhXrvduKbAXaCf3e+9Tlfzu+cxn\nMzNLGem7kszMLGMOBjMzS3EwmJlZioPBzMxSHAxmZpbiYDAzsxQHg5mZpTgYzMws5f8DLgNQmdGV\nrRwAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "#drawTriangleBins(.8,1.2,.3,1,0,.2)\n", + "#drawTriangleBins(.8,1.2,.3,1,.2,.4)\n", + "#drawTriangleBins(.8,1.2,.3,1,.4,.6)\n", + "#drawTriangleBins(.8,1.2,.3,1,.6,.8)\n", + "drawTriangleBins(.99,1.01,.3,1,.8,1)" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\nAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "drawTriangleBins(.5,1.5,.3,1,0,.2)\n", + "drawTriangleBins(.5,1.5,.3,1,.2,.4)\n", + "drawTriangleBins(.5,1.5,.3,1,.4,.6)\n", + "drawTriangleBins(.5,1.5,.3,1,.6,.8)\n", + "drawTriangleBins(.5,1.5,.3,1,.8,1)" ] }, { @@ -47,9 +339,7 @@ { "cell_type": "code", "execution_count": 5, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -118,9 +408,7 @@ { "cell_type": "code", "execution_count": 42, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -142,7 +430,7 @@ "cell_type": "code", "execution_count": 8, "metadata": { - "collapsed": false + "collapsed": true }, "outputs": [], "source": [ @@ -178,9 +466,7 @@ { "cell_type": "code", "execution_count": 35, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -200,9 +486,7 @@ { "cell_type": "code", "execution_count": 11, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -237,9 +521,7 @@ { "cell_type": "code", "execution_count": 22, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -260,7 +542,7 @@ "cell_type": "code", "execution_count": 4, "metadata": { - "collapsed": false + "collapsed": true }, "outputs": [], "source": [ @@ -270,9 +552,7 @@ { "cell_type": "code", "execution_count": 22, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -295,9 +575,7 @@ { "cell_type": "code", "execution_count": 26, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -316,9 +594,7 @@ { "cell_type": "code", "execution_count": 147, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -338,9 +614,7 @@ { "cell_type": "code", "execution_count": 30, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -360,9 +634,7 @@ { "cell_type": "code", "execution_count": 165, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -385,9 +657,7 @@ { "cell_type": "code", "execution_count": 129, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -407,9 +677,7 @@ { "cell_type": "code", "execution_count": 131, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -432,9 +700,7 @@ { "cell_type": "code", "execution_count": 119, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -457,9 +723,7 @@ { "cell_type": "code", "execution_count": 21, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -506,5 +770,5 @@ } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/notebooks/jackknife_regions.ipynb b/notebooks/jackknife_regions.ipynb index b599fc8..ef7fbce 100644 --- a/notebooks/jackknife_regions.ipynb +++ b/notebooks/jackknife_regions.ipynb @@ -40,11 +40,18 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": { - "collapsed": false + "collapsed": true }, "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], "source": [ "data = fits.getdata('/nfs/slac/g/ki/ki19/des/mbaumer/3pt_data/jackknife_randoms5x/redmagic_data.fits')\n", "randoms = fits.getdata('/nfs/slac/g/ki/ki19/des/mbaumer/3pt_data/jackknife_randoms5x/redmagic_randoms_0.fits')" @@ -60,9 +67,7 @@ { "cell_type": "code", "execution_count": 15, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "data = data[data['DEC'] < -35]\n", @@ -72,9 +77,7 @@ { "cell_type": "code", "execution_count": 19, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -108,9 +111,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "name": "stderr", @@ -139,9 +140,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -168,9 +167,7 @@ { "cell_type": "code", "execution_count": 5, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -193,9 +190,7 @@ { "cell_type": "code", "execution_count": 6, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "data = zip(spt['RA'],spt['DEC'])\n", @@ -206,9 +201,7 @@ { "cell_type": "code", "execution_count": 7, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "from sklearn.cluster import KMeans\n", @@ -241,9 +234,7 @@ { "cell_type": "code", "execution_count": 9, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -272,9 +263,7 @@ { "cell_type": "code", "execution_count": 8, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -301,9 +290,7 @@ { "cell_type": "code", "execution_count": 10, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "from sklearn.neighbors import KNeighborsRegressor\n", @@ -315,9 +302,7 @@ { "cell_type": "code", "execution_count": 11, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -341,9 +326,7 @@ { "cell_type": "code", "execution_count": 24, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -363,9 +346,7 @@ { "cell_type": "code", "execution_count": 14, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -425,5 +406,5 @@ } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/tricorder/make_figures.py b/tricorder/make_figures.py new file mode 100644 index 0000000..c5f2c02 --- /dev/null +++ b/tricorder/make_figures.py @@ -0,0 +1,575 @@ +#### Make figures for paper (in eps/pdf format) +from __future__ import division +import numpy as np + +import matplotlib +matplotlib.use('agg') + +import matplotlib.pyplot as plt +import chainconsumer +from scipy.optimize import minimize +import plottools +reload(plottools) +import palettable +from matplotlib.colors import LogNorm + +from astropy.io import fits +import paths +import skymapper as skm + +matplotlib.rcParams.update({'font.size': 14}) +matplotlib.rc('xtick', labelsize=12) +matplotlib.rc('ytick', labelsize=12) +matplotlib.rc('font', family='serif') + +def make_easy_figures(): + ## + ##Footprint of simulated gals + ## + HD = fits.getdata(paths.rm_y1[0]) + HL = fits.getdata(paths.rm_y1_HL[0]) + HHL = fits.getdata(paths.rm_y1_HHL[0]) + + slice1 = HD[((HD['ZREDMAGIC'] > .15) & (HD['ZREDMAGIC'] < .3))] + slice2 = HD[((HD['ZREDMAGIC'] > .3) & (HD['ZREDMAGIC'] < .45))] + slice3 = HD[((HD['ZREDMAGIC'] > .45) & (HD['ZREDMAGIC'] < .6))] + slice4 = HL[((HL['ZREDMAGIC'] > .6) & (HL['ZREDMAGIC'] < .75))] + slice5 = HHL[((HHL['ZREDMAGIC'] > .75) & (HHL['ZREDMAGIC'] < .9))] + + sample = np.concatenate([slice1,slice2,slice3,slice4,slice5]) + skm.plotDensity(sample['RA'],sample['DEC'],sep=10) + + plt.savefig('./figures/skymap.pdf',dpi=300,bbox_inches='tight') + plt.savefig('./figures/skymap.png',dpi=300,bbox_inches='tight') + + plt.figure() + + ## + ## Redmagic n(z) histogram + ## + plt.hist(slice1['ZSPEC'],histtype='step',bins=100,range=(0,1)) + plt.hist(slice2['ZSPEC'],histtype='step',bins=100,range=(0,1)) + plt.hist(slice3['ZSPEC'],histtype='step',bins=100,range=(0,1)) + plt.hist(slice4['ZSPEC'],histtype='step',bins=100,range=(0,1)) + plt.hist(slice5['ZSPEC'],histtype='step',bins=100,range=(0,1)); + plt.axvspan(.15,.3,alpha=.2,color='b') + plt.axvspan(.3,.45,alpha=.2,color='orange') + plt.axvspan(.45,.6,alpha=.2,color='g') + plt.axvspan(.6,.75,alpha=.2,color='r') + plt.axvspan(.75,.9,alpha=.2,color='violet') + plt.xlabel('True Redshift') + plt.ylabel('N(z)') + + plt.savefig('./figures/tomobins.pdf',dpi=300,bbox_inches='tight') + plt.savefig('./figures/tomobins.png',dpi=300,bbox_inches='tight') + + plt.figure() + + ## + ## Redmagic errors vs redshift + ## + + plt.hist2d(sample['ZREDMAGIC'],sample['ZREDMAGIC_E'],bins=100,norm=LogNorm()); + plt.vlines([.3,.45,.6,.75],0.007,0.1,linestyle='--',color='r') + plt.ylim(0.007,0.1); + plt.xlabel(r'$z_{RM}$') + plt.ylabel(r'$\sigma(z_{RM})$') + + plt.savefig('./figures/redmagic_errors.pdf',dpi=300,bbox_inches='tight') + plt.savefig('./figures/redmagic_errors.png',dpi=300,bbox_inches='tight') + +def make_triangle_diagrams(): + colors = palettable.colorbrewer.qualitative.Paired_5.hex_colors + def drawTriangleScatter(min_r,max_r,min_u,max_u,min_v,max_v,color=0,num=20): + test = np.array(np.meshgrid(np.linspace(min_r,max_r,num=num), + np.linspace(min_u,max_u,num=num), + np.linspace(min_v,max_v,num=10*num),)) + d2 = test[0,:,:,:] + d3 = test[0,:,:,:]*test[1,:,:,:] + d1 = np.abs(test[2,:,:,:])*d3+d2 + cosine = (d2**2 + d3**2 - d1**2)/(2*d2*d3+1e-9) + sine = np.sqrt(1-cosine**2) + points = d3*cosine,d3*sine + plt.scatter(np.array(points).reshape(2,-1)[0,:],np.array(points).reshape(2,-1)[1,:],color=colors[color],alpha=.1,marker='.') + plt.plot([0,20],[0,0],color='k') + plt.plot([0,-4,20],[0,12,0],color='k',linestyle='--') + plt.plot(20,0,color='r',marker='s') + plt.xlim(-30,25) + plt.ylim(-5,25) + + drawTriangleScatter(19.9,20.1,.3,1,0,.2, color=0,num=50) + drawTriangleScatter(19.9,20.1,.3,1,.2,.4,color=1,num=50) + drawTriangleScatter(19.9,20.1,.3,1,.4,.6,color=2,num=50) + drawTriangleScatter(19.9,20.1,.3,1,.6,.8,color=3,num=50) + drawTriangleScatter(19.9,20.1,.3,1,.8,1, color=4,num=100) + plt.xlabel('RA (arcmin)') + plt.ylabel('DEC (arcmin)') + + plt.savefig('./figures/perfect_binning.pdf',dpi=300,bbox_inches='tight') + plt.savefig('./figures/perfect_binning.png',dpi=300,bbox_inches='tight') + + plt.figure() + + drawTriangleScatter(16,24,.3,1,0,.2, color=0,num=50) + drawTriangleScatter(16,24,.3,1,.2,.4,color=1,num=50) + drawTriangleScatter(16,24,.3,1,.4,.6,color=2,num=50) + drawTriangleScatter(16,24,.3,1,.6,.8,color=3,num=50) + drawTriangleScatter(16,24,.3,1,.8,1, color=4,num=120) + + plt.savefig('./figures/tolerance_20.pdf',dpi=300,bbox_inches='tight') + plt.savefig('./figures/tolerance_20.png',dpi=300,bbox_inches='tight') + + +def make_covariance_fig(): + + path = '/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new3/photoz_syst/' + + zmin = .45 + zmax = zmin+.15 + data = plottools.load_res_indep(path, 'dm','newpaper13.1','ZSPEC',zmin,zmax,'12x20',sigma=0) + data2 = plottools.load_res_indep(path,'dm','newpaper13.1','ZREDMAGIC',zmin,zmax,'12x20',sigma=0) + galdata = plottools.load_res_indep(path, 'newbuzzardrm2','newpaper13.1','ZSPEC',zmin,zmax,'20',sigma=0) + galdata2 = plottools.load_res_indep(path,'newbuzzardrm2','newpaper13.1','ZREDMAGIC',zmin,zmax,'20',sigma=0) + plt.figure() + fig,axarr = plt.subplots(2,2,figsize=(6,6)) + + vmin= 0 + vmax= 1 + + axarr[0,0].imshow(np.corrcoef(plottools.compress_dv(galdata['Q'].values.reshape(-1,10)).T),vmin=vmin,vmax=vmax,origin='lower',extent=(0,1,0,1)) + axarr[0,0].set_title(r'Galaxies: True n(z)') + axarr[0,0].set_xticks([.1,.3,.5,.7,.9]) + axarr[0,0].set_yticks([.1,.3,.5,.7,.9]) + #axarr[0,0].set_xlabel('v') + axarr[0,0].set_ylabel('v') + axarr[0,1].imshow(np.corrcoef(plottools.compress_dv(galdata2['Q'].values.reshape(-1,10)).T),vmin=vmin,vmax=vmax,origin='lower',extent=(0,1,0,1)) + axarr[0,1].set_title(r'Galaxies: RedMaGiC n(z)') + #axarr[0,1].set_xlabel('v') + #axarr[0,1].set_ylabel('v') + axarr[0,1].set_xticks([.1,.3,.5,.7,.9]) + axarr[0,1].set_yticks([.1,.3,.5,.7,.9]) + axarr[1,0].imshow(np.corrcoef(plottools.compress_dv(data['Q'].values.reshape(-1,10)).T),vmin=vmin,vmax=vmax,origin='lower',extent=(0,1,0,1)) + axarr[1,0].set_title(r'DM: True n(z)') + axarr[1,0].set_xticks([.1,.3,.5,.7,.9]) + axarr[1,0].set_yticks([.1,.3,.5,.7,.9]) + axarr[1,0].set_xlabel('v') + axarr[1,0].set_ylabel('v') + im = axarr[1,1].imshow(np.corrcoef(plottools.compress_dv(data2['Q'].values.reshape(-1,10)).T),vmin=vmin,vmax=vmax,origin='lower',extent=(0,1,0,1)) + axarr[1,1].set_title(r'DM: RedMaGiC n(z)') + axarr[1,1].set_xlabel('v') + #axarr[1,1].set_ylabel('v') + axarr[1,1].set_xticks([.1,.3,.5,.7,.9]) + axarr[1,1].set_yticks([.1,.3,.5,.7,.9]) + + #fig.colorbar(im, ax=axarr.ravel().tolist(),shrink=.4,aspect=10) + #plt.suptitle(str(zmin)+r'$ config['3PCF']['min_sep']*config['3PCF']['min_u']) & (r < config['3PCF']['max_sep']*config['3PCF']['max_u'])]) + b1_std = np.std(b1[:,(r > config['3PCF']['min_sep']*config['3PCF']['min_u']) & (r < config['3PCF']['max_sep']*config['3PCF']['max_u'])]) + + cc.configure(legend_kwargs={"loc": "lower right"},label_font_size=18,tick_font_size=14) + + figure = cc.plotter.plot(figsize='column',extents=[(0,3),(-3,3)]); + figure.axes[2].axvspan(b1_mean-b1_std, b1_mean+b1_std, alpha=0.3, color='b') + figure.axes[2].axvspan(b1_mean-2*b1_std, b1_mean+2*b1_std, alpha=0.3, color='b') + + figure.axes[2].plot(np.linspace(0,3,100),plottools.get_lazeyras_schmidt_2015(np.linspace(0,3,100)),label='Lazeyras+Schmidt 2015') + figure.axes[2].plot(np.linspace(0,3,100),plottools.get_hoffman_2015(np.linspace(0,3,100)),label='Hoffman 2015') + + if is11k: + str11k = '_11k' + else: + str11k = '' + + axarr = figure.get_axes() + #plt.suptitle(str(zmin)+r'$ < z < $'+str(zmax)) + plt.legend() + plt.savefig('./figures/spec_bin'+str(i+1)+str11k+'.pdf',dpi=300,bbox_inches='tight') + plt.savefig('./figures/spec_bin'+str(i+1)+str11k+'.png',dpi=300,bbox_inches='tight') + +def get_zspec_both(): + summaries = [] + for i,zmin in enumerate([.15,.3,.45,.6]): + if zmin != .45: + path = '/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new3/tolerance_syst/' + config_fname = 'newpaper14.1' + else: + path = '/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new3/photoz_syst/' + config_fname = 'newpaper13.1' + config = plottools.load_config(config_fname) + zmax = zmin+.15 + cc = chainconsumer.ChainConsumer() + if ((zmin == .15) | (zmin == .45)): + data1 = plottools.load_res_indep(path,'dm',config_fname,'ZSPEC',zmin,zmax,'12x20',sigma=0) + data2 = plottools.load_res_indep(path,'newbuzzardrm2',config_fname,'ZSPEC',zmin,zmax,'20',sigma=0) + else: + data1 = plottools.load_res_indep(path,'dm',config_fname,'ZSPEC',zmin,zmax,'10x10',sigma=0) + data2 = plottools.load_res_indep(path,'newbuzzardrm2',config_fname,'ZSPEC',zmin,zmax,'10',sigma=0) + red_qdm = plottools.compress_dv(data1['Q'].values.reshape(-1,10)) + red_qrm = plottools.compress_dv(data2['Q'].values.reshape(-1,10)) + samples = plottools.make_inference(red_qdm,red_qrm,is11k=False) + cc.add_chain(samples.flatchain,parameters=['b1','b2'],name=r'DES Y1-like',color='b') + samples2 = plottools.make_inference(red_qdm,red_qrm,is11k=True) + cc.add_chain(samples2.flatchain,parameters=['b1','b2'],name=r'12,000 sq. deg. survey', color='k') + + summary = cc.analysis.get_summary() + summaries.append(summary) + + if ((zmin == .15) | (zmin == .45)): + xi1 = plottools.load_res_xi_indep(path,'dm',config_fname,zmin,zmax,'12x20') + xi2 = plottools.load_res_xi_indep(path,'newbuzzardrm2',config_fname,zmin,zmax,'20') + else: + xi1 = plottools.load_res_xi_indep(path,'dm',config_fname,zmin,zmax,'10x10') + xi2 = plottools.load_res_xi_indep(path,'newbuzzardrm2',config_fname,zmin,zmax,'10') + #b1 = np.sqrt(np.mean(xi2,axis=0)/np.mean(xi1,axis=0)) + b1 = np.sqrt(xi2/np.mean(xi1,axis=0)) + r = np.logspace(config['2PCF']['min_sep'],np.log10(config['2PCF']['max_sep']),num=config['2PCF']['nbins']) + b1_mean = np.mean(b1[:,(r > config['3PCF']['min_sep']*config['3PCF']['min_u']) & (r < config['3PCF']['max_sep']*config['3PCF']['max_u'])]) + b1_std = np.std(b1[:,(r > config['3PCF']['min_sep']*config['3PCF']['min_u']) & (r < config['3PCF']['max_sep']*config['3PCF']['max_u'])]) + + cc.configure(legend_kwargs={"loc": "lower right"},label_font_size=14,tick_font_size=14) + + figure = cc.plotter.plot(figsize='column',extents=[(0,3),(-3,3)]); + figure.axes[2].axvspan(b1_mean-b1_std, b1_mean+b1_std, alpha=0.3, color='b') + figure.axes[2].axvspan(b1_mean-2*b1_std, b1_mean+2*b1_std, alpha=0.3, color='b') + + figure.axes[2].plot(np.linspace(0,3,100),plottools.get_lazeyras_schmidt_2015(np.linspace(0,3,100)),label='Lazeyras+Schmidt 2015') + figure.axes[2].plot(np.linspace(0,3,100),plottools.get_hoffman_2015(np.linspace(0,3,100)),label='Hoffman 2015') + + axarr = figure.get_axes() + plt.suptitle(str(zmin)+r'$ < z < $'+str(zmax),y=1) + plt.legend() + plt.savefig('./figures/both_bin'+str(i+1)+'.pdf',dpi=300,bbox_inches='tight') + plt.savefig('./figures/both_bin'+str(i+1)+'.png',dpi=300,bbox_inches='tight') + +def get_zrm_only(is11k=False): + path = '/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new3/photoz_syst/' + summaries = [] + for i,zmin in enumerate([.15,.3,.45,.6]): + if zmin != .45: + path = '/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new3/tolerance_syst/' + config_fname = 'newpaper14.1' + else: + path = '/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new3/photoz_syst/' + config_fname = 'newpaper13.1' + config = plottools.load_config(config_fname) + zmax = zmin+.15 + cc = chainconsumer.ChainConsumer() + if zmin != .45: + data1 = plottools.load_res_indep(path,'dm',config_fname,'ZREDMAGIC',zmin,zmax,'10x10',sigma=0) + data2 = plottools.load_res_indep(path,'newbuzzardrm2',config_fname,'ZREDMAGIC',zmin,zmax,'10',sigma=0) + else: + data1 = plottools.load_res_indep(path,'dm',config_fname,'ZREDMAGIC',zmin,zmax,'12x20',sigma=0) + data2 = plottools.load_res_indep(path,'newbuzzardrm2',config_fname,'ZREDMAGIC',zmin,zmax,'20',sigma=0) + red_qdm = plottools.compress_dv(data1['Q'].values.reshape(-1,10)) + red_qrm = plottools.compress_dv(data2['Q'].values.reshape(-1,10)) + samples = plottools.make_inference(red_qdm,red_qrm,is11k=is11k) + cc.add_chain(samples.flatchain,parameters=['b1','b2'],name=r'redMaGiC redshifts') + + summary = cc.analysis.get_summary() + summaries.append(summary) + + if is11k: + str11k = '_11k' + else: + str11k = '' + + cc.configure(legend_kwargs={"loc": "lower right"},label_font_size=14,tick_font_size=14) + + figure = cc.plotter.plot(figsize='column',extents=[(0,3),(-3,3)]); + axarr = figure.get_axes() + plt.suptitle(str(zmin)+r'$ < z < $'+str(zmax),y=1) + plt.legend() + plt.savefig('./figures/rmonly_bin'+str(i+1)+str11k+'.pdf',dpi=300,bbox_inches='tight') + plt.savefig('./figures/rmonly_bin'+str(i+1)+str11k+'.png',dpi=300,bbox_inches='tight') + +def get_zspec_zrm(is11k=False): + path = '/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new3/photoz_syst/' + summaries = [] + for i,zmin in enumerate([.15,.3,.45,.6]): + if zmin != .45: + path = '/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new3/tolerance_syst/' + config_fname = 'newpaper14.1' + else: + path = '/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new3/photoz_syst/' + config_fname = 'newpaper13.1' + config = plottools.load_config(config_fname) + zmax = zmin+.15 + cc = chainconsumer.ChainConsumer() + if ((zmin == .15) | (zmin == .45)): + data1 = plottools.load_res_indep(path,'dm',config_fname,'ZSPEC',zmin,zmax,'12x20',sigma=0) + data2 = plottools.load_res_indep(path,'newbuzzardrm2',config_fname,'ZSPEC',zmin,zmax,'20',sigma=0) + else: + data1 = plottools.load_res_indep(path,'dm',config_fname,'ZSPEC',zmin,zmax,'10x10',sigma=0) + data2 = plottools.load_res_indep(path,'newbuzzardrm2',config_fname,'ZSPEC',zmin,zmax,'10',sigma=0) + red_qdm = plottools.compress_dv(data1['Q'].values.reshape(-1,10)) + red_qrm = plottools.compress_dv(data2['Q'].values.reshape(-1,10)) + samples = plottools.make_inference(red_qdm,red_qrm,is11k=is11k) + cc.add_chain(samples.flatchain,parameters=['b1','b2'],name=r'True redshifts') + + if zmin != .45: + data1 = plottools.load_res_indep(path,'dm',config_fname,'ZREDMAGIC',zmin,zmax,'10x10',sigma=0) + data2 = plottools.load_res_indep(path,'newbuzzardrm2',config_fname,'ZREDMAGIC',zmin,zmax,'10',sigma=0) + else: + data1 = plottools.load_res_indep(path,'dm',config_fname,'ZREDMAGIC',zmin,zmax,'12x20',sigma=0) + data2 = plottools.load_res_indep(path,'newbuzzardrm2',config_fname,'ZREDMAGIC',zmin,zmax,'20',sigma=0) + red_qdm = plottools.compress_dv(data1['Q'].values.reshape(-1,10)) + red_qrm = plottools.compress_dv(data2['Q'].values.reshape(-1,10)) + samples = plottools.make_inference(red_qdm,red_qrm,is11k=is11k) + cc.add_chain(samples.flatchain,parameters=['b1','b2'],name=r'redMaGiC redshifts') + + summary = cc.analysis.get_summary() + summaries.append(summary) + + if is11k: + str11k = '_11k' + else: + str11k = '' + + cc.configure(legend_kwargs={"loc": "lower right"},label_font_size=14,tick_font_size=14) + + figure = cc.plotter.plot(figsize='column',extents=[(0,3),(-3,3)]); + axarr = figure.get_axes() + plt.suptitle(str(zmin)+r'$ < z < $'+str(zmax),y=1) + plt.legend() + plt.savefig('./figures/rm_bin'+str(i+1)+str11k+'.pdf',dpi=300,bbox_inches='tight') + plt.savefig('./figures/rm_bin'+str(i+1)+str11k+'.png',dpi=300,bbox_inches='tight') + +def get_tolerance_figs(is11k=False): + oldpath = '/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new3/photoz_syst/' + path = '/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new3/tolerance_syst/' + for i,zmin in enumerate([.15,.3,.45,.6]): + #config_fname = 'newpaper13.1' + #config = plottools.load_config(config_fname) + zmax = zmin+.15 + cc = chainconsumer.ChainConsumer() + + data1 = plottools.load_res_indep(oldpath,'dm','newpaper13.1','ZSPEC',zmin,zmax,'12x20',sigma=0) + data2 = plottools.load_res_indep(oldpath,'newbuzzardrm2','newpaper13.1','ZSPEC',zmin,zmax,'20',sigma=0) + red_qdm = plottools.compress_dv(data1['Q'].values.reshape(-1,10)) + red_qrm = plottools.compress_dv(data2['Q'].values.reshape(-1,10)) + samples = plottools.make_inference(red_qdm,red_qrm,is11k=is11k) + cc.add_chain(samples.flatchain,parameters=['b1','b2'],name=r'Tolerance $= 20\%$') + + data1 = plottools.load_res_indep(path,'dm','newpaper13.1_up','ZSPEC',zmin,zmax,'12x20',sigma=0) + data2 = plottools.load_res_indep(path,'newbuzzardrm2','newpaper13.1_up','ZSPEC',zmin,zmax,'20',sigma=0) + red_qdm = plottools.compress_dv(data1['Q'].values.reshape(-1,10)) + red_qrm = plottools.compress_dv(data2['Q'].values.reshape(-1,10)) + samples = plottools.make_inference(red_qdm,red_qrm,is11k=is11k) + cc.add_chain(samples.flatchain,parameters=['b1','b2'],name=r'Tolerance $= 25\%$') + + data1 = plottools.load_res_indep(path,'dm','newpaper13.1_down','ZSPEC',zmin,zmax,'12x20',sigma=0) + data2 = plottools.load_res_indep(path,'newbuzzardrm2','newpaper13.1_down','ZSPEC',zmin,zmax,'20',sigma=0) + red_qdm = plottools.compress_dv(data1['Q'].values.reshape(-1,10)) + red_qrm = plottools.compress_dv(data2['Q'].values.reshape(-1,10)) + samples = plottools.make_inference(red_qdm,red_qrm,is11k=is11k) + cc.add_chain(samples.flatchain,parameters=['b1','b2'],name=r'Tolerance $= 15\%$') + + data1 = plottools.load_res_indep(path,'dm','newpaper13.1_down2','ZSPEC',zmin,zmax,'12x20',sigma=0) + data2 = plottools.load_res_indep(path,'newbuzzardrm2','newpaper13.1_down2','ZSPEC',zmin,zmax,'20',sigma=0) + red_qdm = plottools.compress_dv(data1['Q'].values.reshape(-1,10)) + red_qrm = plottools.compress_dv(data2['Q'].values.reshape(-1,10)) + samples = plottools.make_inference(red_qdm,red_qrm,is11k=is11k) + cc.add_chain(samples.flatchain,parameters=['b1','b2'],name=r'Tolerance $= 10\%$') + + data1 = plottools.load_res_indep(path,'dm','newpaper13.1_up2','ZSPEC',zmin,zmax,'12x20',sigma=0) + data2 = plottools.load_res_indep(path,'newbuzzardrm2','newpaper13.1_up2','ZSPEC',zmin,zmax,'20',sigma=0) + red_qdm = plottools.compress_dv(data1['Q'].values.reshape(-1,10)) + red_qrm = plottools.compress_dv(data2['Q'].values.reshape(-1,10)) + samples = plottools.make_inference(red_qdm,red_qrm,is11k=is11k) + cc.add_chain(samples.flatchain,parameters=['b1','b2'],name=r'Tolerance $= 30\%$') + + cc.configure(legend_kwargs={"loc": "lower right"},label_font_size=14,tick_font_size=14) + figure = cc.plotter.plot(figsize='column',extents=[(0,3),(-3,3)]); + axarr = figure.get_axes() + plt.suptitle(str(zmin)+r'$ < z < $'+str(zmax),y=1) + plt.legend() + + if is11k: + str11k = '_11k' + else: + str11k = '' + + plt.savefig('./figures/tol_bin'+str(i+1)+str11k+'.pdf',dpi=300,bbox_inches='tight') + plt.savefig('./figures/tol_bin'+str(i+1)+str11k+'.png',dpi=300,bbox_inches='tight') + +def get_u_figs(is11k=False): + oldpath = '/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new3/photoz_syst/' + path = '/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new3/tolerance_syst/' + #testing choice of u + for i,zmin in enumerate([.15,.3,.45,.6]): + config_fname = 'newpaper13.1' + zmax = zmin+.15 + cc = chainconsumer.ChainConsumer() + + data1 = plottools.load_res_indep(oldpath,'dm','newpaper13.1','ZSPEC',zmin,zmax,'12x20',sigma=0) + data2 = plottools.load_res_indep(oldpath,'newbuzzardrm2','newpaper13.1','ZSPEC',zmin,zmax,'20',sigma=0) + red_qdm = plottools.compress_dv(data1['Q'].values.reshape(-1,10)) + red_qrm = plottools.compress_dv(data2['Q'].values.reshape(-1,10)) + samples = plottools.make_inference(red_qdm,red_qrm,is11k=is11k) + cc.add_chain(samples.flatchain,parameters=['b1','b2'],name=r'$.3 < u < 1$') + + data1 = plottools.load_res_indep(path,'dm','newpaper13.1_newu','ZSPEC',zmin,zmax,'12x20',sigma=0) + data2 = plottools.load_res_indep(path,'newbuzzardrm2','newpaper13.1_newu','ZSPEC',zmin,zmax,'20',sigma=0) + red_qdm = plottools.compress_dv(data1['Q'].values.reshape(-1,10)) + red_qrm = plottools.compress_dv(data2['Q'].values.reshape(-1,10)) + samples = plottools.make_inference(red_qdm,red_qrm,is11k=is11k) + cc.add_chain(samples.flatchain,parameters=['b1','b2'],name=r'$.6 < u < 1$') + + data1 = plottools.load_res_indep(path,'dm','newpaper13.1_newu2','ZSPEC',zmin,zmax,'12x20',sigma=0) + data2 = plottools.load_res_indep(path,'newbuzzardrm2','newpaper13.1_newu2','ZSPEC',zmin,zmax,'20',sigma=0) + red_qdm = plottools.compress_dv(data1['Q'].values.reshape(-1,10)) + red_qrm = plottools.compress_dv(data2['Q'].values.reshape(-1,10)) + samples = plottools.make_inference(red_qdm,red_qrm,is11k=is11k) + cc.add_chain(samples.flatchain,parameters=['b1','b2'],name=r'$.9 < u < 1$') + + cc.configure(legend_kwargs={"loc": "lower right"},label_font_size=14,tick_font_size=14) + figure = cc.plotter.plot(figsize='column',extents=[(0,3),(-3,3)]); + axarr = figure.get_axes() + plt.suptitle(str(zmin)+r'$ < z < $'+str(zmax),y=1) + plt.legend() + + if is11k: + str11k = '_11k' + else: + str11k = '' + + plt.savefig('./figures/u_bin'+str(i+1)+str11k+'.pdf',dpi=300,bbox_inches='tight') + plt.savefig('./figures/u_bin'+str(i+1)+str11k+'.png',dpi=300,bbox_inches='tight') + + +def get_gaussian_photoz(is11k=False): + path = '/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new3/photoz_syst/' + summaries = [] + for i,zmin in enumerate([.15,.3,.45,.6]): + config_fname = 'newpaper13.1' + config = plottools.load_config(config_fname) + zmax = zmin+.15 + cc = chainconsumer.ChainConsumer() + data1 = plottools.load_res_indep(path,'dm',config_fname,'ZSPEC',zmin,zmax,'12x20',sigma=0) + data2 = plottools.load_res_indep(path,'newbuzzardrm2',config_fname,'ZSPEC',zmin,zmax,'20',sigma=0) + red_qdm = plottools.compress_dv(data1['Q'].values.reshape(-1,10)) + red_qrm = plottools.compress_dv(data2['Q'].values.reshape(-1,10)) + samples = plottools.make_inference(red_qdm,red_qrm,is11k=is11k) + cc.add_chain(samples.flatchain,parameters=['b1','b2'],name=r'$\sigma_z = 0$') + + data1 = plottools.load_res_indep(path,'dm',config_fname,'ZSPEC',zmin,zmax,'12x20',sigma=0.005) + data2 = plottools.load_res_indep(path,'newbuzzardrm2',config_fname,'ZSPEC',zmin,zmax,'20',sigma=0.005) + red_qdm = plottools.compress_dv(data1['Q'].values.reshape(-1,10)) + red_qrm = plottools.compress_dv(data2['Q'].values.reshape(-1,10)) + samples = plottools.make_inference(red_qdm,red_qrm,is11k=is11k) + cc.add_chain(samples.flatchain,parameters=['b1','b2'],name=r'$\sigma_z = 0.005$') + + data1 = plottools.load_res_indep(path,'dm',config_fname,'ZSPEC',zmin,zmax,'12x20',sigma=0.01) + data2 = plottools.load_res_indep(path,'newbuzzardrm2',config_fname,'ZSPEC',zmin,zmax,'20',sigma=0.01) + red_qdm = plottools.compress_dv(data1['Q'].values.reshape(-1,10)) + red_qrm = plottools.compress_dv(data2['Q'].values.reshape(-1,10)) + samples = plottools.make_inference(red_qdm,red_qrm,is11k=is11k) + cc.add_chain(samples.flatchain,parameters=['b1','b2'],name=r'$\sigma_z = 0.01$') + + data1 = plottools.load_res_indep(path,'dm',config_fname,'ZSPEC',zmin,zmax,'12x20',sigma=0.02) + data2 = plottools.load_res_indep(path,'newbuzzardrm2',config_fname,'ZSPEC',zmin,zmax,'20',sigma=0.02) + red_qdm = plottools.compress_dv(data1['Q'].values.reshape(-1,10)) + red_qrm = plottools.compress_dv(data2['Q'].values.reshape(-1,10)) + samples = plottools.make_inference(red_qdm,red_qrm,is11k=is11k) + cc.add_chain(samples.flatchain,parameters=['b1','b2'],name=r'$\sigma_z = 0.02$') + + summary = cc.analysis.get_summary() + summaries.append(summary) + + cc.configure(legend_kwargs={"loc": "lower right"},label_font_size=14,tick_font_size=14) + figure = cc.plotter.plot(figsize='column',extents=[(0,3),(-3,3)]); + axarr = figure.get_axes() + plt.suptitle(str(zmin)+r'$ < z < $'+str(zmax),y=1) + plt.legend() + + if is11k: + str11k = '_11k' + else: + str11k = '' + + plt.savefig('./figures/gauss_bin'+str(i+1)+str11k+'.pdf',dpi=300,bbox_inches='tight') + plt.savefig('./figures/gauss_bin'+str(i+1)+str11k+'.png',dpi=300,bbox_inches='tight') + + +if __name__ == '__main__': + # make_easy_figures() + # make_data_vector_plots() + # make_triangle_diagrams() + # make_covariance_fig() + # get_zspec_both() + # get_zspec() + # get_zspec(is11k=True) + #get_zrm_only() + #get_zrm_only(is11k=True) + # get_zspec(is11k=True) + get_zspec_zrm() + get_zspec_zrm(is11k=True) + # get_gaussian_photoz() + # get_gaussian_photoz(is11k=True) + # get_tolerance_figs() + # get_tolerance_figs(is11k=True) + # get_u_figs() + # get_u_figs(is11k=True) diff --git a/tricorder/make_figures2.py b/tricorder/make_figures2.py new file mode 100644 index 0000000..082713a --- /dev/null +++ b/tricorder/make_figures2.py @@ -0,0 +1,888 @@ +#### Make figures for paper (in eps/pdf format) +from __future__ import division +import matplotlib +matplotlib.use('agg') + +import numpy as np +import chainconsumer +from scipy.optimize import minimize +import plottools +reload(plottools) +import palettable +path = '/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new3/paper_validation/' +path2 = '/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new3/paper_validation2/' + +import matplotlib.pyplot as plt +import chainconsumer +from scipy.optimize import minimize +from matplotlib.colors import LogNorm + +from astropy.io import fits +import paths +import skymapper as skm + +matplotlib.rcParams.update({'font.size': 14}) +matplotlib.rc('xtick', labelsize=12) +matplotlib.rc('ytick', labelsize=12) +matplotlib.rc('font', family='serif') + +# Covmats 3 cols, 4 rows: cols are ZSPEC, Gaussian z, and ZRM +# Or maybe 4x4 since we might need spec gals, spec dm, rm gals, rmdm +# Contours: zspec+zrm for DES Y1 are bad +# But 11k good: Contours: zspec, zrm, 2pt, lazeyras +# Scale +# Tolerance +# U min + +b1_2pt = [1.71,1.78,1.9,2.22] +b1_err_2pt = [.064,.064,.071,.074] + +b1_spec = [1.51,1.71,1.71,2.1] +b1_up_spec = [.21,.17,.18,.21] +b1_down_spec = [.22,.15,.19,.19] + +b2_spec = [.21,.49,.35,.7] +b2_up_spec = [.37,.29,.31,.5] +b2_down_spec = [.40,.34,.35,.43] + +b1_rm = [1.41,1.87,1.69,2.33] +b1_up_rm = [.38,.37,.28,.98] +b1_down_rm = [.28,.3,.2,.54] + +b2_rm = [-.18,.56,.37,1] +b2_up_rm = [.52,.83,.61,3.5] +b2_down_rm = [.42,.58,.49,1.1] + +sigmas_list = [0.02,0.03,0.03,0.03] + + +# # data vectors ZSPEC + +# plt.figure() +# config_fname = 'paper_3dval4' +# for i,zmin in enumerate([.15,.3,.45,.6]): +# sigma = 0 +# zmax = zmin+.15 +# data = plottools.load_res_indep(path,'dm',config_fname,'ZSPEC',zmin,zmax,'10x10',sigma=sigma,use_alt_randoms=True) +# galdata = plottools.load_res_indep(path,'newbuzzardrm2',config_fname,'ZSPEC',zmin,zmax,'10',sigma=sigma,use_alt_randoms=True) +# print len(data), len(galdata) +# plottools.plot_dv(data,'Q', offset=0.,indiv_runs=True,color='Blue',label=r'Dark Matter',compressed=True) +# plottools.plot_dv(galdata,'Q', offset=0.,indiv_runs=True,color='Red',label=r'Galaxies',compressed=True) +# plt.xlabel('v') +# plt.ylabel('Q') +# plt.title(str(zmin)+r'$ .5$' ,compressed=True) +# plottools.plot_dv(galdata1,'Q', offset=0.01,indiv_runs=False,color=colors[1],label=r'$u > .75$' ,compressed=True) +# plottools.plot_dv(galdata2,'Q', offset=0.02,indiv_runs=False,color=colors[2],label=r'$u > .9$' ,compressed=True) + +# plt.xlabel('v') +# plt.ylabel('Q') +# plt.title(str(zmin)+r'$ .5$' ,compressed=True) +# plottools.plot_dv(galdata1,'Q', offset=0.01,indiv_runs=False,color=colors[1],label=r'$u > .75$' ,compressed=True) +# plottools.plot_dv(galdata2,'Q', offset=0.02,indiv_runs=False,color=colors[2],label=r'$u > .9$' ,compressed=True) + +# plt.xlabel('v') +# plt.ylabel('Q') +# plt.title(str(zmin)+r'$$ '+tol_labels[j]) + +# cc.configure(legend_kwargs={"loc": "lower right"},label_font_size=14,tick_font_size=14) +# figure = cc.plotter.plot(figsize='column',extents=[(0,4),(-4,4)]); +# axarr = figure.get_axes() +# plt.suptitle(str(zmin)+r'$ < z < $'+str(zmax)) + +# plt.savefig('./figures/u_bin'+str(i+1)+'_inf.pdf',dpi=300,bbox_inches='tight') +# plt.savefig('./figures/u_bin'+str(i+1)+'_inf.png',dpi=300,bbox_inches='tight') +# plt.figure() + +# # u inferences ZRM + +# is11k = True +# tol_labels = ['.5','.75','.9'] +# for i,zmin in enumerate([.15,.3,.45,.6]): +# zmax = zmin+.15 +# cc = chainconsumer.ChainConsumer() + +# for j,config_fname in enumerate(['fiducial3d_halfu','fiducial3d_75u','paper_3dval4']): +# data1 = plottools.load_res_indep(path2,'dm',config_fname,'ZREDMAGIC',zmin,zmax,'10x10',sigma=0,use_alt_randoms=False) +# if config_fname == 'paper_3dval4': +# data2 = plottools.load_res_indep(path,'newbuzzardrm2',config_fname,'ZREDMAGIC',zmin,zmax,'10',sigma=0,use_alt_randoms=False) +# else: +# data2 = plottools.load_res_indep(path2,'newbuzzardrm2',config_fname,'ZREDMAGIC',zmin,zmax,'10',sigma=0,use_alt_randoms=False) +# red_qdm = plottools.compress_dv(data1['Q'].values.reshape(-1,10)) +# red_qrm = plottools.compress_dv(data2['Q'].values.reshape(-1,10)) +# samples = plottools.make_inference(red_qdm,red_qrm,is11k=is11k) +# cc.add_chain(samples.flatchain,parameters=['b1','b2'],name=r'$u >$ '+tol_labels[j]) + +# cc.configure(legend_kwargs={"loc": "lower right"},label_font_size=14,tick_font_size=14) +# figure = cc.plotter.plot(figsize='column',extents=[(0,4),(-4,4)]); +# axarr = figure.get_axes() +# plt.suptitle(str(zmin)+r'$ < z < $'+str(zmax)) +# plt.savefig('./figures/u_bin'+str(i+1)+'_infrm.pdf',dpi=300,bbox_inches='tight') +# plt.savefig('./figures/u_bin'+str(i+1)+'_infrm.png',dpi=300,bbox_inches='tight') +# plt.figure() + +# # gaussian z dv + +# colors = palettable.colorbrewer.sequential.Reds_7.hex_colors +# config_fname = 'paper_3dval4' +# zmin = .15 +# plt.figure() +# zmax = zmin+.15 +# galdata = plottools.load_res_indep(path,'newbuzzardrm2',config_fname,'ZSPEC',zmin,zmax,'10',sigma=0,use_alt_randoms=False) +# galdata1 = plottools.load_res_indep(path,'newbuzzardrm2',config_fname,'ZSPEC',zmin,zmax,'10',sigma=0.001,use_alt_randoms=False) +# galdata2 = plottools.load_res_indep(path,'newbuzzardrm2',config_fname,'ZSPEC',zmin,zmax,'10',sigma=0.003,use_alt_randoms=False) +# galdata3 = plottools.load_res_indep(path,'newbuzzardrm2',config_fname,'ZSPEC',zmin,zmax,'10',sigma=0.005,use_alt_randoms=False) +# galdata4 = plottools.load_res_indep(path,'newbuzzardrm2',config_fname,'ZSPEC',zmin,zmax,'10',sigma=0.01,use_alt_randoms=False) +# galdata8 = plottools.load_res_indep(path,'newbuzzardrm2',config_fname,'ZREDMAGIC',zmin,zmax,'10',sigma=0,use_alt_randoms=False) + +# plottools.plot_dv(galdata,'Q', offset=0.,indiv_runs=False,color=colors[0] ,label=r'$\sigma(z) = 0$' ,compressed=True) +# plottools.plot_dv(galdata1,'Q', offset=0.01,indiv_runs=False,color=colors[1],label=r'$\sigma(z) = 0.001$' ,compressed=True) +# plottools.plot_dv(galdata2,'Q', offset=0.02,indiv_runs=False,color=colors[2],label=r'$\sigma(z) = 0.003$' ,compressed=True) +# plottools.plot_dv(galdata3,'Q', offset=0.03,indiv_runs=False,color=colors[3],label=r'$\sigma(z) = 0.005$' ,compressed=True) +# plottools.plot_dv(galdata4,'Q', offset=0.04,indiv_runs=False,color=colors[4],label=r'$\sigma(z) = 0.01$' ,compressed=True) +# plottools.plot_dv(galdata8,'Q', offset=0.05,indiv_runs=False,color='k',label='ZREDMAGIC',compressed=True) + +# plt.xlabel('v') +# plt.ylabel('Q') +# plt.title(str(zmin)+r'$ 0.15: +# data1 = plottools.load_res_indep(path,'dm',config_fname,'ZSPEC',zmin,zmax,'10x10',sigma=0.02,use_alt_randoms=False) +# data2 = plottools.load_res_indep(path,'newbuzzardrm2',config_fname,'ZSPEC',zmin,zmax,'10',sigma=0.02,use_alt_randoms=False) +# red_qdm = plottools.compress_dv(data1['Q'].values.reshape(-1,10)) +# red_qrm = plottools.compress_dv(data2['Q'].values.reshape(-1,10)) +# samples = plottools.make_inference(red_qdm,red_qrm,is11k=is11k) +# cc.add_chain(samples.flatchain,parameters=['b1','b2'],name=r'$\sigma(z) = 0.02$') + +# if zmin > .45: +# data1 = plottools.load_res_indep(path2,'dm',config_fname,'ZSPEC',zmin,zmax,'10x10',sigma=0.03,use_alt_randoms=False) +# data2 = plottools.load_res_indep(path,'newbuzzardrm2',config_fname,'ZSPEC',zmin,zmax,'10',sigma=0.03,use_alt_randoms=False) +# red_qdm = plottools.compress_dv(data1['Q'].values.reshape(-1,10)) +# red_qrm = plottools.compress_dv(data2['Q'].values.reshape(-1,10)) +# samples = plottools.make_inference(red_qdm,red_qrm,is11k=is11k) +# cc.add_chain(samples.flatchain,parameters=['b1','b2'],name=r'$\sigma(z) = 0.03$') + +# if zmin != .15: +# data1 = plottools.load_res_indep(path2,'dm',config_fname,'ZSPEC',zmin,zmax,'10x10',sigma=sigmas_list[i],use_alt_randoms=False) +# else: +# data1 = plottools.load_res_indep(path,'dm',config_fname,'ZSPEC',zmin,zmax,'10x10',sigma=sigmas_list[i],use_alt_randoms=False) + +# #fix to use RM DM later... +# #data1 = plottools.load_res_indep(path2,'dm',config_fname,'ZREDMAGIC',zmin,zmax,'10x10',sigma=0,use_alt_randoms=False) +# data2 = plottools.load_res_indep(path,'newbuzzardrm2',config_fname,'ZREDMAGIC',zmin,zmax,'10',sigma=0,use_alt_randoms=False) +# red_qdm = plottools.compress_dv(data1['Q'].values.reshape(-1,10)) +# red_qrm = plottools.compress_dv(data2['Q'].values.reshape(-1,10)) +# samples = plottools.make_inference(red_qdm,red_qrm,is11k=is11k) +# cc.add_chain(samples.flatchain,parameters=['b1','b2'],name=r'RedMaGiC Photometric Redshifts',linewidth=3) + +# cc.configure(legend_kwargs={"loc": "lower right"},label_font_size=14,tick_font_size=14) +# figure = cc.plotter.plot(figsize='column',extents=[(0,4),(-4,4)]); +# axarr = figure.get_axes() +# plt.suptitle(str(zmin)+r'$ < z < $'+str(zmax)) + +# plt.savefig('./figures/gaussrm_bin'+str(i+1)+'_inf.pdf',dpi=300,bbox_inches='tight') +# plt.savefig('./figures/gaussrm_bin'+str(i+1)+'_inf.png',dpi=300,bbox_inches='tight') + +# plt.figure() + +# # scale inferences + +is11k = True +for i,zmin in enumerate([.15,.3,.45,.6]): + zmax = zmin+.15 + cc = chainconsumer.ChainConsumer() + + config_fname = 'paper_3dval1' + data1 = plottools.load_res_indep(path,'dm',config_fname,'ZSPEC',zmin,zmax,'10x10',sigma=0,use_alt_randoms=False) + data2 = plottools.load_res_indep(path,'newbuzzardrm2',config_fname,'ZSPEC',zmin,zmax,'10',sigma=0,use_alt_randoms=False) + red_qdm = plottools.compress_dv(data1['Q'].values.reshape(-1,10)) + red_qrm = plottools.compress_dv(data2['Q'].values.reshape(-1,10)) + samples = plottools.make_inference(red_qdm,red_qrm,is11k=is11k) + cc.add_chain(samples.flatchain,parameters=['b1','b2'],name=r'4 Mpc') + + config_fname = 'paper_3dval2' + data1 = plottools.load_res_indep(path,'dm',config_fname,'ZSPEC',zmin,zmax,'10x10',sigma=0,use_alt_randoms=False) + data2 = plottools.load_res_indep(path,'newbuzzardrm2',config_fname,'ZSPEC',zmin,zmax,'10',sigma=0,use_alt_randoms=False) + red_qdm = plottools.compress_dv(data1['Q'].values.reshape(-1,10)) + red_qrm = plottools.compress_dv(data2['Q'].values.reshape(-1,10)) + samples = plottools.make_inference(red_qdm,red_qrm,is11k=is11k) + cc.add_chain(samples.flatchain,parameters=['b1','b2'],name=r'10 Mpc') + + config_fname = 'paper_3dval3' + data1 = plottools.load_res_indep(path,'dm',config_fname,'ZSPEC',zmin,zmax,'10x10',sigma=0,use_alt_randoms=False) + data2 = plottools.load_res_indep(path,'newbuzzardrm2',config_fname,'ZSPEC',zmin,zmax,'10',sigma=0,use_alt_randoms=False) + red_qdm = plottools.compress_dv(data1['Q'].values.reshape(-1,10)) + red_qrm = plottools.compress_dv(data2['Q'].values.reshape(-1,10)) + samples = plottools.make_inference(red_qdm,red_qrm,is11k=is11k) + cc.add_chain(samples.flatchain,parameters=['b1','b2'],name=r'20 Mpc') + + #if zmin == .6: + config_fname = 'fiducial3d_25Mpc' + data1 = plottools.load_res_indep(path,'dm',config_fname,'ZSPEC',zmin,zmax,'10x10',sigma=0,use_alt_randoms=False) + data2 = plottools.load_res_indep(path,'newbuzzardrm2',config_fname,'ZSPEC',zmin,zmax,'10',sigma=0,use_alt_randoms=False) + red_qdm = plottools.compress_dv(data1['Q'].values.reshape(-1,10)) + red_qrm = plottools.compress_dv(data2['Q'].values.reshape(-1,10)) + samples = plottools.make_inference(red_qdm,red_qrm,is11k=is11k) + cc.add_chain(samples.flatchain,parameters=['b1','b2'],name=r'25 Mpc') + + config_fname = 'paper_3dval4' + data1 = plottools.load_res_indep(path,'dm',config_fname,'ZSPEC',zmin,zmax,'10x10',sigma=0,use_alt_randoms=False) + data2 = plottools.load_res_indep(path,'newbuzzardrm2',config_fname,'ZSPEC',zmin,zmax,'10',sigma=0,use_alt_randoms=False) + print len(data1),len(data2) + red_qdm = plottools.compress_dv(data1['Q'].values.reshape(-1,10)) + red_qrm = plottools.compress_dv(data2['Q'].values.reshape(-1,10)) + samples = plottools.make_inference(red_qdm,red_qrm,is11k=is11k) + cc.add_chain(samples.flatchain,parameters=['b1','b2'],name=r'30 Mpc') + + #if zmin != .45: + config_fname = 'fiducial3d_35Mpc' + data1 = plottools.load_res_indep(path,'dm',config_fname,'ZSPEC',zmin,zmax,'10x10',sigma=0,use_alt_randoms=False) + data2 = plottools.load_res_indep(path,'newbuzzardrm2',config_fname,'ZSPEC',zmin,zmax,'10',sigma=0,use_alt_randoms=False) + print len(data1),len(data2) + red_qdm = plottools.compress_dv(data1['Q'].values.reshape(-1,10)) + red_qrm = plottools.compress_dv(data2['Q'].values.reshape(-1,10)) + samples = plottools.make_inference(red_qdm,red_qrm,is11k=is11k) + cc.add_chain(samples.flatchain,parameters=['b1','b2'],name=r'35 Mpc') + + # try: + # config_fname = 'paper_3dval5' + # data1 = plottools.load_res_indep(path,'dm',config_fname,'ZSPEC',zmin,zmax,'10x10',sigma=0,use_alt_randoms=False) + # data2 = plottools.load_res_indep(path,'newbuzzardrm2',config_fname,'ZSPEC',zmin,zmax,'10',sigma=0,use_alt_randoms=False) + # print len(data1),len(data2) + # red_qdm = plottools.compress_dv(data1['Q'].values.reshape(-1,10)) + # red_qrm = plottools.compress_dv(data2['Q'].values.reshape(-1,10)) + # samples = plottools.make_inference(red_qdm,red_qrm,is11k=is11k) + # cc.add_chain(samples.flatchain,parameters=['b1','b2'],name=r'40 Mpc') + # except: + # print "not enough finished jobs" + + cc.configure(legend_kwargs={"loc": "lower right"},label_font_size=14,tick_font_size=14) + figure = cc.plotter.plot(figsize='column',extents=[(0,10),(-10,10)]); + axarr = figure.get_axes() + plt.suptitle(str(zmin)+r'$ < z < $'+str(zmax)) + + plt.savefig('./figures/scale_bin'+str(i+1)+'_inf.pdf',dpi=300,bbox_inches='tight') + plt.savefig('./figures/scale_bin'+str(i+1)+'_inf.png',dpi=300,bbox_inches='tight') + plt.figure() + +z = np.array([.15,.3,.45,.6])+0.075 +line1 = plt.errorbar(z-0.01,b1_spec,yerr=np.array([b1_down_spec,b1_up_spec]),linestyle='None',marker='o',color='b',label='Spectroscopic Redshifts') +line2 = plt.errorbar(z+0.01,b1_rm,yerr=np.array([b1_down_rm,b1_up_rm]),linestyle='None',marker='o',color='r',label='RedMaGiC Redshifts') + +from matplotlib.collections import PatchCollection +from matplotlib.patches import Rectangle, Patch + +errorboxes = [] + +for i in [0,1,2,3]: + rect = Rectangle((z[i] - 0.02, b1_2pt[i] - b1_err_2pt[i]), 0.04, 2*b1_err_2pt[i]) + errorboxes.append(rect) + +pc = PatchCollection(errorboxes, facecolor='k', alpha=0.5, + edgecolor='None') +ax = plt.gca() +ax.add_collection(pc) + +red_patch = Patch(color='k', alpha=0.5, label='Linear bias from 2PCFs') +plt.legend(handles=[line1,line2,red_patch],loc=2) + +plt.xlabel('z') +plt.ylabel('Linear bias') +plt.xlim(.15,.75) + +plt.savefig('./figures/b1_evolution.pdf',dpi=300,bbox_inches='tight') +plt.savefig('./figures/b1_evolution.png',dpi=300,bbox_inches='tight') +plt.figure() + +plt.errorbar(z-0.01,b2_spec,yerr=np.array([b2_down_spec,b2_up_spec]),linestyle='None',marker='o',color='b',label='Spectroscopic Redshifts') +plt.errorbar(z+0.01,b2_rm,yerr=np.array([b2_down_rm,b2_up_rm]),linestyle='None',marker='o',color='r',label='RedMaGiC Redshifts') +plt.hlines(0,0.2,0.7,linestyles=['--'],colors=['k']) + +plt.xlabel('z') +plt.ylabel('Quadratic bias') +plt.legend(loc=2) +plt.xlim(.15,.75) +plt.savefig('./figures/b2_evolution.pdf',dpi=300,bbox_inches='tight') +plt.savefig('./figures/b2_evolution.png',dpi=300,bbox_inches='tight') \ No newline at end of file diff --git a/tricorder/paths.py b/tricorder/paths.py index e9cc2a5..7def609 100644 --- a/tricorder/paths.py +++ b/tricorder/paths.py @@ -1,131 +1,95 @@ + +# CAUTION: Only use NFS paths!! Otherwise you'll have disk access problems... + +config_dir = '/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new2/configs/' + +corr_out_dir = '/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new3/paper_validation' +ang_out_dir = '/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new3/paper_validation' + +rm_y1_randoms = '/nfs/slac/g/ki/ki19/des/erykoff/clusters/mocks/Buzzard/buzzard-1.9.2+1/des-y1a1/redmapper_v6.4.22/redmagic_3a/buzzard-3_1.9.2+1-6a_run_redmapper_v6.4.22_redmagic_highdens_0.5-10_randoms.fit' +rm_y1_HL_randoms = '/nfs/slac/g/ki/ki19/des/erykoff/clusters/mocks/Buzzard/buzzard-1.9.2+1/des-y1a1/redmapper_v6.4.22/redmagic_3a/buzzard-3_1.9.2+1-6a_run_redmapper_v6.4.22_redmagic_highlum_1.0-04_randoms.fit' +rm_y1_HHL_randoms = '/nfs/slac/g/ki/ki19/des/erykoff/clusters/mocks/Buzzard/buzzard-1.9.2+1/des-y1a1/redmapper_v6.4.22/redmagic_3a/buzzard-3_1.9.2+1-6a_run_redmapper_v6.4.22_redmagic_higherlum_1.5-01_randoms.fit' + +#dm_y1_randoms = '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-0/a/buzzard_1.6-6a_run_redmapper_v6.4.18_redmagic_higherlum_1.5-01_randoms.fit' +#dm_y1_randoms = '/nfs/slac/des/fs1/g/sims/erykoff/clusters/mocks/Buzzard/buzzard-1.6/des-y1a1/redmapper_v6.4.18/redmagic_a/buzzard_1.6-6a_run_redmapper_v6.4.18_redmagic_higherlum_1.5-01_randoms.fit' +dm_y1_randoms = '/nfs/slac/g/ki/ki19/des/mbaumer/dark_matter_joe/buzzard_1.6-6a_run_redmapper_v6.4.18_redmagic_higherlum_1.5-01_randoms.fit' + rm_y1 = [ - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-0/a/buzzard_1.6-6a_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-0/b/buzzard_1.6-6b_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-0/c/buzzard_1.6-6c_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-0/d/buzzard_1.6-6d_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-0/e/buzzard_1.6-6e_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-0/f/buzzard_1.6-6f_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-1/a/buzzard-1_1.6-6a_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/rdmagic/y1/buzzard/flock/buzzard-1/b/buzzard-1_1.6-6b_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-1/c/buzzard-1_1.6-6c_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-1/d/buzzard-1_1.6-6d_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-1/e/buzzard-1_1.6-6e_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-1/f/buzzard-1_1.6-6f_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-2/a/buzzard2_1.6-6a_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-2/b/buzzard2_1.6-6b_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-2/c/buzzard2_1.6-6c_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-2/d/buzzard2_1.6-6d_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-2/e/buzzard2_1.6-6e_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-2/f/buzzard2_1.6-6f_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-3/a/buzzard-3_1.6-6a_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-3/b/buzzard-3_1.6-6b_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-3/c/buzzard-3_1.6-6c_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-3/d/buzzard-3_1.6-6d_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-3/e/buzzard-3_1.6-6e_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-3/f/buzzard-3_1.6-6f_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-5/a/buzzard5_1.6-6a_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-5/b/buzzard5_1.6-6b_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-5/c/buzzard5_1.6-6c_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-5/d/buzzard5_1.6-6d_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-5/e/buzzard5_1.6-6e_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-5/f/buzzard5_1.6-6f_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-21/a/buzzard21_1.6-6a_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-21/b/buzzard21_1.6-6b_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-21/c/buzzard21_1.6-6c_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-21/d/buzzard21_1.6-6d_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-21/e/buzzard21_1.6-6e_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-21/f/buzzard21_1.6-6f_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', + '/nfs/slac/g/ki/ki19/des/erykoff/clusters/mocks/Buzzard/buzzard-1.9.2+1/des-y1a1/redmapper_v6.4.22/redmagic_3a/buzzard-3_1.9.2+1-6a_run_redmapper_v6.4.22_redmagic_highdens_0.5-10.fit', + '/nfs/slac/g/ki/ki19/des/erykoff/clusters/mocks/Buzzard/buzzard-1.9.2+1/des-y1a1/redmapper_v6.4.22/redmagic_3b/buzzard-3_1.9.2+1-6b_run_redmapper_v6.4.22_redmagic_highdens_0.5-10.fit', + '/nfs/slac/g/ki/ki19/des/erykoff/clusters/mocks/Buzzard/buzzard-1.9.2+1/des-y1a1/redmapper_v6.4.22/redmagic_3c/buzzard-3_1.9.2+1-6c_run_redmapper_v6.4.22_redmagic_highdens_0.5-10.fit', + '/nfs/slac/g/ki/ki19/des/erykoff/clusters/mocks/Buzzard/buzzard-1.9.2+1/des-y1a1/redmapper_v6.4.22/redmagic_3d/buzzard-3_1.9.2+1-6d_run_redmapper_v6.4.22_redmagic_highdens_0.5-10.fit', + '/nfs/slac/g/ki/ki19/des/erykoff/clusters/mocks/Buzzard/buzzard-1.9.2+1/des-y1a1/redmapper_v6.4.22/redmagic_3e/buzzard-3_1.9.2+1-6e_run_redmapper_v6.4.22_redmagic_highdens_0.5-10.fit', + '/nfs/slac/g/ki/ki19/des/erykoff/clusters/mocks/Buzzard/buzzard-1.9.2+1/des-y1a1/redmapper_v6.4.22/redmagic_3f/buzzard-3_1.9.2+1-6f_run_redmapper_v6.4.22_redmagic_highdens_0.5-10.fit', + + '/nfs/slac/g/ki/ki19/des/erykoff/clusters/mocks/Buzzard/buzzard-1.9.2+1/des-y1a1/redmapper_v6.4.22/redmagic_4a/buzzard-4_1.9.2+1-6a_run_redmapper_v6.4.22_redmagic_highdens_0.5-10.fit', + '/nfs/slac/g/ki/ki19/des/erykoff/clusters/mocks/Buzzard/buzzard-1.9.2+1/des-y1a1/redmapper_v6.4.22/redmagic_4b/buzzard-4_1.9.2+1-6b_run_redmapper_v6.4.22_redmagic_highdens_0.5-10.fit', + '/nfs/slac/g/ki/ki19/des/erykoff/clusters/mocks/Buzzard/buzzard-1.9.2+1/des-y1a1/redmapper_v6.4.22/redmagic_4c/buzzard-4_1.9.2+1-6c_run_redmapper_v6.4.22_redmagic_highdens_0.5-10.fit', + # this one is bad b/c of joe healpix error! + #'/nfs/slac/g/ki/ki19/des/erykoff/clusters/mocks/Buzzard/buzzard-1.9.2+1/des-y1a1/redmapper_v6.4.22/redmagic_4d/buzzard-4_1.9.2+1-6d_run_redmapper_v6.4.22_redmagic_highdens_0.5-10.fit', + '/nfs/slac/g/ki/ki19/des/erykoff/clusters/mocks/Buzzard/buzzard-1.9.2+1/des-y1a1/redmapper_v6.4.22/redmagic_4e/buzzard-4_1.9.2+1-6e_run_redmapper_v6.4.22_redmagic_highdens_0.5-10.fit', + '/nfs/slac/g/ki/ki19/des/erykoff/clusters/mocks/Buzzard/buzzard-1.9.2+1/des-y1a1/redmapper_v6.4.22/redmagic_4f/buzzard-4_1.9.2+1-6f_run_redmapper_v6.4.22_redmagic_highdens_0.5-10.fit', +] + +rm_y1_HL = [ + '/nfs/slac/g/ki/ki19/des/erykoff/clusters/mocks/Buzzard/buzzard-1.9.2+1/des-y1a1/redmapper_v6.4.22/redmagic_3a/buzzard-3_1.9.2+1-6a_run_redmapper_v6.4.22_redmagic_highlum_1.0-04.fit', + '/nfs/slac/g/ki/ki19/des/erykoff/clusters/mocks/Buzzard/buzzard-1.9.2+1/des-y1a1/redmapper_v6.4.22/redmagic_3b/buzzard-3_1.9.2+1-6b_run_redmapper_v6.4.22_redmagic_highlum_1.0-04.fit', + '/nfs/slac/g/ki/ki19/des/erykoff/clusters/mocks/Buzzard/buzzard-1.9.2+1/des-y1a1/redmapper_v6.4.22/redmagic_3c/buzzard-3_1.9.2+1-6c_run_redmapper_v6.4.22_redmagic_highlum_1.0-04.fit', + '/nfs/slac/g/ki/ki19/des/erykoff/clusters/mocks/Buzzard/buzzard-1.9.2+1/des-y1a1/redmapper_v6.4.22/redmagic_3d/buzzard-3_1.9.2+1-6d_run_redmapper_v6.4.22_redmagic_highlum_1.0-04.fit', + '/nfs/slac/g/ki/ki19/des/erykoff/clusters/mocks/Buzzard/buzzard-1.9.2+1/des-y1a1/redmapper_v6.4.22/redmagic_3e/buzzard-3_1.9.2+1-6e_run_redmapper_v6.4.22_redmagic_highlum_1.0-04.fit', + '/nfs/slac/g/ki/ki19/des/erykoff/clusters/mocks/Buzzard/buzzard-1.9.2+1/des-y1a1/redmapper_v6.4.22/redmagic_3f/buzzard-3_1.9.2+1-6f_run_redmapper_v6.4.22_redmagic_highlum_1.0-04.fit', + + '/nfs/slac/g/ki/ki19/des/erykoff/clusters/mocks/Buzzard/buzzard-1.9.2+1/des-y1a1/redmapper_v6.4.22/redmagic_4a/buzzard-4_1.9.2+1-6a_run_redmapper_v6.4.22_redmagic_highlum_1.0-04.fit', + '/nfs/slac/g/ki/ki19/des/erykoff/clusters/mocks/Buzzard/buzzard-1.9.2+1/des-y1a1/redmapper_v6.4.22/redmagic_4b/buzzard-4_1.9.2+1-6b_run_redmapper_v6.4.22_redmagic_highlum_1.0-04.fit', + '/nfs/slac/g/ki/ki19/des/erykoff/clusters/mocks/Buzzard/buzzard-1.9.2+1/des-y1a1/redmapper_v6.4.22/redmagic_4c/buzzard-4_1.9.2+1-6c_run_redmapper_v6.4.22_redmagic_highlum_1.0-04.fit', + #'/nfs/slac/g/ki/ki19/des/erykoff/clusters/mocks/Buzzard/buzzard-1.9.2+1/des-y1a1/redmapper_v6.4.22/redmagic_4d/buzzard-4_1.9.2+1-6d_run_redmapper_v6.4.22_redmagic_highlum_1.0-04.fit', + '/nfs/slac/g/ki/ki19/des/erykoff/clusters/mocks/Buzzard/buzzard-1.9.2+1/des-y1a1/redmapper_v6.4.22/redmagic_4e/buzzard-4_1.9.2+1-6e_run_redmapper_v6.4.22_redmagic_highlum_1.0-04.fit', + '/nfs/slac/g/ki/ki19/des/erykoff/clusters/mocks/Buzzard/buzzard-1.9.2+1/des-y1a1/redmapper_v6.4.22/redmagic_4f/buzzard-4_1.9.2+1-6f_run_redmapper_v6.4.22_redmagic_highlum_1.0-04.fit', ] -lss_y1 = [ - '/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-0/a/Buzzard_v1.6_Y1a_gold.fits', - '/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-0/b/Buzzard_v1.6_Y1b_gold.fits', - '/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-0/c/Buzzard_v1.6_Y1c_gold.fits', - '/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-0/d/Buzzard_v1.6_Y1d_gold.fits', - '/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-0/e/Buzzard_v1.6_Y1e_gold.fits', - '/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-0/f/Buzzard_v1.6_Y1f_gold.fits', - - '/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-1/a/Buzzard_v1.6_Y1a_gold.fits', - '/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-1/b/Buzzard_v1.6_Y1b_gold.fits', - '/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-1/c/Buzzard_v1.6_Y1c_gold.fits', - '/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-1/d/Buzzard_v1.6_Y1d_gold.fits', - '/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-1/e/Buzzard_v1.6_Y1e_gold.fits', - '/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-1/f/Buzzard_v1.6_Y1f_gold.fits', - - '/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-2/a/Buzzard_v1.6_Y1a_gold.fits', - '/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-2/b/Buzzard_v1.6_Y1b_gold.fits', - '/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-2/c/Buzzard_v1.6_Y1c_gold.fits', - '/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-2/d/Buzzard_v1.6_Y1d_gold.fits', - '/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-2/e/Buzzard_v1.6_Y1e_gold.fits', - '/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-2/f/Buzzard_v1.6_Y1f_gold.fits', - - '/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-3/a/Buzzard_v1.6_Y1a_gold.fits', - '/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-3/b/Buzzard_v1.6_Y1b_gold.fits', - '/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-3/c/Buzzard_v1.6_Y1c_gold.fits', - '/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-3/d/Buzzard_v1.6_Y1d_gold.fits', - '/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-3/e/Buzzard_v1.6_Y1e_gold.fits', - '/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-3/f/Buzzard_v1.6_Y1f_gold.fits', - - '/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-5/a/Buzzard_v1.6_Y1a_gold.fits', - '/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-5/b/Buzzard_v1.6_Y1b_gold.fits', - '/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-5/c/Buzzard_v1.6_Y1c_gold.fits', - '/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-5/d/Buzzard_v1.6_Y1d_gold.fits', - '/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-5/e/Buzzard_v1.6_Y1e_gold.fits', - '/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-5/f/Buzzard_v1.6_Y1f_gold.fits', - - '/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-21/a/Buzzard_v1.6_Y1a_gold.fits', - '/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-21/b/Buzzard_v1.6_Y1b_gold.fits', - '/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-21/c/Buzzard_v1.6_Y1c_gold.fits', - '/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-21/d/Buzzard_v1.6_Y1d_gold.fits', - '/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-21/e/Buzzard_v1.6_Y1e_gold.fits', - '/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-21/f/Buzzard_v1.6_Y1f_gold.fits', +rm_y1_HHL = [ + '/nfs/slac/g/ki/ki19/des/erykoff/clusters/mocks/Buzzard/buzzard-1.9.2+1/des-y1a1/redmapper_v6.4.22/redmagic_3a/buzzard-3_1.9.2+1-6a_run_redmapper_v6.4.22_redmagic_higherlum_1.5-01.fit', + '/nfs/slac/g/ki/ki19/des/erykoff/clusters/mocks/Buzzard/buzzard-1.9.2+1/des-y1a1/redmapper_v6.4.22/redmagic_3b/buzzard-3_1.9.2+1-6b_run_redmapper_v6.4.22_redmagic_higherlum_1.5-01.fit', + '/nfs/slac/g/ki/ki19/des/erykoff/clusters/mocks/Buzzard/buzzard-1.9.2+1/des-y1a1/redmapper_v6.4.22/redmagic_3c/buzzard-3_1.9.2+1-6c_run_redmapper_v6.4.22_redmagic_higherlum_1.5-01.fit', + '/nfs/slac/g/ki/ki19/des/erykoff/clusters/mocks/Buzzard/buzzard-1.9.2+1/des-y1a1/redmapper_v6.4.22/redmagic_3d/buzzard-3_1.9.2+1-6d_run_redmapper_v6.4.22_redmagic_higherlum_1.5-01.fit', + '/nfs/slac/g/ki/ki19/des/erykoff/clusters/mocks/Buzzard/buzzard-1.9.2+1/des-y1a1/redmapper_v6.4.22/redmagic_3e/buzzard-3_1.9.2+1-6e_run_redmapper_v6.4.22_redmagic_higherlum_1.5-01.fit', + '/nfs/slac/g/ki/ki19/des/erykoff/clusters/mocks/Buzzard/buzzard-1.9.2+1/des-y1a1/redmapper_v6.4.22/redmagic_3f/buzzard-3_1.9.2+1-6f_run_redmapper_v6.4.22_redmagic_higherlum_1.5-01.fit', + + '/nfs/slac/g/ki/ki19/des/erykoff/clusters/mocks/Buzzard/buzzard-1.9.2+1/des-y1a1/redmapper_v6.4.22/redmagic_4a/buzzard-4_1.9.2+1-6a_run_redmapper_v6.4.22_redmagic_higherlum_1.5-01.fit', + '/nfs/slac/g/ki/ki19/des/erykoff/clusters/mocks/Buzzard/buzzard-1.9.2+1/des-y1a1/redmapper_v6.4.22/redmagic_4b/buzzard-4_1.9.2+1-6b_run_redmapper_v6.4.22_redmagic_higherlum_1.5-01.fit', + '/nfs/slac/g/ki/ki19/des/erykoff/clusters/mocks/Buzzard/buzzard-1.9.2+1/des-y1a1/redmapper_v6.4.22/redmagic_4c/buzzard-4_1.9.2+1-6c_run_redmapper_v6.4.22_redmagic_higherlum_1.5-01.fit', + #'/nfs/slac/g/ki/ki19/des/erykoff/clusters/mocks/Buzzard/buzzard-1.9.2+1/des-y1a1/redmapper_v6.4.22/redmagic_4d/buzzard-4_1.9.2+1-6d_run_redmapper_v6.4.22_redmagic_higherlum_1.5-01.fit', + '/nfs/slac/g/ki/ki19/des/erykoff/clusters/mocks/Buzzard/buzzard-1.9.2+1/des-y1a1/redmapper_v6.4.22/redmagic_4e/buzzard-4_1.9.2+1-6e_run_redmapper_v6.4.22_redmagic_higherlum_1.5-01.fit', + '/nfs/slac/g/ki/ki19/des/erykoff/clusters/mocks/Buzzard/buzzard-1.9.2+1/des-y1a1/redmapper_v6.4.22/redmagic_4f/buzzard-4_1.9.2+1-6f_run_redmapper_v6.4.22_redmagic_higherlum_1.5-01.fit', ] dm_y1 = [ - '/u/ki/jderose/public_html/bcc/catalog/particles/y1/buzzard/flock/buzzard-0/a/downsampled_particles.fits.downsample', - '/u/ki/jderose/public_html/bcc/catalog/particles/y1/buzzard/flock/buzzard-0/b/downsampled_particles.fits.downsample', - '/u/ki/jderose/public_html/bcc/catalog/particles/y1/buzzard/flock/buzzard-0/c/downsampled_particles.fits.downsample', - '/u/ki/jderose/public_html/bcc/catalog/particles/y1/buzzard/flock/buzzard-0/d/downsampled_particles.fits.downsample', - '/u/ki/jderose/public_html/bcc/catalog/particles/y1/buzzard/flock/buzzard-0/e/downsampled_particles.fits.downsample', - '/u/ki/jderose/public_html/bcc/catalog/particles/y1/buzzard/flock/buzzard-0/f/downsampled_particles.fits.downsample', - - '/u/ki/jderose/public_html/bcc/catalog/particles/y1/buzzard/flock/buzzard-1/a/downsampled_particles.fits.downsample', - '/u/ki/jderose/public_html/bcc/catalog/particles/y1/buzzard/flock/buzzard-1/b/downsampled_particles.fits.downsample', - '/u/ki/jderose/public_html/bcc/catalog/particles/y1/buzzard/flock/buzzard-1/c/downsampled_particles.fits.downsample', - '/u/ki/jderose/public_html/bcc/catalog/particles/y1/buzzard/flock/buzzard-1/d/downsampled_particles.fits.downsample', - '/u/ki/jderose/public_html/bcc/catalog/particles/y1/buzzard/flock/buzzard-1/e/downsampled_particles.fits.downsample', - '/u/ki/jderose/public_html/bcc/catalog/particles/y1/buzzard/flock/buzzard-1/f/downsampled_particles.fits.downsample', - - '/u/ki/jderose/public_html/bcc/catalog/particles/y1/buzzard/flock/buzzard-2/a/downsampled_particles.fits.downsample', - '/u/ki/jderose/public_html/bcc/catalog/particles/y1/buzzard/flock/buzzard-2/b/downsampled_particles.fits.downsample', - '/u/ki/jderose/public_html/bcc/catalog/particles/y1/buzzard/flock/buzzard-2/c/downsampled_particles.fits.downsample', - '/u/ki/jderose/public_html/bcc/catalog/particles/y1/buzzard/flock/buzzard-2/d/downsampled_particles.fits.downsample', - '/u/ki/jderose/public_html/bcc/catalog/particles/y1/buzzard/flock/buzzard-2/e/downsampled_particles.fits.downsample', - '/u/ki/jderose/public_html/bcc/catalog/particles/y1/buzzard/flock/buzzard-2/f/downsampled_particles.fits.downsample', - - '/u/ki/jderose/public_html/bcc/catalog/particles/y1/buzzard/flock/buzzard-21/a/downsampled_particles.fits.downsample', - '/u/ki/jderose/public_html/bcc/catalog/particles/y1/buzzard/flock/buzzard-21/b/downsampled_particles.fits.downsample', - '/u/ki/jderose/public_html/bcc/catalog/particles/y1/buzzard/flock/buzzard-21/c/downsampled_particles.fits.downsample', - '/u/ki/jderose/public_html/bcc/catalog/particles/y1/buzzard/flock/buzzard-21/d/downsampled_particles.fits.downsample', - '/u/ki/jderose/public_html/bcc/catalog/particles/y1/buzzard/flock/buzzard-21/e/downsampled_particles.fits.downsample', - '/u/ki/jderose/public_html/bcc/catalog/particles/y1/buzzard/flock/buzzard-21/f/downsampled_particles.fits.downsample', - - '/u/ki/jderose/public_html/bcc/catalog/particles/y1/buzzard/flock/buzzard-3/a/downsampled_particles.fits.downsample', - '/u/ki/jderose/public_html/bcc/catalog/particles/y1/buzzard/flock/buzzard-3/b/downsampled_particles.fits.downsample', - '/u/ki/jderose/public_html/bcc/catalog/particles/y1/buzzard/flock/buzzard-3/c/downsampled_particles.fits.downsample', - '/u/ki/jderose/public_html/bcc/catalog/particles/y1/buzzard/flock/buzzard-3/d/downsampled_particles.fits.downsample', - '/u/ki/jderose/public_html/bcc/catalog/particles/y1/buzzard/flock/buzzard-3/e/downsampled_particles.fits.downsample', - '/u/ki/jderose/public_html/bcc/catalog/particles/y1/buzzard/flock/buzzard-3/f/downsampled_particles.fits.downsample', - - '/u/ki/jderose/public_html/bcc/catalog/particles/y1/buzzard/flock/buzzard-5/a/downsampled_particles.fits.downsample', - '/u/ki/jderose/public_html/bcc/catalog/particles/y1/buzzard/flock/buzzard-5/b/downsampled_particles.fits.downsample', - '/u/ki/jderose/public_html/bcc/catalog/particles/y1/buzzard/flock/buzzard-5/c/downsampled_particles.fits.downsample', - '/u/ki/jderose/public_html/bcc/catalog/particles/y1/buzzard/flock/buzzard-5/d/downsampled_particles.fits.downsample', - '/u/ki/jderose/public_html/bcc/catalog/particles/y1/buzzard/flock/buzzard-5/e/downsampled_particles.fits.downsample', - '/u/ki/jderose/public_html/bcc/catalog/particles/y1/buzzard/flock/buzzard-5/f/downsampled_particles.fits.downsample', + '/nfs/slac/des/fs1/g/sims/jderose/BCC/Chinchilla/Herd//Chinchilla-0/downsample_particles/y1a/downsampled_particles.fits', + '/nfs/slac/des/fs1/g/sims/jderose/BCC/Chinchilla/Herd//Chinchilla-0/downsample_particles/y1b/downsampled_particles.fits', + '/nfs/slac/des/fs1/g/sims/jderose/BCC/Chinchilla/Herd//Chinchilla-0/downsample_particles/y1c/downsampled_particles.fits', + #'/nfs/slac/des/fs1/g/sims/jderose/BCC/Chinchilla/Herd//Chinchilla-0/downsample_particles/y1d/downsampled_particles.fits', + '/nfs/slac/des/fs1/g/sims/jderose/BCC/Chinchilla/Herd//Chinchilla-0/downsample_particles/y1e/downsampled_particles.fits', + '/nfs/slac/des/fs1/g/sims/jderose/BCC/Chinchilla/Herd//Chinchilla-0/downsample_particles/y1f/downsampled_particles.fits', + + '/nfs/slac/des/fs1/g/sims/jderose/BCC/Chinchilla/Herd//Chinchilla-1/downsample_particles/y1a/downsampled_particles.fits', + '/nfs/slac/des/fs1/g/sims/jderose/BCC/Chinchilla/Herd//Chinchilla-1/downsample_particles/y1b/downsampled_particles.fits', + '/nfs/slac/des/fs1/g/sims/jderose/BCC/Chinchilla/Herd//Chinchilla-1/downsample_particles/y1c/downsampled_particles.fits', + '/nfs/slac/des/fs1/g/sims/jderose/BCC/Chinchilla/Herd//Chinchilla-1/downsample_particles/y1d/downsampled_particles.fits', + '/nfs/slac/des/fs1/g/sims/jderose/BCC/Chinchilla/Herd//Chinchilla-1/downsample_particles/y1e/downsampled_particles.fits', + '/nfs/slac/des/fs1/g/sims/jderose/BCC/Chinchilla/Herd//Chinchilla-1/downsample_particles/y1f/downsampled_particles.fits', + + '/nfs/slac/des/fs1/g/sims/jderose/BCC/Chinchilla/Herd//Chinchilla-2/downsample_particles/y1a/downsampled_particles.fits', + '/nfs/slac/des/fs1/g/sims/jderose/BCC/Chinchilla/Herd//Chinchilla-2/downsample_particles/y1b/downsampled_particles.fits', + '/nfs/slac/des/fs1/g/sims/jderose/BCC/Chinchilla/Herd//Chinchilla-2/downsample_particles/y1c/downsampled_particles.fits', + '/nfs/slac/des/fs1/g/sims/jderose/BCC/Chinchilla/Herd//Chinchilla-2/downsample_particles/y1d/downsampled_particles.fits', + '/nfs/slac/des/fs1/g/sims/jderose/BCC/Chinchilla/Herd//Chinchilla-2/downsample_particles/y1e/downsampled_particles.fits', + '/nfs/slac/des/fs1/g/sims/jderose/BCC/Chinchilla/Herd//Chinchilla-2/downsample_particles/y1f/downsampled_particles.fits', + + '/nfs/slac/des/fs1/g/sims/jderose/BCC/Chinchilla/Herd//Chinchilla-5/downsample_particles/y1a/downsampled_particles.fits', + '/nfs/slac/des/fs1/g/sims/jderose/BCC/Chinchilla/Herd//Chinchilla-5/downsample_particles/y1b/downsampled_particles.fits', + '/nfs/slac/des/fs1/g/sims/jderose/BCC/Chinchilla/Herd//Chinchilla-5/downsample_particles/y1c/downsampled_particles.fits', + '/nfs/slac/des/fs1/g/sims/jderose/BCC/Chinchilla/Herd//Chinchilla-5/downsample_particles/y1d/downsampled_particles.fits', + '/nfs/slac/des/fs1/g/sims/jderose/BCC/Chinchilla/Herd//Chinchilla-5/downsample_particles/y1e/downsampled_particles.fits', + '/nfs/slac/des/fs1/g/sims/jderose/BCC/Chinchilla/Herd//Chinchilla-5/downsample_particles/y1f/downsampled_particles.fits', + ] diff --git a/tricorder/plottools.py b/tricorder/plottools.py new file mode 100644 index 0000000..9b5a3e3 --- /dev/null +++ b/tricorder/plottools.py @@ -0,0 +1,474 @@ +from __future__ import division +import numpy as np +import matplotlib.pyplot as plt +import paths +from astropy.io import fits + +import yaml +import treecorr +import emcee +import chainconsumer +from sklearn.decomposition import PCA + +from glob import glob + +def load_config(config_fname): + config_path = '/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new2/configs/'+config_fname+'.config' + with open(config_path) as f: + return yaml.load(f.read()) + +def get_q(config_name,fname): + config = load_config(config_name) + corr = treecorr.NNNCorrelation(config=config['3PCF']) + dd = treecorr.NNCorrelation(config=config['2PCF']) + zeta = np.load(fname) + xi = np.load(fname[:-8]+'xi.npy') + + from scipy.interpolate import UnivariateSpline + yfit = UnivariateSpline(dd.logr[xi != 0],np.log(xi)[xi != 0],k=4) + xi1 = np.exp(yfit(corr.logr*(1+corr.u*np.abs(corr.v)))) + xi2 = np.exp(yfit(corr.logr)) + xi3 = np.exp(yfit(corr.logr*corr.u)) + denom = (xi1*xi2+xi2*xi3+xi3*xi1) + return zeta/denom + +def plot_qarr(qvec,**kwargs): + q_mean = np.mean(qvec,axis=0) + q_std = np.std(qvec,axis=0) + v = np.linspace(-1,1,qvec.shape[2])[:,np.newaxis]*np.ones_like(q_mean.T) + for row in np.arange(v.shape[1]): + plt.errorbar(v[:,row]+.03*row,q_mean.T[:,row],yerr=q_std.T[:,row],**kwargs) + plt.xlabel('v') + plt.ylabel('q') + +def infer_bias(q_dm_infer,q_gal_infer,icov,use_covmat=True): + def lnprior(theta): + b1, b2 = theta + if 0 < b1 < 10 and -10 < b2 < 10: + return 0.0 + return -np.inf + + def lnprob_noerror(bias): + ln_prior = lnprior(bias) + b1 = bias[0] + b2 = bias[1] + return -.5*np.sum((((q_gal_infer-q_dm_infer/b1-b2/(2*b1**2))**2)/icov)) + ln_prior + + def lnprob(bias): + ln_prior = lnprior(bias) + b1 = bias[0] + b2 = bias[1] + resid = (q_gal_infer-q_dm_infer/b1-b2/(2*b1**2)) + return -.5*np.matmul(resid,np.matmul(icov,resid)) + ln_prior + #return -.5*np.sum(np.dot(np.dot(resid,icov),resid)) + ln_prior + + ndim, nwalkers = 2, 50 + p0 = [np.array([10*np.random.rand(),20*np.random.rand()-10]) for i in range(nwalkers)] + + if use_covmat: + sampler = emcee.EnsembleSampler(nwalkers, ndim, lnprob) + else: + sampler = emcee.EnsembleSampler(nwalkers, ndim, lnprob_noerror) + sampler.run_mcmc(p0, 10000) + + cc = chainconsumer.ChainConsumer() + cc.add_chain(sampler.flatchain,parameters=['b1','b2'],name='3pt ZSPEC') + summary = cc.analysis.get_summary() + b1=summary['b1'][1] + b2=summary['b2'][1] + resid = (q_gal_infer-q_dm_infer/b1-b2/(2*b1**2)) + print 'chisq is: ', str(.5*np.sum(np.dot(np.dot(resid,icov),resid))) + print 'alt: ', .5*np.matmul(np.matmul(resid,icov),resid) + + #cc = chainconsumer.ChainConsumer() + #cc.add_chain(sampler.flatchain,parameters=['b1','b2']) + + #cc.plotter.plot(figsize='column',extents=[(0,3),(-1,1)]); + return sampler + +def infer_bias_2pt(xi_gal,xi_dm,icov,use_covmat=True,plot=False): + def lnprior(theta): + b1 = theta + if 0 < b1 < 10: + return 0.0 + return -np.inf + + def lnprob_noerror(bias): + ln_prior = lnprior(bias) + b1 = bias + return -.5*np.sum(((xi_gal-xi_dm*(b1**2))**2/icov)) + ln_prior + + def lnprob(bias): + ln_prior = lnprior(bias) + b1 = bias + resid = (xi_gal-xi_dm*(b1**2)) + return -5.*np.sum(np.dot(np.dot(resid.T,icov),resid)) + ln_prior + + ndim, nwalkers = 1, 100 + p0 = [np.array([3*np.random.rand()]) for i in range(nwalkers)] + + if use_covmat: + sampler = emcee.EnsembleSampler(nwalkers, ndim, lnprob) + else: + sampler = emcee.EnsembleSampler(nwalkers, ndim, lnprob_noerror) + sampler.run_mcmc(p0, 1000) + + cc = chainconsumer.ChainConsumer() + cc.add_chain(sampler.flatchain,parameters=['b1']) + if plot: + cc.plotter.plot(figsize='column',extents=[(0,3)]); + return np.mean(sampler.flatchain), np.std(sampler.flatchain) + +def plot_data_vectors(qdm,qrm,v=None,b1=1,b2=0,b1MAP=1,b2MAP=0,rm_color='g',dm_color='b'): + qdm_mean = np.mean(qdm,axis=0) + qdm_std = np.std(qdm,axis=0) + + qrm_mean = np.mean(qrm,axis=0) + qrm_std = np.std(qrm,axis=0) + + if v is None: + v = np.arange(qrm.shape[1]) + plt.xlabel('Data Vector Index') + else: + plt.xlabel('v') + + plt.errorbar(v,qdm_mean/b1+b2/(b1**2),yerr=qdm_std/np.sqrt(qdm.shape[0]),label='DM',color=dm_color) + plt.errorbar(v,qrm_mean,yerr=qrm_std,label='Galaxies',color=rm_color) + if b1 != 1: + plt.title('Best-fit dark matter') + else: + plt.title('Data Vectors') + plt.ylabel('q') + plt.legend() + +def make_inference(red_qdm,red_qrm,covmat_src=None,max_pca_comps=None,is11k=False): + + if max_pca_comps is None: + rmcov = np.cov(red_qrm.T) + dmcov = np.cov(red_qdm.T) + else: + pca = PCA(n_components = max_pca_comps) + pca.fit(red_qrm) + print pca.explained_variance_ratio_ + rmcov = pca.get_covariance() + + if covmat_src is None: + #icov = np.linalg.inv(dmcov/red_qdm.shape[0]+rmcov) + if is11k: + #icov = np.linalg.inv(rmcov/len(red_qrm)+dmcov/len(red_qdm)) + # corrected for https://arxiv.org/pdf/astro-ph/0608064.pdf + icov = np.linalg.inv(rmcov/len(red_qrm)+dmcov/len(red_qdm))*(len(red_qrm)-red_qrm.shape[1]-1)/(len(red_qrm)-1) + #Let's see how it goes taking out the DM errors: + #icov = np.linalg.inv(rmcov/len(red_qrm))*(len(red_qrm)-red_qrm.shape[1]-1)/(len(red_qrm)-1) + else: + #icov = np.linalg.inv(rmcov+dmcov/len(red_qdm)) + # corrected for https://arxiv.org/pdf/astro-ph/0608064.pdf + icov = np.linalg.inv(rmcov+dmcov/len(red_qdm))*(len(red_qrm)-red_qrm.shape[1]-1)/(len(red_qrm)-1) + #Let's see how it goes taking out the DM errors: + #icov = np.linalg.inv(rmcov)*(len(red_qrm)-red_qrm.shape[1]-1)/(len(red_qrm)-1) + qrm_mean = np.mean(red_qrm,axis=0) + qdm_mean = np.mean(red_qdm,axis=0) + else: + qrm_mean = red_qrm + qdm_mean = red_qdm + icov = np.linalg.inv(covmat_src) + samples = infer_bias(qdm_mean,qrm_mean,icov,use_covmat=True) + + #cc = chainconsumer.ChainConsumer() + #cc.add_chain(samples.flatchain,parameters=['b1','b2'],name='3pt ZSPEC') + #cc.plotter.plot(figsize='column',extents=[(0,3),(-1,1)]); + + return samples + +from glob import glob +import os.path +import matplotlib.pyplot as plt +import treecorr +import yaml +import paths +import numpy as np +import pandas as pd +def load_config(config_fname): + config_path = '/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new2/configs/'+config_fname+'.config' + with open(config_path) as f: + return yaml.load(f.read()) + +def compress_dv(qdm1): + return ((qdm1[:,5:] + np.flip(qdm1[:,:5],axis=1))/2.0).reshape(qdm1.shape[0],5)[:,-5:] + + + + +def load_res(path,dset_name,dset_id,config_fname,zvar,min_z,max_z,rsamp_str,sigma=0,norm=True): + first_done = False + for jk_id in range(15): + try: + this = load_files(path,dset_name,dset_id,config_fname,zvar,min_z,max_z,rsamp_str,sigma,return_all_norm=norm,jk_id=jk_id,config=config_fname) + except IOError: + continue + this['JK'] = jk_id + if not first_done: + res1 = this + first_done = True + else: + res1 = pd.concat([res1,this],ignore_index=True) + return res1 + +def load_res_indep(path,dset_name,config_fname,zvar,min_z,max_z,rsamp_str,norm=True,sigma=0,use_alt_randoms=True): + first_done = False + for dset_id in range(24): + try: + this = load_files(path,dset_name,dset_id,config_fname,zvar,min_z,max_z,rsamp_str,sigma,return_all_norm=norm,config=config_fname,use_alt_randoms=use_alt_randoms) + except IOError: + continue + this['DSET'] = dset_id + if not first_done: + res1 = this + first_done = True + else: + res1 = pd.concat([res1,this],ignore_index=True) + return res1 + +def load_res_indep2(path,dset_name,config_fname,zvar,min_z,max_z,rsamp_str,norm=False): + first_done = False + for dset_id in range(24): + if norm: + try: + this = load_files(path+config_fname+'_'+dset_name+'dset0_jk'+str(dset_id)+'_sigma0_'+zvar+'_'+str(min_z)+'_'+str(max_z)+'_rsamp'+rsamp_str,return_all_norm=True) + except IOError: + continue + else: + try: + this = load_files(path+config_fname+'_'+dset_name+'dset0_jk'+str(dset_id)+'_sigma0_'+zvar+'_'+str(min_z)+'_'+str(max_z)+'_rsamp'+rsamp_str,return_all=True) + except IOError: + continue + this['DSET'] = dset_id + if not first_done: + res1 = this + first_done = True + else: + res1 = pd.concat([res1,this],ignore_index=True) + return res1 + +def load_res_xi(path,dset_name,dset_id,config_fname,min_z,max_z,rsamp_str): + xilist = [] + for jk_id in range(15): + try: + this = np.load(path+config_fname+'_'+dset_name+'dset'+str(dset_id)+'_jk'+str(jk_id)+'_sigma0_ZSPEC_'+str(min_z)+'_'+str(max_z)+'_rsamp'+rsamp_str+'.xi.npy') + except IOError: + continue + xilist.append(this.flatten()) + return xilist + +def load_res_xi_indep(path,dset_name,config_fname,min_z,max_z,rsamp_str,zvar='ZSPEC',sigma=0): + xilist = [] + for dset_id in range(24): + try: + this = np.load(path+config_fname+'_'+dset_name+'dset'+str(dset_id)+'_jk-1_sigma'+str(sigma)+'_'+zvar+'_'+str(min_z)+'_'+str(max_z)+'_rsamp'+rsamp_str+'.xi.npy') + except IOError: + continue + xilist.append(this.flatten()) + return xilist + +def load_files(path,dset_name,dset_id,config_fname,zvar,min_z,max_z,rsamp_str,sigma=0,get_q=True,jk_id=-1,config='newpaper13.1',return_all=False,return_all_norm=False,use_alt_randoms=True): + runname = config_fname+'_'+dset_name+'dset'+str(dset_id)+'_jk'+str(jk_id)+'_sigma'+str(sigma)+'_'+zvar+'_'+str(min_z)+'_'+str(max_z)+'_rsamp'+rsamp_str + ddd = treecorr.NNNCorrelation(config=load_config(config)['3PCF']) + ddd.read(path+runname+'.ddd') + ddr = treecorr.NNNCorrelation(config=load_config(config)['3PCF']) + ddr.read(path+runname+'.ddr') + drd = treecorr.NNNCorrelation(config=load_config(config)['3PCF']) + drd.read(path+runname+'.drd') + rdd = treecorr.NNNCorrelation(config=load_config(config)['3PCF']) + rdd.read(path+runname+'.rdd') + rrd = treecorr.NNNCorrelation(config=load_config(config)['3PCF']) + rrd.read(path+runname+'.rrd') + drr = treecorr.NNNCorrelation(config=load_config(config)['3PCF']) + drr.read(path+runname+'.drr') + rdr = treecorr.NNNCorrelation(config=load_config(config)['3PCF']) + rdr.read(path+runname+'.rdr') + rrr = treecorr.NNNCorrelation(config=load_config(config)['3PCF']) + try: + rrr.read(path+runname+'.rrr') + except IOError: + print 'missing randoms' + if use_alt_randoms: + print 'using new randoms' + newrunnamelist = glob(path+config_fname+'_'+dset_name+'dset*_jk'+str(jk_id)+'_sigma'+str(sigma)+'_'+zvar+'_'+str(min_z)+'_'+str(max_z)+'_rsamp'+rsamp_str+'.rrr') + if newrunnamelist != []: + newrunname = newrunnamelist[-1] + print newrunname + rrr.read(newrunname) + print rrr.ntri + else: + print 'couldnt find alternate rrr file' + raise IOError + else: + raise IOError + + corr = treecorr.NNNCorrelation(config = load_config(config)['3PCF']) + dd = treecorr.NNCorrelation(config = load_config(config)['2PCF']) + zeta = (ddd.ntri/ddd.tot - ddr.ntri/ddr.tot - drd.ntri/drd.tot - rdd.ntri/rdd.tot + rrd.ntri/rrd.tot + drr.ntri/drr.tot + rdr.ntri/rdr.tot - rrr.ntri/rrr.tot)/(rrr.ntri/rrr.tot) + dddrrr = ddd.ntri/ddd.tot/(rrr.ntri/rrr.tot) + oldest = (ddd.ntri/ddd.tot - ddr.ntri/ddr.tot - drd.ntri/drd.tot - rdd.ntri/rdd.tot)/(rrr.ntri/rrr.tot) + 2 + + xi = np.load(path+runname+'.xi.npy') + + from scipy.interpolate import UnivariateSpline + + yfit = UnivariateSpline(dd.logr[xi != 0],np.log(xi)[xi != 0],k=4) + xi1 = np.exp(yfit(corr.logr*(1+corr.u*np.abs(corr.v)))) + xi2 = np.exp(yfit(corr.logr)) + xi3 = np.exp(yfit(corr.logr*corr.u)) + denom = (xi1*xi2+xi2*xi3+xi3*xi1) + + #insert elisabeth stuff here + + yfit = UnivariateSpline(dd.logr[xi != 0],np.log(xi)[xi != 0],k=4) + xi1 = np.exp(yfit(np.log(np.exp(corr.logr)*(1+corr.u*np.abs(corr.v))))) + xi2 = np.exp(yfit(np.log(np.exp(corr.logr)))) + xi3 = np.exp(yfit(np.log(np.exp(corr.logr)*corr.u))) + correct_denom = (xi1*xi2+xi2*xi3+xi3*xi1) + + if return_all: + return pd.DataFrame(np.array([ddd.ntri.flatten().T,ddr.ntri.flatten().T,drd.ntri.flatten().T, + rdd.ntri.flatten().T,drr.ntri.flatten().T,rdr.ntri.flatten().T, + rrd.ntri.flatten().T,rrr.ntri.flatten().T,zeta.flatten().T,(zeta/denom).flatten().T, dddrrr.flatten().T, oldest.flatten().T]).T, columns=['DDD','DDR','DRD','RDD','DRR','RDR','RRD','RRR','ZETA','Q','DDD/RRR','OLDEST']) + + if return_all_norm: + return pd.DataFrame(np.array([ddd.ntri.flatten().T/ddd.tot,ddr.ntri.flatten().T/ddr.tot,drd.ntri.flatten().T/drd.tot, + rdd.ntri.flatten().T/rdd.tot,drr.ntri.flatten().T/drr.tot,rdr.ntri.flatten().T/rdr.tot, + rrd.ntri.flatten().T/rrd.tot,rrr.ntri.flatten().T/rrr.tot,zeta.flatten().T,denom.flatten().T, correct_denom.flatten().T, (zeta/correct_denom).flatten().T, dddrrr.flatten().T, oldest.flatten().T]).T, columns=['DDD','DDR','DRD','RDD','DRR','RDR','RRD','RRR','ZETA','DENOM','CORRECTDENOM','Q','DDD/RRR','OLDEST']) + + if get_q: + return zeta/denom + else: + return zeta + +def old_load_files(runname,rsamp,get_q=True,config='paper13.1',return_all=False): + path = '' + print len(glob(path+runname+'*')) + ddd = treecorr.NNNCorrelation(config=load_config(config)['3PCF']) + ddd.read(path+runname+'.ddd') + ddr = treecorr.NNNCorrelation(config=load_config(config)['3PCF']) + ddr.read(path+runname+'.ddr') + drd = treecorr.NNNCorrelation(config=load_config(config)['3PCF']) + drd.read(path+runname+'.drd') + rdd = treecorr.NNNCorrelation(config=load_config(config)['3PCF']) + rdd.read(path+runname+'.rdd') + rrd = treecorr.NNNCorrelation(config=load_config(config)['3PCF']) + rrd.read(path+runname+'.rrd') + drr = treecorr.NNNCorrelation(config=load_config(config)['3PCF']) + drr.read(path+runname+'.drr') + rdr = treecorr.NNNCorrelation(config=load_config(config)['3PCF']) + rdr.read(path+runname+'.rdr') + rrr = treecorr.NNNCorrelation(config=load_config(config)['3PCF']) + rrr.read(path+runname+'.rrr') + + corr = treecorr.NNNCorrelation(config = load_config(config)['3PCF']) + dd = treecorr.NNCorrelation(config = load_config(config)['2PCF']) + zeta = (ddd.ntri - ddr.ntri/rsamp - drd.ntri/rsamp - rdd.ntri/rsamp + rrd.ntri/rsamp**2 + drr.ntri/rsamp**2 + rdr.ntri/rsamp**2 - rrr.ntri/rsamp**3)/(rrr.ntri/rsamp**3) + + xi = np.load(path+runname+'.xi.npy') + + from scipy.interpolate import UnivariateSpline + yfit = UnivariateSpline(dd.logr[xi != 0],np.log(xi)[xi != 0],k=4) + xi1 = np.exp(yfit(corr.logr*(1+corr.u*np.abs(corr.v)))) + xi2 = np.exp(yfit(corr.logr)) + xi3 = np.exp(yfit(corr.logr*corr.u)) + denom = (xi1*xi2+xi2*xi3+xi3*xi1) + + if return_all: + print zeta.flatten() + return pd.DataFrame(np.array([ddd.ntri.flatten().T,ddr.ntri.flatten().T,drd.ntri.flatten().T, + rdd.ntri.flatten().T,drr.ntri.flatten().T,rdr.ntri.flatten().T, + rrd.ntri.flatten().T,rrr.ntri.flatten().T,zeta.flatten().T,(zeta/denom).flatten().T]).T, columns=['DDD','DDR','DRD','RDD','DRR','RDR','RRD','RRR','ZETA','Q']) + + if get_q: + return zeta/denom + else: + return zeta + +def load_files2(runname,rsamp): + ddd = treecorr.NNNCorrelation(config=load_config('paper13.1')['3PCF']) + ddd.read(path+runname+'.ddd') + rrr = treecorr.NNNCorrelation(config=load_config('paper13.1')['3PCF']) + rrr.read(path+runname+'.rrr') + return (ddd.ntri - rrr.ntri/rsamp**3)/(rrr.ntri/rsamp**3) + +def load_files3(runname,rsamp): + ddd = treecorr.NNNCorrelation(config=load_config('paper13.1')['3PCF']) + ddd.read(path+runname+'.ddd') + ddr = treecorr.NNNCorrelation(config=load_config('paper13.1')['3PCF']) + ddr.read(path+runname+'.ddr') + drd = treecorr.NNNCorrelation(config=load_config('paper13.1')['3PCF']) + drd.read(path+runname+'.drd') + rdd = treecorr.NNNCorrelation(config=load_config('paper13.1')['3PCF']) + rdd.read(path+runname+'.rdd') + rrr = treecorr.NNNCorrelation(config=load_config('paper13.1')['3PCF']) + rrr.read(path+runname+'.rrr') + return (ddd.ntri - ddr.ntri/(rsamp) - drd.ntri/(rsamp) - rdd.ntri/(rsamp))/(rrr.ntri/rsamp**3) + 2 + + +def plot_data_vectors(qdm,qrm,v=None,b1=1,b2=0,b1MAP=1,b2MAP=0,rm_color='g',dm_color='b'): + qdm_mean = np.mean(qdm,axis=0) + qdm_std = np.std(qdm,axis=0) + + qrm_mean = np.mean(qrm,axis=0) + qrm_std = np.std(qrm,axis=0) + + if v is None: + v = np.arange(qrm.shape[1]) + plt.xlabel('Data Vector Index') + else: + plt.xlabel('v') + + plt.errorbar(v,qdm_mean/b1+b2/(b1**2),yerr=qdm_std/np.sqrt(qdm.shape[0]),label='DM',color=dm_color) + plt.errorbar(v,qrm_mean,yerr=qrm_std,label='Galaxies',color=rm_color) + if b1 != 1: + plt.title('Best-fit dark matter') + else: + plt.title('Data Vectors') + plt.ylabel('q') + plt.legend() + +def plot_dv(res,var,indiv_runs=True,offset=0,compressed=False,**kwargs): + if compressed: + if indiv_runs: + plt.plot(np.linspace(.1,.9,5),compress_dv(res[var].values.reshape(-1,10)).T,alpha=.3,color=kwargs['color']) + plt.errorbar(np.linspace(.1,.9,5)+offset,np.mean(compress_dv(res[var].values.reshape(-1,10)),axis=0), + yerr=np.std(compress_dv(res[var].values.reshape(-1,10)),axis=0),**kwargs) + else: + if indiv_runs: + plt.plot(np.linspace(-.9,.9,10),res[var].values.reshape(-1,10).T,alpha=.3,color=kwargs['color']) + plt.errorbar(np.linspace(-.9,.9,10)+offset,np.mean(res[var].values.reshape(-1,10),axis=0), + yerr=np.std(res[var].values.reshape(-1,10),axis=0),**kwargs) + +def get_max_like(red_qdm,red_qrm): + b1 = np.linspace(0, 3, 300) + b2 = np.linspace(-3, 3, 300) + z = np.zeros((len(b2),len(b1))) + icov = np.linalg.inv(np.cov(red_qrm.T)+np.cov(red_qdm.T)/len(red_qdm)) + for i,tb1 in enumerate(b1): + for j,tb2 in enumerate(b2): + resid = (np.mean(red_qrm,axis=0)-np.mean(red_qdm,axis=0)/tb1-tb2/(tb1**2)) + z[j,i] = .5*np.matmul(np.matmul(resid,icov),resid) + print 'manual chisq: ', min(z[~np.isnan(z)]) + return b1, b2, z + +def get_max_like_diag(red_qdm,red_qrm): + b1 = np.arange(0, 3, 0.01) + b2 = np.arange(-1, 1, 0.01) + z2 = np.zeros((len(b2),len(b1))) + icov = np.linalg.inv(np.diag(np.cov(red_qrm.T)+np.cov(red_qdm.T)/len(red_qdm))*np.eye(5)) + for i,tb1 in enumerate(b1): + for j,tb2 in enumerate(b2): + resid = (np.mean(red_qrm,axis=0)-np.mean(red_qdm,axis=0)/tb1-tb2/(tb1**2)) + z2[j,i] = .5*np.matmul(resid,np.matmul(resid,icov)) + print 'diag chisq: ', min(z2[~np.isnan(z2)]) + return b1, b2, z2 + +def get_lazeyras_schmidt_2015(b1): + return .412-2.143*b1+.929*b1**2+.008*b1**3 + +def get_hoffman_2015(b1): + return .51-2.21*b1+1*b1**2 diff --git a/tricorder/simple.py b/tricorder/simple.py index 7b640c7..4258e4d 100644 --- a/tricorder/simple.py +++ b/tricorder/simple.py @@ -12,12 +12,11 @@ import os import paths -from simple_script import out_path, config_dir def load_config(config_fname): config_path = os.path.join( - simple_script.config_dir, config_fname+'.config') + paths.config_dir, config_fname+'.config') with open(config_path) as f: return yaml.load(f.read()) @@ -30,10 +29,9 @@ def calc_2pt(data, randoms, config_fname, zvar, random_zvar, ra_var='RA', dec_va config_2pt = load_config(config_fname)['2PCF'] cat = treecorr.Catalog(ra=data[ra_var], dec=data[dec_var], dec_units='degrees', ra_units='degrees', - r=datasets.buzzard_cosmo.comoving_distance(data[zvar]).value*datasets.buzzard_cosmo.h) + r=datasets.buzzard_cosmo.comoving_distance(data[zvar]).value) random_cat = treecorr.Catalog(ra=randoms[random_ra_var], dec=randoms[random_dec_var], - dec_units='degrees', ra_units='degrees', - r=datasets.buzzard_cosmo.comoving_distance(randoms[random_zvar]).value*datasets.buzzard_cosmo.h) + dec_units='degrees', ra_units='degrees', r=datasets.buzzard_cosmo.comoving_distance(randoms[random_zvar]).value) print config_2pt dd = treecorr.NNCorrelation(config=config_2pt) dr = treecorr.NNCorrelation(config=config_2pt) @@ -50,10 +48,10 @@ def calc_3pt(data, randoms, config_fname, zvar, random_zvar, ra_var='RA', dec_va config_3pt = load_config(config_fname)['3PCF'] cat = treecorr.Catalog(ra=data[ra_var], dec=data[dec_var], dec_units='degrees', ra_units='degrees', - r=datasets.buzzard_cosmo.comoving_distance(data[zvar]).value*datasets.buzzard_cosmo.h) + r=datasets.buzzard_cosmo.comoving_distance(data[zvar]).value) random_cat = treecorr.Catalog(ra=randoms[random_ra_var], dec=randoms[random_dec_var], dec_units='degrees', ra_units='degrees', - r=datasets.buzzard_cosmo.comoving_distance(randoms[random_zvar]).value*datasets.buzzard_cosmo.h) + r=datasets.buzzard_cosmo.comoving_distance(randoms[random_zvar]).value) print config_3pt ddd = treecorr.NNNCorrelation(config=config_3pt) ddr = treecorr.NNNCorrelation(config=config_3pt) @@ -98,11 +96,11 @@ def calc_3pt_noisy_photoz_lss(dset_id, config_fname, min_z, max_z, sigma_z, zvar xi_file_name = config_fname + '_lssdset' + \ str(dset_id)+'_sigma'+str(sigma_z)+'_'+str(min_z)+'_'+str(max_z)+'.xi' - zeta_file_name = config_fname+'_lssdset' + + zeta_file_name = config_fname+'_lssdset' + \ str(dset_id)+'_sigma'+str(sigma_z) + \ - '_'+str(min_z)+'_'+str(max_z)+'.zeta' - np.save(os.path.join(simple_script.out_dir, xi_file_name), xi) - np.save(os.path.join(simple_script.out_dir, zeta_file_name), zeta) + '_'+str(min_z)+'_'+str(max_z)+'.zeta' + np.save(os.path.join(paths.corr_out_dir, xi_file_name), xi) + np.save(os.path.join(paths.corr_out_dir, zeta_file_name), zeta) def calc_3pt_noisy_photoz_dm(dset_id, config_fname, min_z, max_z, sigma_z, zvar, random_zvar): @@ -124,14 +122,14 @@ def calc_3pt_noisy_photoz_dm(dset_id, config_fname, min_z, max_z, sigma_z, zvar, zeta = calc_3pt(data_slice, randoms_slice, config_fname, zvar, random_zvar, ra_var=ra_var, dec_var=dec_var) - xi_file_name = config_fname + + xi_file_name = config_fname + \ '_dmdset'+str(dset_id)+'_sigma'+str(sigma_z) + \ - '_'+str(min_z)+'_'+str(max_z)+'.xi' - zeta_file_name = config_fname+'_dmdset' + + '_'+str(min_z)+'_'+str(max_z)+'.xi' + zeta_file_name = config_fname+'_dmdset' + \ str(dset_id)+'_sigma'+str(sigma_z) + \ - '_'+str(min_z)+'_'+str(max_z)+'.zeta' - np.save(os.path.join(simple_script.out_dir, xi_file_name), xi) - np.save(os.path.join(simple_script.out_dir, zeta_file_name), zeta) + '_'+str(min_z)+'_'+str(max_z)+'.zeta' + np.save(os.path.join(paths.corr_out_dir, xi_file_name), xi) + np.save(os.path.join(paths.corr_out_dir, zeta_file_name), zeta) def calc_3pt_noisy_photoz_rm(dset_id, config_fname, min_z, max_z, sigma_z, zvar, random_zvar): @@ -157,11 +155,11 @@ def calc_3pt_noisy_photoz_rm(dset_id, config_fname, min_z, max_z, sigma_z, zvar, zeta = calc_3pt(data_slice, randoms_slice, config_fname, zvar, random_zvar, ra_var=ra_var, dec_var=dec_var) - xi_file_name = config_fname + + xi_file_name = config_fname + \ '_dset'+str(dset_id)+'_sigma'+str(sigma_z) + \ - '_'+str(min_z)+'_'+str(max_z)+'.xi' - zeta_file_name = config_fname+'_dset' + + '_'+str(min_z)+'_'+str(max_z)+'.xi' + zeta_file_name = config_fname+'_dset' + \ str(dset_id)+'_sigma'+str(sigma_z) + \ - '_'+str(min_z)+'_'+str(max_z)+'.zeta' - np.save(os.path.join(simple_script.out_dir, xi_file_name), xi) - np.save(os.path.join(simple_script.out_dir, zeta_file_name), zeta) + '_'+str(min_z)+'_'+str(max_z)+'.zeta' + np.save(os.path.join(paths.corr_out_dir, xi_file_name), xi) + np.save(os.path.join(paths.corr_out_dir, zeta_file_name), zeta) diff --git a/tricorder/simple_angular.py b/tricorder/simple_angular.py index 14f276f..36a60ec 100644 --- a/tricorder/simple_angular.py +++ b/tricorder/simple_angular.py @@ -1,6 +1,8 @@ #!/u/ki/mbaumer/anaconda/bin/python +from __future__ import division import matplotlib.pyplot as plt from astropy.io import fits +from astropy.table import Table import treecorr import yaml import numpy as np @@ -9,23 +11,80 @@ import tricorder import yaml import sys +import os +import paths +from glob import glob +import pandas as pd +import pickle +from tenacity import * + +from scipy.stats import binned_statistic + +np.random.seed(12) + +from make_data_randoms import (generate_randoms_radec, index_to_radec, + radec_to_index) + +#@retry(stop=stop_after_attempt(5), wait=wait_exponential(multiplier=1, min=2, max=300)+wait_random(0, 10)) +def persistent_load_fits(fpath): + print 'attempting load of ' + fpath + return fits.getdata(fpath) + def load_config(config_fname): - config_path = '/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new2/configs/'+config_fname+'.config' + config_path = os.path.join( + paths.config_dir, config_fname+'.config') with open(config_path) as f: return yaml.load(f.read()) -def get_zslice(data,min_z,max_z,zvar): + +def get_zslice(data, min_z, max_z, zvar): return data[(data[zvar] > min_z) & (data[zvar] < max_z)] -def calc_2pt(data,randoms,config_fname,zvar,random_zvar,ra_var='RA',dec_var='DEC',random_ra_var='RA',random_dec_var='DEC'): +def downselect_pz(input_data, target_cts, target_bins, input_zvar, oversamp): + + input_labels = np.digitize(input_data[input_zvar], target_bins) + + #kill overflow and underflow bins + input_data = input_data[(input_labels != 0) & (input_labels != len(target_bins))] + input_labels = input_labels[(input_labels != 0) & (input_labels != len(target_bins))] + + input_cts, _ = np.histogram( + input_data[input_zvar], bins=target_bins, range=(0, 1)) + input_weights = target_cts/(input_cts+1e-40) + return input_data[np.random.rand(len(input_data)) < oversamp*input_weights[input_labels-1]] + +def downselect(input_data, target, input_zvar, target_zvar, oversamp): + target_cts, bins = np.histogram( + target[target_zvar], range=(0, 1), bins=100) + input_labels = np.digitize(input_data[input_zvar], bins) + input_cts, _ = np.histogram( + input_data[input_zvar], bins=bins, range=(0, 1)) + input_weights = target_cts/(input_cts+1e-40) + return input_data[np.random.rand(len(input_data)) < oversamp*input_weights[input_labels-1]] + + +def calc_2pt(data, randoms, config_fname, do3D, ra_var='RA', dec_var='DEC', + random_ra_var='RA', random_dec_var='DEC', data_zvar=None, random_zvar=None,outfname=''): + if do3D: + assert data_zvar is not None + assert random_zvar is not None config_2pt = load_config(config_fname)['2PCF'] - cat = treecorr.Catalog(ra=data[ra_var],dec=data[dec_var], - dec_units='degrees',ra_units='degrees', - ) - random_cat = treecorr.Catalog(ra=randoms[random_ra_var],dec=randoms[random_dec_var], - dec_units='degrees',ra_units='degrees', - ) + if not do3D: + cat = treecorr.Catalog(ra=data[ra_var], dec=data[dec_var], + dec_units='degrees', ra_units='degrees', + ) + random_cat = treecorr.Catalog(ra=randoms[random_ra_var], dec=randoms[random_dec_var], + dec_units='degrees', ra_units='degrees', + ) + else: + cat = treecorr.Catalog(ra=data[ra_var], dec=data[dec_var], + dec_units='degrees', ra_units='degrees', + r=datasets.buzzard_cosmo.comoving_distance(data[data_zvar]).value) + random_cat = treecorr.Catalog(ra=randoms[random_ra_var], dec=randoms[random_dec_var], + dec_units='degrees', ra_units='degrees', + r=datasets.buzzard_cosmo.comoving_distance(randoms[random_zvar]).value) + print config_2pt dd = treecorr.NNCorrelation(config=config_2pt) dr = treecorr.NNCorrelation(config=config_2pt) @@ -37,153 +96,581 @@ def calc_2pt(data,randoms,config_fname,zvar,random_zvar,ra_var='RA',dec_var='DEC xi, varxi = dd.calculateXi(dr=dr, rr=rr) return xi -def calc_3pt(data,randoms,config_fname,zvar,random_zvar,ra_var='RA',dec_var='DEC',random_ra_var='RA',random_dec_var='DEC'): + +def calc_3pt(data, randoms, config_fname, do3D, ra_var='RA', + dec_var='DEC', random_ra_var='RA', random_dec_var='DEC', + data_zvar=None, random_zvar=None, outvar='zeta',outfname=''): + + if do3D: + assert data_zvar is not None + assert random_zvar is not None + config_3pt = load_config(config_fname)['3PCF'] - cat = treecorr.Catalog(ra=data[ra_var],dec=data[dec_var], - dec_units='degrees',ra_units='degrees', - ) - random_cat = treecorr.Catalog(ra=randoms[random_ra_var],dec=randoms[random_dec_var], - dec_units='degrees',ra_units='degrees', - ) + if not do3D: + cat = treecorr.Catalog(ra=data[ra_var], dec=data[dec_var], + dec_units='degrees', ra_units='degrees', + ) + random_cat = treecorr.Catalog(ra=randoms[random_ra_var], dec=randoms[random_dec_var], + dec_units='degrees', ra_units='degrees', + ) + else: + cat = treecorr.Catalog(ra=data[ra_var], dec=data[dec_var], + dec_units='degrees', ra_units='degrees', + r=datasets.buzzard_cosmo.comoving_distance(data[data_zvar]).value) + random_cat = treecorr.Catalog(ra=randoms[random_ra_var], dec=randoms[random_dec_var], + dec_units='degrees', ra_units='degrees', + r=datasets.buzzard_cosmo.comoving_distance(randoms[random_zvar]).value) + print config_3pt - ddd = treecorr.NNNCorrelation(config=config_3pt) - ddr = treecorr.NNNCorrelation(config=config_3pt) - drd = treecorr.NNNCorrelation(config=config_3pt) - rdd = treecorr.NNNCorrelation(config=config_3pt) - rdr = treecorr.NNNCorrelation(config=config_3pt) - rrd = treecorr.NNNCorrelation(config=config_3pt) - drr = treecorr.NNNCorrelation(config=config_3pt) - rrr = treecorr.NNNCorrelation(config=config_3pt) - ddd.process(cat, metric=config_3pt['metric']) - ddr.process(cat, cat, random_cat, metric=config_3pt['metric']) - drd.process(cat, random_cat, cat, metric=config_3pt['metric']) - rdd.process(random_cat, cat, cat, metric=config_3pt['metric']) - rdr.process(random_cat, cat, random_cat, metric=config_3pt['metric']) - rrd.process(random_cat, random_cat, cat, metric=config_3pt['metric']) - drr.process(cat, random_cat, random_cat, metric=config_3pt['metric']) - rrr.process(random_cat, random_cat, random_cat, metric=config_3pt['metric']) - zeta, varzeta = ddd.calculateZeta(ddr=ddr,drd=drd,rdd=rdd,rrd=rrd,rdr=rdr,drr=drr,rrr=rrr) - return zeta - -dset_vec = ['/u/ki/jderose/public_html/bcc/catalog/particles/y1/buzzard/flock/buzzard-0/a/downsampled_particles.fits.downsample', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-0/a/buzzard_1.6-6a_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-0/b/buzzard_1.6-6b_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-0/c/buzzard_1.6-6c_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-0/d/buzzard_1.6-6d_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-0/e/buzzard_1.6-6e_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-0/f/buzzard_1.6-6f_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-1/a/buzzard-1_1.6-6a_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/rdmagic/y1/buzzard/flock/buzzard-1/b/buzzard-1_1.6-6b_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-1/c/buzzard-1_1.6-6c_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-1/d/buzzard-1_1.6-6d_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-1/e/buzzard-1_1.6-6e_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-1/f/buzzard-1_1.6-6f_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-2/a/buzzard2_1.6-6a_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-2/b/buzzard2_1.6-6b_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-2/c/buzzard2_1.6-6c_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-2/d/buzzard2_1.6-6d_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-2/e/buzzard2_1.6-6e_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-2/f/buzzard2_1.6-6f_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-3/a/buzzard-3_1.6-6a_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-3/b/buzzard-3_1.6-6b_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-3/c/buzzard-3_1.6-6c_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-3/d/buzzard-3_1.6-6d_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-3/e/buzzard-3_1.6-6e_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-3/f/buzzard-3_1.6-6f_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-5/a/buzzard5_1.6-6a_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-5/b/buzzard5_1.6-6b_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-5/c/buzzard5_1.6-6c_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-5/d/buzzard5_1.6-6d_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-5/e/buzzard5_1.6-6e_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-5/f/buzzard5_1.6-6f_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-21/a/buzzard21_1.6-6a_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-21/b/buzzard21_1.6-6b_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-21/c/buzzard21_1.6-6c_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-21/d/buzzard21_1.6-6d_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-21/e/buzzard21_1.6-6e_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit', - '/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-21/f/buzzard21_1.6-6f_run_redmapper_v6.4.18_redmagic_highdens_0.5-10.fit' - ] - -dset_vec2 = [ -'/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-0/a/Buzzard_v1.6_Y1a_gold.fits', -'/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-0/b/Buzzard_v1.6_Y1b_gold.fits', -'/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-0/c/Buzzard_v1.6_Y1c_gold.fits', -'/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-0/d/Buzzard_v1.6_Y1d_gold.fits', -'/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-0/e/Buzzard_v1.6_Y1e_gold.fits', -'/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-0/f/Buzzard_v1.6_Y1f_gold.fits', -'/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-1/a/Buzzard_v1.6_Y1a_gold.fits', -'/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-1/b/Buzzard_v1.6_Y1b_gold.fits', -'/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-1/c/Buzzard_v1.6_Y1c_gold.fits', -'/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-1/d/Buzzard_v1.6_Y1d_gold.fits', -'/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-1/e/Buzzard_v1.6_Y1e_gold.fits', -'/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-1/f/Buzzard_v1.6_Y1f_gold.fits', -'/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-2/a/Buzzard_v1.6_Y1a_gold.fits', -'/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-2/b/Buzzard_v1.6_Y1b_gold.fits', -'/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-2/c/Buzzard_v1.6_Y1c_gold.fits', -'/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-2/d/Buzzard_v1.6_Y1d_gold.fits', -'/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-2/e/Buzzard_v1.6_Y1e_gold.fits', -'/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-2/f/Buzzard_v1.6_Y1f_gold.fits', -'/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-3/a/Buzzard_v1.6_Y1a_gold.fits', -'/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-3/b/Buzzard_v1.6_Y1b_gold.fits', -'/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-3/c/Buzzard_v1.6_Y1c_gold.fits', -'/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-3/d/Buzzard_v1.6_Y1d_gold.fits', -'/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-3/e/Buzzard_v1.6_Y1e_gold.fits', -'/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-3/f/Buzzard_v1.6_Y1f_gold.fits', -'/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-5/a/Buzzard_v1.6_Y1a_gold.fits', -'/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-5/b/Buzzard_v1.6_Y1b_gold.fits', -'/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-5/c/Buzzard_v1.6_Y1c_gold.fits', -'/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-5/d/Buzzard_v1.6_Y1d_gold.fits', -'/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-5/e/Buzzard_v1.6_Y1e_gold.fits', -'/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-5/f/Buzzard_v1.6_Y1f_gold.fits', -'/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-21/a/Buzzard_v1.6_Y1a_gold.fits', -'/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-21/b/Buzzard_v1.6_Y1b_gold.fits', -'/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-21/c/Buzzard_v1.6_Y1c_gold.fits', -'/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-21/d/Buzzard_v1.6_Y1d_gold.fits', -'/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-21/e/Buzzard_v1.6_Y1e_gold.fits', -'/u/ki/jderose/public_html/bcc/catalog/mergedcats/y1/buzzard/flock/buzzard-21/f/Buzzard_v1.6_Y1f_gold.fits', -] - -def calc_3pt_noisy_photoz_lss(dset_id,config_fname,min_z,max_z,sigma_z,zvar,random_zvar): - randoms = np.load('/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new2/Buzzard_v1.6_Y1_0_a/lss_sample/data/REDSHIFT0.6_1nsideNonenJack30.dset_randoms.npy') - randoms = randoms[np.random.rand(len(randoms)) < 0.2] - data = fits.getdata(dset_vec2[dset_id]) + + if outvar == 'zeta': + ddd = treecorr.NNNCorrelation(config=config_3pt) + ddr = treecorr.NNNCorrelation(config=config_3pt) + drd = treecorr.NNNCorrelation(config=config_3pt) + rdd = treecorr.NNNCorrelation(config=config_3pt) + rdr = treecorr.NNNCorrelation(config=config_3pt) + rrd = treecorr.NNNCorrelation(config=config_3pt) + drr = treecorr.NNNCorrelation(config=config_3pt) + rrr = treecorr.NNNCorrelation(config=config_3pt) + ddd.process(cat, metric=config_3pt['metric']) + ddr.process(cat, cat, random_cat, metric=config_3pt['metric']) + drd.process(cat, random_cat, cat, metric=config_3pt['metric']) + rdd.process(random_cat, cat, cat, metric=config_3pt['metric']) + rdr.process(random_cat, cat, random_cat, metric=config_3pt['metric']) + rrd.process(random_cat, random_cat, cat, metric=config_3pt['metric']) + drr.process(cat, random_cat, random_cat, metric=config_3pt['metric']) + rrr.process(random_cat, random_cat, random_cat, + metric=config_3pt['metric']) + output, varzeta = ddd.calculateZeta( + ddr=ddr, drd=drd, rdd=rdd, rrd=rrd, rdr=rdr, drr=drr, rrr=rrr) + return output + elif outvar == 'ddd': + ddd = treecorr.NNNCorrelation(config=config_3pt) + ddr = treecorr.NNNCorrelation(config=config_3pt) + drd = treecorr.NNNCorrelation(config=config_3pt) + rdd = treecorr.NNNCorrelation(config=config_3pt) + tic = time.time() + ddd.process(cat, metric=config_3pt['metric']) + toc = time.time() + print 'ddd took: ', toc-tic + ddd.write(outfname+'.ddd') + ddr.process(cat, cat, random_cat, metric=config_3pt['metric']) + ddr.write(outfname+'.ddr') + drd.process(cat, random_cat, cat, metric=config_3pt['metric']) + drd.write(outfname+'.drd') + rdd.process(random_cat, cat, cat, metric=config_3pt['metric']) + rdd.write(outfname+'.rdd') + return + elif outvar == 'rdr': + rdr = treecorr.NNNCorrelation(config=config_3pt) + rdr.process(random_cat, cat, random_cat, metric=config_3pt['metric']) + print rdr.ntri, rdr.tot + rdr.write(outfname+'.rdr') + return + elif outvar == 'rrd': + rrd = treecorr.NNNCorrelation(config=config_3pt) + rrd.process(random_cat, random_cat, cat, metric=config_3pt['metric']) + print rrd.ntri, rrd.tot + rrd.write(outfname+'.rrd') + return + elif outvar == 'drr': + drr = treecorr.NNNCorrelation(config=config_3pt) + drr.process(cat, random_cat, random_cat, metric=config_3pt['metric']) + print drr.ntri, drr.tot + drr.write(outfname+'.drr') + return + elif outvar == 'rrr': + rrr = treecorr.NNNCorrelation(config=config_3pt) + tic = time.time() + rrr.process(random_cat, random_cat, random_cat, metric=config_3pt['metric']) + toc = time.time() + print 'rrr took: ', toc-tic + rrr.write(outfname+'.rrr') + return + else: + nnn = treecorr.NNNCorrelation(config=config_3pt) + toc = time.time() + setdict = {'d': cat, 'r': random_cat} + nnn.process(setdict[outvar[0]], + setdict[outvar[1]], setdict[outvar[2]], + metric=config_3pt['metric']) + tic = time.time() + print '3PCF took', tic - toc + output = nnn.ntri + return output + + +def calc_3pt_noisy_photoz_lss(dset_id, config_fname, do3D, min_z, max_z, sigma_z, zvar, random_zvar, random_oversamp): + randoms = fits.getdata(paths.lss_y1_randoms) + data = fits.getdata(paths.lss_y1[dset_id]) data = data[data['lss-sample'] == 1] + + ra_var = 'RA' + dec_var = 'DEC' + + data = data[data[ra_var] < 100] + data = data[data[dec_var] < -20] + + data[zvar] += np.random.normal(size=len(data), scale=sigma_z) + data_slice = get_zslice(data, min_z, max_z, zvar) + randoms_slice = get_zslice(randoms, min_z, max_z, random_zvar) + + randoms_slice = randoms_slice[np.random.rand(len(randoms_slice)) < ( + len(data_slice)/len(randoms_slice)*random_oversamp)] + + xi = calc_2pt(data_slice, randoms_slice, config_fname, do3D, + ra_var=ra_var, dec_var=dec_var, + data_zvar=zvar, random_zvar=random_zvar,) + zeta = calc_3pt(data_slice, randoms_slice, config_fname, do3D, + ra_var=ra_var, dec_var=dec_var, + data_zvar=zvar, random_zvar=random_zvar,) + + xi_file_name = config_fname + \ + '_lssdset'+str(dset_id)+'_sigma'+str(sigma_z) + \ + '_'+str(zvar)+'_'+str(min_z)+'_'+str(max_z) + \ + '_rsamp'+str(random_oversamp)+'.xi' + zeta_file_name = config_fname+'_lssdset' + \ + str(dset_id)+'_sigma'+str(sigma_z) + \ + '_'+str(zvar)+'_'+str(min_z)+'_'+str(max_z) + \ + '_rsamp'+str(random_oversamp)+'.zeta' + + if not do3D: + np.save(os.path.join(paths.ang_out_dir, xi_file_name), xi) + np.save(os.path.join(paths.ang_out_dir, zeta_file_name), zeta) + else: + np.save(os.path.join(paths.corr_out_dir, xi_file_name), xi) + np.save(os.path.join(paths.corr_out_dir, zeta_file_name), zeta) + + +def calc_3pt_noisy_photoz_mice(dset_id, jk_id, config_fname, do3D, min_z, max_z, sigma_z, zvar, random_zvar, random_oversamp, outvar='zeta'): + + if min_z == .6: + data = fits.getdata(paths.rm_mice_y1_HL[dset_id]) + elif min_z == .75: + data = fits.getdata(paths.rm_mice_y1_HHL[dset_id]) + else: + data = fits.getdata(paths.rm_mice_y1[dset_id]) + ra_var = 'RA' dec_var = 'DEC' - print len(randoms) - data[zvar] += np.random.normal(size=len(data),scale=sigma_z) - data_slice = get_zslice(data,min_z,max_z,zvar) - randoms_slice = get_zslice(randoms,min_z,max_z,random_zvar) + data[dec_var] = -data[dec_var] + data = data[data[ra_var] > 0] + data = data[data[ra_var] < 90] + data = data[data[dec_var] > -60] + data = data[data[dec_var] < -40] + + data[zvar] += np.random.normal(size=len(data), scale=sigma_z) + data_slice = get_zslice(data, min_z, max_z, zvar) + randoms_slice = generate_randoms(data_slice, random_oversamp, zvar) + + #remove jk region + jk_classifier = pickle.load( open( "/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new3/jk_classifiers/rectangle_0_90_-60_-40_jk.pkl", "rb" ) ) + data_inds = jk_classifier.predict(zip(data_slice[ra_var],data_slice[dec_var])) + random_inds = jk_classifier.predict(zip(randoms_slice[ra_var],randoms_slice[dec_var])) + data_slice = data_slice[data_inds != jk_id] + randoms_slice = randoms_slice[random_inds != jk_id] + + file_name = config_fname + \ + '_MICEdset'+str(dset_id)+'_jk'+str(jk_id)+'_sigma'+str(sigma_z) + \ + '_'+str(zvar)+'_'+str(min_z)+'_'+str(max_z) + \ + '_rsamp'+str(random_oversamp) + + if not do3D: + xi_file_path = os.path.join(paths.ang_out_dir, file_name+'.xi') + output_file_path = os.path.join(paths.ang_out_dir, file_name) + else: + xi_file_path = os.path.join(paths.corr_out_dir, file_name+'.xi') + output_file_path = os.path.join(paths.corr_out_dir, file_name) - xi = calc_2pt(data_slice,randoms_slice,config_fname,zvar,random_zvar,ra_var=ra_var,dec_var=dec_var) - zeta = calc_3pt(data_slice,randoms_slice,config_fname,zvar,random_zvar,ra_var=ra_var,dec_var=dec_var) + if (outvar == 'zeta') | (outvar == 'ddd'): + xi = calc_2pt(data_slice, randoms_slice, config_fname, do3D, + ra_var=ra_var, dec_var=dec_var, + data_zvar=zvar, random_zvar=random_zvar,) + np.save(xi_file_path, xi) + calc_3pt(data_slice, randoms_slice, config_fname, do3D, + ra_var=ra_var, dec_var=dec_var, + data_zvar=zvar, random_zvar=random_zvar, outvar=outvar, outfname=output_file_path) + +def calc_3pt_noisy_photoz_MICEdm(dset_id, jk_id, config_fname, do3D, min_z, max_z, sigma_z, zvar, random_zvar, dm_oversamp, random_oversamp, rw_scheme, outvar='zeta'): + data = fits.getdata(paths.dm_mice_y1[dset_id]) + data = data[data['redshift'] < 1.0] + + if min_z == .6: + weight_data = fits.getdata(paths.rm_mice_y1_HL[0]) + elif min_z == .75: + weight_data = fits.getdata(paths.rm_mice_y1_HHL[0]) + else: + weight_data = fits.getdata(paths.rm_mice_y1[0]) + + ra_var = 'RA' + dec_var = 'DEC' - np.save('/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new2/test2_angular/'+config_fname+'_lssdset'+str(dset_id)+'_sigma'+str(sigma_z)+'_'+str(min_z)+'_'+str(max_z)+'.xi',xi) - np.save('/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new2/test2_angular/'+config_fname+'_lssdset'+str(dset_id)+'_sigma'+str(sigma_z)+'_'+str(min_z)+'_'+str(max_z)+'.zeta',zeta) + data[dec_var] = -data[dec_var] + data = data[data[ra_var] > 0] + data = data[data[ra_var] < 90] + data = data[data[dec_var] > -60] + data = data[data[dec_var] < -40] + + weight_data_slice = get_zslice(weight_data, min_z, max_z, rw_scheme) + + if rw_scheme == 'ZSPEC': + target_cts, target_bins = np.histogram( + weight_data_slice['ZSPEC'], range=(0, 1), bins=100) + else: + target_cts, target_bins = np.histogram( + weight_data_slice['ZREDMAGIC']+np.random.normal(scale=weight_data_slice['ZREDMAGIC_E']), range=(0, 1), bins=100) + + data_slice = downselect_pz(data, target_cts, target_bins, 'redshift', dm_oversamp) + randoms_slice = generate_randoms(data_slice, random_oversamp, 'redshift') + #randoms_slice = downselect_pz(randoms, target_cts, target_bins, 'Z', random_oversamp) + + #remove jk region + jk_classifier = pickle.load( open( "/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new3/jk_classifiers/rectangle_0_90_-60_-40_jk.pkl", "rb" ) ) + data_inds = jk_classifier.predict(zip(data_slice[ra_var],data_slice[dec_var])) + random_inds = jk_classifier.predict(zip(randoms_slice[ra_var],randoms_slice[dec_var])) + data_slice = data_slice[data_inds != jk_id] + randoms_slice = randoms_slice[random_inds != jk_id] + + file_name = config_fname + \ + '_MICEdmdset'+str(dset_id)+'_jk'+str(jk_id)+'_sigma'+str(sigma_z) + \ + '_'+rw_scheme+'_'+str(min_z)+'_'+str(max_z) + \ + '_rsamp'+str(dm_oversamp)+'x'+str(random_oversamp) + + if not do3D: + xi_file_path = os.path.join(paths.ang_out_dir, file_name+'.xi') + output_file_path = os.path.join(paths.ang_out_dir, file_name) + else: + xi_file_path = os.path.join(paths.corr_out_dir, file_name+'.xi') + output_file_path = os.path.join(paths.corr_out_dir, file_name) + + if (outvar == 'zeta') | (outvar == 'ddd'): + xi = calc_2pt(data_slice, randoms_slice, config_fname, do3D, + ra_var=ra_var, dec_var=dec_var, + data_zvar=zvar, random_zvar=random_zvar,) + np.save(xi_file_path, xi) + calc_3pt(data_slice, randoms_slice, config_fname, do3D, + ra_var=ra_var, dec_var=dec_var, + data_zvar=zvar, random_zvar=random_zvar, outvar=outvar, outfname=output_file_path) + +def calc_3pt_noisy_photoz_halos(dset_id, jk_id, config_fname, do3D, min_z, max_z, sigma_z, zvar, random_zvar, random_oversamp, outvar='zeta'): + + data = pd.read_pickle('/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new2/buzzard_halos/halos-'+str(dset_id)+'.pkl') + + ra_var = 'RA' + dec_var = 'DEC' + + data[zvar] += np.random.normal(size=len(data), scale=sigma_z) + data_slice = get_zslice(data, min_z, max_z, zvar) + randoms_slice = generate_randoms(data_slice, random_oversamp, 'Z') + #randoms_slice = get_zslice(randoms, min_z, max_z, random_zvar) + + #remove jk region + jk_classifier = pickle.load( open( "/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new3/jk_classifiers/rectangle_0_90_-60_-40_jk.pkl", "rb" ) ) + data_inds = jk_classifier.predict(zip(data_slice[ra_var],data_slice[dec_var])) + random_inds = jk_classifier.predict(zip(randoms_slice[ra_var],randoms_slice[dec_var])) + data_slice = data_slice[data_inds != jk_id] + randoms_slice = randoms_slice[random_inds != jk_id] + + # randoms_slice = randoms_slice[np.random.rand(len(randoms_slice)) < ( + # len(data_slice)/len(randoms_slice)*random_oversamp)] -def calc_3pt_noisy_photoz(dset_id,config_fname,min_z,max_z,sigma_z,zvar,random_zvar): - randoms = fits.getdata('/u/ki/jderose/public_html/bcc/catalog/redmagic/y1/buzzard/flock/buzzard-0/a/buzzard_1.6-6a_run_redmapper_v6.4.18_redmagic_highdens_0.5-10_randoms.fit') - randoms = randoms[np.random.rand(len(randoms)) < 0.02] - data = fits.getdata(dset_vec[dset_id]) + file_name = config_fname + \ + '_halosdset'+str(dset_id)+'_jk'+str(jk_id)+'_sigma'+str(sigma_z) + \ + '_'+str(zvar)+'_'+str(min_z)+'_'+str(max_z) + \ + '_rsamp'+str(random_oversamp) + + if not do3D: + xi_file_path = os.path.join(paths.ang_out_dir, file_name+'.xi') + output_file_path = os.path.join(paths.ang_out_dir, file_name) + else: + xi_file_path = os.path.join(paths.corr_out_dir, file_name+'.xi') + output_file_path = os.path.join(paths.corr_out_dir, file_name) - if dset_id == 0: - ra_var = 'azim_ang' - dec_var = 'polar_ang' + if (outvar == 'zeta') | (outvar == 'ddd'): + xi = calc_2pt(data_slice, randoms_slice, config_fname, do3D, + ra_var=ra_var, dec_var=dec_var, + data_zvar=zvar, random_zvar=random_zvar,) + np.save(xi_file_path, xi) + calc_3pt(data_slice, randoms_slice, config_fname, do3D, + ra_var=ra_var, dec_var=dec_var, + data_zvar=zvar, random_zvar=random_zvar, outvar=outvar, outfname=output_file_path) + + +def calc_3pt_noisy_photoz_dm(dset_id, jk_id, config_fname, do3D, min_z, max_z, sigma_z, zvar, random_zvar, dm_oversamp,random_oversamp, rw_scheme, outvar='zeta'): + ra_var = 'azim_ang' + dec_var = 'polar_ang' + + if min_z == .6: + weight_data = persistent_load_fits(paths.rm_y1_HL[0]) + elif min_z == .75: + weight_data = persistent_load_fits(paths.rm_y1_HHL[0]) else: - ra_var = 'RA' - dec_var = 'DEC' - print len(randoms) + weight_data = persistent_load_fits(paths.rm_y1[0]) + + data = persistent_load_fits(paths.dm_y1[dset_id]) + data[zvar] += np.random.normal(size=len(data), scale=sigma_z) - data[zvar] += np.random.normal(size=len(data),scale=sigma_z) - data_slice = get_zslice(data,min_z,max_z,zvar) - randoms_slice = get_zslice(randoms,min_z,max_z,random_zvar) + randoms = persistent_load_fits(paths.dm_y1_randoms) - xi = calc_2pt(data_slice,randoms_slice,config_fname,zvar,random_zvar,ra_var=ra_var,dec_var=dec_var) - zeta = calc_3pt(data_slice,randoms_slice,config_fname,zvar,random_zvar,ra_var=ra_var,dec_var=dec_var) + weight_data_slice = get_zslice(weight_data, min_z, max_z, rw_scheme) + + if rw_scheme == 'ZSPEC': + target_cts, target_bins = np.histogram( + weight_data_slice['ZSPEC'], range=(0, 1), bins=100) + else: + target_cts, target_bins = np.histogram( + weight_data_slice['ZREDMAGIC'], range=(0, 1), bins=100) + # this was for angular case -- just reweighting to n(z) + #target_cts, target_bins = np.histogram( + # weight_data_slice['ZREDMAGIC']+np.random.normal(scale=weight_data_slice['ZREDMAGIC_E']), range=(0, 1), bins=100) + + data_slice = downselect_pz(data, target_cts, target_bins, 'redshift', dm_oversamp) + randoms_slice = downselect_pz(randoms, target_cts, target_bins, 'Z', random_oversamp) + + if rw_scheme == 'ZREDMAGIC': + sigmas_vs_z, zerr_bins, _ = binned_statistic(weight_data_slice['ZREDMAGIC'],weight_data_slice['ZREDMAGIC_E'], bins=100, range=(0,1)) + data_slice_sigmas = sigmas_vs_z[np.digitize(data_slice[zvar],zerr_bins)-1] # -1 to avoid underflow bin + randoms_slice_sigmas = sigmas_vs_z[np.digitize(randoms_slice[random_zvar],zerr_bins)-1] + data_slice[zvar] = data_slice[zvar]+np.random.normal(scale=data_slice_sigmas) + randoms_slice[random_zvar] = randoms_slice[random_zvar]+np.random.normal(scale=randoms_slice_sigmas) + + #remove jk region + # jk_classifier = pickle.load( open( "/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new3/jk_classifiers/buzzard_jk.pkl", "rb" ) ) + # data_inds = jk_classifier.predict(zip(data_slice[ra_var],data_slice[dec_var])) + # random_inds = jk_classifier.predict(zip(randoms_slice['RA'],randoms_slice['DEC'])) + # data_slice = data_slice[data_inds != jk_id] + # randoms_slice = randoms_slice[random_inds != jk_id] + + file_name = config_fname + \ + '_dmdset'+str(dset_id)+'_jk'+str(jk_id)+'_sigma'+str(sigma_z) + \ + '_'+rw_scheme+'_'+str(min_z)+'_'+str(max_z) + \ + '_rsamp'+str(dm_oversamp)+'x'+str(random_oversamp) + + if not do3D: + xi_file_path = os.path.join(paths.ang_out_dir, file_name+'.xi') + output_file_path = os.path.join(paths.ang_out_dir, file_name) + else: + xi_file_path = os.path.join(paths.corr_out_dir, file_name+'.xi') + output_file_path = os.path.join(paths.corr_out_dir, file_name) + + if (outvar == 'zeta') | (outvar == 'ddd'): + xi = calc_2pt(data_slice, randoms_slice, config_fname, do3D, + ra_var=ra_var, dec_var=dec_var, + data_zvar=zvar, random_zvar=random_zvar,) + np.save(xi_file_path, xi) + calc_3pt(data_slice, randoms_slice, config_fname, do3D, + ra_var=ra_var, dec_var=dec_var, + data_zvar=zvar, random_zvar=random_zvar, outvar=outvar, outfname=output_file_path) + +def calc_3pt_noisy_photoz(dset_id, jk_id, config_fname, do3D, min_z, max_z, sigma_z, zvar, random_zvar, random_oversamp, outvar='zeta'): + + if min_z == .6: + randoms = persistent_load_fits(paths.rm_y1_HL_randoms) + data = persistent_load_fits(paths.rm_y1_HL[dset_id]) + elif min_z == .75: + randoms = persistent_load_fits(paths.rm_y1_HHL_randoms) + data = persistent_load_fits(paths.rm_y1_HHL[dset_id]) + else: + randoms = persistent_load_fits(paths.rm_y1_randoms) + data = persistent_load_fits(paths.rm_y1[dset_id]) + + ra_var = 'RA' + dec_var = 'DEC' + + data[zvar] += np.random.normal(size=len(data), scale=sigma_z) + data_slice = get_zslice(data, min_z, max_z, zvar) + randoms_slice = get_zslice(randoms, min_z, max_z, random_zvar) + + randoms_slice = randoms_slice[np.random.rand(len(randoms_slice)) < ( + len(data_slice)/len(randoms_slice)*random_oversamp)] + + #remove jk region + # jk_classifier = pickle.load( open( "/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new3/jk_classifiers/buzzard_jk.pkl", "rb" ) ) + # data_inds = jk_classifier.predict(zip(data_slice[ra_var],data_slice[dec_var])) + # random_inds = jk_classifier.predict(zip(randoms_slice[ra_var],randoms_slice[dec_var])) + # data_slice = data_slice[data_inds != jk_id] + # randoms_slice = randoms_slice[random_inds != jk_id] + + file_name = config_fname + \ + '_newbuzzardrm2dset'+str(dset_id)+'_jk'+str(jk_id)+'_sigma'+str(sigma_z) + \ + '_'+str(zvar)+'_'+str(min_z)+'_'+str(max_z) + \ + '_rsamp'+str(random_oversamp) + + if not do3D: + xi_file_path = os.path.join(paths.ang_out_dir, file_name+'.xi') + output_file_path = os.path.join(paths.ang_out_dir, file_name) + else: + xi_file_path = os.path.join(paths.corr_out_dir, file_name+'.xi') + output_file_path = os.path.join(paths.corr_out_dir, file_name) - np.save('/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new2/test2_angular/'+config_fname+'_dset'+str(dset_id)+'_sigma'+str(sigma_z)+'_'+str(min_z)+'_'+str(max_z)+'.xi',xi) - np.save('/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new2/test2_angular/'+config_fname+'_dset'+str(dset_id)+'_sigma'+str(sigma_z)+'_'+str(min_z)+'_'+str(max_z)+'.zeta',zeta) + if (outvar == 'zeta') | (outvar == 'ddd'): + xi = calc_2pt(data_slice, randoms_slice, config_fname, do3D, + ra_var=ra_var, dec_var=dec_var, + data_zvar=zvar, random_zvar=random_zvar,) + np.save(xi_file_path, xi) + calc_3pt(data_slice, randoms_slice, config_fname, do3D, + ra_var=ra_var, dec_var=dec_var, + data_zvar=zvar, random_zvar=random_zvar, outvar=outvar, outfname=output_file_path) + + + + +def calc_3pt_noisy_photoz_y3(dset_id, jk_id, config_fname, do3D, min_z, max_z, sigma_z, zvar, random_zvar, random_oversamp, outvar='zeta'): + + if min_z == .6: + randoms = fits.getdata(paths.rm_y3_HL_randoms) + data = fits.getdata(paths.rm_y3_HL[dset_id]) + elif min_z == .75: + randoms = fits.getdata(paths.rm_y3_HHL_randoms) + data = fits.getdata(paths.rm_y3_HHL[dset_id]) + else: + randoms = fits.getdata(paths.rm_y3_randoms) + data = fits.getdata(paths.rm_y3[dset_id]) + + ra_var = 'RA' + dec_var = 'DEC' + + data[zvar] += np.random.normal(size=len(data), scale=sigma_z) + data_slice = get_zslice(data, min_z, max_z, zvar) + randoms_slice = get_zslice(randoms, min_z, max_z, random_zvar) + + randoms_slice = randoms_slice[np.random.rand(len(randoms_slice)) < ( + len(data_slice)/len(randoms_slice)*random_oversamp)] + + #remove jk region + jk_classifier = pickle.load( open( "/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new3/jk_classifiers/buzzard_jk.pkl", "rb" ) ) + data_inds = jk_classifier.predict(zip(data_slice[ra_var],data_slice[dec_var])) + random_inds = jk_classifier.predict(zip(randoms_slice[ra_var],randoms_slice[dec_var])) + data_slice = data_slice[data_inds != jk_id] + randoms_slice = randoms_slice[random_inds != jk_id] + + file_name = config_fname + \ + '_rmy3dset'+str(dset_id)+'_jk'+str(jk_id)+'_sigma'+str(sigma_z) + \ + '_'+str(zvar)+'_'+str(min_z)+'_'+str(max_z) + \ + '_rsamp'+str(random_oversamp) + + if not do3D: + xi_file_path = os.path.join(paths.ang_out_dir, file_name+'.xi') + output_file_path = os.path.join(paths.ang_out_dir, file_name) + else: + xi_file_path = os.path.join(paths.corr_out_dir, file_name+'.xi') + output_file_path = os.path.join(paths.corr_out_dir, file_name) -if __name__ == '__main__': - calc_3pt_noisy_photoz(dset_id,config_fname,min_z,max_z,sigma_z,zvar,random_zvar) \ No newline at end of file + if (outvar == 'zeta') | (outvar == 'ddd'): + xi = calc_2pt(data_slice, randoms_slice, config_fname, do3D, + ra_var=ra_var, dec_var=dec_var, + data_zvar=zvar, random_zvar=random_zvar,) + np.save(xi_file_path, xi) + calc_3pt(data_slice, randoms_slice, config_fname, do3D, + ra_var=ra_var, dec_var=dec_var, + data_zvar=zvar, random_zvar=random_zvar, outvar=outvar, outfname=output_file_path) + + + +def calc_3pt_randxrand(dset_id, jk_id, config_fname, do3D, min_z, max_z, sigma_z, zvar, random_zvar, dm_oversamp,random_oversamp, rw_scheme, outvar='zeta'): + np.random.seed(dset_id) + randoms = fits.getdata(paths.dm_y1_randoms2) + data = fits.getdata(paths.dm_y1_randoms) + data[zvar] += np.random.normal(size=len(data), scale=sigma_z) + + ra_var = 'RA' + dec_var = 'DEC' + + if min_z == .6: + weight_data = fits.getdata(paths.rm_y1_HL[0]) + elif min_z == .75: + weight_data = fits.getdata(paths.rm_y1_HHL[0]) + else: + weight_data = fits.getdata(paths.rm_y1[0]) + + weight_data_slice = get_zslice(weight_data, min_z, max_z, rw_scheme) + + if rw_scheme == 'ZSPEC': + target_cts, target_bins = np.histogram( + weight_data_slice['ZSPEC'], range=(0, 1), bins=100) + else: + target_cts, target_bins = np.histogram( + weight_data_slice['ZREDMAGIC']+np.random.normal(scale=weight_data_slice['ZREDMAGIC_E']), range=(0, 1), bins=100) + + data_slice = downselect_pz(data, target_cts, target_bins, 'Z', dm_oversamp) + randoms_slice = downselect_pz(randoms, target_cts, target_bins, 'Z', random_oversamp) + + #remove jk region + jk_classifier = pickle.load( open( "/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new3/jk_classifiers/buzzard_jk.pkl", "rb" ) ) + data_inds = jk_classifier.predict(zip(data_slice[ra_var],data_slice[dec_var])) + random_inds = jk_classifier.predict(zip(randoms_slice['RA'],randoms_slice['DEC'])) + data_slice = data_slice[data_inds != jk_id] + randoms_slice = randoms_slice[random_inds != jk_id] + + file_name = config_fname + \ + '_randxranddset'+str(dset_id)+'_jk'+str(jk_id)+'_sigma'+str(sigma_z) + \ + '_'+rw_scheme+'_'+str(min_z)+'_'+str(max_z) + \ + '_rsamp'+str(dm_oversamp)+'x'+str(random_oversamp) + + if not do3D: + xi_file_path = os.path.join(paths.ang_out_dir, file_name+'.xi') + output_file_path = os.path.join(paths.ang_out_dir, file_name) + else: + xi_file_path = os.path.join(paths.corr_out_dir, file_name+'.xi') + output_file_path = os.path.join(paths.corr_out_dir, file_name) + + if (outvar == 'zeta') | (outvar == 'ddd'): + xi = calc_2pt(data_slice, randoms_slice, config_fname, do3D, + ra_var=ra_var, dec_var=dec_var, + data_zvar=zvar, random_zvar=random_zvar,) + np.save(xi_file_path, xi) + calc_3pt(data_slice, randoms_slice, config_fname, do3D, + ra_var=ra_var, dec_var=dec_var, + data_zvar=zvar, random_zvar=random_zvar, outvar=outvar, outfname=output_file_path) + + +def generate_randoms(data, oversamp, zvar, + Ngen=1000000, Ntries_max=10000): + + Ncurrent = 0 + Ntry = 0 + Ntot = int(len(data) * oversamp) + + minra = 0 + maxra = 90 + mindec = -60 + maxdec = -40 + + zdist = data[zvar] + + random_ra = [] + random_dec = [] + random_z = [] + while ((Ncurrent < Ntot) & (Ntry < Ntries_max)): + if Ntry % 100 == 1: + print(Ntry, Ntries_max, Ncurrent, Ntot, Ngen) + # generate random ra and dec + ra_i, dec_i = generate_randoms_radec(minra, maxra, + mindec, maxdec, Ngen) + indices_i = radec_to_index(dec_i, ra_i, 4096) + + z_i = np.random.choice(zdist, len(ra_i)) + + random_ra += list(ra_i) + random_dec += list(dec_i) + random_z += list(z_i) + + Ncurrent = len(random_ra) + Ntry += 1 + if Ntry >= Ntries_max: + print('Warning! We gave up after {0} tries, finding {1} objects instead of the desired {2} objects!'.format( + Ntry, Ncurrent, Ntot)) + + randoms = np.zeros(len(random_ra), dtype=[ + ('RA', '>f4'), ('DEC', '>f4'), ('Z', '>f4')]) + randoms['RA'] = random_ra + randoms['DEC'] = random_dec + randoms['Z'] = random_z + + if len(randoms) > Ntot: + inds_to_keep = np.random.choice( + np.arange(len(randoms)), size=Ntot, replace=False) + randoms = randoms[inds_to_keep] + + return randoms diff --git a/tricorder/simple_angular_script.py b/tricorder/simple_angular_script.py index 24e9769..88ae196 100644 --- a/tricorder/simple_angular_script.py +++ b/tricorder/simple_angular_script.py @@ -1,15 +1,98 @@ import subprocess +import paths +from time import sleep +import os.path -for config_fname in ['test7_angular','test8_angular']: - for sigma_z in [0,0.01,0.02,0.03,0.04]: - for min_z in [.15,.3,.45]: - max_z = min_z + 0.15 - command_str = "import simple_angular; simple_angular.calc_3pt_noisy_photoz(" + str(0) + ", '" + config_fname + "', " + str(min_z) + "," + str(max_z) + "," + str(sigma_z) + "," + "'REDSHIFT','Z')" - print command_str - subprocess.call(["bsub", "-W", "47:00", "-R", "rusage[mem=4000]", "-o", "/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new2/logs/%J.out","-e", "/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new2/logs/%J.err", "python", "-c", command_str]) - for dset_id in range(1,37): - #for dset_id in range(36): - command_str = "import simple; simple_angular.calc_3pt_noisy_photoz(" + str(dset_id) + ", '" + config_fname + "', " + str(min_z) + "," + str(max_z) + "," + str(sigma_z) + "," + "'ZSPEC','Z')" - #command_str = "import simple_angular; simple_angular.calc_3pt_noisy_photoz_lss(" + str(dset_id) + ", '" + config_fname + "', " + str(min_z) + "," + str(max_z) + "," + str(sigma_z) + "," + "'redshift','REDSHIFT')" - print command_str - subprocess.call(["bsub", "-W", "47:00", "-R", "rusage[mem=4000]", "-o", "/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new2/logs/%J.out","-e", "/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new2/logs/%J.err", "python", "-c", command_str]) \ No newline at end of file +do3Ds = [True, True, True, True, True, True] +outlogpath = "/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new3/logs4/%J.out" +errlogpath = "/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new3/logs4/%J.err" +ncpus = "4" +primary_dset_id = 0 +walltime = '47:00' +memlimit = '2000' + + +def nice_job_submit(do3D, outvar, config_fname, dset_flavor, dset_id, jk_id, sigma_z, rw_scheme, min_z, max_z, random_oversamp, dm_oversamp=None, sleep_time=.1): + + if do3D: + checkpath = paths.corr_out_dir + else: + checkpath = paths.ang_out_dir + + if outvar == 'ddd': + checkoutvar = 'rdd' # last one to be written in a ddd job. + else: + checkoutvar = outvar + + if dset_flavor == 'dm': + oversamp_str = str(dm_oversamp) + 'x' + str(random_oversamp) + elif dset_flavor == 'newbuzzardrm2': + oversamp_str = str(random_oversamp) + else: + raise ValueError('Unknown dset_flavor: '+dset_flavor) + + outfile = checkpath + '/' + config_fname + \ + '_'+dset_flavor+'dset'+str(dset_id)+'_jk'+str(jk_id)+'_sigma'+str(sigma_z) + \ + '_'+rw_scheme+'_'+str(min_z)+'_'+str(max_z) + \ + '_rsamp'+oversamp_str + '.' + checkoutvar + + if os.path.exists(outfile): + print 'already done; continuing' + return + else: + if dset_flavor == 'dm': + command_str = "import simple_angular; simple_angular.calc_3pt_noisy_photoz_dm(" + str( + dset_id) + ", " + str(jk_id) + ", '" + config_fname + "', "+str(do3D)+", " + str(min_z) + "," + str(max_z) + "," + str(sigma_z) + ",'redshift','Z',"+str(dm_oversamp)+","+str(random_oversamp)+", '"+rw_scheme+"', outvar='"+outvar+"')" + else: + command_str = "import simple_angular; simple_angular.calc_3pt_noisy_photoz(" + str( + dset_id) + ", " + str(jk_id) + ", '" + config_fname + "', "+str(do3D)+", " + str(min_z) + "," + str(max_z) + "," + str(sigma_z) + ",'"+rw_scheme+"','Z',"+str(random_oversamp)+", outvar='"+outvar+"')" + + print command_str + subprocess.call(["bsub", "-W", walltime, "-n", ncpus, "-C", "1", "-R", "span[hosts=1] rusage[mem="+memlimit+"] select[hname!=deft0001 && hname!=deft0002 && hname!=deft0003 && hname!=deft0004 && hname!=deft0005 && hname!=deft0006 && hname!=deft0007 && hname!=deft0008 && hname!=deft0009 && hname!=deft0010 && hname!=deft0011 && hname!=deft0012 && hname!=deft0013 && hname!=deft0014 && hname!=deft0015 && hname!=deft0016 && hname!=deft0017 && hname!=deft0018 && hname!=deft0019 && hname!=deft0020 && hname!=deft0021 && hname!=deft0022 && hname!=deft0023 && hname!=deft0024 && hname!=deft0025 && hname!=deft0026 && hname!=deft0027 && hname!=deft0028 && hname!=kiso0030 && hname!=kiso0032 && hname!=kiso0033 && hname!=kiso0034 && hname!=kiso0035 && hname!=kiso0036 && hname!=kiso0037 && hname!=kiso0038 && hname!=kiso0039 && hname!=kiso0010 && hname!=kiso0011 && hname!=kiso0012 && hname!=kiso0013 && hname!=kiso0014 && hname!=kiso0015 && hname!=kiso0016 && hname!=kiso0060 && hname!=kiso0017 && hname!=kiso0061 && hname!=kiso0018 && hname!=kiso0062 && hname!=kiso0019 && hname!=kiso0063 && hname!=kiso0064 && hname!=kiso0065 && hname!=kiso0067 && hname!=kiso0068 && hname!=kiso0040 && hname!=kiso0041 && hname!=kiso0042 && hname!=kiso0043 && hname!=kiso0044 && hname!=kiso0045 && hname!=kiso0046 && hname!=kiso0047 && hname!=kiso0048 && hname!=kiso0049 && hname!=kiso0020 && hname!=kiso0021 && hname!=kiso0022 && hname!=kiso0024 && hname!=kiso0025 && hname!=kiso0026 && hname!=kiso0027 && hname!=kiso0028 && hname!=kiso0029 && hname!=kiso0002 && hname!=kiso0003 && hname!=kiso0004 && hname!=kiso0005 && hname!=kiso0006 && hname!=kiso0050 && hname!=kiso0051 && hname!=kiso0008 && hname!=kiso0052 && hname!=kiso0054 && hname!=kiso0055 && hname!=kiso0056 && hname!=kiso0057 && hname!=kiso0058 && hname!=kiso0059 && hname!=bubble0003 && hname!=bubble0004 && hname!=bubble0005 && hname!=bubble0006]", + "-o", outlogpath, + "-e", errlogpath, "python", "-c", command_str]) + sleep(sleep_time) + return + + +#sigma_z_list = [0.01, 0.02, 0.02, 0.03] +sigma_z_list = [0, 0, 0, 0] + +if __name__ == '__main__': + for i, config_fname in enumerate(['fiducial3d_25Mpc', 'fiducial3d_35Mpc']): + #do3D = False + for z_width in [0.15]: + # for sigma_z in [0.02]: + for which_sigma, min_z in enumerate([.15, .45, .3, .6]): + sigma_z = sigma_z_list[which_sigma] + max_z = min_z + z_width + for random_oversamp in [10]: + for jk_id in [-1]: + for outvar in ['ddd', 'rrr', 'drr', 'rdr', 'rrd']: + if sigma_z == 0: + zlist = ['ZSPEC'] + else: + zlist = ['ZSPEC'] + + for rw_scheme in zlist: + + for dm_oversamp in [10]: + + if jk_id == -1: + dset_ids = range(len(paths.dm_y1)) + else: + dset_ids = [primary_dset_id] + for dset_id in dset_ids: + + nice_job_submit(do3Ds[i], outvar, config_fname, 'dm', dset_id, + jk_id, sigma_z, rw_scheme, min_z, max_z, random_oversamp, + dm_oversamp=dm_oversamp) + + # RMY1 + if jk_id == -1: + dset_ids = range(len(paths.rm_y1)) + else: + dset_ids = [primary_dset_id] + for dset_id in dset_ids: + nice_job_submit(do3Ds[i], outvar, config_fname, 'newbuzzardrm2', dset_id, + jk_id, sigma_z, rw_scheme, min_z, max_z, random_oversamp) diff --git a/tricorder/simple_script.py b/tricorder/simple_script.py index 80c600f..b52d266 100644 --- a/tricorder/simple_script.py +++ b/tricorder/simple_script.py @@ -1,17 +1,14 @@ import subprocess import paths -config_dir = '/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new2/configs/' -out_dir = '/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new2/test2/' - -for config_fname in ['test7_3d']: - for sigma_z in [0.001, 0.002, 0.003, 0.004, .005, 0.01, 0.02, 0.03, 0.04]: - for min_z in [.15, .3, .45]: - max_z = min_z + 0.15 - for dset_id in range(len(paths.dm_y1)): - command_str = "import simple; simple.calc_3pt_noisy_photoz_dm(" + str(dset_id) + ", '" + config_fname + "', " + str( - min_z) + "," + str(max_z) + "," + str(sigma_z) + "," + "'ZSPEC','Z')" - #command_str = "import simple_angular; simple_angular.calc_3pt_noisy_photoz_lss(" + str(dset_id) + ", '" + config_fname + "', " + str(min_z) + "," + str(max_z) + "," + str(sigma_z) + "," + "'redshift','REDSHIFT')" - print command_str - subprocess.call(["bsub", "-W", "47:00", "-R", "rusage[mem=4000]", "-o", "/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new2/logs/%J.out", - "-e", "/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new2/logs/%J.err", "python", "-c", command_str]) +if __name__ == '__main__': + for config_fname in ['test7_3d']: + for sigma_z in [0]: #[0.001, 0.002, 0.003, 0.004, .005, 0.01, 0.02, 0.03, 0.04]: + for min_z in [.15, .3, .45]: + max_z = min_z + 0.15 + for dset_id in range(len(paths.dm_y1)): + command_str = "import simple; simple.calc_3pt_noisy_photoz_dm(" + str(dset_id) + ", '" + config_fname + "', " + str(min_z) + "," + str(max_z) + "," + str(sigma_z) + "," + "'redshift','Z')" + #command_str = "import simple_angular; simple_angular.calc_3pt_noisy_photoz_lss(" + str(dset_id) + ", '" + config_fname + "', " + str(min_z) + "," + str(max_z) + "," + str(sigma_z) + "," + "'redshift','REDSHIFT')" + print command_str + subprocess.call(["bsub", "-W", "47:00", "-R", "rusage[mem=4000]", "-o", "/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new2/logs/%J.out", + "-e", "/nfs/slac/des/fs1/g/sims/mbaumer/3pt_sims/new2/logs/%J.err", "python", "-c", command_str])