[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [kst-plot] /: Python bindings for Spectra.
From:       Barth Netterfield <netterfield () astro ! utoronto ! ca>
Date:       2014-06-30 19:50:24
Message-ID: E1X1haq-0006nx-Nd () scm ! kde ! org
[Download RAW message or body]

Git commit 54e992c1aa3304738914a6b0021fe49348713e30 by Barth Netterfield.
Committed on 29/06/2014 at 21:32.
Pushed by netterfield into branch 'master'.

Python bindings for Spectra.

M  +16   -0    pyKst/demo/testdataobjects.py
M  +34   -0    pyKst/html/index.rst
M  +189  -1    pyKst/pykst.py
M  +4    -4    src/libkstapp/scriptserver.cpp
M  +2    -2    src/libkstapp/scriptserver.h
M  +136  -14   src/libkstmath/dataobjectscriptinterface.cpp
M  +11   -2    src/libkstmath/dataobjectscriptinterface.h

http://commits.kde.org/kst-plot/54e992c1aa3304738914a6b0021fe49348713e30

diff --git a/pyKst/demo/testdataobjects.py b/pyKst/demo/testdataobjects.py
index bf7038e..a086e1a 100755
--- a/pyKst/demo/testdataobjects.py
+++ b/pyKst/demo/testdataobjects.py
@@ -11,3 +11,19 @@ e1.set_x(v4)
 v2 = e1.Y()
 v3 = e1.X()
 print v2.name(), v2.value(3), v3.value(3)
+
+
+c1 = client.new_curve(e1.X(), e1.Y())
+c1.set_color("blue")
+
+p1 = client.new_plot((0.5,0.25), (1,0.5))
+p1.add(c1)
+
+psd1 = client.new_spectrum(e1.X())
+c2 = client.new_curve(psd1.X(), psd1.Y())
+c2.set_color("green")
+
+p2 = client.new_plot((0.5,0.75), (1,0.5))
+p2.add(c2)
+
+print "average?", psd1.interleaved_average()
diff --git a/pyKst/html/index.rst b/pyKst/html/index.rst
index 0f91035..8c03276 100644
--- a/pyKst/html/index.rst
+++ b/pyKst/html/index.rst
@@ -64,6 +64,35 @@ Strings
    :members:
    :inherited-members:
 
+Data Objects
+************
+Data Objects are objects which transform primitives into other
+primitives.
+
+Equations
+---------
+.. autoclass:: Equation
+   :members:
+   :inherited-members:
+
+Spectra
+-------
+.. autoclass:: Spectrum
+   :members:
+   :inherited-members:
+
+Linear Fit
+----------
+.. autoclass:: LinearFit
+   :members:
+   :inherited-members:
+
+Polynomial Fit
+--------------
+.. autoclass:: PolynomailFit
+   :members:
+   :inherited-members:
+
 Relations
 *********
 Relations are objects which can be added to a plot.
@@ -74,6 +103,11 @@ Curves
    :members:
    :inherited-members:
 
+Images
+------
+.. autoclass:: Image 
+   :members:
+   :inherited-members:
 
 Annotations
 ***********
diff --git a/pyKst/pykst.py b/pyKst/pykst.py
index 8b1bba7..88fcd67 100644
--- a/pyKst/pykst.py
+++ b/pyKst/pykst.py
@@ -267,6 +267,7 @@ class Client:
     """
     return Equation(self, x_vector, equation, name)
 
+
   def equation(self, name):
     """ Returns an Equation from kst given its name.
     
@@ -274,6 +275,46 @@ class Client:
     """
     return Equation(self, "", "", name, new=False)
 
+  def new_spectrum(self, 
+                   vector, 
+                   sample_rate = 1.0, 
+                   interleaved_average = False,
+                   fft_length = 10,
+                   apodize = True, 
+                   remove_mean = True, 
+                   vector_units = "",
+                   rate_units = "Hz",
+                   apodize_function = 0,
+                   sigma = 1.0,
+                   output_type = 0,
+                   interpolate_over_holes = True,
+                   name=""):
+    """ Create a new Spectrum in kst.
+    
+    See :class:`Spectrum`
+    """
+    return Spectrum(self, 
+                    vector, 
+                    sample_rate, 
+                    interleaved_average,
+                    fft_length,
+                    apodize,
+                    remove_mean,
+                    vector_units,
+                    rate_units,
+                    apodize_function,
+                    sigma,
+                    output_type,
+                    interpolate_over_holes,
+                    name)
+
+  def spectrum(self, name):
+    """ Returns a spectrum from kst given its name.
+    
+    See :class:`Spectrum`
+    """
+    return Spectrum(self, "", name=name, new=False)
+
   def new_linear_fit(self, xVector, yVector, weightvector = 0, name = ""):
     """ Create a New Linear Fit in kst.
     
@@ -1340,7 +1381,7 @@ class Image(Relation):
 class Equation(NamedObject) : 
   """ An equation inside kst.
    
-    :param x_vector: the x vector of the equation
+    :param xvector: the x vector of the equation
     :param equation: the equation
     
     Vectors inside kst are refered to as [vectorname] or [scalarname].
@@ -1374,6 +1415,153 @@ class Equation(NamedObject) :
   def set_x(self, xvector): 
     self.client.send_si(self.handle, "setInputVector(X,"+xvector.handle+")")
 
+# Spectrum ############################################################
+class Spectrum(NamedObject) : 
+  """ An spectrum inside kst.
+   
+    :param vector: the vector to take the spectrum of
+    :param sample_rate: the sample rate of the vector
+    :param interleaved_average: average spectra of length fft_length
+    :param fft_length: the fft is 2^fft_length long if interleaved_average is true.
+    :param apodize: if true, apodize the vector first
+    :param remove_mean: if true, remove mean first
+    :param vector_unints: units of the input vector - for labels.
+    :param rate_units: the units of the sample rate - for labels.
+    :param apodize_function: index of the apodization function - see apodize_function()
+    :param sigma: only used if gausian apodization is selected.
+    :param output_type: index for the output type - see output_type()
+    :param interpolate_over_holes: interpolate over NaNs, if true.
+    
+  """
+  def __init__(self, client, 
+               vector, 
+               sample_rate = 1.0, 
+               interleaved_average = False,
+               fft_length = 10,
+               apodize = True, 
+               remove_mean = True, 
+               vector_units = "",
+               rate_units = "Hz",
+               apodize_function = 0,
+               sigma = 1.0,
+               output_type = 0,
+               interpolate_over_holes = True,
+               name="", new=True) :
+    
+    NamedObject.__init__(self,client)
+    
+    if (new == True):      
+      self.client.send("newSpectrum()")
+
+      self.client.send("change(" + vector.handle + "," +
+                       b2str(sample_rate) + "," +
+                       b2str(interleaved_average) + "," +
+                       b2str(fft_length) + "," +
+                       b2str(apodize) + "," +
+                       b2str(remove_mean) + "," +
+                       vector_units + "," +
+                       rate_units + "," +
+                       b2str(apodize_function) + "," +
+                       b2str(sigma) + "," +
+                       b2str(output_type) + "," +
+                       b2str(interpolate_over_holes) + ")")
+
+      self.handle=self.client.send("endEdit()")
+      self.handle.remove(0,self.handle.indexOf("ing ")+4)
+      self.set_name(name)
+    else:
+      self.handle = name
+
+  def Y(self) :
+    """ a vector containing the spectrum  """
+    vec = VectorBase(self.client)
+    vec.handle = self.client.send_si(self.handle, "outputVector(S)")
+    return vec
+
+  def X(self) :
+    """ a vector containing the frequency bins  """
+    vec = VectorBase(self.client)
+    vec.handle = self.client.send_si(self.handle, "outputVector(F)")
+    return vec
+
+  def set_vector(self, xvector): 
+    """ set the input vector """
+    self.client.send_si(self.handle, "setInputVector(I,"+xvector.handle+")")
+
+  def interleaved_average(self):
+    """ average spectra of length fft_length() """
+    retval = self.client.send_si(self.handle, "interleavedAverage()")
+    return retval
+
+  def sample_rate(self):
+    """ the sample rate assumed for the spectra. """
+    retval = self.client.send_si(self.handle, "sampleRate()")
+    return retval
+
+  def fft_length(self):
+    """ ffts are 2^fft_length() long if interleaved_average is set """
+    retval = self.client.send_si(self.handle, "fftLength()")
+    return retval
+
+  def apodize(self):
+    """ apodize before taking spectra, if set """
+    retval = self.client.send_si(self.handle, "apodize()")
+    return retval
+
+  def remove_mean(self):
+    """ remove mean before taking spectra, if set """
+    retval = self.client.send_si(self.handle, "removeMean()")
+    return retval
+
+  def vector_units(self):
+    """ the units of the input vector.  For labels """
+    retval = self.client.send_si(self.handle, "vectorUnits()")
+    return retval
+
+  def rate_units(self):
+    """ the units of the sample rate.  For labels """
+    retval = self.client.send_si(self.handle, "rateUnits()")
+    return retval
+
+  def apodize_function(self):
+    """ the index of the apodize function.
+    
+    The apodize funcition is::
+    
+     0: default          1: Bartlett
+     2: Window           3: Connes
+     4: Cosine           5: Gaussian
+     6: Hamming          7: Hann
+     8: Welch            9: Uniform
+    
+    """
+    retval = self.client.send_si(self.handle, "apodizeFunctionIndex()")
+    return retval
+
+  def gaussian_sigma(self):
+    """ the width, if apodize_funcion_index() is 5 (gaussian). """
+    retval = self.client.send_si(self.handle, "gaussianSigma()")
+    return retval
+
+  def output_type(self):
+    """ the index of the spectrum output type.
+    
+    The output type is::
+    
+     0: Amplitude Spectral Density  1: Power Spectral Density = 1,
+     2: AmplitudeSpectrum           3: Power Spectrum
+    
+    """
+
+    retval = self.client.send_si(self.handle, "outputTypeIndex()")
+    return retval
+
+  def interpolate_over_holes(self):
+    """ replace NaNs with an interpolation, if true. """
+    retval = self.client.send_si(self.handle, "interpolateOverHoles()")
+    return retval
+
+
 # FIT ###################################################################
 class Fit(NamedObject) :
   """ This is a class which provides some methods common to all fits """
diff --git a/src/libkstapp/scriptserver.cpp b/src/libkstapp/scriptserver.cpp
index 145e00b..011765b 100644
--- a/src/libkstapp/scriptserver.cpp
+++ b/src/libkstapp/scriptserver.cpp
@@ -124,8 +124,8 @@ ScriptServer::ScriptServer(ObjectStore *obj) : _server(new QLocalServer(this)),
     _fnMap.insert("getHistogramList()",&ScriptServer::getHistogramList);
 //    _fnMap.insert("newHistogram()",&ScriptServer::newHistogram);
 
-    _fnMap.insert("getPSDList()",&ScriptServer::getPSDList);
-    _fnMap.insert("newPSD()",&ScriptServer::newPSD);
+    _fnMap.insert("getSpectrumList()",&ScriptServer::getSpectrumList);
+    _fnMap.insert("newSpectrum()",&ScriptServer::newSpectrum);
 
     _fnMap.insert("getPluginList()", &ScriptServer::getPluginList);
     _fnMap.insert("newPlugin()",&ScriptServer::newPlugin);
@@ -611,13 +611,13 @@ QByteArray ScriptServer::newHistogram(QByteArray&, QLocalSocket* s,ObjectStore*,
 */
 
 
-QByteArray ScriptServer::getPSDList(QByteArray&, QLocalSocket* s,ObjectStore*_store) {
+QByteArray ScriptServer::getSpectrumList(QByteArray&, QLocalSocket* s,ObjectStore*_store) {
 
     return outputObjectList<PSD>(s,_store);
 }
 
 
-QByteArray ScriptServer::newPSD(QByteArray&, QLocalSocket* s,ObjectStore*) {
+QByteArray ScriptServer::newSpectrum(QByteArray&, QLocalSocket* s,ObjectStore*) {
 
   if(_interface) {
     return handleResponse("To access this function, first call endEdit()",s);
diff --git a/src/libkstapp/scriptserver.h b/src/libkstapp/scriptserver.h
index 573ccf3..b94f147 100644
--- a/src/libkstapp/scriptserver.h
+++ b/src/libkstapp/scriptserver.h
@@ -84,8 +84,8 @@ protected:
     QByteArray getHistogramList(QByteArray& command, QLocalSocket* s,ObjectStore*_store);
     //QByteArray newHistogram(QByteArray& command, QLocalSocket* s,ObjectStore*_store);
 
-    QByteArray getPSDList(QByteArray& command, QLocalSocket* s,ObjectStore*_store);
-    QByteArray newPSD(QByteArray& command, QLocalSocket* s,ObjectStore*_store);
+    QByteArray getSpectrumList(QByteArray& command, QLocalSocket* s,ObjectStore*_store);
+    QByteArray newSpectrum(QByteArray& command, QLocalSocket* s,ObjectStore*_store);
 
     QByteArray getPluginList(QByteArray& command, QLocalSocket* s,ObjectStore*_store);
     QByteArray newPlugin(QByteArray& command, QLocalSocket* s,ObjectStore*_store);
diff --git a/src/libkstmath/dataobjectscriptinterface.cpp b/src/libkstmath/dataobjectscriptinterface.cpp
index 50c1eea..f511734 100644
--- a/src/libkstmath/dataobjectscriptinterface.cpp
+++ b/src/libkstmath/dataobjectscriptinterface.cpp
@@ -252,6 +252,20 @@ SpectrumSI::SpectrumSI(PSDPtr psd) {
     _dataObject = 0;
   }
 
+  _fnMap.insert("change",&SpectrumSI::change);
+  _fnMap.insert("sampleRate",&SpectrumSI::sampleRate);
+
+  _fnMap.insert("interleavedAverage",&SpectrumSI::interleavedAverage);
+  _fnMap.insert("fftLength",&SpectrumSI::fftLength);
+  _fnMap.insert("apodize",&SpectrumSI::apodize);
+  _fnMap.insert("removeMean",&SpectrumSI::removeMean);
+  _fnMap.insert("vectorUnits",&SpectrumSI::vectorUnints);
+  _fnMap.insert("rateUnits",&SpectrumSI::rateUnits);
+  _fnMap.insert("apodizeFunctionIndex",&SpectrumSI::apodizeFunctionIndex);
+  _fnMap.insert("gaussianSigma",&SpectrumSI::gaussianSigma);
+  _fnMap.insert("outputTypeIndex",&SpectrumSI::outputTypeIndex);
+  _fnMap.insert("interpolateOverHoles",&SpectrumSI::interpolateOverHoles);
+
   _fnMap.insert("setInputVector",&SpectrumSI::setInputVector);
   _fnMap.insert("setInputScalar",&SpectrumSI::setInputScalar);
   _fnMap.insert("outputVector",&SpectrumSI::outputVector);
@@ -306,29 +320,137 @@ ScriptInterface* SpectrumSI::newSpectrum(ObjectStore *store) {
 
 
 QString SpectrumSI::change(QString& command) {
-  /*
   if (_psd) {
     QStringList vars = getArgs(command);
-    
+
+    QString vec_name = vars.at(0);
+    VectorPtr vector = kst_cast<Vector>(_dataObject->store()->retrieveObject(vec_name));
+
+
     _psd->change(vector,
-                 sampleRate, 
-                 interleavedAverage,
-                 FFTLength,
-                 apodize,
-                 removeMean,
-                 vectorUnits,
-                 rateUnits,
-                 apodizeFunction,
-                 sigma,
-                 output,
-                 interpolateOverHoles);
+                 vars.at(1).toDouble(),            // sample_rate
+                 (vars.at(2).toLower() == "true"), // interleaved_average,
+                 vars.at(3).toInt(),               // fft_length,
+                 (vars.at(4).toLower() == "true"), // apodize,
+                 (vars.at(5).toLower() == "true"), // remove_mean,
+                 vars.at(6),                       // vector unints
+                 vars.at(7),                       // rate units
+                 ApodizeFunction(vars.at(8).toInt()), // apodizeFunction,
+                 vars.at(9).toDouble(),            // sigma,
+                 PSDType(vars.at(10).toInt()),     // output type
+                 (vars.at(11).toLower() == "true") // interpolateOverHoles
+                 );
     
     
     return "done";
   } else {
     return "Invalid";
   }
-  */
+}
+
+QString SpectrumSI::sampleRate(QString&) {
+  if (_psd) {
+    return QString::number(_psd->frequency());
+  } else {
+    return "Invalid";
+  }
+}
+
+QString SpectrumSI::interleavedAverage(QString &) {
+  if (_psd) {
+    if (_psd->interpolateHoles()) {
+      return "True";
+    } else {
+      return "False";
+    }
+  } else {
+    return "Invalid";
+  }
+}
+
+
+QString SpectrumSI::fftLength(QString &) {
+  if (_psd) {
+    return QString::number(_psd->frequency());
+  } else {
+    return "Invalid";
+  }
+}
+
+QString SpectrumSI::apodize(QString &) {
+  if (_psd) {
+    if (_psd->apodize()) {
+      return "True";
+    } else {
+      return "False";
+    }
+  } else {
+    return "Invalid";
+  }
+}
+
+QString SpectrumSI::removeMean(QString &) {
+  if (_psd) {
+    if (_psd->removeMean()) {
+      return "True";
+    } else {
+      return "False";
+    }
+  } else {
+    return "Invalid";
+  }
+}
+
+QString SpectrumSI::vectorUnints(QString &) {
+  if (_psd) {
+    return _psd->vectorUnits();
+  } else {
+    return "Invalid";
+  }
+}
+
+QString SpectrumSI::rateUnits(QString &) {
+  if (_psd) {
+    return _psd->rateUnits();
+  } else {
+    return "Invalid";
+  }
+}
+
+QString SpectrumSI::apodizeFunctionIndex(QString &) {
+  if (_psd) {
+    return QString::number(int(_psd->apodizeFxn()));
+  } else {
+    return "Invalid";
+  }
+}
+
+QString SpectrumSI::gaussianSigma(QString &) {
+  if (_psd) {
+    return QString::number(_psd->gaussianSigma());
+  } else {
+    return "Invalid";
+  }
+}
+
+QString SpectrumSI::outputTypeIndex(QString &) {
+ if (_psd) {
+       return QString::number(int(_psd->output()));
+ } else {
+   return "Invalid";
+ }
+}
+
+QString SpectrumSI::interpolateOverHoles(QString &) {
+  if (_psd) {
+    if (_psd->interpolateHoles()) {
+      return "True";
+    } else {
+      return "False";
+    }
+  } else {
+    return "Invalid";
+  }
 }
 
 
diff --git a/src/libkstmath/dataobjectscriptinterface.h b/src/libkstmath/dataobjectscriptinterface.h
index b312ea4..c9ae969 100644
--- a/src/libkstmath/dataobjectscriptinterface.h
+++ b/src/libkstmath/dataobjectscriptinterface.h
@@ -121,8 +121,17 @@ public:
     QMap<QString,SpectrumInterfaceMemberFn> _fnMap;
 
     QString change(QString &command);
-    //QString equation(QString &);
-    //QString setEquation(QString &eq);
+    QString sampleRate(QString &);
+    QString interleavedAverage(QString &);
+    QString fftLength(QString &);
+    QString apodize(QString &);
+    QString removeMean(QString &);
+    QString vectorUnints(QString &);
+    QString rateUnits(QString &);
+    QString apodizeFunctionIndex(QString &);
+    QString gaussianSigma(QString &);
+    QString outputTypeIndex(QString &);
+    QString interpolateOverHoles(QString &);
 };
 
 

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic