def stimulation(self, circle_path, outputDir):

        #Paramters of Stimulation
        number_of_repetitions = 10
        interTrainDelay = 20000  # 10000 = 0.5s
        bin_length = 500  #Number of datapoints to crop after stimulus
        amp1 = 10
        amp2 = 10
        phase1 = 4
        phase2 = 4

        #Set gain back to normal operation conditions
        mea1kusr.init.board()
        mea1kusr.init.chip()

        save = stst.save('localhost')
        save.mkDir(outputDir)
        save.reset()

        print 'make chip'
        chip = libarray.Chip()
        print 'done'

        #mea1k.go(mea1k.cmdVRefMosR(1100)) #gives stable traces but many out of bounds after stim

        # Turn on power for the stimulation buffers
        mea1k.go(
            mea1k.cmdCore(
                onChipBias=1,
                stimPowerDown=0,
                outputEn=1,
                spi=0,  # 0 == DataxDO off
                tx=0,  # 0 == DAC0
                rstMode=0,  # 0 == auto
                offsetCyc=7,
                resetCyc=7,
                wlCyc=7))

        mea1k.go(
            mea1k.cmdReadout(
                s1Bypass=0,
                s1Gain=1,  # 1 == x16   0 == x7
                s1RstMode=0,  # 0 == disconnect
                s2Bypass=0,
                s2Gain=5,  # 5 == x16
                s3Bypass=0,
                s3Gain=0))  # 0 ==x2

        #Import the information about the stimulation electrodes
        el_list = h5py.File(circle_path + '/segmentation_logfile.h5', 'r')
        routed_el = [
            values['stim_el/gotten_el'][:]
            for key, values in el_list.iteritems()
        ]
        rec_el = [
            values['rec_el/gotten_el'][:]
            for key, values in el_list.iteritems()
        ]
        el_list.close()

        logfile = h5py.File(outputDir + '/stimlist_stim_config_.hdf5', 'w')
        lengths = [i.size for i in routed_el]

        #Start iterating over each electrode
        print '{0:02} iterations to be done.'.format(max(lengths))
        for i in range(max(lengths)):
            configFile = circle_path + '/config_structure/circles.hex.nrk'
            chip.loadHEX(configFile)
            print 'configFile loaded...'

            print 'Offset MEA around 512 bits...'
            Api = mea1kusr.api.Api()
            Api.binary_offset(512)
            #Offset the electrodes around 512 bits.
            print 'Offset done'

            stimlist = []
            for j in routed_el:
                if i < j.size:
                    stimlist.append(j[i])

            # Save the stimulation electrodes as attributes
            stim_group = logfile.create_group('stim_config_' + str(i) +
                                              '/stimlist')
            for k, p in enumerate(stimlist):
                stim_group.attrs.create('channel_' + str(k), p)

            rec_group = logfile.create_group('stim_config_' + str(i) +
                                             '/recording_electrodes')
            for k, p in enumerate(rec_el):
                rec_group.attrs.create('channel_' + str(k), p)

            stimChannels = []
            for k in stimlist:
                chip.electrodeToStim(k)
                stimChannels.append(chip.queryStimAtElectrode(k))

                chip.download()
            time.sleep(2)
            print 'El. \tbuffer'
            for p, k in enumerate(stimChannels):
                print stimlist[p], '\t', k

            while -1 in stimChannels:
                stimChannels.remove(-1)

            print 'Offset MEA around 512 bits...'
            Api = mea1kusr.api.Api()
            Api.binary_offset(512)
            #Offset the electrodes around 512 bits.
            print 'Offset done'

            save.openDir(outputDir)
            save.mapping(chip.get_mapping())

            c = mea1k.Config()
            c.add(self.switchOffAllChannels())
            c.add(self.switchOnChannels(stimChannels, 1))
            c.add(mea1k.cmdDelaySamples(100))

            for l in range(number_of_repetitions):
                c.add(
                    mea1k.cmdDelaySamples(interTrainDelay - (phase1 + phase2))
                )  #-8 to account for the stimulus length
                c.add(
                    self.voltageBiPhasicPulse(512, amp1, amp2, phase1, phase2))
            train_time = (number_of_repetitions * interTrainDelay) / 20000.

            save.start('raw_stim_config_' + str(i))
            c.send()
            time.sleep(train_time + 2)
            save.stop()
            time.sleep(3)

            raw_file = h5py.File(
                outputDir + '/raw_stim_config_' + str(i) + '.raw.h5', 'r')
            DAC = raw_file['sig'][1024, :]
            over_threshold_islets = np.where(DAC > 512 + (amp1 / 2))[
                0]  #Sometimes the stimulation buffer doesn't send a DAC value
            stim_edges = over_threshold_islets[np.hstack(
                (0,
                 np.asarray([
                     1 + el
                     for el in np.where(np.diff(over_threshold_islets) != 1)[0]
                 ])))]  #Extract the timing of the stimuli

            index = np.asarray(
                [np.arange(0, bin_length) + c for c in stim_edges])
            seconds = index / 20000.

            el_indices = []
            missing = {}
            for keys, values in logfile[
                    'stim_config_' + str(i) +
                    '/recording_electrodes'].attrs.iteritems():
                missing[keys] = []
                for it in values[:]:
                    try:
                        el_indices.append(
                            np.where(
                                raw_file['mapping']['electrode'] == it)[0][0])
                    except:
                        missing[keys].append(it)

            print 'miss.el. keys \t values'
            for keys, values in missing.iteritems():
                if values:
                    print '\t', keys, values
                    true_rec_el = list(
                        logfile['stim_config_' + str(i) +
                                '/recording_electrodes'].attrs[keys])
                    del logfile['stim_config_' + str(i) +
                                '/recording_electrodes'].attrs[keys]
                    for val in values:
                        true_rec_el.remove(val)
                    logfile['stim_config_' + str(i) +
                            '/recording_electrodes'].attrs.modify(
                                keys, true_rec_el)

            trace = np.empty(
                (1028, bin_length * stim_edges.size)
            )  #number_of_repetitions instead of stim_edges.size doesn't always work because sometimes the buffer missses some commands
            raw_file['sig'].read_direct(trace,
                                        source_sel=np.s_[:, index.flatten()])
            f = h5py.File(outputDir + '/stim_config_' + str(i) + '.h5', 'w')
            cropped_trace = trace[sorted(el_indices)]
            if not stim_edges.size == number_of_repetitions:
                print 'DAC channel transmitted {0:03} out of {1:01} stimuli.'.format(
                    stim_edges.size, number_of_repetitions)
                print 'Raw_trace is padded with zeros to get desired size.'
                corrected_traces = 512 * np.ones(
                    (len(el_indices), bin_length * number_of_repetitions))
                corrected_traces[:,
                                 bin_length * stim_edges.size] = cropped_trace
                f.create_dataset('sig', data=corrected_traces)
            else:
                f.create_dataset('sig', data=cropped_trace)
            f['mapping'] = raw_file['mapping'][sorted(el_indices)]
            f['proc0/spikeTimes'] = raw_file['proc0/spikeTimes'][:]
            f['time'] = seconds
            f['settings'] = raw_file['settings/gain'][:]
            f['version'] = raw_file['version'][:]

            raw_file.close()
            os.remove(outputDir + '/raw_stim_config_' + str(i) + '.raw.h5')
            f.close()
            print 'Iteration and postprocessing no. {0:03}/{1:01} done.'.format(
                i, max(lengths))

        logfile.close()
