PageRenderTime 42ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/kst-2.0.3/src/plugins/dataobject/effectivebandwidth/effectivebandwidth.cpp

#
C++ | 377 lines | 261 code | 89 blank | 27 comment | 22 complexity | 20bc3a9fc63e09f2e524e823b52a1b8b MD5 | raw file
Possible License(s): GPL-2.0, CC-BY-SA-3.0, LGPL-2.0
  1. /***************************************************************************
  2. * *
  3. * copyright : (C) 2007 The University of Toronto *
  4. * netterfield@astro.utoronto.ca *
  5. * copyright : (C) 2005 University of British Columbia *
  6. * dscott@phas.ubc.ca *
  7. * *
  8. * This program is free software; you can redistribute it and/or modify *
  9. * it under the terms of the GNU General Public License as published by *
  10. * the Free Software Foundation; either version 2 of the License, or *
  11. * (at your option) any later version. *
  12. * *
  13. ***************************************************************************/
  14. #include "effectivebandwidth.h"
  15. #include "objectstore.h"
  16. #include "ui_effectivebandwidthconfig.h"
  17. static const QString& VECTOR_IN_X = "Vector In X";
  18. static const QString& VECTOR_IN_Y = "Vector In Y";
  19. static const QString& SCALAR_IN_MIN = "Min. White Noise Freq.";
  20. static const QString& SCALAR_IN_FREQ = "Sampling Frequency (Hz)";
  21. static const QString& SCALAR_IN_K = "K";
  22. static const QString& SCALAR_OUT_LIMIT = "White Noise Limit";
  23. static const QString& SCALAR_OUT_SIGMA = "White Noise Sigma";
  24. static const QString& SCALAR_OUT_BANDWIDTH = "Effective Bandwidth";
  25. class ConfigEffectiveBandwidthPlugin : public Kst::DataObjectConfigWidget, public Ui_EffectiveBandwidthConfig {
  26. public:
  27. ConfigEffectiveBandwidthPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_EffectiveBandwidthConfig() {
  28. setupUi(this);
  29. }
  30. ~ConfigEffectiveBandwidthPlugin() {}
  31. void setObjectStore(Kst::ObjectStore* store) {
  32. _store = store;
  33. _vectorX->setObjectStore(store);
  34. _vectorY->setObjectStore(store);
  35. _scalarMin->setObjectStore(store);
  36. _scalarFreq->setObjectStore(store);
  37. _scalarK->setObjectStore(store);
  38. _scalarMin->setDefaultValue(0);
  39. _scalarFreq->setDefaultValue(0);
  40. _scalarK->setDefaultValue(0);
  41. }
  42. void setupSlots(QWidget* dialog) {
  43. if (dialog) {
  44. connect(_vectorX, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified()));
  45. connect(_vectorY, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified()));
  46. connect(_scalarMin, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified()));
  47. connect(_scalarFreq, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified()));
  48. connect(_scalarK, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified()));
  49. }
  50. }
  51. Kst::VectorPtr selectedVectorX() { return _vectorX->selectedVector(); };
  52. void setSelectedVectorX(Kst::VectorPtr vector) { return _vectorX->setSelectedVector(vector); };
  53. Kst::VectorPtr selectedVectorY() { return _vectorY->selectedVector(); };
  54. void setSelectedVectorY(Kst::VectorPtr vector) { return _vectorY->setSelectedVector(vector); };
  55. Kst::ScalarPtr selectedScalarMin() { return _scalarMin->selectedScalar(); };
  56. void setSelectedScalarMin(Kst::ScalarPtr scalar) { return _scalarMin->setSelectedScalar(scalar); };
  57. Kst::ScalarPtr selectedScalarFreq() { return _scalarFreq->selectedScalar(); };
  58. void setSelectedScalarFreq(Kst::ScalarPtr scalar) { return _scalarFreq->setSelectedScalar(scalar); };
  59. Kst::ScalarPtr selectedScalarK() { return _scalarK->selectedScalar(); };
  60. void setSelectedScalarK(Kst::ScalarPtr scalar) { return _scalarK->setSelectedScalar(scalar); };
  61. virtual void setupFromObject(Kst::Object* dataObject) {
  62. if (EffectiveBandwidthSource* source = static_cast<EffectiveBandwidthSource*>(dataObject)) {
  63. setSelectedVectorX(source->vectorX());
  64. setSelectedVectorY(source->vectorY());
  65. setSelectedScalarMin(source->scalarMin());
  66. setSelectedScalarFreq(source->scalarFreq());
  67. setSelectedScalarK(source->scalarK());
  68. }
  69. }
  70. virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) {
  71. Q_UNUSED(store);
  72. Q_UNUSED(attrs);
  73. bool validTag = true;
  74. // QStringRef av;
  75. // av = attrs.value("value");
  76. // if (!av.isNull()) {
  77. // _configValue = QVariant(av.toString()).toBool();
  78. // }
  79. return validTag;
  80. }
  81. public slots:
  82. virtual void save() {
  83. if (_cfg) {
  84. _cfg->beginGroup("Effective Bandwidth DataObject Plugin");
  85. _cfg->setValue("Input Vector X", _vectorX->selectedVector()->Name());
  86. _cfg->setValue("Input Vector Y", _vectorY->selectedVector()->Name());
  87. _cfg->setValue("Input Scalar Min. White Noise Freq.", _scalarMin->selectedScalar()->Name());
  88. _cfg->setValue("Input Scalar Sampling Frequency (Hz)", _scalarFreq->selectedScalar()->Name());
  89. _cfg->setValue("Input Scalar K", _scalarK->selectedScalar()->Name());
  90. _cfg->endGroup();
  91. }
  92. }
  93. virtual void load() {
  94. if (_cfg && _store) {
  95. _cfg->beginGroup("Effective Bandwidth DataObject Plugin");
  96. QString vectorName = _cfg->value("Input Vector X").toString();
  97. Kst::Object* object = _store->retrieveObject(vectorName);
  98. Kst::Vector* vectorX = static_cast<Kst::Vector*>(object);
  99. if (vectorX) {
  100. setSelectedVectorX(vectorX);
  101. }
  102. vectorName = _cfg->value("Input Vector Y").toString();
  103. object = _store->retrieveObject(vectorName);
  104. Kst::Vector* vectorY = static_cast<Kst::Vector*>(object);
  105. if (vectorY) {
  106. setSelectedVectorY(vectorY);
  107. }
  108. QString scalarName = _cfg->value("Input Scalar Min. White Noise Freq.").toString();
  109. object = _store->retrieveObject(scalarName);
  110. Kst::Scalar* scalarMin = static_cast<Kst::Scalar*>(object);
  111. if (scalarMin) {
  112. setSelectedScalarMin(scalarMin);
  113. }
  114. scalarName = _cfg->value("Input Scalar Sampling Frequency (Hz)").toString();
  115. object = _store->retrieveObject(scalarName);
  116. Kst::Scalar* scalarFreq = static_cast<Kst::Scalar*>(object);
  117. if (scalarFreq) {
  118. setSelectedScalarFreq(scalarFreq);
  119. }
  120. scalarName = _cfg->value("Input Scalar K").toString();
  121. object = _store->retrieveObject(scalarName);
  122. Kst::Scalar* scalarK = static_cast<Kst::Scalar*>(object);
  123. if (scalarK) {
  124. setSelectedScalarK(scalarK);
  125. }
  126. _cfg->endGroup();
  127. }
  128. }
  129. private:
  130. Kst::ObjectStore *_store;
  131. };
  132. EffectiveBandwidthSource::EffectiveBandwidthSource(Kst::ObjectStore *store)
  133. : Kst::BasicPlugin(store) {
  134. }
  135. EffectiveBandwidthSource::~EffectiveBandwidthSource() {
  136. }
  137. QString EffectiveBandwidthSource::_automaticDescriptiveName() const {
  138. return QString("Effective Bandwidth Plugin Object");
  139. }
  140. void EffectiveBandwidthSource::change(Kst::DataObjectConfigWidget *configWidget) {
  141. if (ConfigEffectiveBandwidthPlugin* config = static_cast<ConfigEffectiveBandwidthPlugin*>(configWidget)) {
  142. setInputVector(VECTOR_IN_X, config->selectedVectorX());
  143. setInputVector(VECTOR_IN_Y, config->selectedVectorY());
  144. setInputScalar(SCALAR_IN_MIN, config->selectedScalarMin());
  145. setInputScalar(SCALAR_IN_FREQ, config->selectedScalarFreq());
  146. setInputScalar(SCALAR_IN_K, config->selectedScalarK());
  147. }
  148. }
  149. void EffectiveBandwidthSource::setupOutputs() {
  150. setOutputScalar(SCALAR_OUT_LIMIT, "");
  151. setOutputScalar(SCALAR_OUT_SIGMA, "");
  152. setOutputScalar(SCALAR_OUT_BANDWIDTH, "");
  153. }
  154. bool EffectiveBandwidthSource::algorithm() {
  155. Kst::VectorPtr inputVectorX = _inputVectors[VECTOR_IN_X];
  156. Kst::VectorPtr inputVectorY = _inputVectors[VECTOR_IN_Y];
  157. Kst::ScalarPtr inputScalarMin = _inputScalars[SCALAR_IN_MIN];
  158. Kst::ScalarPtr inputScalarFreq = _inputScalars[SCALAR_IN_FREQ];
  159. Kst::ScalarPtr inputScalarK = _inputScalars[SCALAR_IN_K];
  160. Kst::ScalarPtr outputScalarLimit = _outputScalars[SCALAR_OUT_LIMIT];
  161. Kst::ScalarPtr outputScalarSigma = _outputScalars[SCALAR_OUT_SIGMA];
  162. Kst::ScalarPtr outputScalarBandwidth = _outputScalars[SCALAR_OUT_BANDWIDTH];
  163. //Make sure there is at least 1 element in the input vector
  164. if (inputVectorX->length() < 1) {
  165. _errorString = "Error: Input Vector X invalid size";
  166. return false;
  167. }
  168. // Make sure the input vectors match.
  169. if (inputVectorX->length() != inputVectorY->length()) {
  170. _errorString = "Error: Input Vector X and Input Vector Y are not the same length";
  171. return false;
  172. }
  173. double minWhiteNoiseFreq, samplingFrequency, radiometerConstantK;
  174. minWhiteNoiseFreq = inputScalarMin->value();
  175. samplingFrequency = inputScalarFreq->value();
  176. radiometerConstantK = inputScalarK->value();
  177. int minWhiteNoiseIndex;
  178. //fast calculation of index for minWhiteNoiseFreq
  179. int i_bot, i_top;
  180. i_bot = 0;
  181. i_top = inputVectorX->length() - 1;
  182. while (i_bot + 1 < i_top) {
  183. int i0 = (i_top + i_bot)/2;
  184. if (minWhiteNoiseFreq < inputVectorX->value()[i0]) {
  185. i_top = i0;
  186. } else {
  187. i_bot = i0;
  188. }
  189. }
  190. minWhiteNoiseIndex = i_top;
  191. //verify calculated indices.
  192. if ( !(minWhiteNoiseIndex>0) || !(minWhiteNoiseIndex<(inputVectorX->length()-1)) ) {
  193. _errorString = "Error: Calculated Indices invalid";
  194. return false;
  195. }
  196. // calculate white noise limit
  197. double sumY, sumY2;
  198. sumY = sumY2 = 0;
  199. int i;
  200. double yi;
  201. for (i = minWhiteNoiseIndex; i < inputVectorX->length(); i++) {
  202. yi = inputVectorY->value()[i];
  203. sumY += yi;
  204. sumY2 += pow(yi,2);
  205. }
  206. double ybar, ysigma;
  207. ybar = sumY/(inputVectorX->length() - minWhiteNoiseIndex);
  208. ysigma = sqrt((sumY2 - 2*ybar*sumY + pow(ybar,2)*(inputVectorX->length() - minWhiteNoiseIndex))/(inputVectorX->length() - minWhiteNoiseIndex));
  209. // end calculate white noise limit
  210. double effectiveBandwidth = 2*samplingFrequency*pow(radiometerConstantK*inputVectorY->value()[0]/ysigma,2);
  211. // output fit data
  212. outputScalarLimit->setValue(ybar);
  213. outputScalarSigma->setValue(ysigma);
  214. outputScalarBandwidth->setValue(effectiveBandwidth);
  215. return true;
  216. }
  217. Kst::VectorPtr EffectiveBandwidthSource::vectorX() const {
  218. return _inputVectors[VECTOR_IN_X];
  219. }
  220. Kst::VectorPtr EffectiveBandwidthSource::vectorY() const {
  221. return _inputVectors[VECTOR_IN_Y];
  222. }
  223. Kst::ScalarPtr EffectiveBandwidthSource::scalarMin() const {
  224. return _inputScalars[SCALAR_IN_MIN];
  225. }
  226. Kst::ScalarPtr EffectiveBandwidthSource::scalarFreq() const {
  227. return _inputScalars[SCALAR_IN_FREQ];
  228. }
  229. Kst::ScalarPtr EffectiveBandwidthSource::scalarK() const {
  230. return _inputScalars[SCALAR_IN_K];
  231. }
  232. QStringList EffectiveBandwidthSource::inputVectorList() const {
  233. QStringList vectors(VECTOR_IN_X);
  234. vectors += VECTOR_IN_Y;
  235. return vectors;
  236. }
  237. QStringList EffectiveBandwidthSource::inputScalarList() const {
  238. QStringList scalars(SCALAR_IN_MIN);
  239. scalars += SCALAR_IN_FREQ;
  240. scalars += SCALAR_IN_K;
  241. return scalars;
  242. }
  243. QStringList EffectiveBandwidthSource::inputStringList() const {
  244. return QStringList( /*STRING_IN*/ );
  245. }
  246. QStringList EffectiveBandwidthSource::outputVectorList() const {
  247. return QStringList( /*VECTOR_OUT*/ );
  248. }
  249. QStringList EffectiveBandwidthSource::outputScalarList() const {
  250. QStringList scalars(SCALAR_OUT_LIMIT);
  251. scalars += SCALAR_OUT_SIGMA;
  252. scalars += SCALAR_OUT_BANDWIDTH;
  253. return scalars;
  254. }
  255. QStringList EffectiveBandwidthSource::outputStringList() const {
  256. return QStringList( /*STRING_OUT*/ );
  257. }
  258. void EffectiveBandwidthSource::saveProperties(QXmlStreamWriter &s) {
  259. Q_UNUSED(s);
  260. // s.writeAttribute("value", _configValue);
  261. }
  262. QString EffectiveBandwidthPlugin::pluginName() const { return "Effective Bandwidth"; }
  263. QString EffectiveBandwidthPlugin::pluginDescription() const { return "Calculates effective bandwidth from an amplitude spectrum."; }
  264. Kst::DataObject *EffectiveBandwidthPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const {
  265. if (ConfigEffectiveBandwidthPlugin* config = static_cast<ConfigEffectiveBandwidthPlugin*>(configWidget)) {
  266. EffectiveBandwidthSource* object = store->createObject<EffectiveBandwidthSource>();
  267. if (setupInputsOutputs) {
  268. object->setupOutputs();
  269. object->setInputVector(VECTOR_IN_X, config->selectedVectorX());
  270. object->setInputVector(VECTOR_IN_Y, config->selectedVectorY());
  271. object->setInputScalar(SCALAR_IN_MIN, config->selectedScalarMin());
  272. object->setInputScalar(SCALAR_IN_FREQ, config->selectedScalarFreq());
  273. object->setInputScalar(SCALAR_IN_K, config->selectedScalarK());
  274. }
  275. object->setPluginName(pluginName());
  276. object->writeLock();
  277. object->registerChange();
  278. object->unlock();
  279. return object;
  280. }
  281. return 0;
  282. }
  283. Kst::DataObjectConfigWidget *EffectiveBandwidthPlugin::configWidget(QSettings *settingsObject) const {
  284. ConfigEffectiveBandwidthPlugin *widget = new ConfigEffectiveBandwidthPlugin(settingsObject);
  285. return widget;
  286. }
  287. Q_EXPORT_PLUGIN2(kstplugin_BinPlugin, EffectiveBandwidthPlugin)
  288. // vim: ts=2 sw=2 et