示例#1
0
	def __init__(self,master=None):
		Frame.__init__(self,master)
		#self.Top=Toplevel()
		self.master.protocol("WM_DELETE_WINDOW", self.quitApp)
		self.infoDict=dict();
		self.curProt=None
		self.initanalysisDispWin()
		self.ITC=PyITC()

		self.initRootWin()
		self.initDispWin()
		self.initeStimWin()
示例#2
0
class Application(Frame):
#class Aplication():
	def __init__(self,master=None):
		Frame.__init__(self,master)
		#self.Top=Toplevel()
		self.master.protocol("WM_DELETE_WINDOW", self.quitApp)
		self.infoDict=dict();
		self.curProt=None
		self.initanalysisDispWin()
		self.ITC=PyITC()

		self.initRootWin()
		self.initDispWin()
		self.initeStimWin()

	def initRootWin(self):
		self.grid()
		self.master.geometry('+10+10')
		self.master.resizable(width=False, height=False)
		self.master.title("ITC GUI")

		self.dirL=Label(self,width=20,height=1,text='Save directory:',justify=RIGHT)
		self.dirL.grid(row=1,column=1)
		self.dirVar=StringVar()
		self.dirVar.set('temp')
		self.dirEntry=Entry(self,width=10,textvariable=self.dirVar)
		self.dirEntry.grid(row=1,column=2, sticky=E+W)

		self.cellL=Label(self,width=20,height=1,text='Cell:',justify=RIGHT)
		self.cellL.grid(row=2,column=1, sticky=E+W)
		self.cellVar=StringVar()
		self.cellVar.set('A')
		self.cellEntry=Entry(self,width=10,textvariable=self.cellVar)
		self.cellEntry.grid(row=2,column=2)

		self.recVar=StringVar()
		self.recVar.set('E1')
		self.recF = Frame(self,relief=RAISED,borderwidth=1)
		self.recL=Label(self.recF,text='Record')
		self.recL.grid()
		self.E1Rad=Radiobutton(self.recF,text='E1',variable=self.recVar,value='E1')
		self.E1Rad.grid()
		self.E2Rad=Radiobutton(self.recF,text='E2',variable=self.recVar,value='E2')
		self.E2Rad.grid()
		self.bothRad=Radiobutton(self.recF,text='both',variable=self.recVar,value='both')
		self.bothRad.grid()
		self.recF.grid(row=3,column=1,columnspan=2,sticky=E+W)

		self.stimVar=StringVar()
		self.stimVar.set('E1')
		self.stimF=Frame(self,relief=RAISED,borderwidth=1)
		self.stimL=Label(self.stimF,text='Stimulate')
		self.stimL.grid()
		self.E1StimRad=Radiobutton(self.stimF,text='E1',variable=self.stimVar,value='E1')
		self.E1StimRad.grid()
		self.E2StimRad=Radiobutton(self.stimF,text='E2',variable=self.stimVar,value='E2')
		self.E2StimRad.grid()
		self.stimF.grid(row=4,column=1,columnspan=2,sticky=E+W)

		self.E1ModeVar=IntVar()
		self.E1ModeVar.set(VC)
		self.E1ModeVar.trace_variable('w',self.updateModesAndHolds)
		self.E1ModeF=Frame(self,relief=RAISED,borderwidth=1)
		self.E1ModeL=Label(self.E1ModeF,text='E1 Mode')
		self.E1ModeL.grid()
		self.E1ModeVCRad=Radiobutton(self.E1ModeF,text='VC',variable=self.E1ModeVar,value=VC)
		self.E1ModeVCRad.grid()
		self.E1ModeICRad=Radiobutton(self.E1ModeF,text='IC',variable=self.E1ModeVar,value=IC)
		self.E1ModeICRad.grid()
		self.E1ModeF.grid(row=5,column=1,columnspan=2,sticky=E+W)

		self.holdF={'E1':Frame(self,relief=RAISED,borderwidth=1),
				'E2':Frame(self,relief=RAISED,borderwidth=1)}
		self.holdVar={'E1VC':None,'E1IC':None,'E2VC':None,'E2IC':None}
		self.holdL={'E1VC':None,'E1IC':None,'E2VC':None,'E2IC':None}
		self.holdEntry={'E1VC':None,'E1IC':None,'E2VC':None,'E2IC':None}

		self.E1HoldL=Label(self.holdF['E1'],text='E1 Hold')
		self.E1HoldL.grid(column=1,row=1,columnspan=2)
		self.E2HoldL=Label(self.holdF['E2'],text='E2 Hold')
		self.E2HoldL.grid(column=1,row=1,columnspan=2)

		r=1
		for i in self.holdVar.keys():
			self.holdVar[i]=StringVar()
			self.holdVar[i].set('0')
			#self.holdVar[i].trace_variable('w',self.updateModesAndHolds)
			self.holdL[i]=Label(self.holdF[i[:2]],text='%s:' % i,width=10,justify=RIGHT)
			self.holdL[i].grid(row=mod(r,2)+2,column=1)
			self.holdEntry[i]=Entry(self.holdF[i[:2]],textvariable=self.holdVar[i],width=10)
			self.holdEntry[i].bind('FocusOut',self.updateModesAndHolds)
			self.holdEntry[i].bind('<Return>',self.updateModesAndHolds)
			self.holdEntry[i].grid(row=mod(r,2)+2,column=2)
			r+=1
		self.holdF['E1'].grid(row=6,column=1,columnspan=2,sticky=E+W)

		self.E2ModeVar=IntVar()
		self.E2ModeVar.set(VC)
		self.E2ModeVar.trace_variable('w',self.updateModesAndHolds)
		self.E2ModeF=Frame(self,relief=RAISED,borderwidth=1)
		self.E2ModeL=Label(self.E2ModeF,text='E2 Mode')
		self.E2ModeL.grid()
		self.E2ModeVCRad=Radiobutton(self.E2ModeF,text='VC',variable=self.E2ModeVar,value=VC)
		self.E2ModeVCRad.grid()
		self.E2ModeICRad=Radiobutton(self.E2ModeF,text='IC',variable=self.E2ModeVar,value=IC)
		self.E2ModeICRad.grid()
		self.E2ModeF.grid(row=7,column=1,columnspan=2,sticky=E+W)
		self.holdF['E2'].grid(row=8,column=1,columnspan=2,sticky=E+W)
		self.infoDict.update({'stimVar':self.stimVar,
							  'recVar':self.recVar,
							  'cellVar':self.cellVar,
							  'dirVar':self.dirVar})
		self.reInitButt=TkButton(self,text='Reinitialize ITC',command=self.restartCommand)
		self.reInitButt.grid(column=1)
	def restartCommand(self):
		self.ITC.restartAcq()
	def initDispWin(self):
		self.dispDict={'win':Toplevel(),
					   'fig':Figure(figsize=(12,6), dpi=100),
					   'axes':None,
					   'canvas':None}
		self.dispDict['win'].geometry('+400+10')
		self.dispDict['win'].grid()

		self.dispDict['axes']=[self.dispDict['fig'].add_subplot(2,1,1),self.dispDict['fig'].add_subplot(2,1,2)]
		self.dispDict['canvas']=FigureCanvasTkAgg(self.dispDict['fig'], master=self.dispDict['win'])
		self.dispDict['canvas'].show()
		#self.dispDict['canvas'].get_tk_widget().grid(sticky=N+E+S+W) can't grid and pack in same frame or it freezes!
		self.dispDict['canvas'].get_tk_widget().pack(side=TOP, fill=BOTH, expand=1)
		#self.dispDict['win'].winfo_toplevel().update_idletasks()
		buttonList=['di0','di1','di2','di3','di4','do0','do1','do2','do3','do4']

		self.dispDict['toolbar']=myToolbar(self.dispDict['canvas'],self.dispDict['win'],buttonList,self.dispUpdateCallback)
		self.setDispToolbar()
		
		self.dispDict['toolbar'].update()

		self.dispDict['win'].resizable(width=True, height=True)
		self.dispDict['win'].title("Voltage and current traces")
	def setDispToolbar(self,vec=[1,1,0,0,0,0,0,0,0,0]):
		buttonList=['di0','di1','di2','di3','di4','do0','do1','do2','do3','do4']
		for i in range(len(buttonList)):
			b=buttonList[i]
			self.dispDict['toolbar'].varDispOpt[b].set(vec[i])
	def initanalysisDispWin(self):
		self.analysisDispDict={'win':Toplevel(),
					   'fig':Figure(figsize=(12,6), dpi=100),
					   'axes':None,
					   'canvas':None}
		self.analysisDispDict['win'].geometry('+210-1350')
		self.analysisDispDict['win'].grid()
		self.analysisDispDict['axes']=[self.analysisDispDict['fig'].add_subplot(2,1,1),self.analysisDispDict['fig'].add_subplot(2,1,2)]
		self.analysisDispDict['canvas']=FigureCanvasTkAgg(self.analysisDispDict['fig'], master=self.analysisDispDict['win'])
		self.analysisDispDict['canvas'].show()
		self.analysisDispDict['canvas'].get_tk_widget().pack(side=TOP, fill=BOTH, expand=1)
		self.analysisDispDict['toolbar']=NavigationToolbar2TkAgg(self.analysisDispDict['canvas'],self.analysisDispDict['win'])
		self.analysisDispDict['toolbar'].update()
		self.analysisDispDict['win'].resizable(width=True, height=True)
		self.analysisDispDict['win'].title("Online Analysis")
	def dispUpdateCallback(self,dispOptDict):
		if self.curProt!=None:
			self.curProt.dispUpdate(dispOptDict)
	def initeStimWin(self):
		self.eStimWin=Toplevel()
		self.eStimWin.geometry('+210+10')
		self.eStimWin.grid()

		f=Frame(self.eStimWin)
		f.grid(row=2,column=1)

		self.eStimLB=Listbox(self.eStimWin,height=35)
		self.eStimLB.grid(row=1,column=1)
		self.eStimLB.bind("<Button-1>",func=self.eStimLBCB)

		args=(f,self.dispDict,self.ITC,self.infoDict,self.analysisDispDict)
		#protNames=dir(eStimProtocols)
		#for p in protNames:
			#self.eStimProtocols.update({p:eval('eStimProtocols.%s(args)'%p)})
		self.eStimProtocols={'patch':patchProt(args),
							 'RandC':RandCProt(args),
							 'pulse train':ptProtLooped(args),
							 'spots':spots(args),
							 #'sectors':sectors(args),
							 #'light PT':lightPtProt(args),
							 'open ended':openProt(args),
							 #'two lights':twoLightProt(args),
							 'fullfield':fullfield(args),
							 #'annuli':annuli(args),
							 'update FGBG':updateFGBG(args),
							 'fg power calibration':fgPICal(args),
							 'bg power calibration':bgPICal(args),
							 #'density cal':myBgPICal(args),
							 #'fast pow cal':powIntensityFastCal(args),
							 'trigger':triggerProt(args),
							 #'squareboard':squareboardFull(args),
							 #'squareboardCirc':squareboardCirc(args),
							 #'squareboardLine':squareboardLine(args),
							 'SB Line calibrated':squareboardLineCalibrated(args),
							 'SB Line cal (partial)':squareboardLineCalibratedPart(args),
							 'SB Circ calibrated':squareboardCircCalibrated(args),
							 #'SB Full calibrated':squareboardFullCalibrated(args),
							 #'fullfield calibrated':fullfieldCalibrated(args), 
							 'spots calibrated':spotsCalibrated(args),
							 'family calibrated':familySpotsCalibrated(args),
							 'updateFGBG calibrated':updateFGBGCalibrated(args), 
							 'fast SB cal':fastSBCal(args),
							 'test SB cal':fastSBCalibrated(args),
							 'fast BG cal':fastBGCal(args),
							 'test BG cal':fastBGCalibrated(args),
							 'fast line cal':fastSBLineCal(args),
							 'test line cal':fastSBLineCalibrated(args),
							 'laser line':laserProt(args)}
							 #'vsync':vsync(args)

		order=('patch','RandC','pulse train','spots','fullfield','squareboard',
			   'squareboardCirc','squareboardLine','sectors','annuli','light PT',
			   'two lights','open ended','update FGBG','fullfield calibrated',
			   'spots calibrated','SB Full calibrated', 'SB Circ calibrated',
			   'SB Line calibrated','updateFGBG calibrated','fg power calibration',
			   'bg power calibration','density cal',
			   'fast SB cal','test SB cal','fast BG cal','test BG cal','fast pow cal','fast line cal', 'test line cal',
			   'vsync','trigger')
		order=('patch','RandC','pulse train','spots','fullfield','open ended','update FGBG',
			   'spots calibrated','family calibrated','SB Circ calibrated',
			   'SB Line calibrated','SB Line cal (partial)','updateFGBG calibrated','fg power calibration',
			   'bg power calibration','fast SB cal','test SB cal','fast BG cal','test BG cal','fast line cal', 'test line cal',
			   'trigger','laser line')
		for i in order:
			self.eStimLB.insert(END,i)
		self.eStimWin.resizable(width=False, height=False)
		self.eStimWin.title('eStim')
	def eStimLBCB(self,event):
		for i in self.eStimProtocols.values():
			i.removeGUI()
		self.eStimProtocols[self.eStimLB.get(self.eStimLB.nearest(event.y))].gridGUI()
		self.curProt=self.eStimProtocols[self.eStimLB.get(self.eStimLB.nearest(event.y))]
	def updateModesAndHolds(self,name=None,index=None,mode=None):
		#print type(self.holdVar['E1VC'].get())
		#print self.E1ModeVar.get(), type(self.E1ModeVar.get())
		self.ITC.mode[0]=int(self.E1ModeVar.get())
		self.ITC.mode[1]=int(self.E2ModeVar.get())

		self.ITC.hold[VC][0]=float(self.holdVar['E1VC'].get())
		self.ITC.hold[IC][0]=float(self.holdVar['E1IC'].get())
		self.ITC.hold[VC][1]=float(self.holdVar['E2VC'].get())
		self.ITC.hold[IC][1]=float(self.holdVar['E2IC'].get())
		self.ITC.setHolding()
	def quitApp(self):
		print 'Quitting...',
		status=self.ITC.stopAcq()
		if status!=CLOSED:
			self.ITC.killAcq()
			print 'killing data thread...',
		status=self.ITC.cleanupDLL()
		for p in self.eStimProtocols.values():
			p.comToEpoch.put('exit')
		self.dispDict['win'].destroy()
		self.analysisDispDict['win'].destroy()
		self.eStimWin.destroy()
		self.master.destroy()
		print 'done!'