Mac binaries
[jabaws.git] / website / archive / binaries / mac / src / globplot / biopython-1.50 / Bio / clistfnsmodule.c
diff --git a/website/archive/binaries/mac/src/globplot/biopython-1.50/Bio/clistfnsmodule.c b/website/archive/binaries/mac/src/globplot/biopython-1.50/Bio/clistfnsmodule.c
new file mode 100644 (file)
index 0000000..8d86b44
--- /dev/null
@@ -0,0 +1,161 @@
+/* Copyright 2000 by Jeffrey Chang.  All rights reserved.
+ * This code is part of the Biopython distribution and governed by its
+ * license.  Please see the LICENSE file that should have been included
+ * as part of this package.
+ *
+ * clistfnsmodule.c
+ * Created 3 Jun 2000
+ */
+
+#include "Python.h"
+#include <math.h>
+
+
+
+
+/************************************** Exported Functions ***********/
+
+static char clistfns_count__doc__[] = 
+"count(items) -> dict of counts of each item\n\
+\n\
+Count the number of times each item appears in a list of data.\n\
+\n\
+";
+
+static PyObject *clistfns_count(PyObject *self, PyObject *args)
+{
+    int i;
+    PyObject *items, *counts;
+    PyObject *item, *count, *newcount;
+    long int current;
+
+    if(!PyArg_ParseTuple(args, "O", &items))
+       return NULL;
+    if(!PySequence_Check(items)) {
+       PyErr_SetString(PyExc_TypeError, "expected sequence type");
+       return NULL;
+    }
+
+    if(!(counts = PyDict_New()))
+       return NULL;
+    
+    /* Go through the loop, counting how often each item appears. */
+    i = 0;
+    while(1) {
+       if(!(item = PySequence_GetItem(items, i)))  {
+            PyErr_Clear(); /* clear the exception set by PySequence_GetItem */
+           break;         /* no more numbers */
+       }
+
+       if(!(count = PyDict_GetItem(counts, item))) {
+           newcount = PyInt_FromLong(1);  /* New item, set count to 1 */
+       }
+       else {
+           current = PyInt_AsLong(count);
+           newcount = PyInt_FromLong(current+1);
+       }
+
+       PyDict_SetItem(counts, item, newcount);
+       Py_DECREF(newcount);
+       Py_DECREF(item);
+       if(PyErr_Occurred()) 
+           return NULL;
+
+       i++;
+    }
+    
+    return counts;
+}
+
+
+static char clistfns_contents__doc__[] = 
+"contents(items) -> dict of item -> percentage\n\
+\n\
+Summarize the contents of the list in terms of the percentages of each\n\
+item.  For example, if an item appears 3 times in a list with 10 items,\n\
+it is in 0.3 of the list\n\
+\n\
+";
+
+static PyObject *clistfns_contents(PyObject *self, PyObject *args)
+{
+    int i;
+    PyObject *items, *counts, *percentages;
+    PyObject *countitems, *countitem;
+    PyObject *key, *count, *perc;
+    long c;
+    double total;
+
+    if(!PyArg_ParseTuple(args, "O", &items))
+       return NULL;
+    if(!PySequence_Check(items)) {
+       PyErr_SetString(PyExc_TypeError, "expected mapping type");
+       return NULL;
+    }
+    if((total = PySequence_Length(items)) == -1) {
+       PyErr_SetString(PyExc_ValueError, "I couldn't get length of item.");
+       return NULL;
+    }
+    
+    counts = clistfns_count(self, args);
+    if(!counts || PyErr_Occurred())
+       return NULL;
+
+    if(!(percentages = PyDict_New())) {
+       Py_DECREF(counts);
+       return NULL;
+    }
+
+    /* Loop through every element in counts, calculating the probabilities. */
+    if(!(countitems = PyMapping_Items(counts))) {
+       Py_DECREF(counts);
+        Py_DECREF(percentages);
+       return NULL;
+    }
+
+    /* Go through the loop, counting how often each item appears. */
+    i = 0;
+    while(1) {
+       if(!(countitem = PyList_GetItem(countitems, i))) {
+           PyErr_Clear(); /* clear the exception set by PyList_GetItem */
+           break;         /* no more numbers */
+        }
+       key = PyTuple_GetItem(countitem, 0);
+       count = PyTuple_GetItem(countitem, 1);
+       c = PyInt_AsLong(count);
+       perc = PyFloat_FromDouble((double)c / total);
+       PyDict_SetItem(percentages, key, perc);
+       Py_DECREF(perc);
+       if(PyErr_Occurred())   /* PyDict_SetItem failed */
+           break;
+       i++;
+    }
+    if(PyErr_Occurred()) {
+       Py_DECREF(percentages);
+       percentages = NULL;
+    }
+    Py_DECREF(countitems);
+    Py_DECREF(counts);
+    
+    return percentages;
+}
+
+
+/************************************** Module definition stuff ******/
+
+static PyMethodDef clistfnsMethods[] = {
+    {"count", clistfns_count, METH_VARARGS, clistfns_count__doc__},
+    {"contents", clistfns_contents, METH_VARARGS, clistfns_contents__doc__},
+    {NULL, NULL}
+};
+
+static char clistfns__doc__[] =
+"This provides helper functions for the listfns module.\n\
+You should never import this module on its own.\n\
+\n\
+";
+
+void initclistfns(void)
+{
+    (void) Py_InitModule3("clistfns", clistfnsMethods, clistfns__doc__);
+}