Function cv2df that accurately reads CV files into dataframe together with CV attributes.
Function works as far as I have tested.master
							parent
							
								
									996a79787c
								
							
						
					
					
						commit
						f87e3b2a42
					
				| @ -0,0 +1,90 @@ | ||||
| # CHI.R | ||||
| # Functions to read and manipulate data from the CHI760 potentiostat/galvanostat | ||||
| # Taha Ahmed, Jan 2011 | ||||
| 
 | ||||
| # CONTENTS | ||||
| # >>>> cv2df  | ||||
| # >>>>  | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ################################################## | ||||
| #################### cv2df ####################### | ||||
| ################################################## | ||||
| cv2df <- function(cvfilename) { | ||||
|    # Function description | ||||
|    # CH Instruments potentiostat records all data using standard SI units, | ||||
|    # so all potential values are in volts, currents are in amperes, | ||||
|    # charges in Coulombs, time in seconds, etc. | ||||
|    # | ||||
|    cvfile <- file(cvfilename, "r") | ||||
|    chifile <- readLines(cvfile, n = -1) #read all lines of input file | ||||
|    close(cvfile) | ||||
|    # | ||||
|    rgxp.number <- "^\\-?\\d\\.\\d+," | ||||
|    # regexp that matches a decimal number at the beginning of the line. | ||||
|    # Matches numbers with or without a negative sign (hyphen),  | ||||
|    # followed by one digit before the decimal, a decimal point, | ||||
|    # and an arbitrary number of digits after the decimal point, | ||||
|    # immediately followed by a comma. | ||||
|    # Note that backslashes are escaped. | ||||
|    # | ||||
|    numrow.idx <- regexpr(rgxp.number, chifile) | ||||
|    # Save the match length attribute to another variable, | ||||
|    numrow.len <- attr(numrow.idx, "match.length") | ||||
|    # then scrap the attribute of the original variable. | ||||
|    attr(numrow.idx, "match.length") <- NULL | ||||
|    # | ||||
|    i <- seq(1, length(numrow.idx) - 1, 1) | ||||
|    j <- seq(2, length(numrow.idx), 1) | ||||
|    # Start indices of data ranges | ||||
|    starts <- which(numrow.idx[i] != 1 & numrow.idx[j] == 1) + 1 | ||||
|    # End indices, except for the last | ||||
|    ends <- which(numrow.idx[i] == 1 & numrow.idx[j] != 1) | ||||
|    # Fix the last index of end indices | ||||
|    ends <- c(ends, length(numrow.idx)) | ||||
|    # | ||||
|    ff <- data.frame(NULL) | ||||
|    for (s in 1:length(starts)) { | ||||
|       zz <- textConnection(chifile[starts[s]:ends[s]], "r") | ||||
|       ff <- rbind(ff, | ||||
|                data.frame(segment = factor(s), | ||||
|                matrix(scan(zz, what = numeric(), sep = ","), | ||||
|                   ncol = 3, byrow = T))) | ||||
|       close(zz) | ||||
|    } | ||||
|    names(ff) <- c("segment", "potential", "current", "charge") | ||||
|    # | ||||
|    ### Collect attributes of this experiment | ||||
|    # These attributes are specific for each kind of experiment, | ||||
|    # be careful when adapting to other electrochemical data | ||||
|    rgxp.attr <- c("^Init\\sE\\s\\(V\\)", | ||||
|                   "^High\\sE\\s\\(V\\)", | ||||
|                   "^Low\\sE\\s\\(V\\)", | ||||
|                   "^Init\\sP/N", | ||||
|                   "^Scan\\sRate\\s\\(V/s\\)", | ||||
|                   "^Segment\\s=", | ||||
|                   "^Sample\\sInterval\\s\\(V\\)", | ||||
|                   "^Quiet\\sTime\\s\\(sec\\)", | ||||
|                   "^Sensitivity\\s\\(A/V\\)") | ||||
|    names.attr <- c("InitE", | ||||
|                    "HighE", | ||||
|                    "LowE", | ||||
|                    "InitPN", | ||||
|                    "ScanRate", | ||||
|                    "Segments", | ||||
|                    "SamplingInterval", | ||||
|                    "QuietTime", | ||||
|                    "Sensitivity") | ||||
|    for (n in 1:length(rgxp.attr)) { | ||||
|       attrow.idx <- regexpr(rgxp.attr[n], chifile) | ||||
|       attrow.len <- attr(attrow.idx, "match.length") | ||||
|       attr(attrow.idx, "match.length") <- NULL | ||||
|       attr(ff, names.attr[n]) <- strsplit(chifile[which(attrow.idx == 1)], | ||||
|          "\\s=\\s")[[1]][2] | ||||
|    } | ||||
|    # | ||||
|    return(ff) | ||||
| } | ||||
| 
 | ||||
					Loading…
					
					
				
		Reference in New Issue