Skip to content
Prev Previous commit
Next Next commit
Changes and enhancements in nitime interface:
1. Data reading not using csv2rec. 2. Analysis implemented using nitime objects. 3. Array outputs defined.
  • Loading branch information
arokem committed Oct 26, 2010
commit 114026fde7366cd50d478d8d734e2307e1644212
73 changes: 49 additions & 24 deletions nipype/interfaces/nitime/analysis.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

"""


import numpy as np
from nipype.utils.misc import package_check
package_check('nitime')
package_check('matplotlib')
Expand Down Expand Up @@ -85,53 +85,78 @@ class CoherenceAnalyzer(BaseInterface):

def _read_csv(self):
""" Read from csv in_file and return a rec array """



#Check that input conforms to expectations:
first_row = open(self.inputs.in_file).readline()
if not first_row[1].isalpha():
raise ValueError("First row of in_file should contain ROI names as strings of characters")

rec_array=csv2rec(self.inputs.in_file)
return rec_array

roi_names = open(self.inputs.in_file).readline().replace('\"','').strip('\n').split(',')
data = np.loadtxt(self.inputs.in_file,skiprows=1,delimiter=',')

#rec_array=csv2rec(self.inputs.in_file)
return data,roi_names

def _csv2ts(self):
""" Read data from the in_file and generate a nitime TimeSeries object"""
rec_array = self._read_csv()
roi_names= data_rec.dtype.names
n_samples = data_rec.shape[0]
for n_idx in range(len(roi_names)):
data[n_idx] = data_rec[roi_names[n_idx]]

TS = TimeSeries(data=data,sampling_interval=TR,time_unit='s')
data,roi_names = self._read_csv()

TS = TimeSeries(data=data,
sampling_interval=self.inputs.TR,
time_unit='s')
TS.metadata = dict(ROIs=roi_names)

return TimeSeries(data=data
return TS



#Rewrite _run_interface, but not run
def _run_interface(self,runtime):
lb, ub = self.inputs.frequency_range

if self.inputs.in_TS is Undefined:
# get TS form csv and inputs.TR
# calls _csv2ts
TS = self._csv2ts()

else:
# get TS from inputs.in_TS


#Get the coherence matrix from the analyzer
self.coherence = A.coherence

if isdefined(self.inputs.output_csv_file):
#write to a csv file and assign a value to self.coherence_file (a
#file name + path)

TS = self.inputs.in_TS
# deal with creating or storing ROI names
if not TS.metadata.haskey('ROIs'):
TS.metadata['ROIs']=['roi_%d' % x for x,_ in enumerate(TS.data)]

A = CoherenceAnalyzer(TS,
method=dict(this_method='welch',
NFFT=self.inputs.NFFT,
n_overlap=self.inputs.n_overlap))

freq_idx = np.where((A.frequencies>self.inputs.frequency_range) *
(A.frequencies<self.inputs.frequency_range))[0]

#Get the coherence matrix from the analyzer, averaging on the last
#(frequency) dimension: (roi X roi array)
self.coherence = np.mean(A.coherence[:,:,freq_idx],-1)
# Get the time delay from analyzer, (roi X roi array)
self.delay = np.mean(A.delay[:,:,freq_idx],-1)
runtime.returncode = 0
return runtime

#Rewrite _list_outputs (look at BET)
def _list_outputs(self):
outputs = self.output_spec().get()

#Always defined:
outputs['coherence']=self.coherence #The array
#if isdefined(self.inputs.output_csv_file):

#write to a csv file and assign a value to self.coherence_file (a
#file name + path)

#Always defined (the arrays):
outputs['coherence']=self.coherence
outputs['delay']=self.delay

#Conditional
if isdefined(self.inputs.output_csv_file):
outputs['coherence_csv']=self.coherence_file
Expand Down
6 changes: 3 additions & 3 deletions nipype/interfaces/nitime/tests/test_nitime.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,6 @@ def test_read_csv():
yield assert_raises,ValueError,CA._read_csv

CA.inputs.in_file = example_data('fmri_timeseries.csv')
rec_array = CA._read_csv()
yield assert_equal, rec_array['wm'][0],10125.9

data,roi_names = CA._read_csv()
yield assert_equal, data[0][0],10125.9
yield assert_equal, roi_names[0],'WM'