public void LoadUcscSnps(string snpPath, bool clearSnps, IProgressReporter progress = null) { //Clear? if (clearSnps) { Snps.Clear(); } //Log progress?.Update("Loading SNPs"); //Init var lineCount = 0; _splitter = null; //Read file using (var reader = _fileReaderFactory.GetFileReader(snpPath)) { foreach (var line in reader) { //Loop init lineCount++; if (lineCount == 1) { var testSplit = line.Split('\t'); _splitter = new StringSplitter(testSplit.Length); continue; } //Read data // ReSharper disable once PossibleNullReferenceException _splitter.Split(line, '\t'); var lineSplit = _splitter.Results; var snp = new Snp(); //Build data snp.Chromosome = lineSplit[1]; snp.Pos = lineSplit[2]; snp.RsId = lineSplit[4]; snp.Strand = lineSplit[6]; snp.SnpRef = lineSplit[7]; snp.Observed = lineSplit[9]; if (snp.SnpRef.Length == 1 && snp.SnpRef != "-") { if (snp.Strand == "+") { snp.SnpAlt = snp.Observed[0] == snp.SnpRef[0] ? snp.Observed[2].ToString() : snp.Observed[0].ToString(); } else { var newObs = new char[3]; newObs[1] = '/'; //Reverse observed if(snp.Observed[0] == 'A') { newObs[2] = 'T';} else if (snp.Observed[0] == 'T') { newObs[2] = 'A'; } else if (snp.Observed[0] == 'G') { newObs[2] = 'C'; } else if (snp.Observed[0] == 'C') { newObs[2] = 'G'; } if (snp.Observed[2] == 'A') { newObs[0] = 'T'; } else if (snp.Observed[2] == 'T') { newObs[0] = 'A'; } else if (snp.Observed[2] == 'G') { newObs[0] = 'C'; } else if (snp.Observed[2] == 'C') { newObs[0] = 'G'; } var observed = new String(newObs); snp.SnpAlt = observed[0] == snp.SnpRef[0] ? observed[2].ToString() : observed[0].ToString(); } if (!Snps.ContainsKey(snp.RsId)) { Snps.Add(snp.RsId, snp); } } //Progress lineCount++; if (progress != null && lineCount % 10 == 1) { var perc = (double)reader.Stream.Position / reader.Stream.Length; progress.Update(perc); } } } }