From ff39239b0f7844bcaa2b05402fe507a8305b6ec3 Mon Sep 17 00:00:00 2001 From: Sebastian Piwell Date: Tue, 17 May 2016 16:11:57 -0400 Subject: [PATCH] Auto filter of 'background' --- data/scene/default.scene | 8 ++--- include/openspace/util/histogram.h | 4 +++ modules/iswa/rendering/dataplane.cpp | 2 ++ modules/iswa/rendering/datasphere.cpp | 5 ++++ modules/iswa/util/dataprocessor.cpp | 14 +++++++++ modules/iswa/util/dataprocessor.h | 2 ++ modules/iswa/util/iswamanager.cpp | 31 +++----------------- modules/iswa/util/iswamanager.h | 3 +- modules/iswa/util/iswamanager_lua.inl | 19 ++++++++++-- modules/onscreengui/src/guiiswacomponent.cpp | 16 +++++----- src/util/histogram.cpp | 22 ++++++++++++++ 11 files changed, 83 insertions(+), 43 deletions(-) diff --git a/data/scene/default.scene b/data/scene/default.scene index 99df06fb47..bc5760548a 100644 --- a/data/scene/default.scene +++ b/data/scene/default.scene @@ -30,10 +30,10 @@ function postInitialization() openspace.printInfo("Done setting default values") - openspace.iswa.addCygnet("-4,Data,Ion"); - --openspace.iswa.addCygnet("-1,Data,GM"); - --openspace.iswa.addCygnet("-2,Data,GM"); - --openspace.iswa.addCygnet("-3,Data,GM"); + openspace.iswa.addCygnet(-4,"Data"); + --openspace.iswa.addCygnet(-1,"Data","GM"); + --openspace.iswa.addCygnet(-2,"Data","GM"); + --openspace.iswa.addCygnet(-3,"Data","GM"); --[[ openspace.iswa.addScreenSpaceCygnet( diff --git a/include/openspace/util/histogram.h b/include/openspace/util/histogram.h index 0cc61cd99e..424c2d925f 100644 --- a/include/openspace/util/histogram.h +++ b/include/openspace/util/histogram.h @@ -71,11 +71,15 @@ public: float equalize (float); float entropy(); + float highestBinValue(bool equalized); + float binWidth(); + private: int _numBins; float _minValue; float _maxValue; + float* _data; std::vector _equalizer; int _numValues; diff --git a/modules/iswa/rendering/dataplane.cpp b/modules/iswa/rendering/dataplane.cpp index 8ee9f415d1..1079c1008f 100644 --- a/modules/iswa/rendering/dataplane.cpp +++ b/modules/iswa/rendering/dataplane.cpp @@ -148,6 +148,8 @@ bool DataPlane::loadTexture() { if(data.empty()) return false; + _backgroundValues.setValue(_dataProcessor->filterValues()); + bool texturesReady = false; std::vector selectedOptions = _dataOptions.value(); diff --git a/modules/iswa/rendering/datasphere.cpp b/modules/iswa/rendering/datasphere.cpp index 60d9458cad..1d7b1bdc41 100644 --- a/modules/iswa/rendering/datasphere.cpp +++ b/modules/iswa/rendering/datasphere.cpp @@ -145,6 +145,11 @@ bool DataSphere::loadTexture(){ if(data.empty()) return false; + + // auto v = _dataProcessor->filterValues(); + // std::cout << std::to_string(v) << std::endl; + _backgroundValues.setValue(_dataProcessor->filterValues()); + bool texturesReady = false; std::vector selectedOptions = _dataOptions.value(); diff --git a/modules/iswa/util/dataprocessor.cpp b/modules/iswa/util/dataprocessor.cpp index 74c18da110..c08fd72980 100644 --- a/modules/iswa/util/dataprocessor.cpp +++ b/modules/iswa/util/dataprocessor.cpp @@ -47,6 +47,7 @@ DataProcessor::DataProcessor(bool useLog, bool useHistogram, glm::vec2 normValue :_useLog(useLog) ,_useHistogram(useHistogram) ,_normValues(normValues) + ,_filterValues(glm::vec2(0)) { _coordinateVariables = {"x", "y", "z", "phi", "theta"}; }; @@ -311,6 +312,14 @@ void DataProcessor::processData(float* outputData, std::vector& inputData v = normalizeWithStandardScore(v, mean, standardDeviation); outputData[i] += v; } + + if(_useHistogram){ + float val = histogram.highestBinValue(_useHistogram); + val = normalizeWithStandardScore(val, mean, standardDeviation); + float width = normalizeWithStandardScore(1, mean, standardDeviation); + _filterValues = glm::vec2( val, width); + } + // Histogram equalized = histogram.equalize(); // histogram.print(); // equalized.print(); @@ -326,4 +335,9 @@ float DataProcessor::normalizeWithStandardScore(float value, float mean, float s //return and normalize return ( standardScore + zScoreMin )/(zScoreMin + zScoreMax ); } + +glm::vec2 DataProcessor::filterValues(){ + return _filterValues; +} + } \ No newline at end of file diff --git a/modules/iswa/util/dataprocessor.h b/modules/iswa/util/dataprocessor.h index d1dfe28aa0..293d284bc2 100644 --- a/modules/iswa/util/dataprocessor.h +++ b/modules/iswa/util/dataprocessor.h @@ -61,6 +61,7 @@ public: std::vector readJSONHeader(std::string& dataBuffer); std::vector readJSONData(std::string& dataBuffer, properties::SelectionProperty dataOptions); + glm::vec2 filterValues(); private: void processData( @@ -77,6 +78,7 @@ private: bool _useLog; bool _useHistogram; glm::vec2 _normValues; + glm::vec2 _filterValues; std::set _coordinateVariables; }; diff --git a/modules/iswa/util/iswamanager.cpp b/modules/iswa/util/iswamanager.cpp index ccb3ff7b5e..11c72fcf5b 100644 --- a/modules/iswa/util/iswamanager.cpp +++ b/modules/iswa/util/iswamanager.cpp @@ -87,43 +87,20 @@ IswaManager::~IswaManager(){ _cygnetInformation.clear(); } -void IswaManager::addIswaCygnet(std::string info){ - std::string token; - std::stringstream ss(info); - getline(ss,token,','); - int cygnetId = std::stoi(token); - - if(!ss.eof()){ - getline(ss,token,','); - std::string data = token; - - if(!ss.eof()){ - getline(ss, token, ','); - addIswaCygnet(cygnetId, data, token); - return; - } - - addIswaCygnet(cygnetId, data); - return; - } - - addIswaCygnet(cygnetId); -} - -void IswaManager::addIswaCygnet(int id, std::string info, std::string group){ +void IswaManager::addIswaCygnet(int id, std::string type, std::string group){ if(id > 0){ createScreenSpace(id); }else if(id < 0){ std::shared_ptr metaFuture = std::make_shared(); metaFuture->id = id; metaFuture->group = group; - if(info == _type[CygnetType::Texture]){ + if(type == _type[CygnetType::Texture]){ metaFuture->type = CygnetType::Texture; metaFuture->geom = CygnetGeometry::Plane; - } else if (info == _type[CygnetType::Data]) { + } else if (type == _type[CygnetType::Data]) { metaFuture->type = CygnetType::Data; } else { - LERROR("\""+ info + "\" is not a valid type"); + LERROR("\""+ type + "\" is not a valid type"); return; } diff --git a/modules/iswa/util/iswamanager.h b/modules/iswa/util/iswamanager.h index 623d6158ac..a853552b72 100644 --- a/modules/iswa/util/iswamanager.h +++ b/modules/iswa/util/iswamanager.h @@ -76,8 +76,7 @@ public: IswaManager(); ~IswaManager(); - void addIswaCygnet(std::string info); - void addIswaCygnet(int id, std::string info = "Texture", std::string group = ""); + void addIswaCygnet(int id, std::string type = "Texture", std::string group = ""); // void deleteIswaCygnet(std::string); std::future fetchImageCygnet(int id); diff --git a/modules/iswa/util/iswamanager_lua.inl b/modules/iswa/util/iswamanager_lua.inl index 903c9ffdaa..1528e3a673 100644 --- a/modules/iswa/util/iswamanager_lua.inl +++ b/modules/iswa/util/iswamanager_lua.inl @@ -27,8 +27,23 @@ namespace openspace { namespace luascriptfunctions { int iswa_addCygnet(lua_State* L) { - std::string s = luaL_checkstring(L, -1); - IswaManager::ref().addIswaCygnet(s); + int nArguments = lua_gettop(L); + + int id = -1; + std::string type = "Texture"; + std::string group = ""; + + if(nArguments > 0) + id = lua_tonumber(L, 1); + + if(nArguments > 1) + type = luaL_checkstring(L, 2); + + if(nArguments > 2) + group = luaL_checkstring(L, 3); + + IswaManager::ref().addIswaCygnet(id, type, group); + return 0; } diff --git a/modules/onscreengui/src/guiiswacomponent.cpp b/modules/onscreengui/src/guiiswacomponent.cpp index 625d2160f3..875c5667e2 100644 --- a/modules/onscreengui/src/guiiswacomponent.cpp +++ b/modules/onscreengui/src/guiiswacomponent.cpp @@ -231,13 +231,13 @@ void GuiIswaComponent::render() { ImGui::InputText("addCynget", addCygnetBuffer, addCygnetBufferSize); if(ImGui::SmallButton("Add Cygnet")) - OsEng.scriptEngine().queueScript("openspace.iswa.addCygnet('"+std::string(addCygnetBuffer)+"');"); + OsEng.scriptEngine().queueScript("openspace.iswa.addCygnet("+std::string(addCygnetBuffer)+");"); if(gmdata != gmdatavalue){ if(gmdata){ - std::string x = "openspace.iswa.addCygnet('-1,Data,GMData');"; - std::string y = "openspace.iswa.addCygnet('-2,Data,GMData');"; - std::string z = "openspace.iswa.addCygnet('-3,Data,GMData');"; + std::string x = "openspace.iswa.addCygnet(-1,'Data','GMData');"; + std::string y = "openspace.iswa.addCygnet(-2,'Data','GMData');"; + std::string z = "openspace.iswa.addCygnet(-3,'Data','GMData');"; OsEng.scriptEngine().queueScript(x+y+z); }else{ OsEng.scriptEngine().queueScript("openspace.iswa.removeGroup('GMData');"); @@ -246,9 +246,9 @@ void GuiIswaComponent::render() { if(gmimage != gmimagevalue){ if(gmimage){ - std::string x = "openspace.iswa.addCygnet('-1,Texture,GMImage');"; - std::string y = "openspace.iswa.addCygnet('-2,Texture,GMImage');"; - std::string z = "openspace.iswa.addCygnet('-3,Texture,GMImage');"; + std::string x = "openspace.iswa.addCygnet(-1,'Texture','GMImage');"; + std::string y = "openspace.iswa.addCygnet(-2,'Texture','GMImage');"; + std::string z = "openspace.iswa.addCygnet(-3,'Texture','GMImage');"; OsEng.scriptEngine().queueScript(x+y+z); }else{ OsEng.scriptEngine().queueScript("openspace.iswa.removeGroup('GMImage');"); @@ -257,7 +257,7 @@ void GuiIswaComponent::render() { if(iondata != iondatavalue){ if(iondata){ - OsEng.scriptEngine().queueScript("openspace.iswa.addCygnet('-4,Data,Ionosphere');"); + OsEng.scriptEngine().queueScript("openspace.iswa.addCygnet(-4,'Data','Ionosphere');"); }else{ OsEng.scriptEngine().queueScript("openspace.iswa.removeGroup('Ionosphere');"); } diff --git a/src/util/histogram.cpp b/src/util/histogram.cpp index e3ff296cfe..ce8a544a46 100644 --- a/src/util/histogram.cpp +++ b/src/util/histogram.cpp @@ -116,6 +116,7 @@ bool Histogram::add(float value, float repeat) { _data[binIndex] += repeat; _numValues += repeat; + return true; } @@ -281,4 +282,25 @@ void Histogram::print() const { std::cout << std::endl << std::endl << std::endl<< "==============" << std::endl; } +float Histogram::highestBinValue(bool equalized){ + int highestBin = 0; + for(int i=0; i<_numBins; i++){ + if(_data[i] > _data[highestBin]) + highestBin = i; + } + + float low = _minValue + float(highestBin) / _numBins * (_maxValue - _minValue); + float high = low + (_maxValue - _minValue) / float(_numBins); + + if(!equalized){ + return (high+low)/2.0; + }else{ + return equalize((high+low)/2.0); + } +} + +float Histogram::binWidth(){ + return (_maxValue-_minValue)/_numBins; +} + }