Beispiel #1
0
func main() {
	br := bufio.NewReader(os.Stdin)

	reads := []string{}
	for {
		line, err := br.ReadString('\n')
		if err == io.EOF {
			break
		} else if err != nil {
			log.Fatal(err)
		}

		reads = append(reads, strings.TrimSpace(line))
	}

	seen := map[string]int{}
	for _, s := range reads {
		seen[s] += 1
		rc := gene.ReverseComplement(s)
		if rc != s {
			seen[rc] += 1
		}
	}

	bases := ([]byte)("ACGT")
	for _, s := range reads {
		if seen[s] == 1 {
			corrected := ""
			for i := 0; i < len(s); i++ {
				for _, b := range bases {
					if s[i] != b {
						t := s[:i] + string(b) + s[i+1:]
						if seen[t] > 1 {
							if corrected == "" {
								corrected = t
							} else {
								log.Fatal("Found multiple corrections: " + s)
							}
						}
					}
				}
			}
			if corrected != "" {
				fmt.Print(s, "->", corrected)
				fmt.Println()
			}
		}
	}
}
Beispiel #2
0
func main() {
	k := flag.Int("k", 3, "Node substring length")
	flag.Parse()

	adj := map[string][]string{}

	scanner := bufio.NewScanner(os.Stdin)
	for scanner.Scan() {
		read := scanner.Text()
		if len(read) < *k+1 {
			fmt.Fprintf(os.Stderr, "Error: Reads are too short for k.")
			os.Exit(1)
		}

		for _, s := range []string{read, gene.ReverseComplement(read)} {
			for i := 0; i < len(s)-*k; i++ {
				u := s[i : i+*k]
				v := s[i+1 : i+1+*k]
				adj[u] = add(adj[u], v)
			}
		}
	}

	nonce := 1
	fmt.Println("digraph debruijn {")
	for u := range adj {
		for _, v := range adj[u] {
			if u == v {
				fmt.Printf("  %s -> nonce%d;\n", u, nonce)
				fmt.Printf("  nonce%d -> %s;\n", nonce, u)
				nonce++
			} else {
				fmt.Printf("  %s -> %s;\n", u, v)
			}
		}
	}
	fmt.Println("}")
}