Doing drugs doesn't help none. I was tormented my whole life. David had said, there's a lady in here that has addiction and she wants to get rid of it and wants to be healed. And he goes, you're in here, so come to the altar. And I ran to the altar. I got on that stage, he asked me what it was. I yelled, meth. And my life has changed ever since then. I can't even look at meth anymore. Complete freedom, peace, joy, happiness, love that I've never felt before until that day. It was amazing. It was really amazing. Oh, I've been on fire. I've been on fire. I got ordained as an evangelist. I attend church. We do Bible studies. I teach my ex-husband because he just got saved. And I'm just, I'm hungry. So I'm always reading my Bible and talking to the homeless because that's where I came from. And so, you know, I try to give them my testimony and help them. And that's what I do my whole life. That's all I focus on. Sabina Hernandez not only received complete deliverance from her addiction to meth, the Lord also healed her of hepatitis C. She submitted the medical documentation to our ministry, verifying her miracle. Additionally, many members of her family were saved, including her ex-husband, who was also set free from a drug addiction. I'm Sabina Hernandez and this is my Miracle Moment.


In today's video, I'm going to be going over how to send out an email from the Dynamics Pro. I'll also be showing you how to send out an email blast to multiple people through Client Touch. So the first thing I want to go over is your email template area. Your email template area is in the Action Center area. And if you go down the first column, you'll see email templates. So this is basically a storage for email templates that you may send over and over again. So for instance, I have this basic Homebuyer Workshop email template. And this is just an example. So you'll see the name of the template. So the recipient will not see the name. This is just for your reference, the subject line. Now this is the subject line that will be in the recipient's email. And then you'll notice that they have these merge fields, which are from right here. And you'll see it's real weird. It says Percentage Percentage Header Percentage Percentage. And then you'll see Percentage Percentage First Name Percentage Percentage. And then of course, this is just placement text right here. And let me go ahead and correct that because it's going to bug me. And then you have the Percentage Percentage Footer in here. So the way that you insert these, and you may not understand what these are right now, but first I want to show you how to insert these, is if you go to this merge field, click on the dropdown, and then go down to special fields, you'll see the header template. And if you click on that, it basically inserts this Percentage Percentage Header Percentage Percentage. Now what this does is this will automatically insert the header of the email. So usually this is your picture, your company logo, your name and your title. And then the footer is of course at the bottom. And this is your email signature. Now let me show you where this is. So if I go back down here and I just hit, actually let me go ahead and hit save. You'll notice up here in the email template area, there's these tabs that say header footer. So if I click on header, you'll notice that up here at the top, it says whenever we see Percentage Percentage Header Percentage Percentage in your email templates, we'll replace it with the content below. So that's what that is. So how we did the merge field and we put the header in there, it will automatically insert this wherever the Dynamics Pro will insert this wherever it sees the header merge field. Now the footer, whenever we see Percentage Percentage Footer Percentage Percentage in your email templates, we'll replace it with the content below. So basically the system will replace this merge code with what's down here.   Again, so the Percentage Percentage Header Percentage is going to be replaced with the picture and then the footer will be the email signature. So let me go ahead and show you how to send out an email and then I'll show you what it actually looks like. I'm going to click on add contact. You type in the first and last name and then the email address. Click on save. Now you'll notice that there's a great box around the email. So if you try to actually send out an email by going up here to the actions dropdown and click on send email, you'll notice that it says this contacts email address is not opted in. Cannot send email. Now the way that you opt them in because Mark has given me permission to send them emails, all I'm going to do is click on this envelope to the right. It's a green circle with a plus in the middle. You're going to click on it. It says this system is permission based email system where the rules are strictly enforced. This means that you can only send emails to people who have given you prior permission to send them emails. I understand and agree and continue that I will not send them spam. I absolutely have permission to send emails to this contact and add to opt-in list. Now you'll notice that there's a green box that goes around this. Now you can send out an email. So if you click on the dropdown, send email, now it brings it up. So if I want to use this template, if I click on this dropdown, it'll bring up all my email templates and then this is the one that I was looking at just a few minutes ago. You'll click on it and it will actually put this information in there. Again, this is where the percentage-percentage header was and then down here, this is where the percentage-percentage-footer-percentage-percentage was and then now I can send this email out. Next, what if I don't want to use an email template? What if I just want to send an email and I just want to type something in there? So you could skip past this part, go down the subject line. This is a test email and then what you can do is you could actually type in percentage-percentage-header-percentage-percentage. You could even type in percentage-percentage-first-name-percentage-percentage. Now what if you can't remember that? You could just click on this merge field, contacts-first-name and then it's going to automatically insert that in there. So then I'll put a comma after it and basically it's going to insert his first name which is mark right here and then it's going to put my header which is the picture. This is where your email message goes and then percentage-percentage-footer-percentage-percentage. Now just remember these two, these two are a super easy header of an email and the footer of an email. Now you're kind of like, alright, well this kind of looks weird. Why didn't it populate the picture? Any time it sees this it's going to automatically populate the picture. So if I click on send email, I'm going to go to my split screen real quick and then go back over to this demo account that I have for mark. So the first email that I sent, this was the email template and this is the one that I composed myself. So if I click on this one and you'll see it put my header right here and then my footer.  This is just as an example. Now if I go back, now this is the one I composed. You remember it was kind of real weird. I put in the percentage-percentage-header-percentage-percentage. So if you click on it, you'll see that it actually does replace it. So I did want to show you that and let's see here. Let's go ahead and slide this back over. Now if I go down here and I click on this little analytics thing, it'll show me when the email was sent and then when the email was actually opened. So it actually shows when mark opened that email. And you do this by when you're in the contact card you go down to the notes and then you hit this and it'll open it up. You can actually see the analytics to see how many times someone opens something up. That's good for subject lines and things like that to see if people are opening up based off subject lines and things like that. Let's just say though that you want to send an email to all of your clients. Maybe like a newsletter or whatever it may be. So if you click on client touch right here, you can actually, client touch is when you're working with a group of people. So client touch. And then if I go over here to this button over on the right hand side, it says add everyone. I could click on add everyone. And I could even go to this manage and say, all right, I want to remove Jessica Curry. I want to remove Edward Johnson. So I want to remove all these people. So you could actually remove those people if you wanted to. You just click remove check from work group. And then it'll change from 363 to 361. So if I click remove check from work group, you'll notice that this goes to 361 right here. All right. So that's a way of removing people from the contact. So then if I go to the actions tab, I'll say, okay, well, what do you want to do with this group of people? I want to send an email blast to everybody. And then I'm going to select a template by hitting the dropdown just as I did before. Select it. And then I can add an attachment down here at the bottom if I want to. And then I could also send this email to the other contact. So if there's a spouse or something in the contact card like Mark and Donna Pickens, then you'll be able to send it to Donna also if you have her information in that contact card. And add a note about this email blast. I always just check both of these. And then you could send the blast now or schedule the blast for a different time. So if I click on schedule blasts and I'm working at, you know, 11 o'clock at night, I could actually say, all right, well, Monday morning at 7am, I want this email blast to go out. And then that's how you would send out an email blast to a group of people. And a lot of people say, well, if I put that in there, will everybody see the other emails and that email addresses with the group of people? And the answer is no, it will just send it off. It looks like a one off email. And it kind of like basically it doesn't do this, but it's like a blind carbon copy where it won't show the other emails in the group. So you don't have to worry about it. It looks like it just went out to one individual. So that's how you'll send out an email inside the Dynamics Pro. And I do highly suggest going to the homepage, going to the video tutorials, and then just going over managing your contacts and email. And then you could also go down to the How Do I? I mean, really, it'd be a good thing to watch all these just to see how the whole system works. Thanks for watching.


Of course, as soon as I give the signal to begin recording, we get some people coming in. Well, you've ruined my nice, quiet room that I picked, so I would have no audience to interrupt my flow. So this is an evolution of a talk that I gave at Picon Australia earlier in the year. Did anyone see that talk at Picon Australia? Okay, that's good or bad, I don't know, we'll find out. So I have a much bigger time slot than I did in Australia. So the target of the talk is for people who haven't done a lot of computer science engineering degrees. So it's trying to educate people in state machines who don't really know what a state machine is. The drama that I've had is that now that I've got all this time, I have to go and do add on some of the more advanced topics. So the target is still very much people who don't know what a state machine is, and by the end of it, you might not really know what Python is, but I'm still very hopeful that you'll get something out of it. So a few things have changed since that conference. The company I was working for has changed names for reasons of transparency. I've decided that the talk, I should focus the talk contents a little bit, so I've added 20 slides. And I've got a few more graphics, and there's actually a little bit of color in this one. I have done my best to make my slides nice and easy to read, regardless of how uncaffeinated the projector is feeling today, which is fairly. So I need to be really clear upfront that the library I'll be talking about, Automat, is not my library. These slides and examples, they're definitely my fault. So what is a state machine? At a very abstract level, a state machine is anything, we'll deal with programs that has a variable that changes values. So you've got a program with foo, and it starts off being bar and changes to bats. That is a state machine. Not a very useful one, but it is one. So any program that's got variables that change is a state machine. So all of your programs are state machines, and the code that you are writing to modify the values of those variables, it is handcrafted, it is a handcrafted state machine. There is a subset of state machines that can be modeled in a structured, formal way. And the reason you wanna do that is because if you've got something that you can model in a nice structured way, it means that it's repeatable. And it means that the process of modeling, coding, and testing that can be done in the same way over and over again. So instead of coming up with the spoke code for your state machines, you can let the library do most of the work, and you can worry about the interesting stuff. Often what happens when we're coding something is that we're solving a problem, and we are writing a state machine, we don't really think of it in terms of a state machine, and it means that some of the problems of state machines aren't apparent to us. So if you've got one variable and it's a boolean, your state machine can only be in one of two states, or if it's Python, three states, because it could be nothing. If you add in a second variable, then you've got three by three, so you've got nine states. How many variables do your programs normally have? A little bit more than two. You get this wonderful combinatoric explosion where if you had to map out, I've realized now that I'm annoying the video person, if you had to map out all the possible states of your program and had to try and test each one of those states, you'd go nuts because it's just not possible. So part of the reason of doing a structured state machine is that you don't have to test all those possible states because you know that there's only a subset of those states that your machine can ever get into. There are state machines that model real-world things really well, and there's a lot of examples of real-world things that engineers have modeled as state machines, and instead of the...  So things like traffic lights are really good examples of state machines. There's red, green, orange flashing maintenance mode. So they've got a certain number of states. Things like train guidance systems, for example. The way that most train systems are modeled is that you break all of your tracks up into segments. Over in Queensland, it's five kilometres segments, and in those segments, you either have no train or one train. That's it. You can never have two trains in the one segment, and it means that when you model it like that, it's really obvious when you get outside of your state machine and something's gone wrong. It's a really good way of being able to describe your problem domain at times. You can go to your customer, describe their problem in terms of a state machine, do it in a nice, pretty diagram, and then code it. And it means that you've got nice traceability from your pretty diagram that you've done at your requirements analysis all the way through to your implementation, all the way through to your tests that are generated at the end. From a coding perspective, what it means is that... The biggest advantage is that you don't have to write a lot of state testing code, and if you add in new states later on, Queensland probably will end up adding like a fourth colour to our traffic lights, for example. You don't have to go and modify all of your previous code. You only have to add in the new transitions from your old states to new states. So there are roughly 1,000 libraries on PyPy for implementing and helping implement state machines in Python. Automat came to me to be quite interesting because it solves a lot of problems in a particular way. It doesn't try to force state machines down your users' throats. When you use Automat to write a state machine, the users of your library class object, they don't see it as a state machine. They see it as a plain old Python object that's got some functions that you call on it that do things. And if you call those functions in the wrong order, you get an error back. So it really does that whole object-oriented thing of encapsulating the solution to the problem and hiding it within your object. It's by the author of Twisted. Twisted is a network protocol library for Python. Twisted historically, not so much these days, but historically is used lots and lots of callback codes. Twisted is an asynchronous networking stack. So it means that you send some bytes down the socket and then you wait for the kernel to tell you that they've been sent. Okay, I can send some more. And the way that you do that, at least in slightly older names, is that you pass a function that will get called on you. And funnily enough, when sending a HTTP request requires you to send a function, get a callback that you've connected, send another function saying, I can write the headers. Okay, I can write the headers. Send me another function callback when I can send the body of the request. Send me another function when the server has sent me back the response. It actually is kind of easy to get yourself lost in all that stuff. And the author of Twisted designed this state machine library to get themselves out of trouble. One of the interesting ones is TLS or SSL. One of the interesting protocol requirements that TLS has is that at any point in time, either peer, because it's not quite server, it's very much peer-peer, either peer can ask for a renegotiation of the underlying encryption keys. So you are reading from the server and the server says, no, I need a new encryption key. So you go, oh, okay, I was writing. So I'll keep what I was writing to you at the side. And then I'll start this new state machine over here to send, do the three-way handshake with the encryption keys. And then I'll send the data that I previously had. And you can very much get into a state where like one of the error codes for SSL write is SSL write once read. So your program is all set up to do a write and then the server said, no, you gotta do a read now. And the same thing with read once write. So it's really, really easy in seemingly simple applications to get into states that are very confusing. And instead of writing more and more code to handle all these states as they pop up, the methodical state machine way is to explicitly list those states and explicitly list those transitions between those states and get the code generated for it. So the example that I'm going to use throughout the rest of the talk is a kettle. All state machines have a very special state, the starting state. I'm going to model three states for a kettle.  Now, there could be lots and lots of states in there like it's full of medium hot water or it's half full of cold water. That's fine, and that's an ongoing thing. For the purposes of this talk, these three states provide enough interesting things to look at. But the important thing there is that we are, even when we're doing methodical state machines, we are modeling the real world.  So we have our transitions from empty to full back to empty. And if you think of the kettle as one big state machine, so draw a big circle around the whole of it, those inputs to the state machines fill, boil and pour. So those, if you've got a kettle object, you can think of those fill, boil and pour as methods on your kettle object. You fill it with water, you press the boil button and then you pour it. So that's the underlying state machine we're going to be using as the main example for the rest of the talk. I didn't say before, we've got plenty of time, so please ask any questions and make sure I remember to save the question back to you for the recording. So, it's a kettle, it's got three states, it's got three transitions. How hard could it be to write some code to handle that? Now, I apologize a little bit because I've had to get rid of all the white space to make all of this fit into one slide. But this is a, it's not a terrible first attempt at writing a by hand state machine. So if you see our init up there, I've decided to use two variables to hold our state. Whether or not, and they're Booleans, so they're nice and simple. Whether or not we're full and whether or not we're hot. You can see I've got the fill, boil and pour methods, so the three state transitions and they've been turned into methods. And I've got some code there that's like, you can only boil a kettle if there's water in it and if it's cold, you can't re-boil the hot kettle, all that sort of jazz. There are a number of errors with that. Example up there, can anyone spot any of them? Yep. The other one here is a pour after I pour out the hot water and give you back the hot water. I don't actually reset it to full, so I could just keep pouring out the kettle and it apparently would keep pouring out hot water for you. So it's those particular tests, so it's particularly the tests to make sure that you're in the right state before you accept a transition. Automat will handle all of that and it will also handle changes to new transitions for you so that you can't mark that up. So now I'm going to go through the example and how you would do it with Automat. So the class that you need is the methodical machine. We have a kettle and it's under machine equals methodical machine. So the under is definitely important. Any of the variables that we have with an underscore start with an underscore, it means that they're private. We don't expect public users of our class to interact with that. So it gets back to that whole idea of encapsulation where we are solving a problem with the state machine and that's internal private details that our customers don't need to know. We declare the three states that we've got. We don't actually have any code in these states. They are just functions there as reference points for the library.  And we use the machine decorator to declare them as states and the only interesting one is the initial equals true. As I said at the start with our first diagram, all of our state machines, they have to have a starting state. If you try to instantiate a kettle, if you try to instantiate any of the Automat state machines that don't have a start state, it won't let you. So you can have only one, you must have one and only one start state. And this is the code for the input functions. So the methods on our state machine. Again, these don't have any code associated with them. They are reference points that Automat will hang things off. So we haven't really done much so far. Like we've declared our functions, sorry, we've declared our states, we've declared our transitions. There's no real code hanging anywhere. This is how we wire up our states and our transitions. So the general pattern is at the top there. From our start state, upon receiving a certain input, we transition or enter into a new state. So from the empty state, upon receiving a fill input event, we go into the full cold state. If we're in the full cold state and we receive a boil input, we enter the full hot state. From the full hot state, if we receive a pour, we go into the empty state. So that's like the first real code that we've written. And that's the stuff that actually wires up our transitions in our states and links them together. So the only transitions that our state machine can go under are those three transitions there. If the user tries to do any other state transitions, they'll get an error. We've got an example of that coming up. Any questions? I had to fly here from Brisbane.  So in the normal case, you would use this kettle and I want to point out here that it looks like a popo, a plain old Python object.  The result of that is absolutely nada. There's no errors, there's no output, nothing happens. If you try to do something out of order, so we instantiate our kettle and then we boil it without filling it up. Now I've slightly simplified this particular traceback. I've gotten rid of any magical Python stuff in there. But you get back an error from the Automat library saying from the empty state using input boil, there's no transition. So we have not written any code in boil to say we've got to be full of cold water and otherwise error out. Automat, so we've declared the three transitions that our state machine can have and Automat won't let anything else happen. So all of that code that we had, like are we full, are we cold, excellent. Do all that, you don't have to do that. Where things start getting a little bit uglier is the methods that we have on our object. So we want to fill the kettle with a certain amount of water, for example. So what we need to do there is slightly modify our fill input. So we've got an amount argument that we've passed along there. Now we get onto outputs. So we modify the transition that we've added before. So when we're in empty and we receive a fill, we enter the cold state and one of the outputs that we have is save water. And all save water does is on our kettle saves underwater to whatever the amount that was passed in. So inputs and outputs are chunks of code that get run for us. So basically when somebody does a fill on an empty kettle and it's in the right state, all of the functions in output save will get run. And in this case, it'll be save water. So if we've managed to get water into the kettle, we also want to get the whole water out of the kettle. So here we modify a pour transition. We add the return water pour. To outputs and all return water does is returns self.underwater, which we saved in fill. So that part of it is quite reasonable.  So the drama here is that outputs is a list of functions. So for each of these state transitions, you might want to do multiple things. So the way that Automat does this is that it gives you a list of functions to run on successful state transitions. So we have initialized a kettle. We've filled it with half a liter of water. If only there was a nice library for writing units. Are the output functions run in the order you put them? Yes.  We've boiled it and then we've poured it, but we've also printed out the results of that. And that results in a list with half a liter of water. So it sort of makes sense. We've put half a liter of water in and we've poured it, we've boiled it, we've poured it and we get half a liter of water back. But because outputs is a list, we get a list of results. So that's kind of where the Python Australia talk finished. So we're into overtime now.  So what's going on with that? That might be okay in your application. If you're writing an engineering application and you've got three or four or five state machines all talking together, you might be totally okay with getting a list of results back. That might make sense for you. If you just want to apply in Python object that returns a number, this is the sort of mess that you've got to start getting into. And this is definitely where Automat stops being as Pythonic as it could be. So we haven't changed the return water function at all there. I'm just putting that there because we're using it. I'm adding a whistle to our kettle that goes off when the kettle is boiled. And I'm specifically doing that so that our outputs list has two values in it. The new thing is the collector. So what happens here is that when Automat receives an input, sorry, receives a poor event, is that a, sorry, is that a question? Nope. When, ah, sorry. When we're in the full hot state and we receive a poor event, we'll shift to the empty state. But just before that, we will run blow whistle and return water. And we'll take the results that we get from that and pass it along to collector. So collector as results will receive blow whistle, blow whistle, the result of blow whistle, and the result of return water. Now, as a function, as a plain Python object, it only makes sense for one of those things to have a result. So it's up to you to design your output functions to only have one of them return a result. Otherwise, if you need to return two or three things, then your collector function might return a tuple or it might return a dictionary if you're returning multiple things or it might return like a named tuple or something like that. In this case, we've decided that the whistle won't return anything and the only thing we're caring about is the amount of boiled water. So we've slightly generalized it, but basically we get a list of return results. Blow whistle will be a none and return water will be half a liter of water, for example, and we will filter that list, get rid of all the nuns, and just return the first element of that list. So this is our noisy kettle. We fill it with one and a half liters of water. We boil it, then we print the result. So we have a print tutut in the blow whistle. So, whoops. So we know that the whistle has been called. Obviously, if it was a real kettle, we'd actually hear the whistle, but I'm not gonna do that on the slides. I'm not very keen on presentations that have a kettle whistle. And we get a poor result back, which is just one and a half liters. It's not a list of one and a half liters, it's just 1.5. One of the other things that Automat has recently sort of grown some nicer tools for is the ability to visualize the state machine. And it's kind of an interesting thing because the way that you mostly do these things is you actually start off drawing your diagram like I did at the start and drawing arrows, then transferring them to code. This is kind of the other way around where you've got your code and you're printing out your state diagram machine from that. That doesn't look too good. Apologies, I haven't actually looked at that on that projector before. And I should have turned on the black and white mode. So I'm not a very visual person. You'll see the border around empty is slightly thicker. That's indicating that it's the special start state rather than just saying, you know, start with an arrow next to it. We've got our two other states, the full hot and the full cold. We've got our transitions, boil, fill and pour and we've got the outputs associated with them. So it's one of those things like if you're not entirely sure that you've coded up your state machine in the right way, the visualization might be able to help you figure out that you haven't done something wrong. But it's the sort of thing where you can sit down and go through those state transitions and make sure that you haven't done obvious things like if there was a state sitting off at the side that didn't have any transitions going into it or it only had transitions going into it, that you couldn't get out of it, for example, that could indicate a bug depending on what you're modeling. There are other things that you can do with Automat, so it will, so if you're doing an online thing, an online thing, excellent. I started doing computers before there was this whole networking thing, I'm sorry. It's just big bad fad that I'm waiting to go away. If you're doing an online sales system, a person logs into a website, they have a login session, they've got a cart associated with their login session, they're adding a couple of products to that. Maybe they get called away from the computer for whatever reason and that cart times out, they haven't touched their computer for 20 seconds. You've got a state machine there, so you've got the not logged in state, you've got the logged in state, you've got the cart, you've got each of the products being added to the cart. If you're using an Automat state machine there, if that person times out, you can serialize that state machine into a database record, write it out to the database and the next day when that person logs in, you can deserialize that entire state machine back up and it can have all of their peculiar shopping habits in the cart. So all of the things like discount vouchers, whether or not the person has gone to other sites before they've come to your site, whether or not they've followed a referral link, all of that stuff can be modeled as a state machine and can be stored in the database and brought back when you need it. That is the Automat GitHub URL. They do have some quite reasonable docs. I was more going for docs for people who've not used state machines at all, so I hope that was helpful. And I probably have lots of time for questions, I think. So the visualized graph and what formats it can go in, you can definitely output that in a much more, I'll just repeat the questions, it's cool. It definitely has a lot of output options. So there's SVG and JSON, so JSON might be the interesting one if you were going to do some particular things on it, like if you were going to actually try and parse it for having data and stuff like that for sure. Oh, yeah. So can you nest state machines? You might want to nest, so I'll try and describe nesting state machines. Without trying to cause too much of an international incident, I suppose. When engineers are coding things, it's very common for engineers, and I'm meaning electrical engineers here, it's very common for them to use state machines to describe everything because it's a known system. It's a process that you can follow and you can take your analysis and derive a correct system at the end of the day. One of the things that you might want to do with that is that if you've been in the industry long enough and you've seen a particular tool or a particular widget, you might have a state machine just for that particular widget. And when you're solving a larger problem, you might want to reuse some of those widgets and you might want to reuse some of those state machines and draw them together. There's no explicit support for nesting state machines in Automat, but that's sort of okay because if each of those state machines is just a plain old Python object, then they can call any Python objects they want. So there's nothing explicit in there, but you can do it yourself. Sorry, a whole bunch of hands went up prior. So that will, so how do you get the results? So when you run Kettle.poor, the result that it returns is the list of results. So in this case, when the transition from full hop to empty has happened, it will, Automat will run blow whistle and return water, and it will then pass those along to filter out none and then it will return those results. So from a user's point of view, when you run Kettle.poor, you will get back 1.5 as the result. If you don't have a collector, you'll get back a list of results that you've got in outputs. So you don't, so, no, no, that's fine. So one part of that question is, yes, I'm trying to. No, no, no, it's not a bad question all. So 1.5, the question is on validating inputs that you're parsing. So like if it's a two liter jug and we accept three liters of water, how does Automat help with that? Short answer, it doesn't. So you still have to do some checking there. The other way of dealing with it though is that you could, it sort of depends. Like if you're modeling a industrial kettle that self fills, it will have a sensor and it will model that sensor as part of your state machine. And part of the state transitions that you've got is that you can only keep the tap on while the sensor's off. So it sort of depends. So in this simple example, there's nothing stopped like if the kettle has a five liter capacity and we put six liters of water in it, there's nothing in there that will cover that. For your input validation, yes, because it is just, at the end of the day, it is just a Python object. If you want to validate your inputs and raise an exception, that is totally a thing you can do. So I've not used it directly. I've mostly used it through Twisted. So I do use Twisted for work problems and that's basically where I've seen debugging a Twisted problem when they come across this state machine thing and then you've got to work out the state machine thing to figure out what's going on. So I've not used it directly for my own problems. No, I've only used it through Twisted. And when they, so essentially Twisted is one of the older Python projects and they are at a point now where they've got some really gnarly bugs and they're trying to fix these bugs and one of the things that they're doing is rewriting a lot of their code in terms of state machine so that they don't have if statements at the start of their functions, making sure they're in the right state, making sure the parameters are correct. They make the state machine do all that and they have found a number of bugs by doing that. Automat does not have an end state. No, there's nothing like a particular end state that they have. There's nothing, I mean, it sort of depends on the way that you want to do it but you could certainly have the, like the easiest thing would be just have an internal variable and set it and then check it later. I have all the time in the world. Are there any automatic test generators? So they have some built-in code that helps generate tests but it's not quite there yet. But the thing is that it means that because you're using a library, what it basically means is that when you've divided your system up into this way, you can target your testing at the particular states. Instead of having a plate of spaghetti code and having to work out all the different ways of testing that, you know that the states that you have to test, you've got all your three states and you've got all the transitions coming out to and into those states. So they do have some support for generating like a list of functions that you'll need to fill in. So it's like, you know, these are the states and these are the transitions that you'll need to test but there's nothing there that automatically does that. They have some support but not full support. Can the state itself return the outputs? So one of the interesting aspects, so the way that Automat is designed is that the resulting object that you have is meant to look like a plain old Python object and the user is not meant to know that there's a state machine underneath it. So there is no simple way of asking an Automat state machine what state it's in. They've deliberately made that as hard as possible. So there's no simple function that you can call on Automat to say what state are you in?  And they've done that specifically so that you don't end up producing a kettle that you have to drive like a state machine. They want your kettle objects to be driven like a plain Python object. So there's no real easy way to get the current state of a state machine. I've sort of avoided your question there. I mean, you can make the output functions return anything you like but they make it very hard to work out what the current state of the state machine is. If you add a particular function that only gets called for particular transitions, that's probably the easiest way of doing that. So there is, there's some stuff that I haven't looked at yet which is some tracing code that they've got so that if you're trying to debug a problem and you've got a state machine, it'll actually show you what state it's in, what inputs it received to change to another state. So perhaps the tracing code is the right place to look at for that. So can you also look at, so can you also look at the valid transitions out of a state? Yes. So you can output that visualization in any of a way of a number of things and you will be able to parse that for sure, definitely. Yeah. So I've not looked at the JSON form but I presume that it's mostly going to be through verse. So it's almost certainly going to be source destination. So you're probably going to have to read it and do a reverse index on it. Yeah, yeah. Oh, sorry. I was just thinking about what you said about the use of visualization where you might want to see a state that may be one that does in fact have a form of static analysis which allows you to say which highlights. It does have some error checking like that. So if you try to instantiate a kettle that doesn't have any transitions or if you try to add in like a repeated transition, like if you've got two states and you add in two transitions that look exactly the same, it will error out on those things. So that's runtime but that's at instantiation time that it will do that. So there is some form of static or early runtime checking on it but there's no tool that you can say here's Python run my py over it and work it out. There's nothing like that I don't think. What more do you need than that? How do I document the kettle? So because it is a plain Python object you can put all of the documentation code in fill in that doc string there. So the API for your kettle is fill empty in boil and you can add those doc strings as you see fit. So you can document it there. Okay, thanks very much.


