Logo coherent WaveBurst  
Library Reference Guide
Logo
wseries.cc
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 // $Id: wseries.cc,v 1.5 2005/07/01 02:25:58 klimenko Exp $
20 
21 #define WSeries_CC
22 #include <time.h>
23 #include <iostream>
24 #include <stdexcept>
25 #include "wseries.hh"
26 
27 #include "Haar.hh"
28 #include "Biorthogonal.hh"
29 #include "Daubechies.hh"
30 #include "Symlet.hh"
31 #include "Meyer.hh"
32 #include "WDM.hh"
33 
34 ClassImp(WSeries<double>)
35 
36 using namespace std;
37 
38 // constructors
39 
40 template<class DataType_t>
42 {
43  this->pWavelet = new WaveDWT<DataType_t>();
44  this->pWavelet->allocate(this->size(),this->data);
45  this->bpp = 1.;
46  this->wRate = 0.;
47  this->f_low = 0.;
48  this->f_high = 0.;
49  this->w_mode = 0;
50 }
51 
52 template<class DataType_t>
54 wavearray<DataType_t>()
55 {
56  this->pWavelet = NULL;
57  this->setWavelet(w);
58  this->bpp = 1.;
59  this->wRate = 0.;
60  this->f_low = 0.;
61  this->f_high = 0.;
62  this->w_mode = 0;
63 }
64 
65 template<class DataType_t>
67 wavearray<DataType_t>(value)
68 {
69  this->pWavelet = NULL;
70  this->setWavelet(w);
71  this->bpp = 1.;
72  this->wRate = value.rate();
73  this->f_low = 0.;
74  this->f_high = value.rate()/2.;
75  this->w_mode = 0;
76 }
77 
78 template<class DataType_t>
80 wavearray<DataType_t>(value)
81 {
82  this->pWavelet = NULL;
83  this->setWavelet(*(value.pWavelet));
84  this->bpp = value.getbpp();
85  this->wRate = value.wRate;
86  this->f_low = value.getlow();
87  this->f_high = value.gethigh();
88  this->w_mode = value.w_mode;
89 }
90 
91 // destructor
92 
93 template<class DataType_t>
95 {
96  if(this->pWavelet) this->pWavelet->release();
97  if(this->pWavelet) delete this->pWavelet;
98 }
99 
100 // metadata methods
101 
102 template<class DataType_t>
104 {
105  int maxlevel = 0;
106 
107  if(pWavelet->allocate())
108  maxlevel = pWavelet->getMaxLevel();
109 
110  return maxlevel;
111 }
112 
113 // Accessors
114 
115 //: Get central frequency of a layer
116 template<class DataType_t>
118 // Get central frequency of a layer
119 // l - layer number.
120 // TF map binary dyadic WDM
121 // zero layer Fc dF/2 Fo 0
122 // non-zero Fc +n*dF Fn +n*dF
123  int I = maxLayer()+1;
124  double df = this->rate()/I/4.;
125  if(I==1) return this->rate()/2.;
126  if(pWavelet->m_WaveType==WDMT) return i*this->rate()/(I-1)/2.;
127  if(pWavelet->BinaryTree()) return 2*df*(i+0.5);
128  df = this->rate()/(1<<I);
129  double f = df;
130  while(i--){ f += 2*df; df*=2; }
131  return f;
132 }
133 
134 template<class DataType_t>
136 // multiply this and w layaer by layer
137 // requires the same number of layer samples in this and w
138  int I = this->maxLayer()+1; // layers in this
139  int J = w.maxLayer(); // layers-1 in w
140  int i = 0;
141  int j = 0;
142  double df = (w.frequency(1)-w.frequency(0))/2.;
143  double f,F;
145  bool error = false;
146  w.getLayer(x,j); // get x array
147  while(i<I) {
148  f = w.frequency(j)+df;
149  F = this->frequency(i);
150  if(f<F){
151  if(j==J) {error = true; break;}
152  w.getLayer(x,++j); // update x array
153  }
154  this->getLayer(y,i); // extract layer from this
155  if(x.size()!=y.size()) {
156  cout<<"wseries::mul(): "<<x.size()<<" "<<y.size()<<endl;
157  error=true; break; // error!
158  }
159  y *= x;
160  this->putLayer(y,i++); // replace layer in this
161  }
162  if(error) {cout<<"wseries::mul() error!\n"; exit(1);}
163  return;
164 }
165 
166 template<class DataType_t>
168 //: Get layer index for input frequency
169 // f - frequency Hz
170 // TF map binary dyadic WDM
171 // zero layer Fc dF/2 Fo 0
172 // non-zero Fc +n*dF Fn +n*dF
173 
174  int I = int(maxLayer()+1);
175  if(I<2 || f>=this->rate()/2.) return I;
176  double df = this->rate()/(I-1)/2.;
177  if(pWavelet->m_WaveType==WDMT) return int((f+df/2.)/df);
178  df = this->rate()/I/2.;
179  if(pWavelet->BinaryTree()) return int(f/df);
180  df = this->rate()/(1<<I);
181  double ff = df;
182  int i = 0;
183  while(ff<f){ ff += 2*df; df*=2; i++; }
184  return i;
185 
186 }
187 
188 // access to data in wavelet domain
189 // get wavelet coefficients from a layer with specified frequency index
190 // if index>0 - get coefficients from the layer = |index| and 0 phase
191 // if index<0 - get coefficients from the layer = |index| and 90 phase
192 template<class DataType_t>
194 {
195  int n = int(fabs(index)+0.001);
196  if(n > maxLayer()) index = maxLayer();
197  slice s = pWavelet->getSlice(index);
198 
199  if(this->limit(s) <= this->size()){
200  value.resize(s.size());
201  value.rate(this->wrate());
202  value.start(this->start());
203  value.stop(this->start()+s.size()/value.rate());
204  value.edge(this->edge());
205  value.Slice = slice(0,s.size(),1);
206  value << (*this)[s]; // get slice of wavelet valarray
207  return n;
208  }
209  else{
210  cout<<"WSeries::getLayer(): data length mismatch: "<<this->limit(s)<<" "<<this->size()<<"\n";
211  return -1;
212  }
213 }
214 
215 // access to data in wavelet domain
216 // put wavelet coefficients into layer with specified frequency index
217 // if index<0 - put coefficients into layer = |index|
218 template<class DataType_t>
220 {
221  slice s = this->pWavelet->getSlice(index);
222 
223  if( (s.size() < value.size()) || (this->limit(s) > this->size()) ){
224  cout<<"WSeries::putLayer(): invalid array size.\n";
225  }
226  else{
227  (*this)[s] << value; // put slice into wavelet valarray
228  }
229 }
230 
231 // mutators
232 
233 template<class DataType_t>
235 {
236  if(pWavelet){ // delete old wavelet object
237  pWavelet->release();
238  delete pWavelet;
239  }
240 
242  pWavelet->allocate(this->size(), this->data);
243 }
244 
245 template<class DataType_t>
247 {
248  if(pWavelet->allocate()){
249  pWavelet->nSTS = pWavelet->nWWS;
250  pWavelet->t2w(k);
251  if(pWavelet->pWWS != this->data || pWavelet->nWWS != this->Size){
252  this->data = pWavelet->pWWS;
253  this->Size = pWavelet->nWWS;
254  this->Slice = std::slice(0,pWavelet->nWWS,1);
255  }
256  std::slice s = this->getSlice(0);
257  this->wrate(s.size()/(this->stop()-this->start()));
258  }
259  else{
260  throw std::invalid_argument
261  ("WSeries::Forward(): data is not allocated");
262  }
263 }
264 
265 template<class DataType_t>
267 {
268  wavearray<DataType_t>* p = this;
269  if(pWavelet->allocate()) pWavelet->release();
270  *p = x;
271  this->wrate(x.rate());
272  f_high = x.rate()/2.;
273  pWavelet->allocate(this->size(), this->data);
274  pWavelet->reset();
275  Forward(k);
276 }
277 
278 template<class DataType_t>
280 {
281  wavearray<DataType_t>* p = this;
282  if(pWavelet->allocate()) pWavelet->release();
283  *p = x;
284  this->wrate(x.rate());
285  f_high = x.rate()/2.;
286  setWavelet(w);
287  Forward(k);
288 }
289 
290 template<class DataType_t>
292 {
293  if(pWavelet->allocate()){
294  pWavelet->w2t(k);
295  if(pWavelet->pWWS != this->data || pWavelet->nWWS != this->Size) {
296  this->data = pWavelet->pWWS;
297  this->Size = pWavelet->nWWS;
298  this->Slice = std::slice(0,pWavelet->nWWS,1);
299  this->wrate(this->rate());
300  }
301  else {
302  std::slice s = this->getSlice(0);
303  this->wrate(s.size()/(this->stop()-this->start()));
304  }
305  }
306  else{
307  throw std::invalid_argument
308  ("WSeries::Inverse(): data is not allocated");
309  }
310 }
311 
312 template<class DataType_t>
314 {
315 // bandpass data and store in TF domain, do not use for WDM
316 // ts - input time series
317 // flow - low frequence boundary
318 // fhigh - high frequency boundary
319 // n - decomposition level
320  if(!this->pWavelet) {
321  cout<<"WSeries::bandpass ERROR: no transformation is specified"<<endl;
322  exit(1);
323  }
324 
325  this->Forward(ts,n);
326 
327  double freq;
329  size_t I = this->maxLayer()+1;
330  for(size_t i=0; i<I; i++) {
331  freq = this->frequency(i);
332  if(freq<flow || freq>fhigh) {
333  this->getLayer(wa,i); wa = 0;
334  this->putLayer(wa,i);
335  }
336  }
337 }
338 
339 template<class DataType_t>
340 void WSeries<DataType_t>::bandpass(double f1, double f2, double a)
341 {
342 // set wseries coefficients to a in layers between
343 // f1 - low frequence boundary
344 // f2 - high frequency boundary
345 // f1>0, f2>0 - zzzzzz..........zzzzzz band pass
346 // f1<0, f2<0 - ......zzzzzzzzzz...... band cut
347 // f1<0, f2>0 - ......zzzzzzzzzzzzzzzz low pass
348 // f1>0, f2<0 - zzzzzzzzzzzzzzzz...... high pass
349 // a - value
350  int i;
351  double dF = this->frequency(1)-this->frequency(0); // frequency resolution
352  double fl = fabs(f1)>0. ? fabs(f1) : this->getlow();
353  double fh = fabs(f2)>0. ? fabs(f2) : this->gethigh();
354  size_t n = this->pWavelet->m_WaveType==WDMT ? size_t((fl+dF/2.)/dF+0.1) : size_t(fl/dF+0.1);
355  size_t m = this->pWavelet->m_WaveType==WDMT ? size_t((fh+dF/2.)/dF+0.1)-1 : size_t(fh/dF+0.1)-1;
356  size_t M = this->maxLayer()+1;
358 
359  if(n>m) return;
360 
361  for(i=0; i<int(M); i++) { // ......f1......f2......
362 
363  if((f1>=0 && i>n) && (f2>=0 && i<=m)) continue; // zzzzzz..........zzzzzz band pass
364  if((f1<0 && i<n) || (f2<0 && i>m)) continue; // ......zzzzzzzzzz...... band cut
365  if((f1<0 && f2>=0 && i<n)) continue; // ......zzzzzzzzzzzzzzzz low pass
366  if((f1>=0 && f2<0 && i>=m)) continue; // zzzzzzzzzzzzzzzz...... high pass
367 
368  this->getLayer(w,i+0.01); w=a; this->putLayer(w,i+0.01);
369  this->getLayer(w,-i-0.01); w=a; this->putLayer(w,-i-0.01);
370  }
371  return;
372 }
373 
374 
375 template<class DataType_t>
376 double WSeries<DataType_t>::wdmPacket(int patt, char c, TH1F* hist)
377 {
378 // wdmPacket: converts this to WDM packet series described by pattern
379 // c = 'e' / 'E' - returns pattern / packet energy
380 // c = 'l' / 'L' - returns pattern / packet likelihood
381 // c = 'a' / 'A' - returns packet amplitudes
382 // patt = pattern
383 // patterns: "/" - chirp, "\" - ringdown, "|" - delta, "*" - pixel
384 // param: pattern = 0 - "*" single pixel standard search
385 // param: pattern = 1 - "3|" packet
386 // param: pattern = 2 - "3-" packet
387 // param: pattern = 3 - "3/" packet - chirp
388 // param: pattern = 4 - "3\" packet - ringdown
389 // param: pattern = 5 - "5/" packet - chirp
390 // param: pattern = 6 - "5\" packet - ringdown
391 // param: pattern = 7 - "3+" packet
392 // param: pattern = 8 - "3x" cross packet
393 // param: pattern = 9 - "9p" 9-pixel square packet
394 // pattern = else - "*" single pixel standard search
395 // mean of the packet noise distribution is mu=2*K+1, where K is
396 // the effective number of pixels in the packet (K may not be integer)
397 //
398  int n,m;
399  double aa,ee,EE,uu,UU,dd,DD,em,ss,cc,nn;
400  double shape,mean,alp;
401  int pattern = abs(patt);
402  int J = this->size()/2; // energy map size
403  if(pattern==0) return 1.;
404  if(!this->isWDM() || (2*J)/this->xsize()==1) exit(0);
405 
406  WSeries<DataType_t> in = *this;
407  int M = in.maxLayer()+1; // number of layers
408  int jb = int(in.Edge*in.wrate()/4.)*M;
409  if(jb<4*M) jb = 4*M;
410  int je = J-jb;
411  int p[] = {0,0,0,0,0,0,0,0,0};
412  double df = in.resolution(0);
413  int mL = int(in.getlow()/df+0.1);
414  int mH = int(in.gethigh()/df+0.1);
415 
416  if(c!='a'||c!='A') this->resize(J); // convert to energy array
417 
418  if(pattern==1) { // "3|" vertical line
419  p[1]=1; p[2]=-1; // 'p': a=2.8,b=0.90
420  shape = mean = 3.; // 'e': a=3.0,b=1.00
421  mL+=1; mH-=1;
422  }
423  else if(pattern==2) { // "3-" horizontal line
424  p[1]=M; p[2]=-M; // 'p': a=2.0,b=1.41
425  shape = mean = 3.; // 'e': a=2.2,b=1.38
426  }
427  else if(pattern==3) { // "3/" chirp packet
428  p[1]=M+1; p[2]=-M-1; // 'p': a=2.7,b=0.91
429  shape = mean = 3.; // 'e': a=3.0,b=1.00
430  mL+=1; mH-=1;
431  }
432  else if(pattern==4) { // "3\" chirp packet
433  p[1]=-M+1; p[2]=M-1; // 'p': a=2.7,b=0.91
434  shape = mean = 3.; // 'e': a=3.0,b=1.00
435  mL+=1; mH-=1;
436  }
437  else if(pattern==5) { // "5/"-pattern=5
438  p[1]=M+1; p[2]=-M-1; p[3]=2*M+2; p[4]=-2*M-2; // 'e': a=5.0,b=1.00
439  shape = mean = 5.; //shape=4.8; mean=4.8*0.95; // 'p': a=4.8,b=0.95
440  mL+=2; mH-=2;
441  }
442  else if(pattern==6) { // "5\"-pattern=-5
443  p[1]=-M+1; p[2]=M-1; p[3]=-2*M+2; p[4]=2*M-2; // 'e': a=5.0,b=1.00
444  shape = mean = 5.; // 'p': a=4.8,b=0.95
445  mL+=2; mH-=2;
446  }
447  else if(pattern==7) { // "3+" packet
448  p[1]=1; p[2]=-1; p[3]=M; p[4]=-M; // 'e': a=3.9,b=1.28
449  shape = mean = 5.; // 'p': a=3.6,b=1.28
450  mL+=1; mH-=1;
451  }
452  else if(pattern==8) { // "3x" cross packet
453  p[1]=M+1; p[2]=-M+1; p[3]= M-1; p[4]=-M-1; // 'p': a=2.8,b=0.90
454  shape = mean = 5.; // 'e': a=3.0,b=1.00
455  mL+=1; mH-=1;
456  }
457  else if(pattern==9) { // "9*" 9-pixel square
458  p[1]=1; p[2]=-1; p[3]=M; p[4]=-M; // 'p': a=5.6,b=1.57
459  p[5]=M+1; p[6]=M-1; p[7]=-M+1; p[8]=-M-1; // 'e': a=5.8,b=1.55
460  shape = mean = 9.;
461  mL+=1; mH-=1;
462  } else { shape = mean = 1.; }
463 
464  DataType_t *q; // pointers to 00 phase
465  DataType_t *Q; // pointers to 90 phase
466 
467  for(int j=jb; j<je; j++) {
468  m = j%M;
469  if(m<mL || m>mH) {this->data[j]=0.; continue;}
470  q = in.data+j; Q = q+J;
471  ss = q[p[1]]*Q[p[1]]+q[p[2]]*Q[p[2]]+q[p[3]]*Q[p[3]]+q[p[4]]*Q[p[4]]
472  + q[p[5]]*Q[p[5]]+q[p[6]]*Q[p[6]]+q[p[7]]*Q[p[7]]+q[p[8]]*Q[p[8]];
473  ee = q[p[1]]*q[p[1]]+q[p[2]]*q[p[2]]+q[p[3]]*q[p[3]]+q[p[4]]*q[p[4]]
474  + q[p[5]]*q[p[5]]+q[p[6]]*q[p[6]]+q[p[7]]*q[p[7]]+q[p[8]]*q[p[8]];
475  EE = Q[p[1]]*Q[p[1]]+Q[p[2]]*Q[p[2]]+Q[p[3]]*Q[p[3]]+Q[p[4]]*Q[p[4]]
476  + Q[p[5]]*Q[p[5]]+Q[p[6]]*Q[p[6]]+Q[p[7]]*Q[p[7]]+Q[p[8]]*Q[p[8]];
477  ss+= q[p[0]]*Q[p[0]]*(mean-8);
478  ee+= q[p[0]]*q[p[0]]*(mean-8);
479  EE+= Q[p[0]]*Q[p[0]]*(mean-8);
480 
481  cc = ee-EE; ss*=2;
482  nn = sqrt(cc*cc+ss*ss);
483  if(ee+EE<nn) nn=ee+EE;
484  aa = sqrt((ee+EE+nn)/2) + sqrt((ee+EE-nn)/2);
485  em = (c=='e'||c=='l'||mean==1.) ? (ee+EE)/2. : aa*aa/4;
486  alp = shape-log(shape)/3;
487  if(c=='l'||c=='L') {
488  em*=shape/mean;
489  if(em<alp) {em=0; continue;}
490  em-= alp*(1+log(em/alp));
491  }
492  if(c=='a'||c=='A') {
493  cc/=nn; ss/=nn;
494  nn = sqrt((1+cc)*(1+cc)+ss*ss)/2;
495  this->data[j]=aa*cc/nn; this->data[j+J]=aa*ss/nn/2;
496  } else {this->data[j] = em;}
497  if(hist && em>0.01) hist->Fill(sqrt(em));
498  }
499  return shape;
500 }
501 
502 
503 template<class DataType_t>
505  double dT, int N, int pattern, TH1F* hist)
506 {
507 // maxEnergy: put maximum energy of delayed samples in this
508 // param: wavearray - input time series
509 // param: wavelet - wavelet used for the transformation
510 // param: double - range of time delays
511 // param: int - downsample factor to obtain coarse TD steps
512 // param: int - clustering pattern
515  int K = int(ts.rate()*fabs(dT)); // half number of time delays
516  double shape = 1.;
517 
518  if(w.m_WaveType != WDMT) {
519  cout<<"wseries::maxEnergy(): illegal wavelet\n";
520  exit(0);
521  }
522 
523  this->Forward(ts,w,0);
524 
525  if(abs(pattern)) {
526  *this = 0.;
527  tmp.Forward(ts,w);
528  tmp.setlow(this->getlow());
529  tmp.sethigh(this->gethigh());
530  shape=tmp.wdmPacket(pattern,'E');
531  this->max(tmp);
532  for(int k=N; k<=K; k+=N) {
533  xx.cpf(ts,ts.size()-k,k);
534  tmp.Forward(xx,w);
535  tmp.setlow(this->getlow());
536  tmp.sethigh(this->gethigh());
537  tmp.wdmPacket(pattern,'E');
538  this->max(tmp);
539  xx.cpf(ts,ts.size()-k,0,k);
540  tmp.Forward(xx,w);
541  tmp.setlow(this->getlow());
542  tmp.sethigh(this->gethigh());
543  tmp.wdmPacket(pattern,'E');
544  this->max(tmp);
545  }
546  } else { // extract single pixels
547  for(int k=N; k<=K; k+=N) {
548  xx.cpf(ts,ts.size()-k,k);
549  tmp.Forward(xx,w,0);
550  this->max(tmp);
551  xx.cpf(ts,ts.size()-k,0,k);
552  tmp.Forward(xx,w,0);
553  this->max(tmp);
554  }
555  }
556 
557  int M = tmp.maxLayer()+1;
558  this->getLayer(xx,0.1); xx=0;
559  this->putLayer(xx,0.1);
560  this->getLayer(xx,M-1); xx=0;
561  this->putLayer(xx,M-1);
562 
563  int m = abs(pattern);
564  if(m==5 || m==6 || m==9) {
565  this->getLayer(xx,1); xx=0;
566  this->putLayer(xx,1);
567  this->getLayer(xx,M-2); xx=0;
568  this->putLayer(xx,M-2);
569  }
570 
571  if(!pattern) return 1.;
572  return Gamma2Gauss(hist);
573 }
574 
575 template<class DataType_t>
577 {
578 // finds parameters shape and scale for noise Gamma statistic
579 // convert from Gamma to Gaussian statistic
580 
581  WSeries<DataType_t> tmp = *(this);
582  int M = tmp.maxLayer()+1;
583  int nL = size_t(tmp.Edge*tmp.wrate()*M);
584  int nn = tmp.size();
585  int nR = nn-nL-1; // right boundary
586  double fff = (nR-nL)*tmp.wavecount(0.001)/double(nn); // zero fraction
587  double med = tmp.waveSplit(nL,nR,nR-int(0.5*fff)); // distribution median
588  double amp, aaa, bbb, rms, alp;
589 
590  aaa = bbb = 0.; nn = 0;
591  for(int i=nL; i<nR; i++) { // get Gamma shape
592  amp = (double)this->data[i];
593  if(amp>0.01 && amp<20*med) {
594  aaa += amp; bbb += log(amp); nn++;
595  }
596  }
597  alp = log(aaa/nn)-bbb/nn;
598  alp = (3-alp+sqrt((alp-3)*(alp-3)+24*alp))/12./alp;
599  double avr = med*(3*alp+0.2)/(3*alp-0.8); // get Gamma mean
600  //cout<<"debug0: "<<fff<<" "<<avr<<" "<<med<<" "<<alp<<endl;
601 
602  double ALP = med*alp/avr;
603  for(int i=0; i<this->size(); i++) {
604  amp = (double)this->data[i]*alp/avr;
605  if(amp<ALP) {this->data[i]=0.; continue;}
606  this->data[i] = amp-ALP*(1+log(amp/ALP));
607  //if(hist && i>nL && i<nR) hist->Fill(this->data[i]);
608  }
609  tmp = *(this);
610  fff = tmp.wavecount(1.e-5,nL); // number of events excluding 0
611  rms = 1./tmp.waveSplit(nL,nR,nR-int(0.3173*fff)); // 1 over distribution rms
612  //cout<<"debug1: "<<fff<<" "<<avr<<" "<<rms<<" "<<aaa<<endl;
613  for(int i=0; i<this->size(); i++) {
614  this->data[i] *= rms;
615  if(hist && i>nL && i<nR) hist->Fill(sqrt(this->data[i]));
616  }
617  return ALP;
618 }
619 
620 
621 template<class DataType_t>
623 {
624 // create a wavescan object
625 // produce multi-resolution TF series of input time series x
626 // pws - array of pointers to input time-frequency series
627 // N - number of resolutions
628 // hist - diagnostic histogram
629 
630  std::vector<int> vM; // vector to store number of layers
631  std::vector<int> vJ; // vector to store TF map size
632  std::vector<double> vR; // vector to store number of layers
633  std::vector<double> vF; // vector to store resolutions
634  int mBand, mRate, level;
635  int nn,j,J;
636  double time, freq, a,A,ee,EE,ss,cc,gg,b,B;
637  double mean = 2.*N-1; // Gamma distribution mean
638  double shape = N-log(N)/N; // Gamma distribution shape parameter
639 
640  mBand = 0; mRate = 0;
641  for(int n=0; n<N; n++) { // get all TF data
642  vF.push_back(pws[n]->resolution()); // save frequency resolution
643  vR.push_back(pws[n]->wrate()); // save frequency resolution
644  vM.push_back(pws[n]->maxLayer()+1);
645  vJ.push_back(pws[n]->size()/2);
646  if(vM[n]>mBand) {mBand = vM[n]; nn=n;}
647  if(pws[n]->wrate()>mRate) mRate = pws[n]->wrate();
648  }
649 
650 // set super TF map
651 
652  time = pws[nn]->size()/pws[nn]->wrate()/2; // number of ticks
653  J = mRate*int(time+0.1);
654  cout<<"debug1: "<<mBand<<" "<<mRate<<" "<<J<<" "<<pws[nn]->size()<<endl;
655  level = 0;
656  *this = *pws[nn];
657  this->resize(J);
658  this->setLevel(mBand-1);
659  this->wrate(mRate);
660  //this->rate(mRate*(mBand-1));
661  this->pWavelet->nWWS = J;
662  this->pWavelet->nSTS = (J/mBand)*(mBand-1);
663 
664  int nL = int(this->Edge*mRate*mBand); // left boundary
665  int nR = this->size()-nL-1; // right boundary
666 
667  for(int i=0; i<this->size(); i++) { // loop over super-TF-map
668  time = double(i/mBand)/mRate; // discrete time in seconds
669  freq = (i%mBand)*vF[nn]; // discrete frequency
670  ss=ee=EE=0.;
671  for(int n=1; n<N; n++) { // loop over TF-maps
672  j = int(time*vR[n-1]+0.1)*vM[n-1]; // pixel tick index in TF map
673  j+= int(freq/vF[n-1]+0.1); // add pixel frequency index
674  a = pws[n]->data[j]; // 00 phase amplitude
675  A = pws[n]->data[j+vJ[n-1]]; // 90 phase amplitude
676  j = int(time*vR[n]+0.1)*vM[n]; // pixel tick index in TF map
677  j+= int(freq/vF[n]+0.1); // add pixel frequency index
678  b = pws[n]->data[j]; // 00 phase amplitude
679  B = pws[n]->data[j+vJ[n]]; // 90 phase amplitude
680  ss = 2*(a*A+b*B);
681  ee = 2*(a*a+b*b);
682  EE = 2*(a*a+b*b);
683 EE+=A*A;
684  cc = ee-EE;
685  gg = sqrt(cc*cc+4*ss*ss);
686  a = sqrt((ee+EE+gg)/2);
687  A = sqrt((ee+EE-gg)/2);
688  }
689 
690 
691  this->data[i] = (a+A)*(a+A)/mean/2.;
692  if(hist && i>nL && i<nR) hist->Fill(this->data[i]);
693  }
694  //this->Gamma2Gauss(shape,hist);
695  return;
696 }
697 
698 
699 //: operators =
700 
701 template<class DataType_t>
703 {
704  wavearray<DataType_t>* p = this;
705  if( pWavelet->allocate() ) pWavelet->release();
706  if(p->size() != a.size()) pWavelet->reset();
707  *p = a;
708  this->rate(a.rate());
709  this->wrate(0.);
710  f_high = a.rate()/2.;
711  pWavelet->allocate(this->size(), this->data);
712  return *this;
713 }
714 
715 template<class DataType_t>
717 {
718  const wavearray<DataType_t>* p = &a;
719  wavearray<DataType_t>* q = this;
720  *q = *p;
721  setWavelet(*(a.pWavelet));
722  bpp = a.getbpp();
723  wRate = a.wrate();
724  f_low = a.getlow();
725  f_high = a.gethigh();
726  w_mode = a.w_mode;
727  return *this;
728 }
729 
730 template<class DataType_t>
732 {
733  this->Slice = s;
734  if(this->limit() > this->size()){
735  cout << "WSeries::operator[]: Illegal argument: "<<this->limit()<<" "<<this->size()<<"\n";
736  this->Slice = std::slice(0,this->size(),1);
737  }
738  return *this;
739 }
740 
741 template<class DataType_t>
743 { this->wavearray<DataType_t>::operator=(a); return *this; }
744 
745 template<class DataType_t>
747 { this->wavearray<DataType_t>::operator*=(a); return *this; }
748 
749 template<class DataType_t>
751 { this->wavearray<DataType_t>::operator-=(a); return *this; }
752 
753 template<class DataType_t>
755 { this->wavearray<DataType_t>::operator+=(a); return *this; }
756 
757 //template<class DataType_t>
758 //WSeries<DataType_t>& WSeries<DataType_t>::
759 //operator*=(wavearray<DataType_t> &a)
760 //{ this->wavearray<DataType_t>::operator*=(a); return *this; }
761 
762 template<class DataType_t>
764 { this->wavearray<DataType_t>::operator-=(a); return *this; }
765 
766 template<class DataType_t>
768 { this->wavearray<DataType_t>::operator+=(a); return *this; }
769 
770 template<class DataType_t>
772 {
773  size_t i;
777  size_t max_layer = (maxLayer() > a.maxLayer()) ? a.maxLayer() : maxLayer();
778 
779  if(pWavelet->m_TreeType != a.pWavelet->m_TreeType){
780  cout<<"WSeries::operator* : wavelet tree type mismatch."<<endl;
781  return *this;
782  }
783 
784  if(this->size()==a.size()) {
786  return *this;
787  }
788 
789  for(i=0; i<= max_layer; i++)
790  (*p)[pWavelet->getSlice(i)] *= (*pa)[a.pWavelet->getSlice(i)];
791 
792  return *this;
793 }
794 
795 template<class DataType_t>
797 {
798  size_t i;
801  size_t max_layer = (maxLayer() > a.maxLayer()) ? a.maxLayer() : maxLayer();
802 
803  if(pWavelet->m_TreeType != a.pWavelet->m_TreeType){
804  cout<<"WSeries::operator+ : wavelet tree type mismatch."<<endl;
805  return *this;
806  }
807 
808  if(this->size()==a.size()) {
810  return *this;
811  }
812 
813  for(i=0; i<= max_layer; i++)
814  (*p)[pWavelet->getSlice(i)] += (*pa)[a.pWavelet->getSlice(i)];
815 
816  return *this;
817 }
818 
819 template<class DataType_t>
821 {
822  size_t i;
825  size_t max_layer = (maxLayer() > a.maxLayer()) ? a.maxLayer() : maxLayer();
826 
827  if(pWavelet->m_TreeType != a.pWavelet->m_TreeType){
828  cout<<"WSeries::operator- : wavelet tree type mismatch."<<endl;
829  return *this;
830  }
831 
832  if(this->size()==a.size()) {
834  return *this;
835  }
836 
837  for(i=0; i<= max_layer; i++)
838  (*p)[pWavelet->getSlice(i)] -= (*pa)[a.pWavelet->getSlice(i)];
839 
840  return *this;
841 }
842 
843 template<class DataType_t>
845 {
846  size_t i;
848  size_t max_layer = maxLayer()+1;
849 
850  if(max_layer == a.size()) {
851  for(i=0; i< max_layer; i++) {
852  (*p)[pWavelet->getSlice(i)] *= a.data[i];
853  }
854  }
855  else if(this->size()==a.size()) {
857  return *this;
858  }
859  else cout<<"WSeries::operator* - no operation is performed"<<endl;
860 
861  return *this;
862 }
863 
864 
865 //: Dumps data array to file *fname in ASCII format.
866 template<class DataType_t>
867 void WSeries<DataType_t>::Dump(const char *fname, int app)
868 {
870  int i,j;
871  int n = this->size();
872  int m = this->maxLayer()+1;
873  char mode[3] = "w";
874  if (app == 1) strcpy (mode, "a");
875 
876  FILE *fp;
877 
878  if ( (fp = fopen(fname, mode)) == NULL ) {
879  cout << " Dump() error: cannot open file " << fname <<". \n";
880  return;
881  };
882 
883  if(app == 0) {
884  fprintf( fp,"# start time: -start %lf \n", this->Start );
885  fprintf( fp,"# sampling rate: -rate %lf \n", this->Rate );
886  fprintf( fp,"# number of samples: -size %d \n", (int)this->Size );
887  fprintf( fp,"# number of layers: -n %d \n", m );
888  }
889 
890  for (i = 0; i < m; i++) {
891  this->getLayer(a,i);
892  n = (int)a.size();
893  for(j = 0; j < n; j++) fprintf( fp,"%e ", (float)a.data[j]);
894  fprintf( fp,"\n");
895  }
896  fclose(fp);
897 }
898 
899 
900 template<class DataType_t>
901 void WSeries<DataType_t>::resize(unsigned int n)
902 {
903  wavearray<DataType_t>* p = this;
904  if( pWavelet->allocate() ) pWavelet->release();
905  p->wavearray<DataType_t>::resize(n);
906  pWavelet->allocate(this->size(), this->data);
907  pWavelet->reset();
908  bpp = 1.;
909  f_low = 0.;
910  wRate = this->rate();
911  f_high = this->rate()/2.;
912 }
913 
914 template<class DataType_t>
915 void WSeries<DataType_t>::resample(double f, int nF)
916 {
917  wavearray<DataType_t>* p = this;
918  if( pWavelet->allocate() ) pWavelet->release();
919  p->wavearray<DataType_t>::resample(f,nF);
920  pWavelet->allocate(this->size(), this->data);
921  pWavelet->reset();
922  bpp = 1.;
923  f_low = 0.;
924  wRate = p->wavearray<DataType_t>::rate();
925  f_high = p->wavearray<DataType_t>::rate()/2.;
926 }
927 
928 template<class DataType_t>
929 double WSeries<DataType_t>::coincidence(WSeries<DataType_t>& a, int t, int f, double threshold)
930 {
931 #if !defined (__SUNPRO_CC)
932  register int i;
933  register int j;
934  register int u;
935  register int v;
936  register float* q = NULL;
937  register float* p = NULL;
938 
939  int is, ie, js, je;
940 
943 
944  float energy;
945 
946  if(!pWavelet->BinaryTree()) return 1.;
947 
948  int ni = maxLayer()+1;
949  int nj = this->size()/ni;
950  int n = ni-1;
951  int m = nj-1;
952 
953  bool CROSS = t<0 || f<0;
954 
955  t = abs(t);
956  f = abs(f);
957 
958  float A[ni][nj];
959  float B[ni][nj];
960 
961  for(i=0; i<=n; i++){
962  p = A[i];
963  q = B[i];
964  a.getLayer(x,i);
965  getLayer(y,i);
966 
967  for(j=0; j<=m; j++){
968  p[j] = (float)x.data[j];
969  q[j] = (float)y.data[j];
970  }
971  }
972 
973  for(i=0; i<=n; i++){
974  p = A[i];
975  q = B[i];
976  a.getLayer(x,i);
977  getLayer(y,i);
978 
979  for(j=0; j<=m; j++){
980 
981  if(p[j]==0. && q[j]==0.) continue;
982 
983  is = i-f<0 ? 0 : i-f;
984  js = j-t<0 ? 0 : j-t;
985  ie = i+f>n ? n : i+f;
986  je = j+t>m ? m : j+t;
987 
988  energy = 0.;
989  if(x.data[j]!=0.) {
990  for(u=is; u<=ie; u++)
991  for(v=js; v<=je; v++){
992  if(CROSS && !(i==u || j==v)) continue;
993  if(B[u][v]!=0.) energy += log(fabs(B[u][v]));
994  }
995  if(energy < threshold) x.data[j]=0;
996  }
997 
998  energy = 0.;
999  if(y.data[j]!=0.) {
1000  for(u=is; u<=ie; u++)
1001  for(v=js; v<=je; v++){
1002  if(CROSS && !(i==u || j==v)) continue;
1003  if(A[u][v]!=0.) energy += log(fabs(A[u][v]));
1004  }
1005  if(energy < threshold) y.data[j]=0;
1006  }
1007 
1008  if(y.data[j]==0. && x.data[j]!=0.) y.data[j]=DataType_t(a.size());
1009 
1010  }
1011 
1012  putLayer(y,i);
1013 
1014  }
1015 #endif
1016  return 0.;
1017 }
1018 
1019 template<class DataType_t>
1021 {
1022  size_t i,k,m;
1023  size_t event = 0;
1024  size_t step;
1025  size_t N = a.size();
1026  int n;
1027 
1028  double E,S;
1029  bool pass;
1030 
1031  slice x,y;
1032  DataType_t* p = NULL;
1033  DataType_t* q = NULL;
1034  DataType_t* P = NULL;
1035  DataType_t* Q = NULL;
1036 
1037  if(pWavelet->m_TreeType != a.pWavelet->m_TreeType){
1038  cout<<"WSeries::operator- : wavelet tree type mismatch."<<endl;
1039  return 0.;
1040  }
1041 
1042  size_t max_layer = (maxLayer() > a.maxLayer()) ? a.maxLayer() : maxLayer();
1043 
1044  for(k=0; k<= max_layer; k++){
1045 
1046  x = getSlice(k);
1047  y = a.getSlice(k);
1048 
1049  if(x.size() != y.size()) continue;
1050  if(x.stride() != y.stride()) continue;
1051  if(x.start() != y.start()) continue;
1052 
1053  step = x.stride();
1054  n = int(w*a.rate()/2./step); // 2*(n+1) - coincidence window in pixels
1055  if(n < 0) n = 0; // not negative n
1056  if(!n && w>=0.) n++; // min 0 vs min 3 pixels
1057  S = log(float(n)); // threshold correction
1058  S = So + 2.*S/3.; // threshold
1059 // S = So + 0.5*log(2*n+1.); // threshold
1060 // S = So + S*S/(S+1); // threshold
1061  P = a.data+x.start();
1062  Q = a.data+x.start()+step*(x.size()-1);
1063  n *= step;
1064 
1065  for(i=x.start(); i<N; i+=step)
1066  {
1067  if(this->data[i] == 0.) continue;
1068 
1069  p = a.data+i-n; // start pointer
1070  if(p<P) p = P;
1071  q = a.data+i+n; // stop pointer
1072  if(q>Q) q = Q;
1073 
1074 // calculate total likelihood and number of black pixels
1075 // and set threshold on significance
1076 
1077  pass = false;
1078  E = 0.; m = 0;
1079 
1080  while(p <= q) {
1081 // if(*p>S) { pass = true; break; }
1082  if(*p>0) { E += *p; m++; }
1083  p += step;
1084  }
1085 
1086  if(m>0 && !pass) {
1087  if(gammaCL(E,m) > S-log(double(m))) pass = true;
1088  }
1089 
1090  if(pass) event++;
1091  else this->data[i] = 0;
1092  }
1093  }
1094 
1095 // handle wavelets with different number of layers
1096 
1097  if(size_t(maxLayer())>max_layer){
1099  for(k=max_layer+1; k<= size_t(maxLayer()); k++) {
1100  (*pw)[getSlice(k)] = 0;
1101  }
1102  }
1103 
1104  return double(event)/this->size();
1105 }
1106 
1107 
1108 template<class DataType_t>
1109 void WSeries<DataType_t>::median(double t, bool r)
1110 {
1111  int i;
1112  int M = maxLayer()+1;
1113 
1114  for(i=0; i<M; i++){
1115  this->setSlice(getSlice(i));
1117  }
1118 
1119  std::slice S(0,this->size(),1);
1120  this->setSlice(S);
1121  return;
1122 }
1123 
1124 
1125 template<class DataType_t>
1126 void WSeries<DataType_t>::lprFilter(double T, int mode, double stride, double offset)
1127 {
1128  if(offset<T) offset = T;
1129  size_t i;
1130  size_t M = maxLayer()+1;
1131 
1133 
1134  for(i=0; i<M; i++){
1135  getLayer(a,i);
1136  if(mode<2) a.lprFilter(T,mode,stride,offset);
1137  else a.spesla(T,stride,offset);
1138  putLayer(a,i);
1139  }
1140  return;
1141 }
1142 
1143 
1144 
1145 template<class DataType_t>
1146 WSeries<double> WSeries<DataType_t>::white(double t, int mode, double offset, double stride)
1147 {
1148 //: tracking of noise non-stationarity and whitening.
1149 // param 1 - time window dT. if = 0 - dT=T, where T is wavearray duration - 2*offset
1150 // param 2 - mode: 0 - no whitening, 1 - single whitening, >1 - double whitening
1151 // mode < 1 - whitening of guadrature (WDM wavelet only)
1152 // param 3 - boundary offset
1153 // param 4 - noise sampling interval (window stride)
1154 // the number of measurements is k=int((T-2*offset)/stride)
1155 // if stride=0, then stride is set to dT
1156 // return: noise array if param2>0, median if param2=0
1157 // what it does: each wavelet layer is devided into k intervals.
1158 // The data for each interval is sorted and the following parameters
1159 // are calculated: median and the amplitude
1160 // corresponding to 31% percentile (wp). Wavelet amplitudes (w) are
1161 // normalized as w' = (w-median(t))/wp(t), where median(t) and wp(t)
1162 // is a linear interpolation between (median,wp) measurements for
1163 // each interval.
1164  int i;
1165  double segT = this->stop()-this->start();
1166  if(t <= 0.) t = segT-2.*offset;
1167  int M = maxLayer()+1;
1168  int m = mode<0 ? -1 : 1;
1169 
1170  this->w_mode = abs(mode);
1171  if(stride > t || stride<=0.) stride = t;
1172  size_t K = size_t((segT-2.*offset)/stride); // number of noise measurement minus 1
1173  if(!K) K++; // special case
1174 
1175  Wavelet* pw = pWavelet->Clone();
1178  wavearray<double> b(M*(K+1));
1179  WSeries<double> ws(b,*pw);
1180 
1181  for(i=0; i<M; i++){
1182  getLayer(a,(i+0.01)*m);
1183  if(!w_mode) { // use square coefficients
1184  getLayer(aa,-(i+0.01)); aa*=aa; a*=a; a+=aa;
1185  }
1186  b = a.white(t,w_mode,offset,stride);
1187  if(b.size() != K+1) cout<<"wseries::white(): array size mismatch\n";
1188  ws.putLayer(b,i);
1189  if(w_mode) putLayer(a,i*m);
1190  }
1191 
1192  ws.start(b.start());
1193  ws.stop(b.stop());
1194  ws.wrate(b.rate());
1195  ws.rate(this->rate());
1196  ws.setlow(0.);
1197  ws.sethigh(this->rate()/2.);
1198 
1199  delete pw;
1200  return ws;
1201 }
1202 
1203 template<class DataType_t>
1205 {
1206 // whiten wavelet series by using TF noise rms array
1207 // if mode <0 - access qudrature WDM data
1208 // if abs(mode) <2 - single, otherwise double whitening
1209 
1210  size_t i,j,J,K;
1211 
1212  if(!nRMS.size()) return false;
1213 
1214  slice S,N;
1215 
1216  int k;
1217  int m = mode<0 ? -1 : 1;
1218  size_t In = nRMS.maxLayer()+1;
1219  size_t I = this->maxLayer()+1;
1220  double To = nRMS.start()-this->start();
1221  double dT = 1./nRMS.wrate(); // rate in a single noise layer!
1222  double R = this->wrate(); // rate in a single data layer
1223  double r;
1224  wavearray<DataType_t> xx; // data layer
1225  wavearray<double> na; // nRMS layer
1226 
1227  this->w_mode = abs(mode);
1228 
1229  if(I!=In) {
1230  cout<<"wseries::white error: mismatch between WSeries and nRMS\n";
1231  exit(0);
1232  }
1233 
1234  for(i=(1-m)/2; i<I; i++){ // loop over layers
1235  this->getLayer(xx,(i+0.01)*m); // layer of WSeries
1236  nRMS.getLayer(na,int(i)); // layer of noise array
1237  J = xx.size(); // number of data samples
1238  K = na.size()-1; // number of noise samples - 1
1239  k = 0.;
1240 
1241  for(j=0; j<J; j++) {
1242  double t = j/R; // data sample time
1243  double T = To+k*dT;
1244 
1245  if(t >= To+K*dT) r = na.data[K]; // after last noise point
1246  else if(t <= To) r = na.data[0]; // before first noise point
1247  else {
1248  if(t > T) {k++; T+=dT;}
1249  r = (na.data[k-1]*(dT-T+t) + na.data[k]*(T-t))/dT;
1250  }
1251  xx.data[j] *= abs(mode)<=1 ? DataType_t(1./r) : DataType_t(1./r/r);
1252  }
1253  this->putLayer(xx,(i+0.01)*m); // update layer in WSeries
1254 
1255  }
1256  return true;
1257 }
1258 
1259 template<class DataType_t>
1261 {
1262  size_t i;
1263  size_t M = maxLayer()+1;
1264  size_t k = 1<<n;
1265  double x;
1266 
1269  wavearray<double> v(M); // effective variance
1270 
1271  if(!pWavelet->BinaryTree()) { v = 1.; return v; }
1272  else { v = 0.; }
1273 
1274  Forward(n); // n decomposition steps
1275 
1276  for(i=0; i<M; i++){
1277  getLayer(a,i);
1278  b = a.white(1);
1279  x = b.data[0];
1280  v.data[i/k] += x>0. ? 1./x/x : 0.;
1281  putLayer(a,i);
1282  }
1283 
1284  Inverse(n); // n reconstruction steps
1285 
1286  for(i=0; i<v.size(); i++)
1287  v.data[i] = sqrt(k/v.data[i]);
1288 
1289  v.start(this->start());
1290 
1291  return v;
1292 }
1293 
1294 
1295 template<class DataType_t>
1297 {
1298  if(fl<0.) fl = this->getlow();
1299  if(fh<0.) fh = this->gethigh();
1300  double tsRate = this->rate();
1301 
1302  size_t i,j;
1303  size_t M = maxLayer()+1; // number of layers
1304  size_t N = this->size()/M; // zero layer length
1305  size_t ml = size_t(2.*M*fl/tsRate+0.5); // low layer
1306  size_t mh = size_t(2.*M*fh/tsRate+0.5); // high layer
1307 
1308  if(mh>M) mh = M;
1309 
1310  size_t nL = ml+int((mh-int(ml))/4.+0.5); // left sample (50%)
1311  size_t nR = mh-int((mh-int(ml))/4.+0.5); // right sample (50%)
1312  size_t n = size_t(fabs(t)*tsRate/M);
1313 
1314  DataType_t* p;
1315  DataType_t* pp[M]; // sorting
1316  size_t inDex[M]; // index(layer)
1317  size_t laYer[M]; // layer(index)
1318  WSeries<float> v; // effective variance
1319  WSeries<float> V; // variance correction
1320  slice S;
1321  v.resize(N);
1322 
1323  if(!pWavelet->BinaryTree() || mh<ml+8 || nL<1)
1324  { v = 1.; return v; }
1325  else { v = 0.; }
1326 
1327 // calculate frequency order of layers
1328 
1329  for(j=0; j<M; j++){
1330  S = getSlice(j);
1331  inDex[j] = S.start(); // index in the array (layer)
1332  laYer[inDex[j]] = j; // layer (index in the array)
1333  }
1334 
1335 // calculate variability for each wavelet collumn
1336 
1337  for(i=0; i<N; i++){
1338  p = this->data + i*M;
1339  for(j=0; j<M; j++){ pp[j] = &(p[inDex[j]]); }
1340  this->waveSplit(pp,ml,mh-1,nL-1); // left split
1341  this->waveSplit(pp,nL,mh-1,nR); // right split
1342  v.data[i] = float(*pp[nR] - *pp[nL-1])/2./0.6745;
1343  }
1344 
1345  v.start(this->start());
1346  v.rate(this->wrate());
1347  v.setlow(fl);
1348  v.sethigh(fl);
1349 
1350  if(n<2) return v;
1351 
1352 // calculate variability correction
1353 
1354  V=v; V-=1.;
1355  V.lprFilter(fabs(t),0,0.,fabs(t)+1.);
1356  v -= V;
1357 
1358 // correct variability
1359 
1360  p = this->data;
1361 
1362  for(i=0; i<N; i++){
1363  for(j=0; j<M; j++){
1364  if(laYer[j]>=ml && laYer[j]<mh) *p /= (DataType_t)v.data[i];
1365  p++;
1366  }
1367  }
1368 
1369  return v;
1370 }
1371 
1372 
1373 template<class DataType_t>
1374 double WSeries<DataType_t>::fraction(double t, double f, int mode)
1375 {
1376  slice S;
1377  DataType_t* p=NULL;
1378  register DataType_t* P=NULL;
1379  register DataType_t** pp;
1380  DataType_t A, aL, aR;
1381  size_t i,j,k;
1382  size_t nS, kS, nL, nR, lS;
1383  size_t nZero = 0;
1384  size_t n0 = 1;
1385  size_t nsub = t>0. ? size_t(this->size()/this->wrate()/t+0.1) : 1;
1386  long r;
1387 
1388  if(!nsub) nsub++;
1389 
1390  f = fabs(f);
1391  if((f>1. || bpp!=1.) && mode) {
1392  cout<<"WSeries fraction(): invalid bpp: "<<bpp<<" fraction="<<f<<endl;
1393  return bpp;
1394  }
1395  if(f>0.) bpp = f;
1396 
1397  size_t M = maxLayer()+1;
1398 
1399  n0 = 1;
1400  pp = (DataType_t **)malloc(sizeof(DataType_t*));
1402 
1403 // percentile fraction
1404 
1405  if(mode && f>0.){
1406  for(i=0; i<M; i++){
1407 
1408  S = getSlice(i);
1409  nS = S.size()/nsub; // # of samles in sub-interval
1410  kS = S.stride(); // stride for this layer
1411  lS = nS*nsub<S.size() ? S.size()-nS*nsub : 0; // leftover
1412 
1413 // loop over subintervals
1414 
1415  for(k=0; k<nsub; k++) {
1416 
1417  p = this->data + nS*k*kS + S.start(); // beginning of subinterval
1418 
1419  if(k+1 == nsub) nS += lS; // add leftover to last interval
1420 
1421  nL = nS&1 ? nS/2 : nS/2-1;
1422  nL = size_t(f*nL); // set left boundary
1423  nR = nS - nL - 1; // set right boundary
1424  if(nL<1 || nR>nS-1) {
1425  cout<<"WSeries::fraction() error: too short wavelet layer"<<endl;
1426  return 0.;
1427  }
1428 
1429  if(nS!=n0) { // adjust array length
1430  pp = (DataType_t **)realloc(pp,nS*sizeof(DataType_t*));
1431  a.resize(nS);
1432  n0 = nS;
1433  }
1434 
1435  for(j=0; j<nS; j++) pp[j] = p + j*kS;
1436 
1437  this->waveSplit(pp,0,nS-1,nL); // left split
1438  this->waveSplit(pp,nL,nS-1,nR); // right split
1439  aL = *pp[nL]; aR = *pp[nR];
1440 
1441  for(j=0; j<nS; j++){
1442  P = pp[j]; A = *P;
1443 
1444  if(j<nL) *P = (DataType_t)fabs(A - aL);
1445  else if(j>nR) *P = (DataType_t)fabs(A - aR);
1446  else { *P = 0; nZero++; }
1447 
1448  if(mode > 1) { // do initialization for scrambling
1449  a.data[j] = *P; // save data
1450  *P = 0; // zero sub-interval
1451  }
1452  }
1453 
1454  if(mode == 1) continue; // all done for mode=1
1455 
1456 // scramble
1457 
1458  for(j=0; j<nS; j++){
1459  if(a.data[j] == 0.) continue;
1460  do{ r = int(nS*drand48()-0.1);}
1461  while(p[r*kS] != 0);
1462  p[r*kS] = a.data[j];
1463  }
1464  }
1465  }
1466  }
1467 
1468  else if(f>0.){ // random fraction
1469  M = this->size();
1470  for(i=0; i<M; i++)
1471  if(drand48() > f) { this->data[i] = 0; nZero++; }
1472  }
1473 
1474  else{ // calculate zero coefficients
1475  M = this->size();
1476  for(i=0; i<M; i++) {
1477  if(this->data[i]==0.) nZero++;
1478  }
1479  }
1480 
1481  free(pp);
1482  return double(this->size()-nZero)/double(this->size());
1483 }
1484 
1485 
1486 template<class DataType_t>
1487 double WSeries<DataType_t>::significance(double T, double f)
1488 {
1489  slice S;
1490  DataType_t* p=NULL;
1491  DataType_t** pp;
1492  double tsRate = this->rate();
1493  size_t i,j,k,l,m;
1494  size_t nS,nP,nB;
1495  size_t M = maxLayer()+1;
1496  size_t il = size_t(2.*M*getlow()/tsRate);
1497  size_t ih = size_t(2.*M*gethigh()/tsRate+0.5);
1498  int nZero = 0;
1499  double ratio = double(this->size());
1500 
1501  if(ih>M) ih = M;
1502  if(il>=ih) {
1503  cout<<"WSeries::significance(): invalid low and high: ";
1504  cout<<"low = "<<il<<" high = "<<ih<<endl;
1505  il = 0;
1506  ih = M;
1507  }
1508 
1509 // zero unused layers
1510 
1511  for(i=0; i<M; i++){
1512 
1513  if(i>=il && i<=ih) continue;
1514 
1515  S = getSlice(i);
1516  k = S.size();
1517  m = S.stride();
1518  p = this->data+S.start();
1519  ratio -= double(k);
1520 
1521  for(j=0; j<k; j++) p[j*m] = 0;
1522  }
1523  ratio /= this->size(); // fraction of pixels between high and low
1524 
1525 // calculate number of sub-intervals
1526 
1527  S = getSlice(0); // layer 0
1528 
1529  size_t n = size_t(fabs(T)*tsRate/S.stride()/ratio+0.1); // number of towers
1530  if(n<1) n = S.size();
1531 
1532  k = S.size()/n; // number of sub-intervals
1533  m = this->size()/S.size(); // number of samples in each tower
1534 
1535  f = fabs(f);
1536  if(f>1.) f = 1.;
1537  if(f>0. && f<bpp) bpp = f;
1538  nS = n*m; // # of samples in one sub-interval
1539  nB = size_t(bpp*nS*ratio); // expected number of black pixels
1540 
1541  if(!nS || !nB || tsRate<=0. || m*S.size()!=this->size()) {
1542  cout<<"WSeries::significance() error: invalid parameters"<<endl;
1543  return 0.;
1544  }
1545 
1546  l = (S.size()-k*n)*m; // leftover
1547  if(l) k++; // add one more subinterval
1548 
1549 // cout<<"k="<<k<<" m="<<m<<" bpp="<<bpp<<" nS="<<nS<<endl;
1550 
1551  pp = (DataType_t **)malloc(nS*sizeof(DataType_t*));
1552 
1553  p = this->data;
1554 
1555  for(i=0; i<k; i++){
1556 
1557 // fill pp and a
1558 
1559  nP = 0;
1560 
1561  for(j=0; j<nS; j++) {
1562  if(*p == 0.) {p++; continue;}
1563  *p = (DataType_t)fabs(double(*p));
1564  pp[nP++] = p++;
1565  nZero++; // count non-Zero pixels
1566  }
1567 
1568  if(nP>2) this->waveSort(pp,0,nP-1); // sort black pixels
1569 
1570  for(j=0; j<nP; j++) {
1571  if(!i && l && pp[j]>=this->data+l) continue; // handle leftover
1572  *pp[j] = nP<nB ? (DataType_t)log(double(nP)/(nP-j)) :
1573  (DataType_t)log(double(nB)/(nP-j));
1574  if(*pp[j] < 0) {
1575  *pp[j] = 0;
1576  nZero--;
1577  }
1578  }
1579 
1580  p = this->data+i*nS+l;
1581  if(!l) p += nS;
1582  }
1583 
1584  free(pp);
1585  return double(nZero)/ratio/this->size();
1586 }
1587 
1588 
1589 template<class DataType_t>
1591 {
1592  DataType_t* p=NULL;
1593  DataType_t* px=NULL;
1594  DataType_t** pp;
1595  DataType_t** qq;
1596  DataType_t* xx;
1597  DataType_t* yy;
1598 
1599  double aL, aR;
1600 
1601  size_t i,j,m;
1602  size_t last, next;
1603  size_t nS,nB,nL,nR;
1604  size_t nBlack = 0;
1605  size_t index;
1606 
1607  slice S=getSlice(0); // layer 0
1608  size_t N = S.size(); // number of towers in WSeries
1609 
1610  m = this->size()/S.size(); // number of samples in each tower
1611 
1612  f = fabs(f);
1613  if(f>1.) f = 1.;
1614  if(f>0. && f<bpp) bpp = f;
1615  nS = (2*n+1)*m; // # of samples in one sub-interval
1616  nB = size_t(bpp*nS); // expected number of black pixels
1617  if(nB&1) nB++;
1618  nL = nB/2; // left bp boundary
1619  nR = nS - nL; // right bp boundary
1620 
1621  if(!nS || !nB || this->rate()<=0. || m*S.size()!=this->size()) {
1622  cout<<"WSeries::significance() error: invalid WSeries"<<endl;
1623  return 0.;
1624  }
1625 
1626  pp = (DataType_t **)malloc(nS*sizeof(DataType_t*));
1627  xx = (DataType_t *)malloc(nS*sizeof(DataType_t));
1628  qq = (DataType_t **)malloc(nS*sizeof(DataType_t*));
1629  yy = (DataType_t *)malloc(nS*sizeof(DataType_t));
1630 
1631  p = this->data;
1632  for(j=0; j<nS; j++){
1633  xx[j] = *p;
1634  pp[j] = xx+j;
1635  qq[j] = yy+j;
1636  *p++ = 0;
1637  }
1638  last = 0;
1639  next = 0;
1640 
1641  for(i=0; i<N; i++){
1642 
1643  this->waveSplit(pp,0,nS-1,nL-1); // left split
1644  this->waveSplit(pp,nL,nS-1,nR); // right split
1645  aL = *pp[nL]; aR = *pp[nR];
1646 
1647  for(j=0; j<nL; j++) yy[j] = (DataType_t)fabs(*pp[j] - aL);
1648  for(j=nR; j<nS; j++) yy[j+nL-nR] = (DataType_t)fabs(*pp[j] - aR);
1649 
1650  this->waveSort(qq,0,nB-1); // sort black pixels
1651 
1652  for(j=0; j<nB; j++) {
1653  index = qq[j]-yy; // index in yy
1654  if(index>nL) index+=nR-nL; // index in pp
1655  index = pp[index]-xx; // index in xx
1656  if(next != index/m) continue; // compare with current tower index in xx
1657  this->data[index-next*m+i*m] = (DataType_t)log(double(nB)/(nB-j));
1658  nBlack++;
1659  }
1660 
1661  if(i>=n && i<N-n) { // copy next tower into last
1662  px = xx+last*m;
1663  for(j=0; j<m; j++) { *(px++) = *p; *p++ = 0;}
1664  last++; // update last tower index in array xx
1665  }
1666 
1667  next++; // update current tower index in array xx
1668  if(next>2*n) next = 0;
1669  if(last>2*n) last = 0;
1670 
1671  }
1672 
1673  free(pp);
1674  free(qq);
1675  free(xx);
1676  free(yy);
1677 
1678  return double(nBlack)/double(this->size());
1679 }
1680 
1681 
1682 template<class DataType_t>
1683 double WSeries<DataType_t>::rSignificance(double T, double f, double t)
1684 {
1686 
1687  DataType_t* p=NULL;
1688  DataType_t* xx; // buffer for data
1689  DataType_t* yy; // buffer for black pixels
1690  DataType_t** px; // pointers to xx
1691  DataType_t** py; // pointers to yy
1692  DataType_t** pp; // pointers to this->data, so *pp[j] == xx[j]
1693 
1694  double aL, aR;
1695  double tsRate = this->rate();
1696 
1697  size_t i,j,m,l,J;
1698  size_t last, next;
1699  size_t nS,nB,nL,nR;
1700  size_t nBlack = 0;
1701  size_t index;
1702 
1703  size_t M = maxLayer()+1; // number of samples in a tower
1704  size_t il = size_t(2.*M*getlow()/tsRate);
1705  size_t ih = size_t(2.*M*gethigh()/tsRate+0.5);
1706 
1707  if(ih>M) ih = M;
1708  if(il>=ih) {
1709  cout<<"WSeries::significance(): invalid low and high: ";
1710  cout<<"low = "<<il<<" high = "<<ih<<endl;
1711  il = 0;
1712  ih = M;
1713  }
1714 
1715  m = ih-il; // # of analysis samples in a tower
1716 
1717  for(j=0; j<il; j++){ this->getLayer(wa,j); wa=1234567891.; this->putLayer(wa,j); }
1718  for(j=ih; j<M; j++){ this->getLayer(wa,j); wa=1234567891.; this->putLayer(wa,j); }
1719 
1720  t *= double(M)/m;
1721  T *= double(M)/m;
1722 
1723  slice S=getSlice(0); // layer 0
1724  size_t N = S.size(); // number of towers in WSeries
1725  size_t k = size_t(t*this->wrate()); // sliding step in towers
1726  size_t n = size_t(T*this->wrate()/2.); // 1/2 sliding window in towers
1727 
1728  if(t<=0. || k<1) k = 1;
1729  if(T<=0. || n<1) n = 1;
1730 
1731  size_t Nnk = N-n-k;
1732  size_t nW = (2*n+k)*M; // total # of samples in the window
1733 
1734  f = fabs(f);
1735  if(f>1.) f = 1.;
1736  if(f>0. && f<bpp) bpp = f;
1737  nS = (2*n+k)*m; // # of analysis samples in the window
1738  nB = size_t(bpp*nS); // expected number of black pixels
1739  if(nB&1) nB++;
1740  nL = nB/2; // left bp boundary
1741  nR = nS - nL; // right bp boundary
1742 
1743  if(!nS || !nB || this->rate()<=0. || M*S.size()!=this->size()) {
1744  cout<<"WSeries::significance() error: invalid WSeries"<<endl;
1745  return 0.;
1746  }
1747 
1748  pp = (DataType_t **)malloc(nS*sizeof(DataType_t*));
1749  px = (DataType_t **)malloc(nS*sizeof(DataType_t*));
1750  py = (DataType_t **)malloc(nS*sizeof(DataType_t*));
1751  xx = (DataType_t *)malloc(nS*sizeof(DataType_t));
1752  yy = (DataType_t *)malloc(nS*sizeof(DataType_t));
1753 
1754  p = this->data;
1755  J = 0;
1756  for(i=0; i<nW; i++){
1757  if(*p != 1234567891.){
1758  xx[J] = *p;
1759  pp[J] = p;
1760  px[J] = xx+J;
1761  py[J] = yy+J;
1762  J++;
1763  }
1764  *p++ = 0;
1765  }
1766  last = 0;
1767  next = 0;
1768 
1769  if(J != nS) {
1770  cout<<"wseries::rSignificance() error 1 - illegal sample count"<<endl;
1771  exit(0);
1772  }
1773 
1774  for(i=0; i<N; i+=k){
1775 
1776  this->waveSplit(px,0,nS-1,nL-1); // left split
1777  this->waveSplit(px,nL,nS-1,nR); // right split
1778  aL = *px[nL]; aR = *px[nR];
1779 
1780  for(j=0; j<nL; j++) yy[j] = (DataType_t)fabs(*px[j] - aL);
1781  for(j=nR; j<nS; j++) yy[j+nL-nR] = (DataType_t)fabs(*px[j] - aR);
1782 
1783  if(nB != nS-nR+nL) {
1784  cout<<"wseries::rSignificance: nB="<<nB<<", N="<<nS-nR+nL<<endl;
1785  nB = nS-nR+nL;
1786  }
1787 
1788  this->waveSort(py,0,nB-1); // sort black pixels
1789 
1790  for(j=0; j<nB; j++) { // save rank in *this
1791  index = py[j]-yy; // index in yy
1792  if(index>nL) index+=nR-nL; // index in xx
1793  index = px[index]-xx; // index in pp
1794  index = pp[index]-this->data; // index in WS data array
1795 
1796  if(index>=i*M && index<(i+k)*M) { // update pixels in window t
1797  if(this->data[index]!=0) {
1798  cout<<"WSeries::rSignificance error: "<<this->data[index]<<endl;
1799  }
1800  this->data[index] = DataType_t(log(double(nB)/(nB-j))); // save rank
1801  nBlack++;
1802  }
1803  }
1804 
1805  for(l=i; l<i+k; l++){ // copy towers
1806  if(l>=n && l<Nnk) { // copy next tower into last
1807  J = last*m; // pointer to last tower storage at xx
1808  for(j=0; j<M; j++) {
1809  if(*p != 1234567891.) { xx[J] = *p; pp[J++]=p; }
1810  *p++ = 0;
1811  }
1812  last++; // update last tower index in array xx
1813  if(J != last*m) {
1814  cout<<"wseries::rSignificance() error 2 - illegal sample count"<<endl;
1815  exit(0);
1816  }
1817  }
1818 
1819  next++; // update current tower index in array xx
1820  if(next==2*n+k) next = 0;
1821  if(last==2*n+k) last = 0;
1822  }
1823  }
1824 
1825  free(pp);
1826  free(px);
1827  free(py);
1828  free(xx);
1829  free(yy);
1830 
1831  return double(nBlack)/double(this->size());
1832 }
1833 
1834 
1835 
1836 template<class DataType_t>
1837 double WSeries<DataType_t>::gSignificance(double T, double f, double t)
1838 {
1840 
1841  DataType_t* p=NULL;
1842  DataType_t* xx; // buffer for data
1843  DataType_t* yy; // buffer for black pixels
1844  DataType_t** px; // pointers to xx
1845  DataType_t** py; // pointers to yy
1846  DataType_t** pp; // pointers to this->data, so *pp[j] == xx[j]
1847 
1848  double aL, aR;
1849 
1850  size_t i,j,m,l,J;
1851  size_t last, next;
1852  size_t nS,nB,nL,nR;
1853  size_t nBlack = 0;
1854  size_t index;
1855 
1856  size_t M = maxLayer()+1; // number of samples in a tower
1857  size_t il = size_t(2.*getlow()/this->wrate());
1858  size_t ih = size_t(2.*gethigh()/this->wrate()+0.5);
1859 
1860  if(ih>M) ih = M;
1861  if(il>=ih) {
1862  cout<<"WSeries::significance(): invalid low and high: ";
1863  cout<<"low = "<<il<<" high = "<<ih<<endl;
1864  il = 0;
1865  ih = M;
1866  }
1867 
1868  m = ih-il; // # of analysis samples in a tower
1869 
1870  for(j=0; j<il; j++){ this->getLayer(wa,j); wa=1234567891.; this->putLayer(wa,j); }
1871  for(j=ih; j<M; j++){ this->getLayer(wa,j); wa=1234567891.; this->putLayer(wa,j); }
1872 
1873  t *= double(M)/m;
1874  T *= double(M)/m;
1875 
1876  slice S=getSlice(0); // layer 0
1877  size_t N = S.size(); // number of towers in WSeries
1878  size_t k = size_t(t*this->wrate()); // sliding step in towers
1879  size_t n = size_t(T*this->wrate()/2.); // 1/2 sliding window in towers
1880 
1881  if(t<=0. || k<1) k = 1;
1882  if(T<=0. || n<1) n = 1;
1883 
1884  size_t Nnk = N-n-k;
1885  size_t nW = (2*n+k)*M; // total # of samples in the window
1886 
1887  f = fabs(f);
1888  if(f>1.) f = 1.;
1889  if(f>0. && f<bpp) bpp = f;
1890  nS = (2*n+k)*m; // # of analysis samples in the window
1891  nB = size_t(bpp*nS); // expected number of black pixels
1892  if(nB&1) nB++;
1893  nL = nB/2; // left bp boundary
1894  nR = nS - nL; // right bp boundary
1895 
1896  if(!nS || !nB || this->rate()<=0. || M*S.size()!=this->size()) {
1897  cout<<"WSeries::gSignificance() error: invalid WSeries"<<endl;
1898  return 0.;
1899  }
1900 
1901  pp = (DataType_t **)malloc(nS*sizeof(DataType_t*));
1902  px = (DataType_t **)malloc(nS*sizeof(DataType_t*));
1903  py = (DataType_t **)malloc(nS*sizeof(DataType_t*));
1904  xx = (DataType_t *)malloc(nS*sizeof(DataType_t));
1905  yy = (DataType_t *)malloc(nS*sizeof(DataType_t));
1906 
1907  p = this->data;
1908  J = 0;
1909  for(i=0; i<nW; i++){
1910  if(*p != 1234567891.){
1911  xx[J] = *p;
1912  pp[J] = p;
1913  px[J] = xx+J;
1914  py[J] = yy+J;
1915  J++;
1916  }
1917  *p++ = 0;
1918  }
1919  last = 0;
1920  next = 0;
1921 
1922  if(J != nS) {
1923  cout<<"wseries::gSignificance() error 1 - illegal sample count"<<endl;
1924  exit(0);
1925  }
1926 
1927  for(i=0; i<N; i+=k){
1928 
1929  this->waveSplit(px,0,nS-1,nL-1); // left split
1930  this->waveSplit(px,nL,nS-1,nR); // right split
1931  aL = *px[nL]; aR = *px[nR];
1932 
1933  for(j=0; j<nL; j++) yy[j] = (DataType_t)fabs(*px[j]);
1934  for(j=nR; j<nS; j++) yy[j+nL-nR] = (DataType_t)fabs(*px[j]);
1935 
1936  if(nB != nS-nR+nL) {
1937  cout<<"wseries::gSignificance: nB="<<nB<<", N="<<nS-nR+nL<<endl;
1938  nB = nS-nR+nL;
1939  }
1940 
1941  this->waveSort(py,0,nB-1); // sort black pixels
1942 
1943  for(j=0; j<nB; j++) { // save significance in *this
1944  index = py[j]-yy; // index in yy
1945  if(index>nL) index+=nR-nL; // index in pp
1946  index = px[index]-xx; // index in xx
1947  *(pp[index]) = pow(*py[j]+1.11/2,2)/2./1.07 + log(bpp); // save significance
1948  }
1949  nBlack += nB;
1950 
1951  for(l=i; l<i+k; l++){ // copy towers
1952  if(l>=n && l<Nnk) { // copy next tower into last
1953  J = last*m; // pointer to last tower storage at xx
1954  for(j=0; j<M; j++) {
1955  if(*p != 1234567891.) { xx[J] = *p; pp[J++]=p; }
1956  *p++ = 0;
1957  }
1958  last++; // update last tower index in array xx
1959  if(J != last*m) {
1960  cout<<"wseries::gSignificance() error 2 - illegal sample count"<<endl;
1961  exit(0);
1962  }
1963  }
1964 
1965  next++; // update current tower index in array xx
1966  if(next==2*n+k) next = 0;
1967  if(last==2*n+k) last = 0;
1968  }
1969  }
1970 
1971  free(pp);
1972  free(px);
1973  free(py);
1974  free(xx);
1975  free(yy);
1976 
1977  return double(nBlack)/double(this->size());
1978 }
1979 
1980 
1981 
1982 template<class DataType_t>
1984 {
1985  size_t k;
1986  size_t event = 0;
1987  int i, j, n;
1988  int nm, np, mp, mm;
1989 
1990  bool one;
1991 
2000 
2001  size_t max_layer = maxLayer()+1;
2002 
2003  pc = &ac; pp = &ap; pm = p = NULL;
2004  mp = mm = 1;
2005  getLayer(a,0);
2006  ac = a;
2007 
2008  for(k=1; k<=max_layer; k++){
2009 
2010  if(k<max_layer) getLayer(*pp,k); // next layer
2011  else pp = NULL;
2012 
2013  if(pp!=NULL) mp = pp->size()/pc->size(); // scale for upper layer
2014  if(pm!=NULL) mm = pc->size()/pm->size(); // scale for lower layer
2015 
2016  n = pc->size()-1;
2017 
2018  for(i=0; i<=n; i++) {
2019  one = true;
2020 
2021  if(pc->data[i] == 0.) continue;
2022  if(pc->data[i] > 9.7) cout<<"pixclean: "<<pc->data[i]<<endl;
2023  event++;
2024  if(i>0 && pc->data[i-1]!=0.) continue;
2025  if(i<n && pc->data[i+1]!=0.) continue;
2026 
2027 // work on upper (+) layer
2028 
2029  if(pp!=NULL) {
2030  nm = i*mp-1; // left index for + layer
2031  np = i*mp+2; // right index for + layer
2032  if(nm < 0) nm = 0;
2033  if(np > n) np = n;
2034 
2035  for(j=nm; j<np; j++) {
2036  if(pp->data[j] != 0) {
2037  one = false;
2038  break;
2039  }
2040  }
2041  }
2042  if(!one) continue;
2043 
2044 // work on lower (-) layer
2045 
2046  if(pm!=NULL) {
2047  nm = i/mm-1; // left index for + layer
2048  np = i/mm+2; // right index for + layer
2049  if(nm < 0) nm = 0;
2050  if(np > n) np = n;
2051 
2052  for(j=nm; j<np; j++) {
2053  if(pm->data[j] != 0) {
2054  one = false;
2055  break;
2056  }
2057  }
2058  }
2059  if(!one) continue;
2060 
2061  if(pc->data[i]<S) {a.data[i]=0; event--;}
2062  }
2063 
2064  putLayer(a,k-1);
2065 
2066 // shaffle layers
2067 
2068  if(pp==NULL) break;
2069 
2070  a = *pp;
2071  p = pm==NULL ? &am : pm;
2072  pm = pc;
2073  pc = pp;
2074  pp = p;
2075  }
2076 
2077  return double(event)/this->size();
2078 }
2079 
2080 
2081 template<class DataType_t>
2083 {
2084  slice S;
2085  DataType_t* p=NULL;
2086  register DataType_t* P=NULL;
2087  register DataType_t** pp;
2088  double A, aL, aR;
2089  double x;
2090  size_t i,j;
2091  size_t nS, kS, mS, nL, nR;
2092  size_t nZero = 0;
2093  long r;
2094 
2095  f = fabs(f);
2096  if((f>=1. || bpp!=1.) && mode) {
2097  cout<<"WSeries percentile(): invalid bpp: "<<bpp<<" fraction="<<f<<endl;
2098  return bpp;
2099  }
2100  bpp = f;
2101 
2102  if(pin) *this = *pin; // copy input wavelet if specified
2103 
2104  size_t M = maxLayer()+1;
2106 
2107  S=pw->getSlice(0);
2108  size_t n0 = S.size();
2109  if(n0) pp = (DataType_t **)malloc(n0*sizeof(DataType_t*));
2110  else return 0.;
2111 
2114 
2115  if(mode && f>0.){ // percentile fraction
2116  for(i=0; i<M; i++){
2117 
2118  S = pw->getSlice(i);
2119  nS = S.size();
2120  kS = S.stride();
2121  mS = S.start();
2122  p = this->data+S.start();
2123  nL = size_t(f*nS/2.+0.5);
2124  nR = nS - nL;
2125 
2126  if(nL<2 || nR>nS-2) {
2127  cout<<"WSeries::percentile() error: too short wavelet layer"<<endl;
2128  return 0.;
2129  }
2130 
2131  if(nS!=n0) {
2132  pp = (DataType_t **)realloc(pp,nS*sizeof(DataType_t*));
2133  a.resize(nS);
2134  }
2135 
2136  for(j=0; j<nS; j++) pp[j] = p + j*kS;
2137 
2138  this->waveSplit(pp,0,nS-1,nL-1); // left split
2139  this->waveSplit(pp,nL,nS-1,nR); // right split
2140  aL = double(*pp[nL-1]); aR = double(*pp[nR]);
2141 
2142  for(j=0; j<nS; j++){
2143  P = pp[j]; A = double(*P);
2144 
2145 // if(j<nL) *P = -sqrt(A*A - aL*aL);
2146 // else if(j>nR) *P = sqrt(A*A - aR*aR);
2147 
2148  if(j<nL) *P = DataType_t(fabs(A - aL));
2149  else if(j>nR) *P = DataType_t(fabs(A - aR));
2150  else { *P = 0; nZero++; }
2151 
2152  if(mode == -1) continue; // all done for mode = -1
2153  if(pin) pin->data[mS+P-p] = *P; // update pin slice
2154  if(j>nL && j<nR) continue; // skip zero amplitudes
2155  a.data[(P-p)/kS] = *P; // save data
2156  if(j<nL) *P *= -1; // absolute value
2157  if(j>=nR) pp[nL+j-nR] = P; // copy right sample
2158  }
2159 
2160  if(mode == -1) continue; // keep wavelet amplitudes
2161 
2162  nL *= 2;
2163  this->waveSort(pp,0,nL-1); // sort black pixels
2164 
2165  if(abs(mode)!=1) b = a;
2166 
2167  for(j=0; j<nL; j++){
2168  r = (pp[j]-p)/kS;
2169 // x = a.data[r]<0. ? -double(nL)/(nL-j) : double(nL)/(nL-j);
2170  x = log(double(nL)/(nL-j));
2171  *pp[j] = mode==1 ? DataType_t(x) : 0;
2172  if(mode>1) a.data[r]=DataType_t(x); // save data for random sample
2173  }
2174 
2175  if(abs(mode)==1) continue;
2176 
2177 // scramble
2178 
2179  for(j=0; j<nL; j++){
2180  P = pp[j];
2181  do{ r = int(nS*drand48()-0.1);}
2182  while(p[r*kS] != 0);
2183  p[r*kS] = a.data[(P-p)/kS];
2184  if(pin) pin->data[mS+r*kS] = b.data[(P-p)/kS];
2185  }
2186  }
2187  }
2188 
2189  else if(f>0.){ // random fraction
2190  M = this->size();
2191  for(i=0; i<M; i++)
2192  if(drand48() > f) { this->data[i] = 0; nZero++; }
2193  }
2194 
2195  else{ // calculate zero coefficients
2196  M = this->size();
2197  for(i=0; i<M; i++)
2198  if(this->data[i]==0) nZero++;
2199  }
2200 
2201  free(pp);
2202  return double(this->size()-nZero)/double(this->size());
2203 }
2204 
2205 
2206 template<class DataType_t>
2208  d_complex* R, d_complex* C,
2211  size_t channel)
2212 {
2213  size_t i,k,m,N;
2214  size_t count, step;
2215  size_t M = maxLayer()+1;
2216 
2217  double tsRate = this->rate();
2218  double left, righ;
2219  double tleft, trigh;
2220  double reH, imH;
2221  double c, t, dt;
2222  double cstep = 1./a.rate();
2223  double sTart = this->start();
2224  double sTop = this->start()+this->size()/tsRate;
2225  DataType_t* p;
2226  slice S;
2227 
2228  wavecomplex* pR=R;
2229  wavecomplex* pC=C;
2230 
2231  Wavelet* pw = pWavelet->Clone();
2232  wavearray<double> alp;
2233  wavearray<double> gam;
2234  wavearray<double> reR(M);
2235  wavearray<double> reC(M);
2236  wavearray<double> imR(M);
2237  wavearray<double> imC(M);
2238 
2239  alp = a; alp.start(0.);
2240  gam = a; gam.start(0.);
2241 
2242 // select alpha to be in WB segment
2243  count=0;
2244  for(i=0; i<a.size(); i++) {
2245  if(a.start()+i/a.rate() < sTart) continue; // skip samples in front
2246  if(a.start()+i/a.rate() > sTop) break; // skip samples in the back
2247  if(alp.start()==0.) alp.start(a.start()+i/a.rate());
2248  alp.data[count++] = a.data[i];
2249  }
2250  alp.resize(count);
2251 
2252 // select gamma to be in WB segment
2253  count=0;
2254  for(i=0; i<g.size(); i++) {
2255  if(g.start()+i/g.rate() < sTart) continue; // skip samples in front
2256  if(g.start()+i/g.rate() > sTop) break; // skip samples in the back
2257  if(gam.start()==0.) gam.start(g.start()+i/g.rate());
2258  gam.data[count++] = g.data[i];
2259  }
2260  gam.resize(count);
2261 
2262  if(gam.size()>alp.size()) gam.resize(alp.size());
2263  if(gam.size()<alp.size()) alp.resize(gam.size());
2264 
2265  wavearray<double> x(M*alp.size());
2266  WSeries<double> cal(x,*pw);
2267 
2268  if(!alp.size() || a.rate()!=g.rate()) {
2269  cout<<"WSeries<DataType_t>::calibrate() no calibration data\n";
2270  return cal;
2271  }
2272 
2273  cal = 0.;
2274  left = righ = 0.;
2275 
2276  reR = 0.; reC = 0.;
2277  imR = 0.; imC = 0.;
2278  for(k=0; k<M; k++){
2279 
2280  S = getSlice(k);
2281  left = righ; // left border
2282  righ += tsRate/2./S.stride(); // right border
2283  if(righ > n*df) break;
2284 
2285 // average R and C
2286 
2287  count = 0;
2288  while(left+count*df < righ){
2289  reR.data[k] += pR->real();
2290  imR.data[k] += pR->imag();
2291  reC.data[k] += pC->real();
2292  imC.data[k] += pC->imag();
2293  count++; pR++; pC++;
2294  }
2295  reR.data[k] /= count; reC.data[k] /= count;
2296  imR.data[k] /= count; imC.data[k] /= count;
2297 
2298 // calculate calibration constants
2299 
2300  cal.getLayer(x,k);
2301  for(i=0; i<alp.size(); i++){
2302 
2303  if(alp.data[i]<=0. || gam.data[i]<=0.) {
2304  cout<<"WSeries<DataType_t>::calibrate() zero alpha error\n";
2305  alp.data[i] = 1.;
2306  gam.data[i] = 1.;
2307  }
2308 
2309  reH = reR.data[k]*reC.data[k]-imR.data[k]*imC.data[k];
2310  imH = reR.data[k]*imC.data[k]+imR.data[k]*reC.data[k];
2311  reH = 1.+(reH-1.)*gam.data[i];
2312  imH*= gam.data[i];
2313  x.data[i] = sqrt(reH*reH+imH*imH);
2314  x.data[i] /= sqrt(reC.data[k]*reC.data[k]+imC.data[k]*imC.data[k]);
2315  x.data[i] /= channel==0 ? alp.data[i] : gam.data[i];
2316  }
2317  cal.putLayer(x,k);
2318 
2319 // apply energy calibration
2320 
2321  S = getSlice(k);
2322  step = S.stride();
2323  N = S.size();
2324  p = this->data + S.start();
2325  dt = step/tsRate; // sampling time interval
2326  t = this->start(); // time stamp
2327  sTart = alp.start(); // first calibration point
2328  sTop = alp.start()+(alp.size()-1)*cstep; // last calibration sample
2329 
2330  tleft = sTart; // left and right borders defining beginning and end
2331  trigh = sTart+cstep; // of the current calibration cycle.
2332  m = 0;
2333 
2334  for(i=0; i<N; i++){
2335  t += dt;
2336  if(t <= sTart) *p *= (DataType_t)x.data[0];
2337  else if(t >= sTop) *p *= (DataType_t)x.data[alp.size()-1];
2338  else {
2339  if(t>trigh) { tleft=trigh; trigh+=cstep; m++; }
2340  c = (t-tleft)/cstep;
2341  *p *= DataType_t(x.data[m]*(1-c) + x.data[m+1]*c);
2342  }
2343  p += step;
2344  }
2345 
2346  }
2347 
2348  return cal;
2349 }
2350 
2351 template<class DataType_t>
2353 {
2354  pWavelet->print();
2356 }
2357 
2358 //______________________________________________________________________________
2359 template <class DataType_t>
2360 void WSeries<DataType_t>::Streamer(TBuffer &R__b)
2361 {
2362  // Stream an object of class WSeries<DataType_t>.
2363 
2364  UInt_t R__s, R__c;
2365  if (R__b.IsReading()) {
2366  Version_t R__v = R__b.ReadVersion(&R__s, &R__c); if (R__v) { }
2368  R__b >> w_mode;
2369  R__b >> bpp;
2370  R__b >> wRate;
2371  R__b >> f_low;
2372  R__b >> f_high;
2373 
2374  bool bWWS;
2375  int m_WaveType;
2376  R__b >> m_WaveType;
2377  R__b >> bWWS;
2378  if(!bWWS) m_WaveType=-1;
2379  WaveDWT<DataType_t> *pW;
2380  switch(m_WaveType) {
2381  case HAAR :
2382  pW = (WaveDWT<DataType_t>*)(new Haar<DataType_t>);
2383  break;
2384  case BIORTHOGONAL :
2386  break;
2387  case DAUBECHIES :
2389  break;
2390  case SYMLET :
2392  break;
2393  case MEYER :
2394  pW = (WaveDWT<DataType_t>*)(new Meyer<DataType_t>);
2395  break;
2396  case WDMT :
2397  pW = (WaveDWT<DataType_t>*)(new WDM<DataType_t>);
2398  break;
2399  default :
2400  pW = new WaveDWT<DataType_t>;
2401  }
2402  pW->Streamer(R__b);
2403  this->setWavelet(*pW);
2404  delete pW;
2405 
2406  R__b.CheckByteCount(R__s, R__c, WSeries<DataType_t>::IsA());
2407  } else {
2408  R__c = R__b.WriteVersion(WSeries<DataType_t>::IsA(), kTRUE);
2410  R__b << w_mode;
2411  R__b << bpp;
2412  R__b << wRate;
2413  R__b << f_low;
2414  R__b << f_high;
2415 
2416  R__b << pWavelet->m_WaveType;
2417  bool bWWS = ((pWavelet->pWWS==NULL)&&(pWavelet->m_WaveType==HAAR)) ? false : true;
2418  R__b << bWWS;
2419  pWavelet->Streamer(R__b);
2420  R__b.SetByteCount(R__c, kTRUE);
2421  }
2422 }
2423 
2424 // instantiations
2425 
2426 #define CLASS_INSTANTIATION(class_) template class WSeries< class_ >;
2427 
2428 CLASS_INSTANTIATION(float)
2429 CLASS_INSTANTIATION(double)
2430 
2431 #undef CLASS_INSTANTIATION
2432 
wavearray< double > t(hp.size())
void mul(WSeries< DataType_t > &)
Definition: wseries.cc:135
void sethigh(double f)
Definition: wseries.hh:132
double pc
Definition: DrawEBHH.C:15
virtual void resize(unsigned int)
Definition: wseries.cc:901
double f_low
Definition: wseries.hh:464
double f_high
Definition: wseries.hh:466
static const double C
Definition: GNGen.cc:28
double gammaCL(double x, double n)
Definition: watfun.hh:131
double getlow() const
Definition: wseries.hh:129
size_t xsize()
Definition: wseries.hh:146
int layer(double f)
Definition: wseries.cc:167
virtual double stop() const
Definition: wavearray.hh:140
static double g(double e)
Definition: GNGen.cc:116
double M
Definition: DrawEBHH.C:13
Definition: Wavelet.hh:44
par [0] value
int getMaxLevel()
Definition: wseries.cc:103
int offset
Definition: TestSTFT_2.C:19
virtual void rate(double r)
Definition: wavearray.hh:141
size_t Size
data array
Definition: wavearray.hh:323
#define np
wavearray< double > a(hp.size())
virtual double percentile(double=0., int=0, WSeries< DataType_t > *=NULL)
param: f - black pixel fraction param: m - mode options: f = 0 - returns black pixel occupancy m = 1 ...
Definition: wseries.cc:2082
int error
Definition: cwb_compile.C:43
WSeries< float > v[nIFO]
Definition: cwb_net.C:80
virtual void edge(double s)
Definition: wavearray.hh:143
virtual WSeries< float > variability(double=0., double=-1., double=-1.)
param: first - time window to calculate normalization constants second - low frequency boundary for c...
Definition: wseries.cc:1296
#define B
int n
Definition: cwb_net.C:28
virtual WSeries< DataType_t > & operator+=(WSeries< DataType_t > &)
Definition: wseries.cc:796
void print()
Definition: wavearray.cc:2226
double imag() const
Definition: wavecomplex.hh:70
void bandpass(wavearray< DataType_t > &ts, double flow, double fhigh, int n=-1)
Definition: wseries.cc:313
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
virtual void setSlice(const std::slice &s)
Definition: wavearray.hh:146
virtual double rSignificance(double, double=1., double=0.)
param: T - sliding window duration in seconds param: f - black pixel fraction param: t - sliding step...
Definition: wseries.cc:1683
void setlow(double f)
Definition: wseries.hh:125
STL namespace.
std::slice getSlice(double n)
Definition: wseries.hh:152
virtual Wavelet * Clone() const
return: Wavelet* - duplicate of *this, allocated on heap
Definition: Wavelet.cc:60
virtual wavearray< DataType_t > & operator*=(wavearray< DataType_t > &)
Definition: wavearray.cc:276
std::vector< double > vR
int m
Definition: cwb_net.C:28
virtual void start(double s)
Definition: wavearray.hh:137
int j
Definition: cwb_net.C:28
i drho i
double gethigh() const
Definition: wseries.hh:136
virtual WSeries< DataType_t > & operator*=(WSeries< DataType_t > &)
Definition: wseries.cc:771
double Edge
Definition: wavearray.hh:327
#define N
cout<< "SNR "<< xsnr<< endl;wavearray< double > f
Definition: ComputeSNR.C:75
cout<< "Selected Pixels : "<< nPix<< endl;wc.cluster(1, 1);SSeries< double > ss
virtual double significance(double, double=1.)
param: n - sub-interval duration in seconds param: f - black pixel fraction options: f = 0 - returns ...
Definition: wseries.cc:1487
fprintf(stdout,"start=%f duration=%f rate=%f\, x.start(), x.size()/x.rate(), x.rate())
void setWavelet(const Wavelet &w)
Definition: wseries.cc:234
double wRate
Definition: wseries.hh:462
size_t mode
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
wavearray< double > w
Definition: Test1.C:27
void wrate(double r)
Definition: wseries.hh:120
virtual size_t size() const
Definition: wavearray.hh:145
wavearray< double > freq
Definition: Regression_H1.C:79
size_t wavecount(double x, int n=0)
Definition: wavearray.hh:304
size_t size() const
Definition: wslice.hh:89
wavearray< double > xx
Definition: TestFrame1.C:11
virtual double rate() const
Definition: wavearray.hh:142
size_t w_mode
Definition: wseries.hh:458
double wrate() const
Definition: wseries.hh:122
virtual double gSignificance(double, double=1., double=0.)
param: T - sliding window duration in seconds param: f - black pixel fraction param: t - sliding step...
Definition: wseries.cc:1837
size_t start() const
Definition: wslice.hh:85
virtual wavearray< double > filter(size_t)
param: n - number of decomposition steps algorithm: 1) do forward wavelet transform with n decomposit...
Definition: wseries.cc:1260
double real() const
Definition: wavecomplex.hh:69
int pattern
TF1 * f2
wavearray< double > * px
double maxEnergy(wavearray< DataType_t > &ts, Wavelet &w, double=0, int=1, int=0, TH1F *=NULL)
Definition: wseries.cc:504
virtual WSeries< DataType_t > & operator-=(WSeries< DataType_t > &)
Definition: wseries.cc:820
i() int(T_cor *100))
size_t stride() const
Definition: wslice.hh:93
bool isWDM()
Definition: wseries.hh:208
virtual double fraction(double=0., double=0., int=0)
param: t - sub interval duration. If can not divide on integer
Definition: wseries.cc:1374
bool log
Definition: WaveMDC.C:41
double fhigh
double * tmp
Definition: testWDM_5.C:31
int getLayer(wavearray< DataType_t > &w, double n)
param: n - layer number
Definition: wseries.cc:193
int l
TIter next(twave->GetListOfBranches())
char fname[1024]
Definition: Wavelet.hh:49
#define CLASS_INSTANTIATION(class_)
Definition: wseries.cc:2426
std::slice Slice
Definition: wavearray.hh:328
virtual double start() const
Definition: wavearray.hh:138
Definition: Wavelet.hh:48
virtual double coincidence(WSeries< DataType_t > &, int=0, int=0, double=0.)
param: WSeries object used for coincidence param: coincidence window in seconds return pixel occupanc...
Definition: wseries.cc:929
int k
virtual wavearray< DataType_t > & operator+=(wavearray< DataType_t > &)
Definition: wavearray.cc:191
static double A
Definition: geodesics.cc:26
double F
virtual size_t limit() const
Definition: wavearray.hh:344
double e
void setLevel(size_t n)
Definition: wseries.hh:112
wavearray< double > yy
Definition: TestFrame5.C:12
Definition: Haar.hh:38
double getbpp() const
Definition: wseries.hh:117
virtual double edge() const
Definition: wavearray.hh:144
double dt
regression r
Definition: Regression_H1.C:44
virtual std::slice getSlice() const
Definition: wavearray.hh:147
s s
Definition: cwb_net.C:155
double flow
virtual ~WSeries()
Definition: wseries.cc:94
virtual WSeries< DataType_t > & operator[](const std::slice &)
Definition: wseries.cc:731
Definition: WDM.hh:42
void wavescan(WSeries< DataType_t > **, int, TH1F *=NULL)
Definition: wseries.cc:622
double T
Definition: testWDM_4.C:11
virtual void lprFilter(wavearray< double > &)
Definition: wavearray.cc:1826
Definition: Symlet.hh:38
ifstream in
virtual std::slice getSlice(const double)
Definition: WaveDWT.cc:129
wavearray< double > ts(N)
virtual double mean() const
Definition: wavearray.cc:1071
WSeries()
Definition: wseries.cc:41
wavearray< int > index
virtual void resample(double, int=6)
Definition: wseries.cc:915
Definition: Meyer.hh:36
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
void print()
param: int n if n<0, zero pixels defined in mask (regression) if n>=0, zero all pixels except ones de...
Definition: wseries.cc:2352
virtual void spesla(double, double, double=0.)
Definition: wavearray.cc:1770
double resolution(int=0)
Definition: wseries.hh:155
double Gamma2Gauss(TH1F *=NULL)
Definition: wseries.cc:576
virtual void waveSort(DataType_t **pp, size_t l=0, size_t r=0) const
Definition: wavearray.cc:1421
virtual double Coincidence(WSeries< DataType_t > &, double=0., double=0.)
param: WSeries object used for coincidence param: coincidence window in seconds param: threshold on s...
Definition: wseries.cc:1020
double Q
virtual void lprFilter(double, int=0, double=0., double=0.)
Definition: wseries.cc:1126
void Forward(int n=-1)
param: wavelet - n is number of steps (-1 means full decomposition)
Definition: wseries.cc:246
strcpy(RunLabel, RUN_LABEL)
Meyer< double > S(1024, 2)
double df
virtual DataType_t max() const
Definition: wavearray.cc:1334
virtual void median(double t, bool norm=false)
Definition: wseries.cc:1109
WSeries< DataType_t > & operator=(const wavearray< DataType_t > &)
Definition: wseries.cc:702
virtual double pixclean(double=0.)
param: S - threshold on pixel significance return pixel occupancy.
Definition: wseries.cc:1983
DataType_t * data
Definition: wavearray.hh:319
enum WAVETYPE m_WaveType
Definition: Wavelet.hh:106
virtual wavearray< double > white(double, int=0, double=0., double=0.) const
Definition: wavearray.cc:2025
WaveDWT< DataType_t > * pWavelet
Definition: wseries.hh:456
double wdmPacket(int pattern, char opt='L', TH1F *=NULL)
Definition: wseries.cc:376
double dT
Definition: testWDM_5.C:12
fclose(ftrig)
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
void Inverse(int n=-1)
param: n - number of steps (-1 means full reconstruction)
Definition: wseries.cc:291
wavearray< double > y
Definition: Test10.C:31
void putLayer(wavearray< DataType_t > &, double n)
param: n - layer number
Definition: wseries.cc:219
virtual void Dump(const char *, int=0)
Definition: wseries.cc:867
char pm[8]
double frequency(int l)
Definition: wseries.cc:117
int maxLayer()
Definition: wseries.hh:139
virtual double rsignificance(size_t=0, double=1.)
param: n - sub-interval duration in domain units param: f - black pixel fraction options: f = 0 - ret...
Definition: wseries.cc:1590
double bpp
Definition: wseries.hh:460
virtual WSeries< double > calibrate(size_t, double, d_complex *, d_complex *, wavearray< double > &, wavearray< double > &, size_t ch=0)
param: number of samples in calibration arrays R & C param: frequency resolution param: pointer to re...
Definition: wseries.cc:2207
exit(0)
void cpf(const wavearray< DataType_t > &, int=0, int=0, int=0)
Definition: wavearray.cc:717
virtual WSeries< double > white(double, int, double=0., double=0.)
what it does: each wavelet layer is devided into k intervals.
Definition: wseries.cc:1146
double avr