annotate data/model/EditableDenseThreeDimensionalModel.h @ 558:1d7ebc05157e

* Some fairly simplistic code to set up layer type properties based on RDF data about feature types (both when running transforms and when importing features from RDF files).
author Chris Cannam
date Thu, 12 Feb 2009 15:26:43 +0000
parents beb51f558e9c
children dd97f7b3d120
rev   line source
Chris@152 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@152 2
Chris@152 3 /*
Chris@152 4 Sonic Visualiser
Chris@152 5 An audio file viewer and annotation editor.
Chris@152 6 Centre for Digital Music, Queen Mary, University of London.
Chris@202 7 This file copyright 2006 Chris Cannam and QMUL.
Chris@152 8
Chris@152 9 This program is free software; you can redistribute it and/or
Chris@152 10 modify it under the terms of the GNU General Public License as
Chris@152 11 published by the Free Software Foundation; either version 2 of the
Chris@152 12 License, or (at your option) any later version. See the file
Chris@152 13 COPYING included with this distribution for more information.
Chris@152 14 */
Chris@152 15
Chris@152 16 #ifndef _EDITABLE_DENSE_THREE_DIMENSIONAL_MODEL_H_
Chris@152 17 #define _EDITABLE_DENSE_THREE_DIMENSIONAL_MODEL_H_
Chris@152 18
Chris@152 19 #include "DenseThreeDimensionalModel.h"
Chris@152 20
Chris@536 21 #include <QReadWriteLock>
Chris@536 22
Chris@533 23 #include <vector>
Chris@533 24
Chris@152 25 class EditableDenseThreeDimensionalModel : public DenseThreeDimensionalModel
Chris@152 26 {
Chris@152 27 Q_OBJECT
Chris@152 28
Chris@152 29 public:
Chris@535 30
Chris@535 31 // EditableDenseThreeDimensionalModel supports a basic compression
Chris@535 32 // method that reduces the size of multirate data (e.g. wavelet
Chris@535 33 // transform outputs) that are stored as plain 3d grids by about
Chris@535 34 // 60% or thereabouts. However, it can only be used for models
Chris@535 35 // whose columns are set in order from 0 and never subsequently
Chris@535 36 // changed. If the model is going to be actually edited, it must
Chris@535 37 // have NoCompression.
Chris@535 38
Chris@535 39 enum CompressionType
Chris@535 40 {
Chris@535 41 NoCompression,
Chris@535 42 BasicMultirateCompression
Chris@535 43 };
Chris@535 44
Chris@152 45 EditableDenseThreeDimensionalModel(size_t sampleRate,
Chris@152 46 size_t resolution,
Chris@152 47 size_t yBinCount,
Chris@535 48 CompressionType compression,
Chris@152 49 bool notifyOnAdd = true);
Chris@152 50
Chris@152 51 virtual bool isOK() const;
Chris@152 52
Chris@152 53 virtual size_t getSampleRate() const;
Chris@152 54 virtual size_t getStartFrame() const;
Chris@152 55 virtual size_t getEndFrame() const;
Chris@152 56
Chris@152 57 virtual Model *clone() const;
Chris@152 58
Chris@152 59
Chris@152 60 /**
Chris@152 61 * Return the number of sample frames covered by each set of bins.
Chris@152 62 */
Chris@152 63 virtual size_t getResolution() const;
Chris@152 64
Chris@152 65 /**
Chris@152 66 * Set the number of sample frames covered by each set of bins.
Chris@152 67 */
Chris@152 68 virtual void setResolution(size_t sz);
Chris@152 69
Chris@152 70 /**
Chris@182 71 * Return the number of columns.
Chris@182 72 */
Chris@182 73 virtual size_t getWidth() const;
Chris@182 74
Chris@182 75 /**
Chris@152 76 * Return the number of bins in each set of bins.
Chris@152 77 */
Chris@182 78 virtual size_t getHeight() const;
Chris@152 79
Chris@152 80 /**
Chris@152 81 * Set the number of bins in each set of bins.
Chris@152 82 */
Chris@182 83 virtual void setHeight(size_t sz);
Chris@152 84
Chris@152 85 /**
Chris@152 86 * Return the minimum value of the value in each bin.
Chris@152 87 */
Chris@152 88 virtual float getMinimumLevel() const;
Chris@152 89
Chris@152 90 /**
Chris@152 91 * Set the minimum value of the value in a bin.
Chris@152 92 */
Chris@152 93 virtual void setMinimumLevel(float sz);
Chris@152 94
Chris@152 95 /**
Chris@152 96 * Return the maximum value of the value in each bin.
Chris@152 97 */
Chris@152 98 virtual float getMaximumLevel() const;
Chris@152 99
Chris@152 100 /**
Chris@152 101 * Set the maximum value of the value in a bin.
Chris@152 102 */
Chris@152 103 virtual void setMaximumLevel(float sz);
Chris@152 104
Chris@182 105 /**
Chris@182 106 * Return true if there are data available for the given column.
Chris@182 107 */
Chris@182 108 virtual bool isColumnAvailable(size_t x) const { return x < getWidth(); }
Chris@152 109
Chris@152 110 /**
Chris@182 111 * Get the set of bin values at the given column.
Chris@152 112 */
Chris@533 113 virtual Column getColumn(size_t x) const;
Chris@152 114
Chris@152 115 /**
Chris@182 116 * Get a single value, from the n'th bin of the given column.
Chris@152 117 */
Chris@182 118 virtual float getValueAt(size_t x, size_t n) const;
Chris@152 119
Chris@152 120 /**
Chris@182 121 * Set the entire set of bin values at the given column.
Chris@152 122 */
Chris@182 123 virtual void setColumn(size_t x, const Column &values);
Chris@152 124
Chris@152 125 virtual QString getBinName(size_t n) const;
Chris@152 126 virtual void setBinName(size_t n, QString);
Chris@152 127 virtual void setBinNames(std::vector<QString> names);
Chris@152 128
Chris@478 129 bool shouldUseLogValueScale() const;
Chris@478 130
Chris@333 131 virtual void setCompletion(int completion, bool update = true);
Chris@152 132 virtual int getCompletion() const { return m_completion; }
Chris@152 133
Chris@345 134 QString getTypeName() const { return tr("Editable Dense 3-D"); }
Chris@345 135
Chris@318 136 virtual QString toDelimitedDataString(QString delimiter) const;
Chris@318 137
Chris@152 138 virtual void toXml(QTextStream &out,
Chris@152 139 QString indent = "",
Chris@152 140 QString extraAttributes = "") const;
Chris@152 141
Chris@152 142 protected:
Chris@533 143 typedef QVector<Column> ValueMatrix;
Chris@152 144 ValueMatrix m_data;
Chris@152 145
Chris@535 146 // m_trunc is used for simple compression. If at least the top N
Chris@535 147 // elements of column x (for N = some proportion of the column
Chris@535 148 // height) are equal to those of an earlier column x', then
Chris@535 149 // m_trunc[x] will contain x-x' and column x will be truncated so
Chris@535 150 // as to remove the duplicate elements. If the equal elements are
Chris@535 151 // at the bottom, then m_trunc[x] will contain x'-x (a negative
Chris@535 152 // value). If m_trunc[x] is 0 then the whole of column x is
Chris@535 153 // stored.
Chris@535 154 std::vector<signed char> m_trunc;
Chris@534 155 void truncateAndStore(size_t index, const Column & values);
Chris@534 156 Column expandAndRetrieve(size_t index) const;
Chris@534 157
Chris@152 158 std::vector<QString> m_binNames;
Chris@152 159
Chris@152 160 size_t m_sampleRate;
Chris@152 161 size_t m_resolution;
Chris@152 162 size_t m_yBinCount;
Chris@535 163 CompressionType m_compression;
Chris@152 164 float m_minimum;
Chris@152 165 float m_maximum;
Chris@256 166 bool m_haveExtents;
Chris@152 167 bool m_notifyOnAdd;
Chris@152 168 long m_sinceLastNotifyMin;
Chris@152 169 long m_sinceLastNotifyMax;
Chris@152 170 int m_completion;
Chris@152 171
Chris@536 172 mutable QReadWriteLock m_lock;
Chris@152 173 };
Chris@152 174
Chris@152 175 #endif