<!DOCTYPE html>
<html>

  <head>
 
    <link  rel="stylesheet" href="https://ebi.emblstatic.net/web_guidelines/EBI-Icon-fonts/v1.2/fonts.css"  type="text/css" media="all"/>
    <script src="https://d3js.org/d3.v4.min.js" charset="utf-8"></script>
    <script type="text/javascript" src="https://www.ebi.ac.uk/pdbe/pdb-component-library/js/protvista-pdb-3.3.0.js"></script>
 
  </head>

  <body>
    <h4>ProtVista PDB custom data demo</h4>

    <div>
      <protvista-pdb custom-data="true" id="pv1"></protvista-pdb>
    </div>
    
    <script>
    document.addEventListener('DOMContentLoaded', () => {
        
        //Get web-component element
        const pvInstance = document.getElementById('pv1');
        if(!pvInstance) return;
        (async () => {

            // PDBe sequence conservation api data
            let scFetch = await fetch('https://www.ebi.ac.uk/pdbe/graph-api/uniprot/sequence_conservation/P29373');
            let scResponseData = await scFetch.json();
            const seqConservationData = scResponseData;
            // seqConservationData is a json array with following fields. Please refer the fetch api url for the data struture
            // [
            //     {
            //         "start": 1,
            //         "end": 1,
            //         "conservation_score": 1,
            //         "tooltipContent": "Conservation score: 1",
            //         "amino": [
            //             {
            //                 "end": 1,
            //                 "letter": "P",
            //                 "proba": 0.428,
            //                 "start": 1,
            //                 "color": "#c0c000",
            //                 "tooltipContent": "Amino acid: PRO<br/>Probability: 42.80%"
            //             },...
            //         ]
            //     }...
            // ]

            // PDBe variation api data
            let vrFetch = await fetch('https://www.ebi.ac.uk/pdbe/graph-api/uniprot/protvista/variation/P29373');
            let vrResponseData = await vrFetch.json();
            const variationData = vrResponseData;
            // variationData is a json with following fields. Please refer the fetch api url for the data struture
            // {
            //     "sequence": "PNFSGNWKIIRSENFEELLKVLGVNVMLRKIAVAAASKPAVEIKQEGDTFYIKTSTTVRTTEINFKVGEEFEEQTVDGRPCKSLVKWESENKMVCEQKLLKGEGPKTSWTRELTNDGELILTMTADDVVCTRVYVRE",
            //     "variants": [
            //         {
            //             "accession": "NC_000001.11:g.156705439T>C",
            //             "association": [],
            //             "clinicalSignificances": null,
            //             "color": "#002594",
            //             "end": "2",
            //             "polyphenScore": 0.003,
            //             "siftScore": 0.055,
            //             "sourceType": "large_scale_study",
            //             "start": "2",
            //             "tooltipContent": "XYZ Variant",
            //             "variant": "S",
            //             "xrefNames": [
            //                 "gnomAD"
            //             ],
            //             "keywords": [  // Keywords are used to filter the variats
            //                 "predicted",
            //                 "large_scale_studies"
            //             ]
            //         },...
            //     ]
            // }
            
        
            //Custom data model
            const customData = {
                displayNavigation: true, // Set to false to hide navigation scale
                displaySequence: true, // Set to false to hide sequence track
                sequence: 'MPNFSGNWKIIRSENFEELLKVLGVNVMLRKIAVAAASKPAVEIKQEGDTFYIKTSTTVRTTEINFKVGEEFEEQTVDGRPCKSLVKWESENKMVCEQKLLKGEGPKTSWTRELTNDGELILTMTADDVVCTRVYVRE', //Protein sequence
                length: 138, // Length of the sequence
                offset: 1, // Offset navigation scale start. Example offset:10 will display the navigation start from 10 instead of default 1.
                tracks: [ // Array of track objects  (PDBe implementation extends core ProtVista track component. Refer - https://github.com/ebi-webcomponents/nightingale/tree/master/packages/protvista-track#data-array for all the supported track properties )
                    {
                        label: "Domains", // Track label
                        labelType: "text", // Supported values 'text' and 'html'
                        data: [
                            {
                                accession: "d1", // Some unique id
                                type: "UniProt range", // Displayed in tooltip title
                                label: "Domain 1", // Expected values 'text' and 'html'
                                labelTooltip: "Residues mapped to domain 1", // Label tooltip content. Support text and HTML mark-up 
                                locations: [ // Array of sub-tracks
                                {
                                    fragments : [ // Array of sub-track fragments
                                    {
                                        start: 1, // Track start value
                                        end: 56, // Track end value
                                        tooltipContent: "Type: domain 1<br>Range: XYZ1 - XYZ56",  // track tooltip content. Support text and HTML mark-up 
                                        color: "rgb(135,158,247)" // track (fragment) colour, supported rgb and hex code value
                                    },
                                    {
                                        start: 70,
                                        end: 130,
                                        tooltipContent: "Type: domain 1<br>Range: XYZ70 - XYZ130",
                                        color: "rgb(160,174,232)"
                                    }
                                    ]
                                }
                                ]
                            },
                            {
                                accession: "d2",
                                type: "UniProt range",
                                label: "<div><i class='icon icon-generic' data-icon=';' style='color: #000;'></i> <a href='resource.xyz'>Domain 2</a></div>", //HTML strcutured label with font-icons. You can add any HTML markup.
                                labelTooltip: "<strong>Domain Compound</strong><br><img src='https://www.ebi.ac.uk/pdbe/static/files/pdbechem_v2/REA_200.svg'>", // labelTooltip HTML mark-up example displaying compound image in the tooltip.
                                locations: [
                                {
                                    fragments : [
                                    {
                                        start: 1,
                                        end: 20,
                                        tooltipContent: "<strong>Type: domain 2</strong><br>Range: XY1 - XYZ20<br><a href='resource.xyz' style='color:blue'>view details</a>", // tooltipContent HTML mark-up example
                                        color: "rgb(107,119,39)"
                                    },
                                    {
                                        start: 22,
                                        end: 137,
                                        tooltipContent: "Type: domain 2<br>Range: XYZ22 - XYZ137",
                                        color: "rgb(90,102,23)"
                                    }
                                    ]
                                }
                                ]
                            }
                        ]

                    },
                    {
                        label: "Annotations",
                        labelType: "text",
                        labelColor: "rgb(128,128,128)", // Set labelColor to change label background colour
                        data: [
                            {
                                accession: "a1",
                                type: "UniProt range",
                                label: "Annotations 1",
                                labelType: "text",
                                labelTooltip: "Residues mapped to annotations 1",
                                labelColor: "rgb(211,211,211)",
                                color: "rgb(255,99,163)",
                                locations: [
                                {
                                    fragments : [
                                    {
                                        start: 1,
                                        end: 56,
                                        tooltipContent: "Type: domain 1<br>Range: XYZ1 - XYZ56"
                                    },
                                    {
                                        start: 70,
                                        end: 130,
                                        tooltipContent: "Type: domain 1<br>Range: XYZ70 - XYZ130"
                                    }
                                    ]
                                }
                                ]
                            }
                        ]

                    },
                    {
                        label: "Annotation shapes",
                        data: [
                            {
                                accession: "s1",
                                type: "UniProt range",
                                label: "Circle",
                                color: "rgb(249,166,2)",
                                shape: 'circle', // supported shapes rectangle|bridge|diamond|chevron|catFace|triangle|wave|hexagon|pentagon|circle|arrow|doubleBar,
                                locations: [
                                    {
                                        fragments : [
                                            {
                                                start: 5,
                                                end: 5,
                                                tooltipContent: "Type: domain 1<br>Range: XYZ1 - XYZ56",
                                            },
                                            {
                                                start: 9,
                                                end: 9,
                                                tooltipContent: "Type: domain 1<br>Range: XYZ70 - XYZ130"
                                            }
                                        ]
                                    }
                                ]
                            },
                            {
                                accession: "s2",
                                type: "UniProt range",
                                label: "Diamond",
                                shape: 'diamond',
                                color: "rgb(255,99,163)", // Default colour value for all fragments in this track
                                locations: [
                                    {
                                        fragments : [
                                            {
                                                start: 5,
                                                end: 5,
                                                tooltipContent: "Type: domain 1<br>Range: XYZ1 - XYZ56"
                                            },
                                            {
                                                start: 9,
                                                end: 9,
                                                color: "rgb(0,128,129)", // Set colour here for individual shape fragment. This will override the track default colour.
                                                tooltipContent: "Type: domain 1<br>Range: XYZ70 - XYZ130"
                                            },
                                            {
                                                start: 20,
                                                end: 20,
                                                tooltipContent: "Type: domain 1<br>Range: XYZ70 - XYZ130"
                                            },
                                            {
                                                start: 22,
                                                end: 22,
                                                tooltipContent: "Type: domain 1<br>Range: XYZ70 - XYZ130"
                                            }
                                        ]
                                    }
                                ]
                            }
                        ]

                    }
                ],
                sequenceConservation: seqConservationData, // Set this property to display your own sequence conservation data. Refer comments at the top for data structure.
                variants: variationData, // Set this property to display your own variation data. Refer comments at the top for data structure.
                legends: {
                    alignment: 'right', // expected values 'left', 'right' or 'center'
                    data: { // Legend Row, key is used as the row label
                        "Domains": [ // legends for Domains row
                            {
                                color: ["rgb(135,158,247)", "rgb(160,174,232)"], // legend color, supported rgb and hex code value
                                text: "Domains 1" // legend text
                            },
                            {
                                color: ["rgb(107,119,39)", "rgb(90,102,23)"],
                                text: "Domains 2"
                            }
                        ],
                        "Annotations": [ // legends for Annotation row row
                            {
                                color: ["rgb(255,99,163)"],
                                text: "Custom Annotations"
                            }
                        ]
                    }
                }
            };

            // Assign custom data object to instance viewerdata property
            pvInstance.viewerdata = customData;
        
        })();
        
    });
    </script>
    
    
  </body>

</html>