RcsbFvSelection.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. export interface ResidueSelectionInterface {
  2. modelId: string;
  3. labelAsymId: string;
  4. seqIds: Set<number>;
  5. }
  6. export interface ChainSelectionInterface {
  7. modelId: string;
  8. labelAsymId: string;
  9. regions: Array<{begin:number;end:number}>;
  10. }
  11. export class RcsbFvSelection {
  12. private selection: Array<ChainSelectionInterface> = new Array<ChainSelectionInterface>();
  13. public setSelectionFromRegion(modelId: string, labelAsymId: string, region: {begin:number, end:number}): void {
  14. this.selection = new Array<ChainSelectionInterface>();
  15. this.selection.push({modelId:modelId, labelAsymId:labelAsymId, regions:[region]});
  16. }
  17. public addSelectionFromRegion(modelId: string, labelAsymId: string, region: {begin:number, end:number}): void {
  18. this.selection.push({modelId:modelId, labelAsymId:labelAsymId, regions:[region]});
  19. }
  20. public setSelectionFromMultipleRegions(regions: {modelId: string, labelAsymId: string, region: {begin:number, end:number}}[]): void {
  21. regions.forEach(r=>{
  22. this.addSelectionFromRegion(r.modelId, r.labelAsymId, r.region);
  23. });
  24. }
  25. public setSelectionFromResidueSelection(res: Array<ResidueSelectionInterface>): void {
  26. const selMap: Map<string,Map<string,Set<number>>> = new Map<string, Map<string, Set<number>>>();
  27. res.forEach(r=>{
  28. if(!selMap.has(r.modelId))
  29. selMap.set(r.modelId,new Map<string, Set<number>>());
  30. if(!selMap.get(r.modelId)!.has(r.labelAsymId))
  31. selMap.get(r.modelId)!.set(r.labelAsymId, new Set<number>());
  32. r.seqIds.forEach(s=>{
  33. selMap.get(r.modelId)!.get(r.labelAsymId)!.add(s);
  34. })
  35. });
  36. this.selection = new Array<ChainSelectionInterface>();
  37. selMap.forEach((labelMap, modelId)=>{
  38. labelMap.forEach((seqSet,labelId)=>{
  39. this.selection.push({modelId:modelId, labelAsymId: labelId, regions:RcsbFvSelection.buildIntervals(seqSet)});
  40. });
  41. });
  42. }
  43. public getSelection(): Array<ChainSelectionInterface> {
  44. return this.selection;
  45. }
  46. public getSelectionWithCondition(modelId: string, labelAsymId: string): ChainSelectionInterface | undefined{
  47. const sel: Array<ChainSelectionInterface> = this.selection.filter(d=>(d.modelId===modelId && d.labelAsymId === labelAsymId));
  48. if(sel.length > 0)
  49. return sel[0]
  50. }
  51. public clearSelection(): void {
  52. this.selection = new Array<ChainSelectionInterface>();
  53. }
  54. private static buildIntervals(ids: Set<number>): Array<{begin:number,end:number}>{
  55. const out: Array<{begin:number,end:number}> = new Array<{begin: number; end: number}>();
  56. const sorted: Array<number> = Array.from(ids).sort((a,b)=>(a-b));
  57. let begin: number = sorted.shift()!;
  58. let end: number = begin;
  59. for(const n of sorted){
  60. if(n==(end+1)){
  61. end = n;
  62. }else{
  63. out.push({begin:begin,end:end});
  64. begin = n;
  65. end = n;
  66. }
  67. }
  68. out.push({begin:begin,end:end});
  69. return out;
  70. }
  71. }