34 #include <gnusstream.h> 42 #include "TObjArray.h" 43 #include "TObjString.h" 55 template<
class DataType_t>
57 data(NULL),Size(0),
Rate(1.),Start(0.),Stop(0.),Edge(0.),fftw(NULL), ifftw(NULL)
63 template<
class DataType_t>
68 data = (DataType_t *)malloc(n*
sizeof(DataType_t));
76 template<
class DataType_t>
82 template<
class DataType_t>
template<
class T>
88 if(n != 0 && p != NULL){
89 data = (DataType_t *)malloc(n*
sizeof(DataType_t));
90 for (i=0; i <
n; i++)
data[i] = p[i];
99 template<
class DataType_t>
108 template<
class DataType_t>
112 if (
this==&a)
return *
this;
123 for (i=0; i <
N; i++) {
data[
i] = *
pm; pm+=
m; }
154 template<
class DataType_t>
159 unsigned int N =
limit(a);
172 template<
class DataType_t>
189 template<
class DataType_t>
194 unsigned int N =
limit(a);
207 template<
class DataType_t>
224 template<
class DataType_t>
229 unsigned int N =
limit(a);
242 template<
class DataType_t>
258 template<
class DataType_t>
274 template<
class DataType_t>
279 unsigned int N =
limit(a);
293 template<
class DataType_t>
299 cout <<
"wavearray::operator[slice]: Illegal argument "<<
limit()<<
" "<<
size()<<
"\n";
306 template<
class DataType_t>
311 cout <<
"wavearray::operator[int]: Illegal argument\n";
318 template<
class DataType_t>
323 if (app == 1)
strcpy (mode,
"a");
327 if ( (fp = fopen(fname, mode)) == NULL ) {
328 cout <<
" Dump() error: cannot open file " << fname <<
". \n";
333 fprintf( fp,
"# start time: -start %lf \n", this->
Start );
334 fprintf( fp,
"# sampling rate: -rate %lf \n", this->
Rate );
335 fprintf( fp,
"# number of samples: -size %d \n", (
int)this->
Size );
339 double dt = 1./this->
rate();
340 for (
int i = 0;
i <
n;
i++) {
352 template<
class DataType_t>
355 int n =
size() *
sizeof(DataType_t);
359 if (app == 1)
strcpy (mode,
"a");
363 if ( (fp=fopen(fname, mode)) == NULL ) {
364 cout <<
" DumpBinary() error : cannot open file " << fname <<
" \n";
368 fwrite(
data, n, 1, fp);
373 template<
class DataType_t>
378 if (app == 1)
strcpy (mode,
"a");
381 if ( (fp = fopen(fname, mode)) == NULL ) {
382 cout <<
" DumpShort() error : cannot open file " << fname <<
". \n";
389 for (
int i=0;
i<
n;
i++ ) dtemp[
i]=
short(
data[
i]) ;
391 n = n *
sizeof(short);
393 fwrite(dtemp, n, 1, fp);
399 template<
class DataType_t>
402 TFile* rfile =
new TFile(fname,
"RECREATE");
403 this->
Write(
"wavearray");
409 template<
class DataType_t>
412 int step =
sizeof(DataType_t);
416 if ( (fp=fopen(fname,
"r")) == NULL ) {
417 cout <<
" ReadBinary() error : cannot open file " << fname <<
". \n";
432 int n =
size() *
sizeof(DataType_t);
434 fread(
data, n, 1, fp);
439 template<
class DataType_t>
443 dtmp =
new short[
size()];
444 int n =
size() *
sizeof(short);
447 if ( (fp=fopen(fname,
"r")) == NULL ) {
448 cout <<
" ReadShort() error : cannot open file " << fname <<
". \n";
452 cout <<
" Reading binary record, size="<< n <<
"\n";
454 fread(dtmp, n, 1, fp);
455 for (
unsigned int i = 0;
i <
size();
i++)
456 data[
i] = DataType_t(dtmp[
i]);
462 template<
class DataType_t>
465 DataType_t *p = NULL;
475 p = (DataType_t *)realloc(
data,n*
sizeof(DataType_t));
484 cout<<
"wavearray::resize(): memory allocation failed.\n";
501 template<
class DataType_t>
513 const DataType_t *p = a.
data;
518 double *temp=
new double[nF];
528 int nL =
int(nP2/ratio);
530 for (i = 0; i < nL; i++)
531 data[i] = (DataType_t)
Nevill(i*ratio, nP, p, temp);
535 int nM =
int((a.
size()-nP2)/ratio);
540 iL =
int(x) - nP2 + 1 ;
541 data[
i] = (DataType_t)
Nevill(x-iL, nP, p+iL, temp);
544 for (i = nL; i < nM; i+=2) {
546 iL =
int(x) - nP2 + 1 ;
547 data[
i] = (DataType_t)
Nevill(x-iL, nP, p+iL, temp);
549 iL =
int(x) - nP2 + 1 ;
550 data[i+1] = (DataType_t)
Nevill(x-iL, nP, p+iL, temp);
555 int nR = a.
size() - nP;
557 for (i = nM; i <
N; i++)
558 data[i] = (DataType_t)
Nevill(i*ratio-nR, nP, p, temp);
563 template<
class DataType_t>
571 template<
class DataType_t>
575 cout<<
"wavearray::Resample(): error - resample frequency must be >0\n";
579 double rsize = f/this->
rate()*this->
size();
581 if(fmod(rsize,2)!=0) {
582 cout<<
"wavearray::Resample(): error - resample frequency (" << f <<
") not allowed\n";
590 for(
int i=size;
i<rsize;
i++) this->
data[
i]=0;
595 template<
class DataType_t>
601 int ibeg=0;
int iend=0;
603 if(this->
data[
i]!=0 && ibeg==0) ibeg=
i;
604 if(this->
data[
i]!=0) iend=
i;
606 int ilen=iend-ibeg+1;
609 int isize = 2*ilen+2*ishift;
610 isize = isize + (isize%4 ? 4 - isize%4 : 0);
612 w.rate(this->
rate()); w=0;
614 for(
int i=0;
i<ilen;
i++) {w[
i+ishift+ilen/2]=this->
data[ibeg+
i];this->
data[ibeg+
i]=0;}
620 double df = w.rate()/w.size();
622 for (
int ii=0;ii<(
int)w.size()/2;ii++) {
623 TComplex X(w[2*ii],w[2*ii+1]);
624 X=X*C.Exp(TComplex(0.,-2*pi*ii*df*T));
631 for(
int i=0;
i<(
int)w.size();
i++) {
632 int j=ibeg-(ishift+ilen/2)+
i;
638 template<
class DataType_t>
642 int i1,
N, n1, n2,
n, np2 = np/2;
650 N =
int(n/ratio + 0.5);
655 for (
int i = 0;
i <
np;
i++) {
657 for (
int j = 0;
j <
np;
j++)
if (
j !=
i) m *= (
i -
j);
661 for (
int i = 0;
i <
N;
i++)
666 x = x - i1 + np2 - 1;
670 n2 = i1 + np2 + 1 -
n;
680 for (
int j = 0;
j <
np;
j++) v[
j] = c[
j]*a.
data[i1 +
j - np2 + 1];
694 for (
int k = 0;
k <
np;
k++) {
695 for (
int j = 0;
j <
np;
j++)
if (
j !=
k) v[
j] *=
x;
699 for (
int j = 0;
j <
np;
j++) s += v[
j];
701 data[
i] = (DataType_t)s;
725 length = ((
size() - pos) < (a.
size() - a_pos))?
726 (
size() - pos) : (a.
size() - a_pos);
728 if( length > (
int)(
size() - pos) ) length =
size() - pos;
729 if( length > (
int)(a.
size() - a_pos) ) length = a.
size() - a_pos;
752 length = ((
size() - pos) < (a.
size() - a_pos))?
753 (
size() - pos) : (a.
size() - a_pos);
755 if( length > (
int)(
size()- pos) ) length =
size() - pos;
756 if( length > (
int)(a.
size() - a_pos) ) length = a.
size() - a_pos;
778 length = ((
size() - pos) < (a.
size() - a_pos))?
779 (
size() - pos) : (a.
size() - a_pos);
781 if( length > (
int)(
size() - pos) ) length =
size() - pos;
782 if( length > (
int)(a.
size() - a_pos) ) length = a.
size() - a_pos;
795 size_t n = this->
size();
799 cout <<
"wavearray::append() warning: sample rate mismatch.\n";
801 if(m == 0 )
return this->
size();
815 size_t n = this->
size();
831 template<
class DataType_t>
846 for (
int i=0;
i<
N;
i++) { a[
i] =
data[
i]; b[
i]=0.;}
851 for (
int i=0;
i<n2;
i++)
852 {
data[2*
i] = (DataType_t)a[
i]/N;
853 data[2*
i+1] = (DataType_t)b[
i]/N;
858 data[1] = (DataType_t)a[n2]/N;
862 if ((N&1) == 1)
data[N-1] = (DataType_t)b[n2]/
N;
870 for (
int i=1;
i<n2;
i++)
883 { a[n2]=
data[1]; b[n2]=0.; }
887 for (
int i=0;
i<
N;
i++)
888 data[
i] = (DataType_t)a[
i];
895 template<
class DataType_t>
911 fftw =
new TFFTRealComplex(1,&N,
false);
912 fftw->Init(
"LS",sign,&kind);
917 for (
int i=0;
i<
N;
i++) { a[
i] =
data[
i]; b[
i]=0.;}
921 fftw->GetPointsComplex(a, b);
924 for (
int i=0;
i<n2;
i++)
925 {
data[2*
i] = (DataType_t)a[
i]/N;
926 data[2*
i+1] = (DataType_t)b[
i]/N;
931 data[1] = (DataType_t)a[n2]/N;
935 if ((N&1) == 1)
data[N-1] = (DataType_t)b[n2]/
N;
943 ifftw =
new TFFTComplexReal(1,&N,
false);
944 ifftw->Init(
"LS",sign,&kind);
948 for (
int i=1;
i<n2;
i++)
961 { a[n2]=
data[1]; b[n2]=0.; }
963 ifftw->SetPointsComplex(a,b);
967 for (
int i=0;
i<
N;
i++)
968 data[
i] = (DataType_t)a[
i];
976 template<
class DataType_t>
989 template<
class DataType_t>
999 cout <<
" Stack() error: data length too short to contain \n" 1000 << length <<
" samples\n";
1004 if (
size() != (
unsigned int)length)
resize(length);
1011 data[
i] = (DataType_t)ss/
k;
1019 data[
i] -= (DataType_t)s0;
1033 template<
class DataType_t>
1044 cout <<
" Stack() error: data length too short to contain \n" 1045 << length <<
" samples\n";
1051 *
this *= DataType_t(1./k);
1053 *
this -= DataType_t(avr);
1062 template<
class DataType_t>
1066 return this->
Stack(td,
int(td.
rate() * window));
1070 template<
class DataType_t>
1074 register double x = 0;
1076 if(!
size())
return 0.;
1078 for(i=0; i<
size(); i++) x +=
data[i];
1082 template<
class DataType_t>
1088 if(!
size())
return 0;
1089 double ff =
fabs(f);
1090 size_t nn = size_t(this->
Edge*
rate());
1092 if(!nn || 2*nn>=
size()-2) {
return mean();}
1096 size_t N =
size()-2*nn;
1097 size_t mL = f<0. ? (N-
int(N*ff))/2 : 0;
1098 size_t mR = f<0. ? (N+
int(N*ff))/2-1 :
int(N*ff)-1;
1103 if(f>0) wtmp *= wtmp;
1104 DataType_t *p = wtmp.
data;
1105 DataType_t **pp = (DataType_t **)malloc(N*
sizeof(DataType_t*));
1106 for(i=nn; i<N+nn; i++) pp[i-nn] = p + i;
1110 for(i=mL; i<=mR; i++) x += this->
data[pp[i]-p];
1113 return x/(mR-mL+1.);
1116 template<
class DataType_t>
1120 register double x = 0.;
1121 register DataType_t *p =
data + s.
start();
1122 size_t N = s.
size();
1125 for(i=0; i<
N; i++) { x += *p; p +=
m; }
1126 return (N==0) ? 0. : x/
N;
1130 template<
class DataType_t>
1149 size_t n = size_t(t*
rate()/step);
1152 cout<<
"wavearray<DataType_t>::mean() short time window"<<endl;
1167 xx = (DataType_t *)malloc((n+1)*
sizeof(DataType_t));
1171 for(i=0; i<=
n; i++) {
1181 pm->
data[i/skip] = DataType_t(sum/(n+1.));
1182 if(clean) q[i*step] -= DataType_t(sum/(n+1.));
1185 if(clean) q[i*step] -= DataType_t(sum/(n+1.));
1186 else q[i*step] = DataType_t(sum/(n+1.));
1196 if(last>n) last = 0;
1205 template<
class DataType_t>
1209 register double x = 0.;
1210 register double y = 0.;
1211 size_t N = (
size()>>2)<<2;
1212 register DataType_t *p =
data +
size() -
N;
1214 if(!
size())
return 0.;
1217 for(i=0; i<
N; i+=4){
1218 x += p[
i] + p[i+1] + p[i+2] + p[i+3];
1219 y += p[
i]*p[
i] + p[i+1]*p[i+1] + p[i+2]*p[i+2] + p[i+3]*p[i+3];
1222 return sqrt(y/
size()-x*x);
1226 template<
class DataType_t>
1242 size_t n = size_t(t*
rate()/step);
1245 cout<<
"wavearray<DataType_t>::median() short time window"<<endl;
1260 pp = (DataType_t **)malloc((n+1)*
sizeof(DataType_t*));
1261 xx = (DataType_t *)malloc((n+1)*
sizeof(DataType_t));
1265 for(i=0; i<=
n; i++) {
1266 xx[
i] = *p>0 ? *p : -(*p);
1274 if(i==(i/skip)*skip) {
1280 pm->
data[i/skip] = DataType_t(rm/0.6745);
1281 if(clean) q[i*step] *= DataType_t(0.6745/rm);
1284 if(clean) q[i*step] *= DataType_t(0.6745/rm);
1285 else q[i*step] = DataType_t(rm/0.6745);
1289 xx[last++] = *p>0 ? *p : -(*p);
1293 if(last>n) last = 0;
1304 template<
class DataType_t>
1308 register double a = 0.;
1309 register double x = 0.;
1310 register double y = 0.;
1311 register DataType_t *p =
data + s.
start();
1312 size_t n = s.
size();
1317 size_t N = (n>>2)<<2;
1319 for(i=0; i<n-
N; i++) {
1320 a = *p; x +=
a; y += a*
a; p +=
m;
1323 for(i=0; i<
N; i+=4) {
1324 a = *p; x +=
a; y += a*
a; p +=
m;
1325 a = *p; x +=
a; y += a*
a; p +=
m;
1326 a = *p; x +=
a; y += a*
a; p +=
m;
1327 a = *p; x +=
a; y += a*
a; p +=
m;
1330 return sqrt(y/N-x*x);
1333 template<
class DataType_t>
1336 if(!
size())
return 0;
1337 register unsigned int i;
1338 register DataType_t
x =
data[0];
1343 template<
class DataType_t>
1350 cout<<
"wavearray::max(): illegal imput array\n";
1359 DataType_t* pin = x.
data+I;
1360 DataType_t* pou = this->
data+I;
1361 for(n=0; n<
N; n+=
K) {
1362 if(pou[n]<pin[n]) pou[
n]=pin[
n];
1367 template<
class DataType_t>
1370 if(!
size())
return 0;
1372 register DataType_t
x =
data[0];
1378 template<
class DataType_t>
1382 register int i = l-1;
1390 while(
data[++i]<v && i<j);
1391 while(
data[--j]>v && i<j);
1398 template<
class DataType_t>
1402 register int i = l-1;
1420 template<
class DataType_t>
1429 register DataType_t
v;
1430 register DataType_t* p;
1431 register DataType_t** pp = pin;
1433 if(pp==NULL || !this->
size())
return;
1434 if(!r) r = this->
size()-1;
1437 register size_t i = (r+
l)/2;
1438 register size_t j = r-1;
1441 if(*pp[l] > *pp[i]) {p=pp[
l]; pp[
l]=pp[
i]; pp[
i]=p;}
1442 if(*pp[l] > *pp[r]) {p=pp[
l]; pp[
l]=pp[
r]; pp[
r]=p;}
1443 if(*pp[i] > *pp[r]) {p=pp[
i]; pp[
i]=pp[
r]; pp[
r]=p;}
1447 p=pp[
i]; pp[
i]=pp[
j]; pp[
j]=p;
1452 while(*pp[++i] < v);
1453 while(*pp[--j] > v);
1455 p=pp[
i]; pp[
i]=pp[
j]; pp[
j]=p;
1458 p=pp[
i]; pp[i++]=pp[r-1]; pp[r-1]=p;
1463 if(*pp[l] > *pp[k]) {p=pp[
l]; pp[
l]=pp[
k]; pp[
k]=p;}
1464 if(*pp[l] > *pp[j]) {p=pp[
l]; pp[
l]=pp[
j]; pp[
j]=p;}
1465 if(*pp[k] > *pp[j]) {p=pp[
k]; pp[
k]=pp[
j]; pp[
j]=p;}
1471 if(*pp[i] > *pp[k]) {p=pp[
i]; pp[
i]=pp[
k]; pp[
k]=p;}
1472 if(*pp[i] > *pp[r]) {p=pp[
i]; pp[
i]=pp[
r]; pp[
r]=p;}
1473 if(*pp[k] > *pp[r]) {p=pp[
k]; pp[
k]=pp[
r]; pp[
r]=p;}
1479 template<
class DataType_t>
1484 size_t N = this->
size();
1485 DataType_t *pd = (DataType_t *)malloc(N*
sizeof(DataType_t));
1486 DataType_t **pp = (DataType_t **)malloc(N*
sizeof(DataType_t*));
1487 for(
size_t i=0;
i<
N;
i++) {
1492 for(
size_t i=0;
i<
N;
i++) this->
data[
i] = *pp[
i];
1498 template<
class DataType_t>
1510 if(*pp[l] > *pp[i]) {p=pp[
l]; pp[
l]=pp[
i]; pp[
i]=p;}
1511 if(*pp[l] > *pp[r]) {p=pp[
l]; pp[
l]=pp[
r]; pp[
r]=p;}
1512 if(*pp[i] > *pp[r]) {p=pp[
i]; pp[
i]=pp[
r]; pp[
r]=p;}
1516 p=pp[
i]; pp[
i]=pp[
j]; pp[
j]=p;
1521 while(*pp[++i] < v);
1522 while(*pp[--j] > v);
1524 p=pp[
i]; pp[
i]=pp[
j]; pp[
j]=p;
1526 p=pp[
i]; pp[
i]=pp[r-1]; pp[r-1]=p;
1534 template<
class DataType_t>
1540 size_t N = this->
size();
1541 DataType_t *pd = (DataType_t *)malloc(N*
sizeof(DataType_t));
1542 DataType_t **pp = (DataType_t **)malloc(N*
sizeof(DataType_t*));
1543 for(
size_t i=0;
i<
N;
i++) {
1548 for(
size_t i=0;
i<
N;
i++) this->
data[
i] = *pp[
i];
1552 return this->
data[
m];
1555 template<
class DataType_t>
1561 size_t N = this->
size();
1562 DataType_t *pd = (DataType_t *)malloc(N*
sizeof(DataType_t));
1563 DataType_t **pp = (DataType_t **)malloc(N*
sizeof(DataType_t*));
1564 for(
size_t i=0;
i<
N;
i++) {
1569 for(
size_t i=0;
i<
N;
i++) this->
data[
i] = *pp[
i];
1575 template<
class DataType_t>
1578 if(!r) r =
size()-1;
1583 size_t m = N/2+(N&1);
1587 DataType_t **pp = (DataType_t **)malloc(N*
sizeof(DataType_t*));
1588 for(i=l; i<=
r; i++) pp[i-l] =
data + i;
1598 template<
class DataType_t>
1618 size_t n = size_t(t*
rate()/step);
1621 cout<<
"wavearray<DataType_t>::median() short time window"<<endl;
1636 pp = (DataType_t **)malloc((n+1)*
sizeof(DataType_t*));
1637 xx = (DataType_t *)malloc((n+1)*
sizeof(DataType_t));
1641 for(i=0; i<=
n; i++) {
1650 if(i==(i/skip)*skip) {
1656 pm->
data[i/skip] = am;
1657 if(clean) q[i*step] -= am;
1660 if(clean) q[i*step] -= am;
1661 else q[i*step] = am;
1669 if(last>n) last = 0;
1679 template<
class DataType_t>
1691 size_t n = size_t(t*
rate()/step);
1694 cout<<
"wavearray<DataType_t>::median() short time window"<<endl;
1703 DataType_t** pp = (DataType_t **)malloc((n+1)*
sizeof(DataType_t*));
1708 for(i=0; i<=
n; i++) {
1719 q[i*step] = DataType_t(r>0. ? -
log(1.-r) :
log(1.+r));
1722 xx.
data[last++] = *p; p+=step;
1726 if(next>n) next = 0;
1727 if(last>n) last = 0;
1736 template<
class DataType_t>
1742 DataType_t **pp = NULL;
1747 pp = (DataType_t **)malloc(n*
sizeof(DataType_t*));
1751 for(i=0; i<
n; i++) pp[i] =
data + i;
1752 qsort(pp, n,
sizeof(DataType_t *),
1756 if(i==0) out = *(pp[0]);
1757 else if(i>=n-1) out = *(pp[n-1]);
1758 else out = (*(pp[
i])+*(pp[i+1]))/2;
1760 for(i=0; i<
n; i++) *(pp[i]) = n-
i;
1769 template<
class DataType_t>
1791 x1 *= DataType_t(0.5);
1795 for(k=1; k<
K; k++) {
1798 for(j=offset; j<offset+
M; j++) {
1803 for(j=1; j<
N; j++) {
1807 p += (xp-xm)*(xp+xm);
1810 q += (xp-xm)*(xp+xm);
1812 xp = k==1 ? 2*p/q : p/q;
1825 template<
class DataType_t>
1834 for(i=0; i<
N; i++) {
1835 for(j=1; j<m && (i-
j)>=0; j++) {
1845 template<
class DataType_t>
1847 double oFFset,
int tail)
1856 int k = stride>0 ?
int(duration/stride) : 1;
1859 int m =
int((N-2.*oFFset*
rate())/k);
1863 if(offset&1) offset++;
1870 for(l=0; l<
k; l++) {
1877 nl = l==k-1 ?
N : n+
m;
1880 if(mode == 0 || mode == 1) {
1881 for(i=nf; i<nl; i++) {
1883 b = (!mode && i<N-
n) ? 0.5 : 1.;
1884 for(j=1; j<
M; j++) {
1886 data[
i] += DataType_t(a*b);
1891 if(mode == 0 || mode == -1) {
1892 for(i=nf; i<nl; i++) {
1893 if(i >= N-n)
continue;
1894 b = (!mode && i>=
n) ? 0.5 : 1.;
1895 for(j=1; j<
M; j++) {
1897 data[
i] += DataType_t(a*b);
1911 template<
class DataType_t>
1918 double f = tail!=0 ? 0.06 : 0.03;
1920 int LL =
int(f*N+0.5);
1921 int nL = tail<1 ? LL : 1;
1922 int nR = tail>-1 ? N-LL-1 : 1;
1926 if(
size()<=offset) {
1927 cout<<
"wavearray<DataType_t>::getLPRFilter() invalid input parameters\n";
1938 DataType_t ** pp = (DataType_t **)malloc(N*
sizeof(DataType_t*));
1940 for(i=offset; i<
n; i++) pp[i-offset] = x.
data + i;
1947 for(i=0; i<nL; i++) *pp[i] = 0;
1948 for(i=nR; i<
N; i++) *pp[i] = 0;
1955 for (m=0; m<
M; m++) {
1957 for (i=offset; i<
n; i++) {
1966 double s = r.
data[0];
1968 a = 0.; a.
data[0] = 1.;
1970 for (m=1; m<
M; m++) {
1973 for (i=0; i<
m; i++) q -= a.
data[i] * r.
data[m-i];
2023 template<
class DataType_t>
2031 if(t<=0.) t = segT-2.*oFFset;
2033 if(offset&1) offset--;
2035 if(stride > t || stride<=0.) stride =
t;
2036 int K =
int((segT-2.*oFFset)/stride);
2045 int mL =
int(0.15865*m+0.5);
2048 int jR = N-offset-
m;
2064 if(m<3 || mL<2 || mR>m-2) {
2065 cout<<
"wavearray::white(): too short input array."<<endl;
2066 return mode!=0 ? norm50 : meDIan;
2069 register DataType_t *p =
data;
2074 DataType_t ** pp = (DataType_t **)malloc(m*
sizeof(DataType_t*));
2076 for(j=0; j<=
K; j++) {
2079 else if(jj >= jR) p =
data + jR;
2083 if(p+m>
data+N) {cout<<
"wavearray::white(): error1\n";
exit(1);}
2085 for(i=0; i<
m; i++) pp[i] = p + i;
2089 meDIan[
j] = mode ? *pp[mm] : sqrt((*pp[mm])*0.7191);
2090 norm50[
j] = (*pp[mR] - *pp[mL])/2.;
2099 for(i=0; i<mm; i++){
2100 x = double(*p)-meDIan.
data[0];
2102 *(p++) = mode==1 ? DataType_t(x/r) : DataType_t(x/r/r);
2105 for(j=0; j<
K; j++) {
2106 for(i=0; i<
k; i++) {
2107 x = double(*p)-(meDIan.
data[j+1]*i + meDIan.
data[
j]*(k-
i))/
k;
2108 r = (norm50.
data[j+1]*i + norm50.
data[
j]*(k-
i))/
k;
2109 *(p++) = mode==1 ? DataType_t(x/r) : DataType_t(x/r/r);
2114 for(i=0; i<mm; i++){
2115 x = double(*p)-meDIan.
data[
K];
2117 *(p++) = mode==1 ? DataType_t(x/r) : DataType_t(x/r/r);
2123 return mode!=0 ? norm50 : meDIan;
2127 template<
class DataType_t>
2133 DataType_t *p =
const_cast<DataType_t *
>(
data);
2135 size_t N =
size() - 1 + size_t(
size()&1);
2137 if(!
size())
return 0.;
2147 for(i=1; i<
N; i+=2) {
2148 a = p[
i]; b = p[i+1];
2156 r = r/double(N) - m*
m;
2158 y = 4.*(y/N - m*m + m*(p[0]+p[
i]-
m)/N);
2159 y /= 4.*r - 2.*((p[0]-
m)*(p[0]-m)+(p[
i]-
m)*(p[i]-m))/N;
2162 a = (
fabs(y) < 1) ? sqrt(0.5*(1.-
fabs(y))) : 0.;
2164 return y>0 ? -
a :
a;
2167 template <
class DataType_t>
2172 if (R__b.IsReading()) {
2173 Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
if (R__v) { }
2174 TNamed::Streamer(R__b);
2179 if(R__v>1) R__b >>
Edge;
2182 R__b.ReadFastArray((
char*)
data,Size*
sizeof(DataType_t));
2186 TNamed::Streamer(R__b);
2193 R__b.WriteFastArray((
char*)
data,Size*
sizeof(DataType_t));
2194 R__b.SetByteCount(R__c, kTRUE);
2199 template <
class DataType_t>
2203 name.ReplaceAll(
" ",
"");
2205 TObjString* ext_tok = (TObjString*)token->At(token->GetEntries()-1);
2206 TString ext = ext_tok->GetString();
2219 cout <<
"wavearray operator (>>) : file type " << ext.Data() <<
" not supported" << endl;
2225 template <
class DataType_t>
2228 cout << endl << endl;
2230 cout <<
"Size\t= " << this->
Size <<
" samples" << endl;
2231 cout <<
"Rate\t= " << this->
Rate <<
" Hz" << endl;
2232 cout <<
"Start\t= " << this->
Start <<
" sec" << endl;
2233 cout <<
"Stop\t= " << this->
Stop <<
" sec" << endl;
2234 cout <<
"Length\t= "<< this->
Stop-this->
Start <<
" sec" << endl;
2235 cout <<
"Edge\t= " << this->
Edge <<
" sec" << endl;
2236 cout <<
"Mean\t= " << this->
mean() << endl;
2237 cout <<
"RMS\t= " << this->
rms() << endl;
2245 template<
class DataType_t>
2249 Interval ti = ts.getTStep();
2250 double Tsample = ti.GetSecs();
2252 unsigned int n=ts.getNSample();
2256 rate(
double(
int(1./Tsample + 0.5)));
2258 cout <<
" Invalid sampling interval = 0 sec.\n";
2261 start(
double(ts.getStartTime().totalS()));
2263 TSeries
r(ts.getStartTime(), ti, ts.getNSample());
2266 vec_ref= (
float*)(r.refData());
2268 for (
unsigned int i=0;
i<
n;
i++ )
2269 data[
i] = (DataType_t) (vec_ref[
i]);
2277 #define CLASS_INSTANTIATION(class_) template class wavearray< class_ >; 2289 #undef CLASS_INSTANTIATION 2292 #if !defined (__SUNPRO_CC) 2294 wavearray(
const double *,
unsigned int,
double);
2297 wavearray(
const float *,
unsigned int,
double );
2300 wavearray(
const short *,
unsigned int,
double );
2303 wavearray(
const double *,
unsigned int,
double );
2306 wavearray(
const float *,
unsigned int,
double );
2309 wavearray(
const short *,
unsigned int,
double );
2314 static void fake_instatination_SUN_CC ()
wavearray< double > t(hp.size())
size_t append(const wavearray< DataType_t > &)
virtual DataType_t min() const
virtual double stop() const
virtual wavearray< double > getLPRFilter(int, int=0, int=0)
virtual void rate(double r)
virtual void ReadShort(const char *)
wavearray< double > a(hp.size())
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 > &)
void add(const wavearray< DataType_t > &, int=0, int=0, int=0)
virtual void ReadBinary(const char *, int=0)
virtual wavearray< DataType_t > & operator*=(wavearray< DataType_t > &)
double Nevill(const double x0, int n, DataType_t *p, double *q)
virtual void start(double s)
cout<< "SNR "<< xsnr<< endl;wavearray< double > f
cout<< "Selected Pixels : "<< nPix<< endl;wc.cluster(1, 1);SSeries< double > ss
fprintf(stdout,"start=%f duration=%f rate=%f\, x.start(), x.size()/x.rate(), x.rate())
virtual void waveSplit(DataType_t **pp, size_t l, size_t r, size_t m) const
virtual size_t size() const
virtual void DumpObject(const char *)
void wavefft(double a[], double b[], int ntot, int n, int nspan, int isn)
void sub(const wavearray< DataType_t > &, int=0, int=0, int=0)
virtual char * operator>>(char *)
virtual double rate() const
TFFTComplexReal * ifftw
pointer to direct fftw object
void Resample(const wavearray< DataType_t > &, double, int=6)
virtual int getSampleRankE(size_t n, size_t l, size_t r) const
TIter next(twave->GetListOfBranches())
virtual double start() const
virtual wavearray< DataType_t > & operator+=(wavearray< DataType_t > &)
virtual size_t limit() const
int(* qsort_func)(const void *, const void *)
virtual wavearray< DataType_t > & operator<<(wavearray< DataType_t > &)
virtual void DumpBinary(const char *, int=0)
virtual void lprFilter(wavearray< double > &)
wavearray< double > ts(N)
virtual double mean() const
virtual void delay(double T)
virtual void DumpShort(const char *, int=0)
virtual void stop(double s)
virtual wavearray< DataType_t > & operator-=(wavearray< DataType_t > &)
double fabs(const Complex &x)
virtual void spesla(double, double, double=0.)
virtual void waveSort(DataType_t **pp, size_t l=0, size_t r=0) const
void resample(const wavearray< DataType_t > &, double, int=6)
DataType_t rank(double=0.5) const
virtual wavearray< DataType_t > & operator[](const std::slice &)
strcpy(RunLabel, RUN_LABEL)
virtual void Dump(const char *, int=0)
virtual DataType_t max() const
virtual void exponential(double)
#define CLASS_INSTANTIATION(class_)
double getStatistics(double &mean, double &rms) const
virtual wavearray< double > white(double, int=0, double=0., double=0.) const
double Stack(const wavearray< DataType_t > &, int)
for(int i=0;i< 101;++i) Cos2[2][i]=0
pointers to detectors
virtual void resize(unsigned int)
virtual double median(size_t=0, size_t=0) const
virtual int getSampleRank(size_t n, size_t l, size_t r) const
void cpf(const wavearray< DataType_t > &, int=0, int=0, int=0)