77 lines
1.5 KiB
Go
77 lines
1.5 KiB
Go
![]() |
package solutions
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"log"
|
||
|
"strconv"
|
||
|
"strings"
|
||
|
|
||
|
"gitlab.com/fizzizist/go-rosalind/pkg/io"
|
||
|
)
|
||
|
|
||
|
func CompileOutput(consensus string, profile [][]int) []string {
|
||
|
output := []string{consensus}
|
||
|
idxMap := []string{"A", "C", "G", "T"}
|
||
|
|
||
|
for i, val := range profile {
|
||
|
var strProf []string
|
||
|
for _, inVal := range val {
|
||
|
strProf = append(strProf, strconv.Itoa(inVal))
|
||
|
}
|
||
|
output = append(output, fmt.Sprintf("%s: %s", idxMap[i], strings.Join(strProf, " ")))
|
||
|
}
|
||
|
|
||
|
return output
|
||
|
}
|
||
|
|
||
|
func Cons(filename string) {
|
||
|
_, lines, err := io.ParseFasta(filename)
|
||
|
if err != nil {
|
||
|
log.Fatalf("Failed to read file: %s", err)
|
||
|
}
|
||
|
|
||
|
profile := make([][]int, 4) // 1 for each codon
|
||
|
for i := range profile {
|
||
|
profile[i] = make([]int, len(lines[1]))
|
||
|
}
|
||
|
|
||
|
for _, value := range lines {
|
||
|
for j, s := range value {
|
||
|
switch {
|
||
|
case s == 'A':
|
||
|
profile[0][j]++
|
||
|
case s == 'C':
|
||
|
profile[1][j]++
|
||
|
case s == 'G':
|
||
|
profile[2][j]++
|
||
|
case s == 'T':
|
||
|
profile[3][j]++
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var consensus []string
|
||
|
idxMap := []string{"A", "C", "G", "T"}
|
||
|
for i := range profile[0] {
|
||
|
maxCons := "A"
|
||
|
maxVal := 0
|
||
|
for j, s := range idxMap {
|
||
|
if profile[j][i] > maxVal {
|
||
|
maxCons = s
|
||
|
maxVal = profile[j][i]
|
||
|
}
|
||
|
}
|
||
|
consensus = append(consensus, maxCons)
|
||
|
}
|
||
|
|
||
|
fmt.Println("Writing output file...")
|
||
|
err = io.WriteStringsToFile(
|
||
|
CompileOutput(strings.Join(consensus, ""), profile),
|
||
|
"results/cons.txt",
|
||
|
)
|
||
|
if err != nil {
|
||
|
log.Fatalf("Failed writing output file: %s", err)
|
||
|
}
|
||
|
fmt.Println("Done.")
|
||
|
}
|