Source code for pyoperant.local_zog

from pyoperant import hwio, components, panels, utils
from pyoperant.interfaces import comedi_, pyaudio_
from pyoperant import InterfaceError
import time

_ZOG_MAP = {
    1: ('/dev/comedi0', 2, 0, 2, 8), # box_id:(subdevice,in_dev,in_chan,out_dev,out_chan)
    2: ('/dev/comedi0', 2, 4, 2, 16),
    3: ('/dev/comedi0', 2, 24, 2, 32),
    4: ('/dev/comedi0', 2, 28, 2, 40),
    5: ('/dev/comedi0', 2, 48, 2, 56),
    6: ('/dev/comedi0', 2, 52, 2, 64),
    7: ('/dev/comedi0', 2, 72, 2, 80),
    8: ('/dev/comedi0', 2, 76, 2, 88),
    9: ('/dev/comedi1', 2, 0, 2, 8),
    10: ('/dev/comedi1', 2, 4, 2, 16),
    11: ('/dev/comedi1', 2, 24, 2, 32),
    12: ('/dev/comedi1', 2, 28, 2, 40),
    13: ('/dev/comedi1', 2, 48, 2, 56),
    14: ('/dev/comedi1', 2, 52, 2, 64),
    15: ('/dev/comedi1', 2, 72, 2, 80),
    16: ('/dev/comedi1', 2, 76, 2, 88),
    }

dev_name_fmt = 'Adapter 1 (5316) - Output Stream %i'

