-
Notifications
You must be signed in to change notification settings - Fork 162
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Conceptually these values only make sense if they are numeric. Previously some implicit casting was happening, but this resulted in bugs such as negative values not being displayed in the scatterplot. Note one slight side-effect which may be considered a regression: previously string values which were not numbers (e.g. "abc" but not "1.0") would show up in the hover/click info-boxes. Now such values will be changed to `undefined` and therefore not shown in those info-boxes. Timing of the changes introduced here (AppleM1, Firefox 111): * nextclade/sars-cov-2/21L 7-9ms * ncov/gisaid/global/6m 4-10ms * zika 2ms Closes #1626
- Loading branch information
1 parent
471fab1
commit 2504ac7
Showing
2 changed files
with
40 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
/** | ||
* Values in the JSON should be appropriately typed however this may not always be the case. | ||
* For instance, certain values of a continuous trait may be strings, and we should cast | ||
* these to numbers. See https://github.com/nextstrain/auspice/issues/1626 for more discussion | ||
* of this particular case. Feel free to add more checks / casts to this function! | ||
* @param {Object} metadata | ||
* @param {Object} tree | ||
* @returns {undefined} Any type casting is in-place | ||
*/ | ||
export const castIncorrectTypes = (metadata, tree) => { | ||
try { | ||
const continuousKeys = new Set(); | ||
Object.entries(metadata.colorings || {}).forEach(([key, details]) => { | ||
if (details.type==="continuous") { | ||
continuousKeys.add(key); | ||
} | ||
}); | ||
tree.nodes.forEach((node) => { | ||
Object.entries(node.node_attrs || {}).forEach(([key, details]) => { | ||
if (continuousKeys.has(key)) { | ||
if ((typeof details.value) !== "number") { | ||
if (details.value==="" || isNaN(details.value)) { // Note: Number("")=0 | ||
// undefined values are handled appropriately (e.g. scatterplots, tooltips etc) | ||
details.value = undefined; | ||
} else { | ||
details.value = Number(details.value); | ||
} | ||
} | ||
} | ||
}); | ||
}); | ||
} catch (err) { | ||
// type casting shouldn't be required (the JSON should be correctly typed) | ||
// so any errors shouldn't prevent Auspice loading | ||
console.error(err); | ||
} | ||
}; |