WEBVTT

00:00.000 --> 00:02.040
Hi, I'm Katie Doroshek.

00:02.040 --> 00:05.160
I am coming from the University of Washington from the Paul G.

00:05.160 --> 00:21.540
Allen School of Computer Science and Engineering with the Molecular Information Systems Lab, where we are really interested in doing interesting things with storing information in DNA and different types of sensing that kind of appeals to the DIY audience a little bit.

00:21.540 --> 00:36.460
So the project that I'm going to talk about today is called Porcupine, which is doing rapid and robust tagging of physical objects using DNA with highly separable nanopore signatures, or in a little bit more accessible terms, we tag stuff with DNA and we use nanopores.

00:36.460 --> 00:38.920
That's really all we're talking about here.

00:39.880 --> 00:45.400
So when we're talking about molecular tags, we are using DNA to identify physical objects.

00:45.400 --> 00:58.900
This is kind of in, could be in the same world as QR codes and RFID tags, but essentially we want to be able to tag an object with DNA, ship it or store it somewhere, and then be able to read it back on the other side and say, is this the same object?

00:59.360 --> 01:00.720
What's the information in the tag?

01:00.720 --> 01:02.020
Or is it completely wrong?

01:02.360 --> 01:05.680
And some applications of this include tracking and provenance.

01:05.680 --> 01:11.560
So you might have a high value item that you want to be able to make sure it's the same at the beginning and end of the transaction.

01:12.400 --> 01:15.080
Secret exchange and counterfeit detection.

01:15.280 --> 01:21.580
So maybe you've got a set of pills and you only want to be able to sample a few of them at a time.

01:21.780 --> 01:23.980
You could do that with a system like this.

01:25.680 --> 01:30.760
And we ended up using the Nanopore MinION device to detect these molecular tags.

01:30.840 --> 01:39.080
Some of our system requirements were that we wanted this to be DIY end-to-end by non-experts and not require a full biolab.

01:39.080 --> 01:46.160
I myself am a computer scientist and this is something that I can do with maybe a little bit of supervision, so it's not too challenging.

01:46.420 --> 01:51.720
And we wanted to be able to generate arbitrary tags on demand without having to do more DNA synthesis.

01:51.820 --> 02:06.900
This is one of the most expensive parts of encoding information when using DNA and so if we can do that ahead of time and just be able to copy it instead of having to generate new DNA for every piece of new information, that can save a lot of cost.

02:07.720 --> 02:12.960
We wanted to be able to decode quickly and accurately and also use minimal special equipment.

02:12.960 --> 02:17.280
So the Nanopore really fits pretty well with this kind of application.

02:19.820 --> 02:26.900
One challenge for typical sequencers is that they're often inaccessible to pretty much everybody except for very, very well-funded labs.

02:27.000 --> 02:34.900
These cost anywhere from tens to hundreds of thousands of dollars, which doesn't necessarily mean that they're bad, but it's just not very useful for DIY.

02:35.160 --> 02:38.000
And they're pretty large, they sit on a big bench top.

02:38.000 --> 02:46.780
I'm sure many of you have seen them before, but it's really hard to compare to this candy bar-sized device that can just be plugged into your laptop.

02:48.320 --> 02:51.200
And here's a picture of it plugged into a laptop.

02:51.300 --> 02:58.740
All the things that you need to run this are very small, like pipettes, a small centrifuge, so it doesn't require the whole lab.

02:59.080 --> 03:05.500
And just to briefly run over how this works, I took this diagram from a Nature article.

03:05.720 --> 03:19.260
Basically, there is this thin membrane that is present with little nanoscale pores, and there's an ionic current that is being run across this thing, and the current is being measured over time.

03:19.440 --> 03:27.800
And then the DNA is prepared such that there is an enzyme that will unwind the DNA for you, and it will flow through this pore.

03:27.860 --> 03:38.900
As the DNA gets unwound and is flying through, the current changes a little bit, and so you can go back and tell what DNA was in the pore based on what the current looks like.

03:38.900 --> 03:48.780
There's this little diagram in this corner here that shows basically different ionic current traces for each base.

03:48.800 --> 04:01.100
Now typically these will all be concatenated together, and we'll go back up to this open channel state, but it's really just a time series of ionic current measurements instead of actually directly reading the bases.