Example #2
0
# default initialization
mea1kusr.init.board()
mea1kusr.init.chip()  # Corresponds to initialize on measerver

chip = libarray.Chip()  # Create Chip variable
lc = mea1k.Loop()  # Create loop variable (execute fast commands)

# reduce amplifier gain (ADC), amplifier have three stages: s1, s2, s3
#This amplifier is tuned to enhance neuronal signals (linear in uV-range). Amplifier is not
#optimal to enhance 1 kHz-stimulus in mV range (but still usable).
mea1k.go(
    mea1k.cmdReadout(
        s1Bypass=0,  # Bypass amplifier if needed
        s1Gain=0,  # 0 == x7 (=7-fache Verstaerkung)
        s1RstMode=0,  # 0 == disconnect amplifier
        s2Bypass=0,
        s2Gain=2,  # 2 == x2 (=14-fache Verstaerkung)
        s3Bypass=0,
        s3Gain=0  # 0 ==x2
    ))
'''PCB has 8 analog switches in total, 4xSW1 and 4xSW2. SW2 can be completely open (=0). For SW1 we want to connect pin NO1 to pin NO4 -> connect int. ref el to VRefVari (which are the DAC's). SW1_1/2/3/4 is represented by four binary digits. Eg. 0001 (=1) closes first switch, eg. connects NO1 and COM1. 1000 (=9) closes the fourth switch, eg. connects NO4 and COM4. In hexadecimal this is 9 (binary = 1001).'''
# 1. remove VrefIn from refEl
mea1k.go(mea1k.cmdSw2(0))
# 2. connect all refels to vrefvari
mea1k.go(mea1k.cmdSw1(0x9))


## Program an FPGA loop on VRefVari
def sineVari(t_period, n_samples, amp=10, periods=1):
    global lc
    lc.stopLoop()
        offsetCyc=7,
        resetCyc=7,
        wlCyc=7))

#default gain of 512 - if needed, change below
# 7x1x1(7)
# 7x8x2(112)
# 16x16x2(512)
# 16x16x4(1024)
# 16x32x4(2048)

