Logo coherent WaveBurst  
Library Reference Guide
Logo
wavearray.hh
Go to the documentation of this file.
1 /*
2 # Copyright (C) 2019 Sergey Klimenko, Gabriele Vedovato
3 #
4 # This program is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation, either version 3 of the License, or
7 # (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program. If not, see <https://www.gnu.org/licenses/>.
16 */
17 
18 
19 /**********************************************************
20  * Package: Wavelet Analysis Tool
21  * File name: wavearray.h
22  **********************************************************/
23 
24 #ifndef WAVEARRAY_HH
25 #define WAVEARRAY_HH
26 
27 #include <iostream>
28 #include <string.h>
29 #include <math.h>
30 #include <stdio.h>
31 //#include "slice.h" // DMT CVS
32 //#include <valarray>
33 #ifndef __CINT__
34 #include <valarray>
35 #else
36 #include "wslice.hh" // include definition of std::slice for rootcint
37 //namespace std {
38 // class slice; // DMT
39 //}
40 #endif
41 #include "Wavelet.hh"
42 
43 #ifdef _USE_DMT
44  #include "Time.hh"
45  #include "Interval.hh"
46  #include "TSeries.hh"
47 #endif
48 
49 #include "TFFTComplexReal.h"
50 #include "TFFTRealComplex.h"
51 #include "TNamed.h"
52 
53 template<class DataType_t>
54 class wavearray : public TNamed
55 {
56 
57  public:
58 
59  wavearray(int); // Constructor
60 
61  wavearray(); // Default constructor
62 
63  wavearray(const wavearray<DataType_t>&); // copy Constructor
64 
65 // explicit construction from array
66  template <class T>
67  wavearray(const T *, unsigned int, double=0.);
68 
69  virtual ~wavearray(); // Destructor
70 
71 // operators
72 
74 
75 // operator[](const slice &) sets the Slice object of the wavearray class
76 // the operators above do not use Slice object.
78  virtual DataType_t & operator[](const unsigned int);
79 
80 // check if two wavearrays overlap
81  inline virtual size_t limit() const;
82  inline virtual size_t limit(const std::slice &) const;
83  inline virtual size_t limit(const wavearray<DataType_t> &) const;
84 
85 // the Slice object is used in the operators below and set to
86 // slice(0,N,1) when an operator has been executed for both arrays
87 
91  virtual wavearray<DataType_t>& operator<<(wavearray<DataType_t> &);
92 
93  wavearray<DataType_t>& operator= (const DataType_t);
94  virtual wavearray<DataType_t>& operator+=(const DataType_t);
95  virtual wavearray<DataType_t>& operator-=(const DataType_t);
96  virtual wavearray<DataType_t>& operator*=(const DataType_t);
97 
98  virtual char* operator>>(char*);
99 
100 #ifdef _USE_DMT
101  virtual wavearray<DataType_t>& operator= (const TSeries &);
102 #endif
103 
104 // member functions
105 
106  //: Dump data array to an ASCII file
107  virtual void Dump(const char*, int=0);
108 
109  //: Dump data array to a binary file
110  virtual void DumpBinary(const char*, int = 0);
111 
112  //: Dump data array from a binary file as 16bit words
113  virtual void DumpShort(const char*, int=0);
114 
115  //: Dump object array into file root
116  virtual void DumpObject(const char*);
117 
118  //: Read data array from a binary file
119  virtual void ReadBinary(const char*, int=0);
120 
121  //: Read data array from a binary file
122  virtual void ReadShort(const char*);
123 
124  virtual void FFT(int = 1); // fast Fourier transform
125  virtual void FFTW(int = 1); // fast Fourier transform West
126  virtual void resetFFTW(); // release FFTW memory
127 
128  void Resample(const wavearray<DataType_t> &, double, int=6);
129  void resample(const wavearray<DataType_t> &, double, int=6);
130  virtual void resample(double, int=6);
131  virtual void Resample(double); // resample with FFTW
132 
133  //: data time shift based on FFTW
134  //: T = time shift (sec)
135  virtual void delay(double T);
136 
137  virtual void start(double s) {Start=s; if(Rate>0.) Stop=Start+Size/Rate;};
138  virtual double start() const { return Start; };
139  virtual void stop(double s) {Stop = s; };
140  virtual double stop() const { return Stop; };
141  virtual void rate(double r) {Rate = fabs(r); Stop = Start+Size/Rate; };
142  virtual double rate() const { return Rate; };
143  virtual void edge(double s) {Edge = s; };
144  virtual double edge() const { return Edge; };
145  virtual size_t size() const { return Size; };
146  virtual void setSlice(const std::slice &s) { Slice=s; };
147  virtual std::slice getSlice() const { return Slice; };
148 
149  //: return median
150  //: for data between index1 and index2 (including)
151  virtual double median(size_t=0, size_t=0) const;
152 
153  //: calculate running median of data (x) with window of t seconds (par1)
154  //: put result in input array in if specified
155  //: subtract median from x if fl=true otherwise replace x with median
156  //: move running window by n samples
157  virtual void median(double t, wavearray<DataType_t>* in,
158  bool fl=false, size_t n=1);
159 
160  //: return mean
161  virtual double mean() const;
162 
163  //: return f percentile mean for data
164  // f - >0 positive side pecentile, <0 - double-side percentile
165  virtual double mean(double f);
166 
167  //: return mean for wavearray slice
168  virtual double mean(const std::slice&);
169 
170  //: calculate running mean of data (x) with window of t seconds
171  //: put result in input array in if specified
172  //: subtract mean from x if fl=true otherwise replace x with mean
173  //: move running window by n samples
174  virtual void mean(double t, wavearray<DataType_t>* in,
175  bool fl=false, size_t n=1);
176 
177  //: return sqrt<x^2>
178  virtual double rms();
179 
180  //: return sqrt<x^2> for wavearray slice
181  virtual double rms(const std::slice&);
182 
183  //: calculate running rms of data (x) with window of t seconds
184  //: put result in input array in if specified
185  //: subtract rms from x if fl=true otherwise replace x with rms
186  //: move running window by n samples
187  virtual void rms(double t, wavearray<DataType_t>* in,
188  bool fl=false, size_t n=1);
189 
190  //: return maximum for wavearray
191  virtual DataType_t max() const;
192 
193  //: store max elements max(this->data[i],in.data[i]) in this
194  //: param: input wavearray
195  virtual void max(wavearray<DataType_t> &);
196 
197  //: return minimum for wavearray
198  virtual DataType_t min() const;
199 
200  //: take square root of wavearray elements
201  virtual void SQRT() {
202  for(size_t i=0; i<this->size(); i++)
203  if(this->data[i]>0.) this->data[i]=(DataType_t)sqrt(double(this->data[i]));
204  return;
205  }
206 
207  // multiply wavearray by Hann window
208  inline void hann(void);
209 
210  // sort wavearray using quick sorting algorithm
211  // return DataType_t** pp pointer to array of wavearray pointers
212  // sorted from min to max
213  virtual void waveSort(DataType_t** pp, size_t l=0, size_t r=0) const;
214  // sort wavearray using quick sorting algorithm between left (l) and right (r) index
215  // sorted from min to max: this->data[l]/this->data[r] is min/max
216  virtual void waveSort(size_t l=0, size_t r=0);
217 
218  // split input array of pointers pp[i] between l <= i <= r so that:
219  // *pp[i] < *pp[m] if i < m
220  // *pp[i] > *pp[m] if i > m
221  virtual void waveSplit(DataType_t** pp, size_t l, size_t r, size_t m) const;
222  // split wavearray between l and r & at index m
223  virtual DataType_t waveSplit(size_t l, size_t r, size_t m);
224  // split wavearray at index m so that:
225  // *this->data[i] < *this->datap[m] if i < m
226  // *this->data[i] > *this->datap[m] if i > m
227  virtual void waveSplit(size_t m);
228 
229  //: return rank of sample n ranked against samples between
230  //: left (l) and right (r) boundaries
231  //: rank ranges from 1 to r-l+1
232  virtual int getSampleRank(size_t n, size_t l, size_t r) const;
233 
234  //: rank sample n against absolute value of samples between
235  //: left (l) and right (r) boundaries
236  //: rank ranges from 1 to r-l+1
237  virtual int getSampleRankE(size_t n, size_t l, size_t r) const;
238 
239  // calculate rank
240  // input - fraction of laudest samples
241  // output - min amplitude of laudest samples
242  DataType_t rank(double=0.5) const;
243 
244  // Linear Predictor Filter coefficients
245  // calculate autocorrelation function excluding 3% tails and
246  // solve symmetric Yule-Walker problem
247  // param 1: sifter size
248  // param 2: boundary offset
249  virtual wavearray<double> getLPRFilter(int, int=0, int=0);
250 
251  // generate Symmetric Prediction Error with Split Lattice Algorith
252  // param: filter length in seconds
253  // param: window for filter training
254  // param: boundary offset to account for wavelet artifacts
255  virtual void spesla(double,double,double=0.);
256 
257  // apply lpr filter defined in input wavearray<double>
258  virtual void lprFilter(wavearray<double>&);
259 
260  // calculate and apply lpr filter to this
261  // param: filter length in seconds
262  // param: filter mode: -1/0/1 - backward/symmetric/forward
263  // param: stride for filter training (0 - train on whole TS)
264  // param: boundary offset to account for wavelet artifacts
265  virtual void lprFilter(double,int=0,double=0.,double=0.,int=0);
266 
267  // normalization by 31% percentile amplitude
268  // param 1 - time window dT. if = 0 - dT=T, where T is wavearray duration
269  // param 2 - 0 - no whitening, 1 - single whitening, >1 - double whitening
270  // param 3 - boundary offset
271  // param 4 - noise sampling interval (window stride)
272  // the number of measurements is k=int((T-2*offset)/stride)
273  // if stride=0, then stride is set to dT
274  // return: noise array if param2>0, median if param2=0
275  virtual wavearray<double> white(double, int=0,double=0.,double=0.) const;
276 
277  // turn wavearray distribution into exponential using rank statistics
278  // input - time window around a sample to rank the sample
279  virtual void exponential(double);
280 
281  // get sample with index i from wavearray
282  inline DataType_t get(size_t i) { return data[i]; }
283  // get rms sample value averaged over the window t-dt : t+dt
284  inline DataType_t get(double t, double dt=0.);
285 
286  inline long uniform(){ return random(); }
287  inline long rand48(long k=1024){ return long(k*drand48()); }
288 
289  double getStatistics(double &mean, double &rms) const;
290 
291  virtual void resize(unsigned int);
292 
293  //: copy, add and subtruct wavearray array from *this
294  void cpf(const wavearray<DataType_t> &, int=0, int=0, int=0);
295  void add(const wavearray<DataType_t> &, int=0, int=0, int=0);
296  void sub(const wavearray<DataType_t> &, int=0, int=0, int=0);
297 
298  //: append to this *this
299  size_t append(const wavearray<DataType_t> &);
300  //: append to this *this
301  size_t append(DataType_t);
302 
303  // count number of pixels above x
304  size_t wavecount(double x, int n=0){
305  size_t N=0;
306  for(int i=n;i<size()-n;i++) if(data[i]>x) N++;
307  return N;
308  }
309 
310  //: cut data on shorter intervals and average
311  double Stack(const wavearray<DataType_t> &, int);
312  double Stack(const wavearray<DataType_t> &, int, int);
313  double Stack(const wavearray<DataType_t> &, double);
314 
315  // print wavearray parameters
316  void print(); // *MENU*
317  virtual void Browse(TBrowser *b) {print();}
318 
319  DataType_t *data; //! data array
320 
321 // private:
322 
323  size_t Size; // number of elements in the data array
324  double Rate; // data sampling rate
325  double Start; // start time
326  double Stop; // end time
327  double Edge; // buffer length in seconds in the beginning and the end
328  std::slice Slice; // the data slice structure
329 
330  TFFTRealComplex* fftw; //! pointer to direct fftw object
331  TFFTComplexReal* ifftw; //! pointer to inverse fftw object
332 
333  inline static int compare(const void *x, const void *y){
334  DataType_t a = *(*(DataType_t**)x) - *(*(DataType_t**)y);
335  if(a > 0) return 1;
336  if(a < 0) return -1;
337  return 0;
338  }
339 
340  ClassDef(wavearray,2)
341 };
342 
343 template<class DataType_t>
345 { return Slice.start() + (Slice.size()-1)*Slice.stride() + 1; }
346 
347 template<class DataType_t>
349 { return s.start() + (s.size()-1)*s.stride() + 1; }
350 
351 template<class DataType_t>
353 {
354  size_t N = a.Slice.size();
355  if(N>Slice.size()) N=Slice.size();
356  return Slice.start() + (N-1)*Slice.stride() + 1;
357 }
358 
359 template<class Tout, class Tin>
360 inline void waveAssign(wavearray<Tout> &aout, wavearray<Tin> &ain)
361 {
362  size_t N = ain.size();
363  aout.rate(ain.rate());
364  aout.start(ain.start());
365  aout.stop(ain.stop());
366  aout.Slice = std::slice(0,N,1);
367  if (N != aout.size()) aout.resize(N);
368  for (unsigned int i=0; i < N; i++) aout.data[i] = (Tout)ain.data[i];
369 }
370 
371 template<class DataType_t>
373 {
374  double phi = 2*3.141592653589793/size();
375  double www = sqrt(2./3.);
376  int nn = size();
377  for(int i=0; i<nn; i++) data[i] *= DataType_t(www*(1.-cos(i*phi)));
378 }
379 
380 template<class DataType_t>
381 inline DataType_t wavearray<DataType_t>::get(double t, double dT)
382 {
383 // dt>0 - average value^2 over the window 2dt around the time t
384  t = t-this->Start;
385  double dt = fabs(dT)+0.51/Rate;
386  int n = int((t-dt)*Rate);
387  if(n<0) n=0; if(n>=Size) n=Size-1;
388  int m = int((t+dt)*Rate);
389  if(m<0) m=0; if(m>=Size) m=Size-1;
390  if(int(t*Rate)<0 || int(t*Rate)>=Size) {
391  printf("wavearray<DataType_t>::get(double t): time out of range\n");
392  exit(1);
393  }
394  if(n>=m) return data[size_t(t*Rate)];
395  double sum = 0.;
396  for(int i=n; i<=m; i++) sum += data[i]*data[i];
397  return sqrt(sum/(m-n+1));
398 }
399 
400 #endif // WAVEARRAY_HH
401 
402 
403 
404 
405 
406 
407 
408 
409 
410 
411 
412 
wavearray< double > t(hp.size())
size_t append(const wavearray< DataType_t > &)
Definition: wavearray.cc:793
virtual DataType_t min() const
Definition: wavearray.cc:1368
virtual double stop() const
Definition: wavearray.hh:140
virtual wavearray< double > getLPRFilter(int, int=0, int=0)
Definition: wavearray.cc:1912
virtual void rate(double r)
Definition: wavearray.hh:141
long uniform()
Definition: wavearray.hh:286
size_t Size
data array
Definition: wavearray.hh:323
virtual void ReadShort(const char *)
Definition: wavearray.cc:440
wavearray< double > a(hp.size())
virtual void edge(double s)
Definition: wavearray.hh:143
int n
Definition: cwb_net.C:28
void print()
Definition: wavearray.cc:2226
cout<< endl;cout<< "ts size = "<< ts.size()<< " ts rate = "<< ts.rate()<< endl;tf.Forward(ts, wdm);int levels=tf.getLevel();cout<< "tf size = "<< tf.size()<< endl;double dF=tf.resolution();double dT=1./(2 *dF);cout<< "rate(hz) : "<< RATE<< "\ layers : "<< nLAYERS<< "\ dF(hz) : "<< dF<< "\ dT(ms) : "<< dT *1000.<< endl;int itime=TIME_PIXEL_INDEX;int ifreq=FREQ_PIXEL_INDEX;int index=(levels+1) *itime+ifreq;double time=itime *dT;double freq=(ifreq >0) ? ifreq *dF :dF/4;cout<< endl;cout<< "PIXEL TIME = "<< time<< " sec "<< endl;cout<< "PIXEL FREQ = "<< freq<< " Hz "<< endl;cout<< endl;wavearray< double > x
wavearray< DataType_t > & operator=(const wavearray< DataType_t > &)
Definition: wavearray.cc:110
double Rate
Definition: wavearray.hh:324
void add(const wavearray< DataType_t > &, int=0, int=0, int=0)
Definition: wavearray.cc:746
virtual void ReadBinary(const char *, int=0)
Definition: wavearray.cc:410
virtual void setSlice(const std::slice &s)
Definition: wavearray.hh:146
double Stop
Definition: wavearray.hh:326
TFFTRealComplex * fftw
Definition: wavearray.hh:330
virtual wavearray< DataType_t > & operator*=(wavearray< DataType_t > &)
Definition: wavearray.cc:276
virtual ~wavearray()
Definition: wavearray.cc:100
int m
Definition: cwb_net.C:28
virtual void start(double s)
Definition: wavearray.hh:137
virtual void Browse(TBrowser *b)
Definition: wavearray.hh:317
i drho i
double Edge
Definition: wavearray.hh:327
void waveAssign(wavearray< Tout > &aout, wavearray< Tin > &ain)
Definition: wavearray.hh:360
#define N
cout<< "SNR "<< xsnr<< endl;wavearray< double > f
Definition: ComputeSNR.C:75
virtual void waveSplit(DataType_t **pp, size_t l, size_t r, size_t m) const
Definition: wavearray.cc:1499
virtual double rms()
Definition: wavearray.cc:1206
virtual size_t size() const
Definition: wavearray.hh:145
virtual void DumpObject(const char *)
Definition: wavearray.cc:400
float phi
void sub(const wavearray< DataType_t > &, int=0, int=0, int=0)
Definition: wavearray.cc:772
virtual char * operator>>(char *)
Definition: wavearray.cc:2200
size_t wavecount(double x, int n=0)
Definition: wavearray.hh:304
size_t size() const
Definition: wslice.hh:89
virtual double rate() const
Definition: wavearray.hh:142
static int compare(const void *x, const void *y)
pointer to inverse fftw object
Definition: wavearray.hh:333
size_t start() const
Definition: wslice.hh:85
i() int(T_cor *100))
TFFTComplexReal * ifftw
pointer to direct fftw object
Definition: wavearray.hh:331
size_t stride() const
Definition: wslice.hh:93
void Resample(const wavearray< DataType_t > &, double, int=6)
Definition: wavearray.cc:640
virtual int getSampleRankE(size_t n, size_t l, size_t r) const
Definition: wavearray.cc:1399
printf("total live time: non-zero lags = %10.1f \, liveTot)
int l
void hann(void)
Definition: wavearray.hh:372
std::slice Slice
Definition: wavearray.hh:328
virtual double start() const
Definition: wavearray.hh:138
int k
virtual void resetFFTW()
Definition: wavearray.cc:977
virtual wavearray< DataType_t > & operator+=(wavearray< DataType_t > &)
Definition: wavearray.cc:191
long rand48(long k=1024)
Definition: wavearray.hh:287
virtual size_t limit() const
Definition: wavearray.hh:344
virtual double edge() const
Definition: wavearray.hh:144
double dt
virtual void DumpBinary(const char *, int=0)
Definition: wavearray.cc:353
virtual void FFTW(int=1)
Definition: wavearray.cc:896
regression r
Definition: Regression_H1.C:44
virtual std::slice getSlice() const
Definition: wavearray.hh:147
s s
Definition: cwb_net.C:155
virtual void SQRT()
Definition: wavearray.hh:201
double T
Definition: testWDM_4.C:11
virtual void lprFilter(wavearray< double > &)
Definition: wavearray.cc:1826
ifstream in
virtual double mean() const
Definition: wavearray.cc:1071
virtual void delay(double T)
Definition: wavearray.cc:596
virtual void DumpShort(const char *, int=0)
Definition: wavearray.cc:374
virtual void stop(double s)
Definition: wavearray.hh:139
virtual wavearray< DataType_t > & operator-=(wavearray< DataType_t > &)
Definition: wavearray.cc:226
double fabs(const Complex &x)
Definition: numpy.cc:55
virtual void spesla(double, double, double=0.)
Definition: wavearray.cc:1770
virtual void waveSort(DataType_t **pp, size_t l=0, size_t r=0) const
Definition: wavearray.cc:1421
void resample(const wavearray< DataType_t > &, double, int=6)
Definition: wavearray.cc:503
DataType_t rank(double=0.5) const
Definition: wavearray.cc:1737
virtual wavearray< DataType_t > & operator[](const std::slice &)
Definition: wavearray.cc:295
virtual void Dump(const char *, int=0)
Definition: wavearray.cc:319
virtual DataType_t max() const
Definition: wavearray.cc:1334
DataType_t get(size_t i)
Definition: wavearray.hh:282
virtual void exponential(double)
Definition: wavearray.cc:1680
DataType_t * data
Definition: wavearray.hh:319
double getStatistics(double &mean, double &rms) const
Definition: wavearray.cc:2128
virtual wavearray< double > white(double, int=0, double=0., double=0.) const
Definition: wavearray.cc:2025
double Stack(const wavearray< DataType_t > &, int)
Definition: wavearray.cc:991
double dT
Definition: testWDM_5.C:12
double Start
Definition: wavearray.hh:325
virtual void resize(unsigned int)
Definition: wavearray.cc:463
virtual double median(size_t=0, size_t=0) const
Definition: wavearray.cc:1576
wavearray< double > y
Definition: Test10.C:31
virtual void FFT(int=1)
Definition: wavearray.cc:832
virtual int getSampleRank(size_t n, size_t l, size_t r) const
Definition: wavearray.cc:1379
exit(0)
void cpf(const wavearray< DataType_t > &, int=0, int=0, int=0)
Definition: wavearray.cc:717