File

src/app/core/services/organ-lookup/organ-lookup.service.ts

Index

Methods

Constructor

constructor(source: DataSourceService)
Parameters :
Name Type Optional
source DataSourceService No

Methods

getBlocks
getBlocks(info: OrganInfo, sex)
Parameters :
Name Type Optional Default value
info OrganInfo No
sex No 'Female'
Returns : Observable<TissueBlockResult[]>
getOrgan
getOrgan(info: OrganInfo, sex)
Parameters :
Name Type Optional Default value
info OrganInfo No
sex No 'Both'
Returns : Observable<SpatialEntity | undefined>
getOrganInfo
getOrganInfo(iri: string, side?, _sex)
Parameters :
Name Type Optional Default value
iri string No
side Yes
_sex No 'Female'
Returns : Observable<OrganInfo | undefined>
getOrganScene
getOrganScene(info: OrganInfo, sex)
Parameters :
Name Type Optional Default value
info OrganInfo No
sex No 'Female'
Returns : Observable<SpatialSceneNode[]>
getOrganStats
getOrganStats(info: OrganInfo, sex)
Parameters :
Name Type Optional Default value
info OrganInfo No
sex No 'Female'
Returns : Observable<AggregateResult[]>
import { Injectable } from '@angular/core';
import { AggregateResult, Filter, SpatialEntity, SpatialSceneNode, TissueBlockResult } from 'ccf-database';
import { ALL_POSSIBLE_ORGANS, DataSourceService, OrganInfo } from 'ccf-shared';
import { Observable, of } from 'rxjs';
import { map } from 'rxjs/operators';

@Injectable({
  providedIn: 'root',
})
export class OrganLookupService {
  private readonly organs = ALL_POSSIBLE_ORGANS;

  constructor(private readonly source: DataSourceService) {}

  getOrganInfo(
    iri: string,
    side?: OrganInfo['side'],
    _sex: Filter['sex'] = 'Female',
  ): Observable<OrganInfo | undefined> {
    let info = this.organs.find((item) => item.id === iri);
    if (!info) {
      return of(undefined);
    }

    const organ = info.organ;

    if (info.disabled) {
      info = this.organs.find((item) => !item.disabled && item.organ === organ);
    }
    if (info?.side && side && info.side !== side) {
      info = this.organs.find((item) => !item.disabled && item.organ === organ && item.side === side);
    }

    return of(info);
  }

  getOrgan(info: OrganInfo, sex: Filter['sex'] = 'Both'): Observable<SpatialEntity | undefined> {
    return this.source
      .getReferenceOrgans()
      .pipe(
        map((entities) =>
          entities.find((entity) => entity.representation_of === info.id && (sex === 'Both' || entity.sex === sex)),
        ),
      );
  }

  getOrganScene(info: OrganInfo, sex: Filter['sex'] = 'Female'): Observable<SpatialSceneNode[]> {
    if (info.id) {
      const filter: Partial<Filter> = { ontologyTerms: [info.id], sex };
      return this.source.getReferenceOrganScene(info.id, filter as Filter);
    } else {
      return of([]);
    }
  }

  getOrganStats(info: OrganInfo, sex: Filter['sex'] = 'Female'): Observable<AggregateResult[]> {
    if (info.id) {
      const filter: Partial<Filter> = { ontologyTerms: [info.id], sex };
      return this.source.getAggregateResults(filter as Filter);
    } else {
      return of([]);
    }
  }

  getBlocks(info: OrganInfo, sex: Filter['sex'] = 'Female'): Observable<TissueBlockResult[]> {
    if (info.id) {
      const filter: Partial<Filter> = { ontologyTerms: [info.id], sex };
      return this.source.getTissueBlockResults(filter as Filter);
    } else {
      return of([]);
    }
  }
}

results matching ""

    No results matching ""