From 10b9d9dd40032de78a28f42f2b32b6ba235cb355 Mon Sep 17 00:00:00 2001 From: Zhouyang Lian Date: Wed, 4 Nov 2020 00:19:23 -0500 Subject: [PATCH] taxon distance --- src/utils/calcTaxonDistance.js | 39 ++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/utils/calcTaxonDistance.js b/src/utils/calcTaxonDistance.js index e69de29b..e0d34052 100644 --- a/src/utils/calcTaxonDistance.js +++ b/src/utils/calcTaxonDistance.js @@ -0,0 +1,39 @@ +static calcTaxonomicDistance(taxonDistance, targetSpecies, measuredSpecies) { + let distance = null; + + targetSpecies = targetSpecies.toLowerCase(); + measuredSpecies = measuredSpecies.toLowerCase(); + taxonDistance = Object.assign({}, taxonDistance); + for (const key in taxonDistance) { + taxonDistance[key.toLowerCase()] = taxonDistance[key]; + } + + if ( + targetSpecies === measuredSpecies || + measuredSpecies.startsWith(targetSpecies) + ) { + distance = 0; + } else if ( + targetSpecies + "_canon_ancestors" in taxonDistance && + measuredSpecies + "_canon_ancestors" in taxonDistance + ) { + const toAncestors = taxonDistance[targetSpecies + "_canon_ancestors"]; + const fromAncestors = taxonDistance[measuredSpecies + "_canon_ancestors"]; + toAncestors.push(targetSpecies); + fromAncestors.push(measuredSpecies); + distance = 0; + for ( + let iLineage = 0; + iLineage < Math.min(toAncestors.length, fromAncestors.length); + iLineage++ + ) { + if (toAncestors[iLineage] !== fromAncestors[iLineage]) { + distance = toAncestors.length - iLineage; + break; + } + } + toAncestors.pop(); + fromAncestors.pop(); + } else { + distance = null; + } \ No newline at end of file