From dcb10aad3f62dc4437afc5280fde481f3a7bfa42 Mon Sep 17 00:00:00 2001 From: jon-grangien Date: Wed, 5 Sep 2018 16:58:24 +0200 Subject: [PATCH] Read and calculate model specific meta data --- modules/dataloader/operators/loader.cpp | 97 ++++++++++++++++++- .../DataLoader/PrepareUploadedData.jsx | 18 +--- 2 files changed, 96 insertions(+), 19 deletions(-) diff --git a/modules/dataloader/operators/loader.cpp b/modules/dataloader/operators/loader.cpp index 80dd95a4f8..915751fd52 100644 --- a/modules/dataloader/operators/loader.cpp +++ b/modules/dataloader/operators/loader.cpp @@ -25,6 +25,10 @@ #include #include #include +#include +#include +#include +#include #include #include // nfd @@ -33,6 +37,7 @@ #include #include +#include #include #include #include @@ -50,7 +55,6 @@ #include #include -#include #include #include @@ -325,23 +329,108 @@ void Loader::getVolumeMetaData(ghoul::Dictionary &metaDataDictionary) _volumeMetaDataDictionary.getValue(KeyGlobalAttributes, gAttribDictionary); _volumeMetaDataDictionary.getValue(KeyVariableAttributes, vAttribDictionary); + constexpr const char *MetaDataModelNameKey = "model_name"; constexpr const char *MetaDataGridSystemKey = "grid_system_1"; constexpr const char *MetaDataGridSystemDimension1 = "grid_system_1_dimension_1_size"; constexpr const char *MetaDataGridSystemDimension2 = "grid_system_1_dimension_2_size"; constexpr const char *MetaDataGridSystemDimension3 = "grid_system_1_dimension_3_size"; const std::vector vKeys = vAttribDictionary.keys(); - const std::string gridSystem1 = gAttribDictionary.value(MetaDataGridSystemKey); + const std::string modelName = gAttribDictionary.value(MetaDataModelNameKey); + std::string gridSystemString = gAttribDictionary.value(MetaDataGridSystemKey); const int gridSystem1DimensionSize = gAttribDictionary.value(MetaDataGridSystemDimension1); const int gridSystem2DimensionSize = gAttribDictionary.value(MetaDataGridSystemDimension2); const int gridSystem3DimensionSize = gAttribDictionary.value(MetaDataGridSystemDimension3); + ghoul::DictionaryJsonFormatter formatter; + const std::string variableAttributesJsonString = formatter.format(vAttribDictionary); + + std::string gridType; + if (gridSystemString.find("theta") != std::string::npos && gridSystemString.find("phi") != std::string::npos) + { + gridType = "Spherical"; + } + else + { + gridType = "Cartesian"; + } + + std::regex nonAlphanumeric("[^a-zA-Z0-9 $]+"); + gridSystemString = std::regex_replace(gridSystemString, nonAlphanumeric, " "); + + std::vector gridSystem; + std::istringstream iss(gridSystemString); + for (std::string s; iss >> s;) + { + gridSystem.push_back(s); + } + + std::string radiusUnit; + std::vector dataDimensions; + if (modelName == "enlil") + { + dataDimensions = {64, 64, 64}; + radiusUnit = "AU"; + } + else if (modelName == "batsrus") + { + dataDimensions = {128, 64, 64}; + radiusUnit = "Earth radius"; + } + else if (modelName == "mas") + { + dataDimensions = {100, 100, 128}; + radiusUnit = "Sun radius"; + } + else + { + dataDimensions = {100, 100, 100}; + radiusUnit = ""; + } + + json variableMinMaxBoundsJson; + const std::string KeyActualMax = "actual_max"; + const std::string KeyActualMin = "actual_min"; + if (gridType == "Spherical") + { + const std::string KeyR = "r"; + + ghoul::Dictionary rDictionary; + vAttribDictionary.getValue(KeyR, rDictionary); + + const float actualMax = rDictionary.value(KeyActualMax); + const float actualMin = rDictionary.value(KeyActualMin); + const float AUmeters = 149597871000.0; + + variableMinMaxBoundsJson["r"]["min"] = actualMin / AUmeters; + variableMinMaxBoundsJson["r"]["max"] = actualMax / AUmeters; + } + else + { + std::vector keys = {"x", "y", "z"}; + for (auto key : keys) + { + ghoul::Dictionary dict; + vAttribDictionary.getValue(key, dict); + const float actualMax = dict.value(KeyActualMax); + const float actualMin = dict.value(KeyActualMin); + variableMinMaxBoundsJson[key]["max"] = actualMax; + variableMinMaxBoundsJson[key]["min"] = actualMin; + } + } + json j; - j["gridSystem"] = gridSystem1; + j["modelName"] = modelName; + j["dataDimensions"] = dataDimensions; + j["gridSystem"] = gridSystem; + j["gridType"] = gridType; + j["radiusUnit"] = radiusUnit; j["gridSystem1DimensionSize"] = gridSystem1DimensionSize; j["gridSystem2DimensionSize"] = gridSystem2DimensionSize; j["gridSystem3DimensionSize"] = gridSystem3DimensionSize; - j["variableAttributes"] = vKeys; + j["variableKeys"] = vKeys; + j["variableMinMaxBounds"] = variableMinMaxBoundsJson; + j["variableAttributes"] = json::parse(variableAttributesJsonString); _volumeMetaDataJSON = j.dump(); } diff --git a/modules/webgui/web/src/components/DataLoader/PrepareUploadedData.jsx b/modules/webgui/web/src/components/DataLoader/PrepareUploadedData.jsx index 401964859b..ac37db556f 100644 --- a/modules/webgui/web/src/components/DataLoader/PrepareUploadedData.jsx +++ b/modules/webgui/web/src/components/DataLoader/PrepareUploadedData.jsx @@ -79,7 +79,6 @@ class PrepareUploadedData extends Component { this.handleSetTranslationTarget = this.handleSetTranslationTarget.bind(this); this.handleSelectedTFImage = this.handleSelectedTFImage.bind(this); this.handleTfPresetsJSON = this.handleTfPresetsJSON.bind(this); - this.processMetaData = this.processMetaData.bind(this); } componentDidUpdate(prevProps, prevState) { @@ -98,7 +97,7 @@ class PrepareUploadedData extends Component { if (prevProps.metaDataStringifiedJSON !== this.props.metaDataStringifiedJSON) { const metaData = this.props.metaDataStringifiedJSON ? handleReceivedJSON(this.props.metaDataStringifiedJSON) : undefined - this.processMetaData(metaData) + console.log(metaData) let newDimensions if (metaData && metaData.gridSystem1DimensionSize && metaData.gridSystem2DimensionSize && metaData.gridSystem3DimensionSize) { @@ -247,17 +246,6 @@ class PrepareUploadedData extends Component { DataManager.runScript(payloadScript); } - processMetaData(metaData) { - let gridType = '' - if (metaData && metaData.gridSystem) { - gridType = (metaData.gridSystem.includes('theta') && metaData.gridSystem.includes('phi')) ? 'Spherical' : 'Cartesian' - metaData.gridSystem = stringArrayToArray(metaData.gridSystem) - metaData.gridType = gridType - } - - return metaData - } - render() { const { width, currentVolumesConvertedCount, currentVolumesToConvertCount } = this.props; const { volumeProgress, translationType, translationPos, translationTarget, metaData } = this.state; @@ -319,13 +307,13 @@ class PrepareUploadedData extends Component { {(metaData && metaData.gridType) ? metaData.gridType : 'undefined'} - this.onChangeMultiInputs(target, KEY_DIMENSIONS)} />