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() } } } }
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("}") }