 So, many of us here attending the conference in person may have traveled from elsewhere and yesterday we had the awesome walking tour and you may still want to explore Seattle a bit more. So, we're going to do here would depend on the weather so. And it's just like when you average some values over a vast, a vast geographical area like a state and here's here we see that. On average, Washington, the Washington state tends to be less sunny than California. Well, it's still sunny today, but that's an average. So, so you get a gist of bulk harness seek. So, yeah, you. But here as a tourist you will, you will prepare for the weather in the individual city and you also want to visit like individual places in the city so you want to hire resolution. And so singles are in this data is just like a list of tourist attractions that may be of interest, but, but each tourist attractions is distributed from space. And here it's like, say a building will be analogous to a cell and it does give a lot of interesting information about the, which places are interesting in Seattle. Yeah, for a walking tour we went to some of those and and you can even just like in singles are in the seek cluster those different places based on their characteristics like these are skyscrapers and these are museums and so on. So, now get to see like what is of interest there and then you will wonder how how do you get there, then you will look at a map. Which I would say it's maybe analogous to spatial transcriptomics data and so here in this map you see like different places of interest labeled on the map and you know where they are and you also get annotations of different spatial regions on this map here in neighborhoods with different characteristics and different functions. And so if you went to walking tour and if you like zooming onto the map and really study you may find out like different types of places tend to cluster in space, such as the skyscrapers in downtown and also like several museums around space needle and you may ask why such clustering and and then this may inspire interest to to look into the historical the historical forces behind these such as the 1960 1962 World Fair that gave rise to space needle and Seattle Center around here. And so so in this way. Space information may may may lead you to further investigations that that will not be available in non spatial single cell data. It's not responding. So back to spatial transcriptomics spatial transcriptomic transcriptomics technologies will help us to make that kind of map in histological space. So in this this plot shows the number of new publications for spatial transcriptomics over time and we see that for both data collection in the blue curve and data analysis in the red curve. We see like a sharp increase in in the interest in the number of new publications since 2018. And what are the what are the leading spatial transcriptomics technologies and so here. So this plot shows the number of institutions using each technology that I know of and the vision from 10x show mixes by far most popular it's used by over 100 different institutions around the world and then it's followed by Joe Mac Joe MX DSP and here's the Joe MX whole transcriptomic analysis and from nano string here. And yeah and then we also have like some other single molecular fish based method and the in citrus sequencing. But and these technologies can be classified based on how the spatial information is conserved but for for purpose of this workshop it's good enough to know that. Like these methods like visiting man Joe MX DS DSP would aggregate the transcripts over areas in the tissue and they don't they don't have a single cell resolution while. While the SM fish and in citrus sequencing based method they they will visualize the transcripts as a discrete puncture and then count them and these have single molecular and the single cell resolution. Yeah here just may if you don't already know yeah here's a quick intro to how those the most popular popular technologies work so. Yeah and vision it's basically you'll have a glass slide and you have. And you will print the micro array onto the slide in the regular hex hexagonal grid and then each spot would each spot printed on this micro array would have a. Spatial barcode whose locations are already known and also has a transcript capture sequence and you mount the tissue on onto the slide onto the capture capture region then those spots will capture the transcripts in in situ. For Jill MX DSP it's basically you have you have probes targeting targeting each gene and. And then on each probe there's a UV cleavable cleavable tag and then so when you select the regions of interest or our eyes. The UV cleavable cleavable tags only within those regions will be released and those can be quantified to in order to quantify gene expression. Within that within that area. So for for SM fish based methods and in this example it's sick fish it's here each. So each spot here is the individual transcript mRNA molecule and so these are counted and in order to quantify more genes than there are easily discernible colors of you you perform multiple rounds of hybridization. And here this kind of data is usually also accompanied by a DAPI staining for a nuclei and often like some other kind of standing for the cytoplasm for wholesale segmentation. So as for the analysis it can be broadly divided to types the upstream downstream in upstream the analysis. upstream the analysis would will convert raw data into a more usable form such as fast queue files to gen count matrix, which can then be used in downstream analysis for biological inferences such as finding special variable genes and special regions which have been discussed in some earlier talks today and so for here for the package is demonstrated here in this workshop special feature experiment as a way to organize the data it's it will be more like upstream while voyager which is used for exploratory spatial analysis based on the SFE structure it's kind of more downstream. The spatial information in from spatial transcriptomics will give us many opportunities not not available in non spatial singles RNA seek. However, those opportunities are not always utilized. So for for example, most of the cell type decombolution methods for a used for visium data on they do not take the spatial correlation of cell type distribution to count. And sometimes like the methods used for originally used for all currency card are used on visium like cybersword. Yeah, so among among the opportunities are yeah we can use gene expression to find special regions such and there are the many packages doing that like a base space and the Seattle. But in this workshop will explore a little bit in how selling tissue morphology from the H&E image can. Yeah, can can relate to like gene expression and also. Also, it will explore the spatial characteristics of gene expression like the strength and length scale of special correlation. Here it comes. So geospatial data analysis methods can help us to utilize the spatial information to utilize the opportunities mentioned before and. Probably geospatial data can be classified as a vector or raster. A vector data would represent the world in coordinates like the coordinates of points lines and the coordinates vertices in polygons, whereas raster is kind of like an image. It has pixels and each pixel has has a value. So. And then vector will get also has different types here and these are explained in the website of this workshop and I might not have enough time to explain all of those but here for for for the packages in this workshop we will focus on aerial data where. Aerial vector data where the data is aggregated over areas in space. And this, this type of this common in epidemiology, such as to protect the privacy of the patients. And, yeah, and shown this maps is like a seven day rolling average of Cobra cases and around Seattle as of July the 12th and and then here we see that for say, Visium and for GMX DSP they they also aggregate data on area. And, and the existing well established the analysis tools for these will include as the SF package and the SP depth package. And these are used extensively in both as a fee and wider. So no analogy is perfect. And these are some of the limitations of this geospatial analogy. So for instance. Biological tissues are usually originally 3D but spatial in spatial transcriptomics we usually collect the data only from the thin thin section of that originally three dimensional tissue and. And there may be implications from this procedure while whereas geospatial data analysis methods and the resources that are very focused on 2D. Also, spatial trans transcriptomics data can have like much higher dimensions like we have 20,000 genes and it can also get larger like in some more fish that some more fish data sets. It gets like millions of cells and but meanwhile like you just imagine like how many cities there are in California given close to that. Yeah, because of the size like we may need to make the methods more scalable and maybe we need to do on disk computation and also also very different historical forces operate in the geographical space and in the histological space. So, for example, unlike cities and landscapes, the development structure of some tissues are tightly regulated such as the cerebral cortex. Alright, so that's for the intro and the now let's head over to our studio. Yeah, this is on orchestra. So, um, yeah, let's begin with special feature experiment class at the heart of special feature experiment or as a simple features, which is a standardized way to represent geometries in space. Hold on, why is this not running? Yes, it's on orchestra. So, alright, so yes, here we go. So at the heart of SFE is the simple features. It's a standard. It's a standardized way to represent geometries in space. And in our, we are what give access to simple features with the SF package, which is based on the SF data frame and mostly it behaves like a normal data frame, except that has a special column for for the geometries. So, this is the, this is a schematic of the of the SFE. Yeah, this is schematic of the SFE class. So, if you have worked with single cell experiment or special experiment, then the, then this gray box in the middle will be familiar. So, so here we have, we put the gene cal matrix and like lock normalized count and so on in in essays and you have the cells or vision spots in the columns and the genes or features in the rows. And then we will also have the data for the, for like the cells or spots and for genes and for single cell experiment experiment we will put reduced dimensions like projections of the cells in PCA or tis near you map reduced dims and for spatial experiment we also have spatial chords for the coordinates of the cells or spots and it's also like an image data for an H and E image that can be plotted behind the spots in data visualization here for spatial feature experiment extending spatial experiment. So, so we have added the geometries, which these are safe data frames that can be associated with the cells or spots in the columns and associated with the genes or features in the rows and. So examples of the column geometries will be visit spot polygons or, or for like a SM fish based technologies. But nuclei and cell segmentation polygons. We also have spatial neighborhood graphs associated with the columns and the rows of the gene cal matrix and so here it's implemented as. So here it's still as the list W object as an SP depth is, I know there is, there's like a within the SDE object we have the co pairs and row pairs kind of thing but I'm not using that because list W objects are used in SP depth spatial reg and the 80 special packages for spatial dependency analysis and by using list W here I, we can avoid converting the objects every single time we do analysis. In addition to the rolling column geometries and graphs we, there's another aspect called the annotation geometries and annotation graphs, or shorthand like and geometries. So, basically here, here are geometries that are associated with the data set, but, but do not correspond to the dimensions of the gene cal matrix. So, for example, here, as an example data used in a tutorial, there will be mild fiber segmentations. And also we can have a pathologist annotate the histological regions and tissue boundaries and these can go into annotation geometries and, and then in analog graphs we can have spatial neighborhood graphs for these things. Yeah, so so the text would just explain what those fields are and now we'll load these packages. Yeah, the example data is from the SFV data package. How do we construct an SFV object. So we can do that from scratch, save from a sparse matrix here and call the constructor which, which behaves very similarly to the constructor of SCE and SP like I mean spatial experiment or SP. So as for the geometries, here we already have the special coordinates specified and spot diameter arguments. It's sort of like just for visium so one, because the spot diameters are known and, and by specifying that you can convert the, the spot centroids into polygons. So geometries can be either specified within the constructor like shown here, or, or they can be added later with with the setter functions shown the next section. So, given the popularity of visium data. So, SFV can also directly read in space range output for for visium. It's, it's like a toy example within the spatial experiment package and you see the. So, so that's the count. So that's like the structure and content of the space range output directory. So basically it's very similar to the retin X visium function in spatial experiment, but, but it reads. So after it reads in the data, it will, it will give you the spot polygons. And if you read, if you read the filter data instead of raw data, you can also construct spatial neighborhood graphs. Yeah, it constructed spatial neighborhood graph for the first spots are on tissue and so here what what it looks like when the SFV objects printed so yeah you get all the info from from SP and in addition it prints the which geometries you have and which type of each geometry besides the name. Yes. Yeah, it is needed it's it's here on this website. It should be you should be able to access that from the, from the schedule. Yeah, I think that from the workshops tab in the. But I'm just, I just want to run the code here in our studio. Yeah, and then if you already have an SPE object, then. Yeah, here's just that toy example and you can convert that into into an SFV object, but the caveat is that duplicate duplicate account are not allowed. Yeah, here. So this here will use a small step set of a real data set to demonstrate how you interact with the with the object and how you get and set different fields. Okay, so for for geometries. It's pretty straightforward like for for geometry is associated with the column column of the gene cal matrix use the call geometry function and for. Yes, for for geometry is associated with the rows of gene cal matrix use a row geometry and for the annotations like a tissue boundaries used and not geometry and so here you specify the SFV object and you put a name here. For geometry. So, this is deliberately make similar to reduce stems in in se. Yeah, so here we use the gather to. Why is it doing that again. Oh, I see so. Yeah, I need to download that data set. Yeah, here we go. We used the call geometry getter to get the vision spot polygons and this is what it looks like when the SF data from printed. And this is what it looks like in space. Um, yeah, you can also use the same same like a function arguments. It has a stator. In case you don't already know these names and you can use the call geometry names to to curate the names of the geometries and. So for for certain geometry stuff maybe more commonly use such as a vision spot polygons and like tissue boundaries or hands so you don't have to curate and type in the names over and over again like for vision for vision polygon like you can use like spot poly getter and stator and. So for tissue boundary there is like a tissue boundary function with the getter and stator and this is what this is what the tissue boundary looks like for this toy example. Yeah, and there's a stator. So for for special neighbor for special neighborhood graphs the getter and stator user interface are are very similar to those for for the geometries and so but first we need to we need to find a special neighborhood graph and so here we. The SFP package wraps all the methods for special neighborhood graphs implement implemented in the SP debt package. And here we use in this example we use a triangulation but other methods include can yours neighbors like distance based neighbors like polygon conticued conticuity and there's also like a relative neighbors and sphere of influence and Gabriel neighbors. And this is what the triangulated graph looks like and we know that like for for this. Hexagonal vision grid like these edges are not supposed to be there for vision. It's actually more straightforward to find it to find a graph based on the grid. So so we can use the fine vision graph function to. And here we use the call graph. Stator also has a getter so yeah just like in geometry row geometry. And the geometry so we have call graph row graph and the analog graph here. Yeah, the arguments are all the same. And this is what the what the vision special neighborhood graphs looks like and this is the correct graph. So, yeah, again, you can hear it, the, the getter SFP object in the name of the graph and in case you don't already know a name you can, you can use call graph names to cure the names. So, and so far in, in that example, there's only one sample in the data set. But so in spatial experiment object, there is a special field called sample ID and this is very important because while you may want to put the data from multiple tissue sections into the same as P object for for non spatial analysis such as clustering differential expression dimension reduction so on but. But the spatial coordinate values of the of each spot in those different tissue sections can overlap. So it's very important to keep those different sections or sample separate. And this is actually even more important for SFP because spatial dependence, the special neighborhood graph will only make sense within the same piece of tissue. So here, well, here I will use this toy example. And just to make a SFP object with with two samples to actually it's not complicated. So for the getters and setters for geometry and graphs shown above. There's a sample ID argument, which is optional when there's only one sample in the object but it's mandatory when they're multiple samples and you can actually also put all to get all samples. You can also like change sample IDs with this function and so these are so that that's for object interaction and for operations. So, yeah, we have already done this, you see, there's a step by method to concatenate to SFP objects and you can also subset in the SFP object like a matrix. But, but here's a catch. So if you subset the columns then the then the the node indices in the spatial graphs would no longer be valid. And so there's a drop function to determine what to do with those graphs. And so if tropical screw, then when you remove the columns, then you will get a message telling you that like the those indices are no longer valid and dropping out of all the graphs and if it's false by which is the default, then it will SFP will try to reconstruct those spatial graphs based on the method based on the information recorded when you were constructing it. And then but however, if the reconstruction fails, say if there's an error then you get a warning then the and then ask that failed to reconstruct are dropped. And because we have a spatial information we can also perform geometric operations on the on the SFP object. So, so here we're plotting the visiting spot polygons in front of the tissue boundary polygon. And and we want to subset this SFP object so we only keep the spots are on tissue. So, there's the crop function. So, so you can use a geometry to subset a SFP object. So, so here we use the tissue boundary of this data set. So not only is the genetic metric subset is only spot on tissue that intersect tissue are kept then also the geometry themselves are also subset it. So only the intersection intersections are kept here. In addition, you can, you can also like just do like more conventional kind of cropping with the bounding box. So, you can, you can also perform geometric operations on SFP without actually subset the the object. So, for instance, you can use and a prayer to to get a logical vector indicating whether say like each victim spot intersects the tissue and actually for these operations, even though the default predicate is intersection but any predicate implement in the SF package are supported. So, for instance, you can you can also use say I'm just trying to or like cover or covered by and so on. And here with and pred you can say get a number of nuclei that intersect that intersect each visit spot and and here and that actually performs operation. So you can get a new SF data frame to for the to get a geometries of intersections between each visit spot and the my fibers. And finally, yeah, just like for the SF object, we can get the coordinates of the bounding box of an SFE object that that will consider all the geometries present in this object and so sometimes you may want to move the coordinates so like so they're close close to the origin and you can do that with a space. There's some limitations with SFE so far but the one that I want to emphasize here is the in at least in the first version as a fee does not touch the image data field in the SP package so if you perform geometric operations and it will not change the image. So here we get have some ideas about the SFE object and we can. So, so we can go ahead and perform some analysis based on SFE. So, that's it. So if you have worked with singles are in a stick data then. So if for things like experiment or se, you have, you have packages like scatter scran scuttle like those that can perform some basic analysis and QC and visualization and first throughout throughout throughout not only implement an object but also some basic analysis and visualization and so here for a wider package. We, we aim that a wider to SFE is just like scatter scran and those two se. Even though it's still like a kind of early in development. So that's basically the gist of spatial allocation and much of explorers spatial analysis or USDA will focus on spatial allocation because in many select regression methods the samples are assumed to be independent but that's not the case because of spatial correlation. So here, again, we use the SFN SPDAP packages to explore like a spatial correlation here and load the packages. So this data that comes from it's already published and comes from mouse skeletal muscles and this particular one used here it was collected two days after no tax and injury. And this is the hd hd image of the of this data set. Yeah, and here we see the pink part those are mild fibers and this is the injury site with a lot of local site infiltration and this this thing is the muscle tendon junction. So some QC metrics have already been pre computed here such as the total you might count and counts a number of genes detected for spots and genes or like a portion of mitochondrial counts. My, my, so it's like a logical vector indicating whether each rhythm spot intersects the tissue. And here we will only work on when we work on the spots that they're on that intersect the tissue and we use the scram package to normalize the data and so money annotation geometries we have tissue boundary of my fiber segmentation and nuclei segmentation. Yeah, so maybe yeah, so here with here with geometric operations, we can relate the my fibers to to nuclei. Yeah, we can relate my fibers to the vision spots. So, plus spatial the plus spatial feature functions to go to function to plot like a gene expression and call data call data columns in space. But in addition, they can it can plot like annotation geometries and their attributes alongside like alongside like gene expression or call data and here in the backgrounds, the my fiber polygons and color by their areas and again here we here we see like how many my fibers intersect each vision spot and that can show in space like these. This region will have a larger number of my fibers per spot and there's no one to one mapping between vision spots and my fibers and so if we want to relate attributes of my fibers to gene expression and then we made to summarize those attributes. So for instance here we will will average the area of each my fiber intersect intersecting each vision spot. And that can be a plot in space so so we see that this region will have tend to have like larger my fibers and those great spots are those that do not intersect any my fiber. Yeah, here, here comes to gene expression. So these are marker genes for for different types of my fibers and so here we will try to plot like a different assays will plot the rock count and the lock normalized counts side by side in space and Yeah, so this is a fast twitch muscle so we don't expect to see many slow twitch type one mile fibers indeed there aren't that many and this is this is for type two my type two a mile fibers and so for those interested in this in orchestra can change the code to like type to be or type to X. Also like because the SFV object in inherits from SC and so all the non spatial EDA plots from scatter can still be used. So for instance here we plot them here the mean my fiber area per spot and here's the proportion of mitochondria counts and we see that the spots expressed in the marker for type two a fibers tend to have smaller area and larger proportion of mitochondria and Yeah, and for then we'll proceed to speech all according to analysis like a more insight here we see and that will require special number of graphs and here. Yeah, so so here's the vision graph. And that's what it looks like. Yeah, and here for for a mile fiber, it's the it's polygon continuity so there's only an edge if the if two mile fibers touch. Yeah, then so in the first version of Voyager, we only support univariate global spatial correlation methods so univariate just say one gene at a time and global means you get one value for for for entire for data data set. And to demonstrate the analysis on gene expression we just use small number of top. So more in size the most commonly used spatial correlation metric and so so here in the form in the mathematical form it kind of looks like a Pearson correlation between the value each at each spot and and their neighbors on the spatial graph and also like just like Pearson correlation it takes the value between negative one and one so for positive spatial correlation. It's like nearby spots are more similar than it's above zero and yet positive them for negative spatial correlation it's kind of like checkered pattern it's more in size will be negative. So, this can be computed for directing for matrices, or for a numeric column in in call data or real data. It can also be done for for attributes in animal geometry and call geometry. So for for call data the results are stored in the field called called feature data and for for geometries it's an attribute of those geometries like it's called feature data and so for gene expression. The results are stored in real data. And if you want a computer for like a large number of genes you this we use bio C parallel for parallel programming. Here is the is like another special allocation method and so so basically just change the function name like more as I changed into Gary see and then the arguments are the same. So, actually for all the other univariate global methods, the arguments are the same and you just change the function name will accept when the specific method will require additional arguments and then here we can even perform permutation testing to see if to see if the more is significant and the can be plotted. So these are the simulation. These are like the permuted values and then hit and these are the these are like the actual values and very significant for encountering genes and with correlogram we can see the land scales of of spatial correlation and can be done for more inside and Gary see here just two genes and can be plotted here and Yeah, not only shows the land scale to decay but also sometimes you may see second order neighbors have like higher higher values in the first order because there there's some like negative spatial correlation in some regions of the tissue. And then finally we have the there's more scatter plot. So, in the x axis, it's the value at each vision spot and in the y axis is the average of the average value of the neighbors of this and and there's actually a proof from 1995 that it shows that the slope of the line filter to this plot is more inside. And sometimes we see. Yeah, so sometimes we see clusters in these. This kind of plot and sometimes it's actually more interesting this. Yeah, and we can be in the clusters and uses the bluster package on bio conductor and you can plot on like the one scatter plot and this falls in space to sort of sort of like a C. So I see different special regions because of like kind of different kinds of neighbors in terms of value so. Yeah, so so that's the that's the the existing functionalities wider and so there's some limitations like because yeah I just mentioned that a special spatial transcriptomics data can have very high dimensions and all the more important to to support more of various functionalities. And we do plan to do that in future versions and echo we can support a geographically weighted PCA and also like a spatially. Like multi spat PCA as an implementing like a special and also the for now the planning functions don't plot the H&E image in the background and because yeah Jim SF it might be more tricky to implement and it's also makes it also more tricky flip it a lot axes and yeah finally only to dimension our presence so our support so all right so yeah then acknowledgement so thank you for thank you for coming and I will thank everyone in our lab and especially your Laura telling Christian Astina for for feedback on this project and the presentation and also thank directly the the author of spatial experiment for some discussions or thank you quite now can take questions. Okay, we are supposed to end but we actually have a half an hour break for our next one so we can take a few questions in here. That was really great. Thanks. Can I just ask right at the end that you you were saying clustering on like regions of more and I score for a neighborhood analysis. Did I interpret that correctly. I'm not really okay I was kind of in a rush so it's a it's a more in scatter plot. But then after that. It's the same cluster it's cluster on those are clusters on this plot. So it just kind of shows like the different kinds of like neighborhoods it's kind of like a second order thing. That's a really cool idea. Thank you. But the problem is like you can only do for like one gene at a time so it's nobody wants to do that for like 20,000 genes. So that's like a critical limitation so far. See the ones from online. Okay, so from Niels Ealing are call graphs, some similar to call pairs, meaning that they are being reconstructed upon sub setting. Yes. When they're reconstructed they are they reconstruct using the like the subset of the columns so. Yes. And then another one from Ryan Thompson. So are these polygons actually polygonal approximations of circles. For vision. Yes. Actually, you can you can look at the documentation of ST buffer function in in the SF package to to see the parameters and doing so, like how many I just do used to approximate. Another one from Pratipa. Can we use brands I or other statistics if there is a spatial trend non stationary and and I saw and I saw trophy seems differential spatial seems differential spatial and different in different dependency. Well, I can once I that will only be a beginning so any sort of it really is a problem here and we plan to add like a. Like a say. Like a program map like in different direction to to visualize and start to be and. Yes, but so far like one side it only it just considers the neighbors on the spatial graph in all directions or does not take into account. And start to be and. Yeah, at present. Yeah, we also, well, maybe can spot like a special trend when you're plotting some values in space but. But in the 1st version of Voyager, like it does not really like formally. That you like explore that, but I think in the future I also plan to like put some functionalities of spatial reg package here and that in the future version of it might be supported. Another 1 from May woods great workshop. Thanks. 1 of the limitations listed is the 2d geometry. Do you think the geometry could be extended to 3d to analyze multiple tissue slices. Ideally, yes, but I think it's actually more complicated. Well, actually, as simple features, it does support 3d data, but. But here the, I think the complication actually comes from the resolution, the resolution different directions that for for usually the X and Y resolution X and Y have much higher resolution and Z and. So, I'm still not sure how if the dimension should be treated differently or so. So, I think short answer is technically yes, but long answer is it's a bit more complicated. Any other questions from the room. Online. Thanks lambda for the great print worship. So. Are the spots the actual size, because I know that was 1 of the parameters when you're for your constructor function. Because later on I saw you have this function for counting the number of nuclei based on a segmentation mass you had. So, yeah, it is. So in space range output you have like a scale factor Jason file and that will. So that file has like a feel like which is basically the spot diameter in the. In pixels in the for resolution image and that's why I used here and. But meal like the exact exact location of the edges of the spot might depend miles depend on how you align the tissue on the slide so it's actually not like 100% sure like how accurate that is but police like quality of his speaking I think it gives you some information. So like the 0.7 parameter value. So that's just toy example so that that's not from that's not like meaningful and it's just used for demonstration. Well, because I feel like some of your later plots invite why is your. You mentioned like one of the limitations is that you cannot show the h&e scene. You're actually just plotting the spots with like some continuous metrics so you could have used other functions for that right now. Or am I missing an extra layer that. Well, that you have right now that the other functions. Well, so for that particular graph, for instance, actually the implementation that this possible feature function. It actually it's quite complicated because number 1 I have to deal with. I have to deal with the sample ID so. The sample ID can can be plot plotting like different facets and number 2 like how do I plot. How do I plot say gene expression on visit spots alongside like an annotation geometry and also like a when you when you want to color by like a both gene expression and like an attribute of annotation geometry than like a. I'll have to use like the GG new scale package to one different colors so you can tell them apart and also I think another one is the palette. But just now that's. So these are the default palettes for the continuous. Continuous variables just. Anyway. So so gene expression shown blue and the annotations are shown red and so that that's the default action here just let me know if you don't like it but for categorical variables the default palettes the default palettes from little seek so to make sure that it's color blind friendly. Awesome. Yeah, thank you. So, like, the part about the neighbors I feel like that could be really useful for QC, because sometimes you can find like a spot that feels a QC metric and so now I don't know there's a. Easy function to say like give me all the neighbors to the spots that fail like something. Right. So far. Well, yeah, you'll have to like directly interact with the list W object and it's a, it's basically within list of the object like to get some technical details. There's a, so it has a, it's an S3 object and has a field called neighbors and a British spelling with the you and you get that's a list of like a. Like, who are the neighbors of each spot and then from that you can you can carry like who are the neighbors of the like outlier spot but but so far there isn't like a easy function to do. So maybe so thank you for feedback I might implement that. Yeah, because I know like this is one of the, you don't want to compute a distance matrix that's like memory and blow up quite easily when you have a lot of samples. Right. I know this happens with base base. I mean, yeah, we can talk more about yeah. Yeah, so like I so far I don't really have a I don't know like what really is the best practice for the spatial neighborhood graph so yeah just to make it possible to do it like a bunch of different methods with SP depth but but I cannot tell you like which was the best. Right well join me in thanking lambda again for a wonderful talk. Demo of her package and I guess we have a little bit extra time the next workshop sets will start at 330.