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 
15 /* 'boxcar decimation filter': not very useful. */
16 
17 #include "bin.h"
18 #include "objectstore.h"
19 #include "ui_binconfig.h"
20 
21 static const QString& VECTOR_IN = "Vector In";
22 static const QString& SCALAR_IN = "Scalar In";
23 static const QString& VECTOR_OUT = "Bins";
24 
25 class ConfigWidgetBinPlugin : public Kst::DataObjectConfigWidget, public Ui_BinConfig {
26   public:
ConfigWidgetBinPlugin(QSettings * cfg)27     ConfigWidgetBinPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_BinConfig() {
28       _store = 0;
29       setupUi(this);
30     }
31 
~ConfigWidgetBinPlugin()32     ~ConfigWidgetBinPlugin() {}
33 
setObjectStore(Kst::ObjectStore * store)34     void setObjectStore(Kst::ObjectStore* store) {
35       _store = store;
36       _vector->setObjectStore(store);
37       _scalarBin->setObjectStore(store);
38       _scalarBin->setDefaultValue(10);
39     }
40 
setupSlots(QWidget * dialog)41     void setupSlots(QWidget* dialog) {
42       if (dialog) {
43         connect(_vector, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified()));
44         connect(_scalarBin, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified()));
45       }
46     }
47 
selectedVector()48     Kst::VectorPtr selectedVector() { return _vector->selectedVector(); };
setSelectedVector(Kst::VectorPtr vector)49     void setSelectedVector(Kst::VectorPtr vector) { return _vector->setSelectedVector(vector); };
50 
selectedScalar()51     Kst::ScalarPtr selectedScalar() { return _scalarBin->selectedScalar(); };
setSelectedScalar(Kst::ScalarPtr scalar)52     void setSelectedScalar(Kst::ScalarPtr scalar) { return _scalarBin->setSelectedScalar(scalar); };
53 
setupFromObject(Kst::Object * dataObject)54     virtual void setupFromObject(Kst::Object* dataObject) {
55       if (BinSource* source = static_cast<BinSource*>(dataObject)) {
56         setSelectedVector(source->vector());
57         setSelectedScalar(source->binScalar());
58       }
59     }
60 
configurePropertiesFromXml(Kst::ObjectStore * store,QXmlStreamAttributes & attrs)61     virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) {
62       Q_UNUSED(store);
63       Q_UNUSED(attrs);
64 
65       bool validTag = true;
66 
67 //       QStringRef av;
68 //       av = attrs.value("value");
69 //       if (!av.isNull()) {
70 //         _configValue = QVariant(av.toString()).toBool();
71 //       }
72 
73       return validTag;
74     }
75 
76   public slots:
save()77     virtual void save() {
78       if (_cfg) {
79         _cfg->beginGroup("Bin DataObject Plugin");
80         _cfg->setValue("Input Vector", _vector->selectedVector()->Name());
81         _cfg->setValue("Input Bin Scalar", _scalarBin->selectedScalar()->Name());
82         _cfg->endGroup();
83       }
84     }
85 
load()86     virtual void load() {
87       if (_cfg && _store) {
88         _cfg->beginGroup("Bin DataObject Plugin");
89         QString vectorName = _cfg->value("Input Vector").toString();
90         Kst::Object* object = _store->retrieveObject(vectorName);
91         Kst::Vector* vector = static_cast<Kst::Vector*>(object);
92         if (vector) {
93           setSelectedVector(vector);
94         }
95         QString scalarName = _cfg->value("Input Bin Scalar").toString();
96         object = _store->retrieveObject(scalarName);
97         Kst::Scalar* binScalar = static_cast<Kst::Scalar*>(object);
98         if (binScalar) {
99           setSelectedScalar(binScalar);
100         }
101         _cfg->endGroup();
102       }
103     }
104 
105   private:
106     Kst::ObjectStore *_store;
107 
108 };
109 
110 
BinSource(Kst::ObjectStore * store)111 BinSource::BinSource(Kst::ObjectStore *store)
112 : Kst::BasicPlugin(store) {
113 }
114 
115 
~BinSource()116 BinSource::~BinSource() {
117 }
118 
119 
_automaticDescriptiveName() const120 QString BinSource::_automaticDescriptiveName() const {
121   return tr("Bin Plugin Object");
122 }
123 
124 
change(Kst::DataObjectConfigWidget * configWidget)125 void BinSource::change(Kst::DataObjectConfigWidget *configWidget) {
126   if (ConfigWidgetBinPlugin* config = static_cast<ConfigWidgetBinPlugin*>(configWidget)) {
127     setInputVector(VECTOR_IN, config->selectedVector());
128     setInputScalar(SCALAR_IN, config->selectedScalar());
129   }
130 }
131 
132 
setupOutputs()133 void BinSource::setupOutputs() {
134   setOutputVector(VECTOR_OUT, "");
135 }
136 
137 
algorithm()138 bool BinSource::algorithm() {
139   Kst::VectorPtr inputVector = _inputVectors[VECTOR_IN];
140   Kst::ScalarPtr inputScalar = _inputScalars[SCALAR_IN];
141   Kst::VectorPtr outputVector = _outputVectors[VECTOR_OUT];
142 
143   //Make sure there is at least 1 element in the input vector
144   if (inputVector->length() < 1) {
145     _errorString = tr("Error:  Input Vector invalid size");
146     return false;
147   }
148   //Make sure the bin size is at least 1
149   if (inputScalar->value() < 1) {
150     _errorString = tr("Error:  No Bins");
151     return false;
152   }
153 
154   // allocate the lengths
155   outputVector->resize(int(inputVector->length() / inputScalar->value()), false);
156 
157   //now bin the data
158   for (int i = 0; i < outputVector->length(); i++)
159   {
160       outputVector->raw_V_ptr()[i] = 0;
161       //add up the elements for this bin
162       for (int j = 0; j < inputScalar->value(); j++)
163       {
164           outputVector->raw_V_ptr()[i] += inputVector->raw_V_ptr()[int(i*inputScalar->value()+j)];
165       }
166       //find the mean
167       outputVector->raw_V_ptr()[i] /= inputScalar->value();
168   }
169   return true;
170 }
171 
172 
vector() const173 Kst::VectorPtr BinSource::vector() const {
174   return _inputVectors[VECTOR_IN];
175 }
176 
177 
binScalar() const178 Kst::ScalarPtr BinSource::binScalar() const {
179   return _inputScalars[SCALAR_IN];
180 }
181 
182 
inputVectorList() const183 QStringList BinSource::inputVectorList() const {
184   return QStringList( VECTOR_IN );
185 }
186 
187 
inputScalarList() const188 QStringList BinSource::inputScalarList() const {
189   return QStringList( SCALAR_IN );
190 }
191 
192 
inputStringList() const193 QStringList BinSource::inputStringList() const {
194   return QStringList( /*STRING_IN*/ );
195 }
196 
197 
outputVectorList() const198 QStringList BinSource::outputVectorList() const {
199   return QStringList( VECTOR_OUT );
200 }
201 
202 
outputScalarList() const203 QStringList BinSource::outputScalarList() const {
204   return QStringList( /*SCALAR_OUT*/ );
205 }
206 
207 
outputStringList() const208 QStringList BinSource::outputStringList() const {
209   return QStringList( /*STRING_OUT*/ );
210 }
211 
212 
saveProperties(QXmlStreamWriter & s)213 void BinSource::saveProperties(QXmlStreamWriter &s) {
214   Q_UNUSED(s);
215 //   s.writeAttribute("value", _configValue);
216 }
217 
218 
pluginName() const219 QString BinPlugin::pluginName() const { return tr("Bin"); }
pluginDescription() const220 QString BinPlugin::pluginDescription() const { return tr("Bins data into the given size bins.  Each bin contains the mean of the elements belonging to the bin."); }
221 
222 
create(Kst::ObjectStore * store,Kst::DataObjectConfigWidget * configWidget,bool setupInputsOutputs) const223 Kst::DataObject *BinPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const {
224 
225   if (ConfigWidgetBinPlugin* config = static_cast<ConfigWidgetBinPlugin*>(configWidget)) {
226 
227     BinSource* object = store->createObject<BinSource>();
228 
229     if (setupInputsOutputs) {
230       object->setInputScalar(SCALAR_IN, config->selectedScalar());
231       object->setupOutputs();
232       object->setInputVector(VECTOR_IN, config->selectedVector());
233     }
234 
235     object->setPluginName(pluginName());
236 
237     object->writeLock();
238     object->registerChange();
239     object->unlock();
240 
241     return object;
242   }
243   return 0;
244 }
245 
246 
configWidget(QSettings * settingsObject) const247 Kst::DataObjectConfigWidget *BinPlugin::configWidget(QSettings *settingsObject) const {
248   ConfigWidgetBinPlugin *widget = new ConfigWidgetBinPlugin(settingsObject);
249   return widget;
250 }
251 
252 #ifndef QT5
253 Q_EXPORT_PLUGIN2(kstplugin_BinPlugin, BinPlugin)
254 #endif
255 
256 // vim: ts=2 sw=2 et
257