04:04.060 --> 04:17.900
So when we are creating a molecular tag within porcupine, what we start out with is just like any other digital tag, any RFID tag or QR code or anything, it's basically just digital information, a bunch of bits and ones and zeros.

04:18.300 --> 04:21.940
And each different bit is assigned a different type of DNA.

04:21.940 --> 04:30.340
So what will happen is you've got physically a little vial of this particular set of molecular bits that we call them.

04:30.460 --> 04:38.520
So when you have a bit that is one, you'll pipette that bit into the molecular tag mixture, and if it's zero, you completely leave it out.

04:38.520 --> 04:43.180
So we're really encoding information via presence or absence of these different types of DNA.

04:44.040 --> 04:54.080
Then we will apply this tag mixture to an object when dehydrated, ship it or store it somewhere, and then rehydrate the molecular tag using a buffer solution.

04:54.080 --> 04:59.460
We'll then load it into MinION and read it out using some software that we created.

05:01.060 --> 05:08.800
When we are actually creating these molecular tags, we're not just encoding the information directly, we've kind of got a step in there that is adding some error correction.

05:08.800 --> 05:21.440
So we have a digital tag that's a little bit shorter, code word that's longer, that has some additional bits in order to add some error correction, which I'll talk about more later, but then we are going to the molecular bits and the molecular tag.

05:23.820 --> 05:30.480
And a single molecule is made of a unique sequence and a specific length.

05:30.480 --> 05:36.080
So this is the part that lets us create more bits without having to sequence to create more DNA.

05:36.200 --> 05:45.000
So we have our barcode sequence at the very beginning of the strand, then a spacer, and then another barcode sequence and a sequencing adapter.

05:45.200 --> 05:51.800
And typically when encoding information in DNA, the information is recorded throughout the entire strand.

05:52.120 --> 05:59.180
And so I often get asked, why wouldn't you take advantage of the incredible density of DNA to make this happen?

05:59.760 --> 06:05.280
And really this comes down to creating more bits without having to synthesize more DNA.

06:05.280 --> 06:19.680
We start out with our nice little well plate of 96 sequences, and if we just add two different lengths, we have 192 mole bits without ever having to go back to ask IDT for more short strands for us.

06:20.880 --> 06:26.640
And then the second part of it is that having this unique identifiable region means that we can avoid base calling.

06:27.240 --> 06:34.540
So when we turn this complicated nanopore signal into bases, it takes a very, very long time and it's very complex.

06:34.900 --> 06:42.880
And that is the largest source of the error in the pipeline for working with nanopore data, where we actually have a much simpler problem.

06:42.880 --> 06:48.260
We're not trying to identify any DNA, just the DNA that we know is already there.

06:48.260 --> 06:53.560
So we can turn this into a classification problem instead of a decoding problem.

06:53.560 --> 06:57.480
That saves a lot of time and increases our accuracy pretty dramatically.

06:59.720 --> 07:03.940
And we design molecular bits to have distinct nanopore signals.

07:04.300 --> 07:08.920
We do this using a tool called Scrappy that is produced by Oxford Nanopore itself.

07:08.920 --> 07:16.860
So we can give it a sequence, it will produce a theoretical signal, and then this is the actual nanopore signal.

07:16.860 --> 07:18.840
And we didn't really cherry-pick one of these.

07:18.840 --> 07:31.840
They kind of all look similar, maybe a little bit stretched or narrower, but this allows us to really be able to design these sequences to look different, which makes our problem a lot easier.

07:33.120 --> 07:37.520
When we are designing these sequences, we're using an evolutionary process.

07:37.520 --> 07:39.700
We're starting out with an initial batch of them.

07:39.700 --> 07:47.660
We throw our 90 sticks in our virtual well plate, simulate what they look like, and then compute how different they are.

07:47.660 --> 07:56.960
And we will then start an evolutionary process where we shuffle them, mutate them, and then make sure that we're improving things.

07:56.960 --> 08:02.100
It's kind of like a guess and check method that will make these look visually different.

08:03.540 --> 08:11.140
And basically the lighter colors here are more similar, so they look like similar swiggles.

08:11.140 --> 08:16.600
And then you can see that this guy looks very different from this after this full process here.

08:18.220 --> 08:24.480
I don't want to pretend like this is the first time anybody has come up with anything that is working with raw nanopore data.

08:24.960 --> 08:28.980
There's in particular a group that is working with demultiplexing.

08:29.120 --> 08:43.380
And for anybody unfamiliar, multiplexing is a tool that is used to add barcodes on to a sample so that any reads that you get back out on the other side can be associated with a particular sample.

08:43.380 --> 08:50.760
And then at the end you can go separate things out and make it so that you are only working on your one sample at a time.

08:51.080 --> 09:04.800
And what they've done in this case is taken the barcodes that Oxford Nanopore has produced for multiplexing, they found a subset of them, and then can identify those using the raw nanopore signal.

09:05.900 --> 09:16.540
One challenge that they have is that they didn't have the ability to design them specifically to identify them later, meaning that they are working with a much more challenging problem than we are.

09:17.300 --> 09:21.320
But it's a pretty cool tool and it's been very useful for folks.

09:22.740 --> 09:30.080
And then another one, it's currently you can't just go buy multiplexing barcodes for RNA.

09:30.380 --> 09:35.640
And so there's a group that developed four barcodes that they could then identify, which is really similar to what we're doing.

09:35.640 --> 09:39.560
We kind of developed it independently, but it is a similar process.

09:42.060 --> 09:46.360
However, and the way that all of these work is kind of classifying them similarly.

09:46.360 --> 09:52.520
We're trying to just identify what little barcode is present in the individual reads.

09:52.780 --> 10:06.740
Our training data, we label the squiggles using sequencing data and then spread all the bits across a bunch of different runs, then test data with half of the bits, and we ended up using a five-layer CNN with a fully connected layer and softmax.

10:06.740 --> 10:13.340
And this is all stuff that I'm happy to answer more questions about in greater detail later if desired.

10:14.840 --> 10:17.740
Our classification accuracy is very high.

10:17.740 --> 10:23.560
And the only reason that I actually say this is to show you that identifying mole bits is a totally non-issue.

10:23.560 --> 10:28.100
Our training accuracy is like 99.9 something, validation 97.7.

10:28.100 --> 10:34.440
It's kind of to the point where it's not really an issue for us to be able to identify the mole bits.

10:34.440 --> 10:40.660
However, identifying what the tag is based on the mole bits can be a little bit more challenging.

10:41.780 --> 10:50.000
Now that we have our sandbox, we've got our molecular bits and we have a way to read them, the question is what should we encode and how should we encode it?

10:50.000 --> 10:59.420
We have our 96 bits and we have kind of our framework where we might want to expand our digital tag, but we have to think about how we might want to do that.

11:00.280 --> 11:05.920
The most naive encoding scheme of course is mapping one digital bit to one molecular bit.

11:06.240 --> 11:11.300
And this is of course not ideal because one bit error means that you completely get the entire tag wrong.

11:11.680 --> 11:15.540
And so we want to add some error correction as alluded to previously.

11:16.200 --> 11:21.840
What we'll do is we'll reserve some bits for the tag and then use the rest of them to correct errors.

11:22.040 --> 11:32.540
And in our case we picked a 32-bit message and then multiplied by a 32 by 96 random generator matrix to produce a code word which then gets put in the molecular tag.

11:32.860 --> 11:41.440
And this allows us to get up to 18 bits wrong, which is an enormous amount without ever worrying about whether we're going to get the tag wrong.

11:41.680 --> 11:44.320
This is something that can also be chosen depending on the application.

11:44.320 --> 11:49.080
It's just an example that we have for basically our paper that we wrote.

11:49.080 --> 11:55.980
But if you wanted to take these 96 bits and use them in another way, there's nothing that would stop anybody from doing that.

11:58.120 --> 12:05.420
So just to briefly walk through encoding an actual message here because it's a little bit hard to kind of to connect the two.

12:05.420 --> 12:07.880
We'll start out with our digital tag here.

12:07.880 --> 12:12.760
We've got, we've encoded, we had to encode our molecular information systems lab of course.

12:13.580 --> 12:16.500
And then we added our bits for the code word.

12:16.860 --> 12:21.580
Then we'll go through the process of actually encoding and sequencing and doing all the wet lab stuff.

