Mercurial > repos > davidvanzessen > mutation_analysis
comparison baseline/Baseline_Main.r @ 0:8a5a2abbb870 draft default tip
Uploaded
| author | davidvanzessen |
|---|---|
| date | Mon, 29 Aug 2016 05:36:10 -0400 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:8a5a2abbb870 |
|---|---|
| 1 ######################################################################################### | |
| 2 # License Agreement | |
| 3 # | |
| 4 # THIS WORK IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE | |
| 5 # ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER | |
| 6 # APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE | |
| 7 # OR COPYRIGHT LAW IS PROHIBITED. | |
| 8 # | |
| 9 # BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE | |
| 10 # BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED | |
| 11 # TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN | |
| 12 # CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. | |
| 13 # | |
| 14 # BASELIne: Bayesian Estimation of Antigen-Driven Selection in Immunoglobulin Sequences | |
| 15 # Coded by: Mohamed Uduman & Gur Yaari | |
| 16 # Copyright 2012 Kleinstein Lab | |
| 17 # Version: 1.3 (01/23/2014) | |
| 18 ######################################################################################### | |
| 19 | |
| 20 op <- options(); | |
| 21 options(showWarnCalls=FALSE, showErrorCalls=FALSE, warn=-1) | |
| 22 library('seqinr') | |
| 23 if( F & Sys.info()[1]=="Linux"){ | |
| 24 library("multicore") | |
| 25 } | |
| 26 | |
| 27 # Load functions and initialize global variables | |
| 28 source("Baseline_Functions.r") | |
| 29 | |
| 30 # Initialize parameters with user provided arguments | |
| 31 arg <- commandArgs(TRUE) | |
| 32 #arg = c(2,1,5,5,0,1,"1:26:38:55:65:104:116", "test.fasta","","sample") | |
| 33 #arg = c(1,1,5,5,0,1,"1:38:55:65:104:116:200", "test.fasta","","sample") | |
| 34 #arg = c(1,1,5,5,1,1,"1:26:38:55:65:104:116", "/home/mu37/Wu/Wu_Cloned_gapped_sequences_D-masked.fasta","/home/mu37/Wu/","Wu") | |
| 35 testID <- as.numeric(arg[1]) # 1 = Focused, 2 = Local | |
| 36 species <- as.numeric(arg[2]) # 1 = Human. 2 = Mouse | |
| 37 substitutionModel <- as.numeric(arg[3]) # 0 = Uniform substitution, 1 = Smith DS et al. 1996, 5 = FiveS | |
| 38 mutabilityModel <- as.numeric(arg[4]) # 0 = Uniform mutablity, 1 = Tri-nucleotide (Shapiro GS et al. 2002) , 5 = FiveS | |
| 39 clonal <- as.numeric(arg[5]) # 0 = Independent sequences, 1 = Clonally related, 2 = Clonally related & only non-terminal mutations | |
| 40 fixIndels <- as.numeric(arg[6]) # 0 = Do nothing, 1 = Try and fix Indels | |
| 41 region <- as.numeric(strsplit(arg[7],":")[[1]]) # StartPos:LastNucleotideF1:C1:F2:C2:F3:C3 | |
| 42 inputFilePath <- arg[8] # Full path to input file | |
| 43 outputPath <- arg[9] # Full path to location of output files | |
| 44 outputID <- arg[10] # ID for session output | |
| 45 | |
| 46 | |
| 47 if(testID==5){ | |
| 48 traitChangeModel <- 1 | |
| 49 if( !is.na(any(arg[11])) ) traitChangeModel <- as.numeric(arg[11]) # 1 <- Chothia 1998 | |
| 50 initializeTraitChange(traitChangeModel) | |
| 51 } | |
| 52 | |
| 53 # Initialize other parameters/variables | |
| 54 | |
| 55 # Initialzie the codon table ( definitions of R/S ) | |
| 56 computeCodonTable(testID) | |
| 57 | |
| 58 # Initialize | |
| 59 # Test Name | |
| 60 testName<-"Focused" | |
| 61 if(testID==2) testName<-"Local" | |
| 62 if(testID==3) testName<-"Imbalanced" | |
| 63 if(testID==4) testName<-"ImbalancedSilent" | |
| 64 | |
| 65 # Indel placeholders initialization | |
| 66 indelPos <- NULL | |
| 67 delPos <- NULL | |
| 68 insPos <- NULL | |
| 69 | |
| 70 # Initialize in Tranistion & Mutability matrixes | |
| 71 substitution <- initializeSubstitutionMatrix(substitutionModel,species) | |
| 72 mutability <- initializeMutabilityMatrix(mutabilityModel,species) | |
| 73 | |
| 74 # FWR/CDR boundaries | |
| 75 flagTrim <- F | |
| 76 if( is.na(region[7])){ | |
| 77 flagTrim <- T | |
| 78 region[7]<-region[6] | |
| 79 } | |
| 80 readStart = min(region,na.rm=T) | |
| 81 readEnd = max(region,na.rm=T) | |
| 82 if(readStart>1){ | |
| 83 region = region - (readStart - 1) | |
| 84 } | |
| 85 region_Nuc = c( (region[1]*3-2) , (region[2:7]*3) ) | |
| 86 region_Cod = region | |
| 87 | |
| 88 readStart = (readStart*3)-2 | |
| 89 readEnd = (readEnd*3) | |
| 90 | |
| 91 FWR_Nuc <- c( rep(TRUE,(region_Nuc[2])), | |
| 92 rep(FALSE,(region_Nuc[3]-region_Nuc[2])), | |
| 93 rep(TRUE,(region_Nuc[4]-region_Nuc[3])), | |
| 94 rep(FALSE,(region_Nuc[5]-region_Nuc[4])), | |
| 95 rep(TRUE,(region_Nuc[6]-region_Nuc[5])), | |
| 96 rep(FALSE,(region_Nuc[7]-region_Nuc[6])) | |
| 97 ) | |
| 98 CDR_Nuc <- (1-FWR_Nuc) | |
| 99 CDR_Nuc <- as.logical(CDR_Nuc) | |
| 100 FWR_Nuc_Mat <- matrix( rep(FWR_Nuc,4), ncol=length(FWR_Nuc), nrow=4, byrow=T) | |
| 101 CDR_Nuc_Mat <- matrix( rep(CDR_Nuc,4), ncol=length(CDR_Nuc), nrow=4, byrow=T) | |
| 102 | |
| 103 FWR_Codon <- c( rep(TRUE,(region[2])), | |
| 104 rep(FALSE,(region[3]-region[2])), | |
| 105 rep(TRUE,(region[4]-region[3])), | |
| 106 rep(FALSE,(region[5]-region[4])), | |
| 107 rep(TRUE,(region[6]-region[5])), | |
| 108 rep(FALSE,(region[7]-region[6])) | |
| 109 ) | |
| 110 CDR_Codon <- (1-FWR_Codon) | |
| 111 CDR_Codon <- as.logical(CDR_Codon) | |
| 112 | |
| 113 | |
| 114 # Read input FASTA file | |
| 115 tryCatch( | |
| 116 inputFASTA <- baseline.read.fasta(inputFilePath, seqtype="DNA",as.string=T,set.attributes=F,forceDNAtolower=F) | |
| 117 , error = function(ex){ | |
| 118 cat("Error|Error reading input. Please enter or upload a valid FASTA file.\n") | |
| 119 q() | |
| 120 } | |
| 121 ) | |
| 122 | |
| 123 if (length(inputFASTA)==1) { | |
| 124 cat("Error|Error reading input. Please enter or upload a valid FASTA file.\n") | |
| 125 q() | |
| 126 } | |
| 127 | |
| 128 # Process sequence IDs/names | |
| 129 names(inputFASTA) <- sapply(names(inputFASTA),function(x){trim(x)}) | |
| 130 | |
| 131 # Convert non nucleotide characters to N | |
| 132 inputFASTA[length(inputFASTA)] = gsub("\t","",inputFASTA[length(inputFASTA)]) | |
| 133 inputFASTA <- lapply(inputFASTA,replaceNonFASTAChars) | |
| 134 | |
| 135 # Process the FASTA file and conver to Matrix[inputSequence, germlineSequence] | |
| 136 processedInput <- processInputAdvanced(inputFASTA) | |
| 137 matInput <- processedInput[[1]] | |
| 138 germlines <- processedInput[[2]] | |
| 139 lenGermlines = length(unique(germlines)) | |
| 140 groups <- processedInput[[3]] | |
| 141 lenGroups = length(unique(groups)) | |
| 142 rm(processedInput) | |
| 143 rm(inputFASTA) | |
| 144 | |
| 145 # # remove clones with less than 2 seqeunces | |
| 146 # tableGL <- table(germlines) | |
| 147 # singletons <- which(tableGL<8) | |
| 148 # rowsToRemove <- match(singletons,germlines) | |
| 149 # if(any(rowsToRemove)){ | |
| 150 # matInput <- matInput[-rowsToRemove,] | |
| 151 # germlines <- germlines[-rowsToRemove] | |
| 152 # groups <- groups[-rowsToRemove] | |
| 153 # } | |
| 154 # | |
| 155 # # remove unproductive seqs | |
| 156 # nonFuctionalSeqs <- sapply(rownames(matInput),function(x){any(grep("unproductive",x))}) | |
| 157 # if(any(nonFuctionalSeqs)){ | |
| 158 # if(sum(nonFuctionalSeqs)==length(germlines)){ | |
| 159 # write.table("Unproductive",file=paste(outputPath,outputID,".txt",sep=""),quote=F,sep="\t",row.names=F,col.names=T) | |
| 160 # q() | |
| 161 # } | |
| 162 # matInput <- matInput[-which(nonFuctionalSeqs),] | |
| 163 # germlines <- germlines[-which(nonFuctionalSeqs)] | |
| 164 # germlines[1:length(germlines)] <- 1:length(germlines) | |
| 165 # groups <- groups[-which(nonFuctionalSeqs)] | |
| 166 # } | |
| 167 # | |
| 168 # if(class(matInput)=="character"){ | |
| 169 # write.table("All unproductive seqs",file=paste(outputPath,outputID,".txt",sep=""),quote=F,sep="\t",row.names=F,col.names=T) | |
| 170 # q() | |
| 171 # } | |
| 172 # | |
| 173 # if(nrow(matInput)<10 | is.null(nrow(matInput))){ | |
| 174 # write.table(paste(nrow(matInput), "seqs only",sep=""),file=paste(outputPath,outputID,".txt",sep=""),quote=F,sep="\t",row.names=F,col.names=T) | |
| 175 # q() | |
| 176 # } | |
| 177 | |
| 178 # replace leading & trailing "-" with "N: | |
| 179 matInput <- t(apply(matInput,1,replaceLeadingTrailingDashes,readEnd)) | |
| 180 | |
| 181 # Trim (nucleotide) input sequences to the last codon | |
| 182 #matInput[,1] <- apply(matrix(matInput[,1]),1,trimToLastCodon) | |
| 183 | |
| 184 # # Check for Indels | |
| 185 # if(fixIndels){ | |
| 186 # delPos <- fixDeletions(matInput) | |
| 187 # insPos <- fixInsertions(matInput) | |
| 188 # }else{ | |
| 189 # # Check for indels | |
| 190 # indelPos <- checkForInDels(matInput) | |
| 191 # indelPos <- apply(cbind(indelPos[[1]],indelPos[[2]]),1,function(x){(x[1]==T & x[2]==T)}) | |
| 192 # } | |
| 193 | |
| 194 # If indels are present, remove mutations in the seqeunce & throw warning at end | |
| 195 #matInput[indelPos,] <- apply(matrix(matInput[indelPos,],nrow=sum(indelPos),ncol=2),1,function(x){x[1]=x[2]; return(x) }) | |
| 196 | |
| 197 colnames(matInput)=c("Input","Germline") | |
| 198 | |
| 199 # If seqeunces are clonal, create effective sequence for each clone & modify germline/group definitions | |
| 200 germlinesOriginal = NULL | |
| 201 if(clonal){ | |
| 202 germlinesOriginal <- germlines | |
| 203 collapseCloneResults <- tapply(1:nrow(matInput),germlines,function(i){ | |
| 204 collapseClone(matInput[i,1],matInput[i[1],2],readEnd,nonTerminalOnly=(clonal-1)) | |
| 205 }) | |
| 206 matInput = t(sapply(collapseCloneResults,function(x){return(x[[1]])})) | |
| 207 names_groups = tapply(groups,germlines,function(x){names(x[1])}) | |
| 208 groups = tapply(groups,germlines,function(x){array(x[1],dimnames=names(x[1]))}) | |
| 209 names(groups) = names_groups | |
| 210 | |
| 211 names_germlines = tapply(germlines,germlines,function(x){names(x[1])}) | |
| 212 germlines = tapply( germlines,germlines,function(x){array(x[1],dimnames=names(x[1]))} ) | |
| 213 names(germlines) = names_germlines | |
| 214 matInputErrors = sapply(collapseCloneResults,function(x){return(x[[2]])}) | |
| 215 } | |
| 216 | |
| 217 | |
| 218 # Selection Analysis | |
| 219 | |
| 220 | |
| 221 # if (length(germlines)>sequenceLimit) { | |
| 222 # # Code to parallelize processing goes here | |
| 223 # stop( paste("Error: Cannot process more than ", Upper_limit," sequences",sep="") ) | |
| 224 # } | |
| 225 | |
| 226 # if (length(germlines)<sequenceLimit) {} | |
| 227 | |
| 228 # Compute expected mutation frequencies | |
| 229 matExpected <- getExpectedIndividual(matInput) | |
| 230 | |
| 231 # Count observed number of mutations in the different regions | |
| 232 mutations <- lapply( 1:nrow(matInput), function(i){ | |
| 233 #cat(i,"\n") | |
| 234 seqI = s2c(matInput[i,1]) | |
| 235 seqG = s2c(matInput[i,2]) | |
| 236 matIGL = matrix(c(seqI,seqG),ncol=length(seqI),nrow=2,byrow=T) | |
| 237 retVal <- NA | |
| 238 tryCatch( | |
| 239 retVal <- analyzeMutations2NucUri(matIGL) | |
| 240 , error = function(ex){ | |
| 241 retVal <- NA | |
| 242 } | |
| 243 ) | |
| 244 | |
| 245 | |
| 246 return( retVal ) | |
| 247 }) | |
| 248 | |
| 249 matObserved <- t(sapply( mutations, processNucMutations2 )) | |
| 250 numberOfSeqsWithMutations <- numberOfSeqsWithMutations(matObserved, testID) | |
| 251 | |
| 252 #if(sum(numberOfSeqsWithMutations)==0){ | |
| 253 # write.table("No mutated sequences",file=paste(outputPath,outputID,".txt",sep=""),quote=F,sep="\t",row.names=F,col.names=T) | |
| 254 # q() | |
| 255 #} | |
| 256 | |
| 257 matMutationInfo <- cbind(matObserved,matExpected) | |
| 258 rm(matObserved,matExpected) | |
| 259 | |
| 260 | |
| 261 #Bayesian PDFs | |
| 262 bayes_pdf = computeBayesianScore(matMutationInfo, test=testName, max_sigma=20,length_sigma=4001) | |
| 263 bayesPDF_cdr = bayes_pdf[[1]] | |
| 264 bayesPDF_fwr = bayes_pdf[[2]] | |
| 265 rm(bayes_pdf) | |
| 266 | |
| 267 bayesPDF_germlines_cdr = tapply(bayesPDF_cdr,germlines,function(x) groupPosteriors(x,length_sigma=4001)) | |
| 268 bayesPDF_germlines_fwr = tapply(bayesPDF_fwr,germlines,function(x) groupPosteriors(x,length_sigma=4001)) | |
| 269 | |
| 270 bayesPDF_groups_cdr = tapply(bayesPDF_cdr,groups,function(x) groupPosteriors(x,length_sigma=4001)) | |
| 271 bayesPDF_groups_fwr = tapply(bayesPDF_fwr,groups,function(x) groupPosteriors(x,length_sigma=4001)) | |
| 272 | |
| 273 if(lenGroups>1){ | |
| 274 groups <- c(groups,lenGroups+1) | |
| 275 names(groups)[length(groups)] = "All sequences combined" | |
| 276 bayesPDF_groups_cdr[[lenGroups+1]] = groupPosteriors(bayesPDF_groups_cdr,length_sigma=4001) | |
| 277 bayesPDF_groups_fwr[[lenGroups+1]] = groupPosteriors(bayesPDF_groups_fwr,length_sigma=4001) | |
| 278 } | |
| 279 | |
| 280 #Bayesian Outputs | |
| 281 bayes_cdr = t(sapply(bayesPDF_cdr,calcBayesOutputInfo)) | |
| 282 bayes_fwr = t(sapply(bayesPDF_fwr,calcBayesOutputInfo)) | |
| 283 bayes_germlines_cdr = t(sapply(bayesPDF_germlines_cdr,calcBayesOutputInfo)) | |
| 284 bayes_germlines_fwr = t(sapply(bayesPDF_germlines_fwr,calcBayesOutputInfo)) | |
| 285 bayes_groups_cdr = t(sapply(bayesPDF_groups_cdr,calcBayesOutputInfo)) | |
| 286 bayes_groups_fwr = t(sapply(bayesPDF_groups_fwr,calcBayesOutputInfo)) | |
| 287 | |
| 288 #P-values | |
| 289 simgaP_cdr = sapply(bayesPDF_cdr,computeSigmaP) | |
| 290 simgaP_fwr = sapply(bayesPDF_fwr,computeSigmaP) | |
| 291 | |
| 292 simgaP_germlines_cdr = sapply(bayesPDF_germlines_cdr,computeSigmaP) | |
| 293 simgaP_germlines_fwr = sapply(bayesPDF_germlines_fwr,computeSigmaP) | |
| 294 | |
| 295 simgaP_groups_cdr = sapply(bayesPDF_groups_cdr,computeSigmaP) | |
| 296 simgaP_groups_fwr = sapply(bayesPDF_groups_fwr,computeSigmaP) | |
| 297 | |
| 298 | |
| 299 #Format output | |
| 300 | |
| 301 # Round expected mutation frequencies to 3 decimal places | |
| 302 matMutationInfo[germlinesOriginal[indelPos],] = NA | |
| 303 if(nrow(matMutationInfo)==1){ | |
| 304 matMutationInfo[5:8] = round(matMutationInfo[,5:8]/sum(matMutationInfo[,5:8],na.rm=T),3) | |
| 305 }else{ | |
| 306 matMutationInfo[,5:8] = t(round(apply(matMutationInfo[,5:8],1,function(x){ return(x/sum(x,na.rm=T)) }),3)) | |
| 307 } | |
| 308 | |
| 309 listPDFs = list() | |
| 310 nRows = length(unique(groups)) + length(unique(germlines)) + length(groups) | |
| 311 | |
| 312 matOutput = matrix(NA,ncol=18,nrow=nRows) | |
| 313 rowNumb = 1 | |
| 314 for(G in unique(groups)){ | |
| 315 #print(G) | |
| 316 matOutput[rowNumb,c(1,2,11:18)] = c("Group",names(groups)[groups==G][1],bayes_groups_cdr[G,],bayes_groups_fwr[G,],simgaP_groups_cdr[G],simgaP_groups_fwr[G]) | |
| 317 listPDFs[[rowNumb]] = list("CDR"=bayesPDF_groups_cdr[[G]],"FWR"=bayesPDF_groups_fwr[[G]]) | |
| 318 names(listPDFs)[rowNumb] = names(groups[groups==paste(G)])[1] | |
| 319 #if(names(groups)[which(groups==G)[1]]!="All sequences combined"){ | |
| 320 gs = unique(germlines[groups==G]) | |
| 321 rowNumb = rowNumb+1 | |
| 322 if( !is.na(gs) ){ | |
| 323 for( g in gs ){ | |
| 324 matOutput[rowNumb,c(1,2,11:18)] = c("Germline",names(germlines)[germlines==g][1],bayes_germlines_cdr[g,],bayes_germlines_fwr[g,],simgaP_germlines_cdr[g],simgaP_germlines_fwr[g]) | |
| 325 listPDFs[[rowNumb]] = list("CDR"=bayesPDF_germlines_cdr[[g]],"FWR"=bayesPDF_germlines_fwr[[g]]) | |
| 326 names(listPDFs)[rowNumb] = names(germlines[germlines==paste(g)])[1] | |
| 327 rowNumb = rowNumb+1 | |
| 328 indexesOfInterest = which(germlines==g) | |
| 329 numbSeqsOfInterest = length(indexesOfInterest) | |
| 330 rowNumb = seq(rowNumb,rowNumb+(numbSeqsOfInterest-1)) | |
| 331 matOutput[rowNumb,] = matrix( c( rep("Sequence",numbSeqsOfInterest), | |
| 332 rownames(matInput)[indexesOfInterest], | |
| 333 c(matMutationInfo[indexesOfInterest,1:4]), | |
| 334 c(matMutationInfo[indexesOfInterest,5:8]), | |
| 335 c(bayes_cdr[indexesOfInterest,]), | |
| 336 c(bayes_fwr[indexesOfInterest,]), | |
| 337 c(simgaP_cdr[indexesOfInterest]), | |
| 338 c(simgaP_fwr[indexesOfInterest]) | |
| 339 ), ncol=18, nrow=numbSeqsOfInterest,byrow=F) | |
| 340 increment=0 | |
| 341 for( ioi in indexesOfInterest){ | |
| 342 listPDFs[[min(rowNumb)+increment]] = list("CDR"=bayesPDF_cdr[[ioi]] , "FWR"=bayesPDF_fwr[[ioi]]) | |
| 343 names(listPDFs)[min(rowNumb)+increment] = rownames(matInput)[ioi] | |
| 344 increment = increment + 1 | |
| 345 } | |
| 346 rowNumb=max(rowNumb)+1 | |
| 347 | |
| 348 } | |
| 349 } | |
| 350 } | |
| 351 colsToFormat = 11:18 | |
| 352 matOutput[,colsToFormat] = formatC( matrix(as.numeric(matOutput[,colsToFormat]), nrow=nrow(matOutput), ncol=length(colsToFormat)) , digits=3) | |
| 353 matOutput[matOutput== " NaN"] = NA | |
| 354 | |
| 355 | |
| 356 | |
| 357 colnames(matOutput) = c("Type", "ID", "Observed_CDR_R", "Observed_CDR_S", "Observed_FWR_R", "Observed_FWR_S", | |
| 358 "Expected_CDR_R", "Expected_CDR_S", "Expected_FWR_R", "Expected_FWR_S", | |
| 359 paste( rep(testName,6), rep(c("Sigma","CIlower","CIupper"),2),rep(c("CDR","FWR"),each=3), sep="_"), | |
| 360 paste( rep(testName,2), rep("P",2),c("CDR","FWR"), sep="_") | |
| 361 ) | |
| 362 fileName = paste(outputPath,outputID,".txt",sep="") | |
| 363 write.table(matOutput,file=fileName,quote=F,sep="\t",row.names=T,col.names=NA) | |
| 364 fileName = paste(outputPath,outputID,".RData",sep="") | |
| 365 save(listPDFs,file=fileName) | |
| 366 | |
| 367 indelWarning = FALSE | |
| 368 if(sum(indelPos)>0){ | |
| 369 indelWarning = "<P>Warning: The following sequences have either gaps and/or deletions, and have been ommited from the analysis."; | |
| 370 indelWarning = paste( indelWarning , "<UL>", sep="" ) | |
| 371 for(indels in names(indelPos)[indelPos]){ | |
| 372 indelWarning = paste( indelWarning , "<LI>", indels, "</LI>", sep="" ) | |
| 373 } | |
| 374 indelWarning = paste( indelWarning , "</UL></P>", sep="" ) | |
| 375 } | |
| 376 | |
| 377 cloneWarning = FALSE | |
| 378 if(clonal==1){ | |
| 379 if(sum(matInputErrors)>0){ | |
| 380 cloneWarning = "<P>Warning: The following clones have sequences of unequal length."; | |
| 381 cloneWarning = paste( cloneWarning , "<UL>", sep="" ) | |
| 382 for(clone in names(matInputErrors)[matInputErrors]){ | |
| 383 cloneWarning = paste( cloneWarning , "<LI>", names(germlines)[as.numeric(clone)], "</LI>", sep="" ) | |
| 384 } | |
| 385 cloneWarning = paste( cloneWarning , "</UL></P>", sep="" ) | |
| 386 } | |
| 387 } | |
| 388 cat(paste("Success",outputID,indelWarning,cloneWarning,sep="|")) |
