SD 212 Spring 2024 / Homeworks


hw26: DNA searching

  • Due before the beginning of class on Wednesday, April 3

The Data

A DNA sequence is written as a (very) long string of A, G, T, C representing the different nucleobases that can occur.

Download and unzip the file dna.txt.gz which contains a DNA sequence of length 10 million. You can download directly on the command line with:

wget "https://roche.work/212/hw/parallel/dna.txt.gz"

After downloading, unzip to create a file dna.txt by running:

gunzip dna.txt.gz

Sequence matching

It is a very common and important task to look for a specific gene or mutation within a larger sequence. For example, there are some known genes that indicate a significantly increased risk for certain cancers. If you submit your own DNA to various commercial and medical providers, they will search for these known genes and tell you if you are at increased risk for those cancers.

But getting a 100% perfect match is too restrictive — there may be some small differences in one or two letters, which still indicate an overall “match”. So the question really becomes, how close some short sequence to matching part of the larger one.

For the purposes of this homework, the matching works by computing the smallest number of different letters in all the possible positions where the search string can occur in the larger sequence.

For example, imagine the entire DNA sequence is:

TTAAAGCCAGTTCTCCATCGGTAAGCTCACGTATAACCGC

and we are searching for this pattern:

CCGTA

If we try the pattern at position 7 in the sequence, it looks like this and there are two mismatches as indicated:

TTAAAGCCAGTTCTCCATCGGTAAGCTCACGTATAACCGC
       CCGTA
        ^  ^
       2 mismatches

But later on at position 18, there is only one mismatching letter:

TTAAAGCCAGTTCTCCATCGGTAAGCTCACGTATAACCGC
                            CCGTA
                            ^
                            1 mismatch

It turns out that is the fewest number of mismatches at any position, so the best match here is a score of “1”.

Your task

Write a program genesearch.py which uses the dna.txt provided, inputs a search string from the user, and reports the best matching score for any position of that search string in the larger sequence.

Here are two example runs:

roche@ubuntu$ python3 genesearch.py
enter search pattern: ACACATTCTTTTCTATAGTC
4
roche@ubuntu$ python3 genesearch.py
enter search pattern: GATCCGTAGGTAGTGCCCCACA
1

Of course, we want you to use multiprocessing to make the search more efficient! Your program should use at least 4 and at most 10 parallel processes to perform the computation.

Starter code

Fortunately, you don’t have to start from scratch!

This is a fully working genesearch.py program which you should copy/paste and start with.

Your actual task is just to modify it so that it uses multiprocessing to split up the work of searching through the large sequence.

Hints

  • Review the examples from the end of our notes on multiprocessing using SimpleQueue

  • The full dna.txt file has exactly 10 million letters. You need to divide this into smaller sub-ranges to search.

  • Because we are using multiprocessing and need to communicate between the children and parent processes, you should use a SimpleQueue which is created in the parent and sent as a function argument to the children processes.

  • Each process will search only part of the total dna sequence, should .put() into the shared SimpleQueue a single number representing the smallest number of mismatches found in that part.

  • The parent process will get() each of these numbers from the SimpleQueue and report the smallest one.

Submit command

To submit files for this homework, run one of these commands:

submit -c=sd212 -p=hw26 genesearch.py
club -csd212 -phw26 genesearch.py