diff --git a/getting_started_cli.qmd b/getting_started_cli.qmd index aa591e0..fce7245 100644 --- a/getting_started_cli.qmd +++ b/getting_started_cli.qmd @@ -43,7 +43,7 @@ flowchart TD ## Preparing and Installing Open Cravat - +{{< video https://youtu.be/24awSa0ry9M >}} Make sure you know where your Python is installed using the `which` command. In my example, I have python 3.11 installed via Homebrew, which is the python I want to use. In my case, since I'm on MacOS, I know that I run python programs using `python3` rather than `python`. @@ -155,7 +155,7 @@ Now you're ready to start installing annotators. ## Installing via Bioconda - +{{< video >}} If you prefer to install via `conda`/`mamba`, here are directions for you. You will want to install `mamba` via `miniforge`: download the installation scripts here. @@ -186,7 +186,7 @@ Now you can use Open-Cravat as below and install annotators. ## Installing annotators - +{{<.video https://youtu.be/N6cPmt1kNaU >}} The first thing we'll need to install are some core bits of Open Cravat, called `install-base`. We'll do this with the command `oc module`: @@ -280,8 +280,6 @@ Then the installation will proceed: ## Understanding the Input File Format -[Video Here] - We can generate an example file using `oc new example-input`. Note the period at the end, which means that we will generate the file in the current directory: ```bash @@ -321,7 +319,7 @@ chr4 1804372 + A T s1 ## Annotating our example - +{{< video https://youtu.be/gSeeDM9GUgQ >}} Now we have our example, we can run Open Cravat. This will annotate our `example_input` file with all available annotators. @@ -354,7 +352,7 @@ Finished normally. Runtime: 4.539s ## Starting the Results Viewer - +{{< video https://youtu.be/cNDrAPhPffg >}} We saw that one of the files generated was an `.sqlite` file. These are our results, which we can visualize using `oc gui`, which will launch the a web server so we can examine our results using the GUI: @@ -386,6 +384,8 @@ A window should open in your web browser. If not, enter https://localhost:8080 t ## Examining our Results File and Filtering +{{< video https://youtu.be/TYs3dGDFzQQ >}} + Now we take a look at our results in the web interface. Under the list of jobs, we can see our job. Let's select `Open Result Viewer` under the **Status** tab: ![](images/oc-filter-job.png) @@ -426,7 +426,7 @@ Just note that the filter is not actually applied to the data until you hit the ## Visualizing Our Filtered Results - +{{< video https://youtu.be/q75mk2SxqTA >}} Now that we've filtered, let's go back to the Summary Tab: diff --git a/getting_started_web.md b/getting_started_web.md new file mode 100644 index 0000000..07d34e5 --- /dev/null +++ b/getting_started_web.md @@ -0,0 +1,422 @@ +# Getting Started (Website/GUI) + + +- [Learning Objectives](#learning-objectives) +- [Understanding the Context for our + Task](#understanding-the-context-for-our-task) +- [Creating an OpenCRAVAT Account + (Web)](#creating-an-opencravat-account-web) +- [Installing OpenCRAVAT via Installer + (Local)](#installing-opencravat-via-installer-local) + - [Windows](#windows) + - [MacOS](#macos) + - [Linux](#linux) + - [Start OpenCRAVAT GUI](#start-opencravat-gui) +- [Browse Annotators (Web)](#browse-annotators-web) +- [Convert to Input File Format](#convert-to-input-file-format) +- [Submit Annotation Job](#submit-annotation-job) +- [Filter Results](#filter-results) +- [Visualize Filtered Results](#visualize-filtered-results) +- [What you learned](#what-you-learned) + +## Learning Objectives + +By the end of this tutorial, you should be able to: + +- **Create** as user account on the OpenCRAVAT site +- **Install** OpenCravat locally using an installer +- **Search** for available annotators on the open cravat site +- **Upload** and **annotate** variant files on the site +- **Filter** annotated results for visualization +- **Visualize** and **Summarize** Results in OpenCRAVAT +- **Export** and **Share** annotation results with others + +## Understanding the Context for our Task + +Let’s start with a research question we’re interested in. We have a list +of variants that we’ve found in our patient population of interest. Our +research question is: + +> Given this list of variants, which are potentially pathogenic? + +This research question will take us through understanding how the +OpenCRAVAT annotator works. + +To start, you can either install OpenCRAVAT locally, or create an +account on the website. Then you’ll follow the paths below. Here’s a +comparison of both approaches: + +| Feature | OpenCRAVAT Web | OpenCRAVAT Local | +|--------------------|----------------|-----------------------------------| +| Create Account | Yes on Web | Not required | +| Install Annotators | Pre-installed | Install in Store | +| Scriptable | No | Yes | +| **Protected Data** | No | Yes, with appropriate protections | + +Most importantly, **if you are using protected data, you should go the +local installer route**, with appropriate protections on your machine. + +You can click on each box in the diagram below to go to the relevant +section. We’ll have an appropriate callout to highlight the differences +where the two approaches differ. + +``` mermaid +flowchart TD + L[Creating an OpenCRAVAT Account] --> A + click L "#creating-an-opencravat-account-web" + M[Installing OpenCRAVAT via Installer] --> N + N["Install Annotators"] --> B + click M "#installing-opencravat-via-installer-local" + click N "#install-annotators-local" + A[Browse and select annotators] --> B[Convert to Input File Format] + click A "#browse-annotators-web" + click B "#convert-to-input-file-format" + B -->|Variant File Input| C[Submit Annotation Job] + click C "#submit-annotation-job" + C -->|Results|D["Filter Results"] --> E[Visualize Results] + click D "#filter-results" + click E "#visualize-results" +``` + +## Creating an OpenCRAVAT Account (Web) + +Let’s start out by creating an account on . +If your organization is running OpenCRAVAT locally, you will need to +find out the appropriate URL for the instance of OpenCravat. + +Here’s the initial screen we’ll see when we go to +. You’ll click on the **Sign Up** Button to +create an account. + +![](images/oc-first.png) Enter your details in the form, and sign up. +You’ll automatically be signed into the interface and will be ready to +go for the next step. + +![](images/oc-signup.png) + +Now you’re ready to browse the [OpenCRAVAT +Store](#browse-annotators-web) to look for annotators. + +## Installing OpenCRAVAT via Installer (Local) + +You can install OpenCRAVAT via the installers below: + +### Windows + +[Windows +installer](https://karchinlab.org/opencravat/installers/OpenCRAVAT-2.4.1.exe) + +Windows Defender may indicate that it prevented an unknown application +from running. If so, click the ‘More’ link on the message and then +select ‘Run Anyway’. An “OpenCRAVAT” icon will be created on the Desktop +and the Start Menu. + +### MacOS + + + +[Mac OS +installer](https://karchinlab.org/opencravat/installers/OpenCRAVAT.2.2.9.pkg) + +Right-click the downloaded file and select “Open”. Your Mac may ask you +to confirm stating that the file was not downloaded from the App Store. +Click “Open” button. Just double-clicking the installer may not enable +this “Open” option. + +### Linux + +Linux Users should refer to the Command Line Quickstart to install via +`pip`/`pip3`. + +### Start OpenCRAVAT GUI + + + +Now that OpenCRAVAT is installed, we can run the GUI. In a command +prompt (PowerShell or Terminal), you can start the OpenCRAVAT GUI by +typing: + +``` bash +oc gui +``` + +In MacOS, you can also launch OpenCRAVAT via clicking on the application +in your Applications folder. In Windows, you can click the desktop Icon +to launch it. + +You should see the following in your terminal: + + tedladeras@teds-MacBook-Pro ~ % oc gui + + ____ __________ ___ _ _____ ______ + / __ \____ ___ ____ / ____/ __ \/ | | / / |/_ __/ + / / / / __ \/ _ \/ __ \/ / / /_/ / /| | | / / /| | / / + / /_/ / /_/ / __/ / / / /___/ _, _/ ___ | |/ / ___ |/ / + \____/ .___/\___/_/ /_/\____/_/ |_/_/ |_|___/_/ |_/_/ + /_/ + + OpenCRAVAT is served at localhost:8080 + (To quit: Press Ctrl-C or Ctrl-Break if run on a Terminal or Windows, or click "Cancel" and then "Quit" if run through OpenCRAVAT app on Mac OS) + (Getting result of [example_input.sqlite]:[variant]...) + Done getting result of [example_input.sqlite][variant] in 0.029s + (Getting result of [example_input.sqlite]:[gene]...) + Done getting result of [example_input.sqlite][gene] in 0.021s + +A window should open in your web browser. If not, enter + to view the GUI. + +Now you can [browse and install the available +annotators](#browse-annotators) + +## Browse Annotators (Web) + + + +If we click on the **STORE** tab in the top left of the interface, we’ll +see the variety of annotators that are available to us. + +![](images/oc-browse-annotators-1.png) + +Let’s browse the clinically relevant annotators by clicking on the +`Clinically Relevant` checkbox: + +![](images/oc-browse-annotators-2.png) + +As we browse the annotators available to us, we notice two specific +annotators we want to work with. Let’s use two clinically relevant +annotators: [CiViC](https://civicdb.org/welcome) (Clinical +Interpretations of Variants in Cancer) and +[ClinVar](https://www.ncbi.nlm.nih.gov/clinvar/), a public archive of +interpretations of clinically relevant patients. + +To get more information, click on the CiViC box: + +![](images/oc-browse-annotators-3.png) And you’ll see more information +about the annotator: + +![](images/oc-browse-annotators-4-civic.png) + +> [!NOTE] +> +> ### For Local Users +> +> If you have installed OpenCRAVAT locally, you will have the option to +> install annotators on the store page. You can do this by clicking +> “Install” for the annotator of interest. Please note that some of the +> annotators use a lot of disk space, so keep that in mind before +> installing locally. +> +> ![](images/oc-install-annotators.png) +> +> You already have CiViC and ClinVar installed by default, so you don’t +> need to install them locally. + +Now we know which annotators we want to use, let’s [review input file +formats](#convert-to-input-file-format). + +## Convert to Input File Format + +OpenCRAVAT supports VCF files for input, but also has a simplified +format to be used for input files. + +We’ll use an example and annotate it. Let’s take a look at the first few +lines of this file to understand the input format. This example is +available by clicking the “TSV” button next to “example”: + +![](images/oc-annotate-example.png) + + chr1 69091 + A C s0 + chr1 69091 + ATG C s0 + chr6 31039077 + C G s0 + chr1 27612918 + G a s1 + chr1 27612918 + G A s0 + chrM 235 + A G clinvar + chrM 3308 + T C omim + chr8 54626835 + A T s0 + chr4 1804372 + A G s1 + chr4 1804372 + AT GC s1 + chr4 1804372 + A T s1 + chr1 369551 + G C s0 + chr10 121593817 - A T s0 + chr10 2987654 + T A s1 + +This format contains the following columns: `chromosome`, `position`, +`strand`, `reference`, `allele`, and `sample`. + +Much more information about the supported file formats are here: [File +Formats](https://open-cravat.readthedocs.io/en/latest/File-Formats.html). + +> [!NOTE] +> +> ### For Local Users +> +> You can download the example to annotate [here](). + +Now we have our input file, we can move on to [submitting our +job](#submit-annotation-job). + +## Submit Annotation Job + + + +Before we move on, let’s take a look at the overall workflow for +annotating in the GUI. We’ll start out by 1) submitting our input file, +2) selecting the annotators, and then 3) submitting our job. + +![](images/oc-gui-workflow.png) + +1. Let’s start the workflow. We can now add our variant file to + annotate and submit a job. Select the `JOBS` tab in the top left + corner of the interface. + +![](images/oc-jobs.png) + +Our example file corresponds to the `hg19/GRCH37` build, so make sure +that this genome is selected under the Genome field + +![](images/oc-jobs-genome.png) + +Now we’ll add our input file. Add your variant file here by clicking the +“ADD INPUT FILES” button. If you are using the built in example, you +won’t need to add it. + +![](images/oc-jobs-input.png) + +2. Now we can select our annotators. Under annotations in the box below + “Variants”, click on the “Clinical Relevance” category. + +![](images/oc-jobs-category.png) + +Select the `CiViC` (not `CiViC Gene`) and `ClinVar` annotation +checkboxes. + +![](images/oc-jobs-annotators.png) + +3. Now we’re ready to annotate. Click the **ANNOTATE** button at the + bottom of the webpage. Now you’ve submitted your job. + +![](images/oc-jobs-submit.png) + +Depending on the size of your Variant file, it may take time for your +job to finish. You’ll see the job running in the table on the right of +the interface. + +When our job is finished, we can [view our results and filter +them](#filter-results). + +## Filter Results + + + +> We are interested in those variants that have ClinVar annotation. How +> do we find those? + +Now we take a look at our results in the web interface. Under the list +of jobs, we can see our job. Let’s select `Open Result Viewer` under the +**Status** tab: + +![](images/oc-filter-job.png) Keep in mind that the web interface is +limited to visualizing 100,000 variants, so if you have a larger result +file, you’ll need to filter the results down. So let’s take a look at +how to filter our variants down. + +We can filter variants by selecting the Filter tab in the Results +viewer: + +![](images/oc-filter-select-tab.png) + +Under “Variant Properties” we can limit our list of variants to those +that have ClinVar annotations. Let’s build a filter using the Query +Builder, which will allow us to impose multiple criteria as a filter. + +![](images/oc-filter-query-builder.png) + +We’ll add a rule (a logical condition) to our filter using the `+` +button: + +![](images/oc-filter-add-rule.png) + +Now we’ll add a rule and select those that have `ClinVar` annotations. +To do this, we’ll first select a) `ClinVar` on the left, the b) +`Clinical Significance` column, and c) `has data`: + +![](images/oc-filter-create.png) Now we can apply this rule we’ve built +by clicking on the **Apply Filter** button on the bottom right of the +Query Builder: + +![](images/oc-filter-apply.png) How many variants are left after the +filtering? + +> [!NOTE] +> +> ### Calculating the Effect of Filters +> +> If you have multiple filters, you can actually precalculate the +> numbers of variants after filtering by using the icon below. +> +> ![](images/oc-filter-precalculate.png) +> +> This can be helpful to check if your filters are too strict (that is, +> they won’t return anything). +> +> Just note that the filter is not actually applied to the data until +> you hit the **Apply Filter** Button. + +## Visualize Filtered Results + + + +Now that we’ve filtered, let’s go back to the Summary Tab: + +![](images/oc-visualize-tab.png) In the Summary tab, we can see +information about the annotated variants, such as from the sequence +ontology. We can get the counts within a sequence ontology category by +mousing over that category in our plot: + +![](images/oc-visualize-seq-ontology.png) These visualizations can be +moved around and pinned. Using the camera icon, you can also save these +visualizations. + +Let’s move over to the **Variant** tab and look for pathogenic variants. +First, we’ll click over to the **Variant** tab: + +![](images/oc-visualize-variant.png) Scrolling to the right, we can see +there is a column for the ClinVar annotations. Notice the **+** on the +top right. We’ll click that to expand the ClinVar annotations: + +![](images/oc-visualize-clinvar.png) In the **Clinical Significance** +column, we can see that we can filter. Let’s select those variants that +have **pathogenic** significance. Clicking into the search box +underneath this column, we can select **pathogenic**: + +![](images/oc-visualize-pathogenic.png) + +How many variants are pathogenic? + +The last thing we might want to do is to export our results. We can use +the export button at the bottom of the table: + +![](images/oc-export-table.png) + +When you click that, you will have the option to export the variant +level results as a tab seperated value (TSV) file. Note that this result +table will have filters applied to it as well. + +> [!NOTE] +> +> ### Multiple Rules +> +> Note that we could have limited our search to pathogenic variants by +> adding another filter rule like we did above in the filtering step. +> We’re showing this way in case you didn’t know the available +> categories within the `Clinical Significance` column. + +## What you learned + +You learned a lot in this section. You learned how to: + +- Create a User Account +- Browse OpenCRAVAT’s store to look for annotators +- Submit a job to the Open-Cravat server +- Filter results in the Results Viewer +- Visualize results in the Results Viewer diff --git a/getting_started_web.qmd b/getting_started_web.qmd index b9a7450..ea09588 100644 --- a/getting_started_web.qmd +++ b/getting_started_web.qmd @@ -3,6 +3,7 @@ title: "Getting Started (Website/GUI)" format: html: default rst: default + gfm: default toc: true anchor-sections: true --- diff --git a/getting_started_web.rst b/getting_started_web.rst index e22c49a..9761959 100644 --- a/getting_started_web.rst +++ b/getting_started_web.rst @@ -1,80 +1,188 @@ -========================= -Getting Started (Website) -========================= +============================= +Getting Started (Website/GUI) +============================= .. contents:: :depth: 3 .. +Learning Objectives +=================== + +By the end of this tutorial, you should be able to: + +- **Create** as user account on the OpenCRAVAT site +- **Install** OpenCravat locally using an installer +- **Search** for available annotators on the open cravat site +- **Upload** and **annotate** variant files on the site +- **Filter** annotated results for visualization +- **Visualize** and **Summarize** Results in OpenCRAVAT +- **Export** and **Share** annotation results with othersls + + Understanding the Context for our Task ====================================== Let’s start with a research question we’re interested in. We have a list -of exome variants that we’ve found in our patient population of -interest. Our research question is: +of variants that we’ve found in our patient population of interest. Our +research question is: Given this list of variants, which are potentially pathogenic? This research question will take us through understanding how the -Open-Cravat annotator works. +OpenCRAVAT annotator works. -Learning Objectives -=================== +To start, you can either install OpenCRAVAT locally, or create an +account on the website. Then you’ll follow the paths below. Here’s a +comparison of both approaches: -- **Create** as user account on the open cravat site -- **Search** for available annotators on the open cravat site -- **Upload** and **annotate** variant files on the site -- **Filter** annotated results for visualization -- **Visualize** and **Summarize** Results in Open-Cravat -- **Export** and **Share** annotation results with others +================== ============== ================================= +Feature OpenCRAVAT Web OpenCRAVAT Local +================== ============== ================================= +Create Account Yes on Web Not required +Install Annotators Pre-installed Install in Store +Scriptable No Yes +**Protected Data** No Yes, with appropriate protections +================== ============== ================================= + +Most importantly, **if you are using protected data, you should go the +local installer route**, with appropriate protections on your machine. You can click on each box in the diagram below to go to the relevant -section. +section. We’ll have an appropriate callout to highlight the differences +where the two approaches differ. + +.. mermaid:: + + flowchart TD + L[Creating an OpenCRAVAT Account] --> A + click L "#creating-an-opencravat-account-web" + M[Installing OpenCRAVAT via Installer] --> N + N["Install Annotators"] --> B + click M "#installing-opencravat-via-installer-local" + click N "#install-annotators-local" + A[Browse and select annotators] --> B[Convert to Input File Format] + click A "#browse-annotators-web" + click B "#convert-to-input-file-format" + B -->|Variant File Input| C[Submit Annotation Job] + click C "#submit-annotation-job" + C -->|Results|D["Filter Results"] --> E[Visualize Results] + click D "#filter-results" + click E "#visualize-results" + +Creating an OpenCRAVAT Account (Web) +==================================== -.. container:: cell +Let’s start out by creating an account on https://run.opencravat.org. If +your organization is running OpenCRAVAT locally, you will need to find +out the appropriate URL for the instance of OpenCravat. - .. container:: cell-output-display +Here’s the initial screen we’ll see when we go to +https://run.opencravat.org. You’ll click on the **Sign Up** Button to +create an account. - .. container:: +|image2| Enter your details in the form, and sign up. You’ll +automatically be signed into the interface and will be ready to go for +the next step. - .. container:: +|image3| - .. image:: getting_started_web_files/figure-rst/mermaid-figure-1.png - :width: 2.81in - :height: 5.25in +Now you’re ready to browse the `OpenCRAVAT +Store <#browse-annotators-web>`__ to look for annotators. -Creating an Open Cravat Account -=============================== +Installing OpenCRAVAT via Installer (Local) +=========================================== -Let’s start out by creating an account on https://run.opencravat.org. If -your organization is running Open-Cravat locally, you will need to find -out the appropriate URL for the instance of Open-Cravat. +You can install OpenCRAVAT via the installers below: -Here’s the iniial screen we’ll see when we go to -https://run.opencravat.org. You’ll click on the “Sign Up” Button to -create an account. +Windows +------- -|image1| Enter your details in the form, and sign up. You’ll -automatically be signed into the interface and will be ready to go for -the next step. +`Windows +installer `__ + +Windows Defender may indicate that it prevented an unknown application +from running. If so, click the ‘More’ link on the message and then +select ‘Run Anyway’. An “OpenCRAVAT” icon will be created on the Desktop +and the Start Menu. + +MacOS +----- + +https://youtu.be/6f5fB6fVdBs + +`Mac OS +installer `__ + +Right-click the downloaded file and select “Open”. Your Mac may ask you +to confirm stating that the file was not downloaded from the App Store. +Click “Open” button. Just double-clicking the installer may not enable +this “Open” option. + +Linux +----- + +Linux Users should refer to the Command Line Quickstart to install via +``pip``/``pip3``. + +Start OpenCRAVAT GUI +-------------------- + +https://youtu.be/cNDrAPhPffg + +Now that OpenCRAVAT is installed, we can run the GUI. In a command +prompt (PowerShell or Terminal), you can start the OpenCRAVAT GUI by +typing: -.. image:: images/oc-signup.png +.. code:: bash -Browse Annotators -================= + oc gui -[Video Here] +In MacOS, you can also launch OpenCRAVAT via clicking on the application +in your Applications folder. In Windows, you can click the desktop Icon +to launch it. -If we click on the ``STORE`` tab in the top left of the interface, we’ll +You should see the following in your terminal: + +:: + + tedladeras@teds-MacBook-Pro ~ % oc gui + + ____ __________ ___ _ _____ ______ + / __ \____ ___ ____ / ____/ __ \/ | | / / |/_ __/ + / / / / __ \/ _ \/ __ \/ / / /_/ / /| | | / / /| | / / + / /_/ / /_/ / __/ / / / /___/ _, _/ ___ | |/ / ___ |/ / + \____/ .___/\___/_/ /_/\____/_/ |_/_/ |_|___/_/ |_/_/ + /_/ + + OpenCRAVAT is served at localhost:8080 + (To quit: Press Ctrl-C or Ctrl-Break if run on a Terminal or Windows, or click "Cancel" and then "Quit" if run through OpenCRAVAT app on Mac OS) + (Getting result of [example_input.sqlite]:[variant]...) + Done getting result of [example_input.sqlite][variant] in 0.029s + (Getting result of [example_input.sqlite]:[gene]...) + Done getting result of [example_input.sqlite][gene] in 0.021s + +A window should open in your web browser. If not, enter +https://localhost:8080 to view the GUI. + +Now you can `browse and install the available +annotators <#browse-annotators>`__ + +Browse Annotators (Web) +======================= + +https://youtu.be/B2jiQcIkX8c + +If we click on the **STORE** tab in the top left of the interface, we’ll see the variety of annotators that are available to us. -.. image:: images/oc-browse-annotators-1.png +|image4| Let’s browse the clinically relevant annotators by clicking on the -“Clinically Relevant” checkbox: +``Clinically Relevant`` checkbox: -.. image:: images/oc-browse-annotators-2.png +|image5| As we browse the annotators available to us, we notice two specific annotators we want to work with. Let’s use two clinically relevant @@ -83,100 +191,137 @@ Interpretations of Variants in Cancer) and `ClinVar `__, a public archive of interpretations of clinically relevant patients. -To get more information, click on the box with the CiViC: +To get more information, click on the CiViC box: + +|image6| And you’ll see more information about the annotator: + +|image7| + +.. container:: -|image2| And you’ll see more information about the annotator: + **For Local Users** -.. image:: images/oc-browse-annotators-4-civic.png + If you have installed OpenCRAVAT locally, you will have the option + to install annotators on the store page. You can do this by + clicking “Install” for the annotator of interest. Please note that + some of the annotators use a lot of disk space, so keep that in + mind before installing locally. -Now we know which annotators we want to use, so let’s annotate a file. + |image8| + + You already have CiViC and ClinVar installed by default, so you + don’t need to install them locally. + +Now we know which annotators we want to use, let’s `review input file +formats <#convert-to-input-file-format>`__. Convert to Input File Format ============================ -Open-Cravat supports VCF files for input, but also has a simplified +OpenCRAVAT supports VCF files for input, but also has a simplified format to be used for input files. -We’ll use an exome example and annotate it. Let’s take a look at the -first few lines of this file to understand the input format. +We’ll use an example and annotate it. Let’s take a look at the first few +lines of this file to understand the input format. This example is +available by clicking the “TSV” button next to “example”: + +|image9| :: - chr1 946247 G A - chr1 952421 A G - chr1 953259 T C - chr1 953279 T C - chr1 961945 G C - chr1 965125 G C - chr1 965338 TTAT - - chr1 965667 CC - - chr1 973858 G C + chr1 69091 + A C s0 + chr1 69091 + ATG C s0 + chr6 31039077 + C G s0 + chr1 27612918 + G a s1 + chr1 27612918 + G A s0 + chrM 235 + A G clinvar + chrM 3308 + T C omim + chr8 54626835 + A T s0 + chr4 1804372 + A G s1 + chr4 1804372 + AT GC s1 + chr4 1804372 + A T s1 + chr1 369551 + G C s0 + chr10 121593817 - A T s0 + chr10 2987654 + T A s1 This format contains the following columns: ``chromosome``, -``position``, ``reference``, and ``allele``. +``position``, ``strand``, ``reference``, ``allele``, and ``sample``. Much more information about the supported file formats are here: `File Formats `__. +.. container:: + + **For Local Users** + + You can download the example to annotate `here <>`__. + +Now we have our input file, we can move on to `submitting our +job <#submit-annotation-job>`__. + Submit Annotation Job ===================== -[video here] +https://youtu.be/xSOxEbsW--c Before we move on, let’s take a look at the overall workflow for annotating in the GUI. We’ll start out by 1) submitting our input file, 2) selecting the annotators, and then 3) submitting our job. -.. image:: images/oc-gui-workflow.png +|image10| -Let’s start the workflow. We can now add our variant file to annotate -and submit a job. Select the ``JOBS`` tab in the top left corner of the -interface. +1. Let’s start the workflow. We can now add our variant file to annotate + and submit a job. Select the ``JOBS`` tab in the top left corner of + the interface. -.. image:: images/oc-jobs.png +|image11| -Our exome file corresponds to the ``hg19/GRCH37`` build, so make sure +Our example file corresponds to the ``hg19/GRCH37`` build, so make sure that this genome is selected under the Genome field -.. image:: images/oc-jobs-genome.png +|image12| -Now we’ll add our input file. Add your ``Pedja_exome.tsv`` file here by -clicking the “ADD INPUT FILES” button: +Now we’ll add our input file. Add your variant file here by clicking the +“ADD INPUT FILES” button. If you are using the built in example, you +won’t need to add it. -.. image:: images/oc-jobs-input.png +|image13| -Now we can select our annotators. Under annotations in the box below -“Variants”, click on the “Clinical Relevance” category. +2. Now we can select our annotators. Under annotations in the box below + “Variants”, click on the “Clinical Relevance” category. -.. image:: images/oc-jobs-category.png +|image14| Select the ``CiViC`` (not ``CiViC Gene``) and ``ClinVar`` annotation checkboxes. -.. image:: images/oc-jobs-annotators.png +|image15| -Now we’re ready to annotate. Click the ``ANNOTATE`` button at the bottom -of the webpage. Now you’ve submitted your job. +3. Now we’re ready to annotate. Click the **ANNOTATE** button at the + bottom of the webpage. Now you’ve submitted your job. -.. image:: images/oc-jobs-submit.png +|image16| Depending on the size of your Variant file, it may take time for your job to finish. You’ll see the job running in the table on the right of the interface. +When our job is finished, we can `view our results and filter +them <#filter-results>`__. + Filter Results ============== -[Video here] +https://youtu.be/TYs3dGDFzQQ - We are interested in those variants that are associated with Breast - Cancer in ClinVar. How do we find those? + We are interested in those variants that have ClinVar annotation. How + do we find those? Now we take a look at our results in the web interface. Under the list of jobs, we can see our job. Let’s select ``Open Result Viewer`` under the **Status** tab: -|image3| Keep in mind that the web interface is limited to visualizing +|image17| Keep in mind that the web interface is limited to visualizing 100,000 variants, so if you have a larger result file, you’ll need to filter the results down. So let’s take a look at how to filter our variants down. @@ -184,75 +329,131 @@ variants down. We can filter variants by selecting the Filter tab in the Results viewer: -.. image:: images/oc-filter-select-tab.png +|image18| Under “Variant Properties” we can limit our list of variants to those that have ClinVar annotations. Let’s build a filter using the Query Builder, which will allow us to impose multiple criteria as a filter. -.. image:: images/oc-filter-query-builder.png +|image19| We’ll add a rule (a logical condition) to our filter using the ``+`` button: -.. image:: images/oc-filter-add-rule.png +|image20| Now we’ll add a rule and select those that have ``ClinVar`` annotations. -To do this, we’ll first select ``ClinVar`` on the left, the -``Clinical Significance`` column, and ``has data``: +To do this, we’ll first select a) ``ClinVar`` on the left, the b) +``Clinical Significance`` column, and c) ``has data``: + +|image21| Now we can apply this rule we’ve built by clicking on the +**Apply Filter** button on the bottom right of the Query Builder: + +|image22| How many variants are left after the filtering? + +.. container:: + + **Calculating the Effect of Filters** -|image4| Now we can apply this rule we’ve built by clicking on the -``Apply Filter`` button on the bottom right of the Query Builder: + If you have multiple filters, you can actually precalculate the + numbers of variants after filtering by using the icon below. -|image5| How many variants are left after the filtering? + |image23| -Visualize Results -================= + This can be helpful to check if your filters are too strict (that + is, they won’t return anything). -[Video here] + Just note that the filter is not actually applied to the data + until you hit the **Apply Filter** Button. + +Visualize Filtered Results +========================== + +https://youtu.be/MPW2MXBJG7w Now that we’ve filtered, let’s go back to the Summary Tab: -|image6| In the Visualize tab, we can see information about the -annotated variants, such as from the sequence ontology. We can get the -counts within a sequence ontology category by mousing over that category -in our plot: +|image24| In the Summary tab, we can see information about the annotated +variants, such as from the sequence ontology. We can get the counts +within a sequence ontology category by mousing over that category in our +plot: -|image7| Using the save icon, you can also save these visualizations. +|image25| These visualizations can be moved around and pinned. Using the +camera icon, you can also save these visualizations. Let’s move over to the **Variant** tab and look for pathogenic variants. First, we’ll click over to the **Variant** tab: -|image8| Scrolling to the right, we can see there is a column for the +|image26| Scrolling to the right, we can see there is a column for the ClinVar annotations. Notice the **+** on the top right. We’ll click that to expand the ClinVar annotations: -|image9| In the **Clinical Significance** column, we can see that we can -filter. Let’s select those variants that have **pathogenic** +|image27| In the **Clinical Significance** column, we can see that we +can filter. Let’s select those variants that have **pathogenic** significance. Clicking into the search box underneath this column, we can select **pathogenic**: -.. image:: images/oc-visualize-pathogenic.png +|image28| How many variants are pathogenic? +The last thing we might want to do is to export our results. We can use +the export button at the bottom of the table: + +|image29| + +When you click that, you will have the option to export the variant +level results as a tab seperated value (TSV) file. Note that this result +table will have filters applied to it as well. + +.. container:: + + **Multiple Rules** + + Note that we could have limited our search to pathogenic variants + by adding another filter rule like we did above in the filtering + step. We’re showing this way in case you didn’t know the available + categories within the ``Clinical Significance`` column. + What you learned ================ You learned a lot in this section. You learned how to: - Create a User Account -- Browse Open-Cravat’s store to look for annotators +- Browse OpenCRAVAT’s store to look for annotators - Submit a job to the Open-Cravat server - Filter results in the Results Viewer - Visualize results in the Results Viewer -.. |image1| image:: images/oc-first.png -.. |image2| image:: images/oc-browse-annotators-3.png -.. |image3| image:: images/oc-filter-job.png -.. |image4| image:: images/oc-filter-create.png -.. |image5| image:: images/oc-filter-apply.png -.. |image6| image:: images/oc-visualize-tab.png -.. |image7| image:: images/oc-visualize-seq-ontology.png -.. |image8| image:: images/oc-visualize-variant.png -.. |image9| image:: images/oc-visualize-clinvar.png +.. |image1| image:: getting_started_web_files/figure-rst/mermaid-figure-1.png + :width: 6.06in + :height: 5.25in +.. |image2| image:: images/oc-first.png +.. |image3| image:: images/oc-signup.png +.. |image4| image:: images/oc-browse-annotators-1.png +.. |image5| image:: images/oc-browse-annotators-2.png +.. |image6| image:: images/oc-browse-annotators-3.png +.. |image7| image:: images/oc-browse-annotators-4-civic.png +.. |image8| image:: images/oc-install-annotators.png +.. |image9| image:: images/oc-annotate-example.png +.. |image10| image:: images/oc-gui-workflow.png +.. |image11| image:: images/oc-jobs.png +.. |image12| image:: images/oc-jobs-genome.png +.. |image13| image:: images/oc-jobs-input.png +.. |image14| image:: images/oc-jobs-category.png +.. |image15| image:: images/oc-jobs-annotators.png +.. |image16| image:: images/oc-jobs-submit.png +.. |image17| image:: images/oc-filter-job.png +.. |image18| image:: images/oc-filter-select-tab.png +.. |image19| image:: images/oc-filter-query-builder.png +.. |image20| image:: images/oc-filter-add-rule.png +.. |image21| image:: images/oc-filter-create.png +.. |image22| image:: images/oc-filter-apply.png +.. |image23| image:: images/oc-filter-precalculate.png +.. |image24| image:: images/oc-visualize-tab.png +.. |image25| image:: images/oc-visualize-seq-ontology.png +.. |image26| image:: images/oc-visualize-variant.png +.. |image27| image:: images/oc-visualize-clinvar.png +.. |image28| image:: images/oc-visualize-pathogenic.png +.. |image29| image:: images/oc-export-table.png diff --git a/getting_started_web_files/figure-rst/mermaid-figure-1.png b/getting_started_web_files/figure-rst/mermaid-figure-1.png index 05335f7..b7f9bf5 100644 Binary files a/getting_started_web_files/figure-rst/mermaid-figure-1.png and b/getting_started_web_files/figure-rst/mermaid-figure-1.png differ diff --git a/making_annototator_modules_files/libs/clipboard/clipboard.min.js b/making_annototator_modules_files/libs/clipboard/clipboard.min.js deleted file mode 100644 index 1103f81..0000000 --- a/making_annototator_modules_files/libs/clipboard/clipboard.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * clipboard.js v2.0.11 - * https://clipboardjs.com/ - * - * Licensed MIT © Zeno Rocha - */ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return b}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),r=n.n(e);function c(t){try{return document.execCommand(t)}catch(t){return}}var a=function(t){t=r()(t);return c("cut"),t};function o(t,e){var n,o,t=(n=t,o="rtl"===document.documentElement.getAttribute("dir"),(t=document.createElement("textarea")).style.fontSize="12pt",t.style.border="0",t.style.padding="0",t.style.margin="0",t.style.position="absolute",t.style[o?"right":"left"]="-9999px",o=window.pageYOffset||document.documentElement.scrollTop,t.style.top="".concat(o,"px"),t.setAttribute("readonly",""),t.value=n,t);return e.container.appendChild(t),e=r()(t),c("copy"),t.remove(),e}var f=function(t){var e=1 - -const defaultCSS = - '.label text {fill: var(--mermaid-fg-color);}.node circle, .node ellipse, .node path, .node polygon, .node rect {fill: var(--mermaid-node-bg-color);stroke: var(--mermaid-node-fg-color);}marker {fill: var(--mermaid-edge-color) !important;}.edgeLabel .label rect {fill: #0000;}.label {color: var(--mermaid-label-fg-color);font-family: var(--mermaid-font-family);}.label foreignObject {line-height: normal;overflow: visible;}.label div .edgeLabel {color: var(--mermaid-label-fg-color);}.edgeLabel, .edgeLabel rect, .label div .edgeLabel {background-color: var(--mermaid-label-bg-color);}.edgeLabel, .edgeLabel rect {fill: var(--mermaid-label-bg-color);color: var(--mermaid-edge-color);}.edgePath .path, .flowchart-link {stroke: var(--mermaid-edge-color);}.edgePath .arrowheadPath {fill: var(--mermaid-edge-color);stroke: none;}.cluster rect {fill: var(--mermaid-fg-color--lightest);stroke: var(--mermaid-fg-color--lighter);}.cluster span {color: var(--mermaid-label-fg-color);font-family: var(--mermaid-font-family);}defs #flowchart-circleEnd, defs #flowchart-circleStart, defs #flowchart-crossEnd, defs #flowchart-crossStart, defs #flowchart-pointEnd, defs #flowchart-pointStart {stroke: none;}g.classGroup line, g.classGroup rect {fill: var(--mermaid-node-bg-color);stroke: var(--mermaid-node-fg-color);}g.classGroup text {fill: var(--mermaid-label-fg-color);font-family: var(--mermaid-font-family);}.classLabel .box {fill: var(--mermaid-label-bg-color);background-color: var(--mermaid-label-bg-color);opacity: 1;}.classLabel .label {fill: var(--mermaid-label-fg-color);font-family: var(--mermaid-font-family);}.node .divider {stroke: var(--mermaid-node-fg-color);}.relation {stroke: var(--mermaid-edge-color);}.cardinality {fill: var(--mermaid-label-fg-color);font-family: var(--mermaid-font-family);}.cardinality text {fill: inherit !important;}defs #classDiagram-compositionEnd, defs #classDiagram-compositionStart, defs #classDiagram-dependencyEnd, defs #classDiagram-dependencyStart, defs #classDiagram-extensionEnd, defs #classDiagram-extensionStart {fill: var(--mermaid-edge-color) !important;stroke: var(--mermaid-edge-color) !important;}defs #classDiagram-aggregationEnd, defs #classDiagram-aggregationStart {fill: var(--mermaid-label-bg-color) !important;stroke: var(--mermaid-edge-color) !important;}g.stateGroup rect {fill: var(--mermaid-node-bg-color);stroke: var(--mermaid-node-fg-color);}g.stateGroup .state-title {fill: var(--mermaid-label-fg-color) !important;font-family: var(--mermaid-font-family);}g.stateGroup .composit {fill: var(--mermaid-label-bg-color);}.nodeLabel {color: var(--mermaid-label-fg-color);font-family: var(--mermaid-font-family);}.node circle.state-end, .node circle.state-start, .start-state {fill: var(--mermaid-edge-color);stroke: none;}.end-state-inner, .end-state-outer {fill: var(--mermaid-edge-color);}.end-state-inner, .node circle.state-end {stroke: var(--mermaid-label-bg-color);}.transition {stroke: var(--mermaid-edge-color);}[id^="state-fork"] rect, [id^="state-join"] rect {fill: var(--mermaid-edge-color) !important;stroke: none !important;}.statediagram-cluster.statediagram-cluster .inner {fill: var(--mermaid-bg-color);}.statediagram-cluster rect {fill: var(--mermaid-node-bg-color);stroke: var(--mermaid-node-fg-color);}.statediagram-state rect.divider {fill: var(--mermaid-fg-color--lightest);stroke: var(--mermaid-fg-color--lighter);}defs #statediagram-barbEnd {stroke: var(--mermaid-edge-color);}.entityBox {fill: var(--mermaid-label-bg-color);stroke: var(--mermaid-node-fg-color);}.entityLabel {fill: var(--mermaid-label-fg-color);font-family: var(--mermaid-font-family);}.relationshipLabelBox {fill: var(--mermaid-label-bg-color);fill-opacity: 1;background-color: var(--mermaid-label-bg-color);opacity: 1;}.relationshipLabel {fill: var(--mermaid-label-fg-color);}.relationshipLine {stroke: var(--mermaid-edge-color);}defs #ONE_OR_MORE_END *, defs #ONE_OR_MORE_START *, defs #ONLY_ONE_END *, defs #ONLY_ONE_START *, defs #ZERO_OR_MORE_END *, defs #ZERO_OR_MORE_START *, defs #ZERO_OR_ONE_END *, defs #ZERO_OR_ONE_START * {stroke: var(--mermaid-edge-color) !important;}.actor, defs #ZERO_OR_MORE_END circle, defs #ZERO_OR_MORE_START circle {fill: var(--mermaid-label-bg-color);}.actor {stroke: var(--mermaid-node-fg-color);}text.actor > tspan {fill: var(--mermaid-label-fg-color);font-family: var(--mermaid-font-family);}line {stroke: var(--mermaid-fg-color--lighter);}.messageLine0, .messageLine1 {stroke: var(--mermaid-edge-color);}.loopText > tspan, .messageText, .noteText > tspan {fill: var(--mermaid-edge-color);stroke: none;font-family: var(--mermaid-font-family) !important;}.noteText > tspan {fill: #000;}#arrowhead path {fill: var(--mermaid-edge-color);stroke: none;}.loopLine {stroke: var(--mermaid-node-fg-color);}.labelBox, .loopLine {fill: var(--mermaid-node-bg-color);}.labelBox {stroke: none;}.labelText, .labelText > span {fill: var(--mermaid-node-fg-color);font-family: var(--mermaid-font-family);}'; - -const mermaidThemeEl = document.querySelector('meta[name="mermaid-theme"]'); -if (mermaidThemeEl) { - mermaidOpts.theme = mermaidThemeEl.content; -} else { - mermaidOpts.themeCSS = defaultCSS; -} - -mermaid.initialize(mermaidOpts); - -const _quartoMermaid = { - // NB: there's effectively a copy of this function - // in `core/svg.ts`. - // if you change something here, you must keep it consistent there as well. - setSvgSize(svg) { - const { widthInPoints, heightInPoints, explicitHeight, explicitWidth } = - this.resolveSize(svg); - - if (explicitWidth && explicitHeight) { - svg.setAttribute("width", widthInPoints); - svg.setAttribute("height", heightInPoints); - svg.style.maxWidth = null; // remove mermaid's default max-width - } else { - if (explicitWidth) { - svg.style.maxWidth = `${widthInPoints}px`; - } - if (explicitHeight) { - svg.style.maxHeight = `${heightInPoints}px`; - } - } - }, - - // NB: there's effectively a copy of this function - // in `core/svg.ts`. - // if you change something here, you must keep it consistent there as well. - makeResponsive(svg) { - const width = svg.getAttribute("width"); - if (width === null) { - throw new Error("Couldn't find SVG width"); - } - const numWidth = Number(width.slice(0, -2)); - - if (numWidth > 650) { - changed = true; - svg.setAttribute("width", "100%"); - svg.removeAttribute("height"); - } - }, - - // NB: there's effectively a copy of this function - // in `core/svg.ts`. - // if you change something here, you must keep it consistent there as well. - fixupAlignment(svg, align) { - let style = svg.getAttribute("style") || ""; - - switch (align) { - case "left": - style = `${style}; display: block; margin: auto auto auto 0`; - break; - case "right": - style = `${style}; display: block; margin: auto 0 auto auto`; - break; - case "center": - style = `${style}; display: block; margin: auto auto auto auto`; - break; - } - svg.setAttribute("style", style); - }, - - resolveOptions(svgEl) { - return svgEl.parentElement.parentElement.parentElement.parentElement - .dataset; - }, - - // NB: there's effectively a copy of this function - // in our mermaid runtime in `core/svg.ts`. - // if you change something here, you must keep it consistent there as well. - resolveSize(svgEl) { - const inInches = (size) => { - if (size.endsWith("in")) { - return Number(size.slice(0, -2)); - } - if (size.endsWith("pt") || size.endsWith("px")) { - // assume 96 dpi for now - return Number(size.slice(0, -2)) / 96; - } - return Number(size); - }; - - // these are figWidth and figHeight on purpose, - // because data attributes are translated to camelCase by the DOM API - const kFigWidth = "figWidth", - kFigHeight = "figHeight"; - const options = this.resolveOptions(svgEl); - let width = svgEl.getAttribute("width"); - let height = svgEl.getAttribute("height"); - const getViewBox = () => { - const vb = svgEl.attributes.getNamedItem("viewBox").value; // do it the roundabout way so that viewBox isn't dropped by deno_dom and text/html - if (!vb) return undefined; - const lst = vb.trim().split(" ").map(Number); - if (lst.length !== 4) return undefined; - if (lst.some(isNaN)) return undefined; - return lst; - }; - if (!width || !height) { - // attempt to resolve figure dimensions via viewBox - const viewBox = getViewBox(); - if (viewBox !== undefined) { - const [_mx, _my, vbWidth, vbHeight] = viewBox; - width = `${vbWidth}px`; - height = `${vbHeight}px`; - } else { - throw new Error( - "Mermaid generated an SVG without a viewbox attribute. Without knowing the diagram dimensions, quarto cannot convert it to a PNG" - ); - } - } - - let svgWidthInInches, svgHeightInInches; - - if ( - (width.slice(0, -2) === "pt" && height.slice(0, -2) === "pt") || - (width.slice(0, -2) === "px" && height.slice(0, -2) === "px") || - (!isNaN(Number(width)) && !isNaN(Number(height))) - ) { - // we assume 96 dpi which is generally what seems to be used. - svgWidthInInches = Number(width.slice(0, -2)) / 96; - svgHeightInInches = Number(height.slice(0, -2)) / 96; - } - const viewBox = getViewBox(); - if (viewBox !== undefined) { - // assume width and height come from viewbox. - const [_mx, _my, vbWidth, vbHeight] = viewBox; - svgWidthInInches = vbWidth / 96; - svgHeightInInches = vbHeight / 96; - } else { - throw new Error( - "Internal Error: Couldn't resolve width and height of SVG" - ); - } - const svgWidthOverHeight = svgWidthInInches / svgHeightInInches; - let widthInInches, heightInInches; - - if (options[kFigWidth] && options[kFigHeight]) { - // both were prescribed, so just go with them - widthInInches = inInches(String(options[kFigWidth])); - heightInInches = inInches(String(options[kFigHeight])); - } else if (options[kFigWidth]) { - // we were only given width, use that and adjust height based on aspect ratio; - widthInInches = inInches(String(options[kFigWidth])); - heightInInches = widthInInches / svgWidthOverHeight; - } else if (options[kFigHeight]) { - // we were only given height, use that and adjust width based on aspect ratio; - heightInInches = inInches(String(options[kFigHeight])); - widthInInches = heightInInches * svgWidthOverHeight; - } else { - // we were not given either, use svg's prescribed height - heightInInches = svgHeightInInches; - widthInInches = svgWidthInInches; - } - - return { - widthInInches, - heightInInches, - widthInPoints: Math.round(widthInInches * 96), - heightInPoints: Math.round(heightInInches * 96), - explicitWidth: options?.[kFigWidth] !== undefined, - explicitHeight: options?.[kFigHeight] !== undefined, - }; - }, - - postProcess(svg) { - const options = this.resolveOptions(svg); - if ( - options.responsive && - options["figWidth"] === undefined && - options["figHeight"] === undefined - ) { - this.makeResponsive(svg); - } else { - this.setSvgSize(svg); - } - if (options["reveal"]) { - this.fixupAlignment(svg, options["figAlign"] || "center"); - } - - // forward align attributes to the correct parent dif - // so that the svg figure is aligned correctly - const div = svg.parentElement.parentElement.parentElement; - const align = div.parentElement.parentElement.dataset.layoutAlign; - if (align) { - div.classList.remove("quarto-figure-left"); - div.classList.remove("quarto-figure-center"); - div.classList.remove("quarto-figure-right"); - div.classList.add(`quarto-figure-${align}`); - } - }, -}; - -// deno-lint-ignore no-window-prefix -window.addEventListener( - "load", - async function () { - let i = 0; - // we need pre because of whitespace preservation - for (const el of Array.from(document.querySelectorAll("pre.mermaid-js"))) { - //   doesn't appear to be treated as whitespace by mermaid - // so we replace it with a space. - const text = el.textContent.replaceAll(" ", " "); - const { svg: output } = await mermaid.mermaidAPI.render( - `mermaid-${++i}`, - text, - el - ); - el.innerHTML = output; - if (el.dataset.label) { - // patch mermaid's emitted style - const svg = el.firstChild; - const style = svg.querySelector("style"); - style.innerHTML = style.innerHTML.replaceAll( - `#${svg.id}`, - `#${el.dataset.label}-mermaid` - ); - svg.id = el.dataset.label + "-mermaid"; - delete el.dataset.label; - } - - const svg = el.querySelector("svg"); - const parent = el.parentElement; - parent.removeChild(el); - parent.appendChild(svg); - svg.classList.add("mermaid-js"); - } - for (const svgEl of Array.from( - document.querySelectorAll("svg.mermaid-js") - )) { - _quartoMermaid.postProcess(svgEl); - } - }, - false -); diff --git a/making_annototator_modules_files/libs/quarto-diagram/mermaid.css b/making_annototator_modules_files/libs/quarto-diagram/mermaid.css deleted file mode 100644 index 9f8bb7c..0000000 --- a/making_annototator_modules_files/libs/quarto-diagram/mermaid.css +++ /dev/null @@ -1,13 +0,0 @@ -.mermaidTooltip { - position: absolute; - text-align: center; - max-width: 200px; - padding: 2px; - font-family: "trebuchet ms", verdana, arial; - font-size: 12px; - background: #ffffde; - border: 1px solid #aaaa33; - border-radius: 2px; - pointer-events: none; - z-index: 1000; -}