NEURON interfaces to MySQL and the SPUD feature extraction algorithm (Neymotin et al. 2008)

 Download zip file 
Help downloading and running models
See the readme.txt for information on setting up this interface to a MySQL server from the NEURON simulator. Note the SPUD feature extraction algorithm includes its own readme in the spud directory.
1 . Neymotin S, Uhlrich DJ, Manning KA, Lytton WW (2008) Data mining of time-domain features from neural extracellular field data Applic. of Comput. Intel. in Bioinf. and Biomed.: Current Trends and Open Problems 151:119-140
Model Information (Click on a link to find other models with that property)
Model Type:
Brain Region(s)/Organism:
Cell Type(s):
Gap Junctions:
Simulation Environment: NEURON;
Model Concept(s): Methods;
Implementer(s): Lytton, William [bill.lytton at]; Neymotin, Sam [Samuel.Neymotin at];
Files displayed below are from the implementation
October 25th, 2009: This model was updated by Michael Hines to run
under NEURON 7

 $Id: readme.txt,v 1.2 2008/10/06 16:58:43 samn Exp $ 

Table of contents:

  1. SPUD feature extraction algorithm
  2. NEURON interface to MySQL


SPUD feature extraction algorithm implementation as appearing in
[1](see bottom of readme)

spud.mod - main implementation
spud.hoc - hoc utilities for ease of use
mosinit.hoc - sets up a GUI showing figure 2 from chapter - run this
  to see SPUD in action
rat_strobe_1.vec - single trace of electrocorticographic recordings
  from rat

//sample routine to demonstrate SPUD feature extraction algorithm (in
//spud.hoc) to use:
//on return, output will store the extracted "bumps" as an NQS

//$o1 = input data vector
//$2 = num threshold lines
//$3 = threshold spacing, 0=linear,1=log (optional)
//$o4 = user-specified thresholds to pass in to SPUD (optional)
proc testspud()

Once the source code is compiled (see below for instructions), run the
special file in ./arch/special , where arch is your system
architecture to start NEURON with the compiled libraries.  Then you
can use the command, load_file("mosinit.hoc"), from the NEURON prompt,
which will allow generation of figure 2 from [1].

2. NEURON interface to MySQL readme - S Neymotin , WW Lytton - 4/2007

