Переглянути джерело

alignment label_alt_id && full title click

bioinsilico 2 роки тому
батько
коміт
92b3782847

+ 9 - 9
package-lock.json

@@ -1,18 +1,18 @@
 {
   "name": "@rcsb/rcsb-saguaro-3d",
-  "version": "2.2.0-uniprot-msa.12",
+  "version": "2.2.0-uniprot-msa.13",
   "lockfileVersion": 2,
   "requires": true,
   "packages": {
     "": {
       "name": "@rcsb/rcsb-saguaro-3d",
-      "version": "2.2.0-uniprot-msa.12",
+      "version": "2.2.0-uniprot-msa.13",
       "license": "MIT",
       "dependencies": {
         "@rcsb/rcsb-api-tools": "^4.1.0",
         "@rcsb/rcsb-molstar": "^2.5.5",
         "@rcsb/rcsb-saguaro": "^2.2.15",
-        "@rcsb/rcsb-saguaro-app": "^4.4.13-uniprot-msa.10",
+        "@rcsb/rcsb-saguaro-app": "^4.4.13-uniprot-msa.11",
         "molstar": "^3.13.0"
       },
       "devDependencies": {
@@ -2528,9 +2528,9 @@
       }
     },
     "node_modules/@rcsb/rcsb-saguaro-app": {
-      "version": "4.4.13-uniprot-msa.10",
-      "resolved": "https://registry.npmjs.org/@rcsb/rcsb-saguaro-app/-/rcsb-saguaro-app-4.4.13-uniprot-msa.10.tgz",
-      "integrity": "sha512-k5GBRzWRMFnC6cQ8TSo3voSLzA3xMUoT4cZji4cXSETnNOzc0TjtY+D3KfEOy9xoArue7Q9TlL6/Tv0AeQSAVQ==",
+      "version": "4.4.13-uniprot-msa.11",
+      "resolved": "https://registry.npmjs.org/@rcsb/rcsb-saguaro-app/-/rcsb-saguaro-app-4.4.13-uniprot-msa.11.tgz",
+      "integrity": "sha512-PTYkfHxTzPAl5BF1YGq4MgzDKcyrLjJBQRZh1mtTTFL2BKuOc4mQmtzVriWGd96gAz1aFVFrWB1o+y4/o3JPIw==",
       "dependencies": {
         "@rcsb/rcsb-api-tools": "^4.1.1-uniprot-msa.1",
         "@rcsb/rcsb-saguaro": "^2.2.15",
@@ -14141,9 +14141,9 @@
       }
     },
     "@rcsb/rcsb-saguaro-app": {
-      "version": "4.4.13-uniprot-msa.10",
-      "resolved": "https://registry.npmjs.org/@rcsb/rcsb-saguaro-app/-/rcsb-saguaro-app-4.4.13-uniprot-msa.10.tgz",
-      "integrity": "sha512-k5GBRzWRMFnC6cQ8TSo3voSLzA3xMUoT4cZji4cXSETnNOzc0TjtY+D3KfEOy9xoArue7Q9TlL6/Tv0AeQSAVQ==",
+      "version": "4.4.13-uniprot-msa.11",
+      "resolved": "https://registry.npmjs.org/@rcsb/rcsb-saguaro-app/-/rcsb-saguaro-app-4.4.13-uniprot-msa.11.tgz",
+      "integrity": "sha512-PTYkfHxTzPAl5BF1YGq4MgzDKcyrLjJBQRZh1mtTTFL2BKuOc4mQmtzVriWGd96gAz1aFVFrWB1o+y4/o3JPIw==",
       "requires": {
         "@rcsb/rcsb-api-tools": "^4.1.1-uniprot-msa.1",
         "@rcsb/rcsb-saguaro": "^2.2.15",

+ 2 - 2
package.json

@@ -1,6 +1,6 @@
 {
   "name": "@rcsb/rcsb-saguaro-3d",
-  "version": "2.2.0-uniprot-msa.13",
+  "version": "2.2.0-uniprot-msa.14",
   "description": "RCSB Molstar/Saguaro Web App",
   "main": "build/dist/app.js",
   "files": [
@@ -83,7 +83,7 @@
     "@rcsb/rcsb-api-tools": "^4.1.0",
     "@rcsb/rcsb-molstar": "^2.5.5",
     "@rcsb/rcsb-saguaro": "^2.2.15",
-    "@rcsb/rcsb-saguaro-app": "^4.4.13-uniprot-msa.10",
+    "@rcsb/rcsb-saguaro-app": "^4.4.13-uniprot-msa.11",
     "molstar": "^3.13.0"
   },
   "bugs": {

+ 2 - 0
src/RcsbFvSequence/SequenceViews/RcsbView/PfvManagerFactoryImplementation/MsaPfvComponents/MsaRowTitleCheckbox.tsx

@@ -87,6 +87,8 @@ export class MsaRowTitleCheckbox extends React.Component <MsaRowTitleCheckboxInt
     }
 
     private click(): void {
+        if(this.props.disabled)
+            return;
         this.setState({checked:!this.state.checked},()=>{
             globalState[this.entityId()+this.props.tag] = this.state.checked;
             this.props.stateManager.next<"representation-change",{tag:MsaRowTitleCheckboxInterface["tag"];isHidden:boolean;pdb:{entryId:string;entityId:string;};}>({

+ 17 - 10
src/RcsbFvSequence/SequenceViews/RcsbView/PfvManagerFactoryImplementation/MsaPfvComponents/MsaRowTitleComponent.tsx

@@ -49,10 +49,12 @@ export class MsaRowTitleComponent extends React.Component <MsaRowTitleInterface,
 
     public render(): JSX.Element{
        return (
-           <div style={{textAlign:"right", display:"flex"}}>
-               <div >
-                   <div
-                       style={{
+           <div style={{textAlign:"right", display:"flex"}}
+                onMouseOver={()=>this.hover(true)}
+                onMouseOut={()=>this.hover(false)}
+           >
+               <div>
+                   <div style={{
                            MozUserSelect:"none",
                            WebkitUserSelect:"none",
                            msUserSelect:"none",
@@ -64,16 +66,16 @@ export class MsaRowTitleComponent extends React.Component <MsaRowTitleInterface,
                            whiteSpace: "nowrap"
                        }}
                        onClick={(e: MouseEvent)=>this.click(e)}
-                       onMouseOver={()=>this.hover(true)}
-                       onMouseOut={()=>this.hover(false)}
                        title={this.props.targetAlignment.target_id ?? undefined}
                    >
                        {this.props.targetAlignment.target_id}
                    </div>
                </div>
-               <div><MsaRowTitleCheckbox disabled={this.state.disabled} {...TagDelimiter.parseEntity(this.props.targetAlignment.target_id!)} tag={"aligned"} stateManager={this.props.stateManager}/></div>
-               <div><MsaRowTitleCheckbox disabled={this.state.disabled} {...TagDelimiter.parseEntity(this.props.targetAlignment.target_id!)} tag={"polymer"} stateManager={this.props.stateManager}/></div>
-               <div><MsaRowTitleCheckbox disabled={this.state.disabled} {...TagDelimiter.parseEntity(this.props.targetAlignment.target_id!)} tag={"non-polymer"} stateManager={this.props.stateManager}/></div>
+               <div  style={{cursor: this.state.disabled ? "pointer" : undefined}} onClick={(e: MouseEvent)=>this.altClick(e)} >
+                   <MsaRowTitleCheckbox disabled={this.state.disabled} {...TagDelimiter.parseEntity(this.props.targetAlignment.target_id!)} tag={"aligned"} stateManager={this.props.stateManager}/>
+                   <MsaRowTitleCheckbox disabled={this.state.disabled} {...TagDelimiter.parseEntity(this.props.targetAlignment.target_id!)} tag={"polymer"} stateManager={this.props.stateManager}/>
+                   <MsaRowTitleCheckbox disabled={this.state.disabled} {...TagDelimiter.parseEntity(this.props.targetAlignment.target_id!)} tag={"non-polymer"} stateManager={this.props.stateManager}/>
+               </div>
            </div>
        );
     }
@@ -110,7 +112,7 @@ export class MsaRowTitleComponent extends React.Component <MsaRowTitleInterface,
             this.setState({titleColor:this.HOVER_COLOR});
     }
 
-    private click(e: MouseEvent){
+    private click(e: MouseEvent): void{
         if(e.shiftKey) {
             const newWin: Window|null = window.open(`/structure/${TagDelimiter.parseEntity(this.props.targetAlignment.target_id!).entryId}#entity-${TagDelimiter.parseEntity(this.props.targetAlignment.target_id!).entityId}`);
             if(!newWin || newWin.closed || typeof newWin.closed=='undefined')
@@ -120,4 +122,9 @@ export class MsaRowTitleComponent extends React.Component <MsaRowTitleInterface,
         }
     }
 
+    private altClick(e: MouseEvent): void{
+        if(this.state.disabled)
+            this.props.titleClick();
+    }
+
 }

+ 10 - 5
src/RcsbFvStructure/StructureViewers/MolstarViewer/TrajectoryPresetProvider/AlignmentRepresentationPresetProvider.ts

@@ -230,8 +230,6 @@ async function structuralAlignment(plugin: PluginContext, ref:StructureAlignment
         if(pdbData && pdbUnit && refData && refUnit){
             const refLoci: Loci = residueListToLoci(refParams!, refResIndexes, refData);
             const pdbLoci: Loci = residueListToLoci(pdb, pdbResIndexes, pdbData);
-            console.log(refLoci);
-            console.log(pdbLoci);
             if(StructureElement.Loci.is(refLoci) && StructureElement.Loci.is(pdbLoci)) {
                 const pivot = plugin.managers.structure.hierarchy.findStructure(refLoci.structure);
                 const coordinateSystem = pivot?.transform?.cell.obj?.data.coordinateSystem;
@@ -290,7 +288,8 @@ async function obtain(model: Model): Promise<CustomProperty.Data<QualityAssessme
     }
 
     for (let i = 0, il = ma_qa_metric_local._rowCount; i < il; i++) {
-        if (model_id.value(i) !== model.modelNum) continue;
+        if (model_id.value(i) !== model.modelNum)
+            continue;
 
         const labelAsymId = label_asym_id.value(i);
         const entityIndex = index.findEntity(labelAsymId);
@@ -339,7 +338,10 @@ function residueToLoci(pdb:StructureAlignmentParamsType, pdbIndex:number, struct
             MS.core.rel.eq([MS.acp('modelIndex'),1])
         ]),
         'residue-test':MS.core.rel.eq([MS.ammp('label_seq_id'), pdbIndex]),
-        'atom-test':MS.core.rel.eq([MS.ammp("label_atom_id"),"CA"])
+        'atom-test':MS.core.logic.and([
+            MS.core.rel.eq([MS.ammp("label_atom_id"),"CA"]),
+            MS.core.logic.or([MS.core.rel.eq([MS.ammp("label_alt_id"),""]), MS.core.rel.eq([MS.ammp("label_alt_id"),"A"])])
+        ])
     });
     const query = compile<StructureSelection>(expression);
     const selection = query(new QueryContext(structure));
@@ -356,7 +358,10 @@ function residueListToLoci(pdb:StructureAlignmentParamsType, indexList:number[],
         'residue-test':MS.core.logic.or(
             indexList.map(index=>MS.core.rel.eq([MS.ammp('label_seq_id'), index]))
         ),
-        'atom-test':MS.core.rel.eq([MS.ammp("label_atom_id"),"CA"])
+        'atom-test':MS.core.logic.and([
+            MS.core.rel.eq([MS.ammp("label_atom_id"),"CA"]),
+            MS.core.logic.or([MS.core.rel.eq([MS.ammp("label_alt_id"),""]), MS.core.rel.eq([MS.ammp("label_alt_id"),"A"])])
+        ])
     });
     const query = compile<StructureSelection>(expression);
     const selection = query(new QueryContext(structure));