{ "metadata": { "name": "", "signature": "sha256:deaa42e563c3a5fae4715983ddae28effb0a24bf112f1e1c3641afa8b07b04b2" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "code", "collapsed": false, "input": [ "from traits.api import *\n", "from pyparty import Canvas\n", "from pyparty.utils import to_normrgb\n", "import operator as oper\n", "from collections import OrderedDict\n", "\n", "def radius(obj):\n", " return getattr(obj, 'equivalent_diameter')/2.0\n", "\n", "SHORTCUTS = {'d':'equivalent_diameter',\n", " 'r': radius } # r ?\n", "\n", "# Don't change order; may affect multisplot; not sure\n", "\n", "COMP_OPS = OrderedDict([\n", " (\"==\",np.equal), (\"!=\",np.not_equal), (\"<\",np.less),\n", " (\">\",np.greater), (\">=\",np.greater_equal), (\"<=\",np.less_equal)\n", " ] )\n", "\n", "LOGIC_OPS = OrderedDict([\n", " (\"&\",np.logical_and), (\"|\",np.logical_or)\n", " ])\n", "\n", "#http://code.activestate.com/recipes/577616-split-strings-w-multiple-separators/\n", "def multisplit(s, sep):\n", " splitchar = []\n", " stack = [s]\n", " for char in sep:\n", " pieces = []\n", " for substr in stack:\n", " pieces.extend(substr.split(char)) \n", " stack = pieces\n", " if char in s:\n", " splitchar.append(char)\n", " return stack, splitchar\n", "\n", "\n", "class ModelError(Exception):\n", " \"\"\" \"\"\"\n", "\n", "# Name is classname/vairable name\n", "class Model(HasTraits):\n", " \n", " classifier = Str()\n", " _classfcn = Property(depends_on='classifier')\n", " color = Any(None)\n", " \n", " def _color_changed(self, old, new):\n", " if new:\n", " self.color=to_normrgb(new)\n", " \n", " def parse_canvas(self, canvas):\n", " \"\"\" Apply masks to canvas. Should split the parsing of the operators into python expressions and return,\n", " and have parsed canvas work with those, but for now, wrapping everything into a single method for prototyping.\"\"\"\n", "\n", " masks = []\n", " lops = []\n", " # Split on '|' and '&'\n", " logic_ops, LOGIC_CHARS = multisplit(self.classifier, LOGIC_OPS.keys())\n", " \n", " # NEED SOMEHOW TO SPLIT BY LOGIC CHARS AND ITERATE OVER OTEHR EXPRESSION\n", "\n", " for op in logic_ops: # op is (d < 50)\n", " nospace = \"\".join(op.split()) # Strip whitespace\n", " \n", " ### Paranethesis operations\n", " #( (foo) & (bar) ) | (baz); can't handle these\n", " if nospace.count('(') != 1 or nospace.count(')') != 1:\n", " raise ModelError(\"Cannot handle muli-paranethesis expression: %s\" % op)\n", " if nospace[0] != '(' or nospace[-1] != ')':\n", " raise ModelError(\"Invalid logic function: %s\" % op)\n", " nospace = nospace.strip(\"(\").strip(\")\")\n", " \n", " # Split on comparison operator (<, == etc..)\n", " comp_split, COMP_CHAR = multisplit(nospace, COMP_OPS.keys())\n", " if len(comp_split) != 2:\n", " raise ModelError('Invalid comparison operator: %s---> [ %s ]' % (op, \", \".join(COMP_OPS) )) \n", " variable, value = comp_split\n", " value = float(value)\n", " \n", " if len(COMP_CHAR) != 1:\n", " raise ModelError(\"Comparison operator list != 1 %s\" % COMP_CHAR)\n", " comp_char = COMP_CHAR[0]\n", " \n", " # Return partial function for value attribute\n", " if variable in SHORTCUTS:\n", " variable = SHORTCUTS[variable]\n", "\n", " if isinstance(variable, str):\n", " variable = oper.attrgetter(variable)\n", " \n", " # NEED OBJECT ACCESS STARTING HERE! \n", " descriptor_array = variable(canvas) #c.area\n", " \n", " # Worth doing\n", " if not isinstance(descriptor_array, np.ndarray):\n", " raise ModelError('Attribute inspection not return an array')\n", " \n", " comp_op = COMP_OPS[comp_char] \n", " mask = comp_op(descriptor_array, value)\n", " masks.append(mask)\n", " \n", " if LOGIC_CHARS:\n", " ls = [LOGIC_OPS[char] for char in LOGIC_CHARS]\n", " ms, mf = masks.pop(0), masks.pop(0)\n", " l = ls.pop(0)\n", " \n", " lout = l(ms,mf)\n", " while masks:\n", " m = masks.pop(0)\n", " lout = l(lout, m)\n", " \n", " else:\n", " lout = masks[0] #Should only be one mask, no?\n", "\n", " # HOW TO HANDLE NULL VALUES EG NEGATIVES??\n", " # Copy canvas and particles and shit \n", " cp = [] \n", " cp[:] = canvas.particles[lout]\n", " cout = Canvas.copy(canvas)\n", " cout._particles.plist[:] = cp[:]\n", " \n", " if self.color:\n", " def cmap(p):\n", " p.color = self.color\n", " return p \n", " cout = cout.pmap(cmap)\n", " \n", " return cout\n", " #return lout\n", " \n", " \n", " def _get__classfcn(self):\n", " return eval(self.classifier)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [ "class Diameter(Model):\n", " classifier = '(d > 20) & (d < 70)'\n", "# color = None\n", "# classifier = '(d > 15)'" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "code", "collapsed": false, "input": [ "m1 = Diameter(color='teal')\n", "c=Canvas.random_circles()\n", "\n", "from pyparty import Canvas, splot\n", "c=Canvas.random_circles()\n", "f = m1.parse_canvas(c)\n", "\n", "ax1, ax2 = splot(1,2)\n", "c.show(ax1)\n", "f.show(ax2);" ], "language": "python", "metadata": {}, "outputs": [ { "ename": "CanvasAttributeError", "evalue": "\"_threshtype\" could not be found on Canvas, underlying manager, or on one-or multiple of the Particles", "output_type": "pyerr", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[1;31mCanvasAttributeError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0mpyparty\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mCanvas\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0msplot\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[0mc\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mCanvas\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrandom_circles\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 6\u001b[1;33m \u001b[0mf\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mm1\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mparse_canvas\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mc\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 7\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 8\u001b[0m \u001b[0max1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0max2\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0msplot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m\u001b[0m in \u001b[0;36mparse_canvas\u001b[1;34m(self, canvas)\u001b[0m\n\u001b[0;32m 125\u001b[0m \u001b[0mp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcolor\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcolor\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 126\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mp\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 127\u001b[1;33m \u001b[0mcout\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mcout\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpmap\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mcmap\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 128\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 129\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mcout\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m/home/glue/Desktop/pyparty/pyparty/tools/canvas.py\u001b[0m in \u001b[0;36mpmap\u001b[1;34m(self, fcn, *fcnargs, **fcnkwargs)\u001b[0m\n\u001b[0;32m 197\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_particles\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmap\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfcn\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m*\u001b[0m\u001b[0mfcnargs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mfcnkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 198\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 199\u001b[1;33m \u001b[0mcout\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mCanvas\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcopy\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 200\u001b[0m \u001b[0mcout\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_particles\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmap\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfcn\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m*\u001b[0m\u001b[0mfcnargs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mfcnkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 201\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mcout\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m/home/glue/Desktop/pyparty/pyparty/tools/canvas.py\u001b[0m in \u001b[0;36mcopy\u001b[1;34m(cls, obj, grid, background, particles, rez, _threshfcn)\u001b[0m\n\u001b[0;32m 974\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 975\u001b[0m \u001b[1;32mif\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[0m_threshfcn\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 976\u001b[1;33m \u001b[0m_threshfcn\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mobj\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mthreshfcn\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 977\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 978\u001b[0m return cls(background=background, \n", "\u001b[1;32m/home/glue/Desktop/pyparty/pyparty/tools/canvas.py\u001b[0m in \u001b[0;36mthreshfcn\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 144\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mthreshfcn\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 145\u001b[0m \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 146\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_threshtype\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 147\u001b[0m \u001b[1;32mexcept\u001b[0m \u001b[0mAttributeError\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 148\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mNone\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m/home/glue/Desktop/pyparty/pyparty/tools/canvas.py\u001b[0m in \u001b[0;36m__getattr__\u001b[1;34m(self, attr)\u001b[0m\n\u001b[0;32m 899\u001b[0m raise CanvasAttributeError('\"%s\" could not be found on %s, '\n\u001b[0;32m 900\u001b[0m \u001b[1;34m'underlying manager, or on one-or multiple of the '\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 901\u001b[1;33m 'Particles' % (attr, self.__class__.__name__) ) \n\u001b[0m\u001b[0;32m 902\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 903\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m__iter__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;31mCanvasAttributeError\u001b[0m: \"_threshtype\" could not be found on Canvas, underlying manager, or on one-or multiple of the Particles" ] } ], "prompt_number": 3 } ], "metadata": {} } ] }