bebop / poly

A Go package for engineering organisms.
https://pkg.go.dev/github.com/bebop/poly
MIT License
666 stars 70 forks source link

PCR simulations are wrong. #279

Closed Koeng101 closed 11 months ago

Koeng101 commented 1 year ago
package main

import (
    "fmt"
    "github.com/TimothyStiles/poly/primers/pcr"
)

func main() {
    gene := "aataattacaccgagataacacatcatggataaaccgatactcaaagattctatgaagctatttgaggcacttggtacgatcaagtcgcgctcaatgtttggtggcttcggacttttcgctgatgaaacgatgtttgcactggttgtgaatgatcaacttcacatacgagcagaccagcaaacttcatctaacttcgagaagcaagggctaaaaccgtacgtttataaaaagcgtggttttccagtcgttactaagtactacgcgatttccgacgacttgtgggaatccagtgaacgcttgatagaagtagcgaagaagtcgttagaacaagccaatttggaaaaaaagcaacaggcaagtagtaagcccgacaggttgaaagacctgcctaacttacgactagcgactgaacgaatgcttaagaaagctggtataaaatcagttgaacaacttgaagagaaaggtgcattgaatgcttacaaagcgatacgtgactctcactccgcaaaagtaagtattgagctactctgggctttagaaggagcgataaacggcacgcactggagcgtcgttcctcaatctcgcagagaagagctggaaaatgcgctttcttaa"

    fragments, _ := pcr.Simulate([]string{gene}, 55.0, false, []string{"TATATGGTCTCTTCATTTAAGAAAGCGCATTTTCCAGC", "TTATAGGTCTCATACTAATAATTACACCGAGATAACACATCATGG", "CTGCAGGTCGACTCTAG"})

    // Now let's make sure it only amplified our target.
    fmt.Println(fragments[0])

}

Output:

TATATGGTCTCTTCATTTACACCGAGATAACACATCATGGATAAACCGATACTCAAAGATTCTATGAAGCTATTTGAGGCACTTGGTACGATCAAGTCGCGCTCAATGTTTGGTGGCTTCGGACTTTTCGCTGATGAAACGATGTTTGCACTGGTTGTGAATGATCAACTTCACATACGAGCAGACCAGCAAACTTCATCTAACTTCGAGAAGCAAGGGCTAAAACCGTACGTTTATAAAAAGCGTGGTTTTCCAGTCGTTACTAAGTACTACGCGATTTCCGACGACTTGTGGGAATCCAGTGAACGCTTGATAGAAGTAGCGAAGAAGTCGTTAGAACAAGCCAATTTGGAAAAAAAGCAACAGGCAAGTAGTAAGCCCGACAGGTTGAAAGACCTGCCTAACTTACGACTAGCGACTGAACGAATGCTTAAGAAAGCTGGTATAAAATCAGTTGAACAACTTGAAGAGAAAGGTGCATTGAATGCTTACAAAGCGATACGTGACTCTCACTCCGCAAAAGTAAGTATTGAGCTACTCTGGGCTTTAGAAGGAGCGATAAACGGCACGCACTGGAGCGTCGTTCCTCAATCTCGCAGAGAAGAGCTGGAAAATGCGCTTTCTTAAATGAAGAGACCATATA

Check here - https://pkg.go.dev/github.com/TimothyStiles/poly@v0.21.1/primers/pcr

TTATAGGTCTCATACTAATAATTACACCGAGATAACACATCATGG anneals to the beginning of the sequence, NOT TATATGGTCTCTTCATTTAAGAAAGCGCATTTTCCAGC. There is no reason why the beginning of the output sequence should be TATA

@TimothyStiles This is a fairly critical bug we should figure out.

Koeng101 commented 1 year ago

Sequence should be TTATAGGTCTCATACTAATAATTACACCGAGATAACACATCATGGATAAACCGATACTCAAAGATTCTATGAAGCTATTTGAGGCACTTGGTACGATCAAGTCGCGCTCAATGTTTGGTGGCTTCGGACTTTTCGCTGATGAAACGATGTTTGCACTGGTTGTGAATGATCAACTTCACATACGAGCAGACCAGCAAACTTCATCTAACTTCGAGAAGCAAGGGCTAAAACCGTACGTTTATAAAAAGCGTGGTTTTCCAGTCGTTACTAAGTACTACGCGATTTCCGACGACTTGTGGGAATCCAGTGAACGCTTGATAGAAGTAGCGAAGAAGTCGTTAGAACAAGCCAATTTGGAAAAAAAGCAACAGGCAAGTAGTAAGCCCGACAGGTTGAAAGACCTGCCTAACTTACGACTAGCGACTGAACGAATGCTTAAGAAAGCTGGTATAAAATCAGTTGAACAACTTGAAGAGAAAGGTGCATTGAATGCTTACAAAGCGATACGTGACTCTCACTCCGCAAAAGTAAGTATTGAGCTACTCTGGGCTTTAGAAGGAGCGATAAACGGCACGCACTGGAGCGTCGTTCCTCAATCTCGCAGAGAAGAGCTGGAAAATGCGCTTTCTTAAATGAAGAGACCATATA

TimothyStiles commented 1 year ago

@Koeng101 was this ever resolved?

Koeng101 commented 1 year ago

No. I fixed it in bioscript but not here. I'll port the fix when I get the chance.

carreter commented 1 year ago

What's the status of this? @Koeng101 need help with it?

Koeng101 commented 1 year ago

Yes, this is actually pretty high priority as well, and I should have fixed it earlier (and haven't used this part of poly since I haven't fixed it yet)

carreter commented 11 months ago

Will take a crack at this as a break from #297 /administrative stuff.

Koeng101 commented 11 months ago

Great! This is very important.

carreter commented 11 months ago

Sneaky little bug...

func generatePcrFragments(sequence string, forwardLocation int, reverseLocation int, forwardPrimerIndxs []int, reversePrimerIndxs []int, minimalPrimers []string, primerList []string) []string {
    var pcrFragments []string
    for forwardPrimerIndex := range forwardPrimerIndxs { // We were iterating over indexes of forwardPrimerIndxs rather than the values themselves, which is what we actually want!
        minimalPrimer := minimalPrimers[forwardPrimerIndex]
        fullPrimerForward := primerList[forwardPrimerIndex]
        for _, reversePrimerIndex := range reversePrimerIndxs {
            fullPrimerReverse := transform.ReverseComplement(primerList[reversePrimerIndex])
            pcrFragment := fullPrimerForward[:len(fullPrimerForward)-len(minimalPrimer)] + sequence[forwardLocation:reverseLocation] + fullPrimerReverse
            pcrFragments = append(pcrFragments, pcrFragment)
        }
    }
    return pcrFragments
}