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