# How to represent random sequence elements in SBOL?

In our lab, we work with synthetic biology components with partially random sequences (similar to work in directed evolution). So, for example, we have a plasmid design with several components, including one protein coding sequence that will be created from a wild-type sequence via mutagenic PCR.

At the design stage, we don't know the exact DNA sequence for any of the resulting variants of that protein coding sequence. We just know the wild-type sequence and the average number of mutations we'd like to apply. How can we represent that design in SBOL (via the Component class)?

Then, when we implement the design, we end up with a single sample that contains plasmids with 10^5-10^6 (or more) different protein coding sequences. We then measure the complete DNA sequence for every plasmid variant, but I don't want to end up with >10^5 different SBOL definitions to describe the sample. How can we best represent that sample in SBOL (via the Implementation class)?

Finally, we also end up measuring the performance of every plasmid variant, and we identify the specific protein coding sequences for useful and/or interesting variants. We then design and build specific, clonal plasmids with those useful/interesting protein coding sequences. Representing those clonal plasmids as SBOL Components seems pretty straight-forward, but is there a good way to capture the relationships with the original random-library plasmid design and the specific implementation of that design that we built and measured?

This sounds like a job for the CombinatorialDerivation class, which is designed for representing libraries and the relationship between derived designs and the originals.

### About CombinatorialDerivation

In SBOL 3, a CombinatorialDerivation takes a Component in its template property to represent the system that you intend to vary:

• Some of the Features of the template Component are designated as the variables of the library via VariableFeature child objects of the CombinatorialDerivation, which point at the variables with their variable property.
• The values that can be filled in for each variable are then designated via the variant* properties of the VariableFeature.
• Finally, the distribution of values is determined by the strategy property of the CombinatorialDerivation and the cardinality properties of each variable.

### Representing Random Mutagenesis

In the case of random mutagenesis, if I'm understanding your design correctly, you would represent it with a CombinatorialDerivation as follows:

• The template is Component of type DNA with the original sequence. Each site designated for mutagenesis can be designated with a SequenceFeature.
• For each of the mutagenesis sites, create a VariableFeature in the CombinatorialDerivation with the corresponding SequenceFeature as its variable and a set of variant values for each of the mutant options set by your primers. The cardinality is probably one (if every site has to be hit by something in your protocol) or zeroOrOne (if sites might or might not be hit).
• The strategy for the CombinatorialDerivation is sample, since only a few of the many possibilities will actually be realized.

### Representing Samples and Characterized Constructs

Now, when you take it to the lab, you can represent your aliquot with an Implementation whose wasDerivedFrom points to the CombinatorialDerivation, representing the fact that you've got a randomly generated library whose contents are not precisely known.

Finally, once you've got your isolated products represented as Components, there is a recommended best practice to use wasDerivedFrom links to connect the derived Component and its varied Features back to the CombinatorialDerivation and its template. If you make a Collection of your results, the Collection should also link to the CombinatorialDerivation. This should then capture the relationship between all of the products, their associated data, and the original mutagenesis design.

• I have some code for doing a similar task that I'm happy to share if that's of interest; it happens to not have yet been posted publicly yet, but I can quickly clean it up a bit and do so if desired. Apr 2 '21 at 14:49
• No need to rush posting of the code. I'm working toward the framework outlined in my question, but have a lot of other things to do first. I just wanted to make sure I was pointed in the right direction. Apr 3 '21 at 12:39
• I do have one clarifying question/comment: From the "Representing Random Mutagenesis" part of your answer, if we are going to use mutagenic PCR to make the protein variants, then every base in the protein coding sequence would be a potential mutagenesis site. So, I would need to define ~1000 SequenceFeatures, one for each base in the protein coding sequence. Is that right? This seems a bit cumbersome, but but not too hard to write code for. Does the idea of a SequenceFeature for each base in a protein coding sequence raise any red flags for you though? Apr 3 '21 at 12:50
• @DavidRoss I think I misunderstood your protocol: I thought it was something like this protocol for targeted swaps with a random subset of a fixed set of variations. If you're randomly varying every base in a large region, then making a SequenceFeature for every base in the sequence does raise a red flag to me. I don't think we've worked out a best practice for this case yet, but my thought would be to mark the whole region as one SequenceFeature and tag it with a variant of all NNNNN.... bases Apr 3 '21 at 17:18
• That way, you're saying "replace this region with indeterminate bases" and any variant you find will be an appropriate realization of that specification. Apr 3 '21 at 17:18