Okay Anna, we're good to go. Welcome to today's open research webinar hosted by Elife. This series aims to give early career researchers an online platform to continue to share their research as an alternative to in-person meetings which became impossible now. My name is Anna Akmanovan. I'm a deputy editor of Elife. My own research is focused on the site of skeleton and particularly on micro-symbols. But today we will hear talks from three very different young researchers working on stem-ness. This will be related to Maxine, our first speaker, Kevin Eng, who will be talking about evolutionary concert truncated PDL one variant and last but not least Nikos Vakirlis working on orphan genes. So before I tell you a bit more about how to ask questions I would just like to very briefly say how important it is that we do these kind of webinars for two reasons. First to provide a platform for young researchers to share research broadly when meetings became impossible and second also because on the news we read now every day about the importance of science. We're in a unique period of time where everybody turns to scientists for answers and for ways to move forward and so I'm particularly excited to be able to participate in this Elife webinar so that we can share the newest research with you. So of course you will listen but you will also be able to ask questions. After each 10-minute talk we'll have five minutes for questions and then we will move to the next talk to ask a question. You can either type it into the Zoom or directly in the Google document when the link is shared also in the chat. We are joined today by Miranda Anye and Naomi from Elife who are working in the background to support you. They will help you to line up the questions and if it will be possible we will invite you to ask your question in person and then the symbol unmute you so that you can do that. Otherwise if it's not possible I will read the questions and include your name. The open notes document is also a place for you to contribute shared public notes. We welcome you to do so and to list yourself as a contributor in the list above the speakers to today's webinar. Thank you. Okay then about YouTube so this webinar is being recorded. There's also live streaming on YouTube and since it's a live webinar we ask you please to be respectful, honest, inclusive, accommodating, appreciative and open to learning from everyone else. So please behave yourself, don't attack, demean, disrupt, harass or threaten others, encourage this kind of behavior. If you feel uncomfortable or unwelcome on any of these webinars please contact Elife by email. The inbox for this is watched by Miranda at Elife. Organizers reserve the right to ask to leave and to deny access for subsequent webinars on Zoom. If you need any help at any point please send Miranda, Naomi or Anya a chat message directly using Zoom. Okay so now that we are through the introduction we will start with the first talk from who is from Rallitza Madison and she will tell us about the regulation of stemness. Welcome Rallitza. Thank you. I'll just try and share my screen now. You'll see this. All right thank you everyone for joining in and particularly Elife for what I think is a really great opportunity given the current situation. So I've never given an online talk before and in case something goes completely wrong I want to make sure I thank the right people at the start particularly my previous supervisor Robert Sampo. Sorry well can't go back but I want to thank my previous supervisor Robert Sampo from with whom I did my PhD at the University of Cambridge and subsequently a postdoc at the University of Edinburgh. Several other people have been involved in this project also my current mentor Bart van Heesenberg at UCL Cancer Institute. Now I'm going to focus on the big picture here looking at stemness and how it's regulated by a peak 3ca activity threshold but for those of you who want more detail in an actual look at the data you can come back to this slide on finding the slides online and you will be able to find all the data upon which this talk is built. So going forward the focus of my research really is the P3KNA signalling pathway and for those of you who are not familiar with this pathway all you need to know for the next 10 minutes is that when it's activated in a cell that cell is told to grow and to proliferate and to resist apoptosis. So quite unsurprisingly this pathway is commonly hyperactivated in cancers and often this is because of an activating mutation in the peak 3ca alpha enzyme. This enzyme is a lipid kinase composed of a catalytic and a regulatory subunit. The catalytic subunit is known as P110 alpha and that subunit is encoded by the peak 3ca gene. Cancer biologists will be familiar with the peak 3ca gene it is the second most commonly mutated gene in human carcinomas and the mutations in this gene are activating their considered cancer drivers and therefore a lot of focus has been placed on the development of P3KNA alpha inhibitors for use in oncology. Now having said this it is also very important to stress that peak 3ca mutations activating peak 3ca mutations should not automatically be equated with cancer. So we know that this is not the case from a group of rare overgrowth disorders commonly referred to as the peak 3ca related overgrowth spectrum of pros. So this lady here has extreme lower body overgrowth caused by an activating heterozygous peak 3ca mutation that has been acquired during development and in this particular case this mutation although it also occurs in cancer it does not lead to malignant overgrowth. So you've got a situation here where you can have the exact same activating peak 3ca mutations but in different contexts and leading to different outcomes. So when I joined the sample group to do my PhD my aim really was to study activating peak 3ca mutations in a developmental context because we knew a lot about them already in cancer but we knew relatively little about their consequences in development. So to do this I chose to use peripodent stem cells and of course as it typically happens in research you end up studying the least what you didn't plan to do so ultimately I ended up learning a lot about peak 3ca cell fine cancer and contributed perhaps very little to pros understanding. The reason for this is the peripodent stem cells share many similarities with cancer cells and in fact you can view cancer as featuring a barren activation of embryonic programs and in fact this is now supported by big datasets where for instance the research study derived a molecular stemna score from peripodent stem cells and used that stemna score to then classify human cancers as either differentiated or undifferentiated and the researchers were able to show that the higher the peripodent stemna score in these cancers the more aggressive in the worst the disease outcome and this duality if you like came in very handy in my research because I was able to study the effects of oncogenic peak 3ca cell activation on stemness and I've put a question mark here because this is typically not a phenotype that is widely studied when we think about peak 3ca signaling and that is perhaps something that we should start paying more attention to as I'll come back to later. So as I said initially I wanted to develop human peripodent stem cell models of pros so I use CRISPR-Cas9 in the idea of to knock in the strongly activating peak 3ca H747R variant into a human induced peripodent stem cells. So in hindsight I turned out to be very lucky because my CRISPR was quite efficient and I ended up getting homozygous as well as heterozygous mutants and I say lucky because this is an oncogenic mutation and the general view at the time was that you only really need a single copy for its full blood effects to be observed so in other words an extra copy was likely to be redundant and if anything not particularly relevant for what we wanted to understand. We now know that this was a wrong assumption even when just looking at pathway activation and again this is all published data we were able to discern greater activation of the PA3 kinase signalling pathway going from wild type cells to heterozygous H747R mutants and then to the homozygous counterparts but the most striking difference between homozygous peak 3ca in mutants and the heterozygous and wild type cells was really the effect that this extra copy of peak 3ca H747R had on stemness. We found that homozygosity but not heterozygosity for peak 3ca H747R resulted in a phenotypic switch characterized by self-sustained stemness so in other words these cells are now resistant to differentiation and we think this is quite important also in the context of cancer as I'll return to you later on because we also demonstrated that you can have multiple peak 3ca in mutant copies in human tumors and therefore this dose dependent regulation of stemness and perhaps other phenotypes downstream of these mutations could potentially also be relevant to look into in cancer. On the mechanistic side of things we of course were very interested in trying to understand what maintains this switch in your position so what is maintaining the self-sustained stemness and importantly is this irreversible switch can we bring it back off again and is it simply a matter of using one of the peak 3ca H747R inhibitors that is being developed for use in oncology. So we took an unbiased approach here in collaboration between the Lindings lab in Copenhagen where we profiled our cell lines using RNA sequencing and also proteomics and consistently our computational predictions suggested that the activation of the TGF-Beta signaling pathway plays a key role in this self-sustained stemless phenotype of the notipics which that we observed in homozygous mutants. This caught our attention for several reasons so very early on in my work I had observed that homozygous H747R mutants exhibited a strong upregulation of this gene here known as nodal. So developmental biologists will know about nodal as being a critical morphogen during embryogenesis it's a TGF-Beta like ligand and like TGF-Beta it instructs cells to undergo epithelial to mesenchymal transition and during embryogenesis this is very important for gestrulation and organ development and again exemplifying this duality between cancer and development TGF-Beta in a cancer promotes metastasis and disease progression. An important feature of nodal is that it can actually promote its own expression so you've got this positive ultra-regulation which again is very important considering the self-sustained phenotype that we observed in these cells. The reason why it's important is because you also need to supplement nodal or TGF-Beta into the maintenance medium of human peripheral stem cells to keep them in the undifferentiated state and we knew that homozygous mutants were capable of maintaining the undifferentiated state even when you switched them to a medium that wasn't promoting this. So we hypothesized that self-sustained TGF-Beta nodal signaling could be the mechanism for this stemless phenotype in homozygous IPSEs. So we went on to test this and I apologize in advance for what may look like a very complicated slide so I'll walk you through it. It's actually fairly simple. On the left hand side I've got results for wild type induced peripotent stem cells looking at nodal expression and also nanoc. Nanoc is another very important peripotency factor it's a downstream target of the TGF-Beta signaling pathway and if you look at the two bars here the left one is the gene expression in cells cultured in complete medium and then when you remove nodal you now see a decreased expression of nodal itself as expected and it also translates into lower nanoc expression. The same is not true in homozygous mutants they remain high in nodal expression and even when you add AP-1-2-Alpha inhibitors so here BYL 719 although you see a drop in nodal expression this is not sufficient to trigger downstream down-regulation of nanoc and nodal factors that I'm not showing here. What we needed to suppress this stemless signature was actually inhibition of the TGF-Beta signaling pathway consistent with our hypothesis. So just to summarize what we've been what I've told you about is that homozygous Haitian 47R mutants exhibit this self-sustained stemness and it seems to be triggered by constitutive TGF-Beta signaling we can inhibit this phenotype with a TGF-Beta inhibitor but very importantly we cannot reverse this stemless phenotype using AP-1-2-Alpha inhibitor. So for cancer biologists how is this does this have any relevance? We think it does and here is some unpublished data which we're quite excited about we looked at breast cancer transcriptomics and we computed PA3 kinase activity score and a stemless score based on gene expression data and we saw a remarkably strong positive relationship between the stemless score and the PA3 kinase activity score and more importantly this was also related to tumor progression with grade three tumors the most undifferentiated tumors having the highest stemless score and the highest PA3 kinase activity score. So I'll finish here by just highlighting two of the questions that arise from this one very important question is whether PA3 kinase inhibitors were active against cancer stemness. This is not something that we typically evaluate when we use these inhibitors we tend to look at proliferation and growth but we think that it is also important to look at stemness because you need a single cancer stem cell to survive to actually regenerate the entire tumor. So even if the inhibitor suppresses growth it might not be effective in the long run. And finally PA3 cation 47R and other PA3 c mutations are heterozygous in pros and maybe this is one of the reasons why the growth in these patients doesn't progress to malignancy. I think I might have run over time so I think I'll stop here and I'll be happy to take questions. Do I need to stop sharing? Naomi do we have any questions from the audience? The questions are just coming in on the document and I've got a first question in the chat for you if you like. Okay so a question pretty obvious one. Could the lack of a wild type allele rather than the presence of an extra mutated allele of PA3 cation be the driver of the observed phenotype? Yeah so that's a question that has come up sometimes when I present this work and we haven't actually looked at this directly but we don't think it is the case partly because there is a negative regulator of the PA3 cionase pathway P10 when you lose that homozygously you also trigger self-sustained stemness. So downstream of PA3 cionase if AKT is hyperactivated in human peripheral stem cells you again see self-sustained stemness. So we really think this relates to a PA3 cionase activity threshold which you can achieve by other means than just the P3 cation 47R mutation. Okay next question is from Michael who may be watching you on YouTube. Have you checked the canonical TGF better SMAD such as SMAD 2-3 levels in the PIK 3C mutation? Yes and we've done a reverse phase protein array and we've shown that SMAD 2-3 phosphorylation is increased in the homozygous mutants and that you cannot reverse that with a PA3 cionase cell for inhibitor even though you reverse the canonical PA3 cionase signaling pathway. So yeah the canonical SMAD 2-3 pathway is its own. I see okay maybe a question from me so how well do you differentiate stemness from proliferation and these different effects? So how well can you define these different phenotypes? Yes so we actually don't have any evidence for these cells proliferate more than the wild types and the heterozygous mutants. So we don't think it is related to proliferation in this case. What we know is that these the mutants but that's seen both in heterozygous and homozygous mutants they have increased resistance to apoptosis when you remove the growth factors. I see another question is which PA3 cionase and effectors do you think would be involved in the pathway that you are looking at? So in our in a pre-print study that we've published recently we've looked at this with a network computational analysis and we think that MIG may be playing an important role. So MIG is being stabilized downstream of the heterozygous mutants activation and we see quite substantial evidence for it playing a role in this and also partly based on prior literature but it's something that's a work in progress. I see and maybe the last question do we have more questions from the audience not at the moment we have one more question so this stemness switch how do you envisage it mechanistically? So this boils down to a bit of complex signalling dynamics but what basically what we envisage is that you've got this a by stable state if you like so at the transcriptional level this could for instance be caused by epigenetic modification and opening of chromatin and then you're a state where you have more open chromatin for instance at the stemness genes and continuous binding of activating of activating factors whilst inhibiting the repressors of the phenotype so we believe that there is when I talk about the switch it's basically at the signalling level if you're imagining a steep sigmoidal curve above a certain threshold you then stabilize into this new state and this is how we imagine that this is happening but as I say this is something that needs further mechanistic studies it's not it's not being addressed or we haven't addressed it at the moment. Thank you very much and this is a very exciting study so thanks a lot we'll now move to our second speaker who is Kevin Eng and he will talk about PDL1 variant functions. Welcome Tim. Great thanks so much let me just start sharing my screen great is that working great okay so thank you very much for having me today I think that I hope everyone is staying well in these rather unprecedented times and I think this is a really fantastic initiative to continue to share science in these times so our lab is an immunology lab and we are primarily interested in T cells which are in many ways central and orchestrating immune responses to cancer infection but also can be responsible for autoimmunity and auto inflammation so a T cell response in its most generalized form begins upon recognition of a T cells cognitive antigen by the T cell receptor the TCR and when this happens this results in a clonal proliferation of that particular T cell and release of various soluble mediators cytokines and other signaling factors and of course this can result in all sorts of collateral damage resulting from an overly exuberant immune response and so in order to restrict this response and to prevent this collateral damage T cells express PD1 upon activation and what happens upon binding with its primary ligand PDL1 is that you get a decrease in the magnitude of the T cell activation response and so the importance of this pathway is highlighted by the phenotype of PDL1 deficient mice which develops spontaneous autoimmunity conversely PDL1 overexpression is a very well studied mechanism of tumor immune evasion and there's been remarkable success in the clinic by targeting this pathway and so these two dichotomous phenotypes to me really highlight the importance of tightly regulating the expression and activity of PDL1 so what I'm showing here is the gene structure of CD274 which encodes PDL1 so you have the IGC and IGV domains and exons 3 and 4 and a transmembrane domain on exon 5 and we did a few years ago our lab did a established a pipeline to do de novo transcriptome assembly of RNA-seq data from both healthy and cancer patients and we assembled this truncated variant and we saw that this truncation occurs due to exonization of a retro element a line element within intron 4 which donates its poly A tail to the transcript and hence we refer to this transcript as CD274 L2A and biologically why this is quite interesting is as I've mentioned the transmembrane domain is located on exon 5 and when we see that we model the protein that would be translated from either full length PDL1 on the left or truncated PDL1 on the right that the truncated transcript retains the IGV and IGC domains required to interact with PD1 but lacks a transmembrane domain and so we hypothesized that expression of this transcript would produce a soluble form of PDL1 which has previously been described to be detected in the serum of cancer patients and other pathologies as well. What was interesting to us as well is that this intronic region was evolutionarily conserved among all hominid species which is shown here in this red box and when we compared the sequence divergence between all mammals we observed that introns within the gene which are in gray and the non-coding exons which are in white show far greater divergence than the coding exons which are shown in dark blue and this is of course expected but what was quite remarkable to us is that the this line element which is shown here in orange shows comparably low divergence to the coding exons and so in terms of expression what I'm showing here is expression of full length PDL1 which is split by tissue type and either cancer and orange or non-malignant tissue in gray and generally we see higher expression in cancer but we also see expression in non-malignant tissue and this is primarily in the new tissues and barrier sites such as the lower and then when we compare expression of the truncated transcript this is on average 10 fold lower I've expanded the y-axis just for clarity and as with the full length transcript we see highest expression in immune and barrier sites such as the lung and the skin we didn't quite see the same extensive upregulation in cancer and surprisingly we saw quite widespread expression among non-malignant tissue and so the conservation and hominids as well as the expression in non-malignant tissue to us suggested a potential conserved biological function and so in order to test our hypothesis that this truncated transcript would produce soluble PDL1 we cloned it into an expression vector and transfected a 293T cells which are deficient in PDL1 and when we ran an alliance on the supernaint of these cells we saw a dose dependent increase in soluble PDL1 importantly when we analyzed the these cells by flow cytometry we see no increase whatsoever in surface of transmembrane PDL1 and this demonstrates that this truncated transcript produces only the soluble form of PDL1 so of course the obvious question what does it do of course our first assumption was that soluble PDL1 like its transmembrane partner would be immunosuppressive and so we can assay the immunosuppressive capacity of PDL1 by taking primary CD8 T cells from humans and co-culturing them with 293T cells transfected with full length PDL1 we then activate these T cells and then analyze the proliferative and cytotoxic capacity of these cells so as we can see what we've done here is we've stained the cells with the proliferation dye and the more cell divisions the cells go through the more the dye dilutes and this is what we see in these distinct peaks and as we can see a stimulation induces robust proliferation which is decreased in the presence of transmembrane PDL1 however and to our surprise no amount of truncated PDL1 transcript was able to induce any suppression and this is true even at equivalent DNA concentrations as the ones used for the transmembrane form and given that we found that the truncated transcript was expressed 10 fold lower in our RNA data we reasoned that these were already super physiological conditions we've also tested for granzyme other activation markers CD4 T cells and K cells all of which were sensitive to transmembrane PDL1 but not soluble PDL the one phenotype we did observe was a decrease in PD1 staining on the T cells with soluble PDL1 and this could be reversed with the addition of a blocking antibody to PDL1 however we didn't see any decrease by QPCR of the mRNA for PD1 ruling out the possibility that soluble PDL1 was somehow decreasing the gene expression so what could be happening instead is that the soluble PDL1 was binding PD1 and thus blocking the fluorophore from binding resulting in this decrease in PD1 possible cells that we see and this is good interesting as it suggested that soluble PDL1 was able to bind the PD1 with insufficient affinity to cause suppression and then but and thus biologically could be acting as a receptor antagonist and so to test this directly we did a co-transfection experiment in which we keep the concentration of the transmembrane PDL1 constant and titrate down the soluble PDL1 again in 293 T cells and we generated PD1 overexpressing Jurkat cells and this is a T cell line there's a more tractable system to study PDL1 mediated suppression and again we stimulate and stain for activation markers so as before a co-culture of these T cells in the presence of transmembrane PDL1 decreased activation um and um as as we could see um and what we noticed was a dose dependent sorry what we noticed was a dose dependent rescue of activation as we titrate up the soluble PDL1 and once again when we tested this in primary T cells we saw that the presence of soluble PDL1 with transmembrane PDL1 was able to rescue proliferation inside a toxicity and that this phenocopy the effect of having a blocking antibody and so of course we wanted to test this in vivo which is slightly complicated by the fact that the analogous transcript and protein does not exist in the mouse genome um and so but given that human PDL1 has been reported to bind mouse PDL1 we decided to test it anyway we but we also designed a construct for the Earthologous mouse gene in which we truncate mouse PDL1 at the same position and so we stably transduced these two constructs into mca38s this is a colon adenocarcinoma cell and we subcutaneously injected these into immunocompetent mice and so what we know is that um this is these cell lines um in this subcutaneous model are sensitive to checkpoint blockade as seen when we inject the um therapeutic blocking antibody to PDL1 but what we saw as well is that cells transduced with either the human or most soluble PDL1 phenocopy the kinetics of exogenous PDL1 blockade suggesting that soluble PDL1 has the same receptor antagonist effect in vivo and so what uh very quickly this work this is all been published in um elife last year and so our um our our sort of this is quickly some of the work that we've done since then we were interested in the cell type in the biological relevance and what we found through analysis of RNA-seq data that uh this transcript was specifically expressed in activated CD4T cells and we could again confirm this during a time course PCR and ELISA of primary um CD4T cells and in terms of relevance to disease we were interested uh we are collaborating with marine and botterous group at imperial which has RNA sequencing data from CD4T cells from healthy donors and lupus patients I mean what we see is that full-length PDL1 is upregulated in lupus compared to healthy donor CD4 with no real difference between active and in inactive disease and in contrast the truncated transcript is selectively upregulated in patients with activated with active disease and if we express it as a ratio between the full-length and truncated transcript we can differentiate quite nicely between active and inactive disease suggesting that this may be a useful biomarker in the lupus setting so just to quickly conclude um we detect this truncated PDL1 transcript in both healthy and cancerous tissue we know that this truncation occurs due to exonization of an evolutionarily conserved retro element the expression of this transcript produces a soluble form of PDL1 that's not suppressive by itself but antagonizes the bioactivity of full-length transmembrane PDL1 and finally we observe that the truncated but not full-length PDL1 is expressed in CD4 T cells upon TCR engagement and that this phenomenon can be observed in patients with active lupus and with that I like to thank my lab all of the platforms of the Crick Institute and and so on and I'm happy to take any questions okay thank you very much Kevin so we are ready to take questions do we have any from the audience you got some questions in your chat Anna I see the first question is so what do you think regulates this switch between the two PDL1 isoforms right so that's been a very active we've been pursuing that question quite actively we don't really know yet what we suspect is that the three prime UTRs of these two isoforms are very different and what we what we know from the literature is that the three prime UTR of the full-length protein it contains many regulatory elements and so we suspect that it might be some sort of RNA binding protein that we're actively doing are you planning to pursue that look at which RNA binding proteins bind there or micro RNAs or something like that yeah so we are I'm currently doing some experiments just to see the screen a panel of RNA binding proteins that we know are expressed in CD4 T cells with similar kinetics we have a question from Jonas Dutra thank you for the very interesting talk when did this soluble PDL1 appear during the evolution of the hominid lineage right that's a really interesting question because as you've seen this this this intron is very well conserved among the hominids but not other species but what puzzled us a bit is that this this this class of line elements these L2 elements are extremely ancient and would have integrated likely millions of years before the divergence of the hominid lineage and so what was interesting to us is we were able to reassemble for instance the mouse genome and the rat genome and we were able to see traces of this remnants of this line element that had inserted there but have since mutated away so what we suspect is that this insertion itself is very very ancient but it has only been conserved in the hominid and we see evidence in some other species such as the pink for instance which has we can't detect this line element but we see other other integrations from other retro elements that seem to do the same thing okay and then the last question so what can we do with this molecule in terms of cancer therapy yeah so again that's been something we've been pursuing given our rather preliminary in vivo data showing that it manages to delay the growth of the universe we think that it might be promising given that this is molecule that's much smaller than the blocking antibody and might have better penetrance and within very dense tumor tissues we're also exploring whether we can use this system expressed in CAR T cells for instance but you can have very localized and temporally regulated and this might go some way in ameliorating some of the side effects of systemic I see very interesting thank you very much Kevin and now we'll move to the last speaker Nikos who will talk about the orphan genes welcome Nikos I thank you very much let me go ahead and share my screen here is this okay perfect so like you thank the organizers for putting this together this is a really nice idea to keep keep science communication alive during this weird times and so the title of my talk is syntany based analysis indicate that sickness divergence is not the main source of genes and this is work that I did while also got the Department of genetics of Trinity College Dublin so let's dive right in so what what is an orphan gene so an orphan gene is quite simply a gene that we cannot assign to any known gene family so in this toy example that I have here the blue black and red genes are shared between all these species so these gene families have members in all the different genomes and I'm showing here however this green gene that we see in this in the focal species here is an orphan because we only find it in this species so we cannot assign into any known gene family simple example therefore it is an orphan gene and in fact if we include the the phylogenetic relationships between the species that are represented by these by these toy genomes here we can easily infer that this the most likely scenario is that this orphan gene has originated so it has appeared along the branch leading to that species over there and it was missing from the ancestor of all these species therefore it is an evolutionarily noble species specific gene so the concept of the orphan gene can be generalized to include a taxonomically restricted genes which are genes that are not only found in one single species but that are found in a small group of species such as the green the yellow gene that I'm showing here that is found in the group species B and these taxonomically restricted genes we also call them TRGs and orphan genes are found in any plate that we look at across the tree of life so they are ubiquitous and what's interesting to think about is how this richness of patterns of taxonomically restricted genes and species specific genes and evolved from an early ancestor that likely had a small genome with a limited gene repertoire so this leads us to ask the question how do noble genes originate so in general during evolution so there are two main ways the first is through sequence divergence so what does that mean quite simply if we imagine an ancestral gene okay the following especiation event is going to produce two homologous genes and with the passage of time these two homologous genes can find themselves within the twilight zone of sequence similarity right here where sequence similarity between these two homologous genes is no longer detectable so with the passage of time we can find we can we can find two homologous genes in species A and B here that are actually invisible so we can call these invisible homologs because no detectable similarity is present between them so another way that new genes that orphan genes and noble genes in general can be can result is de novo out of non-genic DNA so this is when an entirely new gene is going to emerge from scratch from a part of the genome that was previously non-genic such as an intergenic region and for a long time this was thought to be as so improbable that it was virtually impossible but we now know that this isn't the case because we found de novo genes so de novo emerged genes in any species that we will look at so to sum up we have two drastically different mechanisms by which noble genes originate we have sequence divergence we have ancestral gene that diverges and that produces two genes or gene families where no detectable similarity can be found between them and then we have de novo emergence where we have an ancestral non-genic sequence that evolves into a functional gene I'm going to focus on the on the first one here sequence divergence and the question that we wanted to ask is can we study sequence divergence beyond recognition directly can we study this mechanism of new gene origination directly which is something that has now been done before and the second question is so sorry so that amounts to basically identifying cases like the what I showed you before so homologous genes that have entered the twilight zone of sequence similarity where no similarity can be detected between them and the second question that we wanted to ask was can we estimate the contribution of this mechanism so sequence divergence beyond detection and to the total pool of genes without similarity so the total pool of noble genes which includes orphan genes taxonomically restricted genes and why this is important is because for a long time as I told you de novo emergence was thought to be extremely rare so the assumed picture was that sequence divergence is going to be is going to account for the majority of noble genes and de novo emergence is going to be very rare so I wanted to ask is there a way that we can actually test this and find out whether this is true so what we used to do this is that we took advantage of the concept of property of syntony so syntony is basically the gene order and along the chromosome and conserved syntony means that there is conserved gene order between two genomes two genomes and two different species that we're comparing so in the example that I'm showing here we have a block of four genes that are in conserved syntony which we have identified using sequence similarity as we normally do but then in the middle we have the yellow and the green gene here okay which we don't know that there's any sequence similarity between them and we're going to go ahead and assume that in most cases the yellow and the green gene are going to be homologous because they're found within this macro syntonic block of conserved gene order between two genomes so they're found opposite each other within this block now we're going to based on this we can then calculate the proportion of the number of times in where we have this arrangement but no detectable signal sequence similarity can be found between these two genes so the yellow and the green gene and then we need to take into account that this proportion that we have calculated based on genes that are within this arrangement is going to be an upper bound because so this is an estimate and of course there's a lot of there's there's going to be times where the genes that are found opposite each other in this in this scenario are not going to be actually homologous so we need to take this into account and finally we can use this proportion and which we have calculated within genes that are found in conserved micro syntony and extrapolated to all genes in the genome and we can do this if we know the genes that are found within conserved syntonic blocks and outside conserved syntonic blocks evolve at more or less the same rate so this is the idea to use the concept of conserved syntony so we built a pipeline using this concept and we applied it to three separate data sets using three focal species fly yeast budding yeast and human and we compared it to a number of species that are found progress in a progressively increasing evolutionary distance from each focal species so we have a number of pairwise comparisons using these three focal species comparing them to each target species separately and what we can we can do with this is that we can see how this proportion that again as I'm showing here on the left is the proportion of genes that have entered the twilight zone of sequence similarity how this proportion scales with time so we see that there's a very good linear relationship with time since divergence between the two species that we're comparing so each point here represents a pairwise comparison between the focal species and one target species and we can see that there's a good linear relationship so this tells us that divergence beyond recognition occurs occurs at a steady rate we can see that actually in human we seem to have a much slower rate from the other two data sets so this is the one takeaway that we get from this and the second one is as I told you is wanting to estimate the contribution of this mechanism to the total pool of orphan genes so what percentage of the total pool of orphan genes does this account for and we can do this in the following way so first again we have one rate one proportion that we have calculated within genes that are found in conserved symptoms so in this toy example here we have this proportion would be one out of six because in one out of six cases there is no detectable sequence similarity between these two genes and then we have another proportion which is calculated over all genes in the genome and this is basically the total number of orphan genes if we take a simple pairwise scenario into account and now we can extrapolate the first rate that I showed you so the rate in the bottom to the entire genome so this is an estimate that we calculate over a subset of genes in the genome but we can calculate it over the entire genome if genes inside and outside synthetic blocks evolve at more or less the same rate and this is what we found so I'm going to go ahead and speed up a bit here so we can extrapolate this rate and what matters in the end is to compare these two rates and we can do this we have the two rates that we're comparing here so in the solid bars we have a portion of genes that have diverged beyond recognition and in the transparent bars the proportion without similarity in general between the pair of genomes okay and if we take the ratio of these proportions we can see that the estimated proportion that is explained by sequence similarity is actually much much lower than we would have expected so on average this is about a third so a third of the total orphan genes in these pairwise comparisons that we have of the genes that lack similarity can be explained by a divergence beyond recognition so this is how much these mechanisms explain these mechanisms explain so on average about a third and I'm gonna skip this last part because I think that I'm running out of time yeah so if you just can wrap up please yes so I'm gonna skip this last part so just to sum up really quickly so we have a novel approach to detect pairs of invisible homologues based on conserved symtony between genomes we found that divergence beyond recognition occurs at a steady rate within a given film and then the main takeaway is that surprisingly we find that divergence accounts for approximately a third of genes without similarity on average across the different comparisons that we have and then the last one didn't have time to talk about but if you're interested more about this work it was published very recently in in life and this is the paper right here in the the bottom and I'd like to end by thanking and if I'm a class that was the group leader in the where I did this postdoc and and carbon is something inverse of Pittsburgh so our collaborator in this work and thank you very much thank you very much for very exciting insight in the evolution about genome the first question is so how sure you are about the evolutionary origins of these genes I mean for each particular type of origin what is the error margin that you have and can then also be a different type of origin let's say horizontal gene transfer or something like that and yeah that's a good question so for we don't really know what the the false positive rate let's say for one particular case would be and we know that we for sure over estimates the number of times that the genes found in this arrangement we have two homologous genes opposite each other but no sequence similarity we know that a lot of times these are might not be homologous so the actual proportion are likely to be lower than the ones that I'm showing here so this average proportion of a third might be might actually be lower we don't really know how much lower but in terms of individual pairwise comparisons of genomes it depends on how far away the genomes are that we're comparing if there's a big evolutionary distance between the species then the number of genes in conserved sentient that we can find it is lower so then this percentage has a higher error margin and if that makes sense so the the more the number of genes in conserved sentient that we have between two genomes that higher the the confidence that we can have in this portion is I see we have a question from Jonas don't try again so thank you for the nice talk he has a question about giant DNA viruses which are well known to have lots of orphan genes would this approach be applied to study these viral or orphan genes and that's a great question actually and yeah I've read about these huge viruses and that have a huge like crazy percentages of orphan genes and it depends on whether there is sentient conserved between viruses and I might I would suspect that there might not be that much but I don't really know because I have not really a well versed in viral genomics but it it is a very very intriguing question of where do these orphan viral genes come from and because viruses evolve so fast so they mutate so fast it's it's a valid hypothesis that they might be the result of divergence but it'd be really interesting to try to apply that to to giant viral genomes yeah I say we have one last question so okay so you have these genes which are homologous like distant cousins and they don't have any similarity but do they still bear some properties in common and yeah so I didn't have time to talk about that but I I also looked at the secondary structure properties and and composition properties between these between invisible homologs and we found that in a very small subset of cases there is correlation between over these properties between the different pairs and this is the case when genes so these invisible homologal genes share a protein domain so the proteins that they encode for share a protein domain so there's no pairwise similarity there but if you identify protein domains on both of them they share a common one and when that happens and you find that other similarity other properties such as secondary protein secondary structure tend to resemble that again in the absence of sequence similarity at the protein or DNA level between these genes so yeah there's a small percentage of case where this happens and presumably this might mean that they have a common function as well so the function is retained so you have one more question from Neil Pram are there any other studies that attempt to quantify the contribution of divergence and evolution of novel genes and yes so there's a number of studies that have taken a simulation approach and they have so there's a difference in the simulation approach in that you need to assume that every time that when you do a simulation and you see that you end up with a number of the percentage of orphan genes that are due to sequence divergence that doesn't really prove that they are due to sequence divergence but it proves that they could be which is also important now there's a so there's these studies that have taken a simulation approach which have who have more or less concluded similar things are as are a study and then there's a recent paper and a recent preprint I should say that is taken a more analytical approach and to to model how similarity decays over evolutionary time and in that work they find that and diverges accounts for slightly more than the majority so slightly more than 50% in their data set so and they give a range of course and our ranges and with theirs they overlap significantly but their estimates are slightly higher which is interesting thank you very much Nicholas I think we've run out of time so thanks to all our three speakers for very different and very exciting talks thank you very much for sharing your science before we finish we will run a poll so we'd like to hear from all the participants about how we could improve these online talks for you as audience members we are now launching a poll our question is if we change anything which two ideas below do you think we should prioritize please pick up two items you would like us to prioritize and select nothing you can also select nothing we welcome other ideas in the zoom chat as well and you can also email us so we will give you a few seconds to do this and I want to think to say at this point as well as if people if there are any attendees who would like to stay on to chat to the speakers today we can keep zoom open um so if you just say in the chat or put your hand up or something we can just get an indication of how many people would like to do that I think all speakers are available to stay on for a little bit longer um so we're happy to help you do that okay so I hope that you have filled in the poll which would be really useful for us to improve this online experiences and thanks again let's say Kevin and Nikos for sharing your work our online research talks series will continue on Thursday at 5 p.m. british time will be tracked by another deputy editor of elive that left a vital as so we will hear from these speakers which are now shown on screen and so please join us on Thursday if you have time so for updates about this series please follow elive community and there you can find the schedule and the registration information and finally I would like to thank all of you the speakers but also all the participants and once again you are very welcome to stay online to have an informal chat with the speakers thank you very much thank you very much Anna and all the speakers that was fantastic I'm going to stop the live stream now but we'll keep zoom going just a little bit see if anyone wants to stay