Abstract
Electrophysiology is an exceptionally useful tool for neuroscience research due to the intrinsic electrical excitability of neurons and the significant array of ion channels present in both neurons and glia. Diverse electrophysiological techniques may be applied to neurobiology ranging from measurements of cell populations in broad brain regions to measurements of single channels in patches of plasma membrane. One of the strengths of electrophysiology as a tool is the ability to measure the properties of known ion channels in heterologous systems then dissect the diverse pharmacology and biophysics of neuronal responses to finally better understand which component channels and their features determine the biologically critical outputs of neurons and circuits.
Patch clamp electrophysiology allows recording of neuronal receptors at both the synaptic and extrasynaptic levels. The specific techniques described here permit the study of both populations independently by measuring miniature excitatory synaptic currents and currents derived from somatic receptors. The resolution and accuracy of the techniques described in this chapter are high (in the subpicoampere and submillisecond ranges). Further, these methodologies provide valuable information about the behavior of the receptors in their native environment where they coexist with auxiliary, modulatory, and anchoring proteins.
In this chapter, we first describe the methodology for preparing hippocampal neuronal cultures. Second, we describe the process of recording and analyzing miniature postsynaptic currents. Finally, we describe in detail the technique of fast agonist application onto outside-out patches obtained from the soma of neurons. We discuss common problems found with these approaches and present tips to assist researchers new to the field so they may rapidly master the techniques.
Access this chapter
Tax calculation will be finalised at checkout
Purchases are for personal use only
References
Traynelis SF, Wollmuth LP, McBain CJ, Menniti FS, Vance KM, Ogden KK, Hansen KB, Yuan H, Myers SJ, Dingledine R (2010) Glutamate receptor ion channels: structure, regulation, and function. Pharmacol Rev 62:405–496
Patten D, Foxon GR, Martin KF, Halliwell RF (2001) An electrophysiological study of the effects of propofol on native neuronal ligand-gated ion channels. Clin Exp Pharmacol Physiol 28:451–458
Molleman A (2003) Patch clamping—an introductory guide to patch clamp electrophysiology. Wiley, England
Hartveit E, Veruki ML (2007) Studying properties of neurotransmitter receptors by nonstationary noise analysis of spontaneous postsynaptic currents and agonist-evoked responses in outside-out patches. Nat Protoc 2:434–448
Acknowledgments
We wish to thank Saad Hannan for initial assistance with hippocampal cultures and David DiGregorio whose noise analysis macro we have modified. This work is supported by the Spanish Ministry of Science and Technology cofunded with European Union funds FEDER (Grant BFU-2011-24725) and the European Commission (FP7-PEOPLE-2011-CIG; Grant 293498). David Soto is supported by the “Ramón y Cajal” Programme (RyC-2010-05970). Ian Coombs is supported by Wellcome Trust (086185/Z/08/Z) and MRC (MR/J002976/1) Programme Grants (awarded to Stuart Cull-Candy and Mark Farrant).
Author information
Authors and Affiliations
Corresponding authors
Editor information
Editors and Affiliations
Appendices
Appendix 1: Igor Macro for Peak-Scaled Nonstationary Fluctuation Analysis
#pragma rtGlobals=1 // Use modern global access method. Macro PeakscaledNSNA() execute "PSNSNA()" end Function PSNSNA() //start by initializing strings (the names of important bits) and waves (the contents) string NSNAAvg,Identifier,BackgroundVarName string /g Variance,Average,BinnedVariance,BinnedAverage,STDEV, Binnedgraph, CurrentAvg,FittedParabola string /g layoutName="DisplayFormat" variable bslnstart=0 // begin time to calculate back ground variance variable bslnend=4 variable smoothing_in=0 variable numbins_in=30 variable bin=1 //0 if no, 1 if yes variable /g smoothing=0 variable /g BackgroundVar //calculated background variance variable /g xLim variable /g yLim variable /g ScalePt variable /g ScaleMag variable /g ScaleFact variable /g numbins=0 variable /g binstart=0 //pA variable /g binend=0 variable DrivingForce=--55 variable /g Conduct=0 variable /g Popen //Make a prompt window for user input of important values Prompt bslnstart, "Baseline start point (ms)" Prompt bslnend, "Baseline end point (ms)" Prompt NSNAAvg,"Average Wave",popup,WaveList("avg_*",";","") Prompt smoothing_in, "smooth factor (binomial)" Prompt Identifier,"enter file suffix for identification" Prompt numbins_in, "number of bins" Prompt DrivingForce, "enter voltage (mV)" DoPrompt "enter wave",NSNAAvg,bslnstart,bslnend,smoothing_in,Identifier,numbins_in,DrivingForce if(V_flag==1) //If there is no selected wave then it cancels return 0 //cancel do prompt endif smoothing=smoothing_in //rename input values for use numbins=numbins_in Duplicate /o $NSNAAvg NonStatAvg Duplicate /o NonStatAvg NonStatVar Duplicate /o NonStatAvg ScaleAvg Average="Avg"+Identifier //This is why you need to enter suffix, to give fresh names to these values Variance="Var"+Identifier BinnedAverage="Avg_Bin_"+Identifier BinnedVariance="Var_Bin_"+Identifier CurrentAvg="Current_"+Identifier BackgroundVarName="BackVar"+Identifier FittedParabola="FittedNoise"+Identifier STDEV="Var_SD"+Identifier variable chncnt,wvcnt,numSweeps ///initialize more variables to name each sweep string wvlist,wvName,wvName2,NonStatAvgName wave NonStatVar string tempwave wave chanselect wave waveselect nvar smoothing NonStatVar=0 numSweeps=0 wavestats /q/R=(xcsr(A),xcsr(B)) NonStatAvg ////Gets stats of the average current wave in analysis window xLim=V_min+(0.05*V_min) ////sets a limit of 5% under the minimum ScalePt=xcsr(A) ScaleMag=V_min for (chncnt = 0; chncnt < numpnts(ChanSelect); chncnt += 1) // loops through each time point in the input waves, normally in ChanA (ChanSelect) if (ChanSelect[chncnt] != 1) ///If only one sweep, end the macro as noise analysis cannot be performed. continue endif wvlist = GetChanWaveList(chncnt) ///this is a NeuroMatic function that returns the list of selected waves for a particular channel for (wvcnt = 0; wvcnt < ItemsInList(wvList); wvcnt += 1) ///Loops through each sweep (for the timepoint in question from chncnt) wvName = StringFromList(wvcnt, wvList) ///gets the current wave wvName2 = StringFromList(wvcnt+1, wvList) ///gets the next wave for pairwise comparison if (exists(wvName) == 0) ///keep going until wvName is 0 i.e. it has gone through every wave continue endif duplicate /o $wvName, Sweep ///Get values for each pair of waves ScaleFact = Sweep(ScalePt)/ScaleMag ///These two lines scale the average peak to the correspnding datapoint in the sweep ScaleAvg = NonStatAvg*ScaleFact if (smoothing>1) ///Smooth out the records smooth smoothing, Sweep endif NonStatVar+=(ScaleAvg-Sweep)^2 ///Square the difference to get the variance, add variances numSweeps+=1 endfor NonStatVar/=(numSweeps-1) ///final calculation of variance by dividing by total number,--1 endfor ////calculate and print background variance wavestats /q /R=(bslnstart,bslnend) NonStatVar ////NonStatVar is the wave with the variance at each timepoint, this is just in the baseline window BackgroundVar=V_avg //This gives the average variance in the background range print "background variance (pA^2) is:", BackgroundVar wavestats /q/R=(xcsr(A),xcsr(B)) NonStatAvg ////Gets stats of the average current wave in analysis window xLim=V_min+(0.05*V_min) ////sets a limit of 5% under the minimum wavestats /q/R=(xcsr(A),xcsr(B)) NonStatVar ////Gets stats of average Variance wave yLim=V_max+(0.05*V_max) ////sets a limit of 5% over the maximum duplicate /o /R=(xcsr(A),xcsr(B)) NonStatVar $Variance ////Duplicates section of variance between cursors duplicate /o /R=(xcsr(A),xcsr(B)) $NSNAAvg $Average ////Renames section of current between cursors duplicate /o /R=(xcsr(A),xcsr(B)) $NSNAAvg BckVr ////Renames section as other type of string/wave, never got that distinction if (bin==1) duplicate /o $Average AvgForBin ////more renaming to put things in the right form duplicate /o $Variance VarForBin make /o/N=(numbins) NonStatAvg_Bin ////Gets new waves to contain data from binned records make /o/N=(numbins) NonStatVar_Bin make /o/N=(numbins) NonStatVarSD wave VarForBin, AvgForBin,NonStatAvg_Bin,NonStatVar_Bin,NonStatVarSD variable incwave variable incAvg //increment through binning nvar numbins,binstart,binend variable /g binwidth=0 variable count_if=0 variable count_if_sd=0 variable /g waveEndForSD=0 NonStatAvg_Bin=0 /////initializing loops NonStatVar_Bin=0 NonStatVarSD=0 incavg=0 wavestats /Q AvgForBin waveEndForSD=V_npnts-2 /////The number of comparisons is less because the end points have only one neighbour Binwidth=(V_min-V_max)/numbins /////Binwidth is in current and is the full range sliced up print "binwidth is", binwidth variable countbins=0 for (incAvg=1;incAvg<=numbins;incAvg+=1) /////Binning routine, loops for each bin binstart=V_min-(incAvg*Binwidth) /////calculates upper and lower limits of the bin binend=binstart+binwidth count_if=0 /////reinnitializes counts count_if_sd=0 for (incwave=0;incwave<(V_npnts-1);incwave+=1) /////Runs through each datapoint in cursor range if((AvgForBin[incwave]<binstart) && (AvgForBin[incwave]>=binend)) /////If in bin range then include in bin NonStatAvg_Bin[incavg-1]+=AvgForBin[incwave] /////Add current and variance to binpoint NonStatVar_Bin[incavg-1]+=VarForBin[incwave] if(incwave<waveEndForSD) ///// This calculates errors for error bars on each variance point NonStatVarSD[incavg-1]+=(VarForBin[incwave+1]-VarForBin[incwave])^2 count_if_sd+=1 endif count_if+=1 endif endfor NonStatAvg_Bin[incavg-1]/=count_if /////Total value divided by number of contributors NonStatVar_Bin[incavg-1]/=count_if NonStatVarSD[incavg-1]/=2*(count_if_sd-1) /////Divide error bars by number of contributors*2 NonStatVarSD[incavg-1]=sqrt(NonStatVarSD[incavg-1]) /////Take sqrt of it. to give SD endfor print "number of executed bins",countbins duplicate /o NonStatAvg_Bin $BinnedAverage //////Back again, duplicate binned stuff duplicate /o NonStatVar_Bin $BinnedVariance duplicate /o NonStatVar_Bin $BinnedVariance duplicate /o NonStatAvg_Bin $FittedParabola duplicate /o NonStatVarSD $STDEV //for standard error bars endif BckVr=BackgroundVar //////Duplicting background var duplicate /o BckVr $BackgroundVarName //////More renaming Binnedgraph="MeanVarBin"+Identifier if(wintype(Binnedgraph)==0) display /k=1 $BinnedVariance vs $BinnedAverage //make graphs for binned data DoWindow /C $Binnedgraph ModifyGraph mode=4,marker=19,msize=4 ModifyGraph rgb=(0,0,0) AppendToGraph $BackgroundVarName vs $Average //////Add background variance ModifyGraph mode=0 ShowInfo ErrorBars $BinnedVariance Y,wave=($STDEV,$STDEV) //////Stick error bars on SetAxis/A SetAxis bottom 2, xLim ModifyGraph mode( $BinnedVariance)=4 endif Make/D/N=3/O W_coef //////Do a fit W_coef[0] = {BackgroundVar,--0.5,100} //////Make first guesses for variance fit FuncFit/H="100" SigworthNSNA W_coef $BinnedVariance /X=$BinnedAverage /D=$FittedParabola /W=$STDEV /I=1 /////Hold backvar,;fit N,i Conduct = w_coef[1]/DrivingForce*1000 Popen = V_min/(w_coef[1]*w_coef[2]) TextBox /w=$Binnedgraph/N=test/C/F=0/E=1/A=MT "G(pS)="+num2str(Conduct)+"\r"+"N="+num2str(w_coef[2])+ "\r"+"PoPeak ="+num2str(Popen) //////Display it AppendToGraph $FittedParabola vs $BinnedAverage ModifyGraph lstyle($FittedParabola)=3,rgb($FittedParabola)=(0,0,0),mode($BinnedVariance)=3,rgb($BackgroundVarName)=(34816,34816,34816) Label left "Variance (pA\crS2\crM)";DelayUpdate Label bottom "Current (pA)" display NonStatAvg DoWindow /C $CurrentAvg ModifyGraph rgb=(0,0,0) ModifyGraph tick=3,noLabel=2,axThick=0 NewLayout /N=Layoutname AppendLayoutObject graph $Binnedgraph AppendLayoutObject graph $CurrentAvg ModifyLayout frame=0,trans=1;DelayUpdate ModifyLayout left($Binnedgraph)=100,top($Binnedgraph)=370,width($Binnedgraph)=300,height($Binnedgraph)=350;DelayUpdate ModifyLayout left($CurrentAvg)=60,top($CurrentAvg)=100,width($CurrentAvg)=400,height($CurrentAvg)=300 print "Conductance = ",Conduct print "PoPeak = ",Popen end ////////////////////////////////////////////////////////////////////////////
Appendix 2: SigworthNSNA Function
#pragma rtGlobals=1 // Use modern global access method. Function SigworthNSNA(w,x) : FitFunc //sigworth non-stationary noise analysis fit with background variance Wave w Variable x //CurveFitDialog/ These comments were created by the curve fitting dialog. Altering them will //CurveFitDialog/ make the function less convenient to work with in the curve fitting dialog. //CurveFitDialog/ Equation: //CurveFitDialog/ f(x) = var_back + i*I -((I*I)/N) //CurveFitDialog/ End of Equation //CurveFitDialog/ Independent Variables 1 //CurveFitDialog/ x //CurveFitDialog/ Coefficients 3 //CurveFitDialog/ w[0] = var_back //CurveFitDialog/ w[1] = i //CurveFitDialog/ w[2] = N return w[0] + w[1]*x-((x*x)/w[2]) End
Appendix 3: Igor Macro for Nonstationary Fluctuation Analysis
#pragma rtGlobals=1 // Use modern global access method. Macro PairwiseNSNA() execute "NSNA()" end Function NSNA() //start by initializing strings (the names of important bits) and waves (the contents) string NSNAAvg,Identifier,BackgroundVarName string /g Variance,Average,BinnedVariance,BinnedAverage,STDEV, Binnedgraph, CurrentAvg,FittedParabola string /g layoutName="DisplayFormat" variable bslnstart=0 // begin time to calculate back ground variance variable bslnend=20 variable smoothing_in=0 variable numbins_in=10 variable bin=1 //0 if no, 1 if yes variable /g smoothing=0 variable /g BackgroundVar //calculated background variance variable /g xLim variable /g yLim variable /g numbins=0 variable /g binstart=0 //pA variable /g binend=0 variable DrivingForce=--55 variable /g Conduct=0 variable /g Popen //Make a prompt window for user input of important values Prompt bslnstart, "Baseline start point (ms)" Prompt bslnend, "Baseline end point (ms)" Prompt NSNAAvg,"Average Wave",popup,WaveList("avg_*",";","") Prompt smoothing_in, "smooth factor (binomial)" Prompt Identifier,"enter file suffix for identification" Prompt numbins_in, "number of bins" Prompt DrivingForce, "enter voltage (mV)" DoPrompt "enter wave",NSNAAvg,bslnstart,bslnend,smoothing_in,Identifier,numbins_in,DrivingForce if(V_flag==1) //If there is no selected wave then it cancels return 0 //cancel do prompt endif smoothing=smoothing_in //rename input values for use numbins=numbins_in Duplicate /o $NSNAAvg NonStatAvg Duplicate /o NonStatAvg NonStatVar Average="Avg"+Identifier //This is why you need to enter suffix, to give fresh names to these values Variance="Var"+Identifier BinnedAverage="Avg_Bin_"+Identifier BinnedVariance="Var_Bin_"+Identifier CurrentAvg="Current_"+Identifier BackgroundVarName="BackVar"+Identifier FittedParabola="FittedNoise"+Identifier STDEV="Var_SD"+Identifier variable chncnt,wvcnt,numSweeps ///initialize more variables to name each sweep string wvlist,wvName,wvName2,NonStatAvgName wave NonStatVar string tempwave wave chanselect wave waveselect nvar smoothing NonStatVar=0 numSweeps=0 for (chncnt = 0; chncnt < numpnts(ChanSelect); chncnt += 1) // loops through each time point in the input waves, normally in ChanA (ChanSelect) if (ChanSelect[chncnt] != 1) ///If only one sweep, end the macro as noise analysis cannot be performed. continue endif wvlist = GetChanWaveList(chncnt) ///this is a NeuroMatic function that returns the list of selected waves for a particular channel for (wvcnt = 0; wvcnt < ItemsInList(wvList)-1; wvcnt += 1) ///Loops through each sweep (for the timepoint in question from chncnt) wvName = StringFromList(wvcnt, wvList) ///gets the current wave wvName2 = StringFromList(wvcnt+1, wvList) ///gets the next wave for pairwise comparison if (exists(wvName) == 0) ///keep going until wvName is 0 i.e. it has gone through every wave continue endif duplicate /o $wvName, Sweep ///Get values for each pair of waves duplicate /o $wvName2, Sweep2 if (smoothing>1) ///Smooth out the records smooth smoothing, Sweep smooth smoothing, Sweep2 endif NonStatVar+=(Sweep2-Sweep)^2 ///Square the difference to get the variance, add variances numSweeps+=1 endfor NonStatVar/=2*(numSweeps) ///final calculation of variance by dividing by total number, and 2 since each wave was used twice endfor ////calculate and print background variance wavestats /q /R=(bslnstart,bslnend) NonStatVar ////NonStatVar is the wave with the variance at each timepoint, this is just in the baseline window BackgroundVar=V_avg //This gives the average variance in the background range print "background variance (pA^2) is:", BackgroundVar wavestats /q/R=(xcsr(A),xcsr(B)) NonStatAvg ////Gets stats of the average current wave in analysis window xLim=V_min+(0.05*V_min) ////sets a limit of 5% under the minimum wavestats /q/R=(xcsr(A),xcsr(B)) NonStatVar ////Gets stats of average Variance wave yLim=V_max+(0.05*V_max) ////sets a limit of 5% over the maximum duplicate /o /R=(xcsr(A),xcsr(B)) NonStatVar $Variance ////Duplicates section of variance between cursors duplicate /o /R=(xcsr(A),xcsr(B)) $NSNAAvg $Average ////Renames section of current between cursors duplicate /o /R=(xcsr(A),xcsr(B)) $NSNAAvg BckVr ////Renames section as other type of string/wave, never got that distinction if (bin==1) duplicate /o $Average AvgForBin ////more renaming to put things in the right form duplicate /o $Variance VarForBin make /o/N=(numbins) NonStatAvg_Bin ////Gets new waves to contain data from binned records make /o/N=(numbins) NonStatVar_Bin make /o/N=(numbins) NonStatVarSD wave VarForBin, AvgForBin,NonStatAvg_Bin,NonStatVar_Bin,NonStatVarSD variable /g binsize //calculated bin cutoff /////seems to not be used at all variable incwave variable incAvg //increment through binning nvar numbins,binstart,binend variable binsize_prev variable /g binwidth=0 variable count_if=0 variable count_if_sd=0 variable /g waveEndForSD=0 NonStatAvg_Bin=0 /////initializing loops NonStatVar_Bin=0 NonStatVarSD=0 incavg=0 wavestats /Q AvgForBin waveEndForSD=V_npnts-2 /////The number of comparisons is less because the end points have only one neighbour Binwidth=(V_min-V_max)/numbins /////Binwidth is in current and is the full range sliced up print "binwidth is", binwidth variable countbins=0 for (incAvg=1;incAvg<=numbins;incAvg+=1) /////Binning routine, loops for each bin binstart=V_min-(incAvg*Binwidth) /////calculates upper and lower limits of the bin binend=binstart+binwidth count_if=0 /////reinnitializes counts count_if_sd=0 for (incwave=0;incwave<(V_npnts-1);incwave+=1) /////Runs through each datapoint in cursor range if((AvgForBin[incwave]<binstart) && (AvgForBin[incwave]>=binend)) /////If in bin range then include in bin NonStatAvg_Bin[incavg-1]+=AvgForBin[incwave] /////Add current and variance to binpoint NonStatVar_Bin[incavg-1]+=VarForBin[incwave] if(incwave<waveEndForSD) ///// This calculates errors for error bars on each variance point NonStatVarSD[incavg-1]+=(VarForBin[incwave+1]-VarForBin[incwave])^2 count_if_sd+=1 endif count_if+=1 endif endfor NonStatAvg_Bin[incavg-1]/=count_if /////Total value divided by number of contributors NonStatVar_Bin[incavg-1]/=count_if NonStatVarSD[incavg-1]/=2*(count_if_sd-1) /////Divide error bars by number of contributors*2 NonStatVarSD[incavg-1]=sqrt(NonStatVarSD[incavg-1]) /////Take sqrt of it. to give SD endfor print "number of executed bins",countbins duplicate /o NonStatAvg_Bin $BinnedAverage //////Back again, duplicate binned stuff duplicate /o NonStatVar_Bin $BinnedVariance duplicate /o NonStatVar_Bin $BinnedVariance duplicate /o NonStatAvg_Bin $FittedParabola duplicate /o NonStatVarSD $STDEV //for standard error bars endif BckVr=BackgroundVar //////Duplicting background var duplicate /o BckVr $BackgroundVarName //////More renaming Binnedgraph="MeanVarBin"+Identifier if(wintype(Binnedgraph)==0) display /k=1 $BinnedVariance vs $BinnedAverage //make graphs for binned data DoWindow /C $Binnedgraph ModifyGraph mode=4,marker=19,msize=4 ModifyGraph rgb=(0,0,0) AppendToGraph $BackgroundVarName vs $Average //////Add background variance ModifyGraph mode=0 ShowInfo ErrorBars $BinnedVariance Y,wave=($STDEV,$STDEV) //////Stick error bars on SetAxis/A SetAxis bottom 2, xLim ModifyGraph mode( $BinnedVariance)=4 endif Make/D/N=3/O W_coef //////Do a fit W_coef[0] = {BackgroundVar,--0.5,100} //////Make first guesses for variance fit FuncFit/H="100" SigworthNSNA W_coef $BinnedVariance /X=$BinnedAverage /D=$FittedParabola /W=$STDEV /I=1 /////Hold backvar,;fit N,i Conduct = w_coef[1]/DrivingForce*1000 Popen = V_min/(w_coef[1]*w_coef[2]) TextBox /w=$Binnedgraph/N=test/C/F=0/E=1/A=MT "G(pS)="+num2str(Conduct)+"\r"+"N="+num2str(w_coef[2])+ "\r"+"PoPeak ="+num2str(Popen) //////Display it AppendToGraph $FittedParabola vs $BinnedAverage ModifyGraph lstyle($FittedParabola)=3,rgb($FittedParabola)=(0,0,0),mode($BinnedVariance)=3,rgb($BackgroundVarName)=(34816,34816,34816) Label left "Variance (pA\crS2\crM)";DelayUpdate Label bottom "Current (pA)" display NonStatAvg DoWindow /C $CurrentAvg ModifyGraph rgb=(0,0,0) ModifyGraph tick=3,noLabel=2,axThick=0 NewLayout /N=Layoutname AppendLayoutObject graph $Binnedgraph AppendLayoutObject graph $CurrentAvg ModifyLayout frame=0,trans=1;DelayUpdate ModifyLayout left($Binnedgraph)=100,top($Binnedgraph)=370,width($Binnedgraph)=300,height($Binnedgraph)=350;DelayUpdate ModifyLayout left($CurrentAvg)=60,top($CurrentAvg)=100,width($CurrentAvg)=400,height($CurrentAvg)=300 print "Conductance = ",Conduct print "PoPeak = ",Popen end ////////////////////////////////////////////////////////////////////////////
Rights and permissions
Copyright information
© 2021 The Author(s), under exclusive license to Springer Science+Business Media, LLC, part of Springer Nature
About this protocol
Cite this protocol
Coombs, I.D., Soto, D. (2021). Using Electrophysiology to Study Synaptic and Extrasynaptic Ionotropic Receptors in Hippocampal Neurons. In: Lujan, R., Ciruela, F. (eds) Receptor and Ion Channel Detection in the Brain. Neuromethods, vol 169. Humana, New York, NY. https://doi.org/10.1007/978-1-0716-1522-5_25
Download citation
DOI: https://doi.org/10.1007/978-1-0716-1522-5_25
Published:
Publisher Name: Humana, New York, NY
Print ISBN: 978-1-0716-1521-8
Online ISBN: 978-1-0716-1522-5
eBook Packages: Springer Protocols