$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
1. SPUD
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: testspud(vector,num_threshold_slices,log_spacing,[user-specified-thresholds])
//on return, output will store the extracted "bumps" as an NQS database
//$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()
2. NEURON interface to MySQL readme - S Neymotin , WW Lytton - 4/2007
(for questions/comments contact samn at neurosim dot downstate dot edu)
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
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).
then:
nrnivmodl -loadflags "-L/usr/local/src/mysql-5.0.37-linux-x86_64-glibc23/lib -lmysqlclient -lz"
-L should have the full path to the mysql lib files (that you already compiled).
-lz is for zlib
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
load_file("grvec.hoc")
load_file("nqs.hoc")
load_file("mysql_utils.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
FUNCTION Close()
: 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)
FUNCTION Init()
: SelectDB(dbname)
: returns 1.0 iff successful
FUNCTION SelectDB()
: frees results of Select, responsibility of hoc user
FUNCTION FreeResults()
: check # of columns from previous Select call
FUNCTION NumCols()
: check # of rows from previous Select call
FUNCTION NumRows()
: get rows from previous Select
: into list of vectors (each vec is dimension/column)
: returns -1.0 on error, otherwise number of rows
FUNCTION GetRows()
: 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
FUNCTION Find()
: 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
FUNCTION Insert()
: 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
FUNCTION Select()
** 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
select
: 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
FUNCTION ListDBs()
: 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)
FUNCTION Query()
: 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(){
Init_mysql("your_host","your_user_name","your_password")
SelectDB_mysql("test")
Query_mysql("create table junk (d1 double,d2 double)")
lv=new List()
myv[0]=new Vector(10)
myv[0].indgen(0,10)
myv[1]=new Vector(10)
myv[1].indgen(10,20)
lv.append(myv[0])
lv.append(myv[1])
Insert_mysql("junk",lv)
Query_mysql("select * from junk")
}
TestInsert()
Insert can take a Vector or List of Vectors
objref myv
proc TestInsert2(){
Init_mysql("your_host","your_user_name","your_password")
Query_mysql("use test")
Query_mysql("create table jnk (d1 double,d2 double)")
myv=new Vector(2)
myv.x(0)=0
myv.x(1)=1
Insert_mysql("jnk",myv)
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()
sprint(cols[ii].s,"col%d",ii+1)
ls.append(cols[ii])
}
makeindex = 1
if(CreateTable("hoc_table",ls,makeindex)){
Query_mysql("show tables")
Query_mysql("describe hoc_table")
} else {
Query_mysql("show tables")
}
}
TestCreateTable()
this will create a table named "hoc_table" in current database with indices
on each column
references:
(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
Changelog
---------
2022-05: Updated MOD files to contain valid C++ and be compatible with the
upcoming versions 8.2 and 9.0 of NEURON.