12:21.720 --> 12:26.460
And then what we'll get back out of the sequencing machine is a set of read counts.

12:26.460 --> 12:31.760
So how many, how many times did we observe that particular molecular bit?

12:32.100 --> 12:38.340
And then we have to decide like at what point do we want to set it to one, but at what point do we want to set it to zero?

12:38.640 --> 12:44.020
So we have a threshold here where anything that is above this line we'll set to one and below it is zero.

12:44.040 --> 12:46.320
And then we get a few incorrect bits.

12:46.320 --> 12:47.640
This is okay.

12:47.640 --> 12:51.820
We have fewer than our 18, so we'll still decode correctly.

12:51.820 --> 12:56.860
But we also realize that there's kind of a large variation in read counts here.

12:56.920 --> 12:58.880
And we found that this was reproducible.

12:58.900 --> 13:00.300
Still cannot figure out why.

13:00.300 --> 13:05.280
I'm more than happy to talk to people about why this might be happening because we've tried a million things.

13:05.860 --> 13:13.620
But it's reproducible so we're able to rescale the counts and essentially what happens is that we get no bit errors after doing that.

13:13.760 --> 13:17.580
And we recover our final, final decoded message here.

13:19.660 --> 13:26.120
So our final results, we are talking about how long does it take to actually decode a message.

13:26.120 --> 13:27.280
Do you need to run this for hours?

13:27.280 --> 13:28.220
Overnight?

13:28.320 --> 13:28.920
Seconds?

13:28.920 --> 13:29.700
Minutes?

13:29.700 --> 13:36.060
And so what we have here is on the x-axis we've got our sequencing runtime in seconds in the log scale.

13:36.060 --> 13:39.860
And then we've got our code word distance over here.

13:39.880 --> 13:45.100
So you can imagine that in reality you could possibly get all 96 bits wrong.

13:45.100 --> 13:55.060
However, because we have used error correcting codes, the maximum or the minimum distance between all of them is 18 bits.

13:55.060 --> 14:02.460
So if you get 19 bits wrong, in some cases you'll actually get a totally different code word.

14:02.460 --> 14:08.880
So in this context with the error correction, the maximum number of bits can be anywhere from like 18 to 20-ish.

14:09.860 --> 14:23.200
And so what we have here is, as expected, as your sequencing runtime goes down, or as your sequencing runtime increases, the chance of you getting the message wrong goes down because you've absorbed enough reads to be really confident.

14:23.240 --> 14:30.400
Each x here is an incorrect decoding and then our dashed line is guaranteed correct decoding with error correction.

14:32.360 --> 14:41.520
And we are able to decode with only about 10 seconds of data, which is really nice because with nanopore sequencing you can just stop at any point.

14:41.520 --> 14:46.520
You don't have to keep running this for hours and hours because the process doesn't require you to do that.

14:46.520 --> 14:51.260
It's just physical strands flowing through this membrane.

14:52.320 --> 14:58.020
And what this means is that we can do pretty close to real-time reading.

14:59.360 --> 15:03.560
Another cool thing is that we've made the molecular tags shelf-stable.

15:03.560 --> 15:09.840
This is really important for basically any kind of application you can think of where you'd want to tag something for more than a few minutes.

15:10.640 --> 15:19.280
You want to be able to ship or store your object, but then afterwards we can rehydrate it and then read it, and that has been a crucial part of this.

15:19.280 --> 15:23.660
So we'll prepare this take for sequencing immediately after assembling the tag.

15:23.720 --> 15:36.520
This is a step that takes about one to two hours, so we are front-loading all the lab work on the writing side, meaning when you go to read it you don't have to spend hardly any time at all, like seconds.

15:37.440 --> 15:46.860
We also sent a tag in the mail and just through regular mail like USPS to California and we could recover everything after about four weeks.

15:46.900 --> 15:55.880
I'm not sure what the upper bound is on how long these things will last, but we basically got the same sample back that we sent.

15:55.880 --> 16:14.440
So I think there's a lot of work to be done and figuring out what are the bounds on what kind of surfaces these things can be attached to and how long they will last, but initial results are kind of promising for these being actually stable.