mea1k.go(
    mea1k.cmdReadout(
        s1Bypass=0,
        s1Gain=1,  # 1 == x16   0 == x7
        s1RstMode=0,  # 0 == disconnect
        s2Bypass=0,
        s2Gain=5,  # 5 == x16
        s3Bypass=0,
        s3Gain=0))  # 0 ==x2

for t, e in enumerate(stim_list):
    configFile = path + '/config_structure_'
    configFile += str(t + 1) + '/structure_' + str(t + 1) + '.hex.nrk'

    chip.loadHEX(configFile)

    print 'Offset MEA around 512 bits...'
    import mea1kusr.api
    Api = mea1kusr.api.Api()
    Api.binary_offset(512)
    #Offset the electrodes around 512 bits.
    def testElectrodes(self):
    	import math
    	import mea1k
    	import libarray
    	import mea1kusr.init
    	import mea1kusr.save
        import mea1kusr.api

    	## Program an FPGA loop on VRefVari
    	def sineVari(t_period, n_samples, amp=5, periods=1):
            lc.stopLoop()
            lc.clear()
            lc.reset()
            lc.setStart() #Start the period'
            for i in range(0,n_samples):
                v = int(-amp*math.sin( periods*2*math.pi /n_samples * i)) #Amplitude of the sin-wave in bits
                s = int(20e3 * t_period/n_samples) #Time between the samples in bits. 1 bit = 50us = sampling freq.
            	#print i,v,s
            	lc.toLoop( mea1k.cmdVRefVari( 2048+v ) ) #Program v around 2048 bits. DAC has 12 bits
            			 #(=max. 4098 bits)
            	lc.toLoop( mea1k.cmdDelaySamples( s ))
            lc.setStop()
            lc.download() #Download the loop to the FPGA


    	configDir = "/opt/MaxLab/configs/28x6x6/"
        outputDir = self.path

    	## Basic setup of chip & board

    	# default initialization
    	mea1kusr.init.board()
    	mea1kusr.init.chip() # Corresponds to initialize on measerver

    	chip = libarray.Chip() # Create Chip variable
    	lc   = mea1k.Loop() # Create loop variable (execute fast commands)

    	# reduce amplifier gain (ADC), amplifier have three stages: s1, s2, s3
    	#This amplifier is tuned to enhance neuronal signals (linear in uV-range). Amplifier is not
    	#optimal to enhance 1 kHz-stimulus in mV range (but still usable).
    	mea1k.go( mea1k.cmdReadout(
        		s1Bypass=0,			# Bypass amplifier if needed
        		s1Gain=0,                   # 0 == x7 (=7-fache Verstaerkung)
        		s1RstMode=0,                # 0 == disconnect amplifier
        		s2Bypass=0,
        		s2Gain=2,                   # 2 == x2 (=14-fache Verstaerkung)
        		s3Bypass=0,
        		s3Gain=0                    # 0 ==x2
    	))

    	'''PCB has 8 analog switches in total, 4xSW1 and 4xSW2. SW2 can be completely open (=0).
        For SW1 we want to connect pin NO1 to pin NO4 -> connect int. ref el to VRefVari
        (which are the DAC's). SW1_1/2/3/4 is 	 represented by four binary digits. Eg. 0001 (=1)
        closes first switch, eg. connects NO1 and COM1. 1000 	(=8) closes the fourth switch,
        eg. connects NO4 and COM4. In hexadecimal this is 9 (binary = 1001).'''
    	# 1. remove VrefIn from refEl
    	mea1k.go( mea1k.cmdSw2( 0 ) )
    	# 2. connect all refels to vrefvari
    	mea1k.go( mea1k.cmdSw1(  0x9 ) )

    	# 1 kHz w/ 20 samples (Gives exactly the sampling frequency of 20000/s) and 10 bit amplitude
    	sineVari( 0.001 , 20 , 10)

    	print 'Offset MEA around 512 bits...'
    	lc.startLoop() #Starts to apply the function to MEA
    	Api = mea1kusr.api.Api()
    	Api.binary_offset( 512 ); #Offset the electrodes around 512 bits.
    	lc.stopLoop()
    	print 'Offset done'

    	## Save && run scan
    	save = mea1kusr.save.save('localhost')
    	save.mkDir( outputDir )
    	save.reset( )

    	for cfg in range( 25 ):
    		print cfg
    		cfgFile = configDir +'{0:03}.hex.nrk'.format(cfg)
    		chip.loadHEX( cfgFile ) #Load the config file
    		chip.download() #Download the config to the chip
    		save.mapping(chip.get_mapping( ))
    		lc.startLoop()
    		time.sleep(0.3)
    		save.start('{0:03}'.format(cfg))
    		time.sleep(0.2)
    		save.stop()
    		time.sleep(0.3)
    		lc.stopLoop()