https://gitlab.com/um-mip/coding-project
Raw File
Tip revision: 2d400d05d3443defb99bf8c8a9b3c2c846a8b1be authored by defazio on 23 July 2021, 13:12:47 UTC
Merge branch 'spiketriggeredaverage'
Tip revision: 2d400d0
histotoy_v2_1.ipf
#pragma rtGlobals=1		// Use modern global access method.

// concatenate :  the long awaited procedure for combining analyzed data from multiple waves
Function ConcCB(ctrlName,checked) : CheckBoxControl
	String ctrlName
	Variable checked
	NVAR g_conc = g_conc

variable iwave=0, nwaves=0
string temp="",newTB="", new="",newRP="",oldTB="",selwaven=""
string tb_ext = "_ptb",test=""
variable t0=0,thyme=0,t1=0

controlinfo LB_hist_waves
selwaven=s_value+"sel"
WAVE/T w1=$s_value
WAVE selwave=$selwaven

nwaves = numpnts(w1)
iwave=0
do
	if(stringmatch(w1[iwave],""))
		nwaves = iwave
	else
		if(selwave[iwave]==1)
			temp = removequotes(w1[iwave])
			WAVE w_t = $temp
			oldTB = temp+tb_ext
			WAVE w_oldPTB = $oldTB
			if(iwave==0)
				new = "conc_"+temp
				newTB = "conc_"+temp+tb_ext
				duplicate /O w_oldPTB, $newTB
				WAVE w_newTB = $newTB
				test=stringbykey("START",note(w_t))
				if(strlen(test)>0)
					t0=str2num(test)
					
				else
					t0=0
					t1=rightx(w_t)
				endif
				thyme=0
			else
				test=stringbykey("START",note(w_t))
				if(strlen(test)>0)
					thyme=(str2num(test)-t0)
				else
					thyme=t1
					t1+=rightx(w_t)
				endif
				duplicate/O w_oldPTB, tempwave
				tempwave+=thyme
				concatenate/NP {tempwave}, w_newTB		
			endif
			print temp,thyme
		endif // selwave
	endif // end of list
	iwave+=1
while(iwave<nwaves)
print nwaves
//w_newTB/=60
redimension/N=(nwaves+1,-1) w1
redimension/N=(nwaves+1,-1,-1) selwave
w1[nwaves+1] = new
g_conc = 0
end

//get the first selected item in listbox
function/s get1stItem(listn,sellistn)
string listn,sellistn
string firstitem=""
variable item=0, nitems=0
if(exists(listn))
	wave/t listw = $listn
else
	print "get1stitem:  no such wave",listn
	abort
endif
if(exists(sellistn))
	wave sellistw = $sellistn
else
	print "get1stitem:  no such wave",sellistn
	abort
endif

nitems=numpnts(listw)
do
	if(sellistw[item]==1)
		nitems=item
	endif
	item+=1
while(item<nitems)
firstitem=listw(nitems)

return firstitem
end

// make time course and distribution histograms

function histodist()
NVAR g_distbinsize = root:g_distbinsize
NVAR g_timebinsize = root:g_timebinsize
NVAR g_distSel=root:g_distsel //1 is a distributiono, 2 is a time course
NVAR g_lockx=g_lockx
NVAR g_locky=g_locky
NVAR g_flipx=g_flipx
NVAR g_super=g_super
NVAR g_conc=g_conc

string datawaven="", typewaven="",waven=""
variable index=0,nbins=0,binstart=0,binend=0
string message="",listwaven="",selwaven=""
variable suggestbinsize=0
variable maxtime, dx,nevents=0,ievent=0,ibin=0,t=0
variable tc_min=0, tc_max=0
controlinfo LB_hist_waves
listwaven = s_value
selwaven = listwaven+"sel"
datawaven = get1stitem(listwaven,selwaven)
if(waveexists($datawaven))
	WAVE rawdata=$datawaven
	tc_min=leftx(rawdata)
	tc_max=rightx(rawdata)
else
	waven=datawaven+"_ptb"
	if(waveexists($waven))
		WAVE temp = $waven
		wavestats/Z/Q temp
		tc_min=0
		tc_max=V_max
	else
		print "Tried to get range from rawdata: ",datawaven, " and ptb:", waven
		print "Butt failed."
		abort
	endif
endif
	
//index=v_Value
WAVE/T w1=$s_value
//datawaven=w1[index]
//print datawaven, index
controlinfo LB_hist_results
index=v_value
WAVE/T w2=$s_value
typewaven=w2[index]
//print typewaven, index

	switch(g_distsel)
	case 1:
//print datawaven, typewaven
		waven = getwaven(datawaven,typewaven)
		if(waveexists($waven))
			WAVE datawave = $waven
		else
			print "No results wave ",waven,".  Try again."
			abort
		endif

	//	print "now performing distribution histogram"
		wavestats/Q datawave
		binstart = v_min
		binend = v_max
		nbins = round( (binend-binstart)/g_distbinsize )
	//	print binstart, nbins,g_distbinsize
		if((nbins>1000)||(nbins<3))
		do
			suggestbinsize = (binend-binstart)/500
			message="Too many bins: "+num2str(nbins)+".  Try binsize: "+num2str(suggestbinsize)+"."
			g_distbinsize = acceptreject(message)
			if(g_distbinsize == 0)
				abort
			endif
			nbins = round( (binend-binstart)/g_distbinsize )
		while((nbins>1000)||(nbins<2))
		endif
		histogram /B={(binstart),(g_distbinsize), (nbins)} datawave, historesult
	break
	case 2:
//print datawaven, typewaven
		waven = getwaven(datawaven,typewaven)
		if(waveexists($waven))
			WAVE datawave = $waven
		else
			print "No results wave ",waven,".  Try again."
			abort
		endif

//		print "now performing time course histogram"
//		print waven
		WAVE historesult = historesult
		variable thistimebin=0, MAXBINS=500000
		nevents = dimSize(datawave,0)
		if(nevents>0)
			
			wavestats/Q datawave

			binstart=tc_min		// now 2012-aug-3 version, span the full range
			binend=tc_max		// 		ditto
//for time course, historesult should span the duration of the rawdata wave
			nbins = round( (binend-binstart)/g_timebinsize )
			if((nbins>MAXBINS)||(nbins<3))
			do
				suggestbinsize = (binend-binstart)/500
				message="Too many  or too few bins: "+num2str(nbins)+".  Try binsize: "+num2str(suggestbinsize)+"."
				g_timebinsize = acceptreject(message)
				if(g_timebinsize == 0)
					abort
				endif
				nbins = ceil( (binend-binstart)/g_timebinsize )
			while((nbins>MAXBINS)||(nbins<2))
			endif

			redimension/N=(nbins) historesult
			setScale/P x, 0,g_timebinsize,"sec", historesult 
			historesult = 0
		
			ibin=0
			ievent=0
			
		// loop over events!!! stimpy you idiot!
			ievent=0
			do
				t=datawave[ievent]
				ibin = ceil((t-dimoffset(historesult,0))/dimdelta(historesult,0))-1
				historesult[ibin]+=1
				ievent+=1
			while(ievent<nevents)
		endif		
	break
	case 3: // all points histogram
		print "making allpoints histogram"
		//print datawaven, typewaven
		waven = getwaven(datawaven,typewaven)
		if(waveexists($datawaven))
			WAVE datawave = $datawaven
		else
			print "No results wave ",waven,".  Try again."
			abort
		endif
		wavestats/Q datawave
		binstart = v_min
		binend = v_max
		nbins = round( (binend-binstart)/g_distbinsize )
	//	print binstart, nbins,g_distbinsize
		if((nbins>1000)||(nbins<3))
		do
			suggestbinsize = (binend-binstart)/500
			message="Too many bins: "+num2str(nbins)+".  Try binsize: "+num2str(suggestbinsize)+"."
			g_distbinsize = acceptreject(message)
			if(g_distbinsize == 0)
				abort
			endif
			nbins = round( (binend-binstart)/g_distbinsize )
		while((nbins>1000)||(nbins<2))
		endif
		make/O/N=1 historesult
		histogram /B={(binstart),(g_distbinsize), (nbins)} datawave, historesult
		
		break
	endswitch

 end

function/s getwaven(datawaven,typewaven)
string datawaven, typewaven
string extension="",prefix=""
strswitch(typewaven)
		case "absolute peak":
			extension = "_pk2"
//			print rw[iwave], extension
			break
		case "relative peak":
			extension = "_pks"
			break
		case "peak time":
			extension = "_ptb"
			break
		case "interval":
			extension = "_int"
			break
		case "derivative":
			extension="_der"
			break
		case "area":
			extension="_area"
			break
		case "events":
//			print "displaying events"
			prefix = "e_"
			break
		case "event average":
			prefix=""
			extension="_ave"
			break
		case "normalized average":
			prefix=""
			extension="_nave"
			break		
		case "risetime":
			prefix=""
			extension="_t50r"
			break		
		case "fwhm":
			prefix=""
			extension="_fwhm"
			break	
		default:
			extension="_garbage"
//			print rw[iwave], extension
			break
endswitch
datawaven = removequotes(datawaven)
datawaven += extension
return datawaven
end

//wrappers for SV and LB and CB
function updateHistoDistCBLB(ctrlname,row, col, event)
string ctrlname
variable row, col, event
//print ctrlname, event
if(event==4)
histodist()
endif

 end
//wrappers for SV and LB and CB
function updateHistoDistSV(ctrlname,varNum,varStr,varName) : SetVariableControl
	String ctrlName
	Variable varNum	// value of variable as number
	String varStr		// value of variable as string
	String varName	// name of variable
//print ctrlname
histodist()
 end


function HistoPanel()
	variable/g g_distbinsize=3, g_timebinsize=1,g_distSel=2,g_lockX=0,g_lockY=0,g_flipX=0,g_conc=0, g_super=0
//	duplicate/O root:importlistwave, histolistwave
	make/o/n=1 historesult
	historesult=0
	duplicate/o importlistwave, histolistwave
	duplicate/o resultswave, historesultswave
	duplicate/o importselwave, histoListwaveSel
	duplicate/o resultsSelwave, histoResultswaveSel 

	PauseUpdate; Silent 1		// building window...
	NewPanel /W=(517,55,1253,454) /N=histopanel_v2_1x
	ModifyPanel frameInset=1
	ShowTools
	SetDrawLayer UserBack
	DrawText 304,330,"Set to 1 for 1 Hz."
		
	ListBox LB_hist_waves,pos={440,10},size={124,299},listWave=histoListWave
	ListBox LB_hist_waves,selWave=histoListWaveSel,mode= 4, proc=updateHistoDistCBLB

	ListBox LB_hist_results,pos={574,9},size={124,299},listWave=historesultswave
	ListBox LB_hist_results,selWave=HistoResultsWaveSel,mode= 2, proc=updateHistoDistCBLB

	SetVariable SV_distbinSize,pos={13,295},size={100,16},title="Dist bin"
	SetVariable SV_distbinSize,value= g_distbinsize, proc = updateHistoDistSV

	SetVariable SV_timebinSize,pos={300,295},size={120,16},title="Time bin (secs )"
	SetVariable SV_timebinSize,value= g_timebinsize, proc = updateHistoDistSV

	CheckBox CB_distribution,pos={123,295},size={70,14},title="Distribution"
	CheckBox CB_distribution,value= 0,mode=1, proc=updateHistoDistSel

	CheckBox CB_time_course,pos={203,295},size={76,14},title="Time course"
	CheckBox CB_time_course,value= 1,mode=1, proc=updateHistoDistSel

	CheckBox CB_allpoints,pos={123,315},size={76,14},title="allPoints"
	CheckBox CB_allpoints,value= 0,mode=1, proc=updateHistoDistSel

	CheckBox CB_concatenate,pos={460,315},size={79,14},title="Concatenate",value= g_conc, proc= concCB
	CheckBox CB_superimpose,pos={460,334},size={79,14},title="Superimpose",value= g_super

	CheckBox CB_lockXaxis,pos={11,340},size={73,14},title="Lock X axis"
	CheckBox CB_lockXaxis,variable= g_lockX,mode=1,proc=lockXaxisCB
	CheckBox CB_autoXaxis,pos={111,340},size={71,14},title="Auto X axis"
	CheckBox CB_autoXaxis,mode=1,proc=lockXaxisCB, value=1

	CheckBox CB_lockYaxis,pos={11,360},size={73,14},title="Lock Y axis"
	CheckBox CB_lockYaxis,variable= g_lockY,mode=1,proc=lockYaxisCB
	CheckBox CB_autoYaxis,pos={111,360},size={71,14},title="Auto Y axis"
	CheckBox CB_autoYaxis,mode=1,proc=lockYaxisCB, value=1

	CheckBox CB_flipXaxis,pos={216,325},size={65,14},proc=graphCB,title="Flip X axis"
	CheckBox CB_flipXaxis,variable= g_flipX
	
	Display/W=(9,8,414,279)/HOST=#  historesult
	ModifyGraph mode=5
	ModifyGraph rgb=(0,0,0)
	SetAxis/A/E=1 left
	SetAxis/A/E=1 bottom
	RenameWindow #,histograph
	SetActiveSubwindow ##
End

Function updatehistodistsel(ctrlName,checked) : CheckBoxControl
	String ctrlName
	Variable checked
	NVAR g_distsel = root:g_distsel
strswitch (ctrlname)
case "CB_distribution":
	g_distsel=1
	break
case "CB_time_course":
	g_distsel=2
	break
case "CB_allpoints":
	g_distsel=3
	break
endswitch
checkbox CB_distribution, value= g_distsel==1
checkbox CB_time_course, value= g_distsel==2
checkbox cb_allpoints, value=g_distsel==3
histodist()
End

function graphCB(ctrlname, checked)
string ctrlname
variable checked
NVAR g_distbinsize = root:g_distbinsize
NVAR g_timebinsize = root:g_timebinsize
NVAR g_distSel=root:g_distsel //1 is a distributiono, 2 is a time course
NVAR g_lockx=g_lockx
NVAR g_locky=g_locky
NVAR g_flipx=g_flipx
NVAR g_super=g_super
NVAR g_conc=g_conc
//three check boxes, lock X, lock y, flip X
variable x_left=0,x_right=0	
getAxis/W=#histograph/Q bottom
x_left=v_min
x_right=v_max
//print g_flipx,x_left,x_right
if(g_flipx==1)
//	print "x axis should be flipped",x_left, x_right
	if(x_left<x_right)
//		print "axis is not flipped.  flipping",x_left, x_right
		if(g_lockx==1)
			SetAxis/W=#histograph bottom, x_right, x_left
		else
			setaxis/W=#histograph/A/R bottom
		endif
	endif
else
//	print "x axis should not be flipped",x_left, x_right
	if(x_left>x_right)
//		print "axis is flipped. unflipping",x_left, x_right
		if(g_lockx==1)
			SetAxis/W=#histograph bottom, x_right, x_left
		else
			SetAxis/W=#histograph/A bottom
		endif
	endif
	
endif
end

function lockXaxisCB(ctrlname, checked)
string ctrlname
variable checked
NVAR g_lockx=g_lockx
NVAR g_flipx=g_flipx
variable x_left=0,x_right=0	

getAxis/W=#histograph/Q bottom
x_left=v_min
x_right=v_max
strswitch(ctrlname)
case "CB_lockXaxis":
	g_lockX = 1
	setAxis/W=#histograph bottom, x_left, x_right
break
case "CB_autoXaxis":
	g_lockX = 0
	if(g_flipx==0)
		setAxis/W=#histograph/A bottom
	else
		setAxis/W=#histograph/A/R bottom
	endif
break
endswitch
checkbox CB_lockXaxis, value= g_lockx==1
checkbox CB_autoXaxis, value= g_lockx==0
end

function lockyaxisCB(ctrlname, checked)
string ctrlname
variable checked

NVAR g_flipx=g_flipx
NVAR g_locky=g_locky

variable x_left=0,x_right=0	

getAxis/W=#histograph/Q left
x_left=v_min
x_right=v_max
strswitch(ctrlname)
case "CB_lockYaxis":
	g_locky = 1
	SetAxis/W=#histograph left, x_left, x_right
break
case "CB_autoYaxis":
	g_locky = 0
	SetAxis/W=#histograph/A left
break
endswitch
checkbox CB_lockyaxis, value= g_locky==1
checkbox CB_autoyaxis, value= g_locky==0
end
end
back to top