[docs]class ZogAudioInterface(pyaudio_.PyAudioInterface): """docstring for ZogAudioInterface""" def __init__(self, *args, **kwargs): super(ZogAudioInterface, self).__init__(*args,**kwargs)
[docs] def validate(self): super(ZogAudioInterface, self).validate() if self.wf.getframerate()==48000: return True else: raise InterfaceError('this wav file must be 48kHz')
[docs]class ZogPanel(panels.BasePanel): """class for zog boxes """ def __init__(self,id=None, *args, **kwargs): super(ZogPanel, self).__init__(*args, **kwargs) self.id = id # define interfaces self.interfaces['comedi'] = comedi_.ComediInterface(device_name=_ZOG_MAP[self.id][0]) self.interfaces['pyaudio'] = ZogAudioInterface(device_name= (dev_name_fmt % self.id)) # define inputs for in_chan in [ii+_ZOG_MAP[self.id][2] for ii in range(4)]: self.inputs.append(hwio.BooleanInput(interface=self.interfaces['comedi'], params = {'subdevice': _ZOG_MAP[self.id][1], 'channel': in_chan }, ) ) for out_chan in [ii+_ZOG_MAP[self.id][4] for ii in range(8)]: self.outputs.append(hwio.BooleanOutput(interface=self.interfaces['comedi'], params = {'subdevice': _ZOG_MAP[self.id][3], 'channel': out_chan }, ) ) self.speaker = hwio.AudioOutput(interface=self.interfaces['pyaudio']) # assemble inputs into components self.left = components.PeckPort(IR=self.inputs[0],LED=self.outputs[0]) self.center = components.PeckPort(IR=self.inputs[1],LED=self.outputs[1]) self.right = components.PeckPort(IR=self.inputs[2],LED=self.outputs[2]) self.house_light = components.HouseLight(light=self.outputs[3]) self.hopper = components.Hopper(IR=self.inputs[3],solenoid=self.outputs[4]) # define reward & punishment methods self.reward = self.hopper.reward self.punish = self.house_light.punish
[docs] def reset(self): for output in self.outputs: output.write(False) self.house_light.on() self.hopper.down()
# self.speaker.stop()
[docs] def test(self): self.reset() dur = 2.0 for output in self.outputs: output.write(True) utils.wait(dur) output.write(False) self.reset() self.reward(value=dur) self.punish(value=dur) self.speaker.queue('/usr/local/stimuli/test48k.wav') self.speaker.play() time.sleep(1.0) self.speaker.stop() return True
[docs]class Zog1(ZogPanel): """Zog1 panel""" def __init__(self): super(Zog1, self).__init__(id=1)
[docs]class Zog2(ZogPanel): """Zog2 panel""" def __init__(self): super(Zog2, self).__init__(id=2)
[docs]class Zog3(ZogPanel): """Zog3 panel""" def __init__(self): super(Zog3, self).__init__(id=3)
[docs]class Zog4(ZogPanel): """Zog4 panel""" def __init__(self): super(Zog4, self).__init__(id=4)
[docs]class Zog6(ZogPanel): """Zog6 panel""" def __init__(self): super(Zog6, self).__init__(id=6)
[docs]class Zog8(ZogPanel): """Zog8 panel""" def __init__(self): super(Zog8, self).__init__(id=8)
class Zog10(ZogPanel): """Zog10 panel""" def __init__(self): super(Zog10, self).__init__(id=10) class Zog12(ZogPanel): """Zog12 panel""" def __init__(self): super(Zog12, self).__init__(id=12)
[docs]class Zog13(ZogPanel): """Zog13 panel""" def __init__(self): super(Zog13, self).__init__(id=13)
[docs]class Zog14(ZogPanel): """Zog14 panel""" def __init__(self): super(Zog14, self).__init__(id=14)
[docs]class Zog15(ZogPanel): """Zog15 panel""" def __init__(self): super(Zog15, self).__init__(id=15)
[docs]class Zog16(ZogPanel): """Zog16 panel""" def __init__(self): super(Zog16, self).__init__(id=16)
# define the panels with cue lights
[docs]class ZogCuePanel(ZogPanel): """ZogCuePanel panel""" def __init__(self,id=None): super(ZogCuePanel, self).__init__(id=id) for out_chan in [ii+_ZOG_MAP[self.id][4] for ii in range(5,8)]: self.outputs.append(hwio.BooleanOutput(interface=self.interfaces['comedi'], params = {'subdevice': _ZOG_MAP[self.id][3], 'channel': out_chan }, ) ) self.cue = components.RGBLight(red=self.outputs[7], green=self.outputs[5], blue=self.outputs[6], name='cue')
[docs]class Zog5(ZogCuePanel): """Zog5 panel""" def __init__(self): super(Zog5, self).__init__(id=5)
[docs]class Zog7(ZogCuePanel): """Zog7 panel""" def __init__(self): super(Zog7, self).__init__(id=7)
[docs]class Zog9(ZogCuePanel): """Zog9 panel""" def __init__(self): super(Zog9, self).__init__(id=9)
[docs]class Zog11(ZogCuePanel): """Zog11 panel""" def __init__(self): super(Zog11, self).__init__(id=11)
[docs]class Zog10(ZogCuePanel): """Zog10 panel""" def __init__(self): super(Zog10, self).__init__(id=10)
[docs]class Zog12(ZogCuePanel): """Zog12 panel""" def __init__(self): super(Zog12, self).__init__(id=12)
# in the end, 'PANELS' should contain each operant panel available for use PANELS = { "1": Zog1, "2": Zog2, "3": Zog3, "4": Zog4, "5": Zog5, "6": Zog6, "7": Zog7, "8": Zog8, "9": Zog9, "10": Zog10, "11": Zog11, "12": Zog12, "13": Zog13, "14": Zog14, "15": Zog15, "16": Zog16, } BEHAVIORS = ['pyoperant.behavior', 'glab_behaviors' ] DATA_PATH = '/home/bird/opdat/' # SMTP_CONFIG DEFAULT_EMAIL = 'justin.kiggins@gmail.com' SMTP_CONFIG = {'mailhost': 'localhost', 'toaddrs': [DEFAULT_EMAIL], 'fromaddr': 'Zog <bird@zog.ucsd.edu>', 'subject': '[pyoperant notice] on zog', 'credentials': None, 'secure': None, }