//chemesis //add_output.g // Create files to save Vm for specified compartments, Gk from specified channels and compartment, and/or calcium objects //Need to add some string parsing stuff and loops. function setfilename(fname,prefix,appendval,fheader) str fname,prefix,fheader int appendval if ({exists /output/{fname}}) str filenam = {prefix}@"_"@{fname}@".txt" setfield /output/{fname} flush 1 leave_open {appendval} append {appendval} \ float_format %0.6g filename {filenam} call /output/{fname} OUT_OPEN call /output/{fname} OUT_WRITE {fheader} else echo "Could not open file " {fname} end reset end function fileFLUSH(fname) str fname if ({exists /output/{fname}}) call /output/{fname} FLUSH end end function add_outputVm (compString,ascname,cell) str compString, ascname,cell create asc_file /output/{ascname} setfield /output/{ascname} flush 1 leave_open 1 append 1 \ float_format %0.6g useclock /output/{ascname} 1 str compt int position=0 str header="/Time " while ({position} > -1) position = {findchar {compString} ,} if ({position}==-1) compt={compString} else compt={substring {compString} 0 {position-1}} compString={substring {compString} {position+1}} end header=header@" "@compt addmsg {cell}/{compt} /output/{ascname} SAVE Vm end return {header} end function add_outputGk (compString,ChanString,ascname,cell) str compString,ChanString, ascname,cell create asc_file /output/{ascname} setfield /output/{ascname} flush 1 leave_open 1 append 1 \ float_format %0.6g useclock /output/{ascname} 1 str compt, chan, chanStrTmp int chanpos,position=0 str header="/Time " str NMDAcomp if ({GABAYesNo}) str gabacompt = "/cell/soma/" header = {header}@" "@{gabacompt}@"_GABA_Gk" addmsg {gabacompt}GABA /output/{ascname} SAVE Gk end //string parsing for multiple comps while ({position} > -1) position = {findchar {compString} ,} if ({position}==-1) compt={compString} else compt={substring {compString} 0 {position-1}} compString={substring {compString} {position+1}} end if ({spinesYesNo}) NMDAcomp={compt}@"/spine_1/"@{spcomp1} else NMDAcomp={compt} end if ({exists {cell}/{NMDAcomp}/{subunit}}) header={header}@" "@{NMDAcomp}@"_"@{subunit}@"GHK "@{NMDAcomp}@"_"@{subunit}@"block" addmsg {cell}/{NMDAcomp}/{subunit}/GHK /output/{ascname} SAVE Gk addmsg {cell}/{NMDAcomp}/{subunit}/block /output/{ascname} SAVE Gk end //string parsing for multiple chans chanpos=0 chanStrTmp=ChanString while ({chanpos} > -1) chanpos = {findchar {chanStrTmp} ,} if ({chanpos}==-1) chan={chanStrTmp} else chan={substring {chanStrTmp} 0 {chanpos-1}} chanStrTmp={substring {chanStrTmp} {chanpos+1}} end if ({exists {cell}/{compt}/{chan}GHK}) addmsg {cell}/{compt}/{chan}GHK /output/{ascname} SAVE Gk header={header}@" "@{compt}@"_"@{chan}@"GHK" elif ({exists {cell}/{compt}/{chan}}) addmsg {cell}/{compt}/{chan} /output/{ascname} SAVE Gk header={header}@" "@{compt}@"_"@{chan} else echo "add_output: channel" {chan} "doesn't exist in compartment" {compt} end end end return {header} end function add_outputIk (compString,ChanString,ascname,cell) str compString,ChanString, ascname,cell create asc_file /output/{ascname} setfield /output/{ascname} flush 1 leave_open 1 append 1 \ float_format %0.6g useclock /output/{ascname} 1 str compt, chan, chanStrTmp int chanpos,position=0 str header="/Time " str NMDAcomp //string parsing for multiple comps while ({position} > -1) position = {findchar {compString} ,} if ({position}==-1) compt={compString} else compt={substring {compString} 0 {position-1}} compString={substring {compString} {position+1}} end if ({spinesYesNo}) NMDAcomp={compt}@"/spine_1/"@{spcomp1} else NMDAcomp={compt} end if ({exists {cell}/{NMDAcomp}/{subunit}}) header={header}@" "@{NMDAcomp}@"_"@{subunit}@"GHK "@{NMDAcomp}@"_"@{subunit}@"block" addmsg {cell}/{NMDAcomp}/{subunit}/GHK /output/{ascname} SAVE Ik addmsg {cell}/{NMDAcomp}/{subunit}/block /output/{ascname} SAVE Ik end //string parsing for multiple chans chanpos=0 chanStrTmp=ChanString while ({chanpos} > -1) chanpos = {findchar {chanStrTmp} ,} if ({chanpos}==-1) chan={chanStrTmp} else chan={substring {chanStrTmp} 0 {chanpos-1}} chanStrTmp={substring {chanStrTmp} {chanpos+1}} end if ({exists {cell}/{compt}/{chan}GHK}) addmsg {cell}/{compt}/{chan}GHK /output/{ascname} SAVE Ik header={header}@" "@{compt}@"_"@{chan}@"GHK" elif ({exists {cell}/{compt}/{chan}}) addmsg {cell}/{compt}/{chan} /output/{ascname} SAVE Ik header={header}@" "@{compt}@"_"@{chan} else echo "add_output: channel" {chan} "doesn't exist in compartment" {compt} end end end return {header} end function add_outputCal (compString,CaBufStr,ascname,cell) str compString, CaBufStr, ascname,cell create asc_file /output/{ascname} setfield /output/{ascname} flush 1 leave_open 1 append 1 \ float_format %0.6g useclock /output/{ascname} 1 str compt, CaBuf,bufStrTmp int bufpos,position=0 str header="/Time " // string parsing for multiple comps while ({position} > -1) position = {findchar {compString} ,} if ({position}==-1) compt={compString} else compt={substring {compString} 0 {position-1}} compString={substring {compString} {position+1}} end if ({calciumtype}==0) addmsg {cell}/{compt}/volavg /output/{ascname} SAVE meanValue header=header@" "@{cell}@"/"@{compt}@"/CaAvg " if ({calciumdye}>1) if ({exists {cell}/{compt}/{bnamefluor}Vavg}) addmsg {cell}/{compt}/{bnamefluor}Vavg /output/{ascname} SAVE meanValue header=header@{cell}@"/"@{compt}@"/"@{bnamefluor}@"_Vavg " else echo "No " {cell}/{compt}/{bnamefluor}Vavg end elif ({calciumdye}==1) if ({exists {cell}/{compt}/{bnamefluor}}) addmsg {cell}/{compt}/{bnamefluor} /output/{ascname} SAVE ratio header=header@{cell}@"/"@{compt}@"/"@{bnamefluor}@"_ratio " else echo "No " {cell}/{compt}/{bnamefluor} end end addmsg {cell}/{compt}/Ca_difshell_1 /output/{ascname} SAVE C header=header@{cell}@"/"@compt@"/Ca1" end //string parsing for either multiple Ca_pools for single tau or various buffers bufpos=0 bufStrTmp=CaBufStr while ({bufpos} > -1) bufpos = {findchar {bufStrTmp} ,} if ({bufpos}==-1) CaBuf={bufStrTmp} else CaBuf={substring {bufStrTmp} 0 {bufpos-1}} bufStrTmp={substring {bufStrTmp} {bufpos+1}} end if ({spinecalcium}==0) if ({CaBuf} != "X") //may not want to see various buffers addmsg {cell}/{compt}/Ca_difshell_1{CaBuf} /output/{ascname} SAVE Bbound header={header}@" "@{cell}@"/"@{compt}@"/Ca1_"@{CaBuf} else header={header}@" " end elif ({spinecalcium}==1) //single time constant of decay if ({exists {cell}/{compt}/{CaBuf}}) //may not be nmda pool in dendrites addmsg {cell}/{compt}/{CaBuf} /output/{ascname} SAVE Ca header={header}@" "@{cell}@"/"@{compt}@"/"@{CaBuf} end else echo "unrecognized calcium type" end end end return {header} end function write_spine_channel(spinehead,comp_path,ascname,channel) str spinehead,comp_path,ascname,channel if ({exists {comp_path}{spcomp1}/{channel}}) addmsg {comp_path}{spcomp1}/{channel}GHK /output/{ascname} SAVE Gk spinehead={spinehead}@{comp_path}@{spcomp1}@"/"@{channel}@" " end return {spinehead} end function write_ca_buffers(spinehead,where,label,ascname) str spinehead,where,label,ascname int bufpos str bufStrTmp, CaBuf bufpos = 0 bufStrTmp = {CaBufs} while ({bufpos} > -1) bufpos = {findchar {bufStrTmp} ,} if ({bufpos} == -1) CaBuf = {bufStrTmp} else CaBuf = {substring {bufStrTmp} 0 {bufpos-1}} bufStrTmp = {substring {bufStrTmp} {bufpos+1}} end if ({spinecalcium}) if ({exists {where}{CaBuf}}) addmsg {where}{CaBuf} /output/{ascname} SAVE Ca echo addmsg {where}{CaBuf} /output/{ascname} SAVE Ca spinehead = {spinehead}@" "@{label}@{CaBuf} end else if ({exists {where}{CaBuf}}) addmsg {where}{CaBuf} /output/{ascname} SAVE Bbound spinehead = {spinehead}@" "@{label}@{CaBuf} end end end return {spinehead@" "} end function write_spine_nmda(comp_path,spinehead,ascname) str comp_path, spinehead, ascname if ({spinesYesNo}) str NMDAcomp = {comp_path}@"head" if ({exists {NMDAcomp}/{subunit}}) spinehead={spinehead}@" "@{NMDAcomp}@"_"@{subunit}@"GHK "@{NMDAcomp}@"_"@{subunit}@"block " addmsg {NMDAcomp}/{subunit}/GHK /output/{ascname} SAVE Gk addmsg {NMDAcomp}/{subunit}/block /output/{ascname} SAVE Gk echo addmsg {NMDAcomp}/{subunit}/GHK /output/{ascname} SAVE Gk echo addmsg {NMDAcomp}/{subunit}/block /output/{ascname} SAVE Gk end end return spinehead end function header_to_file_one_spine(spinehead,head,ascname,prestim) str spinehead,element,head,ascname,prestim str CaBuf,bufStrTmp,spcomp,label,name,comp_path int i,j,slabs, nummsg, bufpos comp_path = {strsub {head} /head/ /} echo head {head} if ({exists {head}}) addmsg {head} /output/{ascname} SAVE Vm spinehead={spinehead}@{head}@"Vm " else echo "No spine " {head} return end if ({exists {head}volavg}) addmsg {head}volavg /output/{ascname} SAVE meanValue spinehead={spinehead}@{head}@"CaAvg " else echo "No volavg on" {head} end if (calciumdye==1) if ({exists {head}{bnamefluor}}) addmsg {head}{bnamefluor} /output/{ascname} SAVE ratio spinehead={spinehead}@{head}@"Fura2_ratio " else echo "No " {head}{bnamefluor} end elif ({calciumdye}>1) if ({exists {head}{bnamefluor}Vavg}) addmsg {head}{bnamefluor}Vavg /output/{ascname} SAVE meanValue spinehead={spinehead}@{head}@{bnamefluor}@"_Vavg " else echo "No " {head}{bnamefluor}Vavg end end if ({plastYesNo}) if ({prestim}) addmsg {head}AMPA /output/{ascname} SAVE synapse[0].weight spinehead={spinehead}@{head}@"weight " end end if ({spinecalcium}==0) for (j=1; j<=2; j=j+1) spcomp={getglobal spcomp{j}} @ "/" if ({strcmp {spcomp} "head/"} == 0) slabs = {headSlabs} label = "head/" name = "head/" else slabs = {neckSlabs} label = "neck/" name = "" end for (i=1; i<=slabs; i=i+1) addmsg {comp_path}/{name}Ca_difshell_{i} /output/{ascname} SAVE C spinehead = {spinehead}@" "@{comp_path}@{label}@"Ca"@{i} //string parsing for various buffers if ({CaBufs}!="X") str where,what where = {comp_path}@{name}@"Ca_difshell_"@{i} what = {comp_path}@"_"@{label}@"_Ca"@{i}@"_" spinehead = {write_ca_buffers {spinehead} {where} {what} {ascname}} else spinehead = {spinehead}@" " end end end //addmsg {cell}/{compt}/fluorescence /output/{ascname} SAVE ratio elif ({spinecalcium}==1) spinehead = {write_ca_buffers {spinehead} {head} {comp_path} {ascname}} end spinehead = {write_spine_channel {spinehead} {comp_path} {ascname} CaL13_channel} spinehead = {write_spine_channel {spinehead} {comp_path} {ascname} CaL12_channel} spinehead = {write_spine_channel {spinehead} {comp_path} {ascname} CaR_channel} spinehead = {write_spine_channel {spinehead} {comp_path} {ascname} CaT_channel} spinehead = {write_spine_nmda {comp_path} {spinehead} {ascname}} return {spinehead} end function add_output_hook_up(ascname,cell,StimComp,res_spines,PreStim) str ascname,cell,StimComp, res_spines, PreStim, bufStrTmp, whichSpine,compt int bufpos=0, position=0 create asc_file /output/{ascname} setfield /output/{ascname} flush 1 leave_open 1 append 1 float_format %0.6g useclock /output/{ascname} 1 str spinehead="/Time " int i,j,k,slabs, nummsg, bufpos str element,head if ({strlen {res_spines}}>0) while ({position} > -1) //loops through selected StimComps position = {findchar {StimComp} ,} if ({position}==-1) compt={StimComp} else compt={substring {StimComp} 0 {position-1}} StimComp={substring {StimComp} {position+1}} end bufStrTmp = {res_spines} bufpos = 0 while ({bufpos} > -1) bufpos = {findchar {bufStrTmp} ,} if ({bufpos} == -1) whichSpine = {bufStrTmp} else whichSpine = {substring {bufStrTmp} 0 {bufpos-1}} bufStrTmp = {substring {bufStrTmp} {bufpos+1}} end head = {cell}@"/"@{compt}@"/spine_"@{whichSpine}@"/head/" spinehead = {header_to_file_one_spine {spinehead} {head} {ascname} {PreStim}} end end end return {spinehead} end function add_outputMultiSpines (ascname,prestim) str ascname, CaBuf,bufStrTmp,spcomp,label,name int prestim,nummsg create asc_file /output/{ascname} setfield /output/{ascname} flush 1 leave_open 1 append 1 float_format %0.6g useclock /output/{ascname} 1 str spinehead="/Time " int i,j,k,slabs, nummsg, bufpos str element,head if ({prestim}>0) nummsg={getmsg {precell}/spikegen -out -count} str comp_path, previous = "" //This loop skips the 1st output/vm message - loop from i=0 if that message is eliminated if ({GABAYesNo}) int begining = 2 else int begining = 1 end for (k=begining;k<nummsg-1;k=k+1) element ={getmsg {precell}/spikegen -out -destination {k}} echo {element} head = {getpath {element} -head} echo {head} if ({strcmp {head} {previous}} != 0) spinehead = {header_to_file_one_spine {spinehead} {head} {ascname}} end previous = {head} end end return {spinehead} end function add_outputOneSpinePerComp(ascname,cell,StimComp) str ascname, cell, StimComp, compt, head int position create asc_file /output/{ascname} setfield /output/{ascname} flush 1 leave_open 1 append 1 float_format %0.6g useclock /output/{ascname} 1 str spinehead="/Time " while ({position} > -1) //loops through selected StimComps position = {findchar {StimComp} ,} if ({position}==-1) compt={StimComp} else compt={substring {StimComp} 0 {position-1}} StimComp={substring {StimComp} {position+1}} end head = {cell}@"/"@{compt}@"/spine_1/head/" if ({exists {head}}) spinehead = {header_to_file_one_spine {spinehead} {head} {ascname}} else echo "No spines on " {head} end end return {spinehead} end function add_outputPulseGen(ascname,pulsegen) str ascname, pulsegen create asc_file /output/{ascname} setfield /output/{ascname} flush 1 leave_open 1 append 1\ float_format %0.6g useclock /output/{ascname} 1 str header="/Time " addmsg {pulsegen} /output/{ascname} SAVE output header = {header}@"inject" return header end function add_outputSpikeHistory(precell,fname,prefix) str precell, fname str filenam = {prefix}@"_"@{fname}@".txt" echo {filenam} create spikehistory SynTimes.history setfield SynTimes.history ident_toggle 1 filename {filenam} initialize 1 leave_open 1 flush 1 addmsg {precell}/spikegen SynTimes.history SPIKESAVE reset end