(for questions/comments contact samn at neurosim dot downstate dot

This is an interface that allows access to a MySQL server from
directly within the NEURON simulation environment [1]. It allows for
performing SQL queries and returning the results into NEURON data
structures. It also works with the Neural Query System (NQS)[2] and
can convert between NQS databases and MySQL tables.

The MySQL C API is required. The version used was mysql-5.0.37. Some
modifications were made to it in order to compile it as a NEURON
module. The main change was mysql/my_list.h had #undef LIST so it
wouldn't conflict with NEURON's list type. The C header files for the
modified version are available in this package. You'll also need to
compile the API to a lib file and link to it. The MySQL server must be
running when using this interface.

NEURON mod files: 

  MySQL.mod - main interface to MySQL
  vecst.mod - used by NQS
  misc.h,misc.mod - used by NQS

HOC files:

  mosinit.hoc - demo file
  declist.hoc - used by NQS
  decnqs.hoc - used by NQS
  decvec.hoc - used by NQS
  grvec.hoc - graphics utils.
  drline.hoc - graphics utils.
  mysql_utils.hoc - MySQL interface utilities
  nqs.hoc - NQS
  setup.hoc - setup simulation utils.

mysql directory: MySQL API header files for version 5.0.37

For help with compilation/usage, contact samn at neurosim dot
downstate dot edu .

The interface has only been tested on Linux machines with version
5.0.37 of MySQL. If you are using a different version of MySQL , this
is not guaranteed to work/compile, and you may need to make some small
changes to get it to compile.

* to build:

make sure you are in the directory containing mod files, and have the
mysql header files in a subdir named mysql (or a symbolic link will be
fine). for example, if you have the MySQL lib files in
/usr/local/src/mysql-5.0.37-linux-x86_64-glibc23/lib , you would use
the following command:

nrnivmodl -loadflags "-L/usr/local/src/mysql-5.0.37-linux-x86_64-glibc23/lib -lmysqlclient -lz"

if you have the MySQL lib files in a more standard location, such as
/usr/lib/mysql , you would use the following command:

nrnivmodl -loadflags "-L/usr/lib/mysql/ -lmysqlclient -lz"

-L should have the full path to the mysql lib files (that are already

-lz is for zlib

The mysql include dir must be in mod subdir (with a link is fine)

note: build can only be done once MySQL has been built on the system.

* sample usage similar to that found in mysql_test.hoc


Init_mysql("localhost","username","password") //connect
Query_mysql("show databases") //perform a sql query ListDBs_mysql()

see below for more example code and function descriptions

* MySQL.mod function descriptions:

all functions described below should have _mysql suffix added to them
when running from NEURON.

there is one main MYSQL object : MYSQL g_mysql;
since only one connection allowed

: closes any open connection to MySQL server

: initialize MySQL engine & connect to MySQL server
: user must supply host-name , user-name, password
: to connect to MySQL server
: returns 1.0 iff successful
: Init(host,user,pass)

: SelectDB(dbname)
: returns 1.0 iff successful

: frees results of Select, responsibility of hoc user
FUNCTION FreeResults()

: check # of columns from previous Select call

: check # of rows from previous Select call

: get rows from previous Select
: into list of vectors (each vec is dimension/column)
: returns -1.0 on error, otherwise number of rows

: takes vector and returns # of times it exists as a row in table_name
: Find(table_name,Vector) also allows partial row match on first 
: min(vector.size,table.columns) columns stores results in g_result for later
: retrieval returns -1.0 on error, otherwise num_rows found matching vector

: updates a single col of
: a table. 
: UpdateCol(table_name,col_name,order_by_column_name,vector_of_values,start_idx)
: col_name is the column that will be updated
: order_by_column_name is the column that stores
: ids, if no column stores ids, updating a column
: does not make much sense because the storage
: order of column values may not be what the
: user is expecting. start_idx is starting value
: of order by column index. it is incremented
: for each row of a column.
: so it will be 
: update table set col_name = vec[0] where order_by_column_name=start_idx;
: update table set col_name = vec[1] where order_by_column_name=start_idx+1;
:   ...
: update table set col_name = vec[n] where order_by_column_name=start_idx+n;
FUNCTION UpdateCol()

: inserts data into existing table
: Insert(table_name,list_of_vectors or vector)
: Vector should have same size as # of columns in table , so Insert
: will add 1 row for Vector arg if arg is List, it should have
: num_cols vectors and vectors.size rows will be inserted into table
: returns 1.0 iff success

: does a sql select and keeps results around for hoc user to retrieve
: hoc user must free results at a certain point
: returns -1.0 on error, otherwise # of rows found
** if you do the select from NEURON with Select_mysql, it doesn't display
all the rows onto screen. after that you can do GetRows_mysql to
get the rows or NumRows_mysql to see the # of rows returned from the

: gets col names from last sql select must pass in correct # of
: char* 's and they must have sufficient length to store col names
FUNCTION GetColNames()

: lists all available dbs
: returns -1 iff error, otherwise # of dbs

: executes a sql command but doesnt store results for hoc user
: can execute any type of SQL command, i.e. create,select,insert,etc.
: displays results on screen
: returns -1.0 on error
: Query(query_string)

: display client & server versions
PROCEDURE VersionInfo()

* sample hoc code

the following proc works only if there is
a pre-existing database named "test"
to create it do: Query_mysql("create database test")

objref lv,myv[2],lvres
proc TestInsert(){
  Query_mysql("create table junk (d1 double,d2 double)")
  lv=new List()
  myv[0]=new Vector(10)
  myv[1]=new Vector(10)
  Query_mysql("select * from junk")

Insert can take a Vector or List of Vectors

objref myv
proc TestInsert2(){
  Query_mysql("use test")
  Query_mysql("create table jnk (d1 double,d2 double)")
  myv=new Vector(2)
  Query_mysql("select * from jnk")

there are some hoc utility functions in mysql_utils.hoc (don't add _mysql to call them):

//creates a table in db currently connected to
//$s1 = table name
//$o2 = list of column names (as String objects or strdefs)
//$3 = whether to create index for each col
func CreateTable () 

// SelectedColNames()
// returns List containing column names from last Select call
obfunc SelectedColNames()

//converts the results of a sql select
//into an nqs db & returns it
//$s1 = sql query
obfunc sql2nqs ()

//converts nqs database to sql format automatically creates indices
//$o1 = nqs
//$s2 = name of table in mysql db
//$3 = whether to create column nqs_row_id storing orig nqs row index
//$4 = whether to create mysql index on each col
// NB: table must not have 'index' as a col name: mysql reserved word
func nqs2sql () 

example usage:

objref ls
objref cols[5]
proc TestCreateTable(){ local ii,makeindex
  ls=new List()
  for ii=0,4{
    cols[ii]=new String()
  makeindex = 1
    Query_mysql("show tables")
    Query_mysql("describe hoc_table")
  } else {
    Query_mysql("show tables")

this will create a table named "hoc_table" in current database with
indices on each column


(1) Data mining of time-domain features from neural extracellular
    field data chapter in book

Applications of Computational Intelligence in Bioinformatics and Biomedicine:
Current Trends and Open Problems
Series: Studies in Computational Intelligence (peer-reviewed),
151:119-140, 2008, Springer.
S Neymotin, DJ Uhlrich, KA Manning, WW Lytton

(2) Neural Query System: Data-mining from within the NEURON simulator.
    Neuroinformatics. 2006;4(2):163-76.
    WW Lytton

Loading data, please wait...