16:15.200 --> 16:23.420
And then because we're attaching the sequencing adapter ahead of time, the part that's actually doing the unwinding of the DNA, you can't get any contamination.

16:23.420 --> 16:31.000
It's just not possible to happen after that process is completed because you have to have that adapter in order for it to be read.

16:31.300 --> 16:40.460
And so putting it on a surface means that you could have someone's like environmental DNA or anything and it will still mostly read out fine.

16:42.120 --> 16:47.600
Another big question I get is like, okay cool, but what can we actually use this for?

16:47.620 --> 17:01.080
And we haven't really explored the extent of what kinds of surfaces or anything that this could be used on, but we can think of things that are traditionally difficult to tag with QR codes and RFID codes and such.

17:01.400 --> 17:05.560
This might include things like liquids, maybe food with some safety testing.

17:05.560 --> 17:10.040
We make no claims about it actually being safe for food without testing.

17:10.260 --> 17:12.560
Paper and commodities.

17:12.760 --> 17:19.780
So maybe you have a supply chain where you want to take everything and then only read back a few of them.

17:20.080 --> 17:25.420
You can really amortize the cost because reading is going to be the highest cost in this process.

17:26.860 --> 17:30.880
And there's some prior work that demonstrates some DNA encapsulation methods.

17:30.880 --> 17:40.080
These methods add some time and effort to the process, but they could be used to further extend the life past what this would normally live on its own for.

17:41.560 --> 17:48.540
So in summary, we have our molecular tagging system that uses our DNA to tag physical objects.

17:49.000 --> 18:00.900
The design uses an evolutionary model for nanopore orthogonal sequences, making them look visually as different as possible and essentially trying to make our classification problem easier.

18:01.260 --> 18:03.420
And then we classify using a CNN.

18:03.560 --> 18:12.580
We will encode and decode using our random generator matrix, but again, agnostic to any type of encoding that you want to use.

18:12.580 --> 18:15.740
And we can get readout with less than 10 seconds of data.

18:16.360 --> 18:22.040
Future work might be like using a generative model to design these instead of an evolutionary model that's a guess and check.

18:22.300 --> 18:36.640
And also considering these different kinds of encoding and decoding methods that might be able to take advantage of different parts of the known error in the system, which we haven't really done at all.

18:37.140 --> 18:44.140
Another thing to consider, especially because this is a security-minded conference, is what kind of security this actually provides.

18:44.320 --> 18:49.760
And one nice thing is that DNA is invisible.

18:49.760 --> 18:55.500
However, security by obfuscation is not always the right kind of security.

18:55.500 --> 19:04.040
It can be good in some circumstances, but you're never going to fool anybody who's really dedicated to getting access to this just by making it invisible.

19:04.540 --> 19:19.980
And so there are applications where this would be useful and maybe not, and I'm really curious if anybody has thoughts on maybe this sparked some kind of interesting application that we haven't thought of yet.

19:21.260 --> 19:30.540
I also just wanted to give a really quick plug for the other things that our lab is doing, because I think it's really cool and I only work on a very small segment of this.

19:30.940 --> 19:46.340
Our lab works primarily on something called DNA data storage, where we're trying to store information in DNA and read it back later, but not in terms of presence or absence, but actually encoding information in the bases of the DNA.

19:46.520 --> 19:55.920
And this has been pretty far developed, but still, the writing aspect is very expensive.

19:55.920 --> 20:02.560
The cheapest I've ever seen DNA for is like seven cents per base, which is astronomical when you consider large volumes of DNA.

20:03.240 --> 20:09.860
And that's been a pretty large barrier, but it's part of our, I think, what's a really cool, cool idea.

20:10.500 --> 20:11.740
DNA security.

20:11.740 --> 20:14.080
So this is part of our lab called CyBioSecurity.

20:14.080 --> 20:22.680
One paper that came out recently was talking about the GenBank system and some of the security implications.

20:22.680 --> 20:32.000
You also have microfluidic automation, so how do you abstract away some of the tedious parts of working in the lab, and then DNA circuits.

20:32.300 --> 20:37.780
And of course, nanopore sensing is what I personally work on.

20:38.800 --> 20:46.920
And with that, I will wrap up and I'm happy to take any questions in the live Q&A after the session.

20:46.920 --> 20:48.140
Thank you.

