@@ -592,7 +592,7 @@ export default function StructureViewerPane({
592592 const nativeResidue = useMemo ( ( ) => parseScientificNativeMetric ( residueQuery . data , nativeDocument , 'residue_plddt' , selectedDesignId ?? undefined ) , [ residueQuery . data , nativeDocument , selectedDesignId ] ) ;
593593 const nativeChains = useMemo ( ( ) => parseScientificNativeMetric ( chainQuery . data , nativeDocument , 'chain_metrics' , selectedDesignId ?? undefined ) , [ chainQuery . data , nativeDocument , selectedDesignId ] ) ;
594594 const nativeResidueLayer = useMemo < MetricLayer | null > ( ( ) => nativeResidue . status !== 'ok' ? null : ( {
595- descriptor :{ id :'native-plddt' , label :nativeResidue . metric === 'atom_plddt' ? 'Native atom pLDDT' : 'Native residue pLDDT' , dimension :nativeResidue . metric === 'atom_plddt' ? 'atom-scalar' : 'residue-scalar' , units :'fraction' , direction :'higher_is_better' , valueRange :[ 0 , 1 ] , projectionPolicy :'direct' , normalization :'none' ,
595+ descriptor :{ id :'native-plddt' , label :nativeResidue . metric === 'atom_plddt' ? 'Native atom pLDDT' : nativeResidue . metric === 'token_plddt' ? 'Native polymer-residue pLDDT' : 'Native residue pLDDT' , dimension :nativeResidue . metric === 'atom_plddt' ? 'atom-scalar' : 'residue-scalar' , units :'fraction' , direction :'higher_is_better' , valueRange :[ 0 , 1 ] , projectionPolicy :'direct' , normalization :'none' ,
596596 categories : {
597597 veryHigh : { label : '≥90' , color : '#3b82f6' } ,
598598 confident : { label : '70–<90' , color : '#22d3ee' } ,
@@ -601,8 +601,14 @@ export default function StructureViewerPane({
601601 } ,
602602 provenance :{ source :'Verified native confidence vector' , artifactSha256 :nativeResidue . artifactSha256 } } ,
603603 // Reuse the established confidence bands for display only; retain native fractions.
604- values :nativeResidue . residues . map ( ( identity , index ) => ( { identity, value :nativeResidue . values [ index ] , displayColor :plddtColor ( nativeResidue . values [ index ] ! * 100 ) } ) ) ,
604+ values :nativeResidue . residues . map ( ( identity , index ) => ( { identity, value :nativeResidue . values [ index ] , displayColor :plddtColor ( nativeResidue . values [ index ] ! * 100 ) } ) ) . filter ( entry => nativeResidue . metric !== 'token_plddt' || ! ( entry . identity . labelAtomId || entry . identity . authAtomId ) ) ,
605605 } as MetricLayer ) , [ nativeResidue ] ) ;
606+ const nativeTokenAtomLayer = useMemo < MetricLayer | null > ( ( ) => {
607+ if ( nativeResidue . status !== 'ok' || nativeResidue . metric !== 'token_plddt' || ! nativeResidueLayer ) return null ;
608+ return { descriptor : { ...nativeResidueLayer . descriptor , id : 'native-plddt-atoms' , label : 'Native atom-token pLDDT' , dimension : 'atom-scalar' } ,
609+ values : nativeResidue . residues . flatMap ( ( identity , index ) => identity . labelAtomId || identity . authAtomId
610+ ? [ { identity, value : nativeResidue . values [ index ] , displayColor : plddtColor ( nativeResidue . values [ index ] ! * 100 ) } ] : [ ] ) } ;
611+ } , [ nativeResidue , nativeResidueLayer ] ) ;
606612 const chainMetrics = useMemo ( ( ) => requiresBoundMetrics ? { } : viewerAnalyses ?. chainMetrics ?? { } , [ requiresBoundMetrics , viewerAnalyses ?. chainMetrics ] ) ;
607613 const chainMetricsBusy = viewerAnalyses ?. chainMetricsBusy ?? false ;
608614 const onRunChainMetrics = viewerAnalyses ?. onRunChainMetrics ;
@@ -1469,12 +1475,13 @@ export default function StructureViewerPane({
14691475 const allMetricLayers = useMemo < readonly MetricLayer [ ] > (
14701476 ( ) => [
14711477 ...( nativeResidueLayer ? [ nativeResidueLayer ] : [ ] ) ,
1478+ ...( nativeTokenAtomLayer ? [ nativeTokenAtomLayer ] : [ ] ) ,
14721479 ...structureScalarMetricLayers ,
14731480 ...( subunitMeanPlddtLayer ? [ subunitMeanPlddtLayer ] : [ ] ) ,
14741481 ...pairMetricLayers ,
14751482 ...interfaceMetricLayers ,
14761483 ] ,
1477- [ nativeResidueLayer , interfaceMetricLayers , pairMetricLayers , structureScalarMetricLayers , subunitMeanPlddtLayer ] ,
1484+ [ nativeResidueLayer , nativeTokenAtomLayer , interfaceMetricLayers , pairMetricLayers , structureScalarMetricLayers , subunitMeanPlddtLayer ] ,
14781485 ) ;
14791486
14801487
@@ -3080,7 +3087,7 @@ export default function StructureViewerPane({
30803087 structureDocumentId = { nativeDocument ?. documentId ?? governedWorkbenchContext ?. structureDocumentId }
30813088 structureContentSha256 = { nativeDocument ?. contentSha256 }
30823089 derivedComponents = { derivedComponents }
3083- activeMetricId = { overlayView === 'pae' ? 'pae' : residueMetricLayer ?. descriptor . id }
3090+ activeMetricId = { overlayView === 'pae' ? 'pae' : nativeResidueLayer ?. descriptor . id ?? residueMetricLayer ?. descriptor . id }
30843091 showMetricWorkbench = { ! shapeMetrics && metricWorkbenchOpen }
30853092 metricDetails = { selectedDesign && nativeChains . status === 'ok' ? (
30863093 < details className = "rounded border border-slate-700 bg-slate-900/95 p-2 text-xs" >
0 commit comments