export interface ResidueSelectionInterface { modelId: string; labelAsymId: string; seqIds: Set; } export interface ChainSelectionInterface { modelId: string; labelAsymId: string; regions: Array<{begin:number;end:number}>; } export class RcsbFvSelection { private selection: Array = new Array(); public setSelectionFromRegion(modelId: string, labelAsymId: string, region: {begin:number, end:number}): void { this.selection = new Array(); this.selection.push({modelId:modelId, labelAsymId:labelAsymId, regions:[region]}); } public addSelectionFromRegion(modelId: string, labelAsymId: string, region: {begin:number, end:number}): void { this.selection.push({modelId:modelId, labelAsymId:labelAsymId, regions:[region]}); } public setSelectionFromMultipleRegions(regions: {modelId: string, labelAsymId: string, region: {begin:number, end:number}}[]): void { regions.forEach(r=>{ this.addSelectionFromRegion(r.modelId, r.labelAsymId, r.region); }); } public setSelectionFromResidueSelection(res: Array): void { const selMap: Map>> = new Map>>(); res.forEach(r=>{ if(!selMap.has(r.modelId)) selMap.set(r.modelId,new Map>()); if(!selMap.get(r.modelId)!.has(r.labelAsymId)) selMap.get(r.modelId)!.set(r.labelAsymId, new Set()); r.seqIds.forEach(s=>{ selMap.get(r.modelId)!.get(r.labelAsymId)!.add(s); }) }); this.selection = new Array(); selMap.forEach((labelMap, modelId)=>{ labelMap.forEach((seqSet,labelId)=>{ this.selection.push({modelId:modelId, labelAsymId: labelId, regions:RcsbFvSelection.buildIntervals(seqSet)}); }); }); } public getSelection(): Array { return this.selection; } public getSelectionWithCondition(modelId: string, labelAsymId: string): ChainSelectionInterface | undefined{ const sel: Array = this.selection.filter(d=>(d.modelId===modelId && d.labelAsymId === labelAsymId)); if(sel.length > 0) return sel[0] } public clearSelection(): void { this.selection = new Array(); } private static buildIntervals(ids: Set): Array<{begin:number,end:number}>{ const out: Array<{begin:number,end:number}> = new Array<{begin: number; end: number}>(); const sorted: Array = Array.from(ids).sort((a,b)=>(a-b)); let begin: number = sorted.shift()!; let end: number = begin; for(const n of sorted){ if(n==(end+1)){ end = n; }else{ out.push({begin:begin,end:end}); begin = n; end = n; } } out.push({begin:begin,end:end}